From 95d96e704bc84f6eeda88f6fbbc7ea7b24684a04 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Tue, 4 Jun 2019 13:15:12 +0300 Subject: [PATCH 01/99] Created code-export-python-pytest by copying code-export-java-junit, wired it up to the code-export package.json, and took a first pass on the hooks --- packages/code-export-python-pytest/.babelrc | 13 + .../src/__snapshots__/index.spec.js.snap | 511 ++++ .../__test__/src/command.spec.js | 1078 +++++++++ .../__test__/src/index.spec.js | 118 + .../__test__/src/location.spec.js | 98 + .../__test__/src/selection.spec.js | 59 + .../test-files/control-flow-suite.side | 1289 ++++++++++ .../test-files/nested-select-window-v2.side | 71 + .../test-files/nested-select-window.side | 71 + .../__test__/test-files/select-window.side | 103 + .../__test__/test-files/single-suite.side | 159 ++ .../__test__/test-files/single-test.side | 88 + .../__test__/test-files/test-case-reuse.side | 133 + .../code-export-python-pytest/package.json | 26 + .../code-export-python-pytest/src/command.js | 1052 ++++++++ .../code-export-python-pytest/src/hook.js | 115 + .../code-export-python-pytest/src/index.js | 131 + .../code-export-python-pytest/src/location.js | 60 + .../src/selection.js | 49 + packages/code-export-python-pytest/yarn.lock | 2136 +++++++++++++++++ packages/code-export/package.json | 3 +- 21 files changed, 7362 insertions(+), 1 deletion(-) create mode 100644 packages/code-export-python-pytest/.babelrc create mode 100644 packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap create mode 100644 packages/code-export-python-pytest/__test__/src/command.spec.js create mode 100644 packages/code-export-python-pytest/__test__/src/index.spec.js create mode 100644 packages/code-export-python-pytest/__test__/src/location.spec.js create mode 100644 packages/code-export-python-pytest/__test__/src/selection.spec.js create mode 100644 packages/code-export-python-pytest/__test__/test-files/control-flow-suite.side create mode 100644 packages/code-export-python-pytest/__test__/test-files/nested-select-window-v2.side create mode 100644 packages/code-export-python-pytest/__test__/test-files/nested-select-window.side create mode 100644 packages/code-export-python-pytest/__test__/test-files/select-window.side create mode 100644 packages/code-export-python-pytest/__test__/test-files/single-suite.side create mode 100644 packages/code-export-python-pytest/__test__/test-files/single-test.side create mode 100644 packages/code-export-python-pytest/__test__/test-files/test-case-reuse.side create mode 100644 packages/code-export-python-pytest/package.json create mode 100644 packages/code-export-python-pytest/src/command.js create mode 100644 packages/code-export-python-pytest/src/hook.js create mode 100644 packages/code-export-python-pytest/src/index.js create mode 100644 packages/code-export-python-pytest/src/location.js create mode 100644 packages/code-export-python-pytest/src/selection.js create mode 100644 packages/code-export-python-pytest/yarn.lock diff --git a/packages/code-export-python-pytest/.babelrc b/packages/code-export-python-pytest/.babelrc new file mode 100644 index 0000000000..f781122745 --- /dev/null +++ b/packages/code-export-python-pytest/.babelrc @@ -0,0 +1,13 @@ + { + "presets": [ + ["env", + { + "targets": { + "node": "8" + } + }] + ], + "plugins": [ + "transform-object-rest-spread", + ] + } diff --git a/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap b/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap new file mode 100644 index 0000000000..6e3181a948 --- /dev/null +++ b/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap @@ -0,0 +1,511 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Code Export Java JUnit Selenium should export a suite 1`] = ` +"// Generated by Selenium IDE +import org.junit.Test; +import org.junit.Before; +import org.junit.After; +import static org.junit.Assert.*; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.core.IsNot.not; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.Dimension; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.Alert; +import org.openqa.selenium.Keys; +import java.util.*; +public class LoginTest { + private WebDriver driver; + private Map vars; + JavascriptExecutor js; + @Before + public void setUp() { + driver = new FirefoxDriver(); + js = (JavascriptExecutor) driver; + vars = new HashMap(); + } + @After + public void tearDown() { + driver.quit(); + } + @Test + public void validcredentials() { + driver.get(\\"http://the-internet.herokuapp.com/login\\"); + driver.manage().window().setSize(new Dimension(1440, 1177)); + driver.findElement(By.id(\\"username\\")).sendKeys(\\"tomsmith\\"); + driver.findElement(By.id(\\"password\\")).sendKeys(\\"SuperSecretPassword!\\"); + driver.findElement(By.cssSelector(\\"#login button\\")).click(); + assertThat(driver.findElement(By.cssSelector(\\".flash.success\\")).getText(), is(\\"You logged into a secure area!\\\\\\\\n×\\")); + } + @Test + public void invalidcredentials() { + driver.get(\\"http://the-internet.herokuapp.com/login\\"); + driver.manage().window().setSize(new Dimension(1440, 1177)); + driver.findElement(By.id(\\"username\\")).sendKeys(\\"blah\\"); + driver.findElement(By.id(\\"password\\")).sendKeys(\\"blah\\"); + driver.findElement(By.cssSelector(\\"#login button\\")).click(); + assertThat(driver.findElement(By.id(\\"flash\\")).getText(), is(\\"Your username is invalid!\\\\\\\\n×\\")); + } +} +" +`; + +exports[`Code Export Java JUnit Selenium should export a suite that uses control flow commands 1`] = ` +"// Generated by Selenium IDE +import org.junit.Test; +import org.junit.Before; +import org.junit.After; +import static org.junit.Assert.*; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.core.IsNot.not; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.Dimension; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.Alert; +import org.openqa.selenium.Keys; +import java.util.*; +public class ControlflowTest { + private WebDriver driver; + private Map vars; + JavascriptExecutor js; + @Before + public void setUp() { + driver = new FirefoxDriver(); + js = (JavascriptExecutor) driver; + vars = new HashMap(); + } + @After + public void tearDown() { + driver.quit(); + } + @Test + public void controlflowif() { + vars.put(\\"myVar\\", js.executeScript(\\"return 'a'\\")); + if ((Boolean) js.executeScript(\\"return (arguments[0] === 'a')\\", vars.get(\\"myVar\\"))) { + vars.put(\\"output\\", js.executeScript(\\"return 'a'\\")); + } else if ((Boolean) js.executeScript(\\"return (arguments[0] === 'b')\\", vars.get(\\"myVar\\"))) { + vars.put(\\"output\\", js.executeScript(\\"return 'b'\\")); + } else { + vars.put(\\"output\\", js.executeScript(\\"return 'c'\\")); + } + assertEquals(vars.get(\\"output\\").toString(), \\"a\\"); + } + @Test + public void controlflowelseif() { + vars.put(\\"myVar\\", js.executeScript(\\"return 'b'\\")); + if ((Boolean) js.executeScript(\\"return (arguments[0] === 'a')\\", vars.get(\\"myVar\\"))) { + vars.put(\\"output\\", js.executeScript(\\"return 'a'\\")); + } else if ((Boolean) js.executeScript(\\"return (arguments[0] === 'b')\\", vars.get(\\"myVar\\"))) { + vars.put(\\"output\\", js.executeScript(\\"return 'b'\\")); + } else { + vars.put(\\"output\\", js.executeScript(\\"return 'c'\\")); + } + assertEquals(vars.get(\\"output\\").toString(), \\"b\\"); + } + @Test + public void controlflowelse() { + vars.put(\\"myVar\\", js.executeScript(\\"return 'c'\\")); + if ((Boolean) js.executeScript(\\"return (arguments[0] === 'a')\\", vars.get(\\"myVar\\"))) { + vars.put(\\"output\\", js.executeScript(\\"return 'a'\\")); + } else if ((Boolean) js.executeScript(\\"return (arguments[0] === 'b')\\", vars.get(\\"myVar\\"))) { + vars.put(\\"output\\", js.executeScript(\\"return 'b'\\")); + } else { + vars.put(\\"output\\", js.executeScript(\\"return 'c'\\")); + } + assertEquals(vars.get(\\"output\\").toString(), \\"c\\"); + } + @Test + public void controlflowdo() { + vars.put(\\"check\\", js.executeScript(\\"return 1\\")); + do { + vars.put(\\"check\\", js.executeScript(\\"return arguments[0] + 1\\", vars.get(\\"check\\"))); + } while ((Boolean) js.executeScript(\\"return (arguments[0] < 3)\\", vars.get(\\"check\\"))); + assertEquals(vars.get(\\"check\\").toString(), \\"3\\"); + } + @Test + public void controlflowtimes() { + vars.put(\\"check\\", js.executeScript(\\"return 1\\")); + Integer times = 2; + for(int i = 0; i < times; i++) { + vars.put(\\"check\\", js.executeScript(\\"return arguments[0] + 1\\", vars.get(\\"check\\"))); + } + assertEquals(vars.get(\\"check\\").toString(), \\"3\\"); + } + @Test + public void controlflowwhile() { + vars.put(\\"check\\", js.executeScript(\\"return 1\\")); + while ((Boolean) js.executeScript(\\"return (arguments[0] < 3)\\", vars.get(\\"check\\"))) { + vars.put(\\"check\\", js.executeScript(\\"return arguments[0] + 1\\", vars.get(\\"check\\"))); + } + assertEquals(vars.get(\\"check\\").toString(), \\"3\\"); + } +} +" +`; + +exports[`Code Export Java JUnit Selenium should export a suite with a reused test method 1`] = ` +"// Generated by Selenium IDE +import org.junit.Test; +import org.junit.Before; +import org.junit.After; +import static org.junit.Assert.*; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.core.IsNot.not; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.Dimension; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.Alert; +import org.openqa.selenium.Keys; +import java.util.*; +public class LoginTest { + private WebDriver driver; + private Map vars; + JavascriptExecutor js; + @Before + public void setUp() { + driver = new FirefoxDriver(); + js = (JavascriptExecutor) driver; + vars = new HashMap(); + } + @After + public void tearDown() { + driver.quit(); + } + public void login() { + driver.get(\\"https://the-internet.herokuapp.com/\\"); + driver.findElement(By.linkText(\\"Form Authentication\\")).click(); + driver.findElement(By.id(\\"username\\")).sendKeys(vars.get(\\"username\\").toString()); + driver.findElement(By.id(\\"password\\")).sendKeys(vars.get(\\"password\\").toString()); + driver.findElement(By.cssSelector(\\".fa\\")).click(); + } + @Test + public void invalidcredentials() { + vars.put(\\"username\\", \\"blah\\"); + vars.put(\\"password\\", \\"blah\\"); + login(); + } + @Test + public void validcredentials() { + vars.put(\\"username\\", \\"tomsmith\\"); + vars.put(\\"password\\", \\"SuperSecretPassword!\\"); + login(); + } +} +" +`; + +exports[`Code Export Java JUnit Selenium should export a suite with commands that open a new window inside of a reused test method 1`] = ` +"// Generated by Selenium IDE +import org.junit.Test; +import org.junit.Before; +import org.junit.After; +import static org.junit.Assert.*; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.core.IsNot.not; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.Dimension; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.Alert; +import org.openqa.selenium.Keys; +import java.util.*; +public class DefaultSuiteTest { + private WebDriver driver; + private Map vars; + JavascriptExecutor js; + @Before + public void setUp() { + driver = new FirefoxDriver(); + js = (JavascriptExecutor) driver; + vars = new HashMap(); + } + @After + public void tearDown() { + driver.quit(); + } + public String waitForWindow(int timeout) { + try { + Thread.sleep(timeout); + } catch (InterruptedException e) { + e.printStackTrace(); + } + Set whNow = driver.getWindowHandles(); + Set whThen = (Set) vars.get(\\"window_handles\\"); + if (whNow.size() > whThen.size()) { + whNow.removeAll(whThen); + } + return whNow.iterator().next(); + } + public void selectwindow() { + driver.get(\\"http://the-internet.herokuapp.com/windows\\"); + vars.put(\\"window_handles\\", driver.getWindowHandles()); + driver.findElement(By.linkText(\\"Click Here\\")).click(); + vars.put(\\"win9425\\", waitForWindow(2000)); + driver.switchTo().window(vars.get(\\"win9425\\").toString()); + assertThat(driver.getTitle(), is(\\"New Window\\")); + } + @Test + public void reuse() { + selectwindow(); + } +} +" +`; + +exports[`Code Export Java JUnit Selenium should export a suite with just one new window util method when there are multiple commands that open a new window 1`] = ` +"// Generated by Selenium IDE +import org.junit.Test; +import org.junit.Before; +import org.junit.After; +import static org.junit.Assert.*; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.core.IsNot.not; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.Dimension; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.Alert; +import org.openqa.selenium.Keys; +import java.util.*; +public class DefaultSuiteTest { + private WebDriver driver; + private Map vars; + JavascriptExecutor js; + @Before + public void setUp() { + driver = new FirefoxDriver(); + js = (JavascriptExecutor) driver; + vars = new HashMap(); + } + @After + public void tearDown() { + driver.quit(); + } + public String waitForWindow(int timeout) { + try { + Thread.sleep(timeout); + } catch (InterruptedException e) { + e.printStackTrace(); + } + Set whNow = driver.getWindowHandles(); + Set whThen = (Set) vars.get(\\"window_handles\\"); + if (whNow.size() > whThen.size()) { + whNow.removeAll(whThen); + } + return whNow.iterator().next(); + } + public void selectwindow() { + driver.get(\\"http://the-internet.herokuapp.com/windows\\"); + vars.put(\\"window_handles\\", driver.getWindowHandles()); + driver.findElement(By.linkText(\\"Click Here\\")).click(); + vars.put(\\"win9425\\", waitForWindow(2000)); + driver.switchTo().window(vars.get(\\"win9425\\").toString()); + assertThat(driver.getTitle(), is(\\"New Window\\")); + } + @Test + public void reuse() { + selectwindow(); + } + @Test + public void selectwindow() { + driver.get(\\"http://the-internet.herokuapp.com/windows\\"); + vars.put(\\"window_handles\\", driver.getWindowHandles()); + driver.findElement(By.linkText(\\"Click Here\\")).click(); + vars.put(\\"win9425\\", waitForWindow(2000)); + driver.switchTo().window(vars.get(\\"win9425\\").toString()); + assertThat(driver.getTitle(), is(\\"New Window\\")); + } +} +" +`; + +exports[`Code Export Java JUnit Selenium should export a test 1`] = ` +"// Generated by Selenium IDE +import org.junit.Test; +import org.junit.Before; +import org.junit.After; +import static org.junit.Assert.*; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.core.IsNot.not; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.Dimension; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.Alert; +import org.openqa.selenium.Keys; +import java.util.*; +public class LoginTest { + private WebDriver driver; + private Map vars; + JavascriptExecutor js; + @Before + public void setUp() { + driver = new FirefoxDriver(); + js = (JavascriptExecutor) driver; + vars = new HashMap(); + } + @After + public void tearDown() { + driver.quit(); + } + @Test + public void login() { + driver.get(\\"http://the-internet.herokuapp.com/login\\"); + driver.manage().window().setSize(new Dimension(1440, 1177)); + driver.findElement(By.id(\\"username\\")).sendKeys(\\"tomsmith\\"); + driver.findElement(By.id(\\"password\\")).sendKeys(\\"SuperSecretPassword!\\"); + driver.findElement(By.cssSelector(\\"#login button\\")).click(); + assertThat(driver.findElement(By.cssSelector(\\".flash.success\\")).getText(), is(\\"You logged into a secure area!\\\\\\\\n×\\")); + } +} +" +`; + +exports[`Code Export Java JUnit Selenium should export a test with a reused test method 1`] = ` +"// Generated by Selenium IDE +import org.junit.Test; +import org.junit.Before; +import org.junit.After; +import static org.junit.Assert.*; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.core.IsNot.not; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.Dimension; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.Alert; +import org.openqa.selenium.Keys; +import java.util.*; +public class ValidcredentialsTest { + private WebDriver driver; + private Map vars; + JavascriptExecutor js; + @Before + public void setUp() { + driver = new FirefoxDriver(); + js = (JavascriptExecutor) driver; + vars = new HashMap(); + } + @After + public void tearDown() { + driver.quit(); + } + public void login() { + driver.get(\\"https://the-internet.herokuapp.com/\\"); + driver.findElement(By.linkText(\\"Form Authentication\\")).click(); + driver.findElement(By.id(\\"username\\")).sendKeys(vars.get(\\"username\\").toString()); + driver.findElement(By.id(\\"password\\")).sendKeys(vars.get(\\"password\\").toString()); + driver.findElement(By.cssSelector(\\".fa\\")).click(); + } + @Test + public void validcredentials() { + vars.put(\\"username\\", \\"tomsmith\\"); + vars.put(\\"password\\", \\"SuperSecretPassword!\\"); + login(); + } +} +" +`; + +exports[`Code Export Java JUnit Selenium should export a test with commands that open a new window 1`] = ` +"// Generated by Selenium IDE +import org.junit.Test; +import org.junit.Before; +import org.junit.After; +import static org.junit.Assert.*; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.core.IsNot.not; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.Dimension; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.Alert; +import org.openqa.selenium.Keys; +import java.util.*; +public class SelectwindowTest { + private WebDriver driver; + private Map vars; + JavascriptExecutor js; + @Before + public void setUp() { + driver = new FirefoxDriver(); + js = (JavascriptExecutor) driver; + vars = new HashMap(); + } + @After + public void tearDown() { + driver.quit(); + } + public String waitForWindow(int timeout) { + try { + Thread.sleep(timeout); + } catch (InterruptedException e) { + e.printStackTrace(); + } + Set whNow = driver.getWindowHandles(); + Set whThen = (Set) vars.get(\\"window_handles\\"); + if (whNow.size() > whThen.size()) { + whNow.removeAll(whThen); + } + return whNow.iterator().next(); + } + @Test + public void selectwindow() { + driver.get(\\"http://the-internet.herokuapp.com/\\"); + driver.manage().window().setSize(new Dimension(1260, 1027)); + driver.findElement(By.linkText(\\"Multiple Windows\\")).click(); + vars.put(\\"window_handles\\", driver.getWindowHandles()); + driver.findElement(By.linkText(\\"Click Here\\")).click(); + vars.put(\\"win9625\\", waitForWindow(2000)); + vars.put(\\"root\\", driver.getWindowHandle()); + driver.switchTo().window(vars.get(\\"win9625\\").toString()); + assertThat(driver.getTitle(), is(\\"New Window\\")); + driver.switchTo().window(vars.get(\\"root\\").toString()); + assertThat(driver.getTitle(), is(\\"The Internet\\")); + } +} +" +`; diff --git a/packages/code-export-python-pytest/__test__/src/command.spec.js b/packages/code-export-python-pytest/__test__/src/command.spec.js new file mode 100644 index 0000000000..43d568feb1 --- /dev/null +++ b/packages/code-export-python-pytest/__test__/src/command.spec.js @@ -0,0 +1,1078 @@ +// Licensed to the Software Freedom Conservancy (SFC) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The SFC licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import Command from '../../src/command' +import { + Commands, + ControlFlowCommandNames, +} from '../../../selenium-ide/src/neo/models/Command' +import { opts } from '../../src/index' +import exporter from 'code-export-utils' + +const commandPrefixPadding = opts.commandPrefixPadding + +async function prettify(command, { fullPayload } = {}) { + const commandBlock = await Command.emit(command) + const result = exporter.prettify(commandBlock, { + commandPrefixPadding, + }) + return fullPayload ? result : result.body +} + +describe('command code emitter', () => { + it.skip('should emit all known commands', () => { + let result = [] + Commands.array.forEach(command => { + if (!Command.canEmit(command)) { + result.push(command) + } + }) + expect(() => { + if (result.length) { + if (result.length === 1) { + throw new Error(`${result[0]} has no emitter, write one!`) + } else { + throw new Error(`No emitters for ${result.join(', ')}. Write them!`) + } + } + }).not.toThrow() + }) + it('should emit `add selection` command', () => { + const command = { + command: 'addSelection', + target: 'css=select', + value: 'label=A label', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}WebElement dropdown = driver.findElement(By.cssSelector("select"));\n${commandPrefixPadding}dropdown.findElement(By.xpath("//option[. = 'A label']")).click();\n}` + ) + }) + it('should emit `assert` command', () => { + const command = { + command: 'assert', + target: 'varrrName', + value: 'blah', + } + expect(prettify(command)).resolves.toBe( + `assertEquals(vars.get("${command.target}").toString(), "${ + command.value + }");` + ) + }) + it('should emit `assert alert` command', () => { + const command = { + command: 'assertAlert', + target: 'an alert', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `assertThat(driver.switchTo().alert().getText(), is("an alert"));` + ) + }) + it('should emit `assert checked` command', () => { + const command = { + command: 'assertChecked', + target: 'id=check', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `assertTrue(driver.findElement(By.id("check")).isSelected());` + ) + }) + it('should emit `assert confirmation` command', () => { + const command = { + command: 'assertConfirmation', + target: 'a confirmation', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `assertThat(driver.switchTo().alert().getText(), is("a confirmation"));` + ) + }) + it('should emit `assert editable` command', () => { + const command = { + command: 'assertEditable', + target: 'id=text', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("text"));\n${commandPrefixPadding}Boolean isEditable = element.isEnabled() && element.getAttribute("readonly") == null;\n${commandPrefixPadding}assertTrue(isEditable);\n}` + ) + }) + it('should emit `assert element present` command', () => { + const command = { + command: 'assertElementPresent', + target: 'id=element', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}List elements = driver.findElements(By.id("element"));\n${commandPrefixPadding}assert(elements.size() > 0);\n}` + ) + }) + it('should emit `assert element not present` command', () => { + const command = { + command: 'assertElementNotPresent', + target: 'id=element', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}List elements = driver.findElements(By.id("element"));\n${commandPrefixPadding}assert(elements.size() == 0);\n}` + ) + }) + it('should emit `assert not checked` command', () => { + const command = { + command: 'assertNotChecked', + target: 'id=check', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `assertFalse(driver.findElement(By.id("check")).isSelected());` + ) + }) + it('should emit `assert not editable` command', () => { + const command = { + command: 'assertNotEditable', + target: 'id=text', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("text"));\n${commandPrefixPadding}Boolean isEditable = element.isEnabled() && element.getAttribute("readonly") == null;\n${commandPrefixPadding}assertFalse(isEditable);\n}` + ) + }) + it('should emit `assert not selected value` command', () => { + const command = { + command: 'assertNotSelectedValue', + target: 'id=select', + value: 'test', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}String value = driver.findElement(By.id("select")).getAttribute("value");\n${commandPrefixPadding}assertThat(value, is(not("test")));\n}` + ) + }) + it('should emit `assert not text` command', () => { + const command = { + command: 'assertNotText', + target: 'id=test', + value: 'text', + } + return expect(prettify(command)).resolves.toBe( + `assertThat(driver.findElement(By.id("test")).getText(), is(not("text")));` + ) + }) + it('should emit `assert prompt` command', () => { + const command = { + command: 'assertPrompt', + target: 'a prompt', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `assertThat(driver.switchTo().alert().getText(), is("a prompt"));` + ) + }) + it("should emit 'assert selected label' command", () => { + const command = { + command: 'assertSelectedLabel', + target: 'id=test', + value: 'test', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("test"));\n${commandPrefixPadding}String value = element.getAttribute("value");\n${commandPrefixPadding}String locator = String.format("option[@value='%s']", value);\n${commandPrefixPadding}String selectedText = element.findElement(By.xpath(locator)).getText();\n${commandPrefixPadding}assertThat(selectedText, is("test"));\n}` + ) + }) + it('should emit `assert selected value` command', () => { + const command = { + command: 'assertSelectedValue', + target: 'id=select', + value: 'test', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}String value = driver.findElement(By.id("select")).getAttribute("value");\n${commandPrefixPadding}assertThat(value, is("test"));\n}` + ) + }) + it('should emit `assert text` command', () => { + const command = { + command: 'assertText', + target: 'id=test', + value: 'some text that should be here', + } + expect(prettify(command)).resolves.toBe( + `assertThat(driver.findElement(By.id("test")).getText(), is("${ + command.value + }"));` + ) + }) + it('should emit `assert title` command', () => { + const command = { + command: 'assertTitle', + target: 'example title', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `assertThat(driver.getTitle(), is("example title"));` + ) + }) + it('should emit `assert value` command', () => { + const command = { + command: 'assertValue', + target: 'id=select', + value: 'test', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}String value = driver.findElement(By.id("select")).getAttribute("value");\n${commandPrefixPadding}assertThat(value, is("test"));\n}` + ) + }) + it('should emit `click` command', () => { + const command = { + command: 'click', + target: 'link=button', + value: '', + } + return expect(prettify(command)).resolves.toBe( + 'driver.findElement(By.linkText("button")).click();' + ) + }) + it('should emit `click at` command', () => { + const command = { + command: 'clickAt', + target: 'link=button', + value: '', + } + return expect(prettify(command)).resolves.toBe( + 'driver.findElement(By.linkText("button")).click();' + ) + }) + it('should emit `check` command', () => { + const command = { + command: 'check', + target: 'id=f', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("f"));\n${commandPrefixPadding}if (!element.isSelected()) {\n${commandPrefixPadding}${commandPrefixPadding}element.click();\n${commandPrefixPadding}}\n}` + ) + }) + it('should emit `close` command', () => { + const command = { + command: 'close', + target: '', + value: '', + } + return expect(prettify(command)).resolves.toBe(`driver.close();`) + }) + it('should emit `do` command', () => { + const command = { + command: ControlFlowCommandNames.do, + target: '', + value: '', + } + return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ + body: 'do {', + endingLevel: 1, + }) + }) + it('should emit `double click` command', () => { + const command = { + command: 'doubleClick', + target: 'link=button', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.linkText("button"));\n${commandPrefixPadding}Actions builder = new Actions(driver);\n${commandPrefixPadding}builder.doubleClick(element).perform();\n}` + ) + }) + it('should emit `double click at` command', () => { + const command = { + command: 'doubleClickAt', + target: 'link=button', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.linkText("button"));\n${commandPrefixPadding}Actions builder = new Actions(driver);\n${commandPrefixPadding}builder.doubleClick(element).perform();\n}` + ) + }) + it('should emit `drag and drop to object` command', () => { + const command = { + command: 'dragAndDropToObject', + target: 'link=dragged', + value: 'link=dropped', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}WebElement dragged = driver.findElement(By.linkText("dragged"));\n${commandPrefixPadding}WebElement dropped = driver.findElement(By.linkText("dropped"));\n${commandPrefixPadding}Actions builder = new Actions(driver);\n${commandPrefixPadding}builder.dragAndDrop(dragged, dropped).perform();\n}` + ) + }) + it('should emit `echo` command', () => { + const command = { + command: 'echo', + target: 'blah', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `System.out.println("blah");` + ) + }) + it('should emit `echo` command with variables', () => { + const command = { + command: 'echo', + target: '${blah}', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `System.out.println(vars.get("blah").toString());` + ) + }) + it('should emit `edit content` command', () => { + const command = { + command: 'editContent', + target: 'id=contentEditable', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("contentEditable"));\n${commandPrefixPadding}js.executeScript("if(arguments[0].contentEditable === 'true') {arguments[0].innerText = ''}", element);\n}` + ) + }) + it('should emit `else` command', () => { + const command = { + command: ControlFlowCommandNames.else, + target: 'true', + value: '', + } + return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ + body: `} else {`, + endingLevel: 1, + }) + }) + it('should emit `else if` command', () => { + const command = { + command: ControlFlowCommandNames.elseIf, + target: 'true', + value: '', + } + return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ + body: `} else if ((Boolean) js.executeScript("return (true)")) {`, + endingLevel: 1, + }) + }) + it('should emit `end` command', async () => { + const command = { + command: ControlFlowCommandNames.end, + target: '', + value: '', + } + return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ + body: `}`, + endingLevel: 0, + }) + }) + it('should emit `execute script` command', () => { + const command = { + command: 'executeScript', + target: 'javascript', + value: 'myVar', + } + return expect(prettify(command)).resolves.toBe( + `vars.put("myVar", js.executeScript("javascript"));` + ) + }) + it('should emit `execute script` command with return string value', () => { + const command = { + command: 'executeScript', + target: 'return "a"', + value: 'myVar', + } + return expect(prettify(command)).resolves.toBe( + `vars.put("myVar", js.executeScript("return 'a'"));` + ) + }) + it('should emit `execute async script` command', () => { + const command = { + command: 'executeAsyncScript', + target: 'javascript', + value: 'myVar', + } + return expect(prettify(command)).resolves.toBe( + `vars.put("myVar", js.executeAsyncScript("var callback = arguments[arguments.length - 1];javascript.then(callback).catch(callback);"));` + ) + }) + it('should emit `forEach` command', () => { + const command = { + command: ControlFlowCommandNames.forEach, + target: 'collection', + value: 'iteratorVar', + } + return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ + body: `ArrayList collection = (ArrayList) vars.get("collection");\nfor (int i = 0; i < collection.size() - 1; i++) {\n${commandPrefixPadding}vars.put("iteratorVar", collection.get(i));`, + endingLevel: 1, + }) + }) + it('should emit `if` command', () => { + const command = { + command: ControlFlowCommandNames.if, + target: 'true', + value: '', + } + return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ + body: `if ((Boolean) js.executeScript("return (true)")) {`, + endingLevel: 1, + }) + }) + it('should emit `mouse down` command', () => { + const command = { + command: 'mouseDown', + target: 'id=button', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("button"));\n${commandPrefixPadding}Action builder = new Actions(driver);\n${commandPrefixPadding}builder.moveToElement(element).clickAndHold().perform();\n}` + ) + }) + it('should emit `mouse down at` event', () => { + const command = { + command: 'mouseDownAt', + target: 'id=button', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("button"));\n${commandPrefixPadding}Action builder = new Actions(driver);\n${commandPrefixPadding}builder.moveToElement(element).clickAndHold().perform();\n}` + ) + }) + it('should emit `mouse move` event', () => { + const command = { + command: 'mouseMove', + target: 'id=button', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("button"));\n${commandPrefixPadding}Action builder = new Actions(driver);\n${commandPrefixPadding}builder.moveToElement(element).perform();\n}` + ) + }) + it('should emit `mouse move at` event', () => { + const command = { + command: 'mouseMoveAt', + target: 'id=button', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("button"));\n${commandPrefixPadding}Action builder = new Actions(driver);\n${commandPrefixPadding}builder.moveToElement(element).perform();\n}` + ) + }) + it('should emit `mouse out` event', () => { + const command = { + command: 'mouseOut', + target: 'id=button', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.tagName("body"));\n${commandPrefixPadding}Action builder = new Actions(driver);\n${commandPrefixPadding}builder.moveToElement(element, 0, 0).perform();\n}` + ) + }) + it('should emit `mouse over` event', () => { + const command = { + command: 'mouseOver', + target: 'id=button', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("button"));\n${commandPrefixPadding}Action builder = new Actions(driver);\n${commandPrefixPadding}builder.moveToElement(element).perform();\n}` + ) + }) + it('should emit `mouse up` event', () => { + const command = { + command: 'mouseUp', + target: 'id=button', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("button"));\n${commandPrefixPadding}Action builder = new Actions(driver);\n${commandPrefixPadding}builder.moveToElement(element).release().perform();\n}` + ) + }) + it('should emit `mouse up at` event', () => { + const command = { + command: 'mouseUpAt', + target: 'id=button', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("button"));\n${commandPrefixPadding}Action builder = new Actions(driver);\n${commandPrefixPadding}builder.moveToElement(element).release().perform();\n}` + ) + }) + it('should emit `open` with absolute url', () => { + const command = { + command: 'open', + target: 'https://www.seleniumhq.org/', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `driver.get("${command.target}");` + ) + }) + it('should emit `pause` command', () => { + const command = { + command: 'pause', + target: '300', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `try {\n${commandPrefixPadding}Thread.sleep(300);\n} catch (InterruptedException e) {\n${commandPrefixPadding}e.printStackTrace();\n}` + ) + }) + it('should emit `remove selection` command', () => { + const command = { + command: 'removeSelection', + target: 'css=select', + value: 'label=A label', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}WebElement dropdown = driver.findElement(By.cssSelector("select"));\n${commandPrefixPadding}dropdown.findElement(By.xpath("//option[. = 'A label']")).click();\n}` + ) + }) + it('should emit `repeatIf` command', () => { + const command = { + command: ControlFlowCommandNames.repeatIf, + target: 'true', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `} while ((Boolean) js.executeScript("return (true)"));` + ) + }) + it('should emit `run` command', () => { + const command = { + command: 'run', + target: 'some test case', + value: '', + } + return expect(prettify(command)).resolves.toBe(`sometestcase();`) + }) + it('should emit `run script` command', () => { + const command = { + command: 'runScript', + target: "alert('test');alert('Im annoying');", + value: '', + } + return expect(prettify(command)).resolves.toBe( + `js.executeScript("alert('test');alert('Im annoying');");` + ) + }) + it('should emit `select` command', () => { + const command = { + command: 'select', + target: 'css=select', + value: 'label=A label', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}WebElement dropdown = driver.findElement(By.cssSelector("select"));\n${commandPrefixPadding}dropdown.findElement(By.xpath("//option[. = 'A label']")).click();\n}` + ) + }) + it('should emit `select frame` to select the top frame', () => { + const command = { + command: 'selectFrame', + target: 'relative=top', + value: '', + } + return expect(prettify(command)).resolves.toBe( + 'driver.switchTo().defaultContent();' + ) + }) + it('should fail to emit `select window` by using unknown locator', () => { + const command = { + command: 'selectWindow', + target: 'notExisting=something', + value: '', + } + return expect(prettify(command)).rejects.toThrow( + 'Can only emit `select window` using handles' + ) + }) + it('should emit `select window` to select a window by handle', () => { + const command = { + command: 'selectWindow', + target: 'handle=${window}', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `driver.switchTo().window(vars.get("window").toString());` + ) + }) + it('should emit `select window` to select a window by name', () => { + const command = { + command: 'selectWindow', + target: 'name=window', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `driver.switchTo().window("window");` + ) + }) + it('should emit `select window` to select a window by the local keyword', () => { + const command = { + command: 'selectWindow', + target: 'win_ser_local', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}ArrayList handles = new ArrayList(driver.getWindowHandles());\n${commandPrefixPadding}driver.switchTo().window(handles.get(0));\n}` + ) + }) + it('should emit `select window` to select a window by implicit index', () => { + const command = { + command: 'selectWindow', + target: 'win_ser_12', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}ArrayList handles = new ArrayList(driver.getWindowHandles());\n${commandPrefixPadding}driver.switchTo().window(handles.get(12));\n}` + ) + }) + it('should emit `send keys` command', () => { + const command = { + command: 'sendKeys', + target: 'id=input', + value: 'example input', + } + return expect(prettify(command)).resolves.toBe( + `driver.findElement(By.id("input")).sendKeys("${command.value}");` + ) + }) + it('should emit `send keys` command with a variable input', () => { + const command = { + command: 'sendKeys', + target: 'id=input', + value: '${blah}', + } + return expect(prettify(command)).resolves.toBe( + `driver.findElement(By.id("input")).sendKeys(vars.get("blah").toString());` + ) + }) + it('should emit `send keys` command with a key press', () => { + const command = { + command: 'sendKeys', + target: 'id=input', + value: 'SuperSecretPassword!${KEY_ENTER}', + } + return expect(prettify(command)).resolves.toBe( + `driver.findElement(By.id("input")).sendKeys("SuperSecretPassword!", Keys.ENTER);` + ) + }) + it('should emit `set speed`', () => { + expect(prettify({ command: 'setSpeed' })).resolves.toBe( + `System.out.println("\`set speed\` is a no-op in code export, use \`pause\` instead");` + ) + }) + it('should emit `setWindowSize`', () => { + const command = { + command: 'setWindowSize', + target: '1440x1177', + value: '', + } + expect(prettify(command)).resolves.toBe( + `driver.manage().window().setSize(new Dimension(1440, 1177));` + ) + }) + it('should skip playback supported commands, that are not supported in webdriver', () => { + return Promise.all([ + expect(prettify({ command: 'answerOnNextPrompt' })).resolves.toBe(''), + expect( + prettify({ command: 'chooseCancelOnNextConfirmation' }) + ).resolves.toBe(''), + expect(prettify({ command: 'chooseCancelOnNextPrompt' })).resolves.toBe( + '' + ), + expect(prettify({ command: 'chooseOkOnNextConfirmation' })).resolves.toBe( + '' + ), + ]) + }) + it('should emit `store` command', () => { + const command = { + command: 'store', + target: 'some value', + value: 'myVar', + } + return expect(prettify(command)).resolves.toBe( + `vars.put("myVar", "some value");` + ) + }) + it('should emit `store attribute` command', () => { + const command = { + command: 'storeAttribute', + target: 'xpath=button[3]@id', + value: 'myVar', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.xpath("button[3]"));\n${commandPrefixPadding}String attribute = element.getAttribute("id");\n${commandPrefixPadding}vars.put("myVar", attribute);\n}` + ) + }) + it('should emit `store text` command', () => { + const command = { + command: 'storeText', + target: 'id=someElement', + value: 'myVar', + } + return expect(prettify(command)).resolves.toBe( + `vars.put("myVar", driver.findElement(By.id("someElement")).getText());` + ) + }) + it.skip('should emit `store json` command', () => { + const command = { + command: 'storeJson', + target: '[{"a":0}]', + value: 'myVar', + } + return expect(prettify(command)).resolves.toBe('') + }) + it('should emit `store title` command', () => { + const command = { + command: 'storeTitle', + target: '', + value: 'myVar', + } + return expect(prettify(command)).resolves.toBe( + `vars.put("myVar", driver.getTitle());` + ) + }) + it('should emit `store value` command', () => { + const command = { + command: 'storeValue', + target: 'id=someElement', + value: 'myVar', + } + return expect(prettify(command)).resolves.toBe( + `vars.put("myVar", driver.findElement(By.id("someElement")).getAttribute("value"));` + ) + }) + it('should emit `store window handle` command', () => { + const command = { + command: 'storeWindowHandle', + target: 'windowName', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `vars.put("windowName", driver.getWindowHandle());` + ) + }) + it('should emit `store xpath count` command', () => { + const command = { + command: 'storeXpathCount', + target: 'xpath=button', + value: 'myVar', + } + return expect(prettify(command)).resolves.toBe( + `vars.put("myVar", driver.findElements(By.xpath("button")).size());` + ) + }) + it('should emit `submit` command', () => { + const command = { + command: 'submit', + target: 'id=form', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `throw new Error("\`submit\` is not a supported command in Selenium WebDriver. Please re-record the step in the IDE.");` + ) + }) + it('should emit `times` command', () => { + const command = { + command: ControlFlowCommandNames.times, + target: '5', + value: '', + } + return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ + body: `Integer times = ${ + command.target + };\nfor(int i = 0; i < times; i++) {`, + endingLevel: 1, + }) + }) + it('should emit `type` command', () => { + const command = { + command: 'type', + target: 'id=input', + value: 'example input', + } + expect(prettify(command)).resolves.toBe( + `driver.findElement(By.id("input")).sendKeys("${command.value}");` + ) + }) + it('should emit `uncheck` command', () => { + const command = { + command: 'uncheck', + target: 'id=f', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("f"));\n${commandPrefixPadding}if (element.isSelected()) {\n${commandPrefixPadding}${commandPrefixPadding}element.click();\n${commandPrefixPadding}}\n}` + ) + }) + it('should emit `verify` command', () => { + const command = { + command: 'verify', + target: 'varrrName', + value: 'blah', + } + expect(prettify(command)).resolves.toBe( + `assertEquals(vars.get("${command.target}").toString(), "${ + command.value + }");` + ) + }) + it('should emit `verify checked` command', () => { + const command = { + command: 'verifyChecked', + target: 'id=check', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `assertTrue(driver.findElement(By.id("check")).isSelected());` + ) + }) + it('should emit `verify editable` command', () => { + const command = { + command: 'verifyEditable', + target: 'id=text', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("text"));\n${commandPrefixPadding}Boolean isEditable = element.isEnabled() && element.getAttribute("readonly") == null;\n${commandPrefixPadding}assertTrue(isEditable);\n}` + ) + }) + it('should emit `verify element present` command', () => { + const command = { + command: 'verifyElementPresent', + target: 'id=element', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}List elements = driver.findElements(By.id("element"));\n${commandPrefixPadding}assert(elements.size() > 0);\n}` + ) + }) + it('should emit `verify element not present` command', () => { + const command = { + command: 'verifyElementNotPresent', + target: 'id=element', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}List elements = driver.findElements(By.id("element"));\n${commandPrefixPadding}assert(elements.size() == 0);\n}` + ) + }) + it('should emit `verify not checked` command', () => { + const command = { + command: 'verifyNotChecked', + target: 'id=check', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `assertFalse(driver.findElement(By.id("check")).isSelected());` + ) + }) + it('should emit `verify not editable` command', () => { + const command = { + command: 'verifyNotEditable', + target: 'id=text', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("text"));\n${commandPrefixPadding}Boolean isEditable = element.isEnabled() && element.getAttribute("readonly") == null;\n${commandPrefixPadding}assertFalse(isEditable);\n}` + ) + }) + it('should emit `verify not selected value` command', () => { + const command = { + command: 'verifyNotSelectedValue', + target: 'id=select', + value: 'test', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}String value = driver.findElement(By.id("select")).getAttribute("value");\n${commandPrefixPadding}assertThat(value, is(not("test")));\n}` + ) + }) + it('should emit `verify not text` command', () => { + const command = { + command: 'verifyNotText', + target: 'id=test', + value: 'text', + } + return expect(prettify(command)).resolves.toBe( + `assertThat(driver.findElement(By.id("test")).getText(), is(not("text")));` + ) + }) + it("should emit 'verify selected label' command", () => { + const command = { + command: 'verifySelectedLabel', + target: 'id=test', + value: 'test', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("test"));\n${commandPrefixPadding}String value = element.getAttribute("value");\n${commandPrefixPadding}String locator = String.format("option[@value='%s']", value);\n${commandPrefixPadding}String selectedText = element.findElement(By.xpath(locator)).getText();\n${commandPrefixPadding}assertThat(selectedText, is("test"));\n}` + ) + }) + it('should emit `verify value` command', () => { + const command = { + command: 'verifyValue', + target: 'id=select', + value: 'test', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}String value = driver.findElement(By.id("select")).getAttribute("value");\n${commandPrefixPadding}assertThat(value, is("test"));\n}` + ) + }) + it('should emit `verify selected value` command', () => { + const command = { + command: 'verifySelectedValue', + target: 'id=select', + value: 'test', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}String value = driver.findElement(By.id("select")).getAttribute("value");\n${commandPrefixPadding}assertThat(value, is("test"));\n}` + ) + }) + it('should emit `verify text` command', () => { + const command = { + command: 'verifyText', + target: 'id=test', + value: 'some text that should be here', + } + expect(prettify(command)).resolves.toBe( + `assertThat(driver.findElement(By.id("test")).getText(), is("${ + command.value + }"));` + ) + }) + it('should emit `verify title` command', () => { + const command = { + command: 'verifyTitle', + target: 'example title', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `assertThat(driver.getTitle(), is("example title"));` + ) + }) + it('should emit `waitForElementEditable` command', () => { + const command = { + command: 'waitForElementEditable', + target: 'css=#blah', + value: '5000', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}WebDriverWait wait = new WebDriverWait(driver, 5);\n${commandPrefixPadding}wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#blah")));\n}` + ) + }) + it('should emit `waitForElementPresent` command', () => { + const command = { + command: 'waitForElementPresent', + target: 'css=#blah', + value: '5000', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}WebDriverWait wait = new WebDriverWait(driver, 5);\n${commandPrefixPadding}wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#blah")));\n}` + ) + }) + it('should emit `waitForElementVisible` command', () => { + const command = { + command: 'waitForElementVisible', + target: 'css=#blah', + value: '5000', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}WebDriverWait wait = new WebDriverWait(driver, 5);\n${commandPrefixPadding}wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("#blah")));\n}` + ) + }) + it('should emit `waitForElementNotEditable` command', () => { + const command = { + command: 'waitForElementNotEditable', + target: 'css=#blah', + value: '5000', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}WebDriverWait wait = new WebDriverWait(driver, 5);\n${commandPrefixPadding}wait.until(ExpectedConditions.not(ExpectedConditions.elementToBeClickable(By.cssSelector("#blah"))));\n}` + ) + }) + it('should emit `waitForElementNotPresent` command', () => { + const command = { + command: 'waitForElementNotPresent', + target: 'css=#blah', + value: '5000', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}WebDriverWait wait = new WebDriverWait(driver, 5);\n${commandPrefixPadding}WebElement element = driver.findElement(By.cssSelector("#blah"));\n${commandPrefixPadding}wait.until(ExpectedConditions.stalenessOf(element));\n}` + ) + }) + it('should emit `waitForElementNotVisible` command', () => { + const command = { + command: 'waitForElementNotVisible', + target: 'css=#blah', + value: '5000', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}WebDriverWait wait = new WebDriverWait(driver, 5);\n${commandPrefixPadding}wait.until(ExpectedConditions.invisibilityOfElementLocated(By.cssSelector("#blah")));\n}` + ) + }) + it('should emit `answer on visible prompt` command', () => { + const command = { + command: 'webdriverAnswerOnVisiblePrompt', + target: 'an answer', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `{\n${commandPrefixPadding}Alert alert = driver.switchTo().alert();\n${commandPrefixPadding}alert.sendKeys("an answer")\n${commandPrefixPadding}alert.accept();\n}` + ) + }) + it('should emit `choose cancel on visible prompt` command', () => { + const command = { + command: 'webdriverChooseCancelOnVisiblePrompt', + target: '', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `driver.switchTo().alert().dismiss();` + ) + }) + it('should emit `choose ok on visible confirmation` command', () => { + const command = { + command: 'webdriverChooseOkOnVisibleConfirmation', + target: '', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `driver.switchTo().alert().accept();` + ) + }) + it('should emit `while` command', () => { + const command = { + command: ControlFlowCommandNames.while, + target: 'true', + value: '', + } + return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ + body: `while ((Boolean) js.executeScript("return (true)")) {`, + endingLevel: 1, + }) + }) + it('should emit new window handling, if command opens a new window', () => { + const command = { + command: 'click', + target: 'css=button', + value: '', + opensWindow: true, + windowHandleName: 'newWin', + windowTimeout: 2000, + } + return expect(prettify(command)).resolves.toBe( + `vars.put("window_handles", driver.getWindowHandles());\ndriver.findElement(By.cssSelector("button")).click();\nvars.put("newWin", waitForWindow(2000));` + ) + }) +}) diff --git a/packages/code-export-python-pytest/__test__/src/index.spec.js b/packages/code-export-python-pytest/__test__/src/index.spec.js new file mode 100644 index 0000000000..6b7b92b731 --- /dev/null +++ b/packages/code-export-python-pytest/__test__/src/index.spec.js @@ -0,0 +1,118 @@ +// Licensed to the Software Freedom Conservancy (SFC) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The SFC licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import fs from 'fs' +import path from 'path' +import { emitTest, emitSuite, _emitMethod, _findTestByName } from '../../src' +import { normalizeTestsInSuite } from '../../../selenium-ide/src/neo/IO/normalize' + +function readFile(filename) { + return JSON.parse( + fs.readFileSync(path.join(__dirname, '..', 'test-files', filename)) + ) +} + +describe('Code Export Java JUnit Selenium', () => { + it('should export a test', async () => { + const project = readFile('single-test.side') + const results = await emitTest({ + baseUrl: project.url, + test: project.tests[0], + tests: project.tests, + }) + expect(results.body).toBeDefined() + expect(results.body).toMatchSnapshot() + }) + it('should export a suite', async () => { + const project = normalizeProject(readFile('single-suite.side')) + const results = await emitSuite({ + baseUrl: project.url, + suite: project.suites[0], + tests: project.tests, + }) + expect(results.body).toBeDefined() + expect(results.body).toMatchSnapshot() + }) + it('should export a test with a reused test method', async () => { + const project = normalizeProject(readFile('test-case-reuse.side')) + const results = await emitTest({ + baseUrl: project.url, + test: project.tests[1], + tests: project.tests, + }) + expect(results.body).toBeDefined() + expect(results.body).toMatchSnapshot() + }) + it('should export a test with commands that open a new window', async () => { + const project = normalizeProject(readFile('select-window.side')) + const results = await emitTest({ + baseUrl: project.url, + test: project.tests[0], + tests: project.tests, + }) + expect(results.body).toBeDefined() + expect(results.body).toMatchSnapshot() + }) + it('should export a suite with a reused test method', async () => { + const project = normalizeProject(readFile('test-case-reuse.side')) + const results = await emitSuite({ + baseUrl: project.url, + suite: project.suites[0], + tests: project.tests, + }) + expect(results.body).toBeDefined() + expect(results.body).toMatchSnapshot() + }) + it('should export a suite that uses control flow commands', async () => { + const project = normalizeProject(readFile('control-flow-suite.side')) + const results = await emitSuite({ + baseUrl: project.url, + suite: project.suites[0], + tests: project.tests, + }) + expect(results.body).toBeDefined() + expect(results.body).toMatchSnapshot() + }) + it('should export a suite with commands that open a new window inside of a reused test method', async () => { + const project = normalizeProject(readFile('nested-select-window.side')) + const results = await emitSuite({ + baseUrl: project.url, + suite: project.suites[0], + tests: project.tests, + }) + expect(results.body).toBeDefined() + expect(results.body).toMatchSnapshot() + }) + it('should export a suite with just one new window util method when there are multiple commands that open a new window', async () => { + const project = normalizeProject(readFile('nested-select-window-v2.side')) + const results = await emitSuite({ + baseUrl: project.url, + suite: project.suites[0], + tests: project.tests, + }) + expect(results.body).toBeDefined() + expect(results.body).toMatchSnapshot() + }) +}) + +function normalizeProject(project) { + let _project = { ...project } + _project.suites.forEach(suite => { + normalizeTestsInSuite({ suite, tests: _project.tests }) + }) + return _project +} diff --git a/packages/code-export-python-pytest/__test__/src/location.spec.js b/packages/code-export-python-pytest/__test__/src/location.spec.js new file mode 100644 index 0000000000..9b3fc07390 --- /dev/null +++ b/packages/code-export-python-pytest/__test__/src/location.spec.js @@ -0,0 +1,98 @@ +// Licensed to the Software Freedom Conservancy (SFC) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The SFC licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import { emit } from '../../src/location' + +describe('location code emitter', () => { + it('should fail to emit empty string', () => { + return expect(() => { + emit('') + }).toThrow("Locator can't be empty") + }) + it('should fail to emit unknown locator', () => { + return expect(() => { + emit('notExists=element') + }).toThrow('Unknown locator notExists') + }) + it('should emit id locator', () => { + const type = 'id' + const selector = 'someId' + return expect(emit(`${type}=${selector}`)).resolves.toBe( + `By.id("${selector}")` + ) + }) + it('should emit link locator', () => { + const type = 'link' + const selector = 'someLink' + return expect(emit(`${type}=${selector}`)).resolves.toBe( + `By.linkText("${selector}")` + ) + }) + it('should emit linkText locator', () => { + const type = 'linkText' + const selector = 'someLink' + return expect(emit(`${type}=${selector}`)).resolves.toBe( + `By.linkText("${selector}")` + ) + }) + it('should emit partialLinkText locator', () => { + const type = 'partialLinkText' + const selector = 'someLink' + return expect(emit(`${type}=${selector}`)).resolves.toBe( + `By.partialLinkText("${selector}")` + ) + }) + it('should emit css locator', () => { + const type = 'css' + const selector = 'someCss' + return expect(emit(`${type}=${selector}`)).resolves.toBe( + `By.cssSelector("${selector}")` + ) + }) + it('should emit css locator with `=` sign', () => { + const type = 'css' + const selector = 'a[title=JScript]' + return expect(emit(`${type}=${selector}`)).resolves.toBe( + `By.cssSelector("${selector}")` + ) + }) + it('should escape quotes in locator strings', () => { + const type = 'css' + const selector = 'a[title="escaped"]' + return expect(emit(`${type}=${selector}`)).resolves.toBe( + 'By.cssSelector("a[title=\\"escaped\\"]")' + ) + }) + it('should emit xpath locator', () => { + const type = 'xpath' + const selector = 'someXpath' + return expect(emit(`${type}=${selector}`)).resolves.toBe( + `By.xpath("${selector}")` + ) + }) + it('should emit implicit xpath locator', () => { + const selector = '//test=xpath' + return expect(emit(selector)).resolves.toBe(`By.xpath("${selector}")`) + }) + it('should emit name locator', () => { + const type = 'name' + const selector = 'someName' + return expect(emit(`${type}=${selector}`)).resolves.toBe( + `By.name("${selector}")` + ) + }) +}) diff --git a/packages/code-export-python-pytest/__test__/src/selection.spec.js b/packages/code-export-python-pytest/__test__/src/selection.spec.js new file mode 100644 index 0000000000..4eec6c911d --- /dev/null +++ b/packages/code-export-python-pytest/__test__/src/selection.spec.js @@ -0,0 +1,59 @@ +// Licensed to the Software Freedom Conservancy (SFC) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The SFC licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import { emit } from '../../src/selection' + +describe('selection location code emitter', () => { + it('should fail to emit unknown selection locator', () => { + return expect(() => { + emit('notExists=element') + }).toThrow('Unknown selection locator notExists') + }) + it('should assume when no selector is given that it is the label locator', () => { + return expect(emit('label')).resolves.toBe( + `By.xpath("//option[. = 'label']")` + ) + }) + it('should emit label locator', () => { + const type = 'label' + const selector = 'a label' + return expect(emit(`${type}=${selector}`)).resolves.toBe( + `By.xpath("//option[. = '${selector}']")` + ) + }) + it('should emit id locator', () => { + const type = 'id' + const selector = 'someId' + return expect(emit(`${type}=${selector}`)).resolves.toBe( + `By.cssSelector("*[id='${selector}']")` + ) + }) + it('should emit value locator', () => { + const type = 'value' + const selector = 'someValue' + return expect(emit(`${type}=${selector}`)).resolves.toBe( + `By.cssSelector("*[value='${selector}']")` + ) + }) + it('should emit index locator', () => { + const type = 'index' + const selector = '2' + return expect(emit(`${type}=${selector}`)).resolves.toBe( + `By.cssSelector("*:nth-child(${selector})")` + ) + }) +}) diff --git a/packages/code-export-python-pytest/__test__/test-files/control-flow-suite.side b/packages/code-export-python-pytest/__test__/test-files/control-flow-suite.side new file mode 100644 index 0000000000..022797a99b --- /dev/null +++ b/packages/code-export-python-pytest/__test__/test-files/control-flow-suite.side @@ -0,0 +1,1289 @@ +{ + "id": "df3db165-b029-41fe-b9a4-bfc83509a00b", + "version": "2.0", + "name": "control flow", + "url": "http://the-internet.herokuapp.com", + "tests": [{ + "id": "229b94d0-5a3d-49a2-a55e-a4e4a6449039", + "name": "send KEY_ENTER", + "commands": [{ + "id": "40d9dead-1078-4055-bfdb-9b3c1bdafd06", + "comment": "", + "command": "open", + "target": "https://en.wikipedia.org/wiki/Main_Page", + "targets": [], + "value": "" + }, { + "id": "546591fe-8bed-48fe-b740-e268a2035a23", + "comment": "", + "command": "type", + "target": "id=searchInput", + "targets": [], + "value": "selenium" + }, { + "id": "6ec8d1ef-aa48-46af-87e6-cf2d1a7aad4d", + "comment": "", + "command": "sendKeys", + "target": "id=searchInput", + "targets": [], + "value": "${KEY_ENTER}" + }] + }, { + "id": "01704d06-9abf-4776-8e1d-4d32e4e39965", + "name": "control flow if", + "commands": [{ + "id": "982c62ac-52d5-4089-8761-9322562d0695", + "comment": "", + "command": "executeScript", + "target": "return \"a\"", + "targets": [], + "value": "myVar" + }, { + "id": "665e9694-ff34-4ef0-b779-e20b8f382a98", + "comment": "", + "command": "if", + "target": "${myVar} === \"a\"", + "targets": [], + "value": "" + }, { + "id": "fb98e2df-b9b9-4018-a6f9-3ccda275274f", + "comment": "", + "command": "executeScript", + "target": "return \"a\"", + "targets": [], + "value": "output" + }, { + "id": "685914c9-05db-49f9-a9cc-843a3c41d625", + "comment": "", + "command": "elseIf", + "target": "${myVar} === \"b\"", + "targets": [], + "value": "" + }, { + "id": "1ec5562f-53f2-440e-ba86-b16a81fbfdf9", + "comment": "", + "command": "executeScript", + "target": "return \"b\"", + "targets": [], + "value": "output" + }, { + "id": "7fd7af73-8c76-40c1-964c-446d25eced45", + "comment": "", + "command": "else", + "target": "", + "targets": [], + "value": "" + }, { + "id": "380fdd77-5e7f-4e99-8e77-0d71bd80e0bf", + "comment": "", + "command": "executeScript", + "target": "return \"c\"", + "targets": [], + "value": "output" + }, { + "id": "49dc3da7-f1e4-4dee-a88c-7d2866a5e60c", + "comment": "", + "command": "end", + "target": "", + "targets": [], + "value": "" + }, { + "id": "b9fd4097-c21f-4ba9-92ca-5003aa12691c", + "comment": "", + "command": "assert", + "target": "output", + "targets": [], + "value": "a" + }] + }, { + "id": "564aa06a-6e04-491d-9134-bb9a03dfc290", + "name": "control flow else if", + "commands": [{ + "id": "a9c8ad31-db50-4b72-b9e6-6867c28202c2", + "comment": "", + "command": "executeScript", + "target": "return \"b\"", + "targets": [], + "value": "myVar" + }, { + "id": "b39b7bc5-5c03-42e1-a3e9-a61347e2e613", + "comment": "", + "command": "if", + "target": "${myVar} === \"a\"", + "targets": [], + "value": "" + }, { + "id": "0934ae73-17c5-4352-81e3-02594dc9790a", + "comment": "", + "command": "executeScript", + "target": "return \"a\"", + "targets": [], + "value": "output" + }, { + "id": "c3cf0ec4-dc66-4b2f-be49-fc070324b0b6", + "comment": "", + "command": "elseIf", + "target": "${myVar} === \"b\"", + "targets": [], + "value": "" + }, { + "id": "ad28503a-31d8-42ec-a24f-e553f5acdd28", + "comment": "", + "command": "executeScript", + "target": "return \"b\"", + "targets": [], + "value": "output" + }, { + "id": "367466ca-dd6c-493a-afa7-05ad5a35ce73", + "comment": "", + "command": "else", + "target": "", + "targets": [], + "value": "" + }, { + "id": "671901de-05bb-4746-88a3-ec51d1b9cdec", + "comment": "", + "command": "executeScript", + "target": "return \"c\"", + "targets": [], + "value": "output" + }, { + "id": "0952e6ea-2f45-4993-a203-b18f181f7ee5", + "comment": "", + "command": "end", + "target": "", + "targets": [], + "value": "" + }, { + "id": "c3555723-c312-4fc9-a39f-481123687694", + "comment": "", + "command": "assert", + "target": "output", + "targets": [], + "value": "b" + }] + }, { + "id": "f94989d9-4cd4-480a-8a68-f07fb071800c", + "name": "control flow else", + "commands": [{ + "id": "8808b613-0ea4-469f-80d7-4c3e623f131b", + "comment": "", + "command": "executeScript", + "target": "return \"c\"", + "targets": [], + "value": "myVar" + }, { + "id": "b501ef34-f90e-4bf4-aa63-2fc9ad4d2a07", + "comment": "", + "command": "if", + "target": "${myVar} === \"a\"", + "targets": [], + "value": "" + }, { + "id": "20ee3afe-3aa2-494e-af8f-04e7015d3d62", + "comment": "", + "command": "executeScript", + "target": "return \"a\"", + "targets": [], + "value": "output" + }, { + "id": "3cca1a06-ba99-405e-bd6d-ac80a7005c42", + "comment": "", + "command": "elseIf", + "target": "${myVar} === \"b\"", + "targets": [], + "value": "" + }, { + "id": "00f7cf49-009b-42f6-8d65-d6091518adcd", + "comment": "", + "command": "executeScript", + "target": "return \"b\"", + "targets": [], + "value": "output" + }, { + "id": "1918b3ef-0529-4ce8-b40e-654adaf3b9ea", + "comment": "", + "command": "else", + "target": "", + "targets": [], + "value": "" + }, { + "id": "0e28acb2-939f-4fba-af2d-9e117c8fe970", + "comment": "", + "command": "executeScript", + "target": "return \"c\"", + "targets": [], + "value": "output" + }, { + "id": "862d15cc-1a04-43b2-8000-51db37c243b8", + "comment": "", + "command": "end", + "target": "", + "targets": [], + "value": "" + }, { + "id": "70f32453-923f-4011-b0cb-a7b97e66b887", + "comment": "", + "command": "assert", + "target": "output", + "targets": [], + "value": "c" + }] + }, { + "id": "958bcde1-54ef-4d1f-bd4e-f1e973af63fc", + "name": "control flow do", + "commands": [{ + "id": "b3f11898-e966-46bc-8c3f-f569ec8fe922", + "comment": "", + "command": "executeScript", + "target": "return 1", + "targets": [], + "value": "check" + }, { + "id": "af70f421-e2cb-45b3-beb9-71bc122c633c", + "comment": "", + "command": "do", + "target": "", + "targets": [], + "value": "" + }, { + "id": "b9e61769-a1f7-4188-8a28-caa7b67e2ed4", + "comment": "", + "command": "executeScript", + "target": "return ${check} + 1", + "targets": [], + "value": "check" + }, { + "id": "8803443e-69c2-449c-aec5-ecf6271a7306", + "comment": "", + "command": "repeatIf", + "target": "${check} < 3", + "targets": [], + "value": "" + }, { + "id": "2e38b837-9a8d-44d4-a085-14983b28a2eb", + "comment": "", + "command": "assert", + "target": "check", + "targets": [], + "value": "3" + }] + }, { + "id": "99fca157-b6bf-4076-95bc-2e7b449178d6", + "name": "control flow times", + "commands": [{ + "id": "4271037f-797f-4008-9f3e-a3eec005121f", + "comment": "", + "command": "executeScript", + "target": "return 1", + "targets": [], + "value": "check" + }, { + "id": "6f8efbe4-4e90-462c-a6d3-dc32ec52ea26", + "comment": "", + "command": "times", + "target": "2", + "targets": [], + "value": "" + }, { + "id": "99dd996f-fc5b-4ed6-966d-93f3df60d88b", + "comment": "", + "command": "executeScript", + "target": "return ${check} + 1", + "targets": [], + "value": "check" + }, { + "id": "8d0ac0a8-da4e-4b5c-a877-3aa16658a0bf", + "comment": "", + "command": "end", + "target": "", + "targets": [], + "value": "" + }, { + "id": "278f6149-ac75-4970-ac4f-e517a664ef3a", + "comment": "", + "command": "assert", + "target": "check", + "targets": [], + "value": "3" + }] + }, { + "id": "2f113e0b-224d-4651-af16-4dac9d5d623a", + "name": "control flow while", + "commands": [{ + "id": "84bb2c54-805e-47dc-b529-1934a7340a07", + "comment": "", + "command": "executeScript", + "target": "return 1", + "targets": [], + "value": "check" + }, { + "id": "b3ae743f-0342-4b83-bfa9-ade7b859aa51", + "comment": "", + "command": "while", + "target": "${check} < 3", + "targets": [], + "value": "" + }, { + "id": "bd542456-be99-40cb-a9be-e79223034842", + "comment": "", + "command": "executeScript", + "target": "return ${check} + 1", + "targets": [], + "value": "check" + }, { + "id": "7db2f99b-a413-4e3f-ac91-7297c6c0d8f8", + "comment": "", + "command": "end", + "target": "", + "targets": [], + "value": "" + }, { + "id": "1258d2b9-ec34-400f-a572-c46852ecf686", + "comment": "", + "command": "assert", + "target": "check", + "targets": [], + "value": "3" + }] + }, { + "id": "895ccb2c-8bcb-4c8c-a94a-1999bc0c8d8f", + "name": "execute script", + "commands": [{ + "id": "5966dc26-0376-4be0-86e9-d6514da009f0", + "comment": "", + "command": "executeScript", + "target": "return true", + "targets": [], + "value": "blah" + }, { + "id": "3ca71f8c-6ff0-4ba3-9db5-f43ef674570b", + "comment": "", + "command": "assert", + "target": "blah", + "targets": [], + "value": "true" + }, { + "id": "1ada3a0b-d68b-4879-afb4-c94719360b1c", + "comment": "", + "command": "executeScript", + "target": "true", + "targets": [], + "value": "" + }, { + "id": "75528f9d-ce6a-4938-bcbf-5ce17245c025", + "comment": "", + "command": "echo", + "target": "${blah}", + "targets": [], + "value": "" + }] + }, { + "id": "129e5fa6-2bb6-48a8-8424-1cfebf02daf7", + "name": "execute script array", + "commands": [{ + "id": "fd44948c-2307-4482-bfb1-08a0cc64a653", + "comment": "", + "command": "executeScript", + "target": "return [1,2,3]", + "targets": [], + "value": "x" + }, { + "id": "78a415fa-17ce-46e6-9d7c-2d21fca42a76", + "comment": "", + "command": "executeScript", + "target": "return ${x}[0] + 1", + "targets": [], + "value": "y" + }, { + "id": "8cf74007-673f-4728-970d-8e93d6b838a2", + "comment": "", + "command": "assert", + "target": "y", + "targets": [], + "value": "2" + }] + }, { + "id": "65bfb926-fde9-4823-811e-0da5d33cc5b0", + "name": "execute script object", + "commands": [{ + "id": "7c9cd403-d0f4-4b17-9a44-b203abddabe2", + "comment": "", + "command": "executeScript", + "target": "return { x: 3 }", + "targets": [], + "value": "x" + }, { + "id": "136c3a6f-33fe-4083-9756-3024b182009c", + "comment": "", + "command": "executeScript", + "target": "return ${x}.x + 2", + "targets": [], + "value": "y" + }, { + "id": "a2234f54-c359-46b3-a750-ecaa25ce87ea", + "comment": "", + "command": "assert", + "target": "y", + "targets": [], + "value": "5" + }] + }, { + "id": "ec2a4212-b9cc-4120-9044-4b7e0bad2d5c", + "name": "execute script primitives", + "commands": [{ + "id": "c3c9a9c3-94ef-46da-bbb6-488babd9e3a2", + "comment": "", + "command": "executeScript", + "target": "return true", + "targets": [], + "value": "bool" + }, { + "id": "40fa3983-4fae-4329-b3bd-4a65b0f46fdc", + "comment": "", + "command": "assert", + "target": "bool", + "targets": [], + "value": "true" + }, { + "id": "fd43a7e2-593e-4012-a79e-2e3c8877afce", + "comment": "", + "command": "executeScript", + "target": "return 3.14", + "targets": [], + "value": "float" + }, { + "id": "92345893-6566-4764-9790-5792b97d459f", + "comment": "", + "command": "assert", + "target": "float", + "targets": [], + "value": "3.14" + }, { + "id": "4d4bf0af-8152-421f-8870-7146b66519d9", + "comment": "", + "command": "executeScript", + "target": "return \"test\"", + "targets": [], + "value": "string" + }, { + "id": "48d1c7a1-4ec3-4d2b-b2ce-22faefa8fe84", + "comment": "", + "command": "assert", + "target": "string", + "targets": [], + "value": "test" + }] + }, { + "id": "4973518e-3e78-41c0-b5b6-75648c183265", + "name": "check", + "commands": [{ + "id": "c527c2a1-6439-4711-a297-6379d4146c4d", + "comment": "", + "command": "open", + "target": "/checkboxes", + "targets": [], + "value": "" + }, { + "id": "4fcaeffc-0a11-40b5-8701-d927633502a7", + "comment": "", + "command": "check", + "target": "css=input", + "targets": [ + ["id=something", "id"], + ["name=something-else", "name"], + ["linkText=number density", "linkText"], + ["xpath=//a[contains(text(),'number density')]", "xpath:link"], + ["css=main .class > p a.link", "css"], + ["xpath=(//a[contains(text(),'number line')])[2]", "xpath:link"], + ["(//a[contains(text(),'number line')])[2]", "xpath:link"], + ["//a[contains(text(),'number density')]", "xpath:link"], + ["//div[@id='mw-content-text']/div/p[2]/a[5]", "xpath:idRelative"], + ["//a[contains(@href, '/wiki/Number_density')]", "xpath:href"], + ["//a[5]", "xpath:position"] + ], + "value": "" + }, { + "id": "1e4dbff7-9999-4f1c-932d-e1efe08180a8", + "comment": "", + "command": "assertChecked", + "target": "css=input", + "targets": [], + "value": "" + }, { + "id": "b1aea9fc-3475-4ad4-a078-7c49eb1d7408", + "comment": "", + "command": "uncheck", + "target": "css=input", + "targets": [], + "value": "" + }, { + "id": "678dd4e5-eb03-4099-83ef-fd9f60fcd83d", + "comment": "", + "command": "assertNotChecked", + "target": "css=input", + "targets": [], + "value": "" + }] + }, { + "id": "a1022ee9-c0b7-44b1-8c98-280771d28a78", + "name": "click", + "commands": [{ + "id": "c90a196e-9d75-4d58-85a4-9c1443f102ce", + "comment": "", + "command": "open", + "target": "/", + "targets": [], + "value": "" + }, { + "id": "0342a182-1a3d-4b0e-aa31-829c480e6021", + "comment": "", + "command": "click", + "target": "linkText=Dropdown", + "targets": [], + "value": "" + }, { + "id": "fd680d67-c174-4a15-9c92-c951eac61597", + "comment": "", + "command": "assertText", + "target": "css=h3", + "targets": [], + "value": "Dropdown List" + }, { + "id": "581c81c9-328e-42a9-9ff2-2c2ffd955c61", + "comment": "", + "command": "open", + "target": "/", + "targets": [], + "value": "" + }, { + "id": "1f6350c0-7727-4ccc-bfcc-030736a2b21d", + "comment": "", + "command": "click", + "target": "link=Dropdown", + "targets": [], + "value": "" + }, { + "id": "7e8083ed-2a76-4566-ba04-21c7957f6a42", + "comment": "", + "command": "assertText", + "target": "css=h3", + "targets": [], + "value": "Dropdown List" + }, { + "id": "70d5b712-b810-4e27-8047-2a8956804228", + "comment": "", + "command": "open", + "target": "/", + "targets": [], + "value": "" + }, { + "id": "41b1d5cf-6ba9-4632-b7d5-50c98cd39b8f", + "comment": "", + "command": "click", + "target": "partialLinkText=ropd", + "targets": [], + "value": "" + }, { + "id": "0fa4778d-19cc-4224-94a7-91a766b6039b", + "comment": "", + "command": "assertText", + "target": "css=h3", + "targets": [], + "value": "Dropdown List" + }] + }, { + "id": "c4b536e2-8061-43a7-b538-548336b550d4", + "name": "click at", + "commands": [{ + "id": "d696fa74-5c6e-49e6-9be9-83e28416db16", + "comment": "", + "command": "open", + "target": "/", + "targets": [], + "value": "" + }, { + "id": "da36b83c-d5f8-4c6d-84fd-6c7d11d73b35", + "comment": "", + "command": "clickAt", + "target": "css=a", + "targets": [], + "value": "" + }] + }, { + "id": "8ab1a8ff-7bf7-45c4-8af2-8fedd2eaefa4", + "name": "comment", + "commands": [{ + "id": "40f32d2f-4c74-4579-81d5-7a8553cf72a9", + "comment": "", + "command": "//commented code", + "target": "", + "targets": [], + "value": "" + }, { + "id": "67369682-3b43-42a2-bca2-c5d70cd32e2f", + "comment": "blah", + "command": "", + "target": "", + "targets": [], + "value": "" + }, { + "id": "c258898c-07ee-4dfb-a3da-5b0edbdb3209", + "comment": "", + "command": "", + "target": "", + "targets": [], + "value": "" + }, { + "id": "c014f0af-5875-44d1-b4d3-f9ecff6b4f77", + "comment": "also blah", + "command": "open", + "target": "/", + "targets": [], + "value": "" + }] + }, { + "id": "8821c552-d179-41ba-9a17-7ba6cba736af", + "name": "frames", + "commands": [{ + "id": "7c45a91f-94a0-4bae-9463-13484d60c810", + "comment": "", + "command": "open", + "target": "/iframe", + "targets": [], + "value": "" + }, { + "id": "c9914464-b6f4-4053-82b8-e4b1763ee744", + "comment": "", + "command": "selectFrame", + "target": "index=0", + "targets": [], + "value": "" + }, { + "id": "e9e9287f-00fe-4caf-ba73-01b2573a6d7c", + "comment": "", + "command": "assertText", + "target": "css=#tinymce", + "targets": [], + "value": "Your content goes here." + }, { + "id": "e3614139-4980-432f-b5d0-3f2bbe6d5323", + "comment": "", + "command": "open", + "target": "/nested_frames", + "targets": [], + "value": "" + }, { + "id": "295b8e2d-682c-475e-ba79-eaa80ad274b4", + "comment": "", + "command": "selectFrame", + "target": "index=1", + "targets": [], + "value": "" + }, { + "id": "d73e2c70-ce5d-4f20-86ef-65a621280556", + "comment": "", + "command": "assertText", + "target": "css=#content", + "targets": [], + "value": "MIDDLE" + }] + }, { + "id": "e4cede35-6b3e-4641-9810-72e7ce2e6bda", + "name": "select", + "commands": [{ + "id": "db008c4d-b7b6-4fa2-964b-ef8b20ae6fdf", + "comment": "", + "command": "open", + "target": "/dropdown", + "targets": [], + "value": "" + }, { + "id": "e8612e65-271a-4d45-b5c8-2aca73d728d5", + "comment": "", + "command": "select", + "target": "id=dropdown", + "targets": [], + "value": "value=1" + }, { + "id": "eabebe84-ad4a-4a5a-a720-ac8cad0cab3e", + "comment": "", + "command": "assertSelectedValue", + "target": "id=dropdown", + "targets": [], + "value": "1" + }, { + "id": "d466a89b-2a1a-42bc-a438-5aa2dff0d238", + "comment": "", + "command": "assertNotSelectedValue", + "target": "id=dropdown", + "targets": [], + "value": "2" + }, { + "id": "6c7142c2-e38a-4ec9-9dd1-919b7f4bdb80", + "comment": "", + "command": "assertSelectedLabel", + "target": "id=dropdown", + "targets": [], + "value": "Option 1" + }, { + "id": "98db5aff-5979-44bd-ae4a-24dbb71e73d2", + "comment": "", + "command": "select", + "target": "id=dropdown", + "targets": [], + "value": "Option 2" + }, { + "id": "1aaefcd3-ccde-4644-9c2b-0ed2472bfae4", + "comment": "", + "command": "assertSelectedValue", + "target": "id=dropdown", + "targets": [], + "value": "2" + }, { + "id": "5151e29d-13bf-4793-939a-2d674da820fa", + "comment": "", + "command": "assertNotSelectedValue", + "target": "id=dropdown", + "targets": [], + "value": "1" + }, { + "id": "8a78734a-7d33-4be2-b131-1927d9aad3d2", + "comment": "", + "command": "assertSelectedLabel", + "target": "id=dropdown", + "targets": [], + "value": "Option 2" + }] + }, { + "id": "dfa2e095-f81f-4bae-bf63-dab08b16e475", + "name": "send keys", + "commands": [{ + "id": "564a50b8-3011-43ab-9439-3415aca3e371", + "comment": "", + "command": "open", + "target": "/login", + "targets": [], + "value": "" + }, { + "id": "68948336-2bec-4d97-bc59-b60c3a1db053", + "comment": "", + "command": "sendKeys", + "target": "css=#username", + "targets": [], + "value": "tomsmith" + }, { + "id": "4ed185c3-b6aa-4ad0-88e7-dba8af1f083a", + "comment": "", + "command": "sendKeys", + "target": "xpath=//input[@id='password']", + "targets": [], + "value": "SuperSecretPassword!${KEY_ENTER}" + }, { + "id": "bc04b16d-3b32-48c7-8304-2a1e8d3addf3", + "comment": "", + "command": "assertText", + "target": "id=flash", + "targets": [], + "value": "You logged into a secure area!\\n×" + }] + }, { + "id": "847b28b8-1fd9-4563-bc3a-8faa30ba1408", + "name": "store text", + "commands": [{ + "id": "452f9209-d1f0-403a-b198-107340717025", + "comment": "", + "command": "open", + "target": "/login", + "targets": [], + "value": "" + }, { + "id": "23a7e9ba-1fc6-4ac9-95f6-8c79f4f6abd5", + "comment": "", + "command": "sendKeys", + "target": "css=#username", + "targets": [], + "value": "blah" + }, { + "id": "54ac9880-6797-46fe-8f8f-1fbc8cd3fb6e", + "comment": "", + "command": "storeValue", + "target": "css=#username", + "targets": [], + "value": "aVar" + }, { + "id": "494b73ea-aef2-4321-9259-0a865adf93ac", + "comment": "", + "command": "assert", + "target": "aVar", + "targets": [], + "value": "blah" + }] + }, { + "id": "08cc9e79-661e-4f99-8c9e-23bfa18e2cee", + "name": "submit", + "commands": [{ + "id": "7a0479a0-ed2d-4177-a200-ee919a8855da", + "comment": "", + "command": "open", + "target": "/login", + "targets": [], + "value": "" + }, { + "id": "63a7c43c-60ee-4e92-864b-3f5422cbf2ef", + "comment": "", + "command": "sendKeys", + "target": "css=#username", + "targets": [], + "value": "tomsmith" + }, { + "id": "64c16373-1dcb-4d89-8234-71a25ba561d4", + "comment": "", + "command": "sendKeys", + "target": "css=#password", + "targets": [], + "value": "SuperSecretPassword!" + }, { + "id": "32fab02a-749e-4656-b394-d93009390558", + "comment": "", + "command": "submit", + "target": "css=#login", + "targets": [], + "value": "" + }, { + "id": "57dde464-1296-4ef7-b9f5-8f39d2187843", + "comment": "", + "command": "assertElementPresent", + "target": "css=.flash.success", + "targets": [], + "value": "" + }] + }, { + "id": "4f4dc8bc-a7bf-4304-a986-c9823df30669", + "name": "wait for element present", + "commands": [{ + "id": "e33722db-58a2-47d5-9c7f-d3c8f607f6a9", + "comment": "", + "command": "open", + "target": "/dynamic_loading/2", + "targets": [], + "value": "" + }, { + "id": "95ee4b26-1141-4a99-bf94-1c610247f7ce", + "comment": "", + "command": "clickAt", + "target": "css=#start button", + "targets": [], + "value": "" + }, { + "id": "67d7b233-373d-4f92-869d-6b7ef92b0772", + "comment": "", + "command": "waitForElementPresent", + "target": "css=#finish", + "targets": [], + "value": "5000" + }, { + "id": "ea60b0df-4299-46da-8cad-11f94eeb6fc3", + "comment": "", + "command": "assertText", + "target": "css=#finish", + "targets": [], + "value": "Hello World!" + }] + }, { + "id": "cd580e8e-0271-4f76-9e64-762024bd3403", + "name": "wait for element not present", + "commands": [{ + "id": "7f89cfbc-e890-41f9-b3e2-8985fe8c5c3a", + "comment": "", + "command": "open", + "target": "/dynamic_controls", + "targets": [], + "value": "" + }, { + "id": "bb6528b4-4581-4853-9118-8437e568b065", + "comment": "", + "command": "clickAt", + "target": "css=#checkbox-example button", + "targets": [], + "value": "" + }, { + "id": "558013e7-d2f6-4bd1-9f5b-26f38c2bb193", + "comment": "", + "command": "waitForElementNotPresent", + "target": "css=#checkbox", + "targets": [], + "value": "5000" + }, { + "id": "557bc5c6-e869-4ac3-af52-c448f9029560", + "comment": "", + "command": "assertElementNotPresent", + "target": "css=#checkbox", + "targets": [], + "value": "" + }] + }, { + "id": "b0b05b79-95c8-49a7-b297-9cbed9f63269", + "name": "wait for element visible", + "commands": [{ + "id": "4671a42d-e8e4-44ac-8325-3c721bde01d2", + "comment": "", + "command": "open", + "target": "/dynamic_loading/1", + "targets": [], + "value": "" + }, { + "id": "47fced8b-5e22-4a33-82ce-e84ce8193a53", + "comment": "", + "command": "clickAt", + "target": "css=#start button", + "targets": [], + "value": "" + }, { + "id": "bf72d9ff-d0eb-4e57-a006-33beefd31a9d", + "comment": "", + "command": "waitForElementVisible", + "target": "css=#finish", + "targets": [], + "value": "5000" + }, { + "id": "848a3875-28b6-4bbe-b303-7b5eda5ec7f8", + "comment": "", + "command": "assertText", + "target": "css=#finish", + "targets": [], + "value": "Hello World!" + }] + }, { + "id": "c4aa8aac-8a56-41f5-9a3f-329af5670ee2", + "name": "wait for element not visible", + "commands": [{ + "id": "af00a76a-8052-4fd4-a3c1-e9066fd42885", + "comment": "", + "command": "open", + "target": "/dynamic_loading/1", + "targets": [], + "value": "" + }, { + "id": "c12c2217-3bd0-4ccb-b1d9-41f9e357d863", + "comment": "", + "command": "clickAt", + "target": "css=#start button", + "targets": [], + "value": "" + }, { + "id": "24fcfaf9-0cc5-4dc1-92ce-030997df0783", + "comment": "", + "command": "waitForElementNotVisible", + "target": "css=#loading", + "targets": [], + "value": "5000" + }, { + "id": "7c7d2492-ecec-411a-a71d-4ca905865947", + "comment": "", + "command": "assertText", + "target": "css=#finish", + "targets": [], + "value": "Hello World!" + }] + }, { + "id": "a1852a8a-9e73-48b5-b846-a99964a51413", + "name": "wait for element editable (and not editable)", + "commands": [{ + "id": "675ab96a-4cfb-451c-9928-84b1fde6e8d1", + "comment": "", + "command": "open", + "target": "/dynamic_controls", + "targets": [], + "value": "" + }, { + "id": "f2957579-5dca-4499-b94f-92d62d572ced", + "comment": "", + "command": "clickAt", + "target": "css=#input-example button", + "targets": [], + "value": "" + }, { + "id": "0e56d7bd-deda-454d-84a7-7beffb87e70b", + "comment": "", + "command": "waitForElementEditable", + "target": "css=#input-example input", + "targets": [], + "value": "5000" + }, { + "id": "95356452-fd37-484b-9050-5fcaa75f8d1b", + "comment": "", + "command": "assertEditable", + "target": "css=#input-example input", + "targets": [], + "value": "" + }, { + "id": "51018c43-bca1-4497-8ec3-206fb37e62a7", + "comment": "", + "command": "clickAt", + "target": "css=#input-example button", + "targets": [], + "value": "" + }, { + "id": "5777d733-283c-4325-b81f-a022b54cbe8b", + "comment": "", + "command": "waitForElementNotEditable", + "target": "css=#input-example input", + "targets": [], + "value": "5000" + }, { + "id": "2b956ec4-4ca9-450e-81cb-f0c58ebdcb4b", + "comment": "", + "command": "assertNotEditable", + "target": "css=#input-example input", + "targets": [], + "value": "" + }] + }, { + "id": "cb561b9c-9ab3-487b-9f48-9ba0bca1149c", + "name": "locator fallback", + "commands": [{ + "id": "9151ceab-0045-4eb5-9a09-d5f1588cd5e8", + "comment": "", + "command": "open", + "target": "/dynamic_loading/2", + "targets": [], + "value": "" + }, { + "id": "153abb09-ef4a-45cb-82ea-5fd22af79f4a", + "comment": "", + "command": "click", + "target": "css=button", + "targets": [], + "value": "" + }, { + "id": "5a547f40-a3b6-48ee-865c-5973fae75ecf", + "comment": "", + "command": "clickAt", + "target": "css=#finis > h4", + "targets": [ + ["css=#finis > h4", "css"], + ["css=#finish > h4", "css"] + ], + "value": "" + }, { + "id": "855eb4fe-9cd2-4d0f-b8b0-5116de44cff7", + "comment": "", + "command": "assertText", + "target": "css=#finish > h4", + "targets": [], + "value": "Hello World!" + }] + }, { + "id": "245ded41-ba4f-45a4-b93a-f77c2a903214", + "name": "confirmation dialog", + "commands": [{ + "id": "1508ad14-e69a-4888-90e9-da7f0bcd9299", + "comment": "", + "command": "open", + "target": "/javascript_alerts", + "targets": [], + "value": "" + }, { + "id": "20cb3449-0889-4c29-a48c-9b28f93c2271", + "comment": "", + "command": "chooseOkOnNextConfirmation", + "target": "", + "targets": [], + "value": "" + }, { + "id": "744020a2-4548-4e02-ad59-35e5ad60c3b3", + "comment": "", + "command": "click", + "target": "css=li:nth-child(2) > button", + "targets": [], + "value": "" + }, { + "id": "a24be3d3-9274-4a22-8cf0-a5224593a847", + "comment": "", + "command": "assertConfirmation", + "target": "I am a JS Confirm", + "targets": [], + "value": "" + }, { + "id": "a2b4c27f-c9e1-4318-8925-c645c6a6fdfc", + "comment": "", + "command": "webdriverChooseOkOnVisibleConfirmation", + "target": "", + "targets": [], + "value": "" + }] + }, { + "id": "1bc6db9d-9bcf-4eb7-b7c1-37b8a10f141a", + "name": "select window", + "commands": [{ + "id": "7cb5f12b-55d4-45ab-ad3a-0ec9eeace16d", + "comment": "", + "command": "open", + "target": "/", + "targets": [], + "value": "" + }, { + "id": "75834653-1192-470d-b676-8b346475c29a", + "comment": "", + "command": "storeWindowHandle", + "target": "handle", + "targets": [], + "value": "" + }, { + "id": "5751fb3f-e8db-4d44-8087-1fd479029cad", + "comment": "", + "command": "echo", + "target": "${handle}", + "targets": [], + "value": "" + }, { + "id": "b6a47509-ca0a-42f3-bd8f-167a17b15b6c", + "comment": "", + "command": "click", + "target": "linkText=Elemental Selenium", + "targets": [], + "value": "", + "opensWindow": true, + "windowHandleName": "newWindow", + "windowTimeout": 2000 + }, { + "id": "1c16c2c7-0684-409d-bdca-6cd992c6d8f7", + "comment": "", + "command": "assertTitle", + "target": "The Internet", + "targets": [], + "value": "" + }, { + "id": "ef98c2ee-49d5-40e8-b95d-388a94a3a3fc", + "comment": "", + "command": "selectWindow", + "target": "handle=${handle}", + "targets": [], + "value": "" + }, { + "id": "c04766b5-8499-4c36-a7e3-72ff1f401d5b", + "comment": "", + "command": "assertTitle", + "target": "The Internet", + "targets": [], + "value": "" + }, { + "id": "435f7180-ef2d-4a2a-b9b4-f0341e8a1314", + "comment": "", + "command": "selectWindow", + "target": "handle=${newWindow}", + "targets": [], + "value": "" + }, { + "id": "c816ddeb-c31c-4e20-957a-48f5cb944f8a", + "comment": "", + "command": "assertTitle", + "target": "Elemental Selenium: Receive a Free, Weekly Tip on Using Selenium like a Pro", + "targets": [], + "value": "" + }, { + "id": "82da76fd-fd11-476d-9778-0ffae63d06ae", + "comment": "", + "command": "close", + "target": "", + "targets": [], + "value": "" + }, { + "id": "36faa878-126b-4b1e-bc23-817ca45eba55", + "comment": "", + "command": "selectWindow", + "target": "handle=${handle}", + "targets": [], + "value": "" + }, { + "id": "ea3f2f78-e54b-4851-91d6-83f8d2ff03df", + "comment": "", + "command": "assertTitle", + "target": "The Internet", + "targets": [], + "value": "" + }, { + "id": "ccc8e464-b5b9-4954-afc5-81c3aa52deed", + "comment": "", + "command": "close", + "target": "", + "targets": [], + "value": "" + }] + }, { + "id": "1dfaba3c-1d1d-49ba-aa2c-9518565c134f", + "name": "login", + "commands": [{ + "id": "3ad5d85d-58c6-40cf-9006-f259b2a79ad0", + "comment": "", + "command": "open", + "target": "/login", + "targets": [], + "value": "" + }, { + "id": "701bf60d-59b1-43a2-a730-8be3e723677d", + "comment": "", + "command": "sendKeys", + "target": "id=username", + "targets": [], + "value": "${username}" + }, { + "id": "b7d1c1db-fa94-438e-bb95-e26daaaa1f56", + "comment": "", + "command": "sendKeys", + "target": "id=password", + "targets": [], + "value": "${password}" + }, { + "id": "f8c9802e-e0c9-4120-ba01-9f4c6111dc02", + "comment": "", + "command": "click", + "target": "css=#login button", + "targets": [], + "value": "" + }] + }, { + "id": "0aa6bbed-cc55-425c-b3af-a0ab43d1dd2b", + "name": "reuse", + "commands": [{ + "id": "90c4883c-7a1a-41fb-a8de-2ea5dc6d8d72", + "comment": "", + "command": "store", + "target": "tomsmith", + "targets": [], + "value": "username" + }, { + "id": "c5dc0eb7-c424-43f4-b046-81e8479511a9", + "comment": "", + "command": "store", + "target": "SuperSecretPassword!", + "targets": [], + "value": "password" + }, { + "id": "3f6dddac-3de7-4503-aef3-7926a8d0e166", + "comment": "", + "command": "run", + "target": "login", + "targets": [], + "value": "" + }, { + "id": "9f25e9ec-ac1c-48de-95c7-e5a2e99c62ea", + "comment": "", + "command": "assertText", + "target": "id=flash", + "targets": [], + "value": "You logged into a secure area!\\n×" + }] + }], + "suites": [{ + "id": "de384772-7c44-4ebd-a563-9f59d4a29ded", + "name": "control flow", + "persistSession": false, + "parallel": false, + "timeout": 300, + "tests": ["01704d06-9abf-4776-8e1d-4d32e4e39965", "564aa06a-6e04-491d-9134-bb9a03dfc290", "f94989d9-4cd4-480a-8a68-f07fb071800c", "958bcde1-54ef-4d1f-bd4e-f1e973af63fc", "99fca157-b6bf-4076-95bc-2e7b449178d6", "2f113e0b-224d-4651-af16-4dac9d5d623a"] + }], + "urls": ["http://the-internet.herokuapp.com/"], + "plugins": [] +} \ No newline at end of file diff --git a/packages/code-export-python-pytest/__test__/test-files/nested-select-window-v2.side b/packages/code-export-python-pytest/__test__/test-files/nested-select-window-v2.side new file mode 100644 index 0000000000..55c14585b7 --- /dev/null +++ b/packages/code-export-python-pytest/__test__/test-files/nested-select-window-v2.side @@ -0,0 +1,71 @@ +{ + "id": "212f1831-7949-459d-a0ba-daf472ed3e53", + "version": "2.0", + "name": "nested-select-window-v2", + "url": "http://the-internet.herokuapp.com", + "tests": [{ + "id": "3147925e-12c9-4b8e-aac1-90f4f13e8404", + "name": "reuse", + "commands": [{ + "id": "4c01a3a4-9547-4233-8d45-92496d6a6307", + "comment": "", + "command": "run", + "target": "select window", + "targets": [], + "value": "" + }] + }, { + "id": "b85e7efd-0f6f-4626-b815-24ddc3f8fbd1", + "name": "select window", + "commands": [{ + "id": "6b96f8fe-141f-4e2d-8675-1698ad725c79", + "comment": "", + "command": "open", + "target": "/windows", + "targets": [], + "value": "" + }, { + "id": "ee184b06-b880-4fed-ae23-b924f16284d9", + "comment": "", + "command": "click", + "target": "linkText=Click Here", + "targets": [ + ["linkText=Click Here", "linkText"], + ["css=a:nth-child(2)", "css:finder"], + ["xpath=//a[contains(text(),'Click Here')]", "xpath:link"], + ["xpath=//div[@id='content']/div/a", "xpath:idRelative"], + ["xpath=//a[contains(@href, '/windows/new')]", "xpath:href"], + ["xpath=//div/div/a", "xpath:position"], + ["xpath=//a[contains(.,'Click Here')]", "xpath:innerText"] + ], + "value": "", + "opensWindow": true, + "windowHandleName": "win9425", + "windowTimeout": 2000 + }, { + "id": "f08b16ff-85df-4bcc-82f7-e8861bdb5eb2", + "comment": "", + "command": "selectWindow", + "target": "handle=${win9425}", + "targets": [], + "value": "" + }, { + "id": "c3319e1c-cd44-4213-a7f5-e780069cd1f0", + "comment": "", + "command": "assertTitle", + "target": "New Window", + "targets": [], + "value": "" + }] + }], + "suites": [{ + "id": "696ca955-3e12-4f0a-a4ef-369b647fd7eb", + "name": "Default Suite", + "persistSession": false, + "parallel": false, + "timeout": 300, + "tests": ["3147925e-12c9-4b8e-aac1-90f4f13e8404", "b85e7efd-0f6f-4626-b815-24ddc3f8fbd1"] + }], + "urls": ["http://the-internet.herokuapp.com/"], + "plugins": [] +} \ No newline at end of file diff --git a/packages/code-export-python-pytest/__test__/test-files/nested-select-window.side b/packages/code-export-python-pytest/__test__/test-files/nested-select-window.side new file mode 100644 index 0000000000..8d381b650e --- /dev/null +++ b/packages/code-export-python-pytest/__test__/test-files/nested-select-window.side @@ -0,0 +1,71 @@ +{ + "id": "212f1831-7949-459d-a0ba-daf472ed3e53", + "version": "2.0", + "name": "nested select window", + "url": "http://the-internet.herokuapp.com", + "tests": [{ + "id": "3147925e-12c9-4b8e-aac1-90f4f13e8404", + "name": "reuse", + "commands": [{ + "id": "4c01a3a4-9547-4233-8d45-92496d6a6307", + "comment": "", + "command": "run", + "target": "select window", + "targets": [], + "value": "" + }] + }, { + "id": "b85e7efd-0f6f-4626-b815-24ddc3f8fbd1", + "name": "select window", + "commands": [{ + "id": "6b96f8fe-141f-4e2d-8675-1698ad725c79", + "comment": "", + "command": "open", + "target": "/windows", + "targets": [], + "value": "" + }, { + "id": "ee184b06-b880-4fed-ae23-b924f16284d9", + "comment": "", + "command": "click", + "target": "linkText=Click Here", + "targets": [ + ["linkText=Click Here", "linkText"], + ["css=a:nth-child(2)", "css:finder"], + ["xpath=//a[contains(text(),'Click Here')]", "xpath:link"], + ["xpath=//div[@id='content']/div/a", "xpath:idRelative"], + ["xpath=//a[contains(@href, '/windows/new')]", "xpath:href"], + ["xpath=//div/div/a", "xpath:position"], + ["xpath=//a[contains(.,'Click Here')]", "xpath:innerText"] + ], + "value": "", + "opensWindow": true, + "windowHandleName": "win9425", + "windowTimeout": 2000 + }, { + "id": "f08b16ff-85df-4bcc-82f7-e8861bdb5eb2", + "comment": "", + "command": "selectWindow", + "target": "handle=${win9425}", + "targets": [], + "value": "" + }, { + "id": "c3319e1c-cd44-4213-a7f5-e780069cd1f0", + "comment": "", + "command": "assertTitle", + "target": "New Window", + "targets": [], + "value": "" + }] + }], + "suites": [{ + "id": "696ca955-3e12-4f0a-a4ef-369b647fd7eb", + "name": "Default Suite", + "persistSession": false, + "parallel": false, + "timeout": 300, + "tests": ["3147925e-12c9-4b8e-aac1-90f4f13e8404"] + }], + "urls": ["http://the-internet.herokuapp.com/"], + "plugins": [] +} \ No newline at end of file diff --git a/packages/code-export-python-pytest/__test__/test-files/select-window.side b/packages/code-export-python-pytest/__test__/test-files/select-window.side new file mode 100644 index 0000000000..68b90ab725 --- /dev/null +++ b/packages/code-export-python-pytest/__test__/test-files/select-window.side @@ -0,0 +1,103 @@ +{ + "id": "c0f8143d-d29b-43cc-ab08-268ef217f3b4", + "version": "2.0", + "name": "select window", + "url": "http://the-internet.herokuapp.com", + "tests": [{ + "id": "5d92f854-623b-41da-826b-2feb4ad20f2a", + "name": "select window", + "commands": [{ + "id": "0441ea10-c31c-4322-965b-6f61e22048cf", + "comment": "", + "command": "open", + "target": "/", + "targets": [], + "value": "" + }, { + "id": "2d33741e-04a8-4f17-a7f0-fd4a0cb17fc8", + "comment": "", + "command": "setWindowSize", + "target": "1260x1027", + "targets": [], + "value": "" + }, { + "id": "343f1636-850a-4a24-b99c-6702a890e572", + "comment": "", + "command": "click", + "target": "linkText=Multiple Windows", + "targets": [ + ["linkText=Multiple Windows", "linkText"], + ["css=li:nth-child(33) > a", "css:finder"], + ["xpath=//a[contains(text(),'Multiple Windows')]", "xpath:link"], + ["xpath=//div[@id='content']/ul/li[33]/a", "xpath:idRelative"], + ["xpath=//a[contains(@href, '/windows')]", "xpath:href"], + ["xpath=//li[33]/a", "xpath:position"], + ["xpath=//a[contains(.,'Multiple Windows')]", "xpath:innerText"] + ], + "value": "" + }, { + "id": "ffc4bbd5-e3cb-4a43-ad80-30c1d2ec5f25", + "comment": "", + "command": "click", + "target": "linkText=Click Here", + "targets": [ + ["linkText=Click Here", "linkText"], + ["css=a:nth-child(2)", "css:finder"], + ["xpath=//a[contains(text(),'Click Here')]", "xpath:link"], + ["xpath=//div[@id='content']/div/a", "xpath:idRelative"], + ["xpath=//a[contains(@href, '/windows/new')]", "xpath:href"], + ["xpath=//div/div/a", "xpath:position"], + ["xpath=//a[contains(.,'Click Here')]", "xpath:innerText"] + ], + "value": "", + "opensWindow": true, + "windowHandleName": "win9625", + "windowTimeout": 2000 + }, { + "id": "2a1a9e51-71d0-45db-9d77-479d160a67f0", + "comment": "", + "command": "storeWindowHandle", + "target": "root", + "targets": [], + "value": "" + }, { + "id": "0d33a445-a65b-4a69-82c6-c89bb1d53a5e", + "comment": "", + "command": "selectWindow", + "target": "handle=${win9625}", + "targets": [], + "value": "" + }, { + "id": "528b6f23-22a7-4a4c-993d-c772ceea96bc", + "comment": "", + "command": "assertTitle", + "target": "New Window", + "targets": [], + "value": "" + }, { + "id": "dd32287e-b69b-4674-8171-e50aef15d904", + "comment": "", + "command": "selectWindow", + "target": "handle=${root}", + "targets": [], + "value": "" + }, { + "id": "f02dff23-83d9-457f-8010-d5d15c32f0c4", + "comment": "", + "command": "assertTitle", + "target": "The Internet", + "targets": [], + "value": "" + }] + }], + "suites": [{ + "id": "988ac055-dcc7-48ba-ab8a-6fe3e3079a54", + "name": "Default Suite", + "persistSession": false, + "parallel": false, + "timeout": 300, + "tests": ["5d92f854-623b-41da-826b-2feb4ad20f2a"] + }], + "urls": ["http://the-internet.herokuapp.com/"], + "plugins": [] +} \ No newline at end of file diff --git a/packages/code-export-python-pytest/__test__/test-files/single-suite.side b/packages/code-export-python-pytest/__test__/test-files/single-suite.side new file mode 100644 index 0000000000..9bf89153dc --- /dev/null +++ b/packages/code-export-python-pytest/__test__/test-files/single-suite.side @@ -0,0 +1,159 @@ +{ + "id": "213b6ed8-55e3-4a15-bc10-0c1474aa7937", + "version": "2.0", + "name": "the-internet", + "url": "http://the-internet.herokuapp.com", + "tests": [{ + "id": "d0f4bf60-d07a-4f93-adde-d60f0e04941b", + "name": "valid credentials", + "commands": [{ + "id": "ba273d63-711b-4c6e-a726-403803b43e19", + "comment": "", + "command": "open", + "target": "/login", + "targets": [], + "value": "" + }, { + "id": "906eeacc-d60d-4f8c-afa8-0bb11e636dc2", + "comment": "", + "command": "setWindowSize", + "target": "1440x1177", + "targets": [], + "value": "" + }, { + "id": "02c52cbb-4341-4995-b2a9-ff4234c56661", + "comment": "", + "command": "type", + "target": "id=username", + "targets": [ + ["id=username", "id"], + ["name=username", "name"], + ["css=#username", "css:finder"], + ["xpath=//input[@id='username']", "xpath:attributes"], + ["xpath=//form[@id='login']/div/div/input", "xpath:idRelative"], + ["xpath=//input", "xpath:position"] + ], + "value": "tomsmith" + }, { + "id": "a0b7676a-64ce-443f-84f9-7d1b0b938f49", + "comment": "", + "command": "type", + "target": "id=password", + "targets": [ + ["id=password", "id"], + ["name=password", "name"], + ["css=#password", "css:finder"], + ["xpath=//input[@id='password']", "xpath:attributes"], + ["xpath=//form[@id='login']/div[2]/div/input", "xpath:idRelative"], + ["xpath=//div[2]/div/input", "xpath:position"] + ], + "value": "SuperSecretPassword!" + }, { + "id": "cc0d80e8-a017-4a52-beda-894897031f89", + "comment": "", + "command": "click", + "target": "css=#login button", + "targets": [ + ["css=.fa", "css:finder"], + ["xpath=//form[@id='login']/button/i", "xpath:idRelative"], + ["xpath=//i", "xpath:position"], + ["xpath=//i[contains(.,' Login')]", "xpath:innerText"] + ], + "value": "" + }, { + "id": "fe82de21-c699-4d98-b98f-691f71f0f398", + "comment": "", + "command": "assertText", + "target": "css=.flash.success", + "targets": [ + ["id=flash", "id"], + ["css=#flash", "css:finder"], + ["xpath=//div[@id='flash']", "xpath:attributes"], + ["xpath=//div[@id='flash-messages']/div", "xpath:idRelative"], + ["xpath=//div/div/div", "xpath:position"] + ], + "value": "You logged into a secure area!\\n×" + }] + }, { + "id": "92164fab-fb26-4359-a0e3-5a4d7a756e03", + "name": "invalid credentials", + "commands": [{ + "id": "0f195785-3337-4d11-8356-b2d15fcdffa7", + "comment": "", + "command": "open", + "target": "/login", + "targets": [], + "value": "" + }, { + "id": "ae33c069-785e-4e46-8667-4bae1914cb6a", + "comment": "", + "command": "setWindowSize", + "target": "1440x1177", + "targets": [], + "value": "" + }, { + "id": "ba49be2c-330c-449c-a488-a964f204c46f", + "comment": "", + "command": "type", + "target": "id=username", + "targets": [ + ["id=username", "id"], + ["name=username", "name"], + ["css=#username", "css:finder"], + ["xpath=//input[@id='username']", "xpath:attributes"], + ["xpath=//form[@id='login']/div/div/input", "xpath:idRelative"], + ["xpath=//input", "xpath:position"] + ], + "value": "blah" + }, { + "id": "80945f1b-f0fa-4305-9928-50cbe0ce1ceb", + "comment": "", + "command": "type", + "target": "id=password", + "targets": [ + ["id=password", "id"], + ["name=password", "name"], + ["css=#password", "css:finder"], + ["xpath=//input[@id='password']", "xpath:attributes"], + ["xpath=//form[@id='login']/div[2]/div/input", "xpath:idRelative"], + ["xpath=//div[2]/div/input", "xpath:position"] + ], + "value": "blah" + }, { + "id": "ec28319d-39a2-4e9f-b626-1b685ca925ea", + "comment": "", + "command": "click", + "target": "css=#login button", + "targets": [ + ["css=.fa", "css:finder"], + ["xpath=//form[@id='login']/button/i", "xpath:idRelative"], + ["xpath=//i", "xpath:position"], + ["xpath=//i[contains(.,' Login')]", "xpath:innerText"] + ], + "value": "" + }, { + "id": "0fc630bd-b187-41e7-8580-01e6500a8f48", + "comment": "", + "command": "assertText", + "target": "id=flash", + "targets": [ + ["id=flash", "id"], + ["css=#flash", "css:finder"], + ["xpath=//div[@id='flash']", "xpath:attributes"], + ["xpath=//div[@id='flash-messages']/div", "xpath:idRelative"], + ["xpath=//div/div/div", "xpath:position"] + ], + "value": "Your username is invalid!\\n×" + }] + }], + "suites": [{ + "id": "edca97e7-1507-4fcd-b61b-fc4cc290c005", + "name": "login", + "persistSession": false, + "parallel": false, + "timeout": 300, + "tests": ["d0f4bf60-d07a-4f93-adde-d60f0e04941b", "92164fab-fb26-4359-a0e3-5a4d7a756e03"] + }], + "urls": ["http://the-internet.herokuapp.com/"], + "plugins": [] +} \ No newline at end of file diff --git a/packages/code-export-python-pytest/__test__/test-files/single-test.side b/packages/code-export-python-pytest/__test__/test-files/single-test.side new file mode 100644 index 0000000000..5b16bd8192 --- /dev/null +++ b/packages/code-export-python-pytest/__test__/test-files/single-test.side @@ -0,0 +1,88 @@ +{ + "id": "213b6ed8-55e3-4a15-bc10-0c1474aa7937", + "version": "2.0", + "name": "the-internet", + "url": "http://the-internet.herokuapp.com", + "tests": [{ + "id": "d0f4bf60-d07a-4f93-adde-d60f0e04941b", + "name": "login", + "commands": [{ + "id": "ba273d63-711b-4c6e-a726-403803b43e19", + "comment": "", + "command": "open", + "target": "/login", + "targets": [], + "value": "" + }, { + "id": "906eeacc-d60d-4f8c-afa8-0bb11e636dc2", + "comment": "", + "command": "setWindowSize", + "target": "1440x1177", + "targets": [], + "value": "" + }, { + "id": "02c52cbb-4341-4995-b2a9-ff4234c56661", + "comment": "", + "command": "type", + "target": "id=username", + "targets": [ + ["id=username", "id"], + ["name=username", "name"], + ["css=#username", "css:finder"], + ["xpath=//input[@id='username']", "xpath:attributes"], + ["xpath=//form[@id='login']/div/div/input", "xpath:idRelative"], + ["xpath=//input", "xpath:position"] + ], + "value": "tomsmith" + }, { + "id": "a0b7676a-64ce-443f-84f9-7d1b0b938f49", + "comment": "", + "command": "type", + "target": "id=password", + "targets": [ + ["id=password", "id"], + ["name=password", "name"], + ["css=#password", "css:finder"], + ["xpath=//input[@id='password']", "xpath:attributes"], + ["xpath=//form[@id='login']/div[2]/div/input", "xpath:idRelative"], + ["xpath=//div[2]/div/input", "xpath:position"] + ], + "value": "SuperSecretPassword!" + }, { + "id": "cc0d80e8-a017-4a52-beda-894897031f89", + "comment": "", + "command": "click", + "target": "css=#login button", + "targets": [ + ["css=.fa", "css:finder"], + ["xpath=//form[@id='login']/button/i", "xpath:idRelative"], + ["xpath=//i", "xpath:position"], + ["xpath=//i[contains(.,' Login')]", "xpath:innerText"] + ], + "value": "" + }, { + "id": "fe82de21-c699-4d98-b98f-691f71f0f398", + "comment": "", + "command": "assertText", + "target": "css=.flash.success", + "targets": [ + ["id=flash", "id"], + ["css=#flash", "css:finder"], + ["xpath=//div[@id='flash']", "xpath:attributes"], + ["xpath=//div[@id='flash-messages']/div", "xpath:idRelative"], + ["xpath=//div/div/div", "xpath:position"] + ], + "value": "You logged into a secure area!\\n×" + }] + }], + "suites": [{ + "id": "edca97e7-1507-4fcd-b61b-fc4cc290c005", + "name": "Default Suite", + "persistSession": false, + "parallel": false, + "timeout": 300, + "tests": ["d0f4bf60-d07a-4f93-adde-d60f0e04941b"] + }], + "urls": ["http://the-internet.herokuapp.com/"], + "plugins": [] +} diff --git a/packages/code-export-python-pytest/__test__/test-files/test-case-reuse.side b/packages/code-export-python-pytest/__test__/test-files/test-case-reuse.side new file mode 100644 index 0000000000..6f13dc83df --- /dev/null +++ b/packages/code-export-python-pytest/__test__/test-files/test-case-reuse.side @@ -0,0 +1,133 @@ +{ + "id": "321c0306-0322-418e-8414-c982ded83b5f", + "version": "2.0", + "name": "test case reuse", + "url": "https://the-internet.herokuapp.com", + "tests": [{ + "id": "c8e84558-3efa-4481-a601-f6b7cff1c6d9", + "name": "login", + "commands": [{ + "id": "41c451be-96fe-4744-a084-ebedb5b04d01", + "comment": "", + "command": "open", + "target": "/", + "targets": [], + "value": "" + }, { + "id": "42d24143-2085-4bbe-9e16-b71a7d3e8d6c", + "comment": "", + "command": "click", + "target": "linkText=Form Authentication", + "targets": [ + ["linkText=Form Authentication", "linkText"], + ["css=li:nth-child(18) > a", "css:finder"], + ["xpath=//a[contains(text(),'Form Authentication')]", "xpath:link"], + ["xpath=//div[@id='content']/ul/li[18]/a", "xpath:idRelative"], + ["xpath=//a[contains(@href, '/login')]", "xpath:href"], + ["xpath=//li[18]/a", "xpath:position"], + ["xpath=//a[contains(.,'Form Authentication')]", "xpath:innerText"] + ], + "value": "" + }, { + "id": "918b4af6-2c88-43c7-b145-3b2bc3cba4a0", + "comment": "", + "command": "type", + "target": "id=username", + "targets": [ + ["id=username", "id"], + ["name=username", "name"], + ["css=#username", "css:finder"], + ["xpath=//input[@id='username']", "xpath:attributes"], + ["xpath=//form[@id='login']/div/div/input", "xpath:idRelative"], + ["xpath=//input", "xpath:position"] + ], + "value": "${username}" + }, { + "id": "f4f781d9-c051-4a41-a143-a8b3936cb034", + "comment": "", + "command": "type", + "target": "id=password", + "targets": [ + ["id=password", "id"], + ["name=password", "name"], + ["css=#password", "css:finder"], + ["xpath=//input[@id='password']", "xpath:attributes"], + ["xpath=//form[@id='login']/div[2]/div/input", "xpath:idRelative"], + ["xpath=//div[2]/div/input", "xpath:position"] + ], + "value": "${password}" + }, { + "id": "8081fd74-50b1-4f5c-95f1-c171519b8700", + "comment": "", + "command": "click", + "target": "css=.fa", + "targets": [ + ["css=.fa", "css:finder"], + ["xpath=//form[@id='login']/button/i", "xpath:idRelative"], + ["xpath=//i", "xpath:position"], + ["xpath=//i[contains(.,' Login')]", "xpath:innerText"] + ], + "value": "" + }] + }, { + "id": "0b10e1b2-df70-46c2-8c66-13bdf462f4b2", + "name": "valid credentials", + "commands": [{ + "id": "bd7228c9-f47a-4755-ad3d-5b92f50e8a5b", + "comment": "", + "command": "store", + "target": "tomsmith", + "targets": [], + "value": "username" + }, { + "id": "02eb7843-9547-434c-b882-81e0301a112e", + "comment": "", + "command": "store", + "target": "SuperSecretPassword!", + "targets": [], + "value": "password" + }, { + "id": "3ddd4ccd-ba9c-47df-a963-ba0ebdf84a3a", + "comment": "", + "command": "run", + "target": "login", + "targets": [], + "value": "" + }] + }, { + "id": "01472588-f710-45f6-a3db-3c931e23a37e", + "name": "invalid credentials", + "commands": [{ + "id": "169d75ba-2626-41e2-8516-a3114d7d8d13", + "comment": "", + "command": "store", + "target": "blah", + "targets": [], + "value": "username" + }, { + "id": "6959737f-8a00-4a07-b238-c990eaf53b27", + "comment": "", + "command": "store", + "target": "blah", + "targets": [], + "value": "password" + }, { + "id": "3e5ed8a5-088a-4b7a-a52d-b47afa233b89", + "comment": "", + "command": "run", + "target": "login", + "targets": [], + "value": "" + }] + }], + "suites": [{ + "id": "ee5f025f-40bf-4295-9a57-c916a4b47c70", + "name": "login", + "persistSession": false, + "parallel": false, + "timeout": 300, + "tests": ["01472588-f710-45f6-a3db-3c931e23a37e", "0b10e1b2-df70-46c2-8c66-13bdf462f4b2"] + }], + "urls": ["https://the-internet.herokuapp.com/"], + "plugins": [] +} \ No newline at end of file diff --git a/packages/code-export-python-pytest/package.json b/packages/code-export-python-pytest/package.json new file mode 100644 index 0000000000..167a792142 --- /dev/null +++ b/packages/code-export-python-pytest/package.json @@ -0,0 +1,26 @@ +{ + "name": "code-export-python-pytest", + "version": "3.8.1", + "description": "Export Selenium IDE project contents to Python pytest", + "repository": "https://github.com/SeleniumHQ/selenium-ide", + "keywords": [ + "selenium", + "ide", + "export" + ], + "license": "Apache-2.0", + "private": true, + "scripts": { + "build": "babel -d dist src --ignore=__test__", + "watch": "yarn build -w" + }, + "main": "dist/index.js", + "devDependencies": { + "babel-cli": "^6.26.0", + "babel-plugin-transform-object-rest-spread": "^6.26.0", + "babel-preset-env": "^1.6.1" + }, + "dependencies": { + "code-export-utils": "^3.8.1" + } +} diff --git a/packages/code-export-python-pytest/src/command.js b/packages/code-export-python-pytest/src/command.js new file mode 100644 index 0000000000..f98e202c0a --- /dev/null +++ b/packages/code-export-python-pytest/src/command.js @@ -0,0 +1,1052 @@ +// Licensed to the Software Freedom Conservancy (SFC) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The SFC licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import exporter from 'code-export-utils' +import location from './location' +import selection from './selection' + +export const emitters = { + addSelection: emitSelect, + answerOnNextPrompt: skip, + assert: emitAssert, + assertAlert: emitAssertAlert, + assertChecked: emitVerifyChecked, + assertConfirmation: emitAssertAlert, + assertEditable: emitVerifyEditable, + assertElementPresent: emitVerifyElementPresent, + assertElementNotPresent: emitVerifyElementNotPresent, + assertNotChecked: emitVerifyNotChecked, + assertNotEditable: emitVerifyNotEditable, + assertNotSelectedValue: emitVerifyNotSelectedValue, + assertNotText: emitVerifyNotText, + assertPrompt: emitAssertAlert, + assertSelectedLabel: emitVerifySelectedLabel, + assertSelectedValue: emitVerifySelectedValue, + assertValue: emitVerifyValue, + assertText: emitVerifyText, + assertTitle: emitVerifyTitle, + check: emitCheck, + chooseCancelOnNextConfirmation: skip, + chooseCancelOnNextPrompt: skip, + chooseOkOnNextConfirmation: skip, + click: emitClick, + clickAt: emitClick, + close: emitClose, + debugger: skip, + do: emitControlFlowDo, + doubleClick: emitDoubleClick, + doubleClickAt: emitDoubleClick, + dragAndDropToObject: emitDragAndDrop, + echo: emitEcho, + editContent: emitEditContent, + else: emitControlFlowElse, + elseIf: emitControlFlowElseIf, + end: emitControlFlowEnd, + executeScript: emitExecuteScript, + executeAsyncScript: emitExecuteAsyncScript, + forEach: emitControlFlowForEach, + if: emitControlFlowIf, + mouseDown: emitMouseDown, + mouseDownAt: emitMouseDown, + mouseMove: emitMouseMove, + mouseMoveAt: emitMouseMove, + mouseOver: emitMouseMove, + mouseOut: emitMouseOut, + mouseUp: emitMouseUp, + mouseUpAt: emitMouseUp, + open: emitOpen, + pause: emitPause, + removeSelection: emitSelect, + repeatIf: emitControlFlowRepeatIf, + run: emitRun, + runScript: emitRunScript, + select: emitSelect, + selectFrame: emitSelectFrame, + selectWindow: emitSelectWindow, + sendKeys: emitSendKeys, + setSpeed: emitSetSpeed, + setWindowSize: emitSetWindowSize, + store: emitStore, + storeAttribute: emitStoreAttribute, + //storeJson: emitStoreJson, + storeText: emitStoreText, + storeTitle: emitStoreTitle, + storeValue: emitStoreValue, + storeWindowHandle: emitStoreWindowHandle, + storeXpathCount: emitStoreXpathCount, + submit: emitSubmit, + times: emitControlFlowTimes, + type: emitType, + uncheck: emitUncheck, + verify: emitAssert, + verifyChecked: emitVerifyChecked, + verifyEditable: emitVerifyEditable, + verifyElementPresent: emitVerifyElementPresent, + verifyElementNotPresent: emitVerifyElementNotPresent, + verifyNotChecked: emitVerifyNotChecked, + verifyNotEditable: emitVerifyNotEditable, + verifyNotSelectedValue: emitVerifyNotSelectedValue, + verifyNotText: emitVerifyNotText, + verifySelectedLabel: emitVerifySelectedLabel, + verifySelectedValue: emitVerifySelectedValue, + verifyText: emitVerifyText, + verifyTitle: emitVerifyTitle, + verifyValue: emitVerifyValue, + waitForElementEditable: emitWaitForElementEditable, + waitForElementPresent: emitWaitForElementPresent, + waitForElementVisible: emitWaitForElementVisible, + waitForElementNotEditable: emitWaitForElementNotEditable, + waitForElementNotPresent: emitWaitForElementNotPresent, + waitForElementNotVisible: emitWaitForElementNotVisible, + webdriverAnswerOnVisiblePrompt: emitAnswerOnNextPrompt, + webdriverChooseCancelOnVisibleConfirmation: emitChooseCancelOnNextConfirmation, + webdriverChooseCancelOnVisiblePrompt: emitChooseCancelOnNextConfirmation, + webdriverChooseOkOnVisibleConfirmation: emitChooseOkOnNextConfirmation, + while: emitControlFlowWhile, +} + +exporter.register.preprocessors(emitters) + +function register(command, emitter) { + exporter.register.emitter({ command, emitter, emitters }) +} + +function emit(command) { + return exporter.emit.command(command, emitters[command.command], { + variableLookup, + emitNewWindowHandling, + }) +} + +function canEmit(commandName) { + return !!emitters[commandName] +} + +function variableLookup(varName) { + return `vars.get("${varName}").toString()` +} + +function variableSetter(varName, value) { + return varName ? `vars.put("${varName}", ${value});` : '' +} + +function emitWaitForWindow() { + const generateMethodDeclaration = name => { + return `public String ${name}(int timeout) {` + } + const commands = [ + { level: 0, statement: 'try {' }, + { level: 1, statement: 'Thread.sleep(timeout);' }, + { level: 0, statement: '} catch (InterruptedException e) {' }, + { level: 1, statement: 'e.printStackTrace();' }, + { level: 0, statement: '}' }, + { level: 0, statement: 'Set whNow = driver.getWindowHandles();' }, + { + level: 0, + statement: + 'Set whThen = (Set) vars.get("window_handles");', + }, + { level: 0, statement: 'if (whNow.size() > whThen.size()) {' }, + { level: 1, statement: 'whNow.removeAll(whThen);' }, + { level: 0, statement: '}' }, + { level: 0, statement: 'return whNow.iterator().next();' }, + ] + return Promise.resolve({ + name: 'waitForWindow', + commands, + generateMethodDeclaration, + }) +} + +async function emitNewWindowHandling(command, emittedCommand) { + return Promise.resolve( + `vars.put("window_handles", driver.getWindowHandles());\n${await emittedCommand}\nvars.put("${ + command.windowHandleName + }", waitForWindow(${command.windowTimeout}));` + ) +} + +function emitAssert(varName, value) { + return Promise.resolve( + `assertEquals(vars.get("${varName}").toString(), "${value}");` + ) +} + +function emitAssertAlert(alertText) { + return Promise.resolve( + `assertThat(driver.switchTo().alert().getText(), is("${alertText}"));` + ) +} + +function emitAnswerOnNextPrompt(textToSend) { + const commands = [ + { level: 0, statement: '{' }, + { level: 1, statement: 'Alert alert = driver.switchTo().alert();' }, + { level: 1, statement: `alert.sendKeys("${textToSend}")` }, + { level: 1, statement: 'alert.accept();' }, + { level: 0, statement: '}' }, + ] + return Promise.resolve({ commands }) +} + +async function emitCheck(locator) { + const commands = [ + { level: 0, statement: '{' }, + { + level: 1, + statement: `WebElement element = driver.findElement(${await location.emit( + locator + )});`, + }, + { level: 1, statement: 'if (!element.isSelected()) {' }, + { level: 2, statement: 'element.click();' }, + { level: 1, statement: '}' }, + { level: 0, statement: '}' }, + ] + return Promise.resolve({ commands }) +} + +function emitChooseCancelOnNextConfirmation() { + return Promise.resolve(`driver.switchTo().alert().dismiss();`) +} + +function emitChooseOkOnNextConfirmation() { + return Promise.resolve(`driver.switchTo().alert().accept();`) +} + +async function emitClick(target) { + return Promise.resolve( + `driver.findElement(${await location.emit(target)}).click();` + ) +} + +async function emitClose() { + return Promise.resolve(`driver.close();`) +} + +function generateExpressionScript(script) { + const scriptString = script.script.replace(/"/g, "'") + return `(Boolean) js.executeScript("return (${scriptString})"${generateScriptArguments( + script + )})` +} + +function emitControlFlowDo() { + return Promise.resolve({ + commands: [{ level: 0, statement: 'do {' }], + endingLevelAdjustment: 1, + }) +} + +function emitControlFlowElse() { + return Promise.resolve({ + commands: [{ level: 0, statement: '} else {' }], + startingLevelAdjustment: -1, + endingLevelAdjustment: +1, + }) +} + +function emitControlFlowElseIf(script) { + return Promise.resolve({ + commands: [ + { + level: 0, + statement: `} else if (${generateExpressionScript(script)}) {`, + }, + ], + startingLevelAdjustment: -1, + endingLevelAdjustment: +1, + }) +} + +function emitControlFlowEnd() { + return Promise.resolve({ + commands: [{ level: 0, statement: `}` }], + startingLevelAdjustment: -1, + }) +} + +function emitControlFlowIf(script) { + return Promise.resolve({ + commands: [ + { level: 0, statement: `if (${generateExpressionScript(script)}) {` }, + ], + endingLevelAdjustment: 1, + }) +} + +function emitControlFlowForEach(collectionVarName, iteratorVarName) { + return Promise.resolve({ + commands: [ + { + level: 0, + statement: `ArrayList collection = (ArrayList) vars.get("${collectionVarName}");`, + }, + { + level: 0, + statement: `for (int i = 0; i < collection.size() - 1; i++) {`, + }, + { + level: 1, + statement: `vars.put("${iteratorVarName}", collection.get(i));`, + }, + ], + }) +} + +function emitControlFlowRepeatIf(script) { + return Promise.resolve({ + commands: [ + { level: 0, statement: `} while (${generateExpressionScript(script)});` }, + ], + startingLevelAdjustment: -1, + }) +} + +function emitControlFlowTimes(target) { + const commands = [ + { level: 0, statement: `Integer times = ${target};` }, + { level: 0, statement: 'for(int i = 0; i < times; i++) {' }, + ] + return Promise.resolve({ commands, endingLevelAdjustment: 1 }) +} + +function emitControlFlowWhile(script) { + return Promise.resolve({ + commands: [ + { level: 0, statement: `while (${generateExpressionScript(script)}) {` }, + ], + endingLevelAdjustment: 1, + }) +} + +async function emitDoubleClick(target) { + const commands = [ + { level: 0, statement: '{' }, + { + level: 1, + statement: `WebElement element = driver.findElement(${await location.emit( + target + )});`, + }, + { level: 1, statement: 'Actions builder = new Actions(driver);' }, + { level: 1, statement: 'builder.doubleClick(element).perform();' }, + { level: 0, statement: '}' }, + ] + return Promise.resolve({ commands }) +} + +async function emitDragAndDrop(dragged, dropped) { + const commands = [ + { level: 0, statement: '{' }, + { + level: 1, + statement: `WebElement dragged = driver.findElement(${await location.emit( + dragged + )});`, + }, + { + level: 1, + statement: `WebElement dropped = driver.findElement(${await location.emit( + dropped + )});`, + }, + { level: 1, statement: 'Actions builder = new Actions(driver);' }, + { level: 1, statement: 'builder.dragAndDrop(dragged, dropped).perform();' }, + { level: 0, statement: '}' }, + ] + return Promise.resolve({ commands }) +} + +async function emitEcho(message) { + const _message = message.startsWith('vars.get') ? message : `"${message}"` + return Promise.resolve(`System.out.println(${_message});`) +} + +async function emitEditContent(locator, content) { + const commands = [ + { level: 0, statement: '{' }, + { + level: 1, + statement: `WebElement element = driver.findElement(${await location.emit( + locator + )});`, + }, + { + level: 1, + statement: `js.executeScript("if(arguments[0].contentEditable === 'true') {arguments[0].innerText = '${content}'}", element);`, + }, + { level: 0, statement: '}' }, + ] + return Promise.resolve({ commands }) +} + +async function emitExecuteScript(script, varName) { + const scriptString = script.script.replace(/"/g, "'") + const result = `js.executeScript("${scriptString}"${generateScriptArguments( + script + )})` + return Promise.resolve(variableSetter(varName, result)) +} + +async function emitExecuteAsyncScript(script, varName) { + const result = `js.executeAsyncScript("var callback = arguments[arguments.length - 1];${ + script.script + }.then(callback).catch(callback);${generateScriptArguments(script)}")` + return Promise.resolve(variableSetter(varName, result)) +} + +function generateScriptArguments(script) { + return `${script.argv.length ? ', ' : ''}${script.argv + .map(varName => `vars.get("${varName}")`) + .join(',')}` +} + +async function emitMouseDown(locator) { + const commands = [ + { level: 0, statement: '{' }, + { + level: 1, + statement: `WebElement element = driver.findElement(${await location.emit( + locator + )});`, + }, + { level: 1, statement: 'Action builder = new Actions(driver);' }, + { + level: 1, + statement: 'builder.moveToElement(element).clickAndHold().perform();', + }, + { level: 0, statement: '}' }, + ] + return Promise.resolve({ commands }) +} + +async function emitMouseMove(locator) { + const commands = [ + { level: 0, statement: '{' }, + { + level: 1, + statement: `WebElement element = driver.findElement(${await location.emit( + locator + )});`, + }, + { level: 1, statement: 'Action builder = new Actions(driver);' }, + { level: 1, statement: 'builder.moveToElement(element).perform();' }, + { level: 0, statement: '}' }, + ] + return Promise.resolve({ commands }) +} + +async function emitMouseOut() { + const commands = [ + { level: 0, statement: '{' }, + { + level: 1, + statement: `WebElement element = driver.findElement(By.tagName("body"));`, + }, + { level: 1, statement: 'Action builder = new Actions(driver);' }, + { level: 1, statement: 'builder.moveToElement(element, 0, 0).perform();' }, + { level: 0, statement: '}' }, + ] + return Promise.resolve({ commands }) +} + +async function emitMouseUp(locator) { + const commands = [ + { level: 0, statement: '{' }, + { + level: 1, + statement: `WebElement element = driver.findElement(${await location.emit( + locator + )});`, + }, + { level: 1, statement: 'Action builder = new Actions(driver);' }, + { + level: 1, + statement: 'builder.moveToElement(element).release().perform();', + }, + { level: 0, statement: '}' }, + ] + return Promise.resolve({ commands }) +} + +function emitOpen(target) { + const url = /^(file|http|https):\/\//.test(target) + ? `"${target}"` + : `"${global.baseUrl}${target}"` + return Promise.resolve(`driver.get(${url});`) +} + +async function emitPause(time) { + const commands = [ + { level: 0, statement: 'try {' }, + { level: 1, statement: `Thread.sleep(${time});` }, + { level: 0, statement: '} catch (InterruptedException e) {' }, + { level: 1, statement: 'e.printStackTrace();' }, + { level: 0, statement: '}' }, + ] + return Promise.resolve({ commands }) +} + +async function emitRun(testName) { + return Promise.resolve(`${exporter.parsers.sanitizeName(testName)}();`) +} + +async function emitRunScript(script) { + return Promise.resolve( + `js.executeScript("${script.script}${generateScriptArguments(script)}");` + ) +} + +async function emitSetWindowSize(size) { + const [width, height] = size.split('x') + return Promise.resolve( + `driver.manage().window().setSize(new Dimension(${width}, ${height}));` + ) +} + +async function emitSelect(selectElement, option) { + const commands = [ + { level: 0, statement: '{' }, + { + level: 1, + statement: `WebElement dropdown = driver.findElement(${await location.emit( + selectElement + )});`, + }, + { + level: 1, + statement: `dropdown.findElement(${await selection.emit( + option + )}).click();`, + }, + { level: 0, statement: '}' }, + ] + return Promise.resolve({ commands }) +} + +async function emitSelectFrame(frameLocation) { + if (frameLocation === 'relative=top' || frameLocation === 'relative=parent') { + return Promise.resolve('driver.switchTo().defaultContent();') + } else if (/^index=/.test(frameLocation)) { + return Promise.resolve( + `driver.switchTo().frame(${Math.floor( + frameLocation.split('index=')[1] + )});` + ) + } else { + return Promise.resolve({ + commands: [ + { level: 0, statement: '{' }, + { + level: 1, + statement: `WebElement element = driver.findElement(${await location.emit( + frameLocation + )});`, + }, + { level: 1, statement: 'driver.switchTo().frame(element);' }, + { level: 0, statement: '}' }, + ], + }) + } +} + +async function emitSelectWindow(windowLocation) { + if (/^handle=/.test(windowLocation)) { + return Promise.resolve( + `driver.switchTo().window(${windowLocation.split('handle=')[1]});` + ) + } else if (/^name=/.test(windowLocation)) { + return Promise.resolve( + `driver.switchTo().window("${windowLocation.split('name=')[1]}");` + ) + } else if (/^win_ser_/.test(windowLocation)) { + if (windowLocation === 'win_ser_local') { + return Promise.resolve({ + commands: [ + { level: 0, statement: '{' }, + { + level: 1, + statement: + 'ArrayList handles = new ArrayList(driver.getWindowHandles());', + }, + { level: 1, statement: 'driver.switchTo().window(handles.get(0));' }, + { level: 0, statement: '}' }, + ], + }) + } else { + const index = parseInt(windowLocation.substr('win_ser_'.length)) + return Promise.resolve({ + commands: [ + { level: 0, statement: '{' }, + { + level: 1, + statement: + 'ArrayList handles = new ArrayList(driver.getWindowHandles());', + }, + { + level: 1, + statement: `driver.switchTo().window(handles.get(${index}));`, + }, + { level: 0, statement: '}' }, + ], + }) + } + } else { + return Promise.reject( + new Error('Can only emit `select window` using handles') + ) + } +} + +function generateSendKeysInput(value) { + if (typeof value === 'object') { + return value + .map(s => { + if (s.startsWith('vars.get')) { + return s + } else if (s.startsWith('Key[')) { + const key = s.match(/\['(.*)'\]/)[1] + return `Keys.${key}` + } else { + return `"${s}"` + } + }) + .join(', ') + } else { + if (value.startsWith('vars.get')) { + return value + } else { + return `"${value}"` + } + } +} + +async function emitSendKeys(target, value) { + return Promise.resolve( + `driver.findElement(${await location.emit( + target + )}).sendKeys(${generateSendKeysInput(value)});` + ) +} + +function emitSetSpeed() { + return Promise.resolve( + `System.out.println("\`set speed\` is a no-op in code export, use \`pause\` instead");` + ) +} + +async function emitStore(value, varName) { + return Promise.resolve(variableSetter(varName, `"${value}"`)) +} + +async function emitStoreAttribute(locator, varName) { + const attributePos = locator.lastIndexOf('@') + const elementLocator = locator.slice(0, attributePos) + const attributeName = locator.slice(attributePos + 1) + const commands = [ + { level: 0, statement: '{' }, + { + level: 1, + statement: `WebElement element = driver.findElement(${await location.emit( + elementLocator + )});`, + }, + { + level: 1, + statement: `String attribute = element.getAttribute("${attributeName}");`, + }, + { level: 1, statement: `${variableSetter(varName, 'attribute')}` }, + { level: 0, statement: '}' }, + ] + return Promise.resolve({ commands }) +} + +async function emitStoreJson(_json, _varName) { + // TODO + return Promise.resolve('') +} + +async function emitStoreText(locator, varName) { + const result = `driver.findElement(${await location.emit(locator)}).getText()` + return Promise.resolve(variableSetter(varName, result)) +} + +async function emitStoreTitle(_, varName) { + return Promise.resolve(variableSetter(varName, 'driver.getTitle()')) +} + +async function emitStoreValue(locator, varName) { + const result = `driver.findElement(${await location.emit( + locator + )}).getAttribute("value")` + return Promise.resolve(variableSetter(varName, result)) +} + +async function emitStoreWindowHandle(varName) { + return Promise.resolve(variableSetter(varName, 'driver.getWindowHandle()')) +} + +async function emitStoreXpathCount(locator, varName) { + const result = `driver.findElements(${await location.emit(locator)}).size()` + return Promise.resolve(variableSetter(varName, result)) +} + +async function emitSubmit(_locator) { + return Promise.resolve( + `throw new Error("\`submit\` is not a supported command in Selenium WebDriver. Please re-record the step in the IDE.");` + ) +} + +async function emitType(target, value) { + return Promise.resolve( + `driver.findElement(${await location.emit( + target + )}).sendKeys(${generateSendKeysInput(value)});` + ) +} + +async function emitUncheck(locator) { + const commands = [ + { level: 0, statement: '{' }, + { + level: 1, + statement: `WebElement element = driver.findElement(${await location.emit( + locator + )});`, + }, + { level: 1, statement: 'if (element.isSelected()) {' }, + { level: 2, statement: 'element.click();' }, + { level: 1, statement: '}' }, + { level: 0, statement: '}' }, + ] + return Promise.resolve({ commands }) +} + +async function emitVerifyChecked(locator) { + return Promise.resolve( + `assertTrue(driver.findElement(${await location.emit( + locator + )}).isSelected());` + ) +} + +async function emitVerifyEditable(locator) { + const commands = [ + { level: 0, statement: '{' }, + { + level: 1, + statement: `WebElement element = driver.findElement(${await location.emit( + locator + )});`, + }, + { + level: 1, + statement: + 'Boolean isEditable = element.isEnabled() && element.getAttribute("readonly") == null;', + }, + { level: 1, statement: 'assertTrue(isEditable);' }, + { level: 0, statement: '}' }, + ] + return Promise.resolve({ commands }) +} + +async function emitVerifyElementPresent(locator) { + const commands = [ + { level: 0, statement: '{' }, + { + level: 1, + statement: `List elements = driver.findElements(${await location.emit( + locator + )});`, + }, + { level: 1, statement: 'assert(elements.size() > 0);' }, + { level: 0, statement: '}' }, + ] + return Promise.resolve({ commands }) +} + +async function emitVerifyElementNotPresent(locator) { + const commands = [ + { level: 0, statement: '{' }, + { + level: 1, + statement: `List elements = driver.findElements(${await location.emit( + locator + )});`, + }, + { level: 1, statement: 'assert(elements.size() == 0);' }, + { level: 0, statement: '}' }, + ] + return Promise.resolve({ commands }) +} + +async function emitVerifyNotChecked(locator) { + return Promise.resolve( + `assertFalse(driver.findElement(${await location.emit( + locator + )}).isSelected());` + ) +} + +async function emitVerifyNotEditable(locator) { + const commands = [ + { level: 0, statement: '{' }, + { + level: 1, + statement: `WebElement element = driver.findElement(${await location.emit( + locator + )});`, + }, + { + level: 1, + statement: + 'Boolean isEditable = element.isEnabled() && element.getAttribute("readonly") == null;', + }, + { level: 1, statement: 'assertFalse(isEditable);' }, + { level: 0, statement: '}' }, + ] + return Promise.resolve({ commands }) +} + +async function emitVerifyNotSelectedValue(locator, expectedValue) { + const commands = [ + { level: 0, statement: '{' }, + { + level: 1, + statement: `String value = driver.findElement(${await location.emit( + locator + )}).getAttribute("value");`, + }, + { + level: 1, + statement: `assertThat(value, is(not("${exporter.emit.text( + expectedValue + )}")));`, + }, + { level: 0, statement: '}' }, + ] + return Promise.resolve({ commands }) +} + +async function emitVerifyNotText(locator, text) { + const result = `driver.findElement(${await location.emit(locator)}).getText()` + return Promise.resolve( + `assertThat(${result}, is(not("${exporter.emit.text(text)}")));` + ) +} + +async function emitVerifySelectedLabel(locator, labelValue) { + const commands = [ + { level: 0, statement: '{' }, + { + level: 1, + statement: `WebElement element = driver.findElement(${await location.emit( + locator + )});`, + }, + { level: 1, statement: 'String value = element.getAttribute("value");' }, + { + level: 1, + statement: `String locator = String.format("option[@value='%s']", value);`, + }, + { + level: 1, + statement: + 'String selectedText = element.findElement(By.xpath(locator)).getText();', + }, + { level: 1, statement: `assertThat(selectedText, is("${labelValue}"));` }, + { level: 0, statement: '}' }, + ] + return Promise.resolve({ + commands, + }) +} + +async function emitVerifySelectedValue(locator, value) { + return emitVerifyValue(locator, value) +} + +async function emitVerifyText(locator, text) { + return Promise.resolve( + `assertThat(driver.findElement(${await location.emit( + locator + )}).getText(), is("${exporter.emit.text(text)}"));` + ) +} + +async function emitVerifyValue(locator, value) { + const commands = [ + { level: 0, statement: '{' }, + { + level: 1, + statement: `String value = driver.findElement(${await location.emit( + locator + )}).getAttribute("value");`, + }, + { level: 1, statement: `assertThat(value, is("${value}"));` }, + { level: 0, statement: '}' }, + ] + return Promise.resolve({ commands }) +} + +async function emitVerifyTitle(title) { + return Promise.resolve(`assertThat(driver.getTitle(), is("${title}"));`) +} + +async function emitWaitForElementEditable(locator, timeout) { + const commands = [ + { level: 0, statement: '{' }, + { + level: 1, + statement: `WebDriverWait wait = new WebDriverWait(driver, ${Math.floor( + timeout / 1000 + )});`, + }, + { + level: 1, + statement: `wait.until(ExpectedConditions.elementToBeClickable(${await location.emit( + locator + )}));`, + }, + { level: 0, statement: '}' }, + ] + return Promise.resolve({ commands }) +} + +function skip() { + return Promise.resolve('') +} + +async function emitWaitForElementPresent(locator, timeout) { + const commands = [ + { level: 0, statement: '{' }, + { + level: 1, + statement: `WebDriverWait wait = new WebDriverWait(driver, ${Math.floor( + timeout / 1000 + )});`, + }, + { + level: 1, + statement: `wait.until(ExpectedConditions.presenceOfElementLocated(${await location.emit( + locator + )}));`, + }, + { level: 0, statement: '}' }, + ] + return Promise.resolve({ commands }) +} + +async function emitWaitForElementVisible(locator, timeout) { + const commands = [ + { level: 0, statement: '{' }, + { + level: 1, + statement: `WebDriverWait wait = new WebDriverWait(driver, ${Math.floor( + timeout / 1000 + )});`, + }, + { + level: 1, + statement: `wait.until(ExpectedConditions.visibilityOfElementLocated(${await location.emit( + locator + )}));`, + }, + { level: 0, statement: '}' }, + ] + return Promise.resolve({ + commands, + }) +} + +async function emitWaitForElementNotEditable(locator, timeout) { + const commands = [ + { level: 0, statement: '{' }, + { + level: 1, + statement: `WebDriverWait wait = new WebDriverWait(driver, ${Math.floor( + timeout / 1000 + )});`, + }, + { + level: 1, + statement: `wait.until(ExpectedConditions.not(ExpectedConditions.elementToBeClickable(${await location.emit( + locator + )})));`, + }, + { level: 0, statement: '}' }, + ] + return Promise.resolve({ + commands, + }) +} + +async function emitWaitForElementNotPresent(locator, timeout) { + const commands = [ + { level: 0, statement: '{' }, + { + level: 1, + statement: `WebDriverWait wait = new WebDriverWait(driver, ${Math.floor( + timeout / 1000 + )});`, + }, + { + level: 1, + statement: `WebElement element = driver.findElement(${await location.emit( + locator + )});`, + }, + { + level: 1, + statement: 'wait.until(ExpectedConditions.stalenessOf(element));', + }, + { level: 0, statement: '}' }, + ] + return Promise.resolve({ + commands, + }) +} + +async function emitWaitForElementNotVisible(locator, timeout) { + const commands = [ + { level: 0, statement: '{' }, + { + level: 1, + statement: `WebDriverWait wait = new WebDriverWait(driver, ${Math.floor( + timeout / 1000 + )});`, + }, + { + level: 1, + statement: `wait.until(ExpectedConditions.invisibilityOfElementLocated(${await location.emit( + locator + )}));`, + }, + { level: 0, statement: '}' }, + ] + return Promise.resolve({ + commands, + }) +} + +export default { + canEmit, + emit, + register, + extras: { emitWaitForWindow }, +} diff --git a/packages/code-export-python-pytest/src/hook.js b/packages/code-export-python-pytest/src/hook.js new file mode 100644 index 0000000000..7a6a4f9a76 --- /dev/null +++ b/packages/code-export-python-pytest/src/hook.js @@ -0,0 +1,115 @@ +// Licensed to the Software Freedom Conservancy (SFC) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The SFC licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import exporter from 'code-export-utils' + +const emitters = { + afterAll, + afterEach, + beforeAll, + beforeEach, + declareDependencies, + declareMethods: empty, + declareVariables: empty, + inEachBegin: empty, + inEachEnd: empty, +} + +function generate(hookName) { + return new exporter.hook(emitters[hookName]()) +} + +export function generateHooks() { + let result = {} + Object.keys(emitters).forEach(hookName => { + result[hookName] = generate(hookName) + }) + return result +} + +function afterAll() { + const params = { + startingSyntax: { + commands: [{ level: 0, statement: 'def teardown_class(cls):' }], + }, + endingSyntax: { + commands: [{ level: 0, statement: '' }], + }, + registrationLevel: 1, + } + return params +} + +function afterEach() { + const params = { + startingSyntax: { + commands: [ + { level: 0, statement: 'def teardown_method(self, method):' }, + { level: 1, statement: 'self.driver.quit();' }, + ], + }, + endingSyntax: { + commands: [{ level: 0, statement: '' }], + }, + } + return params +} + +function beforeAll() { + const params = { + startingSyntax: { + commands: [{ level: 0, statement: 'def setup_class(cls):' }], + }, + endingSyntax: { + commands: [{ level: 0, statement: '' }], + }, + registrationLevel: 1, + } + return params +} + +function beforeEach() { + const params = { + startingSyntax: { + commands: [ + { level: 0, statement: 'def setup_method(self, method):' }, + { level: 1, statement: 'self.driver = webdriver.Firefox()' }, + { level: 1, statement: 'self.vars = {}' }, + ], + }, + endingSyntax: { + commands: [{ level: 0, statement: '' }], + }, + } + return params +} + +function declareDependencies() { + const params = { + startingSyntax: { + commands: [ + { level: 0, statement: 'import pytest' }, + { level: 0, statement: 'from selenium import webdriver' }, + ], + }, + } + return params +} + +function empty() { + return {} +} diff --git a/packages/code-export-python-pytest/src/index.js b/packages/code-export-python-pytest/src/index.js new file mode 100644 index 0000000000..318cecfcce --- /dev/null +++ b/packages/code-export-python-pytest/src/index.js @@ -0,0 +1,131 @@ +// Licensed to the Software Freedom Conservancy (SFC) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The SFC licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import exporter from 'code-export-utils' +import emitter from './command' +import location from './location' +import { generateHooks } from './hook' + +// Define language options +export const displayName = 'Python pytest' + +export let opts = {} +opts.emitter = emitter +opts.hooks = generateHooks() +opts.fileExtension = '.py' +opts.commandPrefixPadding = ' ' +opts.terminatingKeyword = '' +opts.commentPrefix = '#' +opts.generateMethodDeclaration = generateMethodDeclaration + +// Create generators for dynamic string creation of primary entities (e.g., filename, methods, test, and suite) +function generateTestDeclaration(name) { + return `def test_${exporter.parsers.uncapitalize( + exporter.parsers.sanitizeName(name) + )}(self):` +} +function generateMethodDeclaration(name) { + return `def ${exporter.parsers.uncapitalize( + exporter.parsers.sanitizeName(name) + )}(self):` +} +function generateSuiteDeclaration(name) { + return `class Test${exporter.parsers.capitalize( + exporter.parsers.sanitizeName(name) + )}() {` +} +function generateFilename(name) { + return `test_${exporter.parsers.uncapitalize( + exporter.parsers.sanitizeName(name) + )}${opts.fileExtension}` +} + +// Emit an individual test, wrapped in a suite (using the test name as the suite name) +export async function emitTest({ + baseUrl, + test, + tests, + project, + enableOriginTracing, +}) { + global.baseUrl = baseUrl + const testDeclaration = generateTestDeclaration(test.name) + const result = await exporter.emit.test(test, tests, { + ...opts, + testDeclaration, + enableOriginTracing, + project, + }) + const suiteName = test.name + const suiteDeclaration = generateSuiteDeclaration(suiteName) + const _suite = await exporter.emit.suite(result, tests, { + ...opts, + suiteDeclaration, + suiteName, + project, + }) + return { + filename: generateFilename(test.name), + body: exporter.emit.orderedSuite(_suite), + } +} + +// Emit a suite with all of its tests +export async function emitSuite({ + baseUrl, + suite, + tests, + project, + enableOriginTracing, +}) { + global.baseUrl = baseUrl + const result = await exporter.emit.testsFromSuite(tests, suite, opts, { + enableOriginTracing, + generateTestDeclaration, + project, + }) + const suiteDeclaration = generateSuiteDeclaration(suite.name) + const _suite = await exporter.emit.suite(result, tests, { + ...opts, + suiteDeclaration, + suite, + project, + }) + return { + filename: generateFilename(suite.name), + body: exporter.emit.orderedSuite(_suite), + } +} + +export default { + emit: { + test: emitTest, + suite: emitSuite, + locator: location.emit, + }, + register: { + command: emitter.register, + variable: opts.hooks.declareVariables.register, + dependency: opts.hooks.declareDependencies.register, + beforeAll: opts.hooks.beforeAll.register, + beforeEach: opts.hooks.beforeEach.register, + afterEach: opts.hooks.afterEach.register, + afterAll: opts.hooks.afterAll.register, + inEachBegin: opts.hooks.inEachBegin.register, + inEachEnd: opts.hooks.inEachEnd.register, + }, +} diff --git a/packages/code-export-python-pytest/src/location.js b/packages/code-export-python-pytest/src/location.js new file mode 100644 index 0000000000..01b8269ad9 --- /dev/null +++ b/packages/code-export-python-pytest/src/location.js @@ -0,0 +1,60 @@ +// Licensed to the Software Freedom Conservancy (SFC) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The SFC licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import exporter from 'code-export-utils' + +const emitters = { + id: emitId, + name: emitName, + link: emitLink, + linkText: emitLink, + partialLinkText: emitPartialLinkText, + css: emitCss, + xpath: emitXpath, +} + +export function emit(location) { + return exporter.emit.location(location, emitters) +} + +export default { + emit, +} + +function emitId(selector) { + return Promise.resolve(`By.id("${selector}")`) +} + +function emitName(selector) { + return Promise.resolve(`By.name("${selector}")`) +} + +function emitLink(selector) { + return Promise.resolve(`By.linkText("${selector}")`) +} + +function emitPartialLinkText(selector) { + return Promise.resolve(`By.partialLinkText("${selector}")`) +} + +function emitCss(selector) { + return Promise.resolve(`By.cssSelector("${selector}")`) +} + +function emitXpath(selector) { + return Promise.resolve(`By.xpath("${selector}")`) +} diff --git a/packages/code-export-python-pytest/src/selection.js b/packages/code-export-python-pytest/src/selection.js new file mode 100644 index 0000000000..8352c969bf --- /dev/null +++ b/packages/code-export-python-pytest/src/selection.js @@ -0,0 +1,49 @@ +// Licensed to the Software Freedom Conservancy (SFC) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The SFC licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import exporter from 'code-export-utils' + +const emitters = { + id: emitId, + value: emitValue, + label: emitLabel, + index: emitIndex, +} + +export function emit(location) { + return exporter.emit.selection(location, emitters) +} + +export default { + emit, +} + +function emitId(id) { + return Promise.resolve(`By.cssSelector("*[id='${id}']")`) +} + +function emitValue(value) { + return Promise.resolve(`By.cssSelector("*[value='${value}']")`) +} + +function emitLabel(label) { + return Promise.resolve(`By.xpath("//option[. = '${label}']")`) +} + +function emitIndex(index) { + return Promise.resolve(`By.cssSelector("*:nth-child(${index})")`) +} diff --git a/packages/code-export-python-pytest/yarn.lock b/packages/code-export-python-pytest/yarn.lock new file mode 100644 index 0000000000..ec45fc3b2d --- /dev/null +++ b/packages/code-export-python-pytest/yarn.lock @@ -0,0 +1,2136 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +anymatch@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" + integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA== + dependencies: + micromatch "^2.1.5" + normalize-path "^2.0.0" + +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= + dependencies: + arr-flatten "^1.0.1" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.0.1, arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +async-each@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.2.tgz#8b8a7ca2a658f927e9f307d6d1a42f4199f0f735" + integrity sha512-6xrbvN0MOBKSJDdonmSSz2OwFSgxRaVtBDes26mj9KIGtDo+g9xosFRSC+i1gQh2oAN/tQ62AI/pGZGQjVOiRg== + +atob@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +babel-cli@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.26.0.tgz#502ab54874d7db88ad00b887a06383ce03d002f1" + integrity sha1-UCq1SHTX24itALiHoGODzgPQAvE= + dependencies: + babel-core "^6.26.0" + babel-polyfill "^6.26.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + commander "^2.11.0" + convert-source-map "^1.5.0" + fs-readdir-recursive "^1.0.0" + glob "^7.1.2" + lodash "^4.17.4" + output-file-sync "^1.1.2" + path-is-absolute "^1.0.1" + slash "^1.0.0" + source-map "^0.5.6" + v8flags "^2.1.1" + optionalDependencies: + chokidar "^1.6.1" + +babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-core@^6.26.0: + version "6.26.3" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" + integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.1" + debug "^2.6.9" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.8" + slash "^1.0.0" + source-map "^0.5.7" + +babel-generator@^6.26.0: + version "6.26.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.7" + trim-right "^1.0.1" + +babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ= + dependencies: + babel-helper-explode-assignable-expression "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-define-map@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" + integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8= + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-explode-assignable-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo= + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-regex@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" + integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI= + dependencies: + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-remap-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs= + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo= + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-check-es2015-constants@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-syntax-async-functions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= + +babel-plugin-syntax-exponentiation-operator@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= + +babel-plugin-syntax-trailing-function-commas@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" + integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM= + +babel-plugin-transform-async-to-generator@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" + integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E= + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-functions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-arrow-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoping@^6.23.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" + integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= + dependencies: + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-plugin-transform-es2015-classes@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs= + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-computed-properties@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM= + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-destructuring@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-for-of@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-function-name@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ= + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.26.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" + integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" + +babel-plugin-transform-es2015-modules-systemjs@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM= + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-umd@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg= + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-object-super@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40= + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= + dependencies: + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-shorthand-properties@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-spread@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-sticky-regex@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw= + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-template-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-unicode-regex@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek= + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-exponentiation-operator@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" + integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4= + dependencies: + babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" + babel-plugin-syntax-exponentiation-operator "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-regenerator@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" + integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8= + dependencies: + regenerator-transform "^0.10.0" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-polyfill@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" + integrity sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM= + dependencies: + babel-runtime "^6.26.0" + core-js "^2.5.0" + regenerator-runtime "^0.10.5" + +babel-preset-env@^1.6.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" + integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg== + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-to-generator "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.23.0" + babel-plugin-transform-es2015-classes "^6.23.0" + babel-plugin-transform-es2015-computed-properties "^6.22.0" + babel-plugin-transform-es2015-destructuring "^6.23.0" + babel-plugin-transform-es2015-duplicate-keys "^6.22.0" + babel-plugin-transform-es2015-for-of "^6.23.0" + babel-plugin-transform-es2015-function-name "^6.22.0" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.22.0" + babel-plugin-transform-es2015-modules-commonjs "^6.23.0" + babel-plugin-transform-es2015-modules-systemjs "^6.23.0" + babel-plugin-transform-es2015-modules-umd "^6.23.0" + babel-plugin-transform-es2015-object-super "^6.22.0" + babel-plugin-transform-es2015-parameters "^6.23.0" + babel-plugin-transform-es2015-shorthand-properties "^6.22.0" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.22.0" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.23.0" + babel-plugin-transform-es2015-unicode-regex "^6.22.0" + babel-plugin-transform-exponentiation-operator "^6.22.0" + babel-plugin-transform-regenerator "^6.22.0" + browserslist "^3.2.6" + invariant "^2.2.2" + semver "^5.3.0" + +babel-register@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= + dependencies: + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + home-or-tmp "^2.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + source-map-support "^0.4.15" + +babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-template@^6.24.1, babel-template@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.24.1, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +binary-extensions@^1.0.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.0.tgz#9523e001306a32444b907423f1de2164222f6ab1" + integrity sha512-EgmjVLMn22z7eGGv3kcnHwSnJXmFHjISTY9E/S5lIcTD3Oxw05QTcBLNkJFzcb3cNueUdF/IN4U+d78V0zO8Hw== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +braces@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +browserslist@^3.2.6: + version "3.2.8" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" + integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== + dependencies: + caniuse-lite "^1.0.30000844" + electron-to-chromium "^1.3.47" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +caniuse-lite@^1.0.30000844: + version "1.0.30000939" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000939.tgz#b9ab7ac9e861bf78840b80c5dfbc471a5cd7e679" + integrity sha512-oXB23ImDJOgQpGjRv1tCtzAvJr4/OvrHi5SO2vUgB0g0xpdZZoA/BxfImiWfdwoYdUTtQrPsXsvYU/dmCSM8gg== + +chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chokidar@^1.6.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" + integrity sha1-eY5ol3gVHIB2tLNg5e3SjNortGg= + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + +chownr@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" + integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +commander@^2.11.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" + integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== + +component-emitter@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + +convert-source-map@^1.5.0, convert-source-map@^1.5.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" + integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== + dependencies: + safe-buffer "~5.1.1" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-js@^2.4.0, core-js@^2.5.0: + version "2.6.5" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.5.tgz#44bc8d249e7fb2ff5d00e0341a7ffb94fbf67895" + integrity sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A== + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= + dependencies: + repeating "^2.0.0" + +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + +electron-to-chromium@^1.3.47: + version "1.3.113" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.113.tgz#b1ccf619df7295aea17bc6951dc689632629e4a9" + integrity sha512-De+lPAxEcpxvqPTyZAXELNpRZXABRxf+uL/rSykstQhzj/B0l1150G/ExIIxKc16lI89Hgz81J0BHAcbTqK49g== + +escape-string-regexp@^1.0.2: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= + dependencies: + is-posix-bracket "^0.1.0" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= + dependencies: + fill-range "^2.1.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= + dependencies: + is-extglob "^1.0.0" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= + +fill-range@^2.1.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" + integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^3.0.0" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +for-in@^1.0.1, for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= + dependencies: + for-in "^1.0.1" + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fs-minipass@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" + integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ== + dependencies: + minipass "^2.2.1" + +fs-readdir-recursive@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" + integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.0.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.7.tgz#4851b664a3783e52003b3c66eb0eee1074933aa4" + integrity sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw== + dependencies: + nan "^2.9.2" + node-pre-gyp "^0.10.0" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + 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" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= + dependencies: + is-glob "^2.0.0" + +glob@^7.1.2, glob@^7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== + 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" + +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== + +graceful-fs@^4.1.11, graceful-fs@^4.1.4: + version "4.1.15" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" + integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +iconv-lite@^0.4.4: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ignore-walk@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== + dependencies: + minimatch "^3.0.4" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.1, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@~1.3.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +invariant@^2.2.2: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= + dependencies: + is-extglob "^1.0.0" + +is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= + dependencies: + kind-of "^3.0.2" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== + +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +isarray@1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== + +lodash@^4.17.4: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== + +loose-envify@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +math-random@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" + integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== + +micromatch@^2.1.5: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +micromatch@^3.1.10: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= + +minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + +minipass@^2.2.1, minipass@^2.3.4: + version "2.3.5" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" + integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" + integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== + dependencies: + minipass "^2.2.1" + +mixin-deep@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.0, mkdirp@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + dependencies: + minimist "0.0.8" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +nan@^2.9.2: + version "2.13.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.1.tgz#a15bee3790bde247e8f38f1d446edcdaeb05f2dd" + integrity sha512-I6YB/YEuDeUZMmhscXKxGgZlFnhsn5y0hgOZBadkzfTRrZBtJDZeg6eQf7PYMIEclwmorTKK8GztsyOUSVBREA== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +needle@^2.2.1: + version "2.2.4" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" + integrity sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA== + dependencies: + debug "^2.1.2" + iconv-lite "^0.4.4" + sax "^1.2.4" + +node-pre-gyp@^0.10.0: + version "0.10.3" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" + integrity sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A== + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= + dependencies: + abbrev "1" + osenv "^0.1.4" + +normalize-path@^2.0.0, normalize-path@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +npm-bundled@^1.0.1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" + integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== + +npm-packlist@^1.1.6: + version "1.4.1" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.1.tgz#19064cdf988da80ea3cee45533879d90192bbfbc" + integrity sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + +npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + 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" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +output-file-sync@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" + integrity sha1-0KM+7+YaIF+suQCS6CZZjVJFznY= + dependencies: + graceful-fs "^4.1.4" + mkdirp "^0.5.1" + object-assign "^4.1.0" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= + +private@^0.1.6, private@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== + +process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== + +randomatic@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" + integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== + dependencies: + is-number "^4.0.0" + kind-of "^6.0.0" + math-random "^1.0.1" + +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +readable-stream@^2.0.2, readable-stream@^2.0.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readdirp@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +regenerate@^1.2.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== + +regenerator-runtime@^0.10.5: + version "0.10.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + integrity sha1-M2w+/BIgrc7dosn6tntaeVWjNlg= + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + +regenerator-transform@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" + integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + +regex-cache@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== + dependencies: + is-equal-shallow "^0.1.3" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= + dependencies: + jsesc "~0.5.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.5.2, repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + dependencies: + is-finite "^1.0.0" + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +rimraf@^2.6.1: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +semver@^5.3.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" + integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== + +set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.1" + to-object-path "^0.3.0" + +set-value@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +signal-exit@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +source-map-resolve@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== + dependencies: + atob "^2.1.1" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.4.15: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== + dependencies: + source-map "^0.5.6" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.5.6, source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2": + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +tar@^4: + version "4.4.8" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" + integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ== + dependencies: + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.3.4" + minizlib "^1.1.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.2" + +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= + +union-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^0.4.3" + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + integrity sha1-K1viOjK2Onyd640PKNSFcko98ZA= + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +v8flags@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" + integrity sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ= + dependencies: + user-home "^1.1.1" + +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +yallist@^3.0.0, yallist@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" + integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== diff --git a/packages/code-export/package.json b/packages/code-export/package.json index 8b5c1847b4..d8db34c065 100644 --- a/packages/code-export/package.json +++ b/packages/code-export/package.json @@ -20,6 +20,7 @@ "babel-preset-env": "^1.6.1" }, "dependencies": { - "code-export-java-junit": "^3.8.1" + "code-export-java-junit": "^3.8.1", + "code-export-python-pytest": "^3.8.1" } } From 3421637e57f33cf53cfaa0f0037b5e95b7c02d39 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Tue, 4 Jun 2019 13:24:20 +0300 Subject: [PATCH 02/99] Updated location emitters --- packages/code-export-python-pytest/src/hook.js | 4 ++++ packages/code-export-python-pytest/src/location.js | 12 ++++++------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/packages/code-export-python-pytest/src/hook.js b/packages/code-export-python-pytest/src/hook.js index 7a6a4f9a76..0a3bd4b9d1 100644 --- a/packages/code-export-python-pytest/src/hook.js +++ b/packages/code-export-python-pytest/src/hook.js @@ -104,6 +104,10 @@ function declareDependencies() { commands: [ { level: 0, statement: 'import pytest' }, { level: 0, statement: 'from selenium import webdriver' }, + { + level: 0, + statement: ' from selenium.webdriver.common.by import By ', + }, ], }, } diff --git a/packages/code-export-python-pytest/src/location.js b/packages/code-export-python-pytest/src/location.js index 01b8269ad9..aee909b5e5 100644 --- a/packages/code-export-python-pytest/src/location.js +++ b/packages/code-export-python-pytest/src/location.js @@ -36,25 +36,25 @@ export default { } function emitId(selector) { - return Promise.resolve(`By.id("${selector}")`) + return Promise.resolve({ by: 'By.ID', value: selector }) } function emitName(selector) { - return Promise.resolve(`By.name("${selector}")`) + return Promise.resolve({ by: 'By.NAME', value: selector }) } function emitLink(selector) { - return Promise.resolve(`By.linkText("${selector}")`) + return Promise.resolve({ by: 'By.LINK_TEXT', value: selector }) } function emitPartialLinkText(selector) { - return Promise.resolve(`By.partialLinkText("${selector}")`) + return Promise.resolve({ by: 'By.PARTIAL_LINK_TEXT', value: selector }) } function emitCss(selector) { - return Promise.resolve(`By.cssSelector("${selector}")`) + return Promise.resolve({ by: 'By.CSS_SELECTOR', value: selector }) } function emitXpath(selector) { - return Promise.resolve(`By.xpath("${selector}")`) + return Promise.resolve({ by: 'By.XPATH', value: selector }) } From ba6cab8f2ab93c4e9ad0aab3e692a1edaa4fb101 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Tue, 4 Jun 2019 13:37:47 +0300 Subject: [PATCH 03/99] Updated the selection emitter --- .../code-export-python-pytest/src/selection.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/code-export-python-pytest/src/selection.js b/packages/code-export-python-pytest/src/selection.js index 8352c969bf..d8c666c32d 100644 --- a/packages/code-export-python-pytest/src/selection.js +++ b/packages/code-export-python-pytest/src/selection.js @@ -33,17 +33,23 @@ export default { } function emitId(id) { - return Promise.resolve(`By.cssSelector("*[id='${id}']")`) + return Promise.resolve({ by: 'By.CSS_SELECTOR', value: `*[id='${id}']` }) } function emitValue(value) { - return Promise.resolve(`By.cssSelector("*[value='${value}']")`) + return Promise.resolve({ + by: 'By.CSS_SELECTOR', + value: `*[value='${value}']`, + }) } function emitLabel(label) { - return Promise.resolve(`By.xpath("//option[. = '${label}']")`) + return Promise.resolve({ by: 'By.XPATH', value: `//option[. = '${label}']` }) } function emitIndex(index) { - return Promise.resolve(`By.cssSelector("*:nth-child(${index})")`) + return Promise.resolve({ + by: 'By.CSS_SELECTOR', + value: `*:nth-child(${index})`, + }) } From a54fc5fcc147e76d2930b001b7b79d5b36869278 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Tue, 4 Jun 2019 13:43:46 +0300 Subject: [PATCH 04/99] Added quotes around values in location and selection emitters --- packages/code-export-python-pytest/src/location.js | 12 ++++++------ packages/code-export-python-pytest/src/selection.js | 9 ++++++--- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/packages/code-export-python-pytest/src/location.js b/packages/code-export-python-pytest/src/location.js index aee909b5e5..e2d279d489 100644 --- a/packages/code-export-python-pytest/src/location.js +++ b/packages/code-export-python-pytest/src/location.js @@ -36,25 +36,25 @@ export default { } function emitId(selector) { - return Promise.resolve({ by: 'By.ID', value: selector }) + return Promise.resolve({ by: 'By.ID', value: `"${selector}"` }) } function emitName(selector) { - return Promise.resolve({ by: 'By.NAME', value: selector }) + return Promise.resolve({ by: 'By.NAME', value: `"${selector}"` }) } function emitLink(selector) { - return Promise.resolve({ by: 'By.LINK_TEXT', value: selector }) + return Promise.resolve({ by: 'By.LINK_TEXT', value: `"${selector}"` }) } function emitPartialLinkText(selector) { - return Promise.resolve({ by: 'By.PARTIAL_LINK_TEXT', value: selector }) + return Promise.resolve({ by: 'By.PARTIAL_LINK_TEXT', value: `"${selector}"` }) } function emitCss(selector) { - return Promise.resolve({ by: 'By.CSS_SELECTOR', value: selector }) + return Promise.resolve({ by: 'By.CSS_SELECTOR', value: `"${selector}"` }) } function emitXpath(selector) { - return Promise.resolve({ by: 'By.XPATH', value: selector }) + return Promise.resolve({ by: 'By.XPATH', value: `"${selector}"` }) } diff --git a/packages/code-export-python-pytest/src/selection.js b/packages/code-export-python-pytest/src/selection.js index d8c666c32d..d661e6ce31 100644 --- a/packages/code-export-python-pytest/src/selection.js +++ b/packages/code-export-python-pytest/src/selection.js @@ -33,7 +33,7 @@ export default { } function emitId(id) { - return Promise.resolve({ by: 'By.CSS_SELECTOR', value: `*[id='${id}']` }) + return Promise.resolve({ by: 'By.CSS_SELECTOR', value: `"*[id='${id}']"` }) } function emitValue(value) { @@ -44,12 +44,15 @@ function emitValue(value) { } function emitLabel(label) { - return Promise.resolve({ by: 'By.XPATH', value: `//option[. = '${label}']` }) + return Promise.resolve({ + by: 'By.XPATH', + value: `"//option[. = '${label}']"`, + }) } function emitIndex(index) { return Promise.resolve({ by: 'By.CSS_SELECTOR', - value: `*:nth-child(${index})`, + value: `"*:nth-child(${index})"`, }) } From 80eb34714965c47c4cd7cd50d0f4663d305b0120 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Tue, 4 Jun 2019 13:47:36 +0300 Subject: [PATCH 05/99] Implemented first command -- add selection --- .../__test__/src/command.spec.js | 2 +- .../code-export-python-pytest/src/command.js | 20 +++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/code-export-python-pytest/__test__/src/command.spec.js b/packages/code-export-python-pytest/__test__/src/command.spec.js index 43d568feb1..dbb1609807 100644 --- a/packages/code-export-python-pytest/__test__/src/command.spec.js +++ b/packages/code-export-python-pytest/__test__/src/command.spec.js @@ -58,7 +58,7 @@ describe('command code emitter', () => { value: 'label=A label', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement dropdown = driver.findElement(By.cssSelector("select"));\n${commandPrefixPadding}dropdown.findElement(By.xpath("//option[. = 'A label']")).click();\n}` + `dropdown = driver.find_element(By.CSS_SELECTOR, "select")\ndropdown.findElement(By.XPATH, "//option[. = 'A label']").click()` ) }) it('should emit `assert` command', () => { diff --git a/packages/code-export-python-pytest/src/command.js b/packages/code-export-python-pytest/src/command.js index f98e202c0a..d43c3ce8e4 100644 --- a/packages/code-export-python-pytest/src/command.js +++ b/packages/code-export-python-pytest/src/command.js @@ -520,21 +520,21 @@ async function emitSetWindowSize(size) { } async function emitSelect(selectElement, option) { + const emittedLocator = await location.emit(selectElement) + const emittedSelection = await selection.emit(option) const commands = [ - { level: 0, statement: '{' }, { - level: 1, - statement: `WebElement dropdown = driver.findElement(${await location.emit( - selectElement - )});`, + level: 0, + statement: `dropdown = driver.find_element(${emittedLocator.by}, ${ + emittedLocator.value + })`, }, { - level: 1, - statement: `dropdown.findElement(${await selection.emit( - option - )}).click();`, + level: 0, + statement: `dropdown.findElement(${emittedSelection.by}, ${ + emittedSelection.value + }).click()`, }, - { level: 0, statement: '}' }, ] return Promise.resolve({ commands }) } From d26e4fae7372b1251dafa1f1e9d6c35c36b2dbaf Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Tue, 4 Jun 2019 14:13:26 +0300 Subject: [PATCH 06/99] Updated tests for location and selection emitting --- .../__test__/src/location.spec.js | 68 +++++++++++-------- .../__test__/src/selection.spec.js | 35 ++++++---- .../src/selection.js | 2 +- 3 files changed, 61 insertions(+), 44 deletions(-) diff --git a/packages/code-export-python-pytest/__test__/src/location.spec.js b/packages/code-export-python-pytest/__test__/src/location.spec.js index 9b3fc07390..41a32ab547 100644 --- a/packages/code-export-python-pytest/__test__/src/location.spec.js +++ b/packages/code-export-python-pytest/__test__/src/location.spec.js @@ -31,68 +31,80 @@ describe('location code emitter', () => { it('should emit id locator', () => { const type = 'id' const selector = 'someId' - return expect(emit(`${type}=${selector}`)).resolves.toBe( - `By.id("${selector}")` - ) + return expect(emit(`${type}=${selector}`)).resolves.toEqual({ + by: 'By.ID', + value: `"${selector}"`, + }) }) it('should emit link locator', () => { const type = 'link' const selector = 'someLink' - return expect(emit(`${type}=${selector}`)).resolves.toBe( - `By.linkText("${selector}")` - ) + return expect(emit(`${type}=${selector}`)).resolves.toEqual({ + by: 'By.LINK_TEXT', + value: `"${selector}"`, + }) }) it('should emit linkText locator', () => { const type = 'linkText' const selector = 'someLink' - return expect(emit(`${type}=${selector}`)).resolves.toBe( - `By.linkText("${selector}")` - ) + return expect(emit(`${type}=${selector}`)).resolves.toEqual({ + by: 'By.LINK_TEXT', + value: `"${selector}"`, + }) }) it('should emit partialLinkText locator', () => { const type = 'partialLinkText' const selector = 'someLink' - return expect(emit(`${type}=${selector}`)).resolves.toBe( - `By.partialLinkText("${selector}")` - ) + return expect(emit(`${type}=${selector}`)).resolves.toEqual({ + by: 'By.PARTIAL_LINK_TEXT', + value: `"${selector}"`, + }) }) it('should emit css locator', () => { const type = 'css' const selector = 'someCss' - return expect(emit(`${type}=${selector}`)).resolves.toBe( - `By.cssSelector("${selector}")` - ) + return expect(emit(`${type}=${selector}`)).resolves.toEqual({ + by: 'By.CSS_SELECTOR', + value: `"${selector}"`, + }) }) it('should emit css locator with `=` sign', () => { const type = 'css' const selector = 'a[title=JScript]' - return expect(emit(`${type}=${selector}`)).resolves.toBe( - `By.cssSelector("${selector}")` - ) + return expect(emit(`${type}=${selector}`)).resolves.toEqual({ + by: 'By.CSS_SELECTOR', + value: `"${selector}"`, + }) }) it('should escape quotes in locator strings', () => { const type = 'css' const selector = 'a[title="escaped"]' - return expect(emit(`${type}=${selector}`)).resolves.toBe( - 'By.cssSelector("a[title=\\"escaped\\"]")' - ) + return expect(emit(`${type}=${selector}`)).resolves.toEqual({ + by: 'By.CSS_SELECTOR', + value: `"a[title=\\"escaped\\"]"`, + }) }) it('should emit xpath locator', () => { const type = 'xpath' const selector = 'someXpath' - return expect(emit(`${type}=${selector}`)).resolves.toBe( - `By.xpath("${selector}")` - ) + return expect(emit(`${type}=${selector}`)).resolves.toEqual({ + by: 'By.XPATH', + value: `"${selector}"`, + }) }) it('should emit implicit xpath locator', () => { const selector = '//test=xpath' - return expect(emit(selector)).resolves.toBe(`By.xpath("${selector}")`) + return expect(emit(selector)).resolves.toEqual({ + by: 'By.XPATH', + value: `"${selector}"`, + }) }) it('should emit name locator', () => { const type = 'name' const selector = 'someName' - return expect(emit(`${type}=${selector}`)).resolves.toBe( - `By.name("${selector}")` - ) + return expect(emit(`${type}=${selector}`)).resolves.toEqual({ + by: 'By.NAME', + value: `"${selector}"`, + }) }) }) diff --git a/packages/code-export-python-pytest/__test__/src/selection.spec.js b/packages/code-export-python-pytest/__test__/src/selection.spec.js index 4eec6c911d..a2d056b79e 100644 --- a/packages/code-export-python-pytest/__test__/src/selection.spec.js +++ b/packages/code-export-python-pytest/__test__/src/selection.spec.js @@ -24,36 +24,41 @@ describe('selection location code emitter', () => { }).toThrow('Unknown selection locator notExists') }) it('should assume when no selector is given that it is the label locator', () => { - return expect(emit('label')).resolves.toBe( - `By.xpath("//option[. = 'label']")` - ) + return expect(emit('label')).resolves.toEqual({ + by: 'By.XPATH', + value: `"//option[. = 'label']"`, + }) }) it('should emit label locator', () => { const type = 'label' const selector = 'a label' - return expect(emit(`${type}=${selector}`)).resolves.toBe( - `By.xpath("//option[. = '${selector}']")` - ) + return expect(emit(`${type}=${selector}`)).resolves.toEqual({ + by: 'By.XPATH', + value: `"//option[. = '${selector}']"`, + }) }) it('should emit id locator', () => { const type = 'id' const selector = 'someId' - return expect(emit(`${type}=${selector}`)).resolves.toBe( - `By.cssSelector("*[id='${selector}']")` - ) + return expect(emit(`${type}=${selector}`)).resolves.toEqual({ + by: 'By.CSS_SELECTOR', + value: `"*[id='${selector}']"`, + }) }) it('should emit value locator', () => { const type = 'value' const selector = 'someValue' - return expect(emit(`${type}=${selector}`)).resolves.toBe( - `By.cssSelector("*[value='${selector}']")` - ) + return expect(emit(`${type}=${selector}`)).resolves.toEqual({ + by: 'By.CSS_SELECTOR', + value: `"*[value='${selector}']"`, + }) }) it('should emit index locator', () => { const type = 'index' const selector = '2' - return expect(emit(`${type}=${selector}`)).resolves.toBe( - `By.cssSelector("*:nth-child(${selector})")` - ) + return expect(emit(`${type}=${selector}`)).resolves.toEqual({ + by: 'By.CSS_SELECTOR', + value: `"*:nth-child(${selector})"`, + }) }) }) diff --git a/packages/code-export-python-pytest/src/selection.js b/packages/code-export-python-pytest/src/selection.js index d661e6ce31..69ed18d082 100644 --- a/packages/code-export-python-pytest/src/selection.js +++ b/packages/code-export-python-pytest/src/selection.js @@ -39,7 +39,7 @@ function emitId(id) { function emitValue(value) { return Promise.resolve({ by: 'By.CSS_SELECTOR', - value: `*[value='${value}']`, + value: `"*[value='${value}']"`, }) } From df2ffa4b5abae7e1b7a99ea4e07cbdb967fbd834 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Tue, 4 Jun 2019 16:06:42 +0300 Subject: [PATCH 07/99] Removed whitespace padding from import statement --- packages/code-export-python-pytest/src/hook.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/code-export-python-pytest/src/hook.js b/packages/code-export-python-pytest/src/hook.js index 0a3bd4b9d1..2848eb0fc2 100644 --- a/packages/code-export-python-pytest/src/hook.js +++ b/packages/code-export-python-pytest/src/hook.js @@ -11,8 +11,7 @@ // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations +// KIND, either express or implied. See the License for the specific language governing permissions and limitations // under the License. import exporter from 'code-export-utils' @@ -106,7 +105,7 @@ function declareDependencies() { { level: 0, statement: 'from selenium import webdriver' }, { level: 0, - statement: ' from selenium.webdriver.common.by import By ', + statement: 'from selenium.webdriver.common.by import By', }, ], }, From 584c95a522bbaf0864161e623d44719b3badb7d1 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Tue, 4 Jun 2019 16:08:20 +0300 Subject: [PATCH 08/99] Added `assert`, `assert alert`, and `assert checked` command emitting --- .../__test__/src/command.spec.js | 8 +++----- packages/code-export-python-pytest/src/command.js | 15 ++++++--------- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/packages/code-export-python-pytest/__test__/src/command.spec.js b/packages/code-export-python-pytest/__test__/src/command.spec.js index dbb1609807..d44b573faf 100644 --- a/packages/code-export-python-pytest/__test__/src/command.spec.js +++ b/packages/code-export-python-pytest/__test__/src/command.spec.js @@ -68,9 +68,7 @@ describe('command code emitter', () => { value: 'blah', } expect(prettify(command)).resolves.toBe( - `assertEquals(vars.get("${command.target}").toString(), "${ - command.value - }");` + `assert(vars["varrrName"] == "blah")` ) }) it('should emit `assert alert` command', () => { @@ -80,7 +78,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `assertThat(driver.switchTo().alert().getText(), is("an alert"));` + `assert driver.switch_to.alert.text == "an alert"` ) }) it('should emit `assert checked` command', () => { @@ -90,7 +88,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `assertTrue(driver.findElement(By.id("check")).isSelected());` + `assert driver.find_element(By.ID, "check").isSelected() is True` ) }) it('should emit `assert confirmation` command', () => { diff --git a/packages/code-export-python-pytest/src/command.js b/packages/code-export-python-pytest/src/command.js index d43c3ce8e4..3678aa5454 100644 --- a/packages/code-export-python-pytest/src/command.js +++ b/packages/code-export-python-pytest/src/command.js @@ -181,15 +181,11 @@ async function emitNewWindowHandling(command, emittedCommand) { } function emitAssert(varName, value) { - return Promise.resolve( - `assertEquals(vars.get("${varName}").toString(), "${value}");` - ) + return Promise.resolve(`assert(vars["${varName}"] == "${value}")`) } function emitAssertAlert(alertText) { - return Promise.resolve( - `assertThat(driver.switchTo().alert().getText(), is("${alertText}"));` - ) + return Promise.resolve(`assert driver.switch_to.alert.text == "${alertText}"`) } function emitAnswerOnNextPrompt(textToSend) { @@ -738,10 +734,11 @@ async function emitUncheck(locator) { } async function emitVerifyChecked(locator) { + const emittedLocator = await location.emit(locator) return Promise.resolve( - `assertTrue(driver.findElement(${await location.emit( - locator - )}).isSelected());` + `assert driver.find_element(${emittedLocator.by}, ${ + emittedLocator.value + }).isSelected() is True` ) } From 5bfdf9366fb5bae4678b4e3a9d1354a8e8c28f4d Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Wed, 5 Jun 2019 09:29:34 +0300 Subject: [PATCH 09/99] Changed location and selection emitting to output a consolidated string --- .../__test__/src/location.spec.js | 68 ++++++++----------- .../__test__/src/selection.spec.js | 35 ++++------ .../code-export-python-pytest/src/command.js | 21 +++--- .../code-export-python-pytest/src/location.js | 12 ++-- .../src/selection.js | 17 ++--- 5 files changed, 62 insertions(+), 91 deletions(-) diff --git a/packages/code-export-python-pytest/__test__/src/location.spec.js b/packages/code-export-python-pytest/__test__/src/location.spec.js index 41a32ab547..3ee9426892 100644 --- a/packages/code-export-python-pytest/__test__/src/location.spec.js +++ b/packages/code-export-python-pytest/__test__/src/location.spec.js @@ -31,80 +31,68 @@ describe('location code emitter', () => { it('should emit id locator', () => { const type = 'id' const selector = 'someId' - return expect(emit(`${type}=${selector}`)).resolves.toEqual({ - by: 'By.ID', - value: `"${selector}"`, - }) + return expect(emit(`${type}=${selector}`)).resolves.toEqual( + `By.ID, "someId"` + ) }) it('should emit link locator', () => { const type = 'link' const selector = 'someLink' - return expect(emit(`${type}=${selector}`)).resolves.toEqual({ - by: 'By.LINK_TEXT', - value: `"${selector}"`, - }) + return expect(emit(`${type}=${selector}`)).resolves.toEqual( + `By.LINK_TEXT, "someLink"` + ) }) it('should emit linkText locator', () => { const type = 'linkText' const selector = 'someLink' - return expect(emit(`${type}=${selector}`)).resolves.toEqual({ - by: 'By.LINK_TEXT', - value: `"${selector}"`, - }) + return expect(emit(`${type}=${selector}`)).resolves.toEqual( + `By.LINK_TEXT, "someLink"` + ) }) it('should emit partialLinkText locator', () => { const type = 'partialLinkText' const selector = 'someLink' - return expect(emit(`${type}=${selector}`)).resolves.toEqual({ - by: 'By.PARTIAL_LINK_TEXT', - value: `"${selector}"`, - }) + return expect(emit(`${type}=${selector}`)).resolves.toEqual( + `By.PARTIAL_LINK_TEXT, "someLink"` + ) }) it('should emit css locator', () => { const type = 'css' const selector = 'someCss' - return expect(emit(`${type}=${selector}`)).resolves.toEqual({ - by: 'By.CSS_SELECTOR', - value: `"${selector}"`, - }) + return expect(emit(`${type}=${selector}`)).resolves.toEqual( + `By.CSS_SELECTOR, "someCss"` + ) }) it('should emit css locator with `=` sign', () => { const type = 'css' const selector = 'a[title=JScript]' - return expect(emit(`${type}=${selector}`)).resolves.toEqual({ - by: 'By.CSS_SELECTOR', - value: `"${selector}"`, - }) + return expect(emit(`${type}=${selector}`)).resolves.toEqual( + `By.CSS_SELECTOR, "a[title=JScript]"` + ) }) it('should escape quotes in locator strings', () => { const type = 'css' const selector = 'a[title="escaped"]' - return expect(emit(`${type}=${selector}`)).resolves.toEqual({ - by: 'By.CSS_SELECTOR', - value: `"a[title=\\"escaped\\"]"`, - }) + return expect(emit(`${type}=${selector}`)).resolves.toEqual( + `By.CSS_SELECTOR, "a[title=\\"escaped\\"]"` + ) }) it('should emit xpath locator', () => { const type = 'xpath' const selector = 'someXpath' - return expect(emit(`${type}=${selector}`)).resolves.toEqual({ - by: 'By.XPATH', - value: `"${selector}"`, - }) + return expect(emit(`${type}=${selector}`)).resolves.toEqual( + `By.XPATH, "someXpath"` + ) }) it('should emit implicit xpath locator', () => { const selector = '//test=xpath' - return expect(emit(selector)).resolves.toEqual({ - by: 'By.XPATH', - value: `"${selector}"`, - }) + return expect(emit(selector)).resolves.toEqual(`By.XPATH, "//test=xpath"`) }) it('should emit name locator', () => { const type = 'name' const selector = 'someName' - return expect(emit(`${type}=${selector}`)).resolves.toEqual({ - by: 'By.NAME', - value: `"${selector}"`, - }) + return expect(emit(`${type}=${selector}`)).resolves.toEqual( + `By.NAME, "someName"` + ) }) }) diff --git a/packages/code-export-python-pytest/__test__/src/selection.spec.js b/packages/code-export-python-pytest/__test__/src/selection.spec.js index a2d056b79e..9bbde31a88 100644 --- a/packages/code-export-python-pytest/__test__/src/selection.spec.js +++ b/packages/code-export-python-pytest/__test__/src/selection.spec.js @@ -24,41 +24,36 @@ describe('selection location code emitter', () => { }).toThrow('Unknown selection locator notExists') }) it('should assume when no selector is given that it is the label locator', () => { - return expect(emit('label')).resolves.toEqual({ - by: 'By.XPATH', - value: `"//option[. = 'label']"`, - }) + return expect(emit('label')).resolves.toEqual( + `By.XPATH, "//option[. = 'label']"` + ) }) it('should emit label locator', () => { const type = 'label' const selector = 'a label' - return expect(emit(`${type}=${selector}`)).resolves.toEqual({ - by: 'By.XPATH', - value: `"//option[. = '${selector}']"`, - }) + return expect(emit(`${type}=${selector}`)).resolves.toEqual( + `By.XPATH, "//option[. = '${selector}']"` + ) }) it('should emit id locator', () => { const type = 'id' const selector = 'someId' - return expect(emit(`${type}=${selector}`)).resolves.toEqual({ - by: 'By.CSS_SELECTOR', - value: `"*[id='${selector}']"`, - }) + return expect(emit(`${type}=${selector}`)).resolves.toEqual( + `By.CSS_SELECTOR, "*[id='${selector}']"` + ) }) it('should emit value locator', () => { const type = 'value' const selector = 'someValue' - return expect(emit(`${type}=${selector}`)).resolves.toEqual({ - by: 'By.CSS_SELECTOR', - value: `"*[value='${selector}']"`, - }) + return expect(emit(`${type}=${selector}`)).resolves.toEqual( + `By.CSS_SELECTOR, "*[value='${selector}']"` + ) }) it('should emit index locator', () => { const type = 'index' const selector = '2' - return expect(emit(`${type}=${selector}`)).resolves.toEqual({ - by: 'By.CSS_SELECTOR', - value: `"*:nth-child(${selector})"`, - }) + return expect(emit(`${type}=${selector}`)).resolves.toEqual( + `By.CSS_SELECTOR, "*:nth-child(${selector})"` + ) }) }) diff --git a/packages/code-export-python-pytest/src/command.js b/packages/code-export-python-pytest/src/command.js index 3678aa5454..555f92a8f2 100644 --- a/packages/code-export-python-pytest/src/command.js +++ b/packages/code-export-python-pytest/src/command.js @@ -516,20 +516,18 @@ async function emitSetWindowSize(size) { } async function emitSelect(selectElement, option) { - const emittedLocator = await location.emit(selectElement) - const emittedSelection = await selection.emit(option) const commands = [ { level: 0, - statement: `dropdown = driver.find_element(${emittedLocator.by}, ${ - emittedLocator.value - })`, + statement: `dropdown = driver.find_element(${await location.emit( + selectElement + )})`, }, { level: 0, - statement: `dropdown.findElement(${emittedSelection.by}, ${ - emittedSelection.value - }).click()`, + statement: `dropdown.findElement(${await selection.emit( + option + )}).click()`, }, ] return Promise.resolve({ commands }) @@ -734,11 +732,10 @@ async function emitUncheck(locator) { } async function emitVerifyChecked(locator) { - const emittedLocator = await location.emit(locator) return Promise.resolve( - `assert driver.find_element(${emittedLocator.by}, ${ - emittedLocator.value - }).isSelected() is True` + `assert driver.find_element(${await location.emit( + locator + )}).isSelected() is True` ) } diff --git a/packages/code-export-python-pytest/src/location.js b/packages/code-export-python-pytest/src/location.js index e2d279d489..5087380b01 100644 --- a/packages/code-export-python-pytest/src/location.js +++ b/packages/code-export-python-pytest/src/location.js @@ -36,25 +36,25 @@ export default { } function emitId(selector) { - return Promise.resolve({ by: 'By.ID', value: `"${selector}"` }) + return Promise.resolve(`By.ID, "${selector}"`) } function emitName(selector) { - return Promise.resolve({ by: 'By.NAME', value: `"${selector}"` }) + return Promise.resolve(`By.NAME, "${selector}"`) } function emitLink(selector) { - return Promise.resolve({ by: 'By.LINK_TEXT', value: `"${selector}"` }) + return Promise.resolve(`By.LINK_TEXT, "${selector}"`) } function emitPartialLinkText(selector) { - return Promise.resolve({ by: 'By.PARTIAL_LINK_TEXT', value: `"${selector}"` }) + return Promise.resolve(`By.PARTIAL_LINK_TEXT, "${selector}"`) } function emitCss(selector) { - return Promise.resolve({ by: 'By.CSS_SELECTOR', value: `"${selector}"` }) + return Promise.resolve(`By.CSS_SELECTOR, "${selector}"`) } function emitXpath(selector) { - return Promise.resolve({ by: 'By.XPATH', value: `"${selector}"` }) + return Promise.resolve(`By.XPATH, "${selector}"`) } diff --git a/packages/code-export-python-pytest/src/selection.js b/packages/code-export-python-pytest/src/selection.js index 69ed18d082..bc71b87f8a 100644 --- a/packages/code-export-python-pytest/src/selection.js +++ b/packages/code-export-python-pytest/src/selection.js @@ -33,26 +33,17 @@ export default { } function emitId(id) { - return Promise.resolve({ by: 'By.CSS_SELECTOR', value: `"*[id='${id}']"` }) + return Promise.resolve(`By.CSS_SELECTOR, "*[id='${id}']"`) } function emitValue(value) { - return Promise.resolve({ - by: 'By.CSS_SELECTOR', - value: `"*[value='${value}']"`, - }) + return Promise.resolve(`By.CSS_SELECTOR, "*[value='${value}']"`) } function emitLabel(label) { - return Promise.resolve({ - by: 'By.XPATH', - value: `"//option[. = '${label}']"`, - }) + return Promise.resolve(`By.XPATH, "//option[. = '${label}']"`) } function emitIndex(index) { - return Promise.resolve({ - by: 'By.CSS_SELECTOR', - value: `"*:nth-child(${index})"`, - }) + return Promise.resolve(`By.CSS_SELECTOR, "*:nth-child(${index})"`) } From fd87fda520cd267e32d7f8c616b51ecb8eaa9061 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Wed, 5 Jun 2019 11:36:51 +0300 Subject: [PATCH 10/99] Added `assert confirmation` test --- .../code-export-python-pytest/__test__/src/command.spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/code-export-python-pytest/__test__/src/command.spec.js b/packages/code-export-python-pytest/__test__/src/command.spec.js index d44b573faf..fdf38d13b1 100644 --- a/packages/code-export-python-pytest/__test__/src/command.spec.js +++ b/packages/code-export-python-pytest/__test__/src/command.spec.js @@ -98,10 +98,10 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `assertThat(driver.switchTo().alert().getText(), is("a confirmation"));` + `assert driver.switch_to.alert.text == "a confirmation"` ) }) - it('should emit `assert editable` command', () => { + it.only('should emit `assert editable` command', () => { const command = { command: 'assertEditable', target: 'id=text', From 7f5e539a99061ced9569d0ebdd22c36942af26f3 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Thu, 6 Jun 2019 10:49:06 +0300 Subject: [PATCH 11/99] Bumped babel-preset-env version to see about fixing noisy log output --- packages/code-export-java-junit/package.json | 2 +- packages/code-export-java-junit/yarn.lock | 15 ++++++++++++++- packages/code-export-python-pytest/package.json | 2 +- packages/code-export-python-pytest/yarn.lock | 15 ++++++++++++++- packages/code-export-utils/package.json | 2 +- packages/code-export-utils/yarn.lock | 2 +- packages/code-export/package.json | 2 +- packages/code-export/yarn.lock | 7 +------ 8 files changed, 34 insertions(+), 13 deletions(-) diff --git a/packages/code-export-java-junit/package.json b/packages/code-export-java-junit/package.json index 9ff8070cf5..bd453850e4 100644 --- a/packages/code-export-java-junit/package.json +++ b/packages/code-export-java-junit/package.json @@ -18,7 +18,7 @@ "devDependencies": { "babel-cli": "^6.26.0", "babel-plugin-transform-object-rest-spread": "^6.26.0", - "babel-preset-env": "^1.6.1" + "babel-preset-env": "^1.7.0" }, "dependencies": { "code-export-utils": "^3.8.1" diff --git a/packages/code-export-java-junit/yarn.lock b/packages/code-export-java-junit/yarn.lock index ec45fc3b2d..5334fd4a55 100644 --- a/packages/code-export-java-junit/yarn.lock +++ b/packages/code-export-java-junit/yarn.lock @@ -297,6 +297,11 @@ babel-plugin-syntax-exponentiation-operator@^6.8.0: resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= +babel-plugin-syntax-object-rest-spread@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= + babel-plugin-syntax-trailing-function-commas@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" @@ -510,6 +515,14 @@ babel-plugin-transform-exponentiation-operator@^6.22.0: babel-plugin-syntax-exponentiation-operator "^6.8.0" babel-runtime "^6.22.0" +babel-plugin-transform-object-rest-spread@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" + integrity sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY= + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.26.0" + babel-plugin-transform-regenerator@^6.22.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" @@ -534,7 +547,7 @@ babel-polyfill@^6.26.0: core-js "^2.5.0" regenerator-runtime "^0.10.5" -babel-preset-env@^1.6.1: +babel-preset-env@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg== diff --git a/packages/code-export-python-pytest/package.json b/packages/code-export-python-pytest/package.json index 167a792142..df5fc80e64 100644 --- a/packages/code-export-python-pytest/package.json +++ b/packages/code-export-python-pytest/package.json @@ -18,7 +18,7 @@ "devDependencies": { "babel-cli": "^6.26.0", "babel-plugin-transform-object-rest-spread": "^6.26.0", - "babel-preset-env": "^1.6.1" + "babel-preset-env": "^1.7.0" }, "dependencies": { "code-export-utils": "^3.8.1" diff --git a/packages/code-export-python-pytest/yarn.lock b/packages/code-export-python-pytest/yarn.lock index ec45fc3b2d..5334fd4a55 100644 --- a/packages/code-export-python-pytest/yarn.lock +++ b/packages/code-export-python-pytest/yarn.lock @@ -297,6 +297,11 @@ babel-plugin-syntax-exponentiation-operator@^6.8.0: resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= +babel-plugin-syntax-object-rest-spread@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= + babel-plugin-syntax-trailing-function-commas@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" @@ -510,6 +515,14 @@ babel-plugin-transform-exponentiation-operator@^6.22.0: babel-plugin-syntax-exponentiation-operator "^6.8.0" babel-runtime "^6.22.0" +babel-plugin-transform-object-rest-spread@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" + integrity sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY= + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.26.0" + babel-plugin-transform-regenerator@^6.22.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" @@ -534,7 +547,7 @@ babel-polyfill@^6.26.0: core-js "^2.5.0" regenerator-runtime "^0.10.5" -babel-preset-env@^1.6.1: +babel-preset-env@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg== diff --git a/packages/code-export-utils/package.json b/packages/code-export-utils/package.json index 77aac89bb6..b099ba5a27 100644 --- a/packages/code-export-utils/package.json +++ b/packages/code-export-utils/package.json @@ -18,7 +18,7 @@ "devDependencies": { "babel-cli": "^6.26.0", "babel-plugin-transform-object-rest-spread": "^6.26.0", - "babel-preset-env": "^1.6.1" + "babel-preset-env": "^1.7.0" }, "dependencies": { "js-string-escape": "^1.0.1" diff --git a/packages/code-export-utils/yarn.lock b/packages/code-export-utils/yarn.lock index 0e2ba9316e..8b8ef48209 100644 --- a/packages/code-export-utils/yarn.lock +++ b/packages/code-export-utils/yarn.lock @@ -547,7 +547,7 @@ babel-polyfill@^6.26.0: core-js "^2.5.0" regenerator-runtime "^0.10.5" -babel-preset-env@^1.6.1: +babel-preset-env@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg== diff --git a/packages/code-export/package.json b/packages/code-export/package.json index d8db34c065..43af2aaace 100644 --- a/packages/code-export/package.json +++ b/packages/code-export/package.json @@ -17,7 +17,7 @@ "main": "dist/index.js", "devDependencies": { "babel-cli": "^6.26.0", - "babel-preset-env": "^1.6.1" + "babel-preset-env": "^1.7.0" }, "dependencies": { "code-export-java-junit": "^3.8.1", diff --git a/packages/code-export/yarn.lock b/packages/code-export/yarn.lock index 3fb7877379..efe022ff98 100644 --- a/packages/code-export/yarn.lock +++ b/packages/code-export/yarn.lock @@ -534,7 +534,7 @@ babel-polyfill@^6.26.0: core-js "^2.5.0" regenerator-runtime "^0.10.5" -babel-preset-env@^1.6.1: +babel-preset-env@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg== @@ -1334,11 +1334,6 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= -js-string-escape@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" - integrity sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8= - "js-tokens@^3.0.0 || ^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" From 9f4e6c4b5ea851c45ae2d61cc0b3170836f7204b Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Thu, 6 Jun 2019 10:50:39 +0300 Subject: [PATCH 12/99] Added dependency for Selenium actions --- packages/code-export-python-pytest/src/hook.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/code-export-python-pytest/src/hook.js b/packages/code-export-python-pytest/src/hook.js index 2848eb0fc2..47a2a703c5 100644 --- a/packages/code-export-python-pytest/src/hook.js +++ b/packages/code-export-python-pytest/src/hook.js @@ -107,6 +107,11 @@ function declareDependencies() { level: 0, statement: 'from selenium.webdriver.common.by import By', }, + { + level: 0, + statement: + 'from selenium.webdriver.common.action_chains import ActionChains', + }, ], }, } From 04acf3ca15eeaf1da3aee47fde4e7c6176fc58fc Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Thu, 6 Jun 2019 10:50:49 +0300 Subject: [PATCH 13/99] Added more commands to emitting --- .../__test__/src/command.spec.js | 48 +++-- .../code-export-python-pytest/src/command.js | 191 +++++++++--------- 2 files changed, 113 insertions(+), 126 deletions(-) diff --git a/packages/code-export-python-pytest/__test__/src/command.spec.js b/packages/code-export-python-pytest/__test__/src/command.spec.js index fdf38d13b1..9461a6fba6 100644 --- a/packages/code-export-python-pytest/__test__/src/command.spec.js +++ b/packages/code-export-python-pytest/__test__/src/command.spec.js @@ -101,14 +101,14 @@ describe('command code emitter', () => { `assert driver.switch_to.alert.text == "a confirmation"` ) }) - it.only('should emit `assert editable` command', () => { + it('should emit `assert editable` command', () => { const command = { command: 'assertEditable', target: 'id=text', value: '', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("text"));\n${commandPrefixPadding}Boolean isEditable = element.isEnabled() && element.getAttribute("readonly") == null;\n${commandPrefixPadding}assertTrue(isEditable);\n}` + `element = driver.find_element(By.ID, "text")\nis_editable = element.is_enabled() and element.get_attribute("readonly") == None\nassert is_editable is True` ) }) it('should emit `assert element present` command', () => { @@ -118,7 +118,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}List elements = driver.findElements(By.id("element"));\n${commandPrefixPadding}assert(elements.size() > 0);\n}` + `elements = driver.find_elements(By.ID, "element")\nassert len(elements) > 0` ) }) it('should emit `assert element not present` command', () => { @@ -128,7 +128,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}List elements = driver.findElements(By.id("element"));\n${commandPrefixPadding}assert(elements.size() == 0);\n}` + `elements = driver.find_elements(By.ID, "element")\nassert len(elements) == 0` ) }) it('should emit `assert not checked` command', () => { @@ -138,7 +138,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `assertFalse(driver.findElement(By.id("check")).isSelected());` + `assert driver.find_element(By.ID, "check").is_selected() is False` ) }) it('should emit `assert not editable` command', () => { @@ -148,7 +148,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("text"));\n${commandPrefixPadding}Boolean isEditable = element.isEnabled() && element.getAttribute("readonly") == null;\n${commandPrefixPadding}assertFalse(isEditable);\n}` + `element = driver.find_element(By.ID, "text")\nis_editable = element.is_enabled() and element.get_attribute("readonly") == None\nassert is_editable is False` ) }) it('should emit `assert not selected value` command', () => { @@ -158,7 +158,7 @@ describe('command code emitter', () => { value: 'test', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}String value = driver.findElement(By.id("select")).getAttribute("value");\n${commandPrefixPadding}assertThat(value, is(not("test")));\n}` + `value = driver.find_element(By.ID, "select").get_attribute("value")\nassert value != "test"` ) }) it('should emit `assert not text` command', () => { @@ -168,7 +168,7 @@ describe('command code emitter', () => { value: 'text', } return expect(prettify(command)).resolves.toBe( - `assertThat(driver.findElement(By.id("test")).getText(), is(not("text")));` + `text = driver.find_element(By.ID, "test").text\nassert text != "text"` ) }) it('should emit `assert prompt` command', () => { @@ -178,7 +178,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `assertThat(driver.switchTo().alert().getText(), is("a prompt"));` + `assert driver.switch_to.alert.text == "a prompt"` ) }) it("should emit 'assert selected label' command", () => { @@ -188,7 +188,7 @@ describe('command code emitter', () => { value: 'test', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("test"));\n${commandPrefixPadding}String value = element.getAttribute("value");\n${commandPrefixPadding}String locator = String.format("option[@value='%s']", value);\n${commandPrefixPadding}String selectedText = element.findElement(By.xpath(locator)).getText();\n${commandPrefixPadding}assertThat(selectedText, is("test"));\n}` + `element = driver.find_element(By.ID, "test")\nlocator = "option[@value='{}']".format(element.get_attribute("value"))\nselected_text = element.find_element(By.XPATH(locator)).text\nassert selected_text == "test"` ) }) it('should emit `assert selected value` command', () => { @@ -198,7 +198,7 @@ describe('command code emitter', () => { value: 'test', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}String value = driver.findElement(By.id("select")).getAttribute("value");\n${commandPrefixPadding}assertThat(value, is("test"));\n}` + `value = driver.find_element(By.ID, "select").get_attribute("value")\nassert value == "test"` ) }) it('should emit `assert text` command', () => { @@ -208,9 +208,7 @@ describe('command code emitter', () => { value: 'some text that should be here', } expect(prettify(command)).resolves.toBe( - `assertThat(driver.findElement(By.id("test")).getText(), is("${ - command.value - }"));` + `assert driver.find_element(By.ID, "test").text == "some text that should be here"` ) }) it('should emit `assert title` command', () => { @@ -220,7 +218,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `assertThat(driver.getTitle(), is("example title"));` + `assert driver.title == "example title"` ) }) it('should emit `assert value` command', () => { @@ -230,7 +228,7 @@ describe('command code emitter', () => { value: 'test', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}String value = driver.findElement(By.id("select")).getAttribute("value");\n${commandPrefixPadding}assertThat(value, is("test"));\n}` + `value = driver.find_element(By.ID, "select").get_attribute("value")\nassert value == "test"` ) }) it('should emit `click` command', () => { @@ -240,7 +238,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - 'driver.findElement(By.linkText("button")).click();' + `driver.find_element(By.LINK_TEXT, "button").click()` ) }) it('should emit `click at` command', () => { @@ -250,7 +248,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - 'driver.findElement(By.linkText("button")).click();' + `driver.find_element(By.LINK_TEXT, "button").click()` ) }) it('should emit `check` command', () => { @@ -260,7 +258,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("f"));\n${commandPrefixPadding}if (!element.isSelected()) {\n${commandPrefixPadding}${commandPrefixPadding}element.click();\n${commandPrefixPadding}}\n}` + `element = driver.find_element(By.ID, "f")\nif element.is_selected() != True:\n${commandPrefixPadding}element.click()\n` ) }) it('should emit `close` command', () => { @@ -269,7 +267,7 @@ describe('command code emitter', () => { target: '', value: '', } - return expect(prettify(command)).resolves.toBe(`driver.close();`) + return expect(prettify(command)).resolves.toBe(`driver.close()`) }) it('should emit `do` command', () => { const command = { @@ -278,7 +276,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: 'do {', + body: 'condition = True\nwhile condition:', endingLevel: 1, }) }) @@ -289,7 +287,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.linkText("button"));\n${commandPrefixPadding}Actions builder = new Actions(driver);\n${commandPrefixPadding}builder.doubleClick(element).perform();\n}` + `element = driver.find_element(By.LINK_TEXT, "button")\nactions = ActionChains(driver)\nactions.double_click(element).perform()` ) }) it('should emit `double click at` command', () => { @@ -299,7 +297,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.linkText("button"));\n${commandPrefixPadding}Actions builder = new Actions(driver);\n${commandPrefixPadding}builder.doubleClick(element).perform();\n}` + `element = driver.find_element(By.LINK_TEXT, "button")\nactions = ActionChains(driver)\nactions.double_click(element).perform()` ) }) it('should emit `drag and drop to object` command', () => { @@ -309,10 +307,10 @@ describe('command code emitter', () => { value: 'link=dropped', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement dragged = driver.findElement(By.linkText("dragged"));\n${commandPrefixPadding}WebElement dropped = driver.findElement(By.linkText("dropped"));\n${commandPrefixPadding}Actions builder = new Actions(driver);\n${commandPrefixPadding}builder.dragAndDrop(dragged, dropped).perform();\n}` + `dragged = driver.find_element(By.LINK_TEXT, "dragged")\ndropped = driver.find_element(By.LINK_TEXT, "dropped")\nactions = ActionChains(driver)\nactions.drag_and_drop(dragged, dropped).perform()` ) }) - it('should emit `echo` command', () => { + it.only('should emit `echo` command', () => { const command = { command: 'echo', target: 'blah', diff --git a/packages/code-export-python-pytest/src/command.js b/packages/code-export-python-pytest/src/command.js index 555f92a8f2..3c8f2acdba 100644 --- a/packages/code-export-python-pytest/src/command.js +++ b/packages/code-export-python-pytest/src/command.js @@ -35,7 +35,7 @@ export const emitters = { assertNotText: emitVerifyNotText, assertPrompt: emitAssertAlert, assertSelectedLabel: emitVerifySelectedLabel, - assertSelectedValue: emitVerifySelectedValue, + assertSelectedValue: emitVerifyValue, assertValue: emitVerifyValue, assertText: emitVerifyText, assertTitle: emitVerifyTitle, @@ -102,7 +102,7 @@ export const emitters = { verifyNotSelectedValue: emitVerifyNotSelectedValue, verifyNotText: emitVerifyNotText, verifySelectedLabel: emitVerifySelectedLabel, - verifySelectedValue: emitVerifySelectedValue, + verifySelectedValue: emitVerifyValue, verifyText: emitVerifyText, verifyTitle: emitVerifyTitle, verifyValue: emitVerifyValue, @@ -201,17 +201,15 @@ function emitAnswerOnNextPrompt(textToSend) { async function emitCheck(locator) { const commands = [ - { level: 0, statement: '{' }, { - level: 1, - statement: `WebElement element = driver.findElement(${await location.emit( + level: 0, + statement: `element = driver.find_element(${await location.emit( locator - )});`, + )})`, }, - { level: 1, statement: 'if (!element.isSelected()) {' }, - { level: 2, statement: 'element.click();' }, - { level: 1, statement: '}' }, - { level: 0, statement: '}' }, + { level: 0, statement: 'if element.is_selected() != True:' }, + { level: 1, statement: 'element.click()' }, + { level: 0, statement: '' }, ] return Promise.resolve({ commands }) } @@ -226,12 +224,12 @@ function emitChooseOkOnNextConfirmation() { async function emitClick(target) { return Promise.resolve( - `driver.findElement(${await location.emit(target)}).click();` + `driver.find_element(${await location.emit(target)}).click()` ) } async function emitClose() { - return Promise.resolve(`driver.close();`) + return Promise.resolve(`driver.close()`) } function generateExpressionScript(script) { @@ -243,7 +241,10 @@ function generateExpressionScript(script) { function emitControlFlowDo() { return Promise.resolve({ - commands: [{ level: 0, statement: 'do {' }], + commands: [ + { level: 0, statement: 'condition = True' }, + { level: 0, statement: 'while condition:' }, + ], endingLevelAdjustment: 1, }) } @@ -332,42 +333,42 @@ function emitControlFlowWhile(script) { async function emitDoubleClick(target) { const commands = [ - { level: 0, statement: '{' }, { - level: 1, - statement: `WebElement element = driver.findElement(${await location.emit( + level: 0, + statement: `element = driver.find_element(${await location.emit( target - )});`, + )})`, }, - { level: 1, statement: 'Actions builder = new Actions(driver);' }, - { level: 1, statement: 'builder.doubleClick(element).perform();' }, - { level: 0, statement: '}' }, + { level: 0, statement: 'actions = ActionChains(driver)' }, + { level: 0, statement: 'actions.double_click(element).perform()' }, ] return Promise.resolve({ commands }) } async function emitDragAndDrop(dragged, dropped) { const commands = [ - { level: 0, statement: '{' }, { - level: 1, - statement: `WebElement dragged = driver.findElement(${await location.emit( + level: 0, + statement: `dragged = driver.find_element(${await location.emit( dragged - )});`, + )})`, }, { - level: 1, - statement: `WebElement dropped = driver.findElement(${await location.emit( + level: 0, + statement: `dropped = driver.find_element(${await location.emit( dropped - )});`, + )})`, + }, + { level: 0, statement: 'actions = ActionChains(driver)' }, + { + level: 0, + statement: 'actions.drag_and_drop(dragged, dropped).perform()', }, - { level: 1, statement: 'Actions builder = new Actions(driver);' }, - { level: 1, statement: 'builder.dragAndDrop(dragged, dropped).perform();' }, - { level: 0, statement: '}' }, ] return Promise.resolve({ commands }) } +// HERE async function emitEcho(message) { const _message = message.startsWith('vars.get') ? message : `"${message}"` return Promise.resolve(`System.out.println(${_message});`) @@ -741,165 +742,153 @@ async function emitVerifyChecked(locator) { async function emitVerifyEditable(locator) { const commands = [ - { level: 0, statement: '{' }, { - level: 1, - statement: `WebElement element = driver.findElement(${await location.emit( + level: 0, + statement: `element = driver.find_element(${await location.emit( locator - )});`, + )})`, }, { - level: 1, + level: 0, statement: - 'Boolean isEditable = element.isEnabled() && element.getAttribute("readonly") == null;', + 'is_editable = element.is_enabled() and element.get_attribute("readonly") == None', }, - { level: 1, statement: 'assertTrue(isEditable);' }, - { level: 0, statement: '}' }, + { level: 0, statement: 'assert is_editable is True' }, ] return Promise.resolve({ commands }) } async function emitVerifyElementPresent(locator) { const commands = [ - { level: 0, statement: '{' }, { - level: 1, - statement: `List elements = driver.findElements(${await location.emit( + level: 0, + statement: `elements = driver.find_elements(${await location.emit( locator - )});`, + )})`, }, - { level: 1, statement: 'assert(elements.size() > 0);' }, - { level: 0, statement: '}' }, + { level: 0, statement: 'assert len(elements) > 0' }, ] return Promise.resolve({ commands }) } async function emitVerifyElementNotPresent(locator) { const commands = [ - { level: 0, statement: '{' }, { - level: 1, - statement: `List elements = driver.findElements(${await location.emit( + level: 0, + statement: `elements = driver.find_elements(${await location.emit( locator - )});`, + )})`, }, - { level: 1, statement: 'assert(elements.size() == 0);' }, - { level: 0, statement: '}' }, + { level: 0, statement: 'assert len(elements) == 0' }, ] return Promise.resolve({ commands }) } async function emitVerifyNotChecked(locator) { return Promise.resolve( - `assertFalse(driver.findElement(${await location.emit( + `assert driver.find_element(${await location.emit( locator - )}).isSelected());` + )}).is_selected() is False` ) } async function emitVerifyNotEditable(locator) { const commands = [ - { level: 0, statement: '{' }, { - level: 1, - statement: `WebElement element = driver.findElement(${await location.emit( + level: 0, + statement: `element = driver.find_element(${await location.emit( locator - )});`, + )})`, }, { - level: 1, + level: 0, statement: - 'Boolean isEditable = element.isEnabled() && element.getAttribute("readonly") == null;', + 'is_editable = element.is_enabled() and element.get_attribute("readonly") == None', }, - { level: 1, statement: 'assertFalse(isEditable);' }, - { level: 0, statement: '}' }, + { level: 0, statement: 'assert is_editable is False' }, ] return Promise.resolve({ commands }) } async function emitVerifyNotSelectedValue(locator, expectedValue) { const commands = [ - { level: 0, statement: '{' }, { - level: 1, - statement: `String value = driver.findElement(${await location.emit( + level: 0, + statement: `value = driver.find_element(${await location.emit( locator - )}).getAttribute("value");`, + )}).get_attribute("value")`, }, { - level: 1, - statement: `assertThat(value, is(not("${exporter.emit.text( - expectedValue - )}")));`, + level: 0, + statement: `assert value != "${exporter.emit.text(expectedValue)}"`, }, - { level: 0, statement: '}' }, ] return Promise.resolve({ commands }) } async function emitVerifyNotText(locator, text) { - const result = `driver.findElement(${await location.emit(locator)}).getText()` - return Promise.resolve( - `assertThat(${result}, is(not("${exporter.emit.text(text)}")));` - ) + const commands = [ + { + level: 0, + statement: `text = driver.find_element(${await location.emit( + locator + )}).text`, + }, + { level: 0, statement: `assert text != "${exporter.emit.text(text)}"` }, + ] + return Promise.resolve({ commands }) } async function emitVerifySelectedLabel(locator, labelValue) { const commands = [ - { level: 0, statement: '{' }, { - level: 1, - statement: `WebElement element = driver.findElement(${await location.emit( + level: 0, + statement: `element = driver.find_element(${await location.emit( locator - )});`, + )})`, }, - { level: 1, statement: 'String value = element.getAttribute("value");' }, { - level: 1, - statement: `String locator = String.format("option[@value='%s']", value);`, + level: 0, + statement: `locator = "option[@value='{}']".format(element.get_attribute("value"))`, }, { - level: 1, - statement: - 'String selectedText = element.findElement(By.xpath(locator)).getText();', + level: 0, + statement: 'selected_text = element.find_element(By.XPATH(locator)).text', }, - { level: 1, statement: `assertThat(selectedText, is("${labelValue}"));` }, - { level: 0, statement: '}' }, + { level: 0, statement: `assert selected_text == "${labelValue}"` }, ] return Promise.resolve({ commands, }) } -async function emitVerifySelectedValue(locator, value) { - return emitVerifyValue(locator, value) -} - async function emitVerifyText(locator, text) { - return Promise.resolve( - `assertThat(driver.findElement(${await location.emit( - locator - )}).getText(), is("${exporter.emit.text(text)}"));` - ) + const commands = [ + { + level: 0, + statement: `assert driver.find_element(${await location.emit( + locator + )}).text == "${exporter.emit.text(text)}"`, + }, + ] + return Promise.resolve({ commands }) } async function emitVerifyValue(locator, value) { const commands = [ - { level: 0, statement: '{' }, { - level: 1, - statement: `String value = driver.findElement(${await location.emit( + level: 0, + statement: `value = driver.find_element(${await location.emit( locator - )}).getAttribute("value");`, + )}).get_attribute("value")`, }, - { level: 1, statement: `assertThat(value, is("${value}"));` }, - { level: 0, statement: '}' }, + { level: 0, statement: `assert value == "${value}"` }, ] return Promise.resolve({ commands }) } async function emitVerifyTitle(title) { - return Promise.resolve(`assertThat(driver.getTitle(), is("${title}"));`) + return Promise.resolve(`assert driver.title == "${title}"`) } async function emitWaitForElementEditable(locator, timeout) { From f8f33e7084ffc44fb565ce0d2e0188400a1b00da Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Thu, 6 Jun 2019 16:25:27 +0300 Subject: [PATCH 14/99] Implemented more command emitters --- .../__test__/src/command.spec.js | 144 +++++------ .../code-export-python-pytest/src/command.js | 241 +++++++----------- .../code-export-python-pytest/src/hook.js | 7 + 3 files changed, 173 insertions(+), 219 deletions(-) diff --git a/packages/code-export-python-pytest/__test__/src/command.spec.js b/packages/code-export-python-pytest/__test__/src/command.spec.js index 9461a6fba6..dbac85c4f5 100644 --- a/packages/code-export-python-pytest/__test__/src/command.spec.js +++ b/packages/code-export-python-pytest/__test__/src/command.spec.js @@ -310,15 +310,13 @@ describe('command code emitter', () => { `dragged = driver.find_element(By.LINK_TEXT, "dragged")\ndropped = driver.find_element(By.LINK_TEXT, "dropped")\nactions = ActionChains(driver)\nactions.drag_and_drop(dragged, dropped).perform()` ) }) - it.only('should emit `echo` command', () => { + it('should emit `echo` command', () => { const command = { command: 'echo', target: 'blah', value: '', } - return expect(prettify(command)).resolves.toBe( - `System.out.println("blah");` - ) + return expect(prettify(command)).resolves.toBe(`print(str("blah"))`) }) it('should emit `echo` command with variables', () => { const command = { @@ -326,9 +324,7 @@ describe('command code emitter', () => { target: '${blah}', value: '', } - return expect(prettify(command)).resolves.toBe( - `System.out.println(vars.get("blah").toString());` - ) + return expect(prettify(command)).resolves.toBe(`print(str(vars["blah"]))`) }) it('should emit `edit content` command', () => { const command = { @@ -337,7 +333,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("contentEditable"));\n${commandPrefixPadding}js.executeScript("if(arguments[0].contentEditable === 'true') {arguments[0].innerText = ''}", element);\n}` + `element = driver.find_element(By.ID, "contentEditable")\ndriver.execute_script("if(arguments[0].contentEditable === 'true') {arguments[0].innerText = ''}", element)` ) }) it('should emit `else` command', () => { @@ -347,7 +343,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: `} else {`, + body: `else:`, endingLevel: 1, }) }) @@ -358,7 +354,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: `} else if ((Boolean) js.executeScript("return (true)")) {`, + body: `elif driver.execute_script("return (true)"):`, endingLevel: 1, }) }) @@ -369,7 +365,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: `}`, + body: ``, endingLevel: 0, }) }) @@ -380,7 +376,7 @@ describe('command code emitter', () => { value: 'myVar', } return expect(prettify(command)).resolves.toBe( - `vars.put("myVar", js.executeScript("javascript"));` + `vars["myVar"] = driver.execute_script("javascript")` ) }) it('should emit `execute script` command with return string value', () => { @@ -390,7 +386,7 @@ describe('command code emitter', () => { value: 'myVar', } return expect(prettify(command)).resolves.toBe( - `vars.put("myVar", js.executeScript("return 'a'"));` + `vars["myVar"] = driver.execute_script("return 'a'")` ) }) it('should emit `execute async script` command', () => { @@ -400,7 +396,7 @@ describe('command code emitter', () => { value: 'myVar', } return expect(prettify(command)).resolves.toBe( - `vars.put("myVar", js.executeAsyncScript("var callback = arguments[arguments.length - 1];javascript.then(callback).catch(callback);"));` + `vars["myVar"] = driver.execute_async_script("var callback = arguments[arguments.length - 1];javascript.then(callback).catch(callback);")` ) }) it('should emit `forEach` command', () => { @@ -410,7 +406,7 @@ describe('command code emitter', () => { value: 'iteratorVar', } return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: `ArrayList collection = (ArrayList) vars.get("collection");\nfor (int i = 0; i < collection.size() - 1; i++) {\n${commandPrefixPadding}vars.put("iteratorVar", collection.get(i));`, + body: `collection = vars["collection"]\nfor entry in collection\n${commandPrefixPadding}vars["iteratorVar"] = entry`, endingLevel: 1, }) }) @@ -421,7 +417,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: `if ((Boolean) js.executeScript("return (true)")) {`, + body: `if driver.execute_script("return (true)"):`, endingLevel: 1, }) }) @@ -432,7 +428,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("button"));\n${commandPrefixPadding}Action builder = new Actions(driver);\n${commandPrefixPadding}builder.moveToElement(element).clickAndHold().perform();\n}` + `element = driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).click_and_hold().perform()` ) }) it('should emit `mouse down at` event', () => { @@ -442,7 +438,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("button"));\n${commandPrefixPadding}Action builder = new Actions(driver);\n${commandPrefixPadding}builder.moveToElement(element).clickAndHold().perform();\n}` + `element = driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).click_and_hold().perform()` ) }) it('should emit `mouse move` event', () => { @@ -452,7 +448,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("button"));\n${commandPrefixPadding}Action builder = new Actions(driver);\n${commandPrefixPadding}builder.moveToElement(element).perform();\n}` + `element = driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).perform()` ) }) it('should emit `mouse move at` event', () => { @@ -462,7 +458,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("button"));\n${commandPrefixPadding}Action builder = new Actions(driver);\n${commandPrefixPadding}builder.moveToElement(element).perform();\n}` + `element = driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).perform()` ) }) it('should emit `mouse out` event', () => { @@ -472,7 +468,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.tagName("body"));\n${commandPrefixPadding}Action builder = new Actions(driver);\n${commandPrefixPadding}builder.moveToElement(element, 0, 0).perform();\n}` + `element = driver.find_element(By.CSS_SELECTOR, "body")\nactions = ActionChains(driver)\nactions.move_to_element(element, 0, 0).perform()` ) }) it('should emit `mouse over` event', () => { @@ -482,7 +478,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("button"));\n${commandPrefixPadding}Action builder = new Actions(driver);\n${commandPrefixPadding}builder.moveToElement(element).perform();\n}` + `element = driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).perform()` ) }) it('should emit `mouse up` event', () => { @@ -492,7 +488,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("button"));\n${commandPrefixPadding}Action builder = new Actions(driver);\n${commandPrefixPadding}builder.moveToElement(element).release().perform();\n}` + `element = driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).release().perform()` ) }) it('should emit `mouse up at` event', () => { @@ -502,7 +498,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("button"));\n${commandPrefixPadding}Action builder = new Actions(driver);\n${commandPrefixPadding}builder.moveToElement(element).release().perform();\n}` + `element = driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).release().perform()` ) }) it('should emit `open` with absolute url', () => { @@ -512,7 +508,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `driver.get("${command.target}");` + `driver.get("${command.target}")` ) }) it('should emit `pause` command', () => { @@ -521,9 +517,7 @@ describe('command code emitter', () => { target: '300', value: '', } - return expect(prettify(command)).resolves.toBe( - `try {\n${commandPrefixPadding}Thread.sleep(300);\n} catch (InterruptedException e) {\n${commandPrefixPadding}e.printStackTrace();\n}` - ) + return expect(prettify(command)).resolves.toBe(`time.sleep(300)`) }) it('should emit `remove selection` command', () => { const command = { @@ -532,7 +526,7 @@ describe('command code emitter', () => { value: 'label=A label', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement dropdown = driver.findElement(By.cssSelector("select"));\n${commandPrefixPadding}dropdown.findElement(By.xpath("//option[. = 'A label']")).click();\n}` + `dropdown = driver.find_element(By.CSS_SELECTOR, "select")\ndropdown.findElement(By.XPATH, "//option[. = 'A label']").click()` ) }) it('should emit `repeatIf` command', () => { @@ -542,7 +536,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `} while ((Boolean) js.executeScript("return (true)"));` + `condition = driver.execute_script("return (true)")` ) }) it('should emit `run` command', () => { @@ -551,7 +545,7 @@ describe('command code emitter', () => { target: 'some test case', value: '', } - return expect(prettify(command)).resolves.toBe(`sometestcase();`) + return expect(prettify(command)).resolves.toBe(`sometestcase()`) }) it('should emit `run script` command', () => { const command = { @@ -560,7 +554,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `js.executeScript("alert('test');alert('Im annoying');");` + `driver.execute_script("alert('test');alert('Im annoying');")` ) }) it('should emit `select` command', () => { @@ -570,7 +564,7 @@ describe('command code emitter', () => { value: 'label=A label', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement dropdown = driver.findElement(By.cssSelector("select"));\n${commandPrefixPadding}dropdown.findElement(By.xpath("//option[. = 'A label']")).click();\n}` + `dropdown = driver.find_element(By.CSS_SELECTOR, "select")\ndropdown.findElement(By.XPATH, "//option[. = 'A label']").click()` ) }) it('should emit `select frame` to select the top frame', () => { @@ -580,7 +574,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - 'driver.switchTo().defaultContent();' + `driver.switch_to.default_content()` ) }) it('should fail to emit `select window` by using unknown locator', () => { @@ -600,7 +594,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `driver.switchTo().window(vars.get("window").toString());` + `driver.switch_to.window(vars["window"])` ) }) it('should emit `select window` to select a window by name', () => { @@ -610,7 +604,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `driver.switchTo().window("window");` + `driver.switch_to.window("window")` ) }) it('should emit `select window` to select a window by the local keyword', () => { @@ -620,7 +614,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}ArrayList handles = new ArrayList(driver.getWindowHandles());\n${commandPrefixPadding}driver.switchTo().window(handles.get(0));\n}` + `driver.switch_to.window(driver.window_handles[0])` ) }) it('should emit `select window` to select a window by implicit index', () => { @@ -630,7 +624,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}ArrayList handles = new ArrayList(driver.getWindowHandles());\n${commandPrefixPadding}driver.switchTo().window(handles.get(12));\n}` + `driver.switch_to.window(driver.window_handles[12])` ) }) it('should emit `send keys` command', () => { @@ -640,7 +634,7 @@ describe('command code emitter', () => { value: 'example input', } return expect(prettify(command)).resolves.toBe( - `driver.findElement(By.id("input")).sendKeys("${command.value}");` + `driver.find_element(By.ID, "input").send_keys("example input")` ) }) it('should emit `send keys` command with a variable input', () => { @@ -650,7 +644,7 @@ describe('command code emitter', () => { value: '${blah}', } return expect(prettify(command)).resolves.toBe( - `driver.findElement(By.id("input")).sendKeys(vars.get("blah").toString());` + `driver.find_element(By.ID, "input").send_keys(vars["blah"])` ) }) it('should emit `send keys` command with a key press', () => { @@ -660,12 +654,12 @@ describe('command code emitter', () => { value: 'SuperSecretPassword!${KEY_ENTER}', } return expect(prettify(command)).resolves.toBe( - `driver.findElement(By.id("input")).sendKeys("SuperSecretPassword!", Keys.ENTER);` + `driver.find_element(By.ID, "input").send_keys("SuperSecretPassword!", Keys.ENTER)` ) }) it('should emit `set speed`', () => { expect(prettify({ command: 'setSpeed' })).resolves.toBe( - `System.out.println("\`set speed\` is a no-op in code export, use \`pause\` instead");` + 'print("`set speed` is a no-op in code export, use `pause` instead")' ) }) it('should emit `setWindowSize`', () => { @@ -675,7 +669,7 @@ describe('command code emitter', () => { value: '', } expect(prettify(command)).resolves.toBe( - `driver.manage().window().setSize(new Dimension(1440, 1177));` + `driver.set_window_size(1440, 1177)` ) }) it('should skip playback supported commands, that are not supported in webdriver', () => { @@ -699,7 +693,7 @@ describe('command code emitter', () => { value: 'myVar', } return expect(prettify(command)).resolves.toBe( - `vars.put("myVar", "some value");` + `vars["myVar"] = "some value"` ) }) it('should emit `store attribute` command', () => { @@ -709,7 +703,7 @@ describe('command code emitter', () => { value: 'myVar', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.xpath("button[3]"));\n${commandPrefixPadding}String attribute = element.getAttribute("id");\n${commandPrefixPadding}vars.put("myVar", attribute);\n}` + `attribute = driver.find_element(By.XPATH, "button[3]").get_attribute("id")\nvars["myVar"] = attribute` ) }) it('should emit `store text` command', () => { @@ -719,16 +713,18 @@ describe('command code emitter', () => { value: 'myVar', } return expect(prettify(command)).resolves.toBe( - `vars.put("myVar", driver.findElement(By.id("someElement")).getText());` + `vars["myVar"] = driver.find_element(By.ID, "someElement").text` ) }) - it.skip('should emit `store json` command', () => { + it('should emit `store json` command', () => { const command = { command: 'storeJson', target: '[{"a":0}]', value: 'myVar', } - return expect(prettify(command)).resolves.toBe('') + return expect(prettify(command)).resolves.toBe( + `vars["myVar"] = json.loads([{"a":0}])` + ) }) it('should emit `store title` command', () => { const command = { @@ -737,7 +733,7 @@ describe('command code emitter', () => { value: 'myVar', } return expect(prettify(command)).resolves.toBe( - `vars.put("myVar", driver.getTitle());` + `vars["myVar"] = driver.title` ) }) it('should emit `store value` command', () => { @@ -747,7 +743,7 @@ describe('command code emitter', () => { value: 'myVar', } return expect(prettify(command)).resolves.toBe( - `vars.put("myVar", driver.findElement(By.id("someElement")).getAttribute("value"));` + `vars["myVar"] = driver.find_element(By.ID, "someElement").get_attribute("value")` ) }) it('should emit `store window handle` command', () => { @@ -757,7 +753,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `vars.put("windowName", driver.getWindowHandle());` + `vars["windowName"] = driver.current_window_handle` ) }) it('should emit `store xpath count` command', () => { @@ -767,7 +763,7 @@ describe('command code emitter', () => { value: 'myVar', } return expect(prettify(command)).resolves.toBe( - `vars.put("myVar", driver.findElements(By.xpath("button")).size());` + `vars["myVar"] = len(driver.find_elements(By.XPATH, "button"))` ) }) it('should emit `submit` command', () => { @@ -777,7 +773,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `throw new Error("\`submit\` is not a supported command in Selenium WebDriver. Please re-record the step in the IDE.");` + `raise Exception("\`submit\` is not a supported command in Selenium WebDriver. Please re-record the step in the IDE.")` ) }) it('should emit `times` command', () => { @@ -787,9 +783,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: `Integer times = ${ - command.target - };\nfor(int i = 0; i < times; i++) {`, + body: `for i in range(1, 5):`, endingLevel: 1, }) }) @@ -800,7 +794,7 @@ describe('command code emitter', () => { value: 'example input', } expect(prettify(command)).resolves.toBe( - `driver.findElement(By.id("input")).sendKeys("${command.value}");` + `driver.find_element(By.ID, "input").send_keys("example input")` ) }) it('should emit `uncheck` command', () => { @@ -810,7 +804,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("f"));\n${commandPrefixPadding}if (element.isSelected()) {\n${commandPrefixPadding}${commandPrefixPadding}element.click();\n${commandPrefixPadding}}\n}` + `element = driver.find_element(By.ID, "f")\nif element.is_selected: element.click()` ) }) it('should emit `verify` command', () => { @@ -820,9 +814,7 @@ describe('command code emitter', () => { value: 'blah', } expect(prettify(command)).resolves.toBe( - `assertEquals(vars.get("${command.target}").toString(), "${ - command.value - }");` + `assert(vars["varrrName"] == "blah")` ) }) it('should emit `verify checked` command', () => { @@ -832,7 +824,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `assertTrue(driver.findElement(By.id("check")).isSelected());` + `assert driver.find_element(By.ID, "check").isSelected() is True` ) }) it('should emit `verify editable` command', () => { @@ -842,7 +834,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("text"));\n${commandPrefixPadding}Boolean isEditable = element.isEnabled() && element.getAttribute("readonly") == null;\n${commandPrefixPadding}assertTrue(isEditable);\n}` + `element = driver.find_element(By.ID, "text")\nis_editable = element.is_enabled() and element.get_attribute("readonly") == None\nassert is_editable is True` ) }) it('should emit `verify element present` command', () => { @@ -852,7 +844,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}List elements = driver.findElements(By.id("element"));\n${commandPrefixPadding}assert(elements.size() > 0);\n}` + `elements = driver.find_elements(By.ID, "element")\nassert len(elements) > 0` ) }) it('should emit `verify element not present` command', () => { @@ -862,7 +854,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}List elements = driver.findElements(By.id("element"));\n${commandPrefixPadding}assert(elements.size() == 0);\n}` + `elements = driver.find_elements(By.ID, "element")\nassert len(elements) == 0` ) }) it('should emit `verify not checked` command', () => { @@ -872,7 +864,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `assertFalse(driver.findElement(By.id("check")).isSelected());` + `assert driver.find_element(By.ID, "check").is_selected() is False` ) }) it('should emit `verify not editable` command', () => { @@ -882,7 +874,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("text"));\n${commandPrefixPadding}Boolean isEditable = element.isEnabled() && element.getAttribute("readonly") == null;\n${commandPrefixPadding}assertFalse(isEditable);\n}` + `element = driver.find_element(By.ID, "text")\nis_editable = element.is_enabled() and element.get_attribute("readonly") == None\nassert is_editable is False` ) }) it('should emit `verify not selected value` command', () => { @@ -892,7 +884,7 @@ describe('command code emitter', () => { value: 'test', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}String value = driver.findElement(By.id("select")).getAttribute("value");\n${commandPrefixPadding}assertThat(value, is(not("test")));\n}` + `value = driver.find_element(By.ID, "select").get_attribute("value")\nassert value != "test"` ) }) it('should emit `verify not text` command', () => { @@ -902,7 +894,7 @@ describe('command code emitter', () => { value: 'text', } return expect(prettify(command)).resolves.toBe( - `assertThat(driver.findElement(By.id("test")).getText(), is(not("text")));` + `text = driver.find_element(By.ID, "test").text\nassert text != "text"` ) }) it("should emit 'verify selected label' command", () => { @@ -912,7 +904,7 @@ describe('command code emitter', () => { value: 'test', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("test"));\n${commandPrefixPadding}String value = element.getAttribute("value");\n${commandPrefixPadding}String locator = String.format("option[@value='%s']", value);\n${commandPrefixPadding}String selectedText = element.findElement(By.xpath(locator)).getText();\n${commandPrefixPadding}assertThat(selectedText, is("test"));\n}` + `element = driver.find_element(By.ID, "test")\nlocator = "option[@value='{}']".format(element.get_attribute("value"))\nselected_text = element.find_element(By.XPATH(locator)).text\nassert selected_text == "test"` ) }) it('should emit `verify value` command', () => { @@ -922,7 +914,7 @@ describe('command code emitter', () => { value: 'test', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}String value = driver.findElement(By.id("select")).getAttribute("value");\n${commandPrefixPadding}assertThat(value, is("test"));\n}` + `value = driver.find_element(By.ID, "select").get_attribute("value")\nassert value == "test"` ) }) it('should emit `verify selected value` command', () => { @@ -932,7 +924,7 @@ describe('command code emitter', () => { value: 'test', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}String value = driver.findElement(By.id("select")).getAttribute("value");\n${commandPrefixPadding}assertThat(value, is("test"));\n}` + `value = driver.find_element(By.ID, "select").get_attribute("value")\nassert value == "test"` ) }) it('should emit `verify text` command', () => { @@ -942,9 +934,7 @@ describe('command code emitter', () => { value: 'some text that should be here', } expect(prettify(command)).resolves.toBe( - `assertThat(driver.findElement(By.id("test")).getText(), is("${ - command.value - }"));` + `assert driver.find_element(By.ID, "test").text == "some text that should be here"` ) }) it('should emit `verify title` command', () => { @@ -954,10 +944,10 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `assertThat(driver.getTitle(), is("example title"));` + `assert driver.title == "example title"` ) }) - it('should emit `waitForElementEditable` command', () => { + it.only('should emit `waitForElementEditable` command', () => { const command = { command: 'waitForElementEditable', target: 'css=#blah', diff --git a/packages/code-export-python-pytest/src/command.js b/packages/code-export-python-pytest/src/command.js index 3c8f2acdba..839b66a9ce 100644 --- a/packages/code-export-python-pytest/src/command.js +++ b/packages/code-export-python-pytest/src/command.js @@ -82,7 +82,7 @@ export const emitters = { setWindowSize: emitSetWindowSize, store: emitStore, storeAttribute: emitStoreAttribute, - //storeJson: emitStoreJson, + storeJson: emitStoreJson, storeText: emitStoreText, storeTitle: emitStoreTitle, storeValue: emitStoreValue, @@ -137,11 +137,11 @@ function canEmit(commandName) { } function variableLookup(varName) { - return `vars.get("${varName}").toString()` + return `vars["${varName}"]` } function variableSetter(varName, value) { - return varName ? `vars.put("${varName}", ${value});` : '' + return varName ? `vars["${varName}"] = ${value}` : '' } function emitWaitForWindow() { @@ -234,11 +234,17 @@ async function emitClose() { function generateExpressionScript(script) { const scriptString = script.script.replace(/"/g, "'") - return `(Boolean) js.executeScript("return (${scriptString})"${generateScriptArguments( + return `driver.execute_script("return (${scriptString})"${generateScriptArguments( script )})` } +function generateScriptArguments(script) { + return `${script.argv.length ? ', ' : ''}${script.argv + .map(varName => `vars.["${varName}"]`) + .join(',')}` +} + function emitControlFlowDo() { return Promise.resolve({ commands: [ @@ -251,7 +257,7 @@ function emitControlFlowDo() { function emitControlFlowElse() { return Promise.resolve({ - commands: [{ level: 0, statement: '} else {' }], + commands: [{ level: 0, statement: 'else:' }], startingLevelAdjustment: -1, endingLevelAdjustment: +1, }) @@ -262,7 +268,7 @@ function emitControlFlowElseIf(script) { commands: [ { level: 0, - statement: `} else if (${generateExpressionScript(script)}) {`, + statement: `elif ${generateExpressionScript(script)}:`, }, ], startingLevelAdjustment: -1, @@ -272,7 +278,7 @@ function emitControlFlowElseIf(script) { function emitControlFlowEnd() { return Promise.resolve({ - commands: [{ level: 0, statement: `}` }], + commands: [{ level: 0, statement: `` }], startingLevelAdjustment: -1, }) } @@ -280,7 +286,7 @@ function emitControlFlowEnd() { function emitControlFlowIf(script) { return Promise.resolve({ commands: [ - { level: 0, statement: `if (${generateExpressionScript(script)}) {` }, + { level: 0, statement: `if ${generateExpressionScript(script)}:` }, ], endingLevelAdjustment: 1, }) @@ -291,15 +297,15 @@ function emitControlFlowForEach(collectionVarName, iteratorVarName) { commands: [ { level: 0, - statement: `ArrayList collection = (ArrayList) vars.get("${collectionVarName}");`, + statement: `collection = vars["${collectionVarName}"]`, }, { level: 0, - statement: `for (int i = 0; i < collection.size() - 1; i++) {`, + statement: `for entry in collection`, }, { level: 1, - statement: `vars.put("${iteratorVarName}", collection.get(i));`, + statement: `vars["${iteratorVarName}"] = entry`, }, ], }) @@ -308,17 +314,17 @@ function emitControlFlowForEach(collectionVarName, iteratorVarName) { function emitControlFlowRepeatIf(script) { return Promise.resolve({ commands: [ - { level: 0, statement: `} while (${generateExpressionScript(script)});` }, + { + level: 0, + statement: `condition = ${generateExpressionScript(script)}`, + }, ], startingLevelAdjustment: -1, }) } function emitControlFlowTimes(target) { - const commands = [ - { level: 0, statement: `Integer times = ${target};` }, - { level: 0, statement: 'for(int i = 0; i < times; i++) {' }, - ] + const commands = [{ level: 0, statement: `for i in range(1, ${target}):` }] return Promise.resolve({ commands, endingLevelAdjustment: 1 }) } @@ -368,115 +374,98 @@ async function emitDragAndDrop(dragged, dropped) { return Promise.resolve({ commands }) } -// HERE async function emitEcho(message) { - const _message = message.startsWith('vars.get') ? message : `"${message}"` - return Promise.resolve(`System.out.println(${_message});`) + const _message = message.startsWith('vars[') ? message : `"${message}"` + return Promise.resolve(`print(str(${_message}))`) } async function emitEditContent(locator, content) { const commands = [ - { level: 0, statement: '{' }, { - level: 1, - statement: `WebElement element = driver.findElement(${await location.emit( + level: 0, + statement: `element = driver.find_element(${await location.emit( locator - )});`, + )})`, }, { - level: 1, - statement: `js.executeScript("if(arguments[0].contentEditable === 'true') {arguments[0].innerText = '${content}'}", element);`, + level: 0, + statement: `driver.execute_script("if(arguments[0].contentEditable === 'true') {arguments[0].innerText = '${content}'}", element)`, }, - { level: 0, statement: '}' }, ] return Promise.resolve({ commands }) } async function emitExecuteScript(script, varName) { const scriptString = script.script.replace(/"/g, "'") - const result = `js.executeScript("${scriptString}"${generateScriptArguments( + const result = `driver.execute_script("${scriptString}"${generateScriptArguments( script )})` return Promise.resolve(variableSetter(varName, result)) } async function emitExecuteAsyncScript(script, varName) { - const result = `js.executeAsyncScript("var callback = arguments[arguments.length - 1];${ + const result = `driver.execute_async_script("var callback = arguments[arguments.length - 1];${ script.script }.then(callback).catch(callback);${generateScriptArguments(script)}")` return Promise.resolve(variableSetter(varName, result)) } -function generateScriptArguments(script) { - return `${script.argv.length ? ', ' : ''}${script.argv - .map(varName => `vars.get("${varName}")`) - .join(',')}` -} - async function emitMouseDown(locator) { const commands = [ - { level: 0, statement: '{' }, { - level: 1, - statement: `WebElement element = driver.findElement(${await location.emit( + level: 0, + statement: `element = driver.find_element(${await location.emit( locator - )});`, + )})`, }, - { level: 1, statement: 'Action builder = new Actions(driver);' }, + { level: 0, statement: 'actions = ActionChains(driver)' }, { - level: 1, - statement: 'builder.moveToElement(element).clickAndHold().perform();', + level: 0, + statement: 'actions.move_to_element(element).click_and_hold().perform()', }, - { level: 0, statement: '}' }, ] return Promise.resolve({ commands }) } async function emitMouseMove(locator) { const commands = [ - { level: 0, statement: '{' }, { - level: 1, - statement: `WebElement element = driver.findElement(${await location.emit( + level: 0, + statement: `element = driver.find_element(${await location.emit( locator - )});`, + )})`, }, - { level: 1, statement: 'Action builder = new Actions(driver);' }, - { level: 1, statement: 'builder.moveToElement(element).perform();' }, - { level: 0, statement: '}' }, + { level: 0, statement: 'actions = ActionChains(driver)' }, + { level: 0, statement: 'actions.move_to_element(element).perform()' }, ] return Promise.resolve({ commands }) } async function emitMouseOut() { const commands = [ - { level: 0, statement: '{' }, { - level: 1, - statement: `WebElement element = driver.findElement(By.tagName("body"));`, + level: 0, + statement: `element = driver.find_element(By.CSS_SELECTOR, "body")`, }, - { level: 1, statement: 'Action builder = new Actions(driver);' }, - { level: 1, statement: 'builder.moveToElement(element, 0, 0).perform();' }, - { level: 0, statement: '}' }, + { level: 0, statement: 'actions = ActionChains(driver)' }, + { level: 0, statement: 'actions.move_to_element(element, 0, 0).perform()' }, ] return Promise.resolve({ commands }) } async function emitMouseUp(locator) { const commands = [ - { level: 0, statement: '{' }, { - level: 1, - statement: `WebElement element = driver.findElement(${await location.emit( + level: 0, + statement: `element = driver.find_element(${await location.emit( locator - )});`, + )})`, }, - { level: 1, statement: 'Action builder = new Actions(driver);' }, + { level: 0, statement: 'actions = ActionChains(driver)' }, { - level: 1, - statement: 'builder.moveToElement(element).release().perform();', + level: 0, + statement: 'actions.move_to_element(element).release().perform()', }, - { level: 0, statement: '}' }, ] return Promise.resolve({ commands }) } @@ -485,35 +474,29 @@ function emitOpen(target) { const url = /^(file|http|https):\/\//.test(target) ? `"${target}"` : `"${global.baseUrl}${target}"` - return Promise.resolve(`driver.get(${url});`) + return Promise.resolve(`driver.get(${url})`) } async function emitPause(time) { - const commands = [ - { level: 0, statement: 'try {' }, - { level: 1, statement: `Thread.sleep(${time});` }, - { level: 0, statement: '} catch (InterruptedException e) {' }, - { level: 1, statement: 'e.printStackTrace();' }, - { level: 0, statement: '}' }, - ] + const commands = [{ level: 0, statement: `time.sleep(${time})` }] return Promise.resolve({ commands }) } async function emitRun(testName) { - return Promise.resolve(`${exporter.parsers.sanitizeName(testName)}();`) + return Promise.resolve(`${exporter.parsers.sanitizeName(testName)}()`) } async function emitRunScript(script) { return Promise.resolve( - `js.executeScript("${script.script}${generateScriptArguments(script)}");` + `driver.execute_script("${script.script}${generateScriptArguments( + script + )}")` ) } async function emitSetWindowSize(size) { const [width, height] = size.split('x') - return Promise.resolve( - `driver.manage().window().setSize(new Dimension(${width}, ${height}));` - ) + return Promise.resolve(`driver.set_window_size(${width}, ${height})`) } async function emitSelect(selectElement, option) { @@ -536,25 +519,21 @@ async function emitSelect(selectElement, option) { async function emitSelectFrame(frameLocation) { if (frameLocation === 'relative=top' || frameLocation === 'relative=parent') { - return Promise.resolve('driver.switchTo().defaultContent();') + return Promise.resolve('driver.switch_to.default_content()') } else if (/^index=/.test(frameLocation)) { return Promise.resolve( - `driver.switchTo().frame(${Math.floor( - frameLocation.split('index=')[1] - )});` + `driver.switch_to.frame(${Math.floor(frameLocation.split('index=')[1])})` ) } else { return Promise.resolve({ commands: [ - { level: 0, statement: '{' }, { - level: 1, - statement: `WebElement element = driver.findElement(${await location.emit( + level: 0, + statement: `element = driver.find_element(${await location.emit( frameLocation - )});`, + )})`, }, - { level: 1, statement: 'driver.switchTo().frame(element);' }, - { level: 0, statement: '}' }, + { level: 0, statement: 'driver.switch_to.frame(element)' }, ], }) } @@ -563,41 +542,30 @@ async function emitSelectFrame(frameLocation) { async function emitSelectWindow(windowLocation) { if (/^handle=/.test(windowLocation)) { return Promise.resolve( - `driver.switchTo().window(${windowLocation.split('handle=')[1]});` + `driver.switch_to.window(${windowLocation.split('handle=')[1]})` ) } else if (/^name=/.test(windowLocation)) { return Promise.resolve( - `driver.switchTo().window("${windowLocation.split('name=')[1]}");` + `driver.switch_to.window("${windowLocation.split('name=')[1]}")` ) } else if (/^win_ser_/.test(windowLocation)) { if (windowLocation === 'win_ser_local') { return Promise.resolve({ commands: [ - { level: 0, statement: '{' }, { - level: 1, - statement: - 'ArrayList handles = new ArrayList(driver.getWindowHandles());', + level: 0, + statement: 'driver.switch_to.window(driver.window_handles[0])', }, - { level: 1, statement: 'driver.switchTo().window(handles.get(0));' }, - { level: 0, statement: '}' }, ], }) } else { const index = parseInt(windowLocation.substr('win_ser_'.length)) return Promise.resolve({ commands: [ - { level: 0, statement: '{' }, - { - level: 1, - statement: - 'ArrayList handles = new ArrayList(driver.getWindowHandles());', - }, { - level: 1, - statement: `driver.switchTo().window(handles.get(${index}));`, + level: 0, + statement: `driver.switch_to.window(driver.window_handles[${index}])`, }, - { level: 0, statement: '}' }, ], }) } @@ -612,7 +580,7 @@ function generateSendKeysInput(value) { if (typeof value === 'object') { return value .map(s => { - if (s.startsWith('vars.get')) { + if (s.startsWith('vars[')) { return s } else if (s.startsWith('Key[')) { const key = s.match(/\['(.*)'\]/)[1] @@ -623,7 +591,7 @@ function generateSendKeysInput(value) { }) .join(', ') } else { - if (value.startsWith('vars.get')) { + if (value.startsWith('vars[')) { return value } else { return `"${value}"` @@ -633,15 +601,15 @@ function generateSendKeysInput(value) { async function emitSendKeys(target, value) { return Promise.resolve( - `driver.findElement(${await location.emit( + `driver.find_element(${await location.emit( target - )}).sendKeys(${generateSendKeysInput(value)});` + )}).send_keys(${generateSendKeysInput(value)})` ) } function emitSetSpeed() { return Promise.resolve( - `System.out.println("\`set speed\` is a no-op in code export, use \`pause\` instead");` + 'print("`set speed` is a no-op in code export, use `pause` instead")' ) } @@ -654,80 +622,71 @@ async function emitStoreAttribute(locator, varName) { const elementLocator = locator.slice(0, attributePos) const attributeName = locator.slice(attributePos + 1) const commands = [ - { level: 0, statement: '{' }, { - level: 1, - statement: `WebElement element = driver.findElement(${await location.emit( + level: 0, + statement: `attribute = driver.find_element(${await location.emit( elementLocator - )});`, - }, - { - level: 1, - statement: `String attribute = element.getAttribute("${attributeName}");`, + )}).get_attribute("${attributeName}")`, }, - { level: 1, statement: `${variableSetter(varName, 'attribute')}` }, - { level: 0, statement: '}' }, + { level: 0, statement: `${variableSetter(varName, 'attribute')}` }, ] return Promise.resolve({ commands }) } -async function emitStoreJson(_json, _varName) { - // TODO - return Promise.resolve('') +async function emitStoreJson(json, varName) { + return Promise.resolve(variableSetter(varName, `json.loads(${json})`)) } async function emitStoreText(locator, varName) { - const result = `driver.findElement(${await location.emit(locator)}).getText()` + const result = `driver.find_element(${await location.emit(locator)}).text` return Promise.resolve(variableSetter(varName, result)) } async function emitStoreTitle(_, varName) { - return Promise.resolve(variableSetter(varName, 'driver.getTitle()')) + return Promise.resolve(variableSetter(varName, 'driver.title')) } async function emitStoreValue(locator, varName) { - const result = `driver.findElement(${await location.emit( + const result = `driver.find_element(${await location.emit( locator - )}).getAttribute("value")` + )}).get_attribute("value")` return Promise.resolve(variableSetter(varName, result)) } async function emitStoreWindowHandle(varName) { - return Promise.resolve(variableSetter(varName, 'driver.getWindowHandle()')) + return Promise.resolve( + variableSetter(varName, 'driver.current_window_handle') + ) } async function emitStoreXpathCount(locator, varName) { - const result = `driver.findElements(${await location.emit(locator)}).size()` + const result = `len(driver.find_elements(${await location.emit(locator)}))` return Promise.resolve(variableSetter(varName, result)) } async function emitSubmit(_locator) { return Promise.resolve( - `throw new Error("\`submit\` is not a supported command in Selenium WebDriver. Please re-record the step in the IDE.");` + `raise Exception("\`submit\` is not a supported command in Selenium WebDriver. Please re-record the step in the IDE.")` ) } async function emitType(target, value) { return Promise.resolve( - `driver.findElement(${await location.emit( + `driver.find_element(${await location.emit( target - )}).sendKeys(${generateSendKeysInput(value)});` + )}).send_keys(${generateSendKeysInput(value)})` ) } async function emitUncheck(locator) { const commands = [ - { level: 0, statement: '{' }, { - level: 1, - statement: `WebElement element = driver.findElement(${await location.emit( + level: 0, + statement: `element = driver.find_element(${await location.emit( locator - )});`, + )})`, }, - { level: 1, statement: 'if (element.isSelected()) {' }, - { level: 2, statement: 'element.click();' }, - { level: 1, statement: '}' }, - { level: 0, statement: '}' }, + { level: 0, statement: 'if element.is_selected: element.click()' }, ] return Promise.resolve({ commands }) } @@ -893,20 +852,18 @@ async function emitVerifyTitle(title) { async function emitWaitForElementEditable(locator, timeout) { const commands = [ - { level: 0, statement: '{' }, { - level: 1, + level: 0, statement: `WebDriverWait wait = new WebDriverWait(driver, ${Math.floor( timeout / 1000 )});`, }, { - level: 1, + level: 0, statement: `wait.until(ExpectedConditions.elementToBeClickable(${await location.emit( locator )}));`, }, - { level: 0, statement: '}' }, ] return Promise.resolve({ commands }) } diff --git a/packages/code-export-python-pytest/src/hook.js b/packages/code-export-python-pytest/src/hook.js index 47a2a703c5..940e260336 100644 --- a/packages/code-export-python-pytest/src/hook.js +++ b/packages/code-export-python-pytest/src/hook.js @@ -102,6 +102,8 @@ function declareDependencies() { startingSyntax: { commands: [ { level: 0, statement: 'import pytest' }, + { level: 0, statement: 'import time' }, + { level: 0, statement: 'import json' }, { level: 0, statement: 'from selenium import webdriver' }, { level: 0, @@ -112,6 +114,11 @@ function declareDependencies() { statement: 'from selenium.webdriver.common.action_chains import ActionChains', }, + { + level: 0, + statement: + 'from selenium.webdriver.support import expected_conditions', + }, ], }, } From 42a84ead898ef3238b128a8ed5a552ff742316f6 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Thu, 6 Jun 2019 16:26:48 +0300 Subject: [PATCH 15/99] Upgraded babel deps for code-export-python-pytest to fix the log trace output issue that was clogging up test run output --- packages/code-export-python-pytest/.babelrc | 4 +- .../code-export-python-pytest/package.json | 6 +- packages/code-export-python-pytest/yarn.lock | 1846 ++++++++--------- 3 files changed, 901 insertions(+), 955 deletions(-) diff --git a/packages/code-export-python-pytest/.babelrc b/packages/code-export-python-pytest/.babelrc index f781122745..bd80a8410e 100644 --- a/packages/code-export-python-pytest/.babelrc +++ b/packages/code-export-python-pytest/.babelrc @@ -1,6 +1,6 @@ { "presets": [ - ["env", + ["@babel/preset-env", { "targets": { "node": "8" @@ -8,6 +8,6 @@ }] ], "plugins": [ - "transform-object-rest-spread", + "@babel/plugin-proposal-object-rest-spread" ] } diff --git a/packages/code-export-python-pytest/package.json b/packages/code-export-python-pytest/package.json index df5fc80e64..a62f00e230 100644 --- a/packages/code-export-python-pytest/package.json +++ b/packages/code-export-python-pytest/package.json @@ -16,9 +16,9 @@ }, "main": "dist/index.js", "devDependencies": { - "babel-cli": "^6.26.0", - "babel-plugin-transform-object-rest-spread": "^6.26.0", - "babel-preset-env": "^1.7.0" + "@babel/cli": "^7.4.4", + "@babel/plugin-proposal-object-rest-spread": "^7.4.4", + "@babel/preset-env": "^7.4.5" }, "dependencies": { "code-export-utils": "^3.8.1" diff --git a/packages/code-export-python-pytest/yarn.lock b/packages/code-export-python-pytest/yarn.lock index 5334fd4a55..cf080930cd 100644 --- a/packages/code-export-python-pytest/yarn.lock +++ b/packages/code-export-python-pytest/yarn.lock @@ -2,6 +2,610 @@ # yarn lockfile v1 +"@babel/cli@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.4.4.tgz#5454bb7112f29026a4069d8e6f0e1794e651966c" + integrity sha512-XGr5YjQSjgTa6OzQZY57FAJsdeVSAKR/u/KA5exWIz66IKtv/zXtHy+fIZcMry/EgYegwuHE7vzGnrFhjdIAsQ== + dependencies: + commander "^2.8.1" + convert-source-map "^1.1.0" + fs-readdir-recursive "^1.1.0" + glob "^7.0.0" + lodash "^4.17.11" + mkdirp "^0.5.1" + output-file-sync "^2.0.0" + slash "^2.0.0" + source-map "^0.5.0" + optionalDependencies: + chokidar "^2.0.4" + +"@babel/code-frame@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" + integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== + dependencies: + "@babel/highlight" "^7.0.0" + +"@babel/generator@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.4.tgz#174a215eb843fc392c7edcaabeaa873de6e8f041" + integrity sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ== + dependencies: + "@babel/types" "^7.4.4" + jsesc "^2.5.1" + lodash "^4.17.11" + source-map "^0.5.0" + trim-right "^1.0.1" + +"@babel/helper-annotate-as-pure@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" + integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" + integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-call-delegate@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz#87c1f8ca19ad552a736a7a27b1c1fcf8b1ff1f43" + integrity sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ== + dependencies: + "@babel/helper-hoist-variables" "^7.4.4" + "@babel/traverse" "^7.4.4" + "@babel/types" "^7.4.4" + +"@babel/helper-define-map@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.4.4.tgz#6969d1f570b46bdc900d1eba8e5d59c48ba2c12a" + integrity sha512-IX3Ln8gLhZpSuqHJSnTNBWGDE9kdkTEWl21A/K7PQ00tseBwbqCHTvNLHSBd9M0R5rER4h5Rsvj9vw0R5SieBg== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/types" "^7.4.4" + lodash "^4.17.11" + +"@babel/helper-explode-assignable-expression@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" + integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== + dependencies: + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-function-name@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" + integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== + dependencies: + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-get-function-arity@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" + integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-hoist-variables@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz#0298b5f25c8c09c53102d52ac4a98f773eb2850a" + integrity sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w== + dependencies: + "@babel/types" "^7.4.4" + +"@babel/helper-member-expression-to-functions@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz#8cd14b0a0df7ff00f009e7d7a436945f47c7a16f" + integrity sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-imports@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" + integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.4.4.tgz#96115ea42a2f139e619e98ed46df6019b94414b8" + integrity sha512-3Z1yp8TVQf+B4ynN7WoHPKS8EkdTbgAEy0nU0rs/1Kw4pDgmvYH3rz3aI11KgxKCba2cn7N+tqzV1mY2HMN96w== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/template" "^7.4.4" + "@babel/types" "^7.4.4" + lodash "^4.17.11" + +"@babel/helper-optimise-call-expression@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" + integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-plugin-utils@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" + integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== + +"@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.4.4.tgz#a47e02bc91fb259d2e6727c2a30013e3ac13c4a2" + integrity sha512-Y5nuB/kESmR3tKjU8Nkn1wMGEx1tjJX076HBMeL3XLQCu6vA/YRzuTW0bbb+qRnXvQGn+d6Rx953yffl8vEy7Q== + dependencies: + lodash "^4.17.11" + +"@babel/helper-remap-async-to-generator@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" + integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-wrap-function" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-replace-supers@^7.1.0", "@babel/helper-replace-supers@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.4.4.tgz#aee41783ebe4f2d3ab3ae775e1cc6f1a90cefa27" + integrity sha512-04xGEnd+s01nY1l15EuMS1rfKktNF+1CkKmHoErDppjAAZL+IUBZpzT748x262HF7fibaQPhbvWUl5HeSt1EXg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/traverse" "^7.4.4" + "@babel/types" "^7.4.4" + +"@babel/helper-simple-access@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" + integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== + dependencies: + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-split-export-declaration@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677" + integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q== + dependencies: + "@babel/types" "^7.4.4" + +"@babel/helper-wrap-function@^7.1.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" + integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.2.0" + +"@babel/highlight@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" + integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.4.4", "@babel/parser@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.5.tgz#04af8d5d5a2b044a2a1bffacc1e5e6673544e872" + integrity sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew== + +"@babel/plugin-proposal-async-generator-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" + integrity sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + "@babel/plugin-syntax-async-generators" "^7.2.0" + +"@babel/plugin-proposal-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" + integrity sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + +"@babel/plugin-proposal-object-rest-spread@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.4.tgz#1ef173fcf24b3e2df92a678f027673b55e7e3005" + integrity sha512-dMBG6cSPBbHeEBdFXeQ2QLc5gUpg4Vkaz8octD4aoW/ISO+jBOcsuxYL7bsb5WSu8RLP6boxrBIALEHgoHtO9g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" + integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + +"@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz#501ffd9826c0b91da22690720722ac7cb1ca9c78" + integrity sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.5.4" + +"@babel/plugin-syntax-async-generators@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f" + integrity sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" + integrity sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-object-rest-spread@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" + integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" + integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-arrow-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" + integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-async-to-generator@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.4.4.tgz#a3f1d01f2f21cadab20b33a82133116f14fb5894" + integrity sha512-YiqW2Li8TXmzgbXw+STsSqPBPFnGviiaSp6CYOq55X8GQ2SGVLrXB6pNid8HkqkZAzOH6knbai3snhP7v0fNwA== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + +"@babel/plugin-transform-block-scoped-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" + integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-block-scoping@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.4.tgz#c13279fabf6b916661531841a23c4b7dae29646d" + integrity sha512-jkTUyWZcTrwxu5DD4rWz6rDB5Cjdmgz6z7M7RLXOJyCUkFBawssDGcGh8M/0FTSB87avyJI1HsTwUXp9nKA1PA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + lodash "^4.17.11" + +"@babel/plugin-transform-classes@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.4.tgz#0ce4094cdafd709721076d3b9c38ad31ca715eb6" + integrity sha512-/e44eFLImEGIpL9qPxSRat13I5QNRgBLu2hOQJCF7VLy/otSM/sypV1+XaIw5+502RX/+6YaSAPmldk+nhHDPw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-define-map" "^7.4.4" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.4.4" + "@babel/helper-split-export-declaration" "^7.4.4" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" + integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-destructuring@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.4.tgz#9d964717829cc9e4b601fc82a26a71a4d8faf20f" + integrity sha512-/aOx+nW0w8eHiEHm+BTERB2oJn5D127iye/SUQl7NjHy0lf+j7h4MKMMSOwdazGq9OxgiNADncE+SRJkCxjZpQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz#361a148bc951444312c69446d76ed1ea8e4450c3" + integrity sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.5.4" + +"@babel/plugin-transform-duplicate-keys@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz#d952c4930f312a4dbfff18f0b2914e60c35530b3" + integrity sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-exponentiation-operator@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" + integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-for-of@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz#0267fc735e24c808ba173866c6c4d1440fc3c556" + integrity sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-function-name@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz#e1436116abb0610c2259094848754ac5230922ad" + integrity sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" + integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-member-expression-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz#fa10aa5c58a2cb6afcf2c9ffa8cb4d8b3d489a2d" + integrity sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-amd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz#82a9bce45b95441f617a24011dc89d12da7f4ee6" + integrity sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-commonjs@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.4.tgz#0bef4713d30f1d78c2e59b3d6db40e60192cac1e" + integrity sha512-4sfBOJt58sEo9a2BQXnZq+Q3ZTSAUXyK3E30o36BOGnJ+tvJ6YSxF0PG6kERvbeISgProodWuI9UVG3/FMY6iw== + dependencies: + "@babel/helper-module-transforms" "^7.4.4" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + +"@babel/plugin-transform-modules-systemjs@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.4.4.tgz#dc83c5665b07d6c2a7b224c00ac63659ea36a405" + integrity sha512-MSiModfILQc3/oqnG7NrP1jHaSPryO6tA2kOMmAQApz5dayPxWiHqmq4sWH2xF5LcQK56LlbKByCd8Aah/OIkQ== + dependencies: + "@babel/helper-hoist-variables" "^7.4.4" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-umd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae" + integrity sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz#9d269fd28a370258199b4294736813a60bbdd106" + integrity sha512-z7+2IsWafTBbjNsOxU/Iv5CvTJlr5w4+HGu1HovKYTtgJ362f7kBcQglkfmlspKKZ3bgrbSGvLfNx++ZJgCWsg== + dependencies: + regexp-tree "^0.1.6" + +"@babel/plugin-transform-new-target@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz#18d120438b0cc9ee95a47f2c72bc9768fbed60a5" + integrity sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-object-super@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz#b35d4c10f56bab5d650047dad0f1d8e8814b6598" + integrity sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.1.0" + +"@babel/plugin-transform-parameters@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz#7556cf03f318bd2719fe4c922d2d808be5571e16" + integrity sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw== + dependencies: + "@babel/helper-call-delegate" "^7.4.4" + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-property-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz#03e33f653f5b25c4eb572c98b9485055b389e905" + integrity sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-regenerator@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz#629dc82512c55cee01341fb27bdfcb210354680f" + integrity sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA== + dependencies: + regenerator-transform "^0.14.0" + +"@babel/plugin-transform-reserved-words@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz#4792af87c998a49367597d07fedf02636d2e1634" + integrity sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-shorthand-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" + integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-spread@^7.2.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz#3103a9abe22f742b6d406ecd3cd49b774919b406" + integrity sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-sticky-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" + integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + +"@babel/plugin-transform-template-literals@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz#9d28fea7bbce637fb7612a0750989d8321d4bcb0" + integrity sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-typeof-symbol@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2" + integrity sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-unicode-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz#ab4634bb4f14d36728bf5978322b35587787970f" + integrity sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.5.4" + +"@babel/preset-env@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.4.5.tgz#2fad7f62983d5af563b5f3139242755884998a58" + integrity sha512-f2yNVXM+FsR5V8UwcFeIHzHWgnhXg3NpRmy0ADvALpnhB0SLbCvrCRr4BLOUYbQNLS+Z0Yer46x9dJXpXewI7w== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-async-generator-functions" "^7.2.0" + "@babel/plugin-proposal-json-strings" "^7.2.0" + "@babel/plugin-proposal-object-rest-spread" "^7.4.4" + "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-syntax-async-generators" "^7.2.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + "@babel/plugin-transform-arrow-functions" "^7.2.0" + "@babel/plugin-transform-async-to-generator" "^7.4.4" + "@babel/plugin-transform-block-scoped-functions" "^7.2.0" + "@babel/plugin-transform-block-scoping" "^7.4.4" + "@babel/plugin-transform-classes" "^7.4.4" + "@babel/plugin-transform-computed-properties" "^7.2.0" + "@babel/plugin-transform-destructuring" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/plugin-transform-duplicate-keys" "^7.2.0" + "@babel/plugin-transform-exponentiation-operator" "^7.2.0" + "@babel/plugin-transform-for-of" "^7.4.4" + "@babel/plugin-transform-function-name" "^7.4.4" + "@babel/plugin-transform-literals" "^7.2.0" + "@babel/plugin-transform-member-expression-literals" "^7.2.0" + "@babel/plugin-transform-modules-amd" "^7.2.0" + "@babel/plugin-transform-modules-commonjs" "^7.4.4" + "@babel/plugin-transform-modules-systemjs" "^7.4.4" + "@babel/plugin-transform-modules-umd" "^7.2.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.4.5" + "@babel/plugin-transform-new-target" "^7.4.4" + "@babel/plugin-transform-object-super" "^7.2.0" + "@babel/plugin-transform-parameters" "^7.4.4" + "@babel/plugin-transform-property-literals" "^7.2.0" + "@babel/plugin-transform-regenerator" "^7.4.5" + "@babel/plugin-transform-reserved-words" "^7.2.0" + "@babel/plugin-transform-shorthand-properties" "^7.2.0" + "@babel/plugin-transform-spread" "^7.2.0" + "@babel/plugin-transform-sticky-regex" "^7.2.0" + "@babel/plugin-transform-template-literals" "^7.4.4" + "@babel/plugin-transform-typeof-symbol" "^7.2.0" + "@babel/plugin-transform-unicode-regex" "^7.4.4" + "@babel/types" "^7.4.4" + browserslist "^4.6.0" + core-js-compat "^3.1.1" + invariant "^2.2.2" + js-levenshtein "^1.1.3" + semver "^5.5.0" + +"@babel/template@^7.1.0", "@babel/template@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.4.tgz#f4b88d1225689a08f5bc3a17483545be9e4ed237" + integrity sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.4.4" + "@babel/types" "^7.4.4" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.4": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.5.tgz#4e92d1728fd2f1897dafdd321efbff92156c3216" + integrity sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.4.4" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/parser" "^7.4.5" + "@babel/types" "^7.4.4" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.11" + +"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.4.tgz#8db9e9a629bb7c29370009b4b779ed93fe57d5f0" + integrity sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ== + dependencies: + esutils "^2.0.2" + lodash "^4.17.11" + to-fast-properties "^2.0.0" + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -17,18 +621,20 @@ ansi-regex@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" -anymatch@^1.3.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" - integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA== +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== dependencies: - micromatch "^2.1.5" - normalize-path "^2.0.0" + micromatch "^3.1.4" + normalize-path "^2.1.1" aproba@^1.0.3: version "1.2.0" @@ -43,19 +649,12 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.6" -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= - dependencies: - arr-flatten "^1.0.1" - arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= -arr-flatten@^1.0.1, arr-flatten@^1.1.0: +arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== @@ -65,11 +664,6 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= -array-unique@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= - array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" @@ -80,571 +674,16 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= -async-each@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.2.tgz#8b8a7ca2a658f927e9f307d6d1a42f4199f0f735" - integrity sha512-6xrbvN0MOBKSJDdonmSSz2OwFSgxRaVtBDes26mj9KIGtDo+g9xosFRSC+i1gQh2oAN/tQ62AI/pGZGQjVOiRg== +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== atob@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -babel-cli@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.26.0.tgz#502ab54874d7db88ad00b887a06383ce03d002f1" - integrity sha1-UCq1SHTX24itALiHoGODzgPQAvE= - dependencies: - babel-core "^6.26.0" - babel-polyfill "^6.26.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - commander "^2.11.0" - convert-source-map "^1.5.0" - fs-readdir-recursive "^1.0.0" - glob "^7.1.2" - lodash "^4.17.4" - output-file-sync "^1.1.2" - path-is-absolute "^1.0.1" - slash "^1.0.0" - source-map "^0.5.6" - v8flags "^2.1.1" - optionalDependencies: - chokidar "^1.6.1" - -babel-code-frame@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= - dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - -babel-core@^6.26.0: - version "6.26.3" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" - integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== - dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.1" - debug "^2.6.9" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.8" - slash "^1.0.0" - source-map "^0.5.7" - -babel-generator@^6.26.0: - version "6.26.1" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" - integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.17.4" - source-map "^0.5.7" - trim-right "^1.0.1" - -babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" - integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ= - dependencies: - babel-helper-explode-assignable-expression "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-call-delegate@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" - integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-define-map@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" - integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-explode-assignable-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" - integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo= - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-function-name@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" - integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= - dependencies: - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-get-function-arity@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" - integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-hoist-variables@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" - integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-optimise-call-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" - integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-regex@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" - integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI= - dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-remap-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" - integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-replace-supers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" - integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo= - dependencies: - babel-helper-optimise-call-expression "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helpers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" - integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-check-es2015-constants@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" - integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-syntax-async-functions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" - integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= - -babel-plugin-syntax-exponentiation-operator@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" - integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= - -babel-plugin-syntax-object-rest-spread@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" - integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= - -babel-plugin-syntax-trailing-function-commas@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" - integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM= - -babel-plugin-transform-async-to-generator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" - integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E= - dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-functions "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-arrow-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" - integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" - integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoping@^6.23.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" - integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= - dependencies: - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-plugin-transform-es2015-classes@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" - integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs= - dependencies: - babel-helper-define-map "^6.24.1" - babel-helper-function-name "^6.24.1" - babel-helper-optimise-call-expression "^6.24.1" - babel-helper-replace-supers "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-computed-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" - integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM= - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-destructuring@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" - integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-duplicate-keys@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" - integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-for-of@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" - integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-function-name@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" - integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" - integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" - integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ= - dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: - version "6.26.2" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" - integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== - dependencies: - babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-types "^6.26.0" - -babel-plugin-transform-es2015-modules-systemjs@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" - integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM= - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-umd@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" - integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg= - dependencies: - babel-plugin-transform-es2015-modules-amd "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-object-super@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" - integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40= - dependencies: - babel-helper-replace-supers "^6.24.1" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-parameters@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" - integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= - dependencies: - babel-helper-call-delegate "^6.24.1" - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-shorthand-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" - integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-spread@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" - integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-sticky-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" - integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw= - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-template-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" - integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-typeof-symbol@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" - integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-unicode-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" - integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek= - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - regexpu-core "^2.0.0" - -babel-plugin-transform-exponentiation-operator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" - integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4= - dependencies: - babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" - babel-plugin-syntax-exponentiation-operator "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-object-rest-spread@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" - integrity sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY= - dependencies: - babel-plugin-syntax-object-rest-spread "^6.8.0" - babel-runtime "^6.26.0" - -babel-plugin-transform-regenerator@^6.22.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" - integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8= - dependencies: - regenerator-transform "^0.10.0" - -babel-plugin-transform-strict-mode@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" - integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-polyfill@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" - integrity sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM= - dependencies: - babel-runtime "^6.26.0" - core-js "^2.5.0" - regenerator-runtime "^0.10.5" - -babel-preset-env@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" - integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg== - dependencies: - babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-to-generator "^6.22.0" - babel-plugin-transform-es2015-arrow-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoping "^6.23.0" - babel-plugin-transform-es2015-classes "^6.23.0" - babel-plugin-transform-es2015-computed-properties "^6.22.0" - babel-plugin-transform-es2015-destructuring "^6.23.0" - babel-plugin-transform-es2015-duplicate-keys "^6.22.0" - babel-plugin-transform-es2015-for-of "^6.23.0" - babel-plugin-transform-es2015-function-name "^6.22.0" - babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.22.0" - babel-plugin-transform-es2015-modules-commonjs "^6.23.0" - babel-plugin-transform-es2015-modules-systemjs "^6.23.0" - babel-plugin-transform-es2015-modules-umd "^6.23.0" - babel-plugin-transform-es2015-object-super "^6.22.0" - babel-plugin-transform-es2015-parameters "^6.23.0" - babel-plugin-transform-es2015-shorthand-properties "^6.22.0" - babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.22.0" - babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.23.0" - babel-plugin-transform-es2015-unicode-regex "^6.22.0" - babel-plugin-transform-exponentiation-operator "^6.22.0" - babel-plugin-transform-regenerator "^6.22.0" - browserslist "^3.2.6" - invariant "^2.2.2" - semver "^5.3.0" - -babel-register@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" - integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= - dependencies: - babel-core "^6.26.0" - babel-runtime "^6.26.0" - core-js "^2.5.0" - home-or-tmp "^2.0.0" - lodash "^4.17.4" - mkdirp "^0.5.1" - source-map-support "^0.4.15" - -babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -babel-template@^6.24.1, babel-template@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= - dependencies: - babel-runtime "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - lodash "^4.17.4" - -babel-traverse@^6.24.1, babel-traverse@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= - dependencies: - babel-code-frame "^6.26.0" - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - debug "^2.6.8" - globals "^9.18.0" - invariant "^2.2.2" - lodash "^4.17.4" - -babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= - dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" - -babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== - balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" @@ -676,16 +715,7 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= - dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" - -braces@^2.3.1: +braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== @@ -701,13 +731,14 @@ braces@^2.3.1: split-string "^3.0.2" to-regex "^3.0.1" -browserslist@^3.2.6: - version "3.2.8" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" - integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== +browserslist@^4.6.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.6.1.tgz#ee5059b1aec18cbec9d055d6cb5e24ae50343a9b" + integrity sha512-1MC18ooMPRG2UuVFJTHFIAkk6mpByJfxCrnUyvSlu/hyQSFHMrlhM02SzNuCV+quTP4CKmqtOMAIjrifrpBJXQ== dependencies: - caniuse-lite "^1.0.30000844" - electron-to-chromium "^1.3.47" + caniuse-lite "^1.0.30000971" + electron-to-chromium "^1.3.137" + node-releases "^1.1.21" cache-base@^1.0.1: version "1.0.1" @@ -724,37 +755,38 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" -caniuse-lite@^1.0.30000844: - version "1.0.30000939" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000939.tgz#b9ab7ac9e861bf78840b80c5dfbc471a5cd7e679" - integrity sha512-oXB23ImDJOgQpGjRv1tCtzAvJr4/OvrHi5SO2vUgB0g0xpdZZoA/BxfImiWfdwoYdUTtQrPsXsvYU/dmCSM8gg== - -chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -chokidar@^1.6.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" - integrity sha1-eY5ol3gVHIB2tLNg5e3SjNortGg= - dependencies: - anymatch "^1.3.0" - async-each "^1.0.0" - glob-parent "^2.0.0" - inherits "^2.0.1" +caniuse-lite@^1.0.30000971: + version "1.0.30000974" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000974.tgz#b7afe14ee004e97ce6dc73e3f878290a12928ad8" + integrity sha512-xc3rkNS/Zc3CmpMKuczWEdY2sZgx09BkAxfvkxlAEBTqcMHeL8QnPqhKse+5sRTi3nrw2pJwToD2WvKn1Uhvww== + +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chokidar@^2.0.4: + version "2.1.6" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.6.tgz#b6cad653a929e244ce8a834244164d241fa954c5" + integrity sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" is-binary-path "^1.0.0" - is-glob "^2.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" path-is-absolute "^1.0.0" - readdirp "^2.0.0" + readdirp "^2.2.1" + upath "^1.1.1" optionalDependencies: - fsevents "^1.0.0" + fsevents "^1.2.7" chownr@^1.1.1: version "1.1.1" @@ -784,10 +816,22 @@ collection-visit@^1.0.0: map-visit "^1.0.0" object-visit "^1.0.0" -commander@^2.11.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" - integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +commander@^2.8.1: + version "2.20.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" + integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== component-emitter@^1.2.1: version "1.2.1" @@ -804,7 +848,7 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= -convert-source-map@^1.5.0, convert-source-map@^1.5.1: +convert-source-map@^1.1.0: version "1.6.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== @@ -816,23 +860,39 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-js@^2.4.0, core-js@^2.5.0: - version "2.6.5" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.5.tgz#44bc8d249e7fb2ff5d00e0341a7ffb94fbf67895" - integrity sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A== +core-js-compat@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.1.3.tgz#0cc3ba4c7f62928c2837e1cffbe8dc78b4f1ae14" + integrity sha512-EP018pVhgwsKHz3YoN1hTq49aRe+h017Kjz0NQz3nXV0cCRMvH3fLQl+vEPGr4r4J5sk4sU3tUC7U1aqTCeJeA== + dependencies: + browserslist "^4.6.0" + core-js-pure "3.1.3" + semver "^6.1.0" + +core-js-pure@3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.1.3.tgz#4c90752d5b9471f641514f3728f51c1e0783d0b5" + integrity sha512-k3JWTrcQBKqjkjI0bkfXS0lbpWPxYuHWfMMjC1VDmzU4Q58IwSbuXSo99YO/hUHlw/EB4AlfA2PVxOGkrIq6dA== core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: +debug@^2.1.2, debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" +debug@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" @@ -870,24 +930,17 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= - dependencies: - repeating "^2.0.0" - detect-libc@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= -electron-to-chromium@^1.3.47: - version "1.3.113" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.113.tgz#b1ccf619df7295aea17bc6951dc689632629e4a9" - integrity sha512-De+lPAxEcpxvqPTyZAXELNpRZXABRxf+uL/rSykstQhzj/B0l1150G/ExIIxKc16lI89Hgz81J0BHAcbTqK49g== +electron-to-chromium@^1.3.137: + version "1.3.148" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.148.tgz#5796c0d9eb0358d397163413b90bf376c5d8bf08" + integrity sha512-nuCOlXNlGMQmdzihIPGm2K3Yf3H1hke/1rK381i02pH8wNliJU9hVNnOi/xjmxt+mjABd/BzufP5nPHWKshLWA== -escape-string-regexp@^1.0.2: +escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= @@ -897,13 +950,6 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= - dependencies: - is-posix-bracket "^0.1.0" - expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" @@ -917,13 +963,6 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= - dependencies: - fill-range "^2.1.0" - extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -939,13 +978,6 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= - dependencies: - is-extglob "^1.0.0" - extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -960,22 +992,6 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -filename-regex@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" - integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= - -fill-range@^2.1.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" - integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== - dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^3.0.0" - repeat-element "^1.1.2" - repeat-string "^1.5.2" - fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -986,18 +1002,11 @@ fill-range@^4.0.0: repeat-string "^1.6.1" to-regex-range "^2.1.0" -for-in@^1.0.1, for-in@^1.0.2: +for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= -for-own@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= - dependencies: - for-in "^1.0.1" - fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" @@ -1012,7 +1021,7 @@ fs-minipass@^1.2.5: dependencies: minipass "^2.2.1" -fs-readdir-recursive@^1.0.0: +fs-readdir-recursive@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== @@ -1022,13 +1031,13 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.0.0: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.7.tgz#4851b664a3783e52003b3c66eb0eee1074933aa4" - integrity sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw== +fsevents@^1.2.7: + version "1.2.9" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" + integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== dependencies: - nan "^2.9.2" - node-pre-gyp "^0.10.0" + nan "^2.12.1" + node-pre-gyp "^0.12.0" gauge@~2.7.3: version "2.7.4" @@ -1049,22 +1058,27 @@ get-value@^2.0.3, get-value@^2.0.6: resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" + is-glob "^3.1.0" + path-dirname "^1.0.0" -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= +glob@^7.0.0: + version "7.1.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== dependencies: - is-glob "^2.0.0" + 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@^7.1.2, glob@^7.1.3: +glob@^7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== @@ -1076,22 +1090,20 @@ glob@^7.1.2, glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -globals@^9.18.0: - version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -graceful-fs@^4.1.11, graceful-fs@^4.1.4: +graceful-fs@^4.1.11: version "4.1.15" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= - dependencies: - ansi-regex "^2.0.0" +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= has-unicode@^2.0.0: version "2.0.1" @@ -1129,14 +1141,6 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" -home-or-tmp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" - integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.1" - iconv-lite@^0.4.4: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -1159,7 +1163,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@~2.0.3: +inherits@2, inherits@^2.0.3, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= @@ -1234,18 +1238,6 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-data-descriptor "^1.0.0" kind-of "^6.0.2" -is-dotfile@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= - -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= - dependencies: - is-primitive "^2.0.0" - is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -1258,17 +1250,10 @@ is-extendable@^1.0.1: dependencies: is-plain-object "^2.0.4" -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= - -is-finite@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" - integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= - dependencies: - number-is-nan "^1.0.0" +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= is-fullwidth-code-point@^1.0.0: version "1.0.0" @@ -1282,19 +1267,19 @@ is-fullwidth-code-point@^2.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= -is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= dependencies: - is-extglob "^1.0.0" + is-extglob "^2.1.0" -is-number@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= +is-glob@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== dependencies: - kind-of "^3.0.2" + is-extglob "^2.1.1" is-number@^3.0.0: version "3.0.0" @@ -1303,10 +1288,10 @@ is-number@^3.0.0: dependencies: kind-of "^3.0.2" -is-number@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" - integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== +is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" @@ -1315,16 +1300,6 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-posix-bracket@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= - -is-primitive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= - is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -1347,31 +1322,26 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= -"js-tokens@^3.0.0 || ^4.0.0": +js-levenshtein@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" + integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= - -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= -json5@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= - kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -1396,7 +1366,7 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== -lodash@^4.17.4: +lodash@^4.17.11: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== @@ -1420,31 +1390,7 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -math-random@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" - integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== - -micromatch@^2.1.5: - version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" - -micromatch@^3.1.10: +micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -1515,10 +1461,15 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -nan@^2.9.2: - version "2.13.1" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.1.tgz#a15bee3790bde247e8f38f1d446edcdaeb05f2dd" - integrity sha512-I6YB/YEuDeUZMmhscXKxGgZlFnhsn5y0hgOZBadkzfTRrZBtJDZeg6eQf7PYMIEclwmorTKK8GztsyOUSVBREA== +ms@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +nan@^2.12.1: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== nanomatch@^1.2.9: version "1.2.13" @@ -1546,10 +1497,10 @@ needle@^2.2.1: iconv-lite "^0.4.4" sax "^1.2.4" -node-pre-gyp@^0.10.0: - version "0.10.3" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" - integrity sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A== +node-pre-gyp@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" + integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== dependencies: detect-libc "^1.0.2" mkdirp "^0.5.1" @@ -1562,6 +1513,13 @@ node-pre-gyp@^0.10.0: semver "^5.3.0" tar "^4" +node-releases@^1.1.21: + version "1.1.23" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.23.tgz#de7409f72de044a2fa59c097f436ba89c39997f0" + integrity sha512-uq1iL79YjfYC0WXoHbC/z28q/9pOl8kSHaXdWmAAc8No+bDwqkZbzIJz55g/MUsPgSGm9LZ7QSUbzTcH5tz47w== + dependencies: + semver "^5.3.0" + nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" @@ -1570,13 +1528,18 @@ nopt@^4.0.1: abbrev "1" osenv "^0.1.4" -normalize-path@^2.0.0, normalize-path@^2.0.1: +normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= dependencies: remove-trailing-separator "^1.0.1" +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + npm-bundled@^1.0.1: version "1.0.6" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" @@ -1626,14 +1589,6 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.omit@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= - dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" - object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" @@ -1653,7 +1608,7 @@ os-homedir@^1.0.0: resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: +os-tmpdir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= @@ -1666,31 +1621,26 @@ osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" -output-file-sync@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" - integrity sha1-0KM+7+YaIF+suQCS6CZZjVJFznY= +output-file-sync@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-2.0.1.tgz#f53118282f5f553c2799541792b723a4c71430c0" + integrity sha512-mDho4qm7WgIXIGf4eYU1RHN2UU5tPfVYVSRwDJw0uTmj35DQUt/eNp19N7v6T3SrR0ESTEf2up2CGO73qI35zQ== dependencies: - graceful-fs "^4.1.4" + graceful-fs "^4.1.11" + is-plain-obj "^1.1.0" mkdirp "^0.5.1" - object-assign "^4.1.0" - -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= - dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= -path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= @@ -1700,12 +1650,7 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= - -private@^0.1.6, private@^0.1.8: +private@^0.1.6: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== @@ -1715,15 +1660,6 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== -randomatic@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" - integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== - dependencies: - is-number "^4.0.0" - kind-of "^6.0.0" - math-random "^1.0.1" - rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -1747,7 +1683,7 @@ readable-stream@^2.0.2, readable-stream@^2.0.6: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readdirp@^2.0.0: +readdirp@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== @@ -1756,37 +1692,25 @@ readdirp@^2.0.0: micromatch "^3.1.10" readable-stream "^2.0.2" -regenerate@^1.2.1: +regenerate-unicode-properties@^8.0.2: + version "8.1.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" + integrity sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== -regenerator-runtime@^0.10.5: - version "0.10.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" - integrity sha1-M2w+/BIgrc7dosn6tntaeVWjNlg= - -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== - -regenerator-transform@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" - integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== +regenerator-transform@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.0.tgz#2ca9aaf7a2c239dd32e4761218425b8c7a86ecaf" + integrity sha512-rtOelq4Cawlbmq9xuMR5gdFmv7ku/sFoB7sRiywx7aq53bc52b4j6zvH7Te1Vt/X2YveDKnCGUbioieU7FEL3w== dependencies: - babel-runtime "^6.18.0" - babel-types "^6.19.0" private "^0.1.6" -regex-cache@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" - integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== - dependencies: - is-equal-shallow "^0.1.3" - regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" @@ -1795,24 +1719,32 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexpu-core@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" - integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= +regexp-tree@^0.1.6: + version "0.1.10" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.10.tgz#d837816a039c7af8a8d64d7a7c3cf6a1d93450bc" + integrity sha512-K1qVSbcedffwuIslMwpe6vGlj+ZXRnGkvjAtFHfDZZZuEdA/h0dxljAPu9vhUo6Rrx2U2AwJ+nSQ6hK+lrP5MQ== + +regexpu-core@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.5.4.tgz#080d9d02289aa87fe1667a4f5136bc98a6aebaae" + integrity sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ== dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" + regenerate "^1.4.0" + regenerate-unicode-properties "^8.0.2" + regjsgen "^0.5.0" + regjsparser "^0.6.0" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.1.0" -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= +regjsgen@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" + integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA== -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= +regjsparser@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" + integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== dependencies: jsesc "~0.5.0" @@ -1826,18 +1758,11 @@ repeat-element@^1.1.2: resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== -repeat-string@^1.5.2, repeat-string@^1.6.1: +repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= - dependencies: - is-finite "^1.0.0" - resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" @@ -1882,6 +1807,16 @@ semver@^5.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== +semver@^5.5.0: + version "5.7.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" + integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== + +semver@^6.1.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.1.1.tgz#53f53da9b30b2103cd4f15eab3a18ecbcb210c9b" + integrity sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ== + set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -1912,10 +1847,10 @@ signal-exit@^3.0.0: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== snapdragon-node@^2.0.1: version "2.1.1" @@ -1958,19 +1893,12 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.4.15: - version "0.4.18" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" - integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== - dependencies: - source-map "^0.5.6" - source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= -source-map@^0.5.6, source-map@^0.5.7: +source-map@^0.5.0, source-map@^0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -2033,10 +1961,12 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" tar@^4: version "4.4.8" @@ -2051,10 +1981,10 @@ tar@^4: safe-buffer "^5.1.2" yallist "^3.0.2" -to-fast-properties@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= to-object-path@^0.3.0: version "0.3.0" @@ -2086,6 +2016,29 @@ trim-right@^1.0.1: resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" + integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" + integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== + union-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" @@ -2104,6 +2057,11 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" +upath@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" + integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== + urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" @@ -2114,23 +2072,11 @@ use@^3.1.0: resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== -user-home@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" - integrity sha1-K1viOjK2Onyd640PKNSFcko98ZA= - util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= -v8flags@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" - integrity sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ= - dependencies: - user-home "^1.1.1" - wide-align@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" From 0ccb39eafcb1ac892ab1ee8dbce5843b57f21cc9 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Thu, 6 Jun 2019 16:28:19 +0300 Subject: [PATCH 16/99] Fixed linting error --- packages/code-export-java-junit/src/command.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/code-export-java-junit/src/command.js b/packages/code-export-java-junit/src/command.js index f98e202c0a..d7fd453d4e 100644 --- a/packages/code-export-java-junit/src/command.js +++ b/packages/code-export-java-junit/src/command.js @@ -676,10 +676,10 @@ async function emitStoreAttribute(locator, varName) { return Promise.resolve({ commands }) } -async function emitStoreJson(_json, _varName) { - // TODO - return Promise.resolve('') -} +//async function emitStoreJson(_json, _varName) { +// // TODO +// return Promise.resolve('') +//} async function emitStoreText(locator, varName) { const result = `driver.findElement(${await location.emit(locator)}).getText()` From 238945fecd0a99fcd9e3b6cd6499640d5b02023e Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Mon, 10 Jun 2019 09:53:37 +0300 Subject: [PATCH 17/99] Fixed padding around log entries so hover highlighting is wider. Also fixed the font color so timestamp entries are the same --- .../src/neo/components/CommandReference/style.css | 4 ++++ packages/selenium-ide/src/neo/components/LogMessage/style.css | 4 ++-- packages/selenium-ide/src/neo/containers/Console/style.css | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/selenium-ide/src/neo/components/CommandReference/style.css b/packages/selenium-ide/src/neo/components/CommandReference/style.css index 84f283878e..01a549a75f 100644 --- a/packages/selenium-ide/src/neo/components/CommandReference/style.css +++ b/packages/selenium-ide/src/neo/components/CommandReference/style.css @@ -1,3 +1,7 @@ +.command-reference { + padding: 0 7px 0 7px; +} + .command-reference .signature { font-weight: bold; } diff --git a/packages/selenium-ide/src/neo/components/LogMessage/style.css b/packages/selenium-ide/src/neo/components/LogMessage/style.css index 1ace25da29..b606547671 100644 --- a/packages/selenium-ide/src/neo/components/LogMessage/style.css +++ b/packages/selenium-ide/src/neo/components/LogMessage/style.css @@ -1,6 +1,5 @@ .log { - padding-top: 5px; - padding-bottom: 5px; + padding: 5px 7px 5px 10px; } .log .index { @@ -10,6 +9,7 @@ .log .timestamp { font-weight: normal; + color: #000; } .log.notice { diff --git a/packages/selenium-ide/src/neo/containers/Console/style.css b/packages/selenium-ide/src/neo/containers/Console/style.css index 7298111313..3fbdb876cb 100644 --- a/packages/selenium-ide/src/neo/containers/Console/style.css +++ b/packages/selenium-ide/src/neo/containers/Console/style.css @@ -3,7 +3,7 @@ footer.console { } .console .viewport { - padding: 7px 10px 0 15px; + padding: 7px 3px 0 3px; font-size: 12px; overflow-y: auto; } From 8147730a428958d9eabfbaa2a37e67f47e2bef16 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Mon, 10 Jun 2019 13:20:54 +0300 Subject: [PATCH 18/99] Completed first pass on command emitting for Python code export --- .../__test__/src/command.spec.js | 26 ++--- .../code-export-python-pytest/src/command.js | 102 +++++------------- .../code-export-python-pytest/src/hook.js | 4 + 3 files changed, 42 insertions(+), 90 deletions(-) diff --git a/packages/code-export-python-pytest/__test__/src/command.spec.js b/packages/code-export-python-pytest/__test__/src/command.spec.js index dbac85c4f5..54397326c2 100644 --- a/packages/code-export-python-pytest/__test__/src/command.spec.js +++ b/packages/code-export-python-pytest/__test__/src/command.spec.js @@ -34,7 +34,7 @@ async function prettify(command, { fullPayload } = {}) { } describe('command code emitter', () => { - it.skip('should emit all known commands', () => { + it('should emit all known commands', () => { let result = [] Commands.array.forEach(command => { if (!Command.canEmit(command)) { @@ -947,14 +947,14 @@ describe('command code emitter', () => { `assert driver.title == "example title"` ) }) - it.only('should emit `waitForElementEditable` command', () => { + it('should emit `waitForElementEditable` command', () => { const command = { command: 'waitForElementEditable', target: 'css=#blah', value: '5000', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebDriverWait wait = new WebDriverWait(driver, 5);\n${commandPrefixPadding}wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#blah")));\n}` + `WebDriverWait(self.driver, 5000).until(expected_conditions.element_to_be_clickable(By.CSS_SELECTOR, "#blah"))` ) }) it('should emit `waitForElementPresent` command', () => { @@ -964,7 +964,7 @@ describe('command code emitter', () => { value: '5000', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebDriverWait wait = new WebDriverWait(driver, 5);\n${commandPrefixPadding}wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#blah")));\n}` + `WebDriverWait(self.driver, 5000).until(expected_conditions.presence_of_element_located(By.CSS_SELECTOR, "#blah"))` ) }) it('should emit `waitForElementVisible` command', () => { @@ -974,7 +974,7 @@ describe('command code emitter', () => { value: '5000', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebDriverWait wait = new WebDriverWait(driver, 5);\n${commandPrefixPadding}wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("#blah")));\n}` + `WebDriverWait(self.driver, 5000).until(expected_conditions.visibility_of_element_located(By.CSS_SELECTOR, "#blah"))` ) }) it('should emit `waitForElementNotEditable` command', () => { @@ -984,7 +984,7 @@ describe('command code emitter', () => { value: '5000', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebDriverWait wait = new WebDriverWait(driver, 5);\n${commandPrefixPadding}wait.until(ExpectedConditions.not(ExpectedConditions.elementToBeClickable(By.cssSelector("#blah"))));\n}` + `WebDriverWait(self.driver, 5000).until(!expected_conditions.element_to_be_clickable(By.CSS_SELECTOR, "#blah"))` ) }) it('should emit `waitForElementNotPresent` command', () => { @@ -994,7 +994,7 @@ describe('command code emitter', () => { value: '5000', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebDriverWait wait = new WebDriverWait(driver, 5);\n${commandPrefixPadding}WebElement element = driver.findElement(By.cssSelector("#blah"));\n${commandPrefixPadding}wait.until(ExpectedConditions.stalenessOf(element));\n}` + `WebDriverWait(self.driver, 5000).until(!expected_conditions.presence_of_element_located(By.CSS_SELECTOR, "#blah"))` ) }) it('should emit `waitForElementNotVisible` command', () => { @@ -1004,7 +1004,7 @@ describe('command code emitter', () => { value: '5000', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebDriverWait wait = new WebDriverWait(driver, 5);\n${commandPrefixPadding}wait.until(ExpectedConditions.invisibilityOfElementLocated(By.cssSelector("#blah")));\n}` + `WebDriverWait(self.driver, 5000).until(!expected_conditions.visibility_of_element_located(By.CSS_SELECTOR, "#blah"))` ) }) it('should emit `answer on visible prompt` command', () => { @@ -1014,7 +1014,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}Alert alert = driver.switchTo().alert();\n${commandPrefixPadding}alert.sendKeys("an answer")\n${commandPrefixPadding}alert.accept();\n}` + `alert = driver.switch_to.alert\nalert.send_keys("an answer")\nalert.accept()` ) }) it('should emit `choose cancel on visible prompt` command', () => { @@ -1024,7 +1024,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `driver.switchTo().alert().dismiss();` + `driver.switch_to.alert.dismiss()` ) }) it('should emit `choose ok on visible confirmation` command', () => { @@ -1034,7 +1034,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `driver.switchTo().alert().accept();` + `driver.switch_to.alert.accept()` ) }) it('should emit `while` command', () => { @@ -1044,7 +1044,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: `while ((Boolean) js.executeScript("return (true)")) {`, + body: `while driver.execute_script("return (true)"):`, endingLevel: 1, }) }) @@ -1058,7 +1058,7 @@ describe('command code emitter', () => { windowTimeout: 2000, } return expect(prettify(command)).resolves.toBe( - `vars.put("window_handles", driver.getWindowHandles());\ndriver.findElement(By.cssSelector("button")).click();\nvars.put("newWin", waitForWindow(2000));` + `vars["window_handles"] = driver.window_handles\ndriver.find_element(By.CSS_SELECTOR, "button").click()\nvars["newWin"] = self.wait_for_window(2000)` ) }) }) diff --git a/packages/code-export-python-pytest/src/command.js b/packages/code-export-python-pytest/src/command.js index 839b66a9ce..9bd108d759 100644 --- a/packages/code-export-python-pytest/src/command.js +++ b/packages/code-export-python-pytest/src/command.js @@ -174,9 +174,9 @@ function emitWaitForWindow() { async function emitNewWindowHandling(command, emittedCommand) { return Promise.resolve( - `vars.put("window_handles", driver.getWindowHandles());\n${await emittedCommand}\nvars.put("${ + `vars["window_handles"] = driver.window_handles\n${await emittedCommand}\nvars["${ command.windowHandleName - }", waitForWindow(${command.windowTimeout}));` + }"] = self.wait_for_window(${command.windowTimeout})` ) } @@ -190,11 +190,9 @@ function emitAssertAlert(alertText) { function emitAnswerOnNextPrompt(textToSend) { const commands = [ - { level: 0, statement: '{' }, - { level: 1, statement: 'Alert alert = driver.switchTo().alert();' }, - { level: 1, statement: `alert.sendKeys("${textToSend}")` }, - { level: 1, statement: 'alert.accept();' }, - { level: 0, statement: '}' }, + { level: 0, statement: 'alert = driver.switch_to.alert' }, + { level: 0, statement: `alert.send_keys("${textToSend}")` }, + { level: 0, statement: 'alert.accept()' }, ] return Promise.resolve({ commands }) } @@ -215,11 +213,11 @@ async function emitCheck(locator) { } function emitChooseCancelOnNextConfirmation() { - return Promise.resolve(`driver.switchTo().alert().dismiss();`) + return Promise.resolve(`driver.switch_to.alert.dismiss()`) } function emitChooseOkOnNextConfirmation() { - return Promise.resolve(`driver.switchTo().alert().accept();`) + return Promise.resolve(`driver.switch_to.alert.accept()`) } async function emitClick(target) { @@ -331,7 +329,7 @@ function emitControlFlowTimes(target) { function emitControlFlowWhile(script) { return Promise.resolve({ commands: [ - { level: 0, statement: `while (${generateExpressionScript(script)}) {` }, + { level: 0, statement: `while ${generateExpressionScript(script)}:` }, ], endingLevelAdjustment: 1, }) @@ -854,15 +852,9 @@ async function emitWaitForElementEditable(locator, timeout) { const commands = [ { level: 0, - statement: `WebDriverWait wait = new WebDriverWait(driver, ${Math.floor( - timeout / 1000 - )});`, - }, - { - level: 0, - statement: `wait.until(ExpectedConditions.elementToBeClickable(${await location.emit( + statement: `WebDriverWait(self.driver, ${timeout}).until(expected_conditions.element_to_be_clickable(${await location.emit( locator - )}));`, + )}))`, }, ] return Promise.resolve({ commands }) @@ -874,40 +866,24 @@ function skip() { async function emitWaitForElementPresent(locator, timeout) { const commands = [ - { level: 0, statement: '{' }, { - level: 1, - statement: `WebDriverWait wait = new WebDriverWait(driver, ${Math.floor( - timeout / 1000 - )});`, - }, - { - level: 1, - statement: `wait.until(ExpectedConditions.presenceOfElementLocated(${await location.emit( + level: 0, + statement: `WebDriverWait(self.driver, ${timeout}).until(expected_conditions.presence_of_element_located(${await location.emit( locator - )}));`, + )}))`, }, - { level: 0, statement: '}' }, ] return Promise.resolve({ commands }) } async function emitWaitForElementVisible(locator, timeout) { const commands = [ - { level: 0, statement: '{' }, - { - level: 1, - statement: `WebDriverWait wait = new WebDriverWait(driver, ${Math.floor( - timeout / 1000 - )});`, - }, { - level: 1, - statement: `wait.until(ExpectedConditions.visibilityOfElementLocated(${await location.emit( + level: 0, + statement: `WebDriverWait(self.driver, ${timeout}).until(expected_conditions.visibility_of_element_located(${await location.emit( locator - )}));`, + )}))`, }, - { level: 0, statement: '}' }, ] return Promise.resolve({ commands, @@ -916,20 +892,12 @@ async function emitWaitForElementVisible(locator, timeout) { async function emitWaitForElementNotEditable(locator, timeout) { const commands = [ - { level: 0, statement: '{' }, - { - level: 1, - statement: `WebDriverWait wait = new WebDriverWait(driver, ${Math.floor( - timeout / 1000 - )});`, - }, { - level: 1, - statement: `wait.until(ExpectedConditions.not(ExpectedConditions.elementToBeClickable(${await location.emit( + level: 0, + statement: `WebDriverWait(self.driver, ${timeout}).until(!expected_conditions.element_to_be_clickable(${await location.emit( locator - )})));`, + )}))`, }, - { level: 0, statement: '}' }, ] return Promise.resolve({ commands, @@ -938,24 +906,12 @@ async function emitWaitForElementNotEditable(locator, timeout) { async function emitWaitForElementNotPresent(locator, timeout) { const commands = [ - { level: 0, statement: '{' }, { - level: 1, - statement: `WebDriverWait wait = new WebDriverWait(driver, ${Math.floor( - timeout / 1000 - )});`, - }, - { - level: 1, - statement: `WebElement element = driver.findElement(${await location.emit( + level: 0, + statement: `WebDriverWait(self.driver, ${timeout}).until(!expected_conditions.presence_of_element_located(${await location.emit( locator - )});`, + )}))`, }, - { - level: 1, - statement: 'wait.until(ExpectedConditions.stalenessOf(element));', - }, - { level: 0, statement: '}' }, ] return Promise.resolve({ commands, @@ -964,20 +920,12 @@ async function emitWaitForElementNotPresent(locator, timeout) { async function emitWaitForElementNotVisible(locator, timeout) { const commands = [ - { level: 0, statement: '{' }, - { - level: 1, - statement: `WebDriverWait wait = new WebDriverWait(driver, ${Math.floor( - timeout / 1000 - )});`, - }, { - level: 1, - statement: `wait.until(ExpectedConditions.invisibilityOfElementLocated(${await location.emit( + level: 0, + statement: `WebDriverWait(self.driver, ${timeout}).until(!expected_conditions.visibility_of_element_located(${await location.emit( locator - )}));`, + )}))`, }, - { level: 0, statement: '}' }, ] return Promise.resolve({ commands, diff --git a/packages/code-export-python-pytest/src/hook.js b/packages/code-export-python-pytest/src/hook.js index 940e260336..17baf9c8ec 100644 --- a/packages/code-export-python-pytest/src/hook.js +++ b/packages/code-export-python-pytest/src/hook.js @@ -119,6 +119,10 @@ function declareDependencies() { statement: 'from selenium.webdriver.support import expected_conditions', }, + { + level: 0, + statement: 'import selenium.webdriver.support.wait.WebDriverWait', + }, ], }, } From 4e8280d81c1e06aa56b67f2db56d720a2b20ab4d Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Tue, 11 Jun 2019 16:00:05 +0300 Subject: [PATCH 19/99] Added a final blank entry to dependencies hook to add a new line between the deps and the class declaration --- packages/code-export-python-pytest/src/hook.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/code-export-python-pytest/src/hook.js b/packages/code-export-python-pytest/src/hook.js index 17baf9c8ec..6fc289ace2 100644 --- a/packages/code-export-python-pytest/src/hook.js +++ b/packages/code-export-python-pytest/src/hook.js @@ -123,6 +123,10 @@ function declareDependencies() { level: 0, statement: 'import selenium.webdriver.support.wait.WebDriverWait', }, + { + level: 0, + statement: '', + }, ], }, } From 858371589a5f6a8954d49dd036f7979ebf4c835f Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Tue, 11 Jun 2019 16:00:47 +0300 Subject: [PATCH 20/99] Updated hooks to return undefined on optional emitting, and filter emitted commands based on if they're undefined (to allow for empty strings) --- .../code-export-utils/__test__/src/hook.spec.js | 15 ++++++++++++++- packages/code-export-utils/src/hook.js | 4 ++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/packages/code-export-utils/__test__/src/hook.spec.js b/packages/code-export-utils/__test__/src/hook.spec.js index 2888cb3480..82fc89a7f7 100644 --- a/packages/code-export-utils/__test__/src/hook.spec.js +++ b/packages/code-export-utils/__test__/src/hook.spec.js @@ -54,7 +54,7 @@ describe('Hooks', () => { }) it('should optionally emit commands', () => { const hook = new Hook({ startingSyntax: 'blah1', endingSyntax: 'blah99' }) - expect(hook.emit({ isOptional: true })).resolves.toEqual('') + expect(hook.emit({ isOptional: true })).resolves.toBeUndefined() expect(hook.emit({ isOptional: false })).resolves.toEqual({ commands: [ { level: 0, statement: 'blah1' }, @@ -62,6 +62,19 @@ describe('Hooks', () => { ], }) }) + it('should emit a command with empty string', () => { + const hook = new Hook({ startingSyntax: 'a', endingSyntax: 'b' }) + hook.register(() => { + return Promise.resolve('') + }) + expect(hook.emit({ isOptional: false })).resolves.toEqual({ + commands: [ + { level: 0, statement: 'a' }, + { level: 0, statement: '' }, + { level: 0, statement: 'b' }, + ], + }) + }) it('should check if a command is already registered', () => { const hook = new Hook() hook.register(() => { diff --git a/packages/code-export-utils/src/hook.js b/packages/code-export-utils/src/hook.js index b459357104..1444511b06 100644 --- a/packages/code-export-utils/src/hook.js +++ b/packages/code-export-utils/src/hook.js @@ -49,8 +49,8 @@ export default class Hook { const name = test ? test.name : suite ? suite.name : undefined const emittedCommands = (await Promise.all( this.emitters.map(emitter => emitter({ name, tests, project })) - )).filter(entry => !!entry) - if (isOptional && !emittedCommands.length) return '' + )).filter(entry => entry != undefined) + if (isOptional && !emittedCommands.length) return emittedCommands.forEach(command => { if (typeof command === 'object') { commands.push(command) From c32975baed34134b5b5affdab7189a5ccbed9b65 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Tue, 11 Jun 2019 16:04:39 +0300 Subject: [PATCH 21/99] Updated emitting for the window handling util method, updated `run` to use a `self.` prefix when emitting, updated `skip` to emit `undefined` instead of an empty string, and updated `end` to skip emitting but still affect the ending level for commands that follow --- .../__test__/src/command.spec.js | 14 +++++----- .../code-export-python-pytest/src/command.js | 26 +++++++------------ 2 files changed, 18 insertions(+), 22 deletions(-) diff --git a/packages/code-export-python-pytest/__test__/src/command.spec.js b/packages/code-export-python-pytest/__test__/src/command.spec.js index 54397326c2..53655d4ce2 100644 --- a/packages/code-export-python-pytest/__test__/src/command.spec.js +++ b/packages/code-export-python-pytest/__test__/src/command.spec.js @@ -365,8 +365,8 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: ``, endingLevel: 0, + skipEmitting: true, }) }) it('should emit `execute script` command', () => { @@ -545,7 +545,7 @@ describe('command code emitter', () => { target: 'some test case', value: '', } - return expect(prettify(command)).resolves.toBe(`sometestcase()`) + return expect(prettify(command)).resolves.toBe(`self.sometestcase()`) }) it('should emit `run script` command', () => { const command = { @@ -674,15 +674,17 @@ describe('command code emitter', () => { }) it('should skip playback supported commands, that are not supported in webdriver', () => { return Promise.all([ - expect(prettify({ command: 'answerOnNextPrompt' })).resolves.toBe(''), + expect(prettify({ command: 'answerOnNextPrompt' })).resolves.toBe( + undefined + ), expect( prettify({ command: 'chooseCancelOnNextConfirmation' }) - ).resolves.toBe(''), + ).resolves.toBe(undefined), expect(prettify({ command: 'chooseCancelOnNextPrompt' })).resolves.toBe( - '' + undefined ), expect(prettify({ command: 'chooseOkOnNextConfirmation' })).resolves.toBe( - '' + undefined ), ]) }) diff --git a/packages/code-export-python-pytest/src/command.js b/packages/code-export-python-pytest/src/command.js index 9bd108d759..503fe34535 100644 --- a/packages/code-export-python-pytest/src/command.js +++ b/packages/code-export-python-pytest/src/command.js @@ -146,27 +146,20 @@ function variableSetter(varName, value) { function emitWaitForWindow() { const generateMethodDeclaration = name => { - return `public String ${name}(int timeout) {` + return `def ${name}(timeout = 2000) {` } const commands = [ - { level: 0, statement: 'try {' }, - { level: 1, statement: 'Thread.sleep(timeout);' }, - { level: 0, statement: '} catch (InterruptedException e) {' }, - { level: 1, statement: 'e.printStackTrace();' }, - { level: 0, statement: '}' }, - { level: 0, statement: 'Set whNow = driver.getWindowHandles();' }, + { level: 0, statement: 'driver.sleep(timeout)' }, + { level: 0, statement: 'wh_now = driver.window_handles' }, { level: 0, - statement: - 'Set whThen = (Set) vars.get("window_handles");', + statement: 'wh_then = vars["window_handles"]', }, - { level: 0, statement: 'if (whNow.size() > whThen.size()) {' }, - { level: 1, statement: 'whNow.removeAll(whThen);' }, - { level: 0, statement: '}' }, - { level: 0, statement: 'return whNow.iterator().next();' }, + { level: 0, statement: 'if len(wh_now) > len(wh_then):' }, + { level: 1, statement: 'return set(wh_now).difference(set(wh_then))' }, ] return Promise.resolve({ - name: 'waitForWindow', + name: 'wait_for_window', commands, generateMethodDeclaration, }) @@ -278,6 +271,7 @@ function emitControlFlowEnd() { return Promise.resolve({ commands: [{ level: 0, statement: `` }], startingLevelAdjustment: -1, + skipEmitting: true, }) } @@ -481,7 +475,7 @@ async function emitPause(time) { } async function emitRun(testName) { - return Promise.resolve(`${exporter.parsers.sanitizeName(testName)}()`) + return Promise.resolve(`self.${exporter.parsers.sanitizeName(testName)}()`) } async function emitRunScript(script) { @@ -861,7 +855,7 @@ async function emitWaitForElementEditable(locator, timeout) { } function skip() { - return Promise.resolve('') + return Promise.resolve(undefined) } async function emitWaitForElementPresent(locator, timeout) { From d0c43f83f082cefc33025187cfc39f2de3c20b4b Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Tue, 11 Jun 2019 16:07:55 +0300 Subject: [PATCH 22/99] Added support for empyt strings in rendering. Also added the option to skip emitting for a command block --- .../__test__/src/prettify.spec.js | 13 ++++++++ .../__test__/src/render.spec.js | 9 ++++++ packages/code-export-utils/src/prettify.js | 32 ++++++++++++------- packages/code-export-utils/src/render.js | 8 +++-- 4 files changed, 48 insertions(+), 14 deletions(-) diff --git a/packages/code-export-utils/__test__/src/prettify.spec.js b/packages/code-export-utils/__test__/src/prettify.spec.js index 568513c196..69a119ef0a 100644 --- a/packages/code-export-utils/__test__/src/prettify.spec.js +++ b/packages/code-export-utils/__test__/src/prettify.spec.js @@ -118,4 +118,17 @@ describe('Prettify', () => { expect(result.body).toBe(`blah\n${commandPrefixPadding}blah`) expect(result.endingLevel).toBe(1) }) + it('individual command emitting can be skipped', () => { + const commandBlock = { + commands: [{ level: 0, statement: '' }], + skipEmitting: true, + endingLevelAdjustment: -1, + } + const result = prettify(commandBlock, { + commandPrefixPadding, + startingLevel: 1, + }) + expect(result.body).toBeFalsy() + expect(result.endingLevel).toBe(0) + }) }) diff --git a/packages/code-export-utils/__test__/src/render.spec.js b/packages/code-export-utils/__test__/src/render.spec.js index 636d7b4e12..4b982e845b 100644 --- a/packages/code-export-utils/__test__/src/render.spec.js +++ b/packages/code-export-utils/__test__/src/render.spec.js @@ -15,6 +15,7 @@ // specific language governing permissions and limitations // under the License. +import render from '../../src/render' import { renderCommands } from '../../src/render' import { emitOriginTracing } from '../../src/emit' import TestCase from '../../../selenium-ide/src/neo/models/TestCase' @@ -46,4 +47,12 @@ describe('Render', () => { }) expect(result).toMatch(`blah\nandblah`) }) + it('should render with empty string', () => { + const commandPrefixPadding = ' ' + const input = '' + const result = render(commandPrefixPadding, input, { startingLevel: 1 }) + expect(result).toMatch(commandPrefixPadding) + }) + //it('should skip emitting', () => { + //}) }) diff --git a/packages/code-export-utils/src/prettify.js b/packages/code-export-utils/src/prettify.js index 0c1eb8e6d2..f88e113a19 100644 --- a/packages/code-export-utils/src/prettify.js +++ b/packages/code-export-utils/src/prettify.js @@ -28,21 +28,31 @@ export default function prettify( commandBlock, { startingLevel, commandPrefixPadding } = {} ) { - if (!commandBlock) return { body: '' } + if (commandBlock === undefined) return { body: undefined } if (!startingLevel) startingLevel = 0 if (commandBlock.startingLevelAdjustment) startingLevel += commandBlock.startingLevelAdjustment if (startingLevel < 0) startingLevel = 0 if (typeof commandBlock.commands === 'object') { - return { - body: commandBlock.commands - .map( - command => - commandPrefixPadding.repeat(startingLevel + command.level) + - command.statement - ) - .join('\n'), - endingLevel: calculateEndingLevel({ startingLevel, commandBlock }), + if (commandBlock.skipEmitting) { + return { + endingLevel: calculateEndingLevel({ + startingLevel, + commandBlock, + }), + skipEmitting: commandBlock.skipEmitting, + } + } else { + return { + body: commandBlock.commands + .map( + command => + commandPrefixPadding.repeat(startingLevel + command.level) + + command.statement + ) + .join('\n'), + endingLevel: calculateEndingLevel({ startingLevel, commandBlock }), + } } } else { return { @@ -57,7 +67,7 @@ export default function prettify( function calculateEndingLevel({ startingLevel, commandBlock } = {}) { let endingLevel = 0 - if (commandBlock.commands.length > 0) { + if (commandBlock.commands && commandBlock.commands.length > 0) { endingLevel = commandBlock.commands[commandBlock.commands.length - 1].level || 0 } diff --git a/packages/code-export-utils/src/render.js b/packages/code-export-utils/src/render.js index b39e63a8fb..43c65d15b4 100644 --- a/packages/code-export-utils/src/render.js +++ b/packages/code-export-utils/src/render.js @@ -38,7 +38,7 @@ export default function render( startingLevel, }) if (fullPayload) return result - return result.body.trim().length + return result.body && result.body.length ? result.body + '\n'.repeat(newLineCount) : '' } @@ -69,8 +69,10 @@ export function renderCommands( fullPayload: true, }) endingLevel = commandBlock.endingLevel - result += commandBlock.body - result += '\n' + if (!commandBlock.skipEmitting) { + result += commandBlock.body + result += '\n' + } } }) return result From bc3b58c482366a7b5e3c382d470058279866b84c Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Tue, 11 Jun 2019 16:08:20 +0300 Subject: [PATCH 23/99] Updated snapshots for first pass on e2e Python emitting --- .../src/__snapshots__/index.spec.js.snap | 789 +++++++----------- .../__test__/src/index.spec.js | 20 +- 2 files changed, 321 insertions(+), 488 deletions(-) diff --git a/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap b/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap index 6e3181a948..87946d0279 100644 --- a/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap +++ b/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap @@ -1,511 +1,344 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`Code Export Java JUnit Selenium should export a suite 1`] = ` -"// Generated by Selenium IDE -import org.junit.Test; -import org.junit.Before; -import org.junit.After; -import static org.junit.Assert.*; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.core.IsNot.not; -import org.openqa.selenium.By; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.firefox.FirefoxDriver; -import org.openqa.selenium.Dimension; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.interactions.Actions; -import org.openqa.selenium.support.ui.ExpectedConditions; -import org.openqa.selenium.support.ui.WebDriverWait; -import org.openqa.selenium.JavascriptExecutor; -import org.openqa.selenium.Alert; -import org.openqa.selenium.Keys; -import java.util.*; -public class LoginTest { - private WebDriver driver; - private Map vars; - JavascriptExecutor js; - @Before - public void setUp() { - driver = new FirefoxDriver(); - js = (JavascriptExecutor) driver; - vars = new HashMap(); - } - @After - public void tearDown() { - driver.quit(); - } - @Test - public void validcredentials() { - driver.get(\\"http://the-internet.herokuapp.com/login\\"); - driver.manage().window().setSize(new Dimension(1440, 1177)); - driver.findElement(By.id(\\"username\\")).sendKeys(\\"tomsmith\\"); - driver.findElement(By.id(\\"password\\")).sendKeys(\\"SuperSecretPassword!\\"); - driver.findElement(By.cssSelector(\\"#login button\\")).click(); - assertThat(driver.findElement(By.cssSelector(\\".flash.success\\")).getText(), is(\\"You logged into a secure area!\\\\\\\\n×\\")); - } - @Test - public void invalidcredentials() { - driver.get(\\"http://the-internet.herokuapp.com/login\\"); - driver.manage().window().setSize(new Dimension(1440, 1177)); - driver.findElement(By.id(\\"username\\")).sendKeys(\\"blah\\"); - driver.findElement(By.id(\\"password\\")).sendKeys(\\"blah\\"); - driver.findElement(By.cssSelector(\\"#login button\\")).click(); - assertThat(driver.findElement(By.id(\\"flash\\")).getText(), is(\\"Your username is invalid!\\\\\\\\n×\\")); - } -} +"# Generated by Selenium IDE +import pytest +import time +import json +from selenium import webdriver +from selenium.webdriver.common.by import By +from selenium.webdriver.common.action_chains import ActionChains +from selenium.webdriver.support import expected_conditions +import selenium.webdriver.support.wait.WebDriverWait + +class TestLogin() { + def setup_method(self, method): + self.driver = webdriver.Firefox() + self.vars = {} + + def teardown_method(self, method): + self.driver.quit(); + + def test_validcredentials(self): + driver.get(\\"http://the-internet.herokuapp.com/login\\") + driver.set_window_size(1440, 1177) + driver.find_element(By.ID, \\"username\\").send_keys(\\"tomsmith\\") + driver.find_element(By.ID, \\"password\\").send_keys(\\"SuperSecretPassword!\\") + driver.find_element(By.CSS_SELECTOR, \\"#login button\\").click() + assert driver.find_element(By.CSS_SELECTOR, \\".flash.success\\").text == \\"You logged into a secure area!\\\\\\\\n×\\" + + def test_invalidcredentials(self): + driver.get(\\"http://the-internet.herokuapp.com/login\\") + driver.set_window_size(1440, 1177) + driver.find_element(By.ID, \\"username\\").send_keys(\\"blah\\") + driver.find_element(By.ID, \\"password\\").send_keys(\\"blah\\") + driver.find_element(By.CSS_SELECTOR, \\"#login button\\").click() + assert driver.find_element(By.ID, \\"flash\\").text == \\"Your username is invalid!\\\\\\\\n×\\" + " `; exports[`Code Export Java JUnit Selenium should export a suite that uses control flow commands 1`] = ` -"// Generated by Selenium IDE -import org.junit.Test; -import org.junit.Before; -import org.junit.After; -import static org.junit.Assert.*; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.core.IsNot.not; -import org.openqa.selenium.By; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.firefox.FirefoxDriver; -import org.openqa.selenium.Dimension; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.interactions.Actions; -import org.openqa.selenium.support.ui.ExpectedConditions; -import org.openqa.selenium.support.ui.WebDriverWait; -import org.openqa.selenium.JavascriptExecutor; -import org.openqa.selenium.Alert; -import org.openqa.selenium.Keys; -import java.util.*; -public class ControlflowTest { - private WebDriver driver; - private Map vars; - JavascriptExecutor js; - @Before - public void setUp() { - driver = new FirefoxDriver(); - js = (JavascriptExecutor) driver; - vars = new HashMap(); - } - @After - public void tearDown() { - driver.quit(); - } - @Test - public void controlflowif() { - vars.put(\\"myVar\\", js.executeScript(\\"return 'a'\\")); - if ((Boolean) js.executeScript(\\"return (arguments[0] === 'a')\\", vars.get(\\"myVar\\"))) { - vars.put(\\"output\\", js.executeScript(\\"return 'a'\\")); - } else if ((Boolean) js.executeScript(\\"return (arguments[0] === 'b')\\", vars.get(\\"myVar\\"))) { - vars.put(\\"output\\", js.executeScript(\\"return 'b'\\")); - } else { - vars.put(\\"output\\", js.executeScript(\\"return 'c'\\")); - } - assertEquals(vars.get(\\"output\\").toString(), \\"a\\"); - } - @Test - public void controlflowelseif() { - vars.put(\\"myVar\\", js.executeScript(\\"return 'b'\\")); - if ((Boolean) js.executeScript(\\"return (arguments[0] === 'a')\\", vars.get(\\"myVar\\"))) { - vars.put(\\"output\\", js.executeScript(\\"return 'a'\\")); - } else if ((Boolean) js.executeScript(\\"return (arguments[0] === 'b')\\", vars.get(\\"myVar\\"))) { - vars.put(\\"output\\", js.executeScript(\\"return 'b'\\")); - } else { - vars.put(\\"output\\", js.executeScript(\\"return 'c'\\")); - } - assertEquals(vars.get(\\"output\\").toString(), \\"b\\"); - } - @Test - public void controlflowelse() { - vars.put(\\"myVar\\", js.executeScript(\\"return 'c'\\")); - if ((Boolean) js.executeScript(\\"return (arguments[0] === 'a')\\", vars.get(\\"myVar\\"))) { - vars.put(\\"output\\", js.executeScript(\\"return 'a'\\")); - } else if ((Boolean) js.executeScript(\\"return (arguments[0] === 'b')\\", vars.get(\\"myVar\\"))) { - vars.put(\\"output\\", js.executeScript(\\"return 'b'\\")); - } else { - vars.put(\\"output\\", js.executeScript(\\"return 'c'\\")); - } - assertEquals(vars.get(\\"output\\").toString(), \\"c\\"); - } - @Test - public void controlflowdo() { - vars.put(\\"check\\", js.executeScript(\\"return 1\\")); - do { - vars.put(\\"check\\", js.executeScript(\\"return arguments[0] + 1\\", vars.get(\\"check\\"))); - } while ((Boolean) js.executeScript(\\"return (arguments[0] < 3)\\", vars.get(\\"check\\"))); - assertEquals(vars.get(\\"check\\").toString(), \\"3\\"); - } - @Test - public void controlflowtimes() { - vars.put(\\"check\\", js.executeScript(\\"return 1\\")); - Integer times = 2; - for(int i = 0; i < times; i++) { - vars.put(\\"check\\", js.executeScript(\\"return arguments[0] + 1\\", vars.get(\\"check\\"))); - } - assertEquals(vars.get(\\"check\\").toString(), \\"3\\"); - } - @Test - public void controlflowwhile() { - vars.put(\\"check\\", js.executeScript(\\"return 1\\")); - while ((Boolean) js.executeScript(\\"return (arguments[0] < 3)\\", vars.get(\\"check\\"))) { - vars.put(\\"check\\", js.executeScript(\\"return arguments[0] + 1\\", vars.get(\\"check\\"))); - } - assertEquals(vars.get(\\"check\\").toString(), \\"3\\"); - } -} +"# Generated by Selenium IDE +import pytest +import time +import json +from selenium import webdriver +from selenium.webdriver.common.by import By +from selenium.webdriver.common.action_chains import ActionChains +from selenium.webdriver.support import expected_conditions +import selenium.webdriver.support.wait.WebDriverWait + +class TestControlflow() { + def setup_method(self, method): + self.driver = webdriver.Firefox() + self.vars = {} + + def teardown_method(self, method): + self.driver.quit(); + + def test_controlflowif(self): + vars[\\"myVar\\"] = driver.execute_script(\\"return 'a'\\") + if driver.execute_script(\\"return (arguments[0] === 'a')\\", vars.[\\"myVar\\"]): + vars[\\"output\\"] = driver.execute_script(\\"return 'a'\\") + elif driver.execute_script(\\"return (arguments[0] === 'b')\\", vars.[\\"myVar\\"]): + vars[\\"output\\"] = driver.execute_script(\\"return 'b'\\") + else: + vars[\\"output\\"] = driver.execute_script(\\"return 'c'\\") + assert(vars[\\"output\\"] == \\"a\\") + + def test_controlflowelseif(self): + vars[\\"myVar\\"] = driver.execute_script(\\"return 'b'\\") + if driver.execute_script(\\"return (arguments[0] === 'a')\\", vars.[\\"myVar\\"]): + vars[\\"output\\"] = driver.execute_script(\\"return 'a'\\") + elif driver.execute_script(\\"return (arguments[0] === 'b')\\", vars.[\\"myVar\\"]): + vars[\\"output\\"] = driver.execute_script(\\"return 'b'\\") + else: + vars[\\"output\\"] = driver.execute_script(\\"return 'c'\\") + assert(vars[\\"output\\"] == \\"b\\") + + def test_controlflowelse(self): + vars[\\"myVar\\"] = driver.execute_script(\\"return 'c'\\") + if driver.execute_script(\\"return (arguments[0] === 'a')\\", vars.[\\"myVar\\"]): + vars[\\"output\\"] = driver.execute_script(\\"return 'a'\\") + elif driver.execute_script(\\"return (arguments[0] === 'b')\\", vars.[\\"myVar\\"]): + vars[\\"output\\"] = driver.execute_script(\\"return 'b'\\") + else: + vars[\\"output\\"] = driver.execute_script(\\"return 'c'\\") + assert(vars[\\"output\\"] == \\"c\\") + + def test_controlflowdo(self): + vars[\\"check\\"] = driver.execute_script(\\"return 1\\") + condition = True + while condition: + vars[\\"check\\"] = driver.execute_script(\\"return arguments[0] + 1\\", vars.[\\"check\\"]) + condition = driver.execute_script(\\"return (arguments[0] < 3)\\", vars.[\\"check\\"]) + assert(vars[\\"check\\"] == \\"3\\") + + def test_controlflowtimes(self): + vars[\\"check\\"] = driver.execute_script(\\"return 1\\") + for i in range(1, 2): + vars[\\"check\\"] = driver.execute_script(\\"return arguments[0] + 1\\", vars.[\\"check\\"]) + assert(vars[\\"check\\"] == \\"3\\") + + def test_controlflowwhile(self): + vars[\\"check\\"] = driver.execute_script(\\"return 1\\") + while driver.execute_script(\\"return (arguments[0] < 3)\\", vars.[\\"check\\"]): + vars[\\"check\\"] = driver.execute_script(\\"return arguments[0] + 1\\", vars.[\\"check\\"]) + assert(vars[\\"check\\"] == \\"3\\") + " `; exports[`Code Export Java JUnit Selenium should export a suite with a reused test method 1`] = ` -"// Generated by Selenium IDE -import org.junit.Test; -import org.junit.Before; -import org.junit.After; -import static org.junit.Assert.*; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.core.IsNot.not; -import org.openqa.selenium.By; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.firefox.FirefoxDriver; -import org.openqa.selenium.Dimension; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.interactions.Actions; -import org.openqa.selenium.support.ui.ExpectedConditions; -import org.openqa.selenium.support.ui.WebDriverWait; -import org.openqa.selenium.JavascriptExecutor; -import org.openqa.selenium.Alert; -import org.openqa.selenium.Keys; -import java.util.*; -public class LoginTest { - private WebDriver driver; - private Map vars; - JavascriptExecutor js; - @Before - public void setUp() { - driver = new FirefoxDriver(); - js = (JavascriptExecutor) driver; - vars = new HashMap(); - } - @After - public void tearDown() { - driver.quit(); - } - public void login() { - driver.get(\\"https://the-internet.herokuapp.com/\\"); - driver.findElement(By.linkText(\\"Form Authentication\\")).click(); - driver.findElement(By.id(\\"username\\")).sendKeys(vars.get(\\"username\\").toString()); - driver.findElement(By.id(\\"password\\")).sendKeys(vars.get(\\"password\\").toString()); - driver.findElement(By.cssSelector(\\".fa\\")).click(); - } - @Test - public void invalidcredentials() { - vars.put(\\"username\\", \\"blah\\"); - vars.put(\\"password\\", \\"blah\\"); - login(); - } - @Test - public void validcredentials() { - vars.put(\\"username\\", \\"tomsmith\\"); - vars.put(\\"password\\", \\"SuperSecretPassword!\\"); - login(); - } -} +"# Generated by Selenium IDE +import pytest +import time +import json +from selenium import webdriver +from selenium.webdriver.common.by import By +from selenium.webdriver.common.action_chains import ActionChains +from selenium.webdriver.support import expected_conditions +import selenium.webdriver.support.wait.WebDriverWait + +class TestLogin() { + def setup_method(self, method): + self.driver = webdriver.Firefox() + self.vars = {} + + def teardown_method(self, method): + self.driver.quit(); + + def login(self): + driver.get(\\"https://the-internet.herokuapp.com/\\") + driver.find_element(By.LINK_TEXT, \\"Form Authentication\\").click() + driver.find_element(By.ID, \\"username\\").send_keys(vars[\\"username\\"]) + driver.find_element(By.ID, \\"password\\").send_keys(vars[\\"password\\"]) + driver.find_element(By.CSS_SELECTOR, \\".fa\\").click() + + def test_invalidcredentials(self): + vars[\\"username\\"] = \\"blah\\" + vars[\\"password\\"] = \\"blah\\" + self.login() + + def test_validcredentials(self): + vars[\\"username\\"] = \\"tomsmith\\" + vars[\\"password\\"] = \\"SuperSecretPassword!\\" + self.login() + " `; exports[`Code Export Java JUnit Selenium should export a suite with commands that open a new window inside of a reused test method 1`] = ` -"// Generated by Selenium IDE -import org.junit.Test; -import org.junit.Before; -import org.junit.After; -import static org.junit.Assert.*; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.core.IsNot.not; -import org.openqa.selenium.By; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.firefox.FirefoxDriver; -import org.openqa.selenium.Dimension; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.interactions.Actions; -import org.openqa.selenium.support.ui.ExpectedConditions; -import org.openqa.selenium.support.ui.WebDriverWait; -import org.openqa.selenium.JavascriptExecutor; -import org.openqa.selenium.Alert; -import org.openqa.selenium.Keys; -import java.util.*; -public class DefaultSuiteTest { - private WebDriver driver; - private Map vars; - JavascriptExecutor js; - @Before - public void setUp() { - driver = new FirefoxDriver(); - js = (JavascriptExecutor) driver; - vars = new HashMap(); - } - @After - public void tearDown() { - driver.quit(); - } - public String waitForWindow(int timeout) { - try { - Thread.sleep(timeout); - } catch (InterruptedException e) { - e.printStackTrace(); - } - Set whNow = driver.getWindowHandles(); - Set whThen = (Set) vars.get(\\"window_handles\\"); - if (whNow.size() > whThen.size()) { - whNow.removeAll(whThen); - } - return whNow.iterator().next(); - } - public void selectwindow() { - driver.get(\\"http://the-internet.herokuapp.com/windows\\"); - vars.put(\\"window_handles\\", driver.getWindowHandles()); - driver.findElement(By.linkText(\\"Click Here\\")).click(); - vars.put(\\"win9425\\", waitForWindow(2000)); - driver.switchTo().window(vars.get(\\"win9425\\").toString()); - assertThat(driver.getTitle(), is(\\"New Window\\")); - } - @Test - public void reuse() { - selectwindow(); - } -} +"# Generated by Selenium IDE +import pytest +import time +import json +from selenium import webdriver +from selenium.webdriver.common.by import By +from selenium.webdriver.common.action_chains import ActionChains +from selenium.webdriver.support import expected_conditions +import selenium.webdriver.support.wait.WebDriverWait + +class TestDefaultSuite() { + def setup_method(self, method): + self.driver = webdriver.Firefox() + self.vars = {} + + def teardown_method(self, method): + self.driver.quit(); + + def wait_for_window(timeout = 2000) { + driver.sleep(timeout) + wh_now = driver.window_handles + wh_then = vars[\\"window_handles\\"] + if len(wh_now) > len(wh_then): + return set(wh_now).difference(set(wh_then)) + + def selectwindow(self): + driver.get(\\"http://the-internet.herokuapp.com/windows\\") + vars[\\"window_handles\\"] = driver.window_handles + driver.find_element(By.LINK_TEXT, \\"Click Here\\").click() + vars[\\"win9425\\"] = self.wait_for_window(2000) + driver.switch_to.window(vars[\\"win9425\\"]) + assert driver.title == \\"New Window\\" + + def test_reuse(self): + self.selectwindow() + " `; exports[`Code Export Java JUnit Selenium should export a suite with just one new window util method when there are multiple commands that open a new window 1`] = ` -"// Generated by Selenium IDE -import org.junit.Test; -import org.junit.Before; -import org.junit.After; -import static org.junit.Assert.*; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.core.IsNot.not; -import org.openqa.selenium.By; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.firefox.FirefoxDriver; -import org.openqa.selenium.Dimension; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.interactions.Actions; -import org.openqa.selenium.support.ui.ExpectedConditions; -import org.openqa.selenium.support.ui.WebDriverWait; -import org.openqa.selenium.JavascriptExecutor; -import org.openqa.selenium.Alert; -import org.openqa.selenium.Keys; -import java.util.*; -public class DefaultSuiteTest { - private WebDriver driver; - private Map vars; - JavascriptExecutor js; - @Before - public void setUp() { - driver = new FirefoxDriver(); - js = (JavascriptExecutor) driver; - vars = new HashMap(); - } - @After - public void tearDown() { - driver.quit(); - } - public String waitForWindow(int timeout) { - try { - Thread.sleep(timeout); - } catch (InterruptedException e) { - e.printStackTrace(); - } - Set whNow = driver.getWindowHandles(); - Set whThen = (Set) vars.get(\\"window_handles\\"); - if (whNow.size() > whThen.size()) { - whNow.removeAll(whThen); - } - return whNow.iterator().next(); - } - public void selectwindow() { - driver.get(\\"http://the-internet.herokuapp.com/windows\\"); - vars.put(\\"window_handles\\", driver.getWindowHandles()); - driver.findElement(By.linkText(\\"Click Here\\")).click(); - vars.put(\\"win9425\\", waitForWindow(2000)); - driver.switchTo().window(vars.get(\\"win9425\\").toString()); - assertThat(driver.getTitle(), is(\\"New Window\\")); - } - @Test - public void reuse() { - selectwindow(); - } - @Test - public void selectwindow() { - driver.get(\\"http://the-internet.herokuapp.com/windows\\"); - vars.put(\\"window_handles\\", driver.getWindowHandles()); - driver.findElement(By.linkText(\\"Click Here\\")).click(); - vars.put(\\"win9425\\", waitForWindow(2000)); - driver.switchTo().window(vars.get(\\"win9425\\").toString()); - assertThat(driver.getTitle(), is(\\"New Window\\")); - } -} +"# Generated by Selenium IDE +import pytest +import time +import json +from selenium import webdriver +from selenium.webdriver.common.by import By +from selenium.webdriver.common.action_chains import ActionChains +from selenium.webdriver.support import expected_conditions +import selenium.webdriver.support.wait.WebDriverWait + +class TestDefaultSuite() { + def setup_method(self, method): + self.driver = webdriver.Firefox() + self.vars = {} + + def teardown_method(self, method): + self.driver.quit(); + + def wait_for_window(timeout = 2000) { + driver.sleep(timeout) + wh_now = driver.window_handles + wh_then = vars[\\"window_handles\\"] + if len(wh_now) > len(wh_then): + return set(wh_now).difference(set(wh_then)) + + def selectwindow(self): + driver.get(\\"http://the-internet.herokuapp.com/windows\\") + vars[\\"window_handles\\"] = driver.window_handles + driver.find_element(By.LINK_TEXT, \\"Click Here\\").click() + vars[\\"win9425\\"] = self.wait_for_window(2000) + driver.switch_to.window(vars[\\"win9425\\"]) + assert driver.title == \\"New Window\\" + + def test_reuse(self): + self.selectwindow() + + def test_selectwindow(self): + driver.get(\\"http://the-internet.herokuapp.com/windows\\") + vars[\\"window_handles\\"] = driver.window_handles + driver.find_element(By.LINK_TEXT, \\"Click Here\\").click() + vars[\\"win9425\\"] = self.wait_for_window(2000) + driver.switch_to.window(vars[\\"win9425\\"]) + assert driver.title == \\"New Window\\" + " `; exports[`Code Export Java JUnit Selenium should export a test 1`] = ` -"// Generated by Selenium IDE -import org.junit.Test; -import org.junit.Before; -import org.junit.After; -import static org.junit.Assert.*; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.core.IsNot.not; -import org.openqa.selenium.By; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.firefox.FirefoxDriver; -import org.openqa.selenium.Dimension; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.interactions.Actions; -import org.openqa.selenium.support.ui.ExpectedConditions; -import org.openqa.selenium.support.ui.WebDriverWait; -import org.openqa.selenium.JavascriptExecutor; -import org.openqa.selenium.Alert; -import org.openqa.selenium.Keys; -import java.util.*; -public class LoginTest { - private WebDriver driver; - private Map vars; - JavascriptExecutor js; - @Before - public void setUp() { - driver = new FirefoxDriver(); - js = (JavascriptExecutor) driver; - vars = new HashMap(); - } - @After - public void tearDown() { - driver.quit(); - } - @Test - public void login() { - driver.get(\\"http://the-internet.herokuapp.com/login\\"); - driver.manage().window().setSize(new Dimension(1440, 1177)); - driver.findElement(By.id(\\"username\\")).sendKeys(\\"tomsmith\\"); - driver.findElement(By.id(\\"password\\")).sendKeys(\\"SuperSecretPassword!\\"); - driver.findElement(By.cssSelector(\\"#login button\\")).click(); - assertThat(driver.findElement(By.cssSelector(\\".flash.success\\")).getText(), is(\\"You logged into a secure area!\\\\\\\\n×\\")); - } -} +"# Generated by Selenium IDE +import pytest +import time +import json +from selenium import webdriver +from selenium.webdriver.common.by import By +from selenium.webdriver.common.action_chains import ActionChains +from selenium.webdriver.support import expected_conditions +import selenium.webdriver.support.wait.WebDriverWait + +class TestLogin() { + def setup_method(self, method): + self.driver = webdriver.Firefox() + self.vars = {} + + def teardown_method(self, method): + self.driver.quit(); + + def test_login(self): + driver.get(\\"http://the-internet.herokuapp.com/login\\") + driver.set_window_size(1440, 1177) + driver.find_element(By.ID, \\"username\\").send_keys(\\"tomsmith\\") + driver.find_element(By.ID, \\"password\\").send_keys(\\"SuperSecretPassword!\\") + driver.find_element(By.CSS_SELECTOR, \\"#login button\\").click() + assert driver.find_element(By.CSS_SELECTOR, \\".flash.success\\").text == \\"You logged into a secure area!\\\\\\\\n×\\" + " `; exports[`Code Export Java JUnit Selenium should export a test with a reused test method 1`] = ` -"// Generated by Selenium IDE -import org.junit.Test; -import org.junit.Before; -import org.junit.After; -import static org.junit.Assert.*; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.core.IsNot.not; -import org.openqa.selenium.By; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.firefox.FirefoxDriver; -import org.openqa.selenium.Dimension; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.interactions.Actions; -import org.openqa.selenium.support.ui.ExpectedConditions; -import org.openqa.selenium.support.ui.WebDriverWait; -import org.openqa.selenium.JavascriptExecutor; -import org.openqa.selenium.Alert; -import org.openqa.selenium.Keys; -import java.util.*; -public class ValidcredentialsTest { - private WebDriver driver; - private Map vars; - JavascriptExecutor js; - @Before - public void setUp() { - driver = new FirefoxDriver(); - js = (JavascriptExecutor) driver; - vars = new HashMap(); - } - @After - public void tearDown() { - driver.quit(); - } - public void login() { - driver.get(\\"https://the-internet.herokuapp.com/\\"); - driver.findElement(By.linkText(\\"Form Authentication\\")).click(); - driver.findElement(By.id(\\"username\\")).sendKeys(vars.get(\\"username\\").toString()); - driver.findElement(By.id(\\"password\\")).sendKeys(vars.get(\\"password\\").toString()); - driver.findElement(By.cssSelector(\\".fa\\")).click(); - } - @Test - public void validcredentials() { - vars.put(\\"username\\", \\"tomsmith\\"); - vars.put(\\"password\\", \\"SuperSecretPassword!\\"); - login(); - } -} +"# Generated by Selenium IDE +import pytest +import time +import json +from selenium import webdriver +from selenium.webdriver.common.by import By +from selenium.webdriver.common.action_chains import ActionChains +from selenium.webdriver.support import expected_conditions +import selenium.webdriver.support.wait.WebDriverWait + +class TestValidcredentials() { + def setup_method(self, method): + self.driver = webdriver.Firefox() + self.vars = {} + + def teardown_method(self, method): + self.driver.quit(); + + def login(self): + driver.get(\\"https://the-internet.herokuapp.com/\\") + driver.find_element(By.LINK_TEXT, \\"Form Authentication\\").click() + driver.find_element(By.ID, \\"username\\").send_keys(vars[\\"username\\"]) + driver.find_element(By.ID, \\"password\\").send_keys(vars[\\"password\\"]) + driver.find_element(By.CSS_SELECTOR, \\".fa\\").click() + + def test_validcredentials(self): + vars[\\"username\\"] = \\"tomsmith\\" + vars[\\"password\\"] = \\"SuperSecretPassword!\\" + self.login() + " `; exports[`Code Export Java JUnit Selenium should export a test with commands that open a new window 1`] = ` -"// Generated by Selenium IDE -import org.junit.Test; -import org.junit.Before; -import org.junit.After; -import static org.junit.Assert.*; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.core.IsNot.not; -import org.openqa.selenium.By; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.firefox.FirefoxDriver; -import org.openqa.selenium.Dimension; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.interactions.Actions; -import org.openqa.selenium.support.ui.ExpectedConditions; -import org.openqa.selenium.support.ui.WebDriverWait; -import org.openqa.selenium.JavascriptExecutor; -import org.openqa.selenium.Alert; -import org.openqa.selenium.Keys; -import java.util.*; -public class SelectwindowTest { - private WebDriver driver; - private Map vars; - JavascriptExecutor js; - @Before - public void setUp() { - driver = new FirefoxDriver(); - js = (JavascriptExecutor) driver; - vars = new HashMap(); - } - @After - public void tearDown() { - driver.quit(); - } - public String waitForWindow(int timeout) { - try { - Thread.sleep(timeout); - } catch (InterruptedException e) { - e.printStackTrace(); - } - Set whNow = driver.getWindowHandles(); - Set whThen = (Set) vars.get(\\"window_handles\\"); - if (whNow.size() > whThen.size()) { - whNow.removeAll(whThen); - } - return whNow.iterator().next(); - } - @Test - public void selectwindow() { - driver.get(\\"http://the-internet.herokuapp.com/\\"); - driver.manage().window().setSize(new Dimension(1260, 1027)); - driver.findElement(By.linkText(\\"Multiple Windows\\")).click(); - vars.put(\\"window_handles\\", driver.getWindowHandles()); - driver.findElement(By.linkText(\\"Click Here\\")).click(); - vars.put(\\"win9625\\", waitForWindow(2000)); - vars.put(\\"root\\", driver.getWindowHandle()); - driver.switchTo().window(vars.get(\\"win9625\\").toString()); - assertThat(driver.getTitle(), is(\\"New Window\\")); - driver.switchTo().window(vars.get(\\"root\\").toString()); - assertThat(driver.getTitle(), is(\\"The Internet\\")); - } -} +"# Generated by Selenium IDE +import pytest +import time +import json +from selenium import webdriver +from selenium.webdriver.common.by import By +from selenium.webdriver.common.action_chains import ActionChains +from selenium.webdriver.support import expected_conditions +import selenium.webdriver.support.wait.WebDriverWait + +class TestSelectwindow() { + def setup_method(self, method): + self.driver = webdriver.Firefox() + self.vars = {} + + def teardown_method(self, method): + self.driver.quit(); + + def wait_for_window(timeout = 2000) { + driver.sleep(timeout) + wh_now = driver.window_handles + wh_then = vars[\\"window_handles\\"] + if len(wh_now) > len(wh_then): + return set(wh_now).difference(set(wh_then)) + + def test_selectwindow(self): + driver.get(\\"http://the-internet.herokuapp.com/\\") + driver.set_window_size(1260, 1027) + driver.find_element(By.LINK_TEXT, \\"Multiple Windows\\").click() + vars[\\"window_handles\\"] = driver.window_handles + driver.find_element(By.LINK_TEXT, \\"Click Here\\").click() + vars[\\"win9625\\"] = self.wait_for_window(2000) + vars[\\"root\\"] = driver.current_window_handle + driver.switch_to.window(vars[\\"win9625\\"]) + assert driver.title == \\"New Window\\" + driver.switch_to.window(vars[\\"root\\"]) + assert driver.title == \\"The Internet\\" + " `; diff --git a/packages/code-export-python-pytest/__test__/src/index.spec.js b/packages/code-export-python-pytest/__test__/src/index.spec.js index 6b7b92b731..f9dfe90ea4 100644 --- a/packages/code-export-python-pytest/__test__/src/index.spec.js +++ b/packages/code-export-python-pytest/__test__/src/index.spec.js @@ -57,16 +57,6 @@ describe('Code Export Java JUnit Selenium', () => { expect(results.body).toBeDefined() expect(results.body).toMatchSnapshot() }) - it('should export a test with commands that open a new window', async () => { - const project = normalizeProject(readFile('select-window.side')) - const results = await emitTest({ - baseUrl: project.url, - test: project.tests[0], - tests: project.tests, - }) - expect(results.body).toBeDefined() - expect(results.body).toMatchSnapshot() - }) it('should export a suite with a reused test method', async () => { const project = normalizeProject(readFile('test-case-reuse.side')) const results = await emitSuite({ @@ -87,6 +77,16 @@ describe('Code Export Java JUnit Selenium', () => { expect(results.body).toBeDefined() expect(results.body).toMatchSnapshot() }) + it('should export a test with commands that open a new window', async () => { + const project = normalizeProject(readFile('select-window.side')) + const results = await emitTest({ + baseUrl: project.url, + test: project.tests[0], + tests: project.tests, + }) + expect(results.body).toBeDefined() + expect(results.body).toMatchSnapshot() + }) it('should export a suite with commands that open a new window inside of a reused test method', async () => { const project = normalizeProject(readFile('nested-select-window.side')) const results = await emitSuite({ From 1f1f75003cd830bfb27005dac494000861830606 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Tue, 11 Jun 2019 16:12:44 +0300 Subject: [PATCH 24/99] Updated code-export babel deps. Resolves the remainder of the chatty trace log output noise when running tests --- packages/code-export-java-junit/.babelrc | 4 +- packages/code-export-java-junit/package.json | 6 +- packages/code-export-java-junit/yarn.lock | 1846 +++++++++--------- packages/code-export-utils/.babelrc | 4 +- packages/code-export-utils/package.json | 6 +- packages/code-export-utils/yarn.lock | 1846 +++++++++--------- packages/code-export/.babelrc | 22 +- packages/code-export/package.json | 4 +- packages/code-export/yarn.lock | 1833 +++++++++-------- 9 files changed, 2712 insertions(+), 2859 deletions(-) diff --git a/packages/code-export-java-junit/.babelrc b/packages/code-export-java-junit/.babelrc index f781122745..bd80a8410e 100644 --- a/packages/code-export-java-junit/.babelrc +++ b/packages/code-export-java-junit/.babelrc @@ -1,6 +1,6 @@ { "presets": [ - ["env", + ["@babel/preset-env", { "targets": { "node": "8" @@ -8,6 +8,6 @@ }] ], "plugins": [ - "transform-object-rest-spread", + "@babel/plugin-proposal-object-rest-spread" ] } diff --git a/packages/code-export-java-junit/package.json b/packages/code-export-java-junit/package.json index bd453850e4..a35c66f791 100644 --- a/packages/code-export-java-junit/package.json +++ b/packages/code-export-java-junit/package.json @@ -16,9 +16,9 @@ }, "main": "dist/index.js", "devDependencies": { - "babel-cli": "^6.26.0", - "babel-plugin-transform-object-rest-spread": "^6.26.0", - "babel-preset-env": "^1.7.0" + "@babel/cli": "^7.4.4", + "@babel/plugin-proposal-object-rest-spread": "^7.4.4", + "@babel/preset-env": "^7.4.5" }, "dependencies": { "code-export-utils": "^3.8.1" diff --git a/packages/code-export-java-junit/yarn.lock b/packages/code-export-java-junit/yarn.lock index 5334fd4a55..f31289d921 100644 --- a/packages/code-export-java-junit/yarn.lock +++ b/packages/code-export-java-junit/yarn.lock @@ -2,6 +2,610 @@ # yarn lockfile v1 +"@babel/cli@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.4.4.tgz#5454bb7112f29026a4069d8e6f0e1794e651966c" + integrity sha512-XGr5YjQSjgTa6OzQZY57FAJsdeVSAKR/u/KA5exWIz66IKtv/zXtHy+fIZcMry/EgYegwuHE7vzGnrFhjdIAsQ== + dependencies: + commander "^2.8.1" + convert-source-map "^1.1.0" + fs-readdir-recursive "^1.1.0" + glob "^7.0.0" + lodash "^4.17.11" + mkdirp "^0.5.1" + output-file-sync "^2.0.0" + slash "^2.0.0" + source-map "^0.5.0" + optionalDependencies: + chokidar "^2.0.4" + +"@babel/code-frame@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" + integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== + dependencies: + "@babel/highlight" "^7.0.0" + +"@babel/generator@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.4.tgz#174a215eb843fc392c7edcaabeaa873de6e8f041" + integrity sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ== + dependencies: + "@babel/types" "^7.4.4" + jsesc "^2.5.1" + lodash "^4.17.11" + source-map "^0.5.0" + trim-right "^1.0.1" + +"@babel/helper-annotate-as-pure@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" + integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" + integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-call-delegate@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz#87c1f8ca19ad552a736a7a27b1c1fcf8b1ff1f43" + integrity sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ== + dependencies: + "@babel/helper-hoist-variables" "^7.4.4" + "@babel/traverse" "^7.4.4" + "@babel/types" "^7.4.4" + +"@babel/helper-define-map@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.4.4.tgz#6969d1f570b46bdc900d1eba8e5d59c48ba2c12a" + integrity sha512-IX3Ln8gLhZpSuqHJSnTNBWGDE9kdkTEWl21A/K7PQ00tseBwbqCHTvNLHSBd9M0R5rER4h5Rsvj9vw0R5SieBg== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/types" "^7.4.4" + lodash "^4.17.11" + +"@babel/helper-explode-assignable-expression@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" + integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== + dependencies: + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-function-name@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" + integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== + dependencies: + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-get-function-arity@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" + integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-hoist-variables@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz#0298b5f25c8c09c53102d52ac4a98f773eb2850a" + integrity sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w== + dependencies: + "@babel/types" "^7.4.4" + +"@babel/helper-member-expression-to-functions@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz#8cd14b0a0df7ff00f009e7d7a436945f47c7a16f" + integrity sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-imports@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" + integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.4.4.tgz#96115ea42a2f139e619e98ed46df6019b94414b8" + integrity sha512-3Z1yp8TVQf+B4ynN7WoHPKS8EkdTbgAEy0nU0rs/1Kw4pDgmvYH3rz3aI11KgxKCba2cn7N+tqzV1mY2HMN96w== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/template" "^7.4.4" + "@babel/types" "^7.4.4" + lodash "^4.17.11" + +"@babel/helper-optimise-call-expression@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" + integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-plugin-utils@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" + integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== + +"@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.4.4.tgz#a47e02bc91fb259d2e6727c2a30013e3ac13c4a2" + integrity sha512-Y5nuB/kESmR3tKjU8Nkn1wMGEx1tjJX076HBMeL3XLQCu6vA/YRzuTW0bbb+qRnXvQGn+d6Rx953yffl8vEy7Q== + dependencies: + lodash "^4.17.11" + +"@babel/helper-remap-async-to-generator@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" + integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-wrap-function" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-replace-supers@^7.1.0", "@babel/helper-replace-supers@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.4.4.tgz#aee41783ebe4f2d3ab3ae775e1cc6f1a90cefa27" + integrity sha512-04xGEnd+s01nY1l15EuMS1rfKktNF+1CkKmHoErDppjAAZL+IUBZpzT748x262HF7fibaQPhbvWUl5HeSt1EXg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/traverse" "^7.4.4" + "@babel/types" "^7.4.4" + +"@babel/helper-simple-access@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" + integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== + dependencies: + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-split-export-declaration@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677" + integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q== + dependencies: + "@babel/types" "^7.4.4" + +"@babel/helper-wrap-function@^7.1.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" + integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.2.0" + +"@babel/highlight@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" + integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.4.4", "@babel/parser@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.5.tgz#04af8d5d5a2b044a2a1bffacc1e5e6673544e872" + integrity sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew== + +"@babel/plugin-proposal-async-generator-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" + integrity sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + "@babel/plugin-syntax-async-generators" "^7.2.0" + +"@babel/plugin-proposal-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" + integrity sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + +"@babel/plugin-proposal-object-rest-spread@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.4.tgz#1ef173fcf24b3e2df92a678f027673b55e7e3005" + integrity sha512-dMBG6cSPBbHeEBdFXeQ2QLc5gUpg4Vkaz8octD4aoW/ISO+jBOcsuxYL7bsb5WSu8RLP6boxrBIALEHgoHtO9g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" + integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + +"@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz#501ffd9826c0b91da22690720722ac7cb1ca9c78" + integrity sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.5.4" + +"@babel/plugin-syntax-async-generators@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f" + integrity sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" + integrity sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-object-rest-spread@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" + integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" + integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-arrow-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" + integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-async-to-generator@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.4.4.tgz#a3f1d01f2f21cadab20b33a82133116f14fb5894" + integrity sha512-YiqW2Li8TXmzgbXw+STsSqPBPFnGviiaSp6CYOq55X8GQ2SGVLrXB6pNid8HkqkZAzOH6knbai3snhP7v0fNwA== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + +"@babel/plugin-transform-block-scoped-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" + integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-block-scoping@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.4.tgz#c13279fabf6b916661531841a23c4b7dae29646d" + integrity sha512-jkTUyWZcTrwxu5DD4rWz6rDB5Cjdmgz6z7M7RLXOJyCUkFBawssDGcGh8M/0FTSB87avyJI1HsTwUXp9nKA1PA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + lodash "^4.17.11" + +"@babel/plugin-transform-classes@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.4.tgz#0ce4094cdafd709721076d3b9c38ad31ca715eb6" + integrity sha512-/e44eFLImEGIpL9qPxSRat13I5QNRgBLu2hOQJCF7VLy/otSM/sypV1+XaIw5+502RX/+6YaSAPmldk+nhHDPw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-define-map" "^7.4.4" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.4.4" + "@babel/helper-split-export-declaration" "^7.4.4" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" + integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-destructuring@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.4.tgz#9d964717829cc9e4b601fc82a26a71a4d8faf20f" + integrity sha512-/aOx+nW0w8eHiEHm+BTERB2oJn5D127iye/SUQl7NjHy0lf+j7h4MKMMSOwdazGq9OxgiNADncE+SRJkCxjZpQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz#361a148bc951444312c69446d76ed1ea8e4450c3" + integrity sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.5.4" + +"@babel/plugin-transform-duplicate-keys@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz#d952c4930f312a4dbfff18f0b2914e60c35530b3" + integrity sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-exponentiation-operator@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" + integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-for-of@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz#0267fc735e24c808ba173866c6c4d1440fc3c556" + integrity sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-function-name@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz#e1436116abb0610c2259094848754ac5230922ad" + integrity sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" + integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-member-expression-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz#fa10aa5c58a2cb6afcf2c9ffa8cb4d8b3d489a2d" + integrity sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-amd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz#82a9bce45b95441f617a24011dc89d12da7f4ee6" + integrity sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-commonjs@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.4.tgz#0bef4713d30f1d78c2e59b3d6db40e60192cac1e" + integrity sha512-4sfBOJt58sEo9a2BQXnZq+Q3ZTSAUXyK3E30o36BOGnJ+tvJ6YSxF0PG6kERvbeISgProodWuI9UVG3/FMY6iw== + dependencies: + "@babel/helper-module-transforms" "^7.4.4" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + +"@babel/plugin-transform-modules-systemjs@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.4.4.tgz#dc83c5665b07d6c2a7b224c00ac63659ea36a405" + integrity sha512-MSiModfILQc3/oqnG7NrP1jHaSPryO6tA2kOMmAQApz5dayPxWiHqmq4sWH2xF5LcQK56LlbKByCd8Aah/OIkQ== + dependencies: + "@babel/helper-hoist-variables" "^7.4.4" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-umd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae" + integrity sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz#9d269fd28a370258199b4294736813a60bbdd106" + integrity sha512-z7+2IsWafTBbjNsOxU/Iv5CvTJlr5w4+HGu1HovKYTtgJ362f7kBcQglkfmlspKKZ3bgrbSGvLfNx++ZJgCWsg== + dependencies: + regexp-tree "^0.1.6" + +"@babel/plugin-transform-new-target@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz#18d120438b0cc9ee95a47f2c72bc9768fbed60a5" + integrity sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-object-super@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz#b35d4c10f56bab5d650047dad0f1d8e8814b6598" + integrity sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.1.0" + +"@babel/plugin-transform-parameters@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz#7556cf03f318bd2719fe4c922d2d808be5571e16" + integrity sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw== + dependencies: + "@babel/helper-call-delegate" "^7.4.4" + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-property-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz#03e33f653f5b25c4eb572c98b9485055b389e905" + integrity sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-regenerator@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz#629dc82512c55cee01341fb27bdfcb210354680f" + integrity sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA== + dependencies: + regenerator-transform "^0.14.0" + +"@babel/plugin-transform-reserved-words@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz#4792af87c998a49367597d07fedf02636d2e1634" + integrity sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-shorthand-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" + integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-spread@^7.2.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz#3103a9abe22f742b6d406ecd3cd49b774919b406" + integrity sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-sticky-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" + integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + +"@babel/plugin-transform-template-literals@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz#9d28fea7bbce637fb7612a0750989d8321d4bcb0" + integrity sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-typeof-symbol@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2" + integrity sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-unicode-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz#ab4634bb4f14d36728bf5978322b35587787970f" + integrity sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.5.4" + +"@babel/preset-env@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.4.5.tgz#2fad7f62983d5af563b5f3139242755884998a58" + integrity sha512-f2yNVXM+FsR5V8UwcFeIHzHWgnhXg3NpRmy0ADvALpnhB0SLbCvrCRr4BLOUYbQNLS+Z0Yer46x9dJXpXewI7w== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-async-generator-functions" "^7.2.0" + "@babel/plugin-proposal-json-strings" "^7.2.0" + "@babel/plugin-proposal-object-rest-spread" "^7.4.4" + "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-syntax-async-generators" "^7.2.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + "@babel/plugin-transform-arrow-functions" "^7.2.0" + "@babel/plugin-transform-async-to-generator" "^7.4.4" + "@babel/plugin-transform-block-scoped-functions" "^7.2.0" + "@babel/plugin-transform-block-scoping" "^7.4.4" + "@babel/plugin-transform-classes" "^7.4.4" + "@babel/plugin-transform-computed-properties" "^7.2.0" + "@babel/plugin-transform-destructuring" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/plugin-transform-duplicate-keys" "^7.2.0" + "@babel/plugin-transform-exponentiation-operator" "^7.2.0" + "@babel/plugin-transform-for-of" "^7.4.4" + "@babel/plugin-transform-function-name" "^7.4.4" + "@babel/plugin-transform-literals" "^7.2.0" + "@babel/plugin-transform-member-expression-literals" "^7.2.0" + "@babel/plugin-transform-modules-amd" "^7.2.0" + "@babel/plugin-transform-modules-commonjs" "^7.4.4" + "@babel/plugin-transform-modules-systemjs" "^7.4.4" + "@babel/plugin-transform-modules-umd" "^7.2.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.4.5" + "@babel/plugin-transform-new-target" "^7.4.4" + "@babel/plugin-transform-object-super" "^7.2.0" + "@babel/plugin-transform-parameters" "^7.4.4" + "@babel/plugin-transform-property-literals" "^7.2.0" + "@babel/plugin-transform-regenerator" "^7.4.5" + "@babel/plugin-transform-reserved-words" "^7.2.0" + "@babel/plugin-transform-shorthand-properties" "^7.2.0" + "@babel/plugin-transform-spread" "^7.2.0" + "@babel/plugin-transform-sticky-regex" "^7.2.0" + "@babel/plugin-transform-template-literals" "^7.4.4" + "@babel/plugin-transform-typeof-symbol" "^7.2.0" + "@babel/plugin-transform-unicode-regex" "^7.4.4" + "@babel/types" "^7.4.4" + browserslist "^4.6.0" + core-js-compat "^3.1.1" + invariant "^2.2.2" + js-levenshtein "^1.1.3" + semver "^5.5.0" + +"@babel/template@^7.1.0", "@babel/template@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.4.tgz#f4b88d1225689a08f5bc3a17483545be9e4ed237" + integrity sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.4.4" + "@babel/types" "^7.4.4" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.4": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.5.tgz#4e92d1728fd2f1897dafdd321efbff92156c3216" + integrity sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.4.4" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/parser" "^7.4.5" + "@babel/types" "^7.4.4" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.11" + +"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.4.tgz#8db9e9a629bb7c29370009b4b779ed93fe57d5f0" + integrity sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ== + dependencies: + esutils "^2.0.2" + lodash "^4.17.11" + to-fast-properties "^2.0.0" + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -17,18 +621,20 @@ ansi-regex@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" -anymatch@^1.3.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" - integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA== +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== dependencies: - micromatch "^2.1.5" - normalize-path "^2.0.0" + micromatch "^3.1.4" + normalize-path "^2.1.1" aproba@^1.0.3: version "1.2.0" @@ -43,19 +649,12 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.6" -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= - dependencies: - arr-flatten "^1.0.1" - arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= -arr-flatten@^1.0.1, arr-flatten@^1.1.0: +arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== @@ -65,11 +664,6 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= -array-unique@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= - array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" @@ -80,571 +674,16 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= -async-each@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.2.tgz#8b8a7ca2a658f927e9f307d6d1a42f4199f0f735" - integrity sha512-6xrbvN0MOBKSJDdonmSSz2OwFSgxRaVtBDes26mj9KIGtDo+g9xosFRSC+i1gQh2oAN/tQ62AI/pGZGQjVOiRg== +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== atob@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -babel-cli@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.26.0.tgz#502ab54874d7db88ad00b887a06383ce03d002f1" - integrity sha1-UCq1SHTX24itALiHoGODzgPQAvE= - dependencies: - babel-core "^6.26.0" - babel-polyfill "^6.26.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - commander "^2.11.0" - convert-source-map "^1.5.0" - fs-readdir-recursive "^1.0.0" - glob "^7.1.2" - lodash "^4.17.4" - output-file-sync "^1.1.2" - path-is-absolute "^1.0.1" - slash "^1.0.0" - source-map "^0.5.6" - v8flags "^2.1.1" - optionalDependencies: - chokidar "^1.6.1" - -babel-code-frame@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= - dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - -babel-core@^6.26.0: - version "6.26.3" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" - integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== - dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.1" - debug "^2.6.9" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.8" - slash "^1.0.0" - source-map "^0.5.7" - -babel-generator@^6.26.0: - version "6.26.1" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" - integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.17.4" - source-map "^0.5.7" - trim-right "^1.0.1" - -babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" - integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ= - dependencies: - babel-helper-explode-assignable-expression "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-call-delegate@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" - integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-define-map@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" - integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-explode-assignable-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" - integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo= - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-function-name@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" - integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= - dependencies: - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-get-function-arity@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" - integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-hoist-variables@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" - integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-optimise-call-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" - integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-regex@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" - integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI= - dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-remap-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" - integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-replace-supers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" - integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo= - dependencies: - babel-helper-optimise-call-expression "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helpers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" - integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-check-es2015-constants@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" - integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-syntax-async-functions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" - integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= - -babel-plugin-syntax-exponentiation-operator@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" - integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= - -babel-plugin-syntax-object-rest-spread@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" - integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= - -babel-plugin-syntax-trailing-function-commas@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" - integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM= - -babel-plugin-transform-async-to-generator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" - integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E= - dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-functions "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-arrow-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" - integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" - integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoping@^6.23.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" - integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= - dependencies: - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-plugin-transform-es2015-classes@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" - integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs= - dependencies: - babel-helper-define-map "^6.24.1" - babel-helper-function-name "^6.24.1" - babel-helper-optimise-call-expression "^6.24.1" - babel-helper-replace-supers "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-computed-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" - integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM= - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-destructuring@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" - integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-duplicate-keys@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" - integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-for-of@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" - integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-function-name@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" - integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" - integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" - integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ= - dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: - version "6.26.2" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" - integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== - dependencies: - babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-types "^6.26.0" - -babel-plugin-transform-es2015-modules-systemjs@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" - integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM= - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-umd@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" - integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg= - dependencies: - babel-plugin-transform-es2015-modules-amd "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-object-super@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" - integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40= - dependencies: - babel-helper-replace-supers "^6.24.1" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-parameters@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" - integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= - dependencies: - babel-helper-call-delegate "^6.24.1" - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-shorthand-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" - integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-spread@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" - integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-sticky-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" - integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw= - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-template-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" - integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-typeof-symbol@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" - integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-unicode-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" - integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek= - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - regexpu-core "^2.0.0" - -babel-plugin-transform-exponentiation-operator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" - integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4= - dependencies: - babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" - babel-plugin-syntax-exponentiation-operator "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-object-rest-spread@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" - integrity sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY= - dependencies: - babel-plugin-syntax-object-rest-spread "^6.8.0" - babel-runtime "^6.26.0" - -babel-plugin-transform-regenerator@^6.22.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" - integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8= - dependencies: - regenerator-transform "^0.10.0" - -babel-plugin-transform-strict-mode@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" - integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-polyfill@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" - integrity sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM= - dependencies: - babel-runtime "^6.26.0" - core-js "^2.5.0" - regenerator-runtime "^0.10.5" - -babel-preset-env@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" - integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg== - dependencies: - babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-to-generator "^6.22.0" - babel-plugin-transform-es2015-arrow-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoping "^6.23.0" - babel-plugin-transform-es2015-classes "^6.23.0" - babel-plugin-transform-es2015-computed-properties "^6.22.0" - babel-plugin-transform-es2015-destructuring "^6.23.0" - babel-plugin-transform-es2015-duplicate-keys "^6.22.0" - babel-plugin-transform-es2015-for-of "^6.23.0" - babel-plugin-transform-es2015-function-name "^6.22.0" - babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.22.0" - babel-plugin-transform-es2015-modules-commonjs "^6.23.0" - babel-plugin-transform-es2015-modules-systemjs "^6.23.0" - babel-plugin-transform-es2015-modules-umd "^6.23.0" - babel-plugin-transform-es2015-object-super "^6.22.0" - babel-plugin-transform-es2015-parameters "^6.23.0" - babel-plugin-transform-es2015-shorthand-properties "^6.22.0" - babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.22.0" - babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.23.0" - babel-plugin-transform-es2015-unicode-regex "^6.22.0" - babel-plugin-transform-exponentiation-operator "^6.22.0" - babel-plugin-transform-regenerator "^6.22.0" - browserslist "^3.2.6" - invariant "^2.2.2" - semver "^5.3.0" - -babel-register@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" - integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= - dependencies: - babel-core "^6.26.0" - babel-runtime "^6.26.0" - core-js "^2.5.0" - home-or-tmp "^2.0.0" - lodash "^4.17.4" - mkdirp "^0.5.1" - source-map-support "^0.4.15" - -babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -babel-template@^6.24.1, babel-template@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= - dependencies: - babel-runtime "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - lodash "^4.17.4" - -babel-traverse@^6.24.1, babel-traverse@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= - dependencies: - babel-code-frame "^6.26.0" - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - debug "^2.6.8" - globals "^9.18.0" - invariant "^2.2.2" - lodash "^4.17.4" - -babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= - dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" - -babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== - balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" @@ -676,16 +715,7 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= - dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" - -braces@^2.3.1: +braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== @@ -701,13 +731,14 @@ braces@^2.3.1: split-string "^3.0.2" to-regex "^3.0.1" -browserslist@^3.2.6: - version "3.2.8" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" - integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== +browserslist@^4.6.0: + version "4.6.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.6.2.tgz#574c665950915c2ac73a4594b8537a9eba26203f" + integrity sha512-2neU/V0giQy9h3XMPwLhEY3+Ao0uHSwHvU8Q1Ea6AgLVL1sXbX3dzPrJ8NWe5Hi4PoTkCYXOtVR9rfRLI0J/8Q== dependencies: - caniuse-lite "^1.0.30000844" - electron-to-chromium "^1.3.47" + caniuse-lite "^1.0.30000974" + electron-to-chromium "^1.3.150" + node-releases "^1.1.23" cache-base@^1.0.1: version "1.0.1" @@ -724,37 +755,38 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" -caniuse-lite@^1.0.30000844: - version "1.0.30000939" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000939.tgz#b9ab7ac9e861bf78840b80c5dfbc471a5cd7e679" - integrity sha512-oXB23ImDJOgQpGjRv1tCtzAvJr4/OvrHi5SO2vUgB0g0xpdZZoA/BxfImiWfdwoYdUTtQrPsXsvYU/dmCSM8gg== - -chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -chokidar@^1.6.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" - integrity sha1-eY5ol3gVHIB2tLNg5e3SjNortGg= - dependencies: - anymatch "^1.3.0" - async-each "^1.0.0" - glob-parent "^2.0.0" - inherits "^2.0.1" +caniuse-lite@^1.0.30000974: + version "1.0.30000974" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000974.tgz#b7afe14ee004e97ce6dc73e3f878290a12928ad8" + integrity sha512-xc3rkNS/Zc3CmpMKuczWEdY2sZgx09BkAxfvkxlAEBTqcMHeL8QnPqhKse+5sRTi3nrw2pJwToD2WvKn1Uhvww== + +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chokidar@^2.0.4: + version "2.1.6" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.6.tgz#b6cad653a929e244ce8a834244164d241fa954c5" + integrity sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" is-binary-path "^1.0.0" - is-glob "^2.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" path-is-absolute "^1.0.0" - readdirp "^2.0.0" + readdirp "^2.2.1" + upath "^1.1.1" optionalDependencies: - fsevents "^1.0.0" + fsevents "^1.2.7" chownr@^1.1.1: version "1.1.1" @@ -784,10 +816,22 @@ collection-visit@^1.0.0: map-visit "^1.0.0" object-visit "^1.0.0" -commander@^2.11.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" - integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +commander@^2.8.1: + version "2.20.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" + integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== component-emitter@^1.2.1: version "1.2.1" @@ -804,7 +848,7 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= -convert-source-map@^1.5.0, convert-source-map@^1.5.1: +convert-source-map@^1.1.0: version "1.6.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== @@ -816,23 +860,39 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-js@^2.4.0, core-js@^2.5.0: - version "2.6.5" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.5.tgz#44bc8d249e7fb2ff5d00e0341a7ffb94fbf67895" - integrity sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A== +core-js-compat@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.1.3.tgz#0cc3ba4c7f62928c2837e1cffbe8dc78b4f1ae14" + integrity sha512-EP018pVhgwsKHz3YoN1hTq49aRe+h017Kjz0NQz3nXV0cCRMvH3fLQl+vEPGr4r4J5sk4sU3tUC7U1aqTCeJeA== + dependencies: + browserslist "^4.6.0" + core-js-pure "3.1.3" + semver "^6.1.0" + +core-js-pure@3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.1.3.tgz#4c90752d5b9471f641514f3728f51c1e0783d0b5" + integrity sha512-k3JWTrcQBKqjkjI0bkfXS0lbpWPxYuHWfMMjC1VDmzU4Q58IwSbuXSo99YO/hUHlw/EB4AlfA2PVxOGkrIq6dA== core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: +debug@^2.1.2, debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" +debug@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" @@ -870,24 +930,17 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= - dependencies: - repeating "^2.0.0" - detect-libc@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= -electron-to-chromium@^1.3.47: - version "1.3.113" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.113.tgz#b1ccf619df7295aea17bc6951dc689632629e4a9" - integrity sha512-De+lPAxEcpxvqPTyZAXELNpRZXABRxf+uL/rSykstQhzj/B0l1150G/ExIIxKc16lI89Hgz81J0BHAcbTqK49g== +electron-to-chromium@^1.3.150: + version "1.3.155" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.155.tgz#ebf0cc8eeaffd6151d1efad60fd9e021fb45fd3a" + integrity sha512-/ci/XgZG8jkLYOgOe3mpJY1onxPPTDY17y7scldhnSjjZqV6VvREG/LvwhRuV7BJbnENFfuDWZkSqlTh4x9ZjQ== -escape-string-regexp@^1.0.2: +escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= @@ -897,13 +950,6 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= - dependencies: - is-posix-bracket "^0.1.0" - expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" @@ -917,13 +963,6 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= - dependencies: - fill-range "^2.1.0" - extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -939,13 +978,6 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= - dependencies: - is-extglob "^1.0.0" - extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -960,22 +992,6 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -filename-regex@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" - integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= - -fill-range@^2.1.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" - integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== - dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^3.0.0" - repeat-element "^1.1.2" - repeat-string "^1.5.2" - fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -986,18 +1002,11 @@ fill-range@^4.0.0: repeat-string "^1.6.1" to-regex-range "^2.1.0" -for-in@^1.0.1, for-in@^1.0.2: +for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= -for-own@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= - dependencies: - for-in "^1.0.1" - fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" @@ -1012,7 +1021,7 @@ fs-minipass@^1.2.5: dependencies: minipass "^2.2.1" -fs-readdir-recursive@^1.0.0: +fs-readdir-recursive@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== @@ -1022,13 +1031,13 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.0.0: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.7.tgz#4851b664a3783e52003b3c66eb0eee1074933aa4" - integrity sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw== +fsevents@^1.2.7: + version "1.2.9" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" + integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== dependencies: - nan "^2.9.2" - node-pre-gyp "^0.10.0" + nan "^2.12.1" + node-pre-gyp "^0.12.0" gauge@~2.7.3: version "2.7.4" @@ -1049,22 +1058,27 @@ get-value@^2.0.3, get-value@^2.0.6: resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" + is-glob "^3.1.0" + path-dirname "^1.0.0" -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= +glob@^7.0.0: + version "7.1.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== dependencies: - is-glob "^2.0.0" + 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@^7.1.2, glob@^7.1.3: +glob@^7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== @@ -1076,22 +1090,20 @@ glob@^7.1.2, glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -globals@^9.18.0: - version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -graceful-fs@^4.1.11, graceful-fs@^4.1.4: +graceful-fs@^4.1.11: version "4.1.15" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= - dependencies: - ansi-regex "^2.0.0" +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= has-unicode@^2.0.0: version "2.0.1" @@ -1129,14 +1141,6 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" -home-or-tmp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" - integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.1" - iconv-lite@^0.4.4: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -1159,7 +1163,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@~2.0.3: +inherits@2, inherits@^2.0.3, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= @@ -1234,18 +1238,6 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-data-descriptor "^1.0.0" kind-of "^6.0.2" -is-dotfile@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= - -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= - dependencies: - is-primitive "^2.0.0" - is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -1258,17 +1250,10 @@ is-extendable@^1.0.1: dependencies: is-plain-object "^2.0.4" -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= - -is-finite@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" - integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= - dependencies: - number-is-nan "^1.0.0" +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= is-fullwidth-code-point@^1.0.0: version "1.0.0" @@ -1282,19 +1267,19 @@ is-fullwidth-code-point@^2.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= -is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= dependencies: - is-extglob "^1.0.0" + is-extglob "^2.1.0" -is-number@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= +is-glob@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== dependencies: - kind-of "^3.0.2" + is-extglob "^2.1.1" is-number@^3.0.0: version "3.0.0" @@ -1303,10 +1288,10 @@ is-number@^3.0.0: dependencies: kind-of "^3.0.2" -is-number@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" - integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== +is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" @@ -1315,16 +1300,6 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-posix-bracket@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= - -is-primitive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= - is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -1347,31 +1322,26 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= -"js-tokens@^3.0.0 || ^4.0.0": +js-levenshtein@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" + integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= - -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= -json5@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= - kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -1396,7 +1366,7 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== -lodash@^4.17.4: +lodash@^4.17.11: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== @@ -1420,31 +1390,7 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -math-random@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" - integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== - -micromatch@^2.1.5: - version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" - -micromatch@^3.1.10: +micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -1515,10 +1461,15 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -nan@^2.9.2: - version "2.13.1" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.1.tgz#a15bee3790bde247e8f38f1d446edcdaeb05f2dd" - integrity sha512-I6YB/YEuDeUZMmhscXKxGgZlFnhsn5y0hgOZBadkzfTRrZBtJDZeg6eQf7PYMIEclwmorTKK8GztsyOUSVBREA== +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +nan@^2.12.1: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== nanomatch@^1.2.9: version "1.2.13" @@ -1546,10 +1497,10 @@ needle@^2.2.1: iconv-lite "^0.4.4" sax "^1.2.4" -node-pre-gyp@^0.10.0: - version "0.10.3" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" - integrity sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A== +node-pre-gyp@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" + integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== dependencies: detect-libc "^1.0.2" mkdirp "^0.5.1" @@ -1562,6 +1513,13 @@ node-pre-gyp@^0.10.0: semver "^5.3.0" tar "^4" +node-releases@^1.1.23: + version "1.1.23" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.23.tgz#de7409f72de044a2fa59c097f436ba89c39997f0" + integrity sha512-uq1iL79YjfYC0WXoHbC/z28q/9pOl8kSHaXdWmAAc8No+bDwqkZbzIJz55g/MUsPgSGm9LZ7QSUbzTcH5tz47w== + dependencies: + semver "^5.3.0" + nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" @@ -1570,13 +1528,18 @@ nopt@^4.0.1: abbrev "1" osenv "^0.1.4" -normalize-path@^2.0.0, normalize-path@^2.0.1: +normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= dependencies: remove-trailing-separator "^1.0.1" +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + npm-bundled@^1.0.1: version "1.0.6" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" @@ -1626,14 +1589,6 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.omit@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= - dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" - object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" @@ -1653,7 +1608,7 @@ os-homedir@^1.0.0: resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: +os-tmpdir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= @@ -1666,31 +1621,26 @@ osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" -output-file-sync@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" - integrity sha1-0KM+7+YaIF+suQCS6CZZjVJFznY= +output-file-sync@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-2.0.1.tgz#f53118282f5f553c2799541792b723a4c71430c0" + integrity sha512-mDho4qm7WgIXIGf4eYU1RHN2UU5tPfVYVSRwDJw0uTmj35DQUt/eNp19N7v6T3SrR0ESTEf2up2CGO73qI35zQ== dependencies: - graceful-fs "^4.1.4" + graceful-fs "^4.1.11" + is-plain-obj "^1.1.0" mkdirp "^0.5.1" - object-assign "^4.1.0" - -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= - dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= -path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= @@ -1700,12 +1650,7 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= - -private@^0.1.6, private@^0.1.8: +private@^0.1.6: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== @@ -1715,15 +1660,6 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== -randomatic@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" - integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== - dependencies: - is-number "^4.0.0" - kind-of "^6.0.0" - math-random "^1.0.1" - rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -1747,7 +1683,7 @@ readable-stream@^2.0.2, readable-stream@^2.0.6: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readdirp@^2.0.0: +readdirp@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== @@ -1756,37 +1692,25 @@ readdirp@^2.0.0: micromatch "^3.1.10" readable-stream "^2.0.2" -regenerate@^1.2.1: +regenerate-unicode-properties@^8.0.2: + version "8.1.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" + integrity sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== -regenerator-runtime@^0.10.5: - version "0.10.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" - integrity sha1-M2w+/BIgrc7dosn6tntaeVWjNlg= - -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== - -regenerator-transform@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" - integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== +regenerator-transform@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.0.tgz#2ca9aaf7a2c239dd32e4761218425b8c7a86ecaf" + integrity sha512-rtOelq4Cawlbmq9xuMR5gdFmv7ku/sFoB7sRiywx7aq53bc52b4j6zvH7Te1Vt/X2YveDKnCGUbioieU7FEL3w== dependencies: - babel-runtime "^6.18.0" - babel-types "^6.19.0" private "^0.1.6" -regex-cache@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" - integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== - dependencies: - is-equal-shallow "^0.1.3" - regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" @@ -1795,24 +1719,32 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexpu-core@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" - integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= +regexp-tree@^0.1.6: + version "0.1.10" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.10.tgz#d837816a039c7af8a8d64d7a7c3cf6a1d93450bc" + integrity sha512-K1qVSbcedffwuIslMwpe6vGlj+ZXRnGkvjAtFHfDZZZuEdA/h0dxljAPu9vhUo6Rrx2U2AwJ+nSQ6hK+lrP5MQ== + +regexpu-core@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.5.4.tgz#080d9d02289aa87fe1667a4f5136bc98a6aebaae" + integrity sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ== dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" + regenerate "^1.4.0" + regenerate-unicode-properties "^8.0.2" + regjsgen "^0.5.0" + regjsparser "^0.6.0" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.1.0" -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= +regjsgen@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" + integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA== -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= +regjsparser@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" + integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== dependencies: jsesc "~0.5.0" @@ -1826,18 +1758,11 @@ repeat-element@^1.1.2: resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== -repeat-string@^1.5.2, repeat-string@^1.6.1: +repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= - dependencies: - is-finite "^1.0.0" - resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" @@ -1882,6 +1807,16 @@ semver@^5.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== +semver@^5.5.0: + version "5.7.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" + integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== + +semver@^6.1.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.1.1.tgz#53f53da9b30b2103cd4f15eab3a18ecbcb210c9b" + integrity sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ== + set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -1912,10 +1847,10 @@ signal-exit@^3.0.0: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== snapdragon-node@^2.0.1: version "2.1.1" @@ -1958,19 +1893,12 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.4.15: - version "0.4.18" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" - integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== - dependencies: - source-map "^0.5.6" - source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= -source-map@^0.5.6, source-map@^0.5.7: +source-map@^0.5.0, source-map@^0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -2033,10 +1961,12 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" tar@^4: version "4.4.8" @@ -2051,10 +1981,10 @@ tar@^4: safe-buffer "^5.1.2" yallist "^3.0.2" -to-fast-properties@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= to-object-path@^0.3.0: version "0.3.0" @@ -2086,6 +2016,29 @@ trim-right@^1.0.1: resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" + integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" + integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== + union-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" @@ -2104,6 +2057,11 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" +upath@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" + integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== + urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" @@ -2114,23 +2072,11 @@ use@^3.1.0: resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== -user-home@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" - integrity sha1-K1viOjK2Onyd640PKNSFcko98ZA= - util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= -v8flags@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" - integrity sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ= - dependencies: - user-home "^1.1.1" - wide-align@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" diff --git a/packages/code-export-utils/.babelrc b/packages/code-export-utils/.babelrc index f781122745..bd80a8410e 100644 --- a/packages/code-export-utils/.babelrc +++ b/packages/code-export-utils/.babelrc @@ -1,6 +1,6 @@ { "presets": [ - ["env", + ["@babel/preset-env", { "targets": { "node": "8" @@ -8,6 +8,6 @@ }] ], "plugins": [ - "transform-object-rest-spread", + "@babel/plugin-proposal-object-rest-spread" ] } diff --git a/packages/code-export-utils/package.json b/packages/code-export-utils/package.json index b099ba5a27..a4c486db99 100644 --- a/packages/code-export-utils/package.json +++ b/packages/code-export-utils/package.json @@ -16,9 +16,9 @@ }, "main": "dist/index.js", "devDependencies": { - "babel-cli": "^6.26.0", - "babel-plugin-transform-object-rest-spread": "^6.26.0", - "babel-preset-env": "^1.7.0" + "@babel/cli": "^7.4.4", + "@babel/plugin-proposal-object-rest-spread": "^7.4.4", + "@babel/preset-env": "^7.4.5" }, "dependencies": { "js-string-escape": "^1.0.1" diff --git a/packages/code-export-utils/yarn.lock b/packages/code-export-utils/yarn.lock index 8b8ef48209..68e5079872 100644 --- a/packages/code-export-utils/yarn.lock +++ b/packages/code-export-utils/yarn.lock @@ -2,6 +2,610 @@ # yarn lockfile v1 +"@babel/cli@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.4.4.tgz#5454bb7112f29026a4069d8e6f0e1794e651966c" + integrity sha512-XGr5YjQSjgTa6OzQZY57FAJsdeVSAKR/u/KA5exWIz66IKtv/zXtHy+fIZcMry/EgYegwuHE7vzGnrFhjdIAsQ== + dependencies: + commander "^2.8.1" + convert-source-map "^1.1.0" + fs-readdir-recursive "^1.1.0" + glob "^7.0.0" + lodash "^4.17.11" + mkdirp "^0.5.1" + output-file-sync "^2.0.0" + slash "^2.0.0" + source-map "^0.5.0" + optionalDependencies: + chokidar "^2.0.4" + +"@babel/code-frame@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" + integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== + dependencies: + "@babel/highlight" "^7.0.0" + +"@babel/generator@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.4.tgz#174a215eb843fc392c7edcaabeaa873de6e8f041" + integrity sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ== + dependencies: + "@babel/types" "^7.4.4" + jsesc "^2.5.1" + lodash "^4.17.11" + source-map "^0.5.0" + trim-right "^1.0.1" + +"@babel/helper-annotate-as-pure@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" + integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" + integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-call-delegate@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz#87c1f8ca19ad552a736a7a27b1c1fcf8b1ff1f43" + integrity sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ== + dependencies: + "@babel/helper-hoist-variables" "^7.4.4" + "@babel/traverse" "^7.4.4" + "@babel/types" "^7.4.4" + +"@babel/helper-define-map@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.4.4.tgz#6969d1f570b46bdc900d1eba8e5d59c48ba2c12a" + integrity sha512-IX3Ln8gLhZpSuqHJSnTNBWGDE9kdkTEWl21A/K7PQ00tseBwbqCHTvNLHSBd9M0R5rER4h5Rsvj9vw0R5SieBg== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/types" "^7.4.4" + lodash "^4.17.11" + +"@babel/helper-explode-assignable-expression@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" + integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== + dependencies: + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-function-name@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" + integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== + dependencies: + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-get-function-arity@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" + integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-hoist-variables@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz#0298b5f25c8c09c53102d52ac4a98f773eb2850a" + integrity sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w== + dependencies: + "@babel/types" "^7.4.4" + +"@babel/helper-member-expression-to-functions@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz#8cd14b0a0df7ff00f009e7d7a436945f47c7a16f" + integrity sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-imports@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" + integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.4.4.tgz#96115ea42a2f139e619e98ed46df6019b94414b8" + integrity sha512-3Z1yp8TVQf+B4ynN7WoHPKS8EkdTbgAEy0nU0rs/1Kw4pDgmvYH3rz3aI11KgxKCba2cn7N+tqzV1mY2HMN96w== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/template" "^7.4.4" + "@babel/types" "^7.4.4" + lodash "^4.17.11" + +"@babel/helper-optimise-call-expression@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" + integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-plugin-utils@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" + integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== + +"@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.4.4.tgz#a47e02bc91fb259d2e6727c2a30013e3ac13c4a2" + integrity sha512-Y5nuB/kESmR3tKjU8Nkn1wMGEx1tjJX076HBMeL3XLQCu6vA/YRzuTW0bbb+qRnXvQGn+d6Rx953yffl8vEy7Q== + dependencies: + lodash "^4.17.11" + +"@babel/helper-remap-async-to-generator@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" + integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-wrap-function" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-replace-supers@^7.1.0", "@babel/helper-replace-supers@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.4.4.tgz#aee41783ebe4f2d3ab3ae775e1cc6f1a90cefa27" + integrity sha512-04xGEnd+s01nY1l15EuMS1rfKktNF+1CkKmHoErDppjAAZL+IUBZpzT748x262HF7fibaQPhbvWUl5HeSt1EXg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/traverse" "^7.4.4" + "@babel/types" "^7.4.4" + +"@babel/helper-simple-access@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" + integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== + dependencies: + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-split-export-declaration@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677" + integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q== + dependencies: + "@babel/types" "^7.4.4" + +"@babel/helper-wrap-function@^7.1.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" + integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.2.0" + +"@babel/highlight@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" + integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.4.4", "@babel/parser@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.5.tgz#04af8d5d5a2b044a2a1bffacc1e5e6673544e872" + integrity sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew== + +"@babel/plugin-proposal-async-generator-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" + integrity sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + "@babel/plugin-syntax-async-generators" "^7.2.0" + +"@babel/plugin-proposal-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" + integrity sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + +"@babel/plugin-proposal-object-rest-spread@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.4.tgz#1ef173fcf24b3e2df92a678f027673b55e7e3005" + integrity sha512-dMBG6cSPBbHeEBdFXeQ2QLc5gUpg4Vkaz8octD4aoW/ISO+jBOcsuxYL7bsb5WSu8RLP6boxrBIALEHgoHtO9g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" + integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + +"@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz#501ffd9826c0b91da22690720722ac7cb1ca9c78" + integrity sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.5.4" + +"@babel/plugin-syntax-async-generators@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f" + integrity sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" + integrity sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-object-rest-spread@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" + integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" + integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-arrow-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" + integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-async-to-generator@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.4.4.tgz#a3f1d01f2f21cadab20b33a82133116f14fb5894" + integrity sha512-YiqW2Li8TXmzgbXw+STsSqPBPFnGviiaSp6CYOq55X8GQ2SGVLrXB6pNid8HkqkZAzOH6knbai3snhP7v0fNwA== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + +"@babel/plugin-transform-block-scoped-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" + integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-block-scoping@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.4.tgz#c13279fabf6b916661531841a23c4b7dae29646d" + integrity sha512-jkTUyWZcTrwxu5DD4rWz6rDB5Cjdmgz6z7M7RLXOJyCUkFBawssDGcGh8M/0FTSB87avyJI1HsTwUXp9nKA1PA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + lodash "^4.17.11" + +"@babel/plugin-transform-classes@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.4.tgz#0ce4094cdafd709721076d3b9c38ad31ca715eb6" + integrity sha512-/e44eFLImEGIpL9qPxSRat13I5QNRgBLu2hOQJCF7VLy/otSM/sypV1+XaIw5+502RX/+6YaSAPmldk+nhHDPw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-define-map" "^7.4.4" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.4.4" + "@babel/helper-split-export-declaration" "^7.4.4" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" + integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-destructuring@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.4.tgz#9d964717829cc9e4b601fc82a26a71a4d8faf20f" + integrity sha512-/aOx+nW0w8eHiEHm+BTERB2oJn5D127iye/SUQl7NjHy0lf+j7h4MKMMSOwdazGq9OxgiNADncE+SRJkCxjZpQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz#361a148bc951444312c69446d76ed1ea8e4450c3" + integrity sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.5.4" + +"@babel/plugin-transform-duplicate-keys@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz#d952c4930f312a4dbfff18f0b2914e60c35530b3" + integrity sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-exponentiation-operator@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" + integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-for-of@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz#0267fc735e24c808ba173866c6c4d1440fc3c556" + integrity sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-function-name@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz#e1436116abb0610c2259094848754ac5230922ad" + integrity sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" + integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-member-expression-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz#fa10aa5c58a2cb6afcf2c9ffa8cb4d8b3d489a2d" + integrity sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-amd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz#82a9bce45b95441f617a24011dc89d12da7f4ee6" + integrity sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-commonjs@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.4.tgz#0bef4713d30f1d78c2e59b3d6db40e60192cac1e" + integrity sha512-4sfBOJt58sEo9a2BQXnZq+Q3ZTSAUXyK3E30o36BOGnJ+tvJ6YSxF0PG6kERvbeISgProodWuI9UVG3/FMY6iw== + dependencies: + "@babel/helper-module-transforms" "^7.4.4" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + +"@babel/plugin-transform-modules-systemjs@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.4.4.tgz#dc83c5665b07d6c2a7b224c00ac63659ea36a405" + integrity sha512-MSiModfILQc3/oqnG7NrP1jHaSPryO6tA2kOMmAQApz5dayPxWiHqmq4sWH2xF5LcQK56LlbKByCd8Aah/OIkQ== + dependencies: + "@babel/helper-hoist-variables" "^7.4.4" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-umd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae" + integrity sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz#9d269fd28a370258199b4294736813a60bbdd106" + integrity sha512-z7+2IsWafTBbjNsOxU/Iv5CvTJlr5w4+HGu1HovKYTtgJ362f7kBcQglkfmlspKKZ3bgrbSGvLfNx++ZJgCWsg== + dependencies: + regexp-tree "^0.1.6" + +"@babel/plugin-transform-new-target@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz#18d120438b0cc9ee95a47f2c72bc9768fbed60a5" + integrity sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-object-super@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz#b35d4c10f56bab5d650047dad0f1d8e8814b6598" + integrity sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.1.0" + +"@babel/plugin-transform-parameters@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz#7556cf03f318bd2719fe4c922d2d808be5571e16" + integrity sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw== + dependencies: + "@babel/helper-call-delegate" "^7.4.4" + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-property-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz#03e33f653f5b25c4eb572c98b9485055b389e905" + integrity sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-regenerator@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz#629dc82512c55cee01341fb27bdfcb210354680f" + integrity sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA== + dependencies: + regenerator-transform "^0.14.0" + +"@babel/plugin-transform-reserved-words@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz#4792af87c998a49367597d07fedf02636d2e1634" + integrity sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-shorthand-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" + integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-spread@^7.2.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz#3103a9abe22f742b6d406ecd3cd49b774919b406" + integrity sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-sticky-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" + integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + +"@babel/plugin-transform-template-literals@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz#9d28fea7bbce637fb7612a0750989d8321d4bcb0" + integrity sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-typeof-symbol@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2" + integrity sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-unicode-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz#ab4634bb4f14d36728bf5978322b35587787970f" + integrity sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.5.4" + +"@babel/preset-env@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.4.5.tgz#2fad7f62983d5af563b5f3139242755884998a58" + integrity sha512-f2yNVXM+FsR5V8UwcFeIHzHWgnhXg3NpRmy0ADvALpnhB0SLbCvrCRr4BLOUYbQNLS+Z0Yer46x9dJXpXewI7w== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-async-generator-functions" "^7.2.0" + "@babel/plugin-proposal-json-strings" "^7.2.0" + "@babel/plugin-proposal-object-rest-spread" "^7.4.4" + "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-syntax-async-generators" "^7.2.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + "@babel/plugin-transform-arrow-functions" "^7.2.0" + "@babel/plugin-transform-async-to-generator" "^7.4.4" + "@babel/plugin-transform-block-scoped-functions" "^7.2.0" + "@babel/plugin-transform-block-scoping" "^7.4.4" + "@babel/plugin-transform-classes" "^7.4.4" + "@babel/plugin-transform-computed-properties" "^7.2.0" + "@babel/plugin-transform-destructuring" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/plugin-transform-duplicate-keys" "^7.2.0" + "@babel/plugin-transform-exponentiation-operator" "^7.2.0" + "@babel/plugin-transform-for-of" "^7.4.4" + "@babel/plugin-transform-function-name" "^7.4.4" + "@babel/plugin-transform-literals" "^7.2.0" + "@babel/plugin-transform-member-expression-literals" "^7.2.0" + "@babel/plugin-transform-modules-amd" "^7.2.0" + "@babel/plugin-transform-modules-commonjs" "^7.4.4" + "@babel/plugin-transform-modules-systemjs" "^7.4.4" + "@babel/plugin-transform-modules-umd" "^7.2.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.4.5" + "@babel/plugin-transform-new-target" "^7.4.4" + "@babel/plugin-transform-object-super" "^7.2.0" + "@babel/plugin-transform-parameters" "^7.4.4" + "@babel/plugin-transform-property-literals" "^7.2.0" + "@babel/plugin-transform-regenerator" "^7.4.5" + "@babel/plugin-transform-reserved-words" "^7.2.0" + "@babel/plugin-transform-shorthand-properties" "^7.2.0" + "@babel/plugin-transform-spread" "^7.2.0" + "@babel/plugin-transform-sticky-regex" "^7.2.0" + "@babel/plugin-transform-template-literals" "^7.4.4" + "@babel/plugin-transform-typeof-symbol" "^7.2.0" + "@babel/plugin-transform-unicode-regex" "^7.4.4" + "@babel/types" "^7.4.4" + browserslist "^4.6.0" + core-js-compat "^3.1.1" + invariant "^2.2.2" + js-levenshtein "^1.1.3" + semver "^5.5.0" + +"@babel/template@^7.1.0", "@babel/template@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.4.tgz#f4b88d1225689a08f5bc3a17483545be9e4ed237" + integrity sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.4.4" + "@babel/types" "^7.4.4" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.4": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.5.tgz#4e92d1728fd2f1897dafdd321efbff92156c3216" + integrity sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.4.4" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/parser" "^7.4.5" + "@babel/types" "^7.4.4" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.11" + +"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.4.tgz#8db9e9a629bb7c29370009b4b779ed93fe57d5f0" + integrity sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ== + dependencies: + esutils "^2.0.2" + lodash "^4.17.11" + to-fast-properties "^2.0.0" + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -17,18 +621,20 @@ ansi-regex@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" -anymatch@^1.3.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" - integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA== +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== dependencies: - micromatch "^2.1.5" - normalize-path "^2.0.0" + micromatch "^3.1.4" + normalize-path "^2.1.1" aproba@^1.0.3: version "1.2.0" @@ -43,19 +649,12 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.6" -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= - dependencies: - arr-flatten "^1.0.1" - arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= -arr-flatten@^1.0.1, arr-flatten@^1.1.0: +arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== @@ -65,11 +664,6 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= -array-unique@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= - array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" @@ -80,571 +674,16 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= -async-each@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.2.tgz#8b8a7ca2a658f927e9f307d6d1a42f4199f0f735" - integrity sha512-6xrbvN0MOBKSJDdonmSSz2OwFSgxRaVtBDes26mj9KIGtDo+g9xosFRSC+i1gQh2oAN/tQ62AI/pGZGQjVOiRg== +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== atob@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -babel-cli@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.26.0.tgz#502ab54874d7db88ad00b887a06383ce03d002f1" - integrity sha1-UCq1SHTX24itALiHoGODzgPQAvE= - dependencies: - babel-core "^6.26.0" - babel-polyfill "^6.26.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - commander "^2.11.0" - convert-source-map "^1.5.0" - fs-readdir-recursive "^1.0.0" - glob "^7.1.2" - lodash "^4.17.4" - output-file-sync "^1.1.2" - path-is-absolute "^1.0.1" - slash "^1.0.0" - source-map "^0.5.6" - v8flags "^2.1.1" - optionalDependencies: - chokidar "^1.6.1" - -babel-code-frame@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= - dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - -babel-core@^6.26.0: - version "6.26.3" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" - integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== - dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.1" - debug "^2.6.9" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.8" - slash "^1.0.0" - source-map "^0.5.7" - -babel-generator@^6.26.0: - version "6.26.1" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" - integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.17.4" - source-map "^0.5.7" - trim-right "^1.0.1" - -babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" - integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ= - dependencies: - babel-helper-explode-assignable-expression "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-call-delegate@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" - integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-define-map@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" - integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-explode-assignable-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" - integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo= - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-function-name@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" - integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= - dependencies: - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-get-function-arity@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" - integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-hoist-variables@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" - integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-optimise-call-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" - integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-regex@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" - integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI= - dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-remap-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" - integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-replace-supers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" - integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo= - dependencies: - babel-helper-optimise-call-expression "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helpers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" - integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-check-es2015-constants@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" - integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-syntax-async-functions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" - integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= - -babel-plugin-syntax-exponentiation-operator@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" - integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= - -babel-plugin-syntax-object-rest-spread@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" - integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= - -babel-plugin-syntax-trailing-function-commas@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" - integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM= - -babel-plugin-transform-async-to-generator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" - integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E= - dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-functions "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-arrow-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" - integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" - integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoping@^6.23.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" - integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= - dependencies: - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-plugin-transform-es2015-classes@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" - integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs= - dependencies: - babel-helper-define-map "^6.24.1" - babel-helper-function-name "^6.24.1" - babel-helper-optimise-call-expression "^6.24.1" - babel-helper-replace-supers "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-computed-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" - integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM= - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-destructuring@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" - integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-duplicate-keys@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" - integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-for-of@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" - integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-function-name@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" - integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" - integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" - integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ= - dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: - version "6.26.2" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" - integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== - dependencies: - babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-types "^6.26.0" - -babel-plugin-transform-es2015-modules-systemjs@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" - integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM= - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-umd@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" - integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg= - dependencies: - babel-plugin-transform-es2015-modules-amd "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-object-super@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" - integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40= - dependencies: - babel-helper-replace-supers "^6.24.1" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-parameters@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" - integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= - dependencies: - babel-helper-call-delegate "^6.24.1" - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-shorthand-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" - integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-spread@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" - integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-sticky-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" - integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw= - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-template-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" - integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-typeof-symbol@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" - integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-unicode-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" - integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek= - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - regexpu-core "^2.0.0" - -babel-plugin-transform-exponentiation-operator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" - integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4= - dependencies: - babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" - babel-plugin-syntax-exponentiation-operator "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-object-rest-spread@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" - integrity sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY= - dependencies: - babel-plugin-syntax-object-rest-spread "^6.8.0" - babel-runtime "^6.26.0" - -babel-plugin-transform-regenerator@^6.22.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" - integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8= - dependencies: - regenerator-transform "^0.10.0" - -babel-plugin-transform-strict-mode@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" - integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-polyfill@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" - integrity sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM= - dependencies: - babel-runtime "^6.26.0" - core-js "^2.5.0" - regenerator-runtime "^0.10.5" - -babel-preset-env@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" - integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg== - dependencies: - babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-to-generator "^6.22.0" - babel-plugin-transform-es2015-arrow-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoping "^6.23.0" - babel-plugin-transform-es2015-classes "^6.23.0" - babel-plugin-transform-es2015-computed-properties "^6.22.0" - babel-plugin-transform-es2015-destructuring "^6.23.0" - babel-plugin-transform-es2015-duplicate-keys "^6.22.0" - babel-plugin-transform-es2015-for-of "^6.23.0" - babel-plugin-transform-es2015-function-name "^6.22.0" - babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.22.0" - babel-plugin-transform-es2015-modules-commonjs "^6.23.0" - babel-plugin-transform-es2015-modules-systemjs "^6.23.0" - babel-plugin-transform-es2015-modules-umd "^6.23.0" - babel-plugin-transform-es2015-object-super "^6.22.0" - babel-plugin-transform-es2015-parameters "^6.23.0" - babel-plugin-transform-es2015-shorthand-properties "^6.22.0" - babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.22.0" - babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.23.0" - babel-plugin-transform-es2015-unicode-regex "^6.22.0" - babel-plugin-transform-exponentiation-operator "^6.22.0" - babel-plugin-transform-regenerator "^6.22.0" - browserslist "^3.2.6" - invariant "^2.2.2" - semver "^5.3.0" - -babel-register@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" - integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= - dependencies: - babel-core "^6.26.0" - babel-runtime "^6.26.0" - core-js "^2.5.0" - home-or-tmp "^2.0.0" - lodash "^4.17.4" - mkdirp "^0.5.1" - source-map-support "^0.4.15" - -babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -babel-template@^6.24.1, babel-template@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= - dependencies: - babel-runtime "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - lodash "^4.17.4" - -babel-traverse@^6.24.1, babel-traverse@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= - dependencies: - babel-code-frame "^6.26.0" - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - debug "^2.6.8" - globals "^9.18.0" - invariant "^2.2.2" - lodash "^4.17.4" - -babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= - dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" - -babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== - balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" @@ -676,16 +715,7 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= - dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" - -braces@^2.3.1: +braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== @@ -701,13 +731,14 @@ braces@^2.3.1: split-string "^3.0.2" to-regex "^3.0.1" -browserslist@^3.2.6: - version "3.2.8" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" - integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== +browserslist@^4.6.0: + version "4.6.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.6.2.tgz#574c665950915c2ac73a4594b8537a9eba26203f" + integrity sha512-2neU/V0giQy9h3XMPwLhEY3+Ao0uHSwHvU8Q1Ea6AgLVL1sXbX3dzPrJ8NWe5Hi4PoTkCYXOtVR9rfRLI0J/8Q== dependencies: - caniuse-lite "^1.0.30000844" - electron-to-chromium "^1.3.47" + caniuse-lite "^1.0.30000974" + electron-to-chromium "^1.3.150" + node-releases "^1.1.23" cache-base@^1.0.1: version "1.0.1" @@ -724,37 +755,38 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" -caniuse-lite@^1.0.30000844: - version "1.0.30000939" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000939.tgz#b9ab7ac9e861bf78840b80c5dfbc471a5cd7e679" - integrity sha512-oXB23ImDJOgQpGjRv1tCtzAvJr4/OvrHi5SO2vUgB0g0xpdZZoA/BxfImiWfdwoYdUTtQrPsXsvYU/dmCSM8gg== - -chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -chokidar@^1.6.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" - integrity sha1-eY5ol3gVHIB2tLNg5e3SjNortGg= - dependencies: - anymatch "^1.3.0" - async-each "^1.0.0" - glob-parent "^2.0.0" - inherits "^2.0.1" +caniuse-lite@^1.0.30000974: + version "1.0.30000974" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000974.tgz#b7afe14ee004e97ce6dc73e3f878290a12928ad8" + integrity sha512-xc3rkNS/Zc3CmpMKuczWEdY2sZgx09BkAxfvkxlAEBTqcMHeL8QnPqhKse+5sRTi3nrw2pJwToD2WvKn1Uhvww== + +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chokidar@^2.0.4: + version "2.1.6" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.6.tgz#b6cad653a929e244ce8a834244164d241fa954c5" + integrity sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" is-binary-path "^1.0.0" - is-glob "^2.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" path-is-absolute "^1.0.0" - readdirp "^2.0.0" + readdirp "^2.2.1" + upath "^1.1.1" optionalDependencies: - fsevents "^1.0.0" + fsevents "^1.2.7" chownr@^1.1.1: version "1.1.1" @@ -784,10 +816,22 @@ collection-visit@^1.0.0: map-visit "^1.0.0" object-visit "^1.0.0" -commander@^2.11.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" - integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +commander@^2.8.1: + version "2.20.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" + integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== component-emitter@^1.2.1: version "1.2.1" @@ -804,7 +848,7 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= -convert-source-map@^1.5.0, convert-source-map@^1.5.1: +convert-source-map@^1.1.0: version "1.6.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== @@ -816,23 +860,39 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-js@^2.4.0, core-js@^2.5.0: - version "2.6.5" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.5.tgz#44bc8d249e7fb2ff5d00e0341a7ffb94fbf67895" - integrity sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A== +core-js-compat@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.1.3.tgz#0cc3ba4c7f62928c2837e1cffbe8dc78b4f1ae14" + integrity sha512-EP018pVhgwsKHz3YoN1hTq49aRe+h017Kjz0NQz3nXV0cCRMvH3fLQl+vEPGr4r4J5sk4sU3tUC7U1aqTCeJeA== + dependencies: + browserslist "^4.6.0" + core-js-pure "3.1.3" + semver "^6.1.0" + +core-js-pure@3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.1.3.tgz#4c90752d5b9471f641514f3728f51c1e0783d0b5" + integrity sha512-k3JWTrcQBKqjkjI0bkfXS0lbpWPxYuHWfMMjC1VDmzU4Q58IwSbuXSo99YO/hUHlw/EB4AlfA2PVxOGkrIq6dA== core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: +debug@^2.1.2, debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" +debug@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" @@ -870,24 +930,17 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= - dependencies: - repeating "^2.0.0" - detect-libc@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= -electron-to-chromium@^1.3.47: - version "1.3.113" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.113.tgz#b1ccf619df7295aea17bc6951dc689632629e4a9" - integrity sha512-De+lPAxEcpxvqPTyZAXELNpRZXABRxf+uL/rSykstQhzj/B0l1150G/ExIIxKc16lI89Hgz81J0BHAcbTqK49g== +electron-to-chromium@^1.3.150: + version "1.3.155" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.155.tgz#ebf0cc8eeaffd6151d1efad60fd9e021fb45fd3a" + integrity sha512-/ci/XgZG8jkLYOgOe3mpJY1onxPPTDY17y7scldhnSjjZqV6VvREG/LvwhRuV7BJbnENFfuDWZkSqlTh4x9ZjQ== -escape-string-regexp@^1.0.2: +escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= @@ -897,13 +950,6 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= - dependencies: - is-posix-bracket "^0.1.0" - expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" @@ -917,13 +963,6 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= - dependencies: - fill-range "^2.1.0" - extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -939,13 +978,6 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= - dependencies: - is-extglob "^1.0.0" - extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -960,22 +992,6 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -filename-regex@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" - integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= - -fill-range@^2.1.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" - integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== - dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^3.0.0" - repeat-element "^1.1.2" - repeat-string "^1.5.2" - fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -986,18 +1002,11 @@ fill-range@^4.0.0: repeat-string "^1.6.1" to-regex-range "^2.1.0" -for-in@^1.0.1, for-in@^1.0.2: +for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= -for-own@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= - dependencies: - for-in "^1.0.1" - fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" @@ -1012,7 +1021,7 @@ fs-minipass@^1.2.5: dependencies: minipass "^2.2.1" -fs-readdir-recursive@^1.0.0: +fs-readdir-recursive@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== @@ -1022,13 +1031,13 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.0.0: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.7.tgz#4851b664a3783e52003b3c66eb0eee1074933aa4" - integrity sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw== +fsevents@^1.2.7: + version "1.2.9" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" + integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== dependencies: - nan "^2.9.2" - node-pre-gyp "^0.10.0" + nan "^2.12.1" + node-pre-gyp "^0.12.0" gauge@~2.7.3: version "2.7.4" @@ -1049,22 +1058,27 @@ get-value@^2.0.3, get-value@^2.0.6: resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" + is-glob "^3.1.0" + path-dirname "^1.0.0" -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= +glob@^7.0.0: + version "7.1.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== dependencies: - is-glob "^2.0.0" + 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@^7.1.2, glob@^7.1.3: +glob@^7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== @@ -1076,22 +1090,20 @@ glob@^7.1.2, glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -globals@^9.18.0: - version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -graceful-fs@^4.1.11, graceful-fs@^4.1.4: +graceful-fs@^4.1.11: version "4.1.15" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= - dependencies: - ansi-regex "^2.0.0" +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= has-unicode@^2.0.0: version "2.0.1" @@ -1129,14 +1141,6 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" -home-or-tmp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" - integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.1" - iconv-lite@^0.4.4: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -1159,7 +1163,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@~2.0.3: +inherits@2, inherits@^2.0.3, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= @@ -1234,18 +1238,6 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-data-descriptor "^1.0.0" kind-of "^6.0.2" -is-dotfile@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= - -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= - dependencies: - is-primitive "^2.0.0" - is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -1258,17 +1250,10 @@ is-extendable@^1.0.1: dependencies: is-plain-object "^2.0.4" -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= - -is-finite@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" - integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= - dependencies: - number-is-nan "^1.0.0" +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= is-fullwidth-code-point@^1.0.0: version "1.0.0" @@ -1282,19 +1267,19 @@ is-fullwidth-code-point@^2.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= -is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= dependencies: - is-extglob "^1.0.0" + is-extglob "^2.1.0" -is-number@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= +is-glob@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== dependencies: - kind-of "^3.0.2" + is-extglob "^2.1.1" is-number@^3.0.0: version "3.0.0" @@ -1303,10 +1288,10 @@ is-number@^3.0.0: dependencies: kind-of "^3.0.2" -is-number@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" - integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== +is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" @@ -1315,16 +1300,6 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-posix-bracket@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= - -is-primitive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= - is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -1347,36 +1322,31 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= +js-levenshtein@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" + integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== + js-string-escape@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" integrity sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8= -"js-tokens@^3.0.0 || ^4.0.0": +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= - -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= -json5@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= - kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -1401,7 +1371,7 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== -lodash@^4.17.4: +lodash@^4.17.11: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== @@ -1425,31 +1395,7 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -math-random@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" - integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== - -micromatch@^2.1.5: - version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" - -micromatch@^3.1.10: +micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -1520,10 +1466,15 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -nan@^2.9.2: - version "2.13.1" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.1.tgz#a15bee3790bde247e8f38f1d446edcdaeb05f2dd" - integrity sha512-I6YB/YEuDeUZMmhscXKxGgZlFnhsn5y0hgOZBadkzfTRrZBtJDZeg6eQf7PYMIEclwmorTKK8GztsyOUSVBREA== +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +nan@^2.12.1: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== nanomatch@^1.2.9: version "1.2.13" @@ -1551,10 +1502,10 @@ needle@^2.2.1: iconv-lite "^0.4.4" sax "^1.2.4" -node-pre-gyp@^0.10.0: - version "0.10.3" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" - integrity sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A== +node-pre-gyp@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" + integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== dependencies: detect-libc "^1.0.2" mkdirp "^0.5.1" @@ -1567,6 +1518,13 @@ node-pre-gyp@^0.10.0: semver "^5.3.0" tar "^4" +node-releases@^1.1.23: + version "1.1.23" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.23.tgz#de7409f72de044a2fa59c097f436ba89c39997f0" + integrity sha512-uq1iL79YjfYC0WXoHbC/z28q/9pOl8kSHaXdWmAAc8No+bDwqkZbzIJz55g/MUsPgSGm9LZ7QSUbzTcH5tz47w== + dependencies: + semver "^5.3.0" + nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" @@ -1575,13 +1533,18 @@ nopt@^4.0.1: abbrev "1" osenv "^0.1.4" -normalize-path@^2.0.0, normalize-path@^2.0.1: +normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= dependencies: remove-trailing-separator "^1.0.1" +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + npm-bundled@^1.0.1: version "1.0.6" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" @@ -1631,14 +1594,6 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.omit@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= - dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" - object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" @@ -1658,7 +1613,7 @@ os-homedir@^1.0.0: resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: +os-tmpdir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= @@ -1671,31 +1626,26 @@ osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" -output-file-sync@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" - integrity sha1-0KM+7+YaIF+suQCS6CZZjVJFznY= +output-file-sync@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-2.0.1.tgz#f53118282f5f553c2799541792b723a4c71430c0" + integrity sha512-mDho4qm7WgIXIGf4eYU1RHN2UU5tPfVYVSRwDJw0uTmj35DQUt/eNp19N7v6T3SrR0ESTEf2up2CGO73qI35zQ== dependencies: - graceful-fs "^4.1.4" + graceful-fs "^4.1.11" + is-plain-obj "^1.1.0" mkdirp "^0.5.1" - object-assign "^4.1.0" - -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= - dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= -path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= @@ -1705,12 +1655,7 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= - -private@^0.1.6, private@^0.1.8: +private@^0.1.6: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== @@ -1720,15 +1665,6 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== -randomatic@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" - integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== - dependencies: - is-number "^4.0.0" - kind-of "^6.0.0" - math-random "^1.0.1" - rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -1752,7 +1688,7 @@ readable-stream@^2.0.2, readable-stream@^2.0.6: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readdirp@^2.0.0: +readdirp@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== @@ -1761,37 +1697,25 @@ readdirp@^2.0.0: micromatch "^3.1.10" readable-stream "^2.0.2" -regenerate@^1.2.1: +regenerate-unicode-properties@^8.0.2: + version "8.1.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" + integrity sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== -regenerator-runtime@^0.10.5: - version "0.10.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" - integrity sha1-M2w+/BIgrc7dosn6tntaeVWjNlg= - -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== - -regenerator-transform@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" - integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== +regenerator-transform@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.0.tgz#2ca9aaf7a2c239dd32e4761218425b8c7a86ecaf" + integrity sha512-rtOelq4Cawlbmq9xuMR5gdFmv7ku/sFoB7sRiywx7aq53bc52b4j6zvH7Te1Vt/X2YveDKnCGUbioieU7FEL3w== dependencies: - babel-runtime "^6.18.0" - babel-types "^6.19.0" private "^0.1.6" -regex-cache@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" - integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== - dependencies: - is-equal-shallow "^0.1.3" - regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" @@ -1800,24 +1724,32 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexpu-core@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" - integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= +regexp-tree@^0.1.6: + version "0.1.10" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.10.tgz#d837816a039c7af8a8d64d7a7c3cf6a1d93450bc" + integrity sha512-K1qVSbcedffwuIslMwpe6vGlj+ZXRnGkvjAtFHfDZZZuEdA/h0dxljAPu9vhUo6Rrx2U2AwJ+nSQ6hK+lrP5MQ== + +regexpu-core@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.5.4.tgz#080d9d02289aa87fe1667a4f5136bc98a6aebaae" + integrity sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ== dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" + regenerate "^1.4.0" + regenerate-unicode-properties "^8.0.2" + regjsgen "^0.5.0" + regjsparser "^0.6.0" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.1.0" -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= +regjsgen@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" + integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA== -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= +regjsparser@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" + integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== dependencies: jsesc "~0.5.0" @@ -1831,18 +1763,11 @@ repeat-element@^1.1.2: resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== -repeat-string@^1.5.2, repeat-string@^1.6.1: +repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= - dependencies: - is-finite "^1.0.0" - resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" @@ -1887,6 +1812,16 @@ semver@^5.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== +semver@^5.5.0: + version "5.7.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" + integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== + +semver@^6.1.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.1.1.tgz#53f53da9b30b2103cd4f15eab3a18ecbcb210c9b" + integrity sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ== + set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -1917,10 +1852,10 @@ signal-exit@^3.0.0: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== snapdragon-node@^2.0.1: version "2.1.1" @@ -1963,19 +1898,12 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.4.15: - version "0.4.18" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" - integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== - dependencies: - source-map "^0.5.6" - source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= -source-map@^0.5.6, source-map@^0.5.7: +source-map@^0.5.0, source-map@^0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -2038,10 +1966,12 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" tar@^4: version "4.4.8" @@ -2056,10 +1986,10 @@ tar@^4: safe-buffer "^5.1.2" yallist "^3.0.2" -to-fast-properties@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= to-object-path@^0.3.0: version "0.3.0" @@ -2091,6 +2021,29 @@ trim-right@^1.0.1: resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" + integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" + integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== + union-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" @@ -2109,6 +2062,11 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" +upath@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" + integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== + urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" @@ -2119,23 +2077,11 @@ use@^3.1.0: resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== -user-home@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" - integrity sha1-K1viOjK2Onyd640PKNSFcko98ZA= - util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= -v8flags@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" - integrity sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ= - dependencies: - user-home "^1.1.1" - wide-align@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" diff --git a/packages/code-export/.babelrc b/packages/code-export/.babelrc index 77190a6cd7..c5d7c1d078 100644 --- a/packages/code-export/.babelrc +++ b/packages/code-export/.babelrc @@ -1,10 +1,12 @@ - { - "presets": [ - ["env", - { - "targets": { - "node": "8" - } - }] - ] - } +{ + "presets": [ + [ + "@babel/preset-env", + { + "targets": { + "node": "8" + } + } + ] + ] +} diff --git a/packages/code-export/package.json b/packages/code-export/package.json index 43af2aaace..d4acf311e4 100644 --- a/packages/code-export/package.json +++ b/packages/code-export/package.json @@ -16,8 +16,8 @@ }, "main": "dist/index.js", "devDependencies": { - "babel-cli": "^6.26.0", - "babel-preset-env": "^1.7.0" + "@babel/cli": "^7.4.4", + "@babel/preset-env": "^7.4.5" }, "dependencies": { "code-export-java-junit": "^3.8.1", diff --git a/packages/code-export/yarn.lock b/packages/code-export/yarn.lock index efe022ff98..f31289d921 100644 --- a/packages/code-export/yarn.lock +++ b/packages/code-export/yarn.lock @@ -2,6 +2,610 @@ # yarn lockfile v1 +"@babel/cli@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.4.4.tgz#5454bb7112f29026a4069d8e6f0e1794e651966c" + integrity sha512-XGr5YjQSjgTa6OzQZY57FAJsdeVSAKR/u/KA5exWIz66IKtv/zXtHy+fIZcMry/EgYegwuHE7vzGnrFhjdIAsQ== + dependencies: + commander "^2.8.1" + convert-source-map "^1.1.0" + fs-readdir-recursive "^1.1.0" + glob "^7.0.0" + lodash "^4.17.11" + mkdirp "^0.5.1" + output-file-sync "^2.0.0" + slash "^2.0.0" + source-map "^0.5.0" + optionalDependencies: + chokidar "^2.0.4" + +"@babel/code-frame@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" + integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== + dependencies: + "@babel/highlight" "^7.0.0" + +"@babel/generator@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.4.tgz#174a215eb843fc392c7edcaabeaa873de6e8f041" + integrity sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ== + dependencies: + "@babel/types" "^7.4.4" + jsesc "^2.5.1" + lodash "^4.17.11" + source-map "^0.5.0" + trim-right "^1.0.1" + +"@babel/helper-annotate-as-pure@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" + integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" + integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-call-delegate@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz#87c1f8ca19ad552a736a7a27b1c1fcf8b1ff1f43" + integrity sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ== + dependencies: + "@babel/helper-hoist-variables" "^7.4.4" + "@babel/traverse" "^7.4.4" + "@babel/types" "^7.4.4" + +"@babel/helper-define-map@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.4.4.tgz#6969d1f570b46bdc900d1eba8e5d59c48ba2c12a" + integrity sha512-IX3Ln8gLhZpSuqHJSnTNBWGDE9kdkTEWl21A/K7PQ00tseBwbqCHTvNLHSBd9M0R5rER4h5Rsvj9vw0R5SieBg== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/types" "^7.4.4" + lodash "^4.17.11" + +"@babel/helper-explode-assignable-expression@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" + integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== + dependencies: + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-function-name@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" + integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== + dependencies: + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-get-function-arity@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" + integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-hoist-variables@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz#0298b5f25c8c09c53102d52ac4a98f773eb2850a" + integrity sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w== + dependencies: + "@babel/types" "^7.4.4" + +"@babel/helper-member-expression-to-functions@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz#8cd14b0a0df7ff00f009e7d7a436945f47c7a16f" + integrity sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-imports@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" + integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.4.4.tgz#96115ea42a2f139e619e98ed46df6019b94414b8" + integrity sha512-3Z1yp8TVQf+B4ynN7WoHPKS8EkdTbgAEy0nU0rs/1Kw4pDgmvYH3rz3aI11KgxKCba2cn7N+tqzV1mY2HMN96w== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/template" "^7.4.4" + "@babel/types" "^7.4.4" + lodash "^4.17.11" + +"@babel/helper-optimise-call-expression@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" + integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-plugin-utils@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" + integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== + +"@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.4.4.tgz#a47e02bc91fb259d2e6727c2a30013e3ac13c4a2" + integrity sha512-Y5nuB/kESmR3tKjU8Nkn1wMGEx1tjJX076HBMeL3XLQCu6vA/YRzuTW0bbb+qRnXvQGn+d6Rx953yffl8vEy7Q== + dependencies: + lodash "^4.17.11" + +"@babel/helper-remap-async-to-generator@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" + integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-wrap-function" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-replace-supers@^7.1.0", "@babel/helper-replace-supers@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.4.4.tgz#aee41783ebe4f2d3ab3ae775e1cc6f1a90cefa27" + integrity sha512-04xGEnd+s01nY1l15EuMS1rfKktNF+1CkKmHoErDppjAAZL+IUBZpzT748x262HF7fibaQPhbvWUl5HeSt1EXg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/traverse" "^7.4.4" + "@babel/types" "^7.4.4" + +"@babel/helper-simple-access@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" + integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== + dependencies: + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-split-export-declaration@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677" + integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q== + dependencies: + "@babel/types" "^7.4.4" + +"@babel/helper-wrap-function@^7.1.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" + integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.2.0" + +"@babel/highlight@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" + integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.4.4", "@babel/parser@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.5.tgz#04af8d5d5a2b044a2a1bffacc1e5e6673544e872" + integrity sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew== + +"@babel/plugin-proposal-async-generator-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" + integrity sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + "@babel/plugin-syntax-async-generators" "^7.2.0" + +"@babel/plugin-proposal-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" + integrity sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + +"@babel/plugin-proposal-object-rest-spread@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.4.tgz#1ef173fcf24b3e2df92a678f027673b55e7e3005" + integrity sha512-dMBG6cSPBbHeEBdFXeQ2QLc5gUpg4Vkaz8octD4aoW/ISO+jBOcsuxYL7bsb5WSu8RLP6boxrBIALEHgoHtO9g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" + integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + +"@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz#501ffd9826c0b91da22690720722ac7cb1ca9c78" + integrity sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.5.4" + +"@babel/plugin-syntax-async-generators@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f" + integrity sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" + integrity sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-object-rest-spread@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" + integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" + integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-arrow-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" + integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-async-to-generator@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.4.4.tgz#a3f1d01f2f21cadab20b33a82133116f14fb5894" + integrity sha512-YiqW2Li8TXmzgbXw+STsSqPBPFnGviiaSp6CYOq55X8GQ2SGVLrXB6pNid8HkqkZAzOH6knbai3snhP7v0fNwA== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + +"@babel/plugin-transform-block-scoped-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" + integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-block-scoping@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.4.tgz#c13279fabf6b916661531841a23c4b7dae29646d" + integrity sha512-jkTUyWZcTrwxu5DD4rWz6rDB5Cjdmgz6z7M7RLXOJyCUkFBawssDGcGh8M/0FTSB87avyJI1HsTwUXp9nKA1PA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + lodash "^4.17.11" + +"@babel/plugin-transform-classes@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.4.tgz#0ce4094cdafd709721076d3b9c38ad31ca715eb6" + integrity sha512-/e44eFLImEGIpL9qPxSRat13I5QNRgBLu2hOQJCF7VLy/otSM/sypV1+XaIw5+502RX/+6YaSAPmldk+nhHDPw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-define-map" "^7.4.4" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.4.4" + "@babel/helper-split-export-declaration" "^7.4.4" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" + integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-destructuring@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.4.tgz#9d964717829cc9e4b601fc82a26a71a4d8faf20f" + integrity sha512-/aOx+nW0w8eHiEHm+BTERB2oJn5D127iye/SUQl7NjHy0lf+j7h4MKMMSOwdazGq9OxgiNADncE+SRJkCxjZpQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz#361a148bc951444312c69446d76ed1ea8e4450c3" + integrity sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.5.4" + +"@babel/plugin-transform-duplicate-keys@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz#d952c4930f312a4dbfff18f0b2914e60c35530b3" + integrity sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-exponentiation-operator@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" + integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-for-of@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz#0267fc735e24c808ba173866c6c4d1440fc3c556" + integrity sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-function-name@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz#e1436116abb0610c2259094848754ac5230922ad" + integrity sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" + integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-member-expression-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz#fa10aa5c58a2cb6afcf2c9ffa8cb4d8b3d489a2d" + integrity sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-amd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz#82a9bce45b95441f617a24011dc89d12da7f4ee6" + integrity sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-commonjs@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.4.tgz#0bef4713d30f1d78c2e59b3d6db40e60192cac1e" + integrity sha512-4sfBOJt58sEo9a2BQXnZq+Q3ZTSAUXyK3E30o36BOGnJ+tvJ6YSxF0PG6kERvbeISgProodWuI9UVG3/FMY6iw== + dependencies: + "@babel/helper-module-transforms" "^7.4.4" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + +"@babel/plugin-transform-modules-systemjs@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.4.4.tgz#dc83c5665b07d6c2a7b224c00ac63659ea36a405" + integrity sha512-MSiModfILQc3/oqnG7NrP1jHaSPryO6tA2kOMmAQApz5dayPxWiHqmq4sWH2xF5LcQK56LlbKByCd8Aah/OIkQ== + dependencies: + "@babel/helper-hoist-variables" "^7.4.4" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-umd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae" + integrity sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz#9d269fd28a370258199b4294736813a60bbdd106" + integrity sha512-z7+2IsWafTBbjNsOxU/Iv5CvTJlr5w4+HGu1HovKYTtgJ362f7kBcQglkfmlspKKZ3bgrbSGvLfNx++ZJgCWsg== + dependencies: + regexp-tree "^0.1.6" + +"@babel/plugin-transform-new-target@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz#18d120438b0cc9ee95a47f2c72bc9768fbed60a5" + integrity sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-object-super@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz#b35d4c10f56bab5d650047dad0f1d8e8814b6598" + integrity sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.1.0" + +"@babel/plugin-transform-parameters@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz#7556cf03f318bd2719fe4c922d2d808be5571e16" + integrity sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw== + dependencies: + "@babel/helper-call-delegate" "^7.4.4" + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-property-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz#03e33f653f5b25c4eb572c98b9485055b389e905" + integrity sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-regenerator@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz#629dc82512c55cee01341fb27bdfcb210354680f" + integrity sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA== + dependencies: + regenerator-transform "^0.14.0" + +"@babel/plugin-transform-reserved-words@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz#4792af87c998a49367597d07fedf02636d2e1634" + integrity sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-shorthand-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" + integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-spread@^7.2.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz#3103a9abe22f742b6d406ecd3cd49b774919b406" + integrity sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-sticky-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" + integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + +"@babel/plugin-transform-template-literals@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz#9d28fea7bbce637fb7612a0750989d8321d4bcb0" + integrity sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-typeof-symbol@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2" + integrity sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-unicode-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz#ab4634bb4f14d36728bf5978322b35587787970f" + integrity sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.5.4" + +"@babel/preset-env@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.4.5.tgz#2fad7f62983d5af563b5f3139242755884998a58" + integrity sha512-f2yNVXM+FsR5V8UwcFeIHzHWgnhXg3NpRmy0ADvALpnhB0SLbCvrCRr4BLOUYbQNLS+Z0Yer46x9dJXpXewI7w== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-async-generator-functions" "^7.2.0" + "@babel/plugin-proposal-json-strings" "^7.2.0" + "@babel/plugin-proposal-object-rest-spread" "^7.4.4" + "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-syntax-async-generators" "^7.2.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + "@babel/plugin-transform-arrow-functions" "^7.2.0" + "@babel/plugin-transform-async-to-generator" "^7.4.4" + "@babel/plugin-transform-block-scoped-functions" "^7.2.0" + "@babel/plugin-transform-block-scoping" "^7.4.4" + "@babel/plugin-transform-classes" "^7.4.4" + "@babel/plugin-transform-computed-properties" "^7.2.0" + "@babel/plugin-transform-destructuring" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/plugin-transform-duplicate-keys" "^7.2.0" + "@babel/plugin-transform-exponentiation-operator" "^7.2.0" + "@babel/plugin-transform-for-of" "^7.4.4" + "@babel/plugin-transform-function-name" "^7.4.4" + "@babel/plugin-transform-literals" "^7.2.0" + "@babel/plugin-transform-member-expression-literals" "^7.2.0" + "@babel/plugin-transform-modules-amd" "^7.2.0" + "@babel/plugin-transform-modules-commonjs" "^7.4.4" + "@babel/plugin-transform-modules-systemjs" "^7.4.4" + "@babel/plugin-transform-modules-umd" "^7.2.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.4.5" + "@babel/plugin-transform-new-target" "^7.4.4" + "@babel/plugin-transform-object-super" "^7.2.0" + "@babel/plugin-transform-parameters" "^7.4.4" + "@babel/plugin-transform-property-literals" "^7.2.0" + "@babel/plugin-transform-regenerator" "^7.4.5" + "@babel/plugin-transform-reserved-words" "^7.2.0" + "@babel/plugin-transform-shorthand-properties" "^7.2.0" + "@babel/plugin-transform-spread" "^7.2.0" + "@babel/plugin-transform-sticky-regex" "^7.2.0" + "@babel/plugin-transform-template-literals" "^7.4.4" + "@babel/plugin-transform-typeof-symbol" "^7.2.0" + "@babel/plugin-transform-unicode-regex" "^7.4.4" + "@babel/types" "^7.4.4" + browserslist "^4.6.0" + core-js-compat "^3.1.1" + invariant "^2.2.2" + js-levenshtein "^1.1.3" + semver "^5.5.0" + +"@babel/template@^7.1.0", "@babel/template@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.4.tgz#f4b88d1225689a08f5bc3a17483545be9e4ed237" + integrity sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.4.4" + "@babel/types" "^7.4.4" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.4": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.5.tgz#4e92d1728fd2f1897dafdd321efbff92156c3216" + integrity sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.4.4" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/parser" "^7.4.5" + "@babel/types" "^7.4.4" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.11" + +"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.4.tgz#8db9e9a629bb7c29370009b4b779ed93fe57d5f0" + integrity sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ== + dependencies: + esutils "^2.0.2" + lodash "^4.17.11" + to-fast-properties "^2.0.0" + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -17,18 +621,20 @@ ansi-regex@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" -anymatch@^1.3.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" - integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA== +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== dependencies: - micromatch "^2.1.5" - normalize-path "^2.0.0" + micromatch "^3.1.4" + normalize-path "^2.1.1" aproba@^1.0.3: version "1.2.0" @@ -43,19 +649,12 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.6" -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= - dependencies: - arr-flatten "^1.0.1" - arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= -arr-flatten@^1.0.1, arr-flatten@^1.1.0: +arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== @@ -65,11 +664,6 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= -array-unique@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= - array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" @@ -80,558 +674,16 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= -async-each@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.2.tgz#8b8a7ca2a658f927e9f307d6d1a42f4199f0f735" - integrity sha512-6xrbvN0MOBKSJDdonmSSz2OwFSgxRaVtBDes26mj9KIGtDo+g9xosFRSC+i1gQh2oAN/tQ62AI/pGZGQjVOiRg== +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== atob@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -babel-cli@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.26.0.tgz#502ab54874d7db88ad00b887a06383ce03d002f1" - integrity sha1-UCq1SHTX24itALiHoGODzgPQAvE= - dependencies: - babel-core "^6.26.0" - babel-polyfill "^6.26.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - commander "^2.11.0" - convert-source-map "^1.5.0" - fs-readdir-recursive "^1.0.0" - glob "^7.1.2" - lodash "^4.17.4" - output-file-sync "^1.1.2" - path-is-absolute "^1.0.1" - slash "^1.0.0" - source-map "^0.5.6" - v8flags "^2.1.1" - optionalDependencies: - chokidar "^1.6.1" - -babel-code-frame@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= - dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - -babel-core@^6.26.0: - version "6.26.3" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" - integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== - dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.1" - debug "^2.6.9" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.8" - slash "^1.0.0" - source-map "^0.5.7" - -babel-generator@^6.26.0: - version "6.26.1" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" - integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.17.4" - source-map "^0.5.7" - trim-right "^1.0.1" - -babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" - integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ= - dependencies: - babel-helper-explode-assignable-expression "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-call-delegate@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" - integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-define-map@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" - integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-explode-assignable-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" - integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo= - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-function-name@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" - integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= - dependencies: - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-get-function-arity@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" - integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-hoist-variables@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" - integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-optimise-call-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" - integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-regex@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" - integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI= - dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-remap-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" - integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-replace-supers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" - integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo= - dependencies: - babel-helper-optimise-call-expression "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helpers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" - integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-check-es2015-constants@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" - integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-syntax-async-functions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" - integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= - -babel-plugin-syntax-exponentiation-operator@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" - integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= - -babel-plugin-syntax-trailing-function-commas@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" - integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM= - -babel-plugin-transform-async-to-generator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" - integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E= - dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-functions "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-arrow-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" - integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" - integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoping@^6.23.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" - integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= - dependencies: - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-plugin-transform-es2015-classes@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" - integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs= - dependencies: - babel-helper-define-map "^6.24.1" - babel-helper-function-name "^6.24.1" - babel-helper-optimise-call-expression "^6.24.1" - babel-helper-replace-supers "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-computed-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" - integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM= - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-destructuring@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" - integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-duplicate-keys@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" - integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-for-of@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" - integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-function-name@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" - integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" - integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" - integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ= - dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: - version "6.26.2" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" - integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== - dependencies: - babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-types "^6.26.0" - -babel-plugin-transform-es2015-modules-systemjs@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" - integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM= - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-umd@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" - integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg= - dependencies: - babel-plugin-transform-es2015-modules-amd "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-object-super@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" - integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40= - dependencies: - babel-helper-replace-supers "^6.24.1" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-parameters@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" - integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= - dependencies: - babel-helper-call-delegate "^6.24.1" - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-shorthand-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" - integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-spread@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" - integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-sticky-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" - integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw= - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-template-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" - integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-typeof-symbol@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" - integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-unicode-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" - integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek= - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - regexpu-core "^2.0.0" - -babel-plugin-transform-exponentiation-operator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" - integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4= - dependencies: - babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" - babel-plugin-syntax-exponentiation-operator "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-regenerator@^6.22.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" - integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8= - dependencies: - regenerator-transform "^0.10.0" - -babel-plugin-transform-strict-mode@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" - integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-polyfill@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" - integrity sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM= - dependencies: - babel-runtime "^6.26.0" - core-js "^2.5.0" - regenerator-runtime "^0.10.5" - -babel-preset-env@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" - integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg== - dependencies: - babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-to-generator "^6.22.0" - babel-plugin-transform-es2015-arrow-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoping "^6.23.0" - babel-plugin-transform-es2015-classes "^6.23.0" - babel-plugin-transform-es2015-computed-properties "^6.22.0" - babel-plugin-transform-es2015-destructuring "^6.23.0" - babel-plugin-transform-es2015-duplicate-keys "^6.22.0" - babel-plugin-transform-es2015-for-of "^6.23.0" - babel-plugin-transform-es2015-function-name "^6.22.0" - babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.22.0" - babel-plugin-transform-es2015-modules-commonjs "^6.23.0" - babel-plugin-transform-es2015-modules-systemjs "^6.23.0" - babel-plugin-transform-es2015-modules-umd "^6.23.0" - babel-plugin-transform-es2015-object-super "^6.22.0" - babel-plugin-transform-es2015-parameters "^6.23.0" - babel-plugin-transform-es2015-shorthand-properties "^6.22.0" - babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.22.0" - babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.23.0" - babel-plugin-transform-es2015-unicode-regex "^6.22.0" - babel-plugin-transform-exponentiation-operator "^6.22.0" - babel-plugin-transform-regenerator "^6.22.0" - browserslist "^3.2.6" - invariant "^2.2.2" - semver "^5.3.0" - -babel-register@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" - integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= - dependencies: - babel-core "^6.26.0" - babel-runtime "^6.26.0" - core-js "^2.5.0" - home-or-tmp "^2.0.0" - lodash "^4.17.4" - mkdirp "^0.5.1" - source-map-support "^0.4.15" - -babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -babel-template@^6.24.1, babel-template@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= - dependencies: - babel-runtime "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - lodash "^4.17.4" - -babel-traverse@^6.24.1, babel-traverse@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= - dependencies: - babel-code-frame "^6.26.0" - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - debug "^2.6.8" - globals "^9.18.0" - invariant "^2.2.2" - lodash "^4.17.4" - -babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= - dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" - -babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== - balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" @@ -663,16 +715,7 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= - dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" - -braces@^2.3.1: +braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== @@ -688,13 +731,14 @@ braces@^2.3.1: split-string "^3.0.2" to-regex "^3.0.1" -browserslist@^3.2.6: - version "3.2.8" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" - integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== +browserslist@^4.6.0: + version "4.6.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.6.2.tgz#574c665950915c2ac73a4594b8537a9eba26203f" + integrity sha512-2neU/V0giQy9h3XMPwLhEY3+Ao0uHSwHvU8Q1Ea6AgLVL1sXbX3dzPrJ8NWe5Hi4PoTkCYXOtVR9rfRLI0J/8Q== dependencies: - caniuse-lite "^1.0.30000844" - electron-to-chromium "^1.3.47" + caniuse-lite "^1.0.30000974" + electron-to-chromium "^1.3.150" + node-releases "^1.1.23" cache-base@^1.0.1: version "1.0.1" @@ -711,37 +755,38 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" -caniuse-lite@^1.0.30000844: - version "1.0.30000943" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000943.tgz#00b25bd5808edc2ed1cfb53533a6a6ff6ca014ee" - integrity sha512-nJMjU4UaesbOHTcmz6VS+qaog++Fdepg4KAya5DL/AZrL/aaAZDGOOQ0AECtsJa09r4cJBdHZMive5mw8lnQ5A== - -chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -chokidar@^1.6.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" - integrity sha1-eY5ol3gVHIB2tLNg5e3SjNortGg= - dependencies: - anymatch "^1.3.0" - async-each "^1.0.0" - glob-parent "^2.0.0" - inherits "^2.0.1" +caniuse-lite@^1.0.30000974: + version "1.0.30000974" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000974.tgz#b7afe14ee004e97ce6dc73e3f878290a12928ad8" + integrity sha512-xc3rkNS/Zc3CmpMKuczWEdY2sZgx09BkAxfvkxlAEBTqcMHeL8QnPqhKse+5sRTi3nrw2pJwToD2WvKn1Uhvww== + +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chokidar@^2.0.4: + version "2.1.6" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.6.tgz#b6cad653a929e244ce8a834244164d241fa954c5" + integrity sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" is-binary-path "^1.0.0" - is-glob "^2.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" path-is-absolute "^1.0.0" - readdirp "^2.0.0" + readdirp "^2.2.1" + upath "^1.1.1" optionalDependencies: - fsevents "^1.0.0" + fsevents "^1.2.7" chownr@^1.1.1: version "1.1.1" @@ -771,10 +816,22 @@ collection-visit@^1.0.0: map-visit "^1.0.0" object-visit "^1.0.0" -commander@^2.11.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" - integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +commander@^2.8.1: + version "2.20.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" + integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== component-emitter@^1.2.1: version "1.2.1" @@ -791,7 +848,7 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= -convert-source-map@^1.5.0, convert-source-map@^1.5.1: +convert-source-map@^1.1.0: version "1.6.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== @@ -803,23 +860,39 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-js@^2.4.0, core-js@^2.5.0: - version "2.6.5" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.5.tgz#44bc8d249e7fb2ff5d00e0341a7ffb94fbf67895" - integrity sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A== +core-js-compat@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.1.3.tgz#0cc3ba4c7f62928c2837e1cffbe8dc78b4f1ae14" + integrity sha512-EP018pVhgwsKHz3YoN1hTq49aRe+h017Kjz0NQz3nXV0cCRMvH3fLQl+vEPGr4r4J5sk4sU3tUC7U1aqTCeJeA== + dependencies: + browserslist "^4.6.0" + core-js-pure "3.1.3" + semver "^6.1.0" + +core-js-pure@3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.1.3.tgz#4c90752d5b9471f641514f3728f51c1e0783d0b5" + integrity sha512-k3JWTrcQBKqjkjI0bkfXS0lbpWPxYuHWfMMjC1VDmzU4Q58IwSbuXSo99YO/hUHlw/EB4AlfA2PVxOGkrIq6dA== core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: +debug@^2.1.2, debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" +debug@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" @@ -857,24 +930,17 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= - dependencies: - repeating "^2.0.0" - detect-libc@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= -electron-to-chromium@^1.3.47: - version "1.3.113" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.113.tgz#b1ccf619df7295aea17bc6951dc689632629e4a9" - integrity sha512-De+lPAxEcpxvqPTyZAXELNpRZXABRxf+uL/rSykstQhzj/B0l1150G/ExIIxKc16lI89Hgz81J0BHAcbTqK49g== +electron-to-chromium@^1.3.150: + version "1.3.155" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.155.tgz#ebf0cc8eeaffd6151d1efad60fd9e021fb45fd3a" + integrity sha512-/ci/XgZG8jkLYOgOe3mpJY1onxPPTDY17y7scldhnSjjZqV6VvREG/LvwhRuV7BJbnENFfuDWZkSqlTh4x9ZjQ== -escape-string-regexp@^1.0.2: +escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= @@ -884,13 +950,6 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= - dependencies: - is-posix-bracket "^0.1.0" - expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" @@ -904,13 +963,6 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= - dependencies: - fill-range "^2.1.0" - extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -926,13 +978,6 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= - dependencies: - is-extglob "^1.0.0" - extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -947,22 +992,6 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -filename-regex@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" - integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= - -fill-range@^2.1.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" - integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== - dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^3.0.0" - repeat-element "^1.1.2" - repeat-string "^1.5.2" - fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -973,18 +1002,11 @@ fill-range@^4.0.0: repeat-string "^1.6.1" to-regex-range "^2.1.0" -for-in@^1.0.1, for-in@^1.0.2: +for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= -for-own@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= - dependencies: - for-in "^1.0.1" - fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" @@ -999,7 +1021,7 @@ fs-minipass@^1.2.5: dependencies: minipass "^2.2.1" -fs-readdir-recursive@^1.0.0: +fs-readdir-recursive@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== @@ -1009,13 +1031,13 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.0.0: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.7.tgz#4851b664a3783e52003b3c66eb0eee1074933aa4" - integrity sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw== +fsevents@^1.2.7: + version "1.2.9" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" + integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== dependencies: - nan "^2.9.2" - node-pre-gyp "^0.10.0" + nan "^2.12.1" + node-pre-gyp "^0.12.0" gauge@~2.7.3: version "2.7.4" @@ -1036,22 +1058,27 @@ get-value@^2.0.3, get-value@^2.0.6: resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" + is-glob "^3.1.0" + path-dirname "^1.0.0" -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= +glob@^7.0.0: + version "7.1.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== dependencies: - is-glob "^2.0.0" + 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@^7.1.2, glob@^7.1.3: +glob@^7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== @@ -1063,22 +1090,20 @@ glob@^7.1.2, glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -globals@^9.18.0: - version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -graceful-fs@^4.1.11, graceful-fs@^4.1.4: +graceful-fs@^4.1.11: version "4.1.15" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= - dependencies: - ansi-regex "^2.0.0" +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= has-unicode@^2.0.0: version "2.0.1" @@ -1116,14 +1141,6 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" -home-or-tmp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" - integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.1" - iconv-lite@^0.4.4: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -1146,7 +1163,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@~2.0.3: +inherits@2, inherits@^2.0.3, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= @@ -1221,18 +1238,6 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-data-descriptor "^1.0.0" kind-of "^6.0.2" -is-dotfile@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= - -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= - dependencies: - is-primitive "^2.0.0" - is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -1245,17 +1250,10 @@ is-extendable@^1.0.1: dependencies: is-plain-object "^2.0.4" -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= - -is-finite@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" - integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= - dependencies: - number-is-nan "^1.0.0" +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= is-fullwidth-code-point@^1.0.0: version "1.0.0" @@ -1269,19 +1267,19 @@ is-fullwidth-code-point@^2.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= -is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= dependencies: - is-extglob "^1.0.0" + is-extglob "^2.1.0" -is-number@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= +is-glob@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== dependencies: - kind-of "^3.0.2" + is-extglob "^2.1.1" is-number@^3.0.0: version "3.0.0" @@ -1290,10 +1288,10 @@ is-number@^3.0.0: dependencies: kind-of "^3.0.2" -is-number@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" - integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== +is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" @@ -1302,16 +1300,6 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-posix-bracket@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= - -is-primitive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= - is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -1334,31 +1322,26 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= -"js-tokens@^3.0.0 || ^4.0.0": +js-levenshtein@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" + integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= - -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= -json5@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= - kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -1383,7 +1366,7 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== -lodash@^4.17.4: +lodash@^4.17.11: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== @@ -1407,31 +1390,7 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -math-random@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" - integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== - -micromatch@^2.1.5: - version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" - -micromatch@^3.1.10: +micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -1502,10 +1461,15 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -nan@^2.9.2: - version "2.13.1" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.1.tgz#a15bee3790bde247e8f38f1d446edcdaeb05f2dd" - integrity sha512-I6YB/YEuDeUZMmhscXKxGgZlFnhsn5y0hgOZBadkzfTRrZBtJDZeg6eQf7PYMIEclwmorTKK8GztsyOUSVBREA== +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +nan@^2.12.1: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== nanomatch@^1.2.9: version "1.2.13" @@ -1533,10 +1497,10 @@ needle@^2.2.1: iconv-lite "^0.4.4" sax "^1.2.4" -node-pre-gyp@^0.10.0: - version "0.10.3" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" - integrity sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A== +node-pre-gyp@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" + integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== dependencies: detect-libc "^1.0.2" mkdirp "^0.5.1" @@ -1549,6 +1513,13 @@ node-pre-gyp@^0.10.0: semver "^5.3.0" tar "^4" +node-releases@^1.1.23: + version "1.1.23" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.23.tgz#de7409f72de044a2fa59c097f436ba89c39997f0" + integrity sha512-uq1iL79YjfYC0WXoHbC/z28q/9pOl8kSHaXdWmAAc8No+bDwqkZbzIJz55g/MUsPgSGm9LZ7QSUbzTcH5tz47w== + dependencies: + semver "^5.3.0" + nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" @@ -1557,13 +1528,18 @@ nopt@^4.0.1: abbrev "1" osenv "^0.1.4" -normalize-path@^2.0.0, normalize-path@^2.0.1: +normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= dependencies: remove-trailing-separator "^1.0.1" +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + npm-bundled@^1.0.1: version "1.0.6" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" @@ -1613,14 +1589,6 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.omit@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= - dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" - object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" @@ -1640,7 +1608,7 @@ os-homedir@^1.0.0: resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: +os-tmpdir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= @@ -1653,31 +1621,26 @@ osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" -output-file-sync@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" - integrity sha1-0KM+7+YaIF+suQCS6CZZjVJFznY= +output-file-sync@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-2.0.1.tgz#f53118282f5f553c2799541792b723a4c71430c0" + integrity sha512-mDho4qm7WgIXIGf4eYU1RHN2UU5tPfVYVSRwDJw0uTmj35DQUt/eNp19N7v6T3SrR0ESTEf2up2CGO73qI35zQ== dependencies: - graceful-fs "^4.1.4" + graceful-fs "^4.1.11" + is-plain-obj "^1.1.0" mkdirp "^0.5.1" - object-assign "^4.1.0" - -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= - dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= -path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= @@ -1687,12 +1650,7 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= - -private@^0.1.6, private@^0.1.8: +private@^0.1.6: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== @@ -1702,15 +1660,6 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== -randomatic@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" - integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== - dependencies: - is-number "^4.0.0" - kind-of "^6.0.0" - math-random "^1.0.1" - rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -1734,7 +1683,7 @@ readable-stream@^2.0.2, readable-stream@^2.0.6: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readdirp@^2.0.0: +readdirp@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== @@ -1743,37 +1692,25 @@ readdirp@^2.0.0: micromatch "^3.1.10" readable-stream "^2.0.2" -regenerate@^1.2.1: +regenerate-unicode-properties@^8.0.2: + version "8.1.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" + integrity sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== -regenerator-runtime@^0.10.5: - version "0.10.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" - integrity sha1-M2w+/BIgrc7dosn6tntaeVWjNlg= - -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== - -regenerator-transform@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" - integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== +regenerator-transform@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.0.tgz#2ca9aaf7a2c239dd32e4761218425b8c7a86ecaf" + integrity sha512-rtOelq4Cawlbmq9xuMR5gdFmv7ku/sFoB7sRiywx7aq53bc52b4j6zvH7Te1Vt/X2YveDKnCGUbioieU7FEL3w== dependencies: - babel-runtime "^6.18.0" - babel-types "^6.19.0" private "^0.1.6" -regex-cache@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" - integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== - dependencies: - is-equal-shallow "^0.1.3" - regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" @@ -1782,24 +1719,32 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexpu-core@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" - integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= +regexp-tree@^0.1.6: + version "0.1.10" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.10.tgz#d837816a039c7af8a8d64d7a7c3cf6a1d93450bc" + integrity sha512-K1qVSbcedffwuIslMwpe6vGlj+ZXRnGkvjAtFHfDZZZuEdA/h0dxljAPu9vhUo6Rrx2U2AwJ+nSQ6hK+lrP5MQ== + +regexpu-core@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.5.4.tgz#080d9d02289aa87fe1667a4f5136bc98a6aebaae" + integrity sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ== dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" + regenerate "^1.4.0" + regenerate-unicode-properties "^8.0.2" + regjsgen "^0.5.0" + regjsparser "^0.6.0" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.1.0" -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= +regjsgen@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" + integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA== -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= +regjsparser@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" + integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== dependencies: jsesc "~0.5.0" @@ -1813,18 +1758,11 @@ repeat-element@^1.1.2: resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== -repeat-string@^1.5.2, repeat-string@^1.6.1: +repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= - dependencies: - is-finite "^1.0.0" - resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" @@ -1869,6 +1807,16 @@ semver@^5.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== +semver@^5.5.0: + version "5.7.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" + integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== + +semver@^6.1.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.1.1.tgz#53f53da9b30b2103cd4f15eab3a18ecbcb210c9b" + integrity sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ== + set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -1899,10 +1847,10 @@ signal-exit@^3.0.0: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== snapdragon-node@^2.0.1: version "2.1.1" @@ -1945,19 +1893,12 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.4.15: - version "0.4.18" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" - integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== - dependencies: - source-map "^0.5.6" - source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= -source-map@^0.5.6, source-map@^0.5.7: +source-map@^0.5.0, source-map@^0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -2020,10 +1961,12 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" tar@^4: version "4.4.8" @@ -2038,10 +1981,10 @@ tar@^4: safe-buffer "^5.1.2" yallist "^3.0.2" -to-fast-properties@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= to-object-path@^0.3.0: version "0.3.0" @@ -2073,6 +2016,29 @@ trim-right@^1.0.1: resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" + integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" + integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== + union-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" @@ -2091,6 +2057,11 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" +upath@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" + integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== + urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" @@ -2101,23 +2072,11 @@ use@^3.1.0: resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== -user-home@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" - integrity sha1-K1viOjK2Onyd640PKNSFcko98ZA= - util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= -v8flags@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" - integrity sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ= - dependencies: - user-home "^1.1.1" - wide-align@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" From f43a3d1e47e39dad434a77c8b2a52c2dc4bfd821 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Wed, 12 Jun 2019 13:20:01 +0300 Subject: [PATCH 25/99] Fixed emitted class definition --- .../src/__snapshots__/index.spec.js.snap | 16 ++++++++-------- packages/code-export-python-pytest/src/index.js | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap b/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap index 87946d0279..c688164940 100644 --- a/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap +++ b/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap @@ -11,7 +11,7 @@ from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.support import expected_conditions import selenium.webdriver.support.wait.WebDriverWait -class TestLogin() { +class TestLogin(): def setup_method(self, method): self.driver = webdriver.Firefox() self.vars = {} @@ -49,7 +49,7 @@ from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.support import expected_conditions import selenium.webdriver.support.wait.WebDriverWait -class TestControlflow() { +class TestControlflow(): def setup_method(self, method): self.driver = webdriver.Firefox() self.vars = {} @@ -121,7 +121,7 @@ from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.support import expected_conditions import selenium.webdriver.support.wait.WebDriverWait -class TestLogin() { +class TestLogin(): def setup_method(self, method): self.driver = webdriver.Firefox() self.vars = {} @@ -160,7 +160,7 @@ from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.support import expected_conditions import selenium.webdriver.support.wait.WebDriverWait -class TestDefaultSuite() { +class TestDefaultSuite(): def setup_method(self, method): self.driver = webdriver.Firefox() self.vars = {} @@ -200,7 +200,7 @@ from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.support import expected_conditions import selenium.webdriver.support.wait.WebDriverWait -class TestDefaultSuite() { +class TestDefaultSuite(): def setup_method(self, method): self.driver = webdriver.Firefox() self.vars = {} @@ -248,7 +248,7 @@ from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.support import expected_conditions import selenium.webdriver.support.wait.WebDriverWait -class TestLogin() { +class TestLogin(): def setup_method(self, method): self.driver = webdriver.Firefox() self.vars = {} @@ -278,7 +278,7 @@ from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.support import expected_conditions import selenium.webdriver.support.wait.WebDriverWait -class TestValidcredentials() { +class TestValidcredentials(): def setup_method(self, method): self.driver = webdriver.Firefox() self.vars = {} @@ -312,7 +312,7 @@ from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.support import expected_conditions import selenium.webdriver.support.wait.WebDriverWait -class TestSelectwindow() { +class TestSelectwindow(): def setup_method(self, method): self.driver = webdriver.Firefox() self.vars = {} diff --git a/packages/code-export-python-pytest/src/index.js b/packages/code-export-python-pytest/src/index.js index 318cecfcce..6139414320 100644 --- a/packages/code-export-python-pytest/src/index.js +++ b/packages/code-export-python-pytest/src/index.js @@ -46,7 +46,7 @@ function generateMethodDeclaration(name) { function generateSuiteDeclaration(name) { return `class Test${exporter.parsers.capitalize( exporter.parsers.sanitizeName(name) - )}() {` + )}():` } function generateFilename(name) { return `test_${exporter.parsers.uncapitalize( From 3d5620df7f3220fa338f3b6bbab40bd14c2dfa41 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Wed, 12 Jun 2019 13:20:44 +0300 Subject: [PATCH 26/99] Streamlined the emitter for the check command --- .../code-export-python-pytest/__test__/src/command.spec.js | 2 +- packages/code-export-python-pytest/src/command.js | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/code-export-python-pytest/__test__/src/command.spec.js b/packages/code-export-python-pytest/__test__/src/command.spec.js index 53655d4ce2..f26638f749 100644 --- a/packages/code-export-python-pytest/__test__/src/command.spec.js +++ b/packages/code-export-python-pytest/__test__/src/command.spec.js @@ -258,7 +258,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `element = driver.find_element(By.ID, "f")\nif element.is_selected() != True:\n${commandPrefixPadding}element.click()\n` + `element = driver.find_element(By.ID, "f")\nif element.is_selected() != True: element.click()` ) }) it('should emit `close` command', () => { diff --git a/packages/code-export-python-pytest/src/command.js b/packages/code-export-python-pytest/src/command.js index 503fe34535..b9bcc2f48c 100644 --- a/packages/code-export-python-pytest/src/command.js +++ b/packages/code-export-python-pytest/src/command.js @@ -198,9 +198,10 @@ async function emitCheck(locator) { locator )})`, }, - { level: 0, statement: 'if element.is_selected() != True:' }, - { level: 1, statement: 'element.click()' }, - { level: 0, statement: '' }, + { + level: 0, + statement: 'if element.is_selected() != True: element.click()', + }, ] return Promise.resolve({ commands }) } From f57dbfa9bdb7f4a1cd43de7f7896892b4738ac47 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Wed, 12 Jun 2019 13:21:07 +0300 Subject: [PATCH 27/99] Fixed the dependency for explicit waits --- packages/code-export-python-pytest/src/hook.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/code-export-python-pytest/src/hook.js b/packages/code-export-python-pytest/src/hook.js index 6fc289ace2..9a4cce6323 100644 --- a/packages/code-export-python-pytest/src/hook.js +++ b/packages/code-export-python-pytest/src/hook.js @@ -121,7 +121,8 @@ function declareDependencies() { }, { level: 0, - statement: 'import selenium.webdriver.support.wait.WebDriverWait', + statement: + 'from selenium.webdriver.support.wait import WebDriverWait', }, { level: 0, From 7d7a16178da25035797a6177baf94d397717d06f Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Wed, 12 Jun 2019 13:21:26 +0300 Subject: [PATCH 28/99] Added Python code export to the UI --- packages/code-export/src/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/code-export/src/index.js b/packages/code-export/src/index.js index db66d4a449..201e4d3165 100644 --- a/packages/code-export/src/index.js +++ b/packages/code-export/src/index.js @@ -17,7 +17,7 @@ export const availableLanguages = { 'java-junit': require('code-export-java-junit'), - //'python-pytest': require('code-export-python-pytest'), + 'python-pytest': require('code-export-python-pytest'), } function registerCommand(language, command, emitter) { From 6a8cd87f4c014eab155638a4eed94ab27897b333 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Wed, 12 Jun 2019 13:31:15 +0300 Subject: [PATCH 29/99] Prefixed driver with `self.` --- .../src/__snapshots__/index.spec.js.snap | 186 +++++++++--------- .../__test__/src/command.spec.js | 158 +++++++-------- .../code-export-python-pytest/src/command.js | 121 ++++++------ 3 files changed, 237 insertions(+), 228 deletions(-) diff --git a/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap b/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap index c688164940..d38d9e4656 100644 --- a/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap +++ b/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap @@ -9,7 +9,7 @@ from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.support import expected_conditions -import selenium.webdriver.support.wait.WebDriverWait +from selenium.webdriver.support.wait import WebDriverWait class TestLogin(): def setup_method(self, method): @@ -20,20 +20,20 @@ class TestLogin(): self.driver.quit(); def test_validcredentials(self): - driver.get(\\"http://the-internet.herokuapp.com/login\\") - driver.set_window_size(1440, 1177) - driver.find_element(By.ID, \\"username\\").send_keys(\\"tomsmith\\") - driver.find_element(By.ID, \\"password\\").send_keys(\\"SuperSecretPassword!\\") - driver.find_element(By.CSS_SELECTOR, \\"#login button\\").click() - assert driver.find_element(By.CSS_SELECTOR, \\".flash.success\\").text == \\"You logged into a secure area!\\\\\\\\n×\\" + self.driver.get(\\"http://the-internet.herokuapp.com/login\\") + self.driver.set_window_size(1440, 1177) + self.driver.find_element(By.ID, \\"username\\").send_keys(\\"tomsmith\\") + self.driver.find_element(By.ID, \\"password\\").send_keys(\\"SuperSecretPassword!\\") + self.driver.find_element(By.CSS_SELECTOR, \\"#login button\\").click() + assert self.driver.find_element(By.CSS_SELECTOR, \\".flash.success\\").text == \\"You logged into a secure area!\\\\\\\\n×\\" def test_invalidcredentials(self): - driver.get(\\"http://the-internet.herokuapp.com/login\\") - driver.set_window_size(1440, 1177) - driver.find_element(By.ID, \\"username\\").send_keys(\\"blah\\") - driver.find_element(By.ID, \\"password\\").send_keys(\\"blah\\") - driver.find_element(By.CSS_SELECTOR, \\"#login button\\").click() - assert driver.find_element(By.ID, \\"flash\\").text == \\"Your username is invalid!\\\\\\\\n×\\" + self.driver.get(\\"http://the-internet.herokuapp.com/login\\") + self.driver.set_window_size(1440, 1177) + self.driver.find_element(By.ID, \\"username\\").send_keys(\\"blah\\") + self.driver.find_element(By.ID, \\"password\\").send_keys(\\"blah\\") + self.driver.find_element(By.CSS_SELECTOR, \\"#login button\\").click() + assert self.driver.find_element(By.ID, \\"flash\\").text == \\"Your username is invalid!\\\\\\\\n×\\" " `; @@ -47,7 +47,7 @@ from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.support import expected_conditions -import selenium.webdriver.support.wait.WebDriverWait +from selenium.webdriver.support.wait import WebDriverWait class TestControlflow(): def setup_method(self, method): @@ -58,53 +58,53 @@ class TestControlflow(): self.driver.quit(); def test_controlflowif(self): - vars[\\"myVar\\"] = driver.execute_script(\\"return 'a'\\") - if driver.execute_script(\\"return (arguments[0] === 'a')\\", vars.[\\"myVar\\"]): - vars[\\"output\\"] = driver.execute_script(\\"return 'a'\\") - elif driver.execute_script(\\"return (arguments[0] === 'b')\\", vars.[\\"myVar\\"]): - vars[\\"output\\"] = driver.execute_script(\\"return 'b'\\") + vars[\\"myVar\\"] = self.driver.execute_script(\\"return 'a'\\") + if self.driver.execute_script(\\"return (arguments[0] === 'a')\\", vars.[\\"myVar\\"]): + vars[\\"output\\"] = self.driver.execute_script(\\"return 'a'\\") + elif self.driver.execute_script(\\"return (arguments[0] === 'b')\\", vars.[\\"myVar\\"]): + vars[\\"output\\"] = self.driver.execute_script(\\"return 'b'\\") else: - vars[\\"output\\"] = driver.execute_script(\\"return 'c'\\") + vars[\\"output\\"] = self.driver.execute_script(\\"return 'c'\\") assert(vars[\\"output\\"] == \\"a\\") def test_controlflowelseif(self): - vars[\\"myVar\\"] = driver.execute_script(\\"return 'b'\\") - if driver.execute_script(\\"return (arguments[0] === 'a')\\", vars.[\\"myVar\\"]): - vars[\\"output\\"] = driver.execute_script(\\"return 'a'\\") - elif driver.execute_script(\\"return (arguments[0] === 'b')\\", vars.[\\"myVar\\"]): - vars[\\"output\\"] = driver.execute_script(\\"return 'b'\\") + vars[\\"myVar\\"] = self.driver.execute_script(\\"return 'b'\\") + if self.driver.execute_script(\\"return (arguments[0] === 'a')\\", vars.[\\"myVar\\"]): + vars[\\"output\\"] = self.driver.execute_script(\\"return 'a'\\") + elif self.driver.execute_script(\\"return (arguments[0] === 'b')\\", vars.[\\"myVar\\"]): + vars[\\"output\\"] = self.driver.execute_script(\\"return 'b'\\") else: - vars[\\"output\\"] = driver.execute_script(\\"return 'c'\\") + vars[\\"output\\"] = self.driver.execute_script(\\"return 'c'\\") assert(vars[\\"output\\"] == \\"b\\") def test_controlflowelse(self): - vars[\\"myVar\\"] = driver.execute_script(\\"return 'c'\\") - if driver.execute_script(\\"return (arguments[0] === 'a')\\", vars.[\\"myVar\\"]): - vars[\\"output\\"] = driver.execute_script(\\"return 'a'\\") - elif driver.execute_script(\\"return (arguments[0] === 'b')\\", vars.[\\"myVar\\"]): - vars[\\"output\\"] = driver.execute_script(\\"return 'b'\\") + vars[\\"myVar\\"] = self.driver.execute_script(\\"return 'c'\\") + if self.driver.execute_script(\\"return (arguments[0] === 'a')\\", vars.[\\"myVar\\"]): + vars[\\"output\\"] = self.driver.execute_script(\\"return 'a'\\") + elif self.driver.execute_script(\\"return (arguments[0] === 'b')\\", vars.[\\"myVar\\"]): + vars[\\"output\\"] = self.driver.execute_script(\\"return 'b'\\") else: - vars[\\"output\\"] = driver.execute_script(\\"return 'c'\\") + vars[\\"output\\"] = self.driver.execute_script(\\"return 'c'\\") assert(vars[\\"output\\"] == \\"c\\") def test_controlflowdo(self): - vars[\\"check\\"] = driver.execute_script(\\"return 1\\") + vars[\\"check\\"] = self.driver.execute_script(\\"return 1\\") condition = True while condition: - vars[\\"check\\"] = driver.execute_script(\\"return arguments[0] + 1\\", vars.[\\"check\\"]) - condition = driver.execute_script(\\"return (arguments[0] < 3)\\", vars.[\\"check\\"]) + vars[\\"check\\"] = self.driver.execute_script(\\"return arguments[0] + 1\\", vars.[\\"check\\"]) + condition = self.driver.execute_script(\\"return (arguments[0] < 3)\\", vars.[\\"check\\"]) assert(vars[\\"check\\"] == \\"3\\") def test_controlflowtimes(self): - vars[\\"check\\"] = driver.execute_script(\\"return 1\\") + vars[\\"check\\"] = self.driver.execute_script(\\"return 1\\") for i in range(1, 2): - vars[\\"check\\"] = driver.execute_script(\\"return arguments[0] + 1\\", vars.[\\"check\\"]) + vars[\\"check\\"] = self.driver.execute_script(\\"return arguments[0] + 1\\", vars.[\\"check\\"]) assert(vars[\\"check\\"] == \\"3\\") def test_controlflowwhile(self): - vars[\\"check\\"] = driver.execute_script(\\"return 1\\") - while driver.execute_script(\\"return (arguments[0] < 3)\\", vars.[\\"check\\"]): - vars[\\"check\\"] = driver.execute_script(\\"return arguments[0] + 1\\", vars.[\\"check\\"]) + vars[\\"check\\"] = self.driver.execute_script(\\"return 1\\") + while self.driver.execute_script(\\"return (arguments[0] < 3)\\", vars.[\\"check\\"]): + vars[\\"check\\"] = self.driver.execute_script(\\"return arguments[0] + 1\\", vars.[\\"check\\"]) assert(vars[\\"check\\"] == \\"3\\") " @@ -119,7 +119,7 @@ from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.support import expected_conditions -import selenium.webdriver.support.wait.WebDriverWait +from selenium.webdriver.support.wait import WebDriverWait class TestLogin(): def setup_method(self, method): @@ -130,11 +130,11 @@ class TestLogin(): self.driver.quit(); def login(self): - driver.get(\\"https://the-internet.herokuapp.com/\\") - driver.find_element(By.LINK_TEXT, \\"Form Authentication\\").click() - driver.find_element(By.ID, \\"username\\").send_keys(vars[\\"username\\"]) - driver.find_element(By.ID, \\"password\\").send_keys(vars[\\"password\\"]) - driver.find_element(By.CSS_SELECTOR, \\".fa\\").click() + self.driver.get(\\"https://the-internet.herokuapp.com/\\") + self.driver.find_element(By.LINK_TEXT, \\"Form Authentication\\").click() + self.driver.find_element(By.ID, \\"username\\").send_keys(vars[\\"username\\"]) + self.driver.find_element(By.ID, \\"password\\").send_keys(vars[\\"password\\"]) + self.driver.find_element(By.CSS_SELECTOR, \\".fa\\").click() def test_invalidcredentials(self): vars[\\"username\\"] = \\"blah\\" @@ -158,7 +158,7 @@ from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.support import expected_conditions -import selenium.webdriver.support.wait.WebDriverWait +from selenium.webdriver.support.wait import WebDriverWait class TestDefaultSuite(): def setup_method(self, method): @@ -169,19 +169,19 @@ class TestDefaultSuite(): self.driver.quit(); def wait_for_window(timeout = 2000) { - driver.sleep(timeout) - wh_now = driver.window_handles + self.driver.sleep(timeout) + wh_now = self.driver.window_handles wh_then = vars[\\"window_handles\\"] if len(wh_now) > len(wh_then): return set(wh_now).difference(set(wh_then)) def selectwindow(self): - driver.get(\\"http://the-internet.herokuapp.com/windows\\") - vars[\\"window_handles\\"] = driver.window_handles - driver.find_element(By.LINK_TEXT, \\"Click Here\\").click() + self.driver.get(\\"http://the-internet.herokuapp.com/windows\\") + vars[\\"window_handles\\"] = self.driver.window_handles + self.driver.find_element(By.LINK_TEXT, \\"Click Here\\").click() vars[\\"win9425\\"] = self.wait_for_window(2000) - driver.switch_to.window(vars[\\"win9425\\"]) - assert driver.title == \\"New Window\\" + self.driver.switch_to.window(vars[\\"win9425\\"]) + assert self.driver.title == \\"New Window\\" def test_reuse(self): self.selectwindow() @@ -198,7 +198,7 @@ from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.support import expected_conditions -import selenium.webdriver.support.wait.WebDriverWait +from selenium.webdriver.support.wait import WebDriverWait class TestDefaultSuite(): def setup_method(self, method): @@ -209,30 +209,30 @@ class TestDefaultSuite(): self.driver.quit(); def wait_for_window(timeout = 2000) { - driver.sleep(timeout) - wh_now = driver.window_handles + self.driver.sleep(timeout) + wh_now = self.driver.window_handles wh_then = vars[\\"window_handles\\"] if len(wh_now) > len(wh_then): return set(wh_now).difference(set(wh_then)) def selectwindow(self): - driver.get(\\"http://the-internet.herokuapp.com/windows\\") - vars[\\"window_handles\\"] = driver.window_handles - driver.find_element(By.LINK_TEXT, \\"Click Here\\").click() + self.driver.get(\\"http://the-internet.herokuapp.com/windows\\") + vars[\\"window_handles\\"] = self.driver.window_handles + self.driver.find_element(By.LINK_TEXT, \\"Click Here\\").click() vars[\\"win9425\\"] = self.wait_for_window(2000) - driver.switch_to.window(vars[\\"win9425\\"]) - assert driver.title == \\"New Window\\" + self.driver.switch_to.window(vars[\\"win9425\\"]) + assert self.driver.title == \\"New Window\\" def test_reuse(self): self.selectwindow() def test_selectwindow(self): - driver.get(\\"http://the-internet.herokuapp.com/windows\\") - vars[\\"window_handles\\"] = driver.window_handles - driver.find_element(By.LINK_TEXT, \\"Click Here\\").click() + self.driver.get(\\"http://the-internet.herokuapp.com/windows\\") + vars[\\"window_handles\\"] = self.driver.window_handles + self.driver.find_element(By.LINK_TEXT, \\"Click Here\\").click() vars[\\"win9425\\"] = self.wait_for_window(2000) - driver.switch_to.window(vars[\\"win9425\\"]) - assert driver.title == \\"New Window\\" + self.driver.switch_to.window(vars[\\"win9425\\"]) + assert self.driver.title == \\"New Window\\" " `; @@ -246,7 +246,7 @@ from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.support import expected_conditions -import selenium.webdriver.support.wait.WebDriverWait +from selenium.webdriver.support.wait import WebDriverWait class TestLogin(): def setup_method(self, method): @@ -257,12 +257,12 @@ class TestLogin(): self.driver.quit(); def test_login(self): - driver.get(\\"http://the-internet.herokuapp.com/login\\") - driver.set_window_size(1440, 1177) - driver.find_element(By.ID, \\"username\\").send_keys(\\"tomsmith\\") - driver.find_element(By.ID, \\"password\\").send_keys(\\"SuperSecretPassword!\\") - driver.find_element(By.CSS_SELECTOR, \\"#login button\\").click() - assert driver.find_element(By.CSS_SELECTOR, \\".flash.success\\").text == \\"You logged into a secure area!\\\\\\\\n×\\" + self.driver.get(\\"http://the-internet.herokuapp.com/login\\") + self.driver.set_window_size(1440, 1177) + self.driver.find_element(By.ID, \\"username\\").send_keys(\\"tomsmith\\") + self.driver.find_element(By.ID, \\"password\\").send_keys(\\"SuperSecretPassword!\\") + self.driver.find_element(By.CSS_SELECTOR, \\"#login button\\").click() + assert self.driver.find_element(By.CSS_SELECTOR, \\".flash.success\\").text == \\"You logged into a secure area!\\\\\\\\n×\\" " `; @@ -276,7 +276,7 @@ from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.support import expected_conditions -import selenium.webdriver.support.wait.WebDriverWait +from selenium.webdriver.support.wait import WebDriverWait class TestValidcredentials(): def setup_method(self, method): @@ -287,11 +287,11 @@ class TestValidcredentials(): self.driver.quit(); def login(self): - driver.get(\\"https://the-internet.herokuapp.com/\\") - driver.find_element(By.LINK_TEXT, \\"Form Authentication\\").click() - driver.find_element(By.ID, \\"username\\").send_keys(vars[\\"username\\"]) - driver.find_element(By.ID, \\"password\\").send_keys(vars[\\"password\\"]) - driver.find_element(By.CSS_SELECTOR, \\".fa\\").click() + self.driver.get(\\"https://the-internet.herokuapp.com/\\") + self.driver.find_element(By.LINK_TEXT, \\"Form Authentication\\").click() + self.driver.find_element(By.ID, \\"username\\").send_keys(vars[\\"username\\"]) + self.driver.find_element(By.ID, \\"password\\").send_keys(vars[\\"password\\"]) + self.driver.find_element(By.CSS_SELECTOR, \\".fa\\").click() def test_validcredentials(self): vars[\\"username\\"] = \\"tomsmith\\" @@ -310,7 +310,7 @@ from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.support import expected_conditions -import selenium.webdriver.support.wait.WebDriverWait +from selenium.webdriver.support.wait import WebDriverWait class TestSelectwindow(): def setup_method(self, method): @@ -321,24 +321,24 @@ class TestSelectwindow(): self.driver.quit(); def wait_for_window(timeout = 2000) { - driver.sleep(timeout) - wh_now = driver.window_handles + self.driver.sleep(timeout) + wh_now = self.driver.window_handles wh_then = vars[\\"window_handles\\"] if len(wh_now) > len(wh_then): return set(wh_now).difference(set(wh_then)) def test_selectwindow(self): - driver.get(\\"http://the-internet.herokuapp.com/\\") - driver.set_window_size(1260, 1027) - driver.find_element(By.LINK_TEXT, \\"Multiple Windows\\").click() - vars[\\"window_handles\\"] = driver.window_handles - driver.find_element(By.LINK_TEXT, \\"Click Here\\").click() + self.driver.get(\\"http://the-internet.herokuapp.com/\\") + self.driver.set_window_size(1260, 1027) + self.driver.find_element(By.LINK_TEXT, \\"Multiple Windows\\").click() + vars[\\"window_handles\\"] = self.driver.window_handles + self.driver.find_element(By.LINK_TEXT, \\"Click Here\\").click() vars[\\"win9625\\"] = self.wait_for_window(2000) - vars[\\"root\\"] = driver.current_window_handle - driver.switch_to.window(vars[\\"win9625\\"]) - assert driver.title == \\"New Window\\" - driver.switch_to.window(vars[\\"root\\"]) - assert driver.title == \\"The Internet\\" + vars[\\"root\\"] = self.driver.current_window_handle + self.driver.switch_to.window(vars[\\"win9625\\"]) + assert self.driver.title == \\"New Window\\" + self.driver.switch_to.window(vars[\\"root\\"]) + assert self.driver.title == \\"The Internet\\" " `; diff --git a/packages/code-export-python-pytest/__test__/src/command.spec.js b/packages/code-export-python-pytest/__test__/src/command.spec.js index f26638f749..deb0f2717a 100644 --- a/packages/code-export-python-pytest/__test__/src/command.spec.js +++ b/packages/code-export-python-pytest/__test__/src/command.spec.js @@ -58,7 +58,7 @@ describe('command code emitter', () => { value: 'label=A label', } return expect(prettify(command)).resolves.toBe( - `dropdown = driver.find_element(By.CSS_SELECTOR, "select")\ndropdown.findElement(By.XPATH, "//option[. = 'A label']").click()` + `dropdown = self.driver.find_element(By.CSS_SELECTOR, "select")\ndropdown.findElement(By.XPATH, "//option[. = 'A label']").click()` ) }) it('should emit `assert` command', () => { @@ -78,7 +78,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `assert driver.switch_to.alert.text == "an alert"` + `assert self.driver.switch_to.alert.text == "an alert"` ) }) it('should emit `assert checked` command', () => { @@ -88,7 +88,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `assert driver.find_element(By.ID, "check").isSelected() is True` + `assert self.driver.find_element(By.ID, "check").isSelected() is True` ) }) it('should emit `assert confirmation` command', () => { @@ -98,7 +98,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `assert driver.switch_to.alert.text == "a confirmation"` + `assert self.driver.switch_to.alert.text == "a confirmation"` ) }) it('should emit `assert editable` command', () => { @@ -108,7 +108,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `element = driver.find_element(By.ID, "text")\nis_editable = element.is_enabled() and element.get_attribute("readonly") == None\nassert is_editable is True` + `element = self.driver.find_element(By.ID, "text")\nis_editable = element.is_enabled() and element.get_attribute("readonly") == None\nassert is_editable is True` ) }) it('should emit `assert element present` command', () => { @@ -118,7 +118,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `elements = driver.find_elements(By.ID, "element")\nassert len(elements) > 0` + `elements = self.driver.find_elements(By.ID, "element")\nassert len(elements) > 0` ) }) it('should emit `assert element not present` command', () => { @@ -128,7 +128,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `elements = driver.find_elements(By.ID, "element")\nassert len(elements) == 0` + `elements = self.driver.find_elements(By.ID, "element")\nassert len(elements) == 0` ) }) it('should emit `assert not checked` command', () => { @@ -138,7 +138,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `assert driver.find_element(By.ID, "check").is_selected() is False` + `assert self.driver.find_element(By.ID, "check").is_selected() is False` ) }) it('should emit `assert not editable` command', () => { @@ -148,7 +148,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `element = driver.find_element(By.ID, "text")\nis_editable = element.is_enabled() and element.get_attribute("readonly") == None\nassert is_editable is False` + `element = self.driver.find_element(By.ID, "text")\nis_editable = element.is_enabled() and element.get_attribute("readonly") == None\nassert is_editable is False` ) }) it('should emit `assert not selected value` command', () => { @@ -158,7 +158,7 @@ describe('command code emitter', () => { value: 'test', } return expect(prettify(command)).resolves.toBe( - `value = driver.find_element(By.ID, "select").get_attribute("value")\nassert value != "test"` + `value = self.driver.find_element(By.ID, "select").get_attribute("value")\nassert value != "test"` ) }) it('should emit `assert not text` command', () => { @@ -168,7 +168,7 @@ describe('command code emitter', () => { value: 'text', } return expect(prettify(command)).resolves.toBe( - `text = driver.find_element(By.ID, "test").text\nassert text != "text"` + `text = self.driver.find_element(By.ID, "test").text\nassert text != "text"` ) }) it('should emit `assert prompt` command', () => { @@ -178,7 +178,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `assert driver.switch_to.alert.text == "a prompt"` + `assert self.driver.switch_to.alert.text == "a prompt"` ) }) it("should emit 'assert selected label' command", () => { @@ -188,7 +188,7 @@ describe('command code emitter', () => { value: 'test', } return expect(prettify(command)).resolves.toBe( - `element = driver.find_element(By.ID, "test")\nlocator = "option[@value='{}']".format(element.get_attribute("value"))\nselected_text = element.find_element(By.XPATH(locator)).text\nassert selected_text == "test"` + `element = self.driver.find_element(By.ID, "test")\nlocator = "option[@value='{}']".format(element.get_attribute("value"))\nselected_text = element.find_element(By.XPATH(locator)).text\nassert selected_text == "test"` ) }) it('should emit `assert selected value` command', () => { @@ -198,7 +198,7 @@ describe('command code emitter', () => { value: 'test', } return expect(prettify(command)).resolves.toBe( - `value = driver.find_element(By.ID, "select").get_attribute("value")\nassert value == "test"` + `value = self.driver.find_element(By.ID, "select").get_attribute("value")\nassert value == "test"` ) }) it('should emit `assert text` command', () => { @@ -208,7 +208,7 @@ describe('command code emitter', () => { value: 'some text that should be here', } expect(prettify(command)).resolves.toBe( - `assert driver.find_element(By.ID, "test").text == "some text that should be here"` + `assert self.driver.find_element(By.ID, "test").text == "some text that should be here"` ) }) it('should emit `assert title` command', () => { @@ -218,7 +218,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `assert driver.title == "example title"` + `assert self.driver.title == "example title"` ) }) it('should emit `assert value` command', () => { @@ -228,7 +228,7 @@ describe('command code emitter', () => { value: 'test', } return expect(prettify(command)).resolves.toBe( - `value = driver.find_element(By.ID, "select").get_attribute("value")\nassert value == "test"` + `value = self.driver.find_element(By.ID, "select").get_attribute("value")\nassert value == "test"` ) }) it('should emit `click` command', () => { @@ -238,7 +238,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `driver.find_element(By.LINK_TEXT, "button").click()` + `self.driver.find_element(By.LINK_TEXT, "button").click()` ) }) it('should emit `click at` command', () => { @@ -248,7 +248,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `driver.find_element(By.LINK_TEXT, "button").click()` + `self.driver.find_element(By.LINK_TEXT, "button").click()` ) }) it('should emit `check` command', () => { @@ -258,7 +258,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `element = driver.find_element(By.ID, "f")\nif element.is_selected() != True: element.click()` + `element = self.driver.find_element(By.ID, "f")\nif element.is_selected() != True: element.click()` ) }) it('should emit `close` command', () => { @@ -267,7 +267,7 @@ describe('command code emitter', () => { target: '', value: '', } - return expect(prettify(command)).resolves.toBe(`driver.close()`) + return expect(prettify(command)).resolves.toBe(`self.driver.close()`) }) it('should emit `do` command', () => { const command = { @@ -287,7 +287,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `element = driver.find_element(By.LINK_TEXT, "button")\nactions = ActionChains(driver)\nactions.double_click(element).perform()` + `element = self.driver.find_element(By.LINK_TEXT, "button")\nactions = ActionChains(driver)\nactions.double_click(element).perform()` ) }) it('should emit `double click at` command', () => { @@ -297,7 +297,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `element = driver.find_element(By.LINK_TEXT, "button")\nactions = ActionChains(driver)\nactions.double_click(element).perform()` + `element = self.driver.find_element(By.LINK_TEXT, "button")\nactions = ActionChains(driver)\nactions.double_click(element).perform()` ) }) it('should emit `drag and drop to object` command', () => { @@ -307,7 +307,7 @@ describe('command code emitter', () => { value: 'link=dropped', } return expect(prettify(command)).resolves.toBe( - `dragged = driver.find_element(By.LINK_TEXT, "dragged")\ndropped = driver.find_element(By.LINK_TEXT, "dropped")\nactions = ActionChains(driver)\nactions.drag_and_drop(dragged, dropped).perform()` + `dragged = self.driver.find_element(By.LINK_TEXT, "dragged")\ndropped = self.driver.find_element(By.LINK_TEXT, "dropped")\nactions = ActionChains(driver)\nactions.drag_and_drop(dragged, dropped).perform()` ) }) it('should emit `echo` command', () => { @@ -333,7 +333,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `element = driver.find_element(By.ID, "contentEditable")\ndriver.execute_script("if(arguments[0].contentEditable === 'true') {arguments[0].innerText = ''}", element)` + `element = self.driver.find_element(By.ID, "contentEditable")\nself.driver.execute_script("if(arguments[0].contentEditable === 'true') {arguments[0].innerText = ''}", element)` ) }) it('should emit `else` command', () => { @@ -354,7 +354,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: `elif driver.execute_script("return (true)"):`, + body: `elif self.driver.execute_script("return (true)"):`, endingLevel: 1, }) }) @@ -376,7 +376,7 @@ describe('command code emitter', () => { value: 'myVar', } return expect(prettify(command)).resolves.toBe( - `vars["myVar"] = driver.execute_script("javascript")` + `vars["myVar"] = self.driver.execute_script("javascript")` ) }) it('should emit `execute script` command with return string value', () => { @@ -386,7 +386,7 @@ describe('command code emitter', () => { value: 'myVar', } return expect(prettify(command)).resolves.toBe( - `vars["myVar"] = driver.execute_script("return 'a'")` + `vars["myVar"] = self.driver.execute_script("return 'a'")` ) }) it('should emit `execute async script` command', () => { @@ -396,7 +396,7 @@ describe('command code emitter', () => { value: 'myVar', } return expect(prettify(command)).resolves.toBe( - `vars["myVar"] = driver.execute_async_script("var callback = arguments[arguments.length - 1];javascript.then(callback).catch(callback);")` + `vars["myVar"] = self.driver.execute_async_script("var callback = arguments[arguments.length - 1];javascript.then(callback).catch(callback);")` ) }) it('should emit `forEach` command', () => { @@ -417,7 +417,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: `if driver.execute_script("return (true)"):`, + body: `if self.driver.execute_script("return (true)"):`, endingLevel: 1, }) }) @@ -428,7 +428,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `element = driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).click_and_hold().perform()` + `element = self.driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).click_and_hold().perform()` ) }) it('should emit `mouse down at` event', () => { @@ -438,7 +438,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `element = driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).click_and_hold().perform()` + `element = self.driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).click_and_hold().perform()` ) }) it('should emit `mouse move` event', () => { @@ -448,7 +448,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `element = driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).perform()` + `element = self.driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).perform()` ) }) it('should emit `mouse move at` event', () => { @@ -458,7 +458,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `element = driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).perform()` + `element = self.driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).perform()` ) }) it('should emit `mouse out` event', () => { @@ -468,7 +468,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `element = driver.find_element(By.CSS_SELECTOR, "body")\nactions = ActionChains(driver)\nactions.move_to_element(element, 0, 0).perform()` + `element = self.driver.find_element(By.CSS_SELECTOR, "body")\nactions = ActionChains(driver)\nactions.move_to_element(element, 0, 0).perform()` ) }) it('should emit `mouse over` event', () => { @@ -478,7 +478,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `element = driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).perform()` + `element = self.driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).perform()` ) }) it('should emit `mouse up` event', () => { @@ -488,7 +488,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `element = driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).release().perform()` + `element = self.driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).release().perform()` ) }) it('should emit `mouse up at` event', () => { @@ -498,7 +498,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `element = driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).release().perform()` + `element = self.driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).release().perform()` ) }) it('should emit `open` with absolute url', () => { @@ -508,7 +508,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `driver.get("${command.target}")` + `self.driver.get("${command.target}")` ) }) it('should emit `pause` command', () => { @@ -526,7 +526,7 @@ describe('command code emitter', () => { value: 'label=A label', } return expect(prettify(command)).resolves.toBe( - `dropdown = driver.find_element(By.CSS_SELECTOR, "select")\ndropdown.findElement(By.XPATH, "//option[. = 'A label']").click()` + `dropdown = self.driver.find_element(By.CSS_SELECTOR, "select")\ndropdown.findElement(By.XPATH, "//option[. = 'A label']").click()` ) }) it('should emit `repeatIf` command', () => { @@ -536,7 +536,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `condition = driver.execute_script("return (true)")` + `condition = self.driver.execute_script("return (true)")` ) }) it('should emit `run` command', () => { @@ -554,7 +554,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `driver.execute_script("alert('test');alert('Im annoying');")` + `self.driver.execute_script("alert('test');alert('Im annoying');")` ) }) it('should emit `select` command', () => { @@ -564,7 +564,7 @@ describe('command code emitter', () => { value: 'label=A label', } return expect(prettify(command)).resolves.toBe( - `dropdown = driver.find_element(By.CSS_SELECTOR, "select")\ndropdown.findElement(By.XPATH, "//option[. = 'A label']").click()` + `dropdown = self.driver.find_element(By.CSS_SELECTOR, "select")\ndropdown.findElement(By.XPATH, "//option[. = 'A label']").click()` ) }) it('should emit `select frame` to select the top frame', () => { @@ -574,7 +574,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `driver.switch_to.default_content()` + `self.driver.switch_to.default_content()` ) }) it('should fail to emit `select window` by using unknown locator', () => { @@ -594,7 +594,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `driver.switch_to.window(vars["window"])` + `self.driver.switch_to.window(vars["window"])` ) }) it('should emit `select window` to select a window by name', () => { @@ -604,7 +604,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `driver.switch_to.window("window")` + `self.driver.switch_to.window("window")` ) }) it('should emit `select window` to select a window by the local keyword', () => { @@ -614,7 +614,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `driver.switch_to.window(driver.window_handles[0])` + `self.driver.switch_to.window(self.driver.window_handles[0])` ) }) it('should emit `select window` to select a window by implicit index', () => { @@ -624,7 +624,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `driver.switch_to.window(driver.window_handles[12])` + `self.driver.switch_to.window(self.driver.window_handles[12])` ) }) it('should emit `send keys` command', () => { @@ -634,7 +634,7 @@ describe('command code emitter', () => { value: 'example input', } return expect(prettify(command)).resolves.toBe( - `driver.find_element(By.ID, "input").send_keys("example input")` + `self.driver.find_element(By.ID, "input").send_keys("example input")` ) }) it('should emit `send keys` command with a variable input', () => { @@ -644,7 +644,7 @@ describe('command code emitter', () => { value: '${blah}', } return expect(prettify(command)).resolves.toBe( - `driver.find_element(By.ID, "input").send_keys(vars["blah"])` + `self.driver.find_element(By.ID, "input").send_keys(vars["blah"])` ) }) it('should emit `send keys` command with a key press', () => { @@ -654,7 +654,7 @@ describe('command code emitter', () => { value: 'SuperSecretPassword!${KEY_ENTER}', } return expect(prettify(command)).resolves.toBe( - `driver.find_element(By.ID, "input").send_keys("SuperSecretPassword!", Keys.ENTER)` + `self.driver.find_element(By.ID, "input").send_keys("SuperSecretPassword!", Keys.ENTER)` ) }) it('should emit `set speed`', () => { @@ -669,7 +669,7 @@ describe('command code emitter', () => { value: '', } expect(prettify(command)).resolves.toBe( - `driver.set_window_size(1440, 1177)` + `self.driver.set_window_size(1440, 1177)` ) }) it('should skip playback supported commands, that are not supported in webdriver', () => { @@ -705,7 +705,7 @@ describe('command code emitter', () => { value: 'myVar', } return expect(prettify(command)).resolves.toBe( - `attribute = driver.find_element(By.XPATH, "button[3]").get_attribute("id")\nvars["myVar"] = attribute` + `attribute = self.driver.find_element(By.XPATH, "button[3]").get_attribute("id")\nvars["myVar"] = attribute` ) }) it('should emit `store text` command', () => { @@ -715,7 +715,7 @@ describe('command code emitter', () => { value: 'myVar', } return expect(prettify(command)).resolves.toBe( - `vars["myVar"] = driver.find_element(By.ID, "someElement").text` + `vars["myVar"] = self.driver.find_element(By.ID, "someElement").text` ) }) it('should emit `store json` command', () => { @@ -735,7 +735,7 @@ describe('command code emitter', () => { value: 'myVar', } return expect(prettify(command)).resolves.toBe( - `vars["myVar"] = driver.title` + `vars["myVar"] = self.driver.title` ) }) it('should emit `store value` command', () => { @@ -745,7 +745,7 @@ describe('command code emitter', () => { value: 'myVar', } return expect(prettify(command)).resolves.toBe( - `vars["myVar"] = driver.find_element(By.ID, "someElement").get_attribute("value")` + `vars["myVar"] = self.driver.find_element(By.ID, "someElement").get_attribute("value")` ) }) it('should emit `store window handle` command', () => { @@ -755,7 +755,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `vars["windowName"] = driver.current_window_handle` + `vars["windowName"] = self.driver.current_window_handle` ) }) it('should emit `store xpath count` command', () => { @@ -765,7 +765,7 @@ describe('command code emitter', () => { value: 'myVar', } return expect(prettify(command)).resolves.toBe( - `vars["myVar"] = len(driver.find_elements(By.XPATH, "button"))` + `vars["myVar"] = len(self.driver.find_elements(By.XPATH, "button"))` ) }) it('should emit `submit` command', () => { @@ -775,7 +775,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `raise Exception("\`submit\` is not a supported command in Selenium WebDriver. Please re-record the step in the IDE.")` + `raise Exception("\`submit\` is not a supported command in Selenium Webself.driver. Please re-record the step in the IDE.")` ) }) it('should emit `times` command', () => { @@ -796,7 +796,7 @@ describe('command code emitter', () => { value: 'example input', } expect(prettify(command)).resolves.toBe( - `driver.find_element(By.ID, "input").send_keys("example input")` + `self.driver.find_element(By.ID, "input").send_keys("example input")` ) }) it('should emit `uncheck` command', () => { @@ -806,7 +806,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `element = driver.find_element(By.ID, "f")\nif element.is_selected: element.click()` + `element = self.driver.find_element(By.ID, "f")\nif element.is_selected: element.click()` ) }) it('should emit `verify` command', () => { @@ -826,7 +826,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `assert driver.find_element(By.ID, "check").isSelected() is True` + `assert self.driver.find_element(By.ID, "check").isSelected() is True` ) }) it('should emit `verify editable` command', () => { @@ -836,7 +836,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `element = driver.find_element(By.ID, "text")\nis_editable = element.is_enabled() and element.get_attribute("readonly") == None\nassert is_editable is True` + `element = self.driver.find_element(By.ID, "text")\nis_editable = element.is_enabled() and element.get_attribute("readonly") == None\nassert is_editable is True` ) }) it('should emit `verify element present` command', () => { @@ -846,7 +846,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `elements = driver.find_elements(By.ID, "element")\nassert len(elements) > 0` + `elements = self.driver.find_elements(By.ID, "element")\nassert len(elements) > 0` ) }) it('should emit `verify element not present` command', () => { @@ -856,7 +856,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `elements = driver.find_elements(By.ID, "element")\nassert len(elements) == 0` + `elements = self.driver.find_elements(By.ID, "element")\nassert len(elements) == 0` ) }) it('should emit `verify not checked` command', () => { @@ -866,7 +866,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `assert driver.find_element(By.ID, "check").is_selected() is False` + `assert self.driver.find_element(By.ID, "check").is_selected() is False` ) }) it('should emit `verify not editable` command', () => { @@ -876,7 +876,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `element = driver.find_element(By.ID, "text")\nis_editable = element.is_enabled() and element.get_attribute("readonly") == None\nassert is_editable is False` + `element = self.driver.find_element(By.ID, "text")\nis_editable = element.is_enabled() and element.get_attribute("readonly") == None\nassert is_editable is False` ) }) it('should emit `verify not selected value` command', () => { @@ -886,7 +886,7 @@ describe('command code emitter', () => { value: 'test', } return expect(prettify(command)).resolves.toBe( - `value = driver.find_element(By.ID, "select").get_attribute("value")\nassert value != "test"` + `value = self.driver.find_element(By.ID, "select").get_attribute("value")\nassert value != "test"` ) }) it('should emit `verify not text` command', () => { @@ -896,7 +896,7 @@ describe('command code emitter', () => { value: 'text', } return expect(prettify(command)).resolves.toBe( - `text = driver.find_element(By.ID, "test").text\nassert text != "text"` + `text = self.driver.find_element(By.ID, "test").text\nassert text != "text"` ) }) it("should emit 'verify selected label' command", () => { @@ -906,7 +906,7 @@ describe('command code emitter', () => { value: 'test', } return expect(prettify(command)).resolves.toBe( - `element = driver.find_element(By.ID, "test")\nlocator = "option[@value='{}']".format(element.get_attribute("value"))\nselected_text = element.find_element(By.XPATH(locator)).text\nassert selected_text == "test"` + `element = self.driver.find_element(By.ID, "test")\nlocator = "option[@value='{}']".format(element.get_attribute("value"))\nselected_text = element.find_element(By.XPATH(locator)).text\nassert selected_text == "test"` ) }) it('should emit `verify value` command', () => { @@ -916,7 +916,7 @@ describe('command code emitter', () => { value: 'test', } return expect(prettify(command)).resolves.toBe( - `value = driver.find_element(By.ID, "select").get_attribute("value")\nassert value == "test"` + `value = self.driver.find_element(By.ID, "select").get_attribute("value")\nassert value == "test"` ) }) it('should emit `verify selected value` command', () => { @@ -926,7 +926,7 @@ describe('command code emitter', () => { value: 'test', } return expect(prettify(command)).resolves.toBe( - `value = driver.find_element(By.ID, "select").get_attribute("value")\nassert value == "test"` + `value = self.driver.find_element(By.ID, "select").get_attribute("value")\nassert value == "test"` ) }) it('should emit `verify text` command', () => { @@ -936,7 +936,7 @@ describe('command code emitter', () => { value: 'some text that should be here', } expect(prettify(command)).resolves.toBe( - `assert driver.find_element(By.ID, "test").text == "some text that should be here"` + `assert self.driver.find_element(By.ID, "test").text == "some text that should be here"` ) }) it('should emit `verify title` command', () => { @@ -946,7 +946,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `assert driver.title == "example title"` + `assert self.driver.title == "example title"` ) }) it('should emit `waitForElementEditable` command', () => { @@ -1016,7 +1016,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `alert = driver.switch_to.alert\nalert.send_keys("an answer")\nalert.accept()` + `alert = self.driver.switch_to.alert\nalert.send_keys("an answer")\nalert.accept()` ) }) it('should emit `choose cancel on visible prompt` command', () => { @@ -1026,7 +1026,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `driver.switch_to.alert.dismiss()` + `self.driver.switch_to.alert.dismiss()` ) }) it('should emit `choose ok on visible confirmation` command', () => { @@ -1036,7 +1036,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `driver.switch_to.alert.accept()` + `self.driver.switch_to.alert.accept()` ) }) it('should emit `while` command', () => { @@ -1046,7 +1046,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: `while driver.execute_script("return (true)"):`, + body: `while self.driver.execute_script("return (true)"):`, endingLevel: 1, }) }) @@ -1060,7 +1060,7 @@ describe('command code emitter', () => { windowTimeout: 2000, } return expect(prettify(command)).resolves.toBe( - `vars["window_handles"] = driver.window_handles\ndriver.find_element(By.CSS_SELECTOR, "button").click()\nvars["newWin"] = self.wait_for_window(2000)` + `vars["window_handles"] = self.driver.window_handles\nself.driver.find_element(By.CSS_SELECTOR, "button").click()\nvars["newWin"] = self.wait_for_window(2000)` ) }) }) diff --git a/packages/code-export-python-pytest/src/command.js b/packages/code-export-python-pytest/src/command.js index b9bcc2f48c..98f3b3052a 100644 --- a/packages/code-export-python-pytest/src/command.js +++ b/packages/code-export-python-pytest/src/command.js @@ -149,8 +149,8 @@ function emitWaitForWindow() { return `def ${name}(timeout = 2000) {` } const commands = [ - { level: 0, statement: 'driver.sleep(timeout)' }, - { level: 0, statement: 'wh_now = driver.window_handles' }, + { level: 0, statement: 'self.driver.sleep(timeout)' }, + { level: 0, statement: 'wh_now = self.driver.window_handles' }, { level: 0, statement: 'wh_then = vars["window_handles"]', @@ -167,7 +167,7 @@ function emitWaitForWindow() { async function emitNewWindowHandling(command, emittedCommand) { return Promise.resolve( - `vars["window_handles"] = driver.window_handles\n${await emittedCommand}\nvars["${ + `vars["window_handles"] = self.driver.window_handles\n${await emittedCommand}\nvars["${ command.windowHandleName }"] = self.wait_for_window(${command.windowTimeout})` ) @@ -178,12 +178,14 @@ function emitAssert(varName, value) { } function emitAssertAlert(alertText) { - return Promise.resolve(`assert driver.switch_to.alert.text == "${alertText}"`) + return Promise.resolve( + `assert self.driver.switch_to.alert.text == "${alertText}"` + ) } function emitAnswerOnNextPrompt(textToSend) { const commands = [ - { level: 0, statement: 'alert = driver.switch_to.alert' }, + { level: 0, statement: 'alert = self.driver.switch_to.alert' }, { level: 0, statement: `alert.send_keys("${textToSend}")` }, { level: 0, statement: 'alert.accept()' }, ] @@ -194,7 +196,7 @@ async function emitCheck(locator) { const commands = [ { level: 0, - statement: `element = driver.find_element(${await location.emit( + statement: `element = self.driver.find_element(${await location.emit( locator )})`, }, @@ -207,26 +209,26 @@ async function emitCheck(locator) { } function emitChooseCancelOnNextConfirmation() { - return Promise.resolve(`driver.switch_to.alert.dismiss()`) + return Promise.resolve(`self.driver.switch_to.alert.dismiss()`) } function emitChooseOkOnNextConfirmation() { - return Promise.resolve(`driver.switch_to.alert.accept()`) + return Promise.resolve(`self.driver.switch_to.alert.accept()`) } async function emitClick(target) { return Promise.resolve( - `driver.find_element(${await location.emit(target)}).click()` + `self.driver.find_element(${await location.emit(target)}).click()` ) } async function emitClose() { - return Promise.resolve(`driver.close()`) + return Promise.resolve(`self.driver.close()`) } function generateExpressionScript(script) { const scriptString = script.script.replace(/"/g, "'") - return `driver.execute_script("return (${scriptString})"${generateScriptArguments( + return `self.driver.execute_script("return (${scriptString})"${generateScriptArguments( script )})` } @@ -334,7 +336,7 @@ async function emitDoubleClick(target) { const commands = [ { level: 0, - statement: `element = driver.find_element(${await location.emit( + statement: `element = self.driver.find_element(${await location.emit( target )})`, }, @@ -348,13 +350,13 @@ async function emitDragAndDrop(dragged, dropped) { const commands = [ { level: 0, - statement: `dragged = driver.find_element(${await location.emit( + statement: `dragged = self.driver.find_element(${await location.emit( dragged )})`, }, { level: 0, - statement: `dropped = driver.find_element(${await location.emit( + statement: `dropped = self.driver.find_element(${await location.emit( dropped )})`, }, @@ -376,13 +378,13 @@ async function emitEditContent(locator, content) { const commands = [ { level: 0, - statement: `element = driver.find_element(${await location.emit( + statement: `element = self.driver.find_element(${await location.emit( locator )})`, }, { level: 0, - statement: `driver.execute_script("if(arguments[0].contentEditable === 'true') {arguments[0].innerText = '${content}'}", element)`, + statement: `self.driver.execute_script("if(arguments[0].contentEditable === 'true') {arguments[0].innerText = '${content}'}", element)`, }, ] return Promise.resolve({ commands }) @@ -390,14 +392,14 @@ async function emitEditContent(locator, content) { async function emitExecuteScript(script, varName) { const scriptString = script.script.replace(/"/g, "'") - const result = `driver.execute_script("${scriptString}"${generateScriptArguments( + const result = `self.driver.execute_script("${scriptString}"${generateScriptArguments( script )})` return Promise.resolve(variableSetter(varName, result)) } async function emitExecuteAsyncScript(script, varName) { - const result = `driver.execute_async_script("var callback = arguments[arguments.length - 1];${ + const result = `self.driver.execute_async_script("var callback = arguments[arguments.length - 1];${ script.script }.then(callback).catch(callback);${generateScriptArguments(script)}")` return Promise.resolve(variableSetter(varName, result)) @@ -407,7 +409,7 @@ async function emitMouseDown(locator) { const commands = [ { level: 0, - statement: `element = driver.find_element(${await location.emit( + statement: `element = self.driver.find_element(${await location.emit( locator )})`, }, @@ -424,7 +426,7 @@ async function emitMouseMove(locator) { const commands = [ { level: 0, - statement: `element = driver.find_element(${await location.emit( + statement: `element = self.driver.find_element(${await location.emit( locator )})`, }, @@ -438,7 +440,7 @@ async function emitMouseOut() { const commands = [ { level: 0, - statement: `element = driver.find_element(By.CSS_SELECTOR, "body")`, + statement: `element = self.driver.find_element(By.CSS_SELECTOR, "body")`, }, { level: 0, statement: 'actions = ActionChains(driver)' }, { level: 0, statement: 'actions.move_to_element(element, 0, 0).perform()' }, @@ -450,7 +452,7 @@ async function emitMouseUp(locator) { const commands = [ { level: 0, - statement: `element = driver.find_element(${await location.emit( + statement: `element = self.driver.find_element(${await location.emit( locator )})`, }, @@ -467,7 +469,7 @@ function emitOpen(target) { const url = /^(file|http|https):\/\//.test(target) ? `"${target}"` : `"${global.baseUrl}${target}"` - return Promise.resolve(`driver.get(${url})`) + return Promise.resolve(`self.driver.get(${url})`) } async function emitPause(time) { @@ -481,7 +483,7 @@ async function emitRun(testName) { async function emitRunScript(script) { return Promise.resolve( - `driver.execute_script("${script.script}${generateScriptArguments( + `self.driver.execute_script("${script.script}${generateScriptArguments( script )}")` ) @@ -489,14 +491,14 @@ async function emitRunScript(script) { async function emitSetWindowSize(size) { const [width, height] = size.split('x') - return Promise.resolve(`driver.set_window_size(${width}, ${height})`) + return Promise.resolve(`self.driver.set_window_size(${width}, ${height})`) } async function emitSelect(selectElement, option) { const commands = [ { level: 0, - statement: `dropdown = driver.find_element(${await location.emit( + statement: `dropdown = self.driver.find_element(${await location.emit( selectElement )})`, }, @@ -512,21 +514,23 @@ async function emitSelect(selectElement, option) { async function emitSelectFrame(frameLocation) { if (frameLocation === 'relative=top' || frameLocation === 'relative=parent') { - return Promise.resolve('driver.switch_to.default_content()') + return Promise.resolve('self.driver.switch_to.default_content()') } else if (/^index=/.test(frameLocation)) { return Promise.resolve( - `driver.switch_to.frame(${Math.floor(frameLocation.split('index=')[1])})` + `self.driver.switch_to.frame(${Math.floor( + frameLocation.split('index=')[1] + )})` ) } else { return Promise.resolve({ commands: [ { level: 0, - statement: `element = driver.find_element(${await location.emit( + statement: `element = self.driver.find_element(${await location.emit( frameLocation )})`, }, - { level: 0, statement: 'driver.switch_to.frame(element)' }, + { level: 0, statement: 'self.driver.switch_to.frame(element)' }, ], }) } @@ -535,11 +539,11 @@ async function emitSelectFrame(frameLocation) { async function emitSelectWindow(windowLocation) { if (/^handle=/.test(windowLocation)) { return Promise.resolve( - `driver.switch_to.window(${windowLocation.split('handle=')[1]})` + `self.driver.switch_to.window(${windowLocation.split('handle=')[1]})` ) } else if (/^name=/.test(windowLocation)) { return Promise.resolve( - `driver.switch_to.window("${windowLocation.split('name=')[1]}")` + `self.driver.switch_to.window("${windowLocation.split('name=')[1]}")` ) } else if (/^win_ser_/.test(windowLocation)) { if (windowLocation === 'win_ser_local') { @@ -547,7 +551,8 @@ async function emitSelectWindow(windowLocation) { commands: [ { level: 0, - statement: 'driver.switch_to.window(driver.window_handles[0])', + statement: + 'self.driver.switch_to.window(self.driver.window_handles[0])', }, ], }) @@ -557,7 +562,7 @@ async function emitSelectWindow(windowLocation) { commands: [ { level: 0, - statement: `driver.switch_to.window(driver.window_handles[${index}])`, + statement: `self.driver.switch_to.window(self.driver.window_handles[${index}])`, }, ], }) @@ -594,7 +599,7 @@ function generateSendKeysInput(value) { async function emitSendKeys(target, value) { return Promise.resolve( - `driver.find_element(${await location.emit( + `self.driver.find_element(${await location.emit( target )}).send_keys(${generateSendKeysInput(value)})` ) @@ -617,7 +622,7 @@ async function emitStoreAttribute(locator, varName) { const commands = [ { level: 0, - statement: `attribute = driver.find_element(${await location.emit( + statement: `attribute = self.driver.find_element(${await location.emit( elementLocator )}).get_attribute("${attributeName}")`, }, @@ -631,16 +636,18 @@ async function emitStoreJson(json, varName) { } async function emitStoreText(locator, varName) { - const result = `driver.find_element(${await location.emit(locator)}).text` + const result = `self.driver.find_element(${await location.emit( + locator + )}).text` return Promise.resolve(variableSetter(varName, result)) } async function emitStoreTitle(_, varName) { - return Promise.resolve(variableSetter(varName, 'driver.title')) + return Promise.resolve(variableSetter(varName, 'self.driver.title')) } async function emitStoreValue(locator, varName) { - const result = `driver.find_element(${await location.emit( + const result = `self.driver.find_element(${await location.emit( locator )}).get_attribute("value")` return Promise.resolve(variableSetter(varName, result)) @@ -648,24 +655,26 @@ async function emitStoreValue(locator, varName) { async function emitStoreWindowHandle(varName) { return Promise.resolve( - variableSetter(varName, 'driver.current_window_handle') + variableSetter(varName, 'self.driver.current_window_handle') ) } async function emitStoreXpathCount(locator, varName) { - const result = `len(driver.find_elements(${await location.emit(locator)}))` + const result = `len(self.driver.find_elements(${await location.emit( + locator + )}))` return Promise.resolve(variableSetter(varName, result)) } async function emitSubmit(_locator) { return Promise.resolve( - `raise Exception("\`submit\` is not a supported command in Selenium WebDriver. Please re-record the step in the IDE.")` + `raise Exception("\`submit\` is not a supported command in Selenium Webself.driver. Please re-record the step in the IDE.")` ) } async function emitType(target, value) { return Promise.resolve( - `driver.find_element(${await location.emit( + `self.driver.find_element(${await location.emit( target )}).send_keys(${generateSendKeysInput(value)})` ) @@ -675,7 +684,7 @@ async function emitUncheck(locator) { const commands = [ { level: 0, - statement: `element = driver.find_element(${await location.emit( + statement: `element = self.driver.find_element(${await location.emit( locator )})`, }, @@ -686,7 +695,7 @@ async function emitUncheck(locator) { async function emitVerifyChecked(locator) { return Promise.resolve( - `assert driver.find_element(${await location.emit( + `assert self.driver.find_element(${await location.emit( locator )}).isSelected() is True` ) @@ -696,7 +705,7 @@ async function emitVerifyEditable(locator) { const commands = [ { level: 0, - statement: `element = driver.find_element(${await location.emit( + statement: `element = self.driver.find_element(${await location.emit( locator )})`, }, @@ -714,7 +723,7 @@ async function emitVerifyElementPresent(locator) { const commands = [ { level: 0, - statement: `elements = driver.find_elements(${await location.emit( + statement: `elements = self.driver.find_elements(${await location.emit( locator )})`, }, @@ -727,7 +736,7 @@ async function emitVerifyElementNotPresent(locator) { const commands = [ { level: 0, - statement: `elements = driver.find_elements(${await location.emit( + statement: `elements = self.driver.find_elements(${await location.emit( locator )})`, }, @@ -738,7 +747,7 @@ async function emitVerifyElementNotPresent(locator) { async function emitVerifyNotChecked(locator) { return Promise.resolve( - `assert driver.find_element(${await location.emit( + `assert self.driver.find_element(${await location.emit( locator )}).is_selected() is False` ) @@ -748,7 +757,7 @@ async function emitVerifyNotEditable(locator) { const commands = [ { level: 0, - statement: `element = driver.find_element(${await location.emit( + statement: `element = self.driver.find_element(${await location.emit( locator )})`, }, @@ -766,7 +775,7 @@ async function emitVerifyNotSelectedValue(locator, expectedValue) { const commands = [ { level: 0, - statement: `value = driver.find_element(${await location.emit( + statement: `value = self.driver.find_element(${await location.emit( locator )}).get_attribute("value")`, }, @@ -782,7 +791,7 @@ async function emitVerifyNotText(locator, text) { const commands = [ { level: 0, - statement: `text = driver.find_element(${await location.emit( + statement: `text = self.driver.find_element(${await location.emit( locator )}).text`, }, @@ -795,7 +804,7 @@ async function emitVerifySelectedLabel(locator, labelValue) { const commands = [ { level: 0, - statement: `element = driver.find_element(${await location.emit( + statement: `element = self.driver.find_element(${await location.emit( locator )})`, }, @@ -818,7 +827,7 @@ async function emitVerifyText(locator, text) { const commands = [ { level: 0, - statement: `assert driver.find_element(${await location.emit( + statement: `assert self.driver.find_element(${await location.emit( locator )}).text == "${exporter.emit.text(text)}"`, }, @@ -830,7 +839,7 @@ async function emitVerifyValue(locator, value) { const commands = [ { level: 0, - statement: `value = driver.find_element(${await location.emit( + statement: `value = self.driver.find_element(${await location.emit( locator )}).get_attribute("value")`, }, @@ -840,7 +849,7 @@ async function emitVerifyValue(locator, value) { } async function emitVerifyTitle(title) { - return Promise.resolve(`assert driver.title == "${title}"`) + return Promise.resolve(`assert self.driver.title == "${title}"`) } async function emitWaitForElementEditable(locator, timeout) { From ab27dd8d8859a64d586a53a63e51f0232b65f9d3 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Wed, 12 Jun 2019 13:33:12 +0300 Subject: [PATCH 30/99] isSelected() => is_selected() --- .../code-export-python-pytest/__test__/src/command.spec.js | 4 ++-- packages/code-export-python-pytest/src/command.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/code-export-python-pytest/__test__/src/command.spec.js b/packages/code-export-python-pytest/__test__/src/command.spec.js index deb0f2717a..a89defe947 100644 --- a/packages/code-export-python-pytest/__test__/src/command.spec.js +++ b/packages/code-export-python-pytest/__test__/src/command.spec.js @@ -88,7 +88,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `assert self.driver.find_element(By.ID, "check").isSelected() is True` + `assert self.driver.find_element(By.ID, "check").is_selected() is True` ) }) it('should emit `assert confirmation` command', () => { @@ -826,7 +826,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `assert self.driver.find_element(By.ID, "check").isSelected() is True` + `assert self.driver.find_element(By.ID, "check").is_selected() is True` ) }) it('should emit `verify editable` command', () => { diff --git a/packages/code-export-python-pytest/src/command.js b/packages/code-export-python-pytest/src/command.js index 98f3b3052a..87c0aa8b6c 100644 --- a/packages/code-export-python-pytest/src/command.js +++ b/packages/code-export-python-pytest/src/command.js @@ -697,7 +697,7 @@ async function emitVerifyChecked(locator) { return Promise.resolve( `assert self.driver.find_element(${await location.emit( locator - )}).isSelected() is True` + )}).is_selected() is True` ) } From d883345d9e3317a4240cb8edf950fe537d3f20f7 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Wed, 12 Jun 2019 13:37:08 +0300 Subject: [PATCH 31/99] Fixed broken variable lookup in execute_script argument emitting --- .../src/__snapshots__/index.spec.js.snap | 22 +++++++++---------- .../code-export-python-pytest/src/command.js | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap b/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap index d38d9e4656..f6d7e38a0e 100644 --- a/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap +++ b/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap @@ -59,9 +59,9 @@ class TestControlflow(): def test_controlflowif(self): vars[\\"myVar\\"] = self.driver.execute_script(\\"return 'a'\\") - if self.driver.execute_script(\\"return (arguments[0] === 'a')\\", vars.[\\"myVar\\"]): + if self.driver.execute_script(\\"return (arguments[0] === 'a')\\", vars[\\"myVar\\"]): vars[\\"output\\"] = self.driver.execute_script(\\"return 'a'\\") - elif self.driver.execute_script(\\"return (arguments[0] === 'b')\\", vars.[\\"myVar\\"]): + elif self.driver.execute_script(\\"return (arguments[0] === 'b')\\", vars[\\"myVar\\"]): vars[\\"output\\"] = self.driver.execute_script(\\"return 'b'\\") else: vars[\\"output\\"] = self.driver.execute_script(\\"return 'c'\\") @@ -69,9 +69,9 @@ class TestControlflow(): def test_controlflowelseif(self): vars[\\"myVar\\"] = self.driver.execute_script(\\"return 'b'\\") - if self.driver.execute_script(\\"return (arguments[0] === 'a')\\", vars.[\\"myVar\\"]): + if self.driver.execute_script(\\"return (arguments[0] === 'a')\\", vars[\\"myVar\\"]): vars[\\"output\\"] = self.driver.execute_script(\\"return 'a'\\") - elif self.driver.execute_script(\\"return (arguments[0] === 'b')\\", vars.[\\"myVar\\"]): + elif self.driver.execute_script(\\"return (arguments[0] === 'b')\\", vars[\\"myVar\\"]): vars[\\"output\\"] = self.driver.execute_script(\\"return 'b'\\") else: vars[\\"output\\"] = self.driver.execute_script(\\"return 'c'\\") @@ -79,9 +79,9 @@ class TestControlflow(): def test_controlflowelse(self): vars[\\"myVar\\"] = self.driver.execute_script(\\"return 'c'\\") - if self.driver.execute_script(\\"return (arguments[0] === 'a')\\", vars.[\\"myVar\\"]): + if self.driver.execute_script(\\"return (arguments[0] === 'a')\\", vars[\\"myVar\\"]): vars[\\"output\\"] = self.driver.execute_script(\\"return 'a'\\") - elif self.driver.execute_script(\\"return (arguments[0] === 'b')\\", vars.[\\"myVar\\"]): + elif self.driver.execute_script(\\"return (arguments[0] === 'b')\\", vars[\\"myVar\\"]): vars[\\"output\\"] = self.driver.execute_script(\\"return 'b'\\") else: vars[\\"output\\"] = self.driver.execute_script(\\"return 'c'\\") @@ -91,20 +91,20 @@ class TestControlflow(): vars[\\"check\\"] = self.driver.execute_script(\\"return 1\\") condition = True while condition: - vars[\\"check\\"] = self.driver.execute_script(\\"return arguments[0] + 1\\", vars.[\\"check\\"]) - condition = self.driver.execute_script(\\"return (arguments[0] < 3)\\", vars.[\\"check\\"]) + vars[\\"check\\"] = self.driver.execute_script(\\"return arguments[0] + 1\\", vars[\\"check\\"]) + condition = self.driver.execute_script(\\"return (arguments[0] < 3)\\", vars[\\"check\\"]) assert(vars[\\"check\\"] == \\"3\\") def test_controlflowtimes(self): vars[\\"check\\"] = self.driver.execute_script(\\"return 1\\") for i in range(1, 2): - vars[\\"check\\"] = self.driver.execute_script(\\"return arguments[0] + 1\\", vars.[\\"check\\"]) + vars[\\"check\\"] = self.driver.execute_script(\\"return arguments[0] + 1\\", vars[\\"check\\"]) assert(vars[\\"check\\"] == \\"3\\") def test_controlflowwhile(self): vars[\\"check\\"] = self.driver.execute_script(\\"return 1\\") - while self.driver.execute_script(\\"return (arguments[0] < 3)\\", vars.[\\"check\\"]): - vars[\\"check\\"] = self.driver.execute_script(\\"return arguments[0] + 1\\", vars.[\\"check\\"]) + while self.driver.execute_script(\\"return (arguments[0] < 3)\\", vars[\\"check\\"]): + vars[\\"check\\"] = self.driver.execute_script(\\"return arguments[0] + 1\\", vars[\\"check\\"]) assert(vars[\\"check\\"] == \\"3\\") " diff --git a/packages/code-export-python-pytest/src/command.js b/packages/code-export-python-pytest/src/command.js index 87c0aa8b6c..7a97df22b6 100644 --- a/packages/code-export-python-pytest/src/command.js +++ b/packages/code-export-python-pytest/src/command.js @@ -235,7 +235,7 @@ function generateExpressionScript(script) { function generateScriptArguments(script) { return `${script.argv.length ? ', ' : ''}${script.argv - .map(varName => `vars.["${varName}"]`) + .map(varName => `vars["${varName}"]`) .join(',')}` } From f330ee27d61188fd21f09b234ef731e6f65f42f8 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Wed, 12 Jun 2019 13:42:56 +0300 Subject: [PATCH 32/99] findElement => find_element (missed one) --- .../code-export-python-pytest/__test__/src/command.spec.js | 6 +++--- packages/code-export-python-pytest/src/command.js | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/code-export-python-pytest/__test__/src/command.spec.js b/packages/code-export-python-pytest/__test__/src/command.spec.js index a89defe947..e2a198e415 100644 --- a/packages/code-export-python-pytest/__test__/src/command.spec.js +++ b/packages/code-export-python-pytest/__test__/src/command.spec.js @@ -58,7 +58,7 @@ describe('command code emitter', () => { value: 'label=A label', } return expect(prettify(command)).resolves.toBe( - `dropdown = self.driver.find_element(By.CSS_SELECTOR, "select")\ndropdown.findElement(By.XPATH, "//option[. = 'A label']").click()` + `dropdown = self.driver.find_element(By.CSS_SELECTOR, "select")\ndropdown.find_element(By.XPATH, "//option[. = 'A label']").click()` ) }) it('should emit `assert` command', () => { @@ -526,7 +526,7 @@ describe('command code emitter', () => { value: 'label=A label', } return expect(prettify(command)).resolves.toBe( - `dropdown = self.driver.find_element(By.CSS_SELECTOR, "select")\ndropdown.findElement(By.XPATH, "//option[. = 'A label']").click()` + `dropdown = self.driver.find_element(By.CSS_SELECTOR, "select")\ndropdown.find_element(By.XPATH, "//option[. = 'A label']").click()` ) }) it('should emit `repeatIf` command', () => { @@ -564,7 +564,7 @@ describe('command code emitter', () => { value: 'label=A label', } return expect(prettify(command)).resolves.toBe( - `dropdown = self.driver.find_element(By.CSS_SELECTOR, "select")\ndropdown.findElement(By.XPATH, "//option[. = 'A label']").click()` + `dropdown = self.driver.find_element(By.CSS_SELECTOR, "select")\ndropdown.find_element(By.XPATH, "//option[. = 'A label']").click()` ) }) it('should emit `select frame` to select the top frame', () => { diff --git a/packages/code-export-python-pytest/src/command.js b/packages/code-export-python-pytest/src/command.js index 7a97df22b6..b157591bc0 100644 --- a/packages/code-export-python-pytest/src/command.js +++ b/packages/code-export-python-pytest/src/command.js @@ -504,7 +504,7 @@ async function emitSelect(selectElement, option) { }, { level: 0, - statement: `dropdown.findElement(${await selection.emit( + statement: `dropdown.find_element(${await selection.emit( option )}).click()`, }, From cdf2b77a9bdc24a3cf97b674b16f4378165c4fb9 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Wed, 12 Jun 2019 13:43:59 +0300 Subject: [PATCH 33/99] Added missing dependency for Keys --- packages/code-export-python-pytest/src/hook.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/code-export-python-pytest/src/hook.js b/packages/code-export-python-pytest/src/hook.js index 9a4cce6323..7d5a57ceb0 100644 --- a/packages/code-export-python-pytest/src/hook.js +++ b/packages/code-export-python-pytest/src/hook.js @@ -124,6 +124,10 @@ function declareDependencies() { statement: 'from selenium.webdriver.support.wait import WebDriverWait', }, + { + level: 0, + statement: 'from selenium.webdriver.common.keys import Keys', + }, { level: 0, statement: '', From 224980c8f04d6484e0494df6e0bdf50d0fed18b2 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Wed, 12 Jun 2019 13:52:24 +0300 Subject: [PATCH 34/99] Added `self.` prefix to `vars` and updated the test snapshots --- .../src/__snapshots__/index.spec.js.snap | 126 ++++++++++-------- .../__test__/src/command.spec.js | 36 ++--- .../code-export-python-pytest/src/command.js | 22 +-- 3 files changed, 96 insertions(+), 88 deletions(-) diff --git a/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap b/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap index f6d7e38a0e..0fe21fd880 100644 --- a/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap +++ b/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap @@ -10,6 +10,7 @@ from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.support import expected_conditions from selenium.webdriver.support.wait import WebDriverWait +from selenium.webdriver.common.keys import Keys class TestLogin(): def setup_method(self, method): @@ -48,6 +49,7 @@ from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.support import expected_conditions from selenium.webdriver.support.wait import WebDriverWait +from selenium.webdriver.common.keys import Keys class TestControlflow(): def setup_method(self, method): @@ -58,54 +60,54 @@ class TestControlflow(): self.driver.quit(); def test_controlflowif(self): - vars[\\"myVar\\"] = self.driver.execute_script(\\"return 'a'\\") - if self.driver.execute_script(\\"return (arguments[0] === 'a')\\", vars[\\"myVar\\"]): - vars[\\"output\\"] = self.driver.execute_script(\\"return 'a'\\") - elif self.driver.execute_script(\\"return (arguments[0] === 'b')\\", vars[\\"myVar\\"]): - vars[\\"output\\"] = self.driver.execute_script(\\"return 'b'\\") + self.vars[\\"myVar\\"] = self.driver.execute_script(\\"return 'a'\\") + if self.driver.execute_script(\\"return (arguments[0] === 'a')\\", self.vars[\\"myVar\\"]): + self.vars[\\"output\\"] = self.driver.execute_script(\\"return 'a'\\") + elif self.driver.execute_script(\\"return (arguments[0] === 'b')\\", self.vars[\\"myVar\\"]): + self.vars[\\"output\\"] = self.driver.execute_script(\\"return 'b'\\") else: - vars[\\"output\\"] = self.driver.execute_script(\\"return 'c'\\") - assert(vars[\\"output\\"] == \\"a\\") + self.vars[\\"output\\"] = self.driver.execute_script(\\"return 'c'\\") + assert(self.vars[\\"output\\"] == \\"a\\") def test_controlflowelseif(self): - vars[\\"myVar\\"] = self.driver.execute_script(\\"return 'b'\\") - if self.driver.execute_script(\\"return (arguments[0] === 'a')\\", vars[\\"myVar\\"]): - vars[\\"output\\"] = self.driver.execute_script(\\"return 'a'\\") - elif self.driver.execute_script(\\"return (arguments[0] === 'b')\\", vars[\\"myVar\\"]): - vars[\\"output\\"] = self.driver.execute_script(\\"return 'b'\\") + self.vars[\\"myVar\\"] = self.driver.execute_script(\\"return 'b'\\") + if self.driver.execute_script(\\"return (arguments[0] === 'a')\\", self.vars[\\"myVar\\"]): + self.vars[\\"output\\"] = self.driver.execute_script(\\"return 'a'\\") + elif self.driver.execute_script(\\"return (arguments[0] === 'b')\\", self.vars[\\"myVar\\"]): + self.vars[\\"output\\"] = self.driver.execute_script(\\"return 'b'\\") else: - vars[\\"output\\"] = self.driver.execute_script(\\"return 'c'\\") - assert(vars[\\"output\\"] == \\"b\\") + self.vars[\\"output\\"] = self.driver.execute_script(\\"return 'c'\\") + assert(self.vars[\\"output\\"] == \\"b\\") def test_controlflowelse(self): - vars[\\"myVar\\"] = self.driver.execute_script(\\"return 'c'\\") - if self.driver.execute_script(\\"return (arguments[0] === 'a')\\", vars[\\"myVar\\"]): - vars[\\"output\\"] = self.driver.execute_script(\\"return 'a'\\") - elif self.driver.execute_script(\\"return (arguments[0] === 'b')\\", vars[\\"myVar\\"]): - vars[\\"output\\"] = self.driver.execute_script(\\"return 'b'\\") + self.vars[\\"myVar\\"] = self.driver.execute_script(\\"return 'c'\\") + if self.driver.execute_script(\\"return (arguments[0] === 'a')\\", self.vars[\\"myVar\\"]): + self.vars[\\"output\\"] = self.driver.execute_script(\\"return 'a'\\") + elif self.driver.execute_script(\\"return (arguments[0] === 'b')\\", self.vars[\\"myVar\\"]): + self.vars[\\"output\\"] = self.driver.execute_script(\\"return 'b'\\") else: - vars[\\"output\\"] = self.driver.execute_script(\\"return 'c'\\") - assert(vars[\\"output\\"] == \\"c\\") + self.vars[\\"output\\"] = self.driver.execute_script(\\"return 'c'\\") + assert(self.vars[\\"output\\"] == \\"c\\") def test_controlflowdo(self): - vars[\\"check\\"] = self.driver.execute_script(\\"return 1\\") + self.vars[\\"check\\"] = self.driver.execute_script(\\"return 1\\") condition = True while condition: - vars[\\"check\\"] = self.driver.execute_script(\\"return arguments[0] + 1\\", vars[\\"check\\"]) - condition = self.driver.execute_script(\\"return (arguments[0] < 3)\\", vars[\\"check\\"]) - assert(vars[\\"check\\"] == \\"3\\") + self.vars[\\"check\\"] = self.driver.execute_script(\\"return arguments[0] + 1\\", self.vars[\\"check\\"]) + condition = self.driver.execute_script(\\"return (arguments[0] < 3)\\", self.vars[\\"check\\"]) + assert(self.vars[\\"check\\"] == \\"3\\") def test_controlflowtimes(self): - vars[\\"check\\"] = self.driver.execute_script(\\"return 1\\") + self.vars[\\"check\\"] = self.driver.execute_script(\\"return 1\\") for i in range(1, 2): - vars[\\"check\\"] = self.driver.execute_script(\\"return arguments[0] + 1\\", vars[\\"check\\"]) - assert(vars[\\"check\\"] == \\"3\\") + self.vars[\\"check\\"] = self.driver.execute_script(\\"return arguments[0] + 1\\", self.vars[\\"check\\"]) + assert(self.vars[\\"check\\"] == \\"3\\") def test_controlflowwhile(self): - vars[\\"check\\"] = self.driver.execute_script(\\"return 1\\") - while self.driver.execute_script(\\"return (arguments[0] < 3)\\", vars[\\"check\\"]): - vars[\\"check\\"] = self.driver.execute_script(\\"return arguments[0] + 1\\", vars[\\"check\\"]) - assert(vars[\\"check\\"] == \\"3\\") + self.vars[\\"check\\"] = self.driver.execute_script(\\"return 1\\") + while self.driver.execute_script(\\"return (arguments[0] < 3)\\", self.vars[\\"check\\"]): + self.vars[\\"check\\"] = self.driver.execute_script(\\"return arguments[0] + 1\\", self.vars[\\"check\\"]) + assert(self.vars[\\"check\\"] == \\"3\\") " `; @@ -120,6 +122,7 @@ from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.support import expected_conditions from selenium.webdriver.support.wait import WebDriverWait +from selenium.webdriver.common.keys import Keys class TestLogin(): def setup_method(self, method): @@ -132,18 +135,18 @@ class TestLogin(): def login(self): self.driver.get(\\"https://the-internet.herokuapp.com/\\") self.driver.find_element(By.LINK_TEXT, \\"Form Authentication\\").click() - self.driver.find_element(By.ID, \\"username\\").send_keys(vars[\\"username\\"]) - self.driver.find_element(By.ID, \\"password\\").send_keys(vars[\\"password\\"]) + self.driver.find_element(By.ID, \\"username\\").send_keys(self.vars[\\"username\\"]) + self.driver.find_element(By.ID, \\"password\\").send_keys(self.vars[\\"password\\"]) self.driver.find_element(By.CSS_SELECTOR, \\".fa\\").click() def test_invalidcredentials(self): - vars[\\"username\\"] = \\"blah\\" - vars[\\"password\\"] = \\"blah\\" + self.vars[\\"username\\"] = \\"blah\\" + self.vars[\\"password\\"] = \\"blah\\" self.login() def test_validcredentials(self): - vars[\\"username\\"] = \\"tomsmith\\" - vars[\\"password\\"] = \\"SuperSecretPassword!\\" + self.vars[\\"username\\"] = \\"tomsmith\\" + self.vars[\\"password\\"] = \\"SuperSecretPassword!\\" self.login() " @@ -159,6 +162,7 @@ from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.support import expected_conditions from selenium.webdriver.support.wait import WebDriverWait +from selenium.webdriver.common.keys import Keys class TestDefaultSuite(): def setup_method(self, method): @@ -171,16 +175,16 @@ class TestDefaultSuite(): def wait_for_window(timeout = 2000) { self.driver.sleep(timeout) wh_now = self.driver.window_handles - wh_then = vars[\\"window_handles\\"] + wh_then = self.vars[\\"window_handles\\"] if len(wh_now) > len(wh_then): return set(wh_now).difference(set(wh_then)) def selectwindow(self): self.driver.get(\\"http://the-internet.herokuapp.com/windows\\") - vars[\\"window_handles\\"] = self.driver.window_handles + self.vars[\\"window_handles\\"] = self.driver.window_handles self.driver.find_element(By.LINK_TEXT, \\"Click Here\\").click() - vars[\\"win9425\\"] = self.wait_for_window(2000) - self.driver.switch_to.window(vars[\\"win9425\\"]) + self.vars[\\"win9425\\"] = self.wait_for_window(2000) + self.driver.switch_to.window(self.vars[\\"win9425\\"]) assert self.driver.title == \\"New Window\\" def test_reuse(self): @@ -199,6 +203,7 @@ from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.support import expected_conditions from selenium.webdriver.support.wait import WebDriverWait +from selenium.webdriver.common.keys import Keys class TestDefaultSuite(): def setup_method(self, method): @@ -211,16 +216,16 @@ class TestDefaultSuite(): def wait_for_window(timeout = 2000) { self.driver.sleep(timeout) wh_now = self.driver.window_handles - wh_then = vars[\\"window_handles\\"] + wh_then = self.vars[\\"window_handles\\"] if len(wh_now) > len(wh_then): return set(wh_now).difference(set(wh_then)) def selectwindow(self): self.driver.get(\\"http://the-internet.herokuapp.com/windows\\") - vars[\\"window_handles\\"] = self.driver.window_handles + self.vars[\\"window_handles\\"] = self.driver.window_handles self.driver.find_element(By.LINK_TEXT, \\"Click Here\\").click() - vars[\\"win9425\\"] = self.wait_for_window(2000) - self.driver.switch_to.window(vars[\\"win9425\\"]) + self.vars[\\"win9425\\"] = self.wait_for_window(2000) + self.driver.switch_to.window(self.vars[\\"win9425\\"]) assert self.driver.title == \\"New Window\\" def test_reuse(self): @@ -228,10 +233,10 @@ class TestDefaultSuite(): def test_selectwindow(self): self.driver.get(\\"http://the-internet.herokuapp.com/windows\\") - vars[\\"window_handles\\"] = self.driver.window_handles + self.vars[\\"window_handles\\"] = self.driver.window_handles self.driver.find_element(By.LINK_TEXT, \\"Click Here\\").click() - vars[\\"win9425\\"] = self.wait_for_window(2000) - self.driver.switch_to.window(vars[\\"win9425\\"]) + self.vars[\\"win9425\\"] = self.wait_for_window(2000) + self.driver.switch_to.window(self.vars[\\"win9425\\"]) assert self.driver.title == \\"New Window\\" " @@ -247,6 +252,7 @@ from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.support import expected_conditions from selenium.webdriver.support.wait import WebDriverWait +from selenium.webdriver.common.keys import Keys class TestLogin(): def setup_method(self, method): @@ -277,6 +283,7 @@ from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.support import expected_conditions from selenium.webdriver.support.wait import WebDriverWait +from selenium.webdriver.common.keys import Keys class TestValidcredentials(): def setup_method(self, method): @@ -289,13 +296,13 @@ class TestValidcredentials(): def login(self): self.driver.get(\\"https://the-internet.herokuapp.com/\\") self.driver.find_element(By.LINK_TEXT, \\"Form Authentication\\").click() - self.driver.find_element(By.ID, \\"username\\").send_keys(vars[\\"username\\"]) - self.driver.find_element(By.ID, \\"password\\").send_keys(vars[\\"password\\"]) + self.driver.find_element(By.ID, \\"username\\").send_keys(self.vars[\\"username\\"]) + self.driver.find_element(By.ID, \\"password\\").send_keys(self.vars[\\"password\\"]) self.driver.find_element(By.CSS_SELECTOR, \\".fa\\").click() def test_validcredentials(self): - vars[\\"username\\"] = \\"tomsmith\\" - vars[\\"password\\"] = \\"SuperSecretPassword!\\" + self.vars[\\"username\\"] = \\"tomsmith\\" + self.vars[\\"password\\"] = \\"SuperSecretPassword!\\" self.login() " @@ -311,6 +318,7 @@ from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.support import expected_conditions from selenium.webdriver.support.wait import WebDriverWait +from selenium.webdriver.common.keys import Keys class TestSelectwindow(): def setup_method(self, method): @@ -323,7 +331,7 @@ class TestSelectwindow(): def wait_for_window(timeout = 2000) { self.driver.sleep(timeout) wh_now = self.driver.window_handles - wh_then = vars[\\"window_handles\\"] + wh_then = self.vars[\\"window_handles\\"] if len(wh_now) > len(wh_then): return set(wh_now).difference(set(wh_then)) @@ -331,13 +339,13 @@ class TestSelectwindow(): self.driver.get(\\"http://the-internet.herokuapp.com/\\") self.driver.set_window_size(1260, 1027) self.driver.find_element(By.LINK_TEXT, \\"Multiple Windows\\").click() - vars[\\"window_handles\\"] = self.driver.window_handles + self.vars[\\"window_handles\\"] = self.driver.window_handles self.driver.find_element(By.LINK_TEXT, \\"Click Here\\").click() - vars[\\"win9625\\"] = self.wait_for_window(2000) - vars[\\"root\\"] = self.driver.current_window_handle - self.driver.switch_to.window(vars[\\"win9625\\"]) + self.vars[\\"win9625\\"] = self.wait_for_window(2000) + self.vars[\\"root\\"] = self.driver.current_window_handle + self.driver.switch_to.window(self.vars[\\"win9625\\"]) assert self.driver.title == \\"New Window\\" - self.driver.switch_to.window(vars[\\"root\\"]) + self.driver.switch_to.window(self.vars[\\"root\\"]) assert self.driver.title == \\"The Internet\\" " diff --git a/packages/code-export-python-pytest/__test__/src/command.spec.js b/packages/code-export-python-pytest/__test__/src/command.spec.js index e2a198e415..c44f47ef32 100644 --- a/packages/code-export-python-pytest/__test__/src/command.spec.js +++ b/packages/code-export-python-pytest/__test__/src/command.spec.js @@ -68,7 +68,7 @@ describe('command code emitter', () => { value: 'blah', } expect(prettify(command)).resolves.toBe( - `assert(vars["varrrName"] == "blah")` + `assert(self.vars["varrrName"] == "blah")` ) }) it('should emit `assert alert` command', () => { @@ -324,7 +324,7 @@ describe('command code emitter', () => { target: '${blah}', value: '', } - return expect(prettify(command)).resolves.toBe(`print(str(vars["blah"]))`) + return expect(prettify(command)).resolves.toBe(`print(str(self.vars["blah"]))`) }) it('should emit `edit content` command', () => { const command = { @@ -376,7 +376,7 @@ describe('command code emitter', () => { value: 'myVar', } return expect(prettify(command)).resolves.toBe( - `vars["myVar"] = self.driver.execute_script("javascript")` + `self.vars["myVar"] = self.driver.execute_script("javascript")` ) }) it('should emit `execute script` command with return string value', () => { @@ -386,7 +386,7 @@ describe('command code emitter', () => { value: 'myVar', } return expect(prettify(command)).resolves.toBe( - `vars["myVar"] = self.driver.execute_script("return 'a'")` + `self.vars["myVar"] = self.driver.execute_script("return 'a'")` ) }) it('should emit `execute async script` command', () => { @@ -396,7 +396,7 @@ describe('command code emitter', () => { value: 'myVar', } return expect(prettify(command)).resolves.toBe( - `vars["myVar"] = self.driver.execute_async_script("var callback = arguments[arguments.length - 1];javascript.then(callback).catch(callback);")` + `self.vars["myVar"] = self.driver.execute_async_script("var callback = arguments[arguments.length - 1];javascript.then(callback).catch(callback);")` ) }) it('should emit `forEach` command', () => { @@ -406,7 +406,7 @@ describe('command code emitter', () => { value: 'iteratorVar', } return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: `collection = vars["collection"]\nfor entry in collection\n${commandPrefixPadding}vars["iteratorVar"] = entry`, + body: `collection = self.vars["collection"]\nfor entry in collection\n${commandPrefixPadding}self.vars["iteratorVar"] = entry`, endingLevel: 1, }) }) @@ -594,7 +594,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `self.driver.switch_to.window(vars["window"])` + `self.driver.switch_to.window(self.vars["window"])` ) }) it('should emit `select window` to select a window by name', () => { @@ -644,7 +644,7 @@ describe('command code emitter', () => { value: '${blah}', } return expect(prettify(command)).resolves.toBe( - `self.driver.find_element(By.ID, "input").send_keys(vars["blah"])` + `self.driver.find_element(By.ID, "input").send_keys(self.vars["blah"])` ) }) it('should emit `send keys` command with a key press', () => { @@ -695,7 +695,7 @@ describe('command code emitter', () => { value: 'myVar', } return expect(prettify(command)).resolves.toBe( - `vars["myVar"] = "some value"` + `self.vars["myVar"] = "some value"` ) }) it('should emit `store attribute` command', () => { @@ -705,7 +705,7 @@ describe('command code emitter', () => { value: 'myVar', } return expect(prettify(command)).resolves.toBe( - `attribute = self.driver.find_element(By.XPATH, "button[3]").get_attribute("id")\nvars["myVar"] = attribute` + `attribute = self.driver.find_element(By.XPATH, "button[3]").get_attribute("id")\nself.vars["myVar"] = attribute` ) }) it('should emit `store text` command', () => { @@ -715,7 +715,7 @@ describe('command code emitter', () => { value: 'myVar', } return expect(prettify(command)).resolves.toBe( - `vars["myVar"] = self.driver.find_element(By.ID, "someElement").text` + `self.vars["myVar"] = self.driver.find_element(By.ID, "someElement").text` ) }) it('should emit `store json` command', () => { @@ -725,7 +725,7 @@ describe('command code emitter', () => { value: 'myVar', } return expect(prettify(command)).resolves.toBe( - `vars["myVar"] = json.loads([{"a":0}])` + `self.vars["myVar"] = json.loads([{"a":0}])` ) }) it('should emit `store title` command', () => { @@ -735,7 +735,7 @@ describe('command code emitter', () => { value: 'myVar', } return expect(prettify(command)).resolves.toBe( - `vars["myVar"] = self.driver.title` + `self.vars["myVar"] = self.driver.title` ) }) it('should emit `store value` command', () => { @@ -745,7 +745,7 @@ describe('command code emitter', () => { value: 'myVar', } return expect(prettify(command)).resolves.toBe( - `vars["myVar"] = self.driver.find_element(By.ID, "someElement").get_attribute("value")` + `self.vars["myVar"] = self.driver.find_element(By.ID, "someElement").get_attribute("value")` ) }) it('should emit `store window handle` command', () => { @@ -755,7 +755,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `vars["windowName"] = self.driver.current_window_handle` + `self.vars["windowName"] = self.driver.current_window_handle` ) }) it('should emit `store xpath count` command', () => { @@ -765,7 +765,7 @@ describe('command code emitter', () => { value: 'myVar', } return expect(prettify(command)).resolves.toBe( - `vars["myVar"] = len(self.driver.find_elements(By.XPATH, "button"))` + `self.vars["myVar"] = len(self.driver.find_elements(By.XPATH, "button"))` ) }) it('should emit `submit` command', () => { @@ -816,7 +816,7 @@ describe('command code emitter', () => { value: 'blah', } expect(prettify(command)).resolves.toBe( - `assert(vars["varrrName"] == "blah")` + `assert(self.vars["varrrName"] == "blah")` ) }) it('should emit `verify checked` command', () => { @@ -1060,7 +1060,7 @@ describe('command code emitter', () => { windowTimeout: 2000, } return expect(prettify(command)).resolves.toBe( - `vars["window_handles"] = self.driver.window_handles\nself.driver.find_element(By.CSS_SELECTOR, "button").click()\nvars["newWin"] = self.wait_for_window(2000)` + `self.vars["window_handles"] = self.driver.window_handles\nself.driver.find_element(By.CSS_SELECTOR, "button").click()\nself.vars["newWin"] = self.wait_for_window(2000)` ) }) }) diff --git a/packages/code-export-python-pytest/src/command.js b/packages/code-export-python-pytest/src/command.js index b157591bc0..a89cbd410e 100644 --- a/packages/code-export-python-pytest/src/command.js +++ b/packages/code-export-python-pytest/src/command.js @@ -137,11 +137,11 @@ function canEmit(commandName) { } function variableLookup(varName) { - return `vars["${varName}"]` + return `self.vars["${varName}"]` } function variableSetter(varName, value) { - return varName ? `vars["${varName}"] = ${value}` : '' + return varName ? `self.vars["${varName}"] = ${value}` : '' } function emitWaitForWindow() { @@ -153,7 +153,7 @@ function emitWaitForWindow() { { level: 0, statement: 'wh_now = self.driver.window_handles' }, { level: 0, - statement: 'wh_then = vars["window_handles"]', + statement: 'wh_then = self.vars["window_handles"]', }, { level: 0, statement: 'if len(wh_now) > len(wh_then):' }, { level: 1, statement: 'return set(wh_now).difference(set(wh_then))' }, @@ -167,14 +167,14 @@ function emitWaitForWindow() { async function emitNewWindowHandling(command, emittedCommand) { return Promise.resolve( - `vars["window_handles"] = self.driver.window_handles\n${await emittedCommand}\nvars["${ + `self.vars["window_handles"] = self.driver.window_handles\n${await emittedCommand}\nself.vars["${ command.windowHandleName }"] = self.wait_for_window(${command.windowTimeout})` ) } function emitAssert(varName, value) { - return Promise.resolve(`assert(vars["${varName}"] == "${value}")`) + return Promise.resolve(`assert(self.vars["${varName}"] == "${value}")`) } function emitAssertAlert(alertText) { @@ -235,7 +235,7 @@ function generateExpressionScript(script) { function generateScriptArguments(script) { return `${script.argv.length ? ', ' : ''}${script.argv - .map(varName => `vars["${varName}"]`) + .map(varName => `self.vars["${varName}"]`) .join(',')}` } @@ -292,7 +292,7 @@ function emitControlFlowForEach(collectionVarName, iteratorVarName) { commands: [ { level: 0, - statement: `collection = vars["${collectionVarName}"]`, + statement: `collection = self.vars["${collectionVarName}"]`, }, { level: 0, @@ -300,7 +300,7 @@ function emitControlFlowForEach(collectionVarName, iteratorVarName) { }, { level: 1, - statement: `vars["${iteratorVarName}"] = entry`, + statement: `self.vars["${iteratorVarName}"] = entry`, }, ], }) @@ -370,7 +370,7 @@ async function emitDragAndDrop(dragged, dropped) { } async function emitEcho(message) { - const _message = message.startsWith('vars[') ? message : `"${message}"` + const _message = message.startsWith('self.vars[') ? message : `"${message}"` return Promise.resolve(`print(str(${_message}))`) } @@ -578,7 +578,7 @@ function generateSendKeysInput(value) { if (typeof value === 'object') { return value .map(s => { - if (s.startsWith('vars[')) { + if (s.startsWith('self.vars[')) { return s } else if (s.startsWith('Key[')) { const key = s.match(/\['(.*)'\]/)[1] @@ -589,7 +589,7 @@ function generateSendKeysInput(value) { }) .join(', ') } else { - if (value.startsWith('vars[')) { + if (value.startsWith('self.vars[')) { return value } else { return `"${value}"` From 38f23344562258d2ab64343a2a064ae25e60a042 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Wed, 12 Jun 2019 14:16:14 +0300 Subject: [PATCH 35/99] Updated emitAssert to convert booleans and numbers using the correct interpolation --- .../__test__/src/__snapshots__/index.spec.js.snap | 6 +++--- packages/code-export-python-pytest/src/command.js | 11 ++++++++++- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap b/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap index 0fe21fd880..90f71776cc 100644 --- a/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap +++ b/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap @@ -95,19 +95,19 @@ class TestControlflow(): while condition: self.vars[\\"check\\"] = self.driver.execute_script(\\"return arguments[0] + 1\\", self.vars[\\"check\\"]) condition = self.driver.execute_script(\\"return (arguments[0] < 3)\\", self.vars[\\"check\\"]) - assert(self.vars[\\"check\\"] == \\"3\\") + assert(self.vars[\\"check\\"] == 3) def test_controlflowtimes(self): self.vars[\\"check\\"] = self.driver.execute_script(\\"return 1\\") for i in range(1, 2): self.vars[\\"check\\"] = self.driver.execute_script(\\"return arguments[0] + 1\\", self.vars[\\"check\\"]) - assert(self.vars[\\"check\\"] == \\"3\\") + assert(self.vars[\\"check\\"] == 3) def test_controlflowwhile(self): self.vars[\\"check\\"] = self.driver.execute_script(\\"return 1\\") while self.driver.execute_script(\\"return (arguments[0] < 3)\\", self.vars[\\"check\\"]): self.vars[\\"check\\"] = self.driver.execute_script(\\"return arguments[0] + 1\\", self.vars[\\"check\\"]) - assert(self.vars[\\"check\\"] == \\"3\\") + assert(self.vars[\\"check\\"] == 3) " `; diff --git a/packages/code-export-python-pytest/src/command.js b/packages/code-export-python-pytest/src/command.js index a89cbd410e..4ee7e0deb2 100644 --- a/packages/code-export-python-pytest/src/command.js +++ b/packages/code-export-python-pytest/src/command.js @@ -174,7 +174,16 @@ async function emitNewWindowHandling(command, emittedCommand) { } function emitAssert(varName, value) { - return Promise.resolve(`assert(self.vars["${varName}"] == "${value}")`) + let _value + if (value === 'true' || value === 'false') { + _value = exporter.parsers.capitalize(value) + } else if (value === '0' || !!Number(value)) { + _value = value + } + const result = _value + ? `assert(self.vars["${varName}"] == ${_value})` + : `assert(self.vars["${varName}"] == "${value}")` + return Promise.resolve(result) } function emitAssertAlert(alertText) { From 28c1dabcd990a022bc43adf883f559e2d4f8574b Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Wed, 12 Jun 2019 14:24:26 +0300 Subject: [PATCH 36/99] Fixed incorrect find_element param declaration --- .../__test__/src/command.spec.js | 8 +++++--- packages/code-export-python-pytest/src/command.js | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/code-export-python-pytest/__test__/src/command.spec.js b/packages/code-export-python-pytest/__test__/src/command.spec.js index c44f47ef32..c13a9509f5 100644 --- a/packages/code-export-python-pytest/__test__/src/command.spec.js +++ b/packages/code-export-python-pytest/__test__/src/command.spec.js @@ -188,7 +188,7 @@ describe('command code emitter', () => { value: 'test', } return expect(prettify(command)).resolves.toBe( - `element = self.driver.find_element(By.ID, "test")\nlocator = "option[@value='{}']".format(element.get_attribute("value"))\nselected_text = element.find_element(By.XPATH(locator)).text\nassert selected_text == "test"` + `element = self.driver.find_element(By.ID, "test")\nlocator = "option[@value='{}']".format(element.get_attribute("value"))\nselected_text = element.find_element(By.XPATH, locator).text\nassert selected_text == "test"` ) }) it('should emit `assert selected value` command', () => { @@ -324,7 +324,9 @@ describe('command code emitter', () => { target: '${blah}', value: '', } - return expect(prettify(command)).resolves.toBe(`print(str(self.vars["blah"]))`) + return expect(prettify(command)).resolves.toBe( + `print(str(self.vars["blah"]))` + ) }) it('should emit `edit content` command', () => { const command = { @@ -906,7 +908,7 @@ describe('command code emitter', () => { value: 'test', } return expect(prettify(command)).resolves.toBe( - `element = self.driver.find_element(By.ID, "test")\nlocator = "option[@value='{}']".format(element.get_attribute("value"))\nselected_text = element.find_element(By.XPATH(locator)).text\nassert selected_text == "test"` + `element = self.driver.find_element(By.ID, "test")\nlocator = "option[@value='{}']".format(element.get_attribute("value"))\nselected_text = element.find_element(By.XPATH, locator).text\nassert selected_text == "test"` ) }) it('should emit `verify value` command', () => { diff --git a/packages/code-export-python-pytest/src/command.js b/packages/code-export-python-pytest/src/command.js index 4ee7e0deb2..ddff3cc158 100644 --- a/packages/code-export-python-pytest/src/command.js +++ b/packages/code-export-python-pytest/src/command.js @@ -823,7 +823,7 @@ async function emitVerifySelectedLabel(locator, labelValue) { }, { level: 0, - statement: 'selected_text = element.find_element(By.XPATH(locator)).text', + statement: 'selected_text = element.find_element(By.XPATH, locator).text', }, { level: 0, statement: `assert selected_text == "${labelValue}"` }, ] From 07bdef94922bb232f1621882551ad2a8e8018938 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Wed, 12 Jun 2019 14:49:23 +0300 Subject: [PATCH 37/99] Fixed `repeat if` indentation --- .../__test__/src/__snapshots__/index.spec.js.snap | 2 +- packages/code-export-python-pytest/src/command.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap b/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap index 90f71776cc..572078b6c3 100644 --- a/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap +++ b/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap @@ -94,7 +94,7 @@ class TestControlflow(): condition = True while condition: self.vars[\\"check\\"] = self.driver.execute_script(\\"return arguments[0] + 1\\", self.vars[\\"check\\"]) - condition = self.driver.execute_script(\\"return (arguments[0] < 3)\\", self.vars[\\"check\\"]) + condition = self.driver.execute_script(\\"return (arguments[0] < 3)\\", self.vars[\\"check\\"]) assert(self.vars[\\"check\\"] == 3) def test_controlflowtimes(self): diff --git a/packages/code-export-python-pytest/src/command.js b/packages/code-export-python-pytest/src/command.js index ddff3cc158..bb17a0c67e 100644 --- a/packages/code-export-python-pytest/src/command.js +++ b/packages/code-export-python-pytest/src/command.js @@ -323,7 +323,7 @@ function emitControlFlowRepeatIf(script) { statement: `condition = ${generateExpressionScript(script)}`, }, ], - startingLevelAdjustment: -1, + endingLevelAdjustment: -1, }) } From 1413e990219f1deaccd6bdf60a3d71e5155b8476 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Wed, 12 Jun 2019 14:50:09 +0300 Subject: [PATCH 38/99] Added missing `:` for `for each` --- packages/code-export-python-pytest/__test__/src/command.spec.js | 2 +- packages/code-export-python-pytest/src/command.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/code-export-python-pytest/__test__/src/command.spec.js b/packages/code-export-python-pytest/__test__/src/command.spec.js index c13a9509f5..82aea77939 100644 --- a/packages/code-export-python-pytest/__test__/src/command.spec.js +++ b/packages/code-export-python-pytest/__test__/src/command.spec.js @@ -408,7 +408,7 @@ describe('command code emitter', () => { value: 'iteratorVar', } return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: `collection = self.vars["collection"]\nfor entry in collection\n${commandPrefixPadding}self.vars["iteratorVar"] = entry`, + body: `collection = self.vars["collection"]\nfor entry in collection:\n${commandPrefixPadding}self.vars["iteratorVar"] = entry`, endingLevel: 1, }) }) diff --git a/packages/code-export-python-pytest/src/command.js b/packages/code-export-python-pytest/src/command.js index bb17a0c67e..9d4f96bc67 100644 --- a/packages/code-export-python-pytest/src/command.js +++ b/packages/code-export-python-pytest/src/command.js @@ -305,7 +305,7 @@ function emitControlFlowForEach(collectionVarName, iteratorVarName) { }, { level: 0, - statement: `for entry in collection`, + statement: `for entry in collection:`, }, { level: 1, From 546f9ea5ec8c37b4a3abc2c5de0cf174114b6508 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Wed, 12 Jun 2019 14:59:12 +0300 Subject: [PATCH 39/99] Fixed off-by-one error in `times` --- .../__test__/src/__snapshots__/index.spec.js.snap | 2 +- packages/code-export-python-pytest/__test__/src/command.spec.js | 2 +- packages/code-export-python-pytest/src/command.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap b/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap index 572078b6c3..ddbc074ffd 100644 --- a/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap +++ b/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap @@ -99,7 +99,7 @@ class TestControlflow(): def test_controlflowtimes(self): self.vars[\\"check\\"] = self.driver.execute_script(\\"return 1\\") - for i in range(1, 2): + for i in range(0, 2): self.vars[\\"check\\"] = self.driver.execute_script(\\"return arguments[0] + 1\\", self.vars[\\"check\\"]) assert(self.vars[\\"check\\"] == 3) diff --git a/packages/code-export-python-pytest/__test__/src/command.spec.js b/packages/code-export-python-pytest/__test__/src/command.spec.js index 82aea77939..0051be2da5 100644 --- a/packages/code-export-python-pytest/__test__/src/command.spec.js +++ b/packages/code-export-python-pytest/__test__/src/command.spec.js @@ -787,7 +787,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: `for i in range(1, 5):`, + body: `for i in range(0, 5):`, endingLevel: 1, }) }) diff --git a/packages/code-export-python-pytest/src/command.js b/packages/code-export-python-pytest/src/command.js index 9d4f96bc67..15cc03304e 100644 --- a/packages/code-export-python-pytest/src/command.js +++ b/packages/code-export-python-pytest/src/command.js @@ -328,7 +328,7 @@ function emitControlFlowRepeatIf(script) { } function emitControlFlowTimes(target) { - const commands = [{ level: 0, statement: `for i in range(1, ${target}):` }] + const commands = [{ level: 0, statement: `for i in range(0, ${target}):` }] return Promise.resolve({ commands, endingLevelAdjustment: 1 }) } From eb6246a93124761e6490859e6d2df4b6aca9a89e Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Wed, 12 Jun 2019 15:07:17 +0300 Subject: [PATCH 40/99] Updated explicit wait emitters --- .../code-export-python-pytest/__test__/src/command.spec.js | 6 +++--- packages/code-export-python-pytest/src/command.js | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/code-export-python-pytest/__test__/src/command.spec.js b/packages/code-export-python-pytest/__test__/src/command.spec.js index 0051be2da5..be9c8957f1 100644 --- a/packages/code-export-python-pytest/__test__/src/command.spec.js +++ b/packages/code-export-python-pytest/__test__/src/command.spec.js @@ -988,7 +988,7 @@ describe('command code emitter', () => { value: '5000', } return expect(prettify(command)).resolves.toBe( - `WebDriverWait(self.driver, 5000).until(!expected_conditions.element_to_be_clickable(By.CSS_SELECTOR, "#blah"))` + `WebDriverWait(self.driver, 5000).until(not expected_conditions.element_to_be_clickable(By.CSS_SELECTOR, "#blah"))` ) }) it('should emit `waitForElementNotPresent` command', () => { @@ -998,7 +998,7 @@ describe('command code emitter', () => { value: '5000', } return expect(prettify(command)).resolves.toBe( - `WebDriverWait(self.driver, 5000).until(!expected_conditions.presence_of_element_located(By.CSS_SELECTOR, "#blah"))` + `WebDriverWait(self.driver, 5000).until(expected_conditions.invisibility_of_element_located(By.CSS_SELECTOR, "#blah"))` ) }) it('should emit `waitForElementNotVisible` command', () => { @@ -1008,7 +1008,7 @@ describe('command code emitter', () => { value: '5000', } return expect(prettify(command)).resolves.toBe( - `WebDriverWait(self.driver, 5000).until(!expected_conditions.visibility_of_element_located(By.CSS_SELECTOR, "#blah"))` + `WebDriverWait(self.driver, 5000).until(expected_conditions.invisibility_of_element_located(By.CSS_SELECTOR, "#blah"))` ) }) it('should emit `answer on visible prompt` command', () => { diff --git a/packages/code-export-python-pytest/src/command.js b/packages/code-export-python-pytest/src/command.js index 15cc03304e..98f7c65217 100644 --- a/packages/code-export-python-pytest/src/command.js +++ b/packages/code-export-python-pytest/src/command.js @@ -907,7 +907,7 @@ async function emitWaitForElementNotEditable(locator, timeout) { const commands = [ { level: 0, - statement: `WebDriverWait(self.driver, ${timeout}).until(!expected_conditions.element_to_be_clickable(${await location.emit( + statement: `WebDriverWait(self.driver, ${timeout}).until(not expected_conditions.element_to_be_clickable(${await location.emit( locator )}))`, }, @@ -921,7 +921,7 @@ async function emitWaitForElementNotPresent(locator, timeout) { const commands = [ { level: 0, - statement: `WebDriverWait(self.driver, ${timeout}).until(!expected_conditions.presence_of_element_located(${await location.emit( + statement: `WebDriverWait(self.driver, ${timeout}).until(expected_conditions.invisibility_of_element_located(${await location.emit( locator )}))`, }, @@ -935,7 +935,7 @@ async function emitWaitForElementNotVisible(locator, timeout) { const commands = [ { level: 0, - statement: `WebDriverWait(self.driver, ${timeout}).until(!expected_conditions.visibility_of_element_located(${await location.emit( + statement: `WebDriverWait(self.driver, ${timeout}).until(expected_conditions.invisibility_of_element_located(${await location.emit( locator )}))`, }, From 86f3ef314f28b592a6c79d5e8cb3d0fc7ae12389 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Wed, 12 Jun 2019 15:15:21 +0300 Subject: [PATCH 41/99] Updated explicit wait locator emitting --- .../__test__/src/command.spec.js | 12 +++++----- .../code-export-python-pytest/src/command.js | 24 +++++++++---------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/packages/code-export-python-pytest/__test__/src/command.spec.js b/packages/code-export-python-pytest/__test__/src/command.spec.js index be9c8957f1..908cf6cae4 100644 --- a/packages/code-export-python-pytest/__test__/src/command.spec.js +++ b/packages/code-export-python-pytest/__test__/src/command.spec.js @@ -958,7 +958,7 @@ describe('command code emitter', () => { value: '5000', } return expect(prettify(command)).resolves.toBe( - `WebDriverWait(self.driver, 5000).until(expected_conditions.element_to_be_clickable(By.CSS_SELECTOR, "#blah"))` + `WebDriverWait(self.driver, 5000).until(expected_conditions.element_to_be_clickable((By.CSS_SELECTOR, "#blah")))` ) }) it('should emit `waitForElementPresent` command', () => { @@ -968,7 +968,7 @@ describe('command code emitter', () => { value: '5000', } return expect(prettify(command)).resolves.toBe( - `WebDriverWait(self.driver, 5000).until(expected_conditions.presence_of_element_located(By.CSS_SELECTOR, "#blah"))` + `WebDriverWait(self.driver, 5000).until(expected_conditions.presence_of_element_located((By.CSS_SELECTOR, "#blah")))` ) }) it('should emit `waitForElementVisible` command', () => { @@ -978,7 +978,7 @@ describe('command code emitter', () => { value: '5000', } return expect(prettify(command)).resolves.toBe( - `WebDriverWait(self.driver, 5000).until(expected_conditions.visibility_of_element_located(By.CSS_SELECTOR, "#blah"))` + `WebDriverWait(self.driver, 5000).until(expected_conditions.visibility_of_element_located((By.CSS_SELECTOR, "#blah")))` ) }) it('should emit `waitForElementNotEditable` command', () => { @@ -988,7 +988,7 @@ describe('command code emitter', () => { value: '5000', } return expect(prettify(command)).resolves.toBe( - `WebDriverWait(self.driver, 5000).until(not expected_conditions.element_to_be_clickable(By.CSS_SELECTOR, "#blah"))` + `WebDriverWait(self.driver, 5000).until(not expected_conditions.element_to_be_clickable((By.CSS_SELECTOR, "#blah")))` ) }) it('should emit `waitForElementNotPresent` command', () => { @@ -998,7 +998,7 @@ describe('command code emitter', () => { value: '5000', } return expect(prettify(command)).resolves.toBe( - `WebDriverWait(self.driver, 5000).until(expected_conditions.invisibility_of_element_located(By.CSS_SELECTOR, "#blah"))` + `WebDriverWait(self.driver, 5000).until(expected_conditions.invisibility_of_element_located((By.CSS_SELECTOR, "#blah")))` ) }) it('should emit `waitForElementNotVisible` command', () => { @@ -1008,7 +1008,7 @@ describe('command code emitter', () => { value: '5000', } return expect(prettify(command)).resolves.toBe( - `WebDriverWait(self.driver, 5000).until(expected_conditions.invisibility_of_element_located(By.CSS_SELECTOR, "#blah"))` + `WebDriverWait(self.driver, 5000).until(expected_conditions.invisibility_of_element_located((By.CSS_SELECTOR, "#blah")))` ) }) it('should emit `answer on visible prompt` command', () => { diff --git a/packages/code-export-python-pytest/src/command.js b/packages/code-export-python-pytest/src/command.js index 98f7c65217..c8cddc02f7 100644 --- a/packages/code-export-python-pytest/src/command.js +++ b/packages/code-export-python-pytest/src/command.js @@ -865,9 +865,9 @@ async function emitWaitForElementEditable(locator, timeout) { const commands = [ { level: 0, - statement: `WebDriverWait(self.driver, ${timeout}).until(expected_conditions.element_to_be_clickable(${await location.emit( + statement: `WebDriverWait(self.driver, ${timeout}).until(expected_conditions.element_to_be_clickable((${await location.emit( locator - )}))`, + )})))`, }, ] return Promise.resolve({ commands }) @@ -881,9 +881,9 @@ async function emitWaitForElementPresent(locator, timeout) { const commands = [ { level: 0, - statement: `WebDriverWait(self.driver, ${timeout}).until(expected_conditions.presence_of_element_located(${await location.emit( + statement: `WebDriverWait(self.driver, ${timeout}).until(expected_conditions.presence_of_element_located((${await location.emit( locator - )}))`, + )})))`, }, ] return Promise.resolve({ commands }) @@ -893,9 +893,9 @@ async function emitWaitForElementVisible(locator, timeout) { const commands = [ { level: 0, - statement: `WebDriverWait(self.driver, ${timeout}).until(expected_conditions.visibility_of_element_located(${await location.emit( + statement: `WebDriverWait(self.driver, ${timeout}).until(expected_conditions.visibility_of_element_located((${await location.emit( locator - )}))`, + )})))`, }, ] return Promise.resolve({ @@ -907,9 +907,9 @@ async function emitWaitForElementNotEditable(locator, timeout) { const commands = [ { level: 0, - statement: `WebDriverWait(self.driver, ${timeout}).until(not expected_conditions.element_to_be_clickable(${await location.emit( + statement: `WebDriverWait(self.driver, ${timeout}).until(not expected_conditions.element_to_be_clickable((${await location.emit( locator - )}))`, + )})))`, }, ] return Promise.resolve({ @@ -921,9 +921,9 @@ async function emitWaitForElementNotPresent(locator, timeout) { const commands = [ { level: 0, - statement: `WebDriverWait(self.driver, ${timeout}).until(expected_conditions.invisibility_of_element_located(${await location.emit( + statement: `WebDriverWait(self.driver, ${timeout}).until(expected_conditions.invisibility_of_element_located((${await location.emit( locator - )}))`, + )})))`, }, ] return Promise.resolve({ @@ -935,9 +935,9 @@ async function emitWaitForElementNotVisible(locator, timeout) { const commands = [ { level: 0, - statement: `WebDriverWait(self.driver, ${timeout}).until(expected_conditions.invisibility_of_element_located(${await location.emit( + statement: `WebDriverWait(self.driver, ${timeout}).until(expected_conditions.invisibility_of_element_located((${await location.emit( locator - )}))`, + )})))`, }, ] return Promise.resolve({ From c27cce42a4d64565ea1fdc15b18d84f5dcac5b7c Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Thu, 13 Jun 2019 13:48:28 +0300 Subject: [PATCH 42/99] Updated negative explicit wait, and streamlined `assert not editable` --- .../__test__/src/command.spec.js | 10 +++++----- .../code-export-python-pytest/src/command.js | 16 +++------------- 2 files changed, 8 insertions(+), 18 deletions(-) diff --git a/packages/code-export-python-pytest/__test__/src/command.spec.js b/packages/code-export-python-pytest/__test__/src/command.spec.js index 908cf6cae4..05170dd899 100644 --- a/packages/code-export-python-pytest/__test__/src/command.spec.js +++ b/packages/code-export-python-pytest/__test__/src/command.spec.js @@ -108,7 +108,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `element = self.driver.find_element(By.ID, "text")\nis_editable = element.is_enabled() and element.get_attribute("readonly") == None\nassert is_editable is True` + `element = self.driver.find_element(By.ID, "text")\nassert element.is_enabled() is True` ) }) it('should emit `assert element present` command', () => { @@ -148,7 +148,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `element = self.driver.find_element(By.ID, "text")\nis_editable = element.is_enabled() and element.get_attribute("readonly") == None\nassert is_editable is False` + `element = self.driver.find_element(By.ID, "text")\nassert element.is_enabled() is False` ) }) it('should emit `assert not selected value` command', () => { @@ -838,7 +838,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `element = self.driver.find_element(By.ID, "text")\nis_editable = element.is_enabled() and element.get_attribute("readonly") == None\nassert is_editable is True` + `element = self.driver.find_element(By.ID, "text")\nassert element.is_enabled() is True` ) }) it('should emit `verify element present` command', () => { @@ -878,7 +878,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `element = self.driver.find_element(By.ID, "text")\nis_editable = element.is_enabled() and element.get_attribute("readonly") == None\nassert is_editable is False` + `element = self.driver.find_element(By.ID, "text")\nassert element.is_enabled() is False` ) }) it('should emit `verify not selected value` command', () => { @@ -988,7 +988,7 @@ describe('command code emitter', () => { value: '5000', } return expect(prettify(command)).resolves.toBe( - `WebDriverWait(self.driver, 5000).until(not expected_conditions.element_to_be_clickable((By.CSS_SELECTOR, "#blah")))` + `WebDriverWait(self.driver, 5000).until_not(expected_conditions.element_to_be_clickable((By.CSS_SELECTOR, "#blah")))` ) }) it('should emit `waitForElementNotPresent` command', () => { diff --git a/packages/code-export-python-pytest/src/command.js b/packages/code-export-python-pytest/src/command.js index c8cddc02f7..ee4b63e6e7 100644 --- a/packages/code-export-python-pytest/src/command.js +++ b/packages/code-export-python-pytest/src/command.js @@ -718,12 +718,7 @@ async function emitVerifyEditable(locator) { locator )})`, }, - { - level: 0, - statement: - 'is_editable = element.is_enabled() and element.get_attribute("readonly") == None', - }, - { level: 0, statement: 'assert is_editable is True' }, + { level: 0, statement: 'assert element.is_enabled() is True' }, ] return Promise.resolve({ commands }) } @@ -770,12 +765,7 @@ async function emitVerifyNotEditable(locator) { locator )})`, }, - { - level: 0, - statement: - 'is_editable = element.is_enabled() and element.get_attribute("readonly") == None', - }, - { level: 0, statement: 'assert is_editable is False' }, + { level: 0, statement: 'assert element.is_enabled() is False' }, ] return Promise.resolve({ commands }) } @@ -907,7 +897,7 @@ async function emitWaitForElementNotEditable(locator, timeout) { const commands = [ { level: 0, - statement: `WebDriverWait(self.driver, ${timeout}).until(not expected_conditions.element_to_be_clickable((${await location.emit( + statement: `WebDriverWait(self.driver, ${timeout}).until_not(expected_conditions.element_to_be_clickable((${await location.emit( locator )})))`, }, From 381afd60a7f9c235795bb6372fe21dadfcf8e84c Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Thu, 13 Jun 2019 14:12:15 +0300 Subject: [PATCH 43/99] Updated method declaration for `wait_for_window` --- .../__test__/src/__snapshots__/index.spec.js.snap | 6 +++--- packages/code-export-python-pytest/src/command.js | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap b/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap index ddbc074ffd..2fb6a9aaa0 100644 --- a/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap +++ b/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap @@ -172,7 +172,7 @@ class TestDefaultSuite(): def teardown_method(self, method): self.driver.quit(); - def wait_for_window(timeout = 2000) { + def wait_for_window(timeout = 2): self.driver.sleep(timeout) wh_now = self.driver.window_handles wh_then = self.vars[\\"window_handles\\"] @@ -213,7 +213,7 @@ class TestDefaultSuite(): def teardown_method(self, method): self.driver.quit(); - def wait_for_window(timeout = 2000) { + def wait_for_window(timeout = 2): self.driver.sleep(timeout) wh_now = self.driver.window_handles wh_then = self.vars[\\"window_handles\\"] @@ -328,7 +328,7 @@ class TestSelectwindow(): def teardown_method(self, method): self.driver.quit(); - def wait_for_window(timeout = 2000) { + def wait_for_window(timeout = 2): self.driver.sleep(timeout) wh_now = self.driver.window_handles wh_then = self.vars[\\"window_handles\\"] diff --git a/packages/code-export-python-pytest/src/command.js b/packages/code-export-python-pytest/src/command.js index ee4b63e6e7..e0d44c54f1 100644 --- a/packages/code-export-python-pytest/src/command.js +++ b/packages/code-export-python-pytest/src/command.js @@ -146,7 +146,7 @@ function variableSetter(varName, value) { function emitWaitForWindow() { const generateMethodDeclaration = name => { - return `def ${name}(timeout = 2000) {` + return `def ${name}(timeout = 2):` } const commands = [ { level: 0, statement: 'self.driver.sleep(timeout)' }, From 1bef1815e104aeaf7ef20ece1bfdc62fcc15a0a2 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Thu, 13 Jun 2019 14:14:30 +0300 Subject: [PATCH 44/99] Updated `wait_for_window` to use time.sleep, and convert the timeout input from milliseconds to seconds --- .../__test__/src/__snapshots__/index.spec.js.snap | 6 +++--- packages/code-export-python-pytest/src/command.js | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap b/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap index 2fb6a9aaa0..ebfd33cba4 100644 --- a/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap +++ b/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap @@ -173,7 +173,7 @@ class TestDefaultSuite(): self.driver.quit(); def wait_for_window(timeout = 2): - self.driver.sleep(timeout) + time.sleep(round(timeout / 1000)) wh_now = self.driver.window_handles wh_then = self.vars[\\"window_handles\\"] if len(wh_now) > len(wh_then): @@ -214,7 +214,7 @@ class TestDefaultSuite(): self.driver.quit(); def wait_for_window(timeout = 2): - self.driver.sleep(timeout) + time.sleep(round(timeout / 1000)) wh_now = self.driver.window_handles wh_then = self.vars[\\"window_handles\\"] if len(wh_now) > len(wh_then): @@ -329,7 +329,7 @@ class TestSelectwindow(): self.driver.quit(); def wait_for_window(timeout = 2): - self.driver.sleep(timeout) + time.sleep(round(timeout / 1000)) wh_now = self.driver.window_handles wh_then = self.vars[\\"window_handles\\"] if len(wh_now) > len(wh_then): diff --git a/packages/code-export-python-pytest/src/command.js b/packages/code-export-python-pytest/src/command.js index e0d44c54f1..a7caf57eee 100644 --- a/packages/code-export-python-pytest/src/command.js +++ b/packages/code-export-python-pytest/src/command.js @@ -149,7 +149,7 @@ function emitWaitForWindow() { return `def ${name}(timeout = 2):` } const commands = [ - { level: 0, statement: 'self.driver.sleep(timeout)' }, + { level: 0, statement: 'time.sleep(round(timeout / 1000))' }, { level: 0, statement: 'wh_now = self.driver.window_handles' }, { level: 0, From 2c7d6479bf6beffb0f67930226a707212c8856b9 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Thu, 13 Jun 2019 14:22:26 +0300 Subject: [PATCH 45/99] Updated `wait_for_window` to pop the first value out of its return set --- .../__test__/src/__snapshots__/index.spec.js.snap | 6 +++--- packages/code-export-python-pytest/src/command.js | 5 ++++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap b/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap index ebfd33cba4..5178984ae0 100644 --- a/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap +++ b/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap @@ -177,7 +177,7 @@ class TestDefaultSuite(): wh_now = self.driver.window_handles wh_then = self.vars[\\"window_handles\\"] if len(wh_now) > len(wh_then): - return set(wh_now).difference(set(wh_then)) + return set(wh_now).difference(set(wh_then)).pop() def selectwindow(self): self.driver.get(\\"http://the-internet.herokuapp.com/windows\\") @@ -218,7 +218,7 @@ class TestDefaultSuite(): wh_now = self.driver.window_handles wh_then = self.vars[\\"window_handles\\"] if len(wh_now) > len(wh_then): - return set(wh_now).difference(set(wh_then)) + return set(wh_now).difference(set(wh_then)).pop() def selectwindow(self): self.driver.get(\\"http://the-internet.herokuapp.com/windows\\") @@ -333,7 +333,7 @@ class TestSelectwindow(): wh_now = self.driver.window_handles wh_then = self.vars[\\"window_handles\\"] if len(wh_now) > len(wh_then): - return set(wh_now).difference(set(wh_then)) + return set(wh_now).difference(set(wh_then)).pop() def test_selectwindow(self): self.driver.get(\\"http://the-internet.herokuapp.com/\\") diff --git a/packages/code-export-python-pytest/src/command.js b/packages/code-export-python-pytest/src/command.js index a7caf57eee..64cb5f9074 100644 --- a/packages/code-export-python-pytest/src/command.js +++ b/packages/code-export-python-pytest/src/command.js @@ -156,7 +156,10 @@ function emitWaitForWindow() { statement: 'wh_then = self.vars["window_handles"]', }, { level: 0, statement: 'if len(wh_now) > len(wh_then):' }, - { level: 1, statement: 'return set(wh_now).difference(set(wh_then))' }, + { + level: 1, + statement: 'return set(wh_now).difference(set(wh_then)).pop()', + }, ] return Promise.resolve({ name: 'wait_for_window', From 2d0de6c06f9dbeb4f3092e0c59e613b21014f40e Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Thu, 13 Jun 2019 14:32:55 +0300 Subject: [PATCH 46/99] Added `self` to the `wait_for_window` args, and added string conversion to `storeJson` --- .../__test__/src/__snapshots__/index.spec.js.snap | 6 +++--- .../code-export-python-pytest/__test__/src/command.spec.js | 2 +- packages/code-export-python-pytest/src/command.js | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap b/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap index 5178984ae0..f8d548a3bc 100644 --- a/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap +++ b/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap @@ -172,7 +172,7 @@ class TestDefaultSuite(): def teardown_method(self, method): self.driver.quit(); - def wait_for_window(timeout = 2): + def wait_for_window(self, timeout = 2): time.sleep(round(timeout / 1000)) wh_now = self.driver.window_handles wh_then = self.vars[\\"window_handles\\"] @@ -213,7 +213,7 @@ class TestDefaultSuite(): def teardown_method(self, method): self.driver.quit(); - def wait_for_window(timeout = 2): + def wait_for_window(self, timeout = 2): time.sleep(round(timeout / 1000)) wh_now = self.driver.window_handles wh_then = self.vars[\\"window_handles\\"] @@ -328,7 +328,7 @@ class TestSelectwindow(): def teardown_method(self, method): self.driver.quit(); - def wait_for_window(timeout = 2): + def wait_for_window(self, timeout = 2): time.sleep(round(timeout / 1000)) wh_now = self.driver.window_handles wh_then = self.vars[\\"window_handles\\"] diff --git a/packages/code-export-python-pytest/__test__/src/command.spec.js b/packages/code-export-python-pytest/__test__/src/command.spec.js index 05170dd899..e78ff7cc9b 100644 --- a/packages/code-export-python-pytest/__test__/src/command.spec.js +++ b/packages/code-export-python-pytest/__test__/src/command.spec.js @@ -727,7 +727,7 @@ describe('command code emitter', () => { value: 'myVar', } return expect(prettify(command)).resolves.toBe( - `self.vars["myVar"] = json.loads([{"a":0}])` + `self.vars["myVar"] = json.loads('[{"a":0}]')` ) }) it('should emit `store title` command', () => { diff --git a/packages/code-export-python-pytest/src/command.js b/packages/code-export-python-pytest/src/command.js index 64cb5f9074..541ebb2670 100644 --- a/packages/code-export-python-pytest/src/command.js +++ b/packages/code-export-python-pytest/src/command.js @@ -146,7 +146,7 @@ function variableSetter(varName, value) { function emitWaitForWindow() { const generateMethodDeclaration = name => { - return `def ${name}(timeout = 2):` + return `def ${name}(self, timeout = 2):` } const commands = [ { level: 0, statement: 'time.sleep(round(timeout / 1000))' }, @@ -644,7 +644,7 @@ async function emitStoreAttribute(locator, varName) { } async function emitStoreJson(json, varName) { - return Promise.resolve(variableSetter(varName, `json.loads(${json})`)) + return Promise.resolve(variableSetter(varName, `json.loads('${json}')`)) } async function emitStoreText(locator, varName) { From a9f64b0ffb933034bffbf90b5dcaa724d33aca6c Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Sun, 16 Jun 2019 12:06:49 +0300 Subject: [PATCH 47/99] Updated the runner to the latest version of selenium-webdriver --- packages/selenium-side-runner/package.json | 2 +- packages/selenium-side-runner/yarn.lock | 75 +++++++++------------- 2 files changed, 33 insertions(+), 44 deletions(-) diff --git a/packages/selenium-side-runner/package.json b/packages/selenium-side-runner/package.json index 3da80a77d1..e794c40ed3 100644 --- a/packages/selenium-side-runner/package.json +++ b/packages/selenium-side-runner/package.json @@ -37,7 +37,7 @@ "js-beautify": "^1.7.5", "js-yaml": "^3.13.1", "rimraf": "^2.6.2", - "selenium-webdriver": "4.0.0-alpha.1", + "selenium-webdriver": "4.0.0-alpha.2", "selianize": "^3.8.0", "semver": "^5.5.1", "winston": "^2.4.0" diff --git a/packages/selenium-side-runner/yarn.lock b/packages/selenium-side-runner/yarn.lock index 13905caece..705ec96575 100644 --- a/packages/selenium-side-runner/yarn.lock +++ b/packages/selenium-side-runner/yarn.lock @@ -1728,11 +1728,6 @@ core-js@^2.4.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" integrity sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw== -core-js@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.3.0.tgz#fab83fbb0b2d8dc85fa636c4b9d34c75420c6d65" - integrity sha1-+rg/uwstjchfpjbEudNMdUIMbWU= - core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -2076,11 +2071,6 @@ es6-promise@^4.0.3: resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.4.tgz#dc4221c2b16518760bd8c39a52d8f356fc00ed29" integrity sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ== -es6-promise@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.0.2.tgz#010d5858423a5f118979665f46486a95c6ee2bb6" - integrity sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y= - es6-promisify@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" @@ -3785,16 +3775,15 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" -jszip@^3.1.3: - version "3.1.5" - resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.1.5.tgz#e3c2a6c6d706ac6e603314036d43cd40beefdf37" - integrity sha512-5W8NUaFRFRqTOL7ZDDrx5qWHJyBXy6velVudIzQUSoqAAYqzSh2Z7/m0Rf1QbmQJccegD0r+YZxBjzqoBiEeJQ== +jszip@^3.1.5: + version "3.2.1" + resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.2.1.tgz#c5d32df7274042282b157efb16e522b43435e01a" + integrity sha512-iCMBbo4eE5rb1VCpm5qXOAaUiRKRUKiItn8ah2YQQx9qymmSAY98eyQfioChEYcVQLh0zxJ3wS4A0mh90AVPvw== dependencies: - core-js "~2.3.0" - es6-promise "~3.0.2" - lie "~3.1.0" + lie "~3.3.0" pako "~1.0.2" - readable-stream "~2.0.6" + readable-stream "~2.3.6" + set-immediate-shim "~1.0.1" kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" @@ -3910,10 +3899,10 @@ libnpx@^10.2.0: y18n "^4.0.0" yargs "^11.0.0" -lie@~3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lie/-/lie-3.1.1.tgz#9a436b2cc7746ca59de7a41fa469b3efb76bd87e" - integrity sha1-mkNrLMd0bKWd56QfpGmz77dr2H4= +lie@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" + integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== dependencies: immediate "~3.0.5" @@ -5475,7 +5464,7 @@ read@1, read@~1.0.1, read@~1.0.7: dependencies: mute-stream "~0.0.4" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.6: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== @@ -5511,18 +5500,6 @@ readable-stream@~1.1.10: isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" - integrity sha1-j5A0HmilPMySh4jaz80Rs265t44= - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - string_decoder "~0.10.x" - util-deprecate "~1.0.1" - readdir-scoped-modules@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747" @@ -5818,6 +5795,13 @@ rimraf@2, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@~2. dependencies: glob "^7.0.5" +rimraf@^2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + rsvp@^4.8.4: version "4.8.4" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.4.tgz#b50e6b34583f3dd89329a2f23a8a2be072845911" @@ -5867,15 +5851,15 @@ sax@>=0.6.0, sax@^1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -selenium-webdriver@4.0.0-alpha.1: - version "4.0.0-alpha.1" - resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.0.0-alpha.1.tgz#cc93415e21d2dc1dfd85dfc5f6b55f3ac53933b1" - integrity sha512-z88rdjHAv3jmTZ7KSGUkTvo4rGzcDGMq0oXWHNIDK96Gs31JKVdu9+FMtT4KBrVoibg8dUicJDok6GnqqttO5Q== +selenium-webdriver@4.0.0-alpha.2: + version "4.0.0-alpha.2" + resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.0.0-alpha.2.tgz#8c44b0c337880e8cd7246ea338a0e363301459cc" + integrity sha512-pnebWYNnvsIWo5Rm64PFlrwfJFmqV26dyQ6Zoj4CXAsW9McvjQ/h1DOTHMxyoQfiT/Wqsm8Mij2usgmy6imk2Q== dependencies: - jszip "^3.1.3" - rimraf "^2.5.4" + jszip "^3.1.5" + rimraf "^2.6.3" tmp "0.0.30" - xml2js "^0.4.17" + xml2js "^0.4.19" semver-diff@^2.0.0: version "2.1.0" @@ -5919,6 +5903,11 @@ set-blocking@^2.0.0, set-blocking@~2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= +set-immediate-shim@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= + set-value@^0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" @@ -6911,7 +6900,7 @@ xml-name-validator@^3.0.0: resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== -xml2js@^0.4.17: +xml2js@^0.4.19: version "0.4.19" resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" integrity sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q== From 3e77935db4b107f8e870919d61f3a374e5ce43b5 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Sun, 16 Jun 2019 14:02:19 +0300 Subject: [PATCH 48/99] Updated the supported Node version info in the readme for the runner --- packages/selenium-side-runner/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/selenium-side-runner/README.md b/packages/selenium-side-runner/README.md index 7576b5c6d2..6502e9a0e1 100644 --- a/packages/selenium-side-runner/README.md +++ b/packages/selenium-side-runner/README.md @@ -3,7 +3,9 @@ Runs exported Selenium IDE tests in command line ## Installation Node.js is required to use `selenium-side-runner`. -The project guarantees support for the [active LTS major version](https://github.com/nodejs/Release) (e.g. [8](https://nodejs.org/en/download/) & [10](https://nodejs.org/en/download/current/)). +The project guarantees support for the [active LTS major version](https://github.com/nodejs/Release) (e.g. [10](https://nodejs.org/en/download/) & [12](https://nodejs.org/en/download/current/)). + +__NOTE: The minimum supported version of Node is now 10.15.0 LTS__ ```yarn global add selenium-side-runner``` or From a8e6a14c9c9f492cff558e59acee667a55c4a9b0 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Sun, 16 Jun 2019 14:02:25 +0300 Subject: [PATCH 49/99] Updated the runner to the latest version of selenium-webdriver --- packages/selenium-side-runner/package.json | 2 +- packages/selenium-side-runner/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/selenium-side-runner/package.json b/packages/selenium-side-runner/package.json index e794c40ed3..3965e5b069 100644 --- a/packages/selenium-side-runner/package.json +++ b/packages/selenium-side-runner/package.json @@ -37,7 +37,7 @@ "js-beautify": "^1.7.5", "js-yaml": "^3.13.1", "rimraf": "^2.6.2", - "selenium-webdriver": "4.0.0-alpha.2", + "selenium-webdriver": "4.0.0-alpha.3", "selianize": "^3.8.0", "semver": "^5.5.1", "winston": "^2.4.0" diff --git a/packages/selenium-side-runner/yarn.lock b/packages/selenium-side-runner/yarn.lock index 705ec96575..0e83ff32db 100644 --- a/packages/selenium-side-runner/yarn.lock +++ b/packages/selenium-side-runner/yarn.lock @@ -5851,10 +5851,10 @@ sax@>=0.6.0, sax@^1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -selenium-webdriver@4.0.0-alpha.2: - version "4.0.0-alpha.2" - resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.0.0-alpha.2.tgz#8c44b0c337880e8cd7246ea338a0e363301459cc" - integrity sha512-pnebWYNnvsIWo5Rm64PFlrwfJFmqV26dyQ6Zoj4CXAsW9McvjQ/h1DOTHMxyoQfiT/Wqsm8Mij2usgmy6imk2Q== +selenium-webdriver@4.0.0-alpha.3: + version "4.0.0-alpha.3" + resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.0.0-alpha.3.tgz#fb974f29696a6801ecaf203e38a65c3dbe7e363a" + integrity sha512-78a8bbvVtl3asv5JAiBXvK4KQ+GmXBCMO0DU1ZMbdO9EAb+ydPA53CI4ZA+I8muSLSVgNhRAnsndNWZLIQN2LA== dependencies: jszip "^3.1.5" rimraf "^2.6.3" From 842d6fc7c3184d5d985252629f8105fd9f252625 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Sun, 16 Jun 2019 14:04:18 +0300 Subject: [PATCH 50/99] changelog.md -> CHANGELOG.md --- changelog.md => CHANGELOG.md | 0 gh-release.js | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename changelog.md => CHANGELOG.md (100%) diff --git a/changelog.md b/CHANGELOG.md similarity index 100% rename from changelog.md rename to CHANGELOG.md diff --git a/gh-release.js b/gh-release.js index 165569149c..6ae6142f23 100644 --- a/gh-release.js +++ b/gh-release.js @@ -18,7 +18,7 @@ if (!token) // fetch changelog details const changelog = exec( - `sed '1,/${tag}/d;/## v/q' ./changelog.md | sed '/^ *$/q'`, + `sed '1,/${tag}/d;/## v/q' ./CHANGELOG.md | sed '/^ *$/q'`, { encoding: 'utf8', } From 8cd1fafe4e648aef3d1587e9185195fe613993bf Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Sun, 16 Jun 2019 14:23:55 +0300 Subject: [PATCH 51/99] Updated changelog --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e42f195031..f6eb5cfbe3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## v3.9.0 +- Code export for Python (e.g., pytest, Python 3) +- Fix for frames to support `relative=parent` in the runner +- Fix for frames to support `relative=top` in IDE playback +- Added timestamps to log entries (PR #688) + ## v3.8.1 - Code export fixes for commands that open and switch to new windows - Added a suffix of "Test" to class and filenames in Java code export From a55c89c28c3571c3ddcf72a16c8093ef9bdfbd8b Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Sun, 16 Jun 2019 15:49:01 +0300 Subject: [PATCH 52/99] v3.9.0 --- lerna.json | 2 +- packages/code-export-java-junit/package.json | 4 ++-- packages/code-export-python-pytest/package.json | 4 ++-- packages/code-export-utils/package.json | 2 +- packages/code-export/package.json | 6 +++--- packages/selenium-ide/package.json | 4 ++-- packages/selenium-ide/src/manifest.json | 4 ++-- packages/selenium-side-runner/package.json | 2 +- 8 files changed, 14 insertions(+), 14 deletions(-) diff --git a/lerna.json b/lerna.json index 469add335a..76c6985c9e 100644 --- a/lerna.json +++ b/lerna.json @@ -3,6 +3,6 @@ "packages": [ "packages/*" ], - "version": "3.8.1", + "version": "3.9.0", "npmClient": "yarn" } diff --git a/packages/code-export-java-junit/package.json b/packages/code-export-java-junit/package.json index a35c66f791..307c1834c7 100644 --- a/packages/code-export-java-junit/package.json +++ b/packages/code-export-java-junit/package.json @@ -1,6 +1,6 @@ { "name": "code-export-java-junit", - "version": "3.8.1", + "version": "3.9.0", "description": "Export Selenium IDE project contents to Java JUnit", "repository": "https://github.com/SeleniumHQ/selenium-ide", "keywords": [ @@ -21,6 +21,6 @@ "@babel/preset-env": "^7.4.5" }, "dependencies": { - "code-export-utils": "^3.8.1" + "code-export-utils": "^3.9.0" } } diff --git a/packages/code-export-python-pytest/package.json b/packages/code-export-python-pytest/package.json index a62f00e230..09a45a8f9c 100644 --- a/packages/code-export-python-pytest/package.json +++ b/packages/code-export-python-pytest/package.json @@ -1,6 +1,6 @@ { "name": "code-export-python-pytest", - "version": "3.8.1", + "version": "3.9.0", "description": "Export Selenium IDE project contents to Python pytest", "repository": "https://github.com/SeleniumHQ/selenium-ide", "keywords": [ @@ -21,6 +21,6 @@ "@babel/preset-env": "^7.4.5" }, "dependencies": { - "code-export-utils": "^3.8.1" + "code-export-utils": "^3.9.0" } } diff --git a/packages/code-export-utils/package.json b/packages/code-export-utils/package.json index a4c486db99..14b52f0715 100644 --- a/packages/code-export-utils/package.json +++ b/packages/code-export-utils/package.json @@ -1,6 +1,6 @@ { "name": "code-export-utils", - "version": "3.8.1", + "version": "3.9.0", "description": "Utils for Selenium IDE code export", "repository": "https://github.com/SeleniumHQ/selenium-ide", "keywords": [ diff --git a/packages/code-export/package.json b/packages/code-export/package.json index d4acf311e4..a908ae8946 100644 --- a/packages/code-export/package.json +++ b/packages/code-export/package.json @@ -1,6 +1,6 @@ { "name": "code-export", - "version": "3.8.1", + "version": "3.9.0", "description": "Selenium IDE code export", "repository": "https://github.com/SeleniumHQ/selenium-ide", "keywords": [ @@ -20,7 +20,7 @@ "@babel/preset-env": "^7.4.5" }, "dependencies": { - "code-export-java-junit": "^3.8.1", - "code-export-python-pytest": "^3.8.1" + "code-export-java-junit": "^3.9.0", + "code-export-python-pytest": "^3.9.0" } } diff --git a/packages/selenium-ide/package.json b/packages/selenium-ide/package.json index b6975966c7..90fca76527 100644 --- a/packages/selenium-ide/package.json +++ b/packages/selenium-ide/package.json @@ -1,6 +1,6 @@ { "name": "selenium-ide-extension", - "version": "3.8.1", + "version": "3.9.0", "description": "An integrated development environment for Selenium scripts", "license": "Apache-2.0", "private": true, @@ -49,7 +49,7 @@ "@medv/finder": "^1.1.1", "browser-webdriver": "^3.6.0", "classnames": "^2.2.5", - "code-export": "^3.8.1", + "code-export": "^3.9.0", "fuse.js": "^3.3.0", "google-closure-library": "^20170521.0.0", "js-beautify": "^1.7.5", diff --git a/packages/selenium-ide/src/manifest.json b/packages/selenium-ide/src/manifest.json index d44847a6ea..907d60800f 100644 --- a/packages/selenium-ide/src/manifest.json +++ b/packages/selenium-ide/src/manifest.json @@ -2,8 +2,8 @@ "description": "Selenium Record and Playback tool for ease of getting acquainted with Selenium WebDriver.", "manifest_version": 2, "name": "Selenium IDE", - "version": "3.8.1", - "version_name": "3.8.1", + "version": "3.9.0", + "version_name": "3.9.0", "homepage_url": "https://github.com/SeleniumHQ/selenium-ide", "icons": { "16": "icons/icon16.png", diff --git a/packages/selenium-side-runner/package.json b/packages/selenium-side-runner/package.json index 3965e5b069..2fc188783a 100644 --- a/packages/selenium-side-runner/package.json +++ b/packages/selenium-side-runner/package.json @@ -1,6 +1,6 @@ { "name": "selenium-side-runner", - "version": "3.8.0", + "version": "3.9.0", "description": "Run Selenium IDE projects in cli", "repository": "https://github.com/SeleniumHQ/selenium-ide", "scripts": { From 58426385a83be1050a53ac4f42a279be7b038314 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Sun, 16 Jun 2019 16:24:29 +0300 Subject: [PATCH 53/99] Updated the travis config to drop Node 8 and add Node 12 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index fff82c634a..ce0f52a50d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,8 +6,8 @@ cache: directories: - .peru node_js: + - "12" - "10" - - "8" services: - docker before_install: From bcea77166a4a105dedb2057aa748fb95fb5dc540 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Tue, 18 Jun 2019 13:27:45 +0300 Subject: [PATCH 54/99] Color match the timestamp to the rest of the line text --- packages/selenium-ide/src/neo/components/LogMessage/style.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/selenium-ide/src/neo/components/LogMessage/style.css b/packages/selenium-ide/src/neo/components/LogMessage/style.css index b606547671..ca6646f937 100644 --- a/packages/selenium-ide/src/neo/components/LogMessage/style.css +++ b/packages/selenium-ide/src/neo/components/LogMessage/style.css @@ -9,7 +9,7 @@ .log .timestamp { font-weight: normal; - color: #000; + color: #5b5b5b; } .log.notice { From a895d11b2c4de0f41030a1150d377b35dc90fc8d Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Tue, 18 Jun 2019 13:33:32 +0300 Subject: [PATCH 55/99] Moved the SIDE files used to e2e test code export languages into code-export-utils/__test__/test-files --- .../__test__/src/index.spec.js | 13 +- .../__test__/src/index.spec.js | 13 +- .../test-files/control-flow-suite.side | 1289 ----------------- .../test-files/nested-select-window-v2.side | 71 - .../test-files/nested-select-window.side | 71 - .../__test__/test-files/select-window.side | 103 -- .../__test__/test-files/single-suite.side | 159 -- .../__test__/test-files/single-test.side | 88 -- .../__test__/test-files/test-case-reuse.side | 133 -- .../test-files/control-flow-suite.side | 0 .../test-files/nested-select-window-v2.side | 0 .../test-files/nested-select-window.side | 0 .../__test__/test-files/select-window.side | 0 .../__test__/test-files/single-suite.side | 0 .../__test__/test-files/single-test.side | 0 .../__test__/test-files/test-case-reuse.side | 0 16 files changed, 24 insertions(+), 1916 deletions(-) delete mode 100644 packages/code-export-python-pytest/__test__/test-files/control-flow-suite.side delete mode 100644 packages/code-export-python-pytest/__test__/test-files/nested-select-window-v2.side delete mode 100644 packages/code-export-python-pytest/__test__/test-files/nested-select-window.side delete mode 100644 packages/code-export-python-pytest/__test__/test-files/select-window.side delete mode 100644 packages/code-export-python-pytest/__test__/test-files/single-suite.side delete mode 100644 packages/code-export-python-pytest/__test__/test-files/single-test.side delete mode 100644 packages/code-export-python-pytest/__test__/test-files/test-case-reuse.side rename packages/{code-export-java-junit => code-export-utils}/__test__/test-files/control-flow-suite.side (100%) rename packages/{code-export-java-junit => code-export-utils}/__test__/test-files/nested-select-window-v2.side (100%) rename packages/{code-export-java-junit => code-export-utils}/__test__/test-files/nested-select-window.side (100%) rename packages/{code-export-java-junit => code-export-utils}/__test__/test-files/select-window.side (100%) rename packages/{code-export-java-junit => code-export-utils}/__test__/test-files/single-suite.side (100%) rename packages/{code-export-java-junit => code-export-utils}/__test__/test-files/single-test.side (100%) rename packages/{code-export-java-junit => code-export-utils}/__test__/test-files/test-case-reuse.side (100%) diff --git a/packages/code-export-java-junit/__test__/src/index.spec.js b/packages/code-export-java-junit/__test__/src/index.spec.js index 6b7b92b731..715722e3ce 100644 --- a/packages/code-export-java-junit/__test__/src/index.spec.js +++ b/packages/code-export-java-junit/__test__/src/index.spec.js @@ -22,7 +22,18 @@ import { normalizeTestsInSuite } from '../../../selenium-ide/src/neo/IO/normaliz function readFile(filename) { return JSON.parse( - fs.readFileSync(path.join(__dirname, '..', 'test-files', filename)) + fs.readFileSync( + path.join( + __dirname, + '..', + '..', + '..', + 'code-export-utils', + '__test__', + 'test-files', + filename + ) + ) ) } diff --git a/packages/code-export-python-pytest/__test__/src/index.spec.js b/packages/code-export-python-pytest/__test__/src/index.spec.js index f9dfe90ea4..6f0d40c7c0 100644 --- a/packages/code-export-python-pytest/__test__/src/index.spec.js +++ b/packages/code-export-python-pytest/__test__/src/index.spec.js @@ -22,7 +22,18 @@ import { normalizeTestsInSuite } from '../../../selenium-ide/src/neo/IO/normaliz function readFile(filename) { return JSON.parse( - fs.readFileSync(path.join(__dirname, '..', 'test-files', filename)) + fs.readFileSync( + path.join( + __dirname, + '..', + '..', + '..', + 'code-export-utils', + '__test__', + 'test-files', + filename + ) + ) ) } diff --git a/packages/code-export-python-pytest/__test__/test-files/control-flow-suite.side b/packages/code-export-python-pytest/__test__/test-files/control-flow-suite.side deleted file mode 100644 index 022797a99b..0000000000 --- a/packages/code-export-python-pytest/__test__/test-files/control-flow-suite.side +++ /dev/null @@ -1,1289 +0,0 @@ -{ - "id": "df3db165-b029-41fe-b9a4-bfc83509a00b", - "version": "2.0", - "name": "control flow", - "url": "http://the-internet.herokuapp.com", - "tests": [{ - "id": "229b94d0-5a3d-49a2-a55e-a4e4a6449039", - "name": "send KEY_ENTER", - "commands": [{ - "id": "40d9dead-1078-4055-bfdb-9b3c1bdafd06", - "comment": "", - "command": "open", - "target": "https://en.wikipedia.org/wiki/Main_Page", - "targets": [], - "value": "" - }, { - "id": "546591fe-8bed-48fe-b740-e268a2035a23", - "comment": "", - "command": "type", - "target": "id=searchInput", - "targets": [], - "value": "selenium" - }, { - "id": "6ec8d1ef-aa48-46af-87e6-cf2d1a7aad4d", - "comment": "", - "command": "sendKeys", - "target": "id=searchInput", - "targets": [], - "value": "${KEY_ENTER}" - }] - }, { - "id": "01704d06-9abf-4776-8e1d-4d32e4e39965", - "name": "control flow if", - "commands": [{ - "id": "982c62ac-52d5-4089-8761-9322562d0695", - "comment": "", - "command": "executeScript", - "target": "return \"a\"", - "targets": [], - "value": "myVar" - }, { - "id": "665e9694-ff34-4ef0-b779-e20b8f382a98", - "comment": "", - "command": "if", - "target": "${myVar} === \"a\"", - "targets": [], - "value": "" - }, { - "id": "fb98e2df-b9b9-4018-a6f9-3ccda275274f", - "comment": "", - "command": "executeScript", - "target": "return \"a\"", - "targets": [], - "value": "output" - }, { - "id": "685914c9-05db-49f9-a9cc-843a3c41d625", - "comment": "", - "command": "elseIf", - "target": "${myVar} === \"b\"", - "targets": [], - "value": "" - }, { - "id": "1ec5562f-53f2-440e-ba86-b16a81fbfdf9", - "comment": "", - "command": "executeScript", - "target": "return \"b\"", - "targets": [], - "value": "output" - }, { - "id": "7fd7af73-8c76-40c1-964c-446d25eced45", - "comment": "", - "command": "else", - "target": "", - "targets": [], - "value": "" - }, { - "id": "380fdd77-5e7f-4e99-8e77-0d71bd80e0bf", - "comment": "", - "command": "executeScript", - "target": "return \"c\"", - "targets": [], - "value": "output" - }, { - "id": "49dc3da7-f1e4-4dee-a88c-7d2866a5e60c", - "comment": "", - "command": "end", - "target": "", - "targets": [], - "value": "" - }, { - "id": "b9fd4097-c21f-4ba9-92ca-5003aa12691c", - "comment": "", - "command": "assert", - "target": "output", - "targets": [], - "value": "a" - }] - }, { - "id": "564aa06a-6e04-491d-9134-bb9a03dfc290", - "name": "control flow else if", - "commands": [{ - "id": "a9c8ad31-db50-4b72-b9e6-6867c28202c2", - "comment": "", - "command": "executeScript", - "target": "return \"b\"", - "targets": [], - "value": "myVar" - }, { - "id": "b39b7bc5-5c03-42e1-a3e9-a61347e2e613", - "comment": "", - "command": "if", - "target": "${myVar} === \"a\"", - "targets": [], - "value": "" - }, { - "id": "0934ae73-17c5-4352-81e3-02594dc9790a", - "comment": "", - "command": "executeScript", - "target": "return \"a\"", - "targets": [], - "value": "output" - }, { - "id": "c3cf0ec4-dc66-4b2f-be49-fc070324b0b6", - "comment": "", - "command": "elseIf", - "target": "${myVar} === \"b\"", - "targets": [], - "value": "" - }, { - "id": "ad28503a-31d8-42ec-a24f-e553f5acdd28", - "comment": "", - "command": "executeScript", - "target": "return \"b\"", - "targets": [], - "value": "output" - }, { - "id": "367466ca-dd6c-493a-afa7-05ad5a35ce73", - "comment": "", - "command": "else", - "target": "", - "targets": [], - "value": "" - }, { - "id": "671901de-05bb-4746-88a3-ec51d1b9cdec", - "comment": "", - "command": "executeScript", - "target": "return \"c\"", - "targets": [], - "value": "output" - }, { - "id": "0952e6ea-2f45-4993-a203-b18f181f7ee5", - "comment": "", - "command": "end", - "target": "", - "targets": [], - "value": "" - }, { - "id": "c3555723-c312-4fc9-a39f-481123687694", - "comment": "", - "command": "assert", - "target": "output", - "targets": [], - "value": "b" - }] - }, { - "id": "f94989d9-4cd4-480a-8a68-f07fb071800c", - "name": "control flow else", - "commands": [{ - "id": "8808b613-0ea4-469f-80d7-4c3e623f131b", - "comment": "", - "command": "executeScript", - "target": "return \"c\"", - "targets": [], - "value": "myVar" - }, { - "id": "b501ef34-f90e-4bf4-aa63-2fc9ad4d2a07", - "comment": "", - "command": "if", - "target": "${myVar} === \"a\"", - "targets": [], - "value": "" - }, { - "id": "20ee3afe-3aa2-494e-af8f-04e7015d3d62", - "comment": "", - "command": "executeScript", - "target": "return \"a\"", - "targets": [], - "value": "output" - }, { - "id": "3cca1a06-ba99-405e-bd6d-ac80a7005c42", - "comment": "", - "command": "elseIf", - "target": "${myVar} === \"b\"", - "targets": [], - "value": "" - }, { - "id": "00f7cf49-009b-42f6-8d65-d6091518adcd", - "comment": "", - "command": "executeScript", - "target": "return \"b\"", - "targets": [], - "value": "output" - }, { - "id": "1918b3ef-0529-4ce8-b40e-654adaf3b9ea", - "comment": "", - "command": "else", - "target": "", - "targets": [], - "value": "" - }, { - "id": "0e28acb2-939f-4fba-af2d-9e117c8fe970", - "comment": "", - "command": "executeScript", - "target": "return \"c\"", - "targets": [], - "value": "output" - }, { - "id": "862d15cc-1a04-43b2-8000-51db37c243b8", - "comment": "", - "command": "end", - "target": "", - "targets": [], - "value": "" - }, { - "id": "70f32453-923f-4011-b0cb-a7b97e66b887", - "comment": "", - "command": "assert", - "target": "output", - "targets": [], - "value": "c" - }] - }, { - "id": "958bcde1-54ef-4d1f-bd4e-f1e973af63fc", - "name": "control flow do", - "commands": [{ - "id": "b3f11898-e966-46bc-8c3f-f569ec8fe922", - "comment": "", - "command": "executeScript", - "target": "return 1", - "targets": [], - "value": "check" - }, { - "id": "af70f421-e2cb-45b3-beb9-71bc122c633c", - "comment": "", - "command": "do", - "target": "", - "targets": [], - "value": "" - }, { - "id": "b9e61769-a1f7-4188-8a28-caa7b67e2ed4", - "comment": "", - "command": "executeScript", - "target": "return ${check} + 1", - "targets": [], - "value": "check" - }, { - "id": "8803443e-69c2-449c-aec5-ecf6271a7306", - "comment": "", - "command": "repeatIf", - "target": "${check} < 3", - "targets": [], - "value": "" - }, { - "id": "2e38b837-9a8d-44d4-a085-14983b28a2eb", - "comment": "", - "command": "assert", - "target": "check", - "targets": [], - "value": "3" - }] - }, { - "id": "99fca157-b6bf-4076-95bc-2e7b449178d6", - "name": "control flow times", - "commands": [{ - "id": "4271037f-797f-4008-9f3e-a3eec005121f", - "comment": "", - "command": "executeScript", - "target": "return 1", - "targets": [], - "value": "check" - }, { - "id": "6f8efbe4-4e90-462c-a6d3-dc32ec52ea26", - "comment": "", - "command": "times", - "target": "2", - "targets": [], - "value": "" - }, { - "id": "99dd996f-fc5b-4ed6-966d-93f3df60d88b", - "comment": "", - "command": "executeScript", - "target": "return ${check} + 1", - "targets": [], - "value": "check" - }, { - "id": "8d0ac0a8-da4e-4b5c-a877-3aa16658a0bf", - "comment": "", - "command": "end", - "target": "", - "targets": [], - "value": "" - }, { - "id": "278f6149-ac75-4970-ac4f-e517a664ef3a", - "comment": "", - "command": "assert", - "target": "check", - "targets": [], - "value": "3" - }] - }, { - "id": "2f113e0b-224d-4651-af16-4dac9d5d623a", - "name": "control flow while", - "commands": [{ - "id": "84bb2c54-805e-47dc-b529-1934a7340a07", - "comment": "", - "command": "executeScript", - "target": "return 1", - "targets": [], - "value": "check" - }, { - "id": "b3ae743f-0342-4b83-bfa9-ade7b859aa51", - "comment": "", - "command": "while", - "target": "${check} < 3", - "targets": [], - "value": "" - }, { - "id": "bd542456-be99-40cb-a9be-e79223034842", - "comment": "", - "command": "executeScript", - "target": "return ${check} + 1", - "targets": [], - "value": "check" - }, { - "id": "7db2f99b-a413-4e3f-ac91-7297c6c0d8f8", - "comment": "", - "command": "end", - "target": "", - "targets": [], - "value": "" - }, { - "id": "1258d2b9-ec34-400f-a572-c46852ecf686", - "comment": "", - "command": "assert", - "target": "check", - "targets": [], - "value": "3" - }] - }, { - "id": "895ccb2c-8bcb-4c8c-a94a-1999bc0c8d8f", - "name": "execute script", - "commands": [{ - "id": "5966dc26-0376-4be0-86e9-d6514da009f0", - "comment": "", - "command": "executeScript", - "target": "return true", - "targets": [], - "value": "blah" - }, { - "id": "3ca71f8c-6ff0-4ba3-9db5-f43ef674570b", - "comment": "", - "command": "assert", - "target": "blah", - "targets": [], - "value": "true" - }, { - "id": "1ada3a0b-d68b-4879-afb4-c94719360b1c", - "comment": "", - "command": "executeScript", - "target": "true", - "targets": [], - "value": "" - }, { - "id": "75528f9d-ce6a-4938-bcbf-5ce17245c025", - "comment": "", - "command": "echo", - "target": "${blah}", - "targets": [], - "value": "" - }] - }, { - "id": "129e5fa6-2bb6-48a8-8424-1cfebf02daf7", - "name": "execute script array", - "commands": [{ - "id": "fd44948c-2307-4482-bfb1-08a0cc64a653", - "comment": "", - "command": "executeScript", - "target": "return [1,2,3]", - "targets": [], - "value": "x" - }, { - "id": "78a415fa-17ce-46e6-9d7c-2d21fca42a76", - "comment": "", - "command": "executeScript", - "target": "return ${x}[0] + 1", - "targets": [], - "value": "y" - }, { - "id": "8cf74007-673f-4728-970d-8e93d6b838a2", - "comment": "", - "command": "assert", - "target": "y", - "targets": [], - "value": "2" - }] - }, { - "id": "65bfb926-fde9-4823-811e-0da5d33cc5b0", - "name": "execute script object", - "commands": [{ - "id": "7c9cd403-d0f4-4b17-9a44-b203abddabe2", - "comment": "", - "command": "executeScript", - "target": "return { x: 3 }", - "targets": [], - "value": "x" - }, { - "id": "136c3a6f-33fe-4083-9756-3024b182009c", - "comment": "", - "command": "executeScript", - "target": "return ${x}.x + 2", - "targets": [], - "value": "y" - }, { - "id": "a2234f54-c359-46b3-a750-ecaa25ce87ea", - "comment": "", - "command": "assert", - "target": "y", - "targets": [], - "value": "5" - }] - }, { - "id": "ec2a4212-b9cc-4120-9044-4b7e0bad2d5c", - "name": "execute script primitives", - "commands": [{ - "id": "c3c9a9c3-94ef-46da-bbb6-488babd9e3a2", - "comment": "", - "command": "executeScript", - "target": "return true", - "targets": [], - "value": "bool" - }, { - "id": "40fa3983-4fae-4329-b3bd-4a65b0f46fdc", - "comment": "", - "command": "assert", - "target": "bool", - "targets": [], - "value": "true" - }, { - "id": "fd43a7e2-593e-4012-a79e-2e3c8877afce", - "comment": "", - "command": "executeScript", - "target": "return 3.14", - "targets": [], - "value": "float" - }, { - "id": "92345893-6566-4764-9790-5792b97d459f", - "comment": "", - "command": "assert", - "target": "float", - "targets": [], - "value": "3.14" - }, { - "id": "4d4bf0af-8152-421f-8870-7146b66519d9", - "comment": "", - "command": "executeScript", - "target": "return \"test\"", - "targets": [], - "value": "string" - }, { - "id": "48d1c7a1-4ec3-4d2b-b2ce-22faefa8fe84", - "comment": "", - "command": "assert", - "target": "string", - "targets": [], - "value": "test" - }] - }, { - "id": "4973518e-3e78-41c0-b5b6-75648c183265", - "name": "check", - "commands": [{ - "id": "c527c2a1-6439-4711-a297-6379d4146c4d", - "comment": "", - "command": "open", - "target": "/checkboxes", - "targets": [], - "value": "" - }, { - "id": "4fcaeffc-0a11-40b5-8701-d927633502a7", - "comment": "", - "command": "check", - "target": "css=input", - "targets": [ - ["id=something", "id"], - ["name=something-else", "name"], - ["linkText=number density", "linkText"], - ["xpath=//a[contains(text(),'number density')]", "xpath:link"], - ["css=main .class > p a.link", "css"], - ["xpath=(//a[contains(text(),'number line')])[2]", "xpath:link"], - ["(//a[contains(text(),'number line')])[2]", "xpath:link"], - ["//a[contains(text(),'number density')]", "xpath:link"], - ["//div[@id='mw-content-text']/div/p[2]/a[5]", "xpath:idRelative"], - ["//a[contains(@href, '/wiki/Number_density')]", "xpath:href"], - ["//a[5]", "xpath:position"] - ], - "value": "" - }, { - "id": "1e4dbff7-9999-4f1c-932d-e1efe08180a8", - "comment": "", - "command": "assertChecked", - "target": "css=input", - "targets": [], - "value": "" - }, { - "id": "b1aea9fc-3475-4ad4-a078-7c49eb1d7408", - "comment": "", - "command": "uncheck", - "target": "css=input", - "targets": [], - "value": "" - }, { - "id": "678dd4e5-eb03-4099-83ef-fd9f60fcd83d", - "comment": "", - "command": "assertNotChecked", - "target": "css=input", - "targets": [], - "value": "" - }] - }, { - "id": "a1022ee9-c0b7-44b1-8c98-280771d28a78", - "name": "click", - "commands": [{ - "id": "c90a196e-9d75-4d58-85a4-9c1443f102ce", - "comment": "", - "command": "open", - "target": "/", - "targets": [], - "value": "" - }, { - "id": "0342a182-1a3d-4b0e-aa31-829c480e6021", - "comment": "", - "command": "click", - "target": "linkText=Dropdown", - "targets": [], - "value": "" - }, { - "id": "fd680d67-c174-4a15-9c92-c951eac61597", - "comment": "", - "command": "assertText", - "target": "css=h3", - "targets": [], - "value": "Dropdown List" - }, { - "id": "581c81c9-328e-42a9-9ff2-2c2ffd955c61", - "comment": "", - "command": "open", - "target": "/", - "targets": [], - "value": "" - }, { - "id": "1f6350c0-7727-4ccc-bfcc-030736a2b21d", - "comment": "", - "command": "click", - "target": "link=Dropdown", - "targets": [], - "value": "" - }, { - "id": "7e8083ed-2a76-4566-ba04-21c7957f6a42", - "comment": "", - "command": "assertText", - "target": "css=h3", - "targets": [], - "value": "Dropdown List" - }, { - "id": "70d5b712-b810-4e27-8047-2a8956804228", - "comment": "", - "command": "open", - "target": "/", - "targets": [], - "value": "" - }, { - "id": "41b1d5cf-6ba9-4632-b7d5-50c98cd39b8f", - "comment": "", - "command": "click", - "target": "partialLinkText=ropd", - "targets": [], - "value": "" - }, { - "id": "0fa4778d-19cc-4224-94a7-91a766b6039b", - "comment": "", - "command": "assertText", - "target": "css=h3", - "targets": [], - "value": "Dropdown List" - }] - }, { - "id": "c4b536e2-8061-43a7-b538-548336b550d4", - "name": "click at", - "commands": [{ - "id": "d696fa74-5c6e-49e6-9be9-83e28416db16", - "comment": "", - "command": "open", - "target": "/", - "targets": [], - "value": "" - }, { - "id": "da36b83c-d5f8-4c6d-84fd-6c7d11d73b35", - "comment": "", - "command": "clickAt", - "target": "css=a", - "targets": [], - "value": "" - }] - }, { - "id": "8ab1a8ff-7bf7-45c4-8af2-8fedd2eaefa4", - "name": "comment", - "commands": [{ - "id": "40f32d2f-4c74-4579-81d5-7a8553cf72a9", - "comment": "", - "command": "//commented code", - "target": "", - "targets": [], - "value": "" - }, { - "id": "67369682-3b43-42a2-bca2-c5d70cd32e2f", - "comment": "blah", - "command": "", - "target": "", - "targets": [], - "value": "" - }, { - "id": "c258898c-07ee-4dfb-a3da-5b0edbdb3209", - "comment": "", - "command": "", - "target": "", - "targets": [], - "value": "" - }, { - "id": "c014f0af-5875-44d1-b4d3-f9ecff6b4f77", - "comment": "also blah", - "command": "open", - "target": "/", - "targets": [], - "value": "" - }] - }, { - "id": "8821c552-d179-41ba-9a17-7ba6cba736af", - "name": "frames", - "commands": [{ - "id": "7c45a91f-94a0-4bae-9463-13484d60c810", - "comment": "", - "command": "open", - "target": "/iframe", - "targets": [], - "value": "" - }, { - "id": "c9914464-b6f4-4053-82b8-e4b1763ee744", - "comment": "", - "command": "selectFrame", - "target": "index=0", - "targets": [], - "value": "" - }, { - "id": "e9e9287f-00fe-4caf-ba73-01b2573a6d7c", - "comment": "", - "command": "assertText", - "target": "css=#tinymce", - "targets": [], - "value": "Your content goes here." - }, { - "id": "e3614139-4980-432f-b5d0-3f2bbe6d5323", - "comment": "", - "command": "open", - "target": "/nested_frames", - "targets": [], - "value": "" - }, { - "id": "295b8e2d-682c-475e-ba79-eaa80ad274b4", - "comment": "", - "command": "selectFrame", - "target": "index=1", - "targets": [], - "value": "" - }, { - "id": "d73e2c70-ce5d-4f20-86ef-65a621280556", - "comment": "", - "command": "assertText", - "target": "css=#content", - "targets": [], - "value": "MIDDLE" - }] - }, { - "id": "e4cede35-6b3e-4641-9810-72e7ce2e6bda", - "name": "select", - "commands": [{ - "id": "db008c4d-b7b6-4fa2-964b-ef8b20ae6fdf", - "comment": "", - "command": "open", - "target": "/dropdown", - "targets": [], - "value": "" - }, { - "id": "e8612e65-271a-4d45-b5c8-2aca73d728d5", - "comment": "", - "command": "select", - "target": "id=dropdown", - "targets": [], - "value": "value=1" - }, { - "id": "eabebe84-ad4a-4a5a-a720-ac8cad0cab3e", - "comment": "", - "command": "assertSelectedValue", - "target": "id=dropdown", - "targets": [], - "value": "1" - }, { - "id": "d466a89b-2a1a-42bc-a438-5aa2dff0d238", - "comment": "", - "command": "assertNotSelectedValue", - "target": "id=dropdown", - "targets": [], - "value": "2" - }, { - "id": "6c7142c2-e38a-4ec9-9dd1-919b7f4bdb80", - "comment": "", - "command": "assertSelectedLabel", - "target": "id=dropdown", - "targets": [], - "value": "Option 1" - }, { - "id": "98db5aff-5979-44bd-ae4a-24dbb71e73d2", - "comment": "", - "command": "select", - "target": "id=dropdown", - "targets": [], - "value": "Option 2" - }, { - "id": "1aaefcd3-ccde-4644-9c2b-0ed2472bfae4", - "comment": "", - "command": "assertSelectedValue", - "target": "id=dropdown", - "targets": [], - "value": "2" - }, { - "id": "5151e29d-13bf-4793-939a-2d674da820fa", - "comment": "", - "command": "assertNotSelectedValue", - "target": "id=dropdown", - "targets": [], - "value": "1" - }, { - "id": "8a78734a-7d33-4be2-b131-1927d9aad3d2", - "comment": "", - "command": "assertSelectedLabel", - "target": "id=dropdown", - "targets": [], - "value": "Option 2" - }] - }, { - "id": "dfa2e095-f81f-4bae-bf63-dab08b16e475", - "name": "send keys", - "commands": [{ - "id": "564a50b8-3011-43ab-9439-3415aca3e371", - "comment": "", - "command": "open", - "target": "/login", - "targets": [], - "value": "" - }, { - "id": "68948336-2bec-4d97-bc59-b60c3a1db053", - "comment": "", - "command": "sendKeys", - "target": "css=#username", - "targets": [], - "value": "tomsmith" - }, { - "id": "4ed185c3-b6aa-4ad0-88e7-dba8af1f083a", - "comment": "", - "command": "sendKeys", - "target": "xpath=//input[@id='password']", - "targets": [], - "value": "SuperSecretPassword!${KEY_ENTER}" - }, { - "id": "bc04b16d-3b32-48c7-8304-2a1e8d3addf3", - "comment": "", - "command": "assertText", - "target": "id=flash", - "targets": [], - "value": "You logged into a secure area!\\n×" - }] - }, { - "id": "847b28b8-1fd9-4563-bc3a-8faa30ba1408", - "name": "store text", - "commands": [{ - "id": "452f9209-d1f0-403a-b198-107340717025", - "comment": "", - "command": "open", - "target": "/login", - "targets": [], - "value": "" - }, { - "id": "23a7e9ba-1fc6-4ac9-95f6-8c79f4f6abd5", - "comment": "", - "command": "sendKeys", - "target": "css=#username", - "targets": [], - "value": "blah" - }, { - "id": "54ac9880-6797-46fe-8f8f-1fbc8cd3fb6e", - "comment": "", - "command": "storeValue", - "target": "css=#username", - "targets": [], - "value": "aVar" - }, { - "id": "494b73ea-aef2-4321-9259-0a865adf93ac", - "comment": "", - "command": "assert", - "target": "aVar", - "targets": [], - "value": "blah" - }] - }, { - "id": "08cc9e79-661e-4f99-8c9e-23bfa18e2cee", - "name": "submit", - "commands": [{ - "id": "7a0479a0-ed2d-4177-a200-ee919a8855da", - "comment": "", - "command": "open", - "target": "/login", - "targets": [], - "value": "" - }, { - "id": "63a7c43c-60ee-4e92-864b-3f5422cbf2ef", - "comment": "", - "command": "sendKeys", - "target": "css=#username", - "targets": [], - "value": "tomsmith" - }, { - "id": "64c16373-1dcb-4d89-8234-71a25ba561d4", - "comment": "", - "command": "sendKeys", - "target": "css=#password", - "targets": [], - "value": "SuperSecretPassword!" - }, { - "id": "32fab02a-749e-4656-b394-d93009390558", - "comment": "", - "command": "submit", - "target": "css=#login", - "targets": [], - "value": "" - }, { - "id": "57dde464-1296-4ef7-b9f5-8f39d2187843", - "comment": "", - "command": "assertElementPresent", - "target": "css=.flash.success", - "targets": [], - "value": "" - }] - }, { - "id": "4f4dc8bc-a7bf-4304-a986-c9823df30669", - "name": "wait for element present", - "commands": [{ - "id": "e33722db-58a2-47d5-9c7f-d3c8f607f6a9", - "comment": "", - "command": "open", - "target": "/dynamic_loading/2", - "targets": [], - "value": "" - }, { - "id": "95ee4b26-1141-4a99-bf94-1c610247f7ce", - "comment": "", - "command": "clickAt", - "target": "css=#start button", - "targets": [], - "value": "" - }, { - "id": "67d7b233-373d-4f92-869d-6b7ef92b0772", - "comment": "", - "command": "waitForElementPresent", - "target": "css=#finish", - "targets": [], - "value": "5000" - }, { - "id": "ea60b0df-4299-46da-8cad-11f94eeb6fc3", - "comment": "", - "command": "assertText", - "target": "css=#finish", - "targets": [], - "value": "Hello World!" - }] - }, { - "id": "cd580e8e-0271-4f76-9e64-762024bd3403", - "name": "wait for element not present", - "commands": [{ - "id": "7f89cfbc-e890-41f9-b3e2-8985fe8c5c3a", - "comment": "", - "command": "open", - "target": "/dynamic_controls", - "targets": [], - "value": "" - }, { - "id": "bb6528b4-4581-4853-9118-8437e568b065", - "comment": "", - "command": "clickAt", - "target": "css=#checkbox-example button", - "targets": [], - "value": "" - }, { - "id": "558013e7-d2f6-4bd1-9f5b-26f38c2bb193", - "comment": "", - "command": "waitForElementNotPresent", - "target": "css=#checkbox", - "targets": [], - "value": "5000" - }, { - "id": "557bc5c6-e869-4ac3-af52-c448f9029560", - "comment": "", - "command": "assertElementNotPresent", - "target": "css=#checkbox", - "targets": [], - "value": "" - }] - }, { - "id": "b0b05b79-95c8-49a7-b297-9cbed9f63269", - "name": "wait for element visible", - "commands": [{ - "id": "4671a42d-e8e4-44ac-8325-3c721bde01d2", - "comment": "", - "command": "open", - "target": "/dynamic_loading/1", - "targets": [], - "value": "" - }, { - "id": "47fced8b-5e22-4a33-82ce-e84ce8193a53", - "comment": "", - "command": "clickAt", - "target": "css=#start button", - "targets": [], - "value": "" - }, { - "id": "bf72d9ff-d0eb-4e57-a006-33beefd31a9d", - "comment": "", - "command": "waitForElementVisible", - "target": "css=#finish", - "targets": [], - "value": "5000" - }, { - "id": "848a3875-28b6-4bbe-b303-7b5eda5ec7f8", - "comment": "", - "command": "assertText", - "target": "css=#finish", - "targets": [], - "value": "Hello World!" - }] - }, { - "id": "c4aa8aac-8a56-41f5-9a3f-329af5670ee2", - "name": "wait for element not visible", - "commands": [{ - "id": "af00a76a-8052-4fd4-a3c1-e9066fd42885", - "comment": "", - "command": "open", - "target": "/dynamic_loading/1", - "targets": [], - "value": "" - }, { - "id": "c12c2217-3bd0-4ccb-b1d9-41f9e357d863", - "comment": "", - "command": "clickAt", - "target": "css=#start button", - "targets": [], - "value": "" - }, { - "id": "24fcfaf9-0cc5-4dc1-92ce-030997df0783", - "comment": "", - "command": "waitForElementNotVisible", - "target": "css=#loading", - "targets": [], - "value": "5000" - }, { - "id": "7c7d2492-ecec-411a-a71d-4ca905865947", - "comment": "", - "command": "assertText", - "target": "css=#finish", - "targets": [], - "value": "Hello World!" - }] - }, { - "id": "a1852a8a-9e73-48b5-b846-a99964a51413", - "name": "wait for element editable (and not editable)", - "commands": [{ - "id": "675ab96a-4cfb-451c-9928-84b1fde6e8d1", - "comment": "", - "command": "open", - "target": "/dynamic_controls", - "targets": [], - "value": "" - }, { - "id": "f2957579-5dca-4499-b94f-92d62d572ced", - "comment": "", - "command": "clickAt", - "target": "css=#input-example button", - "targets": [], - "value": "" - }, { - "id": "0e56d7bd-deda-454d-84a7-7beffb87e70b", - "comment": "", - "command": "waitForElementEditable", - "target": "css=#input-example input", - "targets": [], - "value": "5000" - }, { - "id": "95356452-fd37-484b-9050-5fcaa75f8d1b", - "comment": "", - "command": "assertEditable", - "target": "css=#input-example input", - "targets": [], - "value": "" - }, { - "id": "51018c43-bca1-4497-8ec3-206fb37e62a7", - "comment": "", - "command": "clickAt", - "target": "css=#input-example button", - "targets": [], - "value": "" - }, { - "id": "5777d733-283c-4325-b81f-a022b54cbe8b", - "comment": "", - "command": "waitForElementNotEditable", - "target": "css=#input-example input", - "targets": [], - "value": "5000" - }, { - "id": "2b956ec4-4ca9-450e-81cb-f0c58ebdcb4b", - "comment": "", - "command": "assertNotEditable", - "target": "css=#input-example input", - "targets": [], - "value": "" - }] - }, { - "id": "cb561b9c-9ab3-487b-9f48-9ba0bca1149c", - "name": "locator fallback", - "commands": [{ - "id": "9151ceab-0045-4eb5-9a09-d5f1588cd5e8", - "comment": "", - "command": "open", - "target": "/dynamic_loading/2", - "targets": [], - "value": "" - }, { - "id": "153abb09-ef4a-45cb-82ea-5fd22af79f4a", - "comment": "", - "command": "click", - "target": "css=button", - "targets": [], - "value": "" - }, { - "id": "5a547f40-a3b6-48ee-865c-5973fae75ecf", - "comment": "", - "command": "clickAt", - "target": "css=#finis > h4", - "targets": [ - ["css=#finis > h4", "css"], - ["css=#finish > h4", "css"] - ], - "value": "" - }, { - "id": "855eb4fe-9cd2-4d0f-b8b0-5116de44cff7", - "comment": "", - "command": "assertText", - "target": "css=#finish > h4", - "targets": [], - "value": "Hello World!" - }] - }, { - "id": "245ded41-ba4f-45a4-b93a-f77c2a903214", - "name": "confirmation dialog", - "commands": [{ - "id": "1508ad14-e69a-4888-90e9-da7f0bcd9299", - "comment": "", - "command": "open", - "target": "/javascript_alerts", - "targets": [], - "value": "" - }, { - "id": "20cb3449-0889-4c29-a48c-9b28f93c2271", - "comment": "", - "command": "chooseOkOnNextConfirmation", - "target": "", - "targets": [], - "value": "" - }, { - "id": "744020a2-4548-4e02-ad59-35e5ad60c3b3", - "comment": "", - "command": "click", - "target": "css=li:nth-child(2) > button", - "targets": [], - "value": "" - }, { - "id": "a24be3d3-9274-4a22-8cf0-a5224593a847", - "comment": "", - "command": "assertConfirmation", - "target": "I am a JS Confirm", - "targets": [], - "value": "" - }, { - "id": "a2b4c27f-c9e1-4318-8925-c645c6a6fdfc", - "comment": "", - "command": "webdriverChooseOkOnVisibleConfirmation", - "target": "", - "targets": [], - "value": "" - }] - }, { - "id": "1bc6db9d-9bcf-4eb7-b7c1-37b8a10f141a", - "name": "select window", - "commands": [{ - "id": "7cb5f12b-55d4-45ab-ad3a-0ec9eeace16d", - "comment": "", - "command": "open", - "target": "/", - "targets": [], - "value": "" - }, { - "id": "75834653-1192-470d-b676-8b346475c29a", - "comment": "", - "command": "storeWindowHandle", - "target": "handle", - "targets": [], - "value": "" - }, { - "id": "5751fb3f-e8db-4d44-8087-1fd479029cad", - "comment": "", - "command": "echo", - "target": "${handle}", - "targets": [], - "value": "" - }, { - "id": "b6a47509-ca0a-42f3-bd8f-167a17b15b6c", - "comment": "", - "command": "click", - "target": "linkText=Elemental Selenium", - "targets": [], - "value": "", - "opensWindow": true, - "windowHandleName": "newWindow", - "windowTimeout": 2000 - }, { - "id": "1c16c2c7-0684-409d-bdca-6cd992c6d8f7", - "comment": "", - "command": "assertTitle", - "target": "The Internet", - "targets": [], - "value": "" - }, { - "id": "ef98c2ee-49d5-40e8-b95d-388a94a3a3fc", - "comment": "", - "command": "selectWindow", - "target": "handle=${handle}", - "targets": [], - "value": "" - }, { - "id": "c04766b5-8499-4c36-a7e3-72ff1f401d5b", - "comment": "", - "command": "assertTitle", - "target": "The Internet", - "targets": [], - "value": "" - }, { - "id": "435f7180-ef2d-4a2a-b9b4-f0341e8a1314", - "comment": "", - "command": "selectWindow", - "target": "handle=${newWindow}", - "targets": [], - "value": "" - }, { - "id": "c816ddeb-c31c-4e20-957a-48f5cb944f8a", - "comment": "", - "command": "assertTitle", - "target": "Elemental Selenium: Receive a Free, Weekly Tip on Using Selenium like a Pro", - "targets": [], - "value": "" - }, { - "id": "82da76fd-fd11-476d-9778-0ffae63d06ae", - "comment": "", - "command": "close", - "target": "", - "targets": [], - "value": "" - }, { - "id": "36faa878-126b-4b1e-bc23-817ca45eba55", - "comment": "", - "command": "selectWindow", - "target": "handle=${handle}", - "targets": [], - "value": "" - }, { - "id": "ea3f2f78-e54b-4851-91d6-83f8d2ff03df", - "comment": "", - "command": "assertTitle", - "target": "The Internet", - "targets": [], - "value": "" - }, { - "id": "ccc8e464-b5b9-4954-afc5-81c3aa52deed", - "comment": "", - "command": "close", - "target": "", - "targets": [], - "value": "" - }] - }, { - "id": "1dfaba3c-1d1d-49ba-aa2c-9518565c134f", - "name": "login", - "commands": [{ - "id": "3ad5d85d-58c6-40cf-9006-f259b2a79ad0", - "comment": "", - "command": "open", - "target": "/login", - "targets": [], - "value": "" - }, { - "id": "701bf60d-59b1-43a2-a730-8be3e723677d", - "comment": "", - "command": "sendKeys", - "target": "id=username", - "targets": [], - "value": "${username}" - }, { - "id": "b7d1c1db-fa94-438e-bb95-e26daaaa1f56", - "comment": "", - "command": "sendKeys", - "target": "id=password", - "targets": [], - "value": "${password}" - }, { - "id": "f8c9802e-e0c9-4120-ba01-9f4c6111dc02", - "comment": "", - "command": "click", - "target": "css=#login button", - "targets": [], - "value": "" - }] - }, { - "id": "0aa6bbed-cc55-425c-b3af-a0ab43d1dd2b", - "name": "reuse", - "commands": [{ - "id": "90c4883c-7a1a-41fb-a8de-2ea5dc6d8d72", - "comment": "", - "command": "store", - "target": "tomsmith", - "targets": [], - "value": "username" - }, { - "id": "c5dc0eb7-c424-43f4-b046-81e8479511a9", - "comment": "", - "command": "store", - "target": "SuperSecretPassword!", - "targets": [], - "value": "password" - }, { - "id": "3f6dddac-3de7-4503-aef3-7926a8d0e166", - "comment": "", - "command": "run", - "target": "login", - "targets": [], - "value": "" - }, { - "id": "9f25e9ec-ac1c-48de-95c7-e5a2e99c62ea", - "comment": "", - "command": "assertText", - "target": "id=flash", - "targets": [], - "value": "You logged into a secure area!\\n×" - }] - }], - "suites": [{ - "id": "de384772-7c44-4ebd-a563-9f59d4a29ded", - "name": "control flow", - "persistSession": false, - "parallel": false, - "timeout": 300, - "tests": ["01704d06-9abf-4776-8e1d-4d32e4e39965", "564aa06a-6e04-491d-9134-bb9a03dfc290", "f94989d9-4cd4-480a-8a68-f07fb071800c", "958bcde1-54ef-4d1f-bd4e-f1e973af63fc", "99fca157-b6bf-4076-95bc-2e7b449178d6", "2f113e0b-224d-4651-af16-4dac9d5d623a"] - }], - "urls": ["http://the-internet.herokuapp.com/"], - "plugins": [] -} \ No newline at end of file diff --git a/packages/code-export-python-pytest/__test__/test-files/nested-select-window-v2.side b/packages/code-export-python-pytest/__test__/test-files/nested-select-window-v2.side deleted file mode 100644 index 55c14585b7..0000000000 --- a/packages/code-export-python-pytest/__test__/test-files/nested-select-window-v2.side +++ /dev/null @@ -1,71 +0,0 @@ -{ - "id": "212f1831-7949-459d-a0ba-daf472ed3e53", - "version": "2.0", - "name": "nested-select-window-v2", - "url": "http://the-internet.herokuapp.com", - "tests": [{ - "id": "3147925e-12c9-4b8e-aac1-90f4f13e8404", - "name": "reuse", - "commands": [{ - "id": "4c01a3a4-9547-4233-8d45-92496d6a6307", - "comment": "", - "command": "run", - "target": "select window", - "targets": [], - "value": "" - }] - }, { - "id": "b85e7efd-0f6f-4626-b815-24ddc3f8fbd1", - "name": "select window", - "commands": [{ - "id": "6b96f8fe-141f-4e2d-8675-1698ad725c79", - "comment": "", - "command": "open", - "target": "/windows", - "targets": [], - "value": "" - }, { - "id": "ee184b06-b880-4fed-ae23-b924f16284d9", - "comment": "", - "command": "click", - "target": "linkText=Click Here", - "targets": [ - ["linkText=Click Here", "linkText"], - ["css=a:nth-child(2)", "css:finder"], - ["xpath=//a[contains(text(),'Click Here')]", "xpath:link"], - ["xpath=//div[@id='content']/div/a", "xpath:idRelative"], - ["xpath=//a[contains(@href, '/windows/new')]", "xpath:href"], - ["xpath=//div/div/a", "xpath:position"], - ["xpath=//a[contains(.,'Click Here')]", "xpath:innerText"] - ], - "value": "", - "opensWindow": true, - "windowHandleName": "win9425", - "windowTimeout": 2000 - }, { - "id": "f08b16ff-85df-4bcc-82f7-e8861bdb5eb2", - "comment": "", - "command": "selectWindow", - "target": "handle=${win9425}", - "targets": [], - "value": "" - }, { - "id": "c3319e1c-cd44-4213-a7f5-e780069cd1f0", - "comment": "", - "command": "assertTitle", - "target": "New Window", - "targets": [], - "value": "" - }] - }], - "suites": [{ - "id": "696ca955-3e12-4f0a-a4ef-369b647fd7eb", - "name": "Default Suite", - "persistSession": false, - "parallel": false, - "timeout": 300, - "tests": ["3147925e-12c9-4b8e-aac1-90f4f13e8404", "b85e7efd-0f6f-4626-b815-24ddc3f8fbd1"] - }], - "urls": ["http://the-internet.herokuapp.com/"], - "plugins": [] -} \ No newline at end of file diff --git a/packages/code-export-python-pytest/__test__/test-files/nested-select-window.side b/packages/code-export-python-pytest/__test__/test-files/nested-select-window.side deleted file mode 100644 index 8d381b650e..0000000000 --- a/packages/code-export-python-pytest/__test__/test-files/nested-select-window.side +++ /dev/null @@ -1,71 +0,0 @@ -{ - "id": "212f1831-7949-459d-a0ba-daf472ed3e53", - "version": "2.0", - "name": "nested select window", - "url": "http://the-internet.herokuapp.com", - "tests": [{ - "id": "3147925e-12c9-4b8e-aac1-90f4f13e8404", - "name": "reuse", - "commands": [{ - "id": "4c01a3a4-9547-4233-8d45-92496d6a6307", - "comment": "", - "command": "run", - "target": "select window", - "targets": [], - "value": "" - }] - }, { - "id": "b85e7efd-0f6f-4626-b815-24ddc3f8fbd1", - "name": "select window", - "commands": [{ - "id": "6b96f8fe-141f-4e2d-8675-1698ad725c79", - "comment": "", - "command": "open", - "target": "/windows", - "targets": [], - "value": "" - }, { - "id": "ee184b06-b880-4fed-ae23-b924f16284d9", - "comment": "", - "command": "click", - "target": "linkText=Click Here", - "targets": [ - ["linkText=Click Here", "linkText"], - ["css=a:nth-child(2)", "css:finder"], - ["xpath=//a[contains(text(),'Click Here')]", "xpath:link"], - ["xpath=//div[@id='content']/div/a", "xpath:idRelative"], - ["xpath=//a[contains(@href, '/windows/new')]", "xpath:href"], - ["xpath=//div/div/a", "xpath:position"], - ["xpath=//a[contains(.,'Click Here')]", "xpath:innerText"] - ], - "value": "", - "opensWindow": true, - "windowHandleName": "win9425", - "windowTimeout": 2000 - }, { - "id": "f08b16ff-85df-4bcc-82f7-e8861bdb5eb2", - "comment": "", - "command": "selectWindow", - "target": "handle=${win9425}", - "targets": [], - "value": "" - }, { - "id": "c3319e1c-cd44-4213-a7f5-e780069cd1f0", - "comment": "", - "command": "assertTitle", - "target": "New Window", - "targets": [], - "value": "" - }] - }], - "suites": [{ - "id": "696ca955-3e12-4f0a-a4ef-369b647fd7eb", - "name": "Default Suite", - "persistSession": false, - "parallel": false, - "timeout": 300, - "tests": ["3147925e-12c9-4b8e-aac1-90f4f13e8404"] - }], - "urls": ["http://the-internet.herokuapp.com/"], - "plugins": [] -} \ No newline at end of file diff --git a/packages/code-export-python-pytest/__test__/test-files/select-window.side b/packages/code-export-python-pytest/__test__/test-files/select-window.side deleted file mode 100644 index 68b90ab725..0000000000 --- a/packages/code-export-python-pytest/__test__/test-files/select-window.side +++ /dev/null @@ -1,103 +0,0 @@ -{ - "id": "c0f8143d-d29b-43cc-ab08-268ef217f3b4", - "version": "2.0", - "name": "select window", - "url": "http://the-internet.herokuapp.com", - "tests": [{ - "id": "5d92f854-623b-41da-826b-2feb4ad20f2a", - "name": "select window", - "commands": [{ - "id": "0441ea10-c31c-4322-965b-6f61e22048cf", - "comment": "", - "command": "open", - "target": "/", - "targets": [], - "value": "" - }, { - "id": "2d33741e-04a8-4f17-a7f0-fd4a0cb17fc8", - "comment": "", - "command": "setWindowSize", - "target": "1260x1027", - "targets": [], - "value": "" - }, { - "id": "343f1636-850a-4a24-b99c-6702a890e572", - "comment": "", - "command": "click", - "target": "linkText=Multiple Windows", - "targets": [ - ["linkText=Multiple Windows", "linkText"], - ["css=li:nth-child(33) > a", "css:finder"], - ["xpath=//a[contains(text(),'Multiple Windows')]", "xpath:link"], - ["xpath=//div[@id='content']/ul/li[33]/a", "xpath:idRelative"], - ["xpath=//a[contains(@href, '/windows')]", "xpath:href"], - ["xpath=//li[33]/a", "xpath:position"], - ["xpath=//a[contains(.,'Multiple Windows')]", "xpath:innerText"] - ], - "value": "" - }, { - "id": "ffc4bbd5-e3cb-4a43-ad80-30c1d2ec5f25", - "comment": "", - "command": "click", - "target": "linkText=Click Here", - "targets": [ - ["linkText=Click Here", "linkText"], - ["css=a:nth-child(2)", "css:finder"], - ["xpath=//a[contains(text(),'Click Here')]", "xpath:link"], - ["xpath=//div[@id='content']/div/a", "xpath:idRelative"], - ["xpath=//a[contains(@href, '/windows/new')]", "xpath:href"], - ["xpath=//div/div/a", "xpath:position"], - ["xpath=//a[contains(.,'Click Here')]", "xpath:innerText"] - ], - "value": "", - "opensWindow": true, - "windowHandleName": "win9625", - "windowTimeout": 2000 - }, { - "id": "2a1a9e51-71d0-45db-9d77-479d160a67f0", - "comment": "", - "command": "storeWindowHandle", - "target": "root", - "targets": [], - "value": "" - }, { - "id": "0d33a445-a65b-4a69-82c6-c89bb1d53a5e", - "comment": "", - "command": "selectWindow", - "target": "handle=${win9625}", - "targets": [], - "value": "" - }, { - "id": "528b6f23-22a7-4a4c-993d-c772ceea96bc", - "comment": "", - "command": "assertTitle", - "target": "New Window", - "targets": [], - "value": "" - }, { - "id": "dd32287e-b69b-4674-8171-e50aef15d904", - "comment": "", - "command": "selectWindow", - "target": "handle=${root}", - "targets": [], - "value": "" - }, { - "id": "f02dff23-83d9-457f-8010-d5d15c32f0c4", - "comment": "", - "command": "assertTitle", - "target": "The Internet", - "targets": [], - "value": "" - }] - }], - "suites": [{ - "id": "988ac055-dcc7-48ba-ab8a-6fe3e3079a54", - "name": "Default Suite", - "persistSession": false, - "parallel": false, - "timeout": 300, - "tests": ["5d92f854-623b-41da-826b-2feb4ad20f2a"] - }], - "urls": ["http://the-internet.herokuapp.com/"], - "plugins": [] -} \ No newline at end of file diff --git a/packages/code-export-python-pytest/__test__/test-files/single-suite.side b/packages/code-export-python-pytest/__test__/test-files/single-suite.side deleted file mode 100644 index 9bf89153dc..0000000000 --- a/packages/code-export-python-pytest/__test__/test-files/single-suite.side +++ /dev/null @@ -1,159 +0,0 @@ -{ - "id": "213b6ed8-55e3-4a15-bc10-0c1474aa7937", - "version": "2.0", - "name": "the-internet", - "url": "http://the-internet.herokuapp.com", - "tests": [{ - "id": "d0f4bf60-d07a-4f93-adde-d60f0e04941b", - "name": "valid credentials", - "commands": [{ - "id": "ba273d63-711b-4c6e-a726-403803b43e19", - "comment": "", - "command": "open", - "target": "/login", - "targets": [], - "value": "" - }, { - "id": "906eeacc-d60d-4f8c-afa8-0bb11e636dc2", - "comment": "", - "command": "setWindowSize", - "target": "1440x1177", - "targets": [], - "value": "" - }, { - "id": "02c52cbb-4341-4995-b2a9-ff4234c56661", - "comment": "", - "command": "type", - "target": "id=username", - "targets": [ - ["id=username", "id"], - ["name=username", "name"], - ["css=#username", "css:finder"], - ["xpath=//input[@id='username']", "xpath:attributes"], - ["xpath=//form[@id='login']/div/div/input", "xpath:idRelative"], - ["xpath=//input", "xpath:position"] - ], - "value": "tomsmith" - }, { - "id": "a0b7676a-64ce-443f-84f9-7d1b0b938f49", - "comment": "", - "command": "type", - "target": "id=password", - "targets": [ - ["id=password", "id"], - ["name=password", "name"], - ["css=#password", "css:finder"], - ["xpath=//input[@id='password']", "xpath:attributes"], - ["xpath=//form[@id='login']/div[2]/div/input", "xpath:idRelative"], - ["xpath=//div[2]/div/input", "xpath:position"] - ], - "value": "SuperSecretPassword!" - }, { - "id": "cc0d80e8-a017-4a52-beda-894897031f89", - "comment": "", - "command": "click", - "target": "css=#login button", - "targets": [ - ["css=.fa", "css:finder"], - ["xpath=//form[@id='login']/button/i", "xpath:idRelative"], - ["xpath=//i", "xpath:position"], - ["xpath=//i[contains(.,' Login')]", "xpath:innerText"] - ], - "value": "" - }, { - "id": "fe82de21-c699-4d98-b98f-691f71f0f398", - "comment": "", - "command": "assertText", - "target": "css=.flash.success", - "targets": [ - ["id=flash", "id"], - ["css=#flash", "css:finder"], - ["xpath=//div[@id='flash']", "xpath:attributes"], - ["xpath=//div[@id='flash-messages']/div", "xpath:idRelative"], - ["xpath=//div/div/div", "xpath:position"] - ], - "value": "You logged into a secure area!\\n×" - }] - }, { - "id": "92164fab-fb26-4359-a0e3-5a4d7a756e03", - "name": "invalid credentials", - "commands": [{ - "id": "0f195785-3337-4d11-8356-b2d15fcdffa7", - "comment": "", - "command": "open", - "target": "/login", - "targets": [], - "value": "" - }, { - "id": "ae33c069-785e-4e46-8667-4bae1914cb6a", - "comment": "", - "command": "setWindowSize", - "target": "1440x1177", - "targets": [], - "value": "" - }, { - "id": "ba49be2c-330c-449c-a488-a964f204c46f", - "comment": "", - "command": "type", - "target": "id=username", - "targets": [ - ["id=username", "id"], - ["name=username", "name"], - ["css=#username", "css:finder"], - ["xpath=//input[@id='username']", "xpath:attributes"], - ["xpath=//form[@id='login']/div/div/input", "xpath:idRelative"], - ["xpath=//input", "xpath:position"] - ], - "value": "blah" - }, { - "id": "80945f1b-f0fa-4305-9928-50cbe0ce1ceb", - "comment": "", - "command": "type", - "target": "id=password", - "targets": [ - ["id=password", "id"], - ["name=password", "name"], - ["css=#password", "css:finder"], - ["xpath=//input[@id='password']", "xpath:attributes"], - ["xpath=//form[@id='login']/div[2]/div/input", "xpath:idRelative"], - ["xpath=//div[2]/div/input", "xpath:position"] - ], - "value": "blah" - }, { - "id": "ec28319d-39a2-4e9f-b626-1b685ca925ea", - "comment": "", - "command": "click", - "target": "css=#login button", - "targets": [ - ["css=.fa", "css:finder"], - ["xpath=//form[@id='login']/button/i", "xpath:idRelative"], - ["xpath=//i", "xpath:position"], - ["xpath=//i[contains(.,' Login')]", "xpath:innerText"] - ], - "value": "" - }, { - "id": "0fc630bd-b187-41e7-8580-01e6500a8f48", - "comment": "", - "command": "assertText", - "target": "id=flash", - "targets": [ - ["id=flash", "id"], - ["css=#flash", "css:finder"], - ["xpath=//div[@id='flash']", "xpath:attributes"], - ["xpath=//div[@id='flash-messages']/div", "xpath:idRelative"], - ["xpath=//div/div/div", "xpath:position"] - ], - "value": "Your username is invalid!\\n×" - }] - }], - "suites": [{ - "id": "edca97e7-1507-4fcd-b61b-fc4cc290c005", - "name": "login", - "persistSession": false, - "parallel": false, - "timeout": 300, - "tests": ["d0f4bf60-d07a-4f93-adde-d60f0e04941b", "92164fab-fb26-4359-a0e3-5a4d7a756e03"] - }], - "urls": ["http://the-internet.herokuapp.com/"], - "plugins": [] -} \ No newline at end of file diff --git a/packages/code-export-python-pytest/__test__/test-files/single-test.side b/packages/code-export-python-pytest/__test__/test-files/single-test.side deleted file mode 100644 index 5b16bd8192..0000000000 --- a/packages/code-export-python-pytest/__test__/test-files/single-test.side +++ /dev/null @@ -1,88 +0,0 @@ -{ - "id": "213b6ed8-55e3-4a15-bc10-0c1474aa7937", - "version": "2.0", - "name": "the-internet", - "url": "http://the-internet.herokuapp.com", - "tests": [{ - "id": "d0f4bf60-d07a-4f93-adde-d60f0e04941b", - "name": "login", - "commands": [{ - "id": "ba273d63-711b-4c6e-a726-403803b43e19", - "comment": "", - "command": "open", - "target": "/login", - "targets": [], - "value": "" - }, { - "id": "906eeacc-d60d-4f8c-afa8-0bb11e636dc2", - "comment": "", - "command": "setWindowSize", - "target": "1440x1177", - "targets": [], - "value": "" - }, { - "id": "02c52cbb-4341-4995-b2a9-ff4234c56661", - "comment": "", - "command": "type", - "target": "id=username", - "targets": [ - ["id=username", "id"], - ["name=username", "name"], - ["css=#username", "css:finder"], - ["xpath=//input[@id='username']", "xpath:attributes"], - ["xpath=//form[@id='login']/div/div/input", "xpath:idRelative"], - ["xpath=//input", "xpath:position"] - ], - "value": "tomsmith" - }, { - "id": "a0b7676a-64ce-443f-84f9-7d1b0b938f49", - "comment": "", - "command": "type", - "target": "id=password", - "targets": [ - ["id=password", "id"], - ["name=password", "name"], - ["css=#password", "css:finder"], - ["xpath=//input[@id='password']", "xpath:attributes"], - ["xpath=//form[@id='login']/div[2]/div/input", "xpath:idRelative"], - ["xpath=//div[2]/div/input", "xpath:position"] - ], - "value": "SuperSecretPassword!" - }, { - "id": "cc0d80e8-a017-4a52-beda-894897031f89", - "comment": "", - "command": "click", - "target": "css=#login button", - "targets": [ - ["css=.fa", "css:finder"], - ["xpath=//form[@id='login']/button/i", "xpath:idRelative"], - ["xpath=//i", "xpath:position"], - ["xpath=//i[contains(.,' Login')]", "xpath:innerText"] - ], - "value": "" - }, { - "id": "fe82de21-c699-4d98-b98f-691f71f0f398", - "comment": "", - "command": "assertText", - "target": "css=.flash.success", - "targets": [ - ["id=flash", "id"], - ["css=#flash", "css:finder"], - ["xpath=//div[@id='flash']", "xpath:attributes"], - ["xpath=//div[@id='flash-messages']/div", "xpath:idRelative"], - ["xpath=//div/div/div", "xpath:position"] - ], - "value": "You logged into a secure area!\\n×" - }] - }], - "suites": [{ - "id": "edca97e7-1507-4fcd-b61b-fc4cc290c005", - "name": "Default Suite", - "persistSession": false, - "parallel": false, - "timeout": 300, - "tests": ["d0f4bf60-d07a-4f93-adde-d60f0e04941b"] - }], - "urls": ["http://the-internet.herokuapp.com/"], - "plugins": [] -} diff --git a/packages/code-export-python-pytest/__test__/test-files/test-case-reuse.side b/packages/code-export-python-pytest/__test__/test-files/test-case-reuse.side deleted file mode 100644 index 6f13dc83df..0000000000 --- a/packages/code-export-python-pytest/__test__/test-files/test-case-reuse.side +++ /dev/null @@ -1,133 +0,0 @@ -{ - "id": "321c0306-0322-418e-8414-c982ded83b5f", - "version": "2.0", - "name": "test case reuse", - "url": "https://the-internet.herokuapp.com", - "tests": [{ - "id": "c8e84558-3efa-4481-a601-f6b7cff1c6d9", - "name": "login", - "commands": [{ - "id": "41c451be-96fe-4744-a084-ebedb5b04d01", - "comment": "", - "command": "open", - "target": "/", - "targets": [], - "value": "" - }, { - "id": "42d24143-2085-4bbe-9e16-b71a7d3e8d6c", - "comment": "", - "command": "click", - "target": "linkText=Form Authentication", - "targets": [ - ["linkText=Form Authentication", "linkText"], - ["css=li:nth-child(18) > a", "css:finder"], - ["xpath=//a[contains(text(),'Form Authentication')]", "xpath:link"], - ["xpath=//div[@id='content']/ul/li[18]/a", "xpath:idRelative"], - ["xpath=//a[contains(@href, '/login')]", "xpath:href"], - ["xpath=//li[18]/a", "xpath:position"], - ["xpath=//a[contains(.,'Form Authentication')]", "xpath:innerText"] - ], - "value": "" - }, { - "id": "918b4af6-2c88-43c7-b145-3b2bc3cba4a0", - "comment": "", - "command": "type", - "target": "id=username", - "targets": [ - ["id=username", "id"], - ["name=username", "name"], - ["css=#username", "css:finder"], - ["xpath=//input[@id='username']", "xpath:attributes"], - ["xpath=//form[@id='login']/div/div/input", "xpath:idRelative"], - ["xpath=//input", "xpath:position"] - ], - "value": "${username}" - }, { - "id": "f4f781d9-c051-4a41-a143-a8b3936cb034", - "comment": "", - "command": "type", - "target": "id=password", - "targets": [ - ["id=password", "id"], - ["name=password", "name"], - ["css=#password", "css:finder"], - ["xpath=//input[@id='password']", "xpath:attributes"], - ["xpath=//form[@id='login']/div[2]/div/input", "xpath:idRelative"], - ["xpath=//div[2]/div/input", "xpath:position"] - ], - "value": "${password}" - }, { - "id": "8081fd74-50b1-4f5c-95f1-c171519b8700", - "comment": "", - "command": "click", - "target": "css=.fa", - "targets": [ - ["css=.fa", "css:finder"], - ["xpath=//form[@id='login']/button/i", "xpath:idRelative"], - ["xpath=//i", "xpath:position"], - ["xpath=//i[contains(.,' Login')]", "xpath:innerText"] - ], - "value": "" - }] - }, { - "id": "0b10e1b2-df70-46c2-8c66-13bdf462f4b2", - "name": "valid credentials", - "commands": [{ - "id": "bd7228c9-f47a-4755-ad3d-5b92f50e8a5b", - "comment": "", - "command": "store", - "target": "tomsmith", - "targets": [], - "value": "username" - }, { - "id": "02eb7843-9547-434c-b882-81e0301a112e", - "comment": "", - "command": "store", - "target": "SuperSecretPassword!", - "targets": [], - "value": "password" - }, { - "id": "3ddd4ccd-ba9c-47df-a963-ba0ebdf84a3a", - "comment": "", - "command": "run", - "target": "login", - "targets": [], - "value": "" - }] - }, { - "id": "01472588-f710-45f6-a3db-3c931e23a37e", - "name": "invalid credentials", - "commands": [{ - "id": "169d75ba-2626-41e2-8516-a3114d7d8d13", - "comment": "", - "command": "store", - "target": "blah", - "targets": [], - "value": "username" - }, { - "id": "6959737f-8a00-4a07-b238-c990eaf53b27", - "comment": "", - "command": "store", - "target": "blah", - "targets": [], - "value": "password" - }, { - "id": "3e5ed8a5-088a-4b7a-a52d-b47afa233b89", - "comment": "", - "command": "run", - "target": "login", - "targets": [], - "value": "" - }] - }], - "suites": [{ - "id": "ee5f025f-40bf-4295-9a57-c916a4b47c70", - "name": "login", - "persistSession": false, - "parallel": false, - "timeout": 300, - "tests": ["01472588-f710-45f6-a3db-3c931e23a37e", "0b10e1b2-df70-46c2-8c66-13bdf462f4b2"] - }], - "urls": ["https://the-internet.herokuapp.com/"], - "plugins": [] -} \ No newline at end of file diff --git a/packages/code-export-java-junit/__test__/test-files/control-flow-suite.side b/packages/code-export-utils/__test__/test-files/control-flow-suite.side similarity index 100% rename from packages/code-export-java-junit/__test__/test-files/control-flow-suite.side rename to packages/code-export-utils/__test__/test-files/control-flow-suite.side diff --git a/packages/code-export-java-junit/__test__/test-files/nested-select-window-v2.side b/packages/code-export-utils/__test__/test-files/nested-select-window-v2.side similarity index 100% rename from packages/code-export-java-junit/__test__/test-files/nested-select-window-v2.side rename to packages/code-export-utils/__test__/test-files/nested-select-window-v2.side diff --git a/packages/code-export-java-junit/__test__/test-files/nested-select-window.side b/packages/code-export-utils/__test__/test-files/nested-select-window.side similarity index 100% rename from packages/code-export-java-junit/__test__/test-files/nested-select-window.side rename to packages/code-export-utils/__test__/test-files/nested-select-window.side diff --git a/packages/code-export-java-junit/__test__/test-files/select-window.side b/packages/code-export-utils/__test__/test-files/select-window.side similarity index 100% rename from packages/code-export-java-junit/__test__/test-files/select-window.side rename to packages/code-export-utils/__test__/test-files/select-window.side diff --git a/packages/code-export-java-junit/__test__/test-files/single-suite.side b/packages/code-export-utils/__test__/test-files/single-suite.side similarity index 100% rename from packages/code-export-java-junit/__test__/test-files/single-suite.side rename to packages/code-export-utils/__test__/test-files/single-suite.side diff --git a/packages/code-export-java-junit/__test__/test-files/single-test.side b/packages/code-export-utils/__test__/test-files/single-test.side similarity index 100% rename from packages/code-export-java-junit/__test__/test-files/single-test.side rename to packages/code-export-utils/__test__/test-files/single-test.side diff --git a/packages/code-export-java-junit/__test__/test-files/test-case-reuse.side b/packages/code-export-utils/__test__/test-files/test-case-reuse.side similarity index 100% rename from packages/code-export-java-junit/__test__/test-files/test-case-reuse.side rename to packages/code-export-utils/__test__/test-files/test-case-reuse.side From 37ff30574d8fdabe2e53e00011fb6bcec3244404 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Tue, 18 Jun 2019 16:14:38 +0300 Subject: [PATCH 56/99] Fixed typo --- .../src/__snapshots__/index.spec.js.snap | 16 ++++++++-------- packages/code-export-python-pytest/src/hook.js | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap b/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap index f8d548a3bc..e810ec16c1 100644 --- a/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap +++ b/packages/code-export-python-pytest/__test__/src/__snapshots__/index.spec.js.snap @@ -18,7 +18,7 @@ class TestLogin(): self.vars = {} def teardown_method(self, method): - self.driver.quit(); + self.driver.quit() def test_validcredentials(self): self.driver.get(\\"http://the-internet.herokuapp.com/login\\") @@ -57,7 +57,7 @@ class TestControlflow(): self.vars = {} def teardown_method(self, method): - self.driver.quit(); + self.driver.quit() def test_controlflowif(self): self.vars[\\"myVar\\"] = self.driver.execute_script(\\"return 'a'\\") @@ -130,7 +130,7 @@ class TestLogin(): self.vars = {} def teardown_method(self, method): - self.driver.quit(); + self.driver.quit() def login(self): self.driver.get(\\"https://the-internet.herokuapp.com/\\") @@ -170,7 +170,7 @@ class TestDefaultSuite(): self.vars = {} def teardown_method(self, method): - self.driver.quit(); + self.driver.quit() def wait_for_window(self, timeout = 2): time.sleep(round(timeout / 1000)) @@ -211,7 +211,7 @@ class TestDefaultSuite(): self.vars = {} def teardown_method(self, method): - self.driver.quit(); + self.driver.quit() def wait_for_window(self, timeout = 2): time.sleep(round(timeout / 1000)) @@ -260,7 +260,7 @@ class TestLogin(): self.vars = {} def teardown_method(self, method): - self.driver.quit(); + self.driver.quit() def test_login(self): self.driver.get(\\"http://the-internet.herokuapp.com/login\\") @@ -291,7 +291,7 @@ class TestValidcredentials(): self.vars = {} def teardown_method(self, method): - self.driver.quit(); + self.driver.quit() def login(self): self.driver.get(\\"https://the-internet.herokuapp.com/\\") @@ -326,7 +326,7 @@ class TestSelectwindow(): self.vars = {} def teardown_method(self, method): - self.driver.quit(); + self.driver.quit() def wait_for_window(self, timeout = 2): time.sleep(round(timeout / 1000)) diff --git a/packages/code-export-python-pytest/src/hook.js b/packages/code-export-python-pytest/src/hook.js index 7d5a57ceb0..0094baad14 100644 --- a/packages/code-export-python-pytest/src/hook.js +++ b/packages/code-export-python-pytest/src/hook.js @@ -58,7 +58,7 @@ function afterEach() { startingSyntax: { commands: [ { level: 0, statement: 'def teardown_method(self, method):' }, - { level: 1, statement: 'self.driver.quit();' }, + { level: 1, statement: 'self.driver.quit()' }, ], }, endingSyntax: { From d2ab44ced031aa6dceee629f107608ad4b5893c4 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Tue, 18 Jun 2019 16:16:26 +0300 Subject: [PATCH 57/99] First pass on code export for JS Mocha. Still a WIP. --- .../code-export-javascript-mocha/.babelrc | 13 + .../src/__snapshots__/index.spec.js.snap | 352 +++ .../__test__/src/command.spec.js | 1068 +++++++++ .../__test__/src/index.spec.js | 129 + .../__test__/src/location.spec.js | 98 + .../__test__/src/selection.spec.js | 59 + .../code-export-javascript-mocha/package.json | 26 + .../src/command.js | 929 ++++++++ .../code-export-javascript-mocha/src/hook.js | 145 ++ .../code-export-javascript-mocha/src/index.js | 131 ++ .../src/location.js | 60 + .../src/selection.js | 49 + .../code-export-javascript-mocha/yarn.lock | 2095 +++++++++++++++++ packages/code-export/package.json | 3 +- packages/code-export/src/index.js | 1 + 15 files changed, 5157 insertions(+), 1 deletion(-) create mode 100644 packages/code-export-javascript-mocha/.babelrc create mode 100644 packages/code-export-javascript-mocha/__test__/src/__snapshots__/index.spec.js.snap create mode 100644 packages/code-export-javascript-mocha/__test__/src/command.spec.js create mode 100644 packages/code-export-javascript-mocha/__test__/src/index.spec.js create mode 100644 packages/code-export-javascript-mocha/__test__/src/location.spec.js create mode 100644 packages/code-export-javascript-mocha/__test__/src/selection.spec.js create mode 100644 packages/code-export-javascript-mocha/package.json create mode 100644 packages/code-export-javascript-mocha/src/command.js create mode 100644 packages/code-export-javascript-mocha/src/hook.js create mode 100644 packages/code-export-javascript-mocha/src/index.js create mode 100644 packages/code-export-javascript-mocha/src/location.js create mode 100644 packages/code-export-javascript-mocha/src/selection.js create mode 100644 packages/code-export-javascript-mocha/yarn.lock diff --git a/packages/code-export-javascript-mocha/.babelrc b/packages/code-export-javascript-mocha/.babelrc new file mode 100644 index 0000000000..bd80a8410e --- /dev/null +++ b/packages/code-export-javascript-mocha/.babelrc @@ -0,0 +1,13 @@ + { + "presets": [ + ["@babel/preset-env", + { + "targets": { + "node": "8" + } + }] + ], + "plugins": [ + "@babel/plugin-proposal-object-rest-spread" + ] + } diff --git a/packages/code-export-javascript-mocha/__test__/src/__snapshots__/index.spec.js.snap b/packages/code-export-javascript-mocha/__test__/src/__snapshots__/index.spec.js.snap new file mode 100644 index 0000000000..f8d548a3bc --- /dev/null +++ b/packages/code-export-javascript-mocha/__test__/src/__snapshots__/index.spec.js.snap @@ -0,0 +1,352 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Code Export Java JUnit Selenium should export a suite 1`] = ` +"# Generated by Selenium IDE +import pytest +import time +import json +from selenium import webdriver +from selenium.webdriver.common.by import By +from selenium.webdriver.common.action_chains import ActionChains +from selenium.webdriver.support import expected_conditions +from selenium.webdriver.support.wait import WebDriverWait +from selenium.webdriver.common.keys import Keys + +class TestLogin(): + def setup_method(self, method): + self.driver = webdriver.Firefox() + self.vars = {} + + def teardown_method(self, method): + self.driver.quit(); + + def test_validcredentials(self): + self.driver.get(\\"http://the-internet.herokuapp.com/login\\") + self.driver.set_window_size(1440, 1177) + self.driver.find_element(By.ID, \\"username\\").send_keys(\\"tomsmith\\") + self.driver.find_element(By.ID, \\"password\\").send_keys(\\"SuperSecretPassword!\\") + self.driver.find_element(By.CSS_SELECTOR, \\"#login button\\").click() + assert self.driver.find_element(By.CSS_SELECTOR, \\".flash.success\\").text == \\"You logged into a secure area!\\\\\\\\n×\\" + + def test_invalidcredentials(self): + self.driver.get(\\"http://the-internet.herokuapp.com/login\\") + self.driver.set_window_size(1440, 1177) + self.driver.find_element(By.ID, \\"username\\").send_keys(\\"blah\\") + self.driver.find_element(By.ID, \\"password\\").send_keys(\\"blah\\") + self.driver.find_element(By.CSS_SELECTOR, \\"#login button\\").click() + assert self.driver.find_element(By.ID, \\"flash\\").text == \\"Your username is invalid!\\\\\\\\n×\\" + +" +`; + +exports[`Code Export Java JUnit Selenium should export a suite that uses control flow commands 1`] = ` +"# Generated by Selenium IDE +import pytest +import time +import json +from selenium import webdriver +from selenium.webdriver.common.by import By +from selenium.webdriver.common.action_chains import ActionChains +from selenium.webdriver.support import expected_conditions +from selenium.webdriver.support.wait import WebDriverWait +from selenium.webdriver.common.keys import Keys + +class TestControlflow(): + def setup_method(self, method): + self.driver = webdriver.Firefox() + self.vars = {} + + def teardown_method(self, method): + self.driver.quit(); + + def test_controlflowif(self): + self.vars[\\"myVar\\"] = self.driver.execute_script(\\"return 'a'\\") + if self.driver.execute_script(\\"return (arguments[0] === 'a')\\", self.vars[\\"myVar\\"]): + self.vars[\\"output\\"] = self.driver.execute_script(\\"return 'a'\\") + elif self.driver.execute_script(\\"return (arguments[0] === 'b')\\", self.vars[\\"myVar\\"]): + self.vars[\\"output\\"] = self.driver.execute_script(\\"return 'b'\\") + else: + self.vars[\\"output\\"] = self.driver.execute_script(\\"return 'c'\\") + assert(self.vars[\\"output\\"] == \\"a\\") + + def test_controlflowelseif(self): + self.vars[\\"myVar\\"] = self.driver.execute_script(\\"return 'b'\\") + if self.driver.execute_script(\\"return (arguments[0] === 'a')\\", self.vars[\\"myVar\\"]): + self.vars[\\"output\\"] = self.driver.execute_script(\\"return 'a'\\") + elif self.driver.execute_script(\\"return (arguments[0] === 'b')\\", self.vars[\\"myVar\\"]): + self.vars[\\"output\\"] = self.driver.execute_script(\\"return 'b'\\") + else: + self.vars[\\"output\\"] = self.driver.execute_script(\\"return 'c'\\") + assert(self.vars[\\"output\\"] == \\"b\\") + + def test_controlflowelse(self): + self.vars[\\"myVar\\"] = self.driver.execute_script(\\"return 'c'\\") + if self.driver.execute_script(\\"return (arguments[0] === 'a')\\", self.vars[\\"myVar\\"]): + self.vars[\\"output\\"] = self.driver.execute_script(\\"return 'a'\\") + elif self.driver.execute_script(\\"return (arguments[0] === 'b')\\", self.vars[\\"myVar\\"]): + self.vars[\\"output\\"] = self.driver.execute_script(\\"return 'b'\\") + else: + self.vars[\\"output\\"] = self.driver.execute_script(\\"return 'c'\\") + assert(self.vars[\\"output\\"] == \\"c\\") + + def test_controlflowdo(self): + self.vars[\\"check\\"] = self.driver.execute_script(\\"return 1\\") + condition = True + while condition: + self.vars[\\"check\\"] = self.driver.execute_script(\\"return arguments[0] + 1\\", self.vars[\\"check\\"]) + condition = self.driver.execute_script(\\"return (arguments[0] < 3)\\", self.vars[\\"check\\"]) + assert(self.vars[\\"check\\"] == 3) + + def test_controlflowtimes(self): + self.vars[\\"check\\"] = self.driver.execute_script(\\"return 1\\") + for i in range(0, 2): + self.vars[\\"check\\"] = self.driver.execute_script(\\"return arguments[0] + 1\\", self.vars[\\"check\\"]) + assert(self.vars[\\"check\\"] == 3) + + def test_controlflowwhile(self): + self.vars[\\"check\\"] = self.driver.execute_script(\\"return 1\\") + while self.driver.execute_script(\\"return (arguments[0] < 3)\\", self.vars[\\"check\\"]): + self.vars[\\"check\\"] = self.driver.execute_script(\\"return arguments[0] + 1\\", self.vars[\\"check\\"]) + assert(self.vars[\\"check\\"] == 3) + +" +`; + +exports[`Code Export Java JUnit Selenium should export a suite with a reused test method 1`] = ` +"# Generated by Selenium IDE +import pytest +import time +import json +from selenium import webdriver +from selenium.webdriver.common.by import By +from selenium.webdriver.common.action_chains import ActionChains +from selenium.webdriver.support import expected_conditions +from selenium.webdriver.support.wait import WebDriverWait +from selenium.webdriver.common.keys import Keys + +class TestLogin(): + def setup_method(self, method): + self.driver = webdriver.Firefox() + self.vars = {} + + def teardown_method(self, method): + self.driver.quit(); + + def login(self): + self.driver.get(\\"https://the-internet.herokuapp.com/\\") + self.driver.find_element(By.LINK_TEXT, \\"Form Authentication\\").click() + self.driver.find_element(By.ID, \\"username\\").send_keys(self.vars[\\"username\\"]) + self.driver.find_element(By.ID, \\"password\\").send_keys(self.vars[\\"password\\"]) + self.driver.find_element(By.CSS_SELECTOR, \\".fa\\").click() + + def test_invalidcredentials(self): + self.vars[\\"username\\"] = \\"blah\\" + self.vars[\\"password\\"] = \\"blah\\" + self.login() + + def test_validcredentials(self): + self.vars[\\"username\\"] = \\"tomsmith\\" + self.vars[\\"password\\"] = \\"SuperSecretPassword!\\" + self.login() + +" +`; + +exports[`Code Export Java JUnit Selenium should export a suite with commands that open a new window inside of a reused test method 1`] = ` +"# Generated by Selenium IDE +import pytest +import time +import json +from selenium import webdriver +from selenium.webdriver.common.by import By +from selenium.webdriver.common.action_chains import ActionChains +from selenium.webdriver.support import expected_conditions +from selenium.webdriver.support.wait import WebDriverWait +from selenium.webdriver.common.keys import Keys + +class TestDefaultSuite(): + def setup_method(self, method): + self.driver = webdriver.Firefox() + self.vars = {} + + def teardown_method(self, method): + self.driver.quit(); + + def wait_for_window(self, timeout = 2): + time.sleep(round(timeout / 1000)) + wh_now = self.driver.window_handles + wh_then = self.vars[\\"window_handles\\"] + if len(wh_now) > len(wh_then): + return set(wh_now).difference(set(wh_then)).pop() + + def selectwindow(self): + self.driver.get(\\"http://the-internet.herokuapp.com/windows\\") + self.vars[\\"window_handles\\"] = self.driver.window_handles + self.driver.find_element(By.LINK_TEXT, \\"Click Here\\").click() + self.vars[\\"win9425\\"] = self.wait_for_window(2000) + self.driver.switch_to.window(self.vars[\\"win9425\\"]) + assert self.driver.title == \\"New Window\\" + + def test_reuse(self): + self.selectwindow() + +" +`; + +exports[`Code Export Java JUnit Selenium should export a suite with just one new window util method when there are multiple commands that open a new window 1`] = ` +"# Generated by Selenium IDE +import pytest +import time +import json +from selenium import webdriver +from selenium.webdriver.common.by import By +from selenium.webdriver.common.action_chains import ActionChains +from selenium.webdriver.support import expected_conditions +from selenium.webdriver.support.wait import WebDriverWait +from selenium.webdriver.common.keys import Keys + +class TestDefaultSuite(): + def setup_method(self, method): + self.driver = webdriver.Firefox() + self.vars = {} + + def teardown_method(self, method): + self.driver.quit(); + + def wait_for_window(self, timeout = 2): + time.sleep(round(timeout / 1000)) + wh_now = self.driver.window_handles + wh_then = self.vars[\\"window_handles\\"] + if len(wh_now) > len(wh_then): + return set(wh_now).difference(set(wh_then)).pop() + + def selectwindow(self): + self.driver.get(\\"http://the-internet.herokuapp.com/windows\\") + self.vars[\\"window_handles\\"] = self.driver.window_handles + self.driver.find_element(By.LINK_TEXT, \\"Click Here\\").click() + self.vars[\\"win9425\\"] = self.wait_for_window(2000) + self.driver.switch_to.window(self.vars[\\"win9425\\"]) + assert self.driver.title == \\"New Window\\" + + def test_reuse(self): + self.selectwindow() + + def test_selectwindow(self): + self.driver.get(\\"http://the-internet.herokuapp.com/windows\\") + self.vars[\\"window_handles\\"] = self.driver.window_handles + self.driver.find_element(By.LINK_TEXT, \\"Click Here\\").click() + self.vars[\\"win9425\\"] = self.wait_for_window(2000) + self.driver.switch_to.window(self.vars[\\"win9425\\"]) + assert self.driver.title == \\"New Window\\" + +" +`; + +exports[`Code Export Java JUnit Selenium should export a test 1`] = ` +"# Generated by Selenium IDE +import pytest +import time +import json +from selenium import webdriver +from selenium.webdriver.common.by import By +from selenium.webdriver.common.action_chains import ActionChains +from selenium.webdriver.support import expected_conditions +from selenium.webdriver.support.wait import WebDriverWait +from selenium.webdriver.common.keys import Keys + +class TestLogin(): + def setup_method(self, method): + self.driver = webdriver.Firefox() + self.vars = {} + + def teardown_method(self, method): + self.driver.quit(); + + def test_login(self): + self.driver.get(\\"http://the-internet.herokuapp.com/login\\") + self.driver.set_window_size(1440, 1177) + self.driver.find_element(By.ID, \\"username\\").send_keys(\\"tomsmith\\") + self.driver.find_element(By.ID, \\"password\\").send_keys(\\"SuperSecretPassword!\\") + self.driver.find_element(By.CSS_SELECTOR, \\"#login button\\").click() + assert self.driver.find_element(By.CSS_SELECTOR, \\".flash.success\\").text == \\"You logged into a secure area!\\\\\\\\n×\\" + +" +`; + +exports[`Code Export Java JUnit Selenium should export a test with a reused test method 1`] = ` +"# Generated by Selenium IDE +import pytest +import time +import json +from selenium import webdriver +from selenium.webdriver.common.by import By +from selenium.webdriver.common.action_chains import ActionChains +from selenium.webdriver.support import expected_conditions +from selenium.webdriver.support.wait import WebDriverWait +from selenium.webdriver.common.keys import Keys + +class TestValidcredentials(): + def setup_method(self, method): + self.driver = webdriver.Firefox() + self.vars = {} + + def teardown_method(self, method): + self.driver.quit(); + + def login(self): + self.driver.get(\\"https://the-internet.herokuapp.com/\\") + self.driver.find_element(By.LINK_TEXT, \\"Form Authentication\\").click() + self.driver.find_element(By.ID, \\"username\\").send_keys(self.vars[\\"username\\"]) + self.driver.find_element(By.ID, \\"password\\").send_keys(self.vars[\\"password\\"]) + self.driver.find_element(By.CSS_SELECTOR, \\".fa\\").click() + + def test_validcredentials(self): + self.vars[\\"username\\"] = \\"tomsmith\\" + self.vars[\\"password\\"] = \\"SuperSecretPassword!\\" + self.login() + +" +`; + +exports[`Code Export Java JUnit Selenium should export a test with commands that open a new window 1`] = ` +"# Generated by Selenium IDE +import pytest +import time +import json +from selenium import webdriver +from selenium.webdriver.common.by import By +from selenium.webdriver.common.action_chains import ActionChains +from selenium.webdriver.support import expected_conditions +from selenium.webdriver.support.wait import WebDriverWait +from selenium.webdriver.common.keys import Keys + +class TestSelectwindow(): + def setup_method(self, method): + self.driver = webdriver.Firefox() + self.vars = {} + + def teardown_method(self, method): + self.driver.quit(); + + def wait_for_window(self, timeout = 2): + time.sleep(round(timeout / 1000)) + wh_now = self.driver.window_handles + wh_then = self.vars[\\"window_handles\\"] + if len(wh_now) > len(wh_then): + return set(wh_now).difference(set(wh_then)).pop() + + def test_selectwindow(self): + self.driver.get(\\"http://the-internet.herokuapp.com/\\") + self.driver.set_window_size(1260, 1027) + self.driver.find_element(By.LINK_TEXT, \\"Multiple Windows\\").click() + self.vars[\\"window_handles\\"] = self.driver.window_handles + self.driver.find_element(By.LINK_TEXT, \\"Click Here\\").click() + self.vars[\\"win9625\\"] = self.wait_for_window(2000) + self.vars[\\"root\\"] = self.driver.current_window_handle + self.driver.switch_to.window(self.vars[\\"win9625\\"]) + assert self.driver.title == \\"New Window\\" + self.driver.switch_to.window(self.vars[\\"root\\"]) + assert self.driver.title == \\"The Internet\\" + +" +`; diff --git a/packages/code-export-javascript-mocha/__test__/src/command.spec.js b/packages/code-export-javascript-mocha/__test__/src/command.spec.js new file mode 100644 index 0000000000..f8a52c6304 --- /dev/null +++ b/packages/code-export-javascript-mocha/__test__/src/command.spec.js @@ -0,0 +1,1068 @@ +// Licensed to the Software Freedom Conservancy (SFC) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The SFC licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import Command from '../../src/command' +import { + Commands, + ControlFlowCommandNames, +} from '../../../selenium-ide/src/neo/models/Command' +import { opts } from '../../src/index' +import exporter from 'code-export-utils' + +const commandPrefixPadding = opts.commandPrefixPadding + +async function prettify(command, { fullPayload } = {}) { + const commandBlock = await Command.emit(command) + const result = exporter.prettify(commandBlock, { + commandPrefixPadding, + }) + return fullPayload ? result : result.body +} + +describe('command code emitter', () => { + it('should emit all known commands', () => { + let result = [] + Commands.array.forEach(command => { + if (!Command.canEmit(command)) { + result.push(command) + } + }) + expect(() => { + if (result.length) { + if (result.length === 1) { + throw new Error(`${result[0]} has no emitter, write one!`) + } else { + throw new Error(`No emitters for ${result.join(', ')}. Write them!`) + } + } + }).not.toThrow() + }) + it('should emit `add selection` command', () => { + const command = { + command: 'addSelection', + target: 'css=select', + value: 'label=A label', + } + return expect(prettify(command)).resolves.toBe( + `const dropdown = await driver.findElement(By.css("select"))\nawait dropdown.findElement(By.xpath("//option[. = 'A label']")).click()` + ) + }) + it('should emit `assert` command', () => { + const command = { + command: 'assert', + target: 'varrrName', + value: 'blah', + } + expect(prettify(command)).resolves.toBe( + `assert(vars["varrrName"] == "blah")` + ) + }) + it('should emit `assert alert` command', () => { + const command = { + command: 'assertAlert', + target: 'an alert', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `assert(await driver.switchTo().alert().getText() == "an alert")` + ) + }) + it('should emit `assert checked` command', () => { + const command = { + command: 'assertChecked', + target: 'id=check', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `assert(await driver.findElement(By.id("check")).isSelected())` + ) + }) + it('should emit `assert confirmation` command', () => { + const command = { + command: 'assertConfirmation', + target: 'a confirmation', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `assert(await driver.switchTo().alert().getText() == "a confirmation")` + ) + }) + it('should emit `assert editable` command', () => { + const command = { + command: 'assertEditable', + target: 'id=text', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `const element = await driver.findElement(By.id("text"))\nassert(await element.isEnabled())` + ) + }) + it('should emit `assert element present` command', () => { + const command = { + command: 'assertElementPresent', + target: 'id=element', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `const elements = await driver.findElements(By.id("element"))\nassert(elements.length)` + ) + }) + it('should emit `assert element not present` command', () => { + const command = { + command: 'assertElementNotPresent', + target: 'id=element', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `const elements = await driver.findElements(By.id("element"))\nassert(!elements.length)` + ) + }) + it('should emit `assert not checked` command', () => { + const command = { + command: 'assertNotChecked', + target: 'id=check', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `assert(!await driver.findElement(By.id("check")).isSelected())` + ) + }) + it('should emit `assert not editable` command', () => { + const command = { + command: 'assertNotEditable', + target: 'id=text', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `const element = await driver.findElement(By.id("text"))\nassert(!await element.isEnabled())` + ) + }) + it('should emit `assert not selected value` command', () => { + const command = { + command: 'assertNotSelectedValue', + target: 'id=select', + value: 'test', + } + return expect(prettify(command)).resolves.toBe( + `const value = await driver.findElement(By.id("select")).getAttribute("value")\nassert(value !== "test")` + ) + }) + it('should emit `assert not text` command', () => { + const command = { + command: 'assertNotText', + target: 'id=test', + value: 'text', + } + return expect(prettify(command)).resolves.toBe( + `const text = await driver.findElement(By.id("test")).getText()\nassert(text !== "text")` + ) + }) + it('should emit `assert prompt` command', () => { + const command = { + command: 'assertPrompt', + target: 'a prompt', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `assert(await driver.switchTo().alert().getText() == "a prompt")` + ) + }) + it("should emit 'assert selected label' command", () => { + const command = { + command: 'assertSelectedLabel', + target: 'id=test', + value: 'test', + } + return expect(prettify(command)).resolves.toBe( + 'const element = await driver.findElement(By.id("test")).getAttribute("value")\nconst locator = `option[@value=\'${element}\']`\nconst selectedText = element.findElement(By.xpath(locator)).getText()\nassert(selectedText == "test")' + ) + }) + it('should emit `assert selected value` command', () => { + const command = { + command: 'assertSelectedValue', + target: 'id=select', + value: 'test', + } + return expect(prettify(command)).resolves.toBe( + `const value = await driver.findElement(By.id("select")).getAttribute("value")\nassert(value == "test")` + ) + }) + it('should emit `assert text` command', () => { + const command = { + command: 'assertText', + target: 'id=test', + value: 'some text that should be here', + } + expect(prettify(command)).resolves.toBe( + `assert(await driver.findElement(By.id("test")).getText() == "some text that should be here")` + ) + }) + it('should emit `assert title` command', () => { + const command = { + command: 'assertTitle', + target: 'example title', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `assert(await driver.getTitle() == "example title")` + ) + }) + it.only('should emit `assert value` command', () => { + const command = { + command: 'assertValue', + target: 'id=select', + value: 'test', + } + return expect(prettify(command)).resolves.toBe( + `value = self.driver.find_element(By.ID, "select").get_attribute("value")\nassert value == "test"` + ) + }) + it('should emit `click` command', () => { + const command = { + command: 'click', + target: 'link=button', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `self.driver.find_element(By.LINK_TEXT, "button").click()` + ) + }) + it('should emit `click at` command', () => { + const command = { + command: 'clickAt', + target: 'link=button', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `self.driver.find_element(By.LINK_TEXT, "button").click()` + ) + }) + it('should emit `check` command', () => { + const command = { + command: 'check', + target: 'id=f', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `element = self.driver.find_element(By.ID, "f")\nif element.is_selected() != True: element.click()` + ) + }) + it('should emit `close` command', () => { + const command = { + command: 'close', + target: '', + value: '', + } + return expect(prettify(command)).resolves.toBe(`self.driver.close()`) + }) + it('should emit `do` command', () => { + const command = { + command: ControlFlowCommandNames.do, + target: '', + value: '', + } + return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ + body: 'condition = True\nwhile condition:', + endingLevel: 1, + }) + }) + it('should emit `double click` command', () => { + const command = { + command: 'doubleClick', + target: 'link=button', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `element = self.driver.find_element(By.LINK_TEXT, "button")\nactions = ActionChains(driver)\nactions.double_click(element).perform()` + ) + }) + it('should emit `double click at` command', () => { + const command = { + command: 'doubleClickAt', + target: 'link=button', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `element = self.driver.find_element(By.LINK_TEXT, "button")\nactions = ActionChains(driver)\nactions.double_click(element).perform()` + ) + }) + it('should emit `drag and drop to object` command', () => { + const command = { + command: 'dragAndDropToObject', + target: 'link=dragged', + value: 'link=dropped', + } + return expect(prettify(command)).resolves.toBe( + `dragged = self.driver.find_element(By.LINK_TEXT, "dragged")\ndropped = self.driver.find_element(By.LINK_TEXT, "dropped")\nactions = ActionChains(driver)\nactions.drag_and_drop(dragged, dropped).perform()` + ) + }) + it('should emit `echo` command', () => { + const command = { + command: 'echo', + target: 'blah', + value: '', + } + return expect(prettify(command)).resolves.toBe(`print(str("blah"))`) + }) + it('should emit `echo` command with variables', () => { + const command = { + command: 'echo', + target: '${blah}', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `print(str(self.vars["blah"]))` + ) + }) + it('should emit `edit content` command', () => { + const command = { + command: 'editContent', + target: 'id=contentEditable', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `element = self.driver.find_element(By.ID, "contentEditable")\nself.driver.execute_script("if(arguments[0].contentEditable === 'true') {arguments[0].innerText = ''}", element)` + ) + }) + it('should emit `else` command', () => { + const command = { + command: ControlFlowCommandNames.else, + target: 'true', + value: '', + } + return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ + body: `else:`, + endingLevel: 1, + }) + }) + it('should emit `else if` command', () => { + const command = { + command: ControlFlowCommandNames.elseIf, + target: 'true', + value: '', + } + return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ + body: `elif self.driver.execute_script("return (true)"):`, + endingLevel: 1, + }) + }) + it('should emit `end` command', async () => { + const command = { + command: ControlFlowCommandNames.end, + target: '', + value: '', + } + return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ + endingLevel: 0, + skipEmitting: true, + }) + }) + it('should emit `execute script` command', () => { + const command = { + command: 'executeScript', + target: 'javascript', + value: 'myVar', + } + return expect(prettify(command)).resolves.toBe( + `self.vars["myVar"] = self.driver.execute_script("javascript")` + ) + }) + it('should emit `execute script` command with return string value', () => { + const command = { + command: 'executeScript', + target: 'return "a"', + value: 'myVar', + } + return expect(prettify(command)).resolves.toBe( + `self.vars["myVar"] = self.driver.execute_script("return 'a'")` + ) + }) + it('should emit `execute async script` command', () => { + const command = { + command: 'executeAsyncScript', + target: 'javascript', + value: 'myVar', + } + return expect(prettify(command)).resolves.toBe( + `self.vars["myVar"] = self.driver.execute_async_script("var callback = arguments[arguments.length - 1];javascript.then(callback).catch(callback);")` + ) + }) + it('should emit `forEach` command', () => { + const command = { + command: ControlFlowCommandNames.forEach, + target: 'collection', + value: 'iteratorVar', + } + return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ + body: `collection = self.vars["collection"]\nfor entry in collection:\n${commandPrefixPadding}self.vars["iteratorVar"] = entry`, + endingLevel: 1, + }) + }) + it('should emit `if` command', () => { + const command = { + command: ControlFlowCommandNames.if, + target: 'true', + value: '', + } + return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ + body: `if self.driver.execute_script("return (true)"):`, + endingLevel: 1, + }) + }) + it('should emit `mouse down` command', () => { + const command = { + command: 'mouseDown', + target: 'id=button', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `element = self.driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).click_and_hold().perform()` + ) + }) + it('should emit `mouse down at` event', () => { + const command = { + command: 'mouseDownAt', + target: 'id=button', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `element = self.driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).click_and_hold().perform()` + ) + }) + it('should emit `mouse move` event', () => { + const command = { + command: 'mouseMove', + target: 'id=button', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `element = self.driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).perform()` + ) + }) + it('should emit `mouse move at` event', () => { + const command = { + command: 'mouseMoveAt', + target: 'id=button', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `element = self.driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).perform()` + ) + }) + it('should emit `mouse out` event', () => { + const command = { + command: 'mouseOut', + target: 'id=button', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `element = self.driver.find_element(By.CSS_SELECTOR, "body")\nactions = ActionChains(driver)\nactions.move_to_element(element, 0, 0).perform()` + ) + }) + it('should emit `mouse over` event', () => { + const command = { + command: 'mouseOver', + target: 'id=button', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `element = self.driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).perform()` + ) + }) + it('should emit `mouse up` event', () => { + const command = { + command: 'mouseUp', + target: 'id=button', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `element = self.driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).release().perform()` + ) + }) + it('should emit `mouse up at` event', () => { + const command = { + command: 'mouseUpAt', + target: 'id=button', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `element = self.driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).release().perform()` + ) + }) + it('should emit `open` with absolute url', () => { + const command = { + command: 'open', + target: 'https://www.seleniumhq.org/', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `self.driver.get("${command.target}")` + ) + }) + it('should emit `pause` command', () => { + const command = { + command: 'pause', + target: '300', + value: '', + } + return expect(prettify(command)).resolves.toBe(`time.sleep(300)`) + }) + it('should emit `remove selection` command', () => { + const command = { + command: 'removeSelection', + target: 'css=select', + value: 'label=A label', + } + return expect(prettify(command)).resolves.toBe( + `dropdown = self.driver.find_element(By.CSS_SELECTOR, "select")\ndropdown.find_element(By.XPATH, "//option[. = 'A label']").click()` + ) + }) + it('should emit `repeatIf` command', () => { + const command = { + command: ControlFlowCommandNames.repeatIf, + target: 'true', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `condition = self.driver.execute_script("return (true)")` + ) + }) + it('should emit `run` command', () => { + const command = { + command: 'run', + target: 'some test case', + value: '', + } + return expect(prettify(command)).resolves.toBe(`self.sometestcase()`) + }) + it('should emit `run script` command', () => { + const command = { + command: 'runScript', + target: "alert('test');alert('Im annoying');", + value: '', + } + return expect(prettify(command)).resolves.toBe( + `self.driver.execute_script("alert('test');alert('Im annoying');")` + ) + }) + it('should emit `select` command', () => { + const command = { + command: 'select', + target: 'css=select', + value: 'label=A label', + } + return expect(prettify(command)).resolves.toBe( + `dropdown = self.driver.find_element(By.CSS_SELECTOR, "select")\ndropdown.find_element(By.XPATH, "//option[. = 'A label']").click()` + ) + }) + it('should emit `select frame` to select the top frame', () => { + const command = { + command: 'selectFrame', + target: 'relative=top', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `self.driver.switch_to.default_content()` + ) + }) + it('should fail to emit `select window` by using unknown locator', () => { + const command = { + command: 'selectWindow', + target: 'notExisting=something', + value: '', + } + return expect(prettify(command)).rejects.toThrow( + 'Can only emit `select window` using handles' + ) + }) + it('should emit `select window` to select a window by handle', () => { + const command = { + command: 'selectWindow', + target: 'handle=${window}', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `self.driver.switch_to.window(self.vars["window"])` + ) + }) + it('should emit `select window` to select a window by name', () => { + const command = { + command: 'selectWindow', + target: 'name=window', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `self.driver.switch_to.window("window")` + ) + }) + it('should emit `select window` to select a window by the local keyword', () => { + const command = { + command: 'selectWindow', + target: 'win_ser_local', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `self.driver.switch_to.window(self.driver.window_handles[0])` + ) + }) + it('should emit `select window` to select a window by implicit index', () => { + const command = { + command: 'selectWindow', + target: 'win_ser_12', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `self.driver.switch_to.window(self.driver.window_handles[12])` + ) + }) + it('should emit `send keys` command', () => { + const command = { + command: 'sendKeys', + target: 'id=input', + value: 'example input', + } + return expect(prettify(command)).resolves.toBe( + `self.driver.find_element(By.ID, "input").send_keys("example input")` + ) + }) + it('should emit `send keys` command with a variable input', () => { + const command = { + command: 'sendKeys', + target: 'id=input', + value: '${blah}', + } + return expect(prettify(command)).resolves.toBe( + `self.driver.find_element(By.ID, "input").send_keys(self.vars["blah"])` + ) + }) + it('should emit `send keys` command with a key press', () => { + const command = { + command: 'sendKeys', + target: 'id=input', + value: 'SuperSecretPassword!${KEY_ENTER}', + } + return expect(prettify(command)).resolves.toBe( + `self.driver.find_element(By.ID, "input").send_keys("SuperSecretPassword!", Keys.ENTER)` + ) + }) + it('should emit `set speed`', () => { + expect(prettify({ command: 'setSpeed' })).resolves.toBe( + 'print("`set speed` is a no-op in code export, use `pause` instead")' + ) + }) + it('should emit `setWindowSize`', () => { + const command = { + command: 'setWindowSize', + target: '1440x1177', + value: '', + } + expect(prettify(command)).resolves.toBe( + `self.driver.set_window_size(1440, 1177)` + ) + }) + it('should skip playback supported commands, that are not supported in webdriver', () => { + return Promise.all([ + expect(prettify({ command: 'answerOnNextPrompt' })).resolves.toBe( + undefined + ), + expect( + prettify({ command: 'chooseCancelOnNextConfirmation' }) + ).resolves.toBe(undefined), + expect(prettify({ command: 'chooseCancelOnNextPrompt' })).resolves.toBe( + undefined + ), + expect(prettify({ command: 'chooseOkOnNextConfirmation' })).resolves.toBe( + undefined + ), + ]) + }) + it('should emit `store` command', () => { + const command = { + command: 'store', + target: 'some value', + value: 'myVar', + } + return expect(prettify(command)).resolves.toBe( + `self.vars["myVar"] = "some value"` + ) + }) + it('should emit `store attribute` command', () => { + const command = { + command: 'storeAttribute', + target: 'xpath=button[3]@id', + value: 'myVar', + } + return expect(prettify(command)).resolves.toBe( + `attribute = self.driver.find_element(By.XPATH, "button[3]").get_attribute("id")\nself.vars["myVar"] = attribute` + ) + }) + it('should emit `store text` command', () => { + const command = { + command: 'storeText', + target: 'id=someElement', + value: 'myVar', + } + return expect(prettify(command)).resolves.toBe( + `self.vars["myVar"] = self.driver.find_element(By.ID, "someElement").text` + ) + }) + it('should emit `store json` command', () => { + const command = { + command: 'storeJson', + target: '[{"a":0}]', + value: 'myVar', + } + return expect(prettify(command)).resolves.toBe( + `self.vars["myVar"] = json.loads('[{"a":0}]')` + ) + }) + it('should emit `store title` command', () => { + const command = { + command: 'storeTitle', + target: '', + value: 'myVar', + } + return expect(prettify(command)).resolves.toBe( + `self.vars["myVar"] = self.driver.title` + ) + }) + it('should emit `store value` command', () => { + const command = { + command: 'storeValue', + target: 'id=someElement', + value: 'myVar', + } + return expect(prettify(command)).resolves.toBe( + `self.vars["myVar"] = self.driver.find_element(By.ID, "someElement").get_attribute("value")` + ) + }) + it('should emit `store window handle` command', () => { + const command = { + command: 'storeWindowHandle', + target: 'windowName', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `self.vars["windowName"] = self.driver.current_window_handle` + ) + }) + it('should emit `store xpath count` command', () => { + const command = { + command: 'storeXpathCount', + target: 'xpath=button', + value: 'myVar', + } + return expect(prettify(command)).resolves.toBe( + `self.vars["myVar"] = len(self.driver.find_elements(By.XPATH, "button"))` + ) + }) + it('should emit `submit` command', () => { + const command = { + command: 'submit', + target: 'id=form', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `raise Exception("\`submit\` is not a supported command in Selenium Webself.driver. Please re-record the step in the IDE.")` + ) + }) + it('should emit `times` command', () => { + const command = { + command: ControlFlowCommandNames.times, + target: '5', + value: '', + } + return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ + body: `for i in range(0, 5):`, + endingLevel: 1, + }) + }) + it('should emit `type` command', () => { + const command = { + command: 'type', + target: 'id=input', + value: 'example input', + } + expect(prettify(command)).resolves.toBe( + `self.driver.find_element(By.ID, "input").send_keys("example input")` + ) + }) + it('should emit `uncheck` command', () => { + const command = { + command: 'uncheck', + target: 'id=f', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `element = self.driver.find_element(By.ID, "f")\nif element.is_selected: element.click()` + ) + }) + it('should emit `verify` command', () => { + const command = { + command: 'verify', + target: 'varrrName', + value: 'blah', + } + expect(prettify(command)).resolves.toBe( + `assert(self.vars["varrrName"] == "blah")` + ) + }) + it('should emit `verify checked` command', () => { + const command = { + command: 'verifyChecked', + target: 'id=check', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `assert self.driver.find_element(By.ID, "check").is_selected() is True` + ) + }) + it('should emit `verify editable` command', () => { + const command = { + command: 'verifyEditable', + target: 'id=text', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `element = self.driver.find_element(By.ID, "text")\nassert element.is_enabled() is True` + ) + }) + it('should emit `verify element present` command', () => { + const command = { + command: 'verifyElementPresent', + target: 'id=element', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `elements = self.driver.find_elements(By.ID, "element")\nassert len(elements) > 0` + ) + }) + it('should emit `verify element not present` command', () => { + const command = { + command: 'verifyElementNotPresent', + target: 'id=element', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `elements = self.driver.find_elements(By.ID, "element")\nassert len(elements) == 0` + ) + }) + it('should emit `verify not checked` command', () => { + const command = { + command: 'verifyNotChecked', + target: 'id=check', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `assert self.driver.find_element(By.ID, "check").is_selected() is False` + ) + }) + it('should emit `verify not editable` command', () => { + const command = { + command: 'verifyNotEditable', + target: 'id=text', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `element = self.driver.find_element(By.ID, "text")\nassert element.is_enabled() is False` + ) + }) + it('should emit `verify not selected value` command', () => { + const command = { + command: 'verifyNotSelectedValue', + target: 'id=select', + value: 'test', + } + return expect(prettify(command)).resolves.toBe( + `value = self.driver.find_element(By.ID, "select").get_attribute("value")\nassert value != "test"` + ) + }) + it('should emit `verify not text` command', () => { + const command = { + command: 'verifyNotText', + target: 'id=test', + value: 'text', + } + return expect(prettify(command)).resolves.toBe( + `text = self.driver.find_element(By.ID, "test").text\nassert text != "text"` + ) + }) + it("should emit 'verify selected label' command", () => { + const command = { + command: 'verifySelectedLabel', + target: 'id=test', + value: 'test', + } + return expect(prettify(command)).resolves.toBe( + `element = self.driver.find_element(By.ID, "test")\nlocator = "option[@value='{}']".format(element.get_attribute("value"))\nselected_text = element.find_element(By.XPATH, locator).text\nassert selected_text == "test"` + ) + }) + it('should emit `verify value` command', () => { + const command = { + command: 'verifyValue', + target: 'id=select', + value: 'test', + } + return expect(prettify(command)).resolves.toBe( + `value = self.driver.find_element(By.ID, "select").get_attribute("value")\nassert value == "test"` + ) + }) + it('should emit `verify selected value` command', () => { + const command = { + command: 'verifySelectedValue', + target: 'id=select', + value: 'test', + } + return expect(prettify(command)).resolves.toBe( + `value = self.driver.find_element(By.ID, "select").get_attribute("value")\nassert value == "test"` + ) + }) + it('should emit `verify text` command', () => { + const command = { + command: 'verifyText', + target: 'id=test', + value: 'some text that should be here', + } + expect(prettify(command)).resolves.toBe( + `assert self.driver.find_element(By.ID, "test").text == "some text that should be here"` + ) + }) + it('should emit `verify title` command', () => { + const command = { + command: 'verifyTitle', + target: 'example title', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `assert self.driver.title == "example title"` + ) + }) + it('should emit `waitForElementEditable` command', () => { + const command = { + command: 'waitForElementEditable', + target: 'css=#blah', + value: '5000', + } + return expect(prettify(command)).resolves.toBe( + `WebDriverWait(self.driver, 5000).until(expected_conditions.element_to_be_clickable((By.CSS_SELECTOR, "#blah")))` + ) + }) + it('should emit `waitForElementPresent` command', () => { + const command = { + command: 'waitForElementPresent', + target: 'css=#blah', + value: '5000', + } + return expect(prettify(command)).resolves.toBe( + `WebDriverWait(self.driver, 5000).until(expected_conditions.presence_of_element_located((By.CSS_SELECTOR, "#blah")))` + ) + }) + it('should emit `waitForElementVisible` command', () => { + const command = { + command: 'waitForElementVisible', + target: 'css=#blah', + value: '5000', + } + return expect(prettify(command)).resolves.toBe( + `WebDriverWait(self.driver, 5000).until(expected_conditions.visibility_of_element_located((By.CSS_SELECTOR, "#blah")))` + ) + }) + it('should emit `waitForElementNotEditable` command', () => { + const command = { + command: 'waitForElementNotEditable', + target: 'css=#blah', + value: '5000', + } + return expect(prettify(command)).resolves.toBe( + `WebDriverWait(self.driver, 5000).until_not(expected_conditions.element_to_be_clickable((By.CSS_SELECTOR, "#blah")))` + ) + }) + it('should emit `waitForElementNotPresent` command', () => { + const command = { + command: 'waitForElementNotPresent', + target: 'css=#blah', + value: '5000', + } + return expect(prettify(command)).resolves.toBe( + `WebDriverWait(self.driver, 5000).until(expected_conditions.invisibility_of_element_located((By.CSS_SELECTOR, "#blah")))` + ) + }) + it('should emit `waitForElementNotVisible` command', () => { + const command = { + command: 'waitForElementNotVisible', + target: 'css=#blah', + value: '5000', + } + return expect(prettify(command)).resolves.toBe( + `WebDriverWait(self.driver, 5000).until(expected_conditions.invisibility_of_element_located((By.CSS_SELECTOR, "#blah")))` + ) + }) + it('should emit `answer on visible prompt` command', () => { + const command = { + command: 'webdriverAnswerOnVisiblePrompt', + target: 'an answer', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `alert = self.driver.switch_to.alert\nalert.send_keys("an answer")\nalert.accept()` + ) + }) + it('should emit `choose cancel on visible prompt` command', () => { + const command = { + command: 'webdriverChooseCancelOnVisiblePrompt', + target: '', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `self.driver.switch_to.alert.dismiss()` + ) + }) + it('should emit `choose ok on visible confirmation` command', () => { + const command = { + command: 'webdriverChooseOkOnVisibleConfirmation', + target: '', + value: '', + } + return expect(prettify(command)).resolves.toBe( + `self.driver.switch_to.alert.accept()` + ) + }) + it('should emit `while` command', () => { + const command = { + command: ControlFlowCommandNames.while, + target: 'true', + value: '', + } + return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ + body: `while self.driver.execute_script("return (true)"):`, + endingLevel: 1, + }) + }) + it('should emit new window handling, if command opens a new window', () => { + const command = { + command: 'click', + target: 'css=button', + value: '', + opensWindow: true, + windowHandleName: 'newWin', + windowTimeout: 2000, + } + return expect(prettify(command)).resolves.toBe( + `self.vars["window_handles"] = self.driver.window_handles\nself.driver.find_element(By.CSS_SELECTOR, "button").click()\nself.vars["newWin"] = self.wait_for_window(2000)` + ) + }) +}) diff --git a/packages/code-export-javascript-mocha/__test__/src/index.spec.js b/packages/code-export-javascript-mocha/__test__/src/index.spec.js new file mode 100644 index 0000000000..8cd53e859b --- /dev/null +++ b/packages/code-export-javascript-mocha/__test__/src/index.spec.js @@ -0,0 +1,129 @@ +// Licensed to the Software Freedom Conservancy (SFC) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The SFC licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import fs from 'fs' +import path from 'path' +import { emitTest, emitSuite, _emitMethod, _findTestByName } from '../../src' +import { normalizeTestsInSuite } from '../../../selenium-ide/src/neo/IO/normalize' + +function readFile(filename) { + return JSON.parse( + fs.readFileSync( + path.join( + __dirname, + '..', + '..', + '..', + 'code-export-utils', + '__test__', + 'test-files', + filename + ) + ) + ) +} + +describe.skip('Code Export Java JUnit Selenium', () => { + it('should export a test', async () => { + const project = readFile('single-test.side') + const results = await emitTest({ + baseUrl: project.url, + test: project.tests[0], + tests: project.tests, + }) + expect(results.body).toBeDefined() + expect(results.body).toMatchSnapshot() + }) + it('should export a suite', async () => { + const project = normalizeProject(readFile('single-suite.side')) + const results = await emitSuite({ + baseUrl: project.url, + suite: project.suites[0], + tests: project.tests, + }) + expect(results.body).toBeDefined() + expect(results.body).toMatchSnapshot() + }) + it('should export a test with a reused test method', async () => { + const project = normalizeProject(readFile('test-case-reuse.side')) + const results = await emitTest({ + baseUrl: project.url, + test: project.tests[1], + tests: project.tests, + }) + expect(results.body).toBeDefined() + expect(results.body).toMatchSnapshot() + }) + it('should export a suite with a reused test method', async () => { + const project = normalizeProject(readFile('test-case-reuse.side')) + const results = await emitSuite({ + baseUrl: project.url, + suite: project.suites[0], + tests: project.tests, + }) + expect(results.body).toBeDefined() + expect(results.body).toMatchSnapshot() + }) + it('should export a suite that uses control flow commands', async () => { + const project = normalizeProject(readFile('control-flow-suite.side')) + const results = await emitSuite({ + baseUrl: project.url, + suite: project.suites[0], + tests: project.tests, + }) + expect(results.body).toBeDefined() + expect(results.body).toMatchSnapshot() + }) + it('should export a test with commands that open a new window', async () => { + const project = normalizeProject(readFile('select-window.side')) + const results = await emitTest({ + baseUrl: project.url, + test: project.tests[0], + tests: project.tests, + }) + expect(results.body).toBeDefined() + expect(results.body).toMatchSnapshot() + }) + it('should export a suite with commands that open a new window inside of a reused test method', async () => { + const project = normalizeProject(readFile('nested-select-window.side')) + const results = await emitSuite({ + baseUrl: project.url, + suite: project.suites[0], + tests: project.tests, + }) + expect(results.body).toBeDefined() + expect(results.body).toMatchSnapshot() + }) + it('should export a suite with just one new window util method when there are multiple commands that open a new window', async () => { + const project = normalizeProject(readFile('nested-select-window-v2.side')) + const results = await emitSuite({ + baseUrl: project.url, + suite: project.suites[0], + tests: project.tests, + }) + expect(results.body).toBeDefined() + expect(results.body).toMatchSnapshot() + }) +}) + +function normalizeProject(project) { + let _project = { ...project } + _project.suites.forEach(suite => { + normalizeTestsInSuite({ suite, tests: _project.tests }) + }) + return _project +} diff --git a/packages/code-export-javascript-mocha/__test__/src/location.spec.js b/packages/code-export-javascript-mocha/__test__/src/location.spec.js new file mode 100644 index 0000000000..0769b45e4f --- /dev/null +++ b/packages/code-export-javascript-mocha/__test__/src/location.spec.js @@ -0,0 +1,98 @@ +// Licensed to the Software Freedom Conservancy (SFC) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The SFC licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import { emit } from '../../src/location' + +describe('location code emitter', () => { + it('should fail to emit empty string', () => { + return expect(() => { + emit('') + }).toThrow("Locator can't be empty") + }) + it('should fail to emit unknown locator', () => { + return expect(() => { + emit('notExists=element') + }).toThrow('Unknown locator notExists') + }) + it('should emit id locator', () => { + const type = 'id' + const selector = 'someId' + return expect(emit(`${type}=${selector}`)).resolves.toEqual( + `By.id("someId")` + ) + }) + it('should emit link locator', () => { + const type = 'link' + const selector = 'someLink' + return expect(emit(`${type}=${selector}`)).resolves.toEqual( + `By.linkText("someLink")` + ) + }) + it('should emit linkText locator', () => { + const type = 'linkText' + const selector = 'someLink' + return expect(emit(`${type}=${selector}`)).resolves.toEqual( + `By.linkText("someLink")` + ) + }) + it('should emit partialLinkText locator', () => { + const type = 'partialLinkText' + const selector = 'someLink' + return expect(emit(`${type}=${selector}`)).resolves.toEqual( + `By.partialLinkText("someLink")` + ) + }) + it('should emit css locator', () => { + const type = 'css' + const selector = 'someCss' + return expect(emit(`${type}=${selector}`)).resolves.toEqual( + `By.css("someCss")` + ) + }) + it('should emit css locator with `=` sign', () => { + const type = 'css' + const selector = 'a[title=JScript]' + return expect(emit(`${type}=${selector}`)).resolves.toEqual( + `By.css("a[title=JScript]")` + ) + }) + it('should escape quotes in locator strings', () => { + const type = 'css' + const selector = 'a[title="escaped"]' + return expect(emit(`${type}=${selector}`)).resolves.toEqual( + `By.css("a[title=\\"escaped\\"]")` + ) + }) + it('should emit xpath locator', () => { + const type = 'xpath' + const selector = 'someXpath' + return expect(emit(`${type}=${selector}`)).resolves.toEqual( + `By.xpath("someXpath")` + ) + }) + it('should emit implicit xpath locator', () => { + const selector = '//test=xpath' + return expect(emit(selector)).resolves.toEqual(`By.xpath("//test=xpath")`) + }) + it('should emit name locator', () => { + const type = 'name' + const selector = 'someName' + return expect(emit(`${type}=${selector}`)).resolves.toEqual( + `By.name("someName")` + ) + }) +}) diff --git a/packages/code-export-javascript-mocha/__test__/src/selection.spec.js b/packages/code-export-javascript-mocha/__test__/src/selection.spec.js new file mode 100644 index 0000000000..ee6785ea15 --- /dev/null +++ b/packages/code-export-javascript-mocha/__test__/src/selection.spec.js @@ -0,0 +1,59 @@ +// Licensed to the Software Freedom Conservancy (SFC) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The SFC licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import { emit } from '../../src/selection' + +describe('selection location code emitter', () => { + it('should fail to emit unknown selection locator', () => { + return expect(() => { + emit('notExists=element') + }).toThrow('Unknown selection locator notExists') + }) + it('should assume when no selector is given that it is the label locator', () => { + return expect(emit('label')).resolves.toEqual( + `By.xpath("//option[. = 'label']")` + ) + }) + it('should emit label locator', () => { + const type = 'label' + const selector = 'a label' + return expect(emit(`${type}=${selector}`)).resolves.toEqual( + `By.xpath("//option[. = '${selector}']")` + ) + }) + it('should emit id locator', () => { + const type = 'id' + const selector = 'someId' + return expect(emit(`${type}=${selector}`)).resolves.toEqual( + `By.css("*[id='${selector}']")` + ) + }) + it('should emit value locator', () => { + const type = 'value' + const selector = 'someValue' + return expect(emit(`${type}=${selector}`)).resolves.toEqual( + `By.css("*[value='${selector}']")` + ) + }) + it('should emit index locator', () => { + const type = 'index' + const selector = '2' + return expect(emit(`${type}=${selector}`)).resolves.toEqual( + `By.css("*:nth-child(${selector})")` + ) + }) +}) diff --git a/packages/code-export-javascript-mocha/package.json b/packages/code-export-javascript-mocha/package.json new file mode 100644 index 0000000000..d50b95817a --- /dev/null +++ b/packages/code-export-javascript-mocha/package.json @@ -0,0 +1,26 @@ +{ + "name": "code-export-javascript-mocha", + "version": "3.9.0", + "description": "Export Selenium IDE project contents to JavaScript Mocha", + "repository": "https://github.com/SeleniumHQ/selenium-ide", + "keywords": [ + "selenium", + "ide", + "export" + ], + "license": "Apache-2.0", + "private": true, + "scripts": { + "build": "babel -d dist src --ignore=__test__", + "watch": "yarn build -w" + }, + "main": "dist/index.js", + "devDependencies": { + "@babel/cli": "^7.4.4", + "@babel/plugin-proposal-object-rest-spread": "^7.4.4", + "@babel/preset-env": "^7.4.5" + }, + "dependencies": { + "code-export-utils": "^3.9.0" + } +} diff --git a/packages/code-export-javascript-mocha/src/command.js b/packages/code-export-javascript-mocha/src/command.js new file mode 100644 index 0000000000..abf4190b9f --- /dev/null +++ b/packages/code-export-javascript-mocha/src/command.js @@ -0,0 +1,929 @@ +// Licensed to the Software Freedom Conservancy (SFC) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The SFC licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import exporter from 'code-export-utils' +import location from './location' +import selection from './selection' + +export const emitters = { + addSelection: emitSelect, + answerOnNextPrompt: skip, + assert: emitAssert, + assertAlert: emitAssertAlert, + assertChecked: emitVerifyChecked, + assertConfirmation: emitAssertAlert, + assertEditable: emitVerifyEditable, + assertElementPresent: emitVerifyElementPresent, + assertElementNotPresent: emitVerifyElementNotPresent, + assertNotChecked: emitVerifyNotChecked, + assertNotEditable: emitVerifyNotEditable, + assertNotSelectedValue: emitVerifyNotSelectedValue, + assertNotText: emitVerifyNotText, + assertPrompt: emitAssertAlert, + assertSelectedLabel: emitVerifySelectedLabel, + assertSelectedValue: emitVerifyValue, + assertValue: emitVerifyValue, + assertText: emitVerifyText, + assertTitle: emitVerifyTitle, + check: emitCheck, + chooseCancelOnNextConfirmation: skip, + chooseCancelOnNextPrompt: skip, + chooseOkOnNextConfirmation: skip, + click: emitClick, + clickAt: emitClick, + close: emitClose, + debugger: skip, + do: emitControlFlowDo, + doubleClick: emitDoubleClick, + doubleClickAt: emitDoubleClick, + dragAndDropToObject: emitDragAndDrop, + echo: emitEcho, + editContent: emitEditContent, + else: emitControlFlowElse, + elseIf: emitControlFlowElseIf, + end: emitControlFlowEnd, + executeScript: emitExecuteScript, + executeAsyncScript: emitExecuteAsyncScript, + forEach: emitControlFlowForEach, + if: emitControlFlowIf, + mouseDown: emitMouseDown, + mouseDownAt: emitMouseDown, + mouseMove: emitMouseMove, + mouseMoveAt: emitMouseMove, + mouseOver: emitMouseMove, + mouseOut: emitMouseOut, + mouseUp: emitMouseUp, + mouseUpAt: emitMouseUp, + open: emitOpen, + pause: emitPause, + removeSelection: emitSelect, + repeatIf: emitControlFlowRepeatIf, + run: emitRun, + runScript: emitRunScript, + select: emitSelect, + selectFrame: emitSelectFrame, + selectWindow: emitSelectWindow, + sendKeys: emitSendKeys, + setSpeed: emitSetSpeed, + setWindowSize: emitSetWindowSize, + store: emitStore, + storeAttribute: emitStoreAttribute, + storeJson: emitStoreJson, + storeText: emitStoreText, + storeTitle: emitStoreTitle, + storeValue: emitStoreValue, + storeWindowHandle: emitStoreWindowHandle, + storeXpathCount: emitStoreXpathCount, + submit: emitSubmit, + times: emitControlFlowTimes, + type: emitType, + uncheck: emitUncheck, + verify: emitAssert, + verifyChecked: emitVerifyChecked, + verifyEditable: emitVerifyEditable, + verifyElementPresent: emitVerifyElementPresent, + verifyElementNotPresent: emitVerifyElementNotPresent, + verifyNotChecked: emitVerifyNotChecked, + verifyNotEditable: emitVerifyNotEditable, + verifyNotSelectedValue: emitVerifyNotSelectedValue, + verifyNotText: emitVerifyNotText, + verifySelectedLabel: emitVerifySelectedLabel, + verifySelectedValue: emitVerifyValue, + verifyText: emitVerifyText, + verifyTitle: emitVerifyTitle, + verifyValue: emitVerifyValue, + waitForElementEditable: emitWaitForElementEditable, + waitForElementPresent: emitWaitForElementPresent, + waitForElementVisible: emitWaitForElementVisible, + waitForElementNotEditable: emitWaitForElementNotEditable, + waitForElementNotPresent: emitWaitForElementNotPresent, + waitForElementNotVisible: emitWaitForElementNotVisible, + webdriverAnswerOnVisiblePrompt: emitAnswerOnNextPrompt, + webdriverChooseCancelOnVisibleConfirmation: emitChooseCancelOnNextConfirmation, + webdriverChooseCancelOnVisiblePrompt: emitChooseCancelOnNextConfirmation, + webdriverChooseOkOnVisibleConfirmation: emitChooseOkOnNextConfirmation, + while: emitControlFlowWhile, +} + +exporter.register.preprocessors(emitters) + +function register(command, emitter) { + exporter.register.emitter({ command, emitter, emitters }) +} + +function emit(command) { + return exporter.emit.command(command, emitters[command.command], { + variableLookup, + emitNewWindowHandling, + }) +} + +function canEmit(commandName) { + return !!emitters[commandName] +} + +function variableLookup(varName) { + return `vars["${varName}"]` +} + +function variableSetter(varName, value) { + return varName ? `vars["${varName}"] = ${value}` : '' +} + +function emitWaitForWindow() { + const generateMethodDeclaration = name => { + return `async function ${name}(timeout = 2):` + } + const commands = [ + { level: 0, statement: 'await driver.sleep(timeout / 1000)' }, + { level: 0, statement: 'const handlesThen = vars["windowHandles"]' }, + { + level: 0, + statement: 'const handlesNow = await driver.getAllWindowHandles()', + }, + { level: 0, statement: 'if (handlesNow.length > handlesThen.length) {' }, + { + level: 1, + statement: + 'return handlesNow.find(handle => (!handlesThen.includes(handle))', + }, + { level: 0, statement: '}' }, + { + level: 0, + statement: 'throw new Error("New window did not appear before timeout")', + }, + ] + return Promise.resolve({ + name: 'waitForWindow', + commands, + generateMethodDeclaration, + }) +} + +async function emitNewWindowHandling(command, emittedCommand) { + return Promise.resolve( + `vars["windowHandles"] = await driver.getAllWindowHandles()\n${await emittedCommand}\nvars["${ + command.windowHandleName + }"] = waitForWindow(${command.windowTimeout})` + ) +} + +function emitAssert(varName, value) { + return Promise.resolve(`assert(vars["${varName}"] == "${value}")`) +} + +function emitAssertAlert(alertText) { + return Promise.resolve( + `assert(await driver.switchTo().alert().getText() == "${alertText}")` + ) +} + +function emitAnswerOnNextPrompt(textToSend) { + const commands = [ + { level: 0, statement: 'const alert = await driver.switchTo().alert()' }, + { level: 0, statement: `await alert.sendKeys("${textToSend}")` }, + { level: 0, statement: 'await alert.accept()' }, + ] + return Promise.resolve({ commands }) +} + +async function emitCheck(locator) { + const commands = [ + { + level: 0, + statement: `const element = await driver.findElement(${await location.emit( + locator + )})`, + }, + { + level: 0, + statement: 'if (await element.isSelected()) await element.click()', + }, + ] + return Promise.resolve({ commands }) +} + +function emitChooseCancelOnNextConfirmation() { + return Promise.resolve(`await driver.switchTo().alert().dismiss()`) +} + +function emitChooseOkOnNextConfirmation() { + return Promise.resolve(`await driver.switchTo().alert().accept()`) +} + +async function emitClick(target) { + return Promise.resolve( + `await driver.findElement(${await location.emit(target)}).click()` + ) +} + +async function emitClose() { + return Promise.resolve(`await driver.close()`) +} + +function generateExpressionScript(script) { + const scriptString = script.script.replace(/"/g, "'") + return `await driver.executeScript("return (${scriptString})"${generateScriptArguments( + script + )})` +} + +function generateScriptArguments(script) { + return `${script.argv.length ? ', ' : ''}${script.argv + .map(varName => `vars["${varName}"]`) + .join(',')}` +} + +function emitControlFlowDo() { + return Promise.resolve({ + commands: [{ level: 0, statement: 'do {' }], + endingLevelAdjustment: 1, + }) +} + +function emitControlFlowElse() { + return Promise.resolve({ + commands: [{ level: 0, statement: '} else {' }], + startingLevelAdjustment: -1, + endingLevelAdjustment: +1, + }) +} + +function emitControlFlowElseIf(script) { + return Promise.resolve({ + commands: [ + { + level: 0, + statement: `} else if (!!${generateExpressionScript(script)}) {`, + }, + ], + startingLevelAdjustment: -1, + endingLevelAdjustment: +1, + }) +} + +function emitControlFlowEnd() { + return Promise.resolve({ + commands: [{ level: 0, statement: `}` }], + startingLevelAdjustment: -1, + }) +} + +function emitControlFlowIf(script) { + return Promise.resolve({ + commands: [ + { level: 0, statement: `if (${generateExpressionScript(script)}) {` }, + ], + endingLevelAdjustment: 1, + }) +} + +function emitControlFlowForEach(collectionVarName, iteratorVarName) { + return Promise.resolve({ + commands: [ + { + level: 0, + statement: `const collection = vars["${collectionVarName}"]`, + }, + { + level: 0, + statement: `for (let i = 0; i < collection.length - 1; i++) {`, + }, + { + level: 1, + statement: `vars["${iteratorVarName}"] = vars["${collectionVarName}"][i]`, + }, + ], + }) +} + +function emitControlFlowRepeatIf(script) { + return Promise.resolve({ + commands: [ + { + level: 0, + statement: `} while(!!${generateExpressionScript(script)})`, + }, + ], + endingLevelAdjustment: -1, + }) +} + +function emitControlFlowTimes(target) { + const commands = [ + { + level: 0, + statement: `const times = ${target}`, + }, + { + level: 0, + statement: `for(let i = 0; i < times; i++) {`, + }, + ] + return Promise.resolve({ commands, endingLevelAdjustment: 1 }) +} + +function emitControlFlowWhile(script) { + return Promise.resolve({ + commands: [ + { level: 0, statement: `while(!!${generateExpressionScript(script)}) {` }, + ], + endingLevelAdjustment: 1, + }) +} + +async function emitDoubleClick(target) { + const commands = [ + { + level: 0, + statement: `const element = await driver.findElement(${await location.emit( + target + )})`, + }, + { + level: 0, + statement: + 'await driver.actions({ bridge: true}).double_click(element).perform()', + }, + ] + return Promise.resolve({ commands }) +} + +async function emitDragAndDrop(dragged, dropped) { + const commands = [ + { + level: 0, + statement: `const dragged = await driver.findElement(${await location.emit( + dragged + )})`, + }, + { + level: 0, + statement: `const dropped = await driver.findElement(${await location.emit( + dropped + )})`, + }, + { + level: 0, + statement: + 'await driver.actions({ bridge: true }).drag_and_drop(dragged, dropped).perform()', + }, + ] + return Promise.resolve({ commands }) +} + +async function emitEcho(message) { + const _message = message.startsWith('vars[') ? message : `"${message}"` + return Promise.resolve(`console.log("${_message}")`) +} + +async function emitEditContent(locator, content) { + const commands = [ + { + level: 0, + statement: `const element = await driver.findElement(${await location.emit( + locator + )})`, + }, + { + level: 0, + statement: `await driver.executeScript("if(arguments[0].contentEditable === 'true') {arguments[0].innerText = '${content}'}", element)`, + }, + ] + return Promise.resolve({ commands }) +} + +async function emitExecuteScript(script, varName) { + const scriptString = script.script.replace(/"/g, "'") + const result = `await driver.executeScript("${scriptString}"${generateScriptArguments( + script + )})` + return Promise.resolve(variableSetter(varName, result)) +} + +async function emitExecuteAsyncScript(script, varName) { + const result = `await driver.execute_async_script("var callback = arguments[arguments.length - 1];${ + script.script + }.then(callback).catch(callback);${generateScriptArguments(script)}")` + return Promise.resolve(variableSetter(varName, result)) +} + +async function emitMouseDown(locator) { + const commands = [ + { + level: 0, + statement: `const element = await driver.findElement(${await location.emit( + locator + )})`, + }, + { + level: 0, + statement: + 'await driver.actions({ bridge: true }).move_to_element(element).click_and_hold().perform()', + }, + ] + return Promise.resolve({ commands }) +} + +async function emitMouseMove(locator) { + const commands = [ + { + level: 0, + statement: `const element = await driver.findElement(${await location.emit( + locator + )})`, + }, + { + level: 0, + statement: + 'await driver.actions({ bridge: true }).move_to_element(element).perform()', + }, + ] + return Promise.resolve({ commands }) +} + +async function emitMouseOut() { + const commands = [ + { + level: 0, + statement: `const element = await driver.findElement(By.CSS_SELECTOR, "body")`, + }, + { + level: 0, + statement: + 'await driver.actions({ bridge: true }).move_to_element(element, 0, 0).perform()', + }, + ] + return Promise.resolve({ commands }) +} + +async function emitMouseUp(locator) { + const commands = [ + { + level: 0, + statement: `const element = await driver.findElement(${await location.emit( + locator + )})`, + }, + { + level: 0, + statement: + 'await driver.actions({ bridge: true }).move_to_element(element).release().perform()', + }, + ] + return Promise.resolve({ commands }) +} + +function emitOpen(target) { + const url = /^(file|http|https):\/\//.test(target) + ? `"${target}"` + : `"${global.baseUrl}${target}"` + return Promise.resolve(`await driver.get(${url})`) +} + +async function emitPause(time) { + const commands = [{ level: 0, statement: `await driver.sleep(${time})` }] + return Promise.resolve({ commands }) +} + +async function emitRun(testName) { + return Promise.resolve(`${exporter.parsers.sanitizeName(testName)}()`) +} + +async function emitRunScript(script) { + return Promise.resolve( + `await driver.executeScript("${script.script}${generateScriptArguments( + script + )}")` + ) +} + +async function emitSetWindowSize(size) { + const [width, height] = size.split('x') + return Promise.resolve(`await driver.setRect(${width}, ${height})`) +} + +async function emitSelect(selectElement, option) { + const commands = [ + { + level: 0, + statement: `const dropdown = await driver.findElement(${await location.emit( + selectElement + )})`, + }, + { + level: 0, + statement: `await dropdown.findElement(${await selection.emit( + option + )}).click()`, + }, + ] + return Promise.resolve({ commands }) +} + +async function emitSelectFrame(frameLocation) { + if (frameLocation === 'relative=top' || frameLocation === 'relative=parent') { + return Promise.resolve('await driver.switchTo().defaultContent()') + } else if (/^index=/.test(frameLocation)) { + return Promise.resolve( + `await driver.switchTo().frame(${Math.floor( + frameLocation.split('index=')[1] + )})` + ) + } else { + return Promise.resolve({ + commands: [ + { + level: 0, + statement: `const element = await driver.findElement(${await location.emit( + frameLocation + )})`, + }, + { level: 0, statement: 'await driver.switchTo().frame(element)' }, + ], + }) + } +} + +async function emitSelectWindow(windowLocation) { + if (/^handle=/.test(windowLocation)) { + return Promise.resolve( + `await driver.switchTo().window(${windowLocation.split('handle=')[1]})` + ) + } else if (/^name=/.test(windowLocation)) { + return Promise.resolve( + `await driver.switchTo().window("${windowLocation.split('name=')[1]}")` + ) + } else if (/^win_ser_/.test(windowLocation)) { + if (windowLocation === 'win_ser_local') { + return Promise.resolve({ + commands: [ + { + level: 0, + statement: + 'await driver.switchTo().window(await driver.getAllWindowHandles()[0])', + }, + ], + }) + } else { + const index = parseInt(windowLocation.substr('win_ser_'.length)) + return Promise.resolve({ + commands: [ + { + level: 0, + statement: `await driver.switchTo().window(await driver.getAllWindowHandles()[${index}])`, + }, + ], + }) + } + } else { + return Promise.reject( + new Error('Can only emit `select window` using handles') + ) + } +} + +function generateSendKeysInput(value) { + if (typeof value === 'object') { + return value + .map(s => { + if (s.startsWith('vars[')) { + return s + } else if (s.startsWith('Key[')) { + const key = s.match(/\['(.*)'\]/)[1] + return `Key.${key}` + } else { + return `"${s}"` + } + }) + .join(', ') + } else { + if (value.startsWith('vars[')) { + return value + } else { + return `"${value}"` + } + } +} + +async function emitSendKeys(target, value) { + return Promise.resolve( + `await driver.findElement(${await location.emit( + target + )}).sendKeys(${generateSendKeysInput(value)})` + ) +} + +function emitSetSpeed() { + return Promise.resolve( + 'console.log("`set speed` is a no-op in code export, use `pause` instead")' + ) +} + +async function emitStore(value, varName) { + return Promise.resolve(variableSetter(varName, `"${value}"`)) +} + +async function emitStoreAttribute(locator, varName) { + const attributePos = locator.lastIndexOf('@') + const elementLocator = locator.slice(0, attributePos) + const attributeName = locator.slice(attributePos + 1) + const commands = [ + { + level: 0, + statement: `const attribute = await driver.findElement(${await location.emit( + elementLocator + )}).getAttribute("${attributeName}")`, + }, + { level: 0, statement: `${variableSetter(varName, 'attribute')}` }, + ] + return Promise.resolve({ commands }) +} + +async function emitStoreJson(json, varName) { + return Promise.resolve(variableSetter(varName, `JSON.parse('${json}')`)) +} + +async function emitStoreText(locator, varName) { + const result = `await driver.findElement(${await location.emit( + locator + )}).getText()` + return Promise.resolve(variableSetter(varName, result)) +} + +async function emitStoreTitle(_, varName) { + return Promise.resolve(variableSetter(varName, 'await driver.getTitle()')) +} + +async function emitStoreValue(locator, varName) { + const result = `await driver.findElement(${await location.emit( + locator + )}).getAttribute("value")` + return Promise.resolve(variableSetter(varName, result)) +} + +async function emitStoreWindowHandle(varName) { + return Promise.resolve( + variableSetter(varName, 'await driver.getWindowHandle') + ) +} + +async function emitStoreXpathCount(locator, varName) { + const result = `await driver.findElements(${await location.emit( + locator + )}).length` + return Promise.resolve(variableSetter(varName, result)) +} + +async function emitSubmit(_locator) { + return Promise.resolve( + `raise Exception("\`submit\` is not a supported command in Selenium Webdriver. Please re-record the step in the IDE.")` + ) +} + +async function emitType(target, value) { + return Promise.resolve( + `await driver.findElement(${await location.emit( + target + )}).sendKeys(${generateSendKeysInput(value)})` + ) +} + +async function emitUncheck(locator) { + const commands = [ + { + level: 0, + statement: `const element = await driver.findElement(${await location.emit( + locator + )})`, + }, + { + level: 0, + statement: 'if (await element.isSelected()) await element.click()', + }, + ] + return Promise.resolve({ commands }) +} + +async function emitVerifyChecked(locator) { + return Promise.resolve( + `assert(await driver.findElement(${await location.emit( + locator + )}).isSelected())` + ) +} + +async function emitVerifyEditable(locator) { + const commands = [ + { + level: 0, + statement: `const element = await driver.findElement(${await location.emit( + locator + )})`, + }, + { level: 0, statement: 'assert(await element.isEnabled())' }, + ] + return Promise.resolve({ commands }) +} + +async function emitVerifyElementPresent(locator) { + const commands = [ + { + level: 0, + statement: `const elements = await driver.findElements(${await location.emit( + locator + )})`, + }, + { level: 0, statement: 'assert(elements.length)' }, + ] + return Promise.resolve({ commands }) +} + +async function emitVerifyElementNotPresent(locator) { + const commands = [ + { + level: 0, + statement: `const elements = await driver.findElements(${await location.emit( + locator + )})`, + }, + { level: 0, statement: 'assert(!elements.length)' }, + ] + return Promise.resolve({ commands }) +} + +async function emitVerifyNotChecked(locator) { + return Promise.resolve( + `assert(!await driver.findElement(${await location.emit( + locator + )}).isSelected())` + ) +} + +async function emitVerifyNotEditable(locator) { + const commands = [ + { + level: 0, + statement: `const element = await driver.findElement(${await location.emit( + locator + )})`, + }, + { level: 0, statement: 'assert(!await element.isEnabled())' }, + ] + return Promise.resolve({ commands }) +} + +async function emitVerifyNotSelectedValue(locator, expectedValue) { + const commands = [ + { + level: 0, + statement: `const value = await driver.findElement(${await location.emit( + locator + )}).getAttribute("value")`, + }, + { + level: 0, + statement: `assert(value !== "${exporter.emit.text(expectedValue)}")`, + }, + ] + return Promise.resolve({ commands }) +} + +async function emitVerifyNotText(locator, text) { + const commands = [ + { + level: 0, + statement: `const text = await driver.findElement(${await location.emit( + locator + )}).getText()`, + }, + { level: 0, statement: `assert(text !== "${exporter.emit.text(text)}")` }, + ] + return Promise.resolve({ commands }) +} + +async function emitVerifySelectedLabel(locator, labelValue) { + const commands = [ + { + level: 0, + statement: `const element = await driver.findElement(${await location.emit( + locator + )}).getAttribute("value")`, + }, + { + level: 0, + statement: "const locator = `option[@value='${element}']`", + }, + { + level: 0, + statement: + 'const selectedText = element.findElement(By.xpath(locator)).getText()', + }, + { level: 0, statement: `assert(selectedText == "${labelValue}")` }, + ] + return Promise.resolve({ + commands, + }) +} + +async function emitVerifyText(locator, text) { + const commands = [ + { + level: 0, + statement: `assert(await driver.findElement(${await location.emit( + locator + )}).getText() == "${exporter.emit.text(text)}")`, + }, + ] + return Promise.resolve({ commands }) +} + +async function emitVerifyValue(locator, value) { + const commands = [ + { + level: 0, + statement: `const value = await driver.findElement(${await location.emit( + locator + )}).getAttribute("value")`, + }, + { level: 0, statement: `assert(value == "${value}")` }, + ] + return Promise.resolve({ commands }) +} + +async function emitVerifyTitle(title) { + return Promise.resolve(`assert(await driver.getTitle() == "${title}")`) +} + +function skip() { + return Promise.resolve(undefined) +} + +async function emitWaitForElementPresent(locator, timeout) { + return Promise.resolve( + `await driver.wait(until.elementLocated(${await location.emit( + locator + )}), ${Math.floor(timeout)});` + ) +} + +async function emitWaitForElementNotPresent(locator, timeout) { + return Promise.resolve( + `await driver.wait(until.stalenessOf(await driver.findElement(${await location.emit( + locator + )})), ${Math.floor(timeout)});` + ) +} + +async function emitWaitForElementVisible(locator, timeout) { + return Promise.resolve( + `await driver.wait(until.elementIsVisible(await driver.findElement(${await location.emit( + locator + )})), ${Math.floor(timeout)});` + ) +} + +async function emitWaitForElementNotVisible(locator, timeout) { + return Promise.resolve( + `await driver.wait(until.elementIsNotVisible(await driver.findElement(${await location.emit( + locator + )})), ${Math.floor(timeout)});` + ) +} + +async function emitWaitForElementEditable(locator, timeout) { + return Promise.resolve( + `await driver.wait(until.elementIsEnabled(await driver.findElement(${await location.emit( + locator + )})), ${Math.floor(timeout)});` + ) +} + +async function emitWaitForElementNotEditable(locator, timeout) { + return Promise.resolve( + `await driver.wait(until.elementIsDisabled(await driver.findElement(${await location.emit( + locator + )})), ${Math.floor(timeout)});` + ) +} + +export default { + canEmit, + emit, + register, + extras: { emitWaitForWindow }, +} diff --git a/packages/code-export-javascript-mocha/src/hook.js b/packages/code-export-javascript-mocha/src/hook.js new file mode 100644 index 0000000000..1ddb084090 --- /dev/null +++ b/packages/code-export-javascript-mocha/src/hook.js @@ -0,0 +1,145 @@ +// Licensed to the Software Freedom Conservancy (SFC) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The SFC licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the specific language governing permissions and limitations +// under the License. + +import exporter from 'code-export-utils' + +const emitters = { + afterAll, + afterEach, + beforeAll, + beforeEach, + declareDependencies, + declareMethods: empty, + declareVariables, + inEachBegin: empty, + inEachEnd: empty, +} + +function generate(hookName) { + return new exporter.hook(emitters[hookName]()) +} + +export function generateHooks() { + let result = {} + Object.keys(emitters).forEach(hookName => { + result[hookName] = generate(hookName) + }) + return result +} + +function afterAll() { + const params = { + startingSyntax: { + commands: [{ level: 0, statement: 'afterAll(async function() {' }], + }, + endingSyntax: { + commands: [{ level: 0, statement: '})' }], + }, + registrationLevel: 1, + } + return params +} + +function afterEach() { + const params = { + startingSyntax: { + commands: [ + { level: 0, statement: 'afterEach(async function() {' }, + { level: 1, statement: 'await driver.quit();' }, + ], + }, + endingSyntax: { + commands: [{ level: 0, statement: '})' }], + }, + } + return params +} + +function beforeAll() { + const params = { + startingSyntax: { + commands: [{ level: 0, statement: 'beforeAll(async function() {' }], + }, + endingSyntax: { + commands: [{ level: 0, statement: '})' }], + }, + registrationLevel: 1, + } + return params +} + +function beforeEach() { + const params = { + startingSyntax: { + commands: [ + { level: 0, statement: 'beforeEach(async function() {' }, + { + level: 1, + statement: `driver = await new Builder().forBrowser('firefox').build()`, + }, + { level: 1, statement: 'vars = {}' }, + ], + }, + endingSyntax: { + commands: [{ level: 0, statement: '})' }], + }, + } + return params +} + +function declareDependencies() { + const params = { + startingSyntax: { + commands: [ + { + level: 0, + statement: `const { Builder, By, Key, until } = require('selenium-webdriver')`, + }, + { + level: 0, + statement: `const assert = require('assert')`, + }, + { + level: 0, + statement: '', + }, + ], + }, + } + return params +} + +function declareVariables() { + const params = { + startingSyntax: { + commands: [ + { + level: 0, + statement: `let driver`, + }, + { + level: 0, + statement: 'let vars', + }, + ], + }, + } + return params +} + +function empty() { + return {} +} diff --git a/packages/code-export-javascript-mocha/src/index.js b/packages/code-export-javascript-mocha/src/index.js new file mode 100644 index 0000000000..5f4ca1c79c --- /dev/null +++ b/packages/code-export-javascript-mocha/src/index.js @@ -0,0 +1,131 @@ +// Licensed to the Software Freedom Conservancy (SFC) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The SFC licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import exporter from 'code-export-utils' +import emitter from './command' +import location from './location' +import { generateHooks } from './hook' + +// Define language options +export const displayName = 'JavaScript Mocha' + +export let opts = {} +opts.emitter = emitter +opts.hooks = generateHooks() +opts.fileExtension = '.spec.js' +opts.commandPrefixPadding = ' ' +opts.terminatingKeyword = '}' +opts.commentPrefix = '//' +opts.generateMethodDeclaration = generateMethodDeclaration + +// Create generators for dynamic string creation of primary entities (e.g., filename, methods, test, and suite) +function generateTestDeclaration(name) { + return `it('${exporter.parsers.uncapitalize( + exporter.parsers.sanitizeName(name) + )}', function() {` +} +function generateMethodDeclaration(name) { + return `function ${exporter.parsers.uncapitalize( + exporter.parsers.sanitizeName(name) + )}() {` +} +function generateSuiteDeclaration(name) { + return `describe('${exporter.parsers.uncapitalize( + exporter.parsers.sanitizeName(name) + )}', function() {` +} +function generateFilename(name) { + return `${exporter.parsers.uncapitalize( + exporter.parsers.sanitizeName(name) + )}${opts.fileExtension}` +} + +// Emit an individual test, wrapped in a suite (using the test name as the suite name) +export async function emitTest({ + baseUrl, + test, + tests, + project, + enableOriginTracing, +}) { + global.baseUrl = baseUrl + const testDeclaration = generateTestDeclaration(test.name) + const result = await exporter.emit.test(test, tests, { + ...opts, + testDeclaration, + enableOriginTracing, + project, + }) + const suiteName = test.name + const suiteDeclaration = generateSuiteDeclaration(suiteName) + const _suite = await exporter.emit.suite(result, tests, { + ...opts, + suiteDeclaration, + suiteName, + project, + }) + return { + filename: generateFilename(test.name), + body: exporter.emit.orderedSuite(_suite), + } +} + +// Emit a suite with all of its tests +export async function emitSuite({ + baseUrl, + suite, + tests, + project, + enableOriginTracing, +}) { + global.baseUrl = baseUrl + const result = await exporter.emit.testsFromSuite(tests, suite, opts, { + enableOriginTracing, + generateTestDeclaration, + project, + }) + const suiteDeclaration = generateSuiteDeclaration(suite.name) + const _suite = await exporter.emit.suite(result, tests, { + ...opts, + suiteDeclaration, + suite, + project, + }) + return { + filename: generateFilename(suite.name), + body: exporter.emit.orderedSuite(_suite), + } +} + +export default { + emit: { + test: emitTest, + suite: emitSuite, + locator: location.emit, + }, + register: { + command: emitter.register, + variable: opts.hooks.declareVariables.register, + dependency: opts.hooks.declareDependencies.register, + beforeAll: opts.hooks.beforeAll.register, + beforeEach: opts.hooks.beforeEach.register, + afterEach: opts.hooks.afterEach.register, + afterAll: opts.hooks.afterAll.register, + inEachBegin: opts.hooks.inEachBegin.register, + inEachEnd: opts.hooks.inEachEnd.register, + }, +} diff --git a/packages/code-export-javascript-mocha/src/location.js b/packages/code-export-javascript-mocha/src/location.js new file mode 100644 index 0000000000..6d66fdc3d2 --- /dev/null +++ b/packages/code-export-javascript-mocha/src/location.js @@ -0,0 +1,60 @@ +// Licensed to the Software Freedom Conservancy (SFC) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The SFC licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import exporter from 'code-export-utils' + +const emitters = { + id: emitId, + name: emitName, + link: emitLink, + linkText: emitLink, + partialLinkText: emitPartialLinkText, + css: emitCss, + xpath: emitXpath, +} + +export function emit(location) { + return exporter.emit.location(location, emitters) +} + +export default { + emit, +} + +function emitId(selector) { + return Promise.resolve(`By.id("${selector}")`) +} + +function emitName(selector) { + return Promise.resolve(`By.name("${selector}")`) +} + +function emitLink(selector) { + return Promise.resolve(`By.linkText("${selector}")`) +} + +function emitPartialLinkText(selector) { + return Promise.resolve(`By.partialLinkText("${selector}")`) +} + +function emitCss(selector) { + return Promise.resolve(`By.css("${selector}")`) +} + +function emitXpath(selector) { + return Promise.resolve(`By.xpath("${selector}")`) +} diff --git a/packages/code-export-javascript-mocha/src/selection.js b/packages/code-export-javascript-mocha/src/selection.js new file mode 100644 index 0000000000..e11e3da41a --- /dev/null +++ b/packages/code-export-javascript-mocha/src/selection.js @@ -0,0 +1,49 @@ +// Licensed to the Software Freedom Conservancy (SFC) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The SFC licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import exporter from 'code-export-utils' + +const emitters = { + id: emitId, + value: emitValue, + label: emitLabel, + index: emitIndex, +} + +export function emit(location) { + return exporter.emit.selection(location, emitters) +} + +export default { + emit, +} + +function emitId(id) { + return Promise.resolve(`By.css("*[id='${id}']")`) +} + +function emitValue(value) { + return Promise.resolve(`By.css("*[value='${value}']")`) +} + +function emitLabel(label) { + return Promise.resolve(`By.xpath("//option[. = '${label}']")`) +} + +function emitIndex(index) { + return Promise.resolve(`By.css("*:nth-child(${index})")`) +} diff --git a/packages/code-export-javascript-mocha/yarn.lock b/packages/code-export-javascript-mocha/yarn.lock new file mode 100644 index 0000000000..cf080930cd --- /dev/null +++ b/packages/code-export-javascript-mocha/yarn.lock @@ -0,0 +1,2095 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/cli@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.4.4.tgz#5454bb7112f29026a4069d8e6f0e1794e651966c" + integrity sha512-XGr5YjQSjgTa6OzQZY57FAJsdeVSAKR/u/KA5exWIz66IKtv/zXtHy+fIZcMry/EgYegwuHE7vzGnrFhjdIAsQ== + dependencies: + commander "^2.8.1" + convert-source-map "^1.1.0" + fs-readdir-recursive "^1.1.0" + glob "^7.0.0" + lodash "^4.17.11" + mkdirp "^0.5.1" + output-file-sync "^2.0.0" + slash "^2.0.0" + source-map "^0.5.0" + optionalDependencies: + chokidar "^2.0.4" + +"@babel/code-frame@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" + integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== + dependencies: + "@babel/highlight" "^7.0.0" + +"@babel/generator@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.4.tgz#174a215eb843fc392c7edcaabeaa873de6e8f041" + integrity sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ== + dependencies: + "@babel/types" "^7.4.4" + jsesc "^2.5.1" + lodash "^4.17.11" + source-map "^0.5.0" + trim-right "^1.0.1" + +"@babel/helper-annotate-as-pure@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" + integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" + integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-call-delegate@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz#87c1f8ca19ad552a736a7a27b1c1fcf8b1ff1f43" + integrity sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ== + dependencies: + "@babel/helper-hoist-variables" "^7.4.4" + "@babel/traverse" "^7.4.4" + "@babel/types" "^7.4.4" + +"@babel/helper-define-map@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.4.4.tgz#6969d1f570b46bdc900d1eba8e5d59c48ba2c12a" + integrity sha512-IX3Ln8gLhZpSuqHJSnTNBWGDE9kdkTEWl21A/K7PQ00tseBwbqCHTvNLHSBd9M0R5rER4h5Rsvj9vw0R5SieBg== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/types" "^7.4.4" + lodash "^4.17.11" + +"@babel/helper-explode-assignable-expression@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" + integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== + dependencies: + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-function-name@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" + integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== + dependencies: + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-get-function-arity@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" + integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-hoist-variables@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz#0298b5f25c8c09c53102d52ac4a98f773eb2850a" + integrity sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w== + dependencies: + "@babel/types" "^7.4.4" + +"@babel/helper-member-expression-to-functions@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz#8cd14b0a0df7ff00f009e7d7a436945f47c7a16f" + integrity sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-imports@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" + integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.4.4.tgz#96115ea42a2f139e619e98ed46df6019b94414b8" + integrity sha512-3Z1yp8TVQf+B4ynN7WoHPKS8EkdTbgAEy0nU0rs/1Kw4pDgmvYH3rz3aI11KgxKCba2cn7N+tqzV1mY2HMN96w== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/template" "^7.4.4" + "@babel/types" "^7.4.4" + lodash "^4.17.11" + +"@babel/helper-optimise-call-expression@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" + integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-plugin-utils@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" + integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== + +"@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.4.4.tgz#a47e02bc91fb259d2e6727c2a30013e3ac13c4a2" + integrity sha512-Y5nuB/kESmR3tKjU8Nkn1wMGEx1tjJX076HBMeL3XLQCu6vA/YRzuTW0bbb+qRnXvQGn+d6Rx953yffl8vEy7Q== + dependencies: + lodash "^4.17.11" + +"@babel/helper-remap-async-to-generator@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" + integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-wrap-function" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-replace-supers@^7.1.0", "@babel/helper-replace-supers@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.4.4.tgz#aee41783ebe4f2d3ab3ae775e1cc6f1a90cefa27" + integrity sha512-04xGEnd+s01nY1l15EuMS1rfKktNF+1CkKmHoErDppjAAZL+IUBZpzT748x262HF7fibaQPhbvWUl5HeSt1EXg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/traverse" "^7.4.4" + "@babel/types" "^7.4.4" + +"@babel/helper-simple-access@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" + integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== + dependencies: + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-split-export-declaration@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677" + integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q== + dependencies: + "@babel/types" "^7.4.4" + +"@babel/helper-wrap-function@^7.1.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" + integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.2.0" + +"@babel/highlight@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" + integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.4.4", "@babel/parser@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.5.tgz#04af8d5d5a2b044a2a1bffacc1e5e6673544e872" + integrity sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew== + +"@babel/plugin-proposal-async-generator-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" + integrity sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + "@babel/plugin-syntax-async-generators" "^7.2.0" + +"@babel/plugin-proposal-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" + integrity sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + +"@babel/plugin-proposal-object-rest-spread@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.4.tgz#1ef173fcf24b3e2df92a678f027673b55e7e3005" + integrity sha512-dMBG6cSPBbHeEBdFXeQ2QLc5gUpg4Vkaz8octD4aoW/ISO+jBOcsuxYL7bsb5WSu8RLP6boxrBIALEHgoHtO9g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" + integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + +"@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz#501ffd9826c0b91da22690720722ac7cb1ca9c78" + integrity sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.5.4" + +"@babel/plugin-syntax-async-generators@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f" + integrity sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" + integrity sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-object-rest-spread@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" + integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" + integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-arrow-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" + integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-async-to-generator@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.4.4.tgz#a3f1d01f2f21cadab20b33a82133116f14fb5894" + integrity sha512-YiqW2Li8TXmzgbXw+STsSqPBPFnGviiaSp6CYOq55X8GQ2SGVLrXB6pNid8HkqkZAzOH6knbai3snhP7v0fNwA== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + +"@babel/plugin-transform-block-scoped-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" + integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-block-scoping@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.4.tgz#c13279fabf6b916661531841a23c4b7dae29646d" + integrity sha512-jkTUyWZcTrwxu5DD4rWz6rDB5Cjdmgz6z7M7RLXOJyCUkFBawssDGcGh8M/0FTSB87avyJI1HsTwUXp9nKA1PA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + lodash "^4.17.11" + +"@babel/plugin-transform-classes@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.4.tgz#0ce4094cdafd709721076d3b9c38ad31ca715eb6" + integrity sha512-/e44eFLImEGIpL9qPxSRat13I5QNRgBLu2hOQJCF7VLy/otSM/sypV1+XaIw5+502RX/+6YaSAPmldk+nhHDPw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-define-map" "^7.4.4" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.4.4" + "@babel/helper-split-export-declaration" "^7.4.4" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" + integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-destructuring@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.4.tgz#9d964717829cc9e4b601fc82a26a71a4d8faf20f" + integrity sha512-/aOx+nW0w8eHiEHm+BTERB2oJn5D127iye/SUQl7NjHy0lf+j7h4MKMMSOwdazGq9OxgiNADncE+SRJkCxjZpQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz#361a148bc951444312c69446d76ed1ea8e4450c3" + integrity sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.5.4" + +"@babel/plugin-transform-duplicate-keys@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz#d952c4930f312a4dbfff18f0b2914e60c35530b3" + integrity sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-exponentiation-operator@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" + integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-for-of@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz#0267fc735e24c808ba173866c6c4d1440fc3c556" + integrity sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-function-name@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz#e1436116abb0610c2259094848754ac5230922ad" + integrity sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" + integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-member-expression-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz#fa10aa5c58a2cb6afcf2c9ffa8cb4d8b3d489a2d" + integrity sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-amd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz#82a9bce45b95441f617a24011dc89d12da7f4ee6" + integrity sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-commonjs@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.4.tgz#0bef4713d30f1d78c2e59b3d6db40e60192cac1e" + integrity sha512-4sfBOJt58sEo9a2BQXnZq+Q3ZTSAUXyK3E30o36BOGnJ+tvJ6YSxF0PG6kERvbeISgProodWuI9UVG3/FMY6iw== + dependencies: + "@babel/helper-module-transforms" "^7.4.4" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + +"@babel/plugin-transform-modules-systemjs@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.4.4.tgz#dc83c5665b07d6c2a7b224c00ac63659ea36a405" + integrity sha512-MSiModfILQc3/oqnG7NrP1jHaSPryO6tA2kOMmAQApz5dayPxWiHqmq4sWH2xF5LcQK56LlbKByCd8Aah/OIkQ== + dependencies: + "@babel/helper-hoist-variables" "^7.4.4" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-umd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae" + integrity sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz#9d269fd28a370258199b4294736813a60bbdd106" + integrity sha512-z7+2IsWafTBbjNsOxU/Iv5CvTJlr5w4+HGu1HovKYTtgJ362f7kBcQglkfmlspKKZ3bgrbSGvLfNx++ZJgCWsg== + dependencies: + regexp-tree "^0.1.6" + +"@babel/plugin-transform-new-target@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz#18d120438b0cc9ee95a47f2c72bc9768fbed60a5" + integrity sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-object-super@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz#b35d4c10f56bab5d650047dad0f1d8e8814b6598" + integrity sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.1.0" + +"@babel/plugin-transform-parameters@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz#7556cf03f318bd2719fe4c922d2d808be5571e16" + integrity sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw== + dependencies: + "@babel/helper-call-delegate" "^7.4.4" + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-property-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz#03e33f653f5b25c4eb572c98b9485055b389e905" + integrity sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-regenerator@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz#629dc82512c55cee01341fb27bdfcb210354680f" + integrity sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA== + dependencies: + regenerator-transform "^0.14.0" + +"@babel/plugin-transform-reserved-words@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz#4792af87c998a49367597d07fedf02636d2e1634" + integrity sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-shorthand-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" + integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-spread@^7.2.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz#3103a9abe22f742b6d406ecd3cd49b774919b406" + integrity sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-sticky-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" + integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + +"@babel/plugin-transform-template-literals@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz#9d28fea7bbce637fb7612a0750989d8321d4bcb0" + integrity sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-typeof-symbol@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2" + integrity sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-unicode-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz#ab4634bb4f14d36728bf5978322b35587787970f" + integrity sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.5.4" + +"@babel/preset-env@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.4.5.tgz#2fad7f62983d5af563b5f3139242755884998a58" + integrity sha512-f2yNVXM+FsR5V8UwcFeIHzHWgnhXg3NpRmy0ADvALpnhB0SLbCvrCRr4BLOUYbQNLS+Z0Yer46x9dJXpXewI7w== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-async-generator-functions" "^7.2.0" + "@babel/plugin-proposal-json-strings" "^7.2.0" + "@babel/plugin-proposal-object-rest-spread" "^7.4.4" + "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-syntax-async-generators" "^7.2.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + "@babel/plugin-transform-arrow-functions" "^7.2.0" + "@babel/plugin-transform-async-to-generator" "^7.4.4" + "@babel/plugin-transform-block-scoped-functions" "^7.2.0" + "@babel/plugin-transform-block-scoping" "^7.4.4" + "@babel/plugin-transform-classes" "^7.4.4" + "@babel/plugin-transform-computed-properties" "^7.2.0" + "@babel/plugin-transform-destructuring" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/plugin-transform-duplicate-keys" "^7.2.0" + "@babel/plugin-transform-exponentiation-operator" "^7.2.0" + "@babel/plugin-transform-for-of" "^7.4.4" + "@babel/plugin-transform-function-name" "^7.4.4" + "@babel/plugin-transform-literals" "^7.2.0" + "@babel/plugin-transform-member-expression-literals" "^7.2.0" + "@babel/plugin-transform-modules-amd" "^7.2.0" + "@babel/plugin-transform-modules-commonjs" "^7.4.4" + "@babel/plugin-transform-modules-systemjs" "^7.4.4" + "@babel/plugin-transform-modules-umd" "^7.2.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.4.5" + "@babel/plugin-transform-new-target" "^7.4.4" + "@babel/plugin-transform-object-super" "^7.2.0" + "@babel/plugin-transform-parameters" "^7.4.4" + "@babel/plugin-transform-property-literals" "^7.2.0" + "@babel/plugin-transform-regenerator" "^7.4.5" + "@babel/plugin-transform-reserved-words" "^7.2.0" + "@babel/plugin-transform-shorthand-properties" "^7.2.0" + "@babel/plugin-transform-spread" "^7.2.0" + "@babel/plugin-transform-sticky-regex" "^7.2.0" + "@babel/plugin-transform-template-literals" "^7.4.4" + "@babel/plugin-transform-typeof-symbol" "^7.2.0" + "@babel/plugin-transform-unicode-regex" "^7.4.4" + "@babel/types" "^7.4.4" + browserslist "^4.6.0" + core-js-compat "^3.1.1" + invariant "^2.2.2" + js-levenshtein "^1.1.3" + semver "^5.5.0" + +"@babel/template@^7.1.0", "@babel/template@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.4.tgz#f4b88d1225689a08f5bc3a17483545be9e4ed237" + integrity sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.4.4" + "@babel/types" "^7.4.4" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.4": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.5.tgz#4e92d1728fd2f1897dafdd321efbff92156c3216" + integrity sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.4.4" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/parser" "^7.4.5" + "@babel/types" "^7.4.4" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.11" + +"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.4.tgz#8db9e9a629bb7c29370009b4b779ed93fe57d5f0" + integrity sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ== + dependencies: + esutils "^2.0.2" + lodash "^4.17.11" + to-fast-properties "^2.0.0" + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +atob@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +binary-extensions@^1.0.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.0.tgz#9523e001306a32444b907423f1de2164222f6ab1" + integrity sha512-EgmjVLMn22z7eGGv3kcnHwSnJXmFHjISTY9E/S5lIcTD3Oxw05QTcBLNkJFzcb3cNueUdF/IN4U+d78V0zO8Hw== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +browserslist@^4.6.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.6.1.tgz#ee5059b1aec18cbec9d055d6cb5e24ae50343a9b" + integrity sha512-1MC18ooMPRG2UuVFJTHFIAkk6mpByJfxCrnUyvSlu/hyQSFHMrlhM02SzNuCV+quTP4CKmqtOMAIjrifrpBJXQ== + dependencies: + caniuse-lite "^1.0.30000971" + electron-to-chromium "^1.3.137" + node-releases "^1.1.21" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +caniuse-lite@^1.0.30000971: + version "1.0.30000974" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000974.tgz#b7afe14ee004e97ce6dc73e3f878290a12928ad8" + integrity sha512-xc3rkNS/Zc3CmpMKuczWEdY2sZgx09BkAxfvkxlAEBTqcMHeL8QnPqhKse+5sRTi3nrw2pJwToD2WvKn1Uhvww== + +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chokidar@^2.0.4: + version "2.1.6" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.6.tgz#b6cad653a929e244ce8a834244164d241fa954c5" + integrity sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chownr@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" + integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +commander@^2.8.1: + version "2.20.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" + integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== + +component-emitter@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + +convert-source-map@^1.1.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" + integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== + dependencies: + safe-buffer "~5.1.1" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-js-compat@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.1.3.tgz#0cc3ba4c7f62928c2837e1cffbe8dc78b4f1ae14" + integrity sha512-EP018pVhgwsKHz3YoN1hTq49aRe+h017Kjz0NQz3nXV0cCRMvH3fLQl+vEPGr4r4J5sk4sU3tUC7U1aqTCeJeA== + dependencies: + browserslist "^4.6.0" + core-js-pure "3.1.3" + semver "^6.1.0" + +core-js-pure@3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.1.3.tgz#4c90752d5b9471f641514f3728f51c1e0783d0b5" + integrity sha512-k3JWTrcQBKqjkjI0bkfXS0lbpWPxYuHWfMMjC1VDmzU4Q58IwSbuXSo99YO/hUHlw/EB4AlfA2PVxOGkrIq6dA== + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +debug@^2.1.2, debug@^2.2.0, debug@^2.3.3: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + +electron-to-chromium@^1.3.137: + version "1.3.148" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.148.tgz#5796c0d9eb0358d397163413b90bf376c5d8bf08" + integrity sha512-nuCOlXNlGMQmdzihIPGm2K3Yf3H1hke/1rK381i02pH8wNliJU9hVNnOi/xjmxt+mjABd/BzufP5nPHWKshLWA== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fs-minipass@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" + integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ== + dependencies: + minipass "^2.2.1" + +fs-readdir-recursive@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" + integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.2.7: + version "1.2.9" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" + integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== + dependencies: + nan "^2.12.1" + node-pre-gyp "^0.12.0" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + 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" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob@^7.0.0: + version "7.1.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== + 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" + +glob@^7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== + 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" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +graceful-fs@^4.1.11: + version "4.1.15" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" + integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +iconv-lite@^0.4.4: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ignore-walk@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== + dependencies: + minimatch "^3.0.4" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@~1.3.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +invariant@^2.2.2: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +isarray@1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +js-levenshtein@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" + integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== + +lodash@^4.17.11: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== + +loose-envify@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= + +minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + +minipass@^2.2.1, minipass@^2.3.4: + version "2.3.5" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" + integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" + integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== + dependencies: + minipass "^2.2.1" + +mixin-deep@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.0, mkdirp@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + dependencies: + minimist "0.0.8" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +nan@^2.12.1: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +needle@^2.2.1: + version "2.2.4" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" + integrity sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA== + dependencies: + debug "^2.1.2" + iconv-lite "^0.4.4" + sax "^1.2.4" + +node-pre-gyp@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" + integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + +node-releases@^1.1.21: + version "1.1.23" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.23.tgz#de7409f72de044a2fa59c097f436ba89c39997f0" + integrity sha512-uq1iL79YjfYC0WXoHbC/z28q/9pOl8kSHaXdWmAAc8No+bDwqkZbzIJz55g/MUsPgSGm9LZ7QSUbzTcH5tz47w== + dependencies: + semver "^5.3.0" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= + dependencies: + abbrev "1" + osenv "^0.1.4" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-bundled@^1.0.1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" + integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== + +npm-packlist@^1.1.6: + version "1.4.1" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.1.tgz#19064cdf988da80ea3cee45533879d90192bbfbc" + integrity sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + +npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + 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" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-tmpdir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +output-file-sync@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-2.0.1.tgz#f53118282f5f553c2799541792b723a4c71430c0" + integrity sha512-mDho4qm7WgIXIGf4eYU1RHN2UU5tPfVYVSRwDJw0uTmj35DQUt/eNp19N7v6T3SrR0ESTEf2up2CGO73qI35zQ== + dependencies: + graceful-fs "^4.1.11" + is-plain-obj "^1.1.0" + mkdirp "^0.5.1" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +private@^0.1.6: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== + +process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== + +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +readable-stream@^2.0.2, readable-stream@^2.0.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +regenerate-unicode-properties@^8.0.2: + version "8.1.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" + integrity sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== + +regenerator-transform@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.0.tgz#2ca9aaf7a2c239dd32e4761218425b8c7a86ecaf" + integrity sha512-rtOelq4Cawlbmq9xuMR5gdFmv7ku/sFoB7sRiywx7aq53bc52b4j6zvH7Te1Vt/X2YveDKnCGUbioieU7FEL3w== + dependencies: + private "^0.1.6" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexp-tree@^0.1.6: + version "0.1.10" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.10.tgz#d837816a039c7af8a8d64d7a7c3cf6a1d93450bc" + integrity sha512-K1qVSbcedffwuIslMwpe6vGlj+ZXRnGkvjAtFHfDZZZuEdA/h0dxljAPu9vhUo6Rrx2U2AwJ+nSQ6hK+lrP5MQ== + +regexpu-core@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.5.4.tgz#080d9d02289aa87fe1667a4f5136bc98a6aebaae" + integrity sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.0.2" + regjsgen "^0.5.0" + regjsparser "^0.6.0" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.1.0" + +regjsgen@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" + integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA== + +regjsparser@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" + integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== + dependencies: + jsesc "~0.5.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +rimraf@^2.6.1: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +semver@^5.3.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" + integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== + +semver@^5.5.0: + version "5.7.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" + integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== + +semver@^6.1.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.1.1.tgz#53f53da9b30b2103cd4f15eab3a18ecbcb210c9b" + integrity sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ== + +set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.1" + to-object-path "^0.3.0" + +set-value@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +signal-exit@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +source-map-resolve@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== + dependencies: + atob "^2.1.1" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.5.0, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2": + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +tar@^4: + version "4.4.8" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" + integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ== + dependencies: + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.3.4" + minizlib "^1.1.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.2" + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" + integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" + integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== + +union-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^0.4.3" + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" + integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +yallist@^3.0.0, yallist@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" + integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== diff --git a/packages/code-export/package.json b/packages/code-export/package.json index a908ae8946..e400e01c53 100644 --- a/packages/code-export/package.json +++ b/packages/code-export/package.json @@ -21,6 +21,7 @@ }, "dependencies": { "code-export-java-junit": "^3.9.0", - "code-export-python-pytest": "^3.9.0" + "code-export-python-pytest": "^3.9.0", + "code-export-javascript-mocha": "^3.9.0" } } diff --git a/packages/code-export/src/index.js b/packages/code-export/src/index.js index 201e4d3165..6f6284b1bd 100644 --- a/packages/code-export/src/index.js +++ b/packages/code-export/src/index.js @@ -18,6 +18,7 @@ export const availableLanguages = { 'java-junit': require('code-export-java-junit'), 'python-pytest': require('code-export-python-pytest'), + //'javascript-mocha': require('code-export-javascript-mocha'), } function registerCommand(language, command, emitter) { From a6922151b13b558b7754b9eae086a9110c200d33 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Wed, 19 Jun 2019 15:49:42 +0300 Subject: [PATCH 58/99] Finished first pass on command emitting --- .../__test__/src/command.spec.js | 170 +++++++++--------- .../src/command.js | 32 ++-- 2 files changed, 99 insertions(+), 103 deletions(-) diff --git a/packages/code-export-javascript-mocha/__test__/src/command.spec.js b/packages/code-export-javascript-mocha/__test__/src/command.spec.js index f8a52c6304..05ee47adf6 100644 --- a/packages/code-export-javascript-mocha/__test__/src/command.spec.js +++ b/packages/code-export-javascript-mocha/__test__/src/command.spec.js @@ -221,14 +221,14 @@ describe('command code emitter', () => { `assert(await driver.getTitle() == "example title")` ) }) - it.only('should emit `assert value` command', () => { + it('should emit `assert value` command', () => { const command = { command: 'assertValue', target: 'id=select', value: 'test', } return expect(prettify(command)).resolves.toBe( - `value = self.driver.find_element(By.ID, "select").get_attribute("value")\nassert value == "test"` + `const value = await driver.findElement(By.id("select")).getAttribute("value")\nassert(value == "test")` ) }) it('should emit `click` command', () => { @@ -238,7 +238,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `self.driver.find_element(By.LINK_TEXT, "button").click()` + `await driver.findElement(By.linkText("button")).click()` ) }) it('should emit `click at` command', () => { @@ -248,7 +248,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `self.driver.find_element(By.LINK_TEXT, "button").click()` + `await driver.findElement(By.linkText("button")).click()` ) }) it('should emit `check` command', () => { @@ -258,7 +258,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `element = self.driver.find_element(By.ID, "f")\nif element.is_selected() != True: element.click()` + `const element = await driver.findElement(By.id("f"))\nif (await element.isSelected()) await element.click()` ) }) it('should emit `close` command', () => { @@ -267,7 +267,7 @@ describe('command code emitter', () => { target: '', value: '', } - return expect(prettify(command)).resolves.toBe(`self.driver.close()`) + return expect(prettify(command)).resolves.toBe(`await driver.close()`) }) it('should emit `do` command', () => { const command = { @@ -276,7 +276,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: 'condition = True\nwhile condition:', + body: 'do {', endingLevel: 1, }) }) @@ -287,7 +287,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `element = self.driver.find_element(By.LINK_TEXT, "button")\nactions = ActionChains(driver)\nactions.double_click(element).perform()` + `const element = await driver.findElement(By.linkText("button"))\nawait driver.actions({ bridge: true}).doubleClick(element).perform()` ) }) it('should emit `double click at` command', () => { @@ -297,7 +297,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `element = self.driver.find_element(By.LINK_TEXT, "button")\nactions = ActionChains(driver)\nactions.double_click(element).perform()` + `const element = await driver.findElement(By.linkText("button"))\nawait driver.actions({ bridge: true}).doubleClick(element).perform()` ) }) it('should emit `drag and drop to object` command', () => { @@ -307,7 +307,7 @@ describe('command code emitter', () => { value: 'link=dropped', } return expect(prettify(command)).resolves.toBe( - `dragged = self.driver.find_element(By.LINK_TEXT, "dragged")\ndropped = self.driver.find_element(By.LINK_TEXT, "dropped")\nactions = ActionChains(driver)\nactions.drag_and_drop(dragged, dropped).perform()` + `const dragged = await driver.findElement(By.linkText("dragged"))\nconst dropped = await driver.findElement(By.linkText("dropped"))\nawait driver.actions({ bridge: true }).dragAndDrop(dragged, dropped).perform()` ) }) it('should emit `echo` command', () => { @@ -316,7 +316,7 @@ describe('command code emitter', () => { target: 'blah', value: '', } - return expect(prettify(command)).resolves.toBe(`print(str("blah"))`) + return expect(prettify(command)).resolves.toBe(`console.log("blah")`) }) it('should emit `echo` command with variables', () => { const command = { @@ -324,9 +324,7 @@ describe('command code emitter', () => { target: '${blah}', value: '', } - return expect(prettify(command)).resolves.toBe( - `print(str(self.vars["blah"]))` - ) + return expect(prettify(command)).resolves.toBe(`console.log(vars["blah"])`) }) it('should emit `edit content` command', () => { const command = { @@ -335,7 +333,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `element = self.driver.find_element(By.ID, "contentEditable")\nself.driver.execute_script("if(arguments[0].contentEditable === 'true') {arguments[0].innerText = ''}", element)` + `const element = await driver.findElement(By.id("contentEditable"))\nawait driver.executeScript("if(arguments[0].contentEditable === 'true') {arguments[0].innerText = ''}", element)` ) }) it('should emit `else` command', () => { @@ -345,7 +343,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: `else:`, + body: `} else {`, endingLevel: 1, }) }) @@ -356,7 +354,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: `elif self.driver.execute_script("return (true)"):`, + body: `} else if (!!await driver.executeScript("return (true)")) {`, endingLevel: 1, }) }) @@ -367,8 +365,8 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ + body: '}', endingLevel: 0, - skipEmitting: true, }) }) it('should emit `execute script` command', () => { @@ -378,7 +376,7 @@ describe('command code emitter', () => { value: 'myVar', } return expect(prettify(command)).resolves.toBe( - `self.vars["myVar"] = self.driver.execute_script("javascript")` + `vars["myVar"] = await driver.executeScript("javascript")` ) }) it('should emit `execute script` command with return string value', () => { @@ -388,7 +386,7 @@ describe('command code emitter', () => { value: 'myVar', } return expect(prettify(command)).resolves.toBe( - `self.vars["myVar"] = self.driver.execute_script("return 'a'")` + `vars["myVar"] = await driver.executeScript("return 'a'")` ) }) it('should emit `execute async script` command', () => { @@ -398,7 +396,7 @@ describe('command code emitter', () => { value: 'myVar', } return expect(prettify(command)).resolves.toBe( - `self.vars["myVar"] = self.driver.execute_async_script("var callback = arguments[arguments.length - 1];javascript.then(callback).catch(callback);")` + `vars["myVar"] = await driver.executeAsyncScript("var callback = arguments[arguments.length - 1];javascript.then(callback).catch(callback);")` ) }) it('should emit `forEach` command', () => { @@ -408,7 +406,7 @@ describe('command code emitter', () => { value: 'iteratorVar', } return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: `collection = self.vars["collection"]\nfor entry in collection:\n${commandPrefixPadding}self.vars["iteratorVar"] = entry`, + body: `const collection = vars["collection"]\nfor (let i = 0; i < collection.length - 1; i++) {\n${commandPrefixPadding}vars["iteratorVar"] = vars["collection"][i]`, endingLevel: 1, }) }) @@ -419,7 +417,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: `if self.driver.execute_script("return (true)"):`, + body: `if (await driver.executeScript("return (true)")) {`, endingLevel: 1, }) }) @@ -430,7 +428,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `element = self.driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).click_and_hold().perform()` + `const element = await driver.findElement(By.id("button"))\nawait driver.actions({ bridge: true }).moveToElement(element).clickAndHold().perform()` ) }) it('should emit `mouse down at` event', () => { @@ -440,7 +438,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `element = self.driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).click_and_hold().perform()` + `const element = await driver.findElement(By.id("button"))\nawait driver.actions({ bridge: true }).moveToElement(element).clickAndHold().perform()` ) }) it('should emit `mouse move` event', () => { @@ -450,7 +448,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `element = self.driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).perform()` + `const element = await driver.findElement(By.id("button"))\nawait driver.actions({ bridge: true }).moveToElement(element).perform()` ) }) it('should emit `mouse move at` event', () => { @@ -460,7 +458,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `element = self.driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).perform()` + `const element = await driver.findElement(By.id("button"))\nawait driver.actions({ bridge: true }).moveToElement(element).perform()` ) }) it('should emit `mouse out` event', () => { @@ -470,7 +468,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `element = self.driver.find_element(By.CSS_SELECTOR, "body")\nactions = ActionChains(driver)\nactions.move_to_element(element, 0, 0).perform()` + `const element = await driver.findElement(By.CSS_SELECTOR, "body")\nawait driver.actions({ bridge: true }).moveToElement(element, 0, 0).perform()` ) }) it('should emit `mouse over` event', () => { @@ -480,7 +478,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `element = self.driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).perform()` + `const element = await driver.findElement(By.id("button"))\nawait driver.actions({ bridge: true }).moveToElement(element).perform()` ) }) it('should emit `mouse up` event', () => { @@ -490,7 +488,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `element = self.driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).release().perform()` + `const element = await driver.findElement(By.id("button"))\nawait driver.actions({ bridge: true }).moveToElement(element).release().perform()` ) }) it('should emit `mouse up at` event', () => { @@ -500,7 +498,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `element = self.driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).release().perform()` + `const element = await driver.findElement(By.id("button"))\nawait driver.actions({ bridge: true }).moveToElement(element).release().perform()` ) }) it('should emit `open` with absolute url', () => { @@ -510,7 +508,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `self.driver.get("${command.target}")` + `await driver.get("${command.target}")` ) }) it('should emit `pause` command', () => { @@ -519,7 +517,7 @@ describe('command code emitter', () => { target: '300', value: '', } - return expect(prettify(command)).resolves.toBe(`time.sleep(300)`) + return expect(prettify(command)).resolves.toBe(`await driver.sleep(300)`) }) it('should emit `remove selection` command', () => { const command = { @@ -528,7 +526,7 @@ describe('command code emitter', () => { value: 'label=A label', } return expect(prettify(command)).resolves.toBe( - `dropdown = self.driver.find_element(By.CSS_SELECTOR, "select")\ndropdown.find_element(By.XPATH, "//option[. = 'A label']").click()` + `const dropdown = await driver.findElement(By.css("select"))\nawait dropdown.findElement(By.xpath("//option[. = 'A label']")).click()` ) }) it('should emit `repeatIf` command', () => { @@ -538,7 +536,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `condition = self.driver.execute_script("return (true)")` + `} while(!!await driver.executeScript("return (true)"))` ) }) it('should emit `run` command', () => { @@ -547,7 +545,7 @@ describe('command code emitter', () => { target: 'some test case', value: '', } - return expect(prettify(command)).resolves.toBe(`self.sometestcase()`) + return expect(prettify(command)).resolves.toBe(`sometestcase()`) }) it('should emit `run script` command', () => { const command = { @@ -556,7 +554,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `self.driver.execute_script("alert('test');alert('Im annoying');")` + `await driver.executeScript("alert('test');alert('Im annoying');")` ) }) it('should emit `select` command', () => { @@ -566,7 +564,7 @@ describe('command code emitter', () => { value: 'label=A label', } return expect(prettify(command)).resolves.toBe( - `dropdown = self.driver.find_element(By.CSS_SELECTOR, "select")\ndropdown.find_element(By.XPATH, "//option[. = 'A label']").click()` + `const dropdown = await driver.findElement(By.css("select"))\nawait dropdown.findElement(By.xpath("//option[. = 'A label']")).click()` ) }) it('should emit `select frame` to select the top frame', () => { @@ -576,7 +574,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `self.driver.switch_to.default_content()` + `await driver.switchTo().defaultContent()` ) }) it('should fail to emit `select window` by using unknown locator', () => { @@ -596,7 +594,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `self.driver.switch_to.window(self.vars["window"])` + `await driver.switchTo().window(vars["window"])` ) }) it('should emit `select window` to select a window by name', () => { @@ -606,7 +604,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `self.driver.switch_to.window("window")` + `await driver.switchTo().window("window")` ) }) it('should emit `select window` to select a window by the local keyword', () => { @@ -616,7 +614,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `self.driver.switch_to.window(self.driver.window_handles[0])` + `await driver.switchTo().window(await driver.getAllWindowHandles()[0])` ) }) it('should emit `select window` to select a window by implicit index', () => { @@ -626,7 +624,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `self.driver.switch_to.window(self.driver.window_handles[12])` + `await driver.switchTo().window(await driver.getAllWindowHandles()[12])` ) }) it('should emit `send keys` command', () => { @@ -636,7 +634,7 @@ describe('command code emitter', () => { value: 'example input', } return expect(prettify(command)).resolves.toBe( - `self.driver.find_element(By.ID, "input").send_keys("example input")` + `await driver.findElement(By.id("input")).sendKeys("example input")` ) }) it('should emit `send keys` command with a variable input', () => { @@ -646,7 +644,7 @@ describe('command code emitter', () => { value: '${blah}', } return expect(prettify(command)).resolves.toBe( - `self.driver.find_element(By.ID, "input").send_keys(self.vars["blah"])` + `await driver.findElement(By.id("input")).sendKeys(vars["blah"])` ) }) it('should emit `send keys` command with a key press', () => { @@ -656,12 +654,12 @@ describe('command code emitter', () => { value: 'SuperSecretPassword!${KEY_ENTER}', } return expect(prettify(command)).resolves.toBe( - `self.driver.find_element(By.ID, "input").send_keys("SuperSecretPassword!", Keys.ENTER)` + `await driver.findElement(By.id("input")).sendKeys("SuperSecretPassword!", Key.ENTER)` ) }) it('should emit `set speed`', () => { expect(prettify({ command: 'setSpeed' })).resolves.toBe( - 'print("`set speed` is a no-op in code export, use `pause` instead")' + `console.log("\`set speed\` is a no-op in code export, use \`pause\` instead")` ) }) it('should emit `setWindowSize`', () => { @@ -670,9 +668,7 @@ describe('command code emitter', () => { target: '1440x1177', value: '', } - expect(prettify(command)).resolves.toBe( - `self.driver.set_window_size(1440, 1177)` - ) + expect(prettify(command)).resolves.toBe(`await driver.setRect(1440, 1177)`) }) it('should skip playback supported commands, that are not supported in webdriver', () => { return Promise.all([ @@ -697,7 +693,7 @@ describe('command code emitter', () => { value: 'myVar', } return expect(prettify(command)).resolves.toBe( - `self.vars["myVar"] = "some value"` + `vars["myVar"] = "some value"` ) }) it('should emit `store attribute` command', () => { @@ -707,7 +703,7 @@ describe('command code emitter', () => { value: 'myVar', } return expect(prettify(command)).resolves.toBe( - `attribute = self.driver.find_element(By.XPATH, "button[3]").get_attribute("id")\nself.vars["myVar"] = attribute` + `const attribute = await driver.findElement(By.xpath("button[3]")).getAttribute("id")\nvars["myVar"] = attribute` ) }) it('should emit `store text` command', () => { @@ -717,7 +713,7 @@ describe('command code emitter', () => { value: 'myVar', } return expect(prettify(command)).resolves.toBe( - `self.vars["myVar"] = self.driver.find_element(By.ID, "someElement").text` + `vars["myVar"] = await driver.findElement(By.id("someElement")).getText()` ) }) it('should emit `store json` command', () => { @@ -727,7 +723,7 @@ describe('command code emitter', () => { value: 'myVar', } return expect(prettify(command)).resolves.toBe( - `self.vars["myVar"] = json.loads('[{"a":0}]')` + `vars["myVar"] = JSON.parse('[{"a":0}]')` ) }) it('should emit `store title` command', () => { @@ -737,7 +733,7 @@ describe('command code emitter', () => { value: 'myVar', } return expect(prettify(command)).resolves.toBe( - `self.vars["myVar"] = self.driver.title` + `vars["myVar"] = await driver.getTitle()` ) }) it('should emit `store value` command', () => { @@ -747,7 +743,7 @@ describe('command code emitter', () => { value: 'myVar', } return expect(prettify(command)).resolves.toBe( - `self.vars["myVar"] = self.driver.find_element(By.ID, "someElement").get_attribute("value")` + `vars["myVar"] = await driver.findElement(By.id("someElement")).getAttribute("value")` ) }) it('should emit `store window handle` command', () => { @@ -757,7 +753,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `self.vars["windowName"] = self.driver.current_window_handle` + `vars["windowName"] = await driver.getWindowHandle()` ) }) it('should emit `store xpath count` command', () => { @@ -767,7 +763,7 @@ describe('command code emitter', () => { value: 'myVar', } return expect(prettify(command)).resolves.toBe( - `self.vars["myVar"] = len(self.driver.find_elements(By.XPATH, "button"))` + `vars["myVar"] = await driver.findElements(By.xpath("button")).length` ) }) it('should emit `submit` command', () => { @@ -777,7 +773,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `raise Exception("\`submit\` is not a supported command in Selenium Webself.driver. Please re-record the step in the IDE.")` + `raise Exception("\`submit\` is not a supported command in Selenium Webdriver. Please re-record the step in the IDE.")` ) }) it('should emit `times` command', () => { @@ -787,7 +783,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: `for i in range(0, 5):`, + body: `const times = 5\nfor(let i = 0; i < times; i++) {`, endingLevel: 1, }) }) @@ -798,7 +794,7 @@ describe('command code emitter', () => { value: 'example input', } expect(prettify(command)).resolves.toBe( - `self.driver.find_element(By.ID, "input").send_keys("example input")` + `await driver.findElement(By.id("input")).sendKeys("example input")` ) }) it('should emit `uncheck` command', () => { @@ -808,7 +804,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `element = self.driver.find_element(By.ID, "f")\nif element.is_selected: element.click()` + `const element = await driver.findElement(By.id("f"))\nif (await element.isSelected()) await element.click()` ) }) it('should emit `verify` command', () => { @@ -818,7 +814,7 @@ describe('command code emitter', () => { value: 'blah', } expect(prettify(command)).resolves.toBe( - `assert(self.vars["varrrName"] == "blah")` + `assert(vars["varrrName"] == "blah")` ) }) it('should emit `verify checked` command', () => { @@ -828,7 +824,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `assert self.driver.find_element(By.ID, "check").is_selected() is True` + `assert(await driver.findElement(By.id("check")).isSelected())` ) }) it('should emit `verify editable` command', () => { @@ -838,7 +834,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `element = self.driver.find_element(By.ID, "text")\nassert element.is_enabled() is True` + `const element = await driver.findElement(By.id("text"))\nassert(await element.isEnabled())` ) }) it('should emit `verify element present` command', () => { @@ -848,7 +844,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `elements = self.driver.find_elements(By.ID, "element")\nassert len(elements) > 0` + `const elements = await driver.findElements(By.id("element"))\nassert(elements.length)` ) }) it('should emit `verify element not present` command', () => { @@ -858,7 +854,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `elements = self.driver.find_elements(By.ID, "element")\nassert len(elements) == 0` + `const elements = await driver.findElements(By.id("element"))\nassert(!elements.length)` ) }) it('should emit `verify not checked` command', () => { @@ -868,7 +864,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `assert self.driver.find_element(By.ID, "check").is_selected() is False` + `assert(!await driver.findElement(By.id("check")).isSelected())` ) }) it('should emit `verify not editable` command', () => { @@ -878,7 +874,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `element = self.driver.find_element(By.ID, "text")\nassert element.is_enabled() is False` + `const element = await driver.findElement(By.id("text"))\nassert(!await element.isEnabled())` ) }) it('should emit `verify not selected value` command', () => { @@ -888,7 +884,7 @@ describe('command code emitter', () => { value: 'test', } return expect(prettify(command)).resolves.toBe( - `value = self.driver.find_element(By.ID, "select").get_attribute("value")\nassert value != "test"` + `const value = await driver.findElement(By.id("select")).getAttribute("value")\nassert(value !== "test")` ) }) it('should emit `verify not text` command', () => { @@ -898,7 +894,7 @@ describe('command code emitter', () => { value: 'text', } return expect(prettify(command)).resolves.toBe( - `text = self.driver.find_element(By.ID, "test").text\nassert text != "text"` + `const text = await driver.findElement(By.id("test")).getText()\nassert(text !== "text")` ) }) it("should emit 'verify selected label' command", () => { @@ -908,7 +904,7 @@ describe('command code emitter', () => { value: 'test', } return expect(prettify(command)).resolves.toBe( - `element = self.driver.find_element(By.ID, "test")\nlocator = "option[@value='{}']".format(element.get_attribute("value"))\nselected_text = element.find_element(By.XPATH, locator).text\nassert selected_text == "test"` + 'const element = await driver.findElement(By.id("test")).getAttribute("value")\nconst locator = `option[@value=\'${element}\']`\nconst selectedText = element.findElement(By.xpath(locator)).getText()\nassert(selectedText == "test")' ) }) it('should emit `verify value` command', () => { @@ -918,7 +914,7 @@ describe('command code emitter', () => { value: 'test', } return expect(prettify(command)).resolves.toBe( - `value = self.driver.find_element(By.ID, "select").get_attribute("value")\nassert value == "test"` + `const value = await driver.findElement(By.id("select")).getAttribute("value")\nassert(value == "test")` ) }) it('should emit `verify selected value` command', () => { @@ -928,7 +924,7 @@ describe('command code emitter', () => { value: 'test', } return expect(prettify(command)).resolves.toBe( - `value = self.driver.find_element(By.ID, "select").get_attribute("value")\nassert value == "test"` + `const value = await driver.findElement(By.id("select")).getAttribute("value")\nassert(value == "test")` ) }) it('should emit `verify text` command', () => { @@ -938,7 +934,7 @@ describe('command code emitter', () => { value: 'some text that should be here', } expect(prettify(command)).resolves.toBe( - `assert self.driver.find_element(By.ID, "test").text == "some text that should be here"` + `assert(await driver.findElement(By.id("test")).getText() == "some text that should be here")` ) }) it('should emit `verify title` command', () => { @@ -948,7 +944,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `assert self.driver.title == "example title"` + `assert(await driver.getTitle() == "example title")` ) }) it('should emit `waitForElementEditable` command', () => { @@ -958,7 +954,7 @@ describe('command code emitter', () => { value: '5000', } return expect(prettify(command)).resolves.toBe( - `WebDriverWait(self.driver, 5000).until(expected_conditions.element_to_be_clickable((By.CSS_SELECTOR, "#blah")))` + `await driver.wait(until.elementIsEnabled(await driver.findElement(By.css("#blah"))), 5000)` ) }) it('should emit `waitForElementPresent` command', () => { @@ -968,7 +964,7 @@ describe('command code emitter', () => { value: '5000', } return expect(prettify(command)).resolves.toBe( - `WebDriverWait(self.driver, 5000).until(expected_conditions.presence_of_element_located((By.CSS_SELECTOR, "#blah")))` + `await driver.wait(until.elementLocated(By.css("#blah")), 5000)` ) }) it('should emit `waitForElementVisible` command', () => { @@ -978,7 +974,7 @@ describe('command code emitter', () => { value: '5000', } return expect(prettify(command)).resolves.toBe( - `WebDriverWait(self.driver, 5000).until(expected_conditions.visibility_of_element_located((By.CSS_SELECTOR, "#blah")))` + `await driver.wait(until.elementIsVisible(await driver.findElement(By.css("#blah"))), 5000)` ) }) it('should emit `waitForElementNotEditable` command', () => { @@ -988,7 +984,7 @@ describe('command code emitter', () => { value: '5000', } return expect(prettify(command)).resolves.toBe( - `WebDriverWait(self.driver, 5000).until_not(expected_conditions.element_to_be_clickable((By.CSS_SELECTOR, "#blah")))` + `await driver.wait(until.elementIsDisabled(await driver.findElement(By.css("#blah"))), 5000)` ) }) it('should emit `waitForElementNotPresent` command', () => { @@ -998,7 +994,7 @@ describe('command code emitter', () => { value: '5000', } return expect(prettify(command)).resolves.toBe( - `WebDriverWait(self.driver, 5000).until(expected_conditions.invisibility_of_element_located((By.CSS_SELECTOR, "#blah")))` + `await driver.wait(until.stalenessOf(await driver.findElement(By.css("#blah"))), 5000)` ) }) it('should emit `waitForElementNotVisible` command', () => { @@ -1008,7 +1004,7 @@ describe('command code emitter', () => { value: '5000', } return expect(prettify(command)).resolves.toBe( - `WebDriverWait(self.driver, 5000).until(expected_conditions.invisibility_of_element_located((By.CSS_SELECTOR, "#blah")))` + `await driver.wait(until.elementIsNotVisible(await driver.findElement(By.css("#blah"))), 5000)` ) }) it('should emit `answer on visible prompt` command', () => { @@ -1018,7 +1014,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `alert = self.driver.switch_to.alert\nalert.send_keys("an answer")\nalert.accept()` + `const alert = await driver.switchTo().alert()\nawait alert.sendKeys("an answer")\nawait alert.accept()` ) }) it('should emit `choose cancel on visible prompt` command', () => { @@ -1028,7 +1024,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `self.driver.switch_to.alert.dismiss()` + `await driver.switchTo().alert().dismiss()` ) }) it('should emit `choose ok on visible confirmation` command', () => { @@ -1038,7 +1034,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `self.driver.switch_to.alert.accept()` + `await driver.switchTo().alert().accept()` ) }) it('should emit `while` command', () => { @@ -1048,7 +1044,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: `while self.driver.execute_script("return (true)"):`, + body: `while(!!await driver.executeScript("return (true)")) {`, endingLevel: 1, }) }) @@ -1062,7 +1058,7 @@ describe('command code emitter', () => { windowTimeout: 2000, } return expect(prettify(command)).resolves.toBe( - `self.vars["window_handles"] = self.driver.window_handles\nself.driver.find_element(By.CSS_SELECTOR, "button").click()\nself.vars["newWin"] = self.wait_for_window(2000)` + `vars["windowHandles"] = await driver.getAllWindowHandles()\nawait driver.findElement(By.css("button")).click()\nvars["newWin"] = await waitForWindow(2000)` ) }) }) diff --git a/packages/code-export-javascript-mocha/src/command.js b/packages/code-export-javascript-mocha/src/command.js index abf4190b9f..4188a656a2 100644 --- a/packages/code-export-javascript-mocha/src/command.js +++ b/packages/code-export-javascript-mocha/src/command.js @@ -178,7 +178,7 @@ async function emitNewWindowHandling(command, emittedCommand) { return Promise.resolve( `vars["windowHandles"] = await driver.getAllWindowHandles()\n${await emittedCommand}\nvars["${ command.windowHandleName - }"] = waitForWindow(${command.windowTimeout})` + }"] = await waitForWindow(${command.windowTimeout})` ) } @@ -357,7 +357,7 @@ async function emitDoubleClick(target) { { level: 0, statement: - 'await driver.actions({ bridge: true}).double_click(element).perform()', + 'await driver.actions({ bridge: true}).doubleClick(element).perform()', }, ] return Promise.resolve({ commands }) @@ -380,7 +380,7 @@ async function emitDragAndDrop(dragged, dropped) { { level: 0, statement: - 'await driver.actions({ bridge: true }).drag_and_drop(dragged, dropped).perform()', + 'await driver.actions({ bridge: true }).dragAndDrop(dragged, dropped).perform()', }, ] return Promise.resolve({ commands }) @@ -388,7 +388,7 @@ async function emitDragAndDrop(dragged, dropped) { async function emitEcho(message) { const _message = message.startsWith('vars[') ? message : `"${message}"` - return Promise.resolve(`console.log("${_message}")`) + return Promise.resolve(`console.log(${_message})`) } async function emitEditContent(locator, content) { @@ -416,7 +416,7 @@ async function emitExecuteScript(script, varName) { } async function emitExecuteAsyncScript(script, varName) { - const result = `await driver.execute_async_script("var callback = arguments[arguments.length - 1];${ + const result = `await driver.executeAsyncScript("var callback = arguments[arguments.length - 1];${ script.script }.then(callback).catch(callback);${generateScriptArguments(script)}")` return Promise.resolve(variableSetter(varName, result)) @@ -433,7 +433,7 @@ async function emitMouseDown(locator) { { level: 0, statement: - 'await driver.actions({ bridge: true }).move_to_element(element).click_and_hold().perform()', + 'await driver.actions({ bridge: true }).moveToElement(element).clickAndHold().perform()', }, ] return Promise.resolve({ commands }) @@ -450,7 +450,7 @@ async function emitMouseMove(locator) { { level: 0, statement: - 'await driver.actions({ bridge: true }).move_to_element(element).perform()', + 'await driver.actions({ bridge: true }).moveToElement(element).perform()', }, ] return Promise.resolve({ commands }) @@ -465,7 +465,7 @@ async function emitMouseOut() { { level: 0, statement: - 'await driver.actions({ bridge: true }).move_to_element(element, 0, 0).perform()', + 'await driver.actions({ bridge: true }).moveToElement(element, 0, 0).perform()', }, ] return Promise.resolve({ commands }) @@ -482,7 +482,7 @@ async function emitMouseUp(locator) { { level: 0, statement: - 'await driver.actions({ bridge: true }).move_to_element(element).release().perform()', + 'await driver.actions({ bridge: true }).moveToElement(element).release().perform()', }, ] return Promise.resolve({ commands }) @@ -678,7 +678,7 @@ async function emitStoreValue(locator, varName) { async function emitStoreWindowHandle(varName) { return Promise.resolve( - variableSetter(varName, 'await driver.getWindowHandle') + variableSetter(varName, 'await driver.getWindowHandle()') ) } @@ -877,7 +877,7 @@ async function emitWaitForElementPresent(locator, timeout) { return Promise.resolve( `await driver.wait(until.elementLocated(${await location.emit( locator - )}), ${Math.floor(timeout)});` + )}), ${Math.floor(timeout)})` ) } @@ -885,7 +885,7 @@ async function emitWaitForElementNotPresent(locator, timeout) { return Promise.resolve( `await driver.wait(until.stalenessOf(await driver.findElement(${await location.emit( locator - )})), ${Math.floor(timeout)});` + )})), ${Math.floor(timeout)})` ) } @@ -893,7 +893,7 @@ async function emitWaitForElementVisible(locator, timeout) { return Promise.resolve( `await driver.wait(until.elementIsVisible(await driver.findElement(${await location.emit( locator - )})), ${Math.floor(timeout)});` + )})), ${Math.floor(timeout)})` ) } @@ -901,7 +901,7 @@ async function emitWaitForElementNotVisible(locator, timeout) { return Promise.resolve( `await driver.wait(until.elementIsNotVisible(await driver.findElement(${await location.emit( locator - )})), ${Math.floor(timeout)});` + )})), ${Math.floor(timeout)})` ) } @@ -909,7 +909,7 @@ async function emitWaitForElementEditable(locator, timeout) { return Promise.resolve( `await driver.wait(until.elementIsEnabled(await driver.findElement(${await location.emit( locator - )})), ${Math.floor(timeout)});` + )})), ${Math.floor(timeout)})` ) } @@ -917,7 +917,7 @@ async function emitWaitForElementNotEditable(locator, timeout) { return Promise.resolve( `await driver.wait(until.elementIsDisabled(await driver.findElement(${await location.emit( locator - )})), ${Math.floor(timeout)});` + )})), ${Math.floor(timeout)})` ) } From bcbb91974ae42c5488b1f5d5ddcc378ad336f42c Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Wed, 19 Jun 2019 16:28:44 +0300 Subject: [PATCH 59/99] Fixes for `waitForWindow` declaration, `if` expression, and `repeatIf` indentation --- .../__test__/src/command.spec.js | 2 +- packages/code-export-javascript-mocha/src/command.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/code-export-javascript-mocha/__test__/src/command.spec.js b/packages/code-export-javascript-mocha/__test__/src/command.spec.js index 05ee47adf6..ba2d793e4e 100644 --- a/packages/code-export-javascript-mocha/__test__/src/command.spec.js +++ b/packages/code-export-javascript-mocha/__test__/src/command.spec.js @@ -417,7 +417,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: `if (await driver.executeScript("return (true)")) {`, + body: `if (!!await driver.executeScript("return (true)")) {`, endingLevel: 1, }) }) diff --git a/packages/code-export-javascript-mocha/src/command.js b/packages/code-export-javascript-mocha/src/command.js index 4188a656a2..3d6352637f 100644 --- a/packages/code-export-javascript-mocha/src/command.js +++ b/packages/code-export-javascript-mocha/src/command.js @@ -146,7 +146,7 @@ function variableSetter(varName, value) { function emitWaitForWindow() { const generateMethodDeclaration = name => { - return `async function ${name}(timeout = 2):` + return `async function ${name}(timeout = 2) {` } const commands = [ { level: 0, statement: 'await driver.sleep(timeout / 1000)' }, @@ -286,7 +286,7 @@ function emitControlFlowEnd() { function emitControlFlowIf(script) { return Promise.resolve({ commands: [ - { level: 0, statement: `if (${generateExpressionScript(script)}) {` }, + { level: 0, statement: `if (!!${generateExpressionScript(script)}) {` }, ], endingLevelAdjustment: 1, }) @@ -319,7 +319,7 @@ function emitControlFlowRepeatIf(script) { statement: `} while(!!${generateExpressionScript(script)})`, }, ], - endingLevelAdjustment: -1, + startingLevelAdjustment: -1, }) } From 1d8dcdc7c094b820738ff57674de552a31e8b360 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Wed, 19 Jun 2019 16:29:21 +0300 Subject: [PATCH 60/99] Added `async` to test and function declarations --- packages/code-export-javascript-mocha/src/index.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/code-export-javascript-mocha/src/index.js b/packages/code-export-javascript-mocha/src/index.js index 5f4ca1c79c..092878848e 100644 --- a/packages/code-export-javascript-mocha/src/index.js +++ b/packages/code-export-javascript-mocha/src/index.js @@ -28,7 +28,7 @@ opts.emitter = emitter opts.hooks = generateHooks() opts.fileExtension = '.spec.js' opts.commandPrefixPadding = ' ' -opts.terminatingKeyword = '}' +opts.terminatingKeyword = '})' opts.commentPrefix = '//' opts.generateMethodDeclaration = generateMethodDeclaration @@ -36,10 +36,10 @@ opts.generateMethodDeclaration = generateMethodDeclaration function generateTestDeclaration(name) { return `it('${exporter.parsers.uncapitalize( exporter.parsers.sanitizeName(name) - )}', function() {` + )}', async function() {` } function generateMethodDeclaration(name) { - return `function ${exporter.parsers.uncapitalize( + return `async function ${exporter.parsers.uncapitalize( exporter.parsers.sanitizeName(name) )}() {` } From 164ff2ece3cad420b7bb229b4a1153bbdb911dbf Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Wed, 19 Jun 2019 16:30:14 +0300 Subject: [PATCH 61/99] Updated snapshots for a few of the e2e tests. Marked remaining ones as skip along with a TODO of what is needed --- .../src/__snapshots__/index.spec.js.snap | 249 +++++++++--------- .../__test__/src/index.spec.js | 17 +- 2 files changed, 132 insertions(+), 134 deletions(-) diff --git a/packages/code-export-javascript-mocha/__test__/src/__snapshots__/index.spec.js.snap b/packages/code-export-javascript-mocha/__test__/src/__snapshots__/index.spec.js.snap index f8d548a3bc..16c0d318d9 100644 --- a/packages/code-export-javascript-mocha/__test__/src/__snapshots__/index.spec.js.snap +++ b/packages/code-export-javascript-mocha/__test__/src/__snapshots__/index.spec.js.snap @@ -1,114 +1,111 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`Code Export Java JUnit Selenium should export a suite 1`] = ` -"# Generated by Selenium IDE -import pytest -import time -import json -from selenium import webdriver -from selenium.webdriver.common.by import By -from selenium.webdriver.common.action_chains import ActionChains -from selenium.webdriver.support import expected_conditions -from selenium.webdriver.support.wait import WebDriverWait -from selenium.webdriver.common.keys import Keys +"// Generated by Selenium IDE +const { Builder, By, Key, until } = require('selenium-webdriver') +const assert = require('assert') -class TestLogin(): - def setup_method(self, method): - self.driver = webdriver.Firefox() - self.vars = {} - - def teardown_method(self, method): - self.driver.quit(); - - def test_validcredentials(self): - self.driver.get(\\"http://the-internet.herokuapp.com/login\\") - self.driver.set_window_size(1440, 1177) - self.driver.find_element(By.ID, \\"username\\").send_keys(\\"tomsmith\\") - self.driver.find_element(By.ID, \\"password\\").send_keys(\\"SuperSecretPassword!\\") - self.driver.find_element(By.CSS_SELECTOR, \\"#login button\\").click() - assert self.driver.find_element(By.CSS_SELECTOR, \\".flash.success\\").text == \\"You logged into a secure area!\\\\\\\\n×\\" - - def test_invalidcredentials(self): - self.driver.get(\\"http://the-internet.herokuapp.com/login\\") - self.driver.set_window_size(1440, 1177) - self.driver.find_element(By.ID, \\"username\\").send_keys(\\"blah\\") - self.driver.find_element(By.ID, \\"password\\").send_keys(\\"blah\\") - self.driver.find_element(By.CSS_SELECTOR, \\"#login button\\").click() - assert self.driver.find_element(By.ID, \\"flash\\").text == \\"Your username is invalid!\\\\\\\\n×\\" - +describe('login', function() { + let driver + let vars + beforeEach(async function() { + driver = await new Builder().forBrowser('firefox').build() + vars = {} + }) + afterEach(async function() { + await driver.quit(); + }) + it('validcredentials', async function() { + await driver.get(\\"http://the-internet.herokuapp.com/login\\") + await driver.setRect(1440, 1177) + await driver.findElement(By.id(\\"username\\")).sendKeys(\\"tomsmith\\") + await driver.findElement(By.id(\\"password\\")).sendKeys(\\"SuperSecretPassword!\\") + await driver.findElement(By.css(\\"#login button\\")).click() + assert(await driver.findElement(By.css(\\".flash.success\\")).getText() == \\"You logged into a secure area!\\\\\\\\n×\\") + }) + it('invalidcredentials', async function() { + await driver.get(\\"http://the-internet.herokuapp.com/login\\") + await driver.setRect(1440, 1177) + await driver.findElement(By.id(\\"username\\")).sendKeys(\\"blah\\") + await driver.findElement(By.id(\\"password\\")).sendKeys(\\"blah\\") + await driver.findElement(By.css(\\"#login button\\")).click() + assert(await driver.findElement(By.id(\\"flash\\")).getText() == \\"Your username is invalid!\\\\\\\\n×\\") + }) +}) " `; exports[`Code Export Java JUnit Selenium should export a suite that uses control flow commands 1`] = ` -"# Generated by Selenium IDE -import pytest -import time -import json -from selenium import webdriver -from selenium.webdriver.common.by import By -from selenium.webdriver.common.action_chains import ActionChains -from selenium.webdriver.support import expected_conditions -from selenium.webdriver.support.wait import WebDriverWait -from selenium.webdriver.common.keys import Keys +"// Generated by Selenium IDE +const { Builder, By, Key, until } = require('selenium-webdriver') +const assert = require('assert') -class TestControlflow(): - def setup_method(self, method): - self.driver = webdriver.Firefox() - self.vars = {} - - def teardown_method(self, method): - self.driver.quit(); - - def test_controlflowif(self): - self.vars[\\"myVar\\"] = self.driver.execute_script(\\"return 'a'\\") - if self.driver.execute_script(\\"return (arguments[0] === 'a')\\", self.vars[\\"myVar\\"]): - self.vars[\\"output\\"] = self.driver.execute_script(\\"return 'a'\\") - elif self.driver.execute_script(\\"return (arguments[0] === 'b')\\", self.vars[\\"myVar\\"]): - self.vars[\\"output\\"] = self.driver.execute_script(\\"return 'b'\\") - else: - self.vars[\\"output\\"] = self.driver.execute_script(\\"return 'c'\\") - assert(self.vars[\\"output\\"] == \\"a\\") - - def test_controlflowelseif(self): - self.vars[\\"myVar\\"] = self.driver.execute_script(\\"return 'b'\\") - if self.driver.execute_script(\\"return (arguments[0] === 'a')\\", self.vars[\\"myVar\\"]): - self.vars[\\"output\\"] = self.driver.execute_script(\\"return 'a'\\") - elif self.driver.execute_script(\\"return (arguments[0] === 'b')\\", self.vars[\\"myVar\\"]): - self.vars[\\"output\\"] = self.driver.execute_script(\\"return 'b'\\") - else: - self.vars[\\"output\\"] = self.driver.execute_script(\\"return 'c'\\") - assert(self.vars[\\"output\\"] == \\"b\\") - - def test_controlflowelse(self): - self.vars[\\"myVar\\"] = self.driver.execute_script(\\"return 'c'\\") - if self.driver.execute_script(\\"return (arguments[0] === 'a')\\", self.vars[\\"myVar\\"]): - self.vars[\\"output\\"] = self.driver.execute_script(\\"return 'a'\\") - elif self.driver.execute_script(\\"return (arguments[0] === 'b')\\", self.vars[\\"myVar\\"]): - self.vars[\\"output\\"] = self.driver.execute_script(\\"return 'b'\\") - else: - self.vars[\\"output\\"] = self.driver.execute_script(\\"return 'c'\\") - assert(self.vars[\\"output\\"] == \\"c\\") - - def test_controlflowdo(self): - self.vars[\\"check\\"] = self.driver.execute_script(\\"return 1\\") - condition = True - while condition: - self.vars[\\"check\\"] = self.driver.execute_script(\\"return arguments[0] + 1\\", self.vars[\\"check\\"]) - condition = self.driver.execute_script(\\"return (arguments[0] < 3)\\", self.vars[\\"check\\"]) - assert(self.vars[\\"check\\"] == 3) - - def test_controlflowtimes(self): - self.vars[\\"check\\"] = self.driver.execute_script(\\"return 1\\") - for i in range(0, 2): - self.vars[\\"check\\"] = self.driver.execute_script(\\"return arguments[0] + 1\\", self.vars[\\"check\\"]) - assert(self.vars[\\"check\\"] == 3) - - def test_controlflowwhile(self): - self.vars[\\"check\\"] = self.driver.execute_script(\\"return 1\\") - while self.driver.execute_script(\\"return (arguments[0] < 3)\\", self.vars[\\"check\\"]): - self.vars[\\"check\\"] = self.driver.execute_script(\\"return arguments[0] + 1\\", self.vars[\\"check\\"]) - assert(self.vars[\\"check\\"] == 3) - +describe('controlflow', function() { + let driver + let vars + beforeEach(async function() { + driver = await new Builder().forBrowser('firefox').build() + vars = {} + }) + afterEach(async function() { + await driver.quit(); + }) + it('controlflowif', async function() { + vars[\\"myVar\\"] = await driver.executeScript(\\"return 'a'\\") + if (!!await driver.executeScript(\\"return (arguments[0] === 'a')\\", vars[\\"myVar\\"])) { + vars[\\"output\\"] = await driver.executeScript(\\"return 'a'\\") + } else if (!!await driver.executeScript(\\"return (arguments[0] === 'b')\\", vars[\\"myVar\\"])) { + vars[\\"output\\"] = await driver.executeScript(\\"return 'b'\\") + } else { + vars[\\"output\\"] = await driver.executeScript(\\"return 'c'\\") + } + assert(vars[\\"output\\"] == \\"a\\") + }) + it('controlflowelseif', async function() { + vars[\\"myVar\\"] = await driver.executeScript(\\"return 'b'\\") + if (!!await driver.executeScript(\\"return (arguments[0] === 'a')\\", vars[\\"myVar\\"])) { + vars[\\"output\\"] = await driver.executeScript(\\"return 'a'\\") + } else if (!!await driver.executeScript(\\"return (arguments[0] === 'b')\\", vars[\\"myVar\\"])) { + vars[\\"output\\"] = await driver.executeScript(\\"return 'b'\\") + } else { + vars[\\"output\\"] = await driver.executeScript(\\"return 'c'\\") + } + assert(vars[\\"output\\"] == \\"b\\") + }) + it('controlflowelse', async function() { + vars[\\"myVar\\"] = await driver.executeScript(\\"return 'c'\\") + if (!!await driver.executeScript(\\"return (arguments[0] === 'a')\\", vars[\\"myVar\\"])) { + vars[\\"output\\"] = await driver.executeScript(\\"return 'a'\\") + } else if (!!await driver.executeScript(\\"return (arguments[0] === 'b')\\", vars[\\"myVar\\"])) { + vars[\\"output\\"] = await driver.executeScript(\\"return 'b'\\") + } else { + vars[\\"output\\"] = await driver.executeScript(\\"return 'c'\\") + } + assert(vars[\\"output\\"] == \\"c\\") + }) + it('controlflowdo', async function() { + vars[\\"check\\"] = await driver.executeScript(\\"return 1\\") + do { + vars[\\"check\\"] = await driver.executeScript(\\"return arguments[0] + 1\\", vars[\\"check\\"]) + } while(!!await driver.executeScript(\\"return (arguments[0] < 3)\\", vars[\\"check\\"])) + assert(vars[\\"check\\"] == \\"3\\") + }) + it('controlflowtimes', async function() { + vars[\\"check\\"] = await driver.executeScript(\\"return 1\\") + const times = 2 + for(let i = 0; i < times; i++) { + vars[\\"check\\"] = await driver.executeScript(\\"return arguments[0] + 1\\", vars[\\"check\\"]) + } + assert(vars[\\"check\\"] == \\"3\\") + }) + it('controlflowwhile', async function() { + vars[\\"check\\"] = await driver.executeScript(\\"return 1\\") + while(!!await driver.executeScript(\\"return (arguments[0] < 3)\\", vars[\\"check\\"])) { + vars[\\"check\\"] = await driver.executeScript(\\"return arguments[0] + 1\\", vars[\\"check\\"]) + } + assert(vars[\\"check\\"] == \\"3\\") + }) +}) " `; @@ -243,33 +240,29 @@ class TestDefaultSuite(): `; exports[`Code Export Java JUnit Selenium should export a test 1`] = ` -"# Generated by Selenium IDE -import pytest -import time -import json -from selenium import webdriver -from selenium.webdriver.common.by import By -from selenium.webdriver.common.action_chains import ActionChains -from selenium.webdriver.support import expected_conditions -from selenium.webdriver.support.wait import WebDriverWait -from selenium.webdriver.common.keys import Keys +"// Generated by Selenium IDE +const { Builder, By, Key, until } = require('selenium-webdriver') +const assert = require('assert') -class TestLogin(): - def setup_method(self, method): - self.driver = webdriver.Firefox() - self.vars = {} - - def teardown_method(self, method): - self.driver.quit(); - - def test_login(self): - self.driver.get(\\"http://the-internet.herokuapp.com/login\\") - self.driver.set_window_size(1440, 1177) - self.driver.find_element(By.ID, \\"username\\").send_keys(\\"tomsmith\\") - self.driver.find_element(By.ID, \\"password\\").send_keys(\\"SuperSecretPassword!\\") - self.driver.find_element(By.CSS_SELECTOR, \\"#login button\\").click() - assert self.driver.find_element(By.CSS_SELECTOR, \\".flash.success\\").text == \\"You logged into a secure area!\\\\\\\\n×\\" - +describe('login', function() { + let driver + let vars + beforeEach(async function() { + driver = await new Builder().forBrowser('firefox').build() + vars = {} + }) + afterEach(async function() { + await driver.quit(); + }) + it('login', async function() { + await driver.get(\\"http://the-internet.herokuapp.com/login\\") + await driver.setRect(1440, 1177) + await driver.findElement(By.id(\\"username\\")).sendKeys(\\"tomsmith\\") + await driver.findElement(By.id(\\"password\\")).sendKeys(\\"SuperSecretPassword!\\") + await driver.findElement(By.css(\\"#login button\\")).click() + assert(await driver.findElement(By.css(\\".flash.success\\")).getText() == \\"You logged into a secure area!\\\\\\\\n×\\") + }) +}) " `; diff --git a/packages/code-export-javascript-mocha/__test__/src/index.spec.js b/packages/code-export-javascript-mocha/__test__/src/index.spec.js index 8cd53e859b..e604f47f73 100644 --- a/packages/code-export-javascript-mocha/__test__/src/index.spec.js +++ b/packages/code-export-javascript-mocha/__test__/src/index.spec.js @@ -37,7 +37,7 @@ function readFile(filename) { ) } -describe.skip('Code Export Java JUnit Selenium', () => { +describe('Code Export Java JUnit Selenium', () => { it('should export a test', async () => { const project = readFile('single-test.side') const results = await emitTest({ @@ -58,7 +58,8 @@ describe.skip('Code Export Java JUnit Selenium', () => { expect(results.body).toBeDefined() expect(results.body).toMatchSnapshot() }) - it('should export a test with a reused test method', async () => { + // TODO: add support for alt. terminating keyword + it.skip('should export a test with a reused test method', async () => { const project = normalizeProject(readFile('test-case-reuse.side')) const results = await emitTest({ baseUrl: project.url, @@ -68,7 +69,8 @@ describe.skip('Code Export Java JUnit Selenium', () => { expect(results.body).toBeDefined() expect(results.body).toMatchSnapshot() }) - it('should export a suite with a reused test method', async () => { + // TODO: add support for alt. terminating keyword + it.skip('should export a suite with a reused test method', async () => { const project = normalizeProject(readFile('test-case-reuse.side')) const results = await emitSuite({ baseUrl: project.url, @@ -88,7 +90,8 @@ describe.skip('Code Export Java JUnit Selenium', () => { expect(results.body).toBeDefined() expect(results.body).toMatchSnapshot() }) - it('should export a test with commands that open a new window', async () => { + // TODO: add support for alt. terminating keyword + it.skip('should export a test with commands that open a new window', async () => { const project = normalizeProject(readFile('select-window.side')) const results = await emitTest({ baseUrl: project.url, @@ -98,7 +101,8 @@ describe.skip('Code Export Java JUnit Selenium', () => { expect(results.body).toBeDefined() expect(results.body).toMatchSnapshot() }) - it('should export a suite with commands that open a new window inside of a reused test method', async () => { + // TODO: add support for alt. terminating keyword + it.skip('should export a suite with commands that open a new window inside of a reused test method', async () => { const project = normalizeProject(readFile('nested-select-window.side')) const results = await emitSuite({ baseUrl: project.url, @@ -108,7 +112,8 @@ describe.skip('Code Export Java JUnit Selenium', () => { expect(results.body).toBeDefined() expect(results.body).toMatchSnapshot() }) - it('should export a suite with just one new window util method when there are multiple commands that open a new window', async () => { + // TODO: add support for alt. terminating keyword + it.skip('should export a suite with just one new window util method when there are multiple commands that open a new window', async () => { const project = normalizeProject(readFile('nested-select-window-v2.side')) const results = await emitSuite({ baseUrl: project.url, From 034d4ae6667bfc3f15932531ed89f3dc8f7ab68a Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Thu, 20 Jun 2019 10:49:07 +0300 Subject: [PATCH 62/99] Added support for an alternative terminatingKeyword when emitting methods/functions --- .../code-export-javascript-mocha/src/command.js | 7 +++++-- .../code-export-javascript-mocha/src/index.js | 17 ++++++++--------- packages/code-export-utils/src/emit.js | 10 ++++++++-- packages/code-export-utils/src/register.js | 6 +++++- 4 files changed, 26 insertions(+), 14 deletions(-) diff --git a/packages/code-export-javascript-mocha/src/command.js b/packages/code-export-javascript-mocha/src/command.js index 3d6352637f..d325159aef 100644 --- a/packages/code-export-javascript-mocha/src/command.js +++ b/packages/code-export-javascript-mocha/src/command.js @@ -146,10 +146,13 @@ function variableSetter(varName, value) { function emitWaitForWindow() { const generateMethodDeclaration = name => { - return `async function ${name}(timeout = 2) {` + return { + body: `async function ${name}(timeout = 2) {`, + terminatingKeyword: '}', + } } const commands = [ - { level: 0, statement: 'await driver.sleep(timeout / 1000)' }, + { level: 0, statement: 'await driver.sleep(timeout)' }, { level: 0, statement: 'const handlesThen = vars["windowHandles"]' }, { level: 0, diff --git a/packages/code-export-javascript-mocha/src/index.js b/packages/code-export-javascript-mocha/src/index.js index 092878848e..233e5c2177 100644 --- a/packages/code-export-javascript-mocha/src/index.js +++ b/packages/code-export-javascript-mocha/src/index.js @@ -34,19 +34,18 @@ opts.generateMethodDeclaration = generateMethodDeclaration // Create generators for dynamic string creation of primary entities (e.g., filename, methods, test, and suite) function generateTestDeclaration(name) { - return `it('${exporter.parsers.uncapitalize( - exporter.parsers.sanitizeName(name) - )}', async function() {` + return `it('${name}', async function() {` } function generateMethodDeclaration(name) { - return `async function ${exporter.parsers.uncapitalize( - exporter.parsers.sanitizeName(name) - )}() {` + return { + body: `async function ${exporter.parsers.uncapitalize( + exporter.parsers.sanitizeName(name) + )}() {`, + terminatingKeyword: '}', + } } function generateSuiteDeclaration(name) { - return `describe('${exporter.parsers.uncapitalize( - exporter.parsers.sanitizeName(name) - )}', function() {` + return `describe('${name}', function() {` } function generateFilename(name) { return `${exporter.parsers.uncapitalize( diff --git a/packages/code-export-utils/src/emit.js b/packages/code-export-utils/src/emit.js index 6ef878d32c..1d7e880445 100644 --- a/packages/code-export-utils/src/emit.js +++ b/packages/code-export-utils/src/emit.js @@ -105,6 +105,12 @@ async function emitMethod( } = {} ) { const methodDeclaration = generateMethodDeclaration(method.name) + let _methodDeclaration = methodDeclaration + let _terminatingKeyword = terminatingKeyword + if (typeof methodDeclaration === 'object') { + _methodDeclaration = methodDeclaration.body + _terminatingKeyword = methodDeclaration.terminatingKeyword + } let result if (overrideCommandEmitting) { result = method.commands.map( @@ -114,9 +120,9 @@ async function emitMethod( result = await emitCommands(method.commands, emitter) } return [ - methodDeclaration, + _methodDeclaration, result.join(`\n${commandPrefixPadding}`).replace(/^/, commandPrefixPadding), - terminatingKeyword, + _terminatingKeyword, ] } diff --git a/packages/code-export-utils/src/register.js b/packages/code-export-utils/src/register.js index c4cde87442..1d4bddbac0 100644 --- a/packages/code-export-utils/src/register.js +++ b/packages/code-export-utils/src/register.js @@ -49,7 +49,11 @@ export async function registerMethod( result, { generateMethodDeclaration, hooks } ) { - const methodDeclaration = generateMethodDeclaration(name) + let methodDeclaration = generateMethodDeclaration(name) + methodDeclaration = + typeof methodDeclaration === 'object' + ? methodDeclaration.body + : methodDeclaration if (!(await hooks.declareMethods.isRegistered(methodDeclaration))) { result.forEach(statement => { hooks.declareMethods.register(() => { From af5c764fecb8b779f0900e43c6d38654bedbd56e Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Thu, 20 Jun 2019 10:50:14 +0300 Subject: [PATCH 63/99] Updated e2e tests --- .../src/__snapshots__/index.spec.js.snap | 370 +++++++++--------- .../__test__/src/index.spec.js | 15 +- 2 files changed, 183 insertions(+), 202 deletions(-) diff --git a/packages/code-export-javascript-mocha/__test__/src/__snapshots__/index.spec.js.snap b/packages/code-export-javascript-mocha/__test__/src/__snapshots__/index.spec.js.snap index 16c0d318d9..3b00328097 100644 --- a/packages/code-export-javascript-mocha/__test__/src/__snapshots__/index.spec.js.snap +++ b/packages/code-export-javascript-mocha/__test__/src/__snapshots__/index.spec.js.snap @@ -15,7 +15,7 @@ describe('login', function() { afterEach(async function() { await driver.quit(); }) - it('validcredentials', async function() { + it('valid credentials', async function() { await driver.get(\\"http://the-internet.herokuapp.com/login\\") await driver.setRect(1440, 1177) await driver.findElement(By.id(\\"username\\")).sendKeys(\\"tomsmith\\") @@ -23,7 +23,7 @@ describe('login', function() { await driver.findElement(By.css(\\"#login button\\")).click() assert(await driver.findElement(By.css(\\".flash.success\\")).getText() == \\"You logged into a secure area!\\\\\\\\n×\\") }) - it('invalidcredentials', async function() { + it('invalid credentials', async function() { await driver.get(\\"http://the-internet.herokuapp.com/login\\") await driver.setRect(1440, 1177) await driver.findElement(By.id(\\"username\\")).sendKeys(\\"blah\\") @@ -40,7 +40,7 @@ exports[`Code Export Java JUnit Selenium should export a suite that uses control const { Builder, By, Key, until } = require('selenium-webdriver') const assert = require('assert') -describe('controlflow', function() { +describe('control flow', function() { let driver let vars beforeEach(async function() { @@ -50,7 +50,7 @@ describe('controlflow', function() { afterEach(async function() { await driver.quit(); }) - it('controlflowif', async function() { + it('control flow if', async function() { vars[\\"myVar\\"] = await driver.executeScript(\\"return 'a'\\") if (!!await driver.executeScript(\\"return (arguments[0] === 'a')\\", vars[\\"myVar\\"])) { vars[\\"output\\"] = await driver.executeScript(\\"return 'a'\\") @@ -61,7 +61,7 @@ describe('controlflow', function() { } assert(vars[\\"output\\"] == \\"a\\") }) - it('controlflowelseif', async function() { + it('control flow else if', async function() { vars[\\"myVar\\"] = await driver.executeScript(\\"return 'b'\\") if (!!await driver.executeScript(\\"return (arguments[0] === 'a')\\", vars[\\"myVar\\"])) { vars[\\"output\\"] = await driver.executeScript(\\"return 'a'\\") @@ -72,7 +72,7 @@ describe('controlflow', function() { } assert(vars[\\"output\\"] == \\"b\\") }) - it('controlflowelse', async function() { + it('control flow else', async function() { vars[\\"myVar\\"] = await driver.executeScript(\\"return 'c'\\") if (!!await driver.executeScript(\\"return (arguments[0] === 'a')\\", vars[\\"myVar\\"])) { vars[\\"output\\"] = await driver.executeScript(\\"return 'a'\\") @@ -83,14 +83,14 @@ describe('controlflow', function() { } assert(vars[\\"output\\"] == \\"c\\") }) - it('controlflowdo', async function() { + it('control flow do', async function() { vars[\\"check\\"] = await driver.executeScript(\\"return 1\\") do { vars[\\"check\\"] = await driver.executeScript(\\"return arguments[0] + 1\\", vars[\\"check\\"]) } while(!!await driver.executeScript(\\"return (arguments[0] < 3)\\", vars[\\"check\\"])) assert(vars[\\"check\\"] == \\"3\\") }) - it('controlflowtimes', async function() { + it('control flow times', async function() { vars[\\"check\\"] = await driver.executeScript(\\"return 1\\") const times = 2 for(let i = 0; i < times; i++) { @@ -98,7 +98,7 @@ describe('controlflow', function() { } assert(vars[\\"check\\"] == \\"3\\") }) - it('controlflowwhile', async function() { + it('control flow while', async function() { vars[\\"check\\"] = await driver.executeScript(\\"return 1\\") while(!!await driver.executeScript(\\"return (arguments[0] < 3)\\", vars[\\"check\\"])) { vars[\\"check\\"] = await driver.executeScript(\\"return arguments[0] + 1\\", vars[\\"check\\"]) @@ -110,132 +110,124 @@ describe('controlflow', function() { `; exports[`Code Export Java JUnit Selenium should export a suite with a reused test method 1`] = ` -"# Generated by Selenium IDE -import pytest -import time -import json -from selenium import webdriver -from selenium.webdriver.common.by import By -from selenium.webdriver.common.action_chains import ActionChains -from selenium.webdriver.support import expected_conditions -from selenium.webdriver.support.wait import WebDriverWait -from selenium.webdriver.common.keys import Keys +"// Generated by Selenium IDE +const { Builder, By, Key, until } = require('selenium-webdriver') +const assert = require('assert') -class TestLogin(): - def setup_method(self, method): - self.driver = webdriver.Firefox() - self.vars = {} - - def teardown_method(self, method): - self.driver.quit(); - - def login(self): - self.driver.get(\\"https://the-internet.herokuapp.com/\\") - self.driver.find_element(By.LINK_TEXT, \\"Form Authentication\\").click() - self.driver.find_element(By.ID, \\"username\\").send_keys(self.vars[\\"username\\"]) - self.driver.find_element(By.ID, \\"password\\").send_keys(self.vars[\\"password\\"]) - self.driver.find_element(By.CSS_SELECTOR, \\".fa\\").click() - - def test_invalidcredentials(self): - self.vars[\\"username\\"] = \\"blah\\" - self.vars[\\"password\\"] = \\"blah\\" - self.login() - - def test_validcredentials(self): - self.vars[\\"username\\"] = \\"tomsmith\\" - self.vars[\\"password\\"] = \\"SuperSecretPassword!\\" - self.login() - +describe('login', function() { + let driver + let vars + beforeEach(async function() { + driver = await new Builder().forBrowser('firefox').build() + vars = {} + }) + afterEach(async function() { + await driver.quit(); + }) + async function login() { + await driver.get(\\"https://the-internet.herokuapp.com/\\") + await driver.findElement(By.linkText(\\"Form Authentication\\")).click() + await driver.findElement(By.id(\\"username\\")).sendKeys(vars[\\"username\\"]) + await driver.findElement(By.id(\\"password\\")).sendKeys(vars[\\"password\\"]) + await driver.findElement(By.css(\\".fa\\")).click() + } + it('invalid credentials', async function() { + vars[\\"username\\"] = \\"blah\\" + vars[\\"password\\"] = \\"blah\\" + login() + }) + it('valid credentials', async function() { + vars[\\"username\\"] = \\"tomsmith\\" + vars[\\"password\\"] = \\"SuperSecretPassword!\\" + login() + }) +}) " `; exports[`Code Export Java JUnit Selenium should export a suite with commands that open a new window inside of a reused test method 1`] = ` -"# Generated by Selenium IDE -import pytest -import time -import json -from selenium import webdriver -from selenium.webdriver.common.by import By -from selenium.webdriver.common.action_chains import ActionChains -from selenium.webdriver.support import expected_conditions -from selenium.webdriver.support.wait import WebDriverWait -from selenium.webdriver.common.keys import Keys +"// Generated by Selenium IDE +const { Builder, By, Key, until } = require('selenium-webdriver') +const assert = require('assert') -class TestDefaultSuite(): - def setup_method(self, method): - self.driver = webdriver.Firefox() - self.vars = {} - - def teardown_method(self, method): - self.driver.quit(); - - def wait_for_window(self, timeout = 2): - time.sleep(round(timeout / 1000)) - wh_now = self.driver.window_handles - wh_then = self.vars[\\"window_handles\\"] - if len(wh_now) > len(wh_then): - return set(wh_now).difference(set(wh_then)).pop() - - def selectwindow(self): - self.driver.get(\\"http://the-internet.herokuapp.com/windows\\") - self.vars[\\"window_handles\\"] = self.driver.window_handles - self.driver.find_element(By.LINK_TEXT, \\"Click Here\\").click() - self.vars[\\"win9425\\"] = self.wait_for_window(2000) - self.driver.switch_to.window(self.vars[\\"win9425\\"]) - assert self.driver.title == \\"New Window\\" - - def test_reuse(self): - self.selectwindow() - +describe('Default Suite', function() { + let driver + let vars + beforeEach(async function() { + driver = await new Builder().forBrowser('firefox').build() + vars = {} + }) + afterEach(async function() { + await driver.quit(); + }) + 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\\") + } + async function selectwindow() { + await driver.get(\\"http://the-internet.herokuapp.com/windows\\") + vars[\\"windowHandles\\"] = await driver.getAllWindowHandles() + await driver.findElement(By.linkText(\\"Click Here\\")).click() + vars[\\"win9425\\"] = await waitForWindow(2000) + await driver.switchTo().window(vars[\\"win9425\\"]) + assert(await driver.getTitle() == \\"New Window\\") + } + it('reuse', async function() { + selectwindow() + }) +}) " `; exports[`Code Export Java JUnit Selenium should export a suite with just one new window util method when there are multiple commands that open a new window 1`] = ` -"# Generated by Selenium IDE -import pytest -import time -import json -from selenium import webdriver -from selenium.webdriver.common.by import By -from selenium.webdriver.common.action_chains import ActionChains -from selenium.webdriver.support import expected_conditions -from selenium.webdriver.support.wait import WebDriverWait -from selenium.webdriver.common.keys import Keys +"// Generated by Selenium IDE +const { Builder, By, Key, until } = require('selenium-webdriver') +const assert = require('assert') -class TestDefaultSuite(): - def setup_method(self, method): - self.driver = webdriver.Firefox() - self.vars = {} - - def teardown_method(self, method): - self.driver.quit(); - - def wait_for_window(self, timeout = 2): - time.sleep(round(timeout / 1000)) - wh_now = self.driver.window_handles - wh_then = self.vars[\\"window_handles\\"] - if len(wh_now) > len(wh_then): - return set(wh_now).difference(set(wh_then)).pop() - - def selectwindow(self): - self.driver.get(\\"http://the-internet.herokuapp.com/windows\\") - self.vars[\\"window_handles\\"] = self.driver.window_handles - self.driver.find_element(By.LINK_TEXT, \\"Click Here\\").click() - self.vars[\\"win9425\\"] = self.wait_for_window(2000) - self.driver.switch_to.window(self.vars[\\"win9425\\"]) - assert self.driver.title == \\"New Window\\" - - def test_reuse(self): - self.selectwindow() - - def test_selectwindow(self): - self.driver.get(\\"http://the-internet.herokuapp.com/windows\\") - self.vars[\\"window_handles\\"] = self.driver.window_handles - self.driver.find_element(By.LINK_TEXT, \\"Click Here\\").click() - self.vars[\\"win9425\\"] = self.wait_for_window(2000) - self.driver.switch_to.window(self.vars[\\"win9425\\"]) - assert self.driver.title == \\"New Window\\" - +describe('Default Suite', function() { + let driver + let vars + beforeEach(async function() { + driver = await new Builder().forBrowser('firefox').build() + vars = {} + }) + afterEach(async function() { + await driver.quit(); + }) + 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\\") + } + async function selectwindow() { + await driver.get(\\"http://the-internet.herokuapp.com/windows\\") + vars[\\"windowHandles\\"] = await driver.getAllWindowHandles() + await driver.findElement(By.linkText(\\"Click Here\\")).click() + vars[\\"win9425\\"] = await waitForWindow(2000) + await driver.switchTo().window(vars[\\"win9425\\"]) + assert(await driver.getTitle() == \\"New Window\\") + } + it('reuse', async function() { + selectwindow() + }) + it('select window', async function() { + await driver.get(\\"http://the-internet.herokuapp.com/windows\\") + vars[\\"windowHandles\\"] = await driver.getAllWindowHandles() + await driver.findElement(By.linkText(\\"Click Here\\")).click() + vars[\\"win9425\\"] = await waitForWindow(2000) + await driver.switchTo().window(vars[\\"win9425\\"]) + assert(await driver.getTitle() == \\"New Window\\") + }) +}) " `; @@ -267,79 +259,73 @@ describe('login', function() { `; exports[`Code Export Java JUnit Selenium should export a test with a reused test method 1`] = ` -"# Generated by Selenium IDE -import pytest -import time -import json -from selenium import webdriver -from selenium.webdriver.common.by import By -from selenium.webdriver.common.action_chains import ActionChains -from selenium.webdriver.support import expected_conditions -from selenium.webdriver.support.wait import WebDriverWait -from selenium.webdriver.common.keys import Keys +"// Generated by Selenium IDE +const { Builder, By, Key, until } = require('selenium-webdriver') +const assert = require('assert') -class TestValidcredentials(): - def setup_method(self, method): - self.driver = webdriver.Firefox() - self.vars = {} - - def teardown_method(self, method): - self.driver.quit(); - - def login(self): - self.driver.get(\\"https://the-internet.herokuapp.com/\\") - self.driver.find_element(By.LINK_TEXT, \\"Form Authentication\\").click() - self.driver.find_element(By.ID, \\"username\\").send_keys(self.vars[\\"username\\"]) - self.driver.find_element(By.ID, \\"password\\").send_keys(self.vars[\\"password\\"]) - self.driver.find_element(By.CSS_SELECTOR, \\".fa\\").click() - - def test_validcredentials(self): - self.vars[\\"username\\"] = \\"tomsmith\\" - self.vars[\\"password\\"] = \\"SuperSecretPassword!\\" - self.login() - +describe('valid credentials', function() { + let driver + let vars + beforeEach(async function() { + driver = await new Builder().forBrowser('firefox').build() + vars = {} + }) + afterEach(async function() { + await driver.quit(); + }) + async function login() { + await driver.get(\\"https://the-internet.herokuapp.com/\\") + await driver.findElement(By.linkText(\\"Form Authentication\\")).click() + await driver.findElement(By.id(\\"username\\")).sendKeys(vars[\\"username\\"]) + await driver.findElement(By.id(\\"password\\")).sendKeys(vars[\\"password\\"]) + await driver.findElement(By.css(\\".fa\\")).click() + } + it('valid credentials', async function() { + vars[\\"username\\"] = \\"tomsmith\\" + vars[\\"password\\"] = \\"SuperSecretPassword!\\" + login() + }) +}) " `; exports[`Code Export Java JUnit Selenium should export a test with commands that open a new window 1`] = ` -"# Generated by Selenium IDE -import pytest -import time -import json -from selenium import webdriver -from selenium.webdriver.common.by import By -from selenium.webdriver.common.action_chains import ActionChains -from selenium.webdriver.support import expected_conditions -from selenium.webdriver.support.wait import WebDriverWait -from selenium.webdriver.common.keys import Keys +"// Generated by Selenium IDE +const { Builder, By, Key, until } = require('selenium-webdriver') +const assert = require('assert') -class TestSelectwindow(): - def setup_method(self, method): - self.driver = webdriver.Firefox() - self.vars = {} - - def teardown_method(self, method): - self.driver.quit(); - - def wait_for_window(self, timeout = 2): - time.sleep(round(timeout / 1000)) - wh_now = self.driver.window_handles - wh_then = self.vars[\\"window_handles\\"] - if len(wh_now) > len(wh_then): - return set(wh_now).difference(set(wh_then)).pop() - - def test_selectwindow(self): - self.driver.get(\\"http://the-internet.herokuapp.com/\\") - self.driver.set_window_size(1260, 1027) - self.driver.find_element(By.LINK_TEXT, \\"Multiple Windows\\").click() - self.vars[\\"window_handles\\"] = self.driver.window_handles - self.driver.find_element(By.LINK_TEXT, \\"Click Here\\").click() - self.vars[\\"win9625\\"] = self.wait_for_window(2000) - self.vars[\\"root\\"] = self.driver.current_window_handle - self.driver.switch_to.window(self.vars[\\"win9625\\"]) - assert self.driver.title == \\"New Window\\" - self.driver.switch_to.window(self.vars[\\"root\\"]) - assert self.driver.title == \\"The Internet\\" - +describe('select window', function() { + let driver + let vars + beforeEach(async function() { + driver = await new Builder().forBrowser('firefox').build() + vars = {} + }) + afterEach(async function() { + await driver.quit(); + }) + 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\\") + } + it('select window', async function() { + await driver.get(\\"http://the-internet.herokuapp.com/\\") + await driver.setRect(1260, 1027) + await driver.findElement(By.linkText(\\"Multiple Windows\\")).click() + vars[\\"windowHandles\\"] = await driver.getAllWindowHandles() + await driver.findElement(By.linkText(\\"Click Here\\")).click() + vars[\\"win9625\\"] = await waitForWindow(2000) + vars[\\"root\\"] = await driver.getWindowHandle() + await driver.switchTo().window(vars[\\"win9625\\"]) + assert(await driver.getTitle() == \\"New Window\\") + await driver.switchTo().window(vars[\\"root\\"]) + assert(await driver.getTitle() == \\"The Internet\\") + }) +}) " `; diff --git a/packages/code-export-javascript-mocha/__test__/src/index.spec.js b/packages/code-export-javascript-mocha/__test__/src/index.spec.js index e604f47f73..6f0d40c7c0 100644 --- a/packages/code-export-javascript-mocha/__test__/src/index.spec.js +++ b/packages/code-export-javascript-mocha/__test__/src/index.spec.js @@ -58,8 +58,7 @@ describe('Code Export Java JUnit Selenium', () => { expect(results.body).toBeDefined() expect(results.body).toMatchSnapshot() }) - // TODO: add support for alt. terminating keyword - it.skip('should export a test with a reused test method', async () => { + it('should export a test with a reused test method', async () => { const project = normalizeProject(readFile('test-case-reuse.side')) const results = await emitTest({ baseUrl: project.url, @@ -69,8 +68,7 @@ describe('Code Export Java JUnit Selenium', () => { expect(results.body).toBeDefined() expect(results.body).toMatchSnapshot() }) - // TODO: add support for alt. terminating keyword - it.skip('should export a suite with a reused test method', async () => { + it('should export a suite with a reused test method', async () => { const project = normalizeProject(readFile('test-case-reuse.side')) const results = await emitSuite({ baseUrl: project.url, @@ -90,8 +88,7 @@ describe('Code Export Java JUnit Selenium', () => { expect(results.body).toBeDefined() expect(results.body).toMatchSnapshot() }) - // TODO: add support for alt. terminating keyword - it.skip('should export a test with commands that open a new window', async () => { + it('should export a test with commands that open a new window', async () => { const project = normalizeProject(readFile('select-window.side')) const results = await emitTest({ baseUrl: project.url, @@ -101,8 +98,7 @@ describe('Code Export Java JUnit Selenium', () => { expect(results.body).toBeDefined() expect(results.body).toMatchSnapshot() }) - // TODO: add support for alt. terminating keyword - it.skip('should export a suite with commands that open a new window inside of a reused test method', async () => { + it('should export a suite with commands that open a new window inside of a reused test method', async () => { const project = normalizeProject(readFile('nested-select-window.side')) const results = await emitSuite({ baseUrl: project.url, @@ -112,8 +108,7 @@ describe('Code Export Java JUnit Selenium', () => { expect(results.body).toBeDefined() expect(results.body).toMatchSnapshot() }) - // TODO: add support for alt. terminating keyword - it.skip('should export a suite with just one new window util method when there are multiple commands that open a new window', async () => { + it('should export a suite with just one new window util method when there are multiple commands that open a new window', async () => { const project = normalizeProject(readFile('nested-select-window-v2.side')) const results = await emitSuite({ baseUrl: project.url, From 7d7c1333845509343f8ce33b8d92e477e97f5074 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Thu, 20 Jun 2019 10:50:47 +0300 Subject: [PATCH 64/99] Enabled JS code export in the UI --- packages/code-export/src/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/code-export/src/index.js b/packages/code-export/src/index.js index 6f6284b1bd..a7e3c12caf 100644 --- a/packages/code-export/src/index.js +++ b/packages/code-export/src/index.js @@ -18,7 +18,7 @@ export const availableLanguages = { 'java-junit': require('code-export-java-junit'), 'python-pytest': require('code-export-python-pytest'), - //'javascript-mocha': require('code-export-javascript-mocha'), + 'javascript-mocha': require('code-export-javascript-mocha'), } function registerCommand(language, command, emitter) { From 0bbc6f8a3f9878ccde33da0e325acdef854bce1f Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Thu, 20 Jun 2019 11:53:54 +0300 Subject: [PATCH 65/99] Added a mocha timeout to the variables hook --- .../__test__/src/__snapshots__/index.spec.js.snap | 8 ++++++++ packages/code-export-javascript-mocha/src/hook.js | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/packages/code-export-javascript-mocha/__test__/src/__snapshots__/index.spec.js.snap b/packages/code-export-javascript-mocha/__test__/src/__snapshots__/index.spec.js.snap index 3b00328097..d50c357192 100644 --- a/packages/code-export-javascript-mocha/__test__/src/__snapshots__/index.spec.js.snap +++ b/packages/code-export-javascript-mocha/__test__/src/__snapshots__/index.spec.js.snap @@ -6,6 +6,7 @@ const { Builder, By, Key, until } = require('selenium-webdriver') const assert = require('assert') describe('login', function() { + this.timeout(30000) let driver let vars beforeEach(async function() { @@ -41,6 +42,7 @@ const { Builder, By, Key, until } = require('selenium-webdriver') const assert = require('assert') describe('control flow', function() { + this.timeout(30000) let driver let vars beforeEach(async function() { @@ -115,6 +117,7 @@ const { Builder, By, Key, until } = require('selenium-webdriver') const assert = require('assert') describe('login', function() { + this.timeout(30000) let driver let vars beforeEach(async function() { @@ -151,6 +154,7 @@ const { Builder, By, Key, until } = require('selenium-webdriver') const assert = require('assert') describe('Default Suite', function() { + this.timeout(30000) let driver let vars beforeEach(async function() { @@ -190,6 +194,7 @@ const { Builder, By, Key, until } = require('selenium-webdriver') const assert = require('assert') describe('Default Suite', function() { + this.timeout(30000) let driver let vars beforeEach(async function() { @@ -237,6 +242,7 @@ const { Builder, By, Key, until } = require('selenium-webdriver') const assert = require('assert') describe('login', function() { + this.timeout(30000) let driver let vars beforeEach(async function() { @@ -264,6 +270,7 @@ const { Builder, By, Key, until } = require('selenium-webdriver') const assert = require('assert') describe('valid credentials', function() { + this.timeout(30000) let driver let vars beforeEach(async function() { @@ -295,6 +302,7 @@ const { Builder, By, Key, until } = require('selenium-webdriver') const assert = require('assert') describe('select window', function() { + this.timeout(30000) let driver let vars beforeEach(async function() { diff --git a/packages/code-export-javascript-mocha/src/hook.js b/packages/code-export-javascript-mocha/src/hook.js index 1ddb084090..f46e829268 100644 --- a/packages/code-export-javascript-mocha/src/hook.js +++ b/packages/code-export-javascript-mocha/src/hook.js @@ -126,6 +126,10 @@ function declareVariables() { const params = { startingSyntax: { commands: [ + { + level: 0, + statement: `this.timeout(30000)`, + }, { level: 0, statement: `let driver`, From 7c8e95b9317d6a8691660f01cdb8c1b338582c1e Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Thu, 20 Jun 2019 11:54:48 +0300 Subject: [PATCH 66/99] Added sub-closures to commands that use local variables --- .../__test__/src/command.spec.js | 90 +++++++----- .../src/command.js | 134 ++++++++++++------ 2 files changed, 144 insertions(+), 80 deletions(-) diff --git a/packages/code-export-javascript-mocha/__test__/src/command.spec.js b/packages/code-export-javascript-mocha/__test__/src/command.spec.js index ba2d793e4e..7d490e0467 100644 --- a/packages/code-export-javascript-mocha/__test__/src/command.spec.js +++ b/packages/code-export-javascript-mocha/__test__/src/command.spec.js @@ -58,7 +58,7 @@ describe('command code emitter', () => { value: 'label=A label', } return expect(prettify(command)).resolves.toBe( - `const dropdown = await driver.findElement(By.css("select"))\nawait dropdown.findElement(By.xpath("//option[. = 'A label']")).click()` + `{\n${commandPrefixPadding}const dropdown = await driver.findElement(By.css("select"))\n${commandPrefixPadding}await dropdown.findElement(By.xpath("//option[. = 'A label']")).click()\n}` ) }) it('should emit `assert` command', () => { @@ -108,7 +108,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `const element = await driver.findElement(By.id("text"))\nassert(await element.isEnabled())` + `{\n${commandPrefixPadding}const element = await driver.findElement(By.id("text"))\n${commandPrefixPadding}assert(await element.isEnabled())\n}` ) }) it('should emit `assert element present` command', () => { @@ -118,7 +118,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `const elements = await driver.findElements(By.id("element"))\nassert(elements.length)` + `{\n${commandPrefixPadding}const elements = await driver.findElements(By.id("element"))\n${commandPrefixPadding}assert(elements.length)\n}` ) }) it('should emit `assert element not present` command', () => { @@ -128,7 +128,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `const elements = await driver.findElements(By.id("element"))\nassert(!elements.length)` + `{\n${commandPrefixPadding}const elements = await driver.findElements(By.id("element"))\n${commandPrefixPadding}assert(!elements.length)\n}` ) }) it('should emit `assert not checked` command', () => { @@ -148,7 +148,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `const element = await driver.findElement(By.id("text"))\nassert(!await element.isEnabled())` + `{\n${commandPrefixPadding}const element = await driver.findElement(By.id("text"))\n${commandPrefixPadding}assert(!await element.isEnabled())\n}` ) }) it('should emit `assert not selected value` command', () => { @@ -158,7 +158,7 @@ describe('command code emitter', () => { value: 'test', } return expect(prettify(command)).resolves.toBe( - `const value = await driver.findElement(By.id("select")).getAttribute("value")\nassert(value !== "test")` + `{\n${commandPrefixPadding}const value = await driver.findElement(By.id("select")).getAttribute("value")\n${commandPrefixPadding}assert(value !== "test")\n}` ) }) it('should emit `assert not text` command', () => { @@ -168,7 +168,7 @@ describe('command code emitter', () => { value: 'text', } return expect(prettify(command)).resolves.toBe( - `const text = await driver.findElement(By.id("test")).getText()\nassert(text !== "text")` + `{\n${commandPrefixPadding}const text = await driver.findElement(By.id("test")).getText()\n${commandPrefixPadding}assert(text !== "text")\n}` ) }) it('should emit `assert prompt` command', () => { @@ -188,7 +188,15 @@ describe('command code emitter', () => { value: 'test', } return expect(prettify(command)).resolves.toBe( - 'const element = await driver.findElement(By.id("test")).getAttribute("value")\nconst locator = `option[@value=\'${element}\']`\nconst selectedText = element.findElement(By.xpath(locator)).getText()\nassert(selectedText == "test")' + '{\n' + + commandPrefixPadding + + 'const element = await driver.findElement(By.id("test")).getAttribute("value")\n' + + commandPrefixPadding + + "const locator = `option[@value='${element}']`\n" + + commandPrefixPadding + + 'const selectedText = element.findElement(By.xpath(locator)).getText()\n' + + commandPrefixPadding + + 'assert(selectedText == "test")\n}' ) }) it('should emit `assert selected value` command', () => { @@ -198,7 +206,7 @@ describe('command code emitter', () => { value: 'test', } return expect(prettify(command)).resolves.toBe( - `const value = await driver.findElement(By.id("select")).getAttribute("value")\nassert(value == "test")` + `{\n${commandPrefixPadding}const value = await driver.findElement(By.id("select")).getAttribute("value")\n${commandPrefixPadding}assert(value == "test")\n}` ) }) it('should emit `assert text` command', () => { @@ -228,7 +236,7 @@ describe('command code emitter', () => { value: 'test', } return expect(prettify(command)).resolves.toBe( - `const value = await driver.findElement(By.id("select")).getAttribute("value")\nassert(value == "test")` + `{\n${commandPrefixPadding}const value = await driver.findElement(By.id("select")).getAttribute("value")\n${commandPrefixPadding}assert(value == "test")\n}` ) }) it('should emit `click` command', () => { @@ -258,7 +266,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `const element = await driver.findElement(By.id("f"))\nif (await element.isSelected()) await element.click()` + `{\n${commandPrefixPadding}const element = await driver.findElement(By.id("f"))\n${commandPrefixPadding}if (!(await element.isSelected())) await element.click()\n}` ) }) it('should emit `close` command', () => { @@ -287,7 +295,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `const element = await driver.findElement(By.linkText("button"))\nawait driver.actions({ bridge: true}).doubleClick(element).perform()` + `{\n${commandPrefixPadding}const element = await driver.findElement(By.linkText("button"))\n${commandPrefixPadding}await driver.actions({ bridge: true}).doubleClick(element).perform()\n}` ) }) it('should emit `double click at` command', () => { @@ -297,7 +305,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `const element = await driver.findElement(By.linkText("button"))\nawait driver.actions({ bridge: true}).doubleClick(element).perform()` + `{\n${commandPrefixPadding}const element = await driver.findElement(By.linkText("button"))\n${commandPrefixPadding}await driver.actions({ bridge: true}).doubleClick(element).perform()\n}` ) }) it('should emit `drag and drop to object` command', () => { @@ -307,7 +315,7 @@ describe('command code emitter', () => { value: 'link=dropped', } return expect(prettify(command)).resolves.toBe( - `const dragged = await driver.findElement(By.linkText("dragged"))\nconst dropped = await driver.findElement(By.linkText("dropped"))\nawait driver.actions({ bridge: true }).dragAndDrop(dragged, dropped).perform()` + `{\n${commandPrefixPadding}const dragged = await driver.findElement(By.linkText("dragged"))\n${commandPrefixPadding}const dropped = await driver.findElement(By.linkText("dropped"))\n${commandPrefixPadding}await driver.actions({ bridge: true }).dragAndDrop(dragged, dropped).perform()\n}` ) }) it('should emit `echo` command', () => { @@ -333,7 +341,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `const element = await driver.findElement(By.id("contentEditable"))\nawait driver.executeScript("if(arguments[0].contentEditable === 'true') {arguments[0].innerText = ''}", element)` + `{\n${commandPrefixPadding}const element = await driver.findElement(By.id("contentEditable"))\n${commandPrefixPadding}await driver.executeScript("if(arguments[0].contentEditable === 'true') {arguments[0].innerText = ''}", element)\n}` ) }) it('should emit `else` command', () => { @@ -428,7 +436,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `const element = await driver.findElement(By.id("button"))\nawait driver.actions({ bridge: true }).moveToElement(element).clickAndHold().perform()` + `{\n${commandPrefixPadding}const element = await driver.findElement(By.id("button"))\n${commandPrefixPadding}await driver.actions({ bridge: true }).moveToElement(element).clickAndHold().perform()\n}` ) }) it('should emit `mouse down at` event', () => { @@ -438,7 +446,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `const element = await driver.findElement(By.id("button"))\nawait driver.actions({ bridge: true }).moveToElement(element).clickAndHold().perform()` + `{\n${commandPrefixPadding}const element = await driver.findElement(By.id("button"))\n${commandPrefixPadding}await driver.actions({ bridge: true }).moveToElement(element).clickAndHold().perform()\n}` ) }) it('should emit `mouse move` event', () => { @@ -448,7 +456,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `const element = await driver.findElement(By.id("button"))\nawait driver.actions({ bridge: true }).moveToElement(element).perform()` + `{\n${commandPrefixPadding}const element = await driver.findElement(By.id("button"))\n${commandPrefixPadding}await driver.actions({ bridge: true }).moveToElement(element).perform()\n}` ) }) it('should emit `mouse move at` event', () => { @@ -458,7 +466,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `const element = await driver.findElement(By.id("button"))\nawait driver.actions({ bridge: true }).moveToElement(element).perform()` + `{\n${commandPrefixPadding}const element = await driver.findElement(By.id("button"))\n${commandPrefixPadding}await driver.actions({ bridge: true }).moveToElement(element).perform()\n}` ) }) it('should emit `mouse out` event', () => { @@ -468,7 +476,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `const element = await driver.findElement(By.CSS_SELECTOR, "body")\nawait driver.actions({ bridge: true }).moveToElement(element, 0, 0).perform()` + `{\n${commandPrefixPadding}const element = await driver.findElement(By.CSS_SELECTOR, "body")\n${commandPrefixPadding}await driver.actions({ bridge: true }).moveToElement(element, 0, 0).perform()\n}` ) }) it('should emit `mouse over` event', () => { @@ -478,7 +486,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `const element = await driver.findElement(By.id("button"))\nawait driver.actions({ bridge: true }).moveToElement(element).perform()` + `{\n${commandPrefixPadding}const element = await driver.findElement(By.id("button"))\n${commandPrefixPadding}await driver.actions({ bridge: true }).moveToElement(element).perform()\n}` ) }) it('should emit `mouse up` event', () => { @@ -488,7 +496,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `const element = await driver.findElement(By.id("button"))\nawait driver.actions({ bridge: true }).moveToElement(element).release().perform()` + `{\n${commandPrefixPadding}const element = await driver.findElement(By.id("button"))\n${commandPrefixPadding}await driver.actions({ bridge: true }).moveToElement(element).release().perform()\n}` ) }) it('should emit `mouse up at` event', () => { @@ -498,7 +506,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `const element = await driver.findElement(By.id("button"))\nawait driver.actions({ bridge: true }).moveToElement(element).release().perform()` + `{\n${commandPrefixPadding}const element = await driver.findElement(By.id("button"))\n${commandPrefixPadding}await driver.actions({ bridge: true }).moveToElement(element).release().perform()\n}` ) }) it('should emit `open` with absolute url', () => { @@ -526,7 +534,7 @@ describe('command code emitter', () => { value: 'label=A label', } return expect(prettify(command)).resolves.toBe( - `const dropdown = await driver.findElement(By.css("select"))\nawait dropdown.findElement(By.xpath("//option[. = 'A label']")).click()` + `{\n${commandPrefixPadding}const dropdown = await driver.findElement(By.css("select"))\n${commandPrefixPadding}await dropdown.findElement(By.xpath("//option[. = 'A label']")).click()\n}` ) }) it('should emit `repeatIf` command', () => { @@ -564,7 +572,7 @@ describe('command code emitter', () => { value: 'label=A label', } return expect(prettify(command)).resolves.toBe( - `const dropdown = await driver.findElement(By.css("select"))\nawait dropdown.findElement(By.xpath("//option[. = 'A label']")).click()` + `{\n${commandPrefixPadding}const dropdown = await driver.findElement(By.css("select"))\n${commandPrefixPadding}await dropdown.findElement(By.xpath("//option[. = 'A label']")).click()\n}` ) }) it('should emit `select frame` to select the top frame', () => { @@ -703,7 +711,7 @@ describe('command code emitter', () => { value: 'myVar', } return expect(prettify(command)).resolves.toBe( - `const attribute = await driver.findElement(By.xpath("button[3]")).getAttribute("id")\nvars["myVar"] = attribute` + `{\n${commandPrefixPadding}const attribute = await driver.findElement(By.xpath("button[3]")).getAttribute("id")\n${commandPrefixPadding}vars["myVar"] = attribute\n}` ) }) it('should emit `store text` command', () => { @@ -804,7 +812,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `const element = await driver.findElement(By.id("f"))\nif (await element.isSelected()) await element.click()` + `{\n${commandPrefixPadding}const element = await driver.findElement(By.id("f"))\n${commandPrefixPadding}if (await element.isSelected()) await element.click()\n}` ) }) it('should emit `verify` command', () => { @@ -834,7 +842,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `const element = await driver.findElement(By.id("text"))\nassert(await element.isEnabled())` + `{\n${commandPrefixPadding}const element = await driver.findElement(By.id("text"))\n${commandPrefixPadding}assert(await element.isEnabled())\n}` ) }) it('should emit `verify element present` command', () => { @@ -844,7 +852,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `const elements = await driver.findElements(By.id("element"))\nassert(elements.length)` + `{\n${commandPrefixPadding}const elements = await driver.findElements(By.id("element"))\n${commandPrefixPadding}assert(elements.length)\n}` ) }) it('should emit `verify element not present` command', () => { @@ -854,7 +862,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `const elements = await driver.findElements(By.id("element"))\nassert(!elements.length)` + `{\n${commandPrefixPadding}const elements = await driver.findElements(By.id("element"))\n${commandPrefixPadding}assert(!elements.length)\n}` ) }) it('should emit `verify not checked` command', () => { @@ -874,7 +882,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `const element = await driver.findElement(By.id("text"))\nassert(!await element.isEnabled())` + `{\n${commandPrefixPadding}const element = await driver.findElement(By.id("text"))\n${commandPrefixPadding}assert(!await element.isEnabled())\n}` ) }) it('should emit `verify not selected value` command', () => { @@ -884,7 +892,7 @@ describe('command code emitter', () => { value: 'test', } return expect(prettify(command)).resolves.toBe( - `const value = await driver.findElement(By.id("select")).getAttribute("value")\nassert(value !== "test")` + `{\n${commandPrefixPadding}const value = await driver.findElement(By.id("select")).getAttribute("value")\n${commandPrefixPadding}assert(value !== "test")\n}` ) }) it('should emit `verify not text` command', () => { @@ -894,7 +902,7 @@ describe('command code emitter', () => { value: 'text', } return expect(prettify(command)).resolves.toBe( - `const text = await driver.findElement(By.id("test")).getText()\nassert(text !== "text")` + `{\n${commandPrefixPadding}const text = await driver.findElement(By.id("test")).getText()\n${commandPrefixPadding}assert(text !== "text")\n}` ) }) it("should emit 'verify selected label' command", () => { @@ -904,7 +912,15 @@ describe('command code emitter', () => { value: 'test', } return expect(prettify(command)).resolves.toBe( - 'const element = await driver.findElement(By.id("test")).getAttribute("value")\nconst locator = `option[@value=\'${element}\']`\nconst selectedText = element.findElement(By.xpath(locator)).getText()\nassert(selectedText == "test")' + '{\n' + + commandPrefixPadding + + 'const element = await driver.findElement(By.id("test")).getAttribute("value")\n' + + commandPrefixPadding + + "const locator = `option[@value='${element}']`\n" + + commandPrefixPadding + + 'const selectedText = element.findElement(By.xpath(locator)).getText()\n' + + commandPrefixPadding + + 'assert(selectedText == "test")\n}' ) }) it('should emit `verify value` command', () => { @@ -914,7 +930,7 @@ describe('command code emitter', () => { value: 'test', } return expect(prettify(command)).resolves.toBe( - `const value = await driver.findElement(By.id("select")).getAttribute("value")\nassert(value == "test")` + `{\n${commandPrefixPadding}const value = await driver.findElement(By.id("select")).getAttribute("value")\n${commandPrefixPadding}assert(value == "test")\n}` ) }) it('should emit `verify selected value` command', () => { @@ -924,7 +940,7 @@ describe('command code emitter', () => { value: 'test', } return expect(prettify(command)).resolves.toBe( - `const value = await driver.findElement(By.id("select")).getAttribute("value")\nassert(value == "test")` + `{\n${commandPrefixPadding}const value = await driver.findElement(By.id("select")).getAttribute("value")\n${commandPrefixPadding}assert(value == "test")\n}` ) }) it('should emit `verify text` command', () => { @@ -1014,7 +1030,7 @@ describe('command code emitter', () => { value: '', } return expect(prettify(command)).resolves.toBe( - `const alert = await driver.switchTo().alert()\nawait alert.sendKeys("an answer")\nawait alert.accept()` + `{\n${commandPrefixPadding}const alert = await driver.switchTo().alert()\n${commandPrefixPadding}await alert.sendKeys("an answer")\n${commandPrefixPadding}await alert.accept()\n}` ) }) it('should emit `choose cancel on visible prompt` command', () => { diff --git a/packages/code-export-javascript-mocha/src/command.js b/packages/code-export-javascript-mocha/src/command.js index d325159aef..2027914a93 100644 --- a/packages/code-export-javascript-mocha/src/command.js +++ b/packages/code-export-javascript-mocha/src/command.js @@ -197,9 +197,11 @@ function emitAssertAlert(alertText) { function emitAnswerOnNextPrompt(textToSend) { const commands = [ - { level: 0, statement: 'const alert = await driver.switchTo().alert()' }, - { level: 0, statement: `await alert.sendKeys("${textToSend}")` }, - { level: 0, statement: 'await alert.accept()' }, + { level: 0, statement: `{` }, + { level: 1, statement: 'const alert = await driver.switchTo().alert()' }, + { level: 1, statement: `await alert.sendKeys("${textToSend}")` }, + { level: 1, statement: 'await alert.accept()' }, + { level: 0, statement: `}` }, ] return Promise.resolve({ commands }) } @@ -208,13 +210,21 @@ async function emitCheck(locator) { const commands = [ { level: 0, + statement: `{`, + }, + { + level: 1, statement: `const element = await driver.findElement(${await location.emit( locator )})`, }, + { + level: 1, + statement: 'if (!(await element.isSelected())) await element.click()', + }, { level: 0, - statement: 'if (await element.isSelected()) await element.click()', + statement: `}`, }, ] return Promise.resolve({ commands }) @@ -351,40 +361,44 @@ function emitControlFlowWhile(script) { async function emitDoubleClick(target) { const commands = [ + { level: 0, statement: `{` }, { - level: 0, + level: 1, statement: `const element = await driver.findElement(${await location.emit( target )})`, }, { - level: 0, + level: 1, statement: 'await driver.actions({ bridge: true}).doubleClick(element).perform()', }, + { level: 0, statement: `}` }, ] return Promise.resolve({ commands }) } async function emitDragAndDrop(dragged, dropped) { const commands = [ + { level: 0, statement: `{` }, { - level: 0, + level: 1, statement: `const dragged = await driver.findElement(${await location.emit( dragged )})`, }, { - level: 0, + level: 1, statement: `const dropped = await driver.findElement(${await location.emit( dropped )})`, }, { - level: 0, + level: 1, statement: 'await driver.actions({ bridge: true }).dragAndDrop(dragged, dropped).perform()', }, + { level: 0, statement: `}` }, ] return Promise.resolve({ commands }) } @@ -396,16 +410,18 @@ async function emitEcho(message) { async function emitEditContent(locator, content) { const commands = [ + { level: 0, statement: `{` }, { - level: 0, + level: 1, statement: `const element = await driver.findElement(${await location.emit( locator )})`, }, { - level: 0, + level: 1, statement: `await driver.executeScript("if(arguments[0].contentEditable === 'true') {arguments[0].innerText = '${content}'}", element)`, }, + { level: 0, statement: `}` }, ] return Promise.resolve({ commands }) } @@ -427,66 +443,74 @@ async function emitExecuteAsyncScript(script, varName) { async function emitMouseDown(locator) { const commands = [ + { level: 0, statement: `{` }, { - level: 0, + level: 1, statement: `const element = await driver.findElement(${await location.emit( locator )})`, }, { - level: 0, + level: 1, statement: 'await driver.actions({ bridge: true }).moveToElement(element).clickAndHold().perform()', }, + { level: 0, statement: `}` }, ] return Promise.resolve({ commands }) } async function emitMouseMove(locator) { const commands = [ + { level: 0, statement: `{` }, { - level: 0, + level: 1, statement: `const element = await driver.findElement(${await location.emit( locator )})`, }, { - level: 0, + level: 1, statement: 'await driver.actions({ bridge: true }).moveToElement(element).perform()', }, + { level: 0, statement: `}` }, ] return Promise.resolve({ commands }) } async function emitMouseOut() { const commands = [ + { level: 0, statement: `{` }, { - level: 0, + level: 1, statement: `const element = await driver.findElement(By.CSS_SELECTOR, "body")`, }, { - level: 0, + level: 1, statement: 'await driver.actions({ bridge: true }).moveToElement(element, 0, 0).perform()', }, + { level: 0, statement: `}` }, ] return Promise.resolve({ commands }) } async function emitMouseUp(locator) { const commands = [ + { level: 0, statement: `{` }, { - level: 0, + level: 1, statement: `const element = await driver.findElement(${await location.emit( locator )})`, }, { - level: 0, + level: 1, statement: 'await driver.actions({ bridge: true }).moveToElement(element).release().perform()', }, + { level: 0, statement: `}` }, ] return Promise.resolve({ commands }) } @@ -522,18 +546,20 @@ async function emitSetWindowSize(size) { async function emitSelect(selectElement, option) { const commands = [ + { level: 0, statement: `{` }, { - level: 0, + level: 1, statement: `const dropdown = await driver.findElement(${await location.emit( selectElement )})`, }, { - level: 0, + level: 1, statement: `await dropdown.findElement(${await selection.emit( option )}).click()`, }, + { level: 0, statement: `}` }, ] return Promise.resolve({ commands }) } @@ -550,6 +576,7 @@ async function emitSelectFrame(frameLocation) { } else { return Promise.resolve({ commands: [ + { level: 0, statement: `{` }, { level: 0, statement: `const element = await driver.findElement(${await location.emit( @@ -557,6 +584,7 @@ async function emitSelectFrame(frameLocation) { )})`, }, { level: 0, statement: 'await driver.switchTo().frame(element)' }, + { level: 0, statement: `}` }, ], }) } @@ -646,13 +674,15 @@ async function emitStoreAttribute(locator, varName) { const elementLocator = locator.slice(0, attributePos) const attributeName = locator.slice(attributePos + 1) const commands = [ + { level: 0, statement: `{` }, { - level: 0, + level: 1, statement: `const attribute = await driver.findElement(${await location.emit( elementLocator )}).getAttribute("${attributeName}")`, }, - { level: 0, statement: `${variableSetter(varName, 'attribute')}` }, + { level: 1, statement: `${variableSetter(varName, 'attribute')}` }, + { level: 0, statement: `}` }, ] return Promise.resolve({ commands }) } @@ -708,16 +738,18 @@ async function emitType(target, value) { async function emitUncheck(locator) { const commands = [ + { level: 0, statement: `{` }, { - level: 0, + level: 1, statement: `const element = await driver.findElement(${await location.emit( locator )})`, }, { - level: 0, + level: 1, statement: 'if (await element.isSelected()) await element.click()', }, + { level: 0, statement: `}` }, ] return Promise.resolve({ commands }) } @@ -732,39 +764,45 @@ async function emitVerifyChecked(locator) { async function emitVerifyEditable(locator) { const commands = [ + { level: 0, statement: `{` }, { - level: 0, + level: 1, statement: `const element = await driver.findElement(${await location.emit( locator )})`, }, - { level: 0, statement: 'assert(await element.isEnabled())' }, + { level: 1, statement: 'assert(await element.isEnabled())' }, + { level: 0, statement: `}` }, ] return Promise.resolve({ commands }) } async function emitVerifyElementPresent(locator) { const commands = [ + { level: 0, statement: `{` }, { - level: 0, + level: 1, statement: `const elements = await driver.findElements(${await location.emit( locator )})`, }, - { level: 0, statement: 'assert(elements.length)' }, + { level: 1, statement: 'assert(elements.length)' }, + { level: 0, statement: `}` }, ] return Promise.resolve({ commands }) } async function emitVerifyElementNotPresent(locator) { const commands = [ + { level: 0, statement: `{` }, { - level: 0, + level: 1, statement: `const elements = await driver.findElements(${await location.emit( locator )})`, }, - { level: 0, statement: 'assert(!elements.length)' }, + { level: 1, statement: 'assert(!elements.length)' }, + { level: 0, statement: `}` }, ] return Promise.resolve({ commands }) } @@ -779,64 +817,72 @@ async function emitVerifyNotChecked(locator) { async function emitVerifyNotEditable(locator) { const commands = [ + { level: 0, statement: `{` }, { - level: 0, + level: 1, statement: `const element = await driver.findElement(${await location.emit( locator )})`, }, - { level: 0, statement: 'assert(!await element.isEnabled())' }, + { level: 1, statement: 'assert(!await element.isEnabled())' }, + { level: 0, statement: `}` }, ] return Promise.resolve({ commands }) } async function emitVerifyNotSelectedValue(locator, expectedValue) { const commands = [ + { level: 0, statement: `{` }, { - level: 0, + level: 1, statement: `const value = await driver.findElement(${await location.emit( locator )}).getAttribute("value")`, }, { - level: 0, + level: 1, statement: `assert(value !== "${exporter.emit.text(expectedValue)}")`, }, + { level: 0, statement: `}` }, ] return Promise.resolve({ commands }) } async function emitVerifyNotText(locator, text) { const commands = [ + { level: 0, statement: `{` }, { - level: 0, + level: 1, statement: `const text = await driver.findElement(${await location.emit( locator )}).getText()`, }, - { level: 0, statement: `assert(text !== "${exporter.emit.text(text)}")` }, + { level: 1, statement: `assert(text !== "${exporter.emit.text(text)}")` }, + { level: 0, statement: `}` }, ] return Promise.resolve({ commands }) } async function emitVerifySelectedLabel(locator, labelValue) { const commands = [ + { level: 0, statement: `{` }, { - level: 0, + level: 1, statement: `const element = await driver.findElement(${await location.emit( locator )}).getAttribute("value")`, }, { - level: 0, + level: 1, statement: "const locator = `option[@value='${element}']`", }, { - level: 0, + level: 1, statement: 'const selectedText = element.findElement(By.xpath(locator)).getText()', }, - { level: 0, statement: `assert(selectedText == "${labelValue}")` }, + { level: 1, statement: `assert(selectedText == "${labelValue}")` }, + { level: 0, statement: `}` }, ] return Promise.resolve({ commands, @@ -857,13 +903,15 @@ async function emitVerifyText(locator, text) { async function emitVerifyValue(locator, value) { const commands = [ + { level: 0, statement: `{` }, { - level: 0, + level: 1, statement: `const value = await driver.findElement(${await location.emit( locator )}).getAttribute("value")`, }, - { level: 0, statement: `assert(value == "${value}")` }, + { level: 1, statement: `assert(value == "${value}")` }, + { level: 0, statement: `}` }, ] return Promise.resolve({ commands }) } From afcb14394e56247cbb97abdc767924a2f333af50 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Thu, 20 Jun 2019 13:18:37 +0300 Subject: [PATCH 67/99] Fixes to assert/verify selected label --- .../__test__/src/command.spec.js | 12 ++++++------ packages/code-export-javascript-mocha/src/command.js | 7 ++++--- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/packages/code-export-javascript-mocha/__test__/src/command.spec.js b/packages/code-export-javascript-mocha/__test__/src/command.spec.js index 7d490e0467..79ad7b62ca 100644 --- a/packages/code-export-javascript-mocha/__test__/src/command.spec.js +++ b/packages/code-export-javascript-mocha/__test__/src/command.spec.js @@ -190,11 +190,11 @@ describe('command code emitter', () => { return expect(prettify(command)).resolves.toBe( '{\n' + commandPrefixPadding + - 'const element = await driver.findElement(By.id("test")).getAttribute("value")\n' + + 'const element = await driver.findElement(By.id("test"))\n' + commandPrefixPadding + - "const locator = `option[@value='${element}']`\n" + + 'const locator = `option[@value=\'${await element.getAttribute("value")}\']`\n' + commandPrefixPadding + - 'const selectedText = element.findElement(By.xpath(locator)).getText()\n' + + 'const selectedText = await element.findElement(By.xpath(locator)).getText()\n' + commandPrefixPadding + 'assert(selectedText == "test")\n}' ) @@ -914,11 +914,11 @@ describe('command code emitter', () => { return expect(prettify(command)).resolves.toBe( '{\n' + commandPrefixPadding + - 'const element = await driver.findElement(By.id("test")).getAttribute("value")\n' + + 'const element = await driver.findElement(By.id("test"))\n' + commandPrefixPadding + - "const locator = `option[@value='${element}']`\n" + + 'const locator = `option[@value=\'${await element.getAttribute("value")}\']`\n' + commandPrefixPadding + - 'const selectedText = element.findElement(By.xpath(locator)).getText()\n' + + 'const selectedText = await element.findElement(By.xpath(locator)).getText()\n' + commandPrefixPadding + 'assert(selectedText == "test")\n}' ) diff --git a/packages/code-export-javascript-mocha/src/command.js b/packages/code-export-javascript-mocha/src/command.js index 2027914a93..3845c0a03e 100644 --- a/packages/code-export-javascript-mocha/src/command.js +++ b/packages/code-export-javascript-mocha/src/command.js @@ -870,16 +870,17 @@ async function emitVerifySelectedLabel(locator, labelValue) { level: 1, statement: `const element = await driver.findElement(${await location.emit( locator - )}).getAttribute("value")`, + )})`, }, { level: 1, - statement: "const locator = `option[@value='${element}']`", + statement: + 'const locator = `option[@value=\'${await element.getAttribute("value")}\']`', }, { level: 1, statement: - 'const selectedText = element.findElement(By.xpath(locator)).getText()', + 'const selectedText = await element.findElement(By.xpath(locator)).getText()', }, { level: 1, statement: `assert(selectedText == "${labelValue}")` }, { level: 0, statement: `}` }, From d3ef32c40b79a8c5280bfb77ccad292ebd222798 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Thu, 20 Jun 2019 13:45:33 +0300 Subject: [PATCH 68/99] Fix for assert/verify --- .../__test__/src/__snapshots__/index.spec.js.snap | 12 ++++++------ .../__test__/src/command.spec.js | 4 ++-- packages/code-export-javascript-mocha/src/command.js | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/code-export-javascript-mocha/__test__/src/__snapshots__/index.spec.js.snap b/packages/code-export-javascript-mocha/__test__/src/__snapshots__/index.spec.js.snap index d50c357192..2f3b8346f7 100644 --- a/packages/code-export-javascript-mocha/__test__/src/__snapshots__/index.spec.js.snap +++ b/packages/code-export-javascript-mocha/__test__/src/__snapshots__/index.spec.js.snap @@ -61,7 +61,7 @@ describe('control flow', function() { } else { vars[\\"output\\"] = await driver.executeScript(\\"return 'c'\\") } - assert(vars[\\"output\\"] == \\"a\\") + assert(vars[\\"output\\"].toString() == \\"a\\") }) it('control flow else if', async function() { vars[\\"myVar\\"] = await driver.executeScript(\\"return 'b'\\") @@ -72,7 +72,7 @@ describe('control flow', function() { } else { vars[\\"output\\"] = await driver.executeScript(\\"return 'c'\\") } - assert(vars[\\"output\\"] == \\"b\\") + assert(vars[\\"output\\"].toString() == \\"b\\") }) it('control flow else', async function() { vars[\\"myVar\\"] = await driver.executeScript(\\"return 'c'\\") @@ -83,14 +83,14 @@ describe('control flow', function() { } else { vars[\\"output\\"] = await driver.executeScript(\\"return 'c'\\") } - assert(vars[\\"output\\"] == \\"c\\") + assert(vars[\\"output\\"].toString() == \\"c\\") }) it('control flow do', async function() { vars[\\"check\\"] = await driver.executeScript(\\"return 1\\") do { vars[\\"check\\"] = await driver.executeScript(\\"return arguments[0] + 1\\", vars[\\"check\\"]) } while(!!await driver.executeScript(\\"return (arguments[0] < 3)\\", vars[\\"check\\"])) - assert(vars[\\"check\\"] == \\"3\\") + assert(vars[\\"check\\"].toString() == \\"3\\") }) it('control flow times', async function() { vars[\\"check\\"] = await driver.executeScript(\\"return 1\\") @@ -98,14 +98,14 @@ describe('control flow', function() { for(let i = 0; i < times; i++) { vars[\\"check\\"] = await driver.executeScript(\\"return arguments[0] + 1\\", vars[\\"check\\"]) } - assert(vars[\\"check\\"] == \\"3\\") + assert(vars[\\"check\\"].toString() == \\"3\\") }) it('control flow while', async function() { vars[\\"check\\"] = await driver.executeScript(\\"return 1\\") while(!!await driver.executeScript(\\"return (arguments[0] < 3)\\", vars[\\"check\\"])) { vars[\\"check\\"] = await driver.executeScript(\\"return arguments[0] + 1\\", vars[\\"check\\"]) } - assert(vars[\\"check\\"] == \\"3\\") + assert(vars[\\"check\\"].toString() == \\"3\\") }) }) " diff --git a/packages/code-export-javascript-mocha/__test__/src/command.spec.js b/packages/code-export-javascript-mocha/__test__/src/command.spec.js index 79ad7b62ca..8ed6bc1ed5 100644 --- a/packages/code-export-javascript-mocha/__test__/src/command.spec.js +++ b/packages/code-export-javascript-mocha/__test__/src/command.spec.js @@ -68,7 +68,7 @@ describe('command code emitter', () => { value: 'blah', } expect(prettify(command)).resolves.toBe( - `assert(vars["varrrName"] == "blah")` + `assert(vars["varrrName"].toString() == "blah")` ) }) it('should emit `assert alert` command', () => { @@ -822,7 +822,7 @@ describe('command code emitter', () => { value: 'blah', } expect(prettify(command)).resolves.toBe( - `assert(vars["varrrName"] == "blah")` + `assert(vars["varrrName"].toString() == "blah")` ) }) it('should emit `verify checked` command', () => { diff --git a/packages/code-export-javascript-mocha/src/command.js b/packages/code-export-javascript-mocha/src/command.js index 3845c0a03e..4c6602ea17 100644 --- a/packages/code-export-javascript-mocha/src/command.js +++ b/packages/code-export-javascript-mocha/src/command.js @@ -186,7 +186,7 @@ async function emitNewWindowHandling(command, emittedCommand) { } function emitAssert(varName, value) { - return Promise.resolve(`assert(vars["${varName}"] == "${value}")`) + return Promise.resolve(`assert(vars["${varName}"].toString() == "${value}")`) } function emitAssertAlert(alertText) { From bb3d2897077274426615da16b1bccd5fed9d5b12 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Thu, 20 Jun 2019 13:57:49 +0300 Subject: [PATCH 69/99] Removed ending close command from `select window` seed test --- packages/selenium-ide/src/neo/stores/seed.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/selenium-ide/src/neo/stores/seed.js b/packages/selenium-ide/src/neo/stores/seed.js index 04a126d192..465412b63e 100644 --- a/packages/selenium-ide/src/neo/stores/seed.js +++ b/packages/selenium-ide/src/neo/stores/seed.js @@ -595,7 +595,6 @@ export default function seed(store, numberOfSuites = 0) { selectWindow.createCommand(undefined, 'close') selectWindow.createCommand(undefined, 'selectWindow', 'handle=${handle}') selectWindow.createCommand(undefined, 'assertTitle', 'The Internet') - selectWindow.createCommand(undefined, 'close') const login = store.createTestCase('login') login.createCommand(undefined, 'open', '/login') From 54f98f2086261a6ffc6d5af5c99b809783cb6775 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Thu, 20 Jun 2019 13:58:47 +0300 Subject: [PATCH 70/99] Added a missing paren to one of the commands in the select window util function --- .../__test__/src/__snapshots__/index.spec.js.snap | 6 +++--- packages/code-export-javascript-mocha/src/command.js | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/code-export-javascript-mocha/__test__/src/__snapshots__/index.spec.js.snap b/packages/code-export-javascript-mocha/__test__/src/__snapshots__/index.spec.js.snap index 2f3b8346f7..8db9335079 100644 --- a/packages/code-export-javascript-mocha/__test__/src/__snapshots__/index.spec.js.snap +++ b/packages/code-export-javascript-mocha/__test__/src/__snapshots__/index.spec.js.snap @@ -169,7 +169,7 @@ describe('Default Suite', function() { const handlesThen = vars[\\"windowHandles\\"] const handlesNow = await driver.getAllWindowHandles() if (handlesNow.length > handlesThen.length) { - return handlesNow.find(handle => (!handlesThen.includes(handle)) + return handlesNow.find(handle => (!handlesThen.includes(handle))) } throw new Error(\\"New window did not appear before timeout\\") } @@ -209,7 +209,7 @@ describe('Default Suite', function() { const handlesThen = vars[\\"windowHandles\\"] const handlesNow = await driver.getAllWindowHandles() if (handlesNow.length > handlesThen.length) { - return handlesNow.find(handle => (!handlesThen.includes(handle)) + return handlesNow.find(handle => (!handlesThen.includes(handle))) } throw new Error(\\"New window did not appear before timeout\\") } @@ -317,7 +317,7 @@ describe('select window', function() { const handlesThen = vars[\\"windowHandles\\"] const handlesNow = await driver.getAllWindowHandles() if (handlesNow.length > handlesThen.length) { - return handlesNow.find(handle => (!handlesThen.includes(handle)) + return handlesNow.find(handle => (!handlesThen.includes(handle))) } throw new Error(\\"New window did not appear before timeout\\") } diff --git a/packages/code-export-javascript-mocha/src/command.js b/packages/code-export-javascript-mocha/src/command.js index 4c6602ea17..54616ebf3b 100644 --- a/packages/code-export-javascript-mocha/src/command.js +++ b/packages/code-export-javascript-mocha/src/command.js @@ -162,7 +162,7 @@ function emitWaitForWindow() { { level: 1, statement: - 'return handlesNow.find(handle => (!handlesThen.includes(handle))', + 'return handlesNow.find(handle => (!handlesThen.includes(handle)))', }, { level: 0, statement: '}' }, { From fcc0d27d32ba0c7acb76a00a5e4ea9df262fb1b6 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Thu, 20 Jun 2019 14:00:44 +0300 Subject: [PATCH 71/99] Added alphabetical sorting to the language display names on the code export dialog --- .../neo/components/Dialogs/Export/index.jsx | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/packages/selenium-ide/src/neo/components/Dialogs/Export/index.jsx b/packages/selenium-ide/src/neo/components/Dialogs/Export/index.jsx index 881ca3a78b..d1609c8108 100644 --- a/packages/selenium-ide/src/neo/components/Dialogs/Export/index.jsx +++ b/packages/selenium-ide/src/neo/components/Dialogs/Export/index.jsx @@ -114,20 +114,22 @@ class ExportList extends React.Component { render() { return (
    - {Object.keys(availableLanguages).map(language => ( -
  • - - -
  • - ))} + {Object.keys(availableLanguages) + .sort() + .map(language => ( +
  • + + +
  • + ))}
) } From f66b64daf57aa64822c4d185c087192497ddf06f Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Thu, 20 Jun 2019 14:19:53 +0300 Subject: [PATCH 72/99] Switched the command export tests to use snapshots --- .../src/__snapshots__/command.spec.js.snap | 429 ++++++++++++++++++ .../__test__/src/command.spec.js | 420 +++++------------ 2 files changed, 540 insertions(+), 309 deletions(-) create mode 100644 packages/code-export-javascript-mocha/__test__/src/__snapshots__/command.spec.js.snap diff --git a/packages/code-export-javascript-mocha/__test__/src/__snapshots__/command.spec.js.snap b/packages/code-export-javascript-mocha/__test__/src/__snapshots__/command.spec.js.snap new file mode 100644 index 0000000000..253583986d --- /dev/null +++ b/packages/code-export-javascript-mocha/__test__/src/__snapshots__/command.spec.js.snap @@ -0,0 +1,429 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`command code emitter should emit 'assert selected label' command 1`] = ` +"{ + const element = await driver.findElement(By.id(\\"test\\")) + const locator = \`option[@value='\${await element.getAttribute(\\"value\\")}']\` + const selectedText = await element.findElement(By.xpath(locator)).getText() + assert(selectedText == \\"test\\") +}" +`; + +exports[`command code emitter should emit 'verify selected label' command 1`] = ` +"{ + const element = await driver.findElement(By.id(\\"test\\")) + const locator = \`option[@value='\${await element.getAttribute(\\"value\\")}']\` + const selectedText = await element.findElement(By.xpath(locator)).getText() + assert(selectedText == \\"test\\") +}" +`; + +exports[`command code emitter should emit \`add selection\` command 1`] = ` +"{ + const dropdown = await driver.findElement(By.css(\\"select\\")) + await dropdown.findElement(By.xpath(\\"//option[. = 'A label']\\")).click() +}" +`; + +exports[`command code emitter should emit \`answer on visible prompt\` command 1`] = ` +"{ + const alert = await driver.switchTo().alert() + await alert.sendKeys(\\"an answer\\") + await alert.accept() +}" +`; + +exports[`command code emitter should emit \`assert alert\` command 1`] = `"assert(await driver.switchTo().alert().getText() == \\"an alert\\")"`; + +exports[`command code emitter should emit \`assert checked\` command 1`] = `"assert(await driver.findElement(By.id(\\"check\\")).isSelected())"`; + +exports[`command code emitter should emit \`assert confirmation\` command 1`] = `"assert(await driver.switchTo().alert().getText() == \\"a confirmation\\")"`; + +exports[`command code emitter should emit \`assert editable\` command 1`] = ` +"{ + const element = await driver.findElement(By.id(\\"text\\")) + assert(await element.isEnabled()) +}" +`; + +exports[`command code emitter should emit \`assert element not present\` command 1`] = ` +"{ + const elements = await driver.findElements(By.id(\\"element\\")) + assert(!elements.length) +}" +`; + +exports[`command code emitter should emit \`assert element present\` command 1`] = ` +"{ + const elements = await driver.findElements(By.id(\\"element\\")) + assert(elements.length) +}" +`; + +exports[`command code emitter should emit \`assert not checked\` command 1`] = `"assert(!await driver.findElement(By.id(\\"check\\")).isSelected())"`; + +exports[`command code emitter should emit \`assert not editable\` command 1`] = ` +"{ + const element = await driver.findElement(By.id(\\"text\\")) + assert(!await element.isEnabled()) +}" +`; + +exports[`command code emitter should emit \`assert not selected value\` command 1`] = ` +"{ + const value = await driver.findElement(By.id(\\"select\\")).getAttribute(\\"value\\") + assert(value !== \\"test\\") +}" +`; + +exports[`command code emitter should emit \`assert not text\` command 1`] = ` +"{ + const text = await driver.findElement(By.id(\\"test\\")).getText() + assert(text !== \\"text\\") +}" +`; + +exports[`command code emitter should emit \`assert prompt\` command 1`] = `"assert(await driver.switchTo().alert().getText() == \\"a prompt\\")"`; + +exports[`command code emitter should emit \`assert selected value\` command 1`] = ` +"{ + const value = await driver.findElement(By.id(\\"select\\")).getAttribute(\\"value\\") + assert(value == \\"test\\") +}" +`; + +exports[`command code emitter should emit \`assert text\` command 1`] = `"assert(await driver.findElement(By.id(\\"test\\")).getText() == \\"some text that should be here\\")"`; + +exports[`command code emitter should emit \`assert title\` command 1`] = `"assert(await driver.getTitle() == \\"example title\\")"`; + +exports[`command code emitter should emit \`assert value\` command 1`] = ` +"{ + const value = await driver.findElement(By.id(\\"select\\")).getAttribute(\\"value\\") + assert(value == \\"test\\") +}" +`; + +exports[`command code emitter should emit \`assert\` command 1`] = `"assert(vars[\\"varrrName\\"].toString() == \\"blah\\")"`; + +exports[`command code emitter should emit \`check\` command 1`] = ` +"{ + const element = await driver.findElement(By.id(\\"f\\")) + if (!(await element.isSelected())) await element.click() +}" +`; + +exports[`command code emitter should emit \`choose cancel on visible prompt\` command 1`] = `"await driver.switchTo().alert().dismiss()"`; + +exports[`command code emitter should emit \`choose ok on visible confirmation\` command 1`] = `"await driver.switchTo().alert().accept()"`; + +exports[`command code emitter should emit \`click at\` command 1`] = `"await driver.findElement(By.linkText(\\"button\\")).click()"`; + +exports[`command code emitter should emit \`click\` command 1`] = `"await driver.findElement(By.linkText(\\"button\\")).click()"`; + +exports[`command code emitter should emit \`close\` command 1`] = `"await driver.close()"`; + +exports[`command code emitter should emit \`do\` command 1`] = ` +Object { + "body": "do {", + "endingLevel": 1, +} +`; + +exports[`command code emitter should emit \`double click at\` command 1`] = ` +"{ + const element = await driver.findElement(By.linkText(\\"button\\")) + await driver.actions({ bridge: true}).doubleClick(element).perform() +}" +`; + +exports[`command code emitter should emit \`double click\` command 1`] = ` +"{ + const element = await driver.findElement(By.linkText(\\"button\\")) + await driver.actions({ bridge: true}).doubleClick(element).perform() +}" +`; + +exports[`command code emitter should emit \`drag and drop to object\` command 1`] = ` +"{ + const dragged = await driver.findElement(By.linkText(\\"dragged\\")) + const dropped = await driver.findElement(By.linkText(\\"dropped\\")) + await driver.actions({ bridge: true }).dragAndDrop(dragged, dropped).perform() +}" +`; + +exports[`command code emitter should emit \`echo\` command 1`] = `"console.log(\\"blah\\")"`; + +exports[`command code emitter should emit \`echo\` command with variables 1`] = `"console.log(vars[\\"blah\\"])"`; + +exports[`command code emitter should emit \`edit content\` command 1`] = ` +"{ + const element = await driver.findElement(By.id(\\"contentEditable\\")) + await driver.executeScript(\\"if(arguments[0].contentEditable === 'true') {arguments[0].innerText = ''}\\", element) +}" +`; + +exports[`command code emitter should emit \`else if\` command 1`] = ` +Object { + "body": "} else if (!!await driver.executeScript(\\"return (true)\\")) {", + "endingLevel": 1, +} +`; + +exports[`command code emitter should emit \`else\` command 1`] = ` +Object { + "body": "} else {", + "endingLevel": 1, +} +`; + +exports[`command code emitter should emit \`end\` command 1`] = ` +Object { + "body": "}", + "endingLevel": 0, +} +`; + +exports[`command code emitter should emit \`execute async script\` command 1`] = `"vars[\\"myVar\\"] = await driver.executeAsyncScript(\\"var callback = arguments[arguments.length - 1];javascript.then(callback).catch(callback);\\")"`; + +exports[`command code emitter should emit \`execute script\` command 1`] = `"vars[\\"myVar\\"] = await driver.executeScript(\\"javascript\\")"`; + +exports[`command code emitter should emit \`execute script\` command with return string value 1`] = `"vars[\\"myVar\\"] = await driver.executeScript(\\"return 'a'\\")"`; + +exports[`command code emitter should emit \`forEach\` command 1`] = ` +Object { + "body": "const collection = vars[\\"collection\\"] +for (let i = 0; i < collection.length - 1; i++) { + vars[\\"iteratorVar\\"] = vars[\\"collection\\"][i]", + "endingLevel": 1, +} +`; + +exports[`command code emitter should emit \`if\` command 1`] = ` +Object { + "body": "if (!!await driver.executeScript(\\"return (true)\\")) {", + "endingLevel": 1, +} +`; + +exports[`command code emitter should emit \`mouse down at\` event 1`] = ` +"{ + const element = await driver.findElement(By.id(\\"button\\")) + await driver.actions({ bridge: true }).moveToElement(element).clickAndHold().perform() +}" +`; + +exports[`command code emitter should emit \`mouse down\` command 1`] = ` +"{ + const element = await driver.findElement(By.id(\\"button\\")) + await driver.actions({ bridge: true }).moveToElement(element).clickAndHold().perform() +}" +`; + +exports[`command code emitter should emit \`mouse move at\` event 1`] = ` +"{ + const element = await driver.findElement(By.id(\\"button\\")) + await driver.actions({ bridge: true }).moveToElement(element).perform() +}" +`; + +exports[`command code emitter should emit \`mouse move\` event 1`] = ` +"{ + const element = await driver.findElement(By.id(\\"button\\")) + await driver.actions({ bridge: true }).moveToElement(element).perform() +}" +`; + +exports[`command code emitter should emit \`mouse out\` event 1`] = ` +"{ + const element = await driver.findElement(By.CSS_SELECTOR, \\"body\\") + await driver.actions({ bridge: true }).moveToElement(element, 0, 0).perform() +}" +`; + +exports[`command code emitter should emit \`mouse over\` event 1`] = ` +"{ + const element = await driver.findElement(By.id(\\"button\\")) + await driver.actions({ bridge: true }).moveToElement(element).perform() +}" +`; + +exports[`command code emitter should emit \`mouse up at\` event 1`] = ` +"{ + const element = await driver.findElement(By.id(\\"button\\")) + await driver.actions({ bridge: true }).moveToElement(element).release().perform() +}" +`; + +exports[`command code emitter should emit \`mouse up\` event 1`] = ` +"{ + const element = await driver.findElement(By.id(\\"button\\")) + await driver.actions({ bridge: true }).moveToElement(element).release().perform() +}" +`; + +exports[`command code emitter should emit \`open\` with absolute url 1`] = `"await driver.get(\\"https://www.seleniumhq.org/\\")"`; + +exports[`command code emitter should emit \`pause\` command 1`] = `"await driver.sleep(300)"`; + +exports[`command code emitter should emit \`remove selection\` command 1`] = ` +"{ + const dropdown = await driver.findElement(By.css(\\"select\\")) + await dropdown.findElement(By.xpath(\\"//option[. = 'A label']\\")).click() +}" +`; + +exports[`command code emitter should emit \`repeatIf\` command 1`] = `"} while(!!await driver.executeScript(\\"return (true)\\"))"`; + +exports[`command code emitter should emit \`run script\` command 1`] = `"await driver.executeScript(\\"alert('test');alert('Im annoying');\\")"`; + +exports[`command code emitter should emit \`run\` command 1`] = `"sometestcase()"`; + +exports[`command code emitter should emit \`select frame\` to select the top frame 1`] = `"await driver.switchTo().defaultContent()"`; + +exports[`command code emitter should emit \`select window\` to select a window by handle 1`] = `"await driver.switchTo().window(vars[\\"window\\"])"`; + +exports[`command code emitter should emit \`select window\` to select a window by implicit index 1`] = `"await driver.switchTo().window(await driver.getAllWindowHandles()[12])"`; + +exports[`command code emitter should emit \`select window\` to select a window by name 1`] = `"await driver.switchTo().window(\\"window\\")"`; + +exports[`command code emitter should emit \`select window\` to select a window by the local keyword 1`] = `"await driver.switchTo().window(await driver.getAllWindowHandles()[0])"`; + +exports[`command code emitter should emit \`select\` command 1`] = ` +"{ + const dropdown = await driver.findElement(By.css(\\"select\\")) + await dropdown.findElement(By.xpath(\\"//option[. = 'A label']\\")).click() +}" +`; + +exports[`command code emitter should emit \`send keys\` command 1`] = `"await driver.findElement(By.id(\\"input\\")).sendKeys(\\"example input\\")"`; + +exports[`command code emitter should emit \`send keys\` command with a key press 1`] = `"await driver.findElement(By.id(\\"input\\")).sendKeys(\\"SuperSecretPassword!\\", Key.ENTER)"`; + +exports[`command code emitter should emit \`send keys\` command with a variable input 1`] = `"await driver.findElement(By.id(\\"input\\")).sendKeys(vars[\\"blah\\"])"`; + +exports[`command code emitter should emit \`set speed\` 1`] = `"console.log(\\"\`set speed\` is a no-op in code export, use \`pause\` instead\\")"`; + +exports[`command code emitter should emit \`setWindowSize\` 1`] = `"await driver.setRect(1440, 1177)"`; + +exports[`command code emitter should emit \`store attribute\` command 1`] = ` +"{ + const attribute = await driver.findElement(By.xpath(\\"button[3]\\")).getAttribute(\\"id\\") + vars[\\"myVar\\"] = attribute +}" +`; + +exports[`command code emitter should emit \`store json\` command 1`] = `"vars[\\"myVar\\"] = JSON.parse('[{\\"a\\":0}]')"`; + +exports[`command code emitter should emit \`store text\` command 1`] = `"vars[\\"myVar\\"] = await driver.findElement(By.id(\\"someElement\\")).getText()"`; + +exports[`command code emitter should emit \`store title\` command 1`] = `"vars[\\"myVar\\"] = await driver.getTitle()"`; + +exports[`command code emitter should emit \`store value\` command 1`] = `"vars[\\"myVar\\"] = await driver.findElement(By.id(\\"someElement\\")).getAttribute(\\"value\\")"`; + +exports[`command code emitter should emit \`store window handle\` command 1`] = `"vars[\\"windowName\\"] = await driver.getWindowHandle()"`; + +exports[`command code emitter should emit \`store xpath count\` command 1`] = `"vars[\\"myVar\\"] = await driver.findElements(By.xpath(\\"button\\")).length"`; + +exports[`command code emitter should emit \`store\` command 1`] = `"vars[\\"myVar\\"] = \\"some value\\""`; + +exports[`command code emitter should emit \`submit\` command 1`] = `"raise Exception(\\"\`submit\` is not a supported command in Selenium Webdriver. Please re-record the step in the IDE.\\")"`; + +exports[`command code emitter should emit \`times\` command 1`] = ` +"const times = 5 +for(let i = 0; i < times; i++) {" +`; + +exports[`command code emitter should emit \`type\` command 1`] = `"await driver.findElement(By.id(\\"input\\")).sendKeys(\\"example input\\")"`; + +exports[`command code emitter should emit \`uncheck\` command 1`] = ` +"{ + const element = await driver.findElement(By.id(\\"f\\")) + if (await element.isSelected()) await element.click() +}" +`; + +exports[`command code emitter should emit \`verify checked\` command 1`] = `"assert(await driver.findElement(By.id(\\"check\\")).isSelected())"`; + +exports[`command code emitter should emit \`verify editable\` command 1`] = ` +"{ + const element = await driver.findElement(By.id(\\"text\\")) + assert(await element.isEnabled()) +}" +`; + +exports[`command code emitter should emit \`verify element not present\` command 1`] = ` +"{ + const elements = await driver.findElements(By.id(\\"element\\")) + assert(!elements.length) +}" +`; + +exports[`command code emitter should emit \`verify element present\` command 1`] = ` +"{ + const elements = await driver.findElements(By.id(\\"element\\")) + assert(elements.length) +}" +`; + +exports[`command code emitter should emit \`verify not checked\` command 1`] = `"assert(!await driver.findElement(By.id(\\"check\\")).isSelected())"`; + +exports[`command code emitter should emit \`verify not editable\` command 1`] = ` +"{ + const element = await driver.findElement(By.id(\\"text\\")) + assert(!await element.isEnabled()) +}" +`; + +exports[`command code emitter should emit \`verify not selected value\` command 1`] = ` +"{ + const value = await driver.findElement(By.id(\\"select\\")).getAttribute(\\"value\\") + assert(value !== \\"test\\") +}" +`; + +exports[`command code emitter should emit \`verify not text\` command 1`] = ` +"{ + const text = await driver.findElement(By.id(\\"test\\")).getText() + assert(text !== \\"text\\") +}" +`; + +exports[`command code emitter should emit \`verify selected value\` command 1`] = ` +"{ + const value = await driver.findElement(By.id(\\"select\\")).getAttribute(\\"value\\") + assert(value == \\"test\\") +}" +`; + +exports[`command code emitter should emit \`verify text\` command 1`] = `"assert(await driver.findElement(By.id(\\"test\\")).getText() == \\"some text that should be here\\")"`; + +exports[`command code emitter should emit \`verify title\` command 1`] = `"assert(await driver.getTitle() == \\"example title\\")"`; + +exports[`command code emitter should emit \`verify value\` command 1`] = ` +"{ + const value = await driver.findElement(By.id(\\"select\\")).getAttribute(\\"value\\") + assert(value == \\"test\\") +}" +`; + +exports[`command code emitter should emit \`verify\` command 1`] = `"assert(vars[\\"varrrName\\"].toString() == \\"blah\\")"`; + +exports[`command code emitter should emit \`waitForElementEditable\` command 1`] = `"await driver.wait(until.elementIsEnabled(await driver.findElement(By.css(\\"#blah\\"))), 5000)"`; + +exports[`command code emitter should emit \`waitForElementNotEditable\` command 1`] = `"await driver.wait(until.elementIsDisabled(await driver.findElement(By.css(\\"#blah\\"))), 5000)"`; + +exports[`command code emitter should emit \`waitForElementNotPresent\` command 1`] = `"await driver.wait(until.stalenessOf(await driver.findElement(By.css(\\"#blah\\"))), 5000)"`; + +exports[`command code emitter should emit \`waitForElementNotVisible\` command 1`] = `"await driver.wait(until.elementIsNotVisible(await driver.findElement(By.css(\\"#blah\\"))), 5000)"`; + +exports[`command code emitter should emit \`waitForElementPresent\` command 1`] = `"await driver.wait(until.elementLocated(By.css(\\"#blah\\")), 5000)"`; + +exports[`command code emitter should emit \`waitForElementVisible\` command 1`] = `"await driver.wait(until.elementIsVisible(await driver.findElement(By.css(\\"#blah\\"))), 5000)"`; + +exports[`command code emitter should emit \`while\` command 1`] = `"while(!!await driver.executeScript(\\"return (true)\\")) {"`; + +exports[`command code emitter should emit new window handling, if command opens a new window 1`] = ` +"vars[\\"windowHandles\\"] = await driver.getAllWindowHandles() +await driver.findElement(By.css(\\"button\\")).click() +vars[\\"newWin\\"] = await waitForWindow(2000)" +`; diff --git a/packages/code-export-javascript-mocha/__test__/src/command.spec.js b/packages/code-export-javascript-mocha/__test__/src/command.spec.js index 8ed6bc1ed5..cbe78cebbd 100644 --- a/packages/code-export-javascript-mocha/__test__/src/command.spec.js +++ b/packages/code-export-javascript-mocha/__test__/src/command.spec.js @@ -57,9 +57,7 @@ describe('command code emitter', () => { target: 'css=select', value: 'label=A label', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}const dropdown = await driver.findElement(By.css("select"))\n${commandPrefixPadding}await dropdown.findElement(By.xpath("//option[. = 'A label']")).click()\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert` command', () => { const command = { @@ -67,9 +65,7 @@ describe('command code emitter', () => { target: 'varrrName', value: 'blah', } - expect(prettify(command)).resolves.toBe( - `assert(vars["varrrName"].toString() == "blah")` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert alert` command', () => { const command = { @@ -77,9 +73,7 @@ describe('command code emitter', () => { target: 'an alert', value: '', } - return expect(prettify(command)).resolves.toBe( - `assert(await driver.switchTo().alert().getText() == "an alert")` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert checked` command', () => { const command = { @@ -87,9 +81,7 @@ describe('command code emitter', () => { target: 'id=check', value: '', } - return expect(prettify(command)).resolves.toBe( - `assert(await driver.findElement(By.id("check")).isSelected())` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert confirmation` command', () => { const command = { @@ -97,9 +89,7 @@ describe('command code emitter', () => { target: 'a confirmation', value: '', } - return expect(prettify(command)).resolves.toBe( - `assert(await driver.switchTo().alert().getText() == "a confirmation")` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert editable` command', () => { const command = { @@ -107,9 +97,7 @@ describe('command code emitter', () => { target: 'id=text', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}const element = await driver.findElement(By.id("text"))\n${commandPrefixPadding}assert(await element.isEnabled())\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert element present` command', () => { const command = { @@ -117,9 +105,7 @@ describe('command code emitter', () => { target: 'id=element', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}const elements = await driver.findElements(By.id("element"))\n${commandPrefixPadding}assert(elements.length)\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert element not present` command', () => { const command = { @@ -127,9 +113,7 @@ describe('command code emitter', () => { target: 'id=element', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}const elements = await driver.findElements(By.id("element"))\n${commandPrefixPadding}assert(!elements.length)\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert not checked` command', () => { const command = { @@ -137,9 +121,7 @@ describe('command code emitter', () => { target: 'id=check', value: '', } - return expect(prettify(command)).resolves.toBe( - `assert(!await driver.findElement(By.id("check")).isSelected())` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert not editable` command', () => { const command = { @@ -147,9 +129,7 @@ describe('command code emitter', () => { target: 'id=text', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}const element = await driver.findElement(By.id("text"))\n${commandPrefixPadding}assert(!await element.isEnabled())\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert not selected value` command', () => { const command = { @@ -157,9 +137,7 @@ describe('command code emitter', () => { target: 'id=select', value: 'test', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}const value = await driver.findElement(By.id("select")).getAttribute("value")\n${commandPrefixPadding}assert(value !== "test")\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert not text` command', () => { const command = { @@ -167,9 +145,7 @@ describe('command code emitter', () => { target: 'id=test', value: 'text', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}const text = await driver.findElement(By.id("test")).getText()\n${commandPrefixPadding}assert(text !== "text")\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert prompt` command', () => { const command = { @@ -177,9 +153,7 @@ describe('command code emitter', () => { target: 'a prompt', value: '', } - return expect(prettify(command)).resolves.toBe( - `assert(await driver.switchTo().alert().getText() == "a prompt")` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it("should emit 'assert selected label' command", () => { const command = { @@ -187,17 +161,7 @@ describe('command code emitter', () => { target: 'id=test', value: 'test', } - return expect(prettify(command)).resolves.toBe( - '{\n' + - commandPrefixPadding + - 'const element = await driver.findElement(By.id("test"))\n' + - commandPrefixPadding + - 'const locator = `option[@value=\'${await element.getAttribute("value")}\']`\n' + - commandPrefixPadding + - 'const selectedText = await element.findElement(By.xpath(locator)).getText()\n' + - commandPrefixPadding + - 'assert(selectedText == "test")\n}' - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert selected value` command', () => { const command = { @@ -205,9 +169,7 @@ describe('command code emitter', () => { target: 'id=select', value: 'test', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}const value = await driver.findElement(By.id("select")).getAttribute("value")\n${commandPrefixPadding}assert(value == "test")\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert text` command', () => { const command = { @@ -215,9 +177,7 @@ describe('command code emitter', () => { target: 'id=test', value: 'some text that should be here', } - expect(prettify(command)).resolves.toBe( - `assert(await driver.findElement(By.id("test")).getText() == "some text that should be here")` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert title` command', () => { const command = { @@ -225,9 +185,7 @@ describe('command code emitter', () => { target: 'example title', value: '', } - return expect(prettify(command)).resolves.toBe( - `assert(await driver.getTitle() == "example title")` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert value` command', () => { const command = { @@ -235,9 +193,7 @@ describe('command code emitter', () => { target: 'id=select', value: 'test', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}const value = await driver.findElement(By.id("select")).getAttribute("value")\n${commandPrefixPadding}assert(value == "test")\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `click` command', () => { const command = { @@ -245,9 +201,7 @@ describe('command code emitter', () => { target: 'link=button', value: '', } - return expect(prettify(command)).resolves.toBe( - `await driver.findElement(By.linkText("button")).click()` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `click at` command', () => { const command = { @@ -255,9 +209,7 @@ describe('command code emitter', () => { target: 'link=button', value: '', } - return expect(prettify(command)).resolves.toBe( - `await driver.findElement(By.linkText("button")).click()` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `check` command', () => { const command = { @@ -265,9 +217,7 @@ describe('command code emitter', () => { target: 'id=f', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}const element = await driver.findElement(By.id("f"))\n${commandPrefixPadding}if (!(await element.isSelected())) await element.click()\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `close` command', () => { const command = { @@ -275,7 +225,7 @@ describe('command code emitter', () => { target: '', value: '', } - return expect(prettify(command)).resolves.toBe(`await driver.close()`) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `do` command', () => { const command = { @@ -283,10 +233,9 @@ describe('command code emitter', () => { target: '', value: '', } - return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: 'do {', - endingLevel: 1, - }) + return expect( + prettify(command, { fullPayload: true }) + ).resolves.toMatchSnapshot() }) it('should emit `double click` command', () => { const command = { @@ -294,9 +243,7 @@ describe('command code emitter', () => { target: 'link=button', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}const element = await driver.findElement(By.linkText("button"))\n${commandPrefixPadding}await driver.actions({ bridge: true}).doubleClick(element).perform()\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `double click at` command', () => { const command = { @@ -304,9 +251,7 @@ describe('command code emitter', () => { target: 'link=button', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}const element = await driver.findElement(By.linkText("button"))\n${commandPrefixPadding}await driver.actions({ bridge: true}).doubleClick(element).perform()\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `drag and drop to object` command', () => { const command = { @@ -314,9 +259,7 @@ describe('command code emitter', () => { target: 'link=dragged', value: 'link=dropped', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}const dragged = await driver.findElement(By.linkText("dragged"))\n${commandPrefixPadding}const dropped = await driver.findElement(By.linkText("dropped"))\n${commandPrefixPadding}await driver.actions({ bridge: true }).dragAndDrop(dragged, dropped).perform()\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `echo` command', () => { const command = { @@ -324,7 +267,7 @@ describe('command code emitter', () => { target: 'blah', value: '', } - return expect(prettify(command)).resolves.toBe(`console.log("blah")`) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `echo` command with variables', () => { const command = { @@ -332,7 +275,7 @@ describe('command code emitter', () => { target: '${blah}', value: '', } - return expect(prettify(command)).resolves.toBe(`console.log(vars["blah"])`) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `edit content` command', () => { const command = { @@ -340,9 +283,7 @@ describe('command code emitter', () => { target: 'id=contentEditable', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}const element = await driver.findElement(By.id("contentEditable"))\n${commandPrefixPadding}await driver.executeScript("if(arguments[0].contentEditable === 'true') {arguments[0].innerText = ''}", element)\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `else` command', () => { const command = { @@ -350,10 +291,9 @@ describe('command code emitter', () => { target: 'true', value: '', } - return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: `} else {`, - endingLevel: 1, - }) + return expect( + prettify(command, { fullPayload: true }) + ).resolves.toMatchSnapshot() }) it('should emit `else if` command', () => { const command = { @@ -361,10 +301,9 @@ describe('command code emitter', () => { target: 'true', value: '', } - return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: `} else if (!!await driver.executeScript("return (true)")) {`, - endingLevel: 1, - }) + return expect( + prettify(command, { fullPayload: true }) + ).resolves.toMatchSnapshot() }) it('should emit `end` command', async () => { const command = { @@ -372,10 +311,9 @@ describe('command code emitter', () => { target: '', value: '', } - return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: '}', - endingLevel: 0, - }) + return expect( + prettify(command, { fullPayload: true }) + ).resolves.toMatchSnapshot() }) it('should emit `execute script` command', () => { const command = { @@ -383,9 +321,7 @@ describe('command code emitter', () => { target: 'javascript', value: 'myVar', } - return expect(prettify(command)).resolves.toBe( - `vars["myVar"] = await driver.executeScript("javascript")` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `execute script` command with return string value', () => { const command = { @@ -393,9 +329,7 @@ describe('command code emitter', () => { target: 'return "a"', value: 'myVar', } - return expect(prettify(command)).resolves.toBe( - `vars["myVar"] = await driver.executeScript("return 'a'")` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `execute async script` command', () => { const command = { @@ -403,9 +337,7 @@ describe('command code emitter', () => { target: 'javascript', value: 'myVar', } - return expect(prettify(command)).resolves.toBe( - `vars["myVar"] = await driver.executeAsyncScript("var callback = arguments[arguments.length - 1];javascript.then(callback).catch(callback);")` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `forEach` command', () => { const command = { @@ -413,10 +345,9 @@ describe('command code emitter', () => { target: 'collection', value: 'iteratorVar', } - return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: `const collection = vars["collection"]\nfor (let i = 0; i < collection.length - 1; i++) {\n${commandPrefixPadding}vars["iteratorVar"] = vars["collection"][i]`, - endingLevel: 1, - }) + return expect( + prettify(command, { fullPayload: true }) + ).resolves.toMatchSnapshot() }) it('should emit `if` command', () => { const command = { @@ -424,10 +355,9 @@ describe('command code emitter', () => { target: 'true', value: '', } - return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: `if (!!await driver.executeScript("return (true)")) {`, - endingLevel: 1, - }) + return expect( + prettify(command, { fullPayload: true }) + ).resolves.toMatchSnapshot() }) it('should emit `mouse down` command', () => { const command = { @@ -435,9 +365,7 @@ describe('command code emitter', () => { target: 'id=button', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}const element = await driver.findElement(By.id("button"))\n${commandPrefixPadding}await driver.actions({ bridge: true }).moveToElement(element).clickAndHold().perform()\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `mouse down at` event', () => { const command = { @@ -445,9 +373,7 @@ describe('command code emitter', () => { target: 'id=button', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}const element = await driver.findElement(By.id("button"))\n${commandPrefixPadding}await driver.actions({ bridge: true }).moveToElement(element).clickAndHold().perform()\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `mouse move` event', () => { const command = { @@ -455,9 +381,7 @@ describe('command code emitter', () => { target: 'id=button', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}const element = await driver.findElement(By.id("button"))\n${commandPrefixPadding}await driver.actions({ bridge: true }).moveToElement(element).perform()\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `mouse move at` event', () => { const command = { @@ -465,9 +389,7 @@ describe('command code emitter', () => { target: 'id=button', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}const element = await driver.findElement(By.id("button"))\n${commandPrefixPadding}await driver.actions({ bridge: true }).moveToElement(element).perform()\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `mouse out` event', () => { const command = { @@ -475,9 +397,7 @@ describe('command code emitter', () => { target: 'id=button', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}const element = await driver.findElement(By.CSS_SELECTOR, "body")\n${commandPrefixPadding}await driver.actions({ bridge: true }).moveToElement(element, 0, 0).perform()\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `mouse over` event', () => { const command = { @@ -485,9 +405,7 @@ describe('command code emitter', () => { target: 'id=button', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}const element = await driver.findElement(By.id("button"))\n${commandPrefixPadding}await driver.actions({ bridge: true }).moveToElement(element).perform()\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `mouse up` event', () => { const command = { @@ -495,9 +413,7 @@ describe('command code emitter', () => { target: 'id=button', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}const element = await driver.findElement(By.id("button"))\n${commandPrefixPadding}await driver.actions({ bridge: true }).moveToElement(element).release().perform()\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `mouse up at` event', () => { const command = { @@ -505,9 +421,7 @@ describe('command code emitter', () => { target: 'id=button', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}const element = await driver.findElement(By.id("button"))\n${commandPrefixPadding}await driver.actions({ bridge: true }).moveToElement(element).release().perform()\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `open` with absolute url', () => { const command = { @@ -515,9 +429,7 @@ describe('command code emitter', () => { target: 'https://www.seleniumhq.org/', value: '', } - return expect(prettify(command)).resolves.toBe( - `await driver.get("${command.target}")` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `pause` command', () => { const command = { @@ -525,7 +437,7 @@ describe('command code emitter', () => { target: '300', value: '', } - return expect(prettify(command)).resolves.toBe(`await driver.sleep(300)`) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `remove selection` command', () => { const command = { @@ -533,9 +445,7 @@ describe('command code emitter', () => { target: 'css=select', value: 'label=A label', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}const dropdown = await driver.findElement(By.css("select"))\n${commandPrefixPadding}await dropdown.findElement(By.xpath("//option[. = 'A label']")).click()\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `repeatIf` command', () => { const command = { @@ -543,9 +453,7 @@ describe('command code emitter', () => { target: 'true', value: '', } - return expect(prettify(command)).resolves.toBe( - `} while(!!await driver.executeScript("return (true)"))` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `run` command', () => { const command = { @@ -553,7 +461,7 @@ describe('command code emitter', () => { target: 'some test case', value: '', } - return expect(prettify(command)).resolves.toBe(`sometestcase()`) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `run script` command', () => { const command = { @@ -561,9 +469,7 @@ describe('command code emitter', () => { target: "alert('test');alert('Im annoying');", value: '', } - return expect(prettify(command)).resolves.toBe( - `await driver.executeScript("alert('test');alert('Im annoying');")` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `select` command', () => { const command = { @@ -571,9 +477,7 @@ describe('command code emitter', () => { target: 'css=select', value: 'label=A label', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}const dropdown = await driver.findElement(By.css("select"))\n${commandPrefixPadding}await dropdown.findElement(By.xpath("//option[. = 'A label']")).click()\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `select frame` to select the top frame', () => { const command = { @@ -581,9 +485,7 @@ describe('command code emitter', () => { target: 'relative=top', value: '', } - return expect(prettify(command)).resolves.toBe( - `await driver.switchTo().defaultContent()` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should fail to emit `select window` by using unknown locator', () => { const command = { @@ -601,9 +503,7 @@ describe('command code emitter', () => { target: 'handle=${window}', value: '', } - return expect(prettify(command)).resolves.toBe( - `await driver.switchTo().window(vars["window"])` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `select window` to select a window by name', () => { const command = { @@ -611,9 +511,7 @@ describe('command code emitter', () => { target: 'name=window', value: '', } - return expect(prettify(command)).resolves.toBe( - `await driver.switchTo().window("window")` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `select window` to select a window by the local keyword', () => { const command = { @@ -621,9 +519,7 @@ describe('command code emitter', () => { target: 'win_ser_local', value: '', } - return expect(prettify(command)).resolves.toBe( - `await driver.switchTo().window(await driver.getAllWindowHandles()[0])` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `select window` to select a window by implicit index', () => { const command = { @@ -631,9 +527,7 @@ describe('command code emitter', () => { target: 'win_ser_12', value: '', } - return expect(prettify(command)).resolves.toBe( - `await driver.switchTo().window(await driver.getAllWindowHandles()[12])` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `send keys` command', () => { const command = { @@ -641,9 +535,7 @@ describe('command code emitter', () => { target: 'id=input', value: 'example input', } - return expect(prettify(command)).resolves.toBe( - `await driver.findElement(By.id("input")).sendKeys("example input")` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `send keys` command with a variable input', () => { const command = { @@ -651,9 +543,7 @@ describe('command code emitter', () => { target: 'id=input', value: '${blah}', } - return expect(prettify(command)).resolves.toBe( - `await driver.findElement(By.id("input")).sendKeys(vars["blah"])` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `send keys` command with a key press', () => { const command = { @@ -661,14 +551,10 @@ describe('command code emitter', () => { target: 'id=input', value: 'SuperSecretPassword!${KEY_ENTER}', } - return expect(prettify(command)).resolves.toBe( - `await driver.findElement(By.id("input")).sendKeys("SuperSecretPassword!", Key.ENTER)` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `set speed`', () => { - expect(prettify({ command: 'setSpeed' })).resolves.toBe( - `console.log("\`set speed\` is a no-op in code export, use \`pause\` instead")` - ) + return expect(prettify({ command: 'setSpeed' })).resolves.toMatchSnapshot() }) it('should emit `setWindowSize`', () => { const command = { @@ -676,7 +562,7 @@ describe('command code emitter', () => { target: '1440x1177', value: '', } - expect(prettify(command)).resolves.toBe(`await driver.setRect(1440, 1177)`) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should skip playback supported commands, that are not supported in webdriver', () => { return Promise.all([ @@ -700,9 +586,7 @@ describe('command code emitter', () => { target: 'some value', value: 'myVar', } - return expect(prettify(command)).resolves.toBe( - `vars["myVar"] = "some value"` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `store attribute` command', () => { const command = { @@ -710,9 +594,7 @@ describe('command code emitter', () => { target: 'xpath=button[3]@id', value: 'myVar', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}const attribute = await driver.findElement(By.xpath("button[3]")).getAttribute("id")\n${commandPrefixPadding}vars["myVar"] = attribute\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `store text` command', () => { const command = { @@ -720,9 +602,7 @@ describe('command code emitter', () => { target: 'id=someElement', value: 'myVar', } - return expect(prettify(command)).resolves.toBe( - `vars["myVar"] = await driver.findElement(By.id("someElement")).getText()` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `store json` command', () => { const command = { @@ -730,9 +610,7 @@ describe('command code emitter', () => { target: '[{"a":0}]', value: 'myVar', } - return expect(prettify(command)).resolves.toBe( - `vars["myVar"] = JSON.parse('[{"a":0}]')` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `store title` command', () => { const command = { @@ -740,9 +618,7 @@ describe('command code emitter', () => { target: '', value: 'myVar', } - return expect(prettify(command)).resolves.toBe( - `vars["myVar"] = await driver.getTitle()` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `store value` command', () => { const command = { @@ -750,9 +626,7 @@ describe('command code emitter', () => { target: 'id=someElement', value: 'myVar', } - return expect(prettify(command)).resolves.toBe( - `vars["myVar"] = await driver.findElement(By.id("someElement")).getAttribute("value")` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `store window handle` command', () => { const command = { @@ -760,9 +634,7 @@ describe('command code emitter', () => { target: 'windowName', value: '', } - return expect(prettify(command)).resolves.toBe( - `vars["windowName"] = await driver.getWindowHandle()` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `store xpath count` command', () => { const command = { @@ -770,9 +642,7 @@ describe('command code emitter', () => { target: 'xpath=button', value: 'myVar', } - return expect(prettify(command)).resolves.toBe( - `vars["myVar"] = await driver.findElements(By.xpath("button")).length` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `submit` command', () => { const command = { @@ -780,9 +650,7 @@ describe('command code emitter', () => { target: 'id=form', value: '', } - return expect(prettify(command)).resolves.toBe( - `raise Exception("\`submit\` is not a supported command in Selenium Webdriver. Please re-record the step in the IDE.")` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `times` command', () => { const command = { @@ -790,10 +658,7 @@ describe('command code emitter', () => { target: '5', value: '', } - return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: `const times = 5\nfor(let i = 0; i < times; i++) {`, - endingLevel: 1, - }) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `type` command', () => { const command = { @@ -801,9 +666,7 @@ describe('command code emitter', () => { target: 'id=input', value: 'example input', } - expect(prettify(command)).resolves.toBe( - `await driver.findElement(By.id("input")).sendKeys("example input")` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `uncheck` command', () => { const command = { @@ -811,9 +674,7 @@ describe('command code emitter', () => { target: 'id=f', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}const element = await driver.findElement(By.id("f"))\n${commandPrefixPadding}if (await element.isSelected()) await element.click()\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `verify` command', () => { const command = { @@ -821,9 +682,7 @@ describe('command code emitter', () => { target: 'varrrName', value: 'blah', } - expect(prettify(command)).resolves.toBe( - `assert(vars["varrrName"].toString() == "blah")` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `verify checked` command', () => { const command = { @@ -831,9 +690,7 @@ describe('command code emitter', () => { target: 'id=check', value: '', } - return expect(prettify(command)).resolves.toBe( - `assert(await driver.findElement(By.id("check")).isSelected())` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `verify editable` command', () => { const command = { @@ -841,9 +698,7 @@ describe('command code emitter', () => { target: 'id=text', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}const element = await driver.findElement(By.id("text"))\n${commandPrefixPadding}assert(await element.isEnabled())\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `verify element present` command', () => { const command = { @@ -851,9 +706,7 @@ describe('command code emitter', () => { target: 'id=element', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}const elements = await driver.findElements(By.id("element"))\n${commandPrefixPadding}assert(elements.length)\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `verify element not present` command', () => { const command = { @@ -861,9 +714,7 @@ describe('command code emitter', () => { target: 'id=element', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}const elements = await driver.findElements(By.id("element"))\n${commandPrefixPadding}assert(!elements.length)\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `verify not checked` command', () => { const command = { @@ -871,9 +722,7 @@ describe('command code emitter', () => { target: 'id=check', value: '', } - return expect(prettify(command)).resolves.toBe( - `assert(!await driver.findElement(By.id("check")).isSelected())` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `verify not editable` command', () => { const command = { @@ -881,9 +730,7 @@ describe('command code emitter', () => { target: 'id=text', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}const element = await driver.findElement(By.id("text"))\n${commandPrefixPadding}assert(!await element.isEnabled())\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `verify not selected value` command', () => { const command = { @@ -891,9 +738,7 @@ describe('command code emitter', () => { target: 'id=select', value: 'test', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}const value = await driver.findElement(By.id("select")).getAttribute("value")\n${commandPrefixPadding}assert(value !== "test")\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `verify not text` command', () => { const command = { @@ -901,9 +746,7 @@ describe('command code emitter', () => { target: 'id=test', value: 'text', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}const text = await driver.findElement(By.id("test")).getText()\n${commandPrefixPadding}assert(text !== "text")\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it("should emit 'verify selected label' command", () => { const command = { @@ -911,17 +754,7 @@ describe('command code emitter', () => { target: 'id=test', value: 'test', } - return expect(prettify(command)).resolves.toBe( - '{\n' + - commandPrefixPadding + - 'const element = await driver.findElement(By.id("test"))\n' + - commandPrefixPadding + - 'const locator = `option[@value=\'${await element.getAttribute("value")}\']`\n' + - commandPrefixPadding + - 'const selectedText = await element.findElement(By.xpath(locator)).getText()\n' + - commandPrefixPadding + - 'assert(selectedText == "test")\n}' - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `verify value` command', () => { const command = { @@ -929,9 +762,7 @@ describe('command code emitter', () => { target: 'id=select', value: 'test', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}const value = await driver.findElement(By.id("select")).getAttribute("value")\n${commandPrefixPadding}assert(value == "test")\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `verify selected value` command', () => { const command = { @@ -939,9 +770,7 @@ describe('command code emitter', () => { target: 'id=select', value: 'test', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}const value = await driver.findElement(By.id("select")).getAttribute("value")\n${commandPrefixPadding}assert(value == "test")\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `verify text` command', () => { const command = { @@ -949,9 +778,7 @@ describe('command code emitter', () => { target: 'id=test', value: 'some text that should be here', } - expect(prettify(command)).resolves.toBe( - `assert(await driver.findElement(By.id("test")).getText() == "some text that should be here")` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `verify title` command', () => { const command = { @@ -959,9 +786,7 @@ describe('command code emitter', () => { target: 'example title', value: '', } - return expect(prettify(command)).resolves.toBe( - `assert(await driver.getTitle() == "example title")` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `waitForElementEditable` command', () => { const command = { @@ -969,9 +794,7 @@ describe('command code emitter', () => { target: 'css=#blah', value: '5000', } - return expect(prettify(command)).resolves.toBe( - `await driver.wait(until.elementIsEnabled(await driver.findElement(By.css("#blah"))), 5000)` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `waitForElementPresent` command', () => { const command = { @@ -979,9 +802,7 @@ describe('command code emitter', () => { target: 'css=#blah', value: '5000', } - return expect(prettify(command)).resolves.toBe( - `await driver.wait(until.elementLocated(By.css("#blah")), 5000)` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `waitForElementVisible` command', () => { const command = { @@ -989,9 +810,7 @@ describe('command code emitter', () => { target: 'css=#blah', value: '5000', } - return expect(prettify(command)).resolves.toBe( - `await driver.wait(until.elementIsVisible(await driver.findElement(By.css("#blah"))), 5000)` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `waitForElementNotEditable` command', () => { const command = { @@ -999,9 +818,7 @@ describe('command code emitter', () => { target: 'css=#blah', value: '5000', } - return expect(prettify(command)).resolves.toBe( - `await driver.wait(until.elementIsDisabled(await driver.findElement(By.css("#blah"))), 5000)` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `waitForElementNotPresent` command', () => { const command = { @@ -1009,9 +826,7 @@ describe('command code emitter', () => { target: 'css=#blah', value: '5000', } - return expect(prettify(command)).resolves.toBe( - `await driver.wait(until.stalenessOf(await driver.findElement(By.css("#blah"))), 5000)` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `waitForElementNotVisible` command', () => { const command = { @@ -1019,9 +834,7 @@ describe('command code emitter', () => { target: 'css=#blah', value: '5000', } - return expect(prettify(command)).resolves.toBe( - `await driver.wait(until.elementIsNotVisible(await driver.findElement(By.css("#blah"))), 5000)` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `answer on visible prompt` command', () => { const command = { @@ -1029,9 +842,7 @@ describe('command code emitter', () => { target: 'an answer', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}const alert = await driver.switchTo().alert()\n${commandPrefixPadding}await alert.sendKeys("an answer")\n${commandPrefixPadding}await alert.accept()\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `choose cancel on visible prompt` command', () => { const command = { @@ -1039,9 +850,7 @@ describe('command code emitter', () => { target: '', value: '', } - return expect(prettify(command)).resolves.toBe( - `await driver.switchTo().alert().dismiss()` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `choose ok on visible confirmation` command', () => { const command = { @@ -1049,9 +858,7 @@ describe('command code emitter', () => { target: '', value: '', } - return expect(prettify(command)).resolves.toBe( - `await driver.switchTo().alert().accept()` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `while` command', () => { const command = { @@ -1059,10 +866,7 @@ describe('command code emitter', () => { target: 'true', value: '', } - return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: `while(!!await driver.executeScript("return (true)")) {`, - endingLevel: 1, - }) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit new window handling, if command opens a new window', () => { const command = { @@ -1073,8 +877,6 @@ describe('command code emitter', () => { windowHandleName: 'newWin', windowTimeout: 2000, } - return expect(prettify(command)).resolves.toBe( - `vars["windowHandles"] = await driver.getAllWindowHandles()\nawait driver.findElement(By.css("button")).click()\nvars["newWin"] = await waitForWindow(2000)` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) }) From 5486dcfa73bd46908b708a375bb6e78f302a9c51 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Thu, 20 Jun 2019 14:39:02 +0300 Subject: [PATCH 73/99] Updated code export docs --- docs/introduction/code-export.md | 42 ++++++++++++++++++- website/static/img/docs/code-export/menu.png | Bin 505503 -> 526928 bytes 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/docs/introduction/code-export.md b/docs/introduction/code-export.md index dfb5573b7d..c356e229af 100644 --- a/docs/introduction/code-export.md +++ b/docs/introduction/code-export.md @@ -21,7 +21,11 @@ This will place inline code comments in the exported file with details about the ## Supported Exports -Currently, export to Java is supported. Specifically, Java for JUnit. +Currently, export to the following languages and test frameworks is supported. + +- Java JUnit +- JavaScript Mocha +- Python pytest We intend to support all of the officially supported programming language bindings for Selenium (e.g., Java, JavaScript, C#, Python, and Ruby) in at least one testing framework for each language. @@ -58,6 +62,40 @@ Here's a sample `pom.xml` to help you get started. ``` +### JavaScript Mocha + +The exported code for JavaScript Mocha is built to work with Node 10, Mocha 6.1.x, and the latest version of Selenium 4. + +You should be able to take the exported JavaScript file and run it after installing these dependencies (e.g., with `npm install`). + +Here's a sample `package.json` to help you get started. + +```javascript +{ + "dependencies": { + "mocha": "^6.1.4", + "selenium-webdriver": "^4.0.0-alpha.3" + } +} +``` + +### Python pytest + +The exported code for Python pytest is built to work with Python 3, pytest 4.6.x, and the latest version of Selenium 4. + +You should be able to take the exported JavaScript file and run it after installing these dependencies (e.g., with `pip3 install`). + +Here's a sample `requirements.txt` to help you get started. + +``` +pytest == 4.6.3 +selenium == 4.0.0a1 +``` + +```sh +> pip3 install -r ./requirements.txt +``` + ## How To Contribute Code export was built in a modular way to help enable contributions. @@ -72,7 +110,7 @@ First, copy an existing language package (e.g., `packages/code-export-java-junit Next, add the new package as a dependency to [the `package.json` in `code-export`](https://github.com/SeleniumHQ/selenium-ide/blob/c55c556ffc947fd3f6ee8ab317915c6f879a88dc/packages/code-export/package.json#L22). -Lastly, run `yarn` from the root of the project. +Lastly, run `yarn` from the root of the project, and then build the project using `yarn watch` (full details for getting a local build going are available [here](https://github.com/SeleniumHQ/selenium-ide/blob/v3/README.md)). ### 2. Update the locators and commands diff --git a/website/static/img/docs/code-export/menu.png b/website/static/img/docs/code-export/menu.png index edf40b8435833765effa4ef22d453b23ebc910d6..3ef5d048fd38b9b5fffa734479f305f280194a9d 100644 GIT binary patch literal 526928 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

6U`1o7E9?&Jq}-+ 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

J7l*u~KTFNx|j^Xd#3{!TV6 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òzxk}Kigpwxsy1sNqy(E#io|! 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 z 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 literal 505503 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 z zc727-n}9y6eN-DGgS`bgYG;U3$M=6Rrew&Uc<`0mFYBM}+aR$$J*SoDqf>AscDv0r z3KOMrB1|X9inr0Y=vaYLmn;Tz*4I%=%o=DE@`D3Xk|oQ~{yCHLk3qCIqX?0m8J#!U ztIZV}F45^Rm_cJcsXP>3#+|5Q-6Z22VTnXB({nfSK7k!?Ug zCiR86t^Pu^%RW!jjTD;CbTqD)5W3&rti&yh;3k`>Y?`pKDMlHwdzl;v)t;O<| zp(8`L`Odbfen!~#z3#;bmDIcbUm>Jx+m!S8Kv!d(`>U+>ZDkKP!J!)6y6N; zl)|EKmzmVZlr+$zQbQ4@%6Kv3l?YI2&TMn|gXc0U;0Op1qY(Q-q$U%k@qrxZ;Jt)g zG!Eq8%vY!J|^KXOYk;XJ}rq;qEO{=JHYNQ=< zoYwg0#>)GT(kFYEOAA*4u1j#UMMU%Kp7vkb^bC(;kNbk&^`{|i8uy1Jbxo>Gz)8?B zdZueqckJL~TE2fP>sy~b((byO%-cp9!xQ*vrQcSdoW>r=usjr@7q2#E4B8|H7_q$W zMg07Ix@)iijG(L-RYnb{j2E*S%dmYB9;@nK6SCNY3%7#nrm(~98N^1X_9zZDTr1$% zJ!@fE;W6#*wZuDN3Zt4l`}u}Mn@_HUxzgEb?{@(w>S@*2l`5SmH?eQaGJDRm&yVdx zNpl55@?%oXpMIonF)*=vu>8ookOwH<^iQR)eG1N9O8+zKb-af`OPJxF)R*%Pw*+>- zqg9S8Kz|+yJL)O>EE0hSwga(^9n+JKDV_BdW8x^& zQ9NXeGMt5x2_*Dc6wKBG0b59y;pu+)Iyc@qD&Pm-Q&xAlI|yw!PM{MQ*&pdxW6D=Z zo=O83LY_nn-S65l%^HH@k!)E@ZxEpQ49{-C%JR4&G!efnH_vDL7yVb9q`Y}>ux0yH z@TrK55!XuNamqHBig_w~yhBh>A{1 zf}P>?Jh(7e%H0%ZU`xE=uT^;3+~(kA`dz^Qc)P(%s6o+|%&+CDYumcOujdffv0?1E zh6!$^!8|=2p4WgSa66+^iJ7F&>>_M|yTc!ng8qO3__TB}4bT2~r#ea2FYwp}jZ1Od zDbDt3ER)K-Q#Gpm7VdMSOaf;jiw#VYI7@I3#4QnHPrXeBwi=1NxP7uvfl~Fcm7Yo; zqlp);J{pLoIN9NvB$Tn8W4)hu07JO-!RA1ENVBJie?oeE$C~-$Nq$KeM%=GiYHZ7A zUhzz~dPP5Bc-y|&KEb9&$ldtXhB7>Psc)c;@fz7ORV{0+_lb`$P86?`#k(aYaey%n)ia=gl2G1*zU(shd7Q@izjuF4au`|kDpe~Ys1OQJ~ zKw~BmZE-gRr^B1LRrs;%+ulb_ZW^Yej7Y;ZZuY-NG@D0_^>p|p4gU!*qxHNbbq4mn zvJAUX^(H~a`4`flaYI)~hi@lDQ_LBmf5UUcP3ZZIyOef}ttUZ0a=WCIePAyzAGK2D@SpTN5oP6)tM{#CvO_A1F{P8>ATb`9fO7u) z6sXBNZ^&r9Ydo=}fa`w9H|=PL)Vgxteb z%J`W;2|DjYnEm2B5w1Zp%nr-n$!Xv30jlss`BPcqR`5#5$V`%u4(^_tqSw>w5zqsG zQjeoHp#QxSu-+ie8=%kr$hj#ftXEgvviDvZDp5%%6s9Ur20DKBNuZBLWHiwy?dmWU z@Vt+?Km~KcHT^qfnSrONFPK4-Ned{H8~FPy(1)*}#MVf=%~r~ZfOmCgF`g;1z%}W( ztgg$A`>+}{L7fGb6|=8zAIrPl-}MeKm-9--o{6GydJZp(#Qkb_R{9cE2|ty5+$+UQ z3rl}^WVR}Tud5!>j1~4?8@5OL$NY#6UWy_vV17lpApxv5xoszzOOJwUSPKj!D&E?r zoRtvXh?zv`0j%V|r)p9&B;Gm((=EkC90Wt=Ai`3M8&$lJdl3k`63R>!n}VPT#->;n zio4Rcy^=#=A2zxxz+WJZ!Gg0_lsIA5Ieh_lnN!0URdP}H0Nse5yZOID8 zPL8VwJ?uM>8-oJzm*VUN>7Pq6rM){}216{i{N0;jqw zjtJYZIznR(D9~%lil0|U%~D#Z1u=g19P4D?5pP%b_F;S;1h$_KU?pt7T4@@sSHIkw zEPOa`3_2IzF_%?ZkQUUd^T~Av(+lxtsJ)Pr_9E`F_<#uaI=VNDE{PaIo6C}Y3RMWD3zs>&HLVj)>G?IOgjLWhy0+ER|ahYki>t_8qm&^xwAjEsE`!sG+}-bWYvM~WRJG`?f)HxDE4WX-x6H(6CT*0L^s_J+5i zeb*3I2Sp#x^!WU_=ZtsX3Vc)s#JMc!e)+f_Z~ZMjhO;)>Wshf8N5Pwuzmx4ARuuKW zHvc^F#@DH0nPkcO`t`d#Q;lh1Uv_Uxx>XE96;ddAQvFGfz}tw|eJguJjll~)8B^-X ze!MUZB%Wu=LbBmxxvz?gOx==fv$}}h2zzzkz#4&~@(#kh&GVND&}$IIf=ZngOb@km zYwm^8AJkKs&Kw*jZVlL8F$ue%d2pqf$KH*fOleRT2F*YIL6CqYA|F{LOcY00Ez6ir zJh$R=QTdri0s35eWCw*~tFHL+zV#{GgJd?ZS!hdgwA*EH*0kH|+FFtQR>FhuliyBt zoK8PeH6b6t8U}dXw(&oa74TJ){v>du{hs+9G~v-&YDMI+cv(?9qABZpBkLipLx^}hrAZqTrUGrNca%g8_Nf}$LUJ!-?!RG(|eEyRY$gvc_*dauyue=+wmnd2|*6azN zjkR-5^`ht1qx>&}VQ^?7^SM_SA)PJvsIrhOv*Z z9(}7Pm0J!txZn-HqWM>{=Swvz5-mza}2a<^$CVAqDh|@X7azv zaZn$H(~m4e+dB$s1HaTPLPXQXA1D3;6N}VaH`l6By74$ObM4*110fJxK2y-Ssr(ATPhK{;8?UlqQI)o za7uNrf7uz9^kHT$bI5m65hpvk^Mu~DAFp_bx>roN+v_Ki)z0tNH{>74wGI5|1MTfL z`FDMP-KX_xk+<5;<^Cc@T7>Av5p;(2V9uSG5mdA`P5^L4RVln302#jc1gj3e%t| zLm|8HHK&kzKUX$M@~$f7Q^C#1zZ-3LhZ`!k`_*4IcqGEU3bJCH};GhY7L!_{+8y(sAGF?aQrB@f2EIP$uQt2szT5@JM^E+@L zrTrf$l&ny{yCa=OTI98)8;cp2CrwfARqs%*KfyiKy{;b z^>6ZzI)Pa8Ry8$c=SJqG&-dzunkPl@LF-V*iIJ39msI^jPU&YVkNUKA(!%_0iw%j_ z-2r|Wcn_x!F>$}r#wvP?@(ibTge^SxjcWEB$C5OtG)@dl7jDmRBHVf&333bhdxFHP z-jy@P;W#AM(FcqHZqf50+8U@3IYYmNE9;>1ei(I(97y6+>(3#L8{@TdZ5y${Qjd6gB|A7K0{ z;S@DbF1QX`TQJ%`B+JjS23GS9IR%Hob3dv_1!uMz%jPI)fB$(47Zw+J;RjyFg&>kq z#7;2kYA64R&G_MCa#-lVlFat@_b$c#@ACKonL`9X87Y)4&A-AB{&RA&^VJX`z!aqn znWQ%uyKj7q4}A*;W&fcq3PFp!a2<9H6#XHFE+MqJ4mS`2SfEGwpZZEQU?+l0*I`58 z;LoGVTwXTqC(Cg^MOHeU#9c25!uQN~$^&~fv-(_h;MVRizH#`D^&{b7xYF8x=n=y^ z?ycT7+}+%JmSSx@pY8WNv)#o>BXsF{QIFQ`Qx3*}7BT&YbzHRbb52Op51_-&pofjt znN2SX{Y%^tS&)CzZpI!N4j&peRptST$>PZR`_Ur;aG({S0eO>A7iXxTpjR0S@DWH= zVjM=LN|hK0pq3`VvLa(<(g)w&xpax@rVSn2Aq}J-9=NR$HX660YzzL6q!~4}tH0Uq z3%zEeok;0HU#)#d$(Y=G-qtkWbWtX4KD*jlHdknA*OP0B1@kXTqwo6~K~-(w_X;l; zWjdhs@&Fk2CR1X+H%WlKr`-I0WBLE4GB~(CC4UKd9{iO9^fF6=1a7L=WpYbN>rdCF1oOG%z}Tb;JL$>mws znOcNzE2PudecI=M<-%g)Er@(ljtYiXZ|JhFx8BJMq~jM;uj>pIVs8c^OhNX&E4Uhg zd{U65_rRh~7?nfcT!&5;5u1@O4d`2Figz}9MMex*#hMlQHy(6vAI9!)>-p1v|75RY z4q5-*)emQgZ>0@M_O?#Mfse(Q2-|mCRrg(oZ*O@2?I(1NuX4hU^f?%8^GJT#-i@PU ztsl=Q)G^A*@YiwNBGjWv5Ep!q5v`r1P4HaET_sP^?h|?^T{IGJ`cLiZgSq@kd|82&_VayErw7 zjkTzBFciS$2*4$B@jx8bE_3!X$+rKtmvs@JQ}C>W@43=k4G7^USO>d#ydQ_FC)vzCF7$ zH~P<*yzczoIzGh~YmzTKy?=!MZT8lpzb6yxrM+bEqU)mxqAy6qfCmf1;02Tv?CHUZHmJ6+ap#aiID#p-r zx$W$RbK=E`5Qgy^3d3sH_STH=P9(B{IPyFY1(G-bp_PBnSwE{lH%Sg*%vT~|@C{6f zAAI{dlP8E6*@)MC?Uan>?BZ8xa`oD^1CLo3*?kr<7!b_{hj22y`AMc|%q`>xU3%Zg zEB0wObpHx%UXkek5d7}?(jS^a-inrKvI1 z%}X|o0(MM#%dV1`O>k4(X7$BgFdI|qzMFSj>}uXNa>@@>$j+XgO{z?wgf>xHBPLA( zE44e3D+Hzl>BNnRR@`%GCpmJ*h3O7SG%QqFj;#j8y$Vze)E{Cf2S5D!oESSg0AjH` z&6*IJV|}eJEqNa(hx+Y-*Gx^*>=egX9L2ccD7X<3ZYOwX7rRVKA|c;~jhtB!8+-1z zciwpU%n4eI+qBxy(qOTCH^paZoUQr_T<5j2sEFv&NF2!;CJkR^$@r*MwNSIeRlO~P z7S!WVI$V=NnEpIPj0fZeS-N;e@y5*SK6|mM?+;H8@T=)1{1a$8g-BT8wfB7D`>gWE z>l(=&?UcOVyI1}*_m|chv>_@^wYEwb931#x;TXR)lvB5vU%KG4>8_~D{?=yGLtmy; zb(G9zTXcC1{!pKfmtpE;YuPH(Q_9vlPgma5j&Y#}23PAD;%pnvDGT3dJf=Ti0i=|q zRJIS+bs4>_Y5vjk54(+#glyzC5UqEd%lLES>#OcxuH=00dAWzkn>}}hnJ@4RIX3YI zNV+P_3;$5m9Hus8S3F>%dE4Zu0jQ@f(Q`t4`P zV~4GN(#ySI2S<-Q-C&9YJKZ6)G^*O2*AMlz3poH1gaxuNxVo#teZyPGkSYKw2HY(O z=}1}fn1|yccRKwb9#l2W-&T}CtigT6l=WVAR<~Y!_KPR`H)T4Q#_Tq~SzGe>yxZ$nk?=1l@?Q2y6SyF(JV613Ll6o1d%9D+RS2 zEn6q4TeG!=VY?Q2+Tf>~LDBf)CvAm@c>$Z(F-VFg*s2Wt z*C>IAYNLTbJALdM#ZZ*?MJ>4TOt`6;-6enc-0h@tZ;cG(e5Pes?JZOor=2n!W{H=c zK6Pjub^)2w{$u%IVq9!ETE3nx8BIi~)Cdn}MOt=ezF*vLN0L2wE(A2{-)MISxq#X0 zrZ$6Rt`BWflDxE!0_&!hG{=Joa>h(j5Ymr?oOsR-J4tA$Ph~Hc$rIxTUvbzg*+ijx zzOkA7z^MM1eC4~#-m7K>4UW{utRs{b*JMZtX%N*Y%04svOa_tb|Iws>vKu|@^C=9> zDcv5JuX0Z(6A&f(SXZM8WSCmpLVl`(L>N6XFn6m7-`FORTGHXkAj_xa0LT7%6uzWC zs)&e3x1>hTL0kcV7$Qokcb4p&ytSf5t5Hcx{R9N!459CF%M?L>Pi6 o;ig~~{Qu*h?g9GOPNRwQ_8BR#=hGSRp~#N{zX%R!@;iR<-{~T7ng9R* From aa7b38da96f9730cc9ea8a2b04d7a8fa4394e775 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Sun, 23 Jun 2019 11:18:17 +0300 Subject: [PATCH 74/99] Updated changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f6eb5cfbe3..362b5f6951 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Changelog +## v3.10.0 +- Code export for JavaScript (e.g., Mocha, Node 10) + ## v3.9.0 - Code export for Python (e.g., pytest, Python 3) - Fix for frames to support `relative=parent` in the runner From b8b9d8fd9dfa2accb046cbffc6a8adda2003d436 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Sun, 23 Jun 2019 11:22:35 +0300 Subject: [PATCH 75/99] v3.10.0 --- lerna.json | 2 +- packages/code-export-java-junit/package.json | 4 ++-- packages/code-export-javascript-mocha/package.json | 4 ++-- packages/code-export-python-pytest/package.json | 4 ++-- packages/code-export-utils/package.json | 2 +- packages/code-export/package.json | 8 ++++---- packages/selenium-ide/package.json | 4 ++-- packages/selenium-ide/src/manifest.json | 4 ++-- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/lerna.json b/lerna.json index 76c6985c9e..f6ea6bf1a2 100644 --- a/lerna.json +++ b/lerna.json @@ -3,6 +3,6 @@ "packages": [ "packages/*" ], - "version": "3.9.0", + "version": "3.10.0", "npmClient": "yarn" } diff --git a/packages/code-export-java-junit/package.json b/packages/code-export-java-junit/package.json index 307c1834c7..11d7eea9d9 100644 --- a/packages/code-export-java-junit/package.json +++ b/packages/code-export-java-junit/package.json @@ -1,6 +1,6 @@ { "name": "code-export-java-junit", - "version": "3.9.0", + "version": "3.10.0", "description": "Export Selenium IDE project contents to Java JUnit", "repository": "https://github.com/SeleniumHQ/selenium-ide", "keywords": [ @@ -21,6 +21,6 @@ "@babel/preset-env": "^7.4.5" }, "dependencies": { - "code-export-utils": "^3.9.0" + "code-export-utils": "^3.10.0" } } diff --git a/packages/code-export-javascript-mocha/package.json b/packages/code-export-javascript-mocha/package.json index d50b95817a..f99434207a 100644 --- a/packages/code-export-javascript-mocha/package.json +++ b/packages/code-export-javascript-mocha/package.json @@ -1,6 +1,6 @@ { "name": "code-export-javascript-mocha", - "version": "3.9.0", + "version": "3.10.0", "description": "Export Selenium IDE project contents to JavaScript Mocha", "repository": "https://github.com/SeleniumHQ/selenium-ide", "keywords": [ @@ -21,6 +21,6 @@ "@babel/preset-env": "^7.4.5" }, "dependencies": { - "code-export-utils": "^3.9.0" + "code-export-utils": "^3.10.0" } } diff --git a/packages/code-export-python-pytest/package.json b/packages/code-export-python-pytest/package.json index 09a45a8f9c..56a64b46df 100644 --- a/packages/code-export-python-pytest/package.json +++ b/packages/code-export-python-pytest/package.json @@ -1,6 +1,6 @@ { "name": "code-export-python-pytest", - "version": "3.9.0", + "version": "3.10.0", "description": "Export Selenium IDE project contents to Python pytest", "repository": "https://github.com/SeleniumHQ/selenium-ide", "keywords": [ @@ -21,6 +21,6 @@ "@babel/preset-env": "^7.4.5" }, "dependencies": { - "code-export-utils": "^3.9.0" + "code-export-utils": "^3.10.0" } } diff --git a/packages/code-export-utils/package.json b/packages/code-export-utils/package.json index 14b52f0715..e3c0cec708 100644 --- a/packages/code-export-utils/package.json +++ b/packages/code-export-utils/package.json @@ -1,6 +1,6 @@ { "name": "code-export-utils", - "version": "3.9.0", + "version": "3.10.0", "description": "Utils for Selenium IDE code export", "repository": "https://github.com/SeleniumHQ/selenium-ide", "keywords": [ diff --git a/packages/code-export/package.json b/packages/code-export/package.json index e400e01c53..ceddbdf59c 100644 --- a/packages/code-export/package.json +++ b/packages/code-export/package.json @@ -1,6 +1,6 @@ { "name": "code-export", - "version": "3.9.0", + "version": "3.10.0", "description": "Selenium IDE code export", "repository": "https://github.com/SeleniumHQ/selenium-ide", "keywords": [ @@ -20,8 +20,8 @@ "@babel/preset-env": "^7.4.5" }, "dependencies": { - "code-export-java-junit": "^3.9.0", - "code-export-python-pytest": "^3.9.0", - "code-export-javascript-mocha": "^3.9.0" + "code-export-java-junit": "^3.10.0", + "code-export-javascript-mocha": "^3.10.0", + "code-export-python-pytest": "^3.10.0" } } diff --git a/packages/selenium-ide/package.json b/packages/selenium-ide/package.json index 90fca76527..62006e46a5 100644 --- a/packages/selenium-ide/package.json +++ b/packages/selenium-ide/package.json @@ -1,6 +1,6 @@ { "name": "selenium-ide-extension", - "version": "3.9.0", + "version": "3.10.0", "description": "An integrated development environment for Selenium scripts", "license": "Apache-2.0", "private": true, @@ -49,7 +49,7 @@ "@medv/finder": "^1.1.1", "browser-webdriver": "^3.6.0", "classnames": "^2.2.5", - "code-export": "^3.9.0", + "code-export": "^3.10.0", "fuse.js": "^3.3.0", "google-closure-library": "^20170521.0.0", "js-beautify": "^1.7.5", diff --git a/packages/selenium-ide/src/manifest.json b/packages/selenium-ide/src/manifest.json index 907d60800f..86840e4c69 100644 --- a/packages/selenium-ide/src/manifest.json +++ b/packages/selenium-ide/src/manifest.json @@ -2,8 +2,8 @@ "description": "Selenium Record and Playback tool for ease of getting acquainted with Selenium WebDriver.", "manifest_version": 2, "name": "Selenium IDE", - "version": "3.9.0", - "version_name": "3.9.0", + "version": "3.10.0", + "version_name": "3.10.0", "homepage_url": "https://github.com/SeleniumHQ/selenium-ide", "icons": { "16": "icons/icon16.png", From edfa3ec4a5b83713bb8705995eca6174274e92c7 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Sun, 23 Jun 2019 14:04:18 +0300 Subject: [PATCH 76/99] Moved the java-junit and python-pytest command tests over to snapshots --- .../src/__snapshots__/command.spec.js.snap | 502 ++++++++++++++++++ .../__test__/src/command.spec.js | 443 +++++----------- .../src/__snapshots__/command.spec.js.snap | 382 +++++++++++++ .../__test__/src/command.spec.js | 433 +++++---------- 4 files changed, 1136 insertions(+), 624 deletions(-) create mode 100644 packages/code-export-java-junit/__test__/src/__snapshots__/command.spec.js.snap create mode 100644 packages/code-export-python-pytest/__test__/src/__snapshots__/command.spec.js.snap diff --git a/packages/code-export-java-junit/__test__/src/__snapshots__/command.spec.js.snap b/packages/code-export-java-junit/__test__/src/__snapshots__/command.spec.js.snap new file mode 100644 index 0000000000..4944154f55 --- /dev/null +++ b/packages/code-export-java-junit/__test__/src/__snapshots__/command.spec.js.snap @@ -0,0 +1,502 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`command code emitter should emit 'assert selected label' command 1`] = ` +"{ + WebElement element = driver.findElement(By.id(\\"test\\")); + String value = element.getAttribute(\\"value\\"); + String locator = String.format(\\"option[@value='%s']\\", value); + String selectedText = element.findElement(By.xpath(locator)).getText(); + assertThat(selectedText, is(\\"test\\")); +}" +`; + +exports[`command code emitter should emit 'verify selected label' command 1`] = ` +"{ + WebElement element = driver.findElement(By.id(\\"test\\")); + String value = element.getAttribute(\\"value\\"); + String locator = String.format(\\"option[@value='%s']\\", value); + String selectedText = element.findElement(By.xpath(locator)).getText(); + assertThat(selectedText, is(\\"test\\")); +}" +`; + +exports[`command code emitter should emit \`add selection\` command 1`] = ` +"{ + WebElement dropdown = driver.findElement(By.cssSelector(\\"select\\")); + dropdown.findElement(By.xpath(\\"//option[. = 'A label']\\")).click(); +}" +`; + +exports[`command code emitter should emit \`answer on visible prompt\` command 1`] = ` +"{ + Alert alert = driver.switchTo().alert(); + alert.sendKeys(\\"an answer\\") + alert.accept(); +}" +`; + +exports[`command code emitter should emit \`assert alert\` command 1`] = `"assertThat(driver.switchTo().alert().getText(), is(\\"an alert\\"));"`; + +exports[`command code emitter should emit \`assert checked\` command 1`] = `"assertTrue(driver.findElement(By.id(\\"check\\")).isSelected());"`; + +exports[`command code emitter should emit \`assert confirmation\` command 1`] = `"assertThat(driver.switchTo().alert().getText(), is(\\"a confirmation\\"));"`; + +exports[`command code emitter should emit \`assert editable\` command 1`] = ` +"{ + WebElement element = driver.findElement(By.id(\\"text\\")); + Boolean isEditable = element.isEnabled() && element.getAttribute(\\"readonly\\") == null; + assertTrue(isEditable); +}" +`; + +exports[`command code emitter should emit \`assert element not present\` command 1`] = ` +"{ + List elements = driver.findElements(By.id(\\"element\\")); + assert(elements.size() == 0); +}" +`; + +exports[`command code emitter should emit \`assert element present\` command 1`] = ` +"{ + List elements = driver.findElements(By.id(\\"element\\")); + assert(elements.size() > 0); +}" +`; + +exports[`command code emitter should emit \`assert not checked\` command 1`] = `"assertFalse(driver.findElement(By.id(\\"check\\")).isSelected());"`; + +exports[`command code emitter should emit \`assert not editable\` command 1`] = ` +"{ + WebElement element = driver.findElement(By.id(\\"text\\")); + Boolean isEditable = element.isEnabled() && element.getAttribute(\\"readonly\\") == null; + assertFalse(isEditable); +}" +`; + +exports[`command code emitter should emit \`assert not selected value\` command 1`] = ` +"{ + String value = driver.findElement(By.id(\\"select\\")).getAttribute(\\"value\\"); + assertThat(value, is(not(\\"test\\"))); +}" +`; + +exports[`command code emitter should emit \`assert not text\` command 1`] = `"assertThat(driver.findElement(By.id(\\"test\\")).getText(), is(not(\\"text\\")));"`; + +exports[`command code emitter should emit \`assert prompt\` command 1`] = `"assertThat(driver.switchTo().alert().getText(), is(\\"a prompt\\"));"`; + +exports[`command code emitter should emit \`assert selected value\` command 1`] = ` +"{ + String value = driver.findElement(By.id(\\"select\\")).getAttribute(\\"value\\"); + assertThat(value, is(\\"test\\")); +}" +`; + +exports[`command code emitter should emit \`assert text\` command 1`] = `"assertThat(driver.findElement(By.id(\\"test\\")).getText(), is(\\"some text that should be here\\"));"`; + +exports[`command code emitter should emit \`assert title\` command 1`] = `"assertThat(driver.getTitle(), is(\\"example title\\"));"`; + +exports[`command code emitter should emit \`assert value\` command 1`] = ` +"{ + String value = driver.findElement(By.id(\\"select\\")).getAttribute(\\"value\\"); + assertThat(value, is(\\"test\\")); +}" +`; + +exports[`command code emitter should emit \`assert\` command 1`] = `"assertEquals(vars.get(\\"varrrName\\").toString(), \\"blah\\");"`; + +exports[`command code emitter should emit \`check\` command 1`] = ` +"{ + WebElement element = driver.findElement(By.id(\\"f\\")); + if (!element.isSelected()) { + element.click(); + } +}" +`; + +exports[`command code emitter should emit \`choose cancel on visible prompt\` command 1`] = `"driver.switchTo().alert().dismiss();"`; + +exports[`command code emitter should emit \`choose ok on visible confirmation\` command 1`] = `"driver.switchTo().alert().accept();"`; + +exports[`command code emitter should emit \`click at\` command 1`] = `"driver.findElement(By.linkText(\\"button\\")).click();"`; + +exports[`command code emitter should emit \`click\` command 1`] = `"driver.findElement(By.linkText(\\"button\\")).click();"`; + +exports[`command code emitter should emit \`close\` command 1`] = `"driver.close();"`; + +exports[`command code emitter should emit \`do\` command 1`] = ` +Object { + "body": "do {", + "endingLevel": 1, +} +`; + +exports[`command code emitter should emit \`double click at\` command 1`] = ` +"{ + WebElement element = driver.findElement(By.linkText(\\"button\\")); + Actions builder = new Actions(driver); + builder.doubleClick(element).perform(); +}" +`; + +exports[`command code emitter should emit \`double click\` command 1`] = ` +"{ + WebElement element = driver.findElement(By.linkText(\\"button\\")); + Actions builder = new Actions(driver); + builder.doubleClick(element).perform(); +}" +`; + +exports[`command code emitter should emit \`drag and drop to object\` command 1`] = ` +"{ + WebElement dragged = driver.findElement(By.linkText(\\"dragged\\")); + WebElement dropped = driver.findElement(By.linkText(\\"dropped\\")); + Actions builder = new Actions(driver); + builder.dragAndDrop(dragged, dropped).perform(); +}" +`; + +exports[`command code emitter should emit \`echo\` command 1`] = `"System.out.println(\\"blah\\");"`; + +exports[`command code emitter should emit \`echo\` command with variables 1`] = `"System.out.println(vars.get(\\"blah\\").toString());"`; + +exports[`command code emitter should emit \`edit content\` command 1`] = ` +"{ + WebElement element = driver.findElement(By.id(\\"contentEditable\\")); + js.executeScript(\\"if(arguments[0].contentEditable === 'true') {arguments[0].innerText = ''}\\", element); +}" +`; + +exports[`command code emitter should emit \`else if\` command 1`] = ` +Object { + "body": "} else if ((Boolean) js.executeScript(\\"return (true)\\")) {", + "endingLevel": 1, +} +`; + +exports[`command code emitter should emit \`else\` command 1`] = ` +Object { + "body": "} else {", + "endingLevel": 1, +} +`; + +exports[`command code emitter should emit \`end\` command 1`] = ` +Object { + "body": "}", + "endingLevel": 0, +} +`; + +exports[`command code emitter should emit \`execute async script\` command 1`] = `"vars.put(\\"myVar\\", js.executeAsyncScript(\\"var callback = arguments[arguments.length - 1];javascript.then(callback).catch(callback);\\"));"`; + +exports[`command code emitter should emit \`execute script\` command 1`] = `"vars.put(\\"myVar\\", js.executeScript(\\"javascript\\"));"`; + +exports[`command code emitter should emit \`execute script\` command with return string value 1`] = `"vars.put(\\"myVar\\", js.executeScript(\\"return 'a'\\"));"`; + +exports[`command code emitter should emit \`forEach\` command 1`] = ` +Object { + "body": "ArrayList collection = (ArrayList) vars.get(\\"collection\\"); +for (int i = 0; i < collection.size() - 1; i++) { + vars.put(\\"iteratorVar\\", collection.get(i));", + "endingLevel": 1, +} +`; + +exports[`command code emitter should emit \`if\` command 1`] = ` +Object { + "body": "if ((Boolean) js.executeScript(\\"return (true)\\")) {", + "endingLevel": 1, +} +`; + +exports[`command code emitter should emit \`mouse down at\` event 1`] = ` +"{ + WebElement element = driver.findElement(By.id(\\"button\\")); + Action builder = new Actions(driver); + builder.moveToElement(element).clickAndHold().perform(); +}" +`; + +exports[`command code emitter should emit \`mouse down\` command 1`] = ` +"{ + WebElement element = driver.findElement(By.id(\\"button\\")); + Action builder = new Actions(driver); + builder.moveToElement(element).clickAndHold().perform(); +}" +`; + +exports[`command code emitter should emit \`mouse move at\` event 1`] = ` +"{ + WebElement element = driver.findElement(By.id(\\"button\\")); + Action builder = new Actions(driver); + builder.moveToElement(element).perform(); +}" +`; + +exports[`command code emitter should emit \`mouse move\` event 1`] = ` +"{ + WebElement element = driver.findElement(By.id(\\"button\\")); + Action builder = new Actions(driver); + builder.moveToElement(element).perform(); +}" +`; + +exports[`command code emitter should emit \`mouse out\` event 1`] = ` +"{ + WebElement element = driver.findElement(By.tagName(\\"body\\")); + Action builder = new Actions(driver); + builder.moveToElement(element, 0, 0).perform(); +}" +`; + +exports[`command code emitter should emit \`mouse over\` event 1`] = ` +"{ + WebElement element = driver.findElement(By.id(\\"button\\")); + Action builder = new Actions(driver); + builder.moveToElement(element).perform(); +}" +`; + +exports[`command code emitter should emit \`mouse up at\` event 1`] = ` +"{ + WebElement element = driver.findElement(By.id(\\"button\\")); + Action builder = new Actions(driver); + builder.moveToElement(element).release().perform(); +}" +`; + +exports[`command code emitter should emit \`mouse up\` event 1`] = ` +"{ + WebElement element = driver.findElement(By.id(\\"button\\")); + Action builder = new Actions(driver); + builder.moveToElement(element).release().perform(); +}" +`; + +exports[`command code emitter should emit \`open\` with absolute url 1`] = `"driver.get(\\"https://www.seleniumhq.org/\\");"`; + +exports[`command code emitter should emit \`pause\` command 1`] = ` +"try { + Thread.sleep(300); +} catch (InterruptedException e) { + e.printStackTrace(); +}" +`; + +exports[`command code emitter should emit \`remove selection\` command 1`] = ` +"{ + WebElement dropdown = driver.findElement(By.cssSelector(\\"select\\")); + dropdown.findElement(By.xpath(\\"//option[. = 'A label']\\")).click(); +}" +`; + +exports[`command code emitter should emit \`repeatIf\` command 1`] = `"} while ((Boolean) js.executeScript(\\"return (true)\\"));"`; + +exports[`command code emitter should emit \`run script\` command 1`] = `"js.executeScript(\\"alert('test');alert('Im annoying');\\");"`; + +exports[`command code emitter should emit \`run\` command 1`] = `"sometestcase();"`; + +exports[`command code emitter should emit \`select frame\` to select the top frame 1`] = `"driver.switchTo().defaultContent();"`; + +exports[`command code emitter should emit \`select window\` to select a window by handle 1`] = `"driver.switchTo().window(vars.get(\\"window\\").toString());"`; + +exports[`command code emitter should emit \`select window\` to select a window by implicit index 1`] = ` +"{ + ArrayList handles = new ArrayList(driver.getWindowHandles()); + driver.switchTo().window(handles.get(12)); +}" +`; + +exports[`command code emitter should emit \`select window\` to select a window by name 1`] = `"driver.switchTo().window(\\"window\\");"`; + +exports[`command code emitter should emit \`select window\` to select a window by the local keyword 1`] = ` +"{ + ArrayList handles = new ArrayList(driver.getWindowHandles()); + driver.switchTo().window(handles.get(0)); +}" +`; + +exports[`command code emitter should emit \`select\` command 1`] = ` +"{ + WebElement dropdown = driver.findElement(By.cssSelector(\\"select\\")); + dropdown.findElement(By.xpath(\\"//option[. = 'A label']\\")).click(); +}" +`; + +exports[`command code emitter should emit \`send keys\` command 1`] = `"driver.findElement(By.id(\\"input\\")).sendKeys(\\"example input\\");"`; + +exports[`command code emitter should emit \`send keys\` command with a key press 1`] = `"driver.findElement(By.id(\\"input\\")).sendKeys(\\"SuperSecretPassword!\\", Keys.ENTER);"`; + +exports[`command code emitter should emit \`send keys\` command with a variable input 1`] = `"driver.findElement(By.id(\\"input\\")).sendKeys(vars.get(\\"blah\\").toString());"`; + +exports[`command code emitter should emit \`set speed\` 1`] = `"System.out.println(\\"\`set speed\` is a no-op in code export, use \`pause\` instead\\");"`; + +exports[`command code emitter should emit \`setWindowSize\` 1`] = `"driver.manage().window().setSize(new Dimension(1440, 1177));"`; + +exports[`command code emitter should emit \`store attribute\` command 1`] = ` +"{ + WebElement element = driver.findElement(By.xpath(\\"button[3]\\")); + String attribute = element.getAttribute(\\"id\\"); + vars.put(\\"myVar\\", attribute); +}" +`; + +exports[`command code emitter should emit \`store text\` command 1`] = `"vars.put(\\"myVar\\", driver.findElement(By.id(\\"someElement\\")).getText());"`; + +exports[`command code emitter should emit \`store title\` command 1`] = `"vars.put(\\"myVar\\", driver.getTitle());"`; + +exports[`command code emitter should emit \`store value\` command 1`] = `"vars.put(\\"myVar\\", driver.findElement(By.id(\\"someElement\\")).getAttribute(\\"value\\"));"`; + +exports[`command code emitter should emit \`store window handle\` command 1`] = `"vars.put(\\"windowName\\", driver.getWindowHandle());"`; + +exports[`command code emitter should emit \`store xpath count\` command 1`] = `"vars.put(\\"myVar\\", driver.findElements(By.xpath(\\"button\\")).size());"`; + +exports[`command code emitter should emit \`store\` command 1`] = `"vars.put(\\"myVar\\", \\"some value\\");"`; + +exports[`command code emitter should emit \`submit\` command 1`] = `"throw new Error(\\"\`submit\` is not a supported command in Selenium WebDriver. Please re-record the step in the IDE.\\");"`; + +exports[`command code emitter should emit \`times\` command 1`] = ` +Object { + "body": "Integer times = 5; +for(int i = 0; i < times; i++) {", + "endingLevel": 1, +} +`; + +exports[`command code emitter should emit \`type\` command 1`] = `"driver.findElement(By.id(\\"input\\")).sendKeys(\\"example input\\");"`; + +exports[`command code emitter should emit \`uncheck\` command 1`] = ` +"{ + WebElement element = driver.findElement(By.id(\\"f\\")); + if (element.isSelected()) { + element.click(); + } +}" +`; + +exports[`command code emitter should emit \`verify checked\` command 1`] = `"assertTrue(driver.findElement(By.id(\\"check\\")).isSelected());"`; + +exports[`command code emitter should emit \`verify editable\` command 1`] = ` +"{ + WebElement element = driver.findElement(By.id(\\"text\\")); + Boolean isEditable = element.isEnabled() && element.getAttribute(\\"readonly\\") == null; + assertTrue(isEditable); +}" +`; + +exports[`command code emitter should emit \`verify element not present\` command 1`] = ` +"{ + List elements = driver.findElements(By.id(\\"element\\")); + assert(elements.size() == 0); +}" +`; + +exports[`command code emitter should emit \`verify element present\` command 1`] = ` +"{ + List elements = driver.findElements(By.id(\\"element\\")); + assert(elements.size() > 0); +}" +`; + +exports[`command code emitter should emit \`verify not checked\` command 1`] = `"assertFalse(driver.findElement(By.id(\\"check\\")).isSelected());"`; + +exports[`command code emitter should emit \`verify not editable\` command 1`] = ` +"{ + WebElement element = driver.findElement(By.id(\\"text\\")); + Boolean isEditable = element.isEnabled() && element.getAttribute(\\"readonly\\") == null; + assertFalse(isEditable); +}" +`; + +exports[`command code emitter should emit \`verify not selected value\` command 1`] = ` +"{ + String value = driver.findElement(By.id(\\"select\\")).getAttribute(\\"value\\"); + assertThat(value, is(not(\\"test\\"))); +}" +`; + +exports[`command code emitter should emit \`verify not text\` command 1`] = `"assertThat(driver.findElement(By.id(\\"test\\")).getText(), is(not(\\"text\\")));"`; + +exports[`command code emitter should emit \`verify selected value\` command 1`] = ` +"{ + String value = driver.findElement(By.id(\\"select\\")).getAttribute(\\"value\\"); + assertThat(value, is(\\"test\\")); +}" +`; + +exports[`command code emitter should emit \`verify text\` command 1`] = `"assertThat(driver.findElement(By.id(\\"test\\")).getText(), is(\\"some text that should be here\\"));"`; + +exports[`command code emitter should emit \`verify title\` command 1`] = `"assertThat(driver.getTitle(), is(\\"example title\\"));"`; + +exports[`command code emitter should emit \`verify value\` command 1`] = ` +"{ + String value = driver.findElement(By.id(\\"select\\")).getAttribute(\\"value\\"); + assertThat(value, is(\\"test\\")); +}" +`; + +exports[`command code emitter should emit \`verify\` command 1`] = `"assertEquals(vars.get(\\"varrrName\\").toString(), \\"blah\\");"`; + +exports[`command code emitter should emit \`waitForElementEditable\` command 1`] = ` +"{ + WebDriverWait wait = new WebDriverWait(driver, 5); + wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector(\\"#blah\\"))); +}" +`; + +exports[`command code emitter should emit \`waitForElementNotEditable\` command 1`] = ` +"{ + WebDriverWait wait = new WebDriverWait(driver, 5); + wait.until(ExpectedConditions.not(ExpectedConditions.elementToBeClickable(By.cssSelector(\\"#blah\\")))); +}" +`; + +exports[`command code emitter should emit \`waitForElementNotPresent\` command 1`] = ` +"{ + WebDriverWait wait = new WebDriverWait(driver, 5); + WebElement element = driver.findElement(By.cssSelector(\\"#blah\\")); + wait.until(ExpectedConditions.stalenessOf(element)); +}" +`; + +exports[`command code emitter should emit \`waitForElementNotVisible\` command 1`] = ` +"{ + WebDriverWait wait = new WebDriverWait(driver, 5); + wait.until(ExpectedConditions.invisibilityOfElementLocated(By.cssSelector(\\"#blah\\"))); +}" +`; + +exports[`command code emitter should emit \`waitForElementPresent\` command 1`] = ` +"{ + WebDriverWait wait = new WebDriverWait(driver, 5); + wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector(\\"#blah\\"))); +}" +`; + +exports[`command code emitter should emit \`waitForElementVisible\` command 1`] = ` +"{ + WebDriverWait wait = new WebDriverWait(driver, 5); + wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector(\\"#blah\\"))); +}" +`; + +exports[`command code emitter should emit \`while\` command 1`] = ` +Object { + "body": "while ((Boolean) js.executeScript(\\"return (true)\\")) {", + "endingLevel": 1, +} +`; + +exports[`command code emitter should emit new window handling, if command opens a new window 1`] = ` +"vars.put(\\"window_handles\\", driver.getWindowHandles()); +driver.findElement(By.cssSelector(\\"button\\")).click(); +vars.put(\\"newWin\\", waitForWindow(2000));" +`; + +exports[`command code emitter should skip playback supported commands, that are not supported in webdriver 1`] = `""`; + +exports[`command code emitter should skip playback supported commands, that are not supported in webdriver 2`] = `""`; + +exports[`command code emitter should skip playback supported commands, that are not supported in webdriver 3`] = `""`; + +exports[`command code emitter should skip playback supported commands, that are not supported in webdriver 4`] = `""`; diff --git a/packages/code-export-java-junit/__test__/src/command.spec.js b/packages/code-export-java-junit/__test__/src/command.spec.js index 43d568feb1..f7e41cb46e 100644 --- a/packages/code-export-java-junit/__test__/src/command.spec.js +++ b/packages/code-export-java-junit/__test__/src/command.spec.js @@ -57,9 +57,7 @@ describe('command code emitter', () => { target: 'css=select', value: 'label=A label', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement dropdown = driver.findElement(By.cssSelector("select"));\n${commandPrefixPadding}dropdown.findElement(By.xpath("//option[. = 'A label']")).click();\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert` command', () => { const command = { @@ -67,11 +65,7 @@ describe('command code emitter', () => { target: 'varrrName', value: 'blah', } - expect(prettify(command)).resolves.toBe( - `assertEquals(vars.get("${command.target}").toString(), "${ - command.value - }");` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert alert` command', () => { const command = { @@ -79,9 +73,7 @@ describe('command code emitter', () => { target: 'an alert', value: '', } - return expect(prettify(command)).resolves.toBe( - `assertThat(driver.switchTo().alert().getText(), is("an alert"));` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert checked` command', () => { const command = { @@ -89,9 +81,7 @@ describe('command code emitter', () => { target: 'id=check', value: '', } - return expect(prettify(command)).resolves.toBe( - `assertTrue(driver.findElement(By.id("check")).isSelected());` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert confirmation` command', () => { const command = { @@ -99,9 +89,7 @@ describe('command code emitter', () => { target: 'a confirmation', value: '', } - return expect(prettify(command)).resolves.toBe( - `assertThat(driver.switchTo().alert().getText(), is("a confirmation"));` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert editable` command', () => { const command = { @@ -109,9 +97,7 @@ describe('command code emitter', () => { target: 'id=text', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("text"));\n${commandPrefixPadding}Boolean isEditable = element.isEnabled() && element.getAttribute("readonly") == null;\n${commandPrefixPadding}assertTrue(isEditable);\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert element present` command', () => { const command = { @@ -119,9 +105,7 @@ describe('command code emitter', () => { target: 'id=element', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}List elements = driver.findElements(By.id("element"));\n${commandPrefixPadding}assert(elements.size() > 0);\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert element not present` command', () => { const command = { @@ -129,9 +113,7 @@ describe('command code emitter', () => { target: 'id=element', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}List elements = driver.findElements(By.id("element"));\n${commandPrefixPadding}assert(elements.size() == 0);\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert not checked` command', () => { const command = { @@ -139,9 +121,7 @@ describe('command code emitter', () => { target: 'id=check', value: '', } - return expect(prettify(command)).resolves.toBe( - `assertFalse(driver.findElement(By.id("check")).isSelected());` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert not editable` command', () => { const command = { @@ -149,9 +129,7 @@ describe('command code emitter', () => { target: 'id=text', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("text"));\n${commandPrefixPadding}Boolean isEditable = element.isEnabled() && element.getAttribute("readonly") == null;\n${commandPrefixPadding}assertFalse(isEditable);\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert not selected value` command', () => { const command = { @@ -159,9 +137,7 @@ describe('command code emitter', () => { target: 'id=select', value: 'test', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}String value = driver.findElement(By.id("select")).getAttribute("value");\n${commandPrefixPadding}assertThat(value, is(not("test")));\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert not text` command', () => { const command = { @@ -169,9 +145,7 @@ describe('command code emitter', () => { target: 'id=test', value: 'text', } - return expect(prettify(command)).resolves.toBe( - `assertThat(driver.findElement(By.id("test")).getText(), is(not("text")));` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert prompt` command', () => { const command = { @@ -179,9 +153,7 @@ describe('command code emitter', () => { target: 'a prompt', value: '', } - return expect(prettify(command)).resolves.toBe( - `assertThat(driver.switchTo().alert().getText(), is("a prompt"));` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it("should emit 'assert selected label' command", () => { const command = { @@ -189,9 +161,7 @@ describe('command code emitter', () => { target: 'id=test', value: 'test', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("test"));\n${commandPrefixPadding}String value = element.getAttribute("value");\n${commandPrefixPadding}String locator = String.format("option[@value='%s']", value);\n${commandPrefixPadding}String selectedText = element.findElement(By.xpath(locator)).getText();\n${commandPrefixPadding}assertThat(selectedText, is("test"));\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert selected value` command', () => { const command = { @@ -199,9 +169,7 @@ describe('command code emitter', () => { target: 'id=select', value: 'test', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}String value = driver.findElement(By.id("select")).getAttribute("value");\n${commandPrefixPadding}assertThat(value, is("test"));\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert text` command', () => { const command = { @@ -209,11 +177,7 @@ describe('command code emitter', () => { target: 'id=test', value: 'some text that should be here', } - expect(prettify(command)).resolves.toBe( - `assertThat(driver.findElement(By.id("test")).getText(), is("${ - command.value - }"));` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert title` command', () => { const command = { @@ -221,9 +185,7 @@ describe('command code emitter', () => { target: 'example title', value: '', } - return expect(prettify(command)).resolves.toBe( - `assertThat(driver.getTitle(), is("example title"));` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert value` command', () => { const command = { @@ -231,9 +193,7 @@ describe('command code emitter', () => { target: 'id=select', value: 'test', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}String value = driver.findElement(By.id("select")).getAttribute("value");\n${commandPrefixPadding}assertThat(value, is("test"));\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `click` command', () => { const command = { @@ -241,9 +201,7 @@ describe('command code emitter', () => { target: 'link=button', value: '', } - return expect(prettify(command)).resolves.toBe( - 'driver.findElement(By.linkText("button")).click();' - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `click at` command', () => { const command = { @@ -251,9 +209,7 @@ describe('command code emitter', () => { target: 'link=button', value: '', } - return expect(prettify(command)).resolves.toBe( - 'driver.findElement(By.linkText("button")).click();' - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `check` command', () => { const command = { @@ -261,9 +217,7 @@ describe('command code emitter', () => { target: 'id=f', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("f"));\n${commandPrefixPadding}if (!element.isSelected()) {\n${commandPrefixPadding}${commandPrefixPadding}element.click();\n${commandPrefixPadding}}\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `close` command', () => { const command = { @@ -271,7 +225,7 @@ describe('command code emitter', () => { target: '', value: '', } - return expect(prettify(command)).resolves.toBe(`driver.close();`) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `do` command', () => { const command = { @@ -279,10 +233,9 @@ describe('command code emitter', () => { target: '', value: '', } - return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: 'do {', - endingLevel: 1, - }) + return expect( + prettify(command, { fullPayload: true }) + ).resolves.toMatchSnapshot() }) it('should emit `double click` command', () => { const command = { @@ -290,9 +243,7 @@ describe('command code emitter', () => { target: 'link=button', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.linkText("button"));\n${commandPrefixPadding}Actions builder = new Actions(driver);\n${commandPrefixPadding}builder.doubleClick(element).perform();\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `double click at` command', () => { const command = { @@ -300,9 +251,7 @@ describe('command code emitter', () => { target: 'link=button', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.linkText("button"));\n${commandPrefixPadding}Actions builder = new Actions(driver);\n${commandPrefixPadding}builder.doubleClick(element).perform();\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `drag and drop to object` command', () => { const command = { @@ -310,9 +259,7 @@ describe('command code emitter', () => { target: 'link=dragged', value: 'link=dropped', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement dragged = driver.findElement(By.linkText("dragged"));\n${commandPrefixPadding}WebElement dropped = driver.findElement(By.linkText("dropped"));\n${commandPrefixPadding}Actions builder = new Actions(driver);\n${commandPrefixPadding}builder.dragAndDrop(dragged, dropped).perform();\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `echo` command', () => { const command = { @@ -320,9 +267,7 @@ describe('command code emitter', () => { target: 'blah', value: '', } - return expect(prettify(command)).resolves.toBe( - `System.out.println("blah");` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `echo` command with variables', () => { const command = { @@ -330,9 +275,7 @@ describe('command code emitter', () => { target: '${blah}', value: '', } - return expect(prettify(command)).resolves.toBe( - `System.out.println(vars.get("blah").toString());` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `edit content` command', () => { const command = { @@ -340,9 +283,7 @@ describe('command code emitter', () => { target: 'id=contentEditable', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("contentEditable"));\n${commandPrefixPadding}js.executeScript("if(arguments[0].contentEditable === 'true') {arguments[0].innerText = ''}", element);\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `else` command', () => { const command = { @@ -350,10 +291,9 @@ describe('command code emitter', () => { target: 'true', value: '', } - return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: `} else {`, - endingLevel: 1, - }) + return expect( + prettify(command, { fullPayload: true }) + ).resolves.toMatchSnapshot() }) it('should emit `else if` command', () => { const command = { @@ -361,10 +301,9 @@ describe('command code emitter', () => { target: 'true', value: '', } - return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: `} else if ((Boolean) js.executeScript("return (true)")) {`, - endingLevel: 1, - }) + return expect( + prettify(command, { fullPayload: true }) + ).resolves.toMatchSnapshot() }) it('should emit `end` command', async () => { const command = { @@ -372,10 +311,9 @@ describe('command code emitter', () => { target: '', value: '', } - return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: `}`, - endingLevel: 0, - }) + return expect( + prettify(command, { fullPayload: true }) + ).resolves.toMatchSnapshot() }) it('should emit `execute script` command', () => { const command = { @@ -383,9 +321,7 @@ describe('command code emitter', () => { target: 'javascript', value: 'myVar', } - return expect(prettify(command)).resolves.toBe( - `vars.put("myVar", js.executeScript("javascript"));` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `execute script` command with return string value', () => { const command = { @@ -393,9 +329,7 @@ describe('command code emitter', () => { target: 'return "a"', value: 'myVar', } - return expect(prettify(command)).resolves.toBe( - `vars.put("myVar", js.executeScript("return 'a'"));` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `execute async script` command', () => { const command = { @@ -403,9 +337,7 @@ describe('command code emitter', () => { target: 'javascript', value: 'myVar', } - return expect(prettify(command)).resolves.toBe( - `vars.put("myVar", js.executeAsyncScript("var callback = arguments[arguments.length - 1];javascript.then(callback).catch(callback);"));` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `forEach` command', () => { const command = { @@ -413,10 +345,9 @@ describe('command code emitter', () => { target: 'collection', value: 'iteratorVar', } - return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: `ArrayList collection = (ArrayList) vars.get("collection");\nfor (int i = 0; i < collection.size() - 1; i++) {\n${commandPrefixPadding}vars.put("iteratorVar", collection.get(i));`, - endingLevel: 1, - }) + return expect( + prettify(command, { fullPayload: true }) + ).resolves.toMatchSnapshot() }) it('should emit `if` command', () => { const command = { @@ -424,10 +355,9 @@ describe('command code emitter', () => { target: 'true', value: '', } - return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: `if ((Boolean) js.executeScript("return (true)")) {`, - endingLevel: 1, - }) + return expect( + prettify(command, { fullPayload: true }) + ).resolves.toMatchSnapshot() }) it('should emit `mouse down` command', () => { const command = { @@ -435,9 +365,7 @@ describe('command code emitter', () => { target: 'id=button', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("button"));\n${commandPrefixPadding}Action builder = new Actions(driver);\n${commandPrefixPadding}builder.moveToElement(element).clickAndHold().perform();\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `mouse down at` event', () => { const command = { @@ -445,9 +373,7 @@ describe('command code emitter', () => { target: 'id=button', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("button"));\n${commandPrefixPadding}Action builder = new Actions(driver);\n${commandPrefixPadding}builder.moveToElement(element).clickAndHold().perform();\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `mouse move` event', () => { const command = { @@ -455,9 +381,7 @@ describe('command code emitter', () => { target: 'id=button', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("button"));\n${commandPrefixPadding}Action builder = new Actions(driver);\n${commandPrefixPadding}builder.moveToElement(element).perform();\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `mouse move at` event', () => { const command = { @@ -465,9 +389,7 @@ describe('command code emitter', () => { target: 'id=button', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("button"));\n${commandPrefixPadding}Action builder = new Actions(driver);\n${commandPrefixPadding}builder.moveToElement(element).perform();\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `mouse out` event', () => { const command = { @@ -475,9 +397,7 @@ describe('command code emitter', () => { target: 'id=button', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.tagName("body"));\n${commandPrefixPadding}Action builder = new Actions(driver);\n${commandPrefixPadding}builder.moveToElement(element, 0, 0).perform();\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `mouse over` event', () => { const command = { @@ -485,9 +405,7 @@ describe('command code emitter', () => { target: 'id=button', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("button"));\n${commandPrefixPadding}Action builder = new Actions(driver);\n${commandPrefixPadding}builder.moveToElement(element).perform();\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `mouse up` event', () => { const command = { @@ -495,9 +413,7 @@ describe('command code emitter', () => { target: 'id=button', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("button"));\n${commandPrefixPadding}Action builder = new Actions(driver);\n${commandPrefixPadding}builder.moveToElement(element).release().perform();\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `mouse up at` event', () => { const command = { @@ -505,9 +421,7 @@ describe('command code emitter', () => { target: 'id=button', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("button"));\n${commandPrefixPadding}Action builder = new Actions(driver);\n${commandPrefixPadding}builder.moveToElement(element).release().perform();\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `open` with absolute url', () => { const command = { @@ -515,9 +429,7 @@ describe('command code emitter', () => { target: 'https://www.seleniumhq.org/', value: '', } - return expect(prettify(command)).resolves.toBe( - `driver.get("${command.target}");` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `pause` command', () => { const command = { @@ -525,9 +437,7 @@ describe('command code emitter', () => { target: '300', value: '', } - return expect(prettify(command)).resolves.toBe( - `try {\n${commandPrefixPadding}Thread.sleep(300);\n} catch (InterruptedException e) {\n${commandPrefixPadding}e.printStackTrace();\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `remove selection` command', () => { const command = { @@ -535,9 +445,7 @@ describe('command code emitter', () => { target: 'css=select', value: 'label=A label', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement dropdown = driver.findElement(By.cssSelector("select"));\n${commandPrefixPadding}dropdown.findElement(By.xpath("//option[. = 'A label']")).click();\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `repeatIf` command', () => { const command = { @@ -545,9 +453,7 @@ describe('command code emitter', () => { target: 'true', value: '', } - return expect(prettify(command)).resolves.toBe( - `} while ((Boolean) js.executeScript("return (true)"));` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `run` command', () => { const command = { @@ -555,7 +461,7 @@ describe('command code emitter', () => { target: 'some test case', value: '', } - return expect(prettify(command)).resolves.toBe(`sometestcase();`) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `run script` command', () => { const command = { @@ -563,9 +469,7 @@ describe('command code emitter', () => { target: "alert('test');alert('Im annoying');", value: '', } - return expect(prettify(command)).resolves.toBe( - `js.executeScript("alert('test');alert('Im annoying');");` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `select` command', () => { const command = { @@ -573,9 +477,7 @@ describe('command code emitter', () => { target: 'css=select', value: 'label=A label', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement dropdown = driver.findElement(By.cssSelector("select"));\n${commandPrefixPadding}dropdown.findElement(By.xpath("//option[. = 'A label']")).click();\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `select frame` to select the top frame', () => { const command = { @@ -583,9 +485,7 @@ describe('command code emitter', () => { target: 'relative=top', value: '', } - return expect(prettify(command)).resolves.toBe( - 'driver.switchTo().defaultContent();' - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should fail to emit `select window` by using unknown locator', () => { const command = { @@ -603,9 +503,7 @@ describe('command code emitter', () => { target: 'handle=${window}', value: '', } - return expect(prettify(command)).resolves.toBe( - `driver.switchTo().window(vars.get("window").toString());` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `select window` to select a window by name', () => { const command = { @@ -613,9 +511,7 @@ describe('command code emitter', () => { target: 'name=window', value: '', } - return expect(prettify(command)).resolves.toBe( - `driver.switchTo().window("window");` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `select window` to select a window by the local keyword', () => { const command = { @@ -623,9 +519,7 @@ describe('command code emitter', () => { target: 'win_ser_local', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}ArrayList handles = new ArrayList(driver.getWindowHandles());\n${commandPrefixPadding}driver.switchTo().window(handles.get(0));\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `select window` to select a window by implicit index', () => { const command = { @@ -633,9 +527,7 @@ describe('command code emitter', () => { target: 'win_ser_12', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}ArrayList handles = new ArrayList(driver.getWindowHandles());\n${commandPrefixPadding}driver.switchTo().window(handles.get(12));\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `send keys` command', () => { const command = { @@ -643,9 +535,7 @@ describe('command code emitter', () => { target: 'id=input', value: 'example input', } - return expect(prettify(command)).resolves.toBe( - `driver.findElement(By.id("input")).sendKeys("${command.value}");` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `send keys` command with a variable input', () => { const command = { @@ -653,9 +543,7 @@ describe('command code emitter', () => { target: 'id=input', value: '${blah}', } - return expect(prettify(command)).resolves.toBe( - `driver.findElement(By.id("input")).sendKeys(vars.get("blah").toString());` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `send keys` command with a key press', () => { const command = { @@ -663,14 +551,11 @@ describe('command code emitter', () => { target: 'id=input', value: 'SuperSecretPassword!${KEY_ENTER}', } - return expect(prettify(command)).resolves.toBe( - `driver.findElement(By.id("input")).sendKeys("SuperSecretPassword!", Keys.ENTER);` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `set speed`', () => { - expect(prettify({ command: 'setSpeed' })).resolves.toBe( - `System.out.println("\`set speed\` is a no-op in code export, use \`pause\` instead");` - ) + const command = { command: 'setSpeed' } + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `setWindowSize`', () => { const command = { @@ -678,22 +563,22 @@ describe('command code emitter', () => { target: '1440x1177', value: '', } - expect(prettify(command)).resolves.toBe( - `driver.manage().window().setSize(new Dimension(1440, 1177));` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should skip playback supported commands, that are not supported in webdriver', () => { return Promise.all([ - expect(prettify({ command: 'answerOnNextPrompt' })).resolves.toBe(''), + expect( + prettify({ command: 'answerOnNextPrompt' }) + ).resolves.toMatchSnapshot(), expect( prettify({ command: 'chooseCancelOnNextConfirmation' }) - ).resolves.toBe(''), - expect(prettify({ command: 'chooseCancelOnNextPrompt' })).resolves.toBe( - '' - ), - expect(prettify({ command: 'chooseOkOnNextConfirmation' })).resolves.toBe( - '' - ), + ).resolves.toMatchSnapshot(), + expect( + prettify({ command: 'chooseCancelOnNextPrompt' }) + ).resolves.toMatchSnapshot(), + expect( + prettify({ command: 'chooseOkOnNextConfirmation' }) + ).resolves.toMatchSnapshot(), ]) }) it('should emit `store` command', () => { @@ -702,9 +587,7 @@ describe('command code emitter', () => { target: 'some value', value: 'myVar', } - return expect(prettify(command)).resolves.toBe( - `vars.put("myVar", "some value");` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `store attribute` command', () => { const command = { @@ -712,9 +595,7 @@ describe('command code emitter', () => { target: 'xpath=button[3]@id', value: 'myVar', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.xpath("button[3]"));\n${commandPrefixPadding}String attribute = element.getAttribute("id");\n${commandPrefixPadding}vars.put("myVar", attribute);\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `store text` command', () => { const command = { @@ -722,9 +603,7 @@ describe('command code emitter', () => { target: 'id=someElement', value: 'myVar', } - return expect(prettify(command)).resolves.toBe( - `vars.put("myVar", driver.findElement(By.id("someElement")).getText());` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it.skip('should emit `store json` command', () => { const command = { @@ -732,7 +611,7 @@ describe('command code emitter', () => { target: '[{"a":0}]', value: 'myVar', } - return expect(prettify(command)).resolves.toBe('') + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `store title` command', () => { const command = { @@ -740,9 +619,7 @@ describe('command code emitter', () => { target: '', value: 'myVar', } - return expect(prettify(command)).resolves.toBe( - `vars.put("myVar", driver.getTitle());` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `store value` command', () => { const command = { @@ -750,9 +627,7 @@ describe('command code emitter', () => { target: 'id=someElement', value: 'myVar', } - return expect(prettify(command)).resolves.toBe( - `vars.put("myVar", driver.findElement(By.id("someElement")).getAttribute("value"));` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `store window handle` command', () => { const command = { @@ -760,9 +635,7 @@ describe('command code emitter', () => { target: 'windowName', value: '', } - return expect(prettify(command)).resolves.toBe( - `vars.put("windowName", driver.getWindowHandle());` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `store xpath count` command', () => { const command = { @@ -770,9 +643,7 @@ describe('command code emitter', () => { target: 'xpath=button', value: 'myVar', } - return expect(prettify(command)).resolves.toBe( - `vars.put("myVar", driver.findElements(By.xpath("button")).size());` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `submit` command', () => { const command = { @@ -780,9 +651,7 @@ describe('command code emitter', () => { target: 'id=form', value: '', } - return expect(prettify(command)).resolves.toBe( - `throw new Error("\`submit\` is not a supported command in Selenium WebDriver. Please re-record the step in the IDE.");` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `times` command', () => { const command = { @@ -790,12 +659,9 @@ describe('command code emitter', () => { target: '5', value: '', } - return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: `Integer times = ${ - command.target - };\nfor(int i = 0; i < times; i++) {`, - endingLevel: 1, - }) + return expect( + prettify(command, { fullPayload: true }) + ).resolves.toMatchSnapshot() }) it('should emit `type` command', () => { const command = { @@ -803,9 +669,7 @@ describe('command code emitter', () => { target: 'id=input', value: 'example input', } - expect(prettify(command)).resolves.toBe( - `driver.findElement(By.id("input")).sendKeys("${command.value}");` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `uncheck` command', () => { const command = { @@ -813,9 +677,7 @@ describe('command code emitter', () => { target: 'id=f', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("f"));\n${commandPrefixPadding}if (element.isSelected()) {\n${commandPrefixPadding}${commandPrefixPadding}element.click();\n${commandPrefixPadding}}\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `verify` command', () => { const command = { @@ -823,11 +685,7 @@ describe('command code emitter', () => { target: 'varrrName', value: 'blah', } - expect(prettify(command)).resolves.toBe( - `assertEquals(vars.get("${command.target}").toString(), "${ - command.value - }");` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `verify checked` command', () => { const command = { @@ -835,9 +693,7 @@ describe('command code emitter', () => { target: 'id=check', value: '', } - return expect(prettify(command)).resolves.toBe( - `assertTrue(driver.findElement(By.id("check")).isSelected());` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `verify editable` command', () => { const command = { @@ -845,9 +701,7 @@ describe('command code emitter', () => { target: 'id=text', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("text"));\n${commandPrefixPadding}Boolean isEditable = element.isEnabled() && element.getAttribute("readonly") == null;\n${commandPrefixPadding}assertTrue(isEditable);\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `verify element present` command', () => { const command = { @@ -855,9 +709,7 @@ describe('command code emitter', () => { target: 'id=element', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}List elements = driver.findElements(By.id("element"));\n${commandPrefixPadding}assert(elements.size() > 0);\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `verify element not present` command', () => { const command = { @@ -865,9 +717,7 @@ describe('command code emitter', () => { target: 'id=element', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}List elements = driver.findElements(By.id("element"));\n${commandPrefixPadding}assert(elements.size() == 0);\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `verify not checked` command', () => { const command = { @@ -875,9 +725,7 @@ describe('command code emitter', () => { target: 'id=check', value: '', } - return expect(prettify(command)).resolves.toBe( - `assertFalse(driver.findElement(By.id("check")).isSelected());` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `verify not editable` command', () => { const command = { @@ -885,9 +733,7 @@ describe('command code emitter', () => { target: 'id=text', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("text"));\n${commandPrefixPadding}Boolean isEditable = element.isEnabled() && element.getAttribute("readonly") == null;\n${commandPrefixPadding}assertFalse(isEditable);\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `verify not selected value` command', () => { const command = { @@ -895,9 +741,7 @@ describe('command code emitter', () => { target: 'id=select', value: 'test', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}String value = driver.findElement(By.id("select")).getAttribute("value");\n${commandPrefixPadding}assertThat(value, is(not("test")));\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `verify not text` command', () => { const command = { @@ -905,9 +749,7 @@ describe('command code emitter', () => { target: 'id=test', value: 'text', } - return expect(prettify(command)).resolves.toBe( - `assertThat(driver.findElement(By.id("test")).getText(), is(not("text")));` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it("should emit 'verify selected label' command", () => { const command = { @@ -915,9 +757,7 @@ describe('command code emitter', () => { target: 'id=test', value: 'test', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebElement element = driver.findElement(By.id("test"));\n${commandPrefixPadding}String value = element.getAttribute("value");\n${commandPrefixPadding}String locator = String.format("option[@value='%s']", value);\n${commandPrefixPadding}String selectedText = element.findElement(By.xpath(locator)).getText();\n${commandPrefixPadding}assertThat(selectedText, is("test"));\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `verify value` command', () => { const command = { @@ -925,9 +765,7 @@ describe('command code emitter', () => { target: 'id=select', value: 'test', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}String value = driver.findElement(By.id("select")).getAttribute("value");\n${commandPrefixPadding}assertThat(value, is("test"));\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `verify selected value` command', () => { const command = { @@ -935,9 +773,7 @@ describe('command code emitter', () => { target: 'id=select', value: 'test', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}String value = driver.findElement(By.id("select")).getAttribute("value");\n${commandPrefixPadding}assertThat(value, is("test"));\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `verify text` command', () => { const command = { @@ -945,11 +781,7 @@ describe('command code emitter', () => { target: 'id=test', value: 'some text that should be here', } - expect(prettify(command)).resolves.toBe( - `assertThat(driver.findElement(By.id("test")).getText(), is("${ - command.value - }"));` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `verify title` command', () => { const command = { @@ -957,9 +789,7 @@ describe('command code emitter', () => { target: 'example title', value: '', } - return expect(prettify(command)).resolves.toBe( - `assertThat(driver.getTitle(), is("example title"));` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `waitForElementEditable` command', () => { const command = { @@ -967,9 +797,7 @@ describe('command code emitter', () => { target: 'css=#blah', value: '5000', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebDriverWait wait = new WebDriverWait(driver, 5);\n${commandPrefixPadding}wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#blah")));\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `waitForElementPresent` command', () => { const command = { @@ -977,9 +805,7 @@ describe('command code emitter', () => { target: 'css=#blah', value: '5000', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebDriverWait wait = new WebDriverWait(driver, 5);\n${commandPrefixPadding}wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#blah")));\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `waitForElementVisible` command', () => { const command = { @@ -987,9 +813,7 @@ describe('command code emitter', () => { target: 'css=#blah', value: '5000', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebDriverWait wait = new WebDriverWait(driver, 5);\n${commandPrefixPadding}wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("#blah")));\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `waitForElementNotEditable` command', () => { const command = { @@ -997,9 +821,7 @@ describe('command code emitter', () => { target: 'css=#blah', value: '5000', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebDriverWait wait = new WebDriverWait(driver, 5);\n${commandPrefixPadding}wait.until(ExpectedConditions.not(ExpectedConditions.elementToBeClickable(By.cssSelector("#blah"))));\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `waitForElementNotPresent` command', () => { const command = { @@ -1007,9 +829,7 @@ describe('command code emitter', () => { target: 'css=#blah', value: '5000', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebDriverWait wait = new WebDriverWait(driver, 5);\n${commandPrefixPadding}WebElement element = driver.findElement(By.cssSelector("#blah"));\n${commandPrefixPadding}wait.until(ExpectedConditions.stalenessOf(element));\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `waitForElementNotVisible` command', () => { const command = { @@ -1017,9 +837,7 @@ describe('command code emitter', () => { target: 'css=#blah', value: '5000', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}WebDriverWait wait = new WebDriverWait(driver, 5);\n${commandPrefixPadding}wait.until(ExpectedConditions.invisibilityOfElementLocated(By.cssSelector("#blah")));\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `answer on visible prompt` command', () => { const command = { @@ -1027,9 +845,7 @@ describe('command code emitter', () => { target: 'an answer', value: '', } - return expect(prettify(command)).resolves.toBe( - `{\n${commandPrefixPadding}Alert alert = driver.switchTo().alert();\n${commandPrefixPadding}alert.sendKeys("an answer")\n${commandPrefixPadding}alert.accept();\n}` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `choose cancel on visible prompt` command', () => { const command = { @@ -1037,9 +853,7 @@ describe('command code emitter', () => { target: '', value: '', } - return expect(prettify(command)).resolves.toBe( - `driver.switchTo().alert().dismiss();` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `choose ok on visible confirmation` command', () => { const command = { @@ -1047,9 +861,7 @@ describe('command code emitter', () => { target: '', value: '', } - return expect(prettify(command)).resolves.toBe( - `driver.switchTo().alert().accept();` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `while` command', () => { const command = { @@ -1057,10 +869,9 @@ describe('command code emitter', () => { target: 'true', value: '', } - return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: `while ((Boolean) js.executeScript("return (true)")) {`, - endingLevel: 1, - }) + return expect( + prettify(command, { fullPayload: true }) + ).resolves.toMatchSnapshot() }) it('should emit new window handling, if command opens a new window', () => { const command = { @@ -1071,8 +882,6 @@ describe('command code emitter', () => { windowHandleName: 'newWin', windowTimeout: 2000, } - return expect(prettify(command)).resolves.toBe( - `vars.put("window_handles", driver.getWindowHandles());\ndriver.findElement(By.cssSelector("button")).click();\nvars.put("newWin", waitForWindow(2000));` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) }) diff --git a/packages/code-export-python-pytest/__test__/src/__snapshots__/command.spec.js.snap b/packages/code-export-python-pytest/__test__/src/__snapshots__/command.spec.js.snap new file mode 100644 index 0000000000..d1e90e4f6b --- /dev/null +++ b/packages/code-export-python-pytest/__test__/src/__snapshots__/command.spec.js.snap @@ -0,0 +1,382 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`command code emitter should emit 'assert selected label' command 1`] = ` +"element = self.driver.find_element(By.ID, \\"test\\") +locator = \\"option[@value='{}']\\".format(element.get_attribute(\\"value\\")) +selected_text = element.find_element(By.XPATH, locator).text +assert selected_text == \\"test\\"" +`; + +exports[`command code emitter should emit 'verify selected label' command 1`] = ` +"element = self.driver.find_element(By.ID, \\"test\\") +locator = \\"option[@value='{}']\\".format(element.get_attribute(\\"value\\")) +selected_text = element.find_element(By.XPATH, locator).text +assert selected_text == \\"test\\"" +`; + +exports[`command code emitter should emit \`add selection\` command 1`] = ` +"dropdown = self.driver.find_element(By.CSS_SELECTOR, \\"select\\") +dropdown.find_element(By.XPATH, \\"//option[. = 'A label']\\").click()" +`; + +exports[`command code emitter should emit \`answer on visible prompt\` command 1`] = ` +"alert = self.driver.switch_to.alert +alert.send_keys(\\"an answer\\") +alert.accept()" +`; + +exports[`command code emitter should emit \`assert alert\` command 1`] = `"assert self.driver.switch_to.alert.text == \\"an alert\\""`; + +exports[`command code emitter should emit \`assert checked\` command 1`] = `"assert self.driver.find_element(By.ID, \\"check\\").is_selected() is True"`; + +exports[`command code emitter should emit \`assert confirmation\` command 1`] = `"assert self.driver.switch_to.alert.text == \\"a confirmation\\""`; + +exports[`command code emitter should emit \`assert editable\` command 1`] = ` +"element = self.driver.find_element(By.ID, \\"text\\") +assert element.is_enabled() is True" +`; + +exports[`command code emitter should emit \`assert element not present\` command 1`] = ` +"elements = self.driver.find_elements(By.ID, \\"element\\") +assert len(elements) == 0" +`; + +exports[`command code emitter should emit \`assert element present\` command 1`] = ` +"elements = self.driver.find_elements(By.ID, \\"element\\") +assert len(elements) > 0" +`; + +exports[`command code emitter should emit \`assert not checked\` command 1`] = `"assert self.driver.find_element(By.ID, \\"check\\").is_selected() is False"`; + +exports[`command code emitter should emit \`assert not editable\` command 1`] = ` +"element = self.driver.find_element(By.ID, \\"text\\") +assert element.is_enabled() is False" +`; + +exports[`command code emitter should emit \`assert not selected value\` command 1`] = ` +"value = self.driver.find_element(By.ID, \\"select\\").get_attribute(\\"value\\") +assert value != \\"test\\"" +`; + +exports[`command code emitter should emit \`assert not text\` command 1`] = ` +"text = self.driver.find_element(By.ID, \\"test\\").text +assert text != \\"text\\"" +`; + +exports[`command code emitter should emit \`assert prompt\` command 1`] = `"assert self.driver.switch_to.alert.text == \\"a prompt\\""`; + +exports[`command code emitter should emit \`assert selected value\` command 1`] = ` +"value = self.driver.find_element(By.ID, \\"select\\").get_attribute(\\"value\\") +assert value == \\"test\\"" +`; + +exports[`command code emitter should emit \`assert text\` command 1`] = `"assert self.driver.find_element(By.ID, \\"test\\").text == \\"some text that should be here\\""`; + +exports[`command code emitter should emit \`assert title\` command 1`] = `"assert self.driver.title == \\"example title\\""`; + +exports[`command code emitter should emit \`assert value\` command 1`] = ` +"value = self.driver.find_element(By.ID, \\"select\\").get_attribute(\\"value\\") +assert value == \\"test\\"" +`; + +exports[`command code emitter should emit \`assert\` command 1`] = `"assert(self.vars[\\"varrrName\\"] == \\"blah\\")"`; + +exports[`command code emitter should emit \`check\` command 1`] = ` +"element = self.driver.find_element(By.ID, \\"f\\") +if element.is_selected() != True: element.click()" +`; + +exports[`command code emitter should emit \`choose cancel on visible prompt\` command 1`] = `"self.driver.switch_to.alert.dismiss()"`; + +exports[`command code emitter should emit \`choose ok on visible confirmation\` command 1`] = `"self.driver.switch_to.alert.accept()"`; + +exports[`command code emitter should emit \`click at\` command 1`] = `"self.driver.find_element(By.LINK_TEXT, \\"button\\").click()"`; + +exports[`command code emitter should emit \`click\` command 1`] = `"self.driver.find_element(By.LINK_TEXT, \\"button\\").click()"`; + +exports[`command code emitter should emit \`close\` command 1`] = `"self.driver.close()"`; + +exports[`command code emitter should emit \`do\` command 1`] = ` +Object { + "body": "condition = True +while condition:", + "endingLevel": 1, +} +`; + +exports[`command code emitter should emit \`double click at\` command 1`] = ` +"element = self.driver.find_element(By.LINK_TEXT, \\"button\\") +actions = ActionChains(driver) +actions.double_click(element).perform()" +`; + +exports[`command code emitter should emit \`double click\` command 1`] = ` +"element = self.driver.find_element(By.LINK_TEXT, \\"button\\") +actions = ActionChains(driver) +actions.double_click(element).perform()" +`; + +exports[`command code emitter should emit \`drag and drop to object\` command 1`] = ` +"dragged = self.driver.find_element(By.LINK_TEXT, \\"dragged\\") +dropped = self.driver.find_element(By.LINK_TEXT, \\"dropped\\") +actions = ActionChains(driver) +actions.drag_and_drop(dragged, dropped).perform()" +`; + +exports[`command code emitter should emit \`echo\` command 1`] = `"print(str(\\"blah\\"))"`; + +exports[`command code emitter should emit \`echo\` command with variables 1`] = `"print(str(self.vars[\\"blah\\"]))"`; + +exports[`command code emitter should emit \`edit content\` command 1`] = ` +"element = self.driver.find_element(By.ID, \\"contentEditable\\") +self.driver.execute_script(\\"if(arguments[0].contentEditable === 'true') {arguments[0].innerText = ''}\\", element)" +`; + +exports[`command code emitter should emit \`else if\` command 1`] = ` +Object { + "body": "elif self.driver.execute_script(\\"return (true)\\"):", + "endingLevel": 1, +} +`; + +exports[`command code emitter should emit \`else\` command 1`] = ` +Object { + "body": "else:", + "endingLevel": 1, +} +`; + +exports[`command code emitter should emit \`end\` command 1`] = ` +Object { + "endingLevel": 0, + "skipEmitting": true, +} +`; + +exports[`command code emitter should emit \`execute async script\` command 1`] = `"self.vars[\\"myVar\\"] = self.driver.execute_async_script(\\"var callback = arguments[arguments.length - 1];javascript.then(callback).catch(callback);\\")"`; + +exports[`command code emitter should emit \`execute script\` command 1`] = `"self.vars[\\"myVar\\"] = self.driver.execute_script(\\"javascript\\")"`; + +exports[`command code emitter should emit \`execute script\` command with return string value 1`] = `"self.vars[\\"myVar\\"] = self.driver.execute_script(\\"return 'a'\\")"`; + +exports[`command code emitter should emit \`forEach\` command 1`] = ` +Object { + "body": "collection = self.vars[\\"collection\\"] +for entry in collection: + self.vars[\\"iteratorVar\\"] = entry", + "endingLevel": 1, +} +`; + +exports[`command code emitter should emit \`if\` command 1`] = ` +Object { + "body": "if self.driver.execute_script(\\"return (true)\\"):", + "endingLevel": 1, +} +`; + +exports[`command code emitter should emit \`mouse down at\` event 1`] = ` +"element = self.driver.find_element(By.ID, \\"button\\") +actions = ActionChains(driver) +actions.move_to_element(element).click_and_hold().perform()" +`; + +exports[`command code emitter should emit \`mouse down\` command 1`] = ` +"element = self.driver.find_element(By.ID, \\"button\\") +actions = ActionChains(driver) +actions.move_to_element(element).click_and_hold().perform()" +`; + +exports[`command code emitter should emit \`mouse move at\` event 1`] = ` +"element = self.driver.find_element(By.ID, \\"button\\") +actions = ActionChains(driver) +actions.move_to_element(element).perform()" +`; + +exports[`command code emitter should emit \`mouse move\` event 1`] = ` +"element = self.driver.find_element(By.ID, \\"button\\") +actions = ActionChains(driver) +actions.move_to_element(element).perform()" +`; + +exports[`command code emitter should emit \`mouse out\` event 1`] = ` +"element = self.driver.find_element(By.CSS_SELECTOR, \\"body\\") +actions = ActionChains(driver) +actions.move_to_element(element, 0, 0).perform()" +`; + +exports[`command code emitter should emit \`mouse over\` event 1`] = ` +"element = self.driver.find_element(By.ID, \\"button\\") +actions = ActionChains(driver) +actions.move_to_element(element).perform()" +`; + +exports[`command code emitter should emit \`mouse up at\` event 1`] = ` +"element = self.driver.find_element(By.ID, \\"button\\") +actions = ActionChains(driver) +actions.move_to_element(element).release().perform()" +`; + +exports[`command code emitter should emit \`mouse up\` event 1`] = ` +"element = self.driver.find_element(By.ID, \\"button\\") +actions = ActionChains(driver) +actions.move_to_element(element).release().perform()" +`; + +exports[`command code emitter should emit \`open\` with absolute url 1`] = `"self.driver.get(\\"https://www.seleniumhq.org/\\")"`; + +exports[`command code emitter should emit \`pause\` command 1`] = `"time.sleep(300)"`; + +exports[`command code emitter should emit \`remove selection\` command 1`] = ` +"dropdown = self.driver.find_element(By.CSS_SELECTOR, \\"select\\") +dropdown.find_element(By.XPATH, \\"//option[. = 'A label']\\").click()" +`; + +exports[`command code emitter should emit \`repeatIf\` command 1`] = `"condition = self.driver.execute_script(\\"return (true)\\")"`; + +exports[`command code emitter should emit \`run script\` command 1`] = `"self.driver.execute_script(\\"alert('test');alert('Im annoying');\\")"`; + +exports[`command code emitter should emit \`run\` command 1`] = `"self.sometestcase()"`; + +exports[`command code emitter should emit \`select frame\` to select the top frame 1`] = `"self.driver.switch_to.default_content()"`; + +exports[`command code emitter should emit \`select window\` to select a window by handle 1`] = `"self.driver.switch_to.window(self.vars[\\"window\\"])"`; + +exports[`command code emitter should emit \`select window\` to select a window by implicit index 1`] = `"self.driver.switch_to.window(self.driver.window_handles[12])"`; + +exports[`command code emitter should emit \`select window\` to select a window by name 1`] = `"self.driver.switch_to.window(\\"window\\")"`; + +exports[`command code emitter should emit \`select window\` to select a window by the local keyword 1`] = `"self.driver.switch_to.window(self.driver.window_handles[0])"`; + +exports[`command code emitter should emit \`select\` command 1`] = ` +"dropdown = self.driver.find_element(By.CSS_SELECTOR, \\"select\\") +dropdown.find_element(By.XPATH, \\"//option[. = 'A label']\\").click()" +`; + +exports[`command code emitter should emit \`send keys\` command 1`] = `"self.driver.find_element(By.ID, \\"input\\").send_keys(\\"example input\\")"`; + +exports[`command code emitter should emit \`send keys\` command with a key press 1`] = `"self.driver.find_element(By.ID, \\"input\\").send_keys(\\"SuperSecretPassword!\\", Keys.ENTER)"`; + +exports[`command code emitter should emit \`send keys\` command with a variable input 1`] = `"self.driver.find_element(By.ID, \\"input\\").send_keys(self.vars[\\"blah\\"])"`; + +exports[`command code emitter should emit \`set speed\` 1`] = `"print(\\"\`set speed\` is a no-op in code export, use \`pause\` instead\\")"`; + +exports[`command code emitter should emit \`setWindowSize\` 1`] = `"self.driver.set_window_size(1440, 1177)"`; + +exports[`command code emitter should emit \`store attribute\` command 1`] = ` +"attribute = self.driver.find_element(By.XPATH, \\"button[3]\\").get_attribute(\\"id\\") +self.vars[\\"myVar\\"] = attribute" +`; + +exports[`command code emitter should emit \`store json\` command 1`] = `"self.vars[\\"myVar\\"] = json.loads('[{\\"a\\":0}]')"`; + +exports[`command code emitter should emit \`store text\` command 1`] = `"self.vars[\\"myVar\\"] = self.driver.find_element(By.ID, \\"someElement\\").text"`; + +exports[`command code emitter should emit \`store title\` command 1`] = `"self.vars[\\"myVar\\"] = self.driver.title"`; + +exports[`command code emitter should emit \`store value\` command 1`] = `"self.vars[\\"myVar\\"] = self.driver.find_element(By.ID, \\"someElement\\").get_attribute(\\"value\\")"`; + +exports[`command code emitter should emit \`store window handle\` command 1`] = `"self.vars[\\"windowName\\"] = self.driver.current_window_handle"`; + +exports[`command code emitter should emit \`store xpath count\` command 1`] = `"self.vars[\\"myVar\\"] = len(self.driver.find_elements(By.XPATH, \\"button\\"))"`; + +exports[`command code emitter should emit \`store\` command 1`] = `"self.vars[\\"myVar\\"] = \\"some value\\""`; + +exports[`command code emitter should emit \`submit\` command 1`] = `"raise Exception(\\"\`submit\` is not a supported command in Selenium Webself.driver. Please re-record the step in the IDE.\\")"`; + +exports[`command code emitter should emit \`times\` command 1`] = ` +Object { + "body": "for i in range(0, 5):", + "endingLevel": 1, +} +`; + +exports[`command code emitter should emit \`type\` command 1`] = `"self.driver.find_element(By.ID, \\"input\\").send_keys(\\"example input\\")"`; + +exports[`command code emitter should emit \`uncheck\` command 1`] = ` +"element = self.driver.find_element(By.ID, \\"f\\") +if element.is_selected: element.click()" +`; + +exports[`command code emitter should emit \`verify checked\` command 1`] = `"assert self.driver.find_element(By.ID, \\"check\\").is_selected() is True"`; + +exports[`command code emitter should emit \`verify editable\` command 1`] = ` +"element = self.driver.find_element(By.ID, \\"text\\") +assert element.is_enabled() is True" +`; + +exports[`command code emitter should emit \`verify element not present\` command 1`] = ` +"elements = self.driver.find_elements(By.ID, \\"element\\") +assert len(elements) == 0" +`; + +exports[`command code emitter should emit \`verify element present\` command 1`] = ` +"elements = self.driver.find_elements(By.ID, \\"element\\") +assert len(elements) > 0" +`; + +exports[`command code emitter should emit \`verify not checked\` command 1`] = `"assert self.driver.find_element(By.ID, \\"check\\").is_selected() is False"`; + +exports[`command code emitter should emit \`verify not editable\` command 1`] = ` +"element = self.driver.find_element(By.ID, \\"text\\") +assert element.is_enabled() is False" +`; + +exports[`command code emitter should emit \`verify not selected value\` command 1`] = ` +"value = self.driver.find_element(By.ID, \\"select\\").get_attribute(\\"value\\") +assert value != \\"test\\"" +`; + +exports[`command code emitter should emit \`verify not text\` command 1`] = ` +"text = self.driver.find_element(By.ID, \\"test\\").text +assert text != \\"text\\"" +`; + +exports[`command code emitter should emit \`verify selected value\` command 1`] = ` +"value = self.driver.find_element(By.ID, \\"select\\").get_attribute(\\"value\\") +assert value == \\"test\\"" +`; + +exports[`command code emitter should emit \`verify text\` command 1`] = `"assert self.driver.find_element(By.ID, \\"test\\").text == \\"some text that should be here\\""`; + +exports[`command code emitter should emit \`verify title\` command 1`] = `"assert self.driver.title == \\"example title\\""`; + +exports[`command code emitter should emit \`verify value\` command 1`] = ` +"value = self.driver.find_element(By.ID, \\"select\\").get_attribute(\\"value\\") +assert value == \\"test\\"" +`; + +exports[`command code emitter should emit \`verify\` command 1`] = `"assert(self.vars[\\"varrrName\\"] == \\"blah\\")"`; + +exports[`command code emitter should emit \`waitForElementEditable\` command 1`] = `"WebDriverWait(self.driver, 5000).until(expected_conditions.element_to_be_clickable((By.CSS_SELECTOR, \\"#blah\\")))"`; + +exports[`command code emitter should emit \`waitForElementNotEditable\` command 1`] = `"WebDriverWait(self.driver, 5000).until_not(expected_conditions.element_to_be_clickable((By.CSS_SELECTOR, \\"#blah\\")))"`; + +exports[`command code emitter should emit \`waitForElementNotPresent\` command 1`] = `"WebDriverWait(self.driver, 5000).until(expected_conditions.invisibility_of_element_located((By.CSS_SELECTOR, \\"#blah\\")))"`; + +exports[`command code emitter should emit \`waitForElementNotVisible\` command 1`] = `"WebDriverWait(self.driver, 5000).until(expected_conditions.invisibility_of_element_located((By.CSS_SELECTOR, \\"#blah\\")))"`; + +exports[`command code emitter should emit \`waitForElementPresent\` command 1`] = `"WebDriverWait(self.driver, 5000).until(expected_conditions.presence_of_element_located((By.CSS_SELECTOR, \\"#blah\\")))"`; + +exports[`command code emitter should emit \`waitForElementVisible\` command 1`] = `"WebDriverWait(self.driver, 5000).until(expected_conditions.visibility_of_element_located((By.CSS_SELECTOR, \\"#blah\\")))"`; + +exports[`command code emitter should emit \`while\` command 1`] = ` +Object { + "body": "while self.driver.execute_script(\\"return (true)\\"):", + "endingLevel": 1, +} +`; + +exports[`command code emitter should emit new window handling, if command opens a new window 1`] = ` +"self.vars[\\"window_handles\\"] = self.driver.window_handles +self.driver.find_element(By.CSS_SELECTOR, \\"button\\").click() +self.vars[\\"newWin\\"] = self.wait_for_window(2000)" +`; + +exports[`command code emitter should skip playback supported commands, that are not supported in webdriver 1`] = `undefined`; + +exports[`command code emitter should skip playback supported commands, that are not supported in webdriver 2`] = `undefined`; + +exports[`command code emitter should skip playback supported commands, that are not supported in webdriver 3`] = `undefined`; + +exports[`command code emitter should skip playback supported commands, that are not supported in webdriver 4`] = `undefined`; diff --git a/packages/code-export-python-pytest/__test__/src/command.spec.js b/packages/code-export-python-pytest/__test__/src/command.spec.js index e78ff7cc9b..d8aa32e800 100644 --- a/packages/code-export-python-pytest/__test__/src/command.spec.js +++ b/packages/code-export-python-pytest/__test__/src/command.spec.js @@ -57,9 +57,7 @@ describe('command code emitter', () => { target: 'css=select', value: 'label=A label', } - return expect(prettify(command)).resolves.toBe( - `dropdown = self.driver.find_element(By.CSS_SELECTOR, "select")\ndropdown.find_element(By.XPATH, "//option[. = 'A label']").click()` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert` command', () => { const command = { @@ -67,9 +65,7 @@ describe('command code emitter', () => { target: 'varrrName', value: 'blah', } - expect(prettify(command)).resolves.toBe( - `assert(self.vars["varrrName"] == "blah")` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert alert` command', () => { const command = { @@ -77,9 +73,7 @@ describe('command code emitter', () => { target: 'an alert', value: '', } - return expect(prettify(command)).resolves.toBe( - `assert self.driver.switch_to.alert.text == "an alert"` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert checked` command', () => { const command = { @@ -87,9 +81,7 @@ describe('command code emitter', () => { target: 'id=check', value: '', } - return expect(prettify(command)).resolves.toBe( - `assert self.driver.find_element(By.ID, "check").is_selected() is True` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert confirmation` command', () => { const command = { @@ -97,9 +89,7 @@ describe('command code emitter', () => { target: 'a confirmation', value: '', } - return expect(prettify(command)).resolves.toBe( - `assert self.driver.switch_to.alert.text == "a confirmation"` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert editable` command', () => { const command = { @@ -107,9 +97,7 @@ describe('command code emitter', () => { target: 'id=text', value: '', } - return expect(prettify(command)).resolves.toBe( - `element = self.driver.find_element(By.ID, "text")\nassert element.is_enabled() is True` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert element present` command', () => { const command = { @@ -117,9 +105,7 @@ describe('command code emitter', () => { target: 'id=element', value: '', } - return expect(prettify(command)).resolves.toBe( - `elements = self.driver.find_elements(By.ID, "element")\nassert len(elements) > 0` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert element not present` command', () => { const command = { @@ -127,9 +113,7 @@ describe('command code emitter', () => { target: 'id=element', value: '', } - return expect(prettify(command)).resolves.toBe( - `elements = self.driver.find_elements(By.ID, "element")\nassert len(elements) == 0` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert not checked` command', () => { const command = { @@ -137,9 +121,7 @@ describe('command code emitter', () => { target: 'id=check', value: '', } - return expect(prettify(command)).resolves.toBe( - `assert self.driver.find_element(By.ID, "check").is_selected() is False` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert not editable` command', () => { const command = { @@ -147,9 +129,7 @@ describe('command code emitter', () => { target: 'id=text', value: '', } - return expect(prettify(command)).resolves.toBe( - `element = self.driver.find_element(By.ID, "text")\nassert element.is_enabled() is False` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert not selected value` command', () => { const command = { @@ -157,9 +137,7 @@ describe('command code emitter', () => { target: 'id=select', value: 'test', } - return expect(prettify(command)).resolves.toBe( - `value = self.driver.find_element(By.ID, "select").get_attribute("value")\nassert value != "test"` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert not text` command', () => { const command = { @@ -167,9 +145,7 @@ describe('command code emitter', () => { target: 'id=test', value: 'text', } - return expect(prettify(command)).resolves.toBe( - `text = self.driver.find_element(By.ID, "test").text\nassert text != "text"` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert prompt` command', () => { const command = { @@ -177,9 +153,7 @@ describe('command code emitter', () => { target: 'a prompt', value: '', } - return expect(prettify(command)).resolves.toBe( - `assert self.driver.switch_to.alert.text == "a prompt"` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it("should emit 'assert selected label' command", () => { const command = { @@ -187,9 +161,7 @@ describe('command code emitter', () => { target: 'id=test', value: 'test', } - return expect(prettify(command)).resolves.toBe( - `element = self.driver.find_element(By.ID, "test")\nlocator = "option[@value='{}']".format(element.get_attribute("value"))\nselected_text = element.find_element(By.XPATH, locator).text\nassert selected_text == "test"` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert selected value` command', () => { const command = { @@ -197,9 +169,7 @@ describe('command code emitter', () => { target: 'id=select', value: 'test', } - return expect(prettify(command)).resolves.toBe( - `value = self.driver.find_element(By.ID, "select").get_attribute("value")\nassert value == "test"` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert text` command', () => { const command = { @@ -207,9 +177,7 @@ describe('command code emitter', () => { target: 'id=test', value: 'some text that should be here', } - expect(prettify(command)).resolves.toBe( - `assert self.driver.find_element(By.ID, "test").text == "some text that should be here"` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert title` command', () => { const command = { @@ -217,9 +185,7 @@ describe('command code emitter', () => { target: 'example title', value: '', } - return expect(prettify(command)).resolves.toBe( - `assert self.driver.title == "example title"` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `assert value` command', () => { const command = { @@ -227,9 +193,7 @@ describe('command code emitter', () => { target: 'id=select', value: 'test', } - return expect(prettify(command)).resolves.toBe( - `value = self.driver.find_element(By.ID, "select").get_attribute("value")\nassert value == "test"` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `click` command', () => { const command = { @@ -237,9 +201,7 @@ describe('command code emitter', () => { target: 'link=button', value: '', } - return expect(prettify(command)).resolves.toBe( - `self.driver.find_element(By.LINK_TEXT, "button").click()` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `click at` command', () => { const command = { @@ -247,9 +209,7 @@ describe('command code emitter', () => { target: 'link=button', value: '', } - return expect(prettify(command)).resolves.toBe( - `self.driver.find_element(By.LINK_TEXT, "button").click()` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `check` command', () => { const command = { @@ -257,9 +217,7 @@ describe('command code emitter', () => { target: 'id=f', value: '', } - return expect(prettify(command)).resolves.toBe( - `element = self.driver.find_element(By.ID, "f")\nif element.is_selected() != True: element.click()` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `close` command', () => { const command = { @@ -267,7 +225,7 @@ describe('command code emitter', () => { target: '', value: '', } - return expect(prettify(command)).resolves.toBe(`self.driver.close()`) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `do` command', () => { const command = { @@ -275,10 +233,9 @@ describe('command code emitter', () => { target: '', value: '', } - return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: 'condition = True\nwhile condition:', - endingLevel: 1, - }) + return expect( + prettify(command, { fullPayload: true }) + ).resolves.toMatchSnapshot() }) it('should emit `double click` command', () => { const command = { @@ -286,9 +243,7 @@ describe('command code emitter', () => { target: 'link=button', value: '', } - return expect(prettify(command)).resolves.toBe( - `element = self.driver.find_element(By.LINK_TEXT, "button")\nactions = ActionChains(driver)\nactions.double_click(element).perform()` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `double click at` command', () => { const command = { @@ -296,9 +251,7 @@ describe('command code emitter', () => { target: 'link=button', value: '', } - return expect(prettify(command)).resolves.toBe( - `element = self.driver.find_element(By.LINK_TEXT, "button")\nactions = ActionChains(driver)\nactions.double_click(element).perform()` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `drag and drop to object` command', () => { const command = { @@ -306,9 +259,7 @@ describe('command code emitter', () => { target: 'link=dragged', value: 'link=dropped', } - return expect(prettify(command)).resolves.toBe( - `dragged = self.driver.find_element(By.LINK_TEXT, "dragged")\ndropped = self.driver.find_element(By.LINK_TEXT, "dropped")\nactions = ActionChains(driver)\nactions.drag_and_drop(dragged, dropped).perform()` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `echo` command', () => { const command = { @@ -316,7 +267,7 @@ describe('command code emitter', () => { target: 'blah', value: '', } - return expect(prettify(command)).resolves.toBe(`print(str("blah"))`) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `echo` command with variables', () => { const command = { @@ -324,9 +275,7 @@ describe('command code emitter', () => { target: '${blah}', value: '', } - return expect(prettify(command)).resolves.toBe( - `print(str(self.vars["blah"]))` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `edit content` command', () => { const command = { @@ -334,9 +283,7 @@ describe('command code emitter', () => { target: 'id=contentEditable', value: '', } - return expect(prettify(command)).resolves.toBe( - `element = self.driver.find_element(By.ID, "contentEditable")\nself.driver.execute_script("if(arguments[0].contentEditable === 'true') {arguments[0].innerText = ''}", element)` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `else` command', () => { const command = { @@ -344,10 +291,9 @@ describe('command code emitter', () => { target: 'true', value: '', } - return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: `else:`, - endingLevel: 1, - }) + return expect( + prettify(command, { fullPayload: true }) + ).resolves.toMatchSnapshot() }) it('should emit `else if` command', () => { const command = { @@ -355,10 +301,9 @@ describe('command code emitter', () => { target: 'true', value: '', } - return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: `elif self.driver.execute_script("return (true)"):`, - endingLevel: 1, - }) + return expect( + prettify(command, { fullPayload: true }) + ).resolves.toMatchSnapshot() }) it('should emit `end` command', async () => { const command = { @@ -366,10 +311,9 @@ describe('command code emitter', () => { target: '', value: '', } - return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - endingLevel: 0, - skipEmitting: true, - }) + return expect( + prettify(command, { fullPayload: true }) + ).resolves.toMatchSnapshot() }) it('should emit `execute script` command', () => { const command = { @@ -377,9 +321,7 @@ describe('command code emitter', () => { target: 'javascript', value: 'myVar', } - return expect(prettify(command)).resolves.toBe( - `self.vars["myVar"] = self.driver.execute_script("javascript")` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `execute script` command with return string value', () => { const command = { @@ -387,9 +329,7 @@ describe('command code emitter', () => { target: 'return "a"', value: 'myVar', } - return expect(prettify(command)).resolves.toBe( - `self.vars["myVar"] = self.driver.execute_script("return 'a'")` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `execute async script` command', () => { const command = { @@ -397,9 +337,7 @@ describe('command code emitter', () => { target: 'javascript', value: 'myVar', } - return expect(prettify(command)).resolves.toBe( - `self.vars["myVar"] = self.driver.execute_async_script("var callback = arguments[arguments.length - 1];javascript.then(callback).catch(callback);")` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `forEach` command', () => { const command = { @@ -407,10 +345,9 @@ describe('command code emitter', () => { target: 'collection', value: 'iteratorVar', } - return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: `collection = self.vars["collection"]\nfor entry in collection:\n${commandPrefixPadding}self.vars["iteratorVar"] = entry`, - endingLevel: 1, - }) + return expect( + prettify(command, { fullPayload: true }) + ).resolves.toMatchSnapshot() }) it('should emit `if` command', () => { const command = { @@ -418,10 +355,9 @@ describe('command code emitter', () => { target: 'true', value: '', } - return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: `if self.driver.execute_script("return (true)"):`, - endingLevel: 1, - }) + return expect( + prettify(command, { fullPayload: true }) + ).resolves.toMatchSnapshot() }) it('should emit `mouse down` command', () => { const command = { @@ -429,9 +365,7 @@ describe('command code emitter', () => { target: 'id=button', value: '', } - return expect(prettify(command)).resolves.toBe( - `element = self.driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).click_and_hold().perform()` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `mouse down at` event', () => { const command = { @@ -439,9 +373,7 @@ describe('command code emitter', () => { target: 'id=button', value: '', } - return expect(prettify(command)).resolves.toBe( - `element = self.driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).click_and_hold().perform()` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `mouse move` event', () => { const command = { @@ -449,9 +381,7 @@ describe('command code emitter', () => { target: 'id=button', value: '', } - return expect(prettify(command)).resolves.toBe( - `element = self.driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).perform()` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `mouse move at` event', () => { const command = { @@ -459,9 +389,7 @@ describe('command code emitter', () => { target: 'id=button', value: '', } - return expect(prettify(command)).resolves.toBe( - `element = self.driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).perform()` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `mouse out` event', () => { const command = { @@ -469,9 +397,7 @@ describe('command code emitter', () => { target: 'id=button', value: '', } - return expect(prettify(command)).resolves.toBe( - `element = self.driver.find_element(By.CSS_SELECTOR, "body")\nactions = ActionChains(driver)\nactions.move_to_element(element, 0, 0).perform()` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `mouse over` event', () => { const command = { @@ -479,9 +405,7 @@ describe('command code emitter', () => { target: 'id=button', value: '', } - return expect(prettify(command)).resolves.toBe( - `element = self.driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).perform()` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `mouse up` event', () => { const command = { @@ -489,9 +413,7 @@ describe('command code emitter', () => { target: 'id=button', value: '', } - return expect(prettify(command)).resolves.toBe( - `element = self.driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).release().perform()` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `mouse up at` event', () => { const command = { @@ -499,9 +421,7 @@ describe('command code emitter', () => { target: 'id=button', value: '', } - return expect(prettify(command)).resolves.toBe( - `element = self.driver.find_element(By.ID, "button")\nactions = ActionChains(driver)\nactions.move_to_element(element).release().perform()` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `open` with absolute url', () => { const command = { @@ -509,9 +429,7 @@ describe('command code emitter', () => { target: 'https://www.seleniumhq.org/', value: '', } - return expect(prettify(command)).resolves.toBe( - `self.driver.get("${command.target}")` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `pause` command', () => { const command = { @@ -519,7 +437,7 @@ describe('command code emitter', () => { target: '300', value: '', } - return expect(prettify(command)).resolves.toBe(`time.sleep(300)`) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `remove selection` command', () => { const command = { @@ -527,9 +445,7 @@ describe('command code emitter', () => { target: 'css=select', value: 'label=A label', } - return expect(prettify(command)).resolves.toBe( - `dropdown = self.driver.find_element(By.CSS_SELECTOR, "select")\ndropdown.find_element(By.XPATH, "//option[. = 'A label']").click()` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `repeatIf` command', () => { const command = { @@ -537,9 +453,7 @@ describe('command code emitter', () => { target: 'true', value: '', } - return expect(prettify(command)).resolves.toBe( - `condition = self.driver.execute_script("return (true)")` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `run` command', () => { const command = { @@ -547,7 +461,7 @@ describe('command code emitter', () => { target: 'some test case', value: '', } - return expect(prettify(command)).resolves.toBe(`self.sometestcase()`) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `run script` command', () => { const command = { @@ -555,9 +469,7 @@ describe('command code emitter', () => { target: "alert('test');alert('Im annoying');", value: '', } - return expect(prettify(command)).resolves.toBe( - `self.driver.execute_script("alert('test');alert('Im annoying');")` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `select` command', () => { const command = { @@ -565,9 +477,7 @@ describe('command code emitter', () => { target: 'css=select', value: 'label=A label', } - return expect(prettify(command)).resolves.toBe( - `dropdown = self.driver.find_element(By.CSS_SELECTOR, "select")\ndropdown.find_element(By.XPATH, "//option[. = 'A label']").click()` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `select frame` to select the top frame', () => { const command = { @@ -575,9 +485,7 @@ describe('command code emitter', () => { target: 'relative=top', value: '', } - return expect(prettify(command)).resolves.toBe( - `self.driver.switch_to.default_content()` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should fail to emit `select window` by using unknown locator', () => { const command = { @@ -595,9 +503,7 @@ describe('command code emitter', () => { target: 'handle=${window}', value: '', } - return expect(prettify(command)).resolves.toBe( - `self.driver.switch_to.window(self.vars["window"])` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `select window` to select a window by name', () => { const command = { @@ -605,9 +511,7 @@ describe('command code emitter', () => { target: 'name=window', value: '', } - return expect(prettify(command)).resolves.toBe( - `self.driver.switch_to.window("window")` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `select window` to select a window by the local keyword', () => { const command = { @@ -615,9 +519,7 @@ describe('command code emitter', () => { target: 'win_ser_local', value: '', } - return expect(prettify(command)).resolves.toBe( - `self.driver.switch_to.window(self.driver.window_handles[0])` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `select window` to select a window by implicit index', () => { const command = { @@ -625,9 +527,7 @@ describe('command code emitter', () => { target: 'win_ser_12', value: '', } - return expect(prettify(command)).resolves.toBe( - `self.driver.switch_to.window(self.driver.window_handles[12])` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `send keys` command', () => { const command = { @@ -635,9 +535,7 @@ describe('command code emitter', () => { target: 'id=input', value: 'example input', } - return expect(prettify(command)).resolves.toBe( - `self.driver.find_element(By.ID, "input").send_keys("example input")` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `send keys` command with a variable input', () => { const command = { @@ -645,9 +543,7 @@ describe('command code emitter', () => { target: 'id=input', value: '${blah}', } - return expect(prettify(command)).resolves.toBe( - `self.driver.find_element(By.ID, "input").send_keys(self.vars["blah"])` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `send keys` command with a key press', () => { const command = { @@ -655,14 +551,11 @@ describe('command code emitter', () => { target: 'id=input', value: 'SuperSecretPassword!${KEY_ENTER}', } - return expect(prettify(command)).resolves.toBe( - `self.driver.find_element(By.ID, "input").send_keys("SuperSecretPassword!", Keys.ENTER)` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `set speed`', () => { - expect(prettify({ command: 'setSpeed' })).resolves.toBe( - 'print("`set speed` is a no-op in code export, use `pause` instead")' - ) + const command = { command: 'setSpeed' } + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `setWindowSize`', () => { const command = { @@ -670,24 +563,22 @@ describe('command code emitter', () => { target: '1440x1177', value: '', } - expect(prettify(command)).resolves.toBe( - `self.driver.set_window_size(1440, 1177)` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should skip playback supported commands, that are not supported in webdriver', () => { return Promise.all([ - expect(prettify({ command: 'answerOnNextPrompt' })).resolves.toBe( - undefined - ), + expect( + prettify({ command: 'answerOnNextPrompt' }) + ).resolves.toMatchSnapshot(), expect( prettify({ command: 'chooseCancelOnNextConfirmation' }) - ).resolves.toBe(undefined), - expect(prettify({ command: 'chooseCancelOnNextPrompt' })).resolves.toBe( - undefined - ), - expect(prettify({ command: 'chooseOkOnNextConfirmation' })).resolves.toBe( - undefined - ), + ).resolves.toMatchSnapshot(), + expect( + prettify({ command: 'chooseCancelOnNextPrompt' }) + ).resolves.toMatchSnapshot(), + expect( + prettify({ command: 'chooseOkOnNextConfirmation' }) + ).resolves.toMatchSnapshot(), ]) }) it('should emit `store` command', () => { @@ -696,9 +587,7 @@ describe('command code emitter', () => { target: 'some value', value: 'myVar', } - return expect(prettify(command)).resolves.toBe( - `self.vars["myVar"] = "some value"` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `store attribute` command', () => { const command = { @@ -706,9 +595,7 @@ describe('command code emitter', () => { target: 'xpath=button[3]@id', value: 'myVar', } - return expect(prettify(command)).resolves.toBe( - `attribute = self.driver.find_element(By.XPATH, "button[3]").get_attribute("id")\nself.vars["myVar"] = attribute` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `store text` command', () => { const command = { @@ -716,9 +603,7 @@ describe('command code emitter', () => { target: 'id=someElement', value: 'myVar', } - return expect(prettify(command)).resolves.toBe( - `self.vars["myVar"] = self.driver.find_element(By.ID, "someElement").text` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `store json` command', () => { const command = { @@ -726,9 +611,7 @@ describe('command code emitter', () => { target: '[{"a":0}]', value: 'myVar', } - return expect(prettify(command)).resolves.toBe( - `self.vars["myVar"] = json.loads('[{"a":0}]')` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `store title` command', () => { const command = { @@ -736,9 +619,7 @@ describe('command code emitter', () => { target: '', value: 'myVar', } - return expect(prettify(command)).resolves.toBe( - `self.vars["myVar"] = self.driver.title` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `store value` command', () => { const command = { @@ -746,9 +627,7 @@ describe('command code emitter', () => { target: 'id=someElement', value: 'myVar', } - return expect(prettify(command)).resolves.toBe( - `self.vars["myVar"] = self.driver.find_element(By.ID, "someElement").get_attribute("value")` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `store window handle` command', () => { const command = { @@ -756,9 +635,7 @@ describe('command code emitter', () => { target: 'windowName', value: '', } - return expect(prettify(command)).resolves.toBe( - `self.vars["windowName"] = self.driver.current_window_handle` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `store xpath count` command', () => { const command = { @@ -766,9 +643,7 @@ describe('command code emitter', () => { target: 'xpath=button', value: 'myVar', } - return expect(prettify(command)).resolves.toBe( - `self.vars["myVar"] = len(self.driver.find_elements(By.XPATH, "button"))` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `submit` command', () => { const command = { @@ -776,9 +651,7 @@ describe('command code emitter', () => { target: 'id=form', value: '', } - return expect(prettify(command)).resolves.toBe( - `raise Exception("\`submit\` is not a supported command in Selenium Webself.driver. Please re-record the step in the IDE.")` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `times` command', () => { const command = { @@ -786,10 +659,9 @@ describe('command code emitter', () => { target: '5', value: '', } - return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: `for i in range(0, 5):`, - endingLevel: 1, - }) + return expect( + prettify(command, { fullPayload: true }) + ).resolves.toMatchSnapshot() }) it('should emit `type` command', () => { const command = { @@ -797,9 +669,7 @@ describe('command code emitter', () => { target: 'id=input', value: 'example input', } - expect(prettify(command)).resolves.toBe( - `self.driver.find_element(By.ID, "input").send_keys("example input")` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `uncheck` command', () => { const command = { @@ -807,9 +677,7 @@ describe('command code emitter', () => { target: 'id=f', value: '', } - return expect(prettify(command)).resolves.toBe( - `element = self.driver.find_element(By.ID, "f")\nif element.is_selected: element.click()` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `verify` command', () => { const command = { @@ -817,9 +685,7 @@ describe('command code emitter', () => { target: 'varrrName', value: 'blah', } - expect(prettify(command)).resolves.toBe( - `assert(self.vars["varrrName"] == "blah")` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `verify checked` command', () => { const command = { @@ -827,9 +693,7 @@ describe('command code emitter', () => { target: 'id=check', value: '', } - return expect(prettify(command)).resolves.toBe( - `assert self.driver.find_element(By.ID, "check").is_selected() is True` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `verify editable` command', () => { const command = { @@ -837,9 +701,7 @@ describe('command code emitter', () => { target: 'id=text', value: '', } - return expect(prettify(command)).resolves.toBe( - `element = self.driver.find_element(By.ID, "text")\nassert element.is_enabled() is True` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `verify element present` command', () => { const command = { @@ -847,9 +709,7 @@ describe('command code emitter', () => { target: 'id=element', value: '', } - return expect(prettify(command)).resolves.toBe( - `elements = self.driver.find_elements(By.ID, "element")\nassert len(elements) > 0` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `verify element not present` command', () => { const command = { @@ -857,9 +717,7 @@ describe('command code emitter', () => { target: 'id=element', value: '', } - return expect(prettify(command)).resolves.toBe( - `elements = self.driver.find_elements(By.ID, "element")\nassert len(elements) == 0` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `verify not checked` command', () => { const command = { @@ -867,9 +725,7 @@ describe('command code emitter', () => { target: 'id=check', value: '', } - return expect(prettify(command)).resolves.toBe( - `assert self.driver.find_element(By.ID, "check").is_selected() is False` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `verify not editable` command', () => { const command = { @@ -877,9 +733,7 @@ describe('command code emitter', () => { target: 'id=text', value: '', } - return expect(prettify(command)).resolves.toBe( - `element = self.driver.find_element(By.ID, "text")\nassert element.is_enabled() is False` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `verify not selected value` command', () => { const command = { @@ -887,9 +741,7 @@ describe('command code emitter', () => { target: 'id=select', value: 'test', } - return expect(prettify(command)).resolves.toBe( - `value = self.driver.find_element(By.ID, "select").get_attribute("value")\nassert value != "test"` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `verify not text` command', () => { const command = { @@ -897,9 +749,7 @@ describe('command code emitter', () => { target: 'id=test', value: 'text', } - return expect(prettify(command)).resolves.toBe( - `text = self.driver.find_element(By.ID, "test").text\nassert text != "text"` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it("should emit 'verify selected label' command", () => { const command = { @@ -907,9 +757,7 @@ describe('command code emitter', () => { target: 'id=test', value: 'test', } - return expect(prettify(command)).resolves.toBe( - `element = self.driver.find_element(By.ID, "test")\nlocator = "option[@value='{}']".format(element.get_attribute("value"))\nselected_text = element.find_element(By.XPATH, locator).text\nassert selected_text == "test"` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `verify value` command', () => { const command = { @@ -917,9 +765,7 @@ describe('command code emitter', () => { target: 'id=select', value: 'test', } - return expect(prettify(command)).resolves.toBe( - `value = self.driver.find_element(By.ID, "select").get_attribute("value")\nassert value == "test"` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `verify selected value` command', () => { const command = { @@ -927,9 +773,7 @@ describe('command code emitter', () => { target: 'id=select', value: 'test', } - return expect(prettify(command)).resolves.toBe( - `value = self.driver.find_element(By.ID, "select").get_attribute("value")\nassert value == "test"` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `verify text` command', () => { const command = { @@ -937,9 +781,7 @@ describe('command code emitter', () => { target: 'id=test', value: 'some text that should be here', } - expect(prettify(command)).resolves.toBe( - `assert self.driver.find_element(By.ID, "test").text == "some text that should be here"` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `verify title` command', () => { const command = { @@ -947,9 +789,7 @@ describe('command code emitter', () => { target: 'example title', value: '', } - return expect(prettify(command)).resolves.toBe( - `assert self.driver.title == "example title"` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `waitForElementEditable` command', () => { const command = { @@ -957,9 +797,7 @@ describe('command code emitter', () => { target: 'css=#blah', value: '5000', } - return expect(prettify(command)).resolves.toBe( - `WebDriverWait(self.driver, 5000).until(expected_conditions.element_to_be_clickable((By.CSS_SELECTOR, "#blah")))` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `waitForElementPresent` command', () => { const command = { @@ -967,9 +805,7 @@ describe('command code emitter', () => { target: 'css=#blah', value: '5000', } - return expect(prettify(command)).resolves.toBe( - `WebDriverWait(self.driver, 5000).until(expected_conditions.presence_of_element_located((By.CSS_SELECTOR, "#blah")))` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `waitForElementVisible` command', () => { const command = { @@ -977,9 +813,7 @@ describe('command code emitter', () => { target: 'css=#blah', value: '5000', } - return expect(prettify(command)).resolves.toBe( - `WebDriverWait(self.driver, 5000).until(expected_conditions.visibility_of_element_located((By.CSS_SELECTOR, "#blah")))` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `waitForElementNotEditable` command', () => { const command = { @@ -987,9 +821,7 @@ describe('command code emitter', () => { target: 'css=#blah', value: '5000', } - return expect(prettify(command)).resolves.toBe( - `WebDriverWait(self.driver, 5000).until_not(expected_conditions.element_to_be_clickable((By.CSS_SELECTOR, "#blah")))` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `waitForElementNotPresent` command', () => { const command = { @@ -997,9 +829,7 @@ describe('command code emitter', () => { target: 'css=#blah', value: '5000', } - return expect(prettify(command)).resolves.toBe( - `WebDriverWait(self.driver, 5000).until(expected_conditions.invisibility_of_element_located((By.CSS_SELECTOR, "#blah")))` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `waitForElementNotVisible` command', () => { const command = { @@ -1007,9 +837,7 @@ describe('command code emitter', () => { target: 'css=#blah', value: '5000', } - return expect(prettify(command)).resolves.toBe( - `WebDriverWait(self.driver, 5000).until(expected_conditions.invisibility_of_element_located((By.CSS_SELECTOR, "#blah")))` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `answer on visible prompt` command', () => { const command = { @@ -1017,9 +845,7 @@ describe('command code emitter', () => { target: 'an answer', value: '', } - return expect(prettify(command)).resolves.toBe( - `alert = self.driver.switch_to.alert\nalert.send_keys("an answer")\nalert.accept()` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `choose cancel on visible prompt` command', () => { const command = { @@ -1027,9 +853,7 @@ describe('command code emitter', () => { target: '', value: '', } - return expect(prettify(command)).resolves.toBe( - `self.driver.switch_to.alert.dismiss()` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `choose ok on visible confirmation` command', () => { const command = { @@ -1037,9 +861,7 @@ describe('command code emitter', () => { target: '', value: '', } - return expect(prettify(command)).resolves.toBe( - `self.driver.switch_to.alert.accept()` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) it('should emit `while` command', () => { const command = { @@ -1047,10 +869,9 @@ describe('command code emitter', () => { target: 'true', value: '', } - return expect(prettify(command, { fullPayload: true })).resolves.toEqual({ - body: `while self.driver.execute_script("return (true)"):`, - endingLevel: 1, - }) + return expect( + prettify(command, { fullPayload: true }) + ).resolves.toMatchSnapshot() }) it('should emit new window handling, if command opens a new window', () => { const command = { @@ -1061,8 +882,6 @@ describe('command code emitter', () => { windowHandleName: 'newWin', windowTimeout: 2000, } - return expect(prettify(command)).resolves.toBe( - `self.vars["window_handles"] = self.driver.window_handles\nself.driver.find_element(By.CSS_SELECTOR, "button").click()\nself.vars["newWin"] = self.wait_for_window(2000)` - ) + return expect(prettify(command)).resolves.toMatchSnapshot() }) }) From 4147b8a3b7f9c5d2ac6c48602a3f58d3f20142ea Mon Sep 17 00:00:00 2001 From: Dave Haeffner Date: Sun, 23 Jun 2019 14:42:34 +0300 Subject: [PATCH 77/99] Update README.md Updated build icon URL for CI --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fc4cb8e8c0..58c662d124 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ logo -# Selenium IDE · [![Build Status](https://travis-ci.org/SeleniumHQ/selenium-ide.svg?branch=master)](https://travis-ci.org/SeleniumHQ/selenium-ide) +# Selenium IDE · [![Build Status](https://travis-ci.com/SeleniumHQ/selenium-ide.svg?branch=master)](https://travis-ci.com/SeleniumHQ/selenium-ide) _[WIP] An integrated development environment for Selenium scripts_ From ef9b1bf936be8acbe2dacf62e39c1f651c42dd59 Mon Sep 17 00:00:00 2001 From: David Haeffner Date: Mon, 24 Jun 2019 10:21:27 +0300 Subject: [PATCH 78/99] Updated to latest of selenium-webdriver --- packages/selenium-side-runner/package.json | 2 +- packages/selenium-side-runner/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/selenium-side-runner/package.json b/packages/selenium-side-runner/package.json index 2fc188783a..d5d3b8ec5f 100644 --- a/packages/selenium-side-runner/package.json +++ b/packages/selenium-side-runner/package.json @@ -37,7 +37,7 @@ "js-beautify": "^1.7.5", "js-yaml": "^3.13.1", "rimraf": "^2.6.2", - "selenium-webdriver": "4.0.0-alpha.3", + "selenium-webdriver": "4.0.0-alpha.4", "selianize": "^3.8.0", "semver": "^5.5.1", "winston": "^2.4.0" diff --git a/packages/selenium-side-runner/yarn.lock b/packages/selenium-side-runner/yarn.lock index 0e83ff32db..401ff89d7d 100644 --- a/packages/selenium-side-runner/yarn.lock +++ b/packages/selenium-side-runner/yarn.lock @@ -5851,10 +5851,10 @@ sax@>=0.6.0, sax@^1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -selenium-webdriver@4.0.0-alpha.3: - version "4.0.0-alpha.3" - resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.0.0-alpha.3.tgz#fb974f29696a6801ecaf203e38a65c3dbe7e363a" - integrity sha512-78a8bbvVtl3asv5JAiBXvK4KQ+GmXBCMO0DU1ZMbdO9EAb+ydPA53CI4ZA+I8muSLSVgNhRAnsndNWZLIQN2LA== +selenium-webdriver@4.0.0-alpha.4: + version "4.0.0-alpha.4" + resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.0.0-alpha.4.tgz#73694490e02c941d9d0bf7a36f7c49beb9372512" + integrity sha512-etJt20d8qInkxMAHIm5SEpPBSS+CdxVcybnxzSIB/GlWErb8pIWrArz/VA6VfUW0/6tIcokepXQ5ufvdzqqk1A== dependencies: jszip "^3.1.5" rimraf "^2.6.3" From a63b5f70fb22ba7c9d53b4dc8b5283dba8ca7dbf Mon Sep 17 00:00:00 2001 From: Dave Haeffner Date: Mon, 24 Jun 2019 10:40:44 +0300 Subject: [PATCH 79/99] Update bug.md Updated node version for the runner in issue template --- .github/ISSUE_TEMPLATE/bug.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug.md b/.github/ISSUE_TEMPLATE/bug.md index 2ed54d7c01..1a85288d7b 100644 --- a/.github/ISSUE_TEMPLATE/bug.md +++ b/.github/ISSUE_TEMPLATE/bug.md @@ -34,7 +34,7 @@ Issues without a reproduction project are likely to stall. OS: Selenium IDE Version: Selenium SIDE Runner Version: Node version: Selenium IDE Version: Selenium SIDE Runner Version: Node version: