diff --git a/package.json b/package.json index e3af86b488..b21b2cedac 100644 --- a/package.json +++ b/package.json @@ -139,7 +139,6 @@ "eslint-plugin-react": "^7.7.0", "eslint-plugin-react-hooks": "^2.0.1", "estree-walker": "^0.5.0", - "expect": "^24.1.0", "file-loader": "^3.0.1", "flow-parser": "^0.57.3", "jest": "^23.2.0", @@ -158,11 +157,11 @@ "react-test-renderer": "^16.9.0", "require-json": "0.0.1", "rimraf": "^2.4.3", - "sinon": "^5.0.7", "source-map-loader": "^0.2.3", "stylelint": "^9.10.1", "stylelint-config-standard": "^18.2.0", "stylelint-scss": "^3.9.0", + "subtle": "^0.1.8", "walk": "^2.3.9", "webpack": "^4.20.2", "webpack-cli": "^3.1.1" diff --git a/test/DecryptionFailureTracker-test.js b/test/DecryptionFailureTracker-test.js index baa0545f77..7a6a42ef55 100644 --- a/test/DecryptionFailureTracker-test.js +++ b/test/DecryptionFailureTracker-test.js @@ -14,8 +14,6 @@ See the License for the specific language governing permissions and limitations under the License. */ -import expect from 'expect'; - import { DecryptionFailure, DecryptionFailureTracker } from '../src/DecryptionFailureTracker'; import { MatrixEvent } from 'matrix-js-sdk'; diff --git a/test/PhasedRollOut-test.js b/test/PhasedRollOut-test.js index 600b9051f7..f02411d78d 100644 --- a/test/PhasedRollOut-test.js +++ b/test/PhasedRollOut-test.js @@ -11,7 +11,6 @@ See the License for the specific language governing permissions and limitations under the License. */ -import expect from 'expect'; import {phasedRollOutExpiredForUser} from '../src/PhasedRollOut'; const OFFSET = 6000000; diff --git a/test/ScalarAuthClient-test.js b/test/ScalarAuthClient-test.js index 7e944189a6..28ca914f00 100644 --- a/test/ScalarAuthClient-test.js +++ b/test/ScalarAuthClient-test.js @@ -14,43 +14,41 @@ See the License for the specific language governing permissions and limitations under the License. */ -import expect from 'expect'; - -import sinon from 'sinon'; - import ScalarAuthClient from '../src/ScalarAuthClient'; import MatrixClientPeg from '../src/MatrixClientPeg'; import { stubClient } from './test-utils'; describe('ScalarAuthClient', function() { - let clientSandbox; - beforeEach(function() { - sinon.stub(window.localStorage, 'getItem').withArgs('mx_scalar_token').returns('brokentoken'); - clientSandbox = stubClient(); - }); - - afterEach(function() { - clientSandbox.restore(); - sinon.restore(); + window.localStorage.getItem = jest.fn((arg) => { + if (arg === "mx_scalar_token") return "brokentoken"; + }); + stubClient(); }); it('should request a new token if the old one fails', async function() { const sac = new ScalarAuthClient(); - sac._getAccountName = sinon.stub(); - sac._getAccountName.withArgs('brokentoken').rejects({ - message: "Invalid token", + sac._getAccountName = jest.fn((arg) => { + switch (arg) { + case "brokentoken": + return Promise.reject({ + message: "Invalid token", + }); + case "wokentoken": + return Promise.resolve(MatrixClientPeg.get().getUserId()); + } }); - sac._getAccountName.withArgs('wokentoken').resolves(MatrixClientPeg.get().getUserId()); - MatrixClientPeg.get().getOpenIdToken = sinon.stub().resolves('this is your openid token'); + MatrixClientPeg.get().getOpenIdToken = jest.fn().mockResolvedValue('this is your openid token'); - sac.exchangeForScalarToken = sinon.stub().withArgs('this is your openid token').resolves('wokentoken'); + sac.exchangeForScalarToken = jest.fn((arg) => { + if (arg === "this is your openid token") return Promise.resolve("wokentoken"); + }); await sac.connect(); - expect(sac.exchangeForScalarToken.calledWith('this is your openid token')).toBeTruthy(); + expect(sac.exchangeForScalarToken).toBeCalledWith('this is your openid token'); expect(sac.scalarToken).toEqual('wokentoken'); }); }); diff --git a/test/Terms-test.js b/test/Terms-test.js index 3fc7b56e42..71daafddfe 100644 --- a/test/Terms-test.js +++ b/test/Terms-test.js @@ -14,10 +14,6 @@ See the License for the specific language governing permissions and limitations under the License. */ -import expect from 'expect'; - -import sinon from 'sinon'; - import * as Matrix from 'matrix-js-sdk'; import { startTermsFlow, Service } from '../src/Terms'; @@ -44,107 +40,100 @@ const IM_SERVICE_ONE = new Service(Matrix.SERVICE_TYPES.IM, 'https://imone.test' const IM_SERVICE_TWO = new Service(Matrix.SERVICE_TYPES.IM, 'https://imtwo.test', 'a token token'); describe('Terms', function() { - let sandbox; - beforeEach(function() { - sandbox = stubClient(); - }); - - afterEach(function() { - sandbox.restore(); + stubClient(); }); it('should prompt for all terms & services if no account data', async function() { - MatrixClientPeg.get().getAccountData = sinon.stub().returns(null); - MatrixClientPeg.get().getTerms = sinon.stub().returns({ + MatrixClientPeg.get().getAccountData = jest.fn().mockReturnValue(null); + MatrixClientPeg.get().getTerms = jest.fn().mockReturnValue({ policies: { "policy_the_first": POLICY_ONE, }, }); - const interactionCallback = sinon.stub().resolves([]); + const interactionCallback = jest.fn().mockResolvedValue([]); await startTermsFlow([IM_SERVICE_ONE], interactionCallback); - console.log("interaction callback calls", interactionCallback.getCall(0)); + console.log("interaction callback calls", interactionCallback.mock.calls[0]); - expect(interactionCallback.calledWith([ + expect(interactionCallback).toBeCalledWith([ { service: IM_SERVICE_ONE, policies: { policy_the_first: POLICY_ONE, }, }, - ])).toBeTruthy(); + ], []); }); it('should not prompt if all policies are signed in account data', async function() { - MatrixClientPeg.get().getAccountData = sinon.stub().returns({ - getContent: sinon.stub().returns({ + MatrixClientPeg.get().getAccountData = jest.fn().mockReturnValue({ + getContent: jest.fn().mockReturnValue({ accepted: ["http://example.com/one"], }), }); - MatrixClientPeg.get().getTerms = sinon.stub().returns({ + MatrixClientPeg.get().getTerms = jest.fn().mockReturnValue({ policies: { "policy_the_first": POLICY_ONE, }, }); - MatrixClientPeg.get().agreeToTerms = sinon.stub(); + MatrixClientPeg.get().agreeToTerms = jest.fn(); - const interactionCallback = sinon.spy(); + const interactionCallback = jest.fn(); await startTermsFlow([IM_SERVICE_ONE], interactionCallback); - console.log("agreeToTerms call", MatrixClientPeg.get().agreeToTerms.getCall(0).args); + console.log("agreeToTerms call", MatrixClientPeg.get().agreeToTerms.mock.calls[0]); - expect(interactionCallback.called).toBeFalsy(); - expect(MatrixClientPeg.get().agreeToTerms.calledWith( + expect(interactionCallback).not.toHaveBeenCalled(); + expect(MatrixClientPeg.get().agreeToTerms).toBeCalledWith( Matrix.SERVICE_TYPES.IM, 'https://imone.test', 'a token token', ["http://example.com/one"], - )).toBeTruthy(); + ); }); it("should prompt for only terms that aren't already signed", async function() { - MatrixClientPeg.get().getAccountData = sinon.stub().returns({ - getContent: sinon.stub().returns({ + MatrixClientPeg.get().getAccountData = jest.fn().mockReturnValue({ + getContent: jest.fn().mockReturnValue({ accepted: ["http://example.com/one"], }), }); - MatrixClientPeg.get().getTerms = sinon.stub().returns({ + MatrixClientPeg.get().getTerms = jest.fn().mockReturnValue({ policies: { "policy_the_first": POLICY_ONE, "policy_the_second": POLICY_TWO, }, }); - MatrixClientPeg.get().agreeToTerms = sinon.stub(); + MatrixClientPeg.get().agreeToTerms = jest.fn(); - const interactionCallback = sinon.stub().resolves(["http://example.com/one", "http://example.com/two"]); + const interactionCallback = jest.fn().mockResolvedValue(["http://example.com/one", "http://example.com/two"]); await startTermsFlow([IM_SERVICE_ONE], interactionCallback); - console.log("interactionCallback call", interactionCallback.getCall(0).args); - console.log("agreeToTerms call", MatrixClientPeg.get().agreeToTerms.getCall(0).args); + console.log("interactionCallback call", interactionCallback.mock.calls[0]); + console.log("agreeToTerms call", MatrixClientPeg.get().agreeToTerms.mock.calls[0]); - expect(interactionCallback.calledWith([ + expect(interactionCallback).toBeCalledWith([ { service: IM_SERVICE_ONE, policies: { policy_the_second: POLICY_TWO, }, }, - ])).toBeTruthy(); - expect(MatrixClientPeg.get().agreeToTerms.calledWith( + ], ["http://example.com/one"]); + expect(MatrixClientPeg.get().agreeToTerms).toBeCalledWith( Matrix.SERVICE_TYPES.IM, 'https://imone.test', 'a token token', ["http://example.com/one", "http://example.com/two"], - )).toBeTruthy(); + ); }); it("should prompt for only services with un-agreed policies", async function() { - MatrixClientPeg.get().getAccountData = sinon.stub().returns({ - getContent: sinon.stub().returns({ + MatrixClientPeg.get().getAccountData = jest.fn().mockReturnValue({ + getContent: jest.fn().mockReturnValue({ accepted: ["http://example.com/one"], }), }); - MatrixClientPeg.get().getTerms = sinon.stub(); - MatrixClientPeg.get().getTerms.callsFake((serviceType, baseUrl, accessToken) => { + MatrixClientPeg.get().getTerms = jest.fn((serviceType, baseUrl, accessToken) => { switch (baseUrl) { case 'https://imone.test': return { @@ -161,35 +150,35 @@ describe('Terms', function() { } }); - MatrixClientPeg.get().agreeToTerms = sinon.stub(); + MatrixClientPeg.get().agreeToTerms = jest.fn(); - const interactionCallback = sinon.stub().resolves(["http://example.com/one", "http://example.com/two"]); + const interactionCallback = jest.fn().mockResolvedValue(["http://example.com/one", "http://example.com/two"]); await startTermsFlow([IM_SERVICE_ONE, IM_SERVICE_TWO], interactionCallback); - console.log("getTerms call 0", MatrixClientPeg.get().getTerms.getCall(0).args); - console.log("getTerms call 1", MatrixClientPeg.get().getTerms.getCall(1).args); - console.log("interactionCallback call", interactionCallback.getCall(0).args); - console.log("agreeToTerms call", MatrixClientPeg.get().agreeToTerms.getCall(0).args); + // console.log("getTerms call 0", MatrixClientPeg.get().getTerms.getCall(0).args); + // console.log("getTerms call 1", MatrixClientPeg.get().getTerms.getCall(1).args); + // console.log("interactionCallback call", interactionCallback.getCall(0).args); + // console.log("agreeToTerms call", MatrixClientPeg.get().agreeToTerms.getCall(0).args); - expect(interactionCallback.calledWith([ + expect(interactionCallback).toBeCalledWith([ { service: IM_SERVICE_TWO, policies: { policy_the_second: POLICY_TWO, }, }, - ])).toBeTruthy(); - expect(MatrixClientPeg.get().agreeToTerms.calledWith( + ], ["http://example.com/one"]); + expect(MatrixClientPeg.get().agreeToTerms).toBeCalledWith( Matrix.SERVICE_TYPES.IM, 'https://imone.test', 'a token token', ["http://example.com/one"], - )).toBeTruthy(); - expect(MatrixClientPeg.get().agreeToTerms.calledWith( + ); + expect(MatrixClientPeg.get().agreeToTerms).toBeCalledWith( Matrix.SERVICE_TYPES.IM, 'https://imtwo.test', 'a token token', ["http://example.com/two"], - )).toBeTruthy(); + ); }); }); diff --git a/test/UserActivity-test.js b/test/UserActivity-test.js index 6c684d25e9..a30df527ae 100644 --- a/test/UserActivity-test.js +++ b/test/UserActivity-test.js @@ -14,7 +14,6 @@ See the License for the specific language governing permissions and limitations under the License. */ -import expect from 'expect'; import lolex from 'lolex'; import jest from 'jest-mock'; import EventEmitter from 'events'; diff --git a/test/all-tests.js b/test/all-tests.js deleted file mode 100644 index 1d4d36ebfd..0000000000 --- a/test/all-tests.js +++ /dev/null @@ -1,7 +0,0 @@ -// all-tests.js -// -// Our master test file: uses the webpack require API to find our test files -// and run them - -const context = require.context('.', true, /-test\.jsx?$/); -context.keys().forEach(context); diff --git a/test/autocomplete/QueryMatcher-test.js b/test/autocomplete/QueryMatcher-test.js index 864e1da81d..03f28eb984 100644 --- a/test/autocomplete/QueryMatcher-test.js +++ b/test/autocomplete/QueryMatcher-test.js @@ -14,8 +14,6 @@ See the License for the specific language governing permissions and limitations under the License. */ -import expect from 'expect'; - import QueryMatcher from '../../src/autocomplete/QueryMatcher'; const OBJECTS = [ diff --git a/test/components/structures/GroupView-test.js b/test/components/structures/GroupView-test.js index 1319e312fb..57531a427c 100644 --- a/test/components/structures/GroupView-test.js +++ b/test/components/structures/GroupView-test.js @@ -17,14 +17,13 @@ limitations under the License. import React from 'react'; import ReactDOM from 'react-dom'; import ReactTestUtils from 'react-dom/test-utils'; -import expect from 'expect'; import MockHttpBackend from 'matrix-mock-request'; import MatrixClientPeg from '../../../src/MatrixClientPeg'; -import sdk from 'matrix-react-sdk'; +import sdk from '../../skinned-sdk'; import Matrix from 'matrix-js-sdk'; -import * as TestUtils from 'test-utils'; +import * as TestUtils from '../../test-utils'; const { waitForUpdate } = TestUtils; const GroupView = sdk.getComponent('structures.GroupView'); diff --git a/test/components/structures/MessagePanel-test.js b/test/components/structures/MessagePanel-test.js index cd0a0bfcd7..88abaf6735 100644 --- a/test/components/structures/MessagePanel-test.js +++ b/test/components/structures/MessagePanel-test.js @@ -23,10 +23,9 @@ import ReactDOM from "react-dom"; import PropTypes from "prop-types"; const TestUtils = require('react-dom/test-utils'); const expect = require('expect'); -import sinon from 'sinon'; import { EventEmitter } from "events"; -const sdk = require('matrix-react-sdk'); +import sdk from '../../skinned-sdk'; const MessagePanel = sdk.getComponent('structures.MessagePanel'); import MatrixClientPeg from '../../../src/MatrixClientPeg'; @@ -72,15 +71,14 @@ describe('MessagePanel', function() { const clock = mockclock.clock(); const realSetTimeout = window.setTimeout; const events = mkEvents(); - let sandbox = null; beforeEach(function() { - sandbox = test_utils.stubClient(); + test_utils.stubClient(); client = MatrixClientPeg.get(); client.credentials = {userId: '@me:here'}; // HACK: We assume all settings want to be disabled - SettingsStore.getValue = sinon.stub().returns(false); + SettingsStore.getValue = jest.fn().returns(false); SettingsStore.getValue.withArgs('showDisplaynameChanges').returns(true); // This option clobbers the duration of all animations to be 1ms @@ -94,7 +92,6 @@ describe('MessagePanel', function() { delete Velocity.mock; clock.uninstall(); - sandbox.restore(); }); function mkEvents() { diff --git a/test/components/structures/auth/Login-test.js b/test/components/structures/auth/Login-test.js index d06e754e3e..3520672cbe 100644 --- a/test/components/structures/auth/Login-test.js +++ b/test/components/structures/auth/Login-test.js @@ -14,12 +14,10 @@ See the License for the specific language governing permissions and limitations under the License. */ -import expect from 'expect'; -import sinon from 'sinon'; import React from 'react'; import ReactDOM from 'react-dom'; import ReactTestUtils from 'react-dom/test-utils'; -import sdk from 'matrix-react-sdk'; +import sdk from '../../../skinned-sdk'; import SdkConfig from '../../../../src/SdkConfig'; import {mkServerConfig} from "../../../test-utils"; @@ -36,7 +34,6 @@ describe('Login', function() { }); afterEach(function() { - sinon.restore(); ReactDOM.unmountComponentAtNode(parentDiv); parentDiv.remove(); }); @@ -72,7 +69,7 @@ describe('Login', function() { }); it('should show form without change server link when custom URLs disabled', function() { - sinon.stub(SdkConfig, "get").returns({ + jest.spyOn(SdkConfig, "get").returns({ disable_custom_urls: true, }); diff --git a/test/components/structures/auth/Registration-test.js b/test/components/structures/auth/Registration-test.js index ad82597f8b..12f736640e 100644 --- a/test/components/structures/auth/Registration-test.js +++ b/test/components/structures/auth/Registration-test.js @@ -14,12 +14,10 @@ See the License for the specific language governing permissions and limitations under the License. */ -import expect from 'expect'; -import sinon from 'sinon'; import React from 'react'; import ReactDOM from 'react-dom'; import ReactTestUtils from 'react-dom/test-utils'; -import sdk from 'matrix-react-sdk'; +import sdk from '../../../skinned-sdk'; import SdkConfig from '../../../../src/SdkConfig'; import {mkServerConfig} from "../../../test-utils"; @@ -36,7 +34,6 @@ describe('Registration', function() { }); afterEach(function() { - sinon.restore(); ReactDOM.unmountComponentAtNode(parentDiv); parentDiv.remove(); }); @@ -61,7 +58,7 @@ describe('Registration', function() { }); it('should show form when custom URLs disabled', function() { - sinon.stub(SdkConfig, "get").returns({ + jest.spyOn(SdkConfig, "get").returns({ disable_custom_urls: true, }); diff --git a/test/components/views/dialogs/InteractiveAuthDialog-test.js b/test/components/views/dialogs/InteractiveAuthDialog-test.js index 5ceba1037b..fe7f538d7d 100644 --- a/test/components/views/dialogs/InteractiveAuthDialog-test.js +++ b/test/components/views/dialogs/InteractiveAuthDialog-test.js @@ -14,14 +14,12 @@ See the License for the specific language governing permissions and limitations under the License. */ -import expect from 'expect'; import React from 'react'; import ReactDOM from 'react-dom'; import ReactTestUtils from 'react-dom/test-utils'; -import sinon from 'sinon'; import MatrixReactTestUtils from 'matrix-react-test-utils'; -import sdk from 'matrix-react-sdk'; +import sdk from '../../../skinned-sdk'; import MatrixClientPeg from '../../../../src/MatrixClientPeg'; import * as test_utils from '../../../test-utils'; @@ -33,10 +31,9 @@ const InteractiveAuthDialog = sdk.getComponent( describe('InteractiveAuthDialog', function() { let parentDiv; - let sandbox; beforeEach(function() { - sandbox = test_utils.stubClient(sandbox); + test_utils.stubClient(); parentDiv = document.createElement('div'); document.body.appendChild(parentDiv); }); @@ -44,12 +41,11 @@ describe('InteractiveAuthDialog', function() { afterEach(function() { ReactDOM.unmountComponentAtNode(parentDiv); parentDiv.remove(); - sandbox.restore(); }); it('Should successfully complete a password flow', function() { - const onFinished = sinon.spy(); - const doRequest = sinon.stub().returns(Promise.resolve({a: 1})); + const onFinished = jest.fn(); + const doRequest = jest.fn().mockResolvedValue({a: 1}); // tell the stub matrixclient to return a real userid const client = MatrixClientPeg.get(); @@ -108,8 +104,8 @@ describe('InteractiveAuthDialog', function() { // let the request complete return sleep(1); }).then(() => { - expect(onFinished.callCount).toEqual(1); - expect(onFinished.calledWithExactly(true, {a: 1})).toBe(true); + expect(onFinished).toBeCalledTimes(1); + expect(onFinished).toBeCalledWith(true, {a: 1}); }); }); }); diff --git a/test/components/views/elements/MemberEventListSummary-test.js b/test/components/views/elements/MemberEventListSummary-test.js index ab69ae10be..e068a8e749 100644 --- a/test/components/views/elements/MemberEventListSummary-test.js +++ b/test/components/views/elements/MemberEventListSummary-test.js @@ -1,8 +1,7 @@ -import expect from 'expect'; import React from 'react'; import ReactTestUtils from 'react-dom/test-utils'; import ShallowRenderer from "react-test-renderer/shallow"; -import sdk from 'matrix-react-sdk'; +import sdk from '../../../skinned-sdk'; import * as languageHandler from '../../../../src/languageHandler'; import * as testUtils from '../../../test-utils'; @@ -12,8 +11,6 @@ const MemberEventListSummary = testUtils.wrapInMatrixClientContext( ); describe('MemberEventListSummary', function() { - let sandbox; - // Generate dummy event tiles for use in simulating an expanded MELS const generateTiles = (events) => { return events.map((e) => { @@ -88,7 +85,7 @@ describe('MemberEventListSummary', function() { }; beforeEach(function(done) { - sandbox = testUtils.stubClient(); + testUtils.stubClient(); languageHandler.setLanguage('en').then(done); languageHandler.setMissingEntryGenerator(function(key) { @@ -96,10 +93,6 @@ describe('MemberEventListSummary', function() { }); }); - afterEach(function() { - sandbox.restore(); - }); - it('renders expanded events if there are less than props.threshold', function() { const events = generateEvents([ {userId: "@user_1:some.domain", prevMembership: "leave", membership: "join"}, diff --git a/test/components/views/groups/GroupMemberList-test.js b/test/components/views/groups/GroupMemberList-test.js index 6ebdbbd320..08f0f781ac 100644 --- a/test/components/views/groups/GroupMemberList-test.js +++ b/test/components/views/groups/GroupMemberList-test.js @@ -17,14 +17,13 @@ limitations under the License. import React from "react"; import ReactDOM from "react-dom"; import ReactTestUtils from "react-dom/test-utils"; -import expect from "expect"; import MockHttpBackend from "matrix-mock-request"; import MatrixClientPeg from "../../../../src/MatrixClientPeg"; -import sdk from "matrix-react-sdk"; +import sdk from "../../../skinned-sdk"; import Matrix from "matrix-js-sdk"; -import * as TestUtils from "test-utils"; +import * as TestUtils from "../../../test-utils"; const { waitForUpdate } = TestUtils; const GroupMemberList = sdk.getComponent("views.groups.GroupMemberList"); diff --git a/test/components/views/rooms/MemberList-test.js b/test/components/views/rooms/MemberList-test.js index 2a275e1895..bc12041398 100644 --- a/test/components/views/rooms/MemberList-test.js +++ b/test/components/views/rooms/MemberList-test.js @@ -1,10 +1,9 @@ import React from 'react'; import ReactTestUtils from 'react-dom/test-utils'; import ReactDOM from 'react-dom'; -import expect from 'expect'; import lolex from 'lolex'; -import * as TestUtils from 'test-utils'; +import * as TestUtils from '../../../test-utils'; import sdk from '../../../../src/index'; import MatrixClientPeg from '../../../../src/MatrixClientPeg'; @@ -26,7 +25,6 @@ describe('MemberList', () => { } let parentDiv = null; - let sandbox = null; let client = null; let root = null; let clock = null; @@ -38,7 +36,7 @@ describe('MemberList', () => { let defaultUsers = []; beforeEach(function() { - sandbox = TestUtils.stubClient(sandbox); + TestUtils.stubClient(); client = MatrixClientPeg.get(); client.hasLazyLoadMembersEnabled = () => false; @@ -115,7 +113,6 @@ describe('MemberList', () => { parentDiv.remove(); parentDiv = null; } - sandbox.restore(); clock.uninstall(); diff --git a/test/components/views/rooms/MessageComposerInput-test.js b/test/components/views/rooms/MessageComposerInput-test.js index 687bbac926..defdb8c69c 100644 --- a/test/components/views/rooms/MessageComposerInput-test.js +++ b/test/components/views/rooms/MessageComposerInput-test.js @@ -1,10 +1,8 @@ import React from 'react'; import ReactTestUtils from 'react-dom/test-utils'; import ReactDOM from 'react-dom'; -import expect from 'expect'; -import sinon from 'sinon'; import * as testUtils from '../../../test-utils'; -import sdk from 'matrix-react-sdk'; +import sdk from '../../../skinned-sdk'; const MessageComposerInput = sdk.getComponent('views.rooms.MessageComposerInput'); import MatrixClientPeg from '../../../../src/MatrixClientPeg'; import {sleep} from "../../../../src/utils/promise"; @@ -23,13 +21,12 @@ function addTextToDraft(text) { xdescribe('MessageComposerInput', () => { let parentDiv = null, - sandbox = null, client = null, mci = null, room = testUtils.mkStubRoom('!DdJkzRliezrwpNebLk:matrix.org'); beforeEach(function() { - sandbox = testUtils.stubClient(sandbox); + testUtils.stubClient(); client = MatrixClientPeg.get(); client.credentials = {userId: '@me:domain.com'}; @@ -54,7 +51,6 @@ xdescribe('MessageComposerInput', () => { parentDiv.remove(); parentDiv = null; } - sandbox.restore(); done(); }); }); @@ -75,66 +71,66 @@ xdescribe('MessageComposerInput', () => { }); it('should not send messages when composer is empty', () => { - const spy = sinon.spy(client, 'sendMessage'); + const spy = jest.spyOn(client, 'sendMessage'); mci.enableRichtext(true); - mci.handleReturn(sinon.stub()); + mci.handleReturn(jest.fn()); - expect(spy.calledOnce).toEqual(false, 'should not send message'); + expect(spy).not.toBeCalled(); }); it('should not change content unnecessarily on RTE -> Markdown conversion', () => { - const spy = sinon.spy(client, 'sendMessage'); + const spy = jest.spyOn(client, 'sendMessage'); mci.enableRichtext(true); addTextToDraft('a'); mci.handleKeyCommand('toggle-mode'); - mci.handleReturn(sinon.stub()); + mci.handleReturn(jest.fn()); expect(spy.calledOnce).toEqual(true); expect(spy.args[0][1].body).toEqual('a'); }); it('should not change content unnecessarily on Markdown -> RTE conversion', () => { - const spy = sinon.spy(client, 'sendMessage'); + const spy = jest.spyOn(client, 'sendMessage'); mci.enableRichtext(false); addTextToDraft('a'); mci.handleKeyCommand('toggle-mode'); - mci.handleReturn(sinon.stub()); + mci.handleReturn(jest.fn()); expect(spy.calledOnce).toEqual(true); expect(spy.args[0][1].body).toEqual('a'); }); it('should send emoji messages when rich text is enabled', () => { - const spy = sinon.spy(client, 'sendMessage'); + const spy = jest.spyOn(client, 'sendMessage'); mci.enableRichtext(true); addTextToDraft('☹'); - mci.handleReturn(sinon.stub()); + mci.handleReturn(jest.fn()); expect(spy.calledOnce).toEqual(true, 'should send message'); }); it('should send emoji messages when Markdown is enabled', () => { - const spy = sinon.spy(client, 'sendMessage'); + const spy = jest.spyOn(client, 'sendMessage'); mci.enableRichtext(false); addTextToDraft('☹'); - mci.handleReturn(sinon.stub()); + mci.handleReturn(jest.fn()); expect(spy.calledOnce).toEqual(true, 'should send message'); }); // FIXME // it('should convert basic Markdown to rich text correctly', () => { - // const spy = sinon.spy(client, 'sendHtmlMessage'); + // const spy = jest.spyOn(client, 'sendHtmlMessage'); // mci.enableRichtext(false); // addTextToDraft('*abc*'); // mci.handleKeyCommand('toggle-mode'); - // mci.handleReturn(sinon.stub()); + // mci.handleReturn(jest.fn()); // console.error(spy.args[0][2]); // expect(spy.args[0][2]).toContain('abc'); // }); // // it('should convert basic rich text to Markdown correctly', () => { - // const spy = sinon.spy(client, 'sendHtmlMessage'); + // const spy = jest.spyOn(client, 'sendHtmlMessage'); // mci.enableRichtext(true); // process.nextTick(() => { // @@ -142,43 +138,43 @@ xdescribe('MessageComposerInput', () => { // mci.handleKeyCommand('italic'); // addTextToDraft('abc'); // mci.handleKeyCommand('toggle-mode'); - // mci.handleReturn(sinon.stub()); + // mci.handleReturn(jest.fn()); // expect(['_abc_', '*abc*']).toContain(spy.args[0][1]); // }); it('should insert formatting characters in Markdown mode', () => { - const spy = sinon.spy(client, 'sendMessage'); + const spy = jest.spyOn(client, 'sendMessage'); mci.enableRichtext(false); mci.handleKeyCommand('italic'); - mci.handleReturn(sinon.stub()); + mci.handleReturn(jest.fn()); expect(['__', '**']).toContain(spy.args[0][1].body); }); it('should not entity-encode " in Markdown mode', () => { - const spy = sinon.spy(client, 'sendMessage'); + const spy = jest.spyOn(client, 'sendMessage'); mci.enableRichtext(false); addTextToDraft('"'); - mci.handleReturn(sinon.stub()); + mci.handleReturn(jest.fn()); expect(spy.calledOnce).toEqual(true); expect(spy.args[0][1].body).toEqual('"'); }); it('should escape characters without other markup in Markdown mode', () => { - const spy = sinon.spy(client, 'sendMessage'); + const spy = jest.spyOn(client, 'sendMessage'); mci.enableRichtext(false); addTextToDraft('\\*escaped\\*'); - mci.handleReturn(sinon.stub()); + mci.handleReturn(jest.fn()); expect(spy.calledOnce).toEqual(true); expect(spy.args[0][1].body).toEqual('*escaped*'); }); it('should escape characters with other markup in Markdown mode', () => { - const spy = sinon.spy(client, 'sendMessage'); + const spy = jest.spyOn(client, 'sendMessage'); mci.enableRichtext(false); addTextToDraft('\\*escaped\\* *italic*'); - mci.handleReturn(sinon.stub()); + mci.handleReturn(jest.fn()); expect(spy.calledOnce).toEqual(true); expect(spy.args[0][1].body).toEqual('\\*escaped\\* *italic*'); @@ -186,20 +182,20 @@ xdescribe('MessageComposerInput', () => { }); it('should not convert -_- into a horizontal rule in Markdown mode', () => { - const spy = sinon.spy(client, 'sendMessage'); + const spy = jest.spyOn(client, 'sendMessage'); mci.enableRichtext(false); addTextToDraft('-_-'); - mci.handleReturn(sinon.stub()); + mci.handleReturn(jest.fn()); expect(spy.calledOnce).toEqual(true); expect(spy.args[0][1].body).toEqual('-_-'); }); it('should not strip tags in Markdown mode', () => { - const spy = sinon.spy(client, 'sendMessage'); + const spy = jest.spyOn(client, 'sendMessage'); mci.enableRichtext(false); addTextToDraft('striked-out'); - mci.handleReturn(sinon.stub()); + mci.handleReturn(jest.fn()); expect(spy.calledOnce).toEqual(true); expect(spy.args[0][1].body).toEqual('striked-out'); @@ -207,30 +203,30 @@ xdescribe('MessageComposerInput', () => { }); it('should not strike-through ~~~ in Markdown mode', () => { - const spy = sinon.spy(client, 'sendMessage'); + const spy = jest.spyOn(client, 'sendMessage'); mci.enableRichtext(false); addTextToDraft('~~~striked-out~~~'); - mci.handleReturn(sinon.stub()); + mci.handleReturn(jest.fn()); expect(spy.calledOnce).toEqual(true); expect(spy.args[0][1].body).toEqual('~~~striked-out~~~'); }); it('should not mark single unmarkedup paragraphs as HTML in Markdown mode', () => { - const spy = sinon.spy(client, 'sendMessage'); + const spy = jest.spyOn(client, 'sendMessage'); mci.enableRichtext(false); addTextToDraft('Lorem ipsum dolor sit amet, consectetur adipiscing elit.'); - mci.handleReturn(sinon.stub()); + mci.handleReturn(jest.fn()); expect(spy.calledOnce).toEqual(true); expect(spy.args[0][1].body).toEqual('Lorem ipsum dolor sit amet, consectetur adipiscing elit.'); }); it('should not mark two unmarkedup paragraphs as HTML in Markdown mode', () => { - const spy = sinon.spy(client, 'sendMessage'); + const spy = jest.spyOn(client, 'sendMessage'); mci.enableRichtext(false); addTextToDraft('Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n\nFusce congue sapien sed neque molestie volutpat.'); - mci.handleReturn(sinon.stub()); + mci.handleReturn(jest.fn()); expect(spy.calledOnce).toEqual(true); expect(spy.args[0][1].body).toEqual('Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n\nFusce congue sapien sed neque molestie volutpat.'); @@ -238,7 +234,7 @@ xdescribe('MessageComposerInput', () => { it('should strip tab-completed mentions so that only the display name is sent in the plain body in Markdown mode', () => { // Sending a HTML message because we have entities in the composer (because of completions) - const spy = sinon.spy(client, 'sendMessage'); + const spy = jest.spyOn(client, 'sendMessage'); mci.enableRichtext(false); mci.setDisplayedCompletion({ completion: 'Some Member', @@ -246,7 +242,7 @@ xdescribe('MessageComposerInput', () => { href: `https://matrix.to/#/@some_member:domain.bla`, }); - mci.handleReturn(sinon.stub()); + mci.handleReturn(jest.fn()); expect(spy.args[0][1].body).toEqual( 'Some Member', @@ -260,7 +256,7 @@ xdescribe('MessageComposerInput', () => { it('should strip tab-completed mentions so that only the display name is sent in the plain body in RTE mode', () => { // Sending a HTML message because we have entities in the composer (because of completions) - const spy = sinon.spy(client, 'sendMessage'); + const spy = jest.spyOn(client, 'sendMessage'); mci.enableRichtext(true); mci.setDisplayedCompletion({ completion: 'Some Member', @@ -268,7 +264,7 @@ xdescribe('MessageComposerInput', () => { href: `https://matrix.to/#/@some_member:domain.bla`, }); - mci.handleReturn(sinon.stub()); + mci.handleReturn(jest.fn()); expect(spy.args[0][1].body).toEqual('Some Member'); expect(spy.args[0][1].formatted_body).toEqual('Some Member'); @@ -276,12 +272,12 @@ xdescribe('MessageComposerInput', () => { it('should not strip non-tab-completed mentions when manually typing MD', () => { // Sending a HTML message because we have entities in the composer (because of completions) - const spy = sinon.spy(client, 'sendMessage'); + const spy = jest.spyOn(client, 'sendMessage'); // Markdown mode enabled mci.enableRichtext(false); addTextToDraft('[My Not-Tab-Completed Mention](https://matrix.to/#/@some_member:domain.bla)'); - mci.handleReturn(sinon.stub()); + mci.handleReturn(jest.fn()); expect(spy.args[0][1].body).toEqual('[My Not-Tab-Completed Mention](https://matrix.to/#/@some_member:domain.bla)'); expect(spy.args[0][1].formatted_body).toEqual('My Not-Tab-Completed Mention'); @@ -289,12 +285,12 @@ xdescribe('MessageComposerInput', () => { it('should not strip arbitrary typed (i.e. not tab-completed) MD links', () => { // Sending a HTML message because we have entities in the composer (because of completions) - const spy = sinon.spy(client, 'sendMessage'); + const spy = jest.spyOn(client, 'sendMessage'); // Markdown mode enabled mci.enableRichtext(false); addTextToDraft('[Click here](https://some.lovely.url)'); - mci.handleReturn(sinon.stub()); + mci.handleReturn(jest.fn()); expect(spy.args[0][1].body).toEqual('[Click here](https://some.lovely.url)'); expect(spy.args[0][1].formatted_body).toEqual('Click here'); diff --git a/test/components/views/rooms/RoomList-test.js b/test/components/views/rooms/RoomList-test.js index cea2105480..446abede3d 100644 --- a/test/components/views/rooms/RoomList-test.js +++ b/test/components/views/rooms/RoomList-test.js @@ -1,10 +1,9 @@ import React from 'react'; import ReactTestUtils from 'react-dom/test-utils'; import ReactDOM from 'react-dom'; -import expect from 'expect'; import lolex from 'lolex'; -import * as TestUtils from 'test-utils'; +import * as TestUtils from '../../../test-utils'; import sdk from '../../../../src/index'; import MatrixClientPeg from '../../../../src/MatrixClientPeg'; @@ -31,7 +30,6 @@ describe('RoomList', () => { } let parentDiv = null; - let sandbox = null; let client = null; let root = null; const myUserId = '@me:domain'; @@ -45,7 +43,7 @@ describe('RoomList', () => { let myOtherMember; beforeEach(function() { - sandbox = TestUtils.stubClient(sandbox); + TestUtils.stubClient(); client = MatrixClientPeg.get(); client.credentials = {userId: myUserId}; //revert this to prototype method as the test-utils monkey-patches this to return a hardcoded value @@ -111,7 +109,6 @@ describe('RoomList', () => { parentDiv.remove(); parentDiv = null; } - sandbox.restore(); clock.uninstall(); diff --git a/test/components/views/rooms/RoomSettings-test.js b/test/components/views/rooms/RoomSettings-test.js index 2608eb488a..7b7c554a2c 100644 --- a/test/components/views/rooms/RoomSettings-test.js +++ b/test/components/views/rooms/RoomSettings-test.js @@ -1,190 +1,187 @@ // TODO: Rewrite room settings tests for dialog support -// import React from 'react'; -// import ReactDOM from 'react-dom'; -// import expect from 'expect'; -// import jest from 'jest-mock'; -// import * as testUtils from '../../../test-utils'; -// import sdk from 'matrix-react-sdk'; -// const WrappedRoomSettings = testUtils.wrapInMatrixClientContext(sdk.getComponent('views.rooms.RoomSettings')); -// import MatrixClientPeg from '../../../../src/MatrixClientPeg'; -// import SettingsStore from '../../../../src/settings/SettingsStore'; -// -// -// describe('RoomSettings', () => { -// let parentDiv = null; -// let sandbox = null; -// let client = null; -// let roomSettings = null; -// const room = testUtils.mkStubRoom('!DdJkzRliezrwpNebLk:matrix.org'); -// -// function expectSentStateEvent(roomId, eventType, expectedEventContent) { -// let found = false; -// for (const call of client.sendStateEvent.mock.calls) { -// const [ -// actualRoomId, -// actualEventType, -// actualEventContent, -// ] = call.slice(0, 3); -// -// if (roomId === actualRoomId && actualEventType === eventType) { -// expect(actualEventContent).toEqual(expectedEventContent); -// found = true; -// break; -// } -// } -// expect(found).toBe(true); -// } -// -// beforeEach(function(done) { -// sandbox = testUtils.stubClient(); -// client = MatrixClientPeg.get(); -// client.credentials = {userId: '@me:domain.com'}; -// -// client.setRoomName = jest.fn().mockReturnValue(Promise.resolve()); -// client.setRoomTopic = jest.fn().mockReturnValue(Promise.resolve()); -// client.setRoomDirectoryVisibility = jest.fn().mockReturnValue(Promise.resolve()); -// -// // Covers any room state event (e.g. name, avatar, topic) -// client.sendStateEvent = jest.fn().mockReturnValue(Promise.resolve()); -// -// // Covers room tagging -// client.setRoomTag = jest.fn().mockReturnValue(Promise.resolve()); -// client.deleteRoomTag = jest.fn().mockReturnValue(Promise.resolve()); -// -// // Covers any setting in the SettingsStore -// // (including local client settings not stored via matrix) -// SettingsStore.setValue = jest.fn().mockReturnValue(Promise.resolve()); -// -// parentDiv = document.createElement('div'); -// document.body.appendChild(parentDiv); -// -// const gatherWrappedRef = (r) => {roomSettings = r;}; -// -// // get use wrappedRef because we're using wrapInMatrixClientContext -// ReactDOM.render( -// , -// parentDiv, -// done, -// ); -// }); -// -// afterEach((done) => { -// if (parentDiv) { -// ReactDOM.unmountComponentAtNode(parentDiv); -// parentDiv.remove(); -// parentDiv = null; -// } -// sandbox.restore(); -// done(); -// }); -// -// it('should not set when no setting is changed', (done) => { -// roomSettings.save().then(() => { -// expect(client.sendStateEvent).not.toHaveBeenCalled(); -// expect(client.setRoomTag).not.toHaveBeenCalled(); -// expect(client.deleteRoomTag).not.toHaveBeenCalled(); -// done(); -// }); -// }); -// -// // XXX: Apparently we do call SettingsStore.setValue -// xit('should not settings via the SettingsStore when no setting is changed', (done) => { -// roomSettings.save().then(() => { -// expect(SettingsStore.setValue).not.toHaveBeenCalled(); -// done(); -// }); -// }); -// -// it('should set room name when it has changed', (done) => { -// const name = "My Room Name"; -// roomSettings.setName(name); -// -// roomSettings.save().then(() => { -// expect(client.setRoomName.mock.calls[0].slice(0, 2)) -// .toEqual(['!DdJkzRliezrwpNebLk:matrix.org', name]); -// -// done(); -// }); -// }); -// -// it('should set room topic when it has changed', (done) => { -// const topic = "this is a topic"; -// roomSettings.setTopic(topic); -// -// roomSettings.save().then(() => { -// expect(client.setRoomTopic.mock.calls[0].slice(0, 2)) -// .toEqual(['!DdJkzRliezrwpNebLk:matrix.org', topic]); -// -// done(); -// }); -// }); -// -// it('should set history visibility when it has changed', (done) => { -// const historyVisibility = "translucent"; -// roomSettings.setState({ -// history_visibility: historyVisibility, -// }); -// -// roomSettings.save().then(() => { -// expectSentStateEvent( -// "!DdJkzRliezrwpNebLk:matrix.org", -// "m.room.history_visibility", {history_visibility: historyVisibility}, -// ); -// done(); -// }); -// }); -// -// // XXX: Can't test this because we `getRoomDirectoryVisibility` in `componentWillMount` -// xit('should set room directory publicity when set to true', (done) => { -// const isRoomPublished = true; -// roomSettings.setState({ -// isRoomPublished, -// }, () => { -// roomSettings.save().then(() => { -// expect(client.setRoomDirectoryVisibility.calls[0].arguments.slice(0, 2)) -// .toEqual("!DdJkzRliezrwpNebLk:matrix.org", isRoomPublished ? "public" : "private"); -// done(); -// }); -// }); -// }); -// -// it('should set power levels when changed', (done) => { -// roomSettings.onPowerLevelsChanged(42, "invite"); -// -// roomSettings.save().then(() => { -// expectSentStateEvent( -// "!DdJkzRliezrwpNebLk:matrix.org", -// "m.room.power_levels", { invite: 42 }, -// ); -// done(); -// }); -// }); -// -// it('should set event power levels when changed', (done) => { -// roomSettings.onPowerLevelsChanged(42, "event_levels_m.room.message"); -// -// roomSettings.save().then(() => { -// // We expect all state events to be set to the state_default (50) -// // See powerLevelDescriptors in RoomSettings -// expectSentStateEvent( -// "!DdJkzRliezrwpNebLk:matrix.org", -// "m.room.power_levels", { -// events: { -// 'm.room.message': 42, -// 'm.room.avatar': 50, -// 'm.room.name': 50, -// 'm.room.canonical_alias': 50, -// 'm.room.history_visibility': 50, -// 'm.room.power_levels': 50, -// 'm.room.topic': 50, -// 'im.vector.modular.widgets': 50, -// }, -// }, -// ); -// done(); -// }); -// }); -// }); +import React from 'react'; +import ReactDOM from 'react-dom'; +import jest from 'jest-mock'; +import * as testUtils from '../../../test-utils'; +import sdk from '../../../skinned-sdk'; +const WrappedRoomSettings = testUtils.wrapInMatrixClientContext(sdk.getComponent('views.rooms.RoomSettings')); +import MatrixClientPeg from '../../../../src/MatrixClientPeg'; +import SettingsStore from '../../../../src/settings/SettingsStore'; + + +describe.skip('RoomSettings', () => { + let parentDiv = null; + let client = null; + let roomSettings = null; + const room = testUtils.mkStubRoom('!DdJkzRliezrwpNebLk:matrix.org'); + + function expectSentStateEvent(roomId, eventType, expectedEventContent) { + let found = false; + for (const call of client.sendStateEvent.mock.calls) { + const [ + actualRoomId, + actualEventType, + actualEventContent, + ] = call.slice(0, 3); + + if (roomId === actualRoomId && actualEventType === eventType) { + expect(actualEventContent).toEqual(expectedEventContent); + found = true; + break; + } + } + expect(found).toBe(true); + } + + beforeEach(function(done) { + testUtils.stubClient(); + client = MatrixClientPeg.get(); + client.credentials = {userId: '@me:domain.com'}; + + client.setRoomName = jest.fn().mockReturnValue(Promise.resolve()); + client.setRoomTopic = jest.fn().mockReturnValue(Promise.resolve()); + client.setRoomDirectoryVisibility = jest.fn().mockReturnValue(Promise.resolve()); + + // Covers any room state event (e.g. name, avatar, topic) + client.sendStateEvent = jest.fn().mockReturnValue(Promise.resolve()); + + // Covers room tagging + client.setRoomTag = jest.fn().mockReturnValue(Promise.resolve()); + client.deleteRoomTag = jest.fn().mockReturnValue(Promise.resolve()); + + // Covers any setting in the SettingsStore + // (including local client settings not stored via matrix) + SettingsStore.setValue = jest.fn().mockReturnValue(Promise.resolve()); + + parentDiv = document.createElement('div'); + document.body.appendChild(parentDiv); + + const gatherWrappedRef = (r) => {roomSettings = r;}; + + // get use wrappedRef because we're using wrapInMatrixClientContext + ReactDOM.render( + , + parentDiv, + done, + ); + }); + + afterEach((done) => { + if (parentDiv) { + ReactDOM.unmountComponentAtNode(parentDiv); + parentDiv.remove(); + parentDiv = null; + } + done(); + }); + + it('should not set when no setting is changed', (done) => { + roomSettings.save().then(() => { + expect(client.sendStateEvent).not.toHaveBeenCalled(); + expect(client.setRoomTag).not.toHaveBeenCalled(); + expect(client.deleteRoomTag).not.toHaveBeenCalled(); + done(); + }); + }); + + // XXX: Apparently we do call SettingsStore.setValue + xit('should not settings via the SettingsStore when no setting is changed', (done) => { + roomSettings.save().then(() => { + expect(SettingsStore.setValue).not.toHaveBeenCalled(); + done(); + }); + }); + + it('should set room name when it has changed', (done) => { + const name = "My Room Name"; + roomSettings.setName(name); + + roomSettings.save().then(() => { + expect(client.setRoomName.mock.calls[0].slice(0, 2)) + .toEqual(['!DdJkzRliezrwpNebLk:matrix.org', name]); + + done(); + }); + }); + + it('should set room topic when it has changed', (done) => { + const topic = "this is a topic"; + roomSettings.setTopic(topic); + + roomSettings.save().then(() => { + expect(client.setRoomTopic.mock.calls[0].slice(0, 2)) + .toEqual(['!DdJkzRliezrwpNebLk:matrix.org', topic]); + + done(); + }); + }); + + it('should set history visibility when it has changed', (done) => { + const historyVisibility = "translucent"; + roomSettings.setState({ + history_visibility: historyVisibility, + }); + + roomSettings.save().then(() => { + expectSentStateEvent( + "!DdJkzRliezrwpNebLk:matrix.org", + "m.room.history_visibility", {history_visibility: historyVisibility}, + ); + done(); + }); + }); + + // XXX: Can't test this because we `getRoomDirectoryVisibility` in `componentWillMount` + xit('should set room directory publicity when set to true', (done) => { + const isRoomPublished = true; + roomSettings.setState({ + isRoomPublished, + }, () => { + roomSettings.save().then(() => { + expect(client.setRoomDirectoryVisibility.calls[0].arguments.slice(0, 2)) + .toEqual("!DdJkzRliezrwpNebLk:matrix.org", isRoomPublished ? "public" : "private"); + done(); + }); + }); + }); + + it('should set power levels when changed', (done) => { + roomSettings.onPowerLevelsChanged(42, "invite"); + + roomSettings.save().then(() => { + expectSentStateEvent( + "!DdJkzRliezrwpNebLk:matrix.org", + "m.room.power_levels", { invite: 42 }, + ); + done(); + }); + }); + + it('should set event power levels when changed', (done) => { + roomSettings.onPowerLevelsChanged(42, "event_levels_m.room.message"); + + roomSettings.save().then(() => { + // We expect all state events to be set to the state_default (50) + // See powerLevelDescriptors in RoomSettings + expectSentStateEvent( + "!DdJkzRliezrwpNebLk:matrix.org", + "m.room.power_levels", { + events: { + 'm.room.message': 42, + 'm.room.avatar': 50, + 'm.room.name': 50, + 'm.room.canonical_alias': 50, + 'm.room.history_visibility': 50, + 'm.room.power_levels': 50, + 'm.room.topic': 50, + 'im.vector.modular.widgets': 50, + }, + }, + ); + done(); + }); + }); +}); diff --git a/test/editor/caret-test.js b/test/editor/caret-test.js index 9da28bff95..f0c171c7c9 100644 --- a/test/editor/caret-test.js +++ b/test/editor/caret-test.js @@ -14,7 +14,6 @@ See the License for the specific language governing permissions and limitations under the License. */ -import expect from 'expect'; import {getLineAndNodePosition} from "../../src/editor/caret"; import EditorModel from "../../src/editor/model"; import {createPartCreator} from "./mock"; diff --git a/test/editor/deserialize-test.js b/test/editor/deserialize-test.js index ae25e45126..1c58a6c40b 100644 --- a/test/editor/deserialize-test.js +++ b/test/editor/deserialize-test.js @@ -14,7 +14,6 @@ See the License for the specific language governing permissions and limitations under the License. */ -import expect from 'expect'; import {parseEvent} from "../../src/editor/deserialize"; import {createPartCreator} from "./mock"; diff --git a/test/editor/diff-test.js b/test/editor/diff-test.js index ebcb058baa..4637206b27 100644 --- a/test/editor/diff-test.js +++ b/test/editor/diff-test.js @@ -14,7 +14,6 @@ See the License for the specific language governing permissions and limitations under the License. */ -import expect from 'expect'; import {diffDeletion, diffAtCaret} from "../../src/editor/diff"; describe('editor/diff', function() { diff --git a/test/editor/history-test.js b/test/editor/history-test.js index 4f227f74dd..e54c1e7ea9 100644 --- a/test/editor/history-test.js +++ b/test/editor/history-test.js @@ -14,7 +14,6 @@ See the License for the specific language governing permissions and limitations under the License. */ -import expect from 'expect'; import HistoryManager, {MAX_STEP_LENGTH} from "../../src/editor/history"; describe('editor/history', function() { diff --git a/test/editor/model-test.js b/test/editor/model-test.js index c5f2a2ef12..826dde3d68 100644 --- a/test/editor/model-test.js +++ b/test/editor/model-test.js @@ -14,7 +14,6 @@ See the License for the specific language governing permissions and limitations under the License. */ -import expect from 'expect'; import EditorModel from "../../src/editor/model"; import {createPartCreator} from "./mock"; diff --git a/test/editor/position-test.js b/test/editor/position-test.js index 7ac4284c60..90f40c21a7 100644 --- a/test/editor/position-test.js +++ b/test/editor/position-test.js @@ -14,7 +14,6 @@ See the License for the specific language governing permissions and limitations under the License. */ -import expect from 'expect'; import EditorModel from "../../src/editor/model"; import {createPartCreator} from "./mock"; diff --git a/test/editor/range-test.js b/test/editor/range-test.js index 468cb60c76..53fb6cb765 100644 --- a/test/editor/range-test.js +++ b/test/editor/range-test.js @@ -14,7 +14,6 @@ See the License for the specific language governing permissions and limitations under the License. */ -import expect from 'expect'; import EditorModel from "../../src/editor/model"; import {createPartCreator} from "./mock"; diff --git a/test/editor/serialize-test.js b/test/editor/serialize-test.js index 2e7712e6e6..7517e46437 100644 --- a/test/editor/serialize-test.js +++ b/test/editor/serialize-test.js @@ -14,7 +14,6 @@ See the License for the specific language governing permissions and limitations under the License. */ -import expect from 'expect'; import EditorModel from "../../src/editor/model"; import {htmlSerializeIfNeeded} from "../../src/editor/serialize"; import {createPartCreator} from "./mock"; diff --git a/test/i18n-test/languageHandler-test.js b/test/i18n-test/languageHandler-test.js index 244fe99000..36dc4bed87 100644 --- a/test/i18n-test/languageHandler-test.js +++ b/test/i18n-test/languageHandler-test.js @@ -5,18 +5,12 @@ import * as languageHandler from '../../src/languageHandler'; const testUtils = require('../test-utils'); describe('languageHandler', function() { - let sandbox; - beforeEach(function(done) { - sandbox = testUtils.stubClient(); + testUtils.stubClient(); languageHandler.setLanguage('en').then(done); }); - afterEach(function() { - sandbox.restore(); - }); - it('translates a string to german', function() { languageHandler.setLanguage('de').then(function() { const translated = languageHandler._t('Rooms'); diff --git a/test/stores/RoomViewStore-test.js b/test/stores/RoomViewStore-test.js index 3762125cd9..249af84885 100644 --- a/test/stores/RoomViewStore-test.js +++ b/test/stores/RoomViewStore-test.js @@ -1,8 +1,5 @@ -import expect from 'expect'; - import RoomViewStore from '../../src/stores/RoomViewStore'; - import peg from '../../src/MatrixClientPeg'; import * as testUtils from '../test-utils'; @@ -10,20 +7,14 @@ import * as testUtils from '../test-utils'; const dispatch = testUtils.getDispatchForStore(RoomViewStore); describe('RoomViewStore', function() { - let sandbox; - beforeEach(function() { - sandbox = testUtils.stubClient(); + testUtils.stubClient(); peg.get().credentials = { userId: "@test:example.com" }; // Reset the state of the store RoomViewStore.reset(); }); - afterEach(function() { - sandbox.restore(); - }); - it('can be used to view a room by ID and join', function(done) { peg.get().joinRoom = (roomAddress) => { expect(roomAddress).toBe("!randomcharacters:aser.ver"); diff --git a/test/test-utils.js b/test/test-utils.js index 9e8768ae71..407791e9c3 100644 --- a/test/test-utils.js +++ b/test/test-utils.js @@ -1,6 +1,5 @@ "use strict"; -import sinon from 'sinon'; import React from 'react'; import PropTypes from 'prop-types'; import peg from '../src/MatrixClientPeg'; @@ -27,8 +26,6 @@ export function getRenderer() { * @returns {sinon.Sandbox}; remember to call sandbox.restore afterwards. */ export function stubClient() { - const sandbox = sinon.sandbox.create(); - const client = createTestClient(); // stub out the methods in MatrixClientPeg @@ -37,12 +34,11 @@ export function stubClient() { // so we do this for each method const methods = ['get', 'unset', 'replaceUsingCreds']; for (let i = 0; i < methods.length; i++) { - sandbox.stub(peg, methods[i]); + peg[methods[i]] = jest.spyOn(peg, methods[i]); } // MatrixClientPeg.get() is called a /lot/, so implement it with our own // fast stub function rather than a sinon stub peg.get = function() { return client; }; - return sandbox; } /** @@ -52,27 +48,27 @@ export function stubClient() { */ export function createTestClient() { return { - getHomeserverUrl: sinon.stub(), - getIdentityServerUrl: sinon.stub(), - getDomain: sinon.stub().returns("matrix.rog"), - getUserId: sinon.stub().returns("@userId:matrix.rog"), + getHomeserverUrl: jest.fn(), + getIdentityServerUrl: jest.fn(), + getDomain: jest.fn().mockReturnValue("matrix.rog"), + getUserId: jest.fn().mockReturnValue("@userId:matrix.rog"), - getPushActionsForEvent: sinon.stub(), - getRoom: sinon.stub().returns(mkStubRoom()), - getRooms: sinon.stub().returns([]), - getVisibleRooms: sinon.stub().returns([]), - getGroups: sinon.stub().returns([]), - loginFlows: sinon.stub(), - on: sinon.stub(), - removeListener: sinon.stub(), - isRoomEncrypted: sinon.stub().returns(false), - peekInRoom: sinon.stub().returns(Promise.resolve(mkStubRoom())), + getPushActionsForEvent: jest.fn(), + getRoom: jest.fn().mockReturnValue(mkStubRoom()), + getRooms: jest.fn().mockReturnValue([]), + getVisibleRooms: jest.fn().mockReturnValue([]), + getGroups: jest.fn().mockReturnValue([]), + loginFlows: jest.fn(), + on: jest.fn(), + removeListener: jest.fn(), + isRoomEncrypted: jest.fn().mockReturnValue(false), + peekInRoom: jest.fn().mockResolvedValue(mkStubRoom()), - paginateEventTimeline: sinon.stub().returns(Promise.resolve()), - sendReadReceipt: sinon.stub().returns(Promise.resolve()), - getRoomIdForAlias: sinon.stub().returns(Promise.resolve()), - getRoomDirectoryVisibility: sinon.stub().returns(Promise.resolve()), - getProfileInfo: sinon.stub().returns(Promise.resolve({})), + paginateEventTimeline: jest.fn().mockResolvedValue(undefined), + sendReadReceipt: jest.fn().mockResolvedValue(undefined), + getRoomIdForAlias: jest.fn().mockResolvedValue(undefined), + getRoomDirectoryVisibility: jest.fn().mockResolvedValue(undefined), + getProfileInfo: jest.fn().mockResolvedValue({}), getAccountData: (type) => { return mkEvent({ type, @@ -81,9 +77,9 @@ export function createTestClient() { }); }, mxcUrlToHttp: (mxc) => 'http://this.is.a.url/', - setAccountData: sinon.stub(), - sendTyping: sinon.stub().returns(Promise.resolve({})), - sendMessage: () => Promise.resolve({}), + setAccountData: jest.fn(), + sendTyping: jest.fn().mockResolvedValue({}), + sendMessage: () => jest.fn().mockResolvedValue({}), getSyncState: () => "SYNCING", generateClientSecret: () => "t35tcl1Ent5ECr3T", isGuest: () => false, @@ -214,15 +210,15 @@ export function mkStubRoom(roomId = null) { const stubTimeline = { getEvents: () => [] }; return { roomId, - getReceiptsForEvent: sinon.stub().returns([]), - getMember: sinon.stub().returns({ + getReceiptsForEvent: jest.fn().mockReturnValue([]), + getMember: jest.fn().mockReturnValue({ userId: '@member:domain.bla', name: 'Member', roomId: roomId, getAvatarUrl: () => 'mxc://avatar.url/image.png', }), - getMembersWithMembership: sinon.stub().returns([]), - getJoinedMembers: sinon.stub().returns([]), + getMembersWithMembership: jest.fn().mockReturnValue([]), + getJoinedMembers: jest.fn().mockReturnValue([]), getPendingEvents: () => [], getLiveTimeline: () => stubTimeline, getUnfilteredTimelineSet: () => null, @@ -231,12 +227,12 @@ export function mkStubRoom(roomId = null) { getVersion: () => '1', shouldUpgradeToVersion: () => null, getMyMembership: () => "join", - maySendMessage: sinon.stub().returns(true), + maySendMessage: jest.fn().mockReturnValue(true), currentState: { - getStateEvents: sinon.stub(), - mayClientSendStateEvent: sinon.stub().returns(true), - maySendStateEvent: sinon.stub().returns(true), - maySendEvent: sinon.stub().returns(true), + getStateEvents: jest.fn(), + mayClientSendStateEvent: jest.fn().mockReturnValue(true), + maySendStateEvent: jest.fn().mockReturnValue(true), + maySendEvent: jest.fn().mockReturnValue(true), members: [], }, tags: { @@ -244,9 +240,9 @@ export function mkStubRoom(roomId = null) { order: 0.5, }, }, - setBlacklistUnverifiedDevices: sinon.stub(), - on: sinon.stub(), - removeListener: sinon.stub(), + setBlacklistUnverifiedDevices: jest.fn(), + on: jest.fn(), + removeListener: jest.fn(), }; } @@ -295,7 +291,7 @@ export function wrapInMatrixClientContext(WrappedComponent) { /** * Call fn before calling componentDidUpdate on a react component instance, inst. * @param {React.Component} inst an instance of a React component. - * @param {integer} updates Number of updates to wait for. (Defaults to 1.) + * @param {number} updates Number of updates to wait for. (Defaults to 1.) * @returns {Promise} promise that resolves when componentDidUpdate is called on * given component instance. */ diff --git a/test/utils/MegolmExportEncryption-test.js b/test/utils/MegolmExportEncryption-test.js index a1dae391e6..0973f75a31 100644 --- a/test/utils/MegolmExportEncryption-test.js +++ b/test/utils/MegolmExportEncryption-test.js @@ -16,9 +16,7 @@ limitations under the License. "use strict"; -import * as MegolmExportEncryption from '../../src/utils/MegolmExportEncryption'; - -import expect from 'expect'; +import SubtleCrypto from 'subtle'; const TEST_VECTORS=[ [ @@ -58,19 +56,22 @@ const TEST_VECTORS=[ "bWnSXS9oymiqwUIGs08sXI33ZA==\n" + "-----END MEGOLM SESSION DATA-----", ], -] -; +]; function stringToArray(s) { return new TextEncoder().encode(s).buffer; } describe('MegolmExportEncryption', function() { - before(function() { - // if we don't have subtlecrypto, go home now - if (!window.crypto.subtle && !window.crypto.webkitSubtle) { - this.skip(); - } + let MegolmExportEncryption; + + beforeAll(() => { + window.crypto = { subtle: SubtleCrypto }; + MegolmExportEncryption = require("../../src/utils/MegolmExportEncryption"); + }); + + afterAll(() => { + window.crypto = undefined; }); describe('decrypt', function() { diff --git a/test/utils/permalinks/Permalinks-test.js b/test/utils/permalinks/Permalinks-test.js index 2f58afc380..05be3a6e5b 100644 --- a/test/utils/permalinks/Permalinks-test.js +++ b/test/utils/permalinks/Permalinks-test.js @@ -13,7 +13,6 @@ See the License for the specific language governing permissions and limitations under the License. */ -import expect from 'expect'; import peg from '../../../src/MatrixClientPeg'; import { makeGroupPermalink, @@ -66,17 +65,11 @@ function mockRoom(roomId, members, serverACL) { } describe('Permalinks', function() { - let sandbox; - beforeEach(function() { - sandbox = testUtils.stubClient(); + testUtils.stubClient(); peg.get().credentials = { userId: "@test:example.com" }; }); - afterEach(function() { - sandbox.restore(); - }); - it('should pick no candidate servers when the room has no members', function() { const room = mockRoom("!fake:example.org", []); const creator = new RoomPermalinkCreator(room); diff --git a/yarn.lock b/yarn.lock index a84fe7b76f..61a8c49591 100644 --- a/yarn.lock +++ b/yarn.lock @@ -125,42 +125,6 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" -"@jest/console@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" - integrity sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ== - dependencies: - "@jest/source-map" "^24.9.0" - chalk "^2.0.1" - slash "^2.0.0" - -"@jest/source-map@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.9.0.tgz#0e263a94430be4b41da683ccc1e6bffe2a191714" - integrity sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg== - dependencies: - callsites "^3.0.0" - graceful-fs "^4.1.15" - source-map "^0.6.0" - -"@jest/test-result@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.9.0.tgz#11796e8aa9dbf88ea025757b3152595ad06ba0ca" - integrity sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA== - dependencies: - "@jest/console" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/istanbul-lib-coverage" "^2.0.0" - -"@jest/types@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" - integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^1.1.1" - "@types/yargs" "^13.0.0" - "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" @@ -174,42 +138,6 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== -"@sinonjs/commons@^1", "@sinonjs/commons@^1.3.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.6.0.tgz#ec7670432ae9c8eb710400d112c201a362d83393" - integrity sha512-w4/WHG7C4WWFyE5geCieFJF6MZkbW4VAriol5KlmQXpAQdxvV0p26sqNZOW6Qyw6Y0l9K4g+cHvvczR2sEEpqg== - dependencies: - type-detect "4.0.8" - -"@sinonjs/formatio@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-2.0.0.tgz#84db7e9eb5531df18a8c5e0bfb6e449e55e654b2" - integrity sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg== - dependencies: - samsam "1.3.0" - -"@sinonjs/formatio@^3.2.1": - version "3.2.2" - resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-3.2.2.tgz#771c60dfa75ea7f2d68e3b94c7e888a78781372c" - integrity sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ== - dependencies: - "@sinonjs/commons" "^1" - "@sinonjs/samsam" "^3.1.0" - -"@sinonjs/samsam@^3.1.0": - version "3.3.3" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-3.3.3.tgz#46682efd9967b259b81136b9f120fd54585feb4a" - integrity sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ== - dependencies: - "@sinonjs/commons" "^1.3.0" - array-from "^2.1.1" - lodash "^4.17.15" - -"@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" - integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== - "@types/events@*": version "3.0.0" resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" @@ -224,26 +152,6 @@ "@types/minimatch" "*" "@types/node" "*" -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" - integrity sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg== - -"@types/istanbul-lib-report@*": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz#e5471e7fa33c61358dd38426189c037a58433b8c" - integrity sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz#7a8cbf6a406f36c8add871625b278eaf0b0d255a" - integrity sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA== - dependencies: - "@types/istanbul-lib-coverage" "*" - "@types/istanbul-lib-report" "*" - "@types/json-schema@^7.0.3": version "7.0.3" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.3.tgz#bdfd69d61e464dcc81b25159c270d75a73c1a636" @@ -259,11 +167,6 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.14.tgz#1c1d6e3c75dba466e0326948d56e8bd72a1903d2" integrity sha512-u/SJDyXwuihpwjXy7hOOghagLEV1KdAST6syfnOk6QZAMzZuWZqXy5aYYZbh8Jdpd4escVFP0MvftHNDb9pruA== -"@types/stack-utils@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" - integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== - "@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2": version "2.0.3" resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e" @@ -285,18 +188,6 @@ "@types/unist" "*" "@types/vfile-message" "*" -"@types/yargs-parser@*": - version "13.1.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-13.1.0.tgz#c563aa192f39350a1d18da36c5a8da382bbd8228" - integrity sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg== - -"@types/yargs@^13.0.0": - version "13.0.3" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.3.tgz#76482af3981d4412d65371a318f992d33464a380" - integrity sha512-K8/LfZq2duW33XW/tFwEAfnZlqIfVsoyRB3kfXdPXYhl0nfM8mmh7GS0jg7WrX2Dgq/0Ha/pR1PaR+BvmWwjiQ== - dependencies: - "@types/yargs-parser" "*" - "@typescript-eslint/experimental-utils@^2.5.0": version "2.10.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.10.0.tgz#8db1656cdfd3d9dcbdbf360b8274dea76f0b2c2c" @@ -592,7 +483,7 @@ ansi-regex@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= -ansi-regex@^4.0.0, ansi-regex@^4.1.0: +ansi-regex@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== @@ -692,11 +583,6 @@ array-find-index@^1.0.1: resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= -array-from@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/array-from/-/array-from-2.1.1.tgz#cfe9d8c26628b9dc5aecc62a9f5d8f1f352c1195" - integrity sha1-z+nYwmYoudxa7MYqn12PHzUsEZU= - array-includes@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" @@ -1649,6 +1535,11 @@ blob@0.0.5: resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig== +bluebird@^2.9.27: + version "2.11.0" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1" + integrity sha1-U0uQM8AiyVecVro7Plpcqvu2UOE= + bluebird@^3.3.0, bluebird@^3.5.0, bluebird@^3.5.5: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" @@ -2689,12 +2580,7 @@ diff-match-patch@^1.0.4: resolved "https://registry.yarnpkg.com/diff-match-patch/-/diff-match-patch-1.0.4.tgz#6ac4b55237463761c4daf0dc603eb869124744b1" integrity sha512-Uv3SW8bmH9nAtHKaKSanOQmj2DnlH65fUpcrMdfdaOxUG02QQ4YGZ8AE7kKOMisF7UqvOlGKVYWRvezdncW9lg== -diff-sequences@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" - integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew== - -diff@3.5.0, diff@^3.2.0, diff@^3.5.0: +diff@3.5.0, diff@^3.2.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== @@ -2813,6 +2699,13 @@ duplexify@^3.4.2, duplexify@^3.6.0: readable-stream "^2.0.0" stream-shift "^1.0.0" +ecc-jsbn@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.0.1.tgz#970577ba31b4976fb1889a298cb7451d896c466d" + integrity sha1-lwV3ujG0l2+xiJopjLdFHYlsRm0= + dependencies: + jsbn "git+https://github.com/rynomad/jsbn.git" + ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" @@ -2821,6 +2714,12 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" +"ecc-qj@git+https://github.com/rynomad/ecc.git": + version "0.0.1" + resolved "git+https://github.com/rynomad/ecc.git#a8c599363dab87a5c95274338d863233f00f7c4a" + dependencies: + nan "^1.6.2" + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -3370,18 +3269,6 @@ expect@^23.6.0: jest-message-util "^23.4.0" jest-regex-util "^23.3.0" -expect@^24.1.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-24.9.0.tgz#b75165b4817074fa4a157794f46fe9f1ba15b6ca" - integrity sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q== - dependencies: - "@jest/types" "^24.9.0" - ansi-styles "^3.2.0" - jest-get-type "^24.9.0" - jest-matcher-utils "^24.9.0" - jest-message-util "^24.9.0" - jest-regex-util "^24.9.0" - extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -4947,11 +4834,6 @@ is-wsl@^1.1.0: resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= - isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -5158,16 +5040,6 @@ jest-diff@^23.6.0: jest-get-type "^22.1.0" pretty-format "^23.6.0" -jest-diff@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da" - integrity sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ== - dependencies: - chalk "^2.0.1" - diff-sequences "^24.9.0" - jest-get-type "^24.9.0" - pretty-format "^24.9.0" - jest-docblock@^23.2.0: version "23.2.0" resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-23.2.0.tgz#f085e1f18548d99fdd69b20207e6fd55d91383a7" @@ -5205,11 +5077,6 @@ jest-get-type@^22.1.0: resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.4.3.tgz#e3a8504d8479342dd4420236b322869f18900ce4" integrity sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w== -jest-get-type@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" - integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q== - jest-haste-map@^23.6.0: version "23.6.0" resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-23.6.0.tgz#2e3eb997814ca696d62afdb3f2529f5bbc935e16" @@ -5258,16 +5125,6 @@ jest-matcher-utils@^23.6.0: jest-get-type "^22.1.0" pretty-format "^23.6.0" -jest-matcher-utils@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz#f5b3661d5e628dffe6dd65251dfdae0e87c3a073" - integrity sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA== - dependencies: - chalk "^2.0.1" - jest-diff "^24.9.0" - jest-get-type "^24.9.0" - pretty-format "^24.9.0" - jest-message-util@^23.4.0: version "23.4.0" resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-23.4.0.tgz#17610c50942349508d01a3d1e0bda2c079086a9f" @@ -5279,20 +5136,6 @@ jest-message-util@^23.4.0: slash "^1.0.0" stack-utils "^1.0.1" -jest-message-util@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.9.0.tgz#527f54a1e380f5e202a8d1149b0ec872f43119e3" - integrity sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw== - dependencies: - "@babel/code-frame" "^7.0.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/stack-utils" "^1.0.1" - chalk "^2.0.1" - micromatch "^3.1.10" - slash "^2.0.0" - stack-utils "^1.0.1" - jest-mock@^23.2.0: version "23.2.0" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-23.2.0.tgz#ad1c60f29e8719d47c26e1138098b6d18b261134" @@ -5303,11 +5146,6 @@ jest-regex-util@^23.3.0: resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-23.3.0.tgz#5f86729547c2785c4002ceaa8f849fe8ca471bc5" integrity sha1-X4ZylUfCeFxAAs6qj4Sf6MpHG8U= -jest-regex-util@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.9.0.tgz#c13fb3380bde22bf6575432c493ea8fe37965636" - integrity sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA== - jest-resolve-dependencies@^23.6.0: version "23.6.0" resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-23.6.0.tgz#b4526af24c8540d9a3fab102c15081cf509b723d" @@ -5471,6 +5309,10 @@ js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.7.0: argparse "^1.0.7" esprima "^4.0.0" +"jsbn@git+https://github.com/rynomad/jsbn.git": + version "0.0.0" + resolved "git+https://github.com/rynomad/jsbn.git#bb522b0124f75424f89d49446c40a87111942c7b" + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -5592,11 +5434,6 @@ jsx-ast-utils@^2.2.3: array-includes "^3.0.3" object.assign "^4.1.0" -just-extend@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.0.2.tgz#f3f47f7dfca0f989c55410a7ebc8854b07108afc" - integrity sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw== - karma-chrome-launcher@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz#cf1b9d07136cc18fe239327d24654c3dbc368acf" @@ -5830,11 +5667,6 @@ lodash.escaperegexp@^4.1.2: resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347" integrity sha1-ZHYsSGGAglGKw99Mz11YhtriA0c= -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.isboolean@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" @@ -5898,16 +5730,11 @@ loglevel@^1.6.4: resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.6.tgz#0ee6300cc058db6b3551fa1c4bf73b83bb771312" integrity sha512-Sgr5lbboAUBo3eXCSPL4/KoVz3ROKquOjcctxmHIt+vol2DrqTQe3SwkKKuYhEiWB5kYa13YyopJ69deJ1irzQ== -lolex@4.2, lolex@^4.1.0: +lolex@4.2: version "4.2.0" resolved "https://registry.yarnpkg.com/lolex/-/lolex-4.2.0.tgz#ddbd7f6213ca1ea5826901ab1222b65d714b3cd7" integrity sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg== -lolex@^2.4.2: - version "2.7.5" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.7.5.tgz#113001d56bfc7e02d56e36291cc5c413d1aa0733" - integrity sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q== - longest-streak@^2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.3.tgz#3de7a3f47ee18e9074ded8575b5c091f5d0a4105" @@ -6368,6 +6195,11 @@ mute-stream@0.0.7: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= +nan@^1.6.2: + version "1.9.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-1.9.0.tgz#1a9cd2755609766f5c291e4194fce39fde286515" + integrity sha1-GpzSdVYJdm9cKR5BlPzjn94oZRU= + nan@^2.12.1: version "2.14.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" @@ -6419,17 +6251,6 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -nise@^1.3.3: - version "1.5.2" - resolved "https://registry.yarnpkg.com/nise/-/nise-1.5.2.tgz#b6d29af10e48b321b307e10e065199338eeb2652" - integrity sha512-/6RhOUlicRCbE9s+94qCUsyE+pKlVJ5AhIv+jEE7ESKwnbXqulKZ1FYU+XAtHHWE9TinYvAxDUJAb912PwPoWA== - dependencies: - "@sinonjs/formatio" "^3.2.1" - "@sinonjs/text-encoding" "^0.7.1" - just-extend "^4.0.2" - lolex "^4.1.0" - path-to-regexp "^1.7.0" - node-fetch-npm@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz#7258c9046182dca345b4208eda918daf33697ff7" @@ -6447,6 +6268,11 @@ node-fetch@^1.0.1: encoding "^0.1.11" is-stream "^1.0.1" +node-forge@^0.6.20: + version "0.6.49" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.6.49.tgz#f1ee95d5d74623938fe19d698aa5a26d54d2f60f" + integrity sha1-8e6V1ddGI5OP4Z1piqWibVTS9g8= + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -7002,13 +6828,6 @@ path-parse@^1.0.5, path-parse@^1.0.6: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== -path-to-regexp@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" - integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== - dependencies: - isarray "0.0.1" - path-type@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" @@ -7109,6 +6928,13 @@ png-chunks-extract@^1.0.0: dependencies: crc-32 "^0.3.0" +polyfill-promise@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/polyfill-promise/-/polyfill-promise-4.0.1.tgz#f8448dc27c3b967d5f67fc060f56ed64e2286b49" + integrity sha1-+ESNwnw7ln1fZ/wGD1btZOIoa0k= + dependencies: + bluebird "^2.9.27" + posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" @@ -7245,16 +7071,6 @@ pretty-format@^23.6.0: ansi-regex "^3.0.0" ansi-styles "^3.2.0" -pretty-format@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" - integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== - dependencies: - "@jest/types" "^24.9.0" - ansi-regex "^4.0.0" - ansi-styles "^3.2.0" - react-is "^16.8.4" - private@^0.1.6, private@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" @@ -7536,7 +7352,7 @@ react-immutable-proptypes@^2.1.0: resolved "https://registry.yarnpkg.com/react-immutable-proptypes/-/react-immutable-proptypes-2.1.0.tgz#023d6f39bb15c97c071e9e60d00d136eac5fa0b4" integrity sha1-Aj1vObsVyXwHHp5g0A0TbqxfoLQ= -react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6: +react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.6: version "16.12.0" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c" integrity sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q== @@ -8094,11 +7910,6 @@ safe-regex@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -samsam@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.3.0.tgz#8d1d9350e25622da30de3e44ba692b5221ab7c50" - integrity sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg== - sane@^2.0.0: version "2.5.2" resolved "https://registry.yarnpkg.com/sane/-/sane-2.5.2.tgz#b4dc1861c21b427e929507a3e751e2a2cb8ab3fa" @@ -8235,24 +8046,16 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= -sinon@^5.0.7: - version "5.1.1" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-5.1.1.tgz#19c59810ffb733ea6e76a28b94a71fc4c2f523b8" - integrity sha512-h/3uHscbt5pQNxkf7Y/Lb9/OM44YNCicHakcq73ncbrIS8lXg+ZGOZbtuU+/km4YnyiCYfQQEwANaReJz7KDfw== - dependencies: - "@sinonjs/formatio" "^2.0.0" - diff "^3.5.0" - lodash.get "^4.4.2" - lolex "^2.4.2" - nise "^1.3.3" - supports-color "^5.4.0" - type-detect "^4.0.8" - sisteransi@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-0.1.1.tgz#5431447d5f7d1675aac667ccd0b865a4994cb3ce" integrity sha512-PmGOd02bM9YO5ifxpw36nrNMBTptEtfRl4qUYl9SndkolplkrZZOW7PGHjrZL53QvMVj9nQ+TKqUnRsw4tJa4g== +sjcl@^1.0.3: + version "1.0.8" + resolved "https://registry.yarnpkg.com/sjcl/-/sjcl-1.0.8.tgz#f2ec8d7dc1f0f21b069b8914a41a8f236b0e252a" + integrity sha512-LzIjEQ0S0DpIgnxMEayM1rq9aGwGRG4OnZhCdjx7glTaJtf4zRfpg87ImfjSJjoW9vKpagd82McDOwbRT5kQKQ== + slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" @@ -8888,6 +8691,18 @@ stylelint@^9.10.1: svg-tags "^1.0.0" table "^5.0.0" +subtle@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/subtle/-/subtle-0.1.8.tgz#0c12599b9cf13127eda11626510cd8f24f878916" + integrity sha1-DBJZm5zxMSftoRYmUQzY8k+HiRY= + dependencies: + ecc-jsbn "0.0.1" + node-forge "^0.6.20" + polyfill-promise "^4.0.1" + sjcl "^1.0.3" + optionalDependencies: + ecc-qj "git+https://github.com/rynomad/ecc.git" + sugarss@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/sugarss/-/sugarss-2.0.0.tgz#ddd76e0124b297d40bf3cca31c8b22ecb43bc61d" @@ -8928,7 +8743,7 @@ supports-color@^4.5.0: dependencies: has-flag "^2.0.0" -supports-color@^5.3.0, supports-color@^5.4.0: +supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== @@ -9216,11 +9031,6 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -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== - type-is@~1.6.17: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"