From a79b4db06a3f9cc76aa68049dafe2cd2caa564b4 Mon Sep 17 00:00:00 2001 From: tmashuang Date: Tue, 12 Sep 2017 14:14:24 -0700 Subject: [PATCH 1/6] E2E testing with selenium --- package.json | 4 +- test/e2e/func.js | 17 ++++++ test/e2e/metamask.spec.js | 124 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 144 insertions(+), 1 deletion(-) create mode 100644 test/e2e/func.js create mode 100644 test/e2e/metamask.spec.js diff --git a/package.json b/package.json index 12f79ba35..7a1c4b6d2 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "dist": "npm run clear && npm install && gulp dist", "test": "npm run lint && npm run test-unit && npm run test-integration", "test-unit": "METAMASK_ENV=test mocha --require test/helper.js --recursive \"test/unit/**/*.js\"", + "test-e2e": "METAMASK_ENV=test mocha test/e2e/metamask.spec --recursive || true", "single-test": "METAMASK_ENV=test mocha --require test/helper.js", "test-integration": "npm run buildMock && npm run buildCiUnits && karma start", "test-coverage": "nyc npm run test-unit && if [ $COVERALLS_REPO_TOKEN ]; then nyc report --reporter=text-lcov | coveralls; fi", @@ -167,7 +168,7 @@ "gulp-watch": "^4.3.5", "gulp-zip": "^4.0.0", "isomorphic-fetch": "^2.2.1", - "jsdom": "^11.1.0", + "jsdom": "^11.2.0", "jsdom-global": "^3.0.2", "jshint-stylish": "~2.2.1", "json-rpc-engine": "^3.0.1", @@ -190,6 +191,7 @@ "react-addons-test-utils": "^15.5.1", "react-test-renderer": "^15.5.4", "react-testutils-additions": "^15.2.0", + "selenium-webdriver": "^3.5.0", "sinon": "^3.2.0", "tape": "^4.5.1", "testem": "^1.10.3", diff --git a/test/e2e/func.js b/test/e2e/func.js new file mode 100644 index 000000000..50363ade3 --- /dev/null +++ b/test/e2e/func.js @@ -0,0 +1,17 @@ +const webdriver = require('selenium-webdriver') + +exports.delay = function delay (time) { + return new Promise(resolve => setTimeout(resolve, time)) +} + + +exports.buildWebDriver = function buildWebDriver (extPath) { + return new webdriver.Builder() + .withCapabilities({ + chromeOptions: { + args: [`load-extension=${extPath}`], + }, + }) + .forBrowser('chrome') + .build() +} diff --git a/test/e2e/metamask.spec.js b/test/e2e/metamask.spec.js new file mode 100644 index 000000000..fc748fe18 --- /dev/null +++ b/test/e2e/metamask.spec.js @@ -0,0 +1,124 @@ +const path = require('path') +const assert = require('assert') +const webdriver = require('selenium-webdriver') +const By = webdriver.By +const { delay, buildWebDriver } = require('./func') + +describe('Metamask popup page', function () { + let driver + this.seedPhase + this.accountAddress + this.timeout(0) + + before(async function () { + const extPath = path.resolve('dist/chrome') + driver = buildWebDriver(extPath) + await driver.get('chrome://extensions-frame') + const elems = await driver.findElements(By.xpath( + '//*[@id="jepnlelaaflcpibhckpebdcijgfdfleo"]' + )) + const extensionId = await elems[0].getAttribute('id') + await driver.get(`chrome-extension://${extensionId}/popup.html`) + await delay(500) + }) + + after(async function () { + await driver.quit() + }) + + describe('#onboarding', () => { + it('should open Metamask.io', async function () { + const tabs = await driver.getAllWindowHandles() + await driver.switchTo().window(tabs[0]) + await delay(300) + }) + + it('should match title', async () => { + const title = await driver.getTitle() + assert.equal(title, 'MetaMask Plugin', 'title matches MetaMask Plugin') + }) + + it('should show privacy notice', async () => { + const privacy = await driver.findElement(By.className( + 'terms-header' + )).getText() + assert.equal(privacy, 'PRIVACY NOTICE', 'shows privacy notice') + driver.findElement(By.css( + 'button' + )).click() + }) + + it('should show terms of use', async () => { + await delay(300) + const terms = await driver.findElement(By.className( + 'terms-header' + )).getText() + assert.equal(terms, 'TERMS OF USE', 'shows terms of use') + }) + + it('should be unable to continue without scolling throught the terms of use', async () => { + const button = await driver.findElement(By.css( + 'button' + )).isEnabled() + assert.equal(button, false, 'disabled continue button') + const element = driver.findElement(By.linkText( + 'Attributions' + )) + await driver.executeScript('arguments[0].scrollIntoView(true)', element) + }) + + it('should be able to continue when scrolled to the bottom of terms of use', async () => { + const button = await driver.findElement(By.css('button')) + const buttonEnabled = await button.isEnabled() + await delay(500) + assert.equal(buttonEnabled, true, 'enabled continue button') + await button.click() + }) + + it('should accept password with length of eight', async () => { + await delay(300) + const passwordBox = await driver.findElement(By.id('password-box')) + const passwordBoxConfirm = driver.findElement(By.id('password-box-confirm')) + const button = driver.findElement(By.css('button')) + + passwordBox.sendKeys('12345678') + passwordBoxConfirm.sendKeys('12345678') + await delay(300) + await button.click() + }) + + it('should show value was created and seed phrase', async () => { + await delay(700) + this.seedPhase = await driver.findElement(By.className('twelve-word-phrase')).getText() + const continueAfterSeedPhrase = await driver.findElement(By.css('button')) + await continueAfterSeedPhrase.click() + }) + + it('should show lock account', async () => { + await delay(300) + await driver.findElement(By.className('sandwich-expando')).click() + await delay(500) + await driver.findElement(By.xpath('//*[@id="app-content"]/div/div[3]/span/div/li[2]')).click() + }) + + it('should accept account password after lock', async () => { + await delay(500) + await driver.findElement(By.id('password-box')).sendKeys('12345678') + await driver.findElement(By.css('button')).click() + await delay(500) + }) + + it('should show QR code', async () => { + await delay(300) + await driver.findElement(By.className('fa-ellipsis-h')).click() + await driver.findElement(By.xpath('//*[@id="app-content"]/div/div[4]/div/div/div[1]/flex-column/div[1]/div/span/i/div/div/li[2]')).click() + await delay(300) + }) + + it('should show the account address', async () => { + this.accountAddress = await driver.findElement(By.className('ellip-address')).getText() + await driver.findElement(By.className('fa-arrow-left')).click() + await delay(500) + }) + }) +}) From 0db4ba1086f56422752dd4b9e3754a273d23a866 Mon Sep 17 00:00:00 2001 From: Thomas Date: Thu, 18 Jan 2018 08:10:53 -0800 Subject: [PATCH 2/6] chromedriver, changed extension id(might need zip/crx file) --- package.json | 7 ++++--- test/e2e/func.js | 1 + test/e2e/metamask.spec.js | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 29fc4aa5a..c811c6bec 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "mascara": "METAMASK_DEBUG=true node ./mascara/example/server", "dist": "npm run dist:clear && npm install && gulp dist", "dist:clear": "rm -rf node_modules/eth-contract-metadata && rm -rf node_modules/eth-phishing-detect", - "test": "npm run lint && npm run test:coverage && npm run test:integration", + "test": "npm run lint && npm run test:coverage && npm run test:e2e", "test:unit": "METAMASK_ENV=test mocha --exit --compilers js:babel-core/register --require test/helper.js --recursive \"test/unit/**/*.js\"", "test:single": "METAMASK_ENV=test mocha --require test/helper.js", "test:integration": "npm run test:flat && npm run test:mascara", @@ -169,6 +169,7 @@ "brfs": "^1.4.3", "browserify": "^14.4.0", "chai": "^4.1.0", + "chromedriver": "^2.34.1", "coveralls": "^3.0.0", "deep-freeze-strict": "^1.1.1", "del": "^3.0.0", @@ -179,6 +180,7 @@ "eth-json-rpc-middleware": "^1.2.7", "fs-promise": "^2.0.3", "gulp": "github:gulpjs/gulp#4.0", + "gulp-eslint": "^4.0.0", "gulp-if": "^2.0.1", "gulp-json-editor": "^2.2.1", "gulp-livereload": "^3.8.1", @@ -187,7 +189,6 @@ "gulp-util": "^3.0.7", "gulp-watch": "^4.3.5", "gulp-zip": "^4.0.0", - "gulp-eslint": "^4.0.0", "isomorphic-fetch": "^2.2.1", "jsdom": "^11.2.0", "jsdom-global": "^3.0.2", @@ -211,8 +212,8 @@ "react-addons-test-utils": "^15.5.1", "react-test-renderer": "^15.6.2", "react-testutils-additions": "^15.2.0", - "sinon": "^4.0.0", "selenium-webdriver": "^3.5.0", + "sinon": "^4.0.0", "tape": "^4.5.1", "testem": "^1.10.3", "uglifyify": "^4.0.2", diff --git a/test/e2e/func.js b/test/e2e/func.js index 50363ade3..733225565 100644 --- a/test/e2e/func.js +++ b/test/e2e/func.js @@ -1,3 +1,4 @@ +require('chromedriver') const webdriver = require('selenium-webdriver') exports.delay = function delay (time) { diff --git a/test/e2e/metamask.spec.js b/test/e2e/metamask.spec.js index fc748fe18..cf4cd0b52 100644 --- a/test/e2e/metamask.spec.js +++ b/test/e2e/metamask.spec.js @@ -15,7 +15,7 @@ describe('Metamask popup page', function () { driver = buildWebDriver(extPath) await driver.get('chrome://extensions-frame') const elems = await driver.findElements(By.xpath( - '//*[@id="jepnlelaaflcpibhckpebdcijgfdfleo"]' + '//*[@id="fmmjaglpijbgopejlfapbkhhbnaagbpj"]' )) const extensionId = await elems[0].getAttribute('id') await driver.get(`chrome-extension://${extensionId}/popup.html`) From c18f2a17fc86640ff3a91cb14b35a85888612a75 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 9 Mar 2018 23:57:03 -0800 Subject: [PATCH 3/6] Add selenium-webdriver and chromedriver --- package-lock.json | 175 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 175 insertions(+) diff --git a/package-lock.json b/package-lock.json index 55fa5c838..535a0f1eb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2952,6 +2952,19 @@ "readdirp": "2.1.0" } }, + "chromedriver": { + "version": "2.36.0", + "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-2.36.0.tgz", + "integrity": "sha512-Lq2HrigCJ4RVdIdCmchenv1rVrejNSJ7EUCQojycQo12ww3FedQx4nb+GgTdqMhjbOMTqq5+ziaiZlrEN2z1gQ==", + "dev": true, + "requires": { + "del": "3.0.0", + "extract-zip": "1.6.6", + "kew": "0.7.0", + "mkdirp": "0.5.1", + "request": "2.83.0" + } + }, "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", @@ -4912,6 +4925,12 @@ "event-emitter": "0.3.5" } }, + "es6-promise": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", + "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=", + "dev": true + }, "es6-set": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", @@ -6305,6 +6324,35 @@ "is-extglob": "1.0.0" } }, + "extract-zip": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.6.tgz", + "integrity": "sha1-EpDt6NINCHK0Kf0/NRyhKOxe+Fw=", + "dev": true, + "requires": { + "concat-stream": "1.6.0", + "debug": "2.6.9", + "mkdirp": "0.5.0", + "yauzl": "2.4.1" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", + "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + } + } + }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -6413,6 +6461,15 @@ } } }, + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "dev": true, + "requires": { + "pend": "1.2.0" + } + }, "fetch-ponyfill": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz", @@ -11082,6 +11139,47 @@ "array-includes": "3.0.3" } }, + "jszip": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.1.5.tgz", + "integrity": "sha512-5W8NUaFRFRqTOL7ZDDrx5qWHJyBXy6velVudIzQUSoqAAYqzSh2Z7/m0Rf1QbmQJccegD0r+YZxBjzqoBiEeJQ==", + "dev": true, + "requires": { + "core-js": "2.3.0", + "es6-promise": "3.0.2", + "lie": "3.1.1", + "pako": "1.0.6", + "readable-stream": "2.0.6" + }, + "dependencies": { + "core-js": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.3.0.tgz", + "integrity": "sha1-+rg/uwstjchfpjbEudNMdUIMbWU=", + "dev": true + }, + "readable-stream": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "0.10.31", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, "just-debounce": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", @@ -11377,6 +11475,12 @@ "sha3": "1.2.0" } }, + "kew": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", + "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=", + "dev": true + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -11688,6 +11792,23 @@ "integrity": "sha1-9ebgatdLeU+1tbZpiL9yjvHe2+g=", "dev": true }, + "lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", + "dev": true, + "requires": { + "immediate": "3.0.6" + }, + "dependencies": { + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true + } + } + }, "liftoff": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", @@ -16292,6 +16413,12 @@ "sha.js": "2.4.9" } }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, "percentile": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/percentile/-/percentile-1.2.0.tgz", @@ -18243,6 +18370,29 @@ "safe-buffer": "5.1.1" } }, + "selenium-webdriver": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", + "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", + "dev": true, + "requires": { + "jszip": "3.1.5", + "rimraf": "2.6.2", + "tmp": "0.0.30", + "xml2js": "0.4.19" + }, + "dependencies": { + "tmp": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", + "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", + "dev": true, + "requires": { + "os-tmpdir": "1.0.2" + } + } + } + }, "semaphore": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/semaphore/-/semaphore-1.1.0.tgz", @@ -22155,6 +22305,22 @@ "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=", "dev": true }, + "xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "dev": true, + "requires": { + "sax": "1.2.4", + "xmlbuilder": "9.0.7" + } + }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "dev": true + }, "xmldom": { "version": "0.1.27", "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", @@ -22222,6 +22388,15 @@ "camelcase": "3.0.0" } }, + "yauzl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", + "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", + "dev": true, + "requires": { + "fd-slicer": "1.0.1" + } + }, "yazl": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.4.3.tgz", From a62fe4f7eae1c615c15c56109eb40874e811d25f Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 9 Mar 2018 23:57:44 -0800 Subject: [PATCH 4/6] Update selenium tests --- test/e2e/metamask.spec.js | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/test/e2e/metamask.spec.js b/test/e2e/metamask.spec.js index cf4cd0b52..c73ba2b41 100644 --- a/test/e2e/metamask.spec.js +++ b/test/e2e/metamask.spec.js @@ -14,10 +14,8 @@ describe('Metamask popup page', function () { const extPath = path.resolve('dist/chrome') driver = buildWebDriver(extPath) await driver.get('chrome://extensions-frame') - const elems = await driver.findElements(By.xpath( - '//*[@id="fmmjaglpijbgopejlfapbkhhbnaagbpj"]' - )) - const extensionId = await elems[0].getAttribute('id') + const elems = await driver.findElements(By.className('extension-list-item-wrapper')) + const extensionId = await elems[1].getAttribute('id') await driver.get(`chrome-extension://${extensionId}/popup.html`) await delay(500) }) @@ -78,12 +76,12 @@ describe('Metamask popup page', function () { it('should accept password with length of eight', async () => { await delay(300) const passwordBox = await driver.findElement(By.id('password-box')) - const passwordBoxConfirm = driver.findElement(By.id('password-box-confirm')) + const passwordBoxConfirm = await driver.findElement(By.id('password-box-confirm')) const button = driver.findElement(By.css('button')) - passwordBox.sendKeys('12345678') - passwordBoxConfirm.sendKeys('12345678') - await delay(300) + passwordBox.sendKeys('123456789') + passwordBoxConfirm.sendKeys('123456789') + await delay(500) await button.click() }) @@ -103,7 +101,7 @@ describe('Metamask popup page', function () { it('should accept account password after lock', async () => { await delay(500) - await driver.findElement(By.id('password-box')).sendKeys('12345678') + await driver.findElement(By.id('password-box')).sendKeys('123456789') await driver.findElement(By.css('button')).click() await delay(500) }) From 5a309328f1a1495034656f884e74ea6f1550d097 Mon Sep 17 00:00:00 2001 From: kumavis Date: Tue, 27 Mar 2018 13:36:09 -0700 Subject: [PATCH 5/6] ci - run e2e jobs --- .circleci/config.yml | 17 +++++++++++++++++ package.json | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index c14909783..8ebf569a5 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -12,6 +12,9 @@ workflows: - test-lint: requires: - prep-deps-npm + - test-e2e: + requires: + - prep-deps-npm - test-unit: requires: - prep-deps-npm @@ -96,6 +99,20 @@ jobs: name: Test command: npm run lint + test-e2e: + docker: + - image: circleci/node:8-browsers + steps: + - checkout + - restore_cache: + key: dependency-cache-{{ checksum "package-lock.json" }} + - run: + name: Build + command: npm run dist + - run: + name: Test + command: npm run test:e2e + test-unit: docker: - image: circleci/node:8-browsers diff --git a/package.json b/package.json index 09e90ec59..0e5456b1f 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "test:single": "cross-env METAMASK_ENV=test mocha --require test/helper.js", "test:integration": "npm run test:integration:build && npm run test:flat && npm run test:mascara", "test:integration:build": "gulp build:scss", - "test:e2e": "METAMASK_ENV=test mocha test/e2e/metamask.spec --recursive || true", + "test:e2e": "METAMASK_ENV=test mocha test/e2e/metamask.spec --recursive", "test:coverage": "nyc npm run test:unit && npm run test:coveralls-upload", "test:coveralls-upload": "if [ $COVERALLS_REPO_TOKEN ]; then nyc report --reporter=text-lcov | coveralls; fi", "test:flat": "npm run test:flat:build && karma start test/flat.conf.js", From c2b5538ff3515fd8a9913e3f3424beba93e6ab91 Mon Sep 17 00:00:00 2001 From: kumavis Date: Tue, 27 Mar 2018 13:54:32 -0700 Subject: [PATCH 6/6] deps - update package-lock --- package-lock.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/package-lock.json b/package-lock.json index 56f6c4305..d6ada40b0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11229,6 +11229,12 @@ "integrity": "sha1-+rg/uwstjchfpjbEudNMdUIMbWU=", "dev": true }, + "es6-promise": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", + "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=", + "dev": true + }, "readable-stream": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz",