From ee9b4cce454a518b0ae67f04efd967d618f69872 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Gr=C3=A9goire=20Aubert?= Date: Wed, 1 Nov 2017 13:41:25 +0100 Subject: [PATCH] Update to React 16 and Enzyme 3 (#2776) * Update to React 16 * Add missing promise catch * Fix jest tests * extract react-dom mock * remove empty snapshots * Fix modals --- server/sonar-web/config/jest/SetupEnzyme.js | 23 + .../config/jest/SetupTestEnvironment.js | 6 + server/sonar-web/package.json | 31 +- .../src/main/js/__mocks__/react-dom.ts | 26 + .../__tests__/ComponentContainer-test.tsx | 75 +- .../component/__tests__/ComponentNav-test.tsx | 10 +- .../__snapshots__/ComponentNav-test.tsx.snap | 1 + .../nav/settings/SettingsEditionsNotif.tsx | 16 +- .../search/__tests__/SearchResult-test.js | 1 + .../account/profile/UserExternalIdentity.js | 4 +- .../components/Stacktrace.tsx | 15 +- .../background-tasks/components/Workers.tsx | 23 +- .../__tests__/ScannerContext-test.tsx | 26 +- .../components/__tests__/Stacktrace-test.tsx | 26 +- .../components/__tests__/TaskActions-test.tsx | 2 + .../src/main/js/apps/code/components/App.tsx | 4 +- .../apps/component-measures/components/App.js | 6 +- .../components/__tests__/App-test.js | 2 +- .../__snapshots__/AssigneeFacet-test.js.snap | 3 + .../__tests__/EditionBoxes-test.tsx | 1 + .../__tests__/PendingActions-test.tsx | 2 +- .../PendingActions-test.tsx.snap | 2 - .../marketplace/components/EditionBox.tsx | 8 +- .../__tests__/EditionBoxBadge-test.tsx | 12 +- .../__tests__/LicenseEditionForm-test.tsx | 2 +- .../__tests__/LicenseEditionSet-test.tsx | 12 +- .../__tests__/PluginLicense-test.tsx | 2 +- .../components/__tests__/PluginUrls-test.tsx | 2 +- .../EditionBoxBadge-test.tsx.snap | 30 +- .../LicenseEditionSet-test.tsx.snap | 10 + .../__snapshots__/PluginLicense-test.tsx.snap | 2 - .../__snapshots__/PluginUrls-test.tsx.snap | 2 - .../components/OrganizationAdmin.js | 6 +- .../components/OrganizationPage.js | 4 +- .../__tests__/OrganizationAdmin-test.js | 16 +- .../__tests__/OrganizationMembers-test.js | 2 + .../__tests__/OrganizationPage-test.js | 21 +- .../OrganizationAdmin-test.js.snap | 2 - .../OrganizationPage-test.js.snap | 7 +- .../components/forms/AddMemberForm.js | 14 +- .../forms/ManageMemberGroupsForm.js | 14 +- .../components/forms/RemoveMemberForm.js | 14 +- .../forms/__tests__/AddMemberForm-test.js | 10 +- .../__tests__/ManageMemberGroupsForm-test.js | 12 +- .../forms/__tests__/RemoveMemberForm-test.js | 8 +- .../__snapshots__/AddMemberForm-test.js.snap | 18 +- .../ManageMemberGroupsForm-test.js.snap | 22 +- .../RemoveMemberForm-test.js.snap | 19 +- .../src/main/js/apps/organizations/routes.js | 8 +- .../ApplicationLeakPeriodLegend-test.js.snap | 8 +- .../main/js/apps/overview/meta/MetaLink.js | 2 +- .../overview/meta/__tests__/MetaTags-test.js | 12 +- .../__snapshots__/MetaLink-test.js.snap | 1 - .../GraphsTooltipsContentDuplication-test.js | 4 +- ...phsTooltipsContentDuplication-test.js.snap | 2 - .../components/forms/AddEventForm.js | 15 +- .../components/forms/AddGraphMetric.js | 16 +- .../components/forms/ChangeEventForm.js | 6 +- .../components/forms/RemoveAnalysisForm.js | 14 +- .../components/forms/RemoveEventForm.js | 5 +- .../__tests__/LongBranchesPattern-test.tsx | 22 +- .../components/__tests__/AllProjects-test.tsx | 12 +- .../__tests__/FavoriteFilter-test.tsx | 6 +- .../__tests__/ProjectCardLanguages-test.tsx | 2 +- .../__tests__/ProjectCardQualityGate-test.tsx | 2 +- .../__snapshots__/AllProjects-test.tsx.snap | 72 +- .../FavoriteFilter-test.tsx.snap | 2 - .../ProjectCardLanguages-test.tsx.snap | 34 +- .../ProjectCardQualityGate-test.tsx.snap | 2 - .../LanguagesFilter-test.tsx.snap | 4 + .../__snapshots__/TagsFilter-test.tsx.snap | 6 + .../projectsManagement/__tests__/App-test.tsx | 15 +- .../__tests__/BulkApplyTemplateModal-test.tsx | 14 +- .../__tests__/Header-test.tsx | 1 + .../__tests__/Search-test.tsx | 1 + .../apps/quality-gates/components/Details.js | 4 +- .../components/ProfileContainer.tsx | 4 +- .../__tests__/ProfileContainer-test.tsx | 17 +- .../__tests__/ProfilePermissions-test.tsx | 23 +- .../ProfilePermissionsFormSelect-test.tsx | 13 +- .../details/__tests__/ProfileRules-test.tsx | 40 +- ...ProfilePermissionsFormSelect-test.tsx.snap | 2 +- .../main/js/apps/quality-profiles/routes.ts | 2 +- .../__snapshots__/SysInfoItem-test.tsx.snap | 1 + .../__tests__/SystemUpgradeNotif-test.tsx | 23 +- .../SystemUpgradeNotif-test.tsx.snap | 6 +- .../__tests__/NewOrganizationForm-test.js | 22 +- .../__tests__/NewProjectForm-test.js | 22 +- .../__tests__/OrganizationStep-test.js | 47 +- .../__tests__/ProjectKeyStep-test.js | 20 +- .../onboarding/__tests__/TokenStep-test.js | 11 +- .../OrganizationStep-test.js.snap | 17 + .../__snapshots__/TokenStep-test.js.snap | 18 + .../commands/__tests__/Command-test.js | 4 +- .../__snapshots__/Command-test.js.snap | 27 +- .../web-api/components/ResponseExample.tsx | 4 +- .../SourceViewer/components/LineCode.js | 8 +- .../__snapshots__/BubbleChart-test.js.snap | 22 + .../main/js/components/common/MultiSelect.js | 4 +- .../common/__tests__/BranchStatus-test.tsx | 10 +- .../__tests__/BubblePopupHelper-test.js | 12 +- .../common/__tests__/DeferredSpinner-test.js | 4 + .../common/__tests__/MultiSelect-test.js | 5 +- .../common/__tests__/SelectList-test.js | 2 +- .../__snapshots__/BranchStatus-test.tsx.snap | 6 +- .../__snapshots__/MultiSelect-test.js.snap | 14 +- .../IssueCommentAction-test.js.snap | 2 + .../shared/__tests__/Organization-test.tsx | 10 +- .../shared/__tests__/QualifierIcon-test.js | 2 +- .../__snapshots__/Organization-test.tsx.snap | 4 - .../__snapshots__/QualifierIcon-test.js.snap | 2 - .../src/main/js/store/utils/configureStore.js | 2 +- server/sonar-web/yarn.lock | 1690 ++++++++--------- 113 files changed, 1638 insertions(+), 1352 deletions(-) create mode 100644 server/sonar-web/config/jest/SetupEnzyme.js create mode 100644 server/sonar-web/src/main/js/__mocks__/react-dom.ts diff --git a/server/sonar-web/config/jest/SetupEnzyme.js b/server/sonar-web/config/jest/SetupEnzyme.js new file mode 100644 index 00000000000..ec2ff5f0561 --- /dev/null +++ b/server/sonar-web/config/jest/SetupEnzyme.js @@ -0,0 +1,23 @@ +/* + * SonarQube + * Copyright (C) 2009-2016 SonarSource SA + * mailto:contact AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +import Enzyme from 'enzyme'; +import Adapter from 'enzyme-adapter-react-16'; + +Enzyme.configure({ adapter: new Adapter() }); diff --git a/server/sonar-web/config/jest/SetupTestEnvironment.js b/server/sonar-web/config/jest/SetupTestEnvironment.js index 64c8d0c15aa..c5d8747dde5 100644 --- a/server/sonar-web/config/jest/SetupTestEnvironment.js +++ b/server/sonar-web/config/jest/SetupTestEnvironment.js @@ -22,3 +22,9 @@ window.t = window.tp = function() { const args = Array.prototype.slice.call(arguments, 0); return args.join('.'); }; + +// Fix for https://github.com/facebook/jest/issues/4545 +// Try to remove when jest 21.3.0 is out +window.requestAnimationFrame = function(callback) { + setTimeout(callback, 0); +}; diff --git a/server/sonar-web/package.json b/server/sonar-web/package.json index 1ec6c0ba8a0..febc889e9b3 100644 --- a/server/sonar-web/package.json +++ b/server/sonar-web/package.json @@ -26,14 +26,14 @@ "lodash": "4.17.4", "prop-types": "15.6.0", "rc-tooltip": "3.5.0", - "react": "15.6.2", - "react-dom": "15.6.2", + "react": "16.0.0", + "react-dom": "16.0.0", "react-draggable": "3.0.3", "react-helmet": "5.2.0", "react-intl": "2.4.0", "react-modal": "3.0.4", "react-redux": "5.0.6", - "react-router": "3.0.5", + "react-router": "3.2.0", "react-select": "1.0.0-rc.10", "react-virtualized": "9.12.0", "redux": "3.7.2", @@ -46,20 +46,19 @@ "@types/classnames": "2.2.3", "@types/d3-array": "1.2.1", "@types/d3-scale": "1.0.10", - "@types/date-fns": "2.6.0", - "@types/enzyme": "2.8.6", + "@types/enzyme": "3.1.1", "@types/escape-html": "0.0.20", "@types/jest": "21.1.5", "@types/jquery": "3.2.11", - "@types/lodash": "4.14.79", + "@types/lodash": "4.14.80", "@types/prop-types": "15.5.2", - "@types/react": "16.0.2", - "@types/react-dom": "15.5.2", + "@types/react": "16.0.19", + "@types/react-dom": "16.0.2", "@types/react-helmet": "5.0.3", "@types/react-intl": "2.3.2", "@types/react-modal": "2.2.2", - "@types/react-redux": "5.0.10", - "@types/react-router": "3.0.5", + "@types/react-redux": "5.0.12", + "@types/react-router": "3.0.13", "@types/react-select": "1.0.59", "autoprefixer": "7.1.6", "awesome-typescript-loader": "3.2.3", @@ -77,8 +76,9 @@ "babel-preset-react": "^6.22.0", "chalk": "2.3.0", "css-loader": "0.28.7", - "enzyme": "2.9.1", - "enzyme-to-json": "2.0.1", + "enzyme": "3.1.0", + "enzyme-adapter-react-16": "1.0.2", + "enzyme-to-json": "3.1.4", "eslint": "4.9.0", "eslint-plugin-import": "2.8.0", "eslint-plugin-jsx-a11y": "6.0.2", @@ -96,10 +96,10 @@ "postcss-loader": "2.0.8", "prettier": "1.7.4", "react-error-overlay": "1.0.7", - "react-test-renderer": "15.6.2", + "react-test-renderer": "16.0.0", "rimraf": "2.6.2", "style-loader": "0.19.0", - "ts-jest": "21.1.3", + "ts-jest": "21.1.4", "typescript": "2.5.3", "typescript-eslint-parser": "8.0.1", "webpack": "3.8.1", @@ -141,7 +141,8 @@ }, "setupFiles": [ "/config/polyfills.js", - "/config/jest/SetupTestEnvironment.js" + "/config/jest/SetupTestEnvironment.js", + "/config/jest/SetupEnzyme.js" ], "snapshotSerializers": ["enzyme-to-json/serializer"], "testPathIgnorePatterns": [ diff --git a/server/sonar-web/src/main/js/__mocks__/react-dom.ts b/server/sonar-web/src/main/js/__mocks__/react-dom.ts new file mode 100644 index 00000000000..a4b6f39bb75 --- /dev/null +++ b/server/sonar-web/src/main/js/__mocks__/react-dom.ts @@ -0,0 +1,26 @@ +/* + * SonarQube + * Copyright (C) 2009-2017 SonarSource SA + * mailto:contact AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +const ReactDOM = require.requireActual('react-dom'); + +//FIXME To be dropped when https://github.com/airbnb/enzyme/issues/1150 is resolved +module.exports = { + ...ReactDOM, + createPortal: (children: React.ReactNode) => children +}; diff --git a/server/sonar-web/src/main/js/app/components/__tests__/ComponentContainer-test.tsx b/server/sonar-web/src/main/js/app/components/__tests__/ComponentContainer-test.tsx index 623451a6542..1ba8962fcbb 100644 --- a/server/sonar-web/src/main/js/app/components/__tests__/ComponentContainer-test.tsx +++ b/server/sonar-web/src/main/js/app/components/__tests__/ComponentContainer-test.tsx @@ -17,23 +17,29 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -/* eslint-disable import/first */ -jest.mock('../../../api/branches', () => ({ getBranches: jest.fn() })); -jest.mock('../../../api/components', () => ({ getComponentData: jest.fn() })); -jest.mock('../../../api/nav', () => ({ getComponentNavigation: jest.fn() })); - -// mock this, because some of its children are using redux store -jest.mock('../nav/component/ComponentNav', () => ({ - default: () => null -})); - import * as React from 'react'; import { shallow, mount } from 'enzyme'; import { ComponentContainer } from '../ComponentContainer'; import { getBranches } from '../../../api/branches'; import { getComponentData } from '../../../api/components'; import { getComponentNavigation } from '../../../api/nav'; -import { doAsync } from '../../../helpers/testUtils'; + +jest.mock('../../../api/branches', () => ({ getBranches: jest.fn(() => Promise.resolve([])) })); +jest.mock('../../../api/components', () => ({ + getComponentData: jest.fn(() => Promise.resolve({})) +})); +jest.mock('../../../api/nav', () => ({ + getComponentNavigation: jest.fn(() => + Promise.resolve({ + breadcrumbs: [{ key: 'portfolioKey', name: 'portfolio', qualifier: 'VW' }] + }) + ) +})); + +// mock this, because some of its children are using redux store +jest.mock('../nav/component/ComponentNav', () => ({ + default: () => null +})); const Inner = () =>
; @@ -60,10 +66,8 @@ it('changes component', () => { expect(wrapper.state().component).toEqual({ qualifier: 'TRK', visibility: 'private' }); }); -it("loads branches for module's project", () => { - (getBranches as jest.Mock).mockImplementation(() => Promise.resolve([])); - (getComponentData as jest.Mock).mockImplementation(() => Promise.resolve({})); - (getComponentNavigation as jest.Mock).mockImplementation(() => +it("loads branches for module's project", async () => { + (getComponentNavigation as jest.Mock).mockImplementationOnce(() => Promise.resolve({ breadcrumbs: [ { key: 'projectKey', name: 'project', qualifier: 'TRK' }, @@ -78,38 +82,28 @@ it("loads branches for module's project", () => { ); - return doAsync().then(() => { - expect(getBranches).toBeCalledWith('projectKey'); - expect(getComponentData).toBeCalledWith('moduleKey', undefined); - expect(getComponentNavigation).toBeCalledWith('moduleKey', undefined); - }); + await new Promise(setImmediate); + expect(getBranches).toBeCalledWith('projectKey'); + expect(getComponentData).toBeCalledWith('moduleKey', undefined); + expect(getComponentNavigation).toBeCalledWith('moduleKey', undefined); }); -it("doesn't load branches portfolio", () => { - (getBranches as jest.Mock).mockImplementation(() => Promise.resolve([])); - (getComponentData as jest.Mock).mockImplementation(() => Promise.resolve({})); - (getComponentNavigation as jest.Mock).mockImplementation(() => - Promise.resolve({ - breadcrumbs: [{ key: 'portfolioKey', name: 'portfolio', qualifier: 'VW' }] - }) - ); - +it("doesn't load branches portfolio", async () => { const wrapper = mount( ); - return doAsync().then(() => { - expect(getBranches).not.toBeCalled(); - expect(getComponentData).toBeCalledWith('portfolioKey', undefined); - expect(getComponentNavigation).toBeCalledWith('portfolioKey', undefined); - expect(wrapper.find(Inner).exists()).toBeTruthy(); - }); + await new Promise(setImmediate); + expect(getBranches).not.toBeCalled(); + expect(getComponentData).toBeCalledWith('portfolioKey', undefined); + expect(getComponentNavigation).toBeCalledWith('portfolioKey', undefined); + wrapper.update(); + expect(wrapper.find(Inner).exists()).toBeTruthy(); }); it('updates branches on change', () => { - (getBranches as jest.Mock).mockImplementation(() => Promise.resolve([])); const wrapper = shallow( @@ -125,8 +119,8 @@ it('updates branches on change', () => { expect(getBranches).toBeCalledWith('projectKey'); }); -it('loads organization', () => { - (getComponentData as jest.Mock).mockImplementation(() => +it('loads organization', async () => { + (getComponentData as jest.Mock).mockImplementationOnce(() => Promise.resolve({ organization: 'org' }) ); @@ -140,7 +134,6 @@ it('loads organization', () => { ); - return doAsync().then(() => { - expect(fetchOrganizations).toBeCalledWith(['org']); - }); + await new Promise(setImmediate); + expect(fetchOrganizations).toBeCalledWith(['org']); }); diff --git a/server/sonar-web/src/main/js/app/components/nav/component/__tests__/ComponentNav-test.tsx b/server/sonar-web/src/main/js/app/components/nav/component/__tests__/ComponentNav-test.tsx index 9975e19bf06..170bce7eb27 100644 --- a/server/sonar-web/src/main/js/app/components/nav/component/__tests__/ComponentNav-test.tsx +++ b/server/sonar-web/src/main/js/app/components/nav/component/__tests__/ComponentNav-test.tsx @@ -17,7 +17,11 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -/* eslint-disable import/first, import/order */ +/* eslint-disable import/order */ +import * as React from 'react'; +import { mount, shallow } from 'enzyme'; +import ComponentNav from '../ComponentNav'; + jest.mock('../ComponentNavFavorite', () => ({ // eslint-disable-next-line default: function ComponentNavFavorite() { @@ -47,10 +51,6 @@ jest.mock('../../../../../api/ce', () => ({ getTasksForComponent: jest.fn(() => Promise.resolve({ queue: [] })) })); -import * as React from 'react'; -import { mount, shallow } from 'enzyme'; -import ComponentNav from '../ComponentNav'; - const getTasksForComponent = require('../../../../../api/ce').getTasksForComponent as jest.Mock< any >; diff --git a/server/sonar-web/src/main/js/app/components/nav/component/__tests__/__snapshots__/ComponentNav-test.tsx.snap b/server/sonar-web/src/main/js/app/components/nav/component/__tests__/__snapshots__/ComponentNav-test.tsx.snap index a8090844fd9..f92f0e066ea 100644 --- a/server/sonar-web/src/main/js/app/components/nav/component/__tests__/__snapshots__/ComponentNav-test.tsx.snap +++ b/server/sonar-web/src/main/js/app/components/nav/component/__tests__/__snapshots__/ComponentNav-test.tsx.snap @@ -21,6 +21,7 @@ exports[`renders 1`] = ` "qualifier": "TRK", } } + currentTask={undefined} isInProgress={true} isPending={true} /> diff --git a/server/sonar-web/src/main/js/app/components/nav/settings/SettingsEditionsNotif.tsx b/server/sonar-web/src/main/js/app/components/nav/settings/SettingsEditionsNotif.tsx index b0340d6730a..2c4cebc6a29 100644 --- a/server/sonar-web/src/main/js/app/components/nav/settings/SettingsEditionsNotif.tsx +++ b/server/sonar-web/src/main/js/app/components/nav/settings/SettingsEditionsNotif.tsx @@ -64,7 +64,7 @@ export default class SettingsEditionsNotif extends React.PureComponent )} {!preventRestart && - this.state.openRestart && } + this.state.openRestart && } ); } @@ -73,14 +73,12 @@ export default class SettingsEditionsNotif extends React.PureComponent - {edition ? ( - translateWithParameters( - 'marketplace.status_x.' + editionStatus.installationStatus, - edition.name - ) - ) : ( - translate('marketplace.status', editionStatus.installationStatus) - )} + {edition + ? translateWithParameters( + 'marketplace.status_x.' + editionStatus.installationStatus, + edition.name + ) + : translate('marketplace.status', editionStatus.installationStatus)} {edition && ( { expect(wrapper.find('Tooltip').prop('visible')).toBe(false); jest.runAllTimers(); + wrapper.update(); expect(wrapper.find('Tooltip').prop('visible')).toBe(true); wrapper.setProps({ selected: false }); diff --git a/server/sonar-web/src/main/js/apps/account/profile/UserExternalIdentity.js b/server/sonar-web/src/main/js/apps/account/profile/UserExternalIdentity.js index fba6c92f27c..c00d9f7fff6 100644 --- a/server/sonar-web/src/main/js/apps/account/profile/UserExternalIdentity.js +++ b/server/sonar-web/src/main/js/apps/account/profile/UserExternalIdentity.js @@ -30,8 +30,8 @@ export default class UserExternalIdentity extends React.PureComponent { this.fetchIdentityProviders(); } - componentDidUpdate(nextProps) { - if (nextProps.user !== this.props.user) { + componentDidUpdate(prevProps) { + if (prevProps.user !== this.props.user) { this.this.fetchIdentityProviders(); } } diff --git a/server/sonar-web/src/main/js/apps/background-tasks/components/Stacktrace.tsx b/server/sonar-web/src/main/js/apps/background-tasks/components/Stacktrace.tsx index 0c450bf02dc..edc3a9d7800 100644 --- a/server/sonar-web/src/main/js/apps/background-tasks/components/Stacktrace.tsx +++ b/server/sonar-web/src/main/js/apps/background-tasks/components/Stacktrace.tsx @@ -47,11 +47,18 @@ export default class Stacktrace extends React.PureComponent { } loadStacktrace() { - getTask(this.props.task.id, ['stacktrace']).then(task => { - if (this.mounted) { - this.setState({ loading: false, stacktrace: task.errorStacktrace }); + getTask(this.props.task.id, ['stacktrace']).then( + task => { + if (this.mounted) { + this.setState({ loading: false, stacktrace: task.errorStacktrace }); + } + }, + () => { + if (this.mounted) { + this.setState({ loading: false }); + } } - }); + ); } handleCloseClick = (event: React.SyntheticEvent) => { diff --git a/server/sonar-web/src/main/js/apps/background-tasks/components/Workers.tsx b/server/sonar-web/src/main/js/apps/background-tasks/components/Workers.tsx index 60312ec8927..ee8225ac722 100644 --- a/server/sonar-web/src/main/js/apps/background-tasks/components/Workers.tsx +++ b/server/sonar-web/src/main/js/apps/background-tasks/components/Workers.tsx @@ -56,15 +56,22 @@ export default class Workers extends React.PureComponent<{}, State> { loadWorkers = () => { this.setState({ loading: true }); - getWorkers().then(({ canSetWorkerCount, value }) => { - if (this.mounted) { - this.setState({ - canSetWorkerCount, - loading: false, - workerCount: value - }); + getWorkers().then( + ({ canSetWorkerCount, value }) => { + if (this.mounted) { + this.setState({ + canSetWorkerCount, + loading: false, + workerCount: value + }); + } + }, + () => { + if (this.mounted) { + this.setState({ loading: false }); + } } - }); + ); }; closeForm = (newWorkerCount?: number) => diff --git a/server/sonar-web/src/main/js/apps/background-tasks/components/__tests__/ScannerContext-test.tsx b/server/sonar-web/src/main/js/apps/background-tasks/components/__tests__/ScannerContext-test.tsx index 64cd98c8f77..7ec4218caf0 100644 --- a/server/sonar-web/src/main/js/apps/background-tasks/components/__tests__/ScannerContext-test.tsx +++ b/server/sonar-web/src/main/js/apps/background-tasks/components/__tests__/ScannerContext-test.tsx @@ -17,15 +17,17 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -/* eslint-disable import/first, import/order */ -jest.mock('../../../../api/ce', () => ({ - getTask: jest.fn() -})); - +/* eslint-disable import/order */ import * as React from 'react'; import { mount, shallow } from 'enzyme'; import ScannerContext from '../ScannerContext'; -import { click, doAsync } from '../../../../helpers/testUtils'; +import { click } from '../../../../helpers/testUtils'; + +jest.mock('react-dom'); + +jest.mock('../../../../api/ce', () => ({ + getTask: jest.fn(() => Promise.resolve({ scannerContext: 'context' })) +})); const getTask = require('../../../../api/ce').getTask as jest.Mock; @@ -37,6 +39,10 @@ const task = { type: 'REPORT' }; +beforeEach(() => { + getTask.mockClear(); +}); + it('renders', () => { const wrapper = shallow(); wrapper.setState({ scannerContext: 'context' }); @@ -50,12 +56,10 @@ it('closes', () => { expect(onClose).toBeCalled(); }); -it('fetches scanner context on mount', () => { - getTask.mockImplementation(() => Promise.resolve({ scannerContext: 'context' })); +it('fetches scanner context on mount', async () => { const wrapper = mount(); expect(wrapper.state()).toEqual({}); expect(getTask).toBeCalledWith('123', ['scannerContext']); - return doAsync().then(() => { - expect(wrapper.state()).toEqual({ scannerContext: 'context' }); - }); + await new Promise(setImmediate); + expect(wrapper.state()).toEqual({ scannerContext: 'context' }); }); diff --git a/server/sonar-web/src/main/js/apps/background-tasks/components/__tests__/Stacktrace-test.tsx b/server/sonar-web/src/main/js/apps/background-tasks/components/__tests__/Stacktrace-test.tsx index 28bddab75a8..50724fa9946 100644 --- a/server/sonar-web/src/main/js/apps/background-tasks/components/__tests__/Stacktrace-test.tsx +++ b/server/sonar-web/src/main/js/apps/background-tasks/components/__tests__/Stacktrace-test.tsx @@ -17,15 +17,17 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -/* eslint-disable import/first, import/order */ -jest.mock('../../../../api/ce', () => ({ - getTask: jest.fn() -})); - +/* eslint-disable import/order */ import * as React from 'react'; import { mount, shallow } from 'enzyme'; import Stacktrace from '../Stacktrace'; -import { click, doAsync } from '../../../../helpers/testUtils'; +import { click } from '../../../../helpers/testUtils'; + +jest.mock('react-dom'); + +jest.mock('../../../../api/ce', () => ({ + getTask: jest.fn(() => Promise.resolve({ errorStacktrace: 'stacktrace' })) +})); const getTask = require('../../../../api/ce').getTask as jest.Mock; @@ -37,6 +39,10 @@ const task = { type: 'REPORT' }; +beforeEach(() => { + getTask.mockClear(); +}); + it('renders', () => { const wrapper = shallow(); wrapper.setState({ loading: false, stacktrace: 'stacktrace' }); @@ -50,12 +56,10 @@ it('closes', () => { expect(onClose).toBeCalled(); }); -it('fetches scanner context on mount', () => { - getTask.mockImplementation(() => Promise.resolve({ errorStacktrace: 'stacktrace' })); +it('fetches scanner context on mount', async () => { const wrapper = mount(); expect(wrapper.state()).toEqual({ loading: true }); expect(getTask).toBeCalledWith('123', ['stacktrace']); - return doAsync().then(() => { - expect(wrapper.state()).toEqual({ loading: false, stacktrace: 'stacktrace' }); - }); + await new Promise(setImmediate); + expect(wrapper.state()).toEqual({ loading: false, stacktrace: 'stacktrace' }); }); diff --git a/server/sonar-web/src/main/js/apps/background-tasks/components/__tests__/TaskActions-test.tsx b/server/sonar-web/src/main/js/apps/background-tasks/components/__tests__/TaskActions-test.tsx index 4c86aa33142..8b735a1644b 100644 --- a/server/sonar-web/src/main/js/apps/background-tasks/components/__tests__/TaskActions-test.tsx +++ b/server/sonar-web/src/main/js/apps/background-tasks/components/__tests__/TaskActions-test.tsx @@ -35,6 +35,7 @@ it('shows stack trace', () => { click(wrapper.find('.js-task-show-stacktrace')); expect(wrapper.find('Stacktrace')).toMatchSnapshot(); wrapper.find('Stacktrace').prop('onClose')(); + wrapper.update(); expect(wrapper.find('Stacktrace').exists()).toBeFalsy(); }); @@ -43,6 +44,7 @@ it('shows scanner context', () => { click(wrapper.find('.js-task-show-scanner-context')); expect(wrapper.find('ScannerContext')).toMatchSnapshot(); wrapper.find('ScannerContext').prop('onClose')(); + wrapper.update(); expect(wrapper.find('ScannerContext').exists()).toBeFalsy(); }); diff --git a/server/sonar-web/src/main/js/apps/code/components/App.tsx b/server/sonar-web/src/main/js/apps/code/components/App.tsx index 13718a6f520..a7a7432e3cd 100644 --- a/server/sonar-web/src/main/js/apps/code/components/App.tsx +++ b/server/sonar-web/src/main/js/apps/code/components/App.tsx @@ -94,7 +94,9 @@ export default class App extends React.PureComponent { retrieveComponentChildren(component.key, isPortfolio, branch && getBranchName(branch)) .then(() => { addComponent(component); - this.handleUpdate(); + if (this.mounted) { + this.handleUpdate(); + } }) .catch(e => { if (this.mounted) { diff --git a/server/sonar-web/src/main/js/apps/component-measures/components/App.js b/server/sonar-web/src/main/js/apps/component-measures/components/App.js index e5a483dcac8..84bd294f9e9 100644 --- a/server/sonar-web/src/main/js/apps/component-measures/components/App.js +++ b/server/sonar-web/src/main/js/apps/component-measures/components/App.js @@ -117,7 +117,11 @@ export default class App extends React.PureComponent { }); } }, - () => this.setState({ loading: false }) + () => { + if (this.mounted) { + this.setState({ loading: false }); + } + } ); }; diff --git a/server/sonar-web/src/main/js/apps/component-measures/components/__tests__/App-test.js b/server/sonar-web/src/main/js/apps/component-measures/components/__tests__/App-test.js index b990be2ff47..99da3d9d9b3 100644 --- a/server/sonar-web/src/main/js/apps/component-measures/components/__tests__/App-test.js +++ b/server/sonar-web/src/main/js/apps/component-measures/components/__tests__/App-test.js @@ -42,7 +42,7 @@ const PROPS = { branch: { isMain: true, name: 'master' }, component: { key: 'foo' }, location: { pathname: '/component_measures', query: { metric: 'coverage' } }, - fetchMeasures: () => {}, + fetchMeasures: () => Promise.resolve({ measures: [] }), fetchMetrics: () => {}, metrics: METRICS, metricsKey: ['lines_to_cover', 'coverage', 'duplicated_lines_density', 'new_bugs'], diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/__snapshots__/AssigneeFacet-test.js.snap b/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/__snapshots__/AssigneeFacet-test.js.snap index d384037257b..28442511ef4 100644 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/__snapshots__/AssigneeFacet-test.js.snap +++ b/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/__snapshots__/AssigneeFacet-test.js.snap @@ -14,6 +14,7 @@ exports[`should render 1`] = ` active={false} disabled={false} halfWidth={false} + key="" name="unassigned" onClick={[Function]} stat="5" @@ -100,6 +101,7 @@ exports[`should select unassigned 1`] = ` active={true} disabled={false} halfWidth={false} + key="" name="unassigned" onClick={[Function]} stat="5" @@ -162,6 +164,7 @@ exports[`should select user 1`] = ` active={false} disabled={false} halfWidth={false} + key="" name="unassigned" onClick={[Function]} stat="5" diff --git a/server/sonar-web/src/main/js/apps/marketplace/__tests__/EditionBoxes-test.tsx b/server/sonar-web/src/main/js/apps/marketplace/__tests__/EditionBoxes-test.tsx index 0201372b086..f7fe0280173 100644 --- a/server/sonar-web/src/main/js/apps/marketplace/__tests__/EditionBoxes-test.tsx +++ b/server/sonar-web/src/main/js/apps/marketplace/__tests__/EditionBoxes-test.tsx @@ -62,6 +62,7 @@ it('should display an error message', () => { it('should open the license form', () => { const wrapper = getWrapper({ editions: DEFAULT_EDITIONS }); (wrapper.instance() as EditionBoxes).handleOpenLicenseForm(DEFAULT_EDITIONS[0]); + wrapper.update(); expect(wrapper.find('LicenseEditionForm').exists()).toBeTruthy(); }); diff --git a/server/sonar-web/src/main/js/apps/marketplace/__tests__/PendingActions-test.tsx b/server/sonar-web/src/main/js/apps/marketplace/__tests__/PendingActions-test.tsx index 882cc16ec84..d83b37197be 100644 --- a/server/sonar-web/src/main/js/apps/marketplace/__tests__/PendingActions-test.tsx +++ b/server/sonar-web/src/main/js/apps/marketplace/__tests__/PendingActions-test.tsx @@ -38,7 +38,7 @@ it('should display pending actions', () => { }); it('should not display anything', () => { - expect(getWrapper({ pending: { installing: [], updating: [], removing: [] } })).toMatchSnapshot(); + expect(getWrapper({ pending: { installing: [], updating: [], removing: [] } }).type()).toBeNull(); }); it('should open the restart form', () => { diff --git a/server/sonar-web/src/main/js/apps/marketplace/__tests__/__snapshots__/PendingActions-test.tsx.snap b/server/sonar-web/src/main/js/apps/marketplace/__tests__/__snapshots__/PendingActions-test.tsx.snap index 7e8801a1e0c..f68b3b68416 100644 --- a/server/sonar-web/src/main/js/apps/marketplace/__tests__/__snapshots__/PendingActions-test.tsx.snap +++ b/server/sonar-web/src/main/js/apps/marketplace/__tests__/__snapshots__/PendingActions-test.tsx.snap @@ -59,5 +59,3 @@ exports[`should display pending actions 1`] = `
`; - -exports[`should not display anything 1`] = `null`; diff --git a/server/sonar-web/src/main/js/apps/marketplace/components/EditionBox.tsx b/server/sonar-web/src/main/js/apps/marketplace/components/EditionBox.tsx index 6f90fda970e..2d97b212ed0 100644 --- a/server/sonar-web/src/main/js/apps/marketplace/components/EditionBox.tsx +++ b/server/sonar-web/src/main/js/apps/marketplace/components/EditionBox.tsx @@ -43,11 +43,9 @@ export default class EditionBox extends React.PureComponent { if (canInstall && !isInstalled) { return ( ); } diff --git a/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/EditionBoxBadge-test.tsx b/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/EditionBoxBadge-test.tsx index 88a9c2c4ab0..d2ad1c52ec7 100644 --- a/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/EditionBoxBadge-test.tsx +++ b/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/EditionBoxBadge-test.tsx @@ -31,7 +31,7 @@ const DEFAULT_STATUS: EditionStatus = { it('should display installed badge', () => { expect( getWrapper({ - editionStatus: { + status: { currentEditionKey: 'foo', nextEditionKey: '', installationStatus: 'NONE' @@ -43,7 +43,7 @@ it('should display installed badge', () => { it('should display installing badge', () => { expect( getWrapper({ - editionStatus: { + status: { currentEditionKey: 'foo', nextEditionKey: 'foo', installationStatus: 'AUTOMATIC_IN_PROGRESS' @@ -55,7 +55,7 @@ it('should display installing badge', () => { it('should display pending badge', () => { expect( getWrapper({ - editionStatus: { + status: { currentEditionKey: '', nextEditionKey: 'foo', installationStatus: 'AUTOMATIC_READY' @@ -67,13 +67,13 @@ it('should display pending badge', () => { it('should not display a badge', () => { expect( getWrapper({ - editionStatus: { + status: { currentEditionKey: '', nextEditionKey: 'bar', installationStatus: 'AUTOMATIC_READY' } - }) - ).toMatchSnapshot(); + }).type() + ).toBeNull(); }); function getWrapper(props = {}) { diff --git a/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/LicenseEditionForm-test.tsx b/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/LicenseEditionForm-test.tsx index 8c217a66793..2105a1405bc 100644 --- a/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/LicenseEditionForm-test.tsx +++ b/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/LicenseEditionForm-test.tsx @@ -63,8 +63,8 @@ it('should update the edition status after install', async () => { const updateEditionStatus = jest.fn(); const wrapper = getWrapper({ updateEditionStatus }); const form = wrapper.instance() as LicenseEditionForm; - form.mounted = true; form.handleLicenseChange('mylicense', 'AUTOMATIC_INSTALL'); + wrapper.update(); click(wrapper.find('button')); expect(applyLicense).toHaveBeenCalledWith({ license: 'mylicense' }); await new Promise(setImmediate); diff --git a/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/LicenseEditionSet-test.tsx b/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/LicenseEditionSet-test.tsx index 77ef1d270a3..ce2c5e98fdd 100644 --- a/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/LicenseEditionSet-test.tsx +++ b/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/LicenseEditionSet-test.tsx @@ -26,7 +26,8 @@ import LicenseEditionSet from '../LicenseEditionSet'; jest.mock('../../../../api/marketplace', () => ({ getLicensePreview: jest.fn(() => Promise.resolve({ nextEditionKey: 'foo', previewStatus: 'NO_INSTALL' }) - ) + ), + getFormData: jest.fn(() => Promise.resolve({ serverId: 'foo', ncloc: 1000 })) })); jest.mock('lodash', () => { @@ -56,6 +57,13 @@ it('should display correctly', () => { expect(getWrapper()).toMatchSnapshot(); }); +it('should display the get license link with parameters', async () => { + const wrapper = getWrapper(); + await new Promise(setImmediate); + wrapper.update(); + expect(wrapper.find('a')).toMatchSnapshot(); +}); + it('should correctly display status message after checking license', async () => { await testLicenseStatus('NO_INSTALL'); await testLicenseStatus('AUTOMATIC_INSTALL'); @@ -79,10 +87,10 @@ async function testLicenseStatus(status: string) { ); const updateLicense = jest.fn(); const wrapper = getWrapper({ updateLicense }); - (wrapper.instance() as LicenseEditionSet).mounted = true; change(wrapper.find('textarea'), 'mylicense'); expect(getLicensePreview).toHaveBeenCalled(); await new Promise(setImmediate); expect(updateLicense).toHaveBeenCalled(); + wrapper.update(); expect(wrapper.find('p.alert')).toMatchSnapshot(); } diff --git a/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/PluginLicense-test.tsx b/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/PluginLicense-test.tsx index 1031b90b53b..23f79108451 100644 --- a/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/PluginLicense-test.tsx +++ b/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/PluginLicense-test.tsx @@ -26,5 +26,5 @@ it('should display the license field', () => { }); it('should not display anything', () => { - expect(shallow()).toMatchSnapshot(); + expect(shallow().type()).toBeNull(); }); diff --git a/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/PluginUrls-test.tsx b/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/PluginUrls-test.tsx index cbddc53a91f..01011b36af6 100644 --- a/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/PluginUrls-test.tsx +++ b/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/PluginUrls-test.tsx @@ -30,7 +30,7 @@ it('should display only one url', () => { }); it('should not display anything', () => { - expect(getWrapper({ homepageUrl: undefined, issueTrackerUrl: undefined })).toMatchSnapshot(); + expect(getWrapper({ homepageUrl: undefined, issueTrackerUrl: undefined }).type()).toBeNull(); }); function getWrapper(plugin = {}) { diff --git a/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/__snapshots__/EditionBoxBadge-test.tsx.snap b/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/__snapshots__/EditionBoxBadge-test.tsx.snap index 7e824591e02..0d5724e6fc1 100644 --- a/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/__snapshots__/EditionBoxBadge-test.tsx.snap +++ b/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/__snapshots__/EditionBoxBadge-test.tsx.snap @@ -1,9 +1,29 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`should display installed badge 1`] = `null`; +exports[`should display installed badge 1`] = ` + + + marketplace.installed + +`; -exports[`should display installing badge 1`] = `null`; +exports[`should display installing badge 1`] = ` + + marketplace.installing + +`; -exports[`should display pending badge 1`] = `null`; - -exports[`should not display a badge 1`] = `null`; +exports[`should display pending badge 1`] = ` + + marketplace.pending + +`; diff --git a/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/__snapshots__/LicenseEditionSet-test.tsx.snap b/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/__snapshots__/LicenseEditionSet-test.tsx.snap index b990a23a26c..6026ff03d97 100644 --- a/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/__snapshots__/LicenseEditionSet-test.tsx.snap +++ b/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/__snapshots__/LicenseEditionSet-test.tsx.snap @@ -75,3 +75,13 @@ exports[`should display correctly 1`] = ` `; + +exports[`should display the get license link with parameters 1`] = ` + + marketplace.i_need_a_license + +`; diff --git a/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/__snapshots__/PluginLicense-test.tsx.snap b/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/__snapshots__/PluginLicense-test.tsx.snap index 5a77d6923b2..64bc114f97a 100644 --- a/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/__snapshots__/PluginLicense-test.tsx.snap +++ b/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/__snapshots__/PluginLicense-test.tsx.snap @@ -24,5 +24,3 @@ exports[`should display the license field 1`] = ` `; - -exports[`should not display anything 1`] = `null`; diff --git a/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/__snapshots__/PluginUrls-test.tsx.snap b/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/__snapshots__/PluginUrls-test.tsx.snap index f1a088480ba..a55d3214845 100644 --- a/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/__snapshots__/PluginUrls-test.tsx.snap +++ b/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/__snapshots__/PluginUrls-test.tsx.snap @@ -48,5 +48,3 @@ exports[`should display the urls 1`] = ` `; - -exports[`should not display anything 1`] = `null`; diff --git a/server/sonar-web/src/main/js/apps/organizations/components/OrganizationAdmin.js b/server/sonar-web/src/main/js/apps/organizations/components/OrganizationAdmin.js index a58a5315717..d11ba3c3d5b 100644 --- a/server/sonar-web/src/main/js/apps/organizations/components/OrganizationAdmin.js +++ b/server/sonar-web/src/main/js/apps/organizations/components/OrganizationAdmin.js @@ -23,12 +23,12 @@ import { connect } from 'react-redux'; import { getOrganizationByKey } from '../../../store/rootReducer'; import handleRequiredAuthorization from '../../../app/utils/handleRequiredAuthorization'; -class OrganizationAdmin extends React.PureComponent { +export class OrganizationAdmin extends React.PureComponent { /*:: props: { children?: React.Element<*>, organization: { canAdmin: boolean } }; -*/ + */ componentDidMount() { this.checkPermissions(); @@ -62,5 +62,3 @@ const mapStateToProps = (state, ownProps) => ({ }); export default connect(mapStateToProps)(OrganizationAdmin); - -export const UnconnectedOrganizationAdmin = OrganizationAdmin; diff --git a/server/sonar-web/src/main/js/apps/organizations/components/OrganizationPage.js b/server/sonar-web/src/main/js/apps/organizations/components/OrganizationPage.js index 4c10db34e07..75d97828745 100644 --- a/server/sonar-web/src/main/js/apps/organizations/components/OrganizationPage.js +++ b/server/sonar-web/src/main/js/apps/organizations/components/OrganizationPage.js @@ -49,7 +49,7 @@ type State = { }; */ -class OrganizationPage extends React.PureComponent { +export class OrganizationPage extends React.PureComponent { /*:: mounted: boolean; */ /*:: props: Props; */ state /*: State */ = { loading: true }; @@ -108,5 +108,3 @@ const mapStateToProps = (state, ownProps /*: OwnProps */) => ({ const mapDispatchToProps = { fetchOrganization }; export default connect(mapStateToProps, mapDispatchToProps)(OrganizationPage); - -export const UnconnectedOrganizationPage = OrganizationPage; diff --git a/server/sonar-web/src/main/js/apps/organizations/components/__tests__/OrganizationAdmin-test.js b/server/sonar-web/src/main/js/apps/organizations/components/__tests__/OrganizationAdmin-test.js index 321be58a0ae..77c7e788dcf 100644 --- a/server/sonar-web/src/main/js/apps/organizations/components/__tests__/OrganizationAdmin-test.js +++ b/server/sonar-web/src/main/js/apps/organizations/components/__tests__/OrganizationAdmin-test.js @@ -19,15 +19,17 @@ */ import React from 'react'; import { shallow } from 'enzyme'; -import { UnconnectedOrganizationAdmin } from '../OrganizationAdmin'; +import { OrganizationAdmin } from '../OrganizationAdmin'; + +jest.mock('../../../../app/utils/handleRequiredAuthorization', () => jest.fn()); it('should render children', () => { const organization = { canAdmin: true }; expect( shallow( - +
hello
-
+ ) ).toMatchSnapshot(); }); @@ -36,9 +38,9 @@ it('should not render anything', () => { const organization = { canAdmin: false }; expect( shallow( - +
hello
-
- ) - ).toMatchSnapshot(); + + ).type() + ).toBeNull(); }); diff --git a/server/sonar-web/src/main/js/apps/organizations/components/__tests__/OrganizationMembers-test.js b/server/sonar-web/src/main/js/apps/organizations/components/__tests__/OrganizationMembers-test.js index 9be07a22d0b..893051711bf 100644 --- a/server/sonar-web/src/main/js/apps/organizations/components/__tests__/OrganizationMembers-test.js +++ b/server/sonar-web/src/main/js/apps/organizations/components/__tests__/OrganizationMembers-test.js @@ -35,6 +35,7 @@ it('should not render actions for non admin', () => { members={members} status={status} fetchOrganizationMembers={jest.fn()} + fetchOrganizationGroups={jest.fn()} fetchMoreOrganizationMembers={jest.fn()} /> ); @@ -48,6 +49,7 @@ it('should render actions for admin', () => { members={members} status={{ ...status, loading: true }} fetchOrganizationMembers={jest.fn()} + fetchOrganizationGroups={jest.fn()} fetchMoreOrganizationMembers={jest.fn()} /> ); diff --git a/server/sonar-web/src/main/js/apps/organizations/components/__tests__/OrganizationPage-test.js b/server/sonar-web/src/main/js/apps/organizations/components/__tests__/OrganizationPage-test.js index 4ced6f1a369..5130a0abd4f 100644 --- a/server/sonar-web/src/main/js/apps/organizations/components/__tests__/OrganizationPage-test.js +++ b/server/sonar-web/src/main/js/apps/organizations/components/__tests__/OrganizationPage-test.js @@ -19,15 +19,17 @@ */ import React from 'react'; import { shallow } from 'enzyme'; -import { UnconnectedOrganizationPage } from '../OrganizationPage'; +import { OrganizationPage } from '../OrganizationPage'; + +const fetchOrganization = () => Promise.resolve(); it('smoke test', () => { const wrapper = shallow( - +
hello
-
+ ); - expect(wrapper).toMatchSnapshot(); + expect(wrapper.type()).toBeNull(); const organization = { key: 'foo', name: 'Foo', isDefault: false, canAdmin: false }; wrapper.setProps({ organization }); @@ -36,9 +38,9 @@ it('smoke test', () => { it('not found', () => { const wrapper = shallow( - +
hello
-
+ ); wrapper.setState({ loading: false }); expect(wrapper).toMatchSnapshot(); @@ -47,12 +49,11 @@ it('not found', () => { it('should correctly update when the organization changes', () => { const fetchOrganization = jest.fn(() => Promise.resolve()); const wrapper = shallow( - +
hello
-
+ ); wrapper.setProps({ params: { organizationKey: 'bar' } }); + expect(fetchOrganization).toHaveBeenCalledTimes(2); expect(fetchOrganization.mock.calls).toMatchSnapshot(); }); diff --git a/server/sonar-web/src/main/js/apps/organizations/components/__tests__/__snapshots__/OrganizationAdmin-test.js.snap b/server/sonar-web/src/main/js/apps/organizations/components/__tests__/__snapshots__/OrganizationAdmin-test.js.snap index b22c9e9f05c..331cb8d84f7 100644 --- a/server/sonar-web/src/main/js/apps/organizations/components/__tests__/__snapshots__/OrganizationAdmin-test.js.snap +++ b/server/sonar-web/src/main/js/apps/organizations/components/__tests__/__snapshots__/OrganizationAdmin-test.js.snap @@ -1,7 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`should not render anything 1`] = `null`; - exports[`should render children 1`] = `
hello diff --git a/server/sonar-web/src/main/js/apps/organizations/components/__tests__/__snapshots__/OrganizationPage-test.js.snap b/server/sonar-web/src/main/js/apps/organizations/components/__tests__/__snapshots__/OrganizationPage-test.js.snap index 350cc9b5d80..46bff666818 100644 --- a/server/sonar-web/src/main/js/apps/organizations/components/__tests__/__snapshots__/OrganizationPage-test.js.snap +++ b/server/sonar-web/src/main/js/apps/organizations/components/__tests__/__snapshots__/OrganizationPage-test.js.snap @@ -4,15 +4,16 @@ exports[`not found 1`] = ``; exports[`should correctly update when the organization changes 1`] = ` Array [ + Array [ + "foo", + ], Array [ "bar", ], ] `; -exports[`smoke test 1`] = `null`; - -exports[`smoke test 2`] = ` +exports[`smoke test 1`] = `
+
-

{translate('users.add')}

+

{header}

@@ -111,11 +112,14 @@ export default class AddMemberForm extends React.PureComponent { } render() { - return ( - ); + if (this.state.open) { + return [buttonComponent, this.renderModal()]; + } + return buttonComponent; } } diff --git a/server/sonar-web/src/main/js/apps/organizations/components/forms/ManageMemberGroupsForm.js b/server/sonar-web/src/main/js/apps/organizations/components/forms/ManageMemberGroupsForm.js index 0152ce62c21..6e8818b6e85 100644 --- a/server/sonar-web/src/main/js/apps/organizations/components/forms/ManageMemberGroupsForm.js +++ b/server/sonar-web/src/main/js/apps/organizations/components/forms/ManageMemberGroupsForm.js @@ -105,10 +105,11 @@ export default class ManageMemberGroupsForm extends React.PureComponent { }; renderModal() { + const header = translate('organization.members.manage_groups'); return ( - +
-

{translate('organization.members.manage_groups')}

+

{header}

@@ -146,11 +147,14 @@ export default class ManageMemberGroupsForm extends React.PureComponent { } render() { - return ( - + const buttonComponent = ( + {translate('organization.members.manage_groups')} - {this.state.open && this.renderModal()} ); + if (this.state.open) { + return [buttonComponent, this.renderModal()]; + } + return buttonComponent; } } diff --git a/server/sonar-web/src/main/js/apps/organizations/components/forms/RemoveMemberForm.js b/server/sonar-web/src/main/js/apps/organizations/components/forms/RemoveMemberForm.js index d14eff121c6..94fb72dd24f 100644 --- a/server/sonar-web/src/main/js/apps/organizations/components/forms/RemoveMemberForm.js +++ b/server/sonar-web/src/main/js/apps/organizations/components/forms/RemoveMemberForm.js @@ -61,10 +61,11 @@ export default class RemoveMemberForm extends React.PureComponent { }; renderModal() { + const header = translate('users.remove'); return ( - +
-

{translate('users.remove')}

+

{header}

@@ -92,11 +93,14 @@ export default class RemoveMemberForm extends React.PureComponent { } render() { - return ( - + const buttonComponent = ( + {translate('organization.members.remove')} - {this.state.open && this.renderModal()} ); + if (this.state.open) { + return [buttonComponent, this.renderModal()]; + } + return buttonComponent; } } diff --git a/server/sonar-web/src/main/js/apps/organizations/components/forms/__tests__/AddMemberForm-test.js b/server/sonar-web/src/main/js/apps/organizations/components/forms/__tests__/AddMemberForm-test.js index 1874608a815..2014d4b2990 100644 --- a/server/sonar-web/src/main/js/apps/organizations/components/forms/__tests__/AddMemberForm-test.js +++ b/server/sonar-web/src/main/js/apps/organizations/components/forms/__tests__/AddMemberForm-test.js @@ -18,21 +18,25 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ import React from 'react'; -import { shallow, mount } from 'enzyme'; +import { shallow } from 'enzyme'; import { click } from '../../../../../helpers/testUtils'; import AddMemberForm from '../AddMemberForm'; +jest.mock('react-dom'); + const memberLogins = ['admin']; it('should render and open the modal', () => { const wrapper = shallow(); expect(wrapper).toMatchSnapshot(); wrapper.setState({ open: true }); - expect(wrapper).toMatchSnapshot(); + + // FIXME Can probably be removed when https://github.com/airbnb/enzyme/issues/1149 is resolved + expect(wrapper.first().getElements()).toMatchSnapshot(); }); it('should correctly handle user interactions', () => { - const wrapper = mount(); + const wrapper = shallow(); click(wrapper.find('button')); expect(wrapper.state('open')).toBeTruthy(); wrapper.instance().closeForm(); diff --git a/server/sonar-web/src/main/js/apps/organizations/components/forms/__tests__/ManageMemberGroupsForm-test.js b/server/sonar-web/src/main/js/apps/organizations/components/forms/__tests__/ManageMemberGroupsForm-test.js index 224a1222658..c28b5cbcd9a 100644 --- a/server/sonar-web/src/main/js/apps/organizations/components/forms/__tests__/ManageMemberGroupsForm-test.js +++ b/server/sonar-web/src/main/js/apps/organizations/components/forms/__tests__/ManageMemberGroupsForm-test.js @@ -18,10 +18,12 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ import React from 'react'; -import { shallow, mount } from 'enzyme'; +import { shallow } from 'enzyme'; import { click, mockEvent } from '../../../../../helpers/testUtils'; import ManageMemberGroupsForm from '../ManageMemberGroupsForm'; +jest.mock('react-dom'); + const member = { login: 'admin', name: 'Admin Istrator', avatar: '', groupCount: 3 }; const organization = { name: 'MyOrg', key: 'myorg' }; const organizationGroups = [ @@ -48,8 +50,8 @@ const userGroups = { 11: { id: 11, name: 'pull-request-analysers', description: 'Technical accounts', selected: true } }; -const getMountedForm = function(updateFunc = jest.fn()) { - const wrapper = mount( +function getMountedForm(updateFunc = jest.fn()) { + const wrapper = shallow( { const wrapper = shallow( @@ -75,7 +77,7 @@ it('should render and open the modal', () => { ); expect(wrapper).toMatchSnapshot(); wrapper.setState({ open: true }); - expect(wrapper).toMatchSnapshot(); + expect(wrapper.first().getElements()).toMatchSnapshot(); }); it('should correctly handle user interactions', () => { diff --git a/server/sonar-web/src/main/js/apps/organizations/components/forms/__tests__/RemoveMemberForm-test.js b/server/sonar-web/src/main/js/apps/organizations/components/forms/__tests__/RemoveMemberForm-test.js index 427559eb011..5c007ae4123 100644 --- a/server/sonar-web/src/main/js/apps/organizations/components/forms/__tests__/RemoveMemberForm-test.js +++ b/server/sonar-web/src/main/js/apps/organizations/components/forms/__tests__/RemoveMemberForm-test.js @@ -18,10 +18,12 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ import React from 'react'; -import { shallow, mount } from 'enzyme'; +import { shallow } from 'enzyme'; import { click, mockEvent } from '../../../../../helpers/testUtils'; import RemoveMemberForm from '../RemoveMemberForm'; +jest.mock('react-dom'); + const member = { login: 'admin', name: 'Admin Istrator', avatar: '', groupCount: 3 }; const organization = { name: 'MyOrg' }; @@ -31,12 +33,12 @@ it('should render and open the modal', () => { ); expect(wrapper).toMatchSnapshot(); wrapper.setState({ open: true }); - expect(wrapper).toMatchSnapshot(); + expect(wrapper.first().getElements()).toMatchSnapshot(); }); it('should correctly handle user interactions', () => { const removeMember = jest.fn(); - const wrapper = mount( + const wrapper = shallow( ); const instance = wrapper.instance(); diff --git a/server/sonar-web/src/main/js/apps/organizations/components/forms/__tests__/__snapshots__/AddMemberForm-test.js.snap b/server/sonar-web/src/main/js/apps/organizations/components/forms/__tests__/__snapshots__/AddMemberForm-test.js.snap index eee77a0a2cd..ac981164804 100644 --- a/server/sonar-web/src/main/js/apps/organizations/components/forms/__tests__/__snapshots__/AddMemberForm-test.js.snap +++ b/server/sonar-web/src/main/js/apps/organizations/components/forms/__tests__/__snapshots__/AddMemberForm-test.js.snap @@ -2,6 +2,7 @@ exports[`should render and open the modal 1`] = ` ,
@@ -68,6 +72,6 @@ exports[`should render and open the modal 2`] = `
-
- + , +] `; diff --git a/server/sonar-web/src/main/js/apps/organizations/components/forms/__tests__/__snapshots__/ManageMemberGroupsForm-test.js.snap b/server/sonar-web/src/main/js/apps/organizations/components/forms/__tests__/__snapshots__/ManageMemberGroupsForm-test.js.snap index eaa7b2a51d0..51d9f708ee7 100644 --- a/server/sonar-web/src/main/js/apps/organizations/components/forms/__tests__/__snapshots__/ManageMemberGroupsForm-test.js.snap +++ b/server/sonar-web/src/main/js/apps/organizations/components/forms/__tests__/__snapshots__/ManageMemberGroupsForm-test.js.snap @@ -71,6 +71,7 @@ Object { exports[`should render and open the modal 1`] = ` organization.members.manage_groups @@ -78,13 +79,15 @@ exports[`should render and open the modal 1`] = ` `; exports[`should render and open the modal 2`] = ` - - organization.members.manage_groups +Array [ + + organization.members.manage_groups + ,
@@ -167,8 +167,8 @@ exports[`should render and open the modal 2`] = `
- - + , +] `; exports[`should reset the selected groups when the modal is opened 1`] = ` diff --git a/server/sonar-web/src/main/js/apps/organizations/components/forms/__tests__/__snapshots__/RemoveMemberForm-test.js.snap b/server/sonar-web/src/main/js/apps/organizations/components/forms/__tests__/__snapshots__/RemoveMemberForm-test.js.snap index 72f58137dc4..3e362fcf4db 100644 --- a/server/sonar-web/src/main/js/apps/organizations/components/forms/__tests__/__snapshots__/RemoveMemberForm-test.js.snap +++ b/server/sonar-web/src/main/js/apps/organizations/components/forms/__tests__/__snapshots__/RemoveMemberForm-test.js.snap @@ -16,6 +16,7 @@ Array [ exports[`should render and open the modal 1`] = ` organization.members.remove @@ -23,13 +24,15 @@ exports[`should render and open the modal 1`] = ` `; exports[`should render and open the modal 2`] = ` - - organization.members.remove +Array [ + + organization.members.remove + ,
- - + , +] `; diff --git a/server/sonar-web/src/main/js/apps/organizations/routes.js b/server/sonar-web/src/main/js/apps/organizations/routes.js index ecdd76eb7e1..072bb955202 100644 --- a/server/sonar-web/src/main/js/apps/organizations/routes.js +++ b/server/sonar-web/src/main/js/apps/organizations/routes.js @@ -17,13 +17,13 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -import OrganizationPage from './components/OrganizationPage'; +import OrganizationPageContainer from './components/OrganizationPage'; import OrganizationPageExtension from '../../app/components/extensions/OrganizationPageExtension'; import OrganizationContainer from './components/OrganizationContainer'; import OrganizationProjects from './components/OrganizationProjects'; import OrganizationFavoriteProjects from './components/OrganizationFavoriteProjects'; import OrganizationRules from './components/OrganizationRules'; -import OrganizationAdmin from './components/OrganizationAdmin'; +import OrganizationAdminContainer from './components/OrganizationAdmin'; import OrganizationEdit from './components/OrganizationEdit'; import OrganizationGroups from './components/OrganizationGroups'; import OrganizationMembersContainer from './components/OrganizationMembersContainer'; @@ -38,7 +38,7 @@ import issuesRoutes from '../issues/routes'; const routes = [ { path: ':organizationKey', - component: OrganizationPage, + component: OrganizationPageContainer, childRoutes: [ { indexRoute: { @@ -90,7 +90,7 @@ const routes = [ component: OrganizationPageExtension }, { - component: OrganizationAdmin, + component: OrganizationAdminContainer, childRoutes: [ { path: 'delete', component: OrganizationDelete }, { path: 'edit', component: OrganizationEdit }, diff --git a/server/sonar-web/src/main/js/apps/overview/components/__tests__/__snapshots__/ApplicationLeakPeriodLegend-test.js.snap b/server/sonar-web/src/main/js/apps/overview/components/__tests__/__snapshots__/ApplicationLeakPeriodLegend-test.js.snap index f7c73f3b9fb..cb842597822 100644 --- a/server/sonar-web/src/main/js/apps/overview/components/__tests__/__snapshots__/ApplicationLeakPeriodLegend-test.js.snap +++ b/server/sonar-web/src/main/js/apps/overview/components/__tests__/__snapshots__/ApplicationLeakPeriodLegend-test.js.snap @@ -25,18 +25,14 @@ exports[`renders 2`] = `
    -
  • +
  • Foo :
  • -
  • +
  • Bar : + onClick={!isClickable(link) ? this.handleClick : undefined}> {this.renderLinkIcon(link)}   {link.name} diff --git a/server/sonar-web/src/main/js/apps/overview/meta/__tests__/MetaTags-test.js b/server/sonar-web/src/main/js/apps/overview/meta/__tests__/MetaTags-test.js index 85e4c744e92..633c529cbfe 100644 --- a/server/sonar-web/src/main/js/apps/overview/meta/__tests__/MetaTags-test.js +++ b/server/sonar-web/src/main/js/apps/overview/meta/__tests__/MetaTags-test.js @@ -39,15 +39,21 @@ const componentWithTags = { }; it('should render without tags and admin rights', () => { - expect(shallow()).toMatchSnapshot(); + expect( + shallow(, { disableLifecycleMethods: true }) + ).toMatchSnapshot(); }); it('should render with tags and admin rights', () => { - expect(shallow()).toMatchSnapshot(); + expect( + shallow(, { disableLifecycleMethods: true }) + ).toMatchSnapshot(); }); it('should open the tag selector on click', () => { - const wrapper = shallow(); + const wrapper = shallow(, { + disableLifecycleMethods: true + }); expect(wrapper).toMatchSnapshot(); // open diff --git a/server/sonar-web/src/main/js/apps/overview/meta/__tests__/__snapshots__/MetaLink-test.js.snap b/server/sonar-web/src/main/js/apps/overview/meta/__tests__/__snapshots__/MetaLink-test.js.snap index 416a8104ae2..20c6a30481a 100644 --- a/server/sonar-web/src/main/js/apps/overview/meta/__tests__/__snapshots__/MetaLink-test.js.snap +++ b/server/sonar-web/src/main/js/apps/overview/meta/__tests__/__snapshots__/MetaLink-test.js.snap @@ -67,7 +67,6 @@ exports[`should match snapshot 1`] = ` { it('should render null when data is missing', () => { expect( - shallow() - ).toMatchSnapshot(); + shallow().type() + ).toBeNull(); }); diff --git a/server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/__snapshots__/GraphsTooltipsContentDuplication-test.js.snap b/server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/__snapshots__/GraphsTooltipsContentDuplication-test.js.snap index bfc14879a9f..eaecbb80248 100644 --- a/server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/__snapshots__/GraphsTooltipsContentDuplication-test.js.snap +++ b/server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/__snapshots__/GraphsTooltipsContentDuplication-test.js.snap @@ -25,5 +25,3 @@ exports[`should render correctly 1`] = ` `; - -exports[`should render null when data is missing 1`] = `null`; diff --git a/server/sonar-web/src/main/js/apps/projectActivity/components/forms/AddEventForm.js b/server/sonar-web/src/main/js/apps/projectActivity/components/forms/AddEventForm.js index f1b45f2cdaf..520a159d0c0 100644 --- a/server/sonar-web/src/main/js/apps/projectActivity/components/forms/AddEventForm.js +++ b/server/sonar-web/src/main/js/apps/projectActivity/components/forms/AddEventForm.js @@ -97,10 +97,11 @@ export default class AddEventForm extends React.PureComponent { }; renderModal() { + const header = translate(this.props.addEventButtonText); return ( - +
    -

    {translate(this.props.addEventButtonText)}

    +

    {header}

    @@ -111,7 +112,6 @@ export default class AddEventForm extends React.PureComponent { value={this.state.name} autoFocus={true} disabled={this.state.processing} - className="input-medium" type="text" onChange={this.changeInput} /> @@ -136,11 +136,14 @@ export default class AddEventForm extends React.PureComponent { } render() { - return ( - + const linkComponent = ( + {translate(this.props.addEventButtonText)} - {this.state.open && this.renderModal()} ); + if (this.state.open) { + return [linkComponent, this.renderModal()]; + } + return linkComponent; } } diff --git a/server/sonar-web/src/main/js/apps/projectActivity/components/forms/AddGraphMetric.js b/server/sonar-web/src/main/js/apps/projectActivity/components/forms/AddGraphMetric.js index 76dfd5e7bf5..872648637df 100644 --- a/server/sonar-web/src/main/js/apps/projectActivity/components/forms/AddGraphMetric.js +++ b/server/sonar-web/src/main/js/apps/projectActivity/components/forms/AddGraphMetric.js @@ -102,10 +102,11 @@ export default class AddGraphMetric extends React.PureComponent { renderModal() { const { metricsTypeFilter } = this.props; + const header = translate('project_activity.graphs.custom.add_metric'); return ( - +
    -

    {translate('project_activity.graphs.custom.add_metric')}

    +

    {header}

    @@ -165,11 +166,16 @@ export default class AddGraphMetric extends React.PureComponent { ); } - return ( - ); + + if (this.state.open) { + return [buttonComponent, this.renderModal()]; + } + + return buttonComponent; } } diff --git a/server/sonar-web/src/main/js/apps/projectActivity/components/forms/ChangeEventForm.js b/server/sonar-web/src/main/js/apps/projectActivity/components/forms/ChangeEventForm.js index 2dad5bc831c..72b49534bb6 100644 --- a/server/sonar-web/src/main/js/apps/projectActivity/components/forms/ChangeEventForm.js +++ b/server/sonar-web/src/main/js/apps/projectActivity/components/forms/ChangeEventForm.js @@ -95,10 +95,11 @@ export default class ChangeEventForm extends React.PureComponent { }; render() { + const header = translate(this.props.changeEventButtonText); return ( - +
    -

    {translate(this.props.changeEventButtonText)}

    +

    {header}

    @@ -109,7 +110,6 @@ export default class ChangeEventForm extends React.PureComponent { value={this.state.name} autoFocus={true} disabled={this.state.processing} - className="input-medium" type="text" onChange={this.changeInput} /> diff --git a/server/sonar-web/src/main/js/apps/projectActivity/components/forms/RemoveAnalysisForm.js b/server/sonar-web/src/main/js/apps/projectActivity/components/forms/RemoveAnalysisForm.js index 88d6e69f48e..b3395d92a72 100644 --- a/server/sonar-web/src/main/js/apps/projectActivity/components/forms/RemoveAnalysisForm.js +++ b/server/sonar-web/src/main/js/apps/projectActivity/components/forms/RemoveAnalysisForm.js @@ -88,10 +88,11 @@ export default class RemoveAnalysisForm extends React.PureComponent { }; renderModal() { + const header = translate('project_activity.delete_analysis'); return ( - +
    -

    {translate('project_activity.delete_analysis')}

    +

    {header}

    @@ -117,11 +118,14 @@ export default class RemoveAnalysisForm extends React.PureComponent { } render() { - return ( - + const linkComponent = ( + {translate('project_activity.delete_analysis')} - {this.state.open && this.renderModal()} ); + if (this.state.open) { + return [linkComponent, this.renderModal()]; + } + return linkComponent; } } diff --git a/server/sonar-web/src/main/js/apps/projectActivity/components/forms/RemoveEventForm.js b/server/sonar-web/src/main/js/apps/projectActivity/components/forms/RemoveEventForm.js index abed52766cd..7bbe5312afe 100644 --- a/server/sonar-web/src/main/js/apps/projectActivity/components/forms/RemoveEventForm.js +++ b/server/sonar-web/src/main/js/apps/projectActivity/components/forms/RemoveEventForm.js @@ -81,10 +81,11 @@ export default class RemoveEventForm extends React.PureComponent { }; render() { + const header = translate(this.props.removeEventButtonText); return ( - +
    -

    {translate(this.props.removeEventButtonText)}

    +

    {header}

    diff --git a/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/LongBranchesPattern-test.tsx b/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/LongBranchesPattern-test.tsx index 48c79f25fed..8324b04e538 100644 --- a/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/LongBranchesPattern-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/LongBranchesPattern-test.tsx @@ -17,16 +17,16 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -/* eslint-disable import/first, import/order */ -jest.mock('../../../../api/settings', () => ({ - getValues: jest.fn(() => Promise.resolve([])) -})); - +/* eslint-disable import/order */ import * as React from 'react'; -import { mount, shallow } from 'enzyme'; +import { shallow } from 'enzyme'; import LongBranchesPattern from '../LongBranchesPattern'; import { click } from '../../../../helpers/testUtils'; +jest.mock('../../../../api/settings', () => ({ + getValues: jest.fn(() => Promise.resolve([])) +})); + const getValues = require('../../../../api/settings').getValues as jest.Mock; beforeEach(() => { @@ -41,25 +41,25 @@ it('renders', () => { it('opens form', () => { const wrapper = shallow(); - (wrapper.instance() as LongBranchesPattern).mounted = true; wrapper.setState({ loading: false, setting: { value: 'release-.*' } }); click(wrapper.find('a')); expect(wrapper.find('LongBranchesPatternForm').exists()).toBeTruthy(); wrapper.find('LongBranchesPatternForm').prop('onClose')(); + wrapper.update(); expect(wrapper.find('LongBranchesPatternForm').exists()).toBeFalsy(); }); it('fetches setting value on mount', () => { - mount(); + shallow(); expect(getValues).lastCalledWith('sonar.branch.longLivedBranches.regex', 'project'); }); it('fetches new setting value after change', () => { - const wrapper = mount(); - expect(getValues.mock.calls).toHaveLength(1); + const wrapper = shallow(); + expect(getValues).toHaveBeenCalledTimes(1); (wrapper.instance() as LongBranchesPattern).handleChange(); - expect(getValues.mock.calls).toHaveLength(2); + expect(getValues).toHaveBeenCalledTimes(2); }); diff --git a/server/sonar-web/src/main/js/apps/projects/components/__tests__/AllProjects-test.tsx b/server/sonar-web/src/main/js/apps/projects/components/__tests__/AllProjects-test.tsx index c696b9509c9..8a12762240d 100644 --- a/server/sonar-web/src/main/js/apps/projects/components/__tests__/AllProjects-test.tsx +++ b/server/sonar-web/src/main/js/apps/projects/components/__tests__/AllProjects-test.tsx @@ -17,7 +17,12 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -/* eslint-disable import/first, import/order */ +/* eslint-disable import/order */ +import * as React from 'react'; +import { mount, shallow } from 'enzyme'; +import AllProjects from '../AllProjects'; +import { getView, saveSort, saveView, saveVisualization } from '../../../../helpers/storage'; + jest.mock('../ProjectsList', () => ({ // eslint-disable-next-line default: function ProjectsList() { @@ -54,11 +59,6 @@ jest.mock('../../../../helpers/storage', () => ({ saveVisualization: jest.fn() })); -import * as React from 'react'; -import { mount, shallow } from 'enzyme'; -import AllProjects from '../AllProjects'; -import { getView, saveSort, saveView, saveVisualization } from '../../../../helpers/storage'; - const fetchProjects = require('../../utils').fetchProjects as jest.Mock; beforeEach(() => { diff --git a/server/sonar-web/src/main/js/apps/projects/components/__tests__/FavoriteFilter-test.tsx b/server/sonar-web/src/main/js/apps/projects/components/__tests__/FavoriteFilter-test.tsx index 658ee1ab158..5b235e0a193 100644 --- a/server/sonar-web/src/main/js/apps/projects/components/__tests__/FavoriteFilter-test.tsx +++ b/server/sonar-web/src/main/js/apps/projects/components/__tests__/FavoriteFilter-test.tsx @@ -69,6 +69,8 @@ it('does not save last selection with organization', () => { it('does not render for anonymous', () => { expect( - shallow(, { context: { currentUser: { isLoggedIn: false } } }) - ).toMatchSnapshot(); + shallow(, { + context: { currentUser: { isLoggedIn: false } } + }).type() + ).toBeNull(); }); diff --git a/server/sonar-web/src/main/js/apps/projects/components/__tests__/ProjectCardLanguages-test.tsx b/server/sonar-web/src/main/js/apps/projects/components/__tests__/ProjectCardLanguages-test.tsx index cca1d63feb1..c81dffce5e4 100644 --- a/server/sonar-web/src/main/js/apps/projects/components/__tests__/ProjectCardLanguages-test.tsx +++ b/server/sonar-web/src/main/js/apps/projects/components/__tests__/ProjectCardLanguages-test.tsx @@ -49,5 +49,5 @@ it('handles unknown languages', () => { }); it('does not render', () => { - expect(shallow(, { context: { languages } })).toMatchSnapshot(); + expect(shallow(, { context: { languages } }).type()).toBeNull(); }); diff --git a/server/sonar-web/src/main/js/apps/projects/components/__tests__/ProjectCardQualityGate-test.tsx b/server/sonar-web/src/main/js/apps/projects/components/__tests__/ProjectCardQualityGate-test.tsx index 1a0f549c763..acfb2fc47e9 100644 --- a/server/sonar-web/src/main/js/apps/projects/components/__tests__/ProjectCardQualityGate-test.tsx +++ b/server/sonar-web/src/main/js/apps/projects/components/__tests__/ProjectCardQualityGate-test.tsx @@ -26,5 +26,5 @@ it('renders', () => { }); it('does not render', () => { - expect(shallow()).toMatchSnapshot(); + expect(shallow().type()).toBeNull(); }); diff --git a/server/sonar-web/src/main/js/apps/projects/components/__tests__/__snapshots__/AllProjects-test.tsx.snap b/server/sonar-web/src/main/js/apps/projects/components/__tests__/__snapshots__/AllProjects-test.tsx.snap index 5ac9039df25..ef7225c06eb 100644 --- a/server/sonar-web/src/main/js/apps/projects/components/__tests__/__snapshots__/AllProjects-test.tsx.snap +++ b/server/sonar-web/src/main/js/apps/projects/components/__tests__/__snapshots__/AllProjects-test.tsx.snap @@ -28,7 +28,29 @@ exports[`renders 1`] = ` > @@ -67,7 +89,29 @@ exports[`renders 1`] = ` }, ] } - query={Object {}} + query={ + Object { + "coverage": undefined, + "duplications": undefined, + "gate": undefined, + "languages": undefined, + "maintainability": undefined, + "new_coverage": undefined, + "new_duplications": undefined, + "new_lines": undefined, + "new_maintainability": undefined, + "new_reliability": undefined, + "new_security": undefined, + "reliability": undefined, + "search": undefined, + "security": undefined, + "size": undefined, + "sort": undefined, + "tags": undefined, + "view": undefined, + "visualization": undefined, + } + } selectedSort="name" total={0} view="overall" @@ -92,7 +136,29 @@ exports[`renders 1`] = ` }, ] } - query={Object {}} + query={ + Object { + "coverage": undefined, + "duplications": undefined, + "gate": undefined, + "languages": undefined, + "maintainability": undefined, + "new_coverage": undefined, + "new_duplications": undefined, + "new_lines": undefined, + "new_maintainability": undefined, + "new_reliability": undefined, + "new_security": undefined, + "reliability": undefined, + "search": undefined, + "security": undefined, + "size": undefined, + "sort": undefined, + "tags": undefined, + "view": undefined, + "visualization": undefined, + } + } /> - + cpp
    - + Java
    @@ -39,15 +33,11 @@ exports[`handles unknown languages 2`] = ` - + unknown
    - + Java
    @@ -69,15 +59,11 @@ exports[`renders 1`] = ` - + Java
    - + JavaScript
    @@ -99,15 +85,11 @@ exports[`sorts languages 1`] = ` - + JavaScript
    - + Java
    diff --git a/server/sonar-web/src/main/js/apps/projects/components/__tests__/__snapshots__/ProjectCardQualityGate-test.tsx.snap b/server/sonar-web/src/main/js/apps/projects/components/__tests__/__snapshots__/ProjectCardQualityGate-test.tsx.snap index 54acf190a57..5e2c8b7a700 100644 --- a/server/sonar-web/src/main/js/apps/projects/components/__tests__/__snapshots__/ProjectCardQualityGate-test.tsx.snap +++ b/server/sonar-web/src/main/js/apps/projects/components/__tests__/__snapshots__/ProjectCardQualityGate-test.tsx.snap @@ -1,7 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`does not render 1`] = `null`; - exports[`renders 1`] = `
    { const lodash = require.requireActual('lodash'); lodash.debounce = (fn: Function) => (...args: any[]) => fn(args); @@ -34,10 +40,6 @@ jest.mock('rc-tooltip', () => ({ jest.mock('../../../api/components', () => ({ getComponents: jest.fn() })); -import * as React from 'react'; -import { mount } from 'enzyme'; -import App, { Props } from '../App'; - const getComponents = require('../../../api/components').getComponents as jest.Mock; const organization = { key: 'org', name: 'org', projectVisibility: 'public' }; @@ -121,12 +123,15 @@ it('creates project', () => { expect(wrapper.find('CreateProjectForm').exists()).toBeFalsy(); wrapper.find('Header').prop('onProjectCreate')(); + wrapper.update(); expect(wrapper.find('CreateProjectForm').exists()).toBeTruthy(); wrapper.find('CreateProjectForm').prop('onProjectCreated')(); + wrapper.update(); expect(getComponents.mock.calls).toHaveLength(2); wrapper.find('CreateProjectForm').prop('onClose')(); + wrapper.update(); expect(wrapper.find('CreateProjectForm').exists()).toBeFalsy(); }); diff --git a/server/sonar-web/src/main/js/apps/projectsManagement/__tests__/BulkApplyTemplateModal-test.tsx b/server/sonar-web/src/main/js/apps/projectsManagement/__tests__/BulkApplyTemplateModal-test.tsx index 75368168411..c9981980339 100644 --- a/server/sonar-web/src/main/js/apps/projectsManagement/__tests__/BulkApplyTemplateModal-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectsManagement/__tests__/BulkApplyTemplateModal-test.tsx @@ -17,17 +17,19 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -/* eslint-disable import/first, import/order */ -jest.mock('../../../api/permissions', () => ({ - bulkApplyTemplate: jest.fn(() => Promise.resolve()), - getPermissionTemplates: jest.fn(() => Promise.resolve({ permissionTemplates: [] })) -})); - +/* eslint-disable import/order */ import * as React from 'react'; import { mount, shallow } from 'enzyme'; import BulkApplyTemplateModal, { Props } from '../BulkApplyTemplateModal'; import { click } from '../../../helpers/testUtils'; +jest.mock('react-dom'); + +jest.mock('../../../api/permissions', () => ({ + bulkApplyTemplate: jest.fn(() => Promise.resolve()), + getPermissionTemplates: jest.fn(() => Promise.resolve({ permissionTemplates: [] })) +})); + const bulkApplyTemplate = require('../../../api/permissions').bulkApplyTemplate as jest.Mock; const getPermissionTemplates = require('../../../api/permissions') .getPermissionTemplates as jest.Mock; diff --git a/server/sonar-web/src/main/js/apps/projectsManagement/__tests__/Header-test.tsx b/server/sonar-web/src/main/js/apps/projectsManagement/__tests__/Header-test.tsx index 64b7d42366b..b7cb62ab9a4 100644 --- a/server/sonar-web/src/main/js/apps/projectsManagement/__tests__/Header-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectsManagement/__tests__/Header-test.tsx @@ -48,6 +48,7 @@ it('changes default visibility', () => { expect(onVisibilityChange).toBeCalledWith(Visibility.Private); modalWrapper.prop('onClose')(); + wrapper.update(); expect(wrapper.find('ChangeVisibilityForm').exists()).toBeFalsy(); }); diff --git a/server/sonar-web/src/main/js/apps/projectsManagement/__tests__/Search-test.tsx b/server/sonar-web/src/main/js/apps/projectsManagement/__tests__/Search-test.tsx index e7ec8d71e94..1983d99dce6 100644 --- a/server/sonar-web/src/main/js/apps/projectsManagement/__tests__/Search-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectsManagement/__tests__/Search-test.tsx @@ -97,6 +97,7 @@ it('bulk applies permission template', () => { click(wrapper.find('.js-bulk-apply-permission-template')); expect(wrapper.find('BulkApplyTemplateModal')).toMatchSnapshot(); wrapper.find('BulkApplyTemplateModal').prop('onClose')(); + wrapper.update(); expect(wrapper.find('BulkApplyTemplateModal').exists()).toBeFalsy(); }); diff --git a/server/sonar-web/src/main/js/apps/quality-gates/components/Details.js b/server/sonar-web/src/main/js/apps/quality-gates/components/Details.js index 07070991007..751ae51ede3 100644 --- a/server/sonar-web/src/main/js/apps/quality-gates/components/Details.js +++ b/server/sonar-web/src/main/js/apps/quality-gates/components/Details.js @@ -37,8 +37,8 @@ export default class Details extends React.PureComponent { this.fetchDetails(); } - componentDidUpdate(nextProps) { - if (nextProps.params.id !== this.props.params.id) { + componentDidUpdate(prevProps) { + if (prevProps.params.id !== this.props.params.id) { this.fetchDetails(); } } diff --git a/server/sonar-web/src/main/js/apps/quality-profiles/components/ProfileContainer.tsx b/server/sonar-web/src/main/js/apps/quality-profiles/components/ProfileContainer.tsx index d159d8354a3..d2e14e79255 100644 --- a/server/sonar-web/src/main/js/apps/quality-profiles/components/ProfileContainer.tsx +++ b/server/sonar-web/src/main/js/apps/quality-profiles/components/ProfileContainer.tsx @@ -19,6 +19,7 @@ */ import * as React from 'react'; import Helmet from 'react-helmet'; +import { WithRouterProps } from 'react-router'; import ProfileNotFound from './ProfileNotFound'; import ProfileHeader from '../details/ProfileHeader'; import { Profile } from '../types'; @@ -32,11 +33,10 @@ interface Props { onRequestFail: (reasong: any) => void; organization: string | null; profiles: Profile[]; - router: { replace: (path: any) => void }; updateProfiles: () => Promise; } -export default class ProfileContainer extends React.PureComponent { +export default class ProfileContainer extends React.PureComponent { componentDidMount() { const { location, profiles, router } = this.props; if (location.query.key) { diff --git a/server/sonar-web/src/main/js/apps/quality-profiles/components/__tests__/ProfileContainer-test.tsx b/server/sonar-web/src/main/js/apps/quality-profiles/components/__tests__/ProfileContainer-test.tsx index 24be8e1d635..378e62fcf9c 100644 --- a/server/sonar-web/src/main/js/apps/quality-profiles/components/__tests__/ProfileContainer-test.tsx +++ b/server/sonar-web/src/main/js/apps/quality-profiles/components/__tests__/ProfileContainer-test.tsx @@ -17,14 +17,17 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -import { shallow } from 'enzyme'; import * as React from 'react'; +import { shallow } from 'enzyme'; import Helmet from 'react-helmet'; +import { WithRouterProps } from 'react-router'; import ProfileContainer from '../ProfileContainer'; import ProfileNotFound from '../ProfileNotFound'; import ProfileHeader from '../../details/ProfileHeader'; import { createFakeProfile } from '../../utils'; +const routerProps = { router: {} } as WithRouterProps; + it('should render ProfileHeader', () => { const targetProfile = createFakeProfile({ language: 'js', name: 'fake' }); const profiles = [targetProfile, createFakeProfile({ language: 'js', name: 'another' })]; @@ -35,8 +38,8 @@ it('should render ProfileHeader', () => { onRequestFail={jest.fn()} organization={null} profiles={profiles} - router={{} as any} - updateProfiles={updateProfiles}> + updateProfiles={updateProfiles} + {...routerProps}>
    ); @@ -57,8 +60,8 @@ it('should render ProfileNotFound', () => { onRequestFail={jest.fn()} organization={null} profiles={profiles} - router={{} as any} - updateProfiles={jest.fn()}> + updateProfiles={jest.fn()} + {...routerProps}>
    ); @@ -74,8 +77,8 @@ it('should render Helmet', () => { onRequestFail={jest.fn()} organization={null} profiles={profiles} - router={{} as any} - updateProfiles={updateProfiles}> + updateProfiles={updateProfiles} + {...routerProps}>
    ); diff --git a/server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissions-test.tsx b/server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissions-test.tsx index fc13a173960..21a8003c99c 100644 --- a/server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissions-test.tsx +++ b/server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissions-test.tsx @@ -17,17 +17,17 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -/* eslint-disable import/first, import/order */ -jest.mock('../../../../api/quality-profiles', () => ({ - searchUsers: jest.fn(() => Promise.resolve([])), - searchGroups: jest.fn(() => Promise.resolve([])) -})); - +/* eslint-disable import/order */ import * as React from 'react'; import { mount, shallow } from 'enzyme'; import ProfilePermissions from '../ProfilePermissions'; import { click } from '../../../../helpers/testUtils'; +jest.mock('../../../../api/quality-profiles', () => ({ + searchUsers: jest.fn(() => Promise.resolve([])), + searchGroups: jest.fn(() => Promise.resolve([])) +})); + const searchUsers = require('../../../../api/quality-profiles').searchUsers as jest.Mock; const searchGroups = require('../../../../api/quality-profiles').searchGroups as jest.Mock; @@ -50,16 +50,21 @@ it('renders', () => { expect(wrapper).toMatchSnapshot(); }); -it('opens add users form', () => { +it('opens add users form', async () => { + searchUsers.mockImplementationOnce(() => + Promise.resolve({ users: [{ login: 'luke', name: 'Luke Skywalker' }] }) + ); const wrapper = shallow(); - (wrapper.instance() as ProfilePermissions).mounted = true; - wrapper.setState({ loading: false, users: [{ login: 'luke', name: 'Luke Skywalker' }] }); + expect(searchUsers).toHaveBeenCalled(); + await new Promise(setImmediate); + wrapper.update(); expect(wrapper.find('ProfilePermissionsForm').exists()).toBeFalsy(); click(wrapper.find('button')); expect(wrapper.find('ProfilePermissionsForm').exists()).toBeTruthy(); wrapper.find('ProfilePermissionsForm').prop('onClose')(); + wrapper.update(); expect(wrapper.find('ProfilePermissionsForm').exists()).toBeFalsy(); }); diff --git a/server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissionsFormSelect-test.tsx b/server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissionsFormSelect-test.tsx index 7a029559e80..ad5127eec1b 100644 --- a/server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissionsFormSelect-test.tsx +++ b/server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissionsFormSelect-test.tsx @@ -17,23 +17,22 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -/* eslint-disable import/first */ +import * as React from 'react'; +import { shallow } from 'enzyme'; +import ProfilePermissionsFormSelect from '../ProfilePermissionsFormSelect'; + jest.mock('lodash', () => { const lodash = require.requireActual('lodash'); lodash.debounce = (fn: Function) => (...args: any[]) => fn(...args); return lodash; }); -import * as React from 'react'; -import { shallow } from 'enzyme'; -import ProfilePermissionsFormSelect from '../ProfilePermissionsFormSelect'; - it('renders', () => { expect( shallow( Promise.resolve([]))} selected={{ name: 'lambda' }} /> ) @@ -49,6 +48,8 @@ it('searches', () => { selected={{ name: 'lambda' }} /> ); + expect(onSearch).toBeCalledWith(''); + onSearch.mockClear(); wrapper.prop('onInputChange')('f'); expect(onSearch).not.toBeCalled(); diff --git a/server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfileRules-test.tsx b/server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfileRules-test.tsx index 95a3665df08..05de8311e22 100644 --- a/server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfileRules-test.tsx +++ b/server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfileRules-test.tsx @@ -20,7 +20,6 @@ import * as React from 'react'; import { shallow } from 'enzyme'; import ProfileRules from '../ProfileRules'; -import { doAsync } from '../../../../helpers/testUtils'; import * as apiRules from '../../../../api/rules'; import * as apiQP from '../../../../api/quality-profiles'; @@ -82,16 +81,15 @@ const apiResponseActive = { } }); -it('should render the quality profiles rules with sonarway comparison', () => { +it('should render the quality profiles rules with sonarway comparison', async () => { const wrapper = shallow(); const instance = wrapper.instance() as any; instance.mounted = true; instance.loadRules(); - return doAsync(() => { - wrapper.update(); - expect(wrapper.find('ProfileRulesSonarWayComparison')).toHaveLength(1); - expect(wrapper).toMatchSnapshot(); - }); + await new Promise(setImmediate); + wrapper.update(); + expect(wrapper.find('ProfileRulesSonarWayComparison')).toHaveLength(1); + expect(wrapper).toMatchSnapshot(); }); it('should show a button to activate more rules for admins', () => { @@ -116,22 +114,18 @@ it('should not show a button to activate more rules on built in profiles', () => expect(wrapper.find('.js-activate-rules')).toHaveLength(0); }); -it('should not show sonarway comparison for built in profiles', () => { +it('should not show sonarway comparison for built in profiles', async () => { (apiQP as any).getQualityProfile = jest.fn(() => Promise.resolve()); const wrapper = shallow( ); - const instance = wrapper.instance() as any; - instance.mounted = true; - instance.loadRules(); - return doAsync(() => { - wrapper.update(); - expect(apiQP.getQualityProfile).toHaveBeenCalledTimes(0); - expect(wrapper.find('ProfileRulesSonarWayComparison')).toHaveLength(0); - }); + await new Promise(setImmediate); + wrapper.update(); + expect(apiQP.getQualityProfile).toHaveBeenCalledTimes(0); + expect(wrapper.find('ProfileRulesSonarWayComparison')).toHaveLength(0); }); -it('should not show sonarway comparison if there is no missing rules', () => { +it('should not show sonarway comparison if there is no missing rules', async () => { (apiQP as any).getQualityProfile = jest.fn(() => Promise.resolve({ compareToSonarWay: { @@ -142,12 +136,8 @@ it('should not show sonarway comparison if there is no missing rules', () => { }) ); const wrapper = shallow(); - const instance = wrapper.instance() as any; - instance.mounted = true; - instance.loadRules(); - return doAsync(() => { - wrapper.update(); - expect(apiQP.getQualityProfile).toHaveBeenCalledTimes(1); - expect(wrapper.find('ProfileRulesSonarWayComparison')).toHaveLength(0); - }); + await new Promise(setImmediate); + wrapper.update(); + expect(apiQP.getQualityProfile).toHaveBeenCalledTimes(1); + expect(wrapper.find('ProfileRulesSonarWayComparison')).toHaveLength(0); }); diff --git a/server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/__snapshots__/ProfilePermissionsFormSelect-test.tsx.snap b/server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/__snapshots__/ProfilePermissionsFormSelect-test.tsx.snap index a2760e70710..15cbb3f39fb 100644 --- a/server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/__snapshots__/ProfilePermissionsFormSelect-test.tsx.snap +++ b/server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/__snapshots__/ProfilePermissionsFormSelect-test.tsx.snap @@ -6,7 +6,7 @@ exports[`renders 1`] = ` className="Select-big" clearable={false} filterOptions={[Function]} - isLoading={false} + isLoading={true} noResultsText="no_results" onChange={[Function]} onInputChange={[Function]} diff --git a/server/sonar-web/src/main/js/apps/quality-profiles/routes.ts b/server/sonar-web/src/main/js/apps/quality-profiles/routes.ts index 6f8e8730ded..7b889b6eaab 100644 --- a/server/sonar-web/src/main/js/apps/quality-profiles/routes.ts +++ b/server/sonar-web/src/main/js/apps/quality-profiles/routes.ts @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -import { withRouter, RouterState, IndexRouteProps, RouteComponent } from 'react-router'; +import { RouterState, IndexRouteProps, RouteComponent, withRouter } from 'react-router'; const routes = [ { diff --git a/server/sonar-web/src/main/js/apps/system/components/info-items/__tests__/__snapshots__/SysInfoItem-test.tsx.snap b/server/sonar-web/src/main/js/apps/system/components/info-items/__tests__/__snapshots__/SysInfoItem-test.tsx.snap index 86c9310e1d7..f2164f53967 100644 --- a/server/sonar-web/src/main/js/apps/system/components/info-items/__tests__/__snapshots__/SysInfoItem-test.tsx.snap +++ b/server/sonar-web/src/main/js/apps/system/components/info-items/__tests__/__snapshots__/SysInfoItem-test.tsx.snap @@ -129,6 +129,7 @@ Array [ > { it('should display correctly', async () => { const wrapper = shallow(); - expect(wrapper).toMatchSnapshot(); - - const instance = wrapper.instance() as SystemUpgradeNotif; - instance.mounted = true; - instance.fetchSystemUpgrade(); - + expect(wrapper.type()).toBeNull(); await new Promise(setImmediate); wrapper.update(); expect(wrapper).toMatchSnapshot(); }); it('should display nothing', async () => { - getSystemUpgrades.mockImplementationOnce(() => - Promise.resolve({ updateCenterRefresh: '', upgrades: [] }) - ); + getSystemUpgrades.mockImplementationOnce(() => { + return Promise.resolve({ updateCenterRefresh: '', upgrades: [] }); + }); const wrapper = shallow(); - const instance = wrapper.instance() as SystemUpgradeNotif; - instance.mounted = true; - instance.fetchSystemUpgrade(); - await new Promise(setImmediate); wrapper.update(); - expect(wrapper).toMatchSnapshot(); + expect(wrapper.type()).toBeNull(); }); it('should fetch upgrade when mounting', () => { @@ -113,12 +104,8 @@ it('should fetch upgrade when mounting', () => { it('should open the upgrade form', async () => { const wrapper = shallow(); - const instance = wrapper.instance() as SystemUpgradeNotif; - instance.mounted = true; - instance.fetchSystemUpgrade(); await new Promise(setImmediate); wrapper.update(); - click(wrapper.find('button')); expect(wrapper.find('SystemUpgradeForm').exists()).toBeTruthy(); }); diff --git a/server/sonar-web/src/main/js/apps/system/components/system-upgrade/__tests__/__snapshots__/SystemUpgradeNotif-test.tsx.snap b/server/sonar-web/src/main/js/apps/system/components/system-upgrade/__tests__/__snapshots__/SystemUpgradeNotif-test.tsx.snap index a750b00055d..f1b0b865020 100644 --- a/server/sonar-web/src/main/js/apps/system/components/system-upgrade/__tests__/__snapshots__/SystemUpgradeNotif-test.tsx.snap +++ b/server/sonar-web/src/main/js/apps/system/components/system-upgrade/__tests__/__snapshots__/SystemUpgradeNotif-test.tsx.snap @@ -1,8 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`should display correctly 1`] = `null`; - -exports[`should display correctly 2`] = ` +exports[`should display correctly 1`] = `
    @@ -19,5 +17,3 @@ exports[`should display correctly 2`] = `
    `; - -exports[`should display nothing 1`] = `null`; diff --git a/server/sonar-web/src/main/js/apps/tutorials/onboarding/__tests__/NewOrganizationForm-test.js b/server/sonar-web/src/main/js/apps/tutorials/onboarding/__tests__/NewOrganizationForm-test.js index 79a5542b3ee..f6f6eba3125 100644 --- a/server/sonar-web/src/main/js/apps/tutorials/onboarding/__tests__/NewOrganizationForm-test.js +++ b/server/sonar-web/src/main/js/apps/tutorials/onboarding/__tests__/NewOrganizationForm-test.js @@ -21,7 +21,7 @@ import React from 'react'; import { mount } from 'enzyme'; import NewOrganizationForm from '../NewOrganizationForm'; -import { change, doAsync, submit } from '../../../../helpers/testUtils'; +import { change, submit } from '../../../../helpers/testUtils'; jest.mock('../../../../api/organizations', () => ({ createOrganization: () => Promise.resolve(), @@ -29,28 +29,28 @@ jest.mock('../../../../api/organizations', () => ({ getOrganization: () => Promise.resolve(null) })); -it('creates new organization', () => { +it('creates new organization', async () => { const onDone = jest.fn(); const wrapper = mount(); expect(wrapper).toMatchSnapshot(); change(wrapper.find('input'), 'foo'); submit(wrapper.find('form')); expect(wrapper).toMatchSnapshot(); // spinner - return doAsync(() => { - expect(wrapper).toMatchSnapshot(); - expect(onDone).toBeCalledWith('foo'); - }); + await new Promise(setImmediate); + wrapper.update(); + expect(wrapper).toMatchSnapshot(); + expect(onDone).toBeCalledWith('foo'); }); -it('deletes organization', () => { +it('deletes organization', async () => { const onDelete = jest.fn(); const wrapper = mount(); wrapper.setState({ done: true, loading: false, organization: 'foo' }); expect(wrapper).toMatchSnapshot(); submit(wrapper.find('form')); expect(wrapper).toMatchSnapshot(); // spinner - return doAsync(() => { - expect(wrapper).toMatchSnapshot(); - expect(onDelete).toBeCalled(); - }); + await new Promise(setImmediate); + wrapper.update(); + expect(wrapper).toMatchSnapshot(); + expect(onDelete).toBeCalled(); }); diff --git a/server/sonar-web/src/main/js/apps/tutorials/onboarding/__tests__/NewProjectForm-test.js b/server/sonar-web/src/main/js/apps/tutorials/onboarding/__tests__/NewProjectForm-test.js index 7b05724cbe7..89952611111 100644 --- a/server/sonar-web/src/main/js/apps/tutorials/onboarding/__tests__/NewProjectForm-test.js +++ b/server/sonar-web/src/main/js/apps/tutorials/onboarding/__tests__/NewProjectForm-test.js @@ -21,35 +21,35 @@ import React from 'react'; import { mount } from 'enzyme'; import NewProjectForm from '../NewProjectForm'; -import { change, doAsync, submit } from '../../../../helpers/testUtils'; +import { change, submit } from '../../../../helpers/testUtils'; jest.mock('../../../../api/components', () => ({ createProject: () => Promise.resolve(), deleteProject: () => Promise.resolve() })); -it('creates new project', () => { +it('creates new project', async () => { const onDone = jest.fn(); const wrapper = mount(); expect(wrapper).toMatchSnapshot(); change(wrapper.find('input'), 'foo'); submit(wrapper.find('form')); expect(wrapper).toMatchSnapshot(); // spinner - return doAsync(() => { - expect(wrapper).toMatchSnapshot(); - expect(onDone).toBeCalledWith('foo'); - }); + await new Promise(setImmediate); + wrapper.update(); + expect(wrapper).toMatchSnapshot(); + expect(onDone).toBeCalledWith('foo'); }); -it('deletes project', () => { +it('deletes project', async () => { const onDelete = jest.fn(); const wrapper = mount(); wrapper.setState({ done: true, loading: false, projectKey: 'foo' }); expect(wrapper).toMatchSnapshot(); submit(wrapper.find('form')); expect(wrapper).toMatchSnapshot(); // spinner - return doAsync(() => { - expect(wrapper).toMatchSnapshot(); - expect(onDelete).toBeCalled(); - }); + await new Promise(setImmediate); + wrapper.update(); + expect(wrapper).toMatchSnapshot(); + expect(onDelete).toBeCalled(); }); diff --git a/server/sonar-web/src/main/js/apps/tutorials/onboarding/__tests__/OrganizationStep-test.js b/server/sonar-web/src/main/js/apps/tutorials/onboarding/__tests__/OrganizationStep-test.js index 5dadb7c0c94..6bc5530cd54 100644 --- a/server/sonar-web/src/main/js/apps/tutorials/onboarding/__tests__/OrganizationStep-test.js +++ b/server/sonar-web/src/main/js/apps/tutorials/onboarding/__tests__/OrganizationStep-test.js @@ -21,14 +21,19 @@ import React from 'react'; import { mount } from 'enzyme'; import OrganizationStep from '../OrganizationStep'; -import { click, doAsync } from '../../../../helpers/testUtils'; +import { click } from '../../../../helpers/testUtils'; +import { getMyOrganizations } from '../../../../api/organizations'; jest.mock('../../../../api/organizations', () => ({ - getMyOrganizations: () => Promise.resolve(['user', 'another']) + getMyOrganizations: jest.fn(() => Promise.resolve(['user', 'another'])) })); const currentUser = { isLoggedIn: true, login: 'user' }; +beforeEach(() => { + getMyOrganizations.mockClear(); +}); + // FIXME // - if `mount` is used, then it's not possible to correctly set the state, // because the mocked api call is used @@ -49,7 +54,7 @@ it.skip('works with personal organization', () => { expect(onContinue).toBeCalledWith('user'); }); -it('works with existing organization', () => { +it('works with existing organization', async () => { const onContinue = jest.fn(); const wrapper = mount( { stepNumber={1} /> ); - return doAsync(() => { - click(wrapper.find('.js-existing')); - expect(wrapper).toMatchSnapshot(); - wrapper - .find('Select') - .first() - .prop('onChange')({ value: 'another' }); - click(wrapper.find('.js-continue')); - expect(onContinue).toBeCalledWith('another'); - }); + await new Promise(setImmediate); + wrapper.update(); + click(wrapper.find('.js-existing')); + expect(wrapper).toMatchSnapshot(); + wrapper + .find('Select') + .first() + .prop('onChange')({ value: 'another' }); + wrapper.update(); + click(wrapper.find('.js-continue')); + expect(onContinue).toBeCalledWith('another'); }); -it('works with new organization', () => { +it('works with new organization', async () => { const onContinue = jest.fn(); const wrapper = mount( { stepNumber={1} /> ); - return doAsync(() => { - click(wrapper.find('.js-new')); - wrapper.find('NewOrganizationForm').prop('onDone')('new'); - click(wrapper.find('.js-continue')); - expect(onContinue).toBeCalledWith('new'); - }); + await new Promise(setImmediate); + wrapper.update(); + click(wrapper.find('.js-new')); + wrapper.find('NewOrganizationForm').prop('onDone')('new'); + wrapper.update(); + click(wrapper.find('.js-continue')); + expect(onContinue).toBeCalledWith('new'); }); diff --git a/server/sonar-web/src/main/js/apps/tutorials/onboarding/__tests__/ProjectKeyStep-test.js b/server/sonar-web/src/main/js/apps/tutorials/onboarding/__tests__/ProjectKeyStep-test.js index 2af50f6a3b5..8d36627114f 100644 --- a/server/sonar-web/src/main/js/apps/tutorials/onboarding/__tests__/ProjectKeyStep-test.js +++ b/server/sonar-web/src/main/js/apps/tutorials/onboarding/__tests__/ProjectKeyStep-test.js @@ -28,28 +28,28 @@ jest.mock('../../../../api/components', () => ({ deleteProject: () => Promise.resolve() })); -it('creates new project', () => { +it('creates new project', async () => { const onDone = jest.fn(); const wrapper = mount(); expect(wrapper).toMatchSnapshot(); change(wrapper.find('input'), 'foo'); submit(wrapper.find('form')); expect(wrapper).toMatchSnapshot(); // spinner - return doAsync(() => { - expect(wrapper).toMatchSnapshot(); - expect(onDone).toBeCalledWith('foo'); - }); + await new Promise(setImmediate); + wrapper.update(); + expect(wrapper).toMatchSnapshot(); + expect(onDone).toBeCalledWith('foo'); }); -it('deletes project', () => { +it('deletes project', async () => { const onDelete = jest.fn(); const wrapper = mount(); wrapper.setState({ done: true, loading: false, projectKey: 'foo' }); expect(wrapper).toMatchSnapshot(); submit(wrapper.find('form')); expect(wrapper).toMatchSnapshot(); // spinner - return doAsync(() => { - expect(wrapper).toMatchSnapshot(); - expect(onDelete).toBeCalled(); - }); + await new Promise(setImmediate); + wrapper.update(); + expect(wrapper).toMatchSnapshot(); + expect(onDelete).toBeCalled(); }); diff --git a/server/sonar-web/src/main/js/apps/tutorials/onboarding/__tests__/TokenStep-test.js b/server/sonar-web/src/main/js/apps/tutorials/onboarding/__tests__/TokenStep-test.js index 200a9030052..801da708998 100644 --- a/server/sonar-web/src/main/js/apps/tutorials/onboarding/__tests__/TokenStep-test.js +++ b/server/sonar-web/src/main/js/apps/tutorials/onboarding/__tests__/TokenStep-test.js @@ -21,7 +21,7 @@ import React from 'react'; import { mount } from 'enzyme'; import TokenStep from '../TokenStep'; -import { change, click, doAsync, submit } from '../../../../helpers/testUtils'; +import { change, click, submit } from '../../../../helpers/testUtils'; jest.mock('../../../../api/user-tokens', () => ({ getTokens: () => Promise.resolve([{ name: 'foo' }]), @@ -43,11 +43,14 @@ it('generates token', async () => { /> ); await new Promise(setImmediate); + wrapper.update(); expect(wrapper).toMatchSnapshot(); change(wrapper.find('input'), 'my token'); submit(wrapper.find('form')); expect(wrapper).toMatchSnapshot(); // spinner - return doAsync(() => expect(wrapper).toMatchSnapshot()); + await new Promise(setImmediate); + wrapper.update(); + expect(wrapper).toMatchSnapshot(); }); it('revokes token', async () => { @@ -66,7 +69,9 @@ it('revokes token', async () => { expect(wrapper).toMatchSnapshot(); submit(wrapper.find('form')); expect(wrapper).toMatchSnapshot(); // spinner - return doAsync(() => expect(wrapper).toMatchSnapshot()); + await new Promise(setImmediate); + wrapper.update(); + expect(wrapper).toMatchSnapshot(); }); it('continues', async () => { diff --git a/server/sonar-web/src/main/js/apps/tutorials/onboarding/__tests__/__snapshots__/OrganizationStep-test.js.snap b/server/sonar-web/src/main/js/apps/tutorials/onboarding/__tests__/__snapshots__/OrganizationStep-test.js.snap index 48a5505dee2..b36b4f02776 100644 --- a/server/sonar-web/src/main/js/apps/tutorials/onboarding/__tests__/__snapshots__/OrganizationStep-test.js.snap +++ b/server/sonar-web/src/main/js/apps/tutorials/onboarding/__tests__/__snapshots__/OrganizationStep-test.js.snap @@ -25,6 +25,9 @@ exports[`works with existing organization 1`] = ` >
    { - expect(shallow()).toMatchSnapshot(); + expect(mount()).toMatchSnapshot(); }); diff --git a/server/sonar-web/src/main/js/apps/tutorials/onboarding/commands/__tests__/__snapshots__/Command-test.js.snap b/server/sonar-web/src/main/js/apps/tutorials/onboarding/commands/__tests__/__snapshots__/Command-test.js.snap index f456088c24a..63e31484c8d 100644 --- a/server/sonar-web/src/main/js/apps/tutorials/onboarding/commands/__tests__/__snapshots__/Command-test.js.snap +++ b/server/sonar-web/src/main/js/apps/tutorials/onboarding/commands/__tests__/__snapshots__/Command-test.js.snap @@ -1,18 +1,23 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`renders correctly 1`] = ` -
    -
    -    foo
    +  
    +
    +      foo
     bar
    -  
    - -
    + > + copy + +
    +
    `; diff --git a/server/sonar-web/src/main/js/apps/web-api/components/ResponseExample.tsx b/server/sonar-web/src/main/js/apps/web-api/components/ResponseExample.tsx index c20fc9c7515..d23ea61c6d4 100644 --- a/server/sonar-web/src/main/js/apps/web-api/components/ResponseExample.tsx +++ b/server/sonar-web/src/main/js/apps/web-api/components/ResponseExample.tsx @@ -43,8 +43,8 @@ export default class ResponseExample extends React.PureComponent { this.fetchResponseExample(); } - componentDidUpdate(nextProps: Props) { - if (nextProps.action !== this.props.action) { + componentDidUpdate(prevProps: Props) { + if (prevProps.action !== this.props.action) { this.fetchResponseExample(); } } diff --git a/server/sonar-web/src/main/js/components/SourceViewer/components/LineCode.js b/server/sonar-web/src/main/js/components/SourceViewer/components/LineCode.js index a71c07d8002..e2dc21087bf 100644 --- a/server/sonar-web/src/main/js/components/SourceViewer/components/LineCode.js +++ b/server/sonar-web/src/main/js/components/SourceViewer/components/LineCode.js @@ -115,9 +115,11 @@ export default class LineCode extends React.PureComponent { } attachEvents() { - this.symbols = this.codeNode.querySelectorAll('.sym'); - for (const symbol of this.symbols) { - symbol.addEventListener('click', this.handleSymbolClick); + if (this.codeNode) { + this.symbols = this.codeNode.querySelectorAll('.sym'); + for (const symbol of this.symbols) { + symbol.addEventListener('click', this.handleSymbolClick); + } } } diff --git a/server/sonar-web/src/main/js/components/charts/__tests__/__snapshots__/BubbleChart-test.js.snap b/server/sonar-web/src/main/js/components/charts/__tests__/__snapshots__/BubbleChart-test.js.snap index e5854e7792f..acc3eec0736 100644 --- a/server/sonar-web/src/main/js/components/charts/__tests__/__snapshots__/BubbleChart-test.js.snap +++ b/server/sonar-web/src/main/js/components/charts/__tests__/__snapshots__/BubbleChart-test.js.snap @@ -2,13 +2,18 @@ exports[`should display bubbles 1`] = ` @@ -61,6 +74,7 @@ exports[`should render bubble links 1`] = ` > @@ -94,6 +111,7 @@ exports[`should render bubble links 2`] = ` > @@ -134,10 +154,12 @@ exports[`should render bubbles with click handlers 1`] = ` exports[`should render bubbles with click handlers 2`] = ` diff --git a/server/sonar-web/src/main/js/components/common/MultiSelect.js b/server/sonar-web/src/main/js/components/common/MultiSelect.js index 2547da0d2b5..9bfed621cc0 100644 --- a/server/sonar-web/src/main/js/components/common/MultiSelect.js +++ b/server/sonar-web/src/main/js/components/common/MultiSelect.js @@ -68,7 +68,9 @@ export default class MultiSelect extends React.PureComponent { componentDidMount() { this.updateSelectedElements(this.props); this.updateUnselectedElements(this.props); - this.container.addEventListener('keydown', this.handleKeyboard, true); + if (this.container) { + this.container.addEventListener('keydown', this.handleKeyboard, true); + } } componentWillReceiveProps(nextProps /*: Props */) { diff --git a/server/sonar-web/src/main/js/components/common/__tests__/BranchStatus-test.tsx b/server/sonar-web/src/main/js/components/common/__tests__/BranchStatus-test.tsx index 7b2de5d01d7..99d3937a354 100644 --- a/server/sonar-web/src/main/js/components/common/__tests__/BranchStatus-test.tsx +++ b/server/sonar-web/src/main/js/components/common/__tests__/BranchStatus-test.tsx @@ -45,11 +45,11 @@ it('renders status of short-living branches', () => { }); it('renders status of long-living branches', () => { - checkLong(); - checkLong('OK'); - checkLong('ERROR'); + expect(getWrapper().type()).toBeNull(); + expect(getWrapper('OK')).toMatchSnapshot(); + expect(getWrapper('ERROR')).toMatchSnapshot(); - function checkLong(qualityGateStatus?: string) { + function getWrapper(qualityGateStatus?: string) { const branch: LongLivingBranch = { isMain: false, name: 'foo', @@ -58,6 +58,6 @@ it('renders status of long-living branches', () => { if (qualityGateStatus) { branch.status = { qualityGateStatus }; } - expect(shallow()).toMatchSnapshot(); + return shallow(); } }); diff --git a/server/sonar-web/src/main/js/components/common/__tests__/BubblePopupHelper-test.js b/server/sonar-web/src/main/js/components/common/__tests__/BubblePopupHelper-test.js index d17527119b7..953cfad379e 100644 --- a/server/sonar-web/src/main/js/components/common/__tests__/BubblePopupHelper-test.js +++ b/server/sonar-web/src/main/js/components/common/__tests__/BubblePopupHelper-test.js @@ -36,7 +36,8 @@ it('should render an open popup on the right', () => { }> - + , + { disableLifecycleMethods: true } ); expect(popup).toMatchSnapshot(); }); @@ -54,7 +55,8 @@ it('should render the popup helper with a closed popup', () => { }> - + , + { disableLifecycleMethods: true } ); expect(popup).toMatchSnapshot(); }); @@ -73,7 +75,8 @@ it('should render with custom classes', () => { }> - + , + { disableLifecycleMethods: true } ); expect(popup).toMatchSnapshot(); }); @@ -130,7 +133,8 @@ it('should correctly handle clicks on the button', () => { }> - + , + { disableLifecycleMethods: true } ); expect(popup).toMatchSnapshot(); click(popup.find('button')); diff --git a/server/sonar-web/src/main/js/components/common/__tests__/DeferredSpinner-test.js b/server/sonar-web/src/main/js/components/common/__tests__/DeferredSpinner-test.js index 560c705c4cb..d078ddaeb74 100644 --- a/server/sonar-web/src/main/js/components/common/__tests__/DeferredSpinner-test.js +++ b/server/sonar-web/src/main/js/components/common/__tests__/DeferredSpinner-test.js @@ -28,12 +28,14 @@ it('renders spinner after timeout', () => { const spinner = mount(); expect(spinner).toMatchSnapshot(); jest.runAllTimers(); + spinner.update(); expect(spinner).toMatchSnapshot(); }); it('add custom className', () => { const spinner = mount(); jest.runAllTimers(); + spinner.update(); expect(spinner).toMatchSnapshot(); }); @@ -45,6 +47,7 @@ it('renders children before timeout', () => { ); expect(spinner).toMatchSnapshot(); jest.runAllTimers(); + spinner.update(); expect(spinner).toMatchSnapshot(); }); @@ -58,6 +61,7 @@ it('is controlled by loading prop', () => { spinner.setProps({ loading: true }); expect(spinner).toMatchSnapshot(); jest.runAllTimers(); + spinner.update(); expect(spinner).toMatchSnapshot(); spinner.setProps({ loading: false }); expect(spinner).toMatchSnapshot(); diff --git a/server/sonar-web/src/main/js/components/common/__tests__/MultiSelect-test.js b/server/sonar-web/src/main/js/components/common/__tests__/MultiSelect-test.js index 1a52e06f0c3..fe5e7370ea0 100644 --- a/server/sonar-web/src/main/js/components/common/__tests__/MultiSelect-test.js +++ b/server/sonar-web/src/main/js/components/common/__tests__/MultiSelect-test.js @@ -33,10 +33,9 @@ const elements = ['foo', 'bar', 'baz']; it('should render multiselect with selected elements', () => { const multiselect = shallow(); - // Will not have any element in the list since its filled with componentDidMount the first time + // Will not only the selected element expect(multiselect).toMatchSnapshot(); - // Will have some elements multiselect.setProps({ elements }); expect(multiselect).toMatchSnapshot(); multiselect.setState({ activeIdx: 2 }); @@ -47,5 +46,5 @@ it('should render multiselect with selected elements', () => { it('should render with the focus inside the search input', () => { const multiselect = mount(); - expect(multiselect.find('input').node).toBe(document.activeElement); + expect(multiselect.find('input').getDOMNode()).toBe(document.activeElement); }); diff --git a/server/sonar-web/src/main/js/components/common/__tests__/SelectList-test.js b/server/sonar-web/src/main/js/components/common/__tests__/SelectList-test.js index 58afbecad26..9f26ebd25ee 100644 --- a/server/sonar-web/src/main/js/components/common/__tests__/SelectList-test.js +++ b/server/sonar-web/src/main/js/components/common/__tests__/SelectList-test.js @@ -70,6 +70,6 @@ it('should correclty handle user actions', () => { expect(list.state()).toMatchSnapshot(); keydown(38); expect(list.state()).toMatchSnapshot(); - click(list.childAt(2).find('a')); + click(list.find('a').at(2)); expect(onSelect.mock.calls).toMatchSnapshot(); // eslint-disable-linelist }); diff --git a/server/sonar-web/src/main/js/components/common/__tests__/__snapshots__/BranchStatus-test.tsx.snap b/server/sonar-web/src/main/js/components/common/__tests__/__snapshots__/BranchStatus-test.tsx.snap index 32c0d0a2afa..8833bab3ceb 100644 --- a/server/sonar-web/src/main/js/components/common/__tests__/__snapshots__/BranchStatus-test.tsx.snap +++ b/server/sonar-web/src/main/js/components/common/__tests__/__snapshots__/BranchStatus-test.tsx.snap @@ -1,15 +1,13 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`renders status of long-living branches 1`] = `null`; - -exports[`renders status of long-living branches 2`] = ` +exports[`renders status of long-living branches 1`] = ` `; -exports[`renders status of long-living branches 3`] = ` +exports[`renders status of long-living branches 2`] = `
      + > + +
    `; @@ -56,7 +66,7 @@ exports[`should render multiselect with selected elements 2`] = ` className="menu" > } @@ -40,6 +41,7 @@ exports[`should render correctly 1`] = ` } diff --git a/server/sonar-web/src/main/js/components/shared/__tests__/Organization-test.tsx b/server/sonar-web/src/main/js/components/shared/__tests__/Organization-test.tsx index 34f6ace01b2..f08ea3ede15 100644 --- a/server/sonar-web/src/main/js/components/shared/__tests__/Organization-test.tsx +++ b/server/sonar-web/src/main/js/components/shared/__tests__/Organization-test.tsx @@ -31,10 +31,12 @@ it('should match snapshot', () => { it('should not be displayed', () => { expect( - shallow() - ).toMatchSnapshot(); + shallow( + + ).type() + ).toBeNull(); expect( - shallow() - ).toMatchSnapshot(); + shallow().type() + ).toBeNull(); }); diff --git a/server/sonar-web/src/main/js/components/shared/__tests__/QualifierIcon-test.js b/server/sonar-web/src/main/js/components/shared/__tests__/QualifierIcon-test.js index 857ccbaf450..406eb03591e 100644 --- a/server/sonar-web/src/main/js/components/shared/__tests__/QualifierIcon-test.js +++ b/server/sonar-web/src/main/js/components/shared/__tests__/QualifierIcon-test.js @@ -27,7 +27,7 @@ it('should render icon', () => { }); it('should not render icon', () => { - expect(shallow()).toMatchSnapshot(); + expect(shallow().type()).toBeNull(); }); it('should render with custom class', () => { diff --git a/server/sonar-web/src/main/js/components/shared/__tests__/__snapshots__/Organization-test.tsx.snap b/server/sonar-web/src/main/js/components/shared/__tests__/__snapshots__/Organization-test.tsx.snap index 72ffd1b6d84..4f12a56b205 100644 --- a/server/sonar-web/src/main/js/components/shared/__tests__/__snapshots__/Organization-test.tsx.snap +++ b/server/sonar-web/src/main/js/components/shared/__tests__/__snapshots__/Organization-test.tsx.snap @@ -17,7 +17,3 @@ exports[`should match snapshot 1`] = ` /> `; - -exports[`should not be displayed 1`] = `null`; - -exports[`should not be displayed 2`] = `null`; diff --git a/server/sonar-web/src/main/js/components/shared/__tests__/__snapshots__/QualifierIcon-test.js.snap b/server/sonar-web/src/main/js/components/shared/__tests__/__snapshots__/QualifierIcon-test.js.snap index c42ce36411a..3e1625b3e32 100644 --- a/server/sonar-web/src/main/js/components/shared/__tests__/__snapshots__/QualifierIcon-test.js.snap +++ b/server/sonar-web/src/main/js/components/shared/__tests__/__snapshots__/QualifierIcon-test.js.snap @@ -1,7 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`should not render icon 1`] = `null`; - exports[`should render icon 1`] = ` = 1.29.0 < 2" + mime-db ">= 1.30.0 < 2" compression@^1.5.2: - version "1.7.0" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.0.tgz#030c9f198f1643a057d776a738e922da4373012d" + version "1.7.1" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.1.tgz#eff2603efc2e22cf86f35d2eb93589f9875373db" dependencies: - accepts "~1.3.3" - bytes "2.5.0" - compressible "~2.0.10" - debug "2.6.8" + accepts "~1.3.4" + bytes "3.0.0" + compressible "~2.0.11" + debug "2.6.9" on-headers "~1.0.1" safe-buffer "5.1.1" - vary "~1.1.1" + vary "~1.1.2" concat-map@0.0.1: version "0.0.1" @@ -1830,8 +1724,8 @@ concat-stream@^1.6.0: typedarray "^0.0.6" connect-history-api-fallback@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.3.0.tgz#e51d17f8f0ef0db90a64fdb47de3051556e9f169" + version "1.4.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.4.0.tgz#3db24f973f4b923b0e82f619ce0df02411ca623d" console-browserify@^1.1.0: version "1.1.0" @@ -1856,14 +1750,14 @@ content-disposition@0.5.2: resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" content-type-parser@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.1.tgz#c3e56988c53c65127fb46d4032a3a900246fdc94" - -content-type@~1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" + resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.2.tgz#caabe80623e63638b2502fd4c7f12ff4ce2352e7" -convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.5.0: +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + +convert-source-map@^1.4.0, convert-source-map@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" @@ -1883,11 +1777,7 @@ core-js@^1.0.0: version "1.2.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" -core-js@^2.4.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.0.tgz#569c050918be6486b3837552028ae0466b717086" - -core-js@^2.5.0: +core-js@^2.4.0, core-js@^2.5.0: version "2.5.1" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b" @@ -1927,7 +1817,7 @@ create-ecdh@^4.0.0: bn.js "^4.1.0" elliptic "^6.0.0" -create-hash@^1.1.0, create-hash@^1.1.1, create-hash@^1.1.2: +create-hash@^1.1.0, create-hash@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd" dependencies: @@ -1947,7 +1837,7 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: safe-buffer "^5.0.1" sha.js "^2.4.8" -create-react-class@15.6.2: +create-react-class@15.6.2, create-react-class@15.x, create-react-class@^15.5.1, create-react-class@^15.5.2: version "15.6.2" resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.6.2.tgz#cf1ed15f12aad7f14ef5f2dfe05e6c42f91ef02a" dependencies: @@ -1955,14 +1845,6 @@ create-react-class@15.6.2: loose-envify "^1.3.1" object-assign "^4.1.1" -create-react-class@15.x, create-react-class@^15.5.1, create-react-class@^15.5.2, create-react-class@^15.6.0: - version "15.6.0" - resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.6.0.tgz#ab448497c26566e1e29413e883207d57cfe7bed4" - dependencies: - fbjs "^0.8.9" - loose-envify "^1.3.1" - object-assign "^4.1.1" - cross-spawn@5.1.0, cross-spawn@^5.0.1, cross-spawn@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" @@ -1977,6 +1859,12 @@ cryptiles@2.x.x: dependencies: boom "2.x.x" +cryptiles@3.x.x: + version "3.1.2" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" + dependencies: + boom "5.x.x" + crypto-browserify@^3.11.0: version "3.11.1" resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.11.1.tgz#948945efc6757a400d6e5e5af47194d10064279f" @@ -1993,9 +1881,10 @@ crypto-browserify@^3.11.0: randombytes "^2.0.0" css-animation@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/css-animation/-/css-animation-1.3.2.tgz#df515820ef5903733ad2db0999403b3037b8b880" + version "1.4.1" + resolved "https://registry.yarnpkg.com/css-animation/-/css-animation-1.4.1.tgz#5b8813125de0fbbbb0bbe1b472ae84221469b7a8" dependencies: + babel-runtime "6.x" component-classes "^1.2.5" css-color-names@0.0.4: @@ -2159,8 +2048,8 @@ d3-shape@1.2.0: d3-path "1" d3-time-format@2: - version "2.0.5" - resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-2.0.5.tgz#9d7780204f7c9119c9170b1a56db4de9a8af972e" + version "2.1.0" + resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-2.1.0.tgz#a1d9540a1dc498817d44066b121b19a4a83e3531" dependencies: d3-time "1" @@ -2184,10 +2073,6 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -date-fns@*: - version "1.28.5" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.28.5.tgz#257cfc45d322df45ef5658665967ee841cd73faf" - date-fns@1.29.0, date-fns@^1.27.2: version "1.29.0" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6" @@ -2196,9 +2081,9 @@ date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" -debug@2.6.8, debug@^2.1.1, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.3, debug@^2.6.6, debug@^2.6.8: - version "2.6.8" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.6, debug@^2.6.8: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" dependencies: ms "2.0.0" @@ -2212,6 +2097,10 @@ decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + deep-diff@^0.3.5: version "0.3.8" resolved "https://registry.yarnpkg.com/deep-diff/-/deep-diff-0.3.8.tgz#c01de63efb0eec9798801d40c7e0dae25b582c84" @@ -2325,8 +2214,8 @@ detect-port-alt@1.1.3: debug "^2.6.0" diff@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.3.0.tgz#056695150d7aa93237ca7e378ac3b1682b7963b9" + version "3.4.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c" diffie-hellman@^5.0.0: version "5.0.2" @@ -2336,6 +2225,10 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" +discontinuous-range@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/discontinuous-range/-/discontinuous-range-1.0.0.tgz#e38331f0844bba49b9a9cb71c771585aab1bc65a" + dns-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" @@ -2368,8 +2261,8 @@ doctrine@^2.0.0: isarray "^1.0.0" dom-align@1.x: - version "1.6.3" - resolved "https://registry.yarnpkg.com/dom-align/-/dom-align-1.6.3.tgz#3017bcc87f02547b1f15b458649a8d94a71f5903" + version "1.6.5" + resolved "https://registry.yarnpkg.com/dom-align/-/dom-align-1.6.5.tgz#48890ee37563dd43d3b580b75cfb79a6ac8fa004" dom-converter@~0.1: version "0.1.4" @@ -2450,11 +2343,7 @@ ejs@^2.5.6: version "2.5.7" resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.7.tgz#cc872c168880ae3c7189762fd5ffc00896c9518a" -electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.18: - version "1.3.18" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.18.tgz#3dcc99da3e6b665f6abbc71c28ad51a2cd731a9c" - -electron-to-chromium@^1.3.24: +electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.27: version "1.3.27" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.27.tgz#78ecb8a399066187bb374eede35d9c70565a803d" @@ -2514,32 +2403,45 @@ entities@^1.1.1, entities@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" -enzyme-to-json@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/enzyme-to-json/-/enzyme-to-json-2.0.1.tgz#e8b223040a7cc603bc678a4698c1a83c8c649932" - dependencies: - lodash.filter "^4.6.0" - lodash.isnil "^4.0.0" - lodash.isplainobject "^4.0.6" - lodash.omitby "^4.6.0" - lodash.range "^3.2.0" - object-values "^1.0.0" - object.entries "^1.0.4" +enzyme-adapter-react-16@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.0.2.tgz#8c6f431f17c69e1e9eeb25ca4bd92f31971eb2dd" + dependencies: + enzyme-adapter-utils "^1.0.0" + lodash "^4.17.4" + object.assign "^4.0.4" + object.values "^1.0.4" + prop-types "^15.5.10" + react-test-renderer "^16.0.0-0" -enzyme@2.9.1: - version "2.9.1" - resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-2.9.1.tgz#07d5ce691241240fb817bf2c4b18d6e530240df6" +enzyme-adapter-utils@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.0.1.tgz#fcd81223339a55a312f7552641e045c404084009" + dependencies: + lodash "^4.17.4" + object.assign "^4.0.4" + prop-types "^15.5.10" + +enzyme-to-json@3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/enzyme-to-json/-/enzyme-to-json-3.1.4.tgz#a4a85a8f7b561cb8c9c0d728ad1b619a3fed7df2" dependencies: - cheerio "^0.22.0" - function.prototype.name "^1.0.0" + lodash "^4.17.4" + +enzyme@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-3.1.0.tgz#d8ca84085790fbcec6ed40badd14478faee4c25a" + dependencies: + cheerio "^1.0.0-rc.2" + function.prototype.name "^1.0.3" is-subset "^0.1.1" lodash "^4.17.4" object-is "^1.0.1" object.assign "^4.0.4" object.entries "^1.0.4" object.values "^1.0.4" - prop-types "^15.5.10" - uuid "^3.0.1" + raf "^3.3.2" + rst-selector-parser "^2.2.2" errno@^0.1.3, errno@^0.1.4: version "0.1.4" @@ -2554,11 +2456,11 @@ error-ex@^1.2.0: is-arrayish "^0.2.1" es-abstract@^1.6.1, es-abstract@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.8.0.tgz#3b00385e85729932beffa9163bbea1234e932914" + version "1.9.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.9.0.tgz#690829a07cae36b222e7fd9b75c0d0573eb25227" dependencies: es-to-primitive "^1.1.1" - function-bind "^1.1.0" + function-bind "^1.1.1" has "^1.0.1" is-callable "^1.1.3" is-regex "^1.0.4" @@ -2632,15 +2534,15 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1 resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" escodegen@^1.6.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" + version "1.9.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.0.tgz#9811a2f265dc1cd3894420ee3717064b632b8852" dependencies: - esprima "^2.7.1" - estraverse "^1.9.1" + esprima "^3.1.3" + estraverse "^4.2.0" esutils "^2.0.2" optionator "^0.8.1" optionalDependencies: - source-map "~0.2.0" + source-map "~0.5.6" escope@^3.6.0: version "3.6.0" @@ -2761,10 +2663,14 @@ espree@^3.5.1: acorn "^5.1.1" acorn-jsx "^3.0.0" -esprima@^2.6.0, esprima@^2.7.1: +esprima@^2.6.0: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" +esprima@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + esprima@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" @@ -2782,21 +2688,17 @@ esrecurse@^4.1.0: estraverse "^4.1.0" object-assign "^4.0.1" -estraverse@^1.9.1: - version "1.9.3" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" - estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" -esutils@^2.0.0, esutils@^2.0.2: +esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" -etag@~1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.0.tgz#6f631aef336d6c46362b51764044ce216be3c051" +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" event-emitter@~0.3.5: version "0.3.5" @@ -2819,15 +2721,16 @@ eventsource@0.1.6: dependencies: original ">=0.0.5" -evp_bytestokey@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz#497b66ad9fef65cd7c08a6180824ba1476b66e53" +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" dependencies: - create-hash "^1.1.1" + md5.js "^1.3.4" + safe-buffer "^5.1.1" exec-sh@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.0.tgz#14f75de3f20d286ef933099b2ce50a90359cef10" + version "0.2.1" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.1.tgz#163b98a6e89e6b65b47c2a28d215bc1f63989c38" dependencies: merge "^1.1.3" @@ -2869,7 +2772,7 @@ expand-brackets@^0.1.4: dependencies: is-posix-bracket "^0.1.0" -expand-brackets@^2.0.1: +expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" dependencies: @@ -2909,37 +2812,39 @@ expose-loader@0.7.3: resolved "https://registry.yarnpkg.com/expose-loader/-/expose-loader-0.7.3.tgz#35fbd3659789e4faa81f59de8b7e9fc39e466d51" express@^4.13.3, express@^4.15.2: - version "4.15.4" - resolved "https://registry.yarnpkg.com/express/-/express-4.15.4.tgz#032e2253489cf8fce02666beca3d11ed7a2daed1" + version "4.16.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.16.2.tgz#e35c6dfe2d64b7dca0a5cd4f21781be3299e076c" dependencies: - accepts "~1.3.3" + accepts "~1.3.4" array-flatten "1.1.1" + body-parser "1.18.2" content-disposition "0.5.2" - content-type "~1.0.2" + content-type "~1.0.4" cookie "0.3.1" cookie-signature "1.0.6" - debug "2.6.8" + debug "2.6.9" depd "~1.1.1" encodeurl "~1.0.1" escape-html "~1.0.3" - etag "~1.8.0" - finalhandler "~1.0.4" - fresh "0.5.0" + etag "~1.8.1" + finalhandler "1.1.0" + fresh "0.5.2" merge-descriptors "1.0.1" methods "~1.1.2" on-finished "~2.3.0" - parseurl "~1.3.1" + parseurl "~1.3.2" path-to-regexp "0.1.7" - proxy-addr "~1.1.5" - qs "6.5.0" + proxy-addr "~2.0.2" + qs "6.5.1" range-parser "~1.2.0" - send "0.15.4" - serve-static "1.12.4" - setprototypeof "1.0.3" + safe-buffer "5.1.1" + send "0.16.1" + serve-static "1.13.1" + setprototypeof "1.1.0" statuses "~1.3.1" type-is "~1.6.15" - utils-merge "1.0.0" - vary "~1.1.1" + utils-merge "1.0.1" + vary "~1.1.2" extend-shallow@^2.0.1: version "2.0.1" @@ -2947,17 +2852,17 @@ extend-shallow@^2.0.1: dependencies: is-extendable "^0.1.0" -extend@~3.0.0: +extend@~3.0.0, extend@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" external-editor@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.4.tgz#1ed9199da9cbfe2ef2f7a31b2fde8b0d12368972" + version "2.0.5" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.5.tgz#52c249a3981b9ba187c7cacf5beb50bf1d91a6bc" dependencies: iconv-lite "^0.4.17" jschardet "^1.4.2" - tmp "^0.0.31" + tmp "^0.0.33" extglob@^0.3.1: version "0.3.2" @@ -2965,18 +2870,18 @@ extglob@^0.3.1: dependencies: is-extglob "^1.0.0" -extglob@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-1.1.0.tgz#0678b4e2ce45c0e4e50f5e5eafb1b0dab5b4e424" +extglob@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.2.tgz#3290f46208db1b2e8eb8be0c94ed9e6ad80edbe2" dependencies: array-unique "^0.3.2" - define-property "^0.2.5" - expand-brackets "^2.0.1" + define-property "^1.0.0" + expand-brackets "^2.1.4" extend-shallow "^2.0.1" - fragment-cache "^0.2.0" + fragment-cache "^0.2.1" regex-not "^1.0.0" snapdragon "^0.8.1" - to-regex "^2.1.0" + to-regex "^3.0.1" extract-text-webpack-plugin@3.0.1: version "3.0.1" @@ -3025,7 +2930,7 @@ fb-watchman@^2.0.0: dependencies: bser "^2.0.0" -fbjs@^0.8.16: +fbjs@^0.8.16, fbjs@^0.8.9: version "0.8.16" resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db" dependencies: @@ -3037,18 +2942,6 @@ fbjs@^0.8.16: setimmediate "^1.0.5" ua-parser-js "^0.7.9" -fbjs@^0.8.9: - version "0.8.14" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.14.tgz#d1dbe2be254c35a91e09f31f9cd50a40b2a0ed1c" - dependencies: - core-js "^1.0.0" - isomorphic-fetch "^2.1.1" - loose-envify "^1.0.0" - object-assign "^4.1.0" - promise "^7.1.1" - setimmediate "^1.0.5" - ua-parser-js "^0.7.9" - figures@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" @@ -3080,10 +2973,14 @@ fileset@^2.0.2: glob "^7.0.3" minimatch "^3.0.3" -filesize@3.5.10, filesize@^3.5.9: +filesize@3.5.10: version "3.5.10" resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.5.10.tgz#fc8fa23ddb4ef9e5e0ab6e1e64f679a24a56761f" +filesize@^3.5.9: + version "3.5.11" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.5.11.tgz#1919326749433bb3cf77368bd158caabcc19e9ee" + fill-range@^2.1.0: version "2.2.3" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" @@ -3103,15 +3000,15 @@ fill-range@^4.0.0: repeat-string "^1.6.1" to-regex-range "^2.1.0" -finalhandler@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.4.tgz#18574f2e7c4b98b8ae3b230c21f201f31bdb3fb7" +finalhandler@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" dependencies: - debug "2.6.8" + debug "2.6.9" encodeurl "~1.0.1" escape-html "~1.0.3" on-finished "~2.3.0" - parseurl "~1.3.1" + parseurl "~1.3.2" statuses "~1.3.1" unpipe "~1.0.0" @@ -3137,8 +3034,8 @@ find-up@^2.0.0, find-up@^2.1.0: locate-path "^2.0.0" flat-cache@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96" + version "1.3.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" dependencies: circular-json "^0.3.1" del "^2.0.2" @@ -3179,19 +3076,27 @@ form-data@~2.1.1: combined-stream "^1.0.5" mime-types "^2.1.12" -forwarded@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.0.tgz#19ef9874c4ae1c297bcf078fde63a09b66a84363" +form-data@~2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" -fragment-cache@^0.2.0, fragment-cache@^0.2.1: +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + +fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" dependencies: map-cache "^0.2.2" -fresh@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e" +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" fs-extra@0.30.0: version "0.30.0" @@ -3204,11 +3109,11 @@ fs-extra@0.30.0: rimraf "^2.2.8" fs-extra@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.1.tgz#7fc0c6c8957f983f57f306a24e5b9ddd8d0dd880" + version "4.0.2" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.2.tgz#f91704c53d1b461f893452b0c307d9997647ab6b" dependencies: graceful-fs "^4.1.2" - jsonfile "^3.0.0" + jsonfile "^4.0.0" universalify "^0.1.0" fs.realpath@^1.0.0: @@ -3239,11 +3144,11 @@ fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: mkdirp ">=0.5 0" rimraf "2" -function-bind@^1.0.2, function-bind@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771" +function-bind@^1.0.2, function-bind@^1.1.0, function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" -function.prototype.name@^1.0.0: +function.prototype.name@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.0.3.tgz#0099ae5572e9dd6f03c97d023fd92bcc5e639eac" dependencies: @@ -3284,7 +3189,7 @@ get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" -get-value@^2.0.3, get-value@^2.0.5, get-value@^2.0.6: +get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -3336,7 +3241,7 @@ global-prefix@^1.0.1: is-windows "^1.0.1" which "^1.2.14" -globals@^9.0.0, globals@^9.17.0, globals@^9.18.0: +globals@^9.17.0, globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" @@ -3403,8 +3308,8 @@ handlebars@2.0.0: uglify-js "~2.3" handlebars@^4.0.3: - version "4.0.10" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.10.tgz#3d30c718b09a3d96f23ea4cc1f403c4d3ba9ff4f" + version "4.0.11" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" dependencies: async "^1.4.0" optimist "^0.6.1" @@ -3416,6 +3321,10 @@ har-schema@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + har-validator@~4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" @@ -3423,6 +3332,13 @@ har-validator@~4.2.1: ajv "^4.9.1" har-schema "^1.0.5" +har-validator@~5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" + dependencies: + ajv "^5.1.0" + har-schema "^2.0.0" + has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -3449,10 +3365,25 @@ has-value@^0.3.1: has-values "^0.1.4" isobject "^2.0.0" +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + has-values@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + has@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" @@ -3465,6 +3396,13 @@ hash-base@^2.0.0: dependencies: inherits "^2.0.1" +hash-base@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.3" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" @@ -3472,7 +3410,7 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.0" -hawk@~3.1.3: +hawk@3.1.3, hawk@~3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" dependencies: @@ -3481,6 +3419,15 @@ hawk@~3.1.3: hoek "2.x.x" sntp "1.x.x" +hawk@~6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" + dependencies: + boom "4.x.x" + cryptiles "3.x.x" + hoek "4.x.x" + sntp "2.x.x" + he@1.1.x: version "1.1.1" resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" @@ -3506,6 +3453,10 @@ hoek@2.x.x: version "2.16.3" resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" +hoek@4.x.x: + version "4.2.0" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" + hoist-non-react-statics@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz#aa448cf0986d55cc40773b17174b7dd066cb7cfb" @@ -3545,8 +3496,8 @@ html-comment-regex@^1.1.0: resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" html-encoding-sniffer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.1.tgz#79bf7a785ea495fe66165e734153f363ff5437da" + version "1.0.2" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" dependencies: whatwg-encoding "^1.0.1" @@ -3555,8 +3506,8 @@ html-entities@1.2.1, html-entities@^1.2.0: resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" html-minifier@^3.2.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.3.tgz#4a275e3b1a16639abb79b4c11191ff0d0fcf1ab9" + version "3.5.6" + resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.6.tgz#7e4e661a09999599c7d8e8a2b8d7fb7430bb5c3e" dependencies: camel-case "3.0.x" clean-css "4.1.x" @@ -3565,7 +3516,7 @@ html-minifier@^3.2.3: ncname "1.0.x" param-case "2.1.x" relateurl "0.2.x" - uglify-js "3.0.x" + uglify-js "3.1.x" html-webpack-plugin@2.30.1: version "2.30.1" @@ -3602,7 +3553,7 @@ http-deceiver@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" -http-errors@~1.6.1, http-errors@~1.6.2: +http-errors@1.6.2, http-errors@~1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" dependencies: @@ -3611,6 +3562,10 @@ http-errors@~1.6.1, http-errors@~1.6.2: setprototypeof "1.0.3" statuses ">= 1.3.1 < 2" +http-parser-js@>=0.4.0: + version "0.4.9" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.9.tgz#ea1a04fb64adff0242e9974f297dd4c3cad271e1" + http-proxy-middleware@~0.17.4: version "0.17.4" resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz#642e8848851d66f09d4f124912846dbaeb41b833" @@ -3635,17 +3590,21 @@ http-signature@~1.1.0: jsprim "^1.2.2" sshpk "^1.7.0" +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + https-browserify@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82" -iconv-lite@0.4.13: - version "0.4.13" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" - -iconv-lite@^0.4.17, iconv-lite@~0.4.13: - version "0.4.18" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.18.tgz#23d8656b16aae6742ac29732ea8f0336a4789cf2" +iconv-lite@0.4.19, iconv-lite@^0.4.17, iconv-lite@~0.4.13: + version "0.4.19" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" icss-replace-symbols@^1.1.0: version "1.1.0" @@ -3662,8 +3621,8 @@ ieee754@^1.1.4: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" ignore@^3.3.3: - version "3.3.5" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.5.tgz#c4e715455f6073a8d7e5dae72d2fc9d71663dba6" + version "3.3.7" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" import-local@^0.1.1: version "0.1.1" @@ -3758,8 +3717,8 @@ internal-ip@1.2.0: meow "^3.3.0" interpret@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.3.tgz#cbc35c62eeee73f19ab7b10a801511401afc0f90" + version "1.0.4" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.4.tgz#820cdd588b868ffb191a809506d6c9c8f212b1b0" intl-format-cache@^2.0.5: version "2.0.5" @@ -3781,7 +3740,7 @@ intl-relativeformat@2.1.0, intl-relativeformat@^2.0.0: dependencies: intl-messageformat "^2.0.0" -invariant@^2.0.0, invariant@^2.1.1, invariant@^2.2.0, invariant@^2.2.1, invariant@^2.2.2: +invariant@^2.0.0, invariant@^2.1.1, invariant@^2.2.1, invariant@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" dependencies: @@ -3795,9 +3754,9 @@ ip@^1.1.0, ip@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" -ipaddr.js@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.4.0.tgz#296aca878a821816e5b85d0a285a99bcff4582f0" +ipaddr.js@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.5.2.tgz#d4b505bde9946987ccf0fc58d9010ff9607e3fa0" is-absolute-url@^2.0.0: version "2.1.0" @@ -3820,8 +3779,8 @@ is-binary-path@^1.0.0: binary-extensions "^1.0.0" is-buffer@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" is-builtin-module@^1.0.0: version "1.0.0" @@ -3967,7 +3926,7 @@ is-plain-obj@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" -is-plain-object@^2.0.1: +is-plain-object@^2.0.1, is-plain-object@^2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" dependencies: @@ -4051,7 +4010,7 @@ isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" -isobject@^2.0.0, isobject@^2.1.0: +isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" dependencies: @@ -4073,17 +4032,17 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" istanbul-api@^1.1.1: - version "1.1.11" - resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.1.11.tgz#fcc0b461e2b3bda71e305155138238768257d9de" + version "1.2.1" + resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.2.1.tgz#0c60a0515eb11c7d65c6b50bba2c6e999acd8620" dependencies: async "^2.1.4" fileset "^2.0.2" istanbul-lib-coverage "^1.1.1" - istanbul-lib-hook "^1.0.7" - istanbul-lib-instrument "^1.7.4" - istanbul-lib-report "^1.1.1" - istanbul-lib-source-maps "^1.2.1" - istanbul-reports "^1.1.1" + istanbul-lib-hook "^1.1.0" + istanbul-lib-instrument "^1.9.1" + istanbul-lib-report "^1.1.2" + istanbul-lib-source-maps "^1.2.2" + istanbul-reports "^1.1.3" js-yaml "^3.7.0" mkdirp "^0.5.1" once "^1.4.0" @@ -4092,46 +4051,46 @@ istanbul-lib-coverage@^1.0.1, istanbul-lib-coverage@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz#73bfb998885299415c93d38a3e9adf784a77a9da" -istanbul-lib-hook@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.0.7.tgz#dd6607f03076578fe7d6f2a630cf143b49bacddc" +istanbul-lib-hook@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.1.0.tgz#8538d970372cb3716d53e55523dd54b557a8d89b" dependencies: append-transform "^0.4.0" -istanbul-lib-instrument@^1.4.2, istanbul-lib-instrument@^1.7.2, istanbul-lib-instrument@^1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.4.tgz#e9fd920e4767f3d19edc765e2d6b3f5ccbd0eea8" +istanbul-lib-instrument@^1.4.2, istanbul-lib-instrument@^1.7.5, istanbul-lib-instrument@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.1.tgz#250b30b3531e5d3251299fdd64b0b2c9db6b558e" dependencies: babel-generator "^6.18.0" babel-template "^6.16.0" babel-traverse "^6.18.0" babel-types "^6.18.0" - babylon "^6.17.4" + babylon "^6.18.0" istanbul-lib-coverage "^1.1.1" semver "^5.3.0" -istanbul-lib-report@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz#f0e55f56655ffa34222080b7a0cd4760e1405fc9" +istanbul-lib-report@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.2.tgz#922be27c13b9511b979bd1587359f69798c1d425" dependencies: istanbul-lib-coverage "^1.1.1" mkdirp "^0.5.1" path-parse "^1.0.5" supports-color "^3.1.2" -istanbul-lib-source-maps@^1.1.0, istanbul-lib-source-maps@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.1.tgz#a6fe1acba8ce08eebc638e572e294d267008aa0c" +istanbul-lib-source-maps@^1.1.0, istanbul-lib-source-maps@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.2.tgz#750578602435f28a0c04ee6d7d9e0f2960e62c1c" dependencies: - debug "^2.6.3" + debug "^3.1.0" istanbul-lib-coverage "^1.1.1" mkdirp "^0.5.1" rimraf "^2.6.1" source-map "^0.5.3" -istanbul-reports@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.1.1.tgz#042be5c89e175bc3f86523caab29c014e77fee4e" +istanbul-reports@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.1.3.tgz#3b9e1e8defb6d18b1d425da8e8b32c5a163f2d10" dependencies: handlebars "^4.0.3" @@ -4365,21 +4324,14 @@ jquery@2.2.0: resolved "https://registry.yarnpkg.com/jquery/-/jquery-2.2.0.tgz#d0e84ebbf199da51bf7ec39307f19b35754e9cba" js-base64@^2.1.9: - version "2.1.9" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.1.9.tgz#f0e80ae039a4bd654b5f281fc93f04a914a7fcce" + version "2.3.2" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.3.2.tgz#a79a923666372b580f8e27f51845c6f7e8fbfbaf" js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" -js-yaml@^3.4.3, js-yaml@^3.7.0: - version "3.9.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.9.1.tgz#08775cebdfdd359209f0d2acd383c8f86a6904a0" - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^3.9.1: +js-yaml@^3.4.3, js-yaml@^3.7.0, js-yaml@^3.9.1: version "3.10.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" dependencies: @@ -4398,8 +4350,8 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" jschardet@^1.4.2: - version "1.5.1" - resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.5.1.tgz#c519f629f86b3a5bedba58a88d311309eec097f9" + version "1.6.0" + resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.6.0.tgz#c7d1a71edcff2839db2f9ec30fc5d5ebd3c1a678" jsdom@^9.12.0: version "9.12.0" @@ -4469,9 +4421,9 @@ jsonfile@^2.1.0: optionalDependencies: graceful-fs "^4.1.6" -jsonfile@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" optionalDependencies: graceful-fs "^4.1.6" @@ -4514,9 +4466,13 @@ kind-of@^4.0.0: dependencies: is-buffer "^1.1.5" -kind-of@^5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.0.2.tgz#f57bec933d9a2209ffa96c5c08343607b7035fda" +kind-of@^5.0.0, kind-of@^5.0.2: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + +kind-of@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.0.tgz#3606e9e2fa960e7ddaa8898c03804e47e5d66644" klaw@^1.0.0: version "1.3.1" @@ -4528,7 +4484,7 @@ lazy-cache@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" -lazy-cache@^2.0.1, lazy-cache@^2.0.2: +lazy-cache@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-2.0.2.tgz#b9190a4f913354694840859f8a8f7084d8822264" dependencies: @@ -4681,14 +4637,6 @@ lodash._getnative@^3.0.0: version "3.9.1" resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" -lodash.assignin@^4.0.9: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2" - -lodash.bind@^4.1.4: - version "4.2.1" - resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35" - lodash.camelcase@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" @@ -4697,21 +4645,9 @@ lodash.cond@^4.3.0: version "4.5.2" resolved "https://registry.yarnpkg.com/lodash.cond/-/lodash.cond-4.5.2.tgz#f471a1da486be60f6ab955d17115523dd1d255d5" -lodash.defaults@^4.0.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" - -lodash.filter@^4.4.0, lodash.filter@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace" - -lodash.flatten@^4.2.0: +lodash.flattendeep@^4.4.0: version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" - -lodash.foreach@^4.3.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" + resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" lodash.isarguments@^3.0.0: version "3.1.0" @@ -4721,14 +4657,6 @@ lodash.isarray@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" -lodash.isnil@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/lodash.isnil/-/lodash.isnil-4.0.0.tgz#49e28cd559013458c814c5479d3c663a21bfaa6c" - -lodash.isplainobject@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - lodash.keys@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" @@ -4737,42 +4665,10 @@ lodash.keys@^3.1.2: lodash.isarguments "^3.0.0" lodash.isarray "^3.0.0" -lodash.map@^4.4.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" - lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" -lodash.merge@^4.4.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.0.tgz#69884ba144ac33fe699737a6086deffadd0f89c5" - -lodash.omitby@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.omitby/-/lodash.omitby-4.6.0.tgz#5c15ff4754ad555016b53c041311e8f079204791" - -lodash.pick@^4.2.1: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" - -lodash.range@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lodash.range/-/lodash.range-3.2.0.tgz#f461e588f66683f7eadeade513e38a69a565a15d" - -lodash.reduce@^4.4.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b" - -lodash.reject@^4.4.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f42a9f52415" - -lodash.some@^4.4.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" - lodash.unescape@4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c" @@ -4781,7 +4677,7 @@ lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" -lodash@4.17.4, lodash@^4.14.0, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0: +lodash@4.17.4, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" @@ -4860,17 +4756,23 @@ map-obj@^1.0.0, map-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" -map-visit@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-0.1.5.tgz#dbe43927ce5525b80dfc1573a44d68c51f26816b" +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" dependencies: - lazy-cache "^2.0.1" - object-visit "^0.3.4" + object-visit "^1.0.0" math-expression-evaluator@^1.2.14: version "1.2.17" resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac" +md5.js@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -4934,47 +4836,47 @@ micromatch@^2.1.5, micromatch@^2.3.11: regex-cache "^0.4.2" micromatch@^3.0.3: - version "3.0.4" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.0.4.tgz#1543f1d04813447ac852001c5f5a933401786d1d" + version "3.1.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.4.tgz#bb812e741a41f982c854e42b421a7eac458796f4" dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" - braces "^2.2.2" + braces "^2.3.0" define-property "^1.0.0" extend-shallow "^2.0.1" - extglob "^1.1.0" + extglob "^2.0.2" fragment-cache "^0.2.1" - kind-of "^4.0.0" - nanomatch "^1.2.0" - object.pick "^1.2.0" + kind-of "^6.0.0" + nanomatch "^1.2.5" + object.pick "^1.3.0" regex-not "^1.0.0" snapdragon "^0.8.1" to-regex "^3.0.1" miller-rabin@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.0.tgz#4a62fb1d42933c05583982f4c716f6fb9e6c6d3d" + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" dependencies: bn.js "^4.0.0" brorand "^1.0.1" -"mime-db@>= 1.29.0 < 2", mime-db@~1.29.0: - version "1.29.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.29.0.tgz#48d26d235589651704ac5916ca06001914266878" +"mime-db@>= 1.30.0 < 2": + version "1.31.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.31.0.tgz#a49cd8f3ebf3ed1a482b60561d9105ad40ca74cb" -mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.7: - version "2.1.16" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.16.tgz#2b858a52e5ecd516db897ac2be87487830698e23" - dependencies: - mime-db "~1.29.0" +mime-db@~1.30.0: + version "1.30.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" -mime@1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" +mime-types@^2.1.12, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17, mime-types@~2.1.7: + version "2.1.17" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" + dependencies: + mime-db "~1.30.0" -mime@^1.3.4: - version "1.3.6" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.6.tgz#591d84d3653a6b0b4a3b9df8de5aa8108e72e5e0" +mime@1.4.1, mime@^1.3.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" mimic-fn@^1.0.0: version "1.1.0" @@ -5012,7 +4914,7 @@ minimist@~0.0.1: version "0.0.10" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" -mixin-deep@^1.1.3: +mixin-deep@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.2.0.tgz#d02b8c6f8b6d4b8f5982d3fd009c4919851c3fe2" dependencies: @@ -5045,22 +4947,21 @@ mute-stream@0.0.7: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" nan@^2.3.0: - version "2.6.2" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" + version "2.7.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46" -nanomatch@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.0.tgz#76fdb3d4ae7617e37719e7a4047b840857c0cb1c" +nanomatch@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.5.tgz#5c9ab02475c76676275731b0bf0a7395c624a9c4" dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" define-property "^1.0.0" extend-shallow "^2.0.1" fragment-cache "^0.2.1" - is-extglob "^2.1.1" is-odd "^1.0.0" - kind-of "^4.0.0" - object.pick "^1.2.0" + kind-of "^5.0.2" + object.pick "^1.3.0" regex-not "^1.0.0" snapdragon "^0.8.1" to-regex "^3.0.1" @@ -5075,19 +4976,27 @@ ncname@1.0.x: dependencies: xml-char-classes "^1.0.0" +nearley@^2.7.10: + version "2.11.0" + resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.11.0.tgz#5e626c79a6cd2f6ab9e7e5d5805e7668967757ae" + dependencies: + nomnom "~1.6.2" + railroad-diagrams "^1.0.0" + randexp "^0.4.2" + negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" no-case@^2.2.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.1.tgz#7aeba1c73a52184265554b7dc03baf720df80081" + version "2.3.2" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" dependencies: lower-case "^1.1.1" node-fetch@^1.0.1: - version "1.7.2" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.2.tgz#c54e9aac57e432875233525f3c891c4159ffefd7" + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" dependencies: encoding "^0.1.11" is-stream "^1.0.1" @@ -5138,19 +5047,27 @@ node-notifier@^5.0.2: which "^1.2.12" node-pre-gyp@^0.6.36: - version "0.6.36" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz#db604112cb74e0d477554e9b505b17abddfab786" + version "0.6.38" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.38.tgz#e92a20f83416415bb4086f6d1fb78b3da73d113d" dependencies: + hawk "3.1.3" mkdirp "^0.5.1" nopt "^4.0.1" npmlog "^4.0.2" rc "^1.1.7" - request "^2.81.0" + request "2.81.0" rimraf "^2.6.1" semver "^5.3.0" tar "^2.2.1" tar-pack "^3.4.0" +nomnom@~1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/nomnom/-/nomnom-1.6.2.tgz#84a66a260174408fc5b77a18f888eccc44fb6971" + dependencies: + colors "0.5.x" + underscore "~1.4.4" + nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" @@ -5230,10 +5147,10 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" "nwmatcher@>= 1.3.9 < 2.0.0": - version "1.4.1" - resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.1.tgz#7ae9b07b0ea804db7e25f05cb5fe4097d4e4949f" + version "1.4.3" + resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.3.tgz#64348e3b3d80f035b40ac11563d278f8b72db89c" -oauth-sign@~0.8.1: +oauth-sign@~0.8.1, oauth-sign@~0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" @@ -5257,15 +5174,11 @@ object-keys@^1.0.10, object-keys@^1.0.8: version "1.0.11" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" -object-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/object-values/-/object-values-1.0.0.tgz#72af839630119e5b98c3b02bb8c27e3237158105" - -object-visit@^0.3.4: - version "0.3.4" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-0.3.4.tgz#ae15cf86f0b2fdd551771636448452c54c3da829" +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" dependencies: - isobject "^2.0.0" + isobject "^3.0.0" object.assign@^4.0.4: version "4.0.4" @@ -5291,11 +5204,11 @@ object.omit@^2.0.0: for-own "^0.1.4" is-extendable "^0.1.1" -object.pick@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.2.0.tgz#b5392bee9782da6d9fb7d6afaf539779f1234c2b" +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" dependencies: - isobject "^2.1.0" + isobject "^3.0.1" object.values@^1.0.4: version "1.0.4" @@ -5407,7 +5320,7 @@ os-locale@^2.0.0: lcid "^1.0.0" mem "^1.1.0" -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1: +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -5483,9 +5396,15 @@ parse5@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" -parseurl@~1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" +parse5@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.2.tgz#05eff57f0ef4577fb144a79f8b9a967a6cc44510" + dependencies: + "@types/node" "^6.0.46" + +parseurl@~1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" pascalcase@^0.1.1: version "0.1.1" @@ -5540,8 +5459,8 @@ path-type@^2.0.0: pify "^2.0.0" pbkdf2@^3.0.3: - version "3.0.13" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.13.tgz#c37d295531e786b1da3e3eadc840426accb0ae25" + version "3.0.14" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.14.tgz#a35e13c64799b06ce15320f459c230e68e73bade" dependencies: create-hash "^1.1.2" create-hmac "^1.1.4" @@ -5553,6 +5472,10 @@ performance-now@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -5868,15 +5791,15 @@ postcss-zindex@^2.0.1: uniqs "^2.0.0" postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.16: - version "5.2.17" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.17.tgz#cf4f597b864d65c8a492b2eabe9d706c879c388b" + version "5.2.18" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" dependencies: chalk "^1.1.3" js-base64 "^2.1.9" source-map "^0.5.6" supports-color "^3.2.3" -postcss@^6.0.0, postcss@^6.0.13: +postcss@^6.0.0, postcss@^6.0.1, postcss@^6.0.13: version "6.0.13" resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.13.tgz#b9ecab4ee00c89db3ec931145bd9590bbf3f125f" dependencies: @@ -5884,14 +5807,6 @@ postcss@^6.0.0, postcss@^6.0.13: source-map "^0.6.1" supports-color "^4.4.0" -postcss@^6.0.1: - version "6.0.9" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.9.tgz#54819766784a51c65b1ec4d54c2f93765438c35a" - dependencies: - chalk "^2.1.0" - source-map "^0.5.6" - supports-color "^4.2.1" - prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -5922,11 +5837,7 @@ pretty-format@^21.2.1: ansi-regex "^3.0.0" ansi-styles "^3.2.0" -private@^0.1.6: - version "0.1.7" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" - -private@^0.1.7: +private@^0.1.6, private@^0.1.7: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" @@ -5948,7 +5859,7 @@ promise@^7.1.1: dependencies: asap "~2.0.3" -prop-types@15.6.0: +prop-types@15.6.0, prop-types@15.x, prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.6, prop-types@^15.5.8, prop-types@^15.6.0: version "15.6.0" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.0.tgz#ceaf083022fc46b4a35f69e13ef75aed0d639856" dependencies: @@ -5956,19 +5867,12 @@ prop-types@15.6.0: loose-envify "^1.3.1" object-assign "^4.1.1" -prop-types@15.x, prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.6, prop-types@^15.5.8: - version "15.5.10" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.5.10.tgz#2797dfc3126182e3a95e3dfbb2e893ddd7456154" - dependencies: - fbjs "^0.8.9" - loose-envify "^1.3.1" - -proxy-addr@~1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.5.tgz#71c0ee3b102de3f202f3b64f608d173fcba1a918" +proxy-addr@~2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.2.tgz#6571504f47bb988ec8180253f85dd7e14952bdec" dependencies: - forwarded "~0.1.0" - ipaddr.js "1.4.0" + forwarded "~0.1.2" + ipaddr.js "1.5.2" prr@~0.0.0: version "0.0.0" @@ -5997,12 +5901,12 @@ punycode@^1.2.4, punycode@^1.4.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" q@^1.1.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.0.tgz#dd01bac9d06d30e6f219aecb8253ee9ebdc308f1" + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" -qs@6.5.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.0.tgz#8d04954d364def3efc55b5a0793e1e2c8b1e6e49" +qs@6.5.1, qs@~6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" qs@~6.4.0: version "6.4.0" @@ -6031,6 +5935,23 @@ querystringify@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-1.0.0.tgz#6286242112c5b712fa654e526652bf6a13ff05cb" +raf@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.0.tgz#a28876881b4bc2ca9117d4138163ddb80f781575" + dependencies: + performance-now "^2.1.0" + +railroad-diagrams@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz#eb7e6267548ddedfb899c1b90e57374559cddb7e" + +randexp@^0.4.2: + version "0.4.6" + resolved "https://registry.yarnpkg.com/randexp/-/randexp-0.4.6.tgz#e986ad5e5e31dae13ddd6f7b3019aa7c87f60ca3" + dependencies: + discontinuous-range "1.0.0" + ret "~0.1.10" + randomatic@^1.1.3: version "1.1.7" resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" @@ -6048,6 +5969,15 @@ range-parser@^1.0.3, range-parser@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" +raw-body@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" + dependencies: + bytes "3.0.0" + http-errors "1.6.2" + iconv-lite "0.4.19" + unpipe "1.0.0" + rc-align@2.x: version "2.3.4" resolved "https://registry.yarnpkg.com/rc-align/-/rc-align-2.3.4.tgz#d83bdab7560f0142e72a3de1d495dab6ba225249" @@ -6073,8 +6003,8 @@ rc-tooltip@3.5.0: rc-trigger "1.x" rc-trigger@1.x: - version "1.11.3" - resolved "https://registry.yarnpkg.com/rc-trigger/-/rc-trigger-1.11.3.tgz#47b8b58e0863c2277e367b86f1cfa29eb612db56" + version "1.11.5" + resolved "https://registry.yarnpkg.com/rc-trigger/-/rc-trigger-1.11.5.tgz#f88f9f84e0e79f8e0ef1c8d1bf8ac2208b715620" dependencies: babel-runtime "6.x" create-react-class "15.x" @@ -6084,16 +6014,17 @@ rc-trigger@1.x: rc-util "4.x" rc-util@4.x: - version "4.0.4" - resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-4.0.4.tgz#99813dd90aee7e29b64939a70ac176ead3f4ff39" + version "4.1.1" + resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-4.1.1.tgz#9350e9c00368b50cd8fbd91775cc1cf9e2ca72b2" dependencies: add-dom-event-listener "1.x" babel-runtime "6.x" + prop-types "^15.5.10" shallowequal "^0.2.2" rc@^1.1.7: - version "1.2.1" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" + version "1.2.2" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.2.tgz#d8ce9cb57e8d64d9c7badd9876c7c34cbe3c7077" dependencies: deep-extend "~0.4.0" ini "~1.3.0" @@ -6124,14 +6055,14 @@ react-dev-utils@^3.0.0: strip-ansi "3.0.1" text-table "0.2.0" -react-dom@15.6.2: - version "15.6.2" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-15.6.2.tgz#41cfadf693b757faf2708443a1d1fd5a02bef730" +react-dom@16.0.0: + version "16.0.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.0.0.tgz#9cc3079c3dcd70d4c6e01b84aab2a7e34c303f58" dependencies: - fbjs "^0.8.9" + fbjs "^0.8.16" loose-envify "^1.1.0" - object-assign "^4.1.0" - prop-types "^15.5.10" + object-assign "^4.1.1" + prop-types "^15.6.0" react-draggable@3.0.3: version "3.0.3" @@ -6194,9 +6125,9 @@ react-redux@5.0.6: loose-envify "^1.1.0" prop-types "^15.5.10" -react-router@3.0.5: - version "3.0.5" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-3.0.5.tgz#c3b7873758045a8bbc9562aef4ff4bc8cce7c136" +react-router@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-3.2.0.tgz#62b6279d589b70b34e265113e4c0a9261a02ed36" dependencies: create-react-class "^15.5.1" history "^3.0.0" @@ -6221,12 +6152,12 @@ react-side-effect@^1.1.0: exenv "^1.2.1" shallowequal "^1.0.1" -react-test-renderer@15.6.2: - version "15.6.2" - resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-15.6.2.tgz#d0333434fc2c438092696ca770da5ed48037efa8" +react-test-renderer@16.0.0, react-test-renderer@^16.0.0-0: + version "16.0.0" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.0.0.tgz#9fe7b8308f2f71f29fc356d4102086f131c9cb15" dependencies: - fbjs "^0.8.9" - object-assign "^4.1.0" + fbjs "^0.8.16" + object-assign "^4.1.1" react-virtualized@9.12.0: version "9.12.0" @@ -6238,15 +6169,14 @@ react-virtualized@9.12.0: loose-envify "^1.3.0" prop-types "^15.5.4" -react@15.6.2: - version "15.6.2" - resolved "https://registry.yarnpkg.com/react/-/react-15.6.2.tgz#dba0434ab439cfe82f108f0f511663908179aa72" +react@16.0.0: + version "16.0.0" + resolved "https://registry.yarnpkg.com/react/-/react-16.0.0.tgz#ce7df8f1941b036f02b2cca9dbd0cb1f0e855e2d" dependencies: - create-react-class "^15.6.0" - fbjs "^0.8.9" + fbjs "^0.8.16" loose-envify "^1.1.0" - object-assign "^4.1.0" - prop-types "^15.5.10" + object-assign "^4.1.1" + prop-types "^15.6.0" read-pkg-up@^1.0.1: version "1.0.1" @@ -6355,8 +6285,8 @@ redux@3.7.2, redux@^3.6.0: symbol-observable "^1.0.3" regenerate@^1.2.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" + version "1.3.3" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" regenerator-runtime@^0.10.0, regenerator-runtime@^0.10.5: version "0.10.5" @@ -6366,24 +6296,19 @@ regenerator-runtime@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz#7e54fe5b5ccd5d6624ea6255c3473be090b802e1" -regenerator-transform@0.9.11: - version "0.9.11" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.11.tgz#3a7d067520cb7b7176769eb5ff868691befe1283" +regenerator-transform@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" dependencies: babel-runtime "^6.18.0" babel-types "^6.19.0" private "^0.1.6" regex-cache@^0.4.2: - version "0.4.3" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" + version "0.4.4" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" dependencies: is-equal-shallow "^0.1.3" - is-primitive "^2.0.0" - -regex-not@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-0.1.2.tgz#bc7f1c4944b1188353d07deeb912b94e0ade25db" regex-not@^1.0.0: version "1.0.0" @@ -6422,8 +6347,8 @@ relateurl@0.2.x: resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" remove-trailing-separator@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz#69b062d978727ad14dc6b56ba4ab772fd8d70511" + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" renderkid@^2.0.1: version "2.0.1" @@ -6449,7 +6374,7 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" -request@^2.79.0, request@^2.81.0: +request@2.81.0: version "2.81.0" resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" dependencies: @@ -6476,6 +6401,33 @@ request@^2.79.0, request@^2.81.0: tunnel-agent "^0.6.0" uuid "^3.0.0" +request@^2.79.0: + version "2.83.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.6.0" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.1" + forever-agent "~0.6.1" + form-data "~2.3.1" + har-validator "~5.0.3" + hawk "~6.0.2" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.17" + oauth-sign "~0.8.2" + performance-now "^2.1.0" + qs "~6.5.1" + safe-buffer "^5.1.1" + stringstream "~0.0.5" + tough-cookie "~2.3.3" + tunnel-agent "^0.6.0" + uuid "^3.1.0" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -6529,8 +6481,8 @@ resolve@1.1.7: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" resolve@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.4.0.tgz#a75be01c53da25d934a98ebd0e4c4a7312f92a86" + version "1.5.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" dependencies: path-parse "^1.0.5" @@ -6548,19 +6500,17 @@ restore-cursor@^2.0.0: onetime "^2.0.0" signal-exit "^3.0.2" +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + right-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" dependencies: align-text "^0.1.1" -rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" - dependencies: - glob "^7.0.5" - -rimraf@2.6.2: +rimraf@2, rimraf@2.6.2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.1: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" dependencies: @@ -6573,6 +6523,13 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^2.0.0" inherits "^2.0.1" +rst-selector-parser@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz#81b230ea2fcc6066c89e3472de794285d9b03d91" + dependencies: + lodash.flattendeep "^4.4.0" + nearley "^2.7.10" + run-async@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" @@ -6590,12 +6547,12 @@ rx-lite@*, rx-lite@^4.0.8: resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" rxjs@^5.0.0-beta.11: - version "5.5.1" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.1.tgz#ef980a6ad7438c74e3b0f0d1e6f1493e385997fd" + version "5.5.2" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.2.tgz#28d403f0071121967f18ad665563255d54236ac3" dependencies: symbol-observable "^1.0.1" -safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" @@ -6645,44 +6602,44 @@ selfsigned@^1.9.1: version "5.4.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" -send@0.15.4: - version "0.15.4" - resolved "https://registry.yarnpkg.com/send/-/send-0.15.4.tgz#985faa3e284b0273c793364a35c6737bd93905b9" +send@0.16.1: + version "0.16.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.1.tgz#a70e1ca21d1382c11d0d9f6231deb281080d7ab3" dependencies: - debug "2.6.8" + debug "2.6.9" depd "~1.1.1" destroy "~1.0.4" encodeurl "~1.0.1" escape-html "~1.0.3" - etag "~1.8.0" - fresh "0.5.0" + etag "~1.8.1" + fresh "0.5.2" http-errors "~1.6.2" - mime "1.3.4" + mime "1.4.1" ms "2.0.0" on-finished "~2.3.0" range-parser "~1.2.0" statuses "~1.3.1" serve-index@^1.7.2: - version "1.9.0" - resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.0.tgz#d2b280fc560d616ee81b48bf0fa82abed2485ce7" + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" dependencies: - accepts "~1.3.3" + accepts "~1.3.4" batch "0.6.1" - debug "2.6.8" + debug "2.6.9" escape-html "~1.0.3" - http-errors "~1.6.1" - mime-types "~2.1.15" - parseurl "~1.3.1" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" -serve-static@1.12.4: - version "1.12.4" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.12.4.tgz#9b6aa98eeb7253c4eedc4c1f6fdbca609901a961" +serve-static@1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.1.tgz#4c57d53404a761d8f2e7c1e8a18a47dbf278a719" dependencies: encodeurl "~1.0.1" escape-html "~1.0.3" - parseurl "~1.3.1" - send "0.15.4" + parseurl "~1.3.2" + send "0.16.1" set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" @@ -6698,7 +6655,7 @@ set-immediate-shim@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" -set-value@^0.4.2, set-value@^0.4.3: +set-value@^0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" dependencies: @@ -6707,6 +6664,15 @@ set-value@^0.4.2, set-value@^0.4.3: is-plain-object "^2.0.1" to-object-path "^0.3.0" +set-value@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + setimmediate@^1.0.4, setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" @@ -6715,15 +6681,20 @@ setprototypeof@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + settle-promise@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/settle-promise/-/settle-promise-1.0.0.tgz#697adb58b821f387ce2757c06efc9de5f0ee33d8" sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.8" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.8.tgz#37068c2c476b6baf402d14a49c67f597921f634f" + version "2.4.9" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.9.tgz#98f64880474b74f4a38b8da9d3c0f2d104633e7d" dependencies: inherits "^2.0.1" + safe-buffer "^5.0.1" shallowequal@^0.2.2: version "0.2.2" @@ -6755,8 +6726,8 @@ shell-quote@1.6.1: jsonify "~0.0.0" shellwords@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.0.tgz#66afd47b6a12932d9071cbfd98a52e785cd0ba14" + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" @@ -6809,6 +6780,12 @@ sntp@1.x.x: dependencies: hoek "2.x.x" +sntp@2.x.x: + version "2.1.0" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" + dependencies: + hoek "4.x.x" + sockjs-client@1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.4.tgz#5babe386b775e4cf14e7520911452654016c8b12" @@ -6838,17 +6815,18 @@ source-list-map@^2.0.0: resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" source-map-resolve@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.0.tgz#fcad0b64b70afb27699e425950cb5ebcd410bc20" + version "0.5.1" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.1.tgz#7ad0f593f2281598e854df80f19aae4b92d7a11a" dependencies: atob "^2.0.0" + decode-uri-component "^0.2.0" resolve-url "^0.2.1" source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.4.15, source-map-support@^0.4.2: - version "0.4.15" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.15.tgz#03202df65c06d2bd8c7ec2362a193056fef8d3b1" +source-map-support@^0.4.15: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" dependencies: source-map "^0.5.6" @@ -6862,17 +6840,21 @@ source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" -source-map@0.5.6, source-map@0.5.x, source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.3: +source-map@0.5.6: version "0.5.6" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" +source-map@0.5.x, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.3, source-map@~0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + source-map@^0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" dependencies: amdefine ">=0.0.4" -source-map@^0.6.0, source-map@^0.6.1: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" @@ -6882,12 +6864,6 @@ source-map@~0.1.7: dependencies: amdefine ">=0.0.4" -source-map@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" - dependencies: - amdefine ">=0.0.4" - spdx-correct@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" @@ -6925,9 +6901,9 @@ spdy@^3.4.1: select-hose "^2.0.0" spdy-transport "^2.0.18" -split-string@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-2.1.1.tgz#af4b06d821560426446c3cd931cda618940d37d0" +split-string@^3.0.1, split-string@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.0.2.tgz#6129bc92731716e5aa1fb73c333078f0b7c114c8" dependencies: extend-shallow "^2.0.1" @@ -6960,7 +6936,11 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -"statuses@>= 1.3.1 < 2", statuses@~1.3.1: +"statuses@>= 1.3.1 < 2": + version "1.4.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + +statuses@~1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" @@ -7029,7 +7009,7 @@ stringify-object@^3.2.0: is-obj "^1.0.1" is-regexp "^1.0.0" -stringstream@~0.0.4: +stringstream@~0.0.4, stringstream@~0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" @@ -7086,13 +7066,7 @@ supports-color@^3.1.2, supports-color@^3.2.3: dependencies: has-flag "^1.0.0" -supports-color@^4.0.0, supports-color@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.2.1.tgz#65a4bb2631e90e02420dba5554c375a4754bb836" - dependencies: - has-flag "^2.0.0" - -supports-color@^4.4.0: +supports-color@^4.0.0, supports-color@^4.2.1, supports-color@^4.4.0: version "4.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" dependencies: @@ -7134,8 +7108,8 @@ tapable@^0.2.5, tapable@^0.2.7: resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22" tar-pack@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" + version "3.4.1" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" dependencies: debug "^2.2.0" fstream "^1.0.10" @@ -7194,11 +7168,11 @@ tiny-emitter@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.0.2.tgz#82d27468aca5ade8e5fd1e6d22b57dd43ebdfb7c" -tmp@^0.0.31: - version "0.0.31" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" dependencies: - os-tmpdir "~1.0.1" + os-tmpdir "~1.0.2" tmpl@1.0.x: version "1.0.4" @@ -7208,7 +7182,7 @@ to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" -to-fast-properties@^1.0.1, to-fast-properties@^1.0.3: +to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" @@ -7225,14 +7199,6 @@ to-regex-range@^2.1.0: is-number "^3.0.0" repeat-string "^1.6.1" -to-regex@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-2.1.0.tgz#e3ad3a40cfe119559a05aea43e4caefacc5e901d" - dependencies: - define-property "^0.2.5" - extend-shallow "^2.0.1" - regex-not "^0.1.1" - to-regex@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.1.tgz#15358bee4a2c83bd76377ba1dc049d0f18837aae" @@ -7242,12 +7208,12 @@ to-regex@^3.0.1: regex-not "^1.0.0" toposort@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.3.tgz#f02cd8a74bd8be2fc0e98611c3bacb95a171869c" + version "1.0.6" + resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.6.tgz#c31748e55d210effc00fdcdc7d6e68d7d7bb9cec" -tough-cookie@^2.3.2, tough-cookie@~2.3.0: - version "2.3.2" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" +tough-cookie@^2.3.2, tough-cookie@~2.3.0, tough-cookie@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" dependencies: punycode "^1.4.1" @@ -7267,9 +7233,9 @@ tryit@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" -ts-jest@21.1.3: - version "21.1.3" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-21.1.3.tgz#cc3c552e7e8a67db9ededc28c00ae98223614ddc" +ts-jest@21.1.4: + version "21.1.4" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-21.1.4.tgz#6b720cd4ebfacbc935468e60dd395392f817095b" dependencies: babel-core "^6.24.1" babel-plugin-istanbul "^4.1.4" @@ -7280,7 +7246,7 @@ ts-jest@21.1.3: jest-util "^21.2.1" pkg-dir "^2.0.0" source-map-support "^0.5.0" - yargs "^9.0.1" + yargs "^10.0.3" tty-browserify@0.0.0: version "0.0.0" @@ -7325,15 +7291,15 @@ typescript@2.5.3: resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.5.3.tgz#df3dcdc38f3beb800d4bc322646b04a3f6ca7f0d" ua-parser-js@^0.7.9: - version "0.7.14" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.14.tgz#110d53fa4c3f326c121292bbeac904d2e03387ca" + version "0.7.17" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.17.tgz#e9ec5f9498b9ec910e7ae3ac626a805c4d09ecac" -uglify-js@3.0.x: - version "3.0.27" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.0.27.tgz#a97db8c8ba6b9dba4e2f88d86aa9548fa6320034" +uglify-js@3.1.x: + version "3.1.6" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.1.6.tgz#918832602036e95d2318e11f27ee8461a8592c5d" dependencies: commander "~2.11.0" - source-map "~0.5.1" + source-map "~0.6.1" uglify-js@^2.6, uglify-js@^2.8.29: version "2.8.29" @@ -7376,9 +7342,13 @@ ultron@~1.1.0: version "1.8.3" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" -union-value@^0.2.3: - version "0.2.4" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-0.2.4.tgz#7375152786679057e7b37aa676e83468fc0274f0" +underscore@~1.4.4: + version "1.4.4" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.4.4.tgz#61a6a32010622afa07963bf325203cf12239d604" + +union-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" dependencies: arr-union "^3.1.0" get-value "^2.0.6" @@ -7403,13 +7373,13 @@ universalify@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" -unpipe@~1.0.0: +unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" -unset-value@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-0.1.2.tgz#506810b867f27c2a5a6e9b04833631f6de58d310" +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" dependencies: has-value "^0.3.1" isobject "^3.0.0" @@ -7469,15 +7439,15 @@ utila@~0.4: version "0.4.0" resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" -utils-merge@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" uuid@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" -uuid@^3.0.0, uuid@^3.0.1: +uuid@^3.0.0, uuid@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" @@ -7488,9 +7458,9 @@ validate-npm-package-license@^3.0.1: spdx-correct "~1.0.0" spdx-expression-parse "~1.0.0" -vary@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.1.tgz#67535ebb694c1d52257457984665323f587e8d37" +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" vendors@^1.0.0: version "1.0.1" @@ -7643,20 +7613,21 @@ webpack@3.8.1: yargs "^8.0.2" websocket-driver@>=0.5.1: - version "0.6.5" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" + version "0.7.0" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" dependencies: + http-parser-js ">=0.4.0" websocket-extensions ">=0.1.1" websocket-extensions@>=0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.1.tgz#76899499c184b6ef754377c2dbb0cd6cb55d29e7" + version "0.1.2" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.2.tgz#0e18781de629a18308ce1481650f67ffa2693a5d" whatwg-encoding@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.1.tgz#3c6c451a198ee7aec55b1ec61d0920c67801a5f4" + version "1.0.3" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3" dependencies: - iconv-lite "0.4.13" + iconv-lite "0.4.19" whatwg-fetch@2.0.3, whatwg-fetch@>=0.10.0: version "2.0.3" @@ -7710,8 +7681,8 @@ wordwrap@~1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" worker-farm@^1.3.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.5.0.tgz#adfdf0cd40581465ed0a1f648f9735722afd5c8d" + version "1.5.1" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.5.1.tgz#8e9f4a7da4f3c595aa600903051b969390423fa1" dependencies: errno "^0.1.4" xtend "^4.0.1" @@ -7780,6 +7751,29 @@ yargs-parser@^7.0.0: dependencies: camelcase "^4.1.0" +yargs-parser@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.0.0.tgz#21d476330e5a82279a4b881345bf066102e219c6" + dependencies: + camelcase "^4.1.0" + +yargs@^10.0.3: + version "10.0.3" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.0.3.tgz#6542debd9080ad517ec5048fb454efe9e4d4aaae" + dependencies: + cliui "^3.2.0" + decamelize "^1.1.1" + find-up "^2.1.0" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^8.0.0" + yargs@^6.6.0: version "6.6.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" @@ -7816,7 +7810,7 @@ yargs@^8.0.2: y18n "^3.2.1" yargs-parser "^7.0.0" -yargs@^9.0.0, yargs@^9.0.1: +yargs@^9.0.0: version "9.0.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-9.0.1.tgz#52acc23feecac34042078ee78c0c007f5085db4c" dependencies: -- 2.39.5