diff --git a/.travis.yml b/.travis.yml index e25781bc4..8db76b7a1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,4 +12,4 @@ install: script: - node ./tools/licenses/fetchLicenses.js - yarn lint - - yarn test.unit + - yarn test diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 251d5d7d4..4ed6b9f0e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -31,7 +31,7 @@ You can also submit feature requests to the [issue tracker](../../issues). Befor + Make your pull request from "develop" in your fork to "develop" in the source + Use short, meaningful commit messages + Lint your code before committing and making a pull request (`npm run lint`) -+ Write unit tests for new features and make sure all tests are passing (`npm run test.unit`) ++ Write unit tests for new features and make sure all tests are passing (`npm run test`) + If your pull request has multiple commits or commits that are not meaningful, consider [squashing](https://git-scm.com/docs/git-rebase#_interactive_mode) them #### Submitting Patches via Email diff --git a/README.md b/README.md index 3cc588152..7d231c075 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ $ yarn test.snapshot ```sh # Run unit tests -$ yarn test.unit +$ yarn test ``` ```sh diff --git a/jest.config.js b/jest.config.js index 42992755b..9b108fe2a 100644 --- a/jest.config.js +++ b/jest.config.js @@ -16,5 +16,9 @@ module.exports = { setupFiles: [ './test/setup.js' ], - testURL: 'http://localhost' + roots: [ + '/test/', + '/app/' + ], + testURL: 'http://localhost', }; diff --git a/package.json b/package.json index 3e8eca37c..4c255c509 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,8 @@ "prebuild.dev": "node ./tools/licenses/fetchLicenses.js", "prebuild.prod": "node ./tools/licenses/fetchLicenses.js", "prebuild.watch": "node ./tools/licenses/fetchLicenses.js", - "test.unit": "cross-env BABEL_ENV=test jest", + "test": "cross-env BABEL_ENV=test jest", + "test.watch": "cross-env BABEL_ENV=test jest --watch", "test.snapshot": "jest --updateSnapshot", "lint": "eslint --ext .js,.jsx ./app ./src", "lint.fix": "eslint --ext .js,.jsx ./app ./src --fix", @@ -44,7 +45,6 @@ "dependencies": { "@cliqz/adblocker-circumvention": "^1.5.0", "@cliqz/url-parser": "^1.1.1", - "base64-js": "^1.3.1", "browser-core": "https://github.com/cliqz-oss/browser-core/releases/download/v7.43.7/browser-core-7.43.7.tgz", "classnames": "^2.2.5", "d3": "^5.15.0", @@ -66,8 +66,7 @@ "rsvp": "^4.8.5", "spanan": "^2.0.0", "ua-parser-js": "^0.7.21", - "underscore": "^1.9.2", - "whatwg-fetch": "^3.0.0" + "underscore": "^1.9.2" }, "devDependencies": { "@babel/core": "^7.8.3", @@ -75,7 +74,6 @@ "@babel/plugin-proposal-object-rest-spread": "^7.8.3", "@babel/plugin-transform-modules-commonjs": "^7.8.3", "@babel/preset-react": "^7.8.3", - "@babel/register": "^7.8.3", "babel-eslint": "^10.0.3", "babel-loader": "^8.0.6", "clean-webpack-plugin": "^3.0.0", @@ -105,14 +103,13 @@ "redux-mock-store": "^1.5.4", "sass-loader": "^8.0.2", "seamless-immutable": "^7.1.3", - "sinon": "^8.1.1", "sinon-chrome": "^3.0.1", "svg-url-loader": "^3.0.3", "underscore-template-loader": "^1.0.0", "url-loader": "^3.0.0", "vendor-copy": "^2.0.0", "webpack": "^4.41.5", - "webpack-cli": "^3.3.10", + "webpack-cli": "^3.3.11", "webpack-shell-plugin": "^0.5.0" } } diff --git a/test/setup.js b/test/setup.js index 49c2ef720..30d035e9c 100644 --- a/test/setup.js +++ b/test/setup.js @@ -13,22 +13,34 @@ // Set stubs for all chrome.* methods and properties import chrome from 'sinon-chrome'; - +// Mock fetch calls +import { enableFetchMocks } from 'jest-fetch-mock'; // Set up Enzyme for React Snapshot testing import Enzyme from 'enzyme'; import Adapter from 'enzyme-adapter-react-16'; Enzyme.configure({ adapter: new Adapter() }); +enableFetchMocks(); // Fake the translation function to only return the translation key global.t = function(str) { return str; }; +// Helper function to fake Fetch response +global.mockFetchResponse = function(responseCode, responseData) { + fetch.mockReturnValue(Promise.resolve(new Response(responseData, { + status: responseCode, + headers: { + 'Content-type': 'application/json' + } + }))); +}; + // Create global stubs global.chrome = chrome; chrome.runtime.getManifest.returns({ - version: '7.0.0', + version: '8.5.0', debug: true }); diff --git a/test/src/bugdb.test.js b/test/src/BugDB.test.js similarity index 90% rename from test/src/bugdb.test.js rename to test/src/BugDB.test.js index 7cf0be336..cee528927 100644 --- a/test/src/bugdb.test.js +++ b/test/src/BugDB.test.js @@ -1,10 +1,10 @@ /** - * /src/classes/BugDb.js Unit Tests + * BugDb.js Unit Tests * * Ghostery Browser Extension * http://www.ghostery.com/ * - * Copyright 2019 Ghostery, Inc. All rights reserved. + * Copyright 2020 Ghostery, Inc. All rights reserved. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this @@ -12,8 +12,6 @@ */ import _ from 'underscore'; -import sinon from 'sinon'; -import 'whatwg-fetch'; import bugDb from '../../src/classes/BugDb'; import conf from '../../src/classes/Conf'; import { prefsGet } from '../../src/utils/common'; @@ -106,17 +104,8 @@ describe('src/classes/BugDb.js', () => { }; beforeAll(done => { - // Fake the translation function for categories for bugDb.init() - global.t = sinon.stub(); - global.t.withArgs([ - 'site_analytics', - 'customer_interaction', - 'social_media' - ]).returns(true); - // Fake XMLHttpRequest for fetchJson(/databases/bugs.json) - sinon.stub(global, 'fetch'); - setFetchStubResponse(200, JSON.stringify(bugs)) + global.mockFetchResponse(200, JSON.stringify(bugs)) chrome.storage.local.get.yields({ previousVersion: "8.0.8" }); conf.init().then(() => { @@ -127,21 +116,6 @@ describe('src/classes/BugDb.js', () => { }).catch(err => console.log(err)); }); - afterAll(() => { - global.fetch.restore(); - }); - - // Helper function to fake XHR requests - function setFetchStubResponse (responseCode, responseData) { - const res = new global.Response(responseData, { - status: responseCode, - headers: { - 'Content-type': 'application/json' - } - }); - global.fetch.returns(Promise.resolve(res)); - } - describe('bugDb.db.[key] should not be empty', () => { test('bugs', () => expect(_.size(bugDb.db.bugs)).toBeGreaterThan(0)); test('apps', () => expect(_.size(bugDb.db.apps)).toBeGreaterThan(0)); @@ -305,7 +279,7 @@ describe('src/classes/BugDb.js', () => { conf.bugs = old_bugs; // Fake the xhr request again - setFetchStubResponse(200, JSON.stringify(bugs)) + global.mockFetchResponse(200, JSON.stringify(bugs)) // fake an upgrade so that we read the "newer" bugs from disk instead of localStorage return bugDb.init(true).then(() => { diff --git a/test/src/conf.test.js b/test/src/Conf.test.js similarity index 70% rename from test/src/conf.test.js rename to test/src/Conf.test.js index ed11195a8..6af8573de 100644 --- a/test/src/conf.test.js +++ b/test/src/Conf.test.js @@ -1,21 +1,18 @@ /** - * /src/classes/Conf.js Unit Tests + * Conf.js Unit Tests * * Ghostery Browser Extension * http://www.ghostery.com/ * - * Copyright 2019 Ghostery, Inc. All rights reserved. + * Copyright 2020 Ghostery, Inc. All rights reserved. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0 */ -import sinon from 'sinon'; -import chrome from 'sinon-chrome'; import conf from '../../src/classes/Conf'; import globals from '../../src/classes/Globals'; -import dispatcher from '../../src/classes/Dispatcher'; describe('pre-initialization tests', () => { test('pre-initialization global is set', () => { @@ -34,7 +31,7 @@ describe('pre-initialization tests', () => { return expect(conf.alert_bubble_timeout).toBeUndefined(); }); - test('pre-initialization configuration values are saved temporarally', () => { + test('pre-initialization configuration values are saved temporarily', () => { conf.alert_bubble_pos = 'tl'; return expect(globals.initProps.alert_bubble_pos).toBe('tl'); }); @@ -78,31 +75,3 @@ describe('post-initialization tests', () => { return expect(chrome.storage.local.set.calledWith({alert_bubble_timeout: 30})).toBeTruthy(); }); }); - -describe('dispatcher tests', () => { - let spy = sinon.spy(dispatcher, 'trigger'); - - beforeEach(() => { - spy.resetHistory(); - }); - - test('spy.resetHistory() works and callCount is reset to 0', () => { - return expect(spy.callCount).toBe(0); - }); - - test('dispatcher is triggered once for conf value not in SYNC_ARRAY', () => { - conf.paused_blocking = true; - return expect(spy.calledOnce).toBeTruthy(); - }); - - test('dispatcher is triggered twice for conf value in SYNC_ARRAY', () => { - conf.alert_expanded = true; - return expect(spy.calledTwice).toBeTruthy(); - }); - - test('dispatcher is triggered with correct arguments', () => { - conf.alert_expanded = true; - return expect(spy.calledWith(`conf.save.alert_expanded`, true)).toBeTruthy(); - }); - -}); diff --git a/test/src/Dispatcher.test.js b/test/src/Dispatcher.test.js new file mode 100644 index 000000000..d0c7ad1e5 --- /dev/null +++ b/test/src/Dispatcher.test.js @@ -0,0 +1,42 @@ +/** + * Dispatcher.js Unit Tests + * + * Ghostery Browser Extension + * http://www.ghostery.com/ + * + * Copyright 2020 Ghostery, Inc. All rights reserved. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0 + */ + +import dispatcher from '../../src/classes/Dispatcher'; +import conf from '../../src/classes/Conf'; + +describe('dispatcher tests', () => { + let spy = jest.spyOn(dispatcher, 'trigger'); + + afterEach(() => { + jest.clearAllMocks(); + }); + + test('dispatcher is triggered once for conf value not in SYNC_ARRAY', () => { + conf.paused_blocking = true; + return expect(spy).toHaveBeenCalledTimes(1); + }); + + test('clearAllMocks() works and callCount is reset to 0', () => { + return expect(spy).toHaveBeenCalledTimes(0); + }); + + test('dispatcher is triggered twice for conf value in SYNC_ARRAY', () => { + conf.alert_expanded = true; + return expect(spy).toHaveBeenCalledTimes(2); + }); + + test('dispatcher is triggered with correct arguments', () => { + conf.alert_expanded = true; + return expect(spy).toHaveBeenCalledWith(`conf.save.alert_expanded`, true); + }); +}); diff --git a/test/src/foundbugs.test.js b/test/src/Foundbugs.test.js similarity index 84% rename from test/src/foundbugs.test.js rename to test/src/Foundbugs.test.js index 35650fcf0..e9a822e71 100644 --- a/test/src/foundbugs.test.js +++ b/test/src/Foundbugs.test.js @@ -1,10 +1,10 @@ /** - * /src/classes/FoundBugs.js Unit Tests + * FoundBugs.js Unit Tests * * Ghostery Browser Extension * http://www.ghostery.com/ * - * Copyright 2019 Ghostery, Inc. All rights reserved. + * Copyright 2020 Ghostery, Inc. All rights reserved. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this @@ -12,14 +12,12 @@ */ import _ from 'underscore'; -import sinon from 'sinon'; -import 'whatwg-fetch'; +import foundBugs from '../../src/classes/FoundBugs'; import bugDb from '../../src/classes/BugDb'; import conf from '../../src/classes/Conf'; -import foundBugs from '../../src/classes/FoundBugs'; describe('src/classes/FoundBugs.js', () => { - const url = 'https://getsatisfaction.com/ghostery', + const url = 'https://feedback.ghostery.com/', sources = [ // one app, three patterns, four sources [2, "https://ssl.google-analytics.com/ga.js", true, 'SCRIPT'], @@ -35,17 +33,6 @@ describe('src/classes/FoundBugs.js', () => { ]; beforeAll(done => { - // Fake the translation function for categories for bugDb.init() - global.t = sinon.stub(); - global.t.withArgs([ - 'site_analytics', - 'customer_interaction', - 'social_media' - ]).returns(true); - - // Stub the fetch function - sinon.stub(global, 'fetch'); - // Stub chrome storage methods so that our prefsGet() calls work. chrome.storage.local.get.withArgs(['bugs']).yields({}); chrome.storage.local.get.withArgs(['compatibility']).yields({}); @@ -53,7 +40,6 @@ describe('src/classes/FoundBugs.js', () => { chrome.storage.local.get.yields({ previousVersion: "8.0.8" }); conf.init().then(() => { - //Start init sequence for testing. Changing the fakeServer() response each time for the following fetchJson() call const bugsJson = JSON.stringify({ "apps": {"13": {"name": "Google Analytics","cat": "site_analytics","tags": [48]}, @@ -64,35 +50,19 @@ describe('src/classes/FoundBugs.js', () => { "patterns": {'something': true}, "version":416 }); - setFetchStubResponse(200, bugsJson); + // Mock bugDb fetch response + global.mockFetchResponse(200, bugsJson); bugDb.init().then(() => { - // Fill foundBugs with fake data. for (let i = 0; i < sources.length; i++) { const source = sources[i]; foundBugs.update(url, source[0], source[1], source[2], source[3]); } - done(); }); }).catch(err => console.log(err)); }); - afterAll(() => { - global.fetch.restore(); - }); - - // Helper function to fake XHR requests - function setFetchStubResponse (responseCode, responseData) { - const res = new global.Response(responseData, { - status: responseCode, - headers: { - 'Content-type': 'application/json' - } - }); - global.fetch.returns(Promise.resolve(res)); - } - describe('testing source, pattern, and app counts', () => { test('there should be seven sources', () => { const bugSources = _.flatten(_.pluck(foundBugs.getBugs(url), 'sources')); @@ -110,7 +80,6 @@ describe('src/classes/FoundBugs.js', () => { test('getAppsCount() should get three apps', () => { return expect(foundBugs.getAppsCount(url)).toBe(3); }); - }); describe('testing clear() functionality', () => { diff --git a/test/src/PolicySmartBlock.test.js b/test/src/PolicySmartBlock.test.js index 392d0938c..7534e9f6b 100644 --- a/test/src/PolicySmartBlock.test.js +++ b/test/src/PolicySmartBlock.test.js @@ -1,10 +1,10 @@ /** - * /src/classes/PolicySmartBlock.js Unit Tests + * PolicySmartBlock.js Unit Tests * * Ghostery Browser Extension * http://www.ghostery.com/ * - * Copyright 2019 Ghostery, Inc. All rights reserved. + * Copyright 2020 Ghostery, Inc. All rights reserved. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this diff --git a/test/src/common.test.js b/test/utils/common.test.js similarity index 93% rename from test/src/common.test.js rename to test/utils/common.test.js index 596116900..9fcf96748 100644 --- a/test/src/common.test.js +++ b/test/utils/common.test.js @@ -1,10 +1,10 @@ /** - * /src/utils/common.js Unit Tests + * Common.js Unit Tests * * Ghostery Browser Extension * http://www.ghostery.com/ * - * Copyright 2019 Ghostery, Inc. All rights reserved. + * Copyright 2020 Ghostery, Inc. All rights reserved. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this diff --git a/test/src/matcher.test.js b/test/utils/matcher.test.js similarity index 86% rename from test/src/matcher.test.js rename to test/utils/matcher.test.js index d83ca2aec..a2286d925 100644 --- a/test/src/matcher.test.js +++ b/test/utils/matcher.test.js @@ -1,27 +1,22 @@ /** - * /src/utils/matcher.js Unit Tests + * Matcher.js Unit Tests * * Ghostery Browser Extension * http://www.ghostery.com/ * - * Copyright 2019 Ghostery, Inc. All rights reserved. + * Copyright 2020 Ghostery, Inc. All rights reserved. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0 */ -import sinon from 'sinon'; -import 'whatwg-fetch'; import bugDb from '../../src/classes/BugDb'; import conf from '../../src/classes/Conf'; import { isBug } from '../../src/utils/matcher'; describe('src/utils/matcher.js', () => { beforeAll(done => { - // Stub the fetch function - sinon.stub(global, 'fetch'); - // Fake the XMLHttpRequest for fetchJson(/daabases/bugs.json) const bugsJson = JSON.stringify({ "firstPartyExceptions": { @@ -73,7 +68,8 @@ describe('src/utils/matcher.js', () => { } } }); - setFetchStubResponse(200, bugsJson); + // Mock bugDb fetch response + global.mockFetchResponse(200, bugsJson); // Stub chrome storage methods so that our prefsGet() calls work. chrome.storage.local.get.yields(null); //for Conf @@ -88,21 +84,6 @@ describe('src/utils/matcher.js', () => { }).catch(err => console.log(err)); }); - afterAll(() => { - global.fetch.restore(); - }); - - // Helper function to fake XHR requests - function setFetchStubResponse (responseCode, responseData) { - const res = new global.Response(responseData, { - status: responseCode, - headers: { - 'Content-type': 'application/json' - } - }); - global.fetch.returns(Promise.resolve(res)); - } - describe('testing isBug()', () => { describe('testing basic pattern matching', () => { test('host+path tracker matching works', () => { diff --git a/test/src/utils.test.js b/test/utils/utils.test.js similarity index 85% rename from test/src/utils.test.js rename to test/utils/utils.test.js index 1970a7668..ebae5cdf7 100644 --- a/test/src/utils.test.js +++ b/test/utils/utils.test.js @@ -1,41 +1,27 @@ /** - * /src/utils/utils.js Unit Tests + * Utils.js Unit Tests * * Ghostery Browser Extension * http://www.ghostery.com/ * - * Copyright 2019 Ghostery, Inc. All rights reserved. + * Copyright 2020 Ghostery, Inc. All rights reserved. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0 */ -import { enableFetchMocks } from 'jest-fetch-mock' import { getJson, defineLazyProperty, semverCompare } from '../../src/utils/utils'; -// Mock fetch calls -enableFetchMocks() - describe('tests for getJson()', () => { - // Helper function to fake Fetch response - function mockFetchResponse (responseCode, responseData) { - fetch.mockReturnValue(Promise.resolve(new Response(responseData, { - status: responseCode, - headers: { - 'Content-type': 'application/json' - } - }))); - } - // Tests for getJson() test('returns a 200 response', () => { - mockFetchResponse(200, JSON.stringify({ hello: 'world' })); + global.mockFetchResponse(200, JSON.stringify({ hello: 'world' })); expect(getJson('https://www.ghostery.com/')).resolves.toEqual({ hello: 'world' }); }); test('returns a 404 response', () => { - mockFetchResponse(404, 'Not Found'); + global.mockFetchResponse(404, 'Not Found'); expect(getJson('https://www.ghostery.com/')).rejects.toThrow(/404/); }); }); @@ -110,6 +96,8 @@ describe('tests for semverCompare()', () => { expect(semverCompare("8.7.1", "8.7.10")).toBe(-1); expect(semverCompare("7.100.100", "8.7.10")).toBe(-1); expect(semverCompare("8.3.3", "8.4.2")).toBe(-1); + expect(semverCompare("8.3.3.3e794d0", "8.4.2")).toBe(-1); + expect(semverCompare("8.3.3.3e794d0", "8.4.2.1d945f0")).toBe(-1); expect(semverCompare("8.7", "8.7.0")).toBe(-1); expect(semverCompare("8.7", "8.8.0")).toBe(-1); @@ -119,6 +107,8 @@ describe('tests for semverCompare()', () => { expect(semverCompare("8.7.10", "8.7.1")).toBe(1); expect(semverCompare("8.7.10", "7.100.100")).toBe(1); expect(semverCompare("8.4.2", "8.3.3")).toBe(1); + expect(semverCompare("8.4.2", "8.3.3.3e794d0")).toBe(1); + expect(semverCompare("8.4.2.1d945f0", "8.3.3.3e794d0")).toBe(1); expect(semverCompare("8.7.0", "8.7")).toBe(1); expect(semverCompare("8.8.0", "8.7")).toBe(1); diff --git a/yarn.lock b/yarn.lock index 186187d84..5537b134f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -252,17 +252,6 @@ "@babel/plugin-transform-react-jsx-self" "^7.8.3" "@babel/plugin-transform-react-jsx-source" "^7.8.3" -"@babel/register@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.8.3.tgz#5d5d30cfcc918437535d724b8ac1e4a60c5db1f8" - integrity sha512-t7UqebaWwo9nXWClIPLPloa5pN33A2leVs8Hf0e9g9YwUP8/H9NeR7DJU+4CXo23QtjChQv5a3DjEtT83ih1rg== - dependencies: - find-cache-dir "^2.0.0" - lodash "^4.17.13" - make-dir "^2.1.0" - pirates "^4.0.0" - source-map-support "^0.5.16" - "@babel/runtime-corejs3@^7.7.4": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.8.4.tgz#ccc4e042e2fae419c67fa709567e5d2179ed3940" @@ -623,7 +612,7 @@ resolved "https://registry.yarnpkg.com/@remusao/trie/-/trie-1.3.0.tgz#146b6f7f223d29db7106c19b9f4d4fab2754986a" integrity sha512-IykMLl0vr8L1sJzvtGR4izkNh1Ous2njaeC4NEvAcfALCdCo7Y4VpISU0I8DaZFU2lGAFKyeh2Jz4WaM/3hbEw== -"@sinonjs/commons@^1", "@sinonjs/commons@^1.3.0", "@sinonjs/commons@^1.4.0", "@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0": +"@sinonjs/commons@^1", "@sinonjs/commons@^1.3.0", "@sinonjs/commons@^1.4.0", "@sinonjs/commons@^1.7.0": version "1.7.0" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.7.0.tgz#f90ffc52a2e519f018b13b6c4da03cbff36ebed6" integrity sha512-qbk9AP+cZUsKdW1GJsBpxPKFmCJ0T8swwzVje3qFd+AkQb74Q/tiuzrdfFg8AD2g5HH/XbE/I8Uc1KYHVYWfhg== @@ -638,14 +627,6 @@ "@sinonjs/commons" "^1" "@sinonjs/samsam" "^3.1.0" -"@sinonjs/formatio@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-4.0.1.tgz#50ac1da0c3eaea117ca258b06f4f88a471668bdb" - integrity sha512-asIdlLFrla/WZybhm0C8eEzaDNNrzymiTqHMeJl6zPW2881l3uuVRpm0QlRQEjqYWv6CcKMGYME3LbrLJsORBw== - dependencies: - "@sinonjs/commons" "^1" - "@sinonjs/samsam" "^4.2.0" - "@sinonjs/samsam@^3.1.0", "@sinonjs/samsam@^3.3.3": version "3.3.3" resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-3.3.3.tgz#46682efd9967b259b81136b9f120fd54585feb4a" @@ -655,15 +636,6 @@ array-from "^2.1.1" lodash "^4.17.15" -"@sinonjs/samsam@^4.2.0", "@sinonjs/samsam@^4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-4.2.2.tgz#0f6cb40e467865306d8a20a97543a94005204e23" - integrity sha512-z9o4LZUzSD9Hl22zV38aXNykgFeVj8acqfFabCY6FY83n/6s/XwNJyYYldz6/9lBJanpno9h+oL6HTISkviweA== - dependencies: - "@sinonjs/commons" "^1.6.0" - lodash.get "^4.4.2" - type-detect "^4.0.8" - "@sinonjs/text-encoding@^0.7.1": version "0.7.1" resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" @@ -1434,7 +1406,7 @@ base-64@^0.1.0: resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" integrity sha1-eAqZyE59YAJgNhURxId2E78k9rs= -base64-js@^1.0.2, base64-js@^1.3.1: +base64-js@^1.0.2: version "1.3.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== @@ -2721,11 +2693,6 @@ diff@^3.5.0: resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== -diff@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - diffie-hellman@^5.0.0: version "5.0.3" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" @@ -5472,11 +5439,6 @@ lodash.flattendeep@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" integrity sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI= -lodash.get@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= - lodash.isequal@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" @@ -5502,7 +5464,7 @@ lolex@^4.2.0: resolved "https://registry.yarnpkg.com/lolex/-/lolex-4.2.0.tgz#ddbd7f6213ca1ea5826901ab1222b65d714b3cd7" integrity sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg== -lolex@^5.0.0, lolex@^5.0.1, lolex@^5.1.2: +lolex@^5.0.0, lolex@^5.0.1: version "5.1.2" resolved "https://registry.yarnpkg.com/lolex/-/lolex-5.1.2.tgz#953694d098ce7c07bc5ed6d0e42bc6c0c6d5a367" integrity sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A== @@ -5547,7 +5509,7 @@ m3u8stream@^0.6.3: miniget "^1.6.1" sax "^1.2.4" -make-dir@^2.0.0, make-dir@^2.1.0: +make-dir@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== @@ -5950,18 +5912,6 @@ nise@^1.5.2: lolex "^5.0.1" path-to-regexp "^1.7.0" -nise@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/nise/-/nise-3.0.1.tgz#0659982af515e5aac15592226246243e8da0013d" - integrity sha512-fYcH9y0drBGSoi88kvhpbZEsenX58Yr+wOJ4/Mi1K4cy+iGP/a73gNoyNhu5E9QxPdgTlVChfIaAlnyOy/gHUA== - dependencies: - "@sinonjs/commons" "^1.7.0" - "@sinonjs/formatio" "^4.0.1" - "@sinonjs/text-encoding" "^0.7.1" - just-extend "^4.0.2" - lolex "^5.0.1" - path-to-regexp "^1.7.0" - node-fetch@2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" @@ -6638,7 +6588,7 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= -pirates@^4.0.0, pirates@^4.0.1: +pirates@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== @@ -7864,19 +7814,6 @@ sinon@^7.2.3: nise "^1.5.2" supports-color "^5.5.0" -sinon@^8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-8.1.1.tgz#21fffd5ad0a2d072a8aa7f8a3cf7ed2ced497497" - integrity sha512-E+tWr3acRdoe1nXbHMu86SSqA1WGM7Yw3jZRLvlCMnXwTHP8lgFFVn5BnKnF26uc5SfZ3D7pA9sN7S3Y2jG4Ew== - dependencies: - "@sinonjs/commons" "^1.7.0" - "@sinonjs/formatio" "^4.0.1" - "@sinonjs/samsam" "^4.2.2" - diff "^4.0.2" - lolex "^5.1.2" - nise "^3.0.1" - supports-color "^7.1.0" - sisteransi@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.4.tgz#386713f1ef688c7c0304dc4c0632898941cad2e3" @@ -7959,7 +7896,7 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.5.16, source-map-support@^0.5.6, source-map-support@~0.5.12: +source-map-support@^0.5.6, source-map-support@~0.5.12: version "0.5.16" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== @@ -8675,7 +8612,7 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-detect@4.0.8, type-detect@^4.0.8: +type-detect@4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== @@ -9063,10 +9000,10 @@ webidl-conversions@^4.0.2: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== -webpack-cli@^3.3.10: - version "3.3.10" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.10.tgz#17b279267e9b4fb549023fae170da8e6e766da13" - integrity sha512-u1dgND9+MXaEt74sJR4PR7qkPxXUSQ0RXYq8x1L6Jg1MYVEmGPrH6Ah6C4arD4r0J1P5HKjRqpab36k0eIzPqg== +webpack-cli@^3.3.11: + version "3.3.11" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.11.tgz#3bf21889bf597b5d82c38f215135a411edfdc631" + integrity sha512-dXlfuml7xvAFwYUPsrtQAA9e4DOe58gnzSxhgrO/ZM/gyXTBowrsYeubyN4mqGhYdpXMFNyQ6emjJS9M7OBd4g== dependencies: chalk "2.4.2" cross-spawn "6.0.5" @@ -9129,7 +9066,7 @@ whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.5: dependencies: iconv-lite "0.4.24" -whatwg-fetch@3.0.0, whatwg-fetch@>=0.10.0, whatwg-fetch@^3.0.0: +whatwg-fetch@3.0.0, whatwg-fetch@>=0.10.0: version "3.0.0" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== @@ -9295,9 +9232,9 @@ yallist@^3.0.2: integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yargs-parser@^13.1.0: - version "13.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" - integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== dependencies: camelcase "^5.0.0" decamelize "^1.2.0"