diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 00000000..9a5ac9ae --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,115 @@ +version: 2.1 + +executors: + test-executor: + docker: + - image: circleci/golang:1.15.2 + auth: + username: mydockerhub-user + password: $DOCKERHUB_PASSWORD + environment: + PROTOTOOL_VER: 1.7.0 + working_directory: /go/src/github.com/improbable-eng/grpc-web + +jobs: + # This first job in the workflow optimises test time by combining the following: + # * Linting + # * Golang unit tests + # * TypeScript unit tests + # * Builds integration testserver binary + # * Builds integration test Javascript bundles + initial-unit-test-lint-prebuild: + executor: test-executor + steps: + - checkout + - run: sudo apt-get install unzip + - run: . ./install-prototool.sh + - run: echo 'export GOBIN=/go/bin' >> $BASH_ENV + - run: go get -u golang.org/x/tools/cmd/goimports + - run: go get -u github.com/robertkrimen/godocdown/godocdown + - run: curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh + - run: dep ensure + - run: go install ./vendor/github.com/golang/protobuf/protoc-gen-go + - run: export PATH=/go/src/github.com/improbable-eng/grpc-web/protobuf/bin:$PATH + - run: + command: | + set +e + curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.33.5/install.sh | bash + export NVM_DIR="/home/circleci/.nvm" + [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" + nvm install + echo 'export NVM_DIR=$HOME/.nvm' >> $BASH_ENV + echo 'source $NVM_DIR/nvm.sh' >> $BASH_ENV + - run: npm install + # Lint + - run: ./lint-all.sh + # Unit Tests + - run: ./test-all.sh + # Build server binary and Javascript bundles to be used across all subsequent browser tests + - run: + name: Pre-Build Integration Test + command: npm run build:integration + # Persisting the workspace allows the built assets to be used across the fan-out tests in the subsequent step + - persist_to_workspace: + root: /go/src/github.com/improbable-eng/grpc-web + paths: + - integration_test + - client + browser-tests: + parameters: + browser-params: + type: string + executor: test-executor + steps: + - checkout + # Attaches the workspace from the previous step to retrieve the built assets for the tests + - attach_workspace: + at: /go/src/github.com/improbable-eng/grpc-web + - run: sudo apt-get install moreutils + # The two following hosts must match those in integration_test/hosts-config.ts + - run: echo 127.0.0.1 testhost | sudo tee -a /etc/hosts + - run: echo 127.0.0.1 corshost | sudo tee -a /etc/hosts + - run: + command: | + set +e + curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.33.5/install.sh | bash + export NVM_DIR="/home/circleci/.nvm" + [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" + nvm install + echo 'export NVM_DIR=$HOME/.nvm' >> $BASH_ENV + echo 'source $NVM_DIR/nvm.sh' >> $BASH_ENV + - run: << parameters.browser-params >> npm run test:integration-browsers:ci + - store_test_results: + path: ./integration_test/test-results +workflows: + version: 2 + test-workflow: + jobs: + - initial-unit-test-lint-prebuild + - browser-tests: + matrix: + parameters: + browser-params: + - BROWSER=firefox80_win + - BROWSER=firefox39_win + - BROWSER=firefox38_win + - BROWSER=firefox21_win + - BROWSER=chrome_85 + - BROWSER=chrome_52 + - BROWSER=chrome_43 + - BROWSER=chrome_42 + - BROWSER=chrome_41 + - BROWSER=edge85_win + - BROWSER=edge16_win + - BROWSER=edge14_win + - BROWSER=edge13_win + - BROWSER=safari13_1 SC_SSL_BUMPING=true DISABLE_WEBSOCKET_TESTS=true + - BROWSER=safari12_1 SC_SSL_BUMPING=true DISABLE_WEBSOCKET_TESTS=true + - BROWSER=safari11_1 SC_SSL_BUMPING=true DISABLE_WEBSOCKET_TESTS=true + - BROWSER=safari10_1 SC_SSL_BUMPING=true DISABLE_WEBSOCKET_TESTS=true + - BROWSER=safari9_1 SC_SSL_BUMPING=true DISABLE_WEBSOCKET_TESTS=true + - BROWSER=safari8 SC_SSL_BUMPING=true DISABLE_WEBSOCKET_TESTS=true + - BROWSER=ie11_win DISABLE_WEBSOCKET_TESTS=true + - BROWSER=nodejs + requires: + - initial-unit-test-lint-prebuild \ No newline at end of file diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index fda33bbe..00000000 --- a/.travis.yml +++ /dev/null @@ -1,70 +0,0 @@ -language: go -go: - - "1.15.2" -go_import_path: github.com/improbable-eng/grpc-web -addons: - hosts: - # These must match the hosts defined in test/hosts-config.ts - - testhost - - corshost -env: - global: - # GLOBAL_TESTSERVER is used to skip starting the testserver in run-with-testserver.sh - - GLOBAL_TESTSERVER=true - - SEPARATE_TEST_SUITES=true - - PROTOTOOL_VER=1.7.0 - # BROWSERSTACK environment variables - - secure: sDMaJtQCte+9xTWKORX2IQYV7DPkuNBUK7Debk6q8jb6vvc1AiyNqN9SNaZm1V2VgnagoShYAzRyL2QhNeST/UFuO+2JsxjPlu2Elku4cJTYmDhuERlS3SS8llRoqRGSxK003ZRPyx5GGD0fS7eESaNCmS+4S+LA2KQrOZ9dGbn+wKjNueMDkCtRudyEqQzHRc8vBNxF3V3nkXckAuATjvnSim7odJEED+DW5aXMYZIrYTvM2ZmqmLlerP/wJJCxws0kKSssJhWEfcxEMTAmdC180EC0cBZ2ap4V3YnFYeEOnZ5lMR5mLHxyPQvjbYqGG693na6nBsim1abJqXzCF+H+7MBeXzM+hejkZd/1BNjS1+C5orkFx/Af7/9zTTKV9o3rAaYPm3zCikmhm5kRSkbjRGirTNN4Ogki66w1HCCxVEtp77Uiylj3KMQk1iqDeL/m0jLjYnWvzHPZBc1h6I856AgO9WpOnfVBsIAK9dqbwqH+cy+zzxL+IXvOLZlhRqyd5MeasMoLzZQC4vA8Fbp6o6G0vFkuxCXR/uF34vDaHYI98Qq2NmfWP3jD/+ytgswfB9K75v5hNZ9OGEVBQJI4UYDzQmm6fkTXRFGjR44XbClmtTI2E4Se32JvkLIMQVJ1NLWo5fMsz4S6yJjqtMdkblNhWjHhCqhxI+exRXQ= - - secure: D6hsSagcqeGXevwP1bWBQCyFov4OkMLFdyXpzosmndMCg9O+K5+N7ojkBIXbb7FIh++phuCWCX5L5Ak7MU+FkzUKNrSnHX7E40UNcClrUBSWzmz2SkYqEsGBgSfqm5cNPnVy97lg1Qp9NfcahjQ67YW0qzVipWb2NiXhpWDICCNvD3EL6p5O1H+h7FEyW8xr83b6x3u1gzNL0dDM+zZ13nlYtVdIZKX1b+zJJXoeVwLK9aTi2VZYJLQa2H8pyEKVYnR4xMu7005MOxohvMYQEntAkqiKcwR653XCyPQ9QCMv5rpEzMK3Fh1uzdqJ4ZsDuJHlyDuLTIoxH2WRAVLvdOck2muwgyV5O2+Rp5N1BKTw06Bgo4RaWQ8AR4jrlXJ7lQoFKsauXYTLL/qG1RkcC5Fz0sogg1Xz2mnp3TjyDnPgx97n96+1VqIhQfKSdn0vc93AEQj3DX6vjdE7IOKav73GYYoacsIccfUGmCYQfd4Uoo6FMt79Gmo+Tq/dfI+d1Gvv9Q7NZl33gS5nmunUxPksERRfAwPS9O95hhEYrpOcdVShpvKoP2ZZ/bbE5oW4ZWV28i+kH9dRMVFqckSSmC8N0Px+J7lUaxifwQceZV+v3LcDINjgQ+MIt2dEjUwR2Qbc0nJ74zDi51u3OFGaNUVHjvDqKj/Y9kdSnMJOP8Q= - matrix: - - BROWSER=nodejs - - BROWSER=firefox53_osx - - BROWSER=firefox39_osx - - BROWSER=firefox38_osx - - BROWSER=firefox21_osx - - BROWSER=chrome_57 - - BROWSER=chrome_52 - - BROWSER=chrome_43 - - BROWSER=chrome_41 - - BROWSER=edge16_win - # Edge < 16 does not support aborting fetch requests (documented known limitation in project README) - - BROWSER=edge15_win DISABLE_ABORT_TESTS=true - - BROWSER=edge14_win DISABLE_ABORT_TESTS=true - - BROWSER=edge13_win DISABLE_ABORT_TESTS=true - # Browsers that do not support trusting self-signed certs for wss:// connections are disabled (see https://github.com/improbable-eng/grpc-web/issues/165) - - BROWSER=ie11_win DISABLE_WEBSOCKET_TESTS=true - - BROWSER=safari11 DISABLE_WEBSOCKET_TESTS=true - - BROWSER=safari9_1 DISABLE_WEBSOCKET_TESTS=true - - BROWSER=safari8 DISABLE_WEBSOCKET_TESTS=true -cache: - directories: - - node_modules -before_install: - - sudo apt-get install unzip -install: - - . ./install-prototool.sh - - go get -u golang.org/x/tools/cmd/goimports - - go get -u github.com/robertkrimen/godocdown/godocdown - - curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh - - dep ensure - - go install ./vendor/github.com/golang/protobuf/protoc-gen-go - - export PATH=/home/travis/gopath/src/github.com/improbable-eng/grpc-web/protobuf/bin:$PATH - - nvm install - - npm install -before_script: - - ./integration_test/start-testserver.sh & -script: - - npm run test:integration - -stages: - - lint - - unit-test - - test - -jobs: - include: - - stage: lint - script: ./lint-all.sh - - - stage: unit-test - script: ./test-all.sh diff --git a/README.md b/README.md index bc0ddaf6..be9d8267 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # gRPC-Web: Typed Frontend Development -[![Master Build](https://travis-ci.org/improbable-eng/grpc-web.svg?branch=master)](https://travis-ci.org/improbable-eng/grpc-web) -![BrowserStack Status](https://www.browserstack.com/automate/badge.svg?badge_key=L0k3QjhiNnByd3hWVVhtS0FxTmNrZERwbDBqR053OFJKV01veUpkL1FqOD0tLXZyS0d2WC9TaGEzeTBjbXZ6L1JNa2c9PQ==--b460187586f63fc2a48f557a515f9900f5639d10) +[![CircleCI](https://circleci.com/gh/improbable-eng/grpc-web/tree/master.svg?style=svg)](https://circleci.com/gh/improbable-eng/grpc-web/tree/master) +[![Sauce Test Status](https://app.saucelabs.com/buildstatus/ImprobableEngBot)](https://app.saucelabs.com/u/ImprobableEngBot) [![NPM](https://img.shields.io/npm/v/@improbable-eng/grpc-web.svg)](https://www.npmjs.com/package/@improbable-eng/grpc-web) [![GoDoc](http://img.shields.io/badge/GoDoc-Reference-blue.svg)](https://godoc.org/github.com/improbable-eng/grpc-web/go/grpcweb) [![Apache 2.0 License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE) @@ -140,7 +140,7 @@ This library is tested against: * Firefox >= 21 * Edge >= 13 * IE >= 11 - * Safari >= 6 + * Safari >= 8 ## Node.js Support diff --git a/go/generate-docs.sh b/go/generate-docs.sh index a894b8b4..fa9f80a6 100755 --- a/go/generate-docs.sh +++ b/go/generate-docs.sh @@ -6,7 +6,7 @@ for i in $(find . -iname 'doc.go'); do dir="${i%/*}" echo "- $dir" cd "${dir}" - "${GOPATH}/bin/godocdown" -heading=Title -o DOC.md + "${GOBIN}/godocdown" -heading=Title -o DOC.md ln -s DOC.md README.md 2> /dev/null # can fail cd "${oldpwd}" done; diff --git a/go/lint.sh b/go/lint.sh index 64e41edc..e5c4afc9 100755 --- a/go/lint.sh +++ b/go/lint.sh @@ -34,7 +34,7 @@ function check_gofmt { function goimports_all { echo "- Running goimports" - ${GOPATH}/bin/goimports -l -w $(print_real_go_files) + ${GOBIN}/goimports -l -w $(print_real_go_files) if [[ $? -ne 0 ]]; then echo "ERROR: goimports changes detected, please commit them." exit 1 diff --git a/install-prototool.sh b/install-prototool.sh index 6b803430..199f0ebc 100755 --- a/install-prototool.sh +++ b/install-prototool.sh @@ -1,6 +1,6 @@ #!/bin/bash # Installs prototool; used for managing protoc the installation and compilation flags. -# This script is intended to be run by Travis CI +# This script is intended to be run by CI set -ex @@ -14,4 +14,4 @@ curl -sSL \ -o ./prototool && \ chmod +x ./prototool -export PATH=$PATH:$PWD +echo 'export PATH=$PATH:$PWD' >> $BASH_ENV diff --git a/integration_test/.gitignore b/integration_test/.gitignore index f243870f..4c739845 100644 --- a/integration_test/.gitignore +++ b/integration_test/.gitignore @@ -1,2 +1,4 @@ build-node/ build/ +test-results/ +sauce-connect-proxy/ diff --git a/integration_test/browsers.ts b/integration_test/browsers.ts index f4b99c69..c1dd1ad9 100644 --- a/integration_test/browsers.ts +++ b/integration_test/browsers.ts @@ -1,73 +1,47 @@ -import {SuiteEnum} from "./ts/suiteUtils"; - -function browser(browserName, browserVersion, os, osVersion) { - const browsers = []; - if (process.env.TEST_SUITE_NAME) { - browsers.push({ - configName: `${os}_${osVersion}_${browserName}_${browserVersion}_${process.env.TEST_SUITE_NAME}`, - base: 'CustomWebDriver', - capabilities: { - testSuite: process.env.TEST_SUITE_NAME, - browserName: browserName, - browserVersion: browserVersion, - os: os, - os_version: osVersion - } - }); - } else if (process.env.SEPARATE_TEST_SUITES) { - for (let suiteName in SuiteEnum) { - if (isNaN(Number(suiteName))) { - browsers.push({ - configName: `${os}_${osVersion}_${browserName}_${browserVersion}_${suiteName}`, - base: 'CustomWebDriver', - capabilities: { - testSuite: suiteName, - browserName: browserName, - browserVersion: browserVersion, - os: os, - os_version: osVersion - } - }); - } + function browser(browserName, browserVersion, os, options?: {}) { + return { + configName: `${os}_${browserName}_${browserVersion}`, + base: 'CustomWebDriver', + capabilities: { + ...(options || {}), + testSuite: undefined, + browserName: browserName, + browserVersion: browserVersion, + os: os, } - } else { - browsers.push({ - configName: `${os}_${osVersion}_${browserName}_${browserVersion}_allsuites`, - base: 'CustomWebDriver', - capabilities: { - testSuite: undefined, - browserName: browserName, - browserVersion: browserVersion, - os: os, - os_version: osVersion - } - }) } - return browsers; } -// Browser versions that should not have any Fetch/XHR differences in functionality to other (tested) versions are -// commented out. const browsers = { - edge16_win: browser("edge", "16", "Windows", "10"), - edge15_win: browser("edge", "15", "Windows", "10"), - edge14_win: browser("edge", "14", "Windows", "10"), - edge13_win: browser('edge', "13", 'Windows', "10"), - ie11_win: browser('ie', "11", 'Windows', "7"), - firefox53_osx: browser('firefox', "53", 'OS X', "Sierra"), - firefox39_osx: browser('firefox', "39", 'OS X', "Sierra"), // Basic fetch added in 39 - firefox38_osx: browser('firefox', "38", 'OS X', "Sierra"), - firefox21_osx: browser('firefox', "21", 'OS X', "Sierra"), - chrome_57: browser('chrome', "57", 'Windows', "7"), - chrome_52: browser('chrome', "52", 'Windows', "7"), - chrome_43: browser('chrome', "43", 'Windows', "7"), // Readable stream fetch support added in 43 - chrome_42: browser('chrome', "42", 'Windows', "7"), // Basic fetch added in 42 - chrome_41: browser('chrome', "41", 'Windows', "7"), - safari11: browser("safari", "11", "OS X", "High Sierra"), - // // Safari 10 disabled whilst investigating an issue with https requests for unresolved host hanging through Browserstack - // safari10: browser("safari", "10", "OS X", "Sierra"), - safari9_1: browser("safari", "9.1", "OS X", "El Capitan"), - safari8: browser("safari", "8", "OS X", "Yosemite"), + // Firefox + firefox80_win: browser('firefox', '80', 'Windows 10',{custom: {acceptInsecureCerts: true}}), + firefox39_win: browser('firefox', '39', 'Windows 10',{custom: {acceptInsecureCerts: true}}), // Basic fetch added in 39 + firefox38_win: browser('firefox', '38', 'Windows 10',{custom: {acceptInsecureCerts: true}}), + firefox21_win: browser('firefox', '21', 'Windows 10',{custom: {acceptInsecureCerts: true}}), + + // Chrome + chrome_85: browser('chrome', '85', 'Windows 10', {certOverrideJSElement: 'proceed-link'}), + chrome_52: browser('chrome', '52', 'Windows 10'), + chrome_43: browser('chrome', '43', 'Linux'), // Readable stream fetch support added in 43 + chrome_42: browser('chrome', '42', 'Linux'), // Basic fetch added in 42 + chrome_41: browser('chrome', '41', 'Linux'), + + // Edge + edge85_win: browser('MicrosoftEdge', '85', 'Windows 10', {certOverrideJSElement: 'proceed-link'}), + edge16_win: browser('MicrosoftEdge', '16', 'Windows 10', {certOverrideJSElement: 'invalidcert_continue'}), + edge14_win: browser('MicrosoftEdge', '14', 'Windows 10', {certOverrideJSElement: 'invalidcert_continue'}), + edge13_win: browser('MicrosoftEdge', '13', 'Windows 10', {certOverrideJSElement: 'invalidcert_continue'}), + + // Safari + safari13_1: browser('safari', '13.1', 'OS X 10.15', {useSslBumping: true, disableWebsocketTests: true}), + safari12_1: browser('safari', '12.0', 'OS X 10.14',{useSslBumping: true, disableWebsocketTests: true}), + safari11_1: browser('safari', '11.1', 'OS X 10.13',{useSslBumping: true, disableWebsocketTests: true}), + safari10_1: browser('safari', '10.1', 'OS X 10.12',{useSslBumping: true, disableWebsocketTests: true}), + safari9_1: browser('safari', '9.0', 'OS X 10.11',{useSslBumping: true, disableWebsocketTests: true}), + safari8: browser('safari', '8.0', 'OS X 10.10',{useSslBumping: true, disableWebsocketTests: true}), + + // IE + ie11_win: browser('internet explorer', '11', 'Windows 10', {certOverrideJSElement: 'overridelink', disableWebsocketTests: true}), }; export default () => { @@ -79,16 +53,13 @@ export default () => { if (!foundBrowser) { throw new Error(`BROWSER env var set to "${browserEnv}", but there is no browser with that identifier`); } - foundBrowser.forEach(browserConfig => { - filteredBrowsers[browserConfig.configName] = browserConfig; - }); + filteredBrowsers[foundBrowser.configName] = foundBrowser; return filteredBrowsers; } for(let i in browsers) { - browsers[i].forEach(browserConfig => { - filteredBrowsers[browserConfig.configName] = browserConfig; - }); + const browserConfig = browsers[i] + filteredBrowsers[browserConfig.configName] = browserConfig; } return filteredBrowsers }; diff --git a/integration_test/custom-karma-driver.ts b/integration_test/custom-karma-driver.ts index f8ff58bc..935b9421 100644 --- a/integration_test/custom-karma-driver.ts +++ b/integration_test/custom-karma-driver.ts @@ -1,12 +1,11 @@ -const wd = require('wd'); -const browserstack = require('browserstack-local'); -import * as _ from "lodash"; -import {testHost, corsHost} from "./hosts-config"; -const username = process.env.BROWSERSTACK_USERNAME; -const accessKey = process.env.BROWSERSTACK_ACCESS_KEY; -const seleniumHost = 'hub-cloud.browserstack.com'; -const seleniumPort = 80; -const buildName = process.env.TRAVIS_BUILD_NUMBER ? `travis_${process.env.TRAVIS_BUILD_NUMBER}` : `local_${new Date().getTime()}`; +import { Builder } from 'selenium-webdriver'; +import { corsHost, testHost } from "./hosts-config"; + +const username = process.env.SAUCELABS_USERNAME; +const accessKey = process.env.SAUCELABS_ACCESS_KEY; +const buildName = process.env.CIRCLE_WORKFLOW_ID ? `circleci_${process.env.CIRCLE_WORKFLOW_ID}` : `local_${new Date().getTime()}`; +const sauceLabsTunnelWithSSLBumping = process.env.SAUCELABS_TUNNEL_ID_WITH_SSL_BUMP; +const sauceLabsTunnelNoSSLBumping = process.env.SAUCELABS_TUNNEL_ID_NO_SSL_BUMP; const viaUrls = [ // HTTP 1.1 @@ -21,46 +20,6 @@ const viaUrls = [ "https://" + corsHost + ":9105" ]; -let tunnelId = null; -let bs_local = null; -let localCallbacks = []; -const localTunnels = []; -function LocalTunnel(logger, cb) { - localTunnels.push(this); - - if (tunnelId !== null) { - cb(null, tunnelId); - } else { - localCallbacks.push(cb); - const tunnelIdentifier = `tunnel-${Math.random()}`; - if (localCallbacks.length === 1) { - bs_local = new browserstack.Local(); - bs_local.start({ - 'key': accessKey, - 'localIdentifier': tunnelIdentifier - }, function (error) { - tunnelId = tunnelIdentifier; - localCallbacks.forEach(cb => { - cb(error, tunnelIdentifier) - }); - localCallbacks = []; - }); - } - } - - this.dispose = function(cb){ - localTunnels.splice(localTunnels.indexOf(this), 1); - if (localTunnels.length === 0) { - tunnelId = null; - bs_local.stop(function(){ - cb(null); - }); - } else { - cb(null); - } - } -} - function CustomWebdriverBrowser(id, baseBrowserDecorator, args, logger) { baseBrowserDecorator(this); const self = this; @@ -71,84 +30,81 @@ function CustomWebdriverBrowser(id, baseBrowserDecorator, args, logger) { self.id = id; const caps = args.capabilities; self._start = (testUrl) => { - const testUrlWithSuite = `${testUrl}#${caps.testSuite ? caps.testSuite : ''}`; - self.localTunnel = new LocalTunnel(self.log, (err, tunnelIdentifier) => { - if (err) { - return self.log.error("Could not create local testing", err); - } + const testUrlWithSuite = `${testUrl}#${caps.disableWebsocketTests ? 'disableWebsocketTests' : ''}`; + const tunnelIdentifier = caps.useSslBumping ? sauceLabsTunnelWithSSLBumping : sauceLabsTunnelNoSSLBumping; + self.log.debug('Local Tunnel Connected. Now testing...'); + let browser = new Builder() + .withCapabilities({ + ...(caps.custom || {}), + 'name': `${caps.browserName} - Integration Test`, + 'browserName': caps.browserName, + 'platform': caps.os, + 'version': caps.browserVersion, + 'build': buildName, + 'username': username, + 'accessKey': accessKey, + 'tunnelIdentifier': tunnelIdentifier, + 'recordScreenshots': false, + 'acceptSslCerts': true, + 'javascriptEnabled': true, + 'commandTimeout': 600, + 'idleTimeout': 600, + 'maxDuration': 600, + }) + .usingServer("https://" + username + ":" + accessKey + "@ondemand.saucelabs.com:443/wd/hub") + .build(); - self.log.debug('Local Tunnel Connected. Now testing...'); - const browser = wd.remote(seleniumHost, seleniumPort, username, accessKey); - self.browser = browser; - browser.on('status', function(info) { - self.log.debug(info); - }); - browser.on('command', function(eventType, command, response) { - self.log.debug(' > ' + eventType, command, (response || '')); - }); - browser.on('http', function(meth, path, data) { - self.log.debug(' > ' + meth, path, (data || '')); - }); - const bsCaps = _.assign({ - "project": process.env.TRAVIS_BRANCH || "dev", - "build": buildName, - "acceptSslCerts": true, - "defaultVideo": true, - "browserstack.local": true, - "browserstack.tunnel": true, - "browserstack.debug": true, - "tunnelIdentifier": tunnelIdentifier, - "browserstack.localIdentifier": tunnelIdentifier - }, caps); - browser.init(bsCaps, function(err) { - if (err) { - self.log.error("browser.init", err); - throw err; - } - const next = (i) => { - const via = viaUrls[i]; - if (!via) { - browser.get(testUrlWithSuite, function() { - self.captured = true; - // This will wait on the page until the browser is killed + self.log.debug("Built webdriver"); - // To avoid BrowserStack killing the session because there is no interaction with the page - // poll the title of the page to keep the session alive. - const interval = setInterval(function() { - if (self.ended) { - clearInterval(interval); - return; - } - browser.title(function (err) { - if (err) { - console.error("Failed to get page title: ", err); - clearInterval(interval); - } - }) - }, 10000); - }); - } else { - browser.get(via, function () { - next(i + 1); + self.browser = browser; + if (caps.certOverrideJSElement) { + const next = (i) => { + const via = viaUrls[i]; + if (!via) { + self.log.debug("Navigating to ", testUrlWithSuite); + browser.get(testUrlWithSuite).then(() => { + self.log.debug("Did capture"); + self.captured = true; + + self.log.debug("Attempting to bypass cert issue on final") + browser.executeScript(`var el = document.getElementById('${caps.certOverrideJSElement}'); if (el) {el.click()}`); + // This will wait on the page until the browser is killed + }); + } else { + browser.get(via).then(() => { + self.log.debug("Attempting to bypass cert issue") + browser.executeScript(`var el = document.getElementById('${caps.certOverrideJSElement}'); if (el) {el.click()}`).then(() => { + setTimeout(() => { + next(i + 1); + }, 5000); }); - } - }; - next(0); + }).catch(err => { + console.error("Failed to navigate via page", err); + }); + } + }; + next(0); + } else { + self.log.debug("Navigating to ", testUrlWithSuite); + browser.get(testUrlWithSuite).then(() => { + self.log.debug("Did capture"); + self.captured = true; }); - }); + } }; - this.on('kill', function(done){ + this.on('kill', function (done) { + self.log.debug("KarmaDriver.kill") self.ended = true; - self.localTunnel.dispose(function(){ - self.browser.quit(function(err) { - self._done(); - done(); - }); + self.log.debug("KarmaDriver.quit()") + self.browser.quit().finally(() => { + self.log.debug("KarmaDriver.quit.finally") + self._done(); + done(); }); }); - self.isCaptured = function() { + self.isCaptured = function () { return self.captured; }; } diff --git a/integration_test/go/testserver/testserver.go b/integration_test/go/testserver/testserver.go index 1e963410..d44313c6 100644 --- a/integration_test/go/testserver/testserver.go +++ b/integration_test/go/testserver/testserver.go @@ -18,6 +18,7 @@ import ( "google.golang.org/grpc/codes" "google.golang.org/grpc/grpclog" "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" ) var ( @@ -136,7 +137,7 @@ func (s *testSrv) Ping(ctx context.Context, ping *testproto.PingRequest) (*testp if ping.GetCheckMetadata() { md, ok := metadata.FromIncomingContext(ctx) if !ok || md["headertestkey1"][0] != "ClientValue1" || md["headertestkey2"][0] != "ClientValue2" { - return nil, grpc.Errorf(codes.InvalidArgument, "Metadata was invalid") + return nil, status.Errorf(codes.InvalidArgument, "Metadata was invalid") } } if ping.GetSendHeaders() { @@ -169,15 +170,15 @@ func (s *testSrv) PingError(ctx context.Context, ping *testproto.PingRequest) (* if ping.FailureType == testproto.PingRequest_CODE { msg = "Intentionally returning error for PingError" } - return nil, grpc.Errorf(codes.Code(ping.ErrorCodeReturned), msg) + return nil, status.Errorf(codes.Code(ping.ErrorCodeReturned), msg) } func (s *testSrv) ContinueStream(ctx context.Context, req *testproto.ContinueStreamRequest) (*google_protobuf.Empty, error) { s.streamsMutex.Lock() - defer s.streamsMutex.Unlock() channel, ok := s.streams[req.GetStreamIdentifier()] + s.streamsMutex.Unlock() if !ok { - return nil, grpc.Errorf(codes.NotFound, "stream identifier not found") + return nil, status.Errorf(codes.NotFound, fmt.Sprintf("stream identifier not found: %s", req.GetStreamIdentifier())) } channel <- true return &google_protobuf.Empty{}, nil @@ -208,7 +209,7 @@ func (s *testSrv) PingList(ping *testproto.PingRequest, stream testproto.TestSer var channel chan bool useChannel := ping.GetStreamIdentifier() != "" if useChannel { - channel = make(chan bool) + channel = make(chan bool, 10000) s.streamsMutex.Lock() s.streams[ping.GetStreamIdentifier()] = channel s.streamsMutex.Unlock() @@ -224,16 +225,25 @@ func (s *testSrv) PingList(ping *testproto.PingRequest, stream testproto.TestSer for i := int32(0); i < ping.ResponseCount; i++ { if i != 0 && useChannel { - shouldContinue := <-channel - if !shouldContinue { - return grpc.Errorf(codes.OK, "stream was cancelled by side-channel") + select { + case shouldContinue := <-channel: + if !shouldContinue { + return status.Errorf(codes.Canceled, "stream was cancelled by side-channel") + } + case <-stream.Context().Done(): + return status.Errorf(codes.Canceled, "stream context ended") } } err := stream.Context().Err() if err != nil { - return grpc.Errorf(codes.Canceled, "client cancelled stream") + return status.Errorf(codes.Canceled, "client cancelled stream") + } + sendErr := stream.Send(&testproto.PingResponse{Value: fmt.Sprintf("%s %d", ping.Value, i), Counter: i}) + if sendErr != nil { + // If there was a send error then stop the test server non-gracefully to ensure tests fail in an + // identifiable way + panic(sendErr) } - stream.Send(&testproto.PingResponse{Value: fmt.Sprintf("%s %d", ping.Value, i), Counter: i}) } return nil } @@ -263,7 +273,7 @@ func (s *testSrv) PingStream(stream testproto.TestService_PingStreamServer) erro allValues = allValues + "," + in.GetValue() } if in.FailureType == testproto.PingRequest_CODE { - return grpc.Errorf(codes.Code(in.ErrorCodeReturned), "Intentionally returning status code: %d", in.ErrorCodeReturned) + return status.Errorf(codes.Code(in.ErrorCodeReturned), "Intentionally returning status code: %d", in.ErrorCodeReturned) } } } @@ -287,10 +297,15 @@ func (s *testSrv) PingPongBidi(stream testproto.TestService_PingPongBidiServer) if in.ErrorCodeReturned == 0 { return nil } - return grpc.Errorf(codes.Code(in.ErrorCodeReturned), "Intentionally returning status code: %d", in.ErrorCodeReturned) + return status.Errorf(codes.Code(in.ErrorCodeReturned), "Intentionally returning status code: %d", in.ErrorCodeReturned) } - stream.Send(&testproto.PingResponse{ + sendErr := stream.Send(&testproto.PingResponse{ Value: in.Value, }) + if sendErr != nil { + // If there was a send error then stop the test server non-gracefully to ensure tests fail in an + // identifiable way + panic(sendErr) + } } } diff --git a/integration_test/hosts-config.ts b/integration_test/hosts-config.ts index 6b30298a..9da0beb5 100644 --- a/integration_test/hosts-config.ts +++ b/integration_test/hosts-config.ts @@ -1,3 +1,3 @@ -// These must match the hosts configured in .travis.yml +// These must match the hosts configured in .circleci/config.yml export const testHost = "testhost"; export const corsHost = "corshost"; diff --git a/integration_test/karma.conf.ts b/integration_test/karma.conf.ts index e6dce353..11c0f427 100644 --- a/integration_test/karma.conf.ts +++ b/integration_test/karma.conf.ts @@ -3,17 +3,20 @@ import customLaunchersGenerator from './browsers'; import customKarmaDriver from './custom-karma-driver'; import {testHost} from './hosts-config'; +const junitReportDirectory = process.env.JUNIT_REPORT_PATH || './test-results'; + export default (config) => { const customLaunchers = customLaunchersGenerator(); const DEBUG = process.env.DEBUG !== undefined; - const useBrowserStack = process.env.BROWSERSTACK_USERNAME !== undefined; - const browsers = useBrowserStack ? Object.keys(customLaunchers) : []; + const DISABLE_WEBSOCKET_TESTS = process.env.DISABLE_WEBSOCKET_TESTS !== undefined; + const useSauceLabs = process.env.SAUCELABS_USERNAME !== undefined; + const browsers = useSauceLabs ? Object.keys(customLaunchers) : []; config.set({ basePath: '', frameworks: ['jasmine'], - browserStack: { - forcelocal: true + jasmine: { + random: false, }, files: [ 'ts/build/integration-tests.js' @@ -21,38 +24,44 @@ export default (config) => { preprocessors: { '**/*.js': ['sourcemap', 'config-inject'] }, - reporters: ['mocha'], + reporters: ['mocha', 'junit'], + junitReporter: { + outputDir: junitReportDirectory, + }, protocol: 'https', hostname: testHost, port: 9876, httpsServerOptions: { - key: fs.readFileSync('..//misc/localhost.key', 'utf8'), - cert: fs.readFileSync('..//misc/localhost.crt', 'utf8') + key: fs.readFileSync('../misc/localhost.key', 'utf8'), + cert: fs.readFileSync('../misc/localhost.crt', 'utf8') }, colors: true, logLevel: DEBUG ? 'DEBUG' : 'INFO', client: { captureConsole: true, - runInParent: true, - useIframe: false + runInParent: false, + useIframe: true, }, plugins: [ customKarmaDriver, {'preprocessor:config-inject': [ - 'factory', () => - (content, file, done) => - done(`window.DEBUG = ${DEBUG};\n${content}`) - ]}, + 'factory', () => + (content, file, done) => + done(`window.DEBUG = ${DEBUG};window.DISABLE_WEBSOCKET_TESTS = ${DISABLE_WEBSOCKET_TESTS};\n${content}`) + ]}, 'karma-sourcemap-loader', 'karma-mocha-reporter', + 'karma-junit-reporter', 'karma-jasmine' ], + transports: ['polling'], autoWatch: true, - captureTimeout: 120000, - browserDisconnectTimeout: 120000, - browserNoActivityTimeout: 120000, - singlerun: useBrowserStack, - concurrency: 1, + disconnectTolerance: 5, + captureTimeout: 300000, + browserDisconnectTimeout: 300000, + browserNoActivityTimeout: 300000, + singlerun: useSauceLabs, + concurrency: 4, customLaunchers: customLaunchers, browsers: browsers }); diff --git a/integration_test/package-lock.json b/integration_test/package-lock.json index 68413e4c..26bd2783 100644 --- a/integration_test/package-lock.json +++ b/integration_test/package-lock.json @@ -229,6 +229,22 @@ } } }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true + }, "@types/chai": { "version": "4.1.7", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.7.tgz", @@ -463,6 +479,12 @@ "integrity": "sha512-JD0xT5FCRDNyjDda3Lrg/IxFscp9q4tiYtxE1/nOzlKCk7hIRuYjhq1kCNkbPjMRMZuFq20HNQn1I9k8Oj0E+Q==", "dev": true }, + "adm-zip": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", + "dev": true + }, "after": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", @@ -493,6 +515,12 @@ "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", "dev": true }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -532,105 +560,6 @@ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, - "archiver": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-3.1.1.tgz", - "integrity": "sha512-5Hxxcig7gw5Jod/8Gq0OneVgLYET+oNHcxgWItq4TbhOzRLKNAFUb9edAftiMKXvXfCB0vbGrJdZDNq0dWMsxg==", - "dev": true, - "requires": { - "archiver-utils": "^2.1.0", - "async": "^2.6.3", - "buffer-crc32": "^0.2.1", - "glob": "^7.1.4", - "readable-stream": "^3.4.0", - "tar-stream": "^2.1.0", - "zip-stream": "^2.1.2" - }, - "dependencies": { - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - } - } - } - } - }, - "archiver-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", - "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", - "dev": true, - "requires": { - "glob": "^7.1.4", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^2.0.0" - }, - "dependencies": { - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", - "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", - "dev": true - } - } - }, "arg": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz", @@ -655,12 +584,6 @@ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", @@ -673,15 +596,6 @@ "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", "dev": true }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, "asn1.js": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", @@ -726,12 +640,6 @@ } } }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, "assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", @@ -760,15 +668,9 @@ "dev": true }, "async-limiter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", "dev": true }, "atob": { @@ -777,18 +679,6 @@ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true - }, "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", @@ -1414,9 +1304,9 @@ } }, "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", + "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", "dev": true }, "base64-js": { @@ -1426,20 +1316,11 @@ "dev": true }, "base64id": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", - "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "dev": true }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, "better-assert": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", @@ -1461,46 +1342,12 @@ "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "dev": true }, - "bl": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-3.0.0.tgz", - "integrity": "sha512-EUAyP5UHU5hxF8BPT0LKW8gjYLhq1DQIcneOX/pL/m2Alo+OYDQAJlHq+yseMP50Os2nHXOSic6Ss3vSQeyf4A==", - "dev": true, - "requires": { - "readable-stream": "^3.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, "blob": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", "dev": true }, - "bluebird": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.4.tgz", - "integrity": "sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw==", - "dev": true - }, "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", @@ -1656,57 +1503,6 @@ "electron-to-chromium": "^1.3.47" } }, - "browserstack-local": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/browserstack-local/-/browserstack-local-1.4.0.tgz", - "integrity": "sha512-BUJWxIsJkJxqfTPJIvGWTsf+IYSqSFUeFNW9tnuyTG7va/0LkXLhIi/ErFGDle1urQkol48HlQUXj4QrliXFpg==", - "dev": true, - "requires": { - "https-proxy-agent": "^2.2.1", - "is-running": "^2.0.0", - "ps-tree": "=1.1.1", - "sinon": "^1.17.6", - "temp-fs": "^0.9.9" - } - }, - "buffer": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz", - "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, - "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true - }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", - "dev": true - }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -1817,6 +1613,12 @@ "unset-value": "^1.0.0" } }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, "callsite": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", @@ -1835,12 +1637,6 @@ "integrity": "sha512-rUBIbap+VJfxTzrM4akJ00lkvVb5/n5v3EGXfWzSH5zT8aJmGzjA8HWhJ4U6kCpzxozUSnB+yvAYDRPY6mRpgQ==", "dev": true }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, "chai": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", @@ -1978,6 +1774,17 @@ } } }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", @@ -2015,15 +1822,6 @@ "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==", "dev": true }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, "commander": { "version": "2.20.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", @@ -2054,18 +1852,6 @@ "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", "dev": true }, - "compress-commons": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-2.1.1.tgz", - "integrity": "sha512-eVw6n7CnEMFzc3duyFVrQEuY1BlHR3rYsSztyG32ibGMW722i3C6IizEGMFmfMU+A+fALvBIwxN3czffTcdA+Q==", - "dev": true, - "requires": { - "buffer-crc32": "^0.2.13", - "crc32-stream": "^3.0.1", - "normalize-path": "^3.0.0", - "readable-stream": "^2.3.6" - } - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -2093,14 +1879,14 @@ } }, "connect": { - "version": "3.6.6", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", - "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", "dev": true, "requires": { "debug": "2.6.9", - "finalhandler": "1.1.0", - "parseurl": "~1.3.2", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", "utils-merge": "1.0.1" } }, @@ -2172,44 +1958,6 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, - "crc": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", - "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", - "dev": true, - "requires": { - "buffer": "^5.1.0" - } - }, - "crc32-stream": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-3.0.1.tgz", - "integrity": "sha512-mctvpXlbzsvK+6z8kJwSJ5crm7yBwrQMTybJzMw1O4lLGJqjlDCXY2Zw7KheiA6XBEcBmfLx1D88mjRGVJtY9w==", - "dev": true, - "requires": { - "crc": "^3.4.4", - "readable-stream": "^3.4.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, "create-ecdh": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", @@ -2279,15 +2027,6 @@ "randomfill": "^1.0.3" } }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - } - }, "custom-event": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", @@ -2300,28 +2039,10 @@ "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", "dev": true }, - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, - "requires": { - "es5-ext": "^0.10.9" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, "date-format": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.0.0.tgz", - "integrity": "sha512-M6UqVvZVgFYqZL1SfHsRGIQSz3ZL+qgbsV5Lp1Vj61LZVYuEwcMXYay7DRDtYs2HQQBK5hQtQ0fD9aEJ89V0LA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", + "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==", "dev": true }, "date-now": { @@ -2410,12 +2131,6 @@ } } }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -2496,16 +2211,6 @@ "stream-shift": "^1.0.0" } }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -2533,6 +2238,12 @@ "minimalistic-crypto-utils": "^1.0.0" } }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, "emojis-list": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", @@ -2555,55 +2266,55 @@ } }, "engine.io": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", - "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.4.2.tgz", + "integrity": "sha512-b4Q85dFkGw+TqgytGPrGgACRUhsdKc9S9ErRAXpPGy/CXKs4tYoHDkvIRdsseAF7NjfVwjRFIn6KTnbw7LwJZg==", "dev": true, "requires": { "accepts": "~1.3.4", - "base64id": "1.0.0", + "base64id": "2.0.0", "cookie": "0.3.1", - "debug": "~3.1.0", - "engine.io-parser": "~2.1.0", - "ws": "~3.3.1" + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "ws": "^7.1.2" }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true } } }, "engine.io-client": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", - "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.4.tgz", + "integrity": "sha512-iU4CRr38Fecj8HoZEnFtm2EiKGbYZcPn3cHxqNGl/tmdWRf60KhK+9vE0JeSjgnlS/0oynEfLgKbT9ALpim0sQ==", "dev": true, "requires": { - "component-emitter": "1.2.1", + "component-emitter": "~1.3.0", "component-inherit": "0.0.3", "debug": "~3.1.0", - "engine.io-parser": "~2.1.1", + "engine.io-parser": "~2.2.0", "has-cors": "1.1.0", "indexof": "0.0.1", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "~3.3.1", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "ws": "~6.1.0", "xmlhttprequest-ssl": "~1.5.4", "yeast": "0.1.2" }, "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", @@ -2612,18 +2323,39 @@ "requires": { "ms": "2.0.0" } + }, + "parseqs": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", + "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==", + "dev": true + }, + "parseuri": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", + "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==", + "dev": true + }, + "ws": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", + "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } } } }, "engine.io-parser": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", - "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz", + "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", "dev": true, "requires": { "after": "0.8.2", "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.5", + "base64-arraybuffer": "0.1.4", "blob": "0.0.5", "has-binary2": "~1.0.2" } @@ -2679,59 +2411,12 @@ "is-symbol": "^1.0.2" } }, - "es5-ext": { - "version": "0.10.50", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.50.tgz", - "integrity": "sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw==", - "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.1", - "next-tick": "^1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, "es6-object-assign": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=", "dev": true }, - "es6-promise": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.6.tgz", - "integrity": "sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q==", - "dev": true - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "dev": true, - "requires": { - "es6-promise": "^4.0.3" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -2790,9 +2475,9 @@ } }, "eventemitter3": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "dev": true }, "events": { @@ -2962,18 +2647,26 @@ } } }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, "fast-deep-equal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", "dev": true }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + } + }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", @@ -3010,26 +2703,18 @@ } }, "finalhandler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", - "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "dev": true, "requires": { "debug": "2.6.9", - "encodeurl": "~1.0.1", + "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.3.1", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", "unpipe": "~1.0.0" - }, - "dependencies": { - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", - "dev": true - } } }, "find-cache-dir": { @@ -3076,9 +2761,9 @@ } }, "flatted": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz", - "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", "dev": true }, "flush-write-stream": { @@ -3100,30 +2785,10 @@ } }, "follow-redirects": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz", - "integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==", - "dev": true, - "requires": { - "debug": "^3.2.6" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", + "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==", + "dev": true }, "for-in": { "version": "1.0.2", @@ -3131,32 +2796,6 @@ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "formatio": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz", - "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=", - "dev": true, - "requires": { - "samsam": "~1.1" - } - }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -3181,21 +2820,23 @@ "readable-stream": "^2.0.0" } }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", + "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + } } }, "fs-write-stream-atomic": { @@ -3797,15 +3438,6 @@ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", "dev": true }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, "glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", @@ -3841,6 +3473,12 @@ } } }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, "global-modules": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", @@ -3882,22 +3520,6 @@ "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", "dev": true }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -4053,69 +3675,22 @@ } }, "http-proxy": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", - "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, "requires": { - "eventemitter3": "^3.0.0", + "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", "requires-port": "^1.0.0" } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, "https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", "dev": true }, - "https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "dev": true, - "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "dependencies": { - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -4137,6 +3712,12 @@ "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", "dev": true }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true + }, "import-local": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", @@ -4380,12 +3961,6 @@ "has": "^1.0.1" } }, - "is-running": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-running/-/is-running-2.1.0.tgz", - "integrity": "sha1-MKc/9cw4VOT8JUkICen1q/jeCeA=", - "dev": true - }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -4401,12 +3976,6 @@ "has-symbols": "^1.0.0" } }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -4426,13 +3995,10 @@ "dev": true }, "isbinaryfile": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", - "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", - "dev": true, - "requires": { - "buffer-alloc": "^1.2.0" - } + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.6.tgz", + "integrity": "sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg==", + "dev": true }, "isexe": { "version": "2.0.0", @@ -4446,26 +4012,20 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, "jasmine": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-3.4.0.tgz", - "integrity": "sha512-sR9b4n+fnBFDEd7VS2el2DeHgKcPiMVn44rtKFumq9q7P/t8WrxsVIZPob4UDdgcDNCwyDqwxCt4k9TDRmjPoQ==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-3.6.1.tgz", + "integrity": "sha512-Jqp8P6ZWkTVFGmJwBK46p+kJNrZCdqkQ4GL+PGuBXZwK1fM4ST9BizkYgIwCFqYYqnTizAy6+XG2Ej5dFrej9Q==", "dev": true, "requires": { - "glob": "^7.1.3", - "jasmine-core": "~3.4.0" + "fast-glob": "^2.2.6", + "jasmine-core": "~3.6.0" } }, "jasmine-core": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.4.0.tgz", - "integrity": "sha512-HU/YxV4i6GcmiH4duATwAbJQMlE0MsDIR5XmSVxURxKHn3aGAdbY1/ZJFmVRbKtnLwIxxMJD7gYaPsypcbYimg==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.6.0.tgz", + "integrity": "sha512-8uQYa7zJN8hq9z+g8z1bqCfdC8eoDAeVnM5sfqs7KHv9/ifoJ500m018fpFc7RDaO6SWCLCXwo/wPSNcdYTgcw==", "dev": true }, "js-tokens": { @@ -4474,12 +4034,6 @@ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", "dev": true }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -4492,24 +4046,12 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, "json5": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", @@ -4536,176 +4078,485 @@ "graceful-fs": "^4.1.6" } }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "jszip": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.5.0.tgz", + "integrity": "sha512-WRtu7TPCmYePR1nazfrtuF216cIVon/3GWOvHS9QR5bIwSbnxtdpma6un3jyGGNhHsKCSzn5Ypk+EkDRvTGiFA==", "dev": true, "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" } }, "karma": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/karma/-/karma-4.0.1.tgz", - "integrity": "sha512-ind+4s03BqIXas7ZmraV3/kc5+mnqwCd+VDX1FndS6jxbt03kQKX2vXrWxNLuCjVYmhMwOZosAEKMM0a2q7w7A==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/karma/-/karma-5.2.3.tgz", + "integrity": "sha512-tHdyFADhVVPBorIKCX8A37iLHxc6RBRphkSoQ+MLKdAtFn1k97tD8WUGi1KlEtDZKL3hui0qhsY9HXUfSNDYPQ==", "dev": true, "requires": { - "bluebird": "^3.3.0", - "body-parser": "^1.16.1", - "braces": "^2.3.2", - "chokidar": "^2.0.3", - "colors": "^1.1.0", - "connect": "^3.6.0", - "core-js": "^2.2.0", + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.4.2", + "colors": "^1.4.0", + "connect": "^3.7.0", "di": "^0.0.1", - "dom-serialize": "^2.2.0", - "flatted": "^2.0.0", - "glob": "^7.1.1", - "graceful-fs": "^4.1.2", - "http-proxy": "^1.13.0", - "isbinaryfile": "^3.0.0", - "lodash": "^4.17.11", - "log4js": "^4.0.0", - "mime": "^2.3.1", - "minimatch": "^3.0.2", - "optimist": "^0.6.1", - "qjobs": "^1.1.4", - "range-parser": "^1.2.0", - "rimraf": "^2.6.0", - "safe-buffer": "^5.0.1", - "socket.io": "2.1.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.6", + "graceful-fs": "^4.2.4", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.6", + "lodash": "^4.17.19", + "log4js": "^6.2.1", + "mime": "^2.4.5", + "minimatch": "^3.0.4", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^2.3.0", "source-map": "^0.6.1", - "tmp": "0.0.33", - "useragent": "2.3.0" + "tmp": "0.2.1", + "ua-parser-js": "0.7.22", + "yargs": "^15.3.1" }, "dependencies": { - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "glob": "^7.1.3" + "color-convert": "^2.0.1" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "karma-jasmine": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-2.0.1.tgz", - "integrity": "sha512-iuC0hmr9b+SNn1DaUD2QEYtUxkS1J+bSJSn7ejdEexs7P8EYvA1CWkEdrDQ+8jVH3AgWlCNwjYsT1chjcNW9lA==", - "dev": true, - "requires": { - "jasmine-core": "^3.3" - } - }, - "karma-mocha-reporter": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/karma-mocha-reporter/-/karma-mocha-reporter-2.2.5.tgz", - "integrity": "sha1-FRIAlejtgZGG5HoLAS8810GJVWA=", - "dev": true, - "requires": { - "chalk": "^2.1.0", - "log-symbols": "^2.1.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", "dev": true }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "fill-range": "^7.0.1" } }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "chokidar": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", + "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" } }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" } }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "color-name": "~1.1.4" } - } - } - }, - "karma-sourcemap-loader": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.7.tgz", - "integrity": "sha1-kTIsd/jxPUb+0GKwQuEAnUxFBdg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2" - } - }, - "karma-webpack": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/karma-webpack/-/karma-webpack-3.0.5.tgz", - "integrity": "sha512-nRudGJWstvVuA6Tbju9tyGUfXTtI1UXMXoRHVmM2/78D0q6s/Ye2IC157PKNDC15PWFGR0mVIRtWLAdcfsRJoA==", - "dev": true, - "requires": { - "async": "^2.0.0", - "babel-runtime": "^6.0.0", - "loader-utils": "^1.0.0", - "lodash": "^4.0.0", - "source-map": "^0.5.6", - "webpack-dev-middleware": "^2.0.6" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dev": true, - "requires": { - "readable-stream": "^2.0.5" - } - }, - "lcid": { - "version": "2.0.0", + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "mime": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", + "dev": true + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + }, + "dependencies": { + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + } + } + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "karma-jasmine": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-4.0.1.tgz", + "integrity": "sha512-h8XDAhTiZjJKzfkoO1laMH+zfNlra+dEQHUAjpn5JV1zCPtOIVWGQjLBrqhnzQa/hrU2XrZwSyBa6XjEBzfXzw==", + "dev": true, + "requires": { + "jasmine-core": "^3.6.0" + } + }, + "karma-junit-reporter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/karma-junit-reporter/-/karma-junit-reporter-2.0.1.tgz", + "integrity": "sha512-VtcGfE0JE4OE1wn0LK8xxDKaTP7slN8DO3I+4xg6gAi1IoAHAXOJ1V9G/y45Xg6sxdxPOR3THCFtDlAfBo9Afw==", + "dev": true, + "requires": { + "path-is-absolute": "^1.0.0", + "xmlbuilder": "12.0.0" + } + }, + "karma-mocha-reporter": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/karma-mocha-reporter/-/karma-mocha-reporter-2.2.5.tgz", + "integrity": "sha1-FRIAlejtgZGG5HoLAS8810GJVWA=", + "dev": true, + "requires": { + "chalk": "^2.1.0", + "log-symbols": "^2.1.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "karma-sourcemap-loader": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.7.tgz", + "integrity": "sha1-kTIsd/jxPUb+0GKwQuEAnUxFBdg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2" + } + }, + "karma-webpack": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/karma-webpack/-/karma-webpack-4.0.2.tgz", + "integrity": "sha512-970/okAsdUOmiMOCY8sb17A2I8neS25Ad9uhyK3GHgmRSIFJbDcNEFE8dqqUhNe9OHiCC9k3DMrSmtd/0ymP1A==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "loader-utils": "^1.1.0", + "neo-async": "^2.6.1", + "schema-utils": "^1.0.0", + "source-map": "^0.7.3", + "webpack-dev-middleware": "^3.7.0" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "lcid": { + "version": "2.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", "dev": true, @@ -4713,6 +4564,15 @@ "invert-kv": "^2.0.0" } }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "requires": { + "immediate": "~3.0.5" + } + }, "loader-runner": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", @@ -4763,36 +4623,6 @@ "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, - "lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", - "dev": true - }, - "lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=", - "dev": true - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", - "dev": true - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", - "dev": true - }, - "lodash.union": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", - "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=", - "dev": true - }, "log-symbols": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", @@ -4834,51 +4664,35 @@ } }, "log4js": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.1.1.tgz", - "integrity": "sha512-tSQUF9bBMdcBtuLD6vD7hBM9Ci6Lng/NVHZEq4YbuRGo7ObmLiZuhxz33HKAmJItit74pAjvZgirqYX2LRaoGA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.3.0.tgz", + "integrity": "sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw==", "dev": true, "requires": { - "date-format": "^2.0.0", + "date-format": "^3.0.0", "debug": "^4.1.1", - "flatted": "^2.0.0", - "rfdc": "^1.1.2", - "streamroller": "^1.0.4" + "flatted": "^2.0.1", + "rfdc": "^1.1.4", + "streamroller": "^2.2.4" }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true } } }, - "loglevelnext": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/loglevelnext/-/loglevelnext-1.0.5.tgz", - "integrity": "sha512-V/73qkPuJmx4BcBF19xPBr+0ZRVBhc4POxvZTZdMeXpJ4NItXSJ/MSwuFT0kQJlCbXvdlZoQQ/418bS1y9Jh6A==", - "dev": true, - "requires": { - "es6-symbol": "^3.1.1", - "object.assign": "^4.1.0" - } - }, - "lolex": { - "version": "1.3.2", - "resolved": "http://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", - "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=", - "dev": true - }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -4888,26 +4702,6 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, "make-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", @@ -4997,6 +4791,12 @@ "readable-stream": "^2.0.1" } }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", @@ -5029,24 +4829,24 @@ } }, "mime": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.2.tgz", - "integrity": "sha512-zJBfZDkwRu+j3Pdd2aHsR5GfH2jIWhmL1ZzBoc+X+3JEti2hbArWcyJ+1laC1D2/U/W1a/+Cegj0/OnEU2ybjg==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", "dev": true }, "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", "dev": true }, "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", "dev": true, "requires": { - "mime-db": "1.40.0" + "mime-db": "1.44.0" } }, "mimic-fn": { @@ -5188,12 +4988,6 @@ "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", "dev": true }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -5309,12 +5103,6 @@ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -5379,18 +5167,6 @@ "isobject": "^3.0.0" } }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, "object.entries": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", @@ -5440,16 +5216,6 @@ "wrappy": "1" } }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - } - }, "os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", @@ -5653,12 +5419,6 @@ "sha.js": "^2.4.8" } }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, "picomatch": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.0.7.tgz", @@ -5716,68 +5476,6 @@ "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", "dev": true }, - "ps-tree": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.1.1.tgz", - "integrity": "sha512-kef7fYYSKVqQffmzTMsVcUD1ObNJMp8sNSmHGlGKsZQyL/ht9MZKk86u0Rd1NhpTOAuhqwKCLLpktwkqz+MF8A==", - "dev": true, - "requires": { - "event-stream": "=3.3.4" - }, - "dependencies": { - "event-stream": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", - "dev": true, - "requires": { - "duplexer": "~0.1.1", - "from": "~0", - "map-stream": "~0.1.0", - "pause-stream": "0.0.11", - "split": "0.3", - "stream-combiner": "~0.0.4", - "through": "~2.3.1" - } - }, - "map-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", - "dev": true - }, - "split": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", - "dev": true, - "requires": { - "through": "2" - } - }, - "stream-combiner": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", - "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", - "dev": true, - "requires": { - "duplexer": "~0.1.1" - } - } - } - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "psl": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz", - "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==", - "dev": true - }, "public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", @@ -5837,12 +5535,6 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, "qjobs": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", @@ -5887,9 +5579,9 @@ } }, "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true }, "raw-body": { @@ -6023,42 +5715,6 @@ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - } - } - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -6124,9 +5780,9 @@ "dev": true }, "rfdc": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.2.tgz", - "integrity": "sha512-92ktAgvZhBzYTIK0Mja9uen5q5J3NRVMoDkJL2VMwq6SXjVCgqvQeVP2XAaUY6HT+XpQYeLSjb3UoitBryKmdA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", + "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==", "dev": true }, "rimraf": { @@ -6178,11 +5834,54 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, - "samsam": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz", - "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=", - "dev": true + "sauce-connect-launcher": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/sauce-connect-launcher/-/sauce-connect-launcher-1.3.2.tgz", + "integrity": "sha512-wf0coUlidJ7rmeClgVVBh6Kw55/yalZCY/Un5RgjSnTXRAeGqagnTsTYpZaqC4dCtrY4myuYpOAZXCdbO7lHfQ==", + "dev": true, + "requires": { + "adm-zip": "~0.4.3", + "async": "^2.1.2", + "https-proxy-agent": "^5.0.0", + "lodash": "^4.16.6", + "rimraf": "^2.5.4" + }, + "dependencies": { + "agent-base": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.1.tgz", + "integrity": "sha512-01q25QQDwLSsyfhrKbn8yuur+JNw0H+0Y4JiGIKd3z9aYk/w/2kxD/Upc+t2ZBBSUNff50VjPsSW2YxM8QYKVg==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } }, "schema-utils": { "version": "1.0.0", @@ -6195,6 +5894,37 @@ "ajv-keywords": "^3.1.0" } }, + "selenium-webdriver": { + "version": "4.0.0-alpha.7", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.0.0-alpha.7.tgz", + "integrity": "sha512-D4qnTsyTr91jT8f7MfN+OwY0IlU5+5FmlO5xlgRUV6hDEV8JyYx2NerdTEqDDkNq7RZDYc4VoPALk8l578RBHw==", + "dev": true, + "requires": { + "jszip": "^3.2.2", + "rimraf": "^2.7.1", + "tmp": "0.0.30" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "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.1" + } + } + } + }, "semver": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", @@ -6213,6 +5943,12 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, "set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", @@ -6258,6 +5994,15 @@ "safe-buffer": "^5.0.1" } }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -6279,18 +6024,6 @@ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, - "sinon": { - "version": "1.17.7", - "resolved": "http://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", - "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=", - "dev": true, - "requires": { - "formatio": "1.1.1", - "lolex": "1.3.2", - "samsam": "1.1.2", - "util": ">=0.10.3 <1" - } - }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -6399,58 +6132,70 @@ } }, "socket.io": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", - "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.3.0.tgz", + "integrity": "sha512-2A892lrj0GcgR/9Qk81EaY2gYhCBxurV0PfmmESO6p27QPrUK1J3zdns+5QPqvUYK2q657nSj0guoIil9+7eFg==", "dev": true, "requires": { - "debug": "~3.1.0", - "engine.io": "~3.2.0", + "debug": "~4.1.0", + "engine.io": "~3.4.0", "has-binary2": "~1.0.2", "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.1.1", - "socket.io-parser": "~3.2.0" + "socket.io-client": "2.3.0", + "socket.io-parser": "~3.4.0" }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true } } }, "socket.io-adapter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", - "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", + "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", "dev": true }, "socket.io-client": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", - "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.0.tgz", + "integrity": "sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==", "dev": true, "requires": { "backo2": "1.0.2", "base64-arraybuffer": "0.1.5", "component-bind": "1.0.0", "component-emitter": "1.2.1", - "debug": "~3.1.0", - "engine.io-client": "~3.2.0", + "debug": "~4.1.0", + "engine.io-client": "~3.4.0", "has-binary2": "~1.0.2", "has-cors": "1.1.0", "indexof": "0.0.1", "object-component": "0.0.3", "parseqs": "0.0.5", "parseuri": "0.0.5", - "socket.io-parser": "~3.2.0", + "socket.io-parser": "~3.3.0", "to-array": "0.1.4" }, "dependencies": { + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true + }, "component-emitter": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", @@ -6458,24 +6203,70 @@ "dev": true }, "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "socket.io-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.1.tgz", + "integrity": "sha512-1QLvVAe8dTz+mKmZ07Swxt+LAo4Y1ff50rlyoEx00TQmDFVQYPfcqGvIDJLGaBdhdNCecXtyKpD+EgKGcmmbuQ==", + "dev": true, + "requires": { + "component-emitter": "~1.3.0", + "debug": "~3.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } } } }, "socket.io-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", - "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", + "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", "dev": true, "requires": { "component-emitter": "1.2.1", - "debug": "~3.1.0", + "debug": "~4.1.0", "isarray": "2.0.1" }, "dependencies": { @@ -6486,12 +6277,12 @@ "dev": true }, "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "isarray": { @@ -6499,6 +6290,12 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true } } }, @@ -6568,23 +6365,6 @@ "extend-shallow": "^3.0.0" } }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, "ssri": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", @@ -6670,31 +6450,35 @@ "dev": true }, "streamroller": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.4.tgz", - "integrity": "sha512-Wc2Gm5ygjSX8ZpW9J7Y9FwiSzTlKSvcl0FTTMd3rn7RoxDXpBW+xD9TY5sWL2n0UR61COB0LG1BQvN6nTUQbLQ==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.4.tgz", + "integrity": "sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ==", "dev": true, "requires": { - "async": "^2.6.1", - "date-format": "^2.0.0", - "debug": "^3.1.0", - "fs-extra": "^7.0.0", - "lodash": "^4.17.10" + "date-format": "^2.1.0", + "debug": "^4.1.1", + "fs-extra": "^8.1.0" }, "dependencies": { + "date-format": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", + "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", + "dev": true + }, "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true } } @@ -6762,47 +6546,6 @@ "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", "dev": true }, - "tar-stream": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.0.tgz", - "integrity": "sha512-+DAn4Nb4+gz6WZigRzKEZl1QuJVOLtAwwF+WUxy1fJ6X63CaGaUAxJRD2KEn1OMfcbCjySTYpNC6WmfQoIEOdw==", - "dev": true, - "requires": { - "bl": "^3.0.0", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "temp-fs": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/temp-fs/-/temp-fs-0.9.9.tgz", - "integrity": "sha1-gHFzBDeHByDpQxUy/igUNk+IA9c=", - "dev": true, - "requires": { - "rimraf": "~2.5.2" - } - }, "terser": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/terser/-/terser-4.1.3.tgz", @@ -6872,12 +6615,23 @@ } }, "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", "dev": true, "requires": { - "os-tmpdir": "~1.0.2" + "rimraf": "^3.0.0" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, "to-array": { @@ -6946,24 +6700,6 @@ "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", "dev": true }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", @@ -7097,21 +6833,6 @@ "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -7139,10 +6860,10 @@ "integrity": "sha512-64HkdiRv1yYZsSe4xC1WVgamNigVYjlssIoaH2HcZF0+ijsk5YK2g0G34w9wJkze8+5ow4STd22AynfO6ZYYLw==", "dev": true }, - "ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "ua-parser-js": { + "version": "0.7.22", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.22.tgz", + "integrity": "sha512-YUxzMjJ5T71w6a8WWVcMGM6YWOTX27rCoIQgLXiWaxqXSx9D7DNjiGWn1aJIRSQ5qr0xuhra77bSIh6voR/46Q==", "dev": true }, "union-value": { @@ -7266,37 +6987,12 @@ } } }, - "url-join": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-2.0.5.tgz", - "integrity": "sha1-WvIvGMBSoACkjXuCxenC4v7tpyg=", - "dev": true - }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true }, - "useragent": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", - "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==", - "dev": true, - "requires": { - "lru-cache": "4.1.x", - "tmp": "0.0.x" - } - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -7320,9 +7016,9 @@ "dev": true }, "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "dev": true }, "v8-compile-cache": { @@ -7331,23 +7027,6 @@ "integrity": "sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw==", "dev": true }, - "vargs": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/vargs/-/vargs-0.1.0.tgz", - "integrity": "sha1-a2GE2mUgzDIEzhtAfKwm2SYJ6/8=", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, "vm-browserify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", @@ -7371,21 +7050,6 @@ "neo-async": "^2.5.0" } }, - "wd": { - "version": "1.11.4", - "resolved": "https://registry.npmjs.org/wd/-/wd-1.11.4.tgz", - "integrity": "sha512-FHL+ofdCoU2FGvDFser8rXI4GFwwcyAaUuvddtdctig2X0zVVT6p7FAXf7nS0z7wTwXtEuZXX7MrnVTvFPqJTQ==", - "dev": true, - "requires": { - "archiver": "^3.0.0", - "async": "^2.0.0", - "lodash": "^4.0.0", - "mkdirp": "^0.5.1", - "q": "^1.5.1", - "request": "2.88.0", - "vargs": "^0.1.0" - } - }, "webpack": { "version": "4.39.1", "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.39.1.tgz", @@ -7482,61 +7146,26 @@ } }, "webpack-dev-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-2.0.6.tgz", - "integrity": "sha512-tj5LLD9r4tDuRIDa5Mu9lnY2qBBehAITv6A9irqXhw/HQquZgTx3BCd57zYbU2gMDnncA49ufK2qVQSbaKJwOw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", + "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", "dev": true, "requires": { - "loud-rejection": "^1.6.0", - "memory-fs": "~0.4.1", - "mime": "^2.1.0", - "path-is-absolute": "^1.0.0", - "range-parser": "^1.0.3", - "url-join": "^2.0.2", - "webpack-log": "^1.0.1" + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" } }, "webpack-log": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-1.2.0.tgz", - "integrity": "sha512-U9AnICnu50HXtiqiDxuli5gLB5PGBo7VvcHx36jRZHwK4vzOYLbImqT4lwWwoMHdQWwEKw736fCHEekokTEKHA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", "dev": true, "requires": { - "chalk": "^2.1.0", - "log-symbols": "^2.1.0", - "loglevelnext": "^1.0.1", - "uuid": "^3.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" } }, "webpack-sources": { @@ -7572,12 +7201,6 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - }, "worker-farm": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", @@ -7626,15 +7249,16 @@ "dev": true }, "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" - } + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", + "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==", + "dev": true + }, + "xmlbuilder": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-12.0.0.tgz", + "integrity": "sha512-lMo8DJ8u6JRWp0/Y4XLa/atVDr75H9litKlb2E5j3V3MesoL50EBgZDWoLT3F/LztVnG67GjPXLZpqcky/UMnQ==", + "dev": true }, "xmlhttprequest-ssl": { "version": "1.5.5", @@ -7654,12 +7278,6 @@ "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, "yargs": { "version": "12.0.5", "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", @@ -7701,36 +7319,6 @@ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.0.tgz", "integrity": "sha512-kKfnnYkbTfrAdd0xICNFw7Atm8nKpLcLv9AZGEt+kczL/WQVai4e2V6ZN8U/O+iI6WrNuJjNNOyu4zfhl9D3Hg==", "dev": true - }, - "zip-stream": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-2.1.2.tgz", - "integrity": "sha512-ykebHGa2+uzth/R4HZLkZh3XFJzivhVsjJt8bN3GvBzLaqqrUdRacu+c4QtnUgjkkQfsOuNE1JgLKMCPNmkKgg==", - "dev": true, - "requires": { - "archiver-utils": "^2.1.0", - "compress-commons": "^2.1.1", - "readable-stream": "^3.4.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } } } } diff --git a/integration_test/package.json b/integration_test/package.json index b72b3097..9b8f0934 100644 --- a/integration_test/package.json +++ b/integration_test/package.json @@ -9,13 +9,12 @@ "build:ts": "cd ts && rm -rf build && webpack-cli", "build:dev": "cd ts && rm -rf build && webpack-cli --watch", "build:node": "cd ts && rm -rf build-node && (cd node-src && tsc) && (cp -R _proto build-node/integration_test/ts)", - "build": "npm run build:proto && npm run build:ts && npm run build:node", + "build": "npm run build:proto && npm run build:ts && npm run build:node && npm run build:testserver", + "start:ci": "./test-ci.sh", "start": "./test.sh", - "test:browser": "./run-with-testserver.sh karma start ./karma.conf.ts --single-run", + "test:browsers": "./run-with-tunnel.sh ./run-with-testserver.sh karma start ./karma.conf.ts --single-run", "test:node": "./run-with-testserver.sh jasmine ts/build-node/integration_test/ts/node-src/node.spec.js", - "test:dev": "npm run build && ./run-with-testserver.sh karma start ./karma.conf.ts", - "test:karma-single-run": "karma start ./karma.conf.ts --single-run", - "test:karma-dev": "karma start ./karma.conf.ts" + "test:dev": "npm run build && ./run-with-testserver.sh karma start ./karma.conf.ts" }, "license": "none", "dependencies": { @@ -36,22 +35,23 @@ "assert": "^2.0.0", "babel-loader": "^8.0.5", "babel-preset-env": "^1.7.0", - "browserstack-local": "^1.3.4", "chai": "^4.1.2", "colors": "^1.2.3", - "jasmine": "^3.1.0", - "jasmine-core": "^3.1.0", - "karma": "4.0.1", - "karma-jasmine": "^2.0.1", - "karma-mocha-reporter": "^2.2.5", + "jasmine": "3.6.1", + "jasmine-core": "3.6.0", + "karma": "5.2.3", + "karma-jasmine": "4.0.1", + "karma-junit-reporter": "2.0.1", + "karma-mocha-reporter": "2.2.5", "karma-sourcemap-loader": "^0.3.7", - "karma-webpack": "^3.0.0", + "karma-webpack": "4.0.2", "lodash": "^4.17.10", + "sauce-connect-launcher": "^1.3.2", + "selenium-webdriver": "^4.0.0-alpha.7", "ts-loader": "^6.0.1", "ts-node": "^8.0.2", "ts-protoc-gen": "0.10.0", "typescript": "3.5.1", - "wd": "^1.11.4", "webpack": "^4.6.0", "webpack-cli": "^3.1.0" } diff --git a/integration_test/run-with-testserver.sh b/integration_test/run-with-testserver.sh index 30ccbf75..4f7183c6 100755 --- a/integration_test/run-with-testserver.sh +++ b/integration_test/run-with-testserver.sh @@ -2,19 +2,15 @@ set -e set -x -if [ "$GLOBAL_TESTSERVER" = true ] ; then - echo "Not starting testserver as GLOBAL_TESTSERVER is set" -else - function killGoTestServer { - echo "Killing testserver..." - killall testserver - } +function killGoTestServer { + echo "Killing testserver..." + killall testserver +} - ./start-testserver.sh +./start-testserver.sh - # Kill the Go Test server when this script exits or is interrupted. - trap killGoTestServer SIGINT - trap killGoTestServer EXIT -fi +# Kill the Go Test server when this script exits or is interrupted. +trap killGoTestServer SIGINT +trap killGoTestServer EXIT $@ diff --git a/integration_test/run-with-tunnel.sh b/integration_test/run-with-tunnel.sh new file mode 100755 index 00000000..82bdffc4 --- /dev/null +++ b/integration_test/run-with-tunnel.sh @@ -0,0 +1,115 @@ +#!/usr/bin/env bash +set -e +set -x + +cd "$(dirname "$0")" + +mkdir -p sauce-connect-proxy +pushd sauce-connect-proxy + +wait_file() { + local file="$1"; shift + local wait_seconds="${1:-10}"; shift + until test $((wait_seconds--)) -eq 0 -o -e "$file" ; do sleep 1; done + ((++wait_seconds)) +} + +BASE_SAUCELABS_TUNNEL_ID=$(openssl rand -base64 12) +export SAUCELABS_TUNNEL_ID_NO_SSL_BUMP="$BASE_SAUCELABS_TUNNEL_ID-no-ssl-bump" +export SAUCELABS_TUNNEL_ID_WITH_SSL_BUMP="$BASE_SAUCELABS_TUNNEL_ID-with-ssl-bump" + +SAUCELABS_READY_FILE_NO_SSL_BUMP=./sauce-connect-readyfile-no-ssl-bump +SAUCELABS_READY_FILE_WITH_SSL_BUMP=./sauce-connect-readyfile-with-ssl-bump +# Clear the ready files in case they already exist +rm -f $SAUCELABS_READY_FILE_WITH_SSL_BUMP $SAUCELABS_READY_FILE_NO_SSL_BUMP + +if [[ "$OSTYPE" == "linux-gnu"* ]]; then + SAUCELABS_TUNNEL_PATH=./sc-4.6.3-linux/bin/sc + if [[ ! -f "$SAUCELABS_TUNNEL_PATH" ]]; then + wget https://saucelabs.com/downloads/sc-4.6.3-linux.tar.gz + tar -xzvf ./sc-4.6.3-linux.tar.gz + fi +elif [[ "$OSTYPE" == "darwin"* ]]; then + SAUCELABS_TUNNEL_PATH=./sc-4.6.3-osx/bin/sc + if [[ ! -f "$SAUCELABS_TUNNEL_PATH" ]]; then + wget https://saucelabs.com/downloads/sc-4.6.3-osx.zip + unzip ./sc-4.6.3-osx.zip + fi +else + echo "Unsupported platform" +fi + +if [[ -z "${SC_SSL_BUMPING}" ]]; then + $SAUCELABS_TUNNEL_PATH \ + -u $SAUCELABS_USERNAME \ + -k $SAUCELABS_ACCESS_KEY \ + --logfile ./saucelabs-no-ssl-bump-logs \ + --pidfile ./saucelabs-no-ssl-bump-pid \ + --no-ssl-bump-domains testhost,corshost \ + --tunnel-identifier $SAUCELABS_TUNNEL_ID_NO_SSL_BUMP \ + --readyfile $SAUCELABS_READY_FILE_NO_SSL_BUMP \ + -x https://saucelabs.com/rest/v1 & + SAUCELABS_PROCESS_ID_NO_SSL_BUMP=$! + echo "SAUCELABS_PROCESS_ID_NO_SSL_BUMP:" + echo $SAUCELABS_PROCESS_ID_NO_SSL_BUMP +fi + +if [[ ! -z "${SC_SSL_BUMPING}" ]]; then + $SAUCELABS_TUNNEL_PATH \ + -u $SAUCELABS_USERNAME \ + -k $SAUCELABS_ACCESS_KEY \ + --logfile ./saucelabs-with-ssl-bump-logs \ + --pidfile ./saucelabs-with-ssl-bump-pid \ + --tunnel-identifier $SAUCELABS_TUNNEL_ID_WITH_SSL_BUMP \ + --readyfile $SAUCELABS_READY_FILE_WITH_SSL_BUMP \ + -x https://saucelabs.com/rest/v1 & + SAUCELABS_PROCESS_ID_WITH_SSL_BUMP=$! + echo "SAUCELABS_PROCESS_ID_WITH_SSL_BUMP:" + echo $SAUCELABS_PROCESS_ID_WITH_SSL_BUMP +fi + +function killTunnels { + echo "Killing Sauce Labs Tunnels..." + if [[ -z "${SC_SSL_BUMPING}" ]]; then + kill $SAUCELABS_PROCESS_ID_NO_SSL_BUMP + fi + if [[ ! -z "${SC_SSL_BUMPING}" ]]; then + kill $SAUCELABS_PROCESS_ID_WITH_SSL_BUMP + fi +} + +trap killTunnels SIGINT +trap killTunnels EXIT + +# Wait for tunnels to indicate ready status +if [[ -z "${SC_SSL_BUMPING}" ]]; then + wait_file "$SAUCELABS_READY_FILE_NO_SSL_BUMP" 60 || { + echo "Timed out waiting for sauce labs tunnel (with ssl bump)" + kill $SAUCELABS_PROCESS_ID_NO_SSL_BUMP + exit 1 + } + echo "SAUCELABS_TUNNEL_ID_NO_SSL_BUMP: $SAUCELABS_TUNNEL_ID_NO_SSL_BUMP" +fi + +if [[ ! -z "${SC_SSL_BUMPING}" ]]; then + wait_file "$SAUCELABS_READY_FILE_WITH_SSL_BUMP" 60 || { + echo "Timed out waiting for sauce labs tunnel (no ssl bump)" + kill $SAUCELABS_PROCESS_ID_WITH_SSL_BUMP + exit 1 + } + echo "SAUCELABS_TUNNEL_ID_WITH_SSL_BUMP: $SAUCELABS_TUNNEL_ID_WITH_SSL_BUMP" +fi + +popd + +# Run the specified commands +$@ + +# Output the logs from the Sauce Connect proxy +cd "$(dirname "$0")" +pushd sauce-connect-proxy +echo "Printing SauceConnect no-ssl bump logs:" +cat ./saucelabs-no-ssl-bump-logs || true +echo "Printing SauceConnect with-ssl bump logs:" +cat ./saucelabs-with-ssl-bump-logs || true +popd diff --git a/integration_test/start-testserver.sh b/integration_test/start-testserver.sh index 14347393..f7d67b6b 100755 --- a/integration_test/start-testserver.sh +++ b/integration_test/start-testserver.sh @@ -4,6 +4,11 @@ set -x cd "$(dirname "$0")" -go build -o ./go/build/testserver ./go/testserver/testserver.go +if [ -z "$PREBUILT_INTEGRATION_TESTS" ]; then + echo "Building integration test server" + go build -o ./go/build/testserver ./go/testserver/testserver.go +else + echo "Skipping test server build because PREBUILT_INTEGRATION_TESTS is set" +fi ./go/build/testserver --tls_cert_file=../misc/localhost.crt --tls_key_file=../misc/localhost.key & diff --git a/integration_test/test-ci.sh b/integration_test/test-ci.sh new file mode 100755 index 00000000..960c9ffa --- /dev/null +++ b/integration_test/test-ci.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash +set -e +set -x + +COMMAND="npm run test:browsers" +if [ "$BROWSER" == "nodejs" ]; then + COMMAND="npm run test:node" +fi + +# Avoid rebuilding the go test server +export PREBUILT_INTEGRATION_TESTS=1 + +# Run the integration tests with timestamped output +${COMMAND} | ts -s %.s diff --git a/integration_test/test.sh b/integration_test/test.sh index 1036d136..8b2d8a50 100755 --- a/integration_test/test.sh +++ b/integration_test/test.sh @@ -2,44 +2,6 @@ set -e set +o pipefail -MAX_AUTO_RETRY=5 - npm run build - -if [ -z "$BROWSER" ]; then - echo "No Browser specified, starting local test run" - npm run test:node - npm run test:browser - exit 0 -fi - -if [ "$BROWSER" == "nodejs" ]; then - npm run test:node - exit 0 -fi - -# inspired by https://unix.stackexchange.com/a/82602 -retry () { - local n=0 - - until [ $n -ge $MAX_AUTO_RETRY ]; do - set +e - "$@" && break - set -e - - n=$[$n+1] - echo '' - echo "Attempt ${n} of ${MAX_AUTO_RETRY} failed, trying again ..." - echo '' - done - - if [ $n -eq $MAX_AUTO_RETRY ]; then - echo "Giving up after ${MAX_AUTO_RETRY} retries" - exit 1 - fi -} - -# Note that browser tests in CI are very flaky, hence the need for the retry wrapper. -retry npm run test:browser - -exit 0 +npm run test:node +npm run test:browsers diff --git a/integration_test/ts/node-src/node.spec.ts b/integration_test/ts/node-src/node.spec.ts index 403d24db..e1b6ed22 100644 --- a/integration_test/ts/node-src/node.spec.ts +++ b/integration_test/ts/node-src/node.spec.ts @@ -1,10 +1,8 @@ // Allow Node to accept the self-signed certificate process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; // Disable the CORS-related tests as they don't apply for Node environments (no origin) -process.env.DISABLE_CORS_TESTS = "true"; +(global as any).DISABLE_CORS_TESTS = true; // Disable the WebSocket-based tests as they don't apply for Node environments -process.env.DISABLE_WEBSOCKET_TESTS = "true"; -// Although this will be set by Travis CI; it won't be set locally. -process.env.BROWSER = "nodejs"; +(global as any).DISABLE_WEBSOCKET_TESTS = true; import "../src/spec"; diff --git a/integration_test/ts/src/ChunkParser.spec.ts b/integration_test/ts/src/ChunkParser.spec.ts index bb21e96e..5bae97dd 100644 --- a/integration_test/ts/src/ChunkParser.spec.ts +++ b/integration_test/ts/src/ChunkParser.spec.ts @@ -1,8 +1,7 @@ import { assert } from "chai"; import { decodeASCII, encodeASCII } from "../../../client/grpc-web/src/ChunkParser"; -import { conditionallyRunTestSuite, SuiteEnum } from "../suiteUtils"; -conditionallyRunTestSuite(SuiteEnum.ChunkParser, () => { +describe("ChunkParser", () => { describe("decodeASCII", () => { it("should allow valid HTTP headers around", () => { assert.equal(decodeASCII(new Uint8Array([ diff --git a/integration_test/ts/src/cancellation.spec.ts b/integration_test/ts/src/cancellation.spec.ts index 9a00df12..bec99aa9 100644 --- a/integration_test/ts/src/cancellation.spec.ts +++ b/integration_test/ts/src/cancellation.spec.ts @@ -15,138 +15,128 @@ import { import {TestService, TestUtilService} from "../_proto/improbable/grpcweb/test/test_pb_service"; import {DEBUG, continueStream} from "./util"; import { runWithHttp1AndHttp2 } from "./testRpcCombinations"; -import { conditionallyRunTestSuite, SuiteEnum } from "../suiteUtils"; -if (process.env.DISABLE_ABORT_TESTS) { - console.log(`Skipping "cancellation" suite as "DISABLE_ABORT_TESTS" is set`); - describe("skipping abort", () => { - it("should skip abort tests", (done) => { - done(); - }); - }); -} else { - conditionallyRunTestSuite(SuiteEnum.cancellation, () => { - runWithHttp1AndHttp2(({testHostUrl}) => { - it("should allow the caller to abort an rpc before it completes", () => { - let transportCancelFuncInvoked = false; - - const cancellationSpyTransport = () => { - return { - sendMessage: () => { - }, - finishSend() { - }, - start: () => { - }, - cancel: () => { - transportCancelFuncInvoked = true; - }, - } - }; +describe("Cancellation", () => { + runWithHttp1AndHttp2(({testHostUrl}) => { + it("should allow the caller to abort an rpc before it completes", () => { + let transportCancelFuncInvoked = false; - const ping = new PingRequest(); - ping.setValue("hello world"); - - const reqObj = grpc.invoke(TestService.Ping, { - debug: DEBUG, - request: ping, - host: testHostUrl, - transport: cancellationSpyTransport, - onEnd: (status: grpc.Code, statusMessage: string, trailers: grpc.Metadata) => { + const cancellationSpyTransport = () => { + return { + sendMessage: () => { + }, + finishSend() { + }, + start: () => { }, - }); + cancel: () => { + transportCancelFuncInvoked = true; + }, + } + }; + + const ping = new PingRequest(); + ping.setValue("hello world"); + + const reqObj = grpc.invoke(TestService.Ping, { + debug: DEBUG, + request: ping, + host: testHostUrl, + transport: cancellationSpyTransport, + onEnd: (status: grpc.Code, statusMessage: string, trailers: grpc.Metadata) => { + }, + }); - reqObj.close(); + reqObj.close(); - assert.equal(transportCancelFuncInvoked, true, "transport's cancel func must be invoked"); - }); + assert.equal(transportCancelFuncInvoked, true, "transport's cancel func must be invoked"); + }); - it("should handle aborting a streaming response mid-stream with propagation of the disconnection to the server", (done) => { - let onMessageId = 0; + it("should handle aborting a streaming response mid-stream with propagation of the disconnection to the server", (done) => { + let onMessageId = 0; - const streamIdentifier = `rpc-${Math.random()}`; + const streamIdentifier = `rpc-${Math.random()}`; - const ping = new PingRequest(); - ping.setValue("hello world"); - ping.setResponseCount(100); // Request more messages than the client will accept before cancelling - ping.setStreamIdentifier(streamIdentifier); + const ping = new PingRequest(); + ping.setValue("hello world"); + ping.setResponseCount(100); // Request more messages than the client will accept before cancelling + ping.setStreamIdentifier(streamIdentifier); - let reqObj: grpc.Request; + let reqObj: grpc.Request; - // Checks are performed every 1s = 15s total wait - const maxAbortChecks = 15; + // Checks are performed every 1s = 15s total wait + const maxAbortChecks = 15; - const numMessagesBeforeAbort = 5; + const numMessagesBeforeAbort = 5; - const doAbort = () => { - DEBUG && debug("doAbort"); - reqObj.close(); + const doAbort = () => { + DEBUG && debug("doAbort"); + reqObj.close(); - // To ensure that the transport is successfully closing the connection, poll the server every 1s until - // it confirms the connection was closed. Connection closure is immediate in some browser/transport combinations, - // but can take several seconds in others. - function checkAbort(attempt: number) { - DEBUG && debug("checkAbort", attempt); - continueStream(testHostUrl, streamIdentifier, (status) => { - DEBUG && debug("checkAbort.continueStream.status", status); - - const checkStreamClosedRequest = new CheckStreamClosedRequest(); - checkStreamClosedRequest.setStreamIdentifier(streamIdentifier); - grpc.unary(TestUtilService.CheckStreamClosed, { - debug: DEBUG, - request: checkStreamClosedRequest, - host: testHostUrl, - onEnd: ({message}) => { - const closed = ( message as CheckStreamClosedResponse ).getClosed(); - DEBUG && debug("closed", closed); - if (closed) { + // To ensure that the transport is successfully closing the connection, poll the server every 1s until + // it confirms the connection was closed. Connection closure is immediate in some browser/transport combinations, + // but can take several seconds in others. + function checkAbort(attempt: number) { + DEBUG && debug("checkAbort", attempt); + continueStream(testHostUrl, streamIdentifier, (status) => { + DEBUG && debug("checkAbort.continueStream.status", status); + + const checkStreamClosedRequest = new CheckStreamClosedRequest(); + checkStreamClosedRequest.setStreamIdentifier(streamIdentifier); + grpc.unary(TestUtilService.CheckStreamClosed, { + debug: DEBUG, + request: checkStreamClosedRequest, + host: testHostUrl, + onEnd: ({message}) => { + const closed = ( message as CheckStreamClosedResponse ).getClosed(); + DEBUG && debug("closed", closed); + if (closed) { + done(); + } else { + if (attempt >= maxAbortChecks) { + assert.ok(closed, `server did not observe connection closure within ${maxAbortChecks} seconds`); done(); } else { - if (attempt >= maxAbortChecks) { - assert.ok(closed, `server did not observe connection closure within ${maxAbortChecks} seconds`); - done(); - } else { - setTimeout(() => { - checkAbort(attempt + 1); - }, 1000); - } + setTimeout(() => { + checkAbort(attempt + 1); + }, 1000); } - }, - }) + } + }, + }) + }); + } + + checkAbort(0); + }; + + reqObj = grpc.invoke(TestService.PingList, { + debug: DEBUG, + request: ping, + host: testHostUrl, + onHeaders: (headers: grpc.Metadata) => { + DEBUG && debug("headers", headers); + }, + onMessage: (message: PingResponse) => { + assert.ok(message instanceof PingResponse); + DEBUG && debug("onMessage.message.getCounter()", message.getCounter()); + assert.strictEqual(message.getCounter(), onMessageId++); + if (message.getCounter() === numMessagesBeforeAbort) { + // Abort after receiving numMessagesBeforeAbort messages + doAbort(); + } else if (message.getCounter() < numMessagesBeforeAbort) { + // Only request the next message if not yet aborted + continueStream(testHostUrl, streamIdentifier, (status) => { + DEBUG && debug("onMessage.continueStream.status", status); }); } - - checkAbort(0); - }; - - reqObj = grpc.invoke(TestService.PingList, { - debug: DEBUG, - request: ping, - host: testHostUrl, - onHeaders: (headers: grpc.Metadata) => { - DEBUG && debug("headers", headers); - }, - onMessage: (message: PingResponse) => { - assert.ok(message instanceof PingResponse); - DEBUG && debug("onMessage.message.getCounter()", message.getCounter()); - assert.strictEqual(message.getCounter(), onMessageId++); - if (message.getCounter() === numMessagesBeforeAbort) { - // Abort after receiving numMessagesBeforeAbort messages - doAbort(); - } else if (message.getCounter() < numMessagesBeforeAbort) { - // Only request the next message if not yet aborted - continueStream(testHostUrl, streamIdentifier, (status) => { - DEBUG && debug("onMessage.continueStream.status", status); - }); - } - }, - onEnd: (status: grpc.Code, statusMessage: string, trailers: grpc.Metadata) => { - DEBUG && debug("status", status, "statusMessage", statusMessage, "trailers", trailers); - // onEnd shouldn't be called if abort is called prior to the response ending - assert.fail(); - } - }); - }, 20000); - }); + }, + onEnd: (status: grpc.Code, statusMessage: string, trailers: grpc.Metadata) => { + DEBUG && debug("status", status, "statusMessage", statusMessage, "trailers", trailers); + // onEnd shouldn't be called if abort is called prior to the response ending + assert.fail(); + } + }); + }, 20000); }); -} \ No newline at end of file +}); \ No newline at end of file diff --git a/integration_test/ts/src/client.spec.ts b/integration_test/ts/src/client.spec.ts index 4ed8af8f..db1a38cc 100644 --- a/integration_test/ts/src/client.spec.ts +++ b/integration_test/ts/src/client.spec.ts @@ -7,13 +7,12 @@ import { assert } from "chai"; import { Empty, } from "google-protobuf/google/protobuf/empty_pb"; import { PingRequest, PingResponse, } from "../_proto/improbable/grpcweb/test/test_pb"; import { FailService, TestService } from "../_proto/improbable/grpcweb/test/test_pb_service"; -import { continueStream, DEBUG, UncaughtExceptionListener } from "./util"; +import { continueStream, DEBUG, UncaughtExceptionListener, DISABLE_CORS_TESTS } from "./util"; import { headerTrailerCombos, runWithHttp1AndHttp2, runWithSupportedTransports } from "./testRpcCombinations"; -import { conditionallyRunTestSuite, SuiteEnum } from "../suiteUtils"; -conditionallyRunTestSuite(SuiteEnum.client, () => { +describe("Client", () => { runWithHttp1AndHttp2(({ testHostUrl, corsHostUrl, unavailableHost, emptyHost }) => { runWithSupportedTransports(transport => { it(`should throw an error if close is called before start`, () => { @@ -185,7 +184,7 @@ conditionallyRunTestSuite(SuiteEnum.client, () => { const ping = new PingRequest(); ping.setValue("hello world"); - ping.setResponseCount(3000); + ping.setResponseCount(300); ping.setSendHeaders(withHeaders); ping.setSendTrailers(withTrailers); @@ -215,7 +214,7 @@ conditionallyRunTestSuite(SuiteEnum.client, () => { assert.deepEqual(trailers.get("TrailerTestKey2"), ["ServerValue2"]); } assert.ok(didGetOnHeaders); - assert.strictEqual(onMessageId, 3000); + assert.strictEqual(onMessageId, 300); done(); }); client.start(); @@ -395,7 +394,7 @@ conditionallyRunTestSuite(SuiteEnum.client, () => { }); }); - if (!process.env.DISABLE_CORS_TESTS) { + if (!DISABLE_CORS_TESTS) { it(`should report failure for a CORS failure`, (done) => { let didGetOnHeaders = false; let didGetOnMessage = false; @@ -529,7 +528,7 @@ conditionallyRunTestSuite(SuiteEnum.client, () => { assert.include(exceptionsCaught[1], "onMessage exception"); assert.include(exceptionsCaught[2], "onEnd exception"); done(); - }, 100); + }, 1000); throw new Error("onEnd exception"); }); client.start(); diff --git a/integration_test/ts/src/client.websocket.spec.ts b/integration_test/ts/src/client.websocket.spec.ts index 0c02bf55..3475b7be 100644 --- a/integration_test/ts/src/client.websocket.spec.ts +++ b/integration_test/ts/src/client.websocket.spec.ts @@ -6,11 +6,10 @@ import { assert } from "chai"; // Generated Test Classes import { PingRequest, PingResponse } from "../_proto/improbable/grpcweb/test/test_pb"; import { TestService } from "../_proto/improbable/grpcweb/test/test_pb_service"; -import { DEBUG } from "./util"; +import { DEBUG, DISABLE_WEBSOCKET_TESTS } from "./util"; import { headerTrailerCombos, runWithHttp1AndHttp2 } from "./testRpcCombinations"; -import { conditionallyRunTestSuite, SuiteEnum } from "../suiteUtils"; -if (process.env.DISABLE_WEBSOCKET_TESTS) { +if (DISABLE_WEBSOCKET_TESTS) { console.log(`Skipping "clientWebsockets" suite as "DISABLE_WEBSOCKET_TESTS" is set`); describe("skipping client-streaming (websockets)", () => { it("should skip client-streaming request tests", (done) => { @@ -18,7 +17,7 @@ if (process.env.DISABLE_WEBSOCKET_TESTS) { }); }); } else { - conditionallyRunTestSuite(SuiteEnum.clientWebsockets, () => { + describe("ClientWebsockets", () => { runWithHttp1AndHttp2(({testHostUrl}) => { describe("client-streaming (websockets)", () => { headerTrailerCombos((withHeaders, withTrailers) => { diff --git a/integration_test/ts/src/invoke.spec.ts b/integration_test/ts/src/invoke.spec.ts index 63a4392c..a3630212 100644 --- a/integration_test/ts/src/invoke.spec.ts +++ b/integration_test/ts/src/invoke.spec.ts @@ -15,13 +15,12 @@ import { PingResponse, } from "../_proto/improbable/grpcweb/test/test_pb"; import { FailService, TestService } from "../_proto/improbable/grpcweb/test/test_pb_service"; -import { DEBUG, continueStream, UncaughtExceptionListener } from "./util"; +import { DEBUG, continueStream, UncaughtExceptionListener, DISABLE_CORS_TESTS } from "./util"; import { headerTrailerCombos, runWithHttp1AndHttp2, runWithSupportedTransports } from "./testRpcCombinations"; -import { conditionallyRunTestSuite, SuiteEnum } from "../suiteUtils"; -conditionallyRunTestSuite(SuiteEnum.invoke, () => { +describe("invoke", () => { runWithHttp1AndHttp2(({ testHostUrl, corsHostUrl, unavailableHost, emptyHost }) => { runWithSupportedTransports(transport => { it(`should reject a client-streaming method`, () => { @@ -149,7 +148,7 @@ conditionallyRunTestSuite(SuiteEnum.invoke, () => { const ping = new PingRequest(); ping.setValue("hello world"); - ping.setResponseCount(3000); + ping.setResponseCount(300); ping.setSendHeaders(withHeaders); ping.setSendTrailers(withTrailers); @@ -179,7 +178,7 @@ conditionallyRunTestSuite(SuiteEnum.invoke, () => { assert.deepEqual(trailers.get("TrailerTestKey2"), ["ServerValue2"]); } assert.ok(didGetOnHeaders); - assert.strictEqual(onMessageId, 3000); + assert.strictEqual(onMessageId, 300); done(); } }); @@ -317,7 +316,7 @@ conditionallyRunTestSuite(SuiteEnum.invoke, () => { }); }); - if (!process.env.DISABLE_CORS_TESTS) { + if (!DISABLE_CORS_TESTS) { it("should report failure for a CORS failure", (done) => { let didGetOnHeaders = false; let didGetOnMessage = false; @@ -448,7 +447,7 @@ conditionallyRunTestSuite(SuiteEnum.invoke, () => { assert.include(exceptionsCaught[1], "onMessage exception"); assert.include(exceptionsCaught[2], "onEnd exception"); done(); - }, 100); + }, 1000); throw new Error("onEnd exception"); } }); diff --git a/integration_test/ts/src/testRpcCombinations.ts b/integration_test/ts/src/testRpcCombinations.ts index eacdf01d..834a5c22 100644 --- a/integration_test/ts/src/testRpcCombinations.ts +++ b/integration_test/ts/src/testRpcCombinations.ts @@ -4,6 +4,7 @@ import { } from "../../hosts-config"; import {grpc} from "@improbable-eng/grpc-web"; import {NodeHttpTransport} from "@improbable-eng/grpc-web-node-http-transport"; +import { DISABLE_WEBSOCKET_TESTS } from "./util"; type TestConfig = { testHostUrl: string, @@ -62,7 +63,7 @@ export function runWithSupportedTransports(cb: (transport: grpc.TransportFactory grpc.setDefaultTransport(NodeHttpTransport()); } - if (!process.env.DISABLE_WEBSOCKET_TESTS) { + if (!DISABLE_WEBSOCKET_TESTS) { transports["websocketTransport"] = grpc.WebsocketTransport(); } diff --git a/integration_test/ts/src/unary.spec.ts b/integration_test/ts/src/unary.spec.ts index 1cf3481c..db189f65 100644 --- a/integration_test/ts/src/unary.spec.ts +++ b/integration_test/ts/src/unary.spec.ts @@ -12,13 +12,12 @@ import { PingResponse, TextMessage, } from "../_proto/improbable/grpcweb/test/test_pb"; import { FailService, TestService } from "../_proto/improbable/grpcweb/test/test_pb_service"; -import { DEBUG, UncaughtExceptionListener } from "./util"; +import { DEBUG, DISABLE_CORS_TESTS, UncaughtExceptionListener } from "./util"; import { headerTrailerCombos, runWithHttp1AndHttp2, runWithSupportedTransports } from "./testRpcCombinations"; -import { conditionallyRunTestSuite, SuiteEnum } from "../suiteUtils"; -conditionallyRunTestSuite(SuiteEnum.unary, () => { +describe("unary", () => { runWithHttp1AndHttp2(({ testHostUrl, corsHostUrl, unavailableHost, emptyHost }) => { runWithSupportedTransports(transport => { it(`should reject a server-streaming method`, () => { @@ -126,7 +125,7 @@ conditionallyRunTestSuite(SuiteEnum.unary, () => { done(); } }); - }); + }, 20000); // 20s timeout }); headerTrailerCombos((withHeaders, withTrailers) => { @@ -202,7 +201,7 @@ conditionallyRunTestSuite(SuiteEnum.unary, () => { }); }); - if (!process.env.DISABLE_CORS_TESTS) { + if (!DISABLE_CORS_TESTS) { it(`should report failure for a CORS failure`, (done) => { const ping = new PingRequest(); @@ -294,7 +293,7 @@ conditionallyRunTestSuite(SuiteEnum.unary, () => { assert.lengthOf(exceptionsCaught, 1); assert.include(exceptionsCaught[0], "onEnd exception"); done(); - }, 100); + }, 1000); throw new Error("onEnd exception"); } }); diff --git a/integration_test/ts/src/util.ts b/integration_test/ts/src/util.ts index 97f7a2cb..2cffb55a 100644 --- a/integration_test/ts/src/util.ts +++ b/integration_test/ts/src/util.ts @@ -5,6 +5,8 @@ import { } from "@improbable-eng/grpc-web"; export const DEBUG: boolean = (global as any).DEBUG; +export const DISABLE_CORS_TESTS: boolean = (global as any).DISABLE_CORS_TESTS; +export const DISABLE_WEBSOCKET_TESTS: boolean = (global as any).DISABLE_WEBSOCKET_TESTS; export class UncaughtExceptionListener { private attached: boolean = false; diff --git a/integration_test/ts/suiteUtils.ts b/integration_test/ts/suiteUtils.ts deleted file mode 100644 index 6339defd..00000000 --- a/integration_test/ts/suiteUtils.ts +++ /dev/null @@ -1,33 +0,0 @@ -export enum SuiteEnum { - client, - clientWebsockets, - invoke, - unary, - ChunkParser, - cancellation, -} - -type enumMap = {[key: string]: number} & {[key: number]: string}; -const suiteNamesMap: enumMap = SuiteEnum as any; - -let specifiedSuiteName: string | undefined; -if (typeof process.env.TEST_SUITE_NAME !== "undefined") { - specifiedSuiteName = process.env.TEST_SUITE_NAME; -} else if (typeof window !== "undefined") { - specifiedSuiteName = window.location.hash.length > 1 ? window.location.hash.substring(1) : undefined; -} -export function conditionallyRunTestSuite(suite: SuiteEnum, suiteFunction: () => void) { - if (suiteNamesMap[suite] === undefined) { - throw new Error(`Unrecognised suite name: ${suite}`); - } - const suiteName = suiteNamesMap[suite]; - if (specifiedSuiteName) { - if (suiteName === specifiedSuiteName) { - describe(suiteName, suiteFunction); - } else { - console.log(`Skipping "${suiteName}" suite as it is not the specified suite (specifiedSuiteName is "${specifiedSuiteName}")`) - } - return; - } - describe(suiteName, suiteFunction); -} diff --git a/integration_test/ts/webpack.config.ts b/integration_test/ts/webpack.config.ts index 48951406..77e4198c 100644 --- a/integration_test/ts/webpack.config.ts +++ b/integration_test/ts/webpack.config.ts @@ -12,7 +12,7 @@ module.exports = { "process.env": JSON.stringify(process.env), }), ], - devtool: "inline-source-map", + devtool: "source-map", module: { rules: [ { @@ -23,7 +23,7 @@ module.exports = { }, { test: /\.ts$/, - include: [/src/, /_proto/, /suiteUtils/], + include: [/src/, /_proto/], exclude: /node_modules/, loader: "ts-loader" } diff --git a/package.json b/package.json index 663891c8..8ef73829 100644 --- a/package.json +++ b/package.json @@ -3,11 +3,12 @@ "private": true, "scripts": { "postinstall": "npm run bootstrap", - "bootstrap": "lerna bootstrap", - "postbootstrap": "lerna run postbootstrap", + "bootstrap": "lerna bootstrap --concurrency 1", + "postbootstrap": "lerna run postbootstrap --concurrency 1", "clean": "lerna clean --yes --private && lerna run clean", "test": "lerna run test", - "test:integration": "cd integration_test && npm run start", + "build:integration": "cd integration_test && npm run build", + "test:integration-browsers:ci": "cd integration_test && npm run start:ci", "lint": "tslint -c ./tslint.json ./client/**/*.ts ./integration_test/ts/*.ts ./integration_test/ts/**/*.ts" }, "author": "Improbable",