]> source.dussan.org Git - sonarqube.git/commitdiff
update main dependencies & fix autofixable eslint warnings (#601)
authorStas Vilchik <stas.vilchik@sonarsource.com>
Fri, 10 Aug 2018 14:02:22 +0000 (16:02 +0200)
committerSonarTech <sonartech@sonarsource.com>
Fri, 10 Aug 2018 18:21:32 +0000 (20:21 +0200)
254 files changed:
server/sonar-bitbucketcloud/.babelrc
server/sonar-bitbucketcloud/package.json
server/sonar-bitbucketcloud/src/main/ts/components/ProjectCardHeader.tsx
server/sonar-bitbucketcloud/src/main/ts/components/RepoWidgetNotConfigured.tsx
server/sonar-bitbucketcloud/yarn.lock
server/sonar-vsts/.babelrc
server/sonar-vsts/package.json
server/sonar-vsts/yarn.lock
server/sonar-web/.babelrc
server/sonar-web/.eslintrc
server/sonar-web/package.json
server/sonar-web/src/main/js/app/components/AdminContainer.tsx
server/sonar-web/src/main/js/app/components/App.tsx
server/sonar-web/src/main/js/app/components/ComponentContainer.tsx
server/sonar-web/src/main/js/app/components/GlobalFooterBranding.js
server/sonar-web/src/main/js/app/components/GlobalMessagesContainer.js [deleted file]
server/sonar-web/src/main/js/app/components/GlobalMessagesContainer.tsx [new file with mode: 0644]
server/sonar-web/src/main/js/app/components/MarkdownHelp.js
server/sonar-web/src/main/js/app/components/StartupModal.tsx
server/sonar-web/src/main/js/app/components/embed-docs-modal/SuggestionsProvider.tsx
server/sonar-web/src/main/js/app/components/embed-docs-modal/__tests__/SuggestionsProvider-test.tsx
server/sonar-web/src/main/js/app/components/extensions/ExtensionContainer.tsx
server/sonar-web/src/main/js/app/components/extensions/OrganizationPageExtension.tsx
server/sonar-web/src/main/js/app/components/extensions/ProjectAdminPageExtension.js
server/sonar-web/src/main/js/app/components/nav/component/ComponentNavMenu.tsx
server/sonar-web/src/main/js/app/components/nav/global/GlobalNavMenu.tsx
server/sonar-web/src/main/js/app/components/nav/global/GlobalNavPlus.tsx
server/sonar-web/src/main/js/app/components/nav/settings/SettingsNav.tsx
server/sonar-web/src/main/js/app/components/search/SearchShowMore.js
server/sonar-web/src/main/js/app/styles/components/boxed-group.css
server/sonar-web/src/main/js/apps/about/components/AboutApp.js
server/sonar-web/src/main/js/apps/about/components/AboutProjects.js
server/sonar-web/src/main/js/apps/about/components/AboutScanners.js
server/sonar-web/src/main/js/apps/about/components/EntryIssueTypes.js
server/sonar-web/src/main/js/apps/about/sonarcloud/AsAService.tsx
server/sonar-web/src/main/js/apps/about/sonarcloud/BranchAnalysis.tsx
server/sonar-web/src/main/js/apps/about/sonarcloud/Footer.tsx
server/sonar-web/src/main/js/apps/about/sonarcloud/Home.tsx
server/sonar-web/src/main/js/apps/about/sonarcloud/Pricing.tsx
server/sonar-web/src/main/js/apps/about/sonarcloud/SQHome.tsx
server/sonar-web/src/main/js/apps/about/sonarcloud/SonarLintIntegration.tsx
server/sonar-web/src/main/js/apps/account/components/Account.js
server/sonar-web/src/main/js/apps/account/components/Nav.js
server/sonar-web/src/main/js/apps/account/components/UserCard.js
server/sonar-web/src/main/js/apps/account/notifications/NotificationsContainer.tsx
server/sonar-web/src/main/js/apps/account/organizations/CreateOrganizationForm.tsx
server/sonar-web/src/main/js/apps/account/organizations/OrganizationCard.tsx
server/sonar-web/src/main/js/apps/account/organizations/UserOrganizations.tsx
server/sonar-web/src/main/js/apps/account/profile/Profile.js
server/sonar-web/src/main/js/apps/account/profile/UserExternalIdentity.js
server/sonar-web/src/main/js/apps/account/profile/UserGroups.js
server/sonar-web/src/main/js/apps/account/profile/UserScmAccounts.js
server/sonar-web/src/main/js/apps/background-tasks/__tests__/background-tasks-test.js
server/sonar-web/src/main/js/apps/background-tasks/components/BackgroundTasksApp.js
server/sonar-web/src/main/js/apps/background-tasks/components/ScannerContext.tsx
server/sonar-web/src/main/js/apps/background-tasks/components/Stacktrace.tsx
server/sonar-web/src/main/js/apps/background-tasks/components/__tests__/TaskDate-test.tsx
server/sonar-web/src/main/js/apps/background-tasks/components/__tests__/TaskDay-test.tsx
server/sonar-web/src/main/js/apps/code/components/App.tsx
server/sonar-web/src/main/js/apps/code/components/Search.tsx
server/sonar-web/src/main/js/apps/coding-rules/components/App.tsx
server/sonar-web/src/main/js/apps/coding-rules/components/CustomRuleFormModal.tsx
server/sonar-web/src/main/js/apps/coding-rules/components/RuleDetails.tsx
server/sonar-web/src/main/js/apps/component-measures/components/AppContainer.js
server/sonar-web/src/main/js/apps/component-measures/components/Breadcrumbs.js
server/sonar-web/src/main/js/apps/component-measures/components/MeasureContent.js
server/sonar-web/src/main/js/apps/component-measures/components/MeasureContentContainer.js
server/sonar-web/src/main/js/apps/component-measures/components/MeasureFavoriteContainer.js
server/sonar-web/src/main/js/apps/component-measures/components/MeasureViewSelect.js
server/sonar-web/src/main/js/apps/component-measures/components/__tests__/Breadcrumb-test.js
server/sonar-web/src/main/js/apps/component-measures/components/__tests__/MeasureViewSelect-test.js
server/sonar-web/src/main/js/apps/component-measures/drilldown/MeasureCell.js
server/sonar-web/src/main/js/apps/component-measures/drilldown/TreeMapView.js
server/sonar-web/src/main/js/apps/component-measures/sidebar/FacetMeasureValue.js
server/sonar-web/src/main/js/apps/explore/Explore.tsx
server/sonar-web/src/main/js/apps/groups/components/List.tsx
server/sonar-web/src/main/js/apps/groups/components/__tests__/__snapshots__/EditMembers-test.tsx.snap
server/sonar-web/src/main/js/apps/issues/actions.ts
server/sonar-web/src/main/js/apps/issues/components/AppContainer.tsx
server/sonar-web/src/main/js/apps/issues/conciseIssuesList/ConciseIssueBox.tsx
server/sonar-web/src/main/js/apps/marketplace/components/PluginAvailable.tsx
server/sonar-web/src/main/js/apps/marketplace/components/PluginInstalled.tsx
server/sonar-web/src/main/js/apps/marketplace/components/PluginUpdateItem.tsx
server/sonar-web/src/main/js/apps/marketplace/utils.ts
server/sonar-web/src/main/js/apps/organizations/components/OrganizationDelete.tsx
server/sonar-web/src/main/js/apps/organizations/components/OrganizationEdit.tsx
server/sonar-web/src/main/js/apps/organizations/components/OrganizationMembersContainer.tsx
server/sonar-web/src/main/js/apps/organizations/components/OrganizationPage.tsx
server/sonar-web/src/main/js/apps/overview/events/Analysis.tsx
server/sonar-web/src/main/js/apps/overview/meta/MetaKey.tsx
server/sonar-web/src/main/js/apps/overview/meta/MetaLinks.tsx
server/sonar-web/src/main/js/apps/overview/meta/MetaOrganizationKey.tsx
server/sonar-web/src/main/js/apps/overview/meta/MetaSize.tsx
server/sonar-web/src/main/js/apps/overview/qualityGate/ApplicationQualityGate.tsx
server/sonar-web/src/main/js/apps/overview/qualityGate/QualityGateCondition.js
server/sonar-web/src/main/js/apps/permission-templates/components/App.js
server/sonar-web/src/main/js/apps/permission-templates/components/Home.js
server/sonar-web/src/main/js/apps/permission-templates/components/List.js
server/sonar-web/src/main/js/apps/permission-templates/components/ListItem.js
server/sonar-web/src/main/js/apps/permission-templates/components/NameCell.js
server/sonar-web/src/main/js/apps/permission-templates/components/TemplateDetails.js
server/sonar-web/src/main/js/apps/permission-templates/components/TemplateHeader.js
server/sonar-web/src/main/js/apps/permission-templates/components/__tests__/Defaults-test.js
server/sonar-web/src/main/js/apps/permissions/project/components/App.js
server/sonar-web/src/main/js/apps/permissions/project/components/AppContainer.js
server/sonar-web/src/main/js/apps/portfolio/components/App.tsx
server/sonar-web/src/main/js/apps/portfolio/components/MainRating.tsx
server/sonar-web/src/main/js/apps/portfolio/components/ReleasabilityBox.tsx
server/sonar-web/src/main/js/apps/portfolio/components/Report.tsx
server/sonar-web/src/main/js/apps/portfolio/components/WorstProjects.tsx
server/sonar-web/src/main/js/apps/project-admin/key/BulkUpdate.js
server/sonar-web/src/main/js/apps/project-admin/key/Key.js
server/sonar-web/src/main/js/apps/project-admin/links/Links.js
server/sonar-web/src/main/js/apps/projectActivity/components/GraphHistory.js
server/sonar-web/src/main/js/apps/projectActivity/components/GraphsHistory.js
server/sonar-web/src/main/js/apps/projectActivity/components/GraphsLegendCustom.js
server/sonar-web/src/main/js/apps/projectActivity/components/GraphsTooltipsContent.js
server/sonar-web/src/main/js/apps/projectActivity/components/GraphsTooltipsContentCoverage.js
server/sonar-web/src/main/js/apps/projectActivity/components/GraphsTooltipsContentDuplication.js
server/sonar-web/src/main/js/apps/projectActivity/components/GraphsTooltipsContentEvents.js
server/sonar-web/src/main/js/apps/projectActivity/components/GraphsTooltipsContentIssues.js
server/sonar-web/src/main/js/apps/projectActivity/components/GraphsZoom.js
server/sonar-web/src/main/js/apps/projectActivity/components/ProjectActivityAnalysesList.js
server/sonar-web/src/main/js/apps/projectActivity/components/ProjectActivityApp.js
server/sonar-web/src/main/js/apps/projectActivity/components/ProjectActivityPageFooter.js
server/sonar-web/src/main/js/apps/projectActivity/components/ProjectActivityPageHeader.js
server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/GraphsLegendItem-test.tsx
server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/ProjectActivityDateInput-test.js
server/sonar-web/src/main/js/apps/projectBranches/components/LongBranchesPattern.tsx
server/sonar-web/src/main/js/apps/projectQualityProfiles/App.tsx
server/sonar-web/src/main/js/apps/projectQualityProfiles/ProfileRow.tsx
server/sonar-web/src/main/js/apps/projectQualityProfiles/Table.tsx
server/sonar-web/src/main/js/apps/projects/components/FavoriteFilterContainer.tsx
server/sonar-web/src/main/js/apps/projects/components/__tests__/PerspectiveSelect-test.tsx
server/sonar-web/src/main/js/apps/projects/create/CreateProjectPage.tsx
server/sonar-web/src/main/js/apps/projects/create/ManualProjectCreate.tsx
server/sonar-web/src/main/js/apps/projects/create/utils.ts
server/sonar-web/src/main/js/apps/projects/filters/CoverageFilter.tsx
server/sonar-web/src/main/js/apps/projects/filters/DuplicationsFilter.tsx
server/sonar-web/src/main/js/apps/projects/filters/Filter.tsx
server/sonar-web/src/main/js/apps/projects/filters/IssuesFilter.tsx
server/sonar-web/src/main/js/apps/projects/filters/LanguagesFilter.tsx
server/sonar-web/src/main/js/apps/projects/filters/NewCoverageFilter.tsx
server/sonar-web/src/main/js/apps/projects/filters/NewDuplicationsFilter.tsx
server/sonar-web/src/main/js/apps/projects/filters/NewLinesFilter.tsx
server/sonar-web/src/main/js/apps/projects/filters/QualityGateFilter.tsx
server/sonar-web/src/main/js/apps/projects/filters/SizeFilter.tsx
server/sonar-web/src/main/js/apps/projects/filters/TagsFilter.tsx
server/sonar-web/src/main/js/apps/projects/filters/__tests__/SearchableFilterFooter-test.tsx
server/sonar-web/src/main/js/apps/projects/filters/__tests__/TagsFilter-test.tsx
server/sonar-web/src/main/js/apps/projects/utils.ts
server/sonar-web/src/main/js/apps/projectsManagement/AppContainer.tsx
server/sonar-web/src/main/js/apps/quality-gates/components/DetailsApp.tsx
server/sonar-web/src/main/js/apps/quality-profiles/changelog/Changelog.tsx
server/sonar-web/src/main/js/apps/quality-profiles/compare/ComparisonContainer.tsx
server/sonar-web/src/main/js/apps/quality-profiles/compare/ComparisonForm.tsx
server/sonar-web/src/main/js/apps/quality-profiles/compare/ComparisonResults.tsx
server/sonar-web/src/main/js/apps/quality-profiles/compare/__tests__/ComparisonForm-test.tsx
server/sonar-web/src/main/js/apps/quality-profiles/compare/__tests__/ComparisonResults-test.tsx
server/sonar-web/src/main/js/apps/quality-profiles/components/AppContainer.tsx
server/sonar-web/src/main/js/apps/quality-profiles/components/ProfileNotFound.tsx
server/sonar-web/src/main/js/apps/sessions/components/EmailAlreadyExists.tsx
server/sonar-web/src/main/js/apps/sessions/components/LoginContainer.tsx
server/sonar-web/src/main/js/apps/sessions/components/Logout.tsx
server/sonar-web/src/main/js/apps/sessions/components/UpdateLogin.tsx
server/sonar-web/src/main/js/apps/settings/components/App.js
server/sonar-web/src/main/js/apps/settings/components/AppContainer.js
server/sonar-web/src/main/js/apps/settings/components/CategoriesList.js
server/sonar-web/src/main/js/apps/settings/components/CategoryDefinitionsList.js
server/sonar-web/src/main/js/apps/settings/components/Definition.js
server/sonar-web/src/main/js/apps/settings/components/inputs/InputForBoolean.js
server/sonar-web/src/main/js/apps/settings/components/inputs/InputForSingleSelectList.js
server/sonar-web/src/main/js/apps/settings/components/inputs/InputForText.js
server/sonar-web/src/main/js/apps/settings/components/inputs/MultiValueInput.js
server/sonar-web/src/main/js/apps/settings/components/inputs/PrimitiveInput.js
server/sonar-web/src/main/js/apps/settings/components/inputs/PropertySetInput.js
server/sonar-web/src/main/js/apps/settings/components/inputs/SimpleInput.js
server/sonar-web/src/main/js/apps/settings/components/inputs/__tests__/Input-test.js
server/sonar-web/src/main/js/apps/settings/components/inputs/__tests__/InputForBoolean-test.js
server/sonar-web/src/main/js/apps/settings/components/inputs/__tests__/InputForNumber-test.js
server/sonar-web/src/main/js/apps/settings/components/inputs/__tests__/InputForSingleSelectList-test.js
server/sonar-web/src/main/js/apps/settings/components/inputs/__tests__/InputForString-test.js
server/sonar-web/src/main/js/apps/settings/components/inputs/__tests__/InputForText-test.js
server/sonar-web/src/main/js/apps/settings/components/inputs/__tests__/MultiValueInput-test.js
server/sonar-web/src/main/js/apps/settings/components/inputs/__tests__/SimpleInput-test.js
server/sonar-web/src/main/js/apps/settings/encryption/EncryptionApp.js
server/sonar-web/src/main/js/apps/settings/encryption/EncryptionAppContainer.js
server/sonar-web/src/main/js/apps/system/components/ClusterSysInfos.tsx
server/sonar-web/src/main/js/apps/system/components/PageHeader.tsx
server/sonar-web/src/main/js/apps/system/components/__tests__/PageHeader-test.tsx
server/sonar-web/src/main/js/apps/system/components/info-items/HealthCard.tsx
server/sonar-web/src/main/js/apps/system/components/info-items/HealthItem.tsx
server/sonar-web/src/main/js/apps/system/components/info-items/__tests__/HealthItem-test.tsx
server/sonar-web/src/main/js/apps/system/components/info-items/__tests__/Section-test.tsx
server/sonar-web/src/main/js/apps/system/components/info-items/__tests__/__snapshots__/SysInfoItem-test.tsx.snap
server/sonar-web/src/main/js/apps/system/components/system-upgrade/SystemUpgradeForm.tsx
server/sonar-web/src/main/js/apps/system/components/system-upgrade/__tests__/SystemUpgradeItem-test.tsx
server/sonar-web/src/main/js/apps/system/utils.ts
server/sonar-web/src/main/js/apps/tutorials/onboarding/OnboardingPage.tsx
server/sonar-web/src/main/js/apps/tutorials/projectOnboarding/ProjectOnboardingPage.tsx
server/sonar-web/src/main/js/apps/users/Search.tsx
server/sonar-web/src/main/js/apps/users/UsersApp.tsx
server/sonar-web/src/main/js/apps/users/UsersList.tsx
server/sonar-web/src/main/js/apps/users/components/UserGroups.tsx
server/sonar-web/src/main/js/apps/users/components/UserListItem.tsx
server/sonar-web/src/main/js/apps/users/components/UserListItemIdentity.tsx
server/sonar-web/src/main/js/apps/users/components/UserScmAccounts.tsx
server/sonar-web/src/main/js/apps/users/components/UsersSelectSearch.tsx
server/sonar-web/src/main/js/apps/users/components/__tests__/UsersSelectSearch-test.tsx
server/sonar-web/src/main/js/apps/users/utils.ts
server/sonar-web/src/main/js/apps/web-api/components/Action.tsx
server/sonar-web/src/main/js/apps/web-api/components/ActionChangelog.tsx
server/sonar-web/src/main/js/apps/web-api/components/Params.tsx
server/sonar-web/src/main/js/apps/web-api/utils.ts
server/sonar-web/src/main/js/apps/webhooks/components/DeliveriesForm.tsx
server/sonar-web/src/main/js/components/SourceViewer/SourceViewer.tsx
server/sonar-web/src/main/js/components/SourceViewer/SourceViewerBase.tsx
server/sonar-web/src/main/js/components/SourceViewer/components/CoveragePopup.tsx
server/sonar-web/src/main/js/components/charts/AdvancedTimeline.js
server/sonar-web/src/main/js/components/charts/ColorBoxLegend.tsx
server/sonar-web/src/main/js/components/charts/Histogram.tsx
server/sonar-web/src/main/js/components/charts/LanguageDistribution.tsx
server/sonar-web/src/main/js/components/charts/ZoomTimeLine.js
server/sonar-web/src/main/js/components/charts/__tests__/Histogram-test.tsx
server/sonar-web/src/main/js/components/common/MarkdownTips.tsx
server/sonar-web/src/main/js/components/common/OrganizationAvatar.tsx
server/sonar-web/src/main/js/components/common/SelectListItem.js
server/sonar-web/src/main/js/components/common/__tests__/CodeSnippet-test.tsx
server/sonar-web/src/main/js/components/common/__tests__/SelectList-test.js
server/sonar-web/src/main/js/components/controls/FavoriteContainer.ts
server/sonar-web/src/main/js/components/controls/HomePageSelect.tsx
server/sonar-web/src/main/js/components/controls/RadioToggle.tsx
server/sonar-web/src/main/js/components/controls/ReloadButton.tsx
server/sonar-web/src/main/js/components/controls/ScreenPositionFixer.tsx
server/sonar-web/src/main/js/components/controls/Tooltip.tsx
server/sonar-web/src/main/js/components/controls/__tests__/FavoriteBase-test.tsx
server/sonar-web/src/main/js/components/controls/__tests__/RadioToggle-test.tsx
server/sonar-web/src/main/js/components/controls/__tests__/ScreenPositionFixer-test.tsx
server/sonar-web/src/main/js/components/controls/__tests__/ValidationModal-test.tsx
server/sonar-web/src/main/js/components/docs/DocCollapsibleBlock.tsx
server/sonar-web/src/main/js/components/docs/__tests__/__snapshots__/DocCollapsibleBlock-test.tsx.snap
server/sonar-web/src/main/js/components/icons-components/DropdownIcon.tsx
server/sonar-web/src/main/js/components/icons-components/Icon.tsx
server/sonar-web/src/main/js/components/issue/components/__tests__/IssueMessage-test.js
server/sonar-web/src/main/js/components/issue/components/__tests__/IssueTitleBar-test.js
server/sonar-web/src/main/js/components/issue/popups/ChangelogPopup.js
server/sonar-web/src/main/js/components/preview-graph/PreviewGraph.js
server/sonar-web/src/main/js/components/shared/DrilldownLink.tsx
server/sonar-web/src/main/js/components/workspace/Workspace.tsx
server/sonar-web/src/main/js/helpers/cookies.ts
server/sonar-web/src/main/js/store/marketplace/actions.ts
server/sonar-web/src/main/js/store/utils/configureStore.js
server/sonar-web/src/main/js/store/withCurrentUser.tsx [deleted file]
server/sonar-web/yarn.lock

index a14ae9bb095a307312159e7b0d15ecb7b634712f..5dae4d228af49140c407cd5a489da1498df5f631 100644 (file)
@@ -20,7 +20,6 @@
   ],
   "plugins": [
     "transform-class-properties",
-    // use built-in `Object.assign`
     ["transform-object-rest-spread", { "useBuiltIns": true }],
     "lodash"
   ],
index 829e718e5a6669ab2e2b9b8db48add9f6f570757..6bb09917d0b3deac14153d066067a02fae60ef64 100644 (file)
@@ -18,8 +18,9 @@
     "babel-polyfill": "6.26.0",
     "classnames": "2.2.6",
     "lodash": "4.17.10",
-    "react": "16.2.0",
-    "react-dom": "16.2.0",
+    "prop-types": "15.6.1",
+    "react": "16.4.2",
+    "react-dom": "16.4.2",
     "react-intl": "2.4.0",
     "styled-components": "3.3.3",
     "whatwg-fetch": "2.0.4"
   "devDependencies": {
     "@types/classnames": "2.2.4",
     "@types/enzyme": "3.1.11",
-    "@types/jest": "23.1.5",
+    "@types/jest": "23.3.1",
     "@types/lodash": "4.14.111",
-    "@types/react": "16.0.29",
-    "@types/react-dom": "16.0.3",
+    "@types/react": "16.4.8",
+    "@types/react-dom": "16.0.7",
     "@types/react-intl": "2.3.8",
     "autoprefixer": "7.1.6",
     "babel-core": "6.26.3",
-    "babel-jest": "23.4.0",
+    "babel-jest": "23.4.2",
     "babel-loader": "7.1.5",
     "babel-plugin-dynamic-import-node": "1.2.0",
     "babel-plugin-lodash": "3.3.4",
     "eslint-plugin-react": "7.7.0",
     "eslint-plugin-sonarjs": "0.1.0",
     "html-webpack-plugin": "3.0.6",
-    "jest": "23.4.0",
+    "jest": "23.4.2",
     "postcss-calc": "6.0.1",
     "postcss-custom-properties": "6.2.0",
     "postcss-loader": "2.1.6",
-    "prettier": "1.13.7",
+    "prettier": "1.14.0",
     "react-dev-utils": "5.0.1",
     "react-error-overlay": "1.0.7",
-    "react-test-renderer": "16.2.0",
+    "react-test-renderer": "16.4.2",
     "request": "2.87.0",
     "style-loader": "0.21.0",
-    "ts-jest": "23.0.0",
+    "ts-jest": "23.1.3",
     "ts-loader": "4.4.2",
-    "typescript": "2.8.3",
-    "typescript-eslint-parser": "15.0.0",
+    "typescript": "3.0.1",
+    "typescript-eslint-parser": "18.0.0",
     "webpack": "4.16.0",
     "webpack-bundle-analyzer": "2.13.1",
     "webpack-dev-server": "3.1.4"
index 7e9c44109dfd45844a950193ea15cb44d546f5af..f833474a66f757558bd2eebce88cc4315e5efbf4 100644 (file)
@@ -48,7 +48,8 @@ export default function ProjectCardHeader({ project }: Props) {
         <DateTimeFormatter date={project.analysisDate}>
           {formattedDate => (
             <small className="project-card-analysis-date">
-              Last analysis:<br className="hidden-big" />
+              Last analysis:
+              <br className="hidden-big" />
               <span className="little-spacer-left">{formattedDate}</span>
             </small>
           )}
index 39daf261d2a1cf10bdb0aca7451aa389dd403cc5..856c4cec02907835baf795de95b0d2671719e8a0 100644 (file)
@@ -61,7 +61,8 @@ export default class RepoWidgetNotConfigured extends React.PureComponent<{}, Sta
               </a>
             ) : (
               'repository settings'
-            )}.
+            )}
+            .
           </>
         );
       } else {
index 4fe8ae3df93062ef7f8a8ab1b735066d016a8ae5..7f6f3583e5b2f537af2ad17911a04b2658d20480 100644 (file)
     "@types/cheerio" "*"
     "@types/react" "*"
 
-"@types/jest@23.1.5":
-  version "23.1.5"
-  resolved "https://registry.yarnpkg.com/@types/jest/-/jest-23.1.5.tgz#e31be003956e1fa8c860124d99bea9ae327ae37b"
+"@types/jest@23.3.1":
+  version "23.3.1"
+  resolved "https://registry.yarnpkg.com/@types/jest/-/jest-23.3.1.tgz#a4319aedb071d478e6f407d1c4578ec8156829cf"
 
 "@types/lodash@4.14.111":
   version "4.14.111"
   version "9.6.0"
   resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.0.tgz#d3480ee666df9784b1001a1872a2f6ccefb6c2d7"
 
-"@types/react-dom@16.0.3":
-  version "16.0.3"
-  resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.0.3.tgz#8accad7eabdab4cca3e1a56f5ccb57de2da0ff64"
+"@types/prop-types@*":
+  version "15.5.5"
+  resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.5.5.tgz#17038dd322c2325f5da650a94d5f9974943625e3"
+  dependencies:
+    "@types/react" "*"
+
+"@types/react-dom@16.0.7":
+  version "16.0.7"
+  resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.0.7.tgz#54d0f867a76b90597e8432030d297982f25c20ba"
   dependencies:
     "@types/node" "*"
     "@types/react" "*"
   version "16.0.41"
   resolved "https://registry.yarnpkg.com/@types/react/-/react-16.0.41.tgz#72146737f4d439dc95a53315de4bfb43ac8542ca"
 
-"@types/react@16.0.29":
-  version "16.0.29"
-  resolved "https://registry.yarnpkg.com/@types/react/-/react-16.0.29.tgz#4eea6a8de9f40ca71d580ae7a9f3b4b77b368de8"
+"@types/react@16.4.8":
+  version "16.4.8"
+  resolved "https://registry.yarnpkg.com/@types/react/-/react-16.4.8.tgz#ff0440429783df0927bdcd430fa1225f7c08cf36"
+  dependencies:
+    "@types/prop-types" "*"
+    csstype "^2.2.0"
 
 "@webassemblyjs/ast@1.5.13":
   version "1.5.13"
@@ -508,13 +517,6 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1:
   dependencies:
     color-convert "^1.9.0"
 
-anymatch@^1.3.0:
-  version "1.3.2"
-  resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a"
-  dependencies:
-    micromatch "^2.1.5"
-    normalize-path "^2.0.0"
-
 anymatch@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
@@ -921,9 +923,9 @@ babel-helpers@^6.24.1:
     babel-runtime "^6.22.0"
     babel-template "^6.24.1"
 
-babel-jest@23.4.0, babel-jest@^23.4.0:
-  version "23.4.0"
-  resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-23.4.0.tgz#22c34c392e2176f6a4c367992a7fcff69d2e8557"
+babel-jest@23.4.2, babel-jest@^23.4.2:
+  version "23.4.2"
+  resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-23.4.2.tgz#f276de67798a5d68f2d6e87ff518c2f6e1609877"
   dependencies:
     babel-plugin-istanbul "^4.1.6"
     babel-preset-jest "^23.2.0"
@@ -1329,7 +1331,7 @@ babel-preset-env@1.6.1:
     invariant "^2.2.2"
     semver "^5.3.0"
 
-babel-preset-jest@^23.0.0, babel-preset-jest@^23.2.0:
+babel-preset-jest@^23.2.0:
   version "23.2.0"
   resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz#8ec7a03a138f001a1a8fb1e8113652bf1a55da46"
   dependencies:
@@ -1367,7 +1369,7 @@ babel-runtime@6.23.0:
     core-js "^2.4.0"
     regenerator-runtime "^0.10.0"
 
-babel-runtime@6.x.x, babel-runtime@^6.11.6, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0, babel-runtime@^6.9.2:
+babel-runtime@6.x.x, babel-runtime@^6.11.6, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0:
   version "6.26.0"
   resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
   dependencies:
@@ -1829,21 +1831,6 @@ cheerio@^1.0.0-rc.2:
     lodash "^4.15.0"
     parse5 "^3.0.1"
 
-chokidar@^1.6.0:
-  version "1.7.0"
-  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468"
-  dependencies:
-    anymatch "^1.3.0"
-    async-each "^1.0.0"
-    glob-parent "^2.0.0"
-    inherits "^2.0.1"
-    is-binary-path "^1.0.0"
-    is-glob "^2.0.0"
-    path-is-absolute "^1.0.0"
-    readdirp "^2.0.0"
-  optionalDependencies:
-    fsevents "^1.0.0"
-
 chokidar@^2.0.0, chokidar@^2.0.2:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.3.tgz#dcbd4f6cbb2a55b4799ba8a840ac527e5f4b1176"
@@ -1956,6 +1943,10 @@ clorox@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/clorox/-/clorox-1.0.3.tgz#6fa63653f280c33d69f548fb14d239ddcfa1590d"
 
+closest-file-data@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/closest-file-data/-/closest-file-data-0.1.4.tgz#975f87c132f299d24a0375b9f63ca3fb88f72b3a"
+
 co@^4.6.0:
   version "4.6.0"
   resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
@@ -2169,22 +2160,6 @@ cosmiconfig@^4.0.0:
     parse-json "^4.0.0"
     require-from-string "^2.0.1"
 
-cpx@^1.5.0:
-  version "1.5.0"
-  resolved "https://registry.yarnpkg.com/cpx/-/cpx-1.5.0.tgz#185be018511d87270dedccc293171e37655ab88f"
-  dependencies:
-    babel-runtime "^6.9.2"
-    chokidar "^1.6.0"
-    duplexer "^0.1.1"
-    glob "^7.0.5"
-    glob2base "^0.0.12"
-    minimatch "^3.0.2"
-    mkdirp "^0.5.1"
-    resolve "^1.1.7"
-    safe-buffer "^5.0.1"
-    shell-quote "^1.6.1"
-    subarg "^1.0.0"
-
 create-ecdh@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d"
@@ -2385,6 +2360,10 @@ cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0":
   dependencies:
     cssom "0.3.x"
 
+csstype@^2.2.0:
+  version "2.5.6"
+  resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.5.6.tgz#2ae1db2319642d8b80a668d2d025c6196071e788"
+
 csstype@^2.5.2:
   version "2.5.5"
   resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.5.5.tgz#4125484a3d42189a863943f23b9e4b80fedfa106"
@@ -2429,12 +2408,6 @@ 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"
 
-decamelize@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-2.0.0.tgz#656d7bbc8094c4c788ea53c5840908c9c7d063c7"
-  dependencies:
-    xregexp "4.0.0"
-
 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"
@@ -3352,10 +3325,6 @@ find-cache-dir@^1.0.0:
     make-dir "^1.0.0"
     pkg-dir "^2.0.0"
 
-find-index@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4"
-
 find-root@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4"
@@ -3373,12 +3342,6 @@ find-up@^2.0.0, find-up@^2.1.0:
   dependencies:
     locate-path "^2.0.0"
 
-find-up@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
-  dependencies:
-    locate-path "^3.0.0"
-
 flat-cache@^1.2.1:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481"
@@ -3485,7 +3448,7 @@ fs.realpath@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
 
-fsevents@^1.0.0, fsevents@^1.1.1, fsevents@^1.1.2:
+fsevents@^1.1.1, fsevents@^1.1.2:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8"
   dependencies:
@@ -3580,12 +3543,6 @@ glob-parent@^3.1.0:
     is-glob "^3.1.0"
     path-dirname "^1.0.0"
 
-glob2base@^0.0.12:
-  version "0.0.12"
-  resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56"
-  dependencies:
-    find-index "^0.1.1"
-
 glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2:
   version "7.1.2"
   resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
@@ -4510,15 +4467,15 @@ istanbul-reports@^1.3.0:
   dependencies:
     handlebars "^4.0.3"
 
-jest-changed-files@^23.4.0:
-  version "23.4.0"
-  resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-23.4.0.tgz#f1b304f98c235af5d9a31ec524262c5e4de3c6ff"
+jest-changed-files@^23.4.2:
+  version "23.4.2"
+  resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-23.4.2.tgz#1eed688370cd5eebafe4ae93d34bb3b64968fe83"
   dependencies:
     throat "^4.0.0"
 
-jest-cli@^23.4.0:
-  version "23.4.0"
-  resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-23.4.0.tgz#d1fdd1dbc41d69ae8bd43d0070ce23988eacd86f"
+jest-cli@^23.4.2:
+  version "23.4.2"
+  resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-23.4.2.tgz#49d56bcfe6cf01871bfcc4a0494e08edaf2b61d0"
   dependencies:
     ansi-escapes "^3.0.0"
     chalk "^2.0.1"
@@ -4531,17 +4488,17 @@ jest-cli@^23.4.0:
     istanbul-lib-coverage "^1.2.0"
     istanbul-lib-instrument "^1.10.1"
     istanbul-lib-source-maps "^1.2.4"
-    jest-changed-files "^23.4.0"
-    jest-config "^23.4.0"
+    jest-changed-files "^23.4.2"
+    jest-config "^23.4.2"
     jest-environment-jsdom "^23.4.0"
     jest-get-type "^22.1.0"
-    jest-haste-map "^23.4.0"
+    jest-haste-map "^23.4.1"
     jest-message-util "^23.4.0"
     jest-regex-util "^23.3.0"
-    jest-resolve-dependencies "^23.4.0"
-    jest-runner "^23.4.0"
-    jest-runtime "^23.4.0"
-    jest-snapshot "^23.4.0"
+    jest-resolve-dependencies "^23.4.2"
+    jest-runner "^23.4.2"
+    jest-runtime "^23.4.2"
+    jest-snapshot "^23.4.2"
     jest-util "^23.4.0"
     jest-validate "^23.4.0"
     jest-watcher "^23.4.0"
@@ -4557,20 +4514,20 @@ jest-cli@^23.4.0:
     which "^1.2.12"
     yargs "^11.0.0"
 
-jest-config@^23.0.0, jest-config@^23.4.0:
-  version "23.4.0"
-  resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-23.4.0.tgz#79ccf8d68aa0e48f9e3beb81b83aa5875c63fa3f"
+jest-config@^23.4.2:
+  version "23.4.2"
+  resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-23.4.2.tgz#62a105e14b8266458f2bf4d32403b2c44418fa77"
   dependencies:
     babel-core "^6.0.0"
-    babel-jest "^23.4.0"
+    babel-jest "^23.4.2"
     chalk "^2.0.1"
     glob "^7.1.1"
     jest-environment-jsdom "^23.4.0"
     jest-environment-node "^23.4.0"
     jest-get-type "^22.1.0"
-    jest-jasmine2 "^23.4.0"
+    jest-jasmine2 "^23.4.2"
     jest-regex-util "^23.3.0"
-    jest-resolve "^23.4.0"
+    jest-resolve "^23.4.1"
     jest-util "^23.4.0"
     jest-validate "^23.4.0"
     pretty-format "^23.2.0"
@@ -4616,9 +4573,9 @@ jest-get-type@^22.1.0:
   version "22.4.3"
   resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.4.3.tgz#e3a8504d8479342dd4420236b322869f18900ce4"
 
-jest-haste-map@^23.4.0:
-  version "23.4.0"
-  resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-23.4.0.tgz#f2a0eaa41af766cd5101e6c291fdc6435c93ee1c"
+jest-haste-map@^23.4.1:
+  version "23.4.1"
+  resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-23.4.1.tgz#43a174ba7ac079ae1dd74eaf5a5fe78989474dd2"
   dependencies:
     fb-watchman "^2.0.0"
     graceful-fs "^4.1.11"
@@ -4628,10 +4585,11 @@ jest-haste-map@^23.4.0:
     micromatch "^2.3.11"
     sane "^2.0.0"
 
-jest-jasmine2@^23.4.0:
-  version "23.4.0"
-  resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-23.4.0.tgz#17ce539fe608ef898d6986518144acf270beca8f"
+jest-jasmine2@^23.4.2:
+  version "23.4.2"
+  resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-23.4.2.tgz#2fbf52f93e43ed4c5e7326a90bb1d785be4321ac"
   dependencies:
+    babel-traverse "^6.0.0"
     chalk "^2.0.1"
     co "^4.6.0"
     expect "^23.4.0"
@@ -4640,7 +4598,7 @@ jest-jasmine2@^23.4.0:
     jest-each "^23.4.0"
     jest-matcher-utils "^23.2.0"
     jest-message-util "^23.4.0"
-    jest-snapshot "^23.4.0"
+    jest-snapshot "^23.4.2"
     jest-util "^23.4.0"
     pretty-format "^23.2.0"
 
@@ -4676,42 +4634,42 @@ jest-regex-util@^23.3.0:
   version "23.3.0"
   resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-23.3.0.tgz#5f86729547c2785c4002ceaa8f849fe8ca471bc5"
 
-jest-resolve-dependencies@^23.4.0:
-  version "23.4.0"
-  resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-23.4.0.tgz#e73efce70262a6e2bf5263d0b23009a098678620"
+jest-resolve-dependencies@^23.4.2:
+  version "23.4.2"
+  resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-23.4.2.tgz#0675ba876a5b819deffc449ad72e9985c2592048"
   dependencies:
     jest-regex-util "^23.3.0"
-    jest-snapshot "^23.4.0"
+    jest-snapshot "^23.4.2"
 
-jest-resolve@^23.4.0:
-  version "23.4.0"
-  resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-23.4.0.tgz#b4061dbcd6391b5e445d5fd84c9dad5ff1ff5662"
+jest-resolve@^23.4.1:
+  version "23.4.1"
+  resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-23.4.1.tgz#7f3c17104732a2c0c940a01256025ed745814982"
   dependencies:
     browser-resolve "^1.11.3"
     chalk "^2.0.1"
     realpath-native "^1.0.0"
 
-jest-runner@^23.4.0:
-  version "23.4.0"
-  resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-23.4.0.tgz#1859b211a264ea5a43b7a3022e1199067c4dfe57"
+jest-runner@^23.4.2:
+  version "23.4.2"
+  resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-23.4.2.tgz#579a88524ac52c846075b0129a21c7b483e75a7e"
   dependencies:
     exit "^0.1.2"
     graceful-fs "^4.1.11"
-    jest-config "^23.4.0"
+    jest-config "^23.4.2"
     jest-docblock "^23.2.0"
-    jest-haste-map "^23.4.0"
-    jest-jasmine2 "^23.4.0"
+    jest-haste-map "^23.4.1"
+    jest-jasmine2 "^23.4.2"
     jest-leak-detector "^23.2.0"
     jest-message-util "^23.4.0"
-    jest-runtime "^23.4.0"
+    jest-runtime "^23.4.2"
     jest-util "^23.4.0"
     jest-worker "^23.2.0"
     source-map-support "^0.5.6"
     throat "^4.0.0"
 
-jest-runtime@^23.4.0:
-  version "23.4.0"
-  resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-23.4.0.tgz#c30ef619def587b93bad4a4938da9accb9936b4d"
+jest-runtime@^23.4.2:
+  version "23.4.2"
+  resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-23.4.2.tgz#00c3bb8385253d401a394a27d1112d3615e5a65c"
   dependencies:
     babel-core "^6.0.0"
     babel-plugin-istanbul "^4.1.6"
@@ -4720,12 +4678,12 @@ jest-runtime@^23.4.0:
     exit "^0.1.2"
     fast-json-stable-stringify "^2.0.0"
     graceful-fs "^4.1.11"
-    jest-config "^23.4.0"
-    jest-haste-map "^23.4.0"
+    jest-config "^23.4.2"
+    jest-haste-map "^23.4.1"
     jest-message-util "^23.4.0"
     jest-regex-util "^23.3.0"
-    jest-resolve "^23.4.0"
-    jest-snapshot "^23.4.0"
+    jest-resolve "^23.4.1"
+    jest-snapshot "^23.4.2"
     jest-util "^23.4.0"
     jest-validate "^23.4.0"
     micromatch "^2.3.11"
@@ -4739,17 +4697,16 @@ jest-serializer@^23.0.1:
   version "23.0.1"
   resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-23.0.1.tgz#a3776aeb311e90fe83fab9e533e85102bd164165"
 
-jest-snapshot@^23.4.0:
-  version "23.4.0"
-  resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-23.4.0.tgz#7463d0357cabdfe1c63994d5e32f707d1033d616"
+jest-snapshot@^23.4.2:
+  version "23.4.2"
+  resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-23.4.2.tgz#8fa6130feb5a527dac73e5fa80d86f29f7c42ab6"
   dependencies:
-    babel-traverse "^6.0.0"
     babel-types "^6.0.0"
     chalk "^2.0.1"
     jest-diff "^23.2.0"
     jest-matcher-utils "^23.2.0"
     jest-message-util "^23.4.0"
-    jest-resolve "^23.4.0"
+    jest-resolve "^23.4.1"
     mkdirp "^0.5.1"
     natural-compare "^1.4.0"
     pretty-format "^23.2.0"
@@ -4791,12 +4748,12 @@ jest-worker@^23.2.0:
   dependencies:
     merge-stream "^1.0.1"
 
-jest@23.4.0:
-  version "23.4.0"
-  resolved "https://registry.yarnpkg.com/jest/-/jest-23.4.0.tgz#ebce63f6529c27c646d80c610866f0306f66dcbf"
+jest@23.4.2:
+  version "23.4.2"
+  resolved "https://registry.yarnpkg.com/jest/-/jest-23.4.2.tgz#1fae3ed832192143070ae85156b25cea891a1260"
   dependencies:
     import-local "^1.0.0"
-    jest-cli "^23.4.0"
+    jest-cli "^23.4.2"
 
 js-base64@^2.1.9:
   version "2.4.3"
@@ -5025,13 +4982,6 @@ locate-path@^2.0.0:
     p-locate "^2.0.0"
     path-exists "^3.0.0"
 
-locate-path@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
-  dependencies:
-    p-locate "^3.0.0"
-    path-exists "^3.0.0"
-
 lodash.camelcase@^4.3.0:
   version "4.3.0"
   resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
@@ -5213,7 +5163,7 @@ methods@~1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
 
-micromatch@^2.1.5, micromatch@^2.3.11:
+micromatch@^2.3.11:
   version "2.3.11"
   resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
   dependencies:
@@ -5302,7 +5252,7 @@ minimist@0.0.8:
   version "0.0.8"
   resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
 
-minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0:
+minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
 
@@ -5519,7 +5469,7 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4:
     semver "2 || 3 || 4 || 5"
     validate-npm-package-license "^3.0.1"
 
-normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1:
+normalize-path@^2.0.1, normalize-path@^2.1.1:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
   dependencies:
@@ -5761,24 +5711,12 @@ p-limit@^1.0.0, p-limit@^1.1.0:
   dependencies:
     p-try "^1.0.0"
 
-p-limit@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.0.0.tgz#e624ed54ee8c460a778b3c9f3670496ff8a57aec"
-  dependencies:
-    p-try "^2.0.0"
-
 p-locate@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
   dependencies:
     p-limit "^1.1.0"
 
-p-locate@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
-  dependencies:
-    p-limit "^2.0.0"
-
 p-map@^1.1.1:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b"
@@ -5787,10 +5725,6 @@ p-try@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
 
-p-try@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1"
-
 pako@~1.0.5:
   version "1.0.6"
   resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258"
@@ -5969,12 +5903,6 @@ pkg-dir@^2.0.0:
   dependencies:
     find-up "^2.1.0"
 
-pkg-dir@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3"
-  dependencies:
-    find-up "^3.0.0"
-
 pluralize@^7.0.0:
   version "7.0.0"
   resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777"
@@ -6289,9 +6217,9 @@ preserve@^0.2.0:
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
 
-prettier@1.13.7:
-  version "1.13.7"
-  resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.13.7.tgz#850f3b8af784a49a6ea2d2eaa7ed1428a34b7281"
+prettier@1.14.0:
+  version "1.14.0"
+  resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.14.0.tgz#847c235522035fd988100f1f43cf20a7d24f9372"
 
 pretty-error@^2.0.2:
   version "2.1.1"
@@ -6340,18 +6268,18 @@ prompts@^0.1.9:
     clorox "^1.0.3"
     sisteransi "^0.1.1"
 
-prop-types@^15.0.0, prop-types@^15.5.4, prop-types@^15.6.1:
-  version "15.6.2"
-  resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102"
+prop-types@15.6.1, prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.0:
+  version "15.6.1"
+  resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca"
   dependencies:
+    fbjs "^0.8.16"
     loose-envify "^1.3.1"
     object-assign "^4.1.1"
 
-prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.0:
-  version "15.6.1"
-  resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca"
+prop-types@^15.0.0, prop-types@^15.5.4, prop-types@^15.6.1:
+  version "15.6.2"
+  resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102"
   dependencies:
-    fbjs "^0.8.16"
     loose-envify "^1.3.1"
     object-assign "^4.1.1"
 
@@ -6552,9 +6480,9 @@ react-dev-utils@^3.0.0:
     strip-ansi "3.0.1"
     text-table "0.2.0"
 
-react-dom@16.2.0:
-  version "16.2.0"
-  resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.2.0.tgz#69003178601c0ca19b709b33a83369fe6124c044"
+react-dom@16.4.2:
+  version "16.4.2"
+  resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.4.2.tgz#4afed569689f2c561d2b8da0b819669c38a0bda4"
   dependencies:
     fbjs "^0.8.16"
     loose-envify "^1.1.0"
@@ -6607,6 +6535,10 @@ react-is@^16.3.1:
   version "16.4.1"
   resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.4.1.tgz#d624c4650d2c65dbd52c72622bbf389435d9776e"
 
+react-is@^16.4.2:
+  version "16.4.2"
+  resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.4.2.tgz#84891b56c2b6d9efdee577cc83501dfc5ecead88"
+
 react-node-resolver@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/react-node-resolver/-/react-node-resolver-1.0.1.tgz#1798a729c0e218bf2f0e8ddf79c550d4af61d83a"
@@ -6655,7 +6587,16 @@ react-side-effect@^1.1.3:
     exenv "^1.2.1"
     shallowequal "^1.0.1"
 
-react-test-renderer@16.2.0, react-test-renderer@^16.0.0-0:
+react-test-renderer@16.4.2:
+  version "16.4.2"
+  resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.4.2.tgz#4e03eca9359bb3210d4373f7547d1364218ef74e"
+  dependencies:
+    fbjs "^0.8.16"
+    object-assign "^4.1.1"
+    prop-types "^15.6.0"
+    react-is "^16.4.2"
+
+react-test-renderer@^16.0.0-0:
   version "16.2.0"
   resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.2.0.tgz#bddf259a6b8fcd8555f012afc8eacc238872a211"
   dependencies:
@@ -6674,9 +6615,9 @@ react-transition-group@^2.2.1:
     prop-types "^15.5.8"
     warning "^3.0.0"
 
-react@16.2.0:
-  version "16.2.0"
-  resolved "https://registry.yarnpkg.com/react/-/react-16.2.0.tgz#a31bd2dab89bff65d42134fa187f24d054c273ba"
+react@16.4.2:
+  version "16.4.2"
+  resolved "https://registry.yarnpkg.com/react/-/react-16.4.2.tgz#2cd90154e3a9d9dd8da2991149fdca3c260e129f"
   dependencies:
     fbjs "^0.8.16"
     loose-envify "^1.1.0"
@@ -7023,7 +6964,7 @@ resolve@1.1.7:
   version "1.1.7"
   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
 
-resolve@^1.1.7, resolve@^1.5.0:
+resolve@^1.5.0:
   version "1.6.0"
   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.6.0.tgz#0fbd21278b27b4004481c395349e7aba60a9ff5c"
   dependencies:
@@ -7249,7 +7190,7 @@ shebang-regex@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
 
-shell-quote@1.6.1, shell-quote@^1.6.1:
+shell-quote@1.6.1:
   version "1.6.1"
   resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767"
   dependencies:
@@ -7630,12 +7571,6 @@ stylis@^3.5.0:
   version "3.5.1"
   resolved "https://registry.yarnpkg.com/stylis/-/stylis-3.5.1.tgz#fd341d59f57f9aeb412bc14c9d8a8670b438e03b"
 
-subarg@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2"
-  dependencies:
-    minimist "^1.1.0"
-
 supports-color@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
@@ -7825,18 +7760,13 @@ tryer@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.0.tgz#027b69fa823225e551cace3ef03b11f6ab37c1d7"
 
-ts-jest@23.0.0:
-  version "23.0.0"
-  resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-23.0.0.tgz#3216310fb51e40789c6e4aa20bfe80198d250e9b"
+ts-jest@23.1.3:
+  version "23.1.3"
+  resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-23.1.3.tgz#33e3187d3ef0d42adada6347acf2c3539ac56107"
   dependencies:
-    babel-plugin-istanbul "^4.1.6"
-    babel-preset-jest "^23.0.0"
-    cpx "^1.5.0"
+    closest-file-data "^0.1.4"
     fs-extra "6.0.1"
-    jest-config "^23.0.0"
     lodash "^4.17.10"
-    pkg-dir "^3.0.0"
-    yargs "^12.0.1"
 
 ts-loader@4.4.2:
   version "4.4.2"
@@ -7887,16 +7817,16 @@ typedarray@^0.0.6:
   version "0.0.6"
   resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
 
-typescript-eslint-parser@15.0.0:
-  version "15.0.0"
-  resolved "https://registry.yarnpkg.com/typescript-eslint-parser/-/typescript-eslint-parser-15.0.0.tgz#882fd3d7aabffbab0a7f98d2a59fb9a989c2b37f"
+typescript-eslint-parser@18.0.0:
+  version "18.0.0"
+  resolved "https://registry.yarnpkg.com/typescript-eslint-parser/-/typescript-eslint-parser-18.0.0.tgz#3e5055a44980d69e4154350fc5d8b1ab4e2332a8"
   dependencies:
     lodash.unescape "4.0.1"
     semver "5.5.0"
 
-typescript@2.8.3:
-  version "2.8.3"
-  resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.3.tgz#5d817f9b6f31bb871835f4edf0089f21abe6c170"
+typescript@3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.0.1.tgz#43738f29585d3a87575520a4b93ab6026ef11fdb"
 
 ua-parser-js@^0.7.18:
   version "0.7.18"
@@ -8381,10 +8311,6 @@ xml-name-validator@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
 
-xregexp@4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020"
-
 xtend@^4.0.0, xtend@~4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
@@ -8393,7 +8319,7 @@ y18n@^3.2.1:
   version "3.2.1"
   resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
 
-"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0:
+y18n@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
 
@@ -8401,12 +8327,6 @@ yallist@^2.1.2:
   version "2.1.2"
   resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
 
-yargs-parser@^10.1.0:
-  version "10.1.0"
-  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8"
-  dependencies:
-    camelcase "^4.1.0"
-
 yargs-parser@^9.0.2:
   version "9.0.2"
   resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077"
@@ -8447,23 +8367,6 @@ yargs@^11.0.0:
     y18n "^3.2.1"
     yargs-parser "^9.0.2"
 
-yargs@^12.0.1:
-  version "12.0.1"
-  resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.1.tgz#6432e56123bb4e7c3562115401e98374060261c2"
-  dependencies:
-    cliui "^4.0.0"
-    decamelize "^2.0.0"
-    find-up "^3.0.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 || ^4.0.0"
-    yargs-parser "^10.1.0"
-
 yargs@~3.10.0:
   version "3.10.0"
   resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
index a14ae9bb095a307312159e7b0d15ecb7b634712f..5dae4d228af49140c407cd5a489da1498df5f631 100644 (file)
@@ -20,7 +20,6 @@
   ],
   "plugins": [
     "transform-class-properties",
-    // use built-in `Object.assign`
     ["transform-object-rest-spread", { "useBuiltIns": true }],
     "lodash"
   ],
index 678db6727bc6d50d1a21efc246ce8b123ab3ce77..6a31b77bbd88275c3208822358ccc86a55efb3eb 100644 (file)
@@ -9,20 +9,20 @@
     "babel-polyfill": "6.26.0",
     "classnames": "2.2.5",
     "lodash": "4.17.4",
-    "react": "16.2.0",
-    "react-dom": "16.2.0",
+    "react": "16.4.2",
+    "react-dom": "16.4.2",
     "whatwg-fetch": "2.0.3"
   },
   "devDependencies": {
     "@types/classnames": "2.2.3",
     "@types/enzyme": "3.1.10",
-    "@types/jest": "22.2.3",
+    "@types/jest": "23.3.1",
     "@types/lodash": "4.14.102",
-    "@types/react": "16.0.29",
-    "@types/react-dom": "16.0.3",
+    "@types/react": "16.4.8",
+    "@types/react-dom": "16.0.7",
     "autoprefixer": "7.1.6",
     "babel-core": "6.26.0",
-    "babel-jest": "23.0.1",
+    "babel-jest": "23.4.2",
     "babel-loader": "7.1.4",
     "babel-plugin-dynamic-import-node": "1.1.0",
     "babel-plugin-lodash": "3.3.2",
     "eslint-plugin-react": "7.7.0",
     "eslint-plugin-sonarjs": "0.1.0",
     "html-webpack-plugin": "3.0.6",
-    "jest": "23.1.0",
+    "jest": "23.4.2",
     "postcss-calc": "6.0.1",
     "postcss-custom-properties": "6.2.0",
     "postcss-loader": "2.1.1",
-    "prettier": "1.11.1",
+    "prettier": "1.14.0",
     "react-dev-utils": "5.0.0",
     "react-error-overlay": "1.0.7",
-    "react-test-renderer": "16.2.0",
+    "react-test-renderer": "16.4.2",
     "style-loader": "0.20.3",
-    "ts-jest": "22.4.6",
+    "ts-jest": "23.1.3",
     "ts-loader": "4.3.0",
-    "typescript": "2.8.4",
-    "typescript-eslint-parser": "15.0.0",
+    "typescript": "3.0.1",
+    "typescript-eslint-parser": "18.0.0",
     "webpack": "4.1.1",
     "webpack-bundle-analyzer": "2.11.1",
     "webpack-dev-server": "3.1.1"
index 8c8c958e82c39f08cfae0cae1e793b8031741680..4f8dc0f90e48ecb20ddd3196fba631d0df970326 100644 (file)
@@ -31,9 +31,9 @@
     "@types/cheerio" "*"
     "@types/react" "*"
 
-"@types/jest@22.2.3":
-  version "22.2.3"
-  resolved "https://registry.yarnpkg.com/@types/jest/-/jest-22.2.3.tgz#0157c0316dc3722c43a7b71de3fdf3acbccef10d"
+"@types/jest@23.3.1":
+  version "23.3.1"
+  resolved "https://registry.yarnpkg.com/@types/jest/-/jest-23.3.1.tgz#a4319aedb071d478e6f407d1c4578ec8156829cf"
 
 "@types/lodash@4.14.102":
   version "4.14.102"
   version "9.4.7"
   resolved "https://registry.yarnpkg.com/@types/node/-/node-9.4.7.tgz#57d81cd98719df2c9de118f2d5f3b1120dcd7275"
 
-"@types/react-dom@16.0.3":
-  version "16.0.3"
-  resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.0.3.tgz#8accad7eabdab4cca3e1a56f5ccb57de2da0ff64"
+"@types/prop-types@*":
+  version "15.5.5"
+  resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.5.5.tgz#17038dd322c2325f5da650a94d5f9974943625e3"
+  dependencies:
+    "@types/react" "*"
+
+"@types/react-dom@16.0.7":
+  version "16.0.7"
+  resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.0.7.tgz#54d0f867a76b90597e8432030d297982f25c20ba"
   dependencies:
     "@types/node" "*"
     "@types/react" "*"
 
-"@types/react@*", "@types/react@16.0.29":
+"@types/react@*":
   version "16.0.29"
   resolved "https://registry.yarnpkg.com/@types/react/-/react-16.0.29.tgz#4eea6a8de9f40ca71d580ae7a9f3b4b77b368de8"
 
+"@types/react@16.4.8":
+  version "16.4.8"
+  resolved "https://registry.yarnpkg.com/@types/react/-/react-16.4.8.tgz#ff0440429783df0927bdcd430fa1225f7c08cf36"
+  dependencies:
+    "@types/prop-types" "*"
+    csstype "^2.2.0"
+
 abab@^1.0.4:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e"
@@ -457,30 +470,6 @@ babel-core@6.26.0, babel-core@^6.0.0, babel-core@^6.26.0:
     slash "^1.0.0"
     source-map "^0.5.6"
 
-babel-core@^6.26.3:
-  version "6.26.3"
-  resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207"
-  dependencies:
-    babel-code-frame "^6.26.0"
-    babel-generator "^6.26.0"
-    babel-helpers "^6.24.1"
-    babel-messages "^6.23.0"
-    babel-register "^6.26.0"
-    babel-runtime "^6.26.0"
-    babel-template "^6.26.0"
-    babel-traverse "^6.26.0"
-    babel-types "^6.26.0"
-    babylon "^6.18.0"
-    convert-source-map "^1.5.1"
-    debug "^2.6.9"
-    json5 "^0.5.1"
-    lodash "^4.17.4"
-    minimatch "^3.0.4"
-    path-is-absolute "^1.0.1"
-    private "^0.1.8"
-    slash "^1.0.0"
-    source-map "^0.5.7"
-
 babel-generator@^6.18.0, babel-generator@^6.26.0:
   version "6.26.1"
   resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90"
@@ -610,12 +599,12 @@ babel-helpers@^6.24.1:
     babel-runtime "^6.22.0"
     babel-template "^6.24.1"
 
-babel-jest@23.0.1, babel-jest@^23.0.1:
-  version "23.0.1"
-  resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-23.0.1.tgz#bbad3bf523fb202da05ed0a6540b48c84eed13a6"
+babel-jest@23.4.2, babel-jest@^23.4.2:
+  version "23.4.2"
+  resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-23.4.2.tgz#f276de67798a5d68f2d6e87ff518c2f6e1609877"
   dependencies:
     babel-plugin-istanbul "^4.1.6"
-    babel-preset-jest "^23.0.1"
+    babel-preset-jest "^23.2.0"
 
 babel-loader@7.1.4:
   version "7.1.4"
@@ -654,13 +643,9 @@ babel-plugin-istanbul@^4.1.6:
     istanbul-lib-instrument "^1.10.1"
     test-exclude "^4.2.1"
 
-babel-plugin-jest-hoist@^22.4.4:
-  version "22.4.4"
-  resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.4.tgz#b9851906eab34c7bf6f8c895a2b08bea1a844c0b"
-
-babel-plugin-jest-hoist@^23.0.1:
-  version "23.0.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.0.1.tgz#eaa11c964563aea9c21becef2bdf7853f7f3c148"
+babel-plugin-jest-hoist@^23.2.0:
+  version "23.2.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz#e61fae05a1ca8801aadee57a6d66b8cefaf44167"
 
 babel-plugin-lodash@3.3.2:
   version "3.3.2"
@@ -814,15 +799,6 @@ babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-e
     babel-template "^6.26.0"
     babel-types "^6.26.0"
 
-babel-plugin-transform-es2015-modules-commonjs@^6.26.2:
-  version "6.26.2"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3"
-  dependencies:
-    babel-plugin-transform-strict-mode "^6.24.1"
-    babel-runtime "^6.26.0"
-    babel-template "^6.26.0"
-    babel-types "^6.26.0"
-
 babel-plugin-transform-es2015-modules-systemjs@^6.23.0:
   version "6.24.1"
   resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23"
@@ -1010,18 +986,11 @@ babel-preset-env@1.6.1:
     invariant "^2.2.2"
     semver "^5.3.0"
 
-babel-preset-jest@^22.4.3:
-  version "22.4.4"
-  resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-22.4.4.tgz#ec9fbd8bcd7dfd24b8b5320e0e688013235b7c39"
-  dependencies:
-    babel-plugin-jest-hoist "^22.4.4"
-    babel-plugin-syntax-object-rest-spread "^6.13.0"
-
-babel-preset-jest@^23.0.1:
-  version "23.0.1"
-  resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-23.0.1.tgz#631cc545c6cf021943013bcaf22f45d87fe62198"
+babel-preset-jest@^23.2.0:
+  version "23.2.0"
+  resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz#8ec7a03a138f001a1a8fb1e8113652bf1a55da46"
   dependencies:
-    babel-plugin-jest-hoist "^23.0.1"
+    babel-plugin-jest-hoist "^23.2.0"
     babel-plugin-syntax-object-rest-spread "^6.13.0"
 
 babel-preset-react@6.22.0:
@@ -1055,7 +1024,7 @@ babel-runtime@6.23.0:
     core-js "^2.4.0"
     regenerator-runtime "^0.10.0"
 
-babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0, babel-runtime@^6.9.2:
+babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0:
   version "6.26.0"
   resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
   dependencies:
@@ -1072,7 +1041,7 @@ babel-template@^6.16.0, babel-template@^6.22.0, babel-template@^6.24.1, babel-te
     babylon "^6.18.0"
     lodash "^4.17.4"
 
-babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0:
+babel-traverse@^6.0.0, babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0:
   version "6.26.0"
   resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
   dependencies:
@@ -1094,7 +1063,7 @@ babel-types@7.0.0-beta.3:
     lodash "^4.2.0"
     to-fast-properties "^2.0.0"
 
-babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0:
+babel-types@^6.0.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0:
   version "6.26.0"
   resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
   dependencies:
@@ -1259,9 +1228,9 @@ browser-process-hrtime@^0.1.2:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e"
 
-browser-resolve@^1.11.2:
-  version "1.11.2"
-  resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce"
+browser-resolve@^1.11.3:
+  version "1.11.3"
+  resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6"
   dependencies:
     resolve "1.1.7"
 
@@ -1506,21 +1475,6 @@ cheerio@^1.0.0-rc.2:
     lodash "^4.15.0"
     parse5 "^3.0.1"
 
-chokidar@^1.6.0:
-  version "1.7.0"
-  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468"
-  dependencies:
-    anymatch "^1.3.0"
-    async-each "^1.0.0"
-    glob-parent "^2.0.0"
-    inherits "^2.0.1"
-    is-binary-path "^1.0.0"
-    is-glob "^2.0.0"
-    path-is-absolute "^1.0.0"
-    readdirp "^2.0.0"
-  optionalDependencies:
-    fsevents "^1.0.0"
-
 chokidar@^2.0.0, chokidar@^2.0.2:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.3.tgz#dcbd4f6cbb2a55b4799ba8a840ac527e5f4b1176"
@@ -1631,6 +1585,10 @@ clone@^1.0.2:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.3.tgz#298d7e2231660f40c003c2ed3140decf3f53085f"
 
+closest-file-data@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/closest-file-data/-/closest-file-data-0.1.4.tgz#975f87c132f299d24a0375b9f63ca3fb88f72b3a"
+
 co@^4.6.0:
   version "4.6.0"
   resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
@@ -1786,7 +1744,7 @@ 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, convert-source-map@^1.5.1:
+convert-source-map@^1.4.0, convert-source-map@^1.5.0:
   version "1.5.1"
   resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5"
 
@@ -1850,22 +1808,6 @@ cosmiconfig@^2.1.0, cosmiconfig@^2.1.1:
     parse-json "^2.2.0"
     require-from-string "^1.1.0"
 
-cpx@^1.5.0:
-  version "1.5.0"
-  resolved "https://registry.yarnpkg.com/cpx/-/cpx-1.5.0.tgz#185be018511d87270dedccc293171e37655ab88f"
-  dependencies:
-    babel-runtime "^6.9.2"
-    chokidar "^1.6.0"
-    duplexer "^0.1.1"
-    glob "^7.0.5"
-    glob2base "^0.0.12"
-    minimatch "^3.0.2"
-    mkdirp "^0.5.1"
-    resolve "^1.1.7"
-    safe-buffer "^5.0.1"
-    shell-quote "^1.6.1"
-    subarg "^1.0.0"
-
 create-ecdh@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d"
@@ -2035,6 +1977,10 @@ cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0":
   dependencies:
     cssom "0.3.x"
 
+csstype@^2.2.0:
+  version "2.5.6"
+  resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.5.6.tgz#2ae1db2319642d8b80a668d2d025c6196071e788"
+
 currently-unhandled@^0.4.1:
   version "0.4.1"
   resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
@@ -2732,27 +2678,16 @@ expand-tilde@^2.0.0, expand-tilde@^2.0.2:
   dependencies:
     homedir-polyfill "^1.0.1"
 
-expect@^22.4.0:
-  version "22.4.0"
-  resolved "https://registry.yarnpkg.com/expect/-/expect-22.4.0.tgz#371edf1ae15b83b5bf5ec34b42f1584660a36c16"
-  dependencies:
-    ansi-styles "^3.2.0"
-    jest-diff "^22.4.0"
-    jest-get-type "^22.1.0"
-    jest-matcher-utils "^22.4.0"
-    jest-message-util "^22.4.0"
-    jest-regex-util "^22.1.0"
-
-expect@^23.1.0:
-  version "23.1.0"
-  resolved "https://registry.yarnpkg.com/expect/-/expect-23.1.0.tgz#bfdfd57a2a20170d875999ee9787cc71f01c205f"
+expect@^23.4.0:
+  version "23.4.0"
+  resolved "https://registry.yarnpkg.com/expect/-/expect-23.4.0.tgz#6da4ecc99c1471253e7288338983ad1ebadb60c3"
   dependencies:
     ansi-styles "^3.2.0"
-    jest-diff "^23.0.1"
+    jest-diff "^23.2.0"
     jest-get-type "^22.1.0"
-    jest-matcher-utils "^23.0.1"
-    jest-message-util "^23.1.0"
-    jest-regex-util "^23.0.0"
+    jest-matcher-utils "^23.2.0"
+    jest-message-util "^23.4.0"
+    jest-regex-util "^23.3.0"
 
 express@^4.16.2:
   version "4.16.3"
@@ -2958,10 +2893,6 @@ find-cache-dir@^1.0.0:
     make-dir "^1.0.0"
     pkg-dir "^2.0.0"
 
-find-index@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4"
-
 find-up@^1.0.0:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
@@ -3050,9 +2981,9 @@ from2@^2.1.0:
     inherits "^2.0.1"
     readable-stream "^2.0.0"
 
-fs-extra@6.0.0:
-  version "6.0.0"
-  resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-6.0.0.tgz#0f0afb290bb3deb87978da816fcd3c7797f3a817"
+fs-extra@6.0.1:
+  version "6.0.1"
+  resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-6.0.1.tgz#8abc128f7946e310135ddc93b98bddb410e7a34b"
   dependencies:
     graceful-fs "^4.1.2"
     jsonfile "^4.0.0"
@@ -3071,7 +3002,7 @@ fs.realpath@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
 
-fsevents@^1.0.0, fsevents@^1.1.1, fsevents@^1.1.2:
+fsevents@^1.1.1, fsevents@^1.1.2:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8"
   dependencies:
@@ -3166,12 +3097,6 @@ glob-parent@^3.1.0:
     is-glob "^3.1.0"
     path-dirname "^1.0.0"
 
-glob2base@^0.0.12:
-  version "0.0.12"
-  resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56"
-  dependencies:
-    find-index "^0.1.1"
-
 glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2:
   version "7.1.2"
   resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
@@ -4046,15 +3971,15 @@ istanbul-reports@^1.3.0:
   dependencies:
     handlebars "^4.0.3"
 
-jest-changed-files@^23.0.1:
-  version "23.0.1"
-  resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-23.0.1.tgz#f79572d0720844ea5df84c2a448e862c2254f60c"
+jest-changed-files@^23.4.2:
+  version "23.4.2"
+  resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-23.4.2.tgz#1eed688370cd5eebafe4ae93d34bb3b64968fe83"
   dependencies:
     throat "^4.0.0"
 
-jest-cli@^23.1.0:
-  version "23.1.0"
-  resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-23.1.0.tgz#eb8bdd4ce0d15250892e31ad9b69bc99d2a8f6bf"
+jest-cli@^23.4.2:
+  version "23.4.2"
+  resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-23.4.2.tgz#49d56bcfe6cf01871bfcc4a0494e08edaf2b61d0"
   dependencies:
     ansi-escapes "^3.0.0"
     chalk "^2.0.1"
@@ -4067,23 +3992,24 @@ jest-cli@^23.1.0:
     istanbul-lib-coverage "^1.2.0"
     istanbul-lib-instrument "^1.10.1"
     istanbul-lib-source-maps "^1.2.4"
-    jest-changed-files "^23.0.1"
-    jest-config "^23.1.0"
-    jest-environment-jsdom "^23.1.0"
+    jest-changed-files "^23.4.2"
+    jest-config "^23.4.2"
+    jest-environment-jsdom "^23.4.0"
     jest-get-type "^22.1.0"
-    jest-haste-map "^23.1.0"
-    jest-message-util "^23.1.0"
-    jest-regex-util "^23.0.0"
-    jest-resolve-dependencies "^23.0.1"
-    jest-runner "^23.1.0"
-    jest-runtime "^23.1.0"
-    jest-snapshot "^23.0.1"
-    jest-util "^23.1.0"
-    jest-validate "^23.0.1"
-    jest-watcher "^23.1.0"
-    jest-worker "^23.0.1"
+    jest-haste-map "^23.4.1"
+    jest-message-util "^23.4.0"
+    jest-regex-util "^23.3.0"
+    jest-resolve-dependencies "^23.4.2"
+    jest-runner "^23.4.2"
+    jest-runtime "^23.4.2"
+    jest-snapshot "^23.4.2"
+    jest-util "^23.4.0"
+    jest-validate "^23.4.0"
+    jest-watcher "^23.4.0"
+    jest-worker "^23.2.0"
     micromatch "^2.3.11"
     node-notifier "^5.2.1"
+    prompts "^0.1.9"
     realpath-native "^1.0.0"
     rimraf "^2.5.4"
     slash "^1.0.0"
@@ -4092,174 +4018,111 @@ jest-cli@^23.1.0:
     which "^1.2.12"
     yargs "^11.0.0"
 
-jest-config@^22.4.3, jest-config@^22.4.4:
-  version "22.4.4"
-  resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-22.4.4.tgz#72a521188720597169cd8b4ff86934ef5752d86a"
-  dependencies:
-    chalk "^2.0.1"
-    glob "^7.1.1"
-    jest-environment-jsdom "^22.4.1"
-    jest-environment-node "^22.4.1"
-    jest-get-type "^22.1.0"
-    jest-jasmine2 "^22.4.4"
-    jest-regex-util "^22.1.0"
-    jest-resolve "^22.4.2"
-    jest-util "^22.4.1"
-    jest-validate "^22.4.4"
-    pretty-format "^22.4.0"
-
-jest-config@^23.1.0:
-  version "23.1.0"
-  resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-23.1.0.tgz#708ca0f431d356ee424fb4895d3308006bdd8241"
+jest-config@^23.4.2:
+  version "23.4.2"
+  resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-23.4.2.tgz#62a105e14b8266458f2bf4d32403b2c44418fa77"
   dependencies:
     babel-core "^6.0.0"
-    babel-jest "^23.0.1"
+    babel-jest "^23.4.2"
     chalk "^2.0.1"
     glob "^7.1.1"
-    jest-environment-jsdom "^23.1.0"
-    jest-environment-node "^23.1.0"
-    jest-get-type "^22.1.0"
-    jest-jasmine2 "^23.1.0"
-    jest-regex-util "^23.0.0"
-    jest-resolve "^23.1.0"
-    jest-util "^23.1.0"
-    jest-validate "^23.0.1"
-    pretty-format "^23.0.1"
-
-jest-diff@^22.4.0:
-  version "22.4.0"
-  resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-22.4.0.tgz#384c2b78519ca44ca126382df53f134289232525"
-  dependencies:
-    chalk "^2.0.1"
-    diff "^3.2.0"
+    jest-environment-jsdom "^23.4.0"
+    jest-environment-node "^23.4.0"
     jest-get-type "^22.1.0"
-    pretty-format "^22.4.0"
+    jest-jasmine2 "^23.4.2"
+    jest-regex-util "^23.3.0"
+    jest-resolve "^23.4.1"
+    jest-util "^23.4.0"
+    jest-validate "^23.4.0"
+    pretty-format "^23.2.0"
 
-jest-diff@^23.0.1:
-  version "23.0.1"
-  resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-23.0.1.tgz#3d49137cee12c320a4b4d2b4a6fa6e82d491a16a"
+jest-diff@^23.2.0:
+  version "23.2.0"
+  resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-23.2.0.tgz#9f2cf4b51e12c791550200abc16b47130af1062a"
   dependencies:
     chalk "^2.0.1"
     diff "^3.2.0"
     jest-get-type "^22.1.0"
-    pretty-format "^23.0.1"
+    pretty-format "^23.2.0"
 
-jest-docblock@^23.0.1:
-  version "23.0.1"
-  resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-23.0.1.tgz#deddd18333be5dc2415260a04ef3fce9276b5725"
+jest-docblock@^23.2.0:
+  version "23.2.0"
+  resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-23.2.0.tgz#f085e1f18548d99fdd69b20207e6fd55d91383a7"
   dependencies:
     detect-newline "^2.1.0"
 
-jest-each@^23.1.0:
-  version "23.1.0"
-  resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-23.1.0.tgz#16146b592c354867a5ae5e13cdf15c6c65b696c6"
+jest-each@^23.4.0:
+  version "23.4.0"
+  resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-23.4.0.tgz#2fa9edd89daa1a4edc9ff9bf6062a36b71345143"
   dependencies:
     chalk "^2.0.1"
-    pretty-format "^23.0.1"
-
-jest-environment-jsdom@^22.4.1:
-  version "22.4.1"
-  resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-22.4.1.tgz#754f408872441740100d3917e5ec40c74de6447f"
-  dependencies:
-    jest-mock "^22.2.0"
-    jest-util "^22.4.1"
-    jsdom "^11.5.1"
+    pretty-format "^23.2.0"
 
-jest-environment-jsdom@^23.1.0:
-  version "23.1.0"
-  resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-23.1.0.tgz#85929914e23bed3577dac9755f4106d0697c479c"
+jest-environment-jsdom@^23.4.0:
+  version "23.4.0"
+  resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz#056a7952b3fea513ac62a140a2c368c79d9e6023"
   dependencies:
-    jest-mock "^23.1.0"
-    jest-util "^23.1.0"
+    jest-mock "^23.2.0"
+    jest-util "^23.4.0"
     jsdom "^11.5.1"
 
-jest-environment-node@^22.4.1:
-  version "22.4.1"
-  resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-22.4.1.tgz#418850eb654596b8d6e36c2021cbedbc23df8e16"
-  dependencies:
-    jest-mock "^22.2.0"
-    jest-util "^22.4.1"
-
-jest-environment-node@^23.1.0:
-  version "23.1.0"
-  resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-23.1.0.tgz#452c0bf949cfcbbacda1e1762eeed70bc784c7d5"
+jest-environment-node@^23.4.0:
+  version "23.4.0"
+  resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-23.4.0.tgz#57e80ed0841dea303167cce8cd79521debafde10"
   dependencies:
-    jest-mock "^23.1.0"
-    jest-util "^23.1.0"
+    jest-mock "^23.2.0"
+    jest-util "^23.4.0"
 
 jest-get-type@^22.1.0:
   version "22.1.0"
   resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.1.0.tgz#4e90af298ed6181edc85d2da500dbd2753e0d5a9"
 
-jest-haste-map@^23.1.0:
-  version "23.1.0"
-  resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-23.1.0.tgz#18e6c7d5a8d27136f91b7d9852f85de0c7074c49"
+jest-haste-map@^23.4.1:
+  version "23.4.1"
+  resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-23.4.1.tgz#43a174ba7ac079ae1dd74eaf5a5fe78989474dd2"
   dependencies:
     fb-watchman "^2.0.0"
     graceful-fs "^4.1.11"
-    jest-docblock "^23.0.1"
+    jest-docblock "^23.2.0"
     jest-serializer "^23.0.1"
-    jest-worker "^23.0.1"
+    jest-worker "^23.2.0"
     micromatch "^2.3.11"
     sane "^2.0.0"
 
-jest-jasmine2@^22.4.4:
-  version "22.4.4"
-  resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-22.4.4.tgz#c55f92c961a141f693f869f5f081a79a10d24e23"
+jest-jasmine2@^23.4.2:
+  version "23.4.2"
+  resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-23.4.2.tgz#2fbf52f93e43ed4c5e7326a90bb1d785be4321ac"
   dependencies:
+    babel-traverse "^6.0.0"
     chalk "^2.0.1"
     co "^4.6.0"
-    expect "^22.4.0"
-    graceful-fs "^4.1.11"
+    expect "^23.4.0"
     is-generator-fn "^1.0.0"
-    jest-diff "^22.4.0"
-    jest-matcher-utils "^22.4.0"
-    jest-message-util "^22.4.0"
-    jest-snapshot "^22.4.0"
-    jest-util "^22.4.1"
-    source-map-support "^0.5.0"
+    jest-diff "^23.2.0"
+    jest-each "^23.4.0"
+    jest-matcher-utils "^23.2.0"
+    jest-message-util "^23.4.0"
+    jest-snapshot "^23.4.2"
+    jest-util "^23.4.0"
+    pretty-format "^23.2.0"
 
-jest-jasmine2@^23.1.0:
-  version "23.1.0"
-  resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-23.1.0.tgz#4afab31729b654ddcd2b074add849396f13b30b8"
+jest-leak-detector@^23.2.0:
+  version "23.2.0"
+  resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-23.2.0.tgz#c289d961dc638f14357d4ef96e0431ecc1aa377d"
   dependencies:
-    chalk "^2.0.1"
-    co "^4.6.0"
-    expect "^23.1.0"
-    is-generator-fn "^1.0.0"
-    jest-diff "^23.0.1"
-    jest-each "^23.1.0"
-    jest-matcher-utils "^23.0.1"
-    jest-message-util "^23.1.0"
-    jest-snapshot "^23.0.1"
-    jest-util "^23.1.0"
-    pretty-format "^23.0.1"
-
-jest-leak-detector@^23.0.1:
-  version "23.0.1"
-  resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-23.0.1.tgz#9dba07505ac3495c39d3ec09ac1e564599e861a0"
-  dependencies:
-    pretty-format "^23.0.1"
-
-jest-matcher-utils@^22.4.0:
-  version "22.4.0"
-  resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-22.4.0.tgz#d55f5faf2270462736bdf7c7485ee931c9d4b6a1"
-  dependencies:
-    chalk "^2.0.1"
-    jest-get-type "^22.1.0"
-    pretty-format "^22.4.0"
+    pretty-format "^23.2.0"
 
-jest-matcher-utils@^23.0.1:
-  version "23.0.1"
-  resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-23.0.1.tgz#0c6c0daedf9833c2a7f36236069efecb4c3f6e5f"
+jest-matcher-utils@^23.2.0:
+  version "23.2.0"
+  resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-23.2.0.tgz#4d4981f23213e939e3cedf23dc34c747b5ae1913"
   dependencies:
     chalk "^2.0.1"
     jest-get-type "^22.1.0"
-    pretty-format "^23.0.1"
+    pretty-format "^23.2.0"
 
-jest-message-util@^22.4.0:
-  version "22.4.0"
-  resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-22.4.0.tgz#e3d861df16d2fee60cb2bc8feac2188a42579642"
+jest-message-util@^23.4.0:
+  version "23.4.0"
+  resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-23.4.0.tgz#17610c50942349508d01a3d1e0bda2c079086a9f"
   dependencies:
     "@babel/code-frame" "^7.0.0-beta.35"
     chalk "^2.0.1"
@@ -4267,75 +4130,50 @@ jest-message-util@^22.4.0:
     slash "^1.0.0"
     stack-utils "^1.0.1"
 
-jest-message-util@^23.1.0:
-  version "23.1.0"
-  resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-23.1.0.tgz#9a809ba487ecac5ce511d4e698ee3b5ee2461ea9"
-  dependencies:
-    "@babel/code-frame" "^7.0.0-beta.35"
-    chalk "^2.0.1"
-    micromatch "^2.3.11"
-    slash "^1.0.0"
-    stack-utils "^1.0.1"
-
-jest-mock@^22.2.0:
-  version "22.2.0"
-  resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-22.2.0.tgz#444b3f9488a7473adae09bc8a77294afded397a7"
-
-jest-mock@^23.1.0:
-  version "23.1.0"
-  resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-23.1.0.tgz#a381c31b121ab1f60c462a2dadb7b86dcccac487"
-
-jest-regex-util@^22.1.0:
-  version "22.1.0"
-  resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-22.1.0.tgz#5daf2fe270074b6da63e5d85f1c9acc866768f53"
+jest-mock@^23.2.0:
+  version "23.2.0"
+  resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-23.2.0.tgz#ad1c60f29e8719d47c26e1138098b6d18b261134"
 
-jest-regex-util@^23.0.0:
-  version "23.0.0"
-  resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-23.0.0.tgz#dd5c1fde0c46f4371314cf10f7a751a23f4e8f76"
+jest-regex-util@^23.3.0:
+  version "23.3.0"
+  resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-23.3.0.tgz#5f86729547c2785c4002ceaa8f849fe8ca471bc5"
 
-jest-resolve-dependencies@^23.0.1:
-  version "23.0.1"
-  resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-23.0.1.tgz#d01a10ddad9152c4cecdf5eac2b88571c4b6a64d"
+jest-resolve-dependencies@^23.4.2:
+  version "23.4.2"
+  resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-23.4.2.tgz#0675ba876a5b819deffc449ad72e9985c2592048"
   dependencies:
-    jest-regex-util "^23.0.0"
-    jest-snapshot "^23.0.1"
-
-jest-resolve@^22.4.2:
-  version "22.4.2"
-  resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-22.4.2.tgz#25d88aa4147462c9c1c6a1ba16250d3794c24d00"
-  dependencies:
-    browser-resolve "^1.11.2"
-    chalk "^2.0.1"
+    jest-regex-util "^23.3.0"
+    jest-snapshot "^23.4.2"
 
-jest-resolve@^23.1.0:
-  version "23.1.0"
-  resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-23.1.0.tgz#b9e316eecebd6f00bc50a3960d1527bae65792d2"
+jest-resolve@^23.4.1:
+  version "23.4.1"
+  resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-23.4.1.tgz#7f3c17104732a2c0c940a01256025ed745814982"
   dependencies:
-    browser-resolve "^1.11.2"
+    browser-resolve "^1.11.3"
     chalk "^2.0.1"
     realpath-native "^1.0.0"
 
-jest-runner@^23.1.0:
-  version "23.1.0"
-  resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-23.1.0.tgz#fa20a933fff731a5432b3561e7f6426594fa29b5"
+jest-runner@^23.4.2:
+  version "23.4.2"
+  resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-23.4.2.tgz#579a88524ac52c846075b0129a21c7b483e75a7e"
   dependencies:
     exit "^0.1.2"
     graceful-fs "^4.1.11"
-    jest-config "^23.1.0"
-    jest-docblock "^23.0.1"
-    jest-haste-map "^23.1.0"
-    jest-jasmine2 "^23.1.0"
-    jest-leak-detector "^23.0.1"
-    jest-message-util "^23.1.0"
-    jest-runtime "^23.1.0"
-    jest-util "^23.1.0"
-    jest-worker "^23.0.1"
+    jest-config "^23.4.2"
+    jest-docblock "^23.2.0"
+    jest-haste-map "^23.4.1"
+    jest-jasmine2 "^23.4.2"
+    jest-leak-detector "^23.2.0"
+    jest-message-util "^23.4.0"
+    jest-runtime "^23.4.2"
+    jest-util "^23.4.0"
+    jest-worker "^23.2.0"
     source-map-support "^0.5.6"
     throat "^4.0.0"
 
-jest-runtime@^23.1.0:
-  version "23.1.0"
-  resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-23.1.0.tgz#b4ae0e87259ecacfd4a884b639db07cf4dd620af"
+jest-runtime@^23.4.2:
+  version "23.4.2"
+  resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-23.4.2.tgz#00c3bb8385253d401a394a27d1112d3615e5a65c"
   dependencies:
     babel-core "^6.0.0"
     babel-plugin-istanbul "^4.1.6"
@@ -4344,14 +4182,14 @@ jest-runtime@^23.1.0:
     exit "^0.1.2"
     fast-json-stable-stringify "^2.0.0"
     graceful-fs "^4.1.11"
-    jest-config "^23.1.0"
-    jest-haste-map "^23.1.0"
-    jest-message-util "^23.1.0"
-    jest-regex-util "^23.0.0"
-    jest-resolve "^23.1.0"
-    jest-snapshot "^23.0.1"
-    jest-util "^23.1.0"
-    jest-validate "^23.0.1"
+    jest-config "^23.4.2"
+    jest-haste-map "^23.4.1"
+    jest-message-util "^23.4.0"
+    jest-regex-util "^23.3.0"
+    jest-resolve "^23.4.1"
+    jest-snapshot "^23.4.2"
+    jest-util "^23.4.0"
+    jest-validate "^23.4.0"
     micromatch "^2.3.11"
     realpath-native "^1.0.0"
     slash "^1.0.0"
@@ -4363,92 +4201,63 @@ jest-serializer@^23.0.1:
   version "23.0.1"
   resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-23.0.1.tgz#a3776aeb311e90fe83fab9e533e85102bd164165"
 
-jest-snapshot@^22.4.0:
-  version "22.4.0"
-  resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-22.4.0.tgz#03d3ce63f8fa7352388afc6a3c8b5ccc3a180ed7"
+jest-snapshot@^23.4.2:
+  version "23.4.2"
+  resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-23.4.2.tgz#8fa6130feb5a527dac73e5fa80d86f29f7c42ab6"
   dependencies:
+    babel-types "^6.0.0"
     chalk "^2.0.1"
-    jest-diff "^22.4.0"
-    jest-matcher-utils "^22.4.0"
+    jest-diff "^23.2.0"
+    jest-matcher-utils "^23.2.0"
+    jest-message-util "^23.4.0"
+    jest-resolve "^23.4.1"
     mkdirp "^0.5.1"
     natural-compare "^1.4.0"
-    pretty-format "^22.4.0"
+    pretty-format "^23.2.0"
+    semver "^5.5.0"
 
-jest-snapshot@^23.0.1:
-  version "23.0.1"
-  resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-23.0.1.tgz#6674fa19b9eb69a99cabecd415bddc42d6af3e7e"
-  dependencies:
-    chalk "^2.0.1"
-    jest-diff "^23.0.1"
-    jest-matcher-utils "^23.0.1"
-    mkdirp "^0.5.1"
-    natural-compare "^1.4.0"
-    pretty-format "^23.0.1"
-
-jest-util@^22.4.1:
-  version "22.4.1"
-  resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-22.4.1.tgz#dd17c3bdb067f8e90591563ec0c42bf847dc249f"
+jest-util@^23.4.0:
+  version "23.4.0"
+  resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-23.4.0.tgz#4d063cb927baf0a23831ff61bec2cbbf49793561"
   dependencies:
     callsites "^2.0.0"
     chalk "^2.0.1"
     graceful-fs "^4.1.11"
     is-ci "^1.0.10"
-    jest-message-util "^22.4.0"
-    mkdirp "^0.5.1"
-    source-map "^0.6.0"
-
-jest-util@^23.1.0:
-  version "23.1.0"
-  resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-23.1.0.tgz#c0251baf34644c6dd2fea78a962f4263ac55772d"
-  dependencies:
-    callsites "^2.0.0"
-    chalk "^2.0.1"
-    graceful-fs "^4.1.11"
-    is-ci "^1.0.10"
-    jest-message-util "^23.1.0"
+    jest-message-util "^23.4.0"
     mkdirp "^0.5.1"
     slash "^1.0.0"
     source-map "^0.6.0"
 
-jest-validate@^22.4.4:
-  version "22.4.4"
-  resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-22.4.4.tgz#1dd0b616ef46c995de61810d85f57119dbbcec4d"
-  dependencies:
-    chalk "^2.0.1"
-    jest-config "^22.4.4"
-    jest-get-type "^22.1.0"
-    leven "^2.1.0"
-    pretty-format "^22.4.0"
-
-jest-validate@^23.0.1:
-  version "23.0.1"
-  resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-23.0.1.tgz#cd9f01a89d26bb885f12a8667715e9c865a5754f"
+jest-validate@^23.4.0:
+  version "23.4.0"
+  resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-23.4.0.tgz#d96eede01ef03ac909c009e9c8e455197d48c201"
   dependencies:
     chalk "^2.0.1"
     jest-get-type "^22.1.0"
     leven "^2.1.0"
-    pretty-format "^23.0.1"
+    pretty-format "^23.2.0"
 
-jest-watcher@^23.1.0:
-  version "23.1.0"
-  resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-23.1.0.tgz#a8d5842e38d9fb4afff823df6abb42a58ae6cdbd"
+jest-watcher@^23.4.0:
+  version "23.4.0"
+  resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-23.4.0.tgz#d2e28ce74f8dad6c6afc922b92cabef6ed05c91c"
   dependencies:
     ansi-escapes "^3.0.0"
     chalk "^2.0.1"
     string-length "^2.0.0"
 
-jest-worker@^23.0.1:
-  version "23.0.1"
-  resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-23.0.1.tgz#9e649dd963ff4046026f91c4017f039a6aa4a7bc"
+jest-worker@^23.2.0:
+  version "23.2.0"
+  resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-23.2.0.tgz#faf706a8da36fae60eb26957257fa7b5d8ea02b9"
   dependencies:
     merge-stream "^1.0.1"
 
-jest@23.1.0:
-  version "23.1.0"
-  resolved "https://registry.yarnpkg.com/jest/-/jest-23.1.0.tgz#bbb7f893100a11a742dd8bd0d047a54b0968ad1a"
+jest@23.4.2:
+  version "23.4.2"
+  resolved "https://registry.yarnpkg.com/jest/-/jest-23.4.2.tgz#1fae3ed832192143070ae85156b25cea891a1260"
   dependencies:
     import-local "^1.0.0"
-    jest-cli "^23.1.0"
+    jest-cli "^23.4.2"
 
 js-base64@^2.1.9:
   version "2.4.3"
@@ -4594,6 +4403,10 @@ kind-of@^6.0.0, kind-of@^6.0.2:
   version "6.0.2"
   resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
 
+kleur@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/kleur/-/kleur-2.0.1.tgz#7cc64b0d188d0dcbc98bdcdfdda2cc10619ddce8"
+
 lazy-cache@^1.0.3:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
@@ -4926,7 +4739,7 @@ minimist@0.0.8:
   version "0.0.8"
   resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
 
-minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0:
+minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
 
@@ -5884,9 +5697,9 @@ preserve@^0.2.0:
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
 
-prettier@1.11.1:
-  version "1.11.1"
-  resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.11.1.tgz#61e43fc4cd44e68f2b0dfc2c38cd4bb0fccdcc75"
+prettier@1.14.0:
+  version "1.14.0"
+  resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.14.0.tgz#847c235522035fd988100f1f43cf20a7d24f9372"
 
 pretty-error@^2.0.2:
   version "2.1.1"
@@ -5895,21 +5708,14 @@ pretty-error@^2.0.2:
     renderkid "^2.0.1"
     utila "~0.4"
 
-pretty-format@^22.4.0:
-  version "22.4.0"
-  resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-22.4.0.tgz#237b1f7e1c50ed03bc65c03ccc29d7c8bb7beb94"
-  dependencies:
-    ansi-regex "^3.0.0"
-    ansi-styles "^3.2.0"
-
-pretty-format@^23.0.1:
-  version "23.0.1"
-  resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.0.1.tgz#d61d065268e4c759083bccbca27a01ad7c7601f4"
+pretty-format@^23.2.0:
+  version "23.2.0"
+  resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.2.0.tgz#3b0aaa63c018a53583373c1cb3a5d96cc5e83017"
   dependencies:
     ansi-regex "^3.0.0"
     ansi-styles "^3.2.0"
 
-private@^0.1.6, private@^0.1.7, private@^0.1.8:
+private@^0.1.6, private@^0.1.7:
   version "0.1.8"
   resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
 
@@ -5935,6 +5741,13 @@ promise@^7.1.1:
   dependencies:
     asap "~2.0.3"
 
+prompts@^0.1.9:
+  version "0.1.14"
+  resolved "https://registry.yarnpkg.com/prompts/-/prompts-0.1.14.tgz#a8e15c612c5c9ec8f8111847df3337c9cbd443b2"
+  dependencies:
+    kleur "^2.0.1"
+    sisteransi "^0.1.1"
+
 prop-types@^15.6.0:
   version "15.6.1"
   resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca"
@@ -6136,9 +5949,9 @@ react-dev-utils@^3.0.0:
     strip-ansi "3.0.1"
     text-table "0.2.0"
 
-react-dom@16.2.0:
-  version "16.2.0"
-  resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.2.0.tgz#69003178601c0ca19b709b33a83369fe6124c044"
+react-dom@16.4.2:
+  version "16.4.2"
+  resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.4.2.tgz#4afed569689f2c561d2b8da0b819669c38a0bda4"
   dependencies:
     fbjs "^0.8.16"
     loose-envify "^1.1.0"
@@ -6160,6 +5973,10 @@ react-error-overlay@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-4.0.0.tgz#d198408a85b4070937a98667f500c832f86bd5d4"
 
+react-is@^16.4.2:
+  version "16.4.2"
+  resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.4.2.tgz#84891b56c2b6d9efdee577cc83501dfc5ecead88"
+
 react-reconciler@^0.7.0:
   version "0.7.0"
   resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.7.0.tgz#9614894103e5f138deeeb5eabaf3ee80eb1d026d"
@@ -6169,7 +5986,16 @@ react-reconciler@^0.7.0:
     object-assign "^4.1.1"
     prop-types "^15.6.0"
 
-react-test-renderer@16.2.0, react-test-renderer@^16.0.0-0:
+react-test-renderer@16.4.2:
+  version "16.4.2"
+  resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.4.2.tgz#4e03eca9359bb3210d4373f7547d1364218ef74e"
+  dependencies:
+    fbjs "^0.8.16"
+    object-assign "^4.1.1"
+    prop-types "^15.6.0"
+    react-is "^16.4.2"
+
+react-test-renderer@^16.0.0-0:
   version "16.2.0"
   resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.2.0.tgz#bddf259a6b8fcd8555f012afc8eacc238872a211"
   dependencies:
@@ -6177,9 +6003,9 @@ react-test-renderer@16.2.0, react-test-renderer@^16.0.0-0:
     object-assign "^4.1.1"
     prop-types "^15.6.0"
 
-react@16.2.0:
-  version "16.2.0"
-  resolved "https://registry.yarnpkg.com/react/-/react-16.2.0.tgz#a31bd2dab89bff65d42134fa187f24d054c273ba"
+react@16.4.2:
+  version "16.4.2"
+  resolved "https://registry.yarnpkg.com/react/-/react-16.4.2.tgz#2cd90154e3a9d9dd8da2991149fdca3c260e129f"
   dependencies:
     fbjs "^0.8.16"
     loose-envify "^1.1.0"
@@ -6505,7 +6331,7 @@ resolve@1.1.7:
   version "1.1.7"
   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
 
-resolve@^1.1.7, resolve@^1.5.0:
+resolve@^1.5.0:
   version "1.5.0"
   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36"
   dependencies:
@@ -6621,7 +6447,7 @@ selfsigned@^1.9.1:
   dependencies:
     node-forge "0.7.1"
 
-"semver@2 || 3 || 4 || 5", semver@5.5.0, semver@^5.0.1, semver@^5.3.0, semver@^5.4.1:
+"semver@2 || 3 || 4 || 5", semver@5.5.0, semver@^5.0.1, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0:
   version "5.5.0"
   resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
 
@@ -6733,7 +6559,7 @@ shebang-regex@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
 
-shell-quote@1.6.1, shell-quote@^1.6.1:
+shell-quote@1.6.1:
   version "1.6.1"
   resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767"
   dependencies:
@@ -6750,6 +6576,10 @@ signal-exit@^3.0.0, signal-exit@^3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
 
+sisteransi@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-0.1.1.tgz#5431447d5f7d1675aac667ccd0b865a4994cb3ce"
+
 slash@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
@@ -6843,13 +6673,7 @@ source-map-support@^0.4.15:
   dependencies:
     source-map "^0.5.6"
 
-source-map-support@^0.5.0:
-  version "0.5.3"
-  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.3.tgz#2b3d5fff298cfa4d1afd7d4352d569e9a0158e76"
-  dependencies:
-    source-map "^0.6.0"
-
-source-map-support@^0.5.5, source-map-support@^0.5.6:
+source-map-support@^0.5.6:
   version "0.5.6"
   resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13"
   dependencies:
@@ -7089,12 +6913,6 @@ style-loader@0.20.3:
     loader-utils "^1.1.0"
     schema-utils "^0.4.5"
 
-subarg@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2"
-  dependencies:
-    minimist "^1.1.0"
-
 supports-color@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
@@ -7274,21 +7092,13 @@ tryer@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.0.tgz#027b69fa823225e551cace3ef03b11f6ab37c1d7"
 
-ts-jest@22.4.6:
-  version "22.4.6"
-  resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-22.4.6.tgz#a5d7f5e8b809626d1f4143209d301287472ec344"
+ts-jest@23.1.3:
+  version "23.1.3"
+  resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-23.1.3.tgz#33e3187d3ef0d42adada6347acf2c3539ac56107"
   dependencies:
-    babel-core "^6.26.3"
-    babel-plugin-istanbul "^4.1.6"
-    babel-plugin-transform-es2015-modules-commonjs "^6.26.2"
-    babel-preset-jest "^22.4.3"
-    cpx "^1.5.0"
-    fs-extra "6.0.0"
-    jest-config "^22.4.3"
+    closest-file-data "^0.1.4"
+    fs-extra "6.0.1"
     lodash "^4.17.10"
-    pkg-dir "^2.0.0"
-    source-map-support "^0.5.5"
-    yargs "^11.0.0"
 
 ts-loader@4.3.0:
   version "4.3.0"
@@ -7331,16 +7141,16 @@ typedarray@^0.0.6:
   version "0.0.6"
   resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
 
-typescript-eslint-parser@15.0.0:
-  version "15.0.0"
-  resolved "https://registry.yarnpkg.com/typescript-eslint-parser/-/typescript-eslint-parser-15.0.0.tgz#882fd3d7aabffbab0a7f98d2a59fb9a989c2b37f"
+typescript-eslint-parser@18.0.0:
+  version "18.0.0"
+  resolved "https://registry.yarnpkg.com/typescript-eslint-parser/-/typescript-eslint-parser-18.0.0.tgz#3e5055a44980d69e4154350fc5d8b1ab4e2332a8"
   dependencies:
     lodash.unescape "4.0.1"
     semver "5.5.0"
 
-typescript@2.8.4:
-  version "2.8.4"
-  resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.4.tgz#0b1db68e6bdfb0b767fa2ab642136a35b059b199"
+typescript@3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.0.1.tgz#43738f29585d3a87575520a4b93ab6026ef11fdb"
 
 ua-parser-js@^0.7.9:
   version "0.7.17"
index 2beb6e05efa79b934f64370e55c66ab580918e54..9de26ad2a066dc8a03bd791938ff0ecb983966e4 100644 (file)
@@ -73,7 +73,6 @@
   ],
   "plugins": [
     "transform-class-properties",
-    // use built-in `Object.assign`
     ["transform-object-rest-spread", { "useBuiltIns": true }],
     "lodash"
   ],
index ee259345ce1a02d6be1d3c09fddeb03f776df32e..a86bbb5212bc1822b2778b79ab508594a91de31d 100644 (file)
@@ -2,6 +2,7 @@
   "extends": "sonarqube",
 
   "rules": {
-    "import/extensions": ["error", "never", { "json": "always", "md": "always" }]
+    "import/extensions": ["error", "never", { "json": "always", "md": "always" }],
+    "jsx-a11y/accessible-emoji": "off"
   }
 }
index a65e68ff7f985744cf2c09adec8a23b928634352..1ff33ce42dab5198942580dab1e5e21bf016b58f 100644 (file)
@@ -24,9 +24,9 @@
     "lunr": "2.3.0",
     "mdast-util-toc": "2.0.1",
     "prop-types": "15.6.1",
-    "react": "16.2.0",
+    "react": "16.4.2",
     "react-day-picker": "7.1.8",
-    "react-dom": "16.2.0",
+    "react-dom": "16.4.2",
     "react-draggable": "3.0.5",
     "react-ga": "2.5.3",
     "react-helmet": "5.2.0",
@@ -40,9 +40,9 @@
     "redux-logger": "3.0.6",
     "redux-thunk": "2.2.0",
     "remark-custom-blocks": "2.2.0",
+    "remark-slug": "5.0.0",
     "remark-toc": "5.0.0",
     "unist-util-visit": "1.3.1",
-    "remark-slug": "5.0.0",
     "whatwg-fetch": "2.0.4"
   },
   "devDependencies": {
     "@types/d3-shape": "1.2.2",
     "@types/d3-zoom": "1.7.1",
     "@types/enzyme": "3.1.10",
-    "@types/jest": "22.2.3",
+    "@types/jest": "23.3.1",
     "@types/keymaster": "1.6.28",
     "@types/lodash": "4.14.108",
-    "@types/prop-types": "15.5.2",
-    "@types/react": "16.0.29",
-    "@types/react-dom": "16.0.3",
+    "@types/prop-types": "15.5.4",
+    "@types/react": "16.4.8",
+    "@types/react-dom": "16.0.7",
     "@types/react-helmet": "5.0.6",
     "@types/react-intl": "2.3.8",
     "@types/react-modal": "3.1.2",
-    "@types/react-redux": "5.0.12",
+    "@types/react-redux": "6.0.6",
     "@types/react-router": "3.0.13",
     "@types/react-select": "1.2.6",
     "@types/react-virtualized": "9.18.3",
     "autoprefixer": "8.4.1",
     "babel-core": "6.26.3",
-    "babel-jest": "23.0.1",
+    "babel-jest": "23.4.2",
     "babel-loader": "7.1.4",
     "babel-plugin-dynamic-import-node": "1.2.0",
     "babel-plugin-lodash": "3.3.2",
     "glob": "7.1.2",
     "glob-promise": "3.4.0",
     "html-webpack-plugin": "3.2.0",
-    "jest": "23.1.0",
+    "jest": "23.4.2",
     "lint-staged": "4.3.0",
     "lodash-webpack-plugin": "0.11.5",
     "mini-css-extract-plugin": "0.4.0",
     "postcss-calc": "6.0.1",
     "postcss-custom-properties": "6.2.0",
     "postcss-loader": "2.1.5",
-    "prettier": "1.11.1",
+    "prettier": "1.14.0",
     "raw-loader": "0.5.1",
     "react-dev-utils": "5.0.1",
     "react-error-overlay": "1.0.7",
-    "react-test-renderer": "16.2.0",
+    "react-test-renderer": "16.4.2",
     "remark": "9.0.0",
     "remark-react": "4.0.3",
     "style-loader": "0.21.0",
-    "ts-jest": "22.4.6",
+    "ts-jest": "23.1.3",
     "ts-loader": "4.3.0",
-    "typescript": "2.8.3",
-    "typescript-eslint-parser": "15.0.0",
+    "typescript": "3.0.1",
+    "typescript-eslint-parser": "18.0.0",
     "webpack": "4.15.1",
     "webpack-bundle-analyzer": "2.11.2",
     "webpack-dev-server": "3.1.4"
     ],
     "testRegex": "(/__tests__/.*|\\-test)\\.(ts|tsx|js)$",
     "transform": {
-      "^.+\\.js$": "<rootDir>/node_modules/babel-jest",
-      ".(ts|tsx)$": "<rootDir>/node_modules/ts-jest/preprocessor.js"
+      "\\.js$": "babel-jest",
+      "\\.(ts|tsx)$": "ts-jest"
     }
   },
   "prettier": {
index c6440c317e027360179606744cc44d72dcd09c06..4a14a53d0d7d2c9870eb109350e4807ae9b00df5 100644 (file)
@@ -104,6 +104,7 @@ const mapDispatchToProps: DispatchToProps = {
   setAdminPages
 };
 
-export default connect<StateProps, DispatchToProps, OwnProps>(mapStateToProps, mapDispatchToProps)(
-  AdminContainer
-);
+export default connect<StateProps, DispatchToProps, OwnProps>(
+  mapStateToProps,
+  mapDispatchToProps
+)(AdminContainer);
index dca11f0b8ebb1fdefebe8095e15197296d26ebd0..23211fbae33ee3500fca600572ed33c625b2d139 100644 (file)
@@ -100,4 +100,7 @@ const mapDispatchToProps = ({
   fetchMyOrganizations
 } as any) as DispatchProps;
 
-export default connect(mapStateToProps, mapDispatchToProps)(App);
+export default connect(
+  mapStateToProps,
+  mapDispatchToProps
+)(App);
index 176a21d06ac03faabbf99a05d98a3bf2bb0736be..00e376c5dfc8b1f299d395fa778b0e4b3206d3a8 100644 (file)
@@ -244,9 +244,15 @@ export class ComponentContainer extends React.PureComponent<Props, State> {
     return !task.branch && !task.pullRequest;
   };
 
-  handleComponentChange = (changes: {}) => {
+  handleComponentChange = (changes: Partial<Component>) => {
     if (this.mounted) {
-      this.setState(state => ({ component: { ...state.component, ...changes } }));
+      this.setState(state => {
+        if (state.component) {
+          const newComponent: Component = { ...state.component, ...changes };
+          return { component: newComponent };
+        }
+        return null;
+      });
     }
   };
 
@@ -309,4 +315,7 @@ export class ComponentContainer extends React.PureComponent<Props, State> {
 
 const mapDispatchToProps = { fetchOrganizations };
 
-export default connect<any, any, any>(null, mapDispatchToProps)(ComponentContainer);
+export default connect<any, any, any>(
+  null,
+  mapDispatchToProps
+)(ComponentContainer);
index 8ce14f4c343e22fa6bc6981a1b08290446f5bd67..8f1f47e880d54f9eec67364b4d723fbce3a39d1b 100644 (file)
@@ -30,7 +30,8 @@ export default function GlobalFooterBranding() {
       but is <strong>not</strong> an official version provided by{' '}
       <a href="http://www.sonarsource.com" title="SonarSource SA">
         SonarSource SA
-      </a>.
+      </a>
+      .
     </div>
   );
 }
diff --git a/server/sonar-web/src/main/js/app/components/GlobalMessagesContainer.js b/server/sonar-web/src/main/js/app/components/GlobalMessagesContainer.js
deleted file mode 100644 (file)
index f159a48..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2018 SonarSource SA
- * mailto:info 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 { connect } from 'react-redux';
-import GlobalMessages from '../../components/controls/GlobalMessages';
-import { getGlobalMessages } from '../../store/rootReducer';
-import { closeGlobalMessage } from '../../store/globalMessages/duck';
-
-const mapStateToProps = state => ({
-  messages: getGlobalMessages(state)
-});
-
-const mapDispatchToProps = { closeGlobalMessage };
-
-export default connect(mapStateToProps, mapDispatchToProps)(GlobalMessages);
diff --git a/server/sonar-web/src/main/js/app/components/GlobalMessagesContainer.tsx b/server/sonar-web/src/main/js/app/components/GlobalMessagesContainer.tsx
new file mode 100644 (file)
index 0000000..d836670
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2018 SonarSource SA
+ * mailto:info 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 { connect } from 'react-redux';
+import GlobalMessages from '../../components/controls/GlobalMessages';
+import { getGlobalMessages } from '../../store/rootReducer';
+import { closeGlobalMessage } from '../../store/globalMessages/duck';
+
+const mapStateToProps = (state: any) => ({
+  messages: getGlobalMessages(state)
+});
+
+const mapDispatchToProps = { closeGlobalMessage };
+
+export default connect(
+  mapStateToProps,
+  mapDispatchToProps
+)(GlobalMessages);
index 1a2c67397c7eeb45373c061b863ffd204ae27de4..f4b957da4f02866daaa6c8854151a011399de28c 100644 (file)
@@ -54,8 +54,8 @@ export default function MarkdownHelp() {
           </tr>
           <tr>
             <td className="text-top">
-              * first item<br />
-              * second item
+              * first item
+              <br />* second item
             </td>
             <td className="markdown">
               <ul>
@@ -66,7 +66,8 @@ export default function MarkdownHelp() {
           </tr>
           <tr>
             <td className="text-top">
-              1. first item<br />
+              1. first item
+              <br />
               1. second item
             </td>
             <td className="markdown text-top">
@@ -102,11 +103,15 @@ export default function MarkdownHelp() {
           </tr>
           <tr>
             <td className="text-top">
-              ``<br />
-              // code on multiple lines<br />
+              ``
+              {/* eslint-disable-next-line react/jsx-no-comment-textnodes */}
+              <br />
+              // code on multiple lines
+              <br />
               {'public void foo() {'}
               <br />
-              &nbsp;&nbsp;{'// do some logic here'}
+              &nbsp;&nbsp;
+              {'// do some logic here'}
               <br />
               {'}'}
               <br />
@@ -120,15 +125,20 @@ export default function MarkdownHelp() {
           </tr>
           <tr>
             <td className="text-top">
-              Standard text<br />
-              &gt; Blockquoted text<br />
-              &gt; that spans multiple lines<br />
+              Standard text
+              <br />
+              &gt; Blockquoted text
+              <br />
+              &gt; that spans multiple lines
+              <br />
             </td>
             <td className="markdown text-top">
               <p>Standard text</p>
               <blockquote>
-                Blockquoted text<br />
-                that spans multiple lines<br />
+                Blockquoted text
+                <br />
+                that spans multiple lines
+                <br />
               </blockquote>
             </td>
           </tr>
index 7930a9b7f214fce93fb8918cf279ccc04afb7dd2..9383ec2539e9e75c1fb96ac2a76eb532444b3020 100644 (file)
@@ -106,7 +106,7 @@ export class StartupModal extends React.PureComponent<Props, State> {
         this.props.skipOnboardingAction();
         return { automatic: false, modal: undefined };
       }
-      return undefined;
+      return null;
     });
   };
 
@@ -115,7 +115,7 @@ export class StartupModal extends React.PureComponent<Props, State> {
       if (state.modal === ModalKey.license) {
         return { automatic: false, modal: undefined };
       }
-      return undefined;
+      return null;
     });
   };
 
@@ -223,6 +223,7 @@ const mapStateToProps = (state: any): StateProps => ({
 
 const mapDispatchToProps: DispatchProps = { skipOnboardingAction };
 
-export default connect<StateProps, DispatchProps, OwnProps>(mapStateToProps, mapDispatchToProps)(
-  StartupModal
-);
+export default connect<StateProps, DispatchProps, OwnProps>(
+  mapStateToProps,
+  mapDispatchToProps
+)(StartupModal);
index 21cf0bd5bed91e42ef886af10c0e27b4e178e99a..909c6a5d1d43c20df77c082545c8050d0852e6d2 100644 (file)
@@ -20,7 +20,7 @@
 import * as React from 'react';
 import * as PropTypes from 'prop-types';
 // eslint-disable-next-line import/no-extraneous-dependencies
-import suggestionsJson from 'Docs/EmbedDocsSuggestions.json';
+import * as suggestionsJson from 'Docs/EmbedDocsSuggestions.json';
 import { SuggestionsContext } from './SuggestionsContext';
 import { isSonarCloud } from '../../../helpers/system';
 
index c7ca9442a890076d1feb21cf523f15d20d1105e4..2092c80a14db426a2b529f63bddfd25a23c752c8 100644 (file)
@@ -25,10 +25,8 @@ import { isSonarCloud } from '../../../../helpers/system';
 jest.mock(
   'Docs/EmbedDocsSuggestions.json',
   () => ({
-    default: {
-      pageA: [{ link: '/foo', text: 'Foo' }, { link: '/bar', text: 'Bar', scope: 'sonarcloud' }],
-      pageB: [{ link: '/qux', text: 'Qux' }]
-    }
+    pageA: [{ link: '/foo', text: 'Foo' }, { link: '/bar', text: 'Bar', scope: 'sonarcloud' }],
+    pageB: [{ link: '/qux', text: 'Qux' }]
   }),
   { virtual: true }
 );
index e24cb825b9bdd110e3d63733547d3bbd597fa7bc..c3c56057669f06d6e7ac316a73972c9f1f66e5b9 100644 (file)
@@ -28,4 +28,7 @@ const mapStateToProps = (state: any) => ({
 
 const mapDispatchToProps = { onFail: addGlobalErrorMessage };
 
-export default connect<any, any, any>(mapStateToProps, mapDispatchToProps)(Extension);
+export default connect<any, any, any>(
+  mapStateToProps,
+  mapDispatchToProps
+)(Extension);
index d5875a4f851b6711992798b3465256bc3bb3f7df..c38e996c2a38476ac31af62141803b104a328ab8 100644 (file)
@@ -80,6 +80,7 @@ const mapStateToProps = (state: any, ownProps: OwnProps) => ({
 
 const mapDispatchToProps = { fetchOrganization };
 
-export default connect<StateToProps, DispatchProps, OwnProps>(mapStateToProps, mapDispatchToProps)(
-  OrganizationPageExtension
-);
+export default connect<StateToProps, DispatchProps, OwnProps>(
+  mapStateToProps,
+  mapDispatchToProps
+)(OrganizationPageExtension);
index 1c584fc30ee9b6dfb714f44cf2b2da5bafe99c4e..45c7a677a18b0b23dee3ccd95cbe597df059a959 100644 (file)
@@ -54,4 +54,7 @@ function ProjectAdminPageExtension(props /*: Props */) {
 
 const mapDispatchToProps = { onFail: addGlobalErrorMessage };
 
-export default connect(null, mapDispatchToProps)(ProjectAdminPageExtension);
+export default connect(
+  null,
+  mapDispatchToProps
+)(ProjectAdminPageExtension);
index 1accbd77863a44e3ae37c6c23115256735dd4acb..31983bc39135cbb19733bf050dff86980fe57aaf 100644 (file)
@@ -109,7 +109,7 @@ export default class ComponentNavMenu extends React.PureComponent<Props> {
 
     return (
       <li>
-        <Link to={{ pathname: '/code', query: this.getQuery() }} activeClassName="active">
+        <Link activeClassName="active" to={{ pathname: '/code', query: this.getQuery() }}>
           {this.isPortfolio() || this.isApplication()
             ? translate('view_projects.page')
             : translate('code.page')}
@@ -128,8 +128,8 @@ export default class ComponentNavMenu extends React.PureComponent<Props> {
     return (
       <li>
         <Link
-          to={{ pathname: '/project/activity', query: this.getQuery() }}
-          activeClassName="active">
+          activeClassName="active"
+          to={{ pathname: '/project/activity', query: this.getQuery() }}>
           {translate('project_activity.page')}
         </Link>
       </li>
@@ -161,8 +161,8 @@ export default class ComponentNavMenu extends React.PureComponent<Props> {
     return (
       <li>
         <Link
-          to={{ pathname: '/component_measures', query: this.getQuery() }}
-          activeClassName="active">
+          activeClassName="active"
+          to={{ pathname: '/component_measures', query: this.getQuery() }}>
           {translate('layout.measures')}
         </Link>
       </li>
@@ -206,7 +206,7 @@ export default class ComponentNavMenu extends React.PureComponent<Props> {
       <Dropdown overlay={this.renderSecurityReportsLink()} tagName="li">
         {({ onToggleClick, open }) => (
           <a
-            aria-expanded={String(open)}
+            aria-expanded={open}
             aria-haspopup="true"
             className={classNames('dropdown-toggle', { active: isActive || open })}
             href="#"
@@ -240,7 +240,7 @@ export default class ComponentNavMenu extends React.PureComponent<Props> {
         tagName="li">
         {({ onToggleClick, open }) => (
           <a
-            aria-expanded={String(open)}
+            aria-expanded={open}
             aria-haspopup="true"
             className={classNames('dropdown-toggle', { active: isSettingsActive || open })}
             href="#"
@@ -278,8 +278,8 @@ export default class ComponentNavMenu extends React.PureComponent<Props> {
     return (
       <li key="settings">
         <Link
-          to={{ pathname: '/project/settings', query: this.getQuery() }}
-          activeClassName="active">
+          activeClassName="active"
+          to={{ pathname: '/project/settings', query: this.getQuery() }}>
           {translate('project_settings.page')}
         </Link>
       </li>
@@ -298,8 +298,8 @@ export default class ComponentNavMenu extends React.PureComponent<Props> {
     return (
       <li key="branches">
         <Link
-          to={{ pathname: '/project/branches', query: { id: this.props.component.key } }}
-          activeClassName="active">
+          activeClassName="active"
+          to={{ pathname: '/project/branches', query: { id: this.props.component.key } }}>
           {translate('project_branches.page')}
         </Link>
       </li>
@@ -313,8 +313,8 @@ export default class ComponentNavMenu extends React.PureComponent<Props> {
     return (
       <li key="profiles">
         <Link
-          to={{ pathname: '/project/quality_profiles', query: { id: this.props.component.key } }}
-          activeClassName="active">
+          activeClassName="active"
+          to={{ pathname: '/project/quality_profiles', query: { id: this.props.component.key } }}>
           {translate('project_quality_profiles.page')}
         </Link>
       </li>
@@ -328,8 +328,8 @@ export default class ComponentNavMenu extends React.PureComponent<Props> {
     return (
       <li key="quality_gate">
         <Link
-          to={{ pathname: '/project/quality_gate', query: { id: this.props.component.key } }}
-          activeClassName="active">
+          activeClassName="active"
+          to={{ pathname: '/project/quality_gate', query: { id: this.props.component.key } }}>
           {translate('project_quality_gate.page')}
         </Link>
       </li>
@@ -343,8 +343,8 @@ export default class ComponentNavMenu extends React.PureComponent<Props> {
     return (
       <li key="custom_measures">
         <Link
-          to={{ pathname: '/custom_measures', query: { id: this.props.component.key } }}
-          activeClassName="active">
+          activeClassName="active"
+          to={{ pathname: '/custom_measures', query: { id: this.props.component.key } }}>
           {translate('custom_measures.page')}
         </Link>
       </li>
@@ -358,8 +358,8 @@ export default class ComponentNavMenu extends React.PureComponent<Props> {
     return (
       <li key="links">
         <Link
-          to={{ pathname: '/project/links', query: { id: this.props.component.key } }}
-          activeClassName="active">
+          activeClassName="active"
+          to={{ pathname: '/project/links', query: { id: this.props.component.key } }}>
           {translate('project_links.page')}
         </Link>
       </li>
@@ -373,8 +373,8 @@ export default class ComponentNavMenu extends React.PureComponent<Props> {
     return (
       <li key="permissions">
         <Link
-          to={{ pathname: '/project_roles', query: { id: this.props.component.key } }}
-          activeClassName="active">
+          activeClassName="active"
+          to={{ pathname: '/project_roles', query: { id: this.props.component.key } }}>
           {translate('permissions.page')}
         </Link>
       </li>
@@ -388,8 +388,8 @@ export default class ComponentNavMenu extends React.PureComponent<Props> {
     return (
       <li key="background_tasks">
         <Link
-          to={{ pathname: '/project/background_tasks', query: { id: this.props.component.key } }}
-          activeClassName="active">
+          activeClassName="active"
+          to={{ pathname: '/project/background_tasks', query: { id: this.props.component.key } }}>
           {translate('background_tasks.page')}
         </Link>
       </li>
@@ -403,8 +403,8 @@ export default class ComponentNavMenu extends React.PureComponent<Props> {
     return (
       <li key="update_key">
         <Link
-          to={{ pathname: '/project/key', query: { id: this.props.component.key } }}
-          activeClassName="active">
+          activeClassName="active"
+          to={{ pathname: '/project/key', query: { id: this.props.component.key } }}>
           {translate('update_key.page')}
         </Link>
       </li>
@@ -418,8 +418,8 @@ export default class ComponentNavMenu extends React.PureComponent<Props> {
     return (
       <li key="webhooks">
         <Link
-          to={{ pathname: '/project/webhooks', query: { id: this.props.component.key } }}
-          activeClassName="active">
+          activeClassName="active"
+          to={{ pathname: '/project/webhooks', query: { id: this.props.component.key } }}>
           {translate('webhooks.page')}
         </Link>
       </li>
@@ -440,8 +440,8 @@ export default class ComponentNavMenu extends React.PureComponent<Props> {
     return (
       <li key="project_delete">
         <Link
-          to={{ pathname: '/project/deletion', query: { id: this.props.component.key } }}
-          activeClassName="active">
+          activeClassName="active"
+          to={{ pathname: '/project/deletion', query: { id: this.props.component.key } }}>
           {translate('deletion.page')}
         </Link>
       </li>
@@ -481,7 +481,7 @@ export default class ComponentNavMenu extends React.PureComponent<Props> {
         tagName="li">
         {({ onToggleClick, open }) => (
           <a
-            aria-expanded={String(open)}
+            aria-expanded={open}
             aria-haspopup="true"
             className={classNames('dropdown-toggle', { active: open })}
             href="#"
index ccb40acc1f64f00c4da939f6b5db805d1256342a..6bb9590573ac96d5dee38914f5cbc39b9c5400d4 100644 (file)
@@ -163,7 +163,7 @@ export default class GlobalNavMenu extends React.PureComponent<Props> {
         tagName="li">
         {({ onToggleClick, open }) => (
           <a
-            aria-expanded={String(open)}
+            aria-expanded={open}
             aria-haspopup="true"
             className={classNames('dropdown-toggle', { active: open })}
             href="#"
index 58030362c11b408791ea494ebd90d36f1a12feec..629bdc20180aa657edce86f8ce17bc75173aed96 100644 (file)
@@ -84,7 +84,7 @@ export default class GlobalNavPlus extends React.PureComponent<Props, State> {
         {({ onToggleClick, open }) => (
           <>
             <a
-              aria-expanded={String(open)}
+              aria-expanded={open}
               aria-haspopup="true"
               className="navbar-plus"
               href="#"
index d5571dd9248bacc188d057c5e46d7b88b159c62e..82d644a9345c1e99b2fe57fd42d9f349ab4f019d 100644 (file)
@@ -120,7 +120,7 @@ export default class SettingsNav extends React.PureComponent<Props> {
         tagName="li">
         {({ onToggleClick, open }) => (
           <a
-            aria-expanded={String(open)}
+            aria-expanded={open}
             aria-haspopup="true"
             className={classNames('dropdown-toggle', {
               active:
@@ -165,7 +165,7 @@ export default class SettingsNav extends React.PureComponent<Props> {
         tagName="li">
         {({ onToggleClick, open }) => (
           <a
-            aria-expanded={String(open)}
+            aria-expanded={open}
             aria-haspopup="true"
             className={classNames('dropdown-toggle', { active: open || this.isProjectsActive() })}
             href="#"
@@ -215,7 +215,7 @@ export default class SettingsNav extends React.PureComponent<Props> {
         tagName="li">
         {({ onToggleClick, open }) => (
           <a
-            aria-expanded={String(open)}
+            aria-expanded={open}
             aria-haspopup="true"
             className={classNames('dropdown-toggle', { active: open || this.isSecurityActive() })}
             href="#"
index 5b46e9934cd9fe3d05101c6ed526511534e207ef..a05ea9b4e98d027038afe0e867b6a1c2868ef6e5 100644 (file)
@@ -54,7 +54,7 @@ export default class SearchShowMore extends React.PureComponent {
     const { loadingMore, qualifier, selected } = this.props;
 
     return (
-      <li key={`more-${qualifier}`} className={classNames('menu-footer', { active: selected })}>
+      <li className={classNames('menu-footer', { active: selected })} key={`more-${qualifier}`}>
         <DeferredSpinner className="navbar-search-icon" loading={loadingMore === qualifier}>
           <a
             className={classNames({ 'cursor-not-allowed': !this.props.allowMore })}
index 5a79c7f70e84fa977bf5f77f68d68212e3d96f54..08e25e19aa9f1f0fd4f54fb52020b68c0b887523 100644 (file)
@@ -64,8 +64,8 @@
 }
 
 .boxed-group-list {
-  margin-top: - var(--gridSize);
-  margin-bottom: - var(--gridSize);
+  margin-top: -var(--gridSize);
+  margin-bottom: -var(--gridSize);
 }
 
 .boxed-group-list > li {
index 5221f845d5d0ef161f6f0bf8028ef73038ef8653..c1d319015f12cf6a87895f588d2f44eb2b836bf2 100644 (file)
@@ -219,4 +219,7 @@ const mapStateToProps = state => ({
 
 const mapDispatchToProps = { fetchAboutPageSettings };
 
-export default connect(mapStateToProps, mapDispatchToProps)(AboutApp);
+export default connect(
+  mapStateToProps,
+  mapDispatchToProps
+)(AboutApp);
index 2d3a26dd89b377b4fdf2fc10707dc4e16c7233d2..ded5a77736f351aad02e5c461b3334f3ec35757a 100644 (file)
@@ -37,7 +37,7 @@ export default function AboutProjects({ count, loading } /*: Props */) {
       {!loading && (
         <div>
           <div>
-            <Link to="/projects" className="about-page-projects-link">
+            <Link className="about-page-projects-link" to="/projects">
               {formatMeasure(count, 'INT')}
             </Link>
           </div>
index 9d79e0c4b0fea0cebd08c5d58d865eaee4f6bd08..42ad663a7adefe524ce9d39ac3e6969dedd5b230 100644 (file)
@@ -55,11 +55,11 @@ export default function AboutScanners() {
         <p className="about-page-text">{translate('about_page.scanners.text')}</p>
         <div className="about-page-analyzers">
           {scanners.map(scanner => (
-            <a key={scanner.key} className="about-page-analyzer-box" href={scanner.link}>
+            <a className="about-page-analyzer-box" href={scanner.link} key={scanner.key}>
               <img
-                src={`${window.baseUrl}/images/scanner-logos/${scanner.key}.svg`}
-                height={60}
                 alt={translate('about_page.scanners', scanner.key)}
+                height={60}
+                src={`${window.baseUrl}/images/scanner-logos/${scanner.key}.svg`}
               />
             </a>
           ))}
index 31e5fb7a3c4ebc1b7e240e58d8427ee051c8bfed..499df6ce3a2fe02d88555d2b642f1543d1b5de02 100644 (file)
@@ -48,8 +48,8 @@ export default function EntryIssueTypes(
             <tr>
               <td className="about-page-issue-type-number">
                 <Link
-                  to={getIssuesUrl({ resolved: 'false', types: 'BUG', s: 'CREATION_DATE' })}
-                  className="about-page-issue-type-link">
+                  className="about-page-issue-type-link"
+                  to={getIssuesUrl({ resolved: 'false', types: 'BUG', s: 'CREATION_DATE' })}>
                   {formatMeasure(bugs, 'SHORT_INT')}
                 </Link>
               </td>
@@ -63,12 +63,12 @@ export default function EntryIssueTypes(
             <tr>
               <td className="about-page-issue-type-number">
                 <Link
+                  className="about-page-issue-type-link"
                   to={getIssuesUrl({
                     resolved: 'false',
                     types: 'VULNERABILITY',
                     s: 'CREATION_DATE'
-                  })}
-                  className="about-page-issue-type-link">
+                  })}>
                   {formatMeasure(vulnerabilities, 'SHORT_INT')}
                 </Link>
               </td>
@@ -82,8 +82,8 @@ export default function EntryIssueTypes(
             <tr>
               <td className="about-page-issue-type-number">
                 <Link
-                  to={getIssuesUrl({ resolved: 'false', types: 'CODE_SMELL', s: 'CREATION_DATE' })}
-                  className="about-page-issue-type-link">
+                  className="about-page-issue-type-link"
+                  to={getIssuesUrl({ resolved: 'false', types: 'CODE_SMELL', s: 'CREATION_DATE' })}>
                   {formatMeasure(codeSmells, 'SHORT_INT')}
                 </Link>
               </td>
index 8c4938558db45d14cdbbc2fa033018d30ac47c89..fad4823c0e1426b256ac1f56a85c5a7904f311ed 100644 (file)
@@ -36,8 +36,8 @@ export default function AsAService() {
             <img alt="" height="34" src={`${getBaseUrl()}/images/sonarcloud/as-a-service.svg`} />
             <h1 className="sc-child-title">As a Service</h1>
             <p className="sc-child-lead">
-              We fully operate the SonarQube base service, <br />which is hosted in Frankfurt,
-              Germany.
+              We fully operate the SonarQube base service, <br />
+              which is hosted in Frankfurt, Germany.
             </p>
             <img
               alt=""
index 49b8f302b1c2a0212cf55370773e76b33c9344bc..19c5f5dddd2a2a135e54ffeab9c7a02f10d6c7ea 100644 (file)
@@ -35,11 +35,12 @@ export default function BranchAnalysis() {
           <div className="sc-child-header">
             <img alt="" height="34" src={`${getBaseUrl()}/images/sonarcloud/branch-analysis.svg`} />
             <h1 className="sc-child-title">
-              Branch analysis & <br />pull request decoration
+              Branch analysis & <br />
+              pull request decoration
             </h1>
             <p className="sc-child-lead">
-              SonarCloud comes with a built-in feature to automatically analyze <br />project
-              branches and pull requests as soon as they get created.
+              SonarCloud comes with a built-in feature to automatically analyze <br />
+              project branches and pull requests as soon as they get created.
             </p>
           </div>
 
index 01efb8943f40f9c7f854effdb9c9157246560909..5dd6848f7675f11fddcc6d04a4d61c7d92f72d1c 100644 (file)
@@ -137,14 +137,16 @@ export default function Footer() {
             rel="noopener noreferrer"
             target="_blank">
             SonarSource SA
-          </a>. All rights reserved. SonarCloud is a service operated by{' '}
+          </a>
+          . All rights reserved. SonarCloud is a service operated by{' '}
           <a
             className="sc-footer-link sc-footer-copy-link"
             href="https://www.sonarsource.com"
             rel="noopener noreferrer"
             target="_blank">
             SonarSource
-          </a>, the company that develops and promotes open source{' '}
+          </a>
+          , the company that develops and promotes open source{' '}
           <a
             className="sc-footer-link sc-footer-copy-link"
             href="http://sonarqube.org"
@@ -159,7 +161,8 @@ export default function Footer() {
             rel="noopener noreferrer"
             target="_blank">
             SonarLint
-          </a>.
+          </a>
+          .
         </div>
       </div>
     </footer>
index 629a1730dba51db8b5035f37b5dd2901f1f6d19a..21f62fb4f5d72e4ddb5743afdd612be2165d2128 100644 (file)
@@ -33,8 +33,8 @@ export default function Home() {
         <div className="page page-limited sc-page">
           <h1 className="sc-page-title">Continuous Code Quality Online</h1>
           <p className="sc-page-subtitle">
-            Analyze the quality of your source code to detect bugs, vulnerabilities <br />and code
-            smells throughout the development process.
+            Analyze the quality of your source code to detect bugs, vulnerabilities <br />
+            and code smells throughout the development process.
           </p>
 
           <ul className="sc-features-list">
@@ -91,8 +91,8 @@ export default function Home() {
           <div className="sc-narrow-container text-center">
             <h2 className="sc-feature-title">Explore open source projects on SonarCloud</h2>
             <p className="sc-feature-description">
-              SonarCloud offers free analysis for open source projects. <br />It is public and open
-              to anyone who wants to browse the service.
+              SonarCloud offers free analysis for open source projects. <br />
+              It is public and open to anyone who wants to browse the service.
             </p>
           </div>
 
index 3943b5eced59c6ea1984d64edfb792758f99db9a..8340323d357c06e816757915c567983af2ab1a90 100644 (file)
@@ -33,7 +33,8 @@ export default function Pricing() {
         <h3 className="sc-pricing-title">Private Projects</h3>
         <span className="sc-pricing-small">14 days free trial</span>
         <strong>
-          From <span className="sc-pricing-price">10€</span>/mo
+          From <span className="sc-pricing-price">10€</span>
+          /mo
         </strong>
         <Link className="sc-news-link" to="/documentation/sonarcloud-pricing">
           see prices
index 7d9067e3a0d81c25da92ad48c00e01498659f1f6..1b0bfe980920ece55a2fc9628004735f14f711e9 100644 (file)
@@ -52,12 +52,14 @@ function Jumbotron() {
     <div className="sc-sq-jumbotron">
       <div className="sc-sq-jumbotron-left">
         <h1 className="sc-sq-jumbotron-title">
-          Use SonarQube<br />
+          Use SonarQube
+          <br />
           <span className="sc-sq-jumbotron-title-orange">as a Service</span>
         </h1>
         <div className="sc-sq-jumbotron-login">
           {'—'}
-          <br />Log in or sign up with
+          <br />
+          Log in or sign up with
         </div>
         <div>
           <a
index 17fe58eee42a4015fdff46d833bad311dbc9f0ae..69a0bceabbe857f579238489e0825ba9035b9677 100644 (file)
@@ -44,8 +44,8 @@ export default function SonarLintIntegration() {
               <a className="sc-child-lead-link" href="https://www.sonarlint.org/">
                 SonarLint
               </a>{' '}
-              to provide developers maximum insight <br />in their IDEs on code quality and make
-              sure they do not introduce new issues.
+              to provide developers maximum insight <br />
+              in their IDEs on code quality and make sure they do not introduce new issues.
             </p>
             <img
               alt=""
index 0266a3efaf69b25729c7c1a2c34efb53dfe49223..bb4e8645692c66810e0a50f62a3ad2ccdd45378b 100644 (file)
@@ -50,7 +50,7 @@ class Account extends React.PureComponent {
         <header className="account-header">
           <div className="account-container clearfix">
             <UserCard user={currentUser} />
-            <Nav user={currentUser} customOrganizations={this.props.customOrganizations} />
+            <Nav customOrganizations={this.props.customOrganizations} user={currentUser} />
           </div>
         </header>
 
index d08adb2e20bd6214a2ab15f2b9a59e305d329a44..8688985c311eb1f61fb9c67689ee1189b5763f27 100644 (file)
@@ -34,30 +34,30 @@ export default function Nav({ customOrganizations } /*: Props */) {
     <nav className="account-nav">
       <NavBarTabs>
         <li>
-          <IndexLink to="/account/" activeClassName="active">
+          <IndexLink activeClassName="active" to="/account/">
             {translate('my_account.profile')}
           </IndexLink>
         </li>
         <li>
-          <Link to="/account/security/" activeClassName="active">
+          <Link activeClassName="active" to="/account/security/">
             {translate('my_account.security')}
           </Link>
         </li>
         <li>
-          <Link to="/account/notifications" activeClassName="active">
+          <Link activeClassName="active" to="/account/notifications">
             {translate('my_account.notifications')}
           </Link>
         </li>
         {!customOrganizations && (
           <li>
-            <Link to="/account/projects/" activeClassName="active">
+            <Link activeClassName="active" to="/account/projects/">
               {translate('my_account.projects')}
             </Link>
           </li>
         )}
         {customOrganizations && (
           <li>
-            <Link to="/account/organizations" activeClassName="active">
+            <Link activeClassName="active" to="/account/organizations">
               {translate('my_account.organizations')}
             </Link>
           </li>
index c5299f13bb96c1ae0745a46b9137bf20b1e9e7f4..a67a2ef2eb001045d50bcf076f1e7e01e8e2d0f3 100644 (file)
@@ -31,10 +31,10 @@ export default class UserCard extends React.PureComponent {
 
     return (
       <div className="account-user">
-        <div id="avatar" className="pull-left account-user-avatar">
+        <div className="pull-left account-user-avatar" id="avatar">
           <Avatar hash={user.avatar} name={user.name} size={60} />
         </div>
-        <h1 id="name" className="pull-left">
+        <h1 className="pull-left" id="name">
           {user.name}
         </h1>
       </div>
index 7c05e0f1616a67ef452dcfab60e737dccae26d76..08430793fcd4acf23ad2a58a870d112447bd43b4 100644 (file)
@@ -23,4 +23,7 @@ import { fetchOrganizations } from '../../../store/rootActions';
 
 const mapDispatchToProps = { fetchOrganizations } as Pick<Props, 'fetchOrganizations'>;
 
-export default connect(null, mapDispatchToProps)(Notifications);
+export default connect(
+  null,
+  mapDispatchToProps
+)(Notifications);
index a6dca76e8aa8b8a12d62802f41f303a2d142c40f..256369655228eb168eacfe05716d83064c699372 100644 (file)
@@ -246,4 +246,7 @@ class CreateOrganizationForm extends React.PureComponent<Props, State> {
 
 const mapDispatchToProps: DispatchProps = { createOrganization: createOrganization as any };
 
-export default connect(null, mapDispatchToProps)(CreateOrganizationForm);
+export default connect(
+  null,
+  mapDispatchToProps
+)(CreateOrganizationForm);
index 53010e8e63c4c00194acbcf0915041083b598f23..db53d626a83d33ce130a579311348547208da26e 100644 (file)
@@ -50,7 +50,7 @@ export default function OrganizationCard({ organization }: Props) {
 
       {!!organization.url && (
         <div className="markdown spacer-top">
-          <a href={organization.url} title={organization.url} rel="nofollow">
+          <a href={organization.url} rel="nofollow" title={organization.url}>
             {organization.url}
           </a>
         </div>
index 9bf4071c8b06fe3c83bbfff61232ef011c717ad6..c3768ee5e5c9b46593582af909dd48696988b767 100644 (file)
@@ -120,4 +120,7 @@ const mapDispatchToProps = {
   fetchIfAnyoneCanCreateOrganizations: fetchIfAnyoneCanCreateOrganizations as any
 } as DispatchProps;
 
-export default connect(mapStateToProps, mapDispatchToProps)(UserOrganizations);
+export default connect(
+  mapStateToProps,
+  mapDispatchToProps
+)(UserOrganizations);
index aa4b8c0ed85aea989d94ae93d4f4ee27f4d9c584..3b91c7649dcf0681183359dea2d18b9d109e036f 100644 (file)
@@ -52,7 +52,7 @@ function Profile(props /*: Props */) {
 
         {!user.local &&
           user.externalProvider !== 'sonarqube' && (
-            <div id="identity-provider" className="spacer-bottom">
+            <div className="spacer-bottom" id="identity-provider">
               <UserExternalIdentity user={user} />
             </div>
           )}
@@ -68,7 +68,7 @@ function Profile(props /*: Props */) {
 
         <hr />
 
-        <UserScmAccounts user={user} scmAccounts={user.scmAccounts} />
+        <UserScmAccounts scmAccounts={user.scmAccounts} user={user} />
       </div>
     </div>
   );
index 2148e50098fa612a6bfa67f02708e1ea1aa747cd..8e0536fe3acd283ca42471092e5d0f7f92dbebda 100644 (file)
@@ -87,11 +87,11 @@ export default class UserExternalIdentity extends React.PureComponent {
           color: getTextColor(identityProvider.backgroundColor, theme.secondFontColor)
         }}>
         <img
+          alt={identityProvider.name}
           className="little-spacer-right"
+          height="14"
           src={window.baseUrl + identityProvider.iconPath}
           width="14"
-          height="14"
-          alt={identityProvider.name}
         />{' '}
         {user.externalIdentity}
       </div>
index c4816fb66cd8bdd7950889bea424d9e176f854ea..f81ba233119c92e4c843b5022ad9da2170a8ebb9 100644 (file)
@@ -34,7 +34,7 @@ export default class UserGroups extends React.PureComponent {
         <h2 className="spacer-bottom">{translate('my_profile.groups')}</h2>
         <ul id="groups">
           {groups.map(group => (
-            <li key={group} className="little-spacer-bottom" title={group}>
+            <li className="little-spacer-bottom" key={group} title={group}>
               {group}
             </li>
           ))}
index 324af5716a4d624bd750f0eae39832ab66017f62..a306959eade25ad985fb60ecce4ae716888bab5a 100644 (file)
@@ -45,7 +45,7 @@ export default class UserScmAccounts extends React.PureComponent {
           )}
 
           {scmAccounts.map(scmAccount => (
-            <li key={scmAccount} className="little-spacer-bottom" title={scmAccount}>
+            <li className="little-spacer-bottom" key={scmAccount} title={scmAccount}>
               {scmAccount}
             </li>
           ))}
index 2e10882d6b83c9d051565a0704b67c9255985d46..f4f686fd287fe33363eec95e13f247a4d429c9fe 100644 (file)
@@ -81,21 +81,21 @@ describe('Stats', () => {
   describe('Pending', () => {
     it('should show zero pending', () => {
       const result = shallow(
-        <Stats pendingCount={0} onCancelAllPending={stub} onShowFailing={stub} />
+        <Stats onCancelAllPending={stub} onShowFailing={stub} pendingCount={0} />
       );
       expect(result.find('.js-pending-count').text()).toContain('0');
     });
 
     it('should show 5 pending', () => {
       const result = shallow(
-        <Stats pendingCount={5} onCancelAllPending={stub} onShowFailing={stub} />
+        <Stats onCancelAllPending={stub} onShowFailing={stub} pendingCount={5} />
       );
       expect(result.find('.js-pending-count').text()).toContain('5');
     });
 
     it('should not show cancel pending button', () => {
       const result = shallow(
-        <Stats pendingCount={0} onCancelAllPending={stub} onShowFailing={stub} />
+        <Stats onCancelAllPending={stub} onShowFailing={stub} pendingCount={0} />
       );
       expect(result.find('.js-cancel-pending').length).toBe(0);
     });
@@ -104,9 +104,9 @@ describe('Stats', () => {
       const result = shallow(
         <Stats
           isSystemAdmin={true}
-          pendingCount={5}
           onCancelAllPending={stub}
           onShowFailing={stub}
+          pendingCount={5}
         />
       );
       expect(result.find('.js-cancel-pending').length).toBe(1);
@@ -117,9 +117,9 @@ describe('Stats', () => {
       const result = shallow(
         <Stats
           isSystemAdmin={true}
-          pendingCount={5}
           onCancelAllPending={spy}
           onShowFailing={stub}
+          pendingCount={5}
         />
       );
       expect(spy).not.toBeCalled();
index 94090edd286119471a9068082cb11a48e731ec77..20329eafbaf06ebdb3c189c5ef8de11588da3cab 100644 (file)
@@ -270,4 +270,7 @@ class BackgroundTasksApp extends React.PureComponent {
 
 const mapDispatchToProps = { fetchOrganizations };
 
-export default connect(null, mapDispatchToProps)(BackgroundTasksApp);
+export default connect(
+  null,
+  mapDispatchToProps
+)(BackgroundTasksApp);
index 45f653857b0a165a8c91ba6ac25be83aa54a64f4..7e66a3e007e37186962aaadc94366c54aeff67d1 100644 (file)
@@ -84,7 +84,7 @@ export default class ScannerContext extends React.PureComponent<Props, State> {
         </div>
 
         <div className="modal-foot">
-          <a href="#" className="js-modal-close" onClick={this.handleCloseClick}>
+          <a className="js-modal-close" href="#" onClick={this.handleCloseClick}>
             {translate('close')}
           </a>
         </div>
index 1ea9befbc891b24d80d3faa842f83649daebf374..21cdf7ec937dc61ccff75ddf60bd9c6ee70ebb08 100644 (file)
@@ -100,7 +100,7 @@ export default class Stacktrace extends React.PureComponent<Props, State> {
         </div>
 
         <div className="modal-foot">
-          <a href="#" className="js-modal-close" onClick={this.handleCloseClick}>
+          <a className="js-modal-close" href="#" onClick={this.handleCloseClick}>
             {translate('close')}
           </a>
         </div>
index 3892a59cd0a56d8f22685737efb63a8d2895221b..9b11cc91891e815346bf072d073ff372996adf42 100644 (file)
@@ -25,9 +25,9 @@ it('renders', () => {
   expect(shallow(<TaskDate />)).toMatchSnapshot();
   expect(shallow(<TaskDate date="2017-01-01T00:00:00.000Z" />)).toMatchSnapshot();
   expect(
-    shallow(<TaskDate date="2017-01-01T00:00:00.000Z" baseDate="2017-01-01T00:00:00.000Z" />)
+    shallow(<TaskDate baseDate="2017-01-01T00:00:00.000Z" date="2017-01-01T00:00:00.000Z" />)
   ).toMatchSnapshot();
   expect(
-    shallow(<TaskDate date="2017-01-05T00:00:00.000Z" baseDate="2017-01-01T00:00:00.000Z" />)
+    shallow(<TaskDate baseDate="2017-01-01T00:00:00.000Z" date="2017-01-05T00:00:00.000Z" />)
   ).toMatchSnapshot();
 });
index 185dd6d8f3464ef4e8b60a5d13cdcb9e481e685f..9f03fb4348dfc3285610c3b22c8c895498bc13a0 100644 (file)
@@ -24,13 +24,13 @@ import TaskDay from '../TaskDay';
 it('renders', () => {
   expect(
     shallow(
-      <TaskDay submittedAt="2017-01-02T00:00:00.000Z" prevSubmittedAt="2017-01-01T00:00:00.000Z" />
+      <TaskDay prevSubmittedAt="2017-01-01T00:00:00.000Z" submittedAt="2017-01-02T00:00:00.000Z" />
     )
   ).toMatchSnapshot();
 
   expect(
     shallow(
-      <TaskDay submittedAt="2017-01-01T00:00:00.000Z" prevSubmittedAt="2017-01-01T00:00:00.000Z" />
+      <TaskDay prevSubmittedAt="2017-01-01T00:00:00.000Z" submittedAt="2017-01-01T00:00:00.000Z" />
     )
   ).toMatchSnapshot();
 });
index 56b2dcf6de5f0abd21d80156738bd3e28cd7bec7..f7a7354b0e6cd22817af38359362a4445c372439 100644 (file)
@@ -239,7 +239,7 @@ export default class App extends React.PureComponent<Props, State> {
 
           {sourceViewer === undefined &&
             components !== undefined && (
-              <ListFooter count={components.length} total={total} loadMore={this.handleLoadMore} />
+              <ListFooter count={components.length} loadMore={this.handleLoadMore} total={total} />
             )}
 
           {sourceViewer !== undefined && (
index abeeacc511a07b5454812e64e73956c6179fa05d..6315df5dcd33740fc173dcb79e1bfeba6f218857 100644 (file)
@@ -176,7 +176,7 @@ export default class Search extends React.PureComponent<Props, State> {
     const isPortfolio = ['VW', 'SVW', 'APP'].includes(component.qualifier);
 
     return (
-      <div id="code-search" className={containerClassName}>
+      <div className={containerClassName} id="code-search">
         <SearchBox
           minLength={3}
           onChange={this.handleQueryChange}
index 19f179aca95d01659fff1de1907538d3ef734612..320c759103e4fa2e3915d5f4189c737b70b73c63 100644 (file)
@@ -467,12 +467,14 @@ export class App extends React.PureComponent<Props, State> {
     });
 
   handleRuleDeactivate = (profile: string, rule: string) =>
-    this.setState((state: State) => {
+    this.setState(state => {
       const { actives } = state;
       if (actives && actives[rule]) {
-        return { actives: { ...actives, [rule]: { ...actives[rule], [profile]: undefined } } };
+        const newRule = { ...actives[rule] };
+        delete newRule[profile];
+        return { actives: { ...actives, [rule]: newRule } };
       }
-      return {};
+      return null;
     });
 
   handleSearch = (searchQuery: string) => this.handleFilterChange({ searchQuery });
index e3076a11b3f3e18543722a7e1c47ba60779c7215..309e99dcf1d58ec663191a5a539283f8024ddfd1 100644 (file)
@@ -131,13 +131,10 @@ export default class CustomRuleFormModal extends React.PureComponent<Props, Stat
 
   handleNameChange = (event: React.SyntheticEvent<HTMLInputElement>) => {
     const { value: name } = event.currentTarget;
-    this.setState((state: State) => {
-      const change: Partial<State> = { name };
-      if (!state.keyModifiedByUser) {
-        change.key = latinize(name).replace(/[^A-Za-z0-9]/g, '_');
-      }
-      return change;
-    });
+    this.setState(state => ({
+      name,
+      key: state.keyModifiedByUser ? state.key : latinize(name).replace(/[^A-Za-z0-9]/g, '_')
+    }));
   };
 
   handleKeyChange = (event: React.SyntheticEvent<HTMLInputElement>) =>
index 0b07f5b597d4122552c3bea7f13e8d97283e733c..dcdc5b733dde97527779f49d1257f92f09b9374d 100644 (file)
@@ -104,14 +104,19 @@ export default class RuleDetails extends React.PureComponent<Props, State> {
   handleTagsChange = (tags: string[]) => {
     // optimistic update
     const oldTags = this.state.ruleDetails && this.state.ruleDetails.tags;
-    this.setState(state => ({ ruleDetails: { ...state.ruleDetails, tags } }));
+    this.setState(
+      state => (state.ruleDetails ? { ruleDetails: { ...state.ruleDetails, tags } } : null)
+    );
     updateRule({
       key: this.props.ruleKey,
       organization: this.props.organization,
       tags: tags.join()
     }).catch(() => {
       if (this.mounted) {
-        this.setState(state => ({ ruleDetails: { ...state.ruleDetails, tags: oldTags } }));
+        this.setState(
+          state =>
+            state.ruleDetails ? { ruleDetails: { ...state.ruleDetails, tags: oldTags } } : null
+        );
       }
     });
   };
index 54d63a4dddd0b9984dd479fd3beb47da8df9669e..b02d379358cd1fd04c368f20badafe3e3431c0b3 100644 (file)
@@ -74,4 +74,7 @@ const fetchMeasures = (
 
 const mapDispatchToProps = { fetchMeasures, fetchMetrics };
 
-export default connect(mapStateToProps, mapDispatchToProps)(withRouter(App));
+export default connect(
+  mapStateToProps,
+  mapDispatchToProps
+)(withRouter(App));
index 7709a31d257ead4c8a88e77d7581ee60d5fabc5e..fbc87441a606920fbc7e198515da3d5370cdae1a 100644 (file)
@@ -104,11 +104,11 @@ export default class Breadcrumbs extends React.PureComponent {
       <div className={this.props.className}>
         {breadcrumbs.map(component => (
           <Breadcrumb
-            key={component.key}
             canBrowse={component.key !== lastItem.key}
             component={component}
-            isLast={component.key === lastItem.key}
             handleSelect={this.props.handleSelect}
+            isLast={component.key === lastItem.key}
+            key={component.key}
           />
         ))}
       </div>
index e3843c8bcd092506fe281229e440b9f7561dc1f1..8777d0fca7ee4bd9b31a3cab348bd10e5c58d392 100644 (file)
@@ -306,15 +306,15 @@ export default class MeasureContent extends React.PureComponent {
                 isLoggedIn && (
                   <MeasureFavoriteContainer
                     branchLike={branchLike}
-                    component={component.key}
                     className="measure-favorite spacer-right"
+                    component={component.key}
                   />
                 )}
               {!isFile && (
                 <MeasureViewSelect
                   className="measure-view-select"
-                  metric={metric}
                   handleViewChange={this.props.updateView}
+                  metric={metric}
                   view={view}
                 />
               )}
index 54d1e9750318f5e2d9ddfba27a1c486d8a77417b..160bf1d74b6e100d4e046384fdea54e565031c3b 100644 (file)
@@ -134,8 +134,8 @@ export default class MeasureContentContainer extends React.PureComponent {
         className={this.props.className}
         component={this.state.component}
         currentUser={this.props.currentUser}
-        loading={this.state.loading.measure || this.state.loading.components}
         leakPeriod={this.props.leakPeriod}
+        loading={this.state.loading.measure || this.state.loading.components}
         measure={this.state.measure}
         metric={this.props.metric}
         metrics={this.props.metrics}
index 9eacba92a32496a8eda0962dad3279b0a62b2d29..627913abc1c01d068a8bb1dc88524ff289f059ea 100644 (file)
@@ -97,4 +97,7 @@ const mapDispatchToProps = {
   }
 };
 
-export default connect(mapStateToProps, mapDispatchToProps)(MeasureFavoriteContainer);
+export default connect(
+  mapStateToProps,
+  mapDispatchToProps
+)(MeasureFavoriteContainer);
index 0cc8795a1547aa0b74109ac4c51001a9ffe94022..e8fb726ef9f51b5e5ff8e0a6721b727e994294be 100644 (file)
@@ -89,11 +89,11 @@ export default class MeasureViewSelect extends React.PureComponent {
         autoBlur={true}
         className={this.props.className}
         clearable={false}
+        onChange={this.handleChange}
+        options={this.getOptions()}
         searchable={false}
         value={this.props.view}
         valueRenderer={this.renderValue}
-        options={this.getOptions()}
-        onChange={this.handleChange}
       />
     );
   }
index 07618142a7e8232ca07d971902121f8b65b35aa3..cd4c0298fb8a82783490538b4a9e1af47c8a30ad 100644 (file)
@@ -31,8 +31,8 @@ it('should show the last element without clickable link', () => {
           name: 'Foo',
           qualifier: 'TRK'
         }}
-        isLast={true}
         handleSelect={() => {}}
+        isLast={true}
       />
     )
   ).toMatchSnapshot();
@@ -48,8 +48,8 @@ it('should correctly show a middle element', () => {
           name: 'Foo',
           qualifier: 'TRK'
         }}
-        isLast={false}
         handleSelect={() => {}}
+        isLast={false}
       />
     )
   ).toMatchSnapshot();
index 115ade517600bd15e88dc79b505d981127cd5e13..48b394332267d1653b7a709049bc52cfa1538686 100644 (file)
@@ -24,7 +24,7 @@ import MeasureViewSelect from '../MeasureViewSelect';
 it('should display correctly with treemap option', () => {
   expect(
     shallow(
-      <MeasureViewSelect metric={{ type: 'PERCENT' }} handleViewChange={() => {}} view="tree" />
+      <MeasureViewSelect handleViewChange={() => {}} metric={{ type: 'PERCENT' }} view="tree" />
     )
   ).toMatchSnapshot();
 });
index 8e7d69452a70fa151b88b2fb0a70961ecb2e4289..da55b93966d233cb5276b4785b9eb4d068f9890f 100644 (file)
@@ -40,7 +40,7 @@ export default function MeasureCell({ component, measure, metric } /*: Props */)
   return (
     <td className="thin nowrap text-right">
       <span id={`component-measures-component-measure-${component.key}-${metric.key}`}>
-        <Measure value={value} metricKey={metric.key} metricType={metric.type} />
+        <Measure metricKey={metric.key} metricType={metric.type} value={value} />
       </span>
     </td>
   );
index 6a79f5e3d564c90eea37500590ce214710e8b399..ce1735a02cacc608e45869628f7dade00b6c8a8b 100644 (file)
@@ -162,8 +162,8 @@ export default class TreeMapView extends React.PureComponent {
     return (
       <ColorGradientLegend
         className="measure-details-treemap-legend"
-        colorScale={colorScale}
         colorNA={theme.secondFontColor}
+        colorScale={colorScale}
         direction={metric.direction}
         height={20}
         width={200}
index 93d7ff584931ce696ba396d9226d023a1c23072a..709533576870097665ef3535a3618835f94c5eaf 100644 (file)
@@ -27,23 +27,23 @@ export default function FacetMeasureValue({ measure } /*: { measure: MeasureEnha
   if (isDiffMetric(measure.metric.key)) {
     return (
       <div
-        id={`measure-${measure.metric.key}-leak`}
-        className="domain-measures-value domain-measures-leak">
+        className="domain-measures-value domain-measures-leak"
+        id={`measure-${measure.metric.key}-leak`}>
         <Measure
-          value={measure.leak}
           metricKey={measure.metric.key}
           metricType={measure.metric.type}
+          value={measure.leak}
         />
       </div>
     );
   }
 
   return (
-    <div id={`measure-${measure.metric.key}-value`} className="domain-measures-value">
+    <div className="domain-measures-value" id={`measure-${measure.metric.key}-value`}>
       <Measure
-        value={measure.value}
         metricKey={measure.metric.key}
         metricType={measure.metric.type}
+        value={measure.value}
       />
     </div>
   );
index 967796f431779009f051eb6ea754c2deef5a8657..eb132497a6ae1830a320f586a2a788b8cee03c3b 100644 (file)
@@ -31,21 +31,21 @@ interface Props {
 export default function Explore(props: Props) {
   return (
     <div id="explore">
-      <ContextNavBar id="explore-navigation" height={theme.contextNavHeightRaw}>
+      <ContextNavBar height={theme.contextNavHeightRaw} id="explore-navigation">
         <header className="navbar-context-header">
           <h1>{translate('explore')}</h1>
         </header>
 
         <NavBarTabs>
           <li>
-            <Link to="/explore/projects" activeClassName="active">
+            <Link activeClassName="active" to="/explore/projects">
               {translate('projects.page')}
             </Link>
           </li>
           <li>
             <Link
-              to={{ pathname: '/explore/issues', query: { resolved: 'false' } }}
-              activeClassName="active">
+              activeClassName="active"
+              to={{ pathname: '/explore/issues', query: { resolved: 'false' } }}>
               {translate('issues.page')}
             </Link>
           </li>
index bac8da1aa307f493dbab33ecc49f95f36ff076af..1971e243c1585258f655d7b9242c5473f81387bf 100644 (file)
@@ -35,7 +35,7 @@ interface Props {
 export default function List(props: Props) {
   return (
     <div className="boxed-group boxed-group-inner">
-      <table id="groups-list" className="data zebra zebra-hover">
+      <table className="data zebra zebra-hover" id="groups-list">
         <thead>
           <tr>
             <th />
index 4af0e007372ac0f9f4e56171697c974f97f23999..3e3b73245bb91b433066db38fc91c9cd2782d0b1 100644 (file)
@@ -45,7 +45,7 @@ exports[`should edit members 1`] = `
                   "clipRule": "evenodd",
                   "fillRule": "evenodd",
                   "strokeLinejoin": "round",
-                  "strokeMiterlimit": "1.41421",
+                  "strokeMiterlimit": 1.41421,
                 }
               }
               version="1.1"
@@ -116,7 +116,7 @@ exports[`should edit members 2`] = `
                   "clipRule": "evenodd",
                   "fillRule": "evenodd",
                   "strokeLinejoin": "round",
-                  "strokeMiterlimit": "1.41421",
+                  "strokeMiterlimit": 1.41421,
                 }
               }
               version="1.1"
@@ -393,7 +393,7 @@ exports[`should edit members 2`] = `
                                         "clipRule": "evenodd",
                                         "fillRule": "evenodd",
                                         "strokeLinejoin": "round",
-                                        "strokeMiterlimit": "1.41421",
+                                        "strokeMiterlimit": 1.41421,
                                       }
                                     }
                                     version="1.1"
@@ -525,7 +525,7 @@ exports[`should edit members 3`] = `
                   "clipRule": "evenodd",
                   "fillRule": "evenodd",
                   "strokeLinejoin": "round",
-                  "strokeMiterlimit": "1.41421",
+                  "strokeMiterlimit": 1.41421,
                 }
               }
               version="1.1"
index 90a6897177f14ffb11cdff66774c479fadc489b2..76da57eb2fe0a571006fb0124ee24475bd230a28 100644 (file)
@@ -20,7 +20,7 @@
 import { State } from './components/App';
 import { allLocationsEmpty } from './utils';
 
-export function enableLocationsNavigator(state: State): Partial<State> | undefined {
+export function enableLocationsNavigator(state: State) {
   const { openIssue, selectedLocationIndex } = state;
   if (openIssue && (openIssue.secondaryLocations.length > 0 || openIssue.flows.length > 0)) {
     const selectedFlowIndex =
@@ -36,15 +36,15 @@ export function enableLocationsNavigator(state: State): Partial<State> | undefin
       };
     }
   }
-  return undefined;
+  return null;
 }
 
-export function disableLocationsNavigator(): Partial<State> {
+export function disableLocationsNavigator() {
   return { locationsNavigator: false };
 }
 
 export function selectLocation(nextIndex: number | undefined) {
-  return (state: State): Partial<State> | undefined => {
+  return (state: State) => {
     const { selectedLocationIndex: index, openIssue } = state;
     if (openIssue) {
       if (!state.locationsNavigator) {
@@ -59,11 +59,11 @@ export function selectLocation(nextIndex: number | undefined) {
         };
       }
     }
-    return undefined;
+    return null;
   };
 }
 
-export function selectNextLocation(state: State): Partial<State> | undefined {
+export function selectNextLocation(state: State) {
   const { selectedFlowIndex, selectedLocationIndex: index, openIssue } = state;
   if (openIssue) {
     const locations =
@@ -79,10 +79,10 @@ export function selectNextLocation(state: State): Partial<State> | undefined {
       selectedLocationIndex: index !== undefined && index < lastLocationIdx ? index + 1 : index
     };
   }
-  return undefined;
+  return null;
 }
 
-export function selectPreviousLocation(state: State): Partial<State> | undefined {
+export function selectPreviousLocation(state: State) {
   const { selectedFlowIndex, selectedLocationIndex: index, openIssue } = state;
   if (openIssue) {
     if (index === -1) {
@@ -95,16 +95,16 @@ export function selectPreviousLocation(state: State): Partial<State> | undefined
     }
     return { selectedLocationIndex: index !== undefined && index > 0 ? index - 1 : index };
   }
-  return undefined;
+  return null;
 }
 
 export function selectFlow(nextIndex?: number) {
-  return (): Partial<State> => {
+  return () => {
     return { selectedFlowIndex: nextIndex, selectedLocationIndex: 0 };
   };
 }
 
-export function selectNextFlow(state: State): Partial<State> | undefined {
+export function selectNextFlow(state: State) {
   const { openIssue, selectedFlowIndex } = state;
   if (
     openIssue &&
@@ -113,13 +113,13 @@ export function selectNextFlow(state: State): Partial<State> | undefined {
   ) {
     return { selectedFlowIndex: selectedFlowIndex + 1, selectedLocationIndex: 0 };
   }
-  return undefined;
+  return null;
 }
 
-export function selectPreviousFlow(state: State): Partial<State> | undefined {
+export function selectPreviousFlow(state: State) {
   const { openIssue, selectedFlowIndex } = state;
   if (openIssue && selectedFlowIndex !== undefined && selectedFlowIndex > 0) {
     return { selectedFlowIndex: selectedFlowIndex - 1, selectedLocationIndex: 0 };
   }
-  return undefined;
+  return null;
 }
index 683a016303f52cd3d9ee8321b934c2e37f62e204..a2c5a09d56af54fdfbed97e9b3fcff4af2feabb4 100644 (file)
@@ -93,6 +93,7 @@ interface OwnProps {
   myIssues?: boolean;
 }
 
-export default connect<StateProps, DispatchProps, OwnProps>(mapStateToProps, mapDispatchToProps)(
-  lazyLoad(() => import('./App'))
-);
+export default connect<StateProps, DispatchProps, OwnProps>(
+  mapStateToProps,
+  mapDispatchToProps
+)(lazyLoad(() => import('./App')));
index 65f14bb1b249391fb8c19530647ec471eaedbdd9..c8201f79b0ead7d4ad048a9125f779de97149e2b 100644 (file)
@@ -59,7 +59,9 @@ export default class ConciseIssueBox extends React.PureComponent<Props> {
     const locations =
       selectedFlowIndex !== undefined
         ? flows[selectedFlowIndex]
-        : flows.length > 0 ? flows[0] : secondaryLocations;
+        : flows.length > 0
+          ? flows[0]
+          : secondaryLocations;
 
     if (!locations || locations.length < 15) {
       // if there are no locations, or there are just few
index 938163782e337cfa7c009393487066ab04b40680..1e50dda69d82aeb53ef10453bd3c3701f9a2942a 100644 (file)
@@ -71,7 +71,7 @@ export default function PluginAvailable({ plugin, readOnly, refreshPending, stat
       </td>
 
       {!readOnly && (
-        <PluginStatus plugin={plugin} status={status} refreshPending={refreshPending} />
+        <PluginStatus plugin={plugin} refreshPending={refreshPending} status={status} />
       )}
     </tr>
   );
index 2d6faf4975d607843a964b1422b82445f86f4c73..c0fdbd7fe4ff81644f2d2d17073c37e28824656e 100644 (file)
@@ -59,7 +59,7 @@ export default function PluginInstalled({ plugin, readOnly, refreshPending, stat
       </td>
 
       {!readOnly && (
-        <PluginStatus plugin={plugin} status={status} refreshPending={refreshPending} />
+        <PluginStatus plugin={plugin} refreshPending={refreshPending} status={status} />
       )}
     </tr>
   );
index 1bbb18782f27d140248ee8916ebcd427f0de3eaf..0a2ce739b5ea8eb909205f56bcaaee412db122ff 100644 (file)
@@ -52,7 +52,7 @@ export default class PluginUpdateItem extends React.PureComponent<Props, State>
   render() {
     const { release, update } = this.props;
     return (
-      <li key={release.version} className="display-flex-row little-spacer-bottom">
+      <li className="display-flex-row little-spacer-bottom" key={release.version}>
         <div className="pull-left spacer-right">
           {update.status === 'COMPATIBLE' ? (
             <span className="js-update-version badge badge-success">{release.version}</span>
index 0d80dc953af0054e2665b8ba2d819efab887141f..ac04e962c24535e4b726e95d96f05fe910b3ebd7 100644 (file)
@@ -113,14 +113,17 @@ export function isPluginPending(plugin: Plugin): plugin is PluginPending {
 }
 
 export const DEFAULT_FILTER = 'all';
-export const parseQuery = memoize((urlQuery: RawQuery): Query => ({
-  filter: parseAsString(urlQuery['filter']) || DEFAULT_FILTER,
-  search: parseAsString(urlQuery['search'])
-}));
-
-export const serializeQuery = memoize((query: Query): RawQuery =>
-  cleanQuery({
-    filter: query.filter === DEFAULT_FILTER ? undefined : serializeString(query.filter),
-    search: query.search ? serializeString(query.search) : undefined
+export const parseQuery = memoize(
+  (urlQuery: RawQuery): Query => ({
+    filter: parseAsString(urlQuery['filter']) || DEFAULT_FILTER,
+    search: parseAsString(urlQuery['search'])
   })
 );
+
+export const serializeQuery = memoize(
+  (query: Query): RawQuery =>
+    cleanQuery({
+      filter: query.filter === DEFAULT_FILTER ? undefined : serializeString(query.filter),
+      search: query.search ? serializeString(query.search) : undefined
+    })
+);
index 4625032fcdda4efec08429616951c955e722fb11..c1aac8ef5d68fa54af641fb9a14ab2e8bb854628 100644 (file)
@@ -128,6 +128,7 @@ export class OrganizationDelete extends React.PureComponent<Props, State> {
 
 const mapDispatchToProps: DispatchToProps = { deleteOrganization: deleteOrganization as any };
 
-export default connect<null, DispatchToProps, OwnProps>(null, mapDispatchToProps)(
-  OrganizationDelete
-);
+export default connect<null, DispatchToProps, OwnProps>(
+  null,
+  mapDispatchToProps
+)(OrganizationDelete);
index af96e5ec02f1736a0be844a75fdd12043656a0c4..a81cbe614d3b2c3f9abdbb042af33896bf2f8bc8 100644 (file)
@@ -197,4 +197,7 @@ export class OrganizationEdit extends React.PureComponent<Props, State> {
 
 const mapDispatchToProps = { updateOrganization: updateOrganization as any };
 
-export default connect<{}, DispatchProps, OwnProps>(null, mapDispatchToProps)(OrganizationEdit);
+export default connect<{}, DispatchProps, OwnProps>(
+  null,
+  mapDispatchToProps
+)(OrganizationEdit);
index cbc1d9d0d98dd8e31db8fa832f02984c3a7f673a..01226a510098e6aec560ecb6ff8f21c0c6951488 100644 (file)
@@ -43,7 +43,7 @@ interface OwnProps {
 interface StateProps {
   memberLogins: string[];
   members: OrganizationMember[];
-  organization?: Organization;
+  organization: Organization;
   organizationGroups: Group[];
   status: { loading?: boolean; total?: number; pageIndex?: number; query?: string };
 }
@@ -68,7 +68,7 @@ const mapStateToProps = (state: any, ownProps: OwnProps): StateProps => {
   return {
     memberLogins,
     members: getUsersByLogins(state, memberLogins),
-    organization: getOrganizationByKey(state, organizationKey),
+    organization: getOrganizationByKey(state, organizationKey)!,
     organizationGroups: getOrganizationGroupsByKey(state, organizationKey),
     status: getOrganizationMembersState(state, organizationKey)
   };
@@ -83,6 +83,7 @@ const mapDispatchToProps = {
   updateOrganizationMemberGroups
 };
 
-export default connect<StateProps, DispatchProps, OwnProps>(mapStateToProps, mapDispatchToProps)(
-  OrganizationMembers
-);
+export default connect<StateProps, DispatchProps, OwnProps>(
+  mapStateToProps,
+  mapDispatchToProps
+)(OrganizationMembers);
index 44daa37abeab565264a4ce1d5c2fe8e6e82d234c..41981090047c111da9e2842127f3cd25605b6f39 100644 (file)
@@ -118,6 +118,7 @@ const mapStateToProps = (state: any, ownProps: OwnProps) => ({
 
 const mapDispatchToProps = { fetchOrganization: fetchOrganization as any };
 
-export default connect<StateProps, DispatchToProps, OwnProps>(mapStateToProps, mapDispatchToProps)(
-  OrganizationPage
-);
+export default connect<StateProps, DispatchToProps, OwnProps>(
+  mapStateToProps,
+  mapDispatchToProps
+)(OrganizationPage);
index 915316ce2fcb60a635462f8a8f0ed5b73e4571a6..3b4eac183be1de0587e8f27b8404fada7281b1da 100644 (file)
@@ -51,7 +51,9 @@ export default function Analysis({ analysis, ...props }: Props) {
 
       {sortedEvents.length > 0 ? (
         <div className="overview-activity-events">
-          {sortedEvents.map(event => <Event event={event} key={event.key} />)}
+          {sortedEvents.map(event => (
+            <Event event={event} key={event.key} />
+          ))}
         </div>
       ) : (
         <span className="note">{translate('project_activity.analyzed', qualifier)}</span>
index 4d6c57487488e8977abfd4b7335f2e617969d287..f533a2bd828674870bd278a18f53a50d7002b0de 100644 (file)
@@ -31,7 +31,7 @@ export default function MetaKey({ componentKey, qualifier }: Props) {
     <>
       <h4 className="overview-meta-header">{translate('overview.project_key', qualifier)}</h4>
       <div className="display-flex-center">
-        <input className="overview-key" type="text" value={componentKey} readOnly={true} />
+        <input className="overview-key" readOnly={true} type="text" value={componentKey} />
         <ClipboardButton className="little-spacer-left" copyValue={componentKey} />
       </div>
     </>
index d9db8d5b1509c1bb771df1209ac5cd1c3c23d467..5afa32a08ae6787a1abcf021bc5f1497cc19d713 100644 (file)
@@ -74,7 +74,9 @@ export default class MetaLinks extends React.PureComponent<Props, State> {
       <div className="overview-meta-card">
         <h4 className="overview-meta-header">{translate('overview.external_links')}</h4>
         <ul className="overview-meta-list">
-          {orderedLinks.map(link => <MetaLink key={link.id} link={link} />)}
+          {orderedLinks.map(link => (
+            <MetaLink key={link.id} link={link} />
+          ))}
         </ul>
       </div>
     );
index 9d8ca5a8000c1ad34a9d765958401070537b5165..73de76624049a8387dbf0dce2401c965603cab5c 100644 (file)
@@ -30,7 +30,7 @@ export default function MetaOrganizationKey({ organization }: Props) {
     <>
       <h4 className="overview-meta-header big-spacer-top">{translate('organization_key')}</h4>
       <div className="display-flex-center">
-        <input className="overview-key" type="text" value={organization} readOnly={true} />
+        <input className="overview-key" readOnly={true} type="text" value={organization} />
         <ClipboardButton className="little-spacer-left" copyValue={organization} />
       </div>
     </>
index 243a5765d779768f9374438f0a24a76b2b681ee6..f1b25609103266194589336ea5786ad8d9759320 100644 (file)
@@ -68,7 +68,7 @@ export default class MetaSize extends React.PureComponent<Props> {
       this.props.component.qualifier === 'TRK' ? 'overview-meta-size-lang-dist' : 'big-spacer-top';
 
     return languageDistribution ? (
-      <div id="overview-language-distribution" className={className}>
+      <div className={className} id="overview-language-distribution">
         <LanguageDistributionContainer distribution={languageDistribution.value} width={160} />
       </div>
     ) : null;
index ecd6133cecb8288dac7fb836f36442a7099b28d0..91cba327f5130494a1d1262d3ae96daea81c694d 100644 (file)
@@ -103,15 +103,13 @@ export default class ApplicationQualityGate extends React.PureComponent<Props, S
             <div
               className="overview-quality-gate-conditions-list clearfix"
               id="overview-quality-gate-conditions-list">
-              {projects
-                .filter(project => project.status !== 'OK')
-                .map(project => (
-                  <ApplicationQualityGateProject
-                    key={project.key}
-                    metrics={metrics}
-                    project={project}
-                  />
-                ))}
+              {projects.filter(project => project.status !== 'OK').map(project => (
+                <ApplicationQualityGateProject
+                  key={project.key}
+                  metrics={metrics}
+                  project={project}
+                />
+              ))}
             </div>
           )}
       </div>
index 8ff4cb04044c41e1d42e197cbee8909238d17ae3..7e2d6d3772e169acb0b99de00a808b6fa735aa24 100644 (file)
@@ -114,7 +114,7 @@ export default class QualityGateCondition extends React.PureComponent {
     };
 
     return RATING_METRICS_MAPPING[metricKey] ? (
-      <Link to={this.getUrlForType(...RATING_METRICS_MAPPING[metricKey])} className={className}>
+      <Link className={className} to={this.getUrlForType(...RATING_METRICS_MAPPING[metricKey])}>
         {children}
       </Link>
     ) : (
@@ -153,15 +153,15 @@ export default class QualityGateCondition extends React.PureComponent {
         <div className="overview-quality-gate-condition-value">
           <Measure
             decimals={decimals}
-            value={actual}
             metricKey={measure.metric.key}
             metricType={measure.metric.type}
+            value={actual}
           />
         </div>
 
         <div>
           <div className="overview-quality-gate-condition-metric">
-            <IssueTypeIcon query={metric.key} className="little-spacer-right" />
+            <IssueTypeIcon className="little-spacer-right" query={metric.key} />
             {metric.name}
           </div>
           {!isDiff &&
index df020fbe8a416098a11fb55e68d4dff8458dd67a..d36592db6be21d0e3ed284cf1751c44a8dda5656 100644 (file)
@@ -80,8 +80,8 @@ export default class App extends React.PureComponent {
     return (
       <Template
         organization={this.props.organization}
-        template={template}
         refresh={this.requestPermissions}
+        template={template}
         topQualifiers={this.props.topQualifiers}
       />
     );
@@ -91,11 +91,11 @@ export default class App extends React.PureComponent {
     return (
       <Home
         organization={this.props.organization}
-        topQualifiers={this.props.topQualifiers}
         permissions={this.state.permissions}
         permissionTemplates={this.state.permissionTemplates}
         ready={this.state.ready}
         refresh={this.requestPermissions}
+        topQualifiers={this.props.topQualifiers}
       />
     );
   }
@@ -106,8 +106,8 @@ export default class App extends React.PureComponent {
       <div>
         <Suggestions suggestions="permission_templates" />
         <OrganizationHelmet
-          title={translate('permission_templates.page')}
           organization={this.props.organization}
+          title={translate('permission_templates.page')}
         />
 
         {id && this.renderTemplate(id)}
index 046bdd984a285b06a0d1856afb4030b07aec0a85..3cf1b539834e9cc946379f756e25003a1ce0d197 100644 (file)
@@ -47,10 +47,10 @@ export default class Home extends React.PureComponent {
 
         <List
           organization={this.props.organization}
-          permissionTemplates={this.props.permissionTemplates}
           permissions={this.props.permissions}
-          topQualifiers={this.props.topQualifiers}
+          permissionTemplates={this.props.permissionTemplates}
           refresh={this.props.refresh}
+          topQualifiers={this.props.topQualifiers}
         />
       </div>
     );
index 290cd1e908fa68ced7ce2b72f33d40b6ea551cd7..fdc2ef38b3da2448374e19b38566113d541cfeb6 100644 (file)
@@ -38,14 +38,14 @@ export default class List extends React.PureComponent {
         key={p.id}
         organization={this.props.organization}
         permissionTemplate={p}
-        topQualifiers={this.props.topQualifiers}
         refresh={this.props.refresh}
+        topQualifiers={this.props.topQualifiers}
       />
     ));
 
     return (
       <div className="boxed-group boxed-group-inner">
-        <table id="permission-templates" className="data zebra permissions-table">
+        <table className="data zebra permissions-table" id="permission-templates">
           <ListHeader organization={this.props.organization} permissions={this.props.permissions} />
           <tbody>{permissionTemplates}</tbody>
         </table>
index 9b3d0c530ce5c9e275618f6c205592adf5b13bfa..96ac8ffe556164879a7f6ca9d6d45adeb1d03be8 100644 (file)
@@ -51,8 +51,8 @@ export default class ListItem extends React.PureComponent {
           <ActionsCell
             organization={this.props.organization}
             permissionTemplate={this.props.permissionTemplate}
-            topQualifiers={this.props.topQualifiers}
             refresh={this.props.refresh}
+            topQualifiers={this.props.topQualifiers}
           />
         </td>
       </tr>
index e7a1ebcb900ad915639e7c9275d7cbfd2bc0bca3..afeae1c6a0969ad8b4ee82a58e54ec70dacf0c13 100644 (file)
@@ -45,8 +45,8 @@ export default class NameCell extends React.PureComponent {
         {t.defaultFor.length > 0 && (
           <div className="spacer-top js-defaults">
             <Defaults
-              permissionTemplate={this.props.permissionTemplate}
               organization={organization}
+              permissionTemplate={this.props.permissionTemplate}
             />
           </div>
         )}
index 0b3923be0a80d9028eb4a4459530b6ea573fcc07..8370a72b902f0797c5ea10c0c789c3e92adb535b 100644 (file)
@@ -34,7 +34,7 @@ export default class TemplateDetails extends React.PureComponent {
       <div className="big-spacer-bottom">
         {template.defaultFor.length > 0 && (
           <div className="spacer-top js-defaults">
-            <Defaults permissionTemplate={template} organization={this.props.organization} />
+            <Defaults organization={this.props.organization} permissionTemplate={template} />
           </div>
         )}
 
index 9998758b75b67c433d42d4ba0b8f7639c402842f..127600700a4c5e2fc45604e7fc58b1e8a871bc39 100644 (file)
@@ -40,9 +40,9 @@ export default class TemplateHeader extends React.PureComponent {
       : '/permission_templates';
 
     return (
-      <header id="project-permissions-header" className="page-header">
+      <header className="page-header" id="project-permissions-header">
         <div className="note spacer-bottom">
-          <Link to={pathname} className="text-muted">
+          <Link className="text-muted" to={pathname}>
             {translate('permission_templates.page')}
           </Link>
         </div>
@@ -53,11 +53,11 @@ export default class TemplateHeader extends React.PureComponent {
 
         <div className="pull-right">
           <ActionsCell
+            fromDetails={true}
             organization={this.props.organization}
             permissionTemplate={this.props.template}
-            topQualifiers={this.props.topQualifiers}
             refresh={this.props.refresh}
-            fromDetails={true}
+            topQualifiers={this.props.topQualifiers}
           />
         </div>
       </header>
index 0dab8b12ede07cc8fb76c15153b925eb9a8a168f..ed819e648b3ac19763e6935647c179075fab890d 100644 (file)
@@ -42,13 +42,13 @@ it('should render several qualifiers', () => {
 it('should render several qualifiers for default organization', () => {
   const sample = { ...SAMPLE, defaultFor: ['TRK', 'VW'] };
   const organization = { isDefault: true };
-  const output = shallow(<Defaults permissionTemplate={sample} organization={organization} />);
+  const output = shallow(<Defaults organization={organization} permissionTemplate={sample} />);
   expect(output).toMatchSnapshot();
 });
 
 it('should render only projects for custom organization', () => {
   const sample = { ...SAMPLE, defaultFor: ['TRK', 'VW'] };
   const organization = { isDefault: false };
-  const output = shallow(<Defaults permissionTemplate={sample} organization={organization} />);
+  const output = shallow(<Defaults organization={organization} permissionTemplate={sample} />);
   expect(output).toMatchSnapshot();
 });
index dc5888fcd08b0ba2a136a14fa9c3fca74f0702fb..c39d78e3d30e1018c5973a16eeb246b2cd614115 100644 (file)
@@ -339,8 +339,8 @@ export default class App extends React.PureComponent {
 
         <PageHeader
           component={this.props.component}
-          loading={this.state.loading}
           loadHolders={this.loadHolders}
+          loading={this.state.loading}
         />
         <PageError />
         <div>
index f022c5ea7b1b82d93cbcd3c77de4337329417d27..b95e406649f3ded597164bf2c45649c0a9ead4e8 100644 (file)
@@ -30,4 +30,7 @@ const mapDispatchToProps = dispatch => ({
   onRequestFail: onFail(dispatch)
 });
 
-export default connect(mapStateToProps, mapDispatchToProps)(App);
+export default connect(
+  mapStateToProps,
+  mapDispatchToProps
+)(App);
index 5e9b873b84127c087f22b220bbc773a434ccab56..e12f6f7edc1f792086afe8c0f8ea20ed856127eb 100644 (file)
@@ -224,6 +224,7 @@ const mapStateToProps = (state: any): StateToProps => ({
   metrics: getMetrics(state)
 });
 
-export default connect<StateToProps, DispatchToProps, Props>(mapStateToProps, mapDispatchToProps)(
-  App
-);
+export default connect<StateToProps, DispatchToProps, Props>(
+  mapStateToProps,
+  mapDispatchToProps
+)(App);
index 3a6b5971893498cc61c3a6e1b8e73d2a802c32a9..2b177dde32f592081ad4e38eef8bd9f7a81d8388 100644 (file)
@@ -30,7 +30,7 @@ interface Props {
 
 export default function MainRating({ component, metric, value }: Props) {
   return (
-    <Link to={getMeasureTreemapUrl(component, metric)} className="portfolio-box-rating">
+    <Link className="portfolio-box-rating" to={getMeasureTreemapUrl(component, metric)}>
       <Rating value={value} />
     </Link>
   );
index dc805cf0433ceb20f2ba7478ab19e26f69e2926d..8ec942f2e6e2eec653c0f967c54207b218bdf819 100644 (file)
@@ -42,8 +42,8 @@ export default function ReleasabilityBox({ component, measures }: Props) {
 
       {rating && (
         <Link
-          to={getComponentDrilldownUrl({ componentKey: component, metric: 'alert_status' })}
-          className="portfolio-box-rating">
+          className="portfolio-box-rating"
+          to={getComponentDrilldownUrl({ componentKey: component, metric: 'alert_status' })}>
           <Rating value={rating} />
         </Link>
       )}
index 478cd3d86088c31cb29d54fce810a4abfe8a9b2b..1331d80fc436bbec811ecf32ea5667734be0dcc8 100644 (file)
@@ -92,9 +92,9 @@ export default class Report extends React.PureComponent<Props, State> {
             <div className="spacer-top">
               <a
                 className="button js-report-download"
+                download={component.name + ' - Executive Report.pdf'}
                 href={getReportUrl(component.key)}
-                target="_blank"
-                download={component.name + ' - Executive Report.pdf'}>
+                target="_blank">
                 {translate('report.print')}
               </a>
             </div>
index 8975275433843f542fb28d348d95914a9bda15c3..46db61f7c144dd095c3b45c39b0e7c12df94f1d8 100644 (file)
@@ -74,8 +74,8 @@ export default function WorstProjects({ component, subComponents, total }: Props
             <tr key={component.key}>
               <td>
                 <Link
-                  to={getProjectUrl(component.refKey || component.key)}
-                  className="link-with-icon">
+                  className="link-with-icon"
+                  to={getProjectUrl(component.refKey || component.key)}>
                   <QualifierIcon qualifier={component.qualifier} /> {component.name}
                 </Link>
               </td>
@@ -98,7 +98,7 @@ export default function WorstProjects({ component, subComponents, total }: Props
             formatMeasure(count, 'INT'),
             formatMeasure(total, 'INT')
           )}
-          <Link to={projectsPageUrl} className="spacer-left">
+          <Link className="spacer-left" to={projectsPageUrl}>
             {translate('show_more')}
           </Link>
         </footer>
@@ -117,15 +117,15 @@ function renderCell(measures: { [key: string]: string | undefined }, metric: str
 
 function renderNcloc(measures: { [key: string]: string | undefined }, maxLoc: number) {
   const ncloc = Number(measures['ncloc'] || 0);
-  const barWidth = maxLoc > 0 ? Math.max(1, Math.round(ncloc / maxLoc * 50)) : 0;
+  const barWidth = maxLoc > 0 ? Math.max(1, Math.round((ncloc / maxLoc) * 50)) : 0;
   return (
     <td className="text-right">
       <span className="note">
         <Measure metricKey="ncloc" metricType="SHORT_INT" value={measures['ncloc']} />
       </span>
       {maxLoc > 0 && (
-        <svg width="50" height="16" className="spacer-left">
-          <rect className="bar-chart-bar" x="0" y="3" width={barWidth} height="10" />
+        <svg className="spacer-left" height="16" width="50">
+          <rect className="bar-chart-bar" height="10" width={barWidth} x="0" y="3" />
         </svg>
       )}
     </td>
index cf6ffdb2d9a15660a3dce113837ac452584f7527..9919f4b86046b7cd6b989b3a880e4d128137e0de 100644 (file)
@@ -127,10 +127,10 @@ class BulkUpdate extends React.PureComponent {
 
         {results != null && (
           <BulkUpdateResults
-            results={results}
-            replace={replace}
             by={by}
             onConfirm={this.handleConfirm.bind(this)}
+            replace={replace}
+            results={results}
           />
         )}
       </div>
@@ -138,8 +138,11 @@ class BulkUpdate extends React.PureComponent {
   }
 }
 
-export default connect(null, {
-  addGlobalErrorMessage,
-  addGlobalSuccessMessage,
-  closeAllGlobalMessages
-})(BulkUpdate);
+export default connect(
+  null,
+  {
+    addGlobalErrorMessage,
+    addGlobalSuccessMessage,
+    closeAllGlobalMessages
+  }
+)(BulkUpdate);
index d1688ed106eb6af6008ca89f6061fb8bc5cf4cea..2d272a903ade2d681202abb9c1421c13d53614e1 100644 (file)
@@ -144,10 +144,13 @@ const mapStateToProps = (state, ownProps) => ({
   modules: getProjectAdminProjectModules(state, ownProps.location.query.id)
 });
 
-export default connect(mapStateToProps, {
-  fetchProjectModules,
-  changeKey,
-  addGlobalErrorMessage,
-  addGlobalSuccessMessage,
-  closeAllGlobalMessages
-})(Key);
+export default connect(
+  mapStateToProps,
+  {
+    fetchProjectModules,
+    changeKey,
+    addGlobalErrorMessage,
+    addGlobalSuccessMessage,
+    closeAllGlobalMessages
+  }
+)(Key);
index fa77e03c6b8bd3bd5b68eda3764baad5663c474e..15227725c0dffb15fce57a60a9ca790fdd54325d 100644 (file)
@@ -60,8 +60,11 @@ const mapStateToProps = (state, ownProps) => ({
   links: getProjectAdminProjectLinks(state, ownProps.location.query.id)
 });
 
-export default connect(mapStateToProps, {
-  fetchProjectLinks,
-  createProjectLink,
-  deleteProjectLink
-})(Links);
+export default connect(
+  mapStateToProps,
+  {
+    fetchProjectLinks,
+    createProjectLink,
+    deleteProjectLink
+  }
+)(Links);
index 535529ccc18b47f22db84a9afa747889572c5d11..c9bb46571d39e63dfeac6709597e4e59a26bb8ed 100644 (file)
@@ -82,7 +82,7 @@ export default class GraphHistory extends React.PureComponent {
     return (
       <div className="project-activity-graph-container">
         {this.props.isCustom ? (
-          <GraphsLegendCustom series={series} removeMetric={this.props.removeCustomMetric} />
+          <GraphsLegendCustom removeMetric={this.props.removeCustomMetric} series={series} />
         ) : (
           <GraphsLegendStatic series={series} />
         )}
@@ -92,10 +92,9 @@ export default class GraphHistory extends React.PureComponent {
               <div>
                 <AdvancedTimeline
                   endDate={this.props.graphEndDate}
+                  formatYTick={this.formatValue}
                   height={height}
-                  width={width}
                   interpolate="linear"
-                  formatYTick={this.formatValue}
                   leakPeriodDate={this.props.leakPeriodDate}
                   metricType={this.props.metricsType}
                   selectedDate={selectedDate}
@@ -105,6 +104,7 @@ export default class GraphHistory extends React.PureComponent {
                   updateSelectedDate={this.props.updateSelectedDate}
                   updateTooltip={this.updateTooltip}
                   updateZoom={this.props.updateGraphZoom}
+                  width={width}
                 />
                 {selectedDate != null &&
                   tooltipXPos != null && (
index 989b2ea690b88e7f9144cb9448ab52671d335d55..8bedfa774e4bf639adc6a3bcfbc769fb7a3a5ce0 100644 (file)
@@ -142,12 +142,12 @@ export default class GraphsHistory extends React.PureComponent {
       <div className="project-activity-graphs">
         {this.props.graphs.map((series, idx) => (
           <GraphHistory
-            key={idx}
             events={events}
             graph={graph}
             graphEndDate={this.props.graphEndDate}
             graphStartDate={this.props.graphStartDate}
             isCustom={isCustom}
+            key={idx}
             leakPeriodDate={this.props.leakPeriodDate}
             measuresHistory={this.props.measuresHistory}
             metricsType={getSeriesMetricType(series)}
index bead6826b4f47a45e0be844dff7814a4e57db026..166477120c2774d0957d8514362da8a958af49a4 100644 (file)
@@ -41,9 +41,9 @@ export default function GraphsLegendCustom({ removeMetric, series } /*: Props */
           <GraphsLegendItem
             metric={serie.name}
             name={serie.translatedName}
+            removeMetric={removeMetric}
             showWarning={!hasData}
             style={idx.toString()}
-            removeMetric={removeMetric}
           />
         );
         if (!hasData) {
index da1b227fa23e23c7ad7e451f4772ff2da22bade4..9d05d9c95f6c6d58e5fdfc9468b5719eb57d2102 100644 (file)
@@ -33,7 +33,7 @@ type Props = {
 
 export default function GraphsTooltipsContent({ name, style, translatedName, value } /*: Props */) {
   return (
-    <tr key={name} className="project-activity-graph-tooltip-line">
+    <tr className="project-activity-graph-tooltip-line" key={name}>
       <td className="thin">
         <ChartLegendIcon
           className={classNames('spacer-right line-chart-legend', 'line-chart-legend-' + style)}
index 4334b38efaa1dc3d90ab926cd822ec3ebf3e29d7..ea2889a67dbea49455881e3a9a04f56886c5cadc 100644 (file)
@@ -53,8 +53,8 @@ export default function GraphsTooltipsContentCoverage(
       {uncoveredValue && (
         <tr className="project-activity-graph-tooltip-line">
           <td
-            colSpan="2"
-            className="project-activity-graph-tooltip-value text-right spacer-right thin">
+            className="project-activity-graph-tooltip-value text-right spacer-right thin"
+            colSpan="2">
             {formatMeasure(uncoveredValue, 'SHORT_INT')}
           </td>
           <td>{translate('metric.uncovered_lines.name')}</td>
@@ -63,8 +63,8 @@ export default function GraphsTooltipsContentCoverage(
       {coverageValue && (
         <tr className="project-activity-graph-tooltip-line">
           <td
-            colSpan="2"
-            className="project-activity-graph-tooltip-value text-right spacer-right thin">
+            className="project-activity-graph-tooltip-value text-right spacer-right thin"
+            colSpan="2">
             {formatMeasure(coverageValue, 'PERCENT')}
           </td>
           <td>{translate('metric.coverage.name')}</td>
index 36305c85368a3d73a2d4e044e0e8837759d28d20..d07405ed649c90de3c3492e8f49021681ff5e76c 100644 (file)
@@ -55,8 +55,8 @@ export default function GraphsTooltipsContentDuplication(
       )}
       <tr className="project-activity-graph-tooltip-line">
         <td
-          colSpan="2"
-          className="project-activity-graph-tooltip-value text-right spacer-right thin">
+          className="project-activity-graph-tooltip-value text-right spacer-right thin"
+          colSpan="2">
           {formatMeasure(duplicationDensityValue, 'PERCENT')}
         </td>
         <td>{translate('metric.duplicated_lines_density.name')}</td>
index 48d8a840aee26bdc314a0bd3fa448b8b6f42576e..9a9fd69967870b5d23c7d3f7f9096409c0e8bb1b 100644 (file)
@@ -44,7 +44,7 @@ export default function GraphsTooltipsContentEvents({ addSeparator, events } /*:
         <td colSpan="3">
           <span>{translate('events')}:</span>
           {events.map(event => (
-            <span key={event.key} className="spacer-left">
+            <span className="spacer-left" key={event.key}>
               <ProjectEventIcon className={'project-activity-event-icon ' + event.category} />
             </span>
           ))}
index 0934fa40d1ef7e031c7c963a7f0dfeea2539c55f..11aa433612b545c4f91808ad9af47a34011bfb2d 100644 (file)
@@ -50,7 +50,7 @@ export default function GraphsTooltipsContentIssues(props /*: Props */) {
   }
   const ratingValue = rating.history[props.tooltipIdx].value;
   return (
-    <tr key={props.name} className="project-activity-graph-tooltip-issues-line">
+    <tr className="project-activity-graph-tooltip-issues-line" key={props.name}>
       <td className="thin">
         <ChartLegendIcon
           className={classNames(
index 1cf79296c1079ee998647100bdc4d72f1e99876f..5f646a05273bfbb27d88dee0550559e93ad61454 100644 (file)
@@ -51,7 +51,6 @@ export default function GraphsZoom(props /*: Props */) {
           <ZoomTimeLine
             endDate={props.graphEndDate}
             height={64}
-            width={width}
             interpolate="linear"
             leakPeriodDate={props.leakPeriodDate}
             metricType={props.metricsType}
@@ -60,6 +59,7 @@ export default function GraphsZoom(props /*: Props */) {
             showAreas={props.showAreas}
             startDate={props.graphStartDate}
             updateZoom={props.updateGraphZoom}
+            width={width}
           />
         )}
       </AutoSizer>
index 9d0b7f3895646db88ce5144ce8247fc87a3456ba..9b39fdc783df532cec5b1ebcfb9a72171c7393fd 100644 (file)
@@ -189,8 +189,8 @@ export default class ProjectActivityAnalysesList extends React.PureComponent {
               {version.version && (
                 <div className={classNames('project-activity-version-badge', { first: idx === 0 })}>
                   <Tooltip
-                    overlay={`${translate('version')} ${version.version}`}
-                    mouseEnterDelay={0.5}>
+                    mouseEnterDelay={0.5}
+                    overlay={`${translate('version')} ${version.version}`}>
                     <span className="badge">{version.version}</span>
                   </Tooltip>
                 </div>
@@ -198,9 +198,9 @@ export default class ProjectActivityAnalysesList extends React.PureComponent {
               <ul className="project-activity-days-list">
                 {days.map(day => (
                   <li
-                    key={day}
                     className="project-activity-day"
-                    data-day={toShortNotSoISOString(Number(day))}>
+                    data-day={toShortNotSoISOString(Number(day))}
+                    key={day}>
                     <div className="project-activity-date">
                       <DateFormatter date={Number(day)} long={true} />
                     </div>
@@ -212,8 +212,8 @@ export default class ProjectActivityAnalysesList extends React.PureComponent {
                             addVersion={this.props.addVersion}
                             analysis={analysis}
                             canAdmin={this.props.canAdmin}
-                            canDeleteAnalyses={this.props.canDeleteAnalyses}
                             canCreateVersion={this.props.project.qualifier === 'TRK'}
+                            canDeleteAnalyses={this.props.canDeleteAnalyses}
                             changeEvent={this.props.changeEvent}
                             deleteAnalysis={this.props.deleteAnalysis}
                             deleteEvent={this.props.deleteEvent}
index 567853ebe551985380b6b9ad59ebf08be8d02f7a..e2d931038e40b70312258d54e3dbbb3324bf5824 100644 (file)
@@ -61,7 +61,7 @@ export default function ProjectActivityApp(props /*: Props */) {
     (configuration ? configuration.showHistory : false);
   const canDeleteAnalyses = configuration ? configuration.showHistory : false;
   return (
-    <div id="project-activity" className="page page-limited">
+    <div className="page page-limited" id="project-activity">
       <Suggestions suggestions="project_activity" />
       <Helmet title={translate('project_activity.page')} />
 
@@ -78,12 +78,12 @@ export default function ProjectActivityApp(props /*: Props */) {
           <ProjectActivityAnalysesList
             addCustomEvent={props.addCustomEvent}
             addVersion={props.addVersion}
-            analysesLoading={props.analysesLoading}
             analyses={analyses}
+            analysesLoading={props.analysesLoading}
             canAdmin={canAdmin}
             canDeleteAnalyses={canDeleteAnalyses}
-            className="boxed-group-inner"
             changeEvent={props.changeEvent}
+            className="boxed-group-inner"
             deleteAnalysis={props.deleteAnalysis}
             deleteEvent={props.deleteEvent}
             initializing={props.initializing}
index 927594cfc42761e3797599c45e5fb5e4fae8a9ae..e5bbde9aae75f061c74a0a5ff4bf828e72c7cd03 100644 (file)
@@ -36,5 +36,5 @@ export default function ProjectActivityPageFooter(
   if (!paging || analyses.length === 0) {
     return null;
   }
-  return <ListFooter count={analyses.length} total={paging.total} loadMore={fetchMoreActivity} />;
+  return <ListFooter count={analyses.length} loadMore={fetchMoreActivity} total={paging.total} />;
 }
index 85b0305515b835a1482e6b5899c77302ef9a7c0a..9ad7d3f98f77d1713676c700503fd1d49c01e28f 100644 (file)
@@ -57,21 +57,21 @@ export default class ProjectActivityPageHeader extends React.PureComponent {
         {!['VW', 'SVW'].includes(this.props.project.qualifier) && (
           <Select
             className="input-medium pull-left big-spacer-right"
-            placeholder={translate('project_activity.filter_events') + '...'}
             clearable={true}
+            onChange={this.handleCategoryChange}
+            optionComponent={ProjectActivityEventSelectOption}
+            options={this.options}
+            placeholder={translate('project_activity.filter_events') + '...'}
             searchable={false}
             value={this.props.category}
-            optionComponent={ProjectActivityEventSelectOption}
             valueComponent={ProjectActivityEventSelectValue}
-            options={this.options}
-            onChange={this.handleCategoryChange}
           />
         )}
         <ProjectActivityDateInput
           className="pull-left"
           from={this.props.from}
-          to={this.props.to}
           onChange={this.props.updateQuery}
+          to={this.props.to}
         />
       </header>
     );
index 80d6c9bd86129263e52579d84025cc20a701a686..f92da80a7ff2eab29c7c442cd176c76b53dba89c 100644 (file)
@@ -32,8 +32,8 @@ it('should render correctly an actionable legend', () => {
         className="myclass"
         metric="foo"
         name="Foo"
-        style="1"
         removeMetric={() => {}}
+        style="1"
       />
     )
   ).toMatchSnapshot();
index de9f2696f1cc8acdc428cd1f900d5d021dd5101a..b9e93f16b76cb20b5375f5ac3d6aeb8d24f4846c 100644 (file)
@@ -27,8 +27,8 @@ it('should render correctly the date inputs', () => {
     shallowWithIntl(
       <ProjectActivityDateInput
         from={parseDate('2016-10-27T12:21:15+0000')}
-        to={parseDate('2016-12-27T12:21:15+0000')}
         onChange={() => {}}
+        to={parseDate('2016-12-27T12:21:15+0000')}
       />
     )
   ).toMatchSnapshot();
index 61c9e133c4c47ecac76ee63feabec41dd0a0037d..487ec48c432294caf54143e9b0b4ee1245877f4f 100644 (file)
@@ -89,8 +89,8 @@ export default class LongBranchesPattern extends React.PureComponent<Props, Stat
         <EditButton className="button-small spacer-left" onClick={this.handleChangeClick} />
         {this.state.formOpen && (
           <LongBranchesPatternForm
-            onClose={this.closeForm}
             onChange={this.handleChange}
+            onClose={this.closeForm}
             project={this.props.project}
             setting={setting}
           />
index 381e56d4fd1f4e32e884b32f79e960c81bd101ef..9cd66cea2cf63f51e8381e24929743fc604bbb26 100644 (file)
@@ -131,8 +131,8 @@ export default class QualityProfiles extends React.PureComponent<Props, State> {
           profiles && (
             <Table
               allProfiles={allProfiles}
-              profiles={profiles}
               onChangeProfile={this.handleChangeProfile}
+              profiles={profiles}
             />
           )
         )}
index d430f983921f577cf60f00a5aeff6ce628e2706c..4d31caa9edde2b687d24a6271baa9441f18fb914 100644 (file)
@@ -90,8 +90,8 @@ export default class ProfileRow extends React.PureComponent<Props, State> {
         optionRenderer={this.renderProfileName}
         options={options}
         style={{ width: 300 }}
-        valueRenderer={this.renderProfileName}
         value={profile.key}
+        valueRenderer={this.renderProfileName}
       />
     );
   }
index 27862e2ae5dc1610558c482233f7819baa9be833..1563e159755845e3013ad22f9d246bd1f8acc0e3 100644 (file)
@@ -37,9 +37,9 @@ export default function Table(props: Props) {
   const profileRows = orderedProfiles.map(profile => (
     <ProfileRow
       key={profile.language}
-      profile={profile}
-      possibleProfiles={profilesByLanguage[profile.language]}
       onChangeProfile={props.onChangeProfile}
+      possibleProfiles={profilesByLanguage[profile.language]}
+      profile={profile}
     />
   ));
 
index 9314497e953e6c1a2b5b661c2229691cf1cd8c45..a869603b9ba17b390ad023e143cee6564d06fe11 100644 (file)
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
+import { connect } from 'react-redux';
 import FavoriteFilter from './FavoriteFilter';
-import { withCurrentUser } from '../../../store/withCurrentUser';
+import { getCurrentUser } from '../../../store/rootReducer';
 
-export default withCurrentUser(FavoriteFilter);
+function mapStateToProps(state: any) {
+  return { currentUser: getCurrentUser(state) };
+}
+
+export default connect(mapStateToProps)(FavoriteFilter);
index 0e65862014ae9af8a95884884a450c294d169496..bf55319fd008da27b65459fa86be4d90365e3be7 100644 (file)
@@ -36,7 +36,7 @@ it('should render with coverage selected', () => {
 it('should handle perspective change correctly', () => {
   const onChange = jest.fn();
   const instance = shallow(
-    <PerspectiveSelect view="visualizations" visualization="coverage" onChange={onChange} />
+    <PerspectiveSelect onChange={onChange} view="visualizations" visualization="coverage" />
   ).instance() as PerspectiveSelect;
   instance.handleChange({ label: 'overall', value: 'overall', type: 'view' });
   instance.handleChange({ label: 'leak', value: 'leak', type: 'view' });
index fd86a11afeef9900be1f8f1ac95d654bff00bf89..41a518401c719d1cb786e4c0659c7fca9347b599 100644 (file)
@@ -51,9 +51,7 @@ interface DispatchProps {
   skipOnboardingAction: () => void;
 }
 
-interface Props extends OwnProps, StateProps, DispatchProps {
-  currentUser: LoggedInUser;
-}
+type Props = StateProps & DispatchProps & OwnProps;
 
 interface State {
   identityProvider?: IdentityProvider;
@@ -101,7 +99,7 @@ export class CreateProjectPage extends React.PureComponent<Props, State> {
   };
 
   canAutoCreate = ({ currentUser } = this.props) => {
-    return ['bitbucket', 'github'].includes(currentUser.externalProvider || '');
+    return ['bitbucket', 'github'].includes((currentUser as LoggedInUser).externalProvider || '');
   };
 
   fetchIdentityProviders = () => {
@@ -110,7 +108,8 @@ export class CreateProjectPage extends React.PureComponent<Props, State> {
         if (this.mounted) {
           this.setState({
             identityProvider: identityProviders.find(
-              identityProvider => identityProvider.key === this.props.currentUser.externalProvider
+              identityProvider =>
+                identityProvider.key === (this.props.currentUser as LoggedInUser).externalProvider
             ),
             loading: false
           });
@@ -143,6 +142,11 @@ export class CreateProjectPage extends React.PureComponent<Props, State> {
 
   render() {
     const { currentUser } = this.props;
+
+    if (!isLoggedIn(currentUser)) {
+      return null;
+    }
+
     const { identityProvider, loading } = this.state;
     const displayManual = parseQuery(this.props.location.query).manual;
     const header = translate('onboarding.create_project.header');
@@ -208,14 +212,13 @@ export class CreateProjectPage extends React.PureComponent<Props, State> {
   }
 }
 
-const mapStateToProps = (state: any): StateProps => {
-  return {
-    currentUser: getCurrentUser(state)
-  };
-};
+const mapStateToProps = (state: any): StateProps => ({
+  currentUser: getCurrentUser(state)
+});
 
 const mapDispatchToProps: DispatchProps = { addGlobalErrorMessage, skipOnboardingAction };
 
-export default connect<StateProps, DispatchProps, OwnProps>(mapStateToProps, mapDispatchToProps)(
-  CreateProjectPage
-);
+export default connect<StateProps, DispatchProps, OwnProps>(
+  mapStateToProps,
+  mapDispatchToProps
+)(CreateProjectPage);
index d1df2b59ec053479d18a1eab2b8aa36872847b2a..299dc7676e0a81d7ef4c1122f9492dc9a64cb1d3 100644 (file)
@@ -222,6 +222,7 @@ const mapStateToProps = (state: any): StateProps => {
     userOrganizations: getMyOrganizations(state)
   };
 };
-export default connect<StateProps, DispatchProps, OwnProps>(mapStateToProps, mapDispatchToProps)(
-  ManualProjectCreate
-);
+export default connect<StateProps, DispatchProps, OwnProps>(
+  mapStateToProps,
+  mapDispatchToProps
+)(ManualProjectCreate);
index 4963cfc5ebc34c102d32ac18245c26478aca92c6..64a746fc61cc90ce7cb6d6f557d4d617bc2bafa8 100644 (file)
@@ -31,15 +31,18 @@ export interface Query {
   manual: boolean;
 }
 
-export const parseQuery = memoize((urlQuery: RawQuery): Query => {
-  return {
-    error: parseAsOptionalString(urlQuery['error']),
-    manual: parseAsBoolean(urlQuery['manual'], false)
-  };
-});
+export const parseQuery = memoize(
+  (urlQuery: RawQuery): Query => {
+    return {
+      error: parseAsOptionalString(urlQuery['error']),
+      manual: parseAsBoolean(urlQuery['manual'], false)
+    };
+  }
+);
 
-export const serializeQuery = memoize((query: Query): RawQuery =>
-  cleanQuery({
-    manual: serializeOptionalBoolean(query.manual || undefined)
-  })
+export const serializeQuery = memoize(
+  (query: Query): RawQuery =>
+    cleanQuery({
+      manual: serializeOptionalBoolean(query.manual || undefined)
+    })
 );
index c2a1936e85d411530fd2520ed20a9ec24a38baae..e76a506d58f141b213d374c4db5105d1cf5b0e47 100644 (file)
@@ -42,20 +42,20 @@ export default function CoverageFilter(props: Props) {
 
   return (
     <Filter
+      className={props.className}
       facet={props.facet}
+      getFacetValueForOption={getFacetValueForOption}
+      header={<FilterHeader name={translate('metric_domain.Coverage')} />}
+      highlightUnder={1}
+      highlightUnderMax={5}
       maxFacetValue={props.maxFacetValue}
       onQueryChange={props.onQueryChange}
-      value={props.value}
-      property={property}
-      className={props.className}
       options={[1, 2, 3, 4, 5, 6]}
+      organization={props.organization}
+      property={property}
       query={props.query}
       renderOption={renderOption}
-      organization={props.organization}
-      getFacetValueForOption={getFacetValueForOption}
-      highlightUnder={1}
-      highlightUnderMax={5}
-      header={<FilterHeader name={translate('metric_domain.Coverage')} />}
+      value={props.value}
     />
   );
 }
@@ -70,9 +70,9 @@ function renderOption(option: number, selected: boolean) {
     <span>
       {option < 6 && (
         <CoverageRating
-          value={getCoverageRatingAverageValue(option)}
-          size="small"
           muted={!selected}
+          size="small"
+          value={getCoverageRatingAverageValue(option)}
         />
       )}
       <span className="spacer-left">
index 82c3ab42114977cbd86fc0f60ef87bdf1c12efc3..36e8840f3eeb4aa7abe008318c8708854d9466c6 100644 (file)
@@ -44,20 +44,20 @@ export default function DuplicationsFilter(props: Props) {
   const { property = 'duplications' } = props;
   return (
     <Filter
+      className={props.className}
       facet={props.facet}
+      getFacetValueForOption={getFacetValueForOption}
+      header={<FilterHeader name={translate('metric_domain.Duplications')} />}
+      highlightUnder={1}
+      highlightUnderMax={5}
       maxFacetValue={props.maxFacetValue}
       onQueryChange={props.onQueryChange}
-      value={props.value}
-      property={property}
-      className={props.className}
       options={[1, 2, 3, 4, 5, 6]}
+      organization={props.organization}
+      property={property}
       query={props.query}
       renderOption={renderOption}
-      organization={props.organization}
-      getFacetValueForOption={getFacetValueForOption}
-      highlightUnder={1}
-      highlightUnderMax={5}
-      header={<FilterHeader name={translate('metric_domain.Duplications')} />}
+      value={props.value}
     />
   );
 }
@@ -72,9 +72,9 @@ function renderOption(option: number, selected: boolean) {
     <span>
       {option < 6 && (
         <DuplicationsRating
-          value={getDuplicationsRatingAverageValue(option)}
-          size="small"
           muted={!selected}
+          size="small"
+          value={getDuplicationsRatingAverageValue(option)}
         />
       )}
       <span className="spacer-left">
index 50a9fa718e09a25d927e8bb8a0ebcde5c62419b3..7c980fa4566745c1d2b2ff18473e9d1895b08b9c 100644 (file)
@@ -97,7 +97,7 @@ export default class Filter extends React.PureComponent<Props> {
       <div className="projects-facet-bar">
         <div
           className="projects-facet-bar-inner"
-          style={{ width: facetValue / this.props.maxFacetValue * 60 }}
+          style={{ width: (facetValue / this.props.maxFacetValue) * 60 }}
         />
       </div>
     );
index 06be03f8cc6249622d28817e948cf30ff39284a1..4e4a15042a45d904025b8b51f31fd0c7ec25edbb 100644 (file)
@@ -41,23 +41,23 @@ interface Props {
 export default function IssuesFilter(props: Props) {
   return (
     <Filter
-      facet={props.facet}
-      maxFacetValue={props.maxFacetValue}
-      onQueryChange={props.onQueryChange}
-      value={props.value}
-      property={props.property}
       className={props.className}
-      options={[1, 2, 3, 4, 5]}
-      query={props.query}
-      renderOption={renderOption}
-      organization={props.organization}
+      facet={props.facet}
       getFacetValueForOption={getFacetValueForOption}
-      highlightUnder={1}
       header={
         <FilterHeader name={translate('metric_domain', props.name)}>
           {props.headerDetail}
         </FilterHeader>
       }
+      highlightUnder={1}
+      maxFacetValue={props.maxFacetValue}
+      onQueryChange={props.onQueryChange}
+      options={[1, 2, 3, 4, 5]}
+      organization={props.organization}
+      property={props.property}
+      query={props.query}
+      renderOption={renderOption}
+      value={props.value}
     />
   );
 }
@@ -69,7 +69,7 @@ function getFacetValueForOption(facet: Facet, option: number) {
 function renderOption(option: number, selected: boolean) {
   return (
     <span>
-      <Rating value={option} small={true} muted={!selected} />
+      <Rating muted={!selected} small={true} value={option} />
     </span>
   );
 }
index 1c39277af7dd3dab9af21e209fa3cc98e0ede6b6..2481e0b69864ecbfa2d3f9cac26f7d4741d6c7b9 100644 (file)
@@ -59,8 +59,8 @@ export default class LanguagesFilter extends React.Component<Props> {
 
   renderOption = (option: string) => (
     <SearchableFilterOption
-      optionKey={option}
       option={getLanguageByKey(this.props.languages, option)}
+      optionKey={option}
     />
   );
 
@@ -69,26 +69,26 @@ export default class LanguagesFilter extends React.Component<Props> {
 
     return (
       <Filter
-        onQueryChange={this.props.onQueryChange}
-        property={property}
-        options={this.getSortedOptions(this.props.facet)}
-        query={this.props.query}
-        renderOption={this.renderOption}
-        value={this.props.value}
         facet={this.props.facet}
-        maxFacetValue={this.props.maxFacetValue}
-        organization={this.props.organization}
-        getFacetValueForOption={this.getFacetValueForOption}
-        header={<FilterHeader name={translate('projects.facets.languages')} />}
         footer={
           <SearchableFilterFooter
             onQueryChange={this.props.onQueryChange}
-            organization={this.props.organization}
             options={this.getSearchOptions()}
+            organization={this.props.organization}
             property={property}
             query={this.props.query}
           />
         }
+        getFacetValueForOption={this.getFacetValueForOption}
+        header={<FilterHeader name={translate('projects.facets.languages')} />}
+        maxFacetValue={this.props.maxFacetValue}
+        onQueryChange={this.props.onQueryChange}
+        options={this.getSortedOptions(this.props.facet)}
+        organization={this.props.organization}
+        property={property}
+        query={this.props.query}
+        renderOption={this.renderOption}
+        value={this.props.value}
       />
     );
   }
index 4ea87c71bb3aa743f70c1488bf347610eb941149..860901a592924755686301eb25273256ff5a88a1 100644 (file)
@@ -21,5 +21,5 @@ import * as React from 'react';
 import CoverageFilter, { Props } from './CoverageFilter';
 
 export default function NewCoverageFilter(props: Props) {
-  return <CoverageFilter {...props} property="new_coverage" className="leak-facet-box" />;
+  return <CoverageFilter {...props} className="leak-facet-box" property="new_coverage" />;
 }
index 684612da89ec3f1d81313863798d3f094e2d7b29..c15766b0c682b71874e0ae7afdd5675bd81b76e2 100644 (file)
@@ -21,5 +21,5 @@ import * as React from 'react';
 import DuplicationsFilter, { Props } from './DuplicationsFilter';
 
 export default function NewDuplicationsFilter(props: Props) {
-  return <DuplicationsFilter {...props} property="new_duplications" className="leak-facet-box" />;
+  return <DuplicationsFilter {...props} className="leak-facet-box" property="new_duplications" />;
 }
index a8141038de6fe8ec62c1b13b43de79cd0a9372a2..468f0cb53758da838ea9a1e9af691c6108081ef6 100644 (file)
@@ -41,19 +41,19 @@ export default function NewLinesFilter(props: Props) {
 
   return (
     <Filter
+      className="leak-facet-box"
       facet={props.facet}
+      getFacetValueForOption={getFacetValueForOption}
+      header={<FilterHeader name={translate('projects.facets.new_lines')} />}
+      highlightUnder={1}
       maxFacetValue={props.maxFacetValue}
       onQueryChange={props.onQueryChange}
-      value={props.value}
-      property={property}
-      className="leak-facet-box"
       options={[1, 2, 3, 4, 5]}
+      organization={props.organization}
+      property={property}
       query={props.query}
       renderOption={renderOption}
-      organization={props.organization}
-      getFacetValueForOption={getFacetValueForOption}
-      highlightUnder={1}
-      header={<FilterHeader name={translate('projects.facets.new_lines')} />}
+      value={props.value}
     />
   );
 }
index cffd2ccb8f22aabed2f59f33c39796150637ef39..072116972fe4acba30d3855dfe5a2b2e5b8147ad 100644 (file)
@@ -39,16 +39,16 @@ export default function QualityGateFilter(props: Props) {
   return (
     <Filter
       facet={props.facet}
+      getFacetValueForOption={getFacetValueForOption}
+      header={<FilterHeader name={translate('projects.facets.quality_gate')} />}
       maxFacetValue={props.maxFacetValue}
       onQueryChange={props.onQueryChange}
-      value={props.value}
-      property="gate"
       options={['OK', 'WARN', 'ERROR']}
+      organization={props.organization}
+      property="gate"
       query={props.query}
       renderOption={renderOption}
-      organization={props.organization}
-      getFacetValueForOption={getFacetValueForOption}
-      header={<FilterHeader name={translate('projects.facets.quality_gate')} />}
+      value={props.value}
     />
   );
 }
@@ -58,5 +58,5 @@ function getFacetValueForOption(facet: Facet, option: string) {
 }
 
 function renderOption(option: string, selected: boolean) {
-  return <Level level={option} small={true} muted={!selected} />;
+  return <Level level={option} muted={!selected} small={true} />;
 }
index 570c57220281c9a3ce1699b5d216f7de4c02ed51..ec70339a0051379c2d11f74e0f4093978c529835 100644 (file)
@@ -42,19 +42,19 @@ export default function SizeFilter(props: Props) {
 
   return (
     <Filter
+      className={props.className}
       facet={props.facet}
+      getFacetValueForOption={getFacetValueForOption}
+      header={<FilterHeader name={translate('metric_domain.Size')} />}
+      highlightUnder={1}
       maxFacetValue={props.maxFacetValue}
       onQueryChange={props.onQueryChange}
-      value={props.value}
-      property={property}
-      className={props.className}
       options={[1, 2, 3, 4, 5]}
+      organization={props.organization}
+      property={property}
       query={props.query}
       renderOption={renderOption}
-      organization={props.organization}
-      getFacetValueForOption={getFacetValueForOption}
-      highlightUnder={1}
-      header={<FilterHeader name={translate('metric_domain.Size')} />}
+      value={props.value}
     />
   );
 }
@@ -67,7 +67,7 @@ function getFacetValueForOption(facet: Facet, option: number) {
 function renderOption(option: number, selected: boolean) {
   return (
     <span>
-      <SizeRating value={getSizeRatingAverageValue(option)} small={true} muted={!selected} />
+      <SizeRating muted={!selected} small={true} value={getSizeRatingAverageValue(option)} />
       <span className="spacer-left">{getSizeRatingLabel(option)}</span>
     </span>
   );
index e833751488327db90d6af1d5520e0e7bb80153e8..3227f92daf242ae31777f052d11c26e80807ee98 100644 (file)
@@ -105,29 +105,29 @@ export default class TagsFilter extends React.PureComponent<Props, State> {
 
     return (
       <Filter
-        onQueryChange={this.props.onQueryChange}
-        property={property}
-        options={this.getSortedOptions(this.props.facet)}
-        query={this.props.query}
-        renderOption={this.renderOption}
-        value={this.props.value}
         facet={this.props.facet}
-        maxFacetValue={this.props.maxFacetValue}
-        organization={this.props.organization}
-        getFacetValueForOption={this.getFacetValueForOption}
-        header={<FilterHeader name={translate('projects.facets.tags')} />}
         footer={
           <SearchableFilterFooter
-            onQueryChange={this.props.onQueryChange}
             isLoading={this.state.isLoading}
             onInputChange={this.handleSearch}
             onOpen={this.handleSearch}
-            organization={this.props.organization}
+            onQueryChange={this.props.onQueryChange}
             options={this.getSearchOptions()}
+            organization={this.props.organization}
             property={property}
             query={this.props.query}
           />
         }
+        getFacetValueForOption={this.getFacetValueForOption}
+        header={<FilterHeader name={translate('projects.facets.tags')} />}
+        maxFacetValue={this.props.maxFacetValue}
+        onQueryChange={this.props.onQueryChange}
+        options={this.getSortedOptions(this.props.facet)}
+        organization={this.props.organization}
+        property={property}
+        query={this.props.query}
+        renderOption={this.renderOption}
+        value={this.props.value}
       />
     );
   }
index c9b1faa82e0d30b2413b3a6777ac153b99443287..4bc227b99493b28a5f062a66d06ed7f8c19748f8 100644 (file)
@@ -31,9 +31,9 @@ it('should render items without the ones in the facet', () => {
   const wrapper = shallow(
     <SearchableFilterFooter
       onQueryChange={jest.fn()}
+      options={options}
       property="languages"
       query={{ languages: ['java'] }}
-      options={options}
     />,
     { context: { router: { push: jest.fn() } } }
   );
@@ -45,9 +45,9 @@ it('should render items without the ones in the facet', () => {
   const wrapper = shallow(
     <SearchableFilterFooter
       onQueryChange={onQueryChange}
+      options={options}
       property="languages"
       query={{ languages: ['java'] }}
-      options={options}
     />,
     { context: { router: { push: jest.fn() } } }
   );
index d7f4ee801ecb6101103540d949557971ed7c6bb6..b924d7fba44034d10b90a24468b3891f4cffd11f 100644 (file)
@@ -26,7 +26,7 @@ const tagsFacet = { lang: 4, sonar: 3, csharp: 1 };
 
 it('should render the tags without the ones in the facet', () => {
   const wrapper = shallow(
-    <TagsFilter onQueryChange={jest.fn()} query={{ tags: null }} facet={tagsFacet} />
+    <TagsFilter facet={tagsFacet} onQueryChange={jest.fn()} query={{ tags: null }} />
   );
   expect(wrapper).toMatchSnapshot();
   wrapper.setState({ tags });
@@ -36,10 +36,10 @@ it('should render the tags without the ones in the facet', () => {
 it('should render the tags facet with the selected tags', () => {
   const wrapper = shallow(
     <TagsFilter
+      facet={tagsFacet}
       onQueryChange={jest.fn()}
       query={{ tags: ['lang', 'sonar'] }}
       value={['lang', 'sonar']}
-      facet={tagsFacet}
     />
   );
   expect(wrapper).toMatchSnapshot();
@@ -49,10 +49,10 @@ it('should render the tags facet with the selected tags', () => {
 it('should render maximum 10 tags in the searchbox results', () => {
   const wrapper = shallow(
     <TagsFilter
+      facet={{ ...tagsFacet, ad: 1 }}
       onQueryChange={jest.fn()}
       query={{ languages: ['java', 'ad'] }}
       value={['java', 'ad']}
-      facet={{ ...tagsFacet, ad: 1 }}
     />
   );
   wrapper.setState({ tags: [...tags, 'aa', 'ab', 'ac', 'ad', 'ae', 'af', 'ag', 'ah', 'ai'] });
index 753e245be49fd1b0e8e9b1ed40d943128aa13c5f..474b8d89e8ee50f060846a241c2ff8cc660b88af 100644 (file)
@@ -360,7 +360,7 @@ function format(periods: Array<{ value: number; label: string }>) {
 }
 
 export function formatDuration(value: number) {
-  if(value < ONE_MINUTE) {
+  if (value < ONE_MINUTE) {
     return translate('duration.seconds');
   }
   const years = Math.floor(value / ONE_YEAR);
index 9004f091ac879bd6e187b77a15c1dc394bd38fe5..30f543f096d10935f61c1236891424195b2f88f4 100644 (file)
@@ -102,5 +102,8 @@ const mapDispatchToProps = (dispatch: Function) => ({
 });
 
 export default forSingleOrganization(
-  connect<StateProps, DispatchProps, OwnProps>(mapStateToProps, mapDispatchToProps)(AppContainer)
+  connect<StateProps, DispatchProps, OwnProps>(
+    mapStateToProps,
+    mapDispatchToProps
+  )(AppContainer)
 );
index 483d4bfcf0b6d2c03d5e5873f56ca08537644b18..d22d36f9c7ded8d8b7ecdb5a37029aa34975f1cf 100644 (file)
@@ -96,7 +96,7 @@ export class DetailsApp extends React.PureComponent<Props, State> {
   handleAddCondition = (condition: Condition) => {
     this.setState(({ qualityGate }) => {
       if (!qualityGate) {
-        return undefined;
+        return null;
       }
       return { qualityGate: addCondition(qualityGate, condition) };
     });
@@ -105,7 +105,7 @@ export class DetailsApp extends React.PureComponent<Props, State> {
   handleSaveCondition = (newCondition: Condition, oldCondition: Condition) => {
     this.setState(({ qualityGate }) => {
       if (!qualityGate) {
-        return undefined;
+        return null;
       }
       return { qualityGate: replaceCondition(qualityGate, newCondition, oldCondition) };
     });
@@ -114,7 +114,7 @@ export class DetailsApp extends React.PureComponent<Props, State> {
   handleRemoveCondition = (condition: Condition) => {
     this.setState(({ qualityGate }) => {
       if (!qualityGate) {
-        return undefined;
+        return null;
       }
       return { qualityGate: deleteCondition(qualityGate, condition) };
     });
@@ -123,7 +123,7 @@ export class DetailsApp extends React.PureComponent<Props, State> {
   handleSetDefault = () => {
     this.setState(({ qualityGate }) => {
       if (!qualityGate) {
-        return undefined;
+        return null;
       }
       this.props.onSetDefault(qualityGate);
       const newQualityGate: QualityGate = {
index 2c9ab530964fbd7b2ea6e2bf5ee9b3dcd6e3fbb6..f03ac029d8648a49001f18bafdf8c56efbd08522 100644 (file)
@@ -59,7 +59,7 @@ export default function Changelog(props: Props) {
     const className = 'js-profile-changelog-event ' + (isEvenRow ? 'even' : 'odd');
 
     return (
-      <tr key={index} className={className}>
+      <tr className={className} key={index}>
         <td className="thin nowrap">{!isBulkChange && <DateTimeFormatter date={event.date} />}</td>
 
         <td className="thin nowrap">
index f461c668672a3c6d5469af4aeccafe7c2bb7f61b..bb3fa09aa81f99a5b9c072d56322d72752980c5a 100644 (file)
@@ -116,10 +116,10 @@ export default class ComparisonContainer extends React.PureComponent<Props, Stat
       <div className="boxed-group boxed-group-inner js-profile-comparison">
         <header>
           <ComparisonForm
-            withKey={withKey}
+            onCompare={this.handleCompare}
             profile={profile}
             profiles={profiles}
-            onCompare={this.handleCompare}
+            withKey={withKey}
           />
 
           {this.state.loading && <i className="spinner spacer-left" />}
@@ -132,12 +132,12 @@ export default class ComparisonContainer extends React.PureComponent<Props, Stat
           modified != null && (
             <div className="spacer-top">
               <ComparisonResults
-                left={left}
-                right={right}
                 inLeft={inLeft}
                 inRight={inRight}
+                left={left}
                 modified={modified}
                 organization={this.props.organization}
+                right={right}
               />
             </div>
           )}
index c2900d499cae47f35aafc524f96a34efb90df909..5cbba2b10cca8ea509cc79c704d8cab21e8c79f9 100644 (file)
@@ -44,12 +44,12 @@ export default class ComparisonForm extends React.PureComponent<Props> {
       <div className="display-inline-block">
         <label className="spacer-right">{translate('quality_profiles.compare_with')}</label>
         <Select
-          value={withKey}
-          options={options}
-          placeholder={translate('select_verb')}
-          clearable={false}
           className="input-large"
+          clearable={false}
           onChange={this.handleChange.bind(this)}
+          options={options}
+          placeholder={translate('select_verb')}
+          value={withKey}
         />
       </div>
     );
index fc475311f68d2b1b63551793fa62d9ceca934ef5..b4938f4cf1b69cdbdb170f09623816fe6c504ff1 100644 (file)
@@ -57,7 +57,7 @@ export default class ComparisonResults extends React.PureComponent<Props> {
     return (
       <ul>
         {Object.keys(params).map(key => (
-          <li key={key} className="spacer-top">
+          <li className="spacer-top" key={key}>
             <code>
               {key}
               {': '}
@@ -88,7 +88,7 @@ export default class ComparisonResults extends React.PureComponent<Props> {
           <td>&nbsp;</td>
         </tr>
         {this.props.inLeft.map(rule => (
-          <tr key={`left-${rule.key}`} className="js-comparison-in-left">
+          <tr className="js-comparison-in-left" key={`left-${rule.key}`}>
             <td>{this.renderRule(rule, rule.severity)}</td>
             <td>&nbsp;</td>
           </tr>
@@ -116,7 +116,7 @@ export default class ComparisonResults extends React.PureComponent<Props> {
           </td>
         </tr>
         {this.props.inRight.map(rule => (
-          <tr key={`right-${rule.key}`} className="js-comparison-in-right">
+          <tr className="js-comparison-in-right" key={`right-${rule.key}`}>
             <td>&nbsp;</td>
             <td>{this.renderRule(rule, rule.severity)}</td>
           </tr>
@@ -132,7 +132,7 @@ export default class ComparisonResults extends React.PureComponent<Props> {
     return (
       <>
         <tr>
-          <td colSpan={2} className="text-center">
+          <td className="text-center" colSpan={2}>
             <h6>
               {translateWithParameters(
                 'quality_profiles.x_rules_have_different_configuration',
@@ -150,7 +150,7 @@ export default class ComparisonResults extends React.PureComponent<Props> {
           </td>
         </tr>
         {this.props.modified.map(rule => (
-          <tr key={`modified-${rule.key}`} className="js-comparison-modified">
+          <tr className="js-comparison-modified" key={`modified-${rule.key}`}>
             <td>
               {this.renderRule(rule, rule.left.severity)}
               {this.renderParameters(rule.left.params)}
index 9399a905167d0e0430a8eef400533dd141d94781..74a3797e25a8032900b8a4af0a73a5262e725bb3 100644 (file)
@@ -32,10 +32,10 @@ it('should render Select with right options', () => {
 
   const output = shallow(
     <ComparisonForm
-      withKey="another"
+      onCompare={() => true}
       profile={profile}
       profiles={profiles}
-      onCompare={() => true}
+      withKey="another"
     />
   ).find('Select');
   expect(output.length).toBe(1);
index 02c86c350883983040fd1a604475dfd90dead4c9..6ae04a58e3730f29990198022f7a8b8031c27fce 100644 (file)
@@ -26,12 +26,12 @@ import ComparisonEmpty from '../ComparisonEmpty';
 it('should render ComparisonEmpty', () => {
   const output = shallow(
     <ComparisonResults
-      left={{ name: 'left' }}
-      right={{ name: 'right' }}
       inLeft={[]}
       inRight={[]}
+      left={{ name: 'left' }}
       modified={[]}
       organization={null}
+      right={{ name: 'right' }}
     />
   );
   expect(output.is(ComparisonEmpty)).toBe(true);
@@ -60,12 +60,12 @@ it('should compare', () => {
 
   const output = shallow(
     <ComparisonResults
-      left={{ name: 'left' }}
-      right={{ name: 'right' }}
       inLeft={inLeft}
       inRight={inRight}
+      left={{ name: 'left' }}
       modified={modified}
       organization={null}
+      right={{ name: 'right' }}
     />
   );
 
index 1da66735a8c76caa4d0dbc07a22d835ca9e8d23f..417c54699d6c9a0bb2588e7859f13344524cf582 100644 (file)
@@ -45,5 +45,8 @@ const mapDispatchToProps = (dispatch: any) => ({
 });
 
 export default forSingleOrganization(
-  connect<StateProps, DispatchProps>(mapStateToProps, mapDispatchToProps)(App)
+  connect<StateProps, DispatchProps>(
+    mapStateToProps,
+    mapDispatchToProps
+  )(App)
 );
index f55b48206dfe156c04617c664fbe0bd5aad6e7b4..bbefe239932f2084d0f9529b78afa0748fab9cea 100644 (file)
@@ -30,7 +30,7 @@ export default function ProfileNotFound(props: Props) {
   return (
     <div className="quality-profile-not-found">
       <div className="note spacer-bottom">
-        <IndexLink to={getProfilesPath(props.organization)} className="text-muted">
+        <IndexLink className="text-muted" to={getProfilesPath(props.organization)}>
           {translate('quality_profiles.page')}
         </IndexLink>
       </div>
index baf38997a155e05a63d5fd1e01b676325b7ebd3d..e109904423288f29f4dc90c86bb70e0a8d262268 100644 (file)
@@ -85,9 +85,9 @@ export default class EmailAlreadyExists extends React.PureComponent<Props, State
         <img
           alt={identityProvider.name}
           className="little-spacer-right"
+          height="14"
           src={getBaseUrl() + identityProvider.iconPath}
           width="14"
-          height="14"
         />
         {login}
       </div>
@@ -102,8 +102,8 @@ export default class EmailAlreadyExists extends React.PureComponent<Props, State
     const { query } = this.props.location;
 
     return (
-      <div id="bd" className="page-wrapper-simple">
-        <div id="nonav" className="page-simple">
+      <div className="page-wrapper-simple" id="bd">
+        <div className="page-simple" id="nonav">
           <div className="big-spacer-bottom js-existing-account">
             <p className="little-spacer-bottom">
               <FormattedMessage
index 31e0eb9bc60842cc2dc4f7a2c1d4900b4b15f49e..ed4c7dacfe9c284e1e2b032c914002ac955b4ef4 100644 (file)
@@ -116,6 +116,7 @@ class LoginContainer extends React.PureComponent<Props, State> {
 const mapStateToProps = null;
 const mapDispatchToProps = { doLogin: doLogin as any };
 
-export default connect<{}, DispatchToProps, OwnProps>(mapStateToProps, mapDispatchToProps)(
-  LoginContainer
-);
+export default connect<{}, DispatchToProps, OwnProps>(
+  mapStateToProps,
+  mapDispatchToProps
+)(LoginContainer);
index 8a07c646df846c1b222a5b4d5cd08db14f60c877..ceaafa0988f30d8fda9072eca6cc06dae53f6987 100644 (file)
@@ -54,4 +54,7 @@ const mapStateToProps = () => ({});
 
 const mapDispatchToProps = { doLogout };
 
-export default connect(mapStateToProps, mapDispatchToProps)(Logout as any);
+export default connect(
+  mapStateToProps,
+  mapDispatchToProps
+)(Logout as any);
index cace627584612c75304bd83040cd111251278da3..048f0d27516d8c0a5f9539ad92f9e2b887b36ef4 100644 (file)
@@ -85,9 +85,9 @@ export default class UpdateLogin extends React.PureComponent<Props, State> {
         <img
           alt={identityProvider.name}
           className="little-spacer-right"
+          height="14"
           src={getBaseUrl() + identityProvider.iconPath}
           width="14"
-          height="14"
         />
         {login}
       </div>
@@ -102,8 +102,8 @@ export default class UpdateLogin extends React.PureComponent<Props, State> {
     const { query } = this.props.location;
 
     return (
-      <div id="bd" className="page-wrapper-simple">
-        <div id="nonav" className="page-simple">
+      <div className="page-wrapper-simple" id="bd">
+        <div className="page-simple" id="nonav">
           <div className="big-spacer-bottom js-provider-name">
             <p className="little-spacer-bottom">
               <FormattedMessage
index 21f8d383e5d91335d1562e08049576fd0a6fdc1b..378494100f677196e68009810a7b550a3b5b610f 100644 (file)
@@ -69,7 +69,7 @@ export default class App extends React.PureComponent {
     const selectedCategory = query.category || this.props.defaultCategory;
 
     return (
-      <div id="settings-page" className="page page-limited">
+      <div className="page page-limited" id="settings-page">
         <Suggestions suggestions="settings" />
         <Helmet title={translate('settings.page')} />
 
@@ -79,12 +79,12 @@ export default class App extends React.PureComponent {
           <div className="side-tabs-side">
             <AllCategoriesList
               component={this.props.component}
-              selectedCategory={selectedCategory}
               defaultCategory={this.props.defaultCategory}
+              selectedCategory={selectedCategory}
             />
           </div>
           <div className="side-tabs-main">
-            <CategoryDefinitionsList component={this.props.component} category={selectedCategory} />
+            <CategoryDefinitionsList category={selectedCategory} component={this.props.component} />
             {selectedCategory === 'exclusions' && <WildcardsHelp />}
           </div>
         </div>
index 71a01f026a4eab2030868b627974728cee39982e..d2d4f003e7a66d0d90f60bf12e3ec2e3b1239b0f 100644 (file)
@@ -28,4 +28,7 @@ const mapStateToProps = state => ({
 
 const mapdispatchToProps = { fetchSettings };
 
-export default connect(mapStateToProps, mapdispatchToProps)(App);
+export default connect(
+  mapStateToProps,
+  mapdispatchToProps
+)(App);
index 3cff69cff00c404c3337350f73f5ed75898e945d..8b61e566c2e8c79c68f3f5e0ff06d9da349fbbe4 100644 (file)
@@ -59,7 +59,7 @@ export default class CategoriesList extends React.PureComponent {
     const pathname = this.props.component ? '/project/settings' : '/settings';
 
     return (
-      <IndexLink to={{ pathname, query }} className={className} title={category.name}>
+      <IndexLink className={className} title={category.name} to={{ pathname, query }}>
         {category.name}
       </IndexLink>
     );
@@ -74,7 +74,9 @@ export default class CategoriesList extends React.PureComponent {
 
     return (
       <ul className="side-tabs-menu">
-        {sortedCategories.map(category => <li key={category.key}>{this.renderLink(category)}</li>)}
+        {sortedCategories.map(category => (
+          <li key={category.key}>{this.renderLink(category)}</li>
+        ))}
       </ul>
     );
   }
index 8f380a5de6dd73906a5cbbd9e499d9d74a145d7b..630ce8bbc98d8f01512aac97f0bec007ebea62bf 100644 (file)
@@ -33,4 +33,7 @@ const mapStateToProps = (state, ownProps) => ({
 
 const mapDispatchToProps = { fetchValues };
 
-export default connect(mapStateToProps, mapDispatchToProps)(SubCategoryDefinitionsList);
+export default connect(
+  mapStateToProps,
+  mapDispatchToProps
+)(SubCategoryDefinitionsList);
index ab25a45251bdfb572db541b255881c06e097f8b0..668c22c63770153dab5eee16112872b79c63fd5f 100644 (file)
@@ -222,11 +222,14 @@ const mapStateToProps = (state, ownProps) => ({
   validationMessage: getSettingsAppValidationMessage(state, ownProps.setting.definition.key)
 });
 
-export default connect(mapStateToProps, {
-  changeValue,
-  saveValue,
-  resetValue,
-  passValidation,
-  cancelChange,
-  checkValue
-})(Definition);
+export default connect(
+  mapStateToProps,
+  {
+    changeValue,
+    saveValue,
+    resetValue,
+    passValidation,
+    cancelChange,
+    checkValue
+  }
+)(Definition);
index 25404abd729bea95f9906efe26c6e0471599a133..1a7cb685cdbe9da7c8637fd1842cc8c6faa55015 100644 (file)
@@ -35,7 +35,7 @@ export default class InputForBoolean extends React.PureComponent {
 
     return (
       <div className="display-inline-block text-top">
-        <Toggle name={this.props.name} value={displayedValue} onChange={this.props.onChange} />
+        <Toggle name={this.props.name} onChange={this.props.onChange} value={displayedValue} />
 
         {!hasValue && <span className="spacer-left note">{translate('settings.not_set')}</span>}
       </div>
index 3df0a656c4c38b182537152b65c1988bde9332f2..15173960462a25f59683cdc292e1a0ba8948b74e 100644 (file)
@@ -40,12 +40,12 @@ export default class InputForSingleSelectList extends React.PureComponent {
 
     return (
       <Select
-        name={this.props.name}
         className="settings-large-input"
-        options={options}
         clearable={false}
-        value={this.props.value}
+        name={this.props.name}
         onChange={option => this.handleInputChange(option)}
+        options={options}
+        value={this.props.value}
       />
     );
   }
index b725fe2653c2b10945c195164ac11b25f782b9ab..7193e8a118d209c53370bf2380ce94d72b938d7a 100644 (file)
@@ -30,11 +30,11 @@ export default class InputForText extends React.PureComponent {
   render() {
     return (
       <textarea
-        name={this.props.name}
         className="settings-large-input text-top"
+        name={this.props.name}
+        onChange={e => this.handleInputChange(e)}
         rows="5"
         value={this.props.value || ''}
-        onChange={e => this.handleInputChange(e)}
       />
     );
   }
index dae49df28e03aa968a3287bd7c85d0462937341b..47ddb1945e7818357f93a733a6a4b594fb90bb48 100644 (file)
@@ -58,11 +58,11 @@ export default class MultiValueInput extends React.PureComponent {
 
   renderInput(value, index, isLast) {
     return (
-      <li key={index} className="spacer-bottom">
+      <li className="spacer-bottom" key={index}>
         <PrimitiveInput
+          onChange={this.handleSingleInputChange.bind(this, index)}
           setting={this.prepareSetting()}
           value={value}
-          onChange={this.handleSingleInputChange.bind(this, index)}
         />
 
         {!isLast && (
index a1c956831f667b8d83533e57deeb26abd90f79f6..327031a34e85379fac42cb1669a5f2fdddf3e008 100644 (file)
@@ -54,11 +54,11 @@ export default class PrimitiveInput extends React.PureComponent {
     if (definition.type === types.TYPE_SINGLE_SELECT_LIST) {
       return (
         <InputForSingleSelectList
-          name={name}
-          value={value}
           isDefault={isDefaultOrInherited(setting)}
-          options={definition.options}
+          name={name}
           onChange={onChange}
+          options={definition.options}
+          value={value}
           {...other}
         />
       );
@@ -67,10 +67,10 @@ export default class PrimitiveInput extends React.PureComponent {
     const InputComponent = typeMapping[definition.type] || InputForString;
     return (
       <InputComponent
-        name={name}
-        value={value}
         isDefault={isDefaultOrInherited(setting)}
+        name={name}
         onChange={onChange}
+        value={value}
         {...other}
       />
     );
index e7e4425226a6177ded01650254d9efcd70cbb7cf..62f86adf2a901fe90787bea4c598795564c1333e 100644 (file)
@@ -61,9 +61,9 @@ export default class PropertySetInput extends React.PureComponent {
           <td key={field.key}>
             <PrimitiveInput
               name={this.getFieldName(field)}
+              onChange={this.handleInputChange.bind(this, index, field.key)}
               setting={{ definition: field, value: fieldValues[field.key] }}
               value={fieldValues[field.key]}
-              onChange={this.handleInputChange.bind(this, index, field.key)}
             />
           </td>
         ))}
index b523acb93ab6c2d7ed9ef8e61a9799bbeca7f187..c2a38bc8bbc28ba886b8e4f62e7ee52334c62571 100644 (file)
@@ -50,12 +50,12 @@ export default class SimpleInput extends React.PureComponent {
   render() {
     return (
       <input
-        name={this.props.name}
         className={this.props.className + ' text-top'}
-        type={this.props.type}
-        value={this.props.value || ''}
+        name={this.props.name}
         onChange={this.handleInputChange}
         onKeyDown={this.handleKeyDown}
+        type={this.props.type}
+        value={this.props.value || ''}
       />
     );
   }
index 720192841c906c5245aef40a1b6234385b3157b7..5877a37a65279cacba714d01acd93da808c906a2 100644 (file)
@@ -28,7 +28,7 @@ import { TYPE_STRING, TYPE_PROPERTY_SET } from '../../../constants';
 it('should render PrimitiveInput', () => {
   const setting = { definition: { key: 'example', type: TYPE_STRING } };
   const onChange = jest.fn();
-  const input = shallow(<Input setting={setting} value="foo" onChange={onChange} />).find(
+  const input = shallow(<Input onChange={onChange} setting={setting} value="foo" />).find(
     PrimitiveInput
   );
   expect(input.length).toBe(1);
@@ -41,7 +41,7 @@ it('should render MultiValueInput', () => {
   const setting = { definition: { key: 'example', type: TYPE_STRING, multiValues: true } };
   const value = ['foo', 'bar'];
   const onChange = jest.fn();
-  const input = shallow(<Input setting={setting} value={value} onChange={onChange} />).find(
+  const input = shallow(<Input onChange={onChange} setting={setting} value={value} />).find(
     MultiValueInput
   );
   expect(input.length).toBe(1);
@@ -54,7 +54,7 @@ it('should render PropertySetInput', () => {
   const setting = { definition: { key: 'example', type: TYPE_PROPERTY_SET, fields: [] } };
   const value = [{ foo: 'bar' }];
   const onChange = jest.fn();
-  const input = shallow(<Input setting={setting} value={value} onChange={onChange} />).find(
+  const input = shallow(<Input onChange={onChange} setting={setting} value={value} />).find(
     PropertySetInput
   );
   expect(input.length).toBe(1);
index d41e16499e3b689a7d6b604d9d30c24b894b76e2..95b3809b44991902281c254f1d7355beb0de39a5 100644 (file)
@@ -25,7 +25,7 @@ import Toggle from '../../../../../components/controls/Toggle';
 it('should render Toggle', () => {
   const onChange = jest.fn();
   const toggle = shallow(
-    <InputForBoolean name="foo" value={true} isDefault={false} onChange={onChange} />
+    <InputForBoolean isDefault={false} name="foo" onChange={onChange} value={true} />
   ).find(Toggle);
   expect(toggle.length).toBe(1);
   expect(toggle.prop('name')).toBe('foo');
@@ -35,7 +35,7 @@ it('should render Toggle', () => {
 
 it('should render Toggle without value', () => {
   const onChange = jest.fn();
-  const input = shallow(<InputForBoolean name="foo" isDefault={false} onChange={onChange} />);
+  const input = shallow(<InputForBoolean isDefault={false} name="foo" onChange={onChange} />);
   const toggle = input.find(Toggle);
   expect(toggle.length).toBe(1);
   expect(toggle.prop('name')).toBe('foo');
@@ -47,7 +47,7 @@ it('should render Toggle without value', () => {
 it('should call onChange', () => {
   const onChange = jest.fn();
   const input = shallow(
-    <InputForBoolean name="foo" value={true} isDefault={false} onChange={onChange} />
+    <InputForBoolean isDefault={false} name="foo" onChange={onChange} value={true} />
   );
   const toggle = input.find(Toggle);
   expect(toggle.length).toBe(1);
index c614256196a00b3fd2b47008c8c312891be8bc41..4745ce34095c4acc439ea110ca092639df83a559 100644 (file)
@@ -25,7 +25,7 @@ import SimpleInput from '../SimpleInput';
 it('should render SimpleInput', () => {
   const onChange = jest.fn();
   const simpleInput = shallow(
-    <InputForNumber name="foo" value={17} isDefault={false} onChange={onChange} />
+    <InputForNumber isDefault={false} name="foo" onChange={onChange} value={17} />
   ).find(SimpleInput);
   expect(simpleInput.length).toBe(1);
   expect(simpleInput.prop('name')).toBe('foo');
index 25bcf056722375e74db000dc135791fcdd628449..e3c17c02f6a52358bec6ba925067d1559a2ef852 100644 (file)
@@ -25,11 +25,11 @@ it('should render Select', () => {
   const onChange = jest.fn();
   const select = shallow(
     <InputForSingleSelectList
-      name="foo"
-      value="bar"
-      options={['foo', 'bar', 'baz']}
       isDefault={false}
+      name="foo"
       onChange={onChange}
+      options={['foo', 'bar', 'baz']}
+      value="bar"
     />
   ).find('Select');
   expect(select.length).toBe(1);
@@ -47,11 +47,11 @@ it('should call onChange', () => {
   const onChange = jest.fn();
   const select = shallow(
     <InputForSingleSelectList
-      name="foo"
-      value="bar"
-      options={['foo', 'bar', 'baz']}
       isDefault={false}
+      name="foo"
       onChange={onChange}
+      options={['foo', 'bar', 'baz']}
+      value="bar"
     />
   ).find('Select');
   expect(select.length).toBe(1);
index 7cb444c2dd1ce52f4c0442f1247a9f1b21a5afff..01f312c49f859a2777642776b64ab9ff86fa4e80 100644 (file)
@@ -25,7 +25,7 @@ import SimpleInput from '../SimpleInput';
 it('should render SimpleInput', () => {
   const onChange = jest.fn();
   const simpleInput = shallow(
-    <InputForString name="foo" value="bar" isDefault={false} onChange={onChange} />
+    <InputForString isDefault={false} name="foo" onChange={onChange} value="bar" />
   ).find(SimpleInput);
   expect(simpleInput.length).toBe(1);
   expect(simpleInput.prop('name')).toBe('foo');
index 34d944cd0a553d39fa8757c8b4cadbe7bd20d27a..387873b0cd9b553ed266d8b7f6d6cb9d377bcc56 100644 (file)
@@ -25,7 +25,7 @@ import { change } from '../../../../../helpers/testUtils';
 it('should render textarea', () => {
   const onChange = jest.fn();
   const textarea = shallow(
-    <InputForText name="foo" value="bar" isDefault={false} onChange={onChange} />
+    <InputForText isDefault={false} name="foo" onChange={onChange} value="bar" />
   ).find('textarea');
   expect(textarea.length).toBe(1);
   expect(textarea.prop('name')).toBe('foo');
@@ -36,7 +36,7 @@ it('should render textarea', () => {
 it('should call onChange', () => {
   const onChange = jest.fn();
   const textarea = shallow(
-    <InputForText name="foo" value="bar" isDefault={false} onChange={onChange} />
+    <InputForText isDefault={false} name="foo" onChange={onChange} value="bar" />
   ).find('textarea');
   expect(textarea.length).toBe(1);
   expect(textarea.prop('onChange')).toBeTruthy();
index 94c0df554abfdb7efd15bed3aa3c1214306ef2a2..b8a777db0f396c7f8db2dc7ec2ac27ca670e9287 100644 (file)
@@ -34,7 +34,7 @@ const assertValues = (inputs, values) => {
 
 it('should render one value', () => {
   const multiValueInput = shallow(
-    <MultiValueInput setting={{ definition }} value={['foo']} onChange={jest.fn()} />
+    <MultiValueInput onChange={jest.fn()} setting={{ definition }} value={['foo']} />
   );
   const stringInputs = multiValueInput.find(PrimitiveInput);
   expect(stringInputs.length).toBe(1 + 1);
@@ -43,7 +43,7 @@ it('should render one value', () => {
 
 it('should render several values', () => {
   const multiValueInput = shallow(
-    <MultiValueInput setting={{ definition }} value={['foo', 'bar', 'baz']} onChange={jest.fn()} />
+    <MultiValueInput onChange={jest.fn()} setting={{ definition }} value={['foo', 'bar', 'baz']} />
   );
   const stringInputs = multiValueInput.find(PrimitiveInput);
   expect(stringInputs.length).toBe(3 + 1);
@@ -53,7 +53,7 @@ it('should render several values', () => {
 it('should remove value', () => {
   const onChange = jest.fn();
   const multiValueInput = shallow(
-    <MultiValueInput setting={{ definition }} value={['foo', 'bar', 'baz']} onChange={onChange} />
+    <MultiValueInput onChange={onChange} setting={{ definition }} value={['foo', 'bar', 'baz']} />
   );
   click(multiValueInput.find('.js-remove-value').at(1));
   expect(onChange).toBeCalledWith(['foo', 'baz']);
@@ -62,7 +62,7 @@ it('should remove value', () => {
 it('should change existing value', () => {
   const onChange = jest.fn();
   const multiValueInput = shallow(
-    <MultiValueInput setting={{ definition }} value={['foo', 'bar', 'baz']} onChange={onChange} />
+    <MultiValueInput onChange={onChange} setting={{ definition }} value={['foo', 'bar', 'baz']} />
   );
   multiValueInput
     .find(PrimitiveInput)
@@ -74,7 +74,7 @@ it('should change existing value', () => {
 it('should add new value', () => {
   const onChange = jest.fn();
   const multiValueInput = shallow(
-    <MultiValueInput setting={{ definition }} value={['foo']} onChange={onChange} />
+    <MultiValueInput onChange={onChange} setting={{ definition }} value={['foo']} />
   );
   multiValueInput
     .find(PrimitiveInput)
index 42973678530e442df452c0b87912725daba02f5a..35f2c967252dfd67dd3a8c48ce476ce0919a8e05 100644 (file)
@@ -26,12 +26,12 @@ it('should render input', () => {
   const onChange = jest.fn();
   const input = shallow(
     <SimpleInput
-      type="text"
       className="input-large"
-      name="foo"
-      value="bar"
       isDefault={false}
+      name="foo"
       onChange={onChange}
+      type="text"
+      value="bar"
     />
   ).find('input');
   expect(input.length).toBe(1);
@@ -46,12 +46,12 @@ it('should call onChange', () => {
   const onChange = jest.fn();
   const input = shallow(
     <SimpleInput
-      type="text"
       className="input-large"
-      name="foo"
-      value="bar"
       isDefault={false}
+      name="foo"
       onChange={onChange}
+      type="text"
+      value="bar"
     />
   ).find('input');
   expect(input.length).toBe(1);
index 5885ca220b0a8caad5f1928ca328da7fc647dedd..89f918dd45784eb7b27e930570cfb4a593334f31 100644 (file)
@@ -43,7 +43,7 @@ export default class EncryptionApp extends React.PureComponent {
 
   render() {
     return (
-      <div id="encryption-page" className="page page-limited">
+      <div className="page page-limited" id="encryption-page">
         <Helmet title={translate('property.category.security.encryption')} />
         <header className="page-header">
           <h1 className="page-title">{translate('property.category.security.encryption')}</h1>
@@ -53,8 +53,8 @@ export default class EncryptionApp extends React.PureComponent {
         {!this.props.loading &&
           !this.props.secretKeyAvailable && (
             <GenerateSecretKeyForm
-              secretKey={this.props.secretKey}
               generateSecretKey={this.props.generateSecretKey}
+              secretKey={this.props.secretKey}
             />
           )}
 
index 95c90a3f2f2b265899721def00236058f94b2d01..80c24b3527ff5f8ef55609c85e18f3b36b54e3d0 100644 (file)
@@ -27,9 +27,12 @@ import {
 } from '../store/encryptionPage/actions';
 import { getSettingsAppEncryptionState } from '../../../store/rootReducer';
 
-export default connect(state => getSettingsAppEncryptionState(state), {
-  checkSecretKey,
-  generateSecretKey,
-  encryptValue,
-  startGeneration
-})(EncryptionApp);
+export default connect(
+  state => getSettingsAppEncryptionState(state),
+  {
+    checkSecretKey,
+    generateSecretKey,
+    encryptValue,
+    startGeneration
+  }
+)(EncryptionApp);
index 1d7ae6d3f8c0e2c3f2d1941a6dba61a05c360eda..e6df1fa0c2ca29391ad972264a9564a70ee834c0 100644 (file)
@@ -56,9 +56,9 @@ export default function ClusterSysInfos({ expandedCards, sysInfoData, toggleCard
       </li>
       {sortBy(getAppNodes(sysInfoData), getNodeName).map(node => (
         <HealthCard
-          key={getNodeName(node)}
           health={getHealth(node)}
           healthCauses={getHealthCauses(node)}
+          key={getNodeName(node)}
           name={getNodeName(node)}
           onClick={toggleCard}
           open={expandedCards.includes(getNodeName(node))}
@@ -68,9 +68,9 @@ export default function ClusterSysInfos({ expandedCards, sysInfoData, toggleCard
       <li className="note system-info-health-title">{translate('system.search_nodes_title')}</li>
       {sortBy(getSearchNodes(sysInfoData), getNodeName).map(node => (
         <HealthCard
-          key={getNodeName(node)}
           health={getHealth(node)}
           healthCauses={getHealthCauses(node)}
+          key={getNodeName(node)}
           name={getNodeName(node)}
           onClick={toggleCard}
           open={expandedCards.includes(getNodeName(node))}
index 653a3841154f62348b847ef2e107d71ca1dcf1e1..007e186d0d961c36ee53d8cb30f4e5e641a2ccd9 100644 (file)
@@ -40,8 +40,8 @@ export default function PageHeader(props: Props) {
           canRestart={!props.isCluster}
           cluster={props.isCluster}
           logLevel={props.logLevel}
-          serverId={props.serverId}
           onLogLevelChange={props.onLogLevelChange}
+          serverId={props.serverId}
         />
       )}
       {props.loading && (
index 94cbc6b4dc473e63fa7260ec8083910237f95c7f..85182ef72d2ef18296d7af9bfd45a58e5c5198d8 100644 (file)
@@ -28,8 +28,8 @@ it('should render correctly', () => {
         isCluster={true}
         loading={false}
         logLevel="INFO"
-        showActions={true}
         onLogLevelChange={() => {}}
+        showActions={true}
       />
     )
   ).toMatchSnapshot();
@@ -42,8 +42,8 @@ it('should show a loading spinner and no actions', () => {
         isCluster={true}
         loading={true}
         logLevel="INFO"
-        showActions={false}
         onLogLevelChange={() => {}}
+        showActions={false}
       />
     )
   ).toMatchSnapshot();
index f042eed7de36e7288896888abf568622590df9ed..8b621c3d4a6e941fa135f99df3e700545179e1f2 100644 (file)
@@ -76,7 +76,7 @@ export default function HealthCard({
       title={name}>
       {showFields && <Section items={mainSection} />}
       {showSections &&
-        map(sections, (section, name) => <Section key={name} items={section} name={name} />)}
+        map(sections, (section, name) => <Section items={section} key={name} name={name} />)}
     </BoxedGroupAccordion>
   );
 }
index 5bea29aae5c14195b7ff1c90a2af281fa5b048f3..bdb649e28fb56a52485734e3fa624fa63fa6bcd2 100644 (file)
@@ -42,7 +42,7 @@ export default function HealthItem({ biggerHealth, className, name, health, heal
     <div className={classNames('system-info-health-info', className)}>
       {hasHealthCauses &&
         healthCauses!.map((cause, idx) => (
-          <HealthCauseItem key={idx} className="spacer-right" health={health} healthCause={cause} />
+          <HealthCauseItem className="spacer-right" health={health} healthCause={cause} key={idx} />
         ))}
       {name ? (
         <Tooltip overlay={translateWithParameters('system.current_health_of_x', name)}>
index b0e0b9ee3481f694037985d5aa60ceeafadfd1dd..3e4cacff8bafcc59511a85af5f14ee05d6e10943 100644 (file)
@@ -25,7 +25,7 @@ import { HealthType } from '../../../../../api/system';
 it('should render correctly', () => {
   expect(
     shallow(
-      <HealthItem biggerHealth={true} name="Foo" health={HealthType.RED} healthCauses={['foo']} />
+      <HealthItem biggerHealth={true} health={HealthType.RED} healthCauses={['foo']} name="Foo" />
     )
   ).toMatchSnapshot();
 });
index 4e37df1258a838c309a45934f3173e684c6642c2..924823697cc8fccb6e48b42b628cdecd26bfa8d8 100644 (file)
@@ -23,7 +23,7 @@ import Section from '../Section';
 
 it('should render correctly', () => {
   expect(
-    shallow(<Section name="foo" items={{ foo: 1, bar: 'Bar', baz: false }} />)
+    shallow(<Section items={{ foo: 1, bar: 'Bar', baz: false }} name="foo" />)
   ).toMatchSnapshot();
 });
 
index ce4b5077ba02d4a0692a0d7e6286508d5321acb5..6b61b4c785e9199bfe86bd1748a9053ab08774c6 100644 (file)
@@ -136,7 +136,7 @@ Array [
                           "clipRule": "evenodd",
                           "fillRule": "evenodd",
                           "strokeLinejoin": "round",
-                          "strokeMiterlimit": "1.41421",
+                          "strokeMiterlimit": 1.41421,
                         }
                       }
                       version="1.1"
index 4112b1be239002c2e7bb9b873512fd3b3ad2d59e..be2274f7037f62fa16a79bc81582f6052d7e61c1 100644 (file)
@@ -54,10 +54,10 @@ export default class SystemUpgradeForm extends React.PureComponent<Props, State>
           {systemUpgrades.map((upgrades, idx) => (
             <SystemUpgradeItem
               key={upgrades[upgrades.length - 1].version}
+              systemUpgrades={upgrades}
               type={
                 idx === 0 ? translate('system.latest_version') : translate('system.lts_version')
               }
-              systemUpgrades={upgrades}
             />
           ))}
         </div>
index 7fd5d5121f0da6c28d2807424fd7dd473aae0e89..24f0185954715a4e6a571ac8d63f9a9fbe0cd191 100644 (file)
@@ -54,6 +54,6 @@ it('should display correctly', () => {
 });
 
 it('should display a badge', () => {
-  const wrapper = shallow(<SystemUpgradeItem type="LTS Version" systemUpgrades={UPGRADES} />);
+  const wrapper = shallow(<SystemUpgradeItem systemUpgrades={UPGRADES} type="LTS Version" />);
   expect(wrapper.find('h1').exists()).toBeTruthy();
 });
index e24f796cd60291afe2ba9795fa89d0fd3f07d9b0..eb0b963bf6e8f88dbbc612b30ae1596ade65a02a 100644 (file)
@@ -192,16 +192,19 @@ export function groupSections(sysInfoData: SysValueObject) {
   return { mainSection, sections };
 }
 
-export const parseQuery = memoize((urlQuery: RawQuery): Query => ({
-  expandedCards: parseAsArray(urlQuery.expand, parseAsString)
-}));
-
-export const serializeQuery = memoize((query: Query): RawQuery =>
-  cleanQuery({
-    expand: serializeStringArray(query.expandedCards)
+export const parseQuery = memoize(
+  (urlQuery: RawQuery): Query => ({
+    expandedCards: parseAsArray(urlQuery.expand, parseAsString)
   })
 );
 
+export const serializeQuery = memoize(
+  (query: Query): RawQuery =>
+    cleanQuery({
+      expand: serializeStringArray(query.expandedCards)
+    })
+);
+
 export function sortUpgrades(upgrades: SystemUpgrade[]): SystemUpgrade[] {
   return sortBy(upgrades, [
     (upgrade: SystemUpgrade) => -Number(upgrade.version.split('.')[0]),
index d69e98ae561ca9df62e621ebef49e20482e5d774..cd5bc33f08cdc0a008804613a02c15f9806ace0c 100644 (file)
@@ -96,4 +96,7 @@ export class OnboardingPage extends React.PureComponent<DispatchProps, State> {
 
 const mapDispatchToProps: DispatchProps = { skipOnboardingAction };
 
-export default connect<{}, DispatchProps>(null, mapDispatchToProps)(OnboardingPage);
+export default connect<{}, DispatchProps>(
+  null,
+  mapDispatchToProps
+)(OnboardingPage);
index 5d0978e41d9e067c18a2655c9f8178ad66e8d11a..e3e747805fc56b3c60c8e2f5c9bb7ab7fd22ceb2 100644 (file)
@@ -44,4 +44,7 @@ export class ProjectOnboardingPage extends React.PureComponent<DispatchProps> {
 
 const mapDispatchToProps: DispatchProps = { skipOnboarding };
 
-export default connect<{}, DispatchProps>(null, mapDispatchToProps)(ProjectOnboardingPage);
+export default connect<{}, DispatchProps>(
+  null,
+  mapDispatchToProps
+)(ProjectOnboardingPage);
index 5df5684f10c831e475c38899a8221f2841161992..8ffb2ff98ff6a3e3df1c5d6435f813d0bdd97949 100644 (file)
@@ -36,7 +36,7 @@ export default class Search extends React.PureComponent<Props> {
     const { query } = this.props;
 
     return (
-      <div id="users-search" className="panel panel-vertical bordered-bottom spacer-bottom">
+      <div className="panel panel-vertical bordered-bottom spacer-bottom" id="users-search">
         <SearchBox
           minLength={2}
           onChange={this.handleSearch}
index e0ea320365564482a5cb96a43e697905af568b6f..edefebb10867d0038b1f5fd5b7462fda29a2937f 100644 (file)
@@ -124,7 +124,7 @@ export default class UsersApp extends React.PureComponent<Props, State> {
     const query = parseQuery(this.props.location.query);
     const { loading, paging, users } = this.state;
     return (
-      <div id="users-page" className="page page-limited">
+      <div className="page page-limited" id="users-page">
         <Suggestions suggestions="users" />
         <Helmet title={translate('users.page')} />
         <Header loading={loading} onUpdateUsers={this.fetchUsers} />
@@ -140,9 +140,9 @@ export default class UsersApp extends React.PureComponent<Props, State> {
         {paging !== undefined && (
           <ListFooter
             count={users.length}
-            total={paging.total}
-            ready={!loading}
             loadMore={this.fetchMoreUsers}
+            ready={!loading}
+            total={paging.total}
           />
         )}
       </div>
index de981b356f09deec78fd46c13878fe440afd7f97..8888af81c5104683cdecf684a308491d0aebecdd 100644 (file)
@@ -41,7 +41,7 @@ export default function UsersList({
 }: Props) {
   return (
     <div className="boxed-group boxed-group-inner">
-      <table id="users-list" className="data zebra">
+      <table className="data zebra" id="users-list">
         <thead>
           <tr>
             <th />
index dceecaeafd19b0ad04a26483cd674b1460e9bc30..53ab715e8da4f538654671ad6f8db3baef85b4e2 100644 (file)
@@ -54,14 +54,14 @@ export default class UserGroups extends React.PureComponent<Props, State> {
     return (
       <ul>
         {groups.slice(0, limit).map(group => (
-          <li key={group} className="little-spacer-bottom">
+          <li className="little-spacer-bottom" key={group}>
             {group}
           </li>
         ))}
         {groups.length > GROUPS_LIMIT &&
           this.state.showMore &&
           groups.slice(limit).map(group => (
-            <li key={group} className="little-spacer-bottom">
+            <li className="little-spacer-bottom" key={group}>
               {group}
             </li>
           ))}
index 4848a05c853c788fe3cfdc6a0debd64fa3caf8a3..335628489896b6ac67c57148b6c2d45b149d9b48 100644 (file)
@@ -62,7 +62,7 @@ export default class UserListItem extends React.PureComponent<Props, State> {
         </td>
         {!organizationsEnabled && (
           <td>
-            <UserGroups groups={user.groups || []} user={user} onUpdateUsers={onUpdateUsers} />
+            <UserGroups groups={user.groups || []} onUpdateUsers={onUpdateUsers} user={user} />
           </td>
         )}
         <td>
@@ -83,9 +83,9 @@ export default class UserListItem extends React.PureComponent<Props, State> {
         </td>
         {this.state.openTokenForm && (
           <TokensFormModal
-            user={user}
             onClose={this.handleCloseTokensForm}
             updateTokensCount={this.props.updateTokensCount}
+            user={user}
           />
         )}
       </tr>
index a609e1c91452d26e91ca0b76aeb53437fa30cd32..1d3ff144df048a7a90ae7d319ff6d19eb64875b7 100644 (file)
@@ -60,15 +60,15 @@ export function ExternalProvider({ identityProvider, user }: Props) {
       <div
         className="identity-provider"
         style={{
-          'background-color': identityProvider.backgroundColor,
+          backgroundColor: identityProvider.backgroundColor,
           color: getTextColor(identityProvider.backgroundColor, theme.secondFontColor)
         }}>
         <img
           alt={identityProvider.name}
           className="little-spacer-right"
+          height="14"
           src={getBaseUrl() + identityProvider.iconPath}
           width="14"
-          height="14"
         />
         {user.externalIdentity}
       </div>
index 07a6766077d5629b379f0016b2ad3cceecc2a148..67938f2e702732fe25f9ca2d72d7b591bd74a576 100644 (file)
@@ -44,14 +44,14 @@ export default class UserScmAccounts extends React.PureComponent<Props, State> {
     return (
       <ul>
         {scmAccounts.slice(0, limit).map((scmAccount, idx) => (
-          <li key={idx} className="little-spacer-bottom">
+          <li className="little-spacer-bottom" key={idx}>
             {scmAccount}
           </li>
         ))}
         {scmAccounts.length > SCM_LIMIT &&
           (this.state.showMore ? (
             scmAccounts.slice(limit).map((scmAccount, idx) => (
-              <li key={idx + limit} className="little-spacer-bottom">
+              <li className="little-spacer-bottom" key={idx + limit}>
                 {scmAccount}
               </li>
             ))
index 7fb84c7f497248535072220b96ad6a22d758ab1f..9628b48edc442a4d03bb02b91c095bf73b795d8d 100644 (file)
@@ -103,19 +103,19 @@ export default class UsersSelectSearch extends React.PureComponent<Props, State>
       <Select
         autoFocus={this.props.autoFocus}
         className="Select-big"
-        options={this.state.searchResult}
+        clearable={false}
         isLoading={this.state.isLoading}
-        optionComponent={UsersSelectSearchOption}
-        valueComponent={UsersSelectSearchValue}
+        labelKey="name"
+        noResultsText={noResult}
         onChange={this.props.handleValueChange}
         onInputChange={this.handleInputChange}
-        value={this.props.selectedUser}
+        optionComponent={UsersSelectSearchOption}
+        options={this.state.searchResult}
         placeholder=""
-        noResultsText={noResult}
-        labelKey="name"
-        valueKey="login"
-        clearable={false}
         searchable={true}
+        value={this.props.selectedUser}
+        valueComponent={UsersSelectSearchValue}
+        valueKey="login"
       />
     );
   }
index 26210e9dfc77096aa431064337a87d7baab0fd8b..87973ed58e4b6b2b0d3bb63ce5192c1a535acbe3 100644 (file)
@@ -41,10 +41,10 @@ describe('UsersSelectSearch', () => {
     const onSearch = jest.fn(() => Promise.resolve(users));
     const wrapper = shallow(
       <UsersSelectSearch
-        selectedUser={selectedUser}
         excludedUsers={excludedUsers}
         handleValueChange={jest.fn()}
         searchUsers={onSearch}
+        selectedUser={selectedUser}
       />
     );
     expect(wrapper).toMatchSnapshot();
@@ -57,7 +57,7 @@ describe('UsersSelectSearch', () => {
 describe('UsersSelectSearchOption', () => {
   it('should render correctly without all parameters', () => {
     const wrapper = shallow(
-      <UsersSelectSearchOption option={selectedUser} onFocus={jest.fn()} onSelect={jest.fn()}>
+      <UsersSelectSearchOption onFocus={jest.fn()} onSelect={jest.fn()} option={selectedUser}>
         {selectedUser.name}
       </UsersSelectSearchOption>
     );
@@ -66,7 +66,7 @@ describe('UsersSelectSearchOption', () => {
 
   it('should render correctly with email instead of hash', () => {
     const wrapper = shallow(
-      <UsersSelectSearchOption option={users[0]} onFocus={jest.fn()} onSelect={jest.fn()}>
+      <UsersSelectSearchOption onFocus={jest.fn()} onSelect={jest.fn()} option={users[0]}>
         {users[0].name}
       </UsersSelectSearchOption>
     );
index 937c46eadc19f1a7eb58d303a8eeb8fde4ff031a..abb0fcc3d78bcf52dcd8047dce1cf860866a5fba 100644 (file)
@@ -24,12 +24,15 @@ export interface Query {
   search: string;
 }
 
-export const parseQuery = memoize((urlQuery: RawQuery): Query => ({
-  search: parseAsString(urlQuery['search'])
-}));
-
-export const serializeQuery = memoize((query: Query): RawQuery =>
-  cleanQuery({
-    search: query.search ? serializeString(query.search) : undefined
+export const parseQuery = memoize(
+  (urlQuery: RawQuery): Query => ({
+    search: parseAsString(urlQuery['search'])
   })
 );
+
+export const serializeQuery = memoize(
+  (query: Query): RawQuery =>
+    cleanQuery({
+      search: query.search ? serializeString(query.search) : undefined
+    })
+);
index b59e8cb07a82cf60c61e944504b0e79c1e4dc6b6..9d205e3b5f6459d9332d9103face4c6571057652 100644 (file)
@@ -130,16 +130,18 @@ export default class Action extends React.PureComponent<Props, State> {
     const actionKey = getActionKey(domain.path, action.key);
 
     return (
-      <div id={actionKey} className="boxed-group">
+      <div className="boxed-group" id={actionKey}>
         <header className="web-api-action-header boxed-group-header">
           <Link
-            to={{ pathname: '/web_api/' + actionKey }}
-            className="spacer-right link-no-underline">
+            className="spacer-right link-no-underline"
+            to={{ pathname: '/web_api/' + actionKey }}>
             <LinkIcon />
           </Link>
 
           <h3 className="web-api-action-title">
-            {verb}&nbsp;{actionKey}
+            {verb}
+            &nbsp;
+            {actionKey}
           </h3>
 
           {action.internal && (
@@ -179,7 +181,7 @@ export default class Action extends React.PureComponent<Props, State> {
             )}
 
           {showResponse &&
-            action.hasResponseExample && <ResponseExample domain={domain} action={action} />}
+            action.hasResponseExample && <ResponseExample action={action} domain={domain} />}
 
           {showChangelog && <ActionChangelog changelog={action.changelog} />}
         </div>
index f02cd0d7ff23f7054ce5d4329883b6e662bba708..47e57ec9ebc9d2ab9791d8fc4014fdc039004e04 100644 (file)
@@ -28,7 +28,7 @@ export default function ActionChangelog({ changelog }: Props) {
   return (
     <ul className="big-spacer-top">
       {changelog.map((item, index) => (
-        <li key={index} className="spacer-top">
+        <li className="spacer-top" key={index}>
           <span className="spacer-right badge">{item.version}</span>
           {item.description}
         </li>
index 9a433edfc747ca0dbf8d290ea0059151c0750419..1b5f899554997cf640e438528ff58e75a277f4b4 100644 (file)
@@ -90,7 +90,7 @@ export default function Params({ params, showDeprecated, showInternal }: Props)
                     <h4>{translate('api_documentation.possible_values')}</h4>
                     <ul className="list-styled">
                       {param.possibleValues.map(value => (
-                        <li key={value} className="little-spacer-top">
+                        <li className="little-spacer-top" key={value}>
                           <code>{value}</code>
                         </li>
                       ))}
index dceaf980e70392394c72fd5a907715446d32810b..0fabf35af391561e5b46f4c0b872952854d25b49 100644 (file)
@@ -64,16 +64,19 @@ export const isDomainPathActive = (path: string, splat: string) => {
   return true;
 };
 
-export const parseQuery = memoize((urlQuery: RawQuery): Query => ({
-  search: parseAsString(urlQuery['query']),
-  deprecated: parseAsOptionalBoolean(urlQuery['deprecated']) || false,
-  internal: parseAsOptionalBoolean(urlQuery['internal']) || false
-}));
-
-export const serializeQuery = memoize((query: Query): RawQuery =>
-  cleanQuery({
-    query: query.search ? serializeString(query.search) : undefined,
-    deprecated: query.deprecated || undefined,
-    internal: query.internal || undefined
+export const parseQuery = memoize(
+  (urlQuery: RawQuery): Query => ({
+    search: parseAsString(urlQuery['query']),
+    deprecated: parseAsOptionalBoolean(urlQuery['deprecated']) || false,
+    internal: parseAsOptionalBoolean(urlQuery['internal']) || false
   })
 );
+
+export const serializeQuery = memoize(
+  (query: Query): RawQuery =>
+    cleanQuery({
+      query: query.search ? serializeString(query.search) : undefined,
+      deprecated: query.deprecated || undefined,
+      internal: query.internal || undefined
+    })
+);
index 5e5366e70f617e062626db57e9b9fbafc756dc18..c16223810573a1aded11225c80759a60d17c718d 100644 (file)
@@ -97,7 +97,9 @@ export default class DeliveriesForm extends React.PureComponent<Props, State> {
           <h2>{header}</h2>
         </header>
         <div className="modal-body modal-container">
-          {deliveries.map(delivery => <DeliveryAccordion delivery={delivery} key={delivery.id} />)}
+          {deliveries.map(delivery => (
+            <DeliveryAccordion delivery={delivery} key={delivery.id} />
+          ))}
           <div className="text-center">
             <DeferredSpinner loading={loading} />
           </div>
index 2e0a1c2daf89d1e405ce95504f26b0dc93420b5d..5e6a563abf25e86e7b36dea151e75e00bb9318ad 100644 (file)
@@ -47,6 +47,7 @@ const mapDispatchToProps: DispatchProps = { onReceiveComponent };
 
 type OwnProps = Omit<Props, keyof DispatchProps>;
 
-export default connect<null, DispatchProps, OwnProps>(mapStateToProps, mapDispatchToProps)(
-  lazyLoad(() => import(/* webpackPrefetch: true */ './SourceViewerBase'))
-);
+export default connect<null, DispatchProps, OwnProps>(
+  mapStateToProps,
+  mapDispatchToProps
+)(lazyLoad(() => import(/* webpackPrefetch: true */ './SourceViewerBase')));
index 826cd8781a8b47fc36085c9464e9c198a205ce45..c403c76d948064bd757bc5a1492b13fd4eeacd80 100644 (file)
@@ -501,18 +501,16 @@ export default class SourceViewerBase extends React.PureComponent<Props, State>
     }).then(
       r => {
         if (this.mounted) {
-          this.setState(() => {
-            const changes: Partial<State> = {
-              displayDuplications: true,
-              duplications: r.duplications,
-              duplicationsByLine: duplicationsByLine(r.duplications),
-              duplicatedFiles: r.files
-            };
-            if (r.duplications.length === 1) {
-              changes.linePopup = { index: 0, line: line.line, name: 'duplications' };
-            }
-            return changes;
-          });
+          this.setState(state => ({
+            displayDuplications: true,
+            duplications: r.duplications,
+            duplicationsByLine: duplicationsByLine(r.duplications),
+            duplicatedFiles: r.files,
+            linePopup:
+              r.duplications.length === 1
+                ? { index: 0, line: line.line, name: 'duplications' }
+                : state.linePopup
+          }));
         }
       },
       () => {
index 88e0809d4af373a382c93950237b89b05e06d0ad..9c35f78e2697c1673259d3e8e2e0edc7c3cabb54 100644 (file)
@@ -152,7 +152,10 @@ export default class CoveragePopup extends React.PureComponent<Props, State> {
                         <TestStatusIcon className="spacer-right" status={testCase.status} />
                         <div className="display-inline-block text-ellipsis">{testCase.name}</div>
                         {testCase.status !== 'SKIPPED' && (
-                          <span className="spacer-left note">{testCase.durationInMs}ms</span>
+                          <span className="spacer-left note">
+                            {testCase.durationInMs}
+                            ms
+                          </span>
                         )}
                       </li>
                     ))}
index dc21bfe550afc9c721e624f901a075ea11a91e64..7ff162330c6e53703a3aecc169e691f415504ade 100644 (file)
@@ -230,7 +230,9 @@ export default class AdvancedTimeline extends React.PureComponent {
     const parentBbox = this.getMouseOverlayPos(evt.target);
     const mouseXPos = (evt.pageX - parentBbox.left) / parentBbox.width;
     const xRange = xScale.range();
-    const speed = evt.deltaMode ? 25 / evt.deltaMode * this.props.zoomSpeed : this.props.zoomSpeed;
+    const speed = evt.deltaMode
+      ? (25 / evt.deltaMode) * this.props.zoomSpeed
+      : this.props.zoomSpeed;
     const leftPos = xRange[0] - Math.round(speed * evt.deltaY * mouseXPos);
     const rightPos = xRange[1] + Math.round(speed * evt.deltaY * (1 - mouseXPos));
     const startDate = leftPos > maxXRange[0] ? xScale.invert(leftPos) : null;
index 5edfc0f5253418cb8d4c4d45f81a477198ef444c..54d44d78a53c80f7614df5836650de927da97a1e 100644 (file)
@@ -28,7 +28,7 @@ interface Props {
   colorNA?: string;
   colorScale:
     | ScaleOrdinal<string, string> // used for LEVEL type
-    | ScaleLinear<number, string | number>; // used for RATING or PERCENT type
+    | ScaleLinear<string, string | number>; // used for RATING or PERCENT type
   metricType: string;
 }
 
index 8c5728bb43caac2a11fbdc97d0b854651aae9e22..dccb146812aa232d88c4a03b1dbe8d88e0ba5e6c 100644 (file)
@@ -49,7 +49,7 @@ export default class Histogram extends React.PureComponent<Props> {
     const x = xScale.range()[0] + (alignTicks ? padding[3] : 0);
     const y = Math.round(yScale(index)! + yScale.bandwidth() / 2);
 
-    return <rect className="bar-chart-bar" x={x} y={y} width={width} height={BAR_HEIGHT} />;
+    return <rect className="bar-chart-bar" height={BAR_HEIGHT} width={width} x={x} y={y} />;
   }
 
   renderValue(d: number, index: number, xScale: XScale, yScale: YScale) {
@@ -66,7 +66,7 @@ export default class Histogram extends React.PureComponent<Props> {
 
     return (
       <Tooltip overlay={this.props.yTooltips && this.props.yTooltips[index]}>
-        <text className="bar-chart-tick histogram-value" x={x} y={y} dx="1em" dy="0.3em">
+        <text className="bar-chart-tick histogram-value" dx="1em" dy="0.3em" x={x} y={y}>
           {value}
         </text>
       </Tooltip>
@@ -89,10 +89,10 @@ export default class Histogram extends React.PureComponent<Props> {
     return (
       <text
         className={'bar-chart-tick ' + historyTickClass}
-        x={x}
-        y={y}
         dx={alignTicks ? 0 : '-1em'}
-        dy="0.3em">
+        dy="0.3em"
+        x={x}
+        y={y}>
         {tick}
       </text>
     );
@@ -128,7 +128,7 @@ export default class Histogram extends React.PureComponent<Props> {
       .rangeRound([0, availableHeight]);
 
     return (
-      <svg className="bar-chart" width={this.props.width} height={this.props.height}>
+      <svg className="bar-chart" height={this.props.height} width={this.props.width}>
         <g transform={`translate(${this.props.alignTicks ? 4 : padding[3]}, ${padding[0]})`}>
           {this.renderBars(xScale, yScale)}
         </g>
index e520abdc4a4d0c04f678d18ae89f749efc493cfe..457bc24c4eae0847452d0149e4e03ea66b34595c 100644 (file)
@@ -50,10 +50,10 @@ export default function LanguageDistribution(props: Props) {
       bars={data}
       height={distribution.length * 25}
       padding={[0, 60, 0, 80]}
+      width={props.width}
       yTicks={yTicks}
       yTooltips={yTooltips}
       yValues={yValues}
-      width={props.width}
     />
   );
 
index e2cee003b15a687336f30b053383a62d6b8d6f7b..a79b1c52e1db62549536b1cd9602c5126d70c1ec 100644 (file)
@@ -219,7 +219,7 @@ export default class ZoomTimeLine extends React.PureComponent {
           const nextTick = index + 1 < ticks.length ? ticks[index + 1] : xScale.domain()[1];
           const x = (xScale(tick) + xScale(nextTick)) / 2;
           return (
-            <text key={index} className="chart-zoom-tick" x={x} y={y} dy="1.3em">
+            <text className="chart-zoom-tick" dy="1.3em" key={index} x={x} y={y}>
               {format(tick)}
             </text>
           );
@@ -235,11 +235,11 @@ export default class ZoomTimeLine extends React.PureComponent {
     const yRange = yScale.range();
     return (
       <rect
+        fill={theme.leakColor}
+        height={yRange[0] - yRange[yRange.length - 1]}
+        width={xScale.range()[1] - xScale(this.props.leakPeriodDate)}
         x={xScale(this.props.leakPeriodDate)}
         y={yRange[yRange.length - 1]}
-        width={xScale.range()[1] - xScale(this.props.leakPeriodDate)}
-        height={yRange[0] - yRange[yRange.length - 1]}
-        fill={theme.leakColor}
       />
     );
   };
@@ -256,9 +256,9 @@ export default class ZoomTimeLine extends React.PureComponent {
       <g>
         {this.props.series.map((serie, idx) => (
           <path
-            key={serie.name}
             className={classNames('line-chart-path', 'line-chart-path-' + idx)}
             d={lineGenerator(serie.data)}
+            key={serie.name}
           />
         ))}
       </g>
@@ -278,9 +278,9 @@ export default class ZoomTimeLine extends React.PureComponent {
       <g>
         {this.props.series.map((serie, idx) => (
           <path
-            key={serie.name}
             className={classNames('line-chart-area', 'line-chart-area-' + idx)}
             d={areaGenerator(serie.data)}
+            key={serie.name}
           />
         ))}
       </g>
@@ -300,7 +300,6 @@ export default class ZoomTimeLine extends React.PureComponent {
     <Draggable
       axis="x"
       bounds={{ left: options.xDim[0], right: options.xDim[1] }}
-      position={{ x: options.xPos, y: 0 }}
       onDrag={this.handleSelectionHandleDrag(
         options.xScale,
         options.fixedPos,
@@ -313,13 +312,14 @@ export default class ZoomTimeLine extends React.PureComponent {
         options.fixedPos,
         options.xDim,
         options.direction
-      )}>
+      )}
+      position={{ x: options.xPos, y: 0 }}>
       <rect
         className="zoom-selection-handle"
-        x={-3}
-        y={options.yDim[1]}
         height={options.yDim[0] - options.yDim[1] + 1}
         width={6}
+        x={-3}
+        y={options.yDim[1]}
       />
     </Draggable>
   );
@@ -341,31 +341,31 @@ export default class ZoomTimeLine extends React.PureComponent {
     return (
       <g className="chart-zoom">
         <DraggableCore
-          onStart={this.handleNewZoomDragStart(xDim)}
           onDrag={this.handleNewZoomDrag(xScale, xDim)}
+          onStart={this.handleNewZoomDragStart(xDim)}
           onStop={this.handleNewZoomDragEnd(xScale, xDim)}>
           <rect
             className="zoom-overlay"
-            x={xDim[0]}
-            y={yDim[1]}
             height={yDim[0] - yDim[1]}
             width={xDim[1] - xDim[0]}
+            x={xDim[0]}
+            y={yDim[1]}
           />
         </DraggableCore>
         {showZoomArea && (
           <Draggable
             axis="x"
             bounds={{ left: xDim[0], right: Math.floor(xDim[1] - zoomBoxWidth) }}
-            position={{ x: xArray[0], y: 0 }}
             onDrag={this.handleSelectionDrag(xScale, zoomBoxWidth, xDim, true)}
-            onStop={this.handleSelectionDrag(xScale, zoomBoxWidth, xDim)}>
+            onStop={this.handleSelectionDrag(xScale, zoomBoxWidth, xDim)}
+            position={{ x: xArray[0], y: 0 }}>
             <rect
               className="zoom-selection"
-              x={0}
-              y={yDim[1]}
               height={yDim[0] - yDim[1] + 1}
-              width={zoomBoxWidth}
               onDoubleClick={this.handleDoubleClick(xScale, xDim)}
+              width={zoomBoxWidth}
+              x={0}
+              y={yDim[1]}
             />
           </Draggable>
         )}
@@ -399,7 +399,7 @@ export default class ZoomTimeLine extends React.PureComponent {
     const { xScale, yScale } = this.getScales();
 
     return (
-      <svg className="line-chart " width={this.props.width} height={this.props.height}>
+      <svg className="line-chart " height={this.props.height} width={this.props.width}>
         <g transform={`translate(${this.props.padding[3]}, ${this.props.padding[0] + 2})`}>
           {this.renderLeak(xScale, yScale)}
           {this.renderBaseLine(xScale, yScale)}
index 3d0fa9382738ba9a26c53f81054ded8a86277ba8..575e9da65f5e70781ea211ec89f9b4bb3b343d15 100644 (file)
@@ -31,8 +31,8 @@ it('renders with yValues', () => {
       <Histogram
         bars={[100, 75, 150]}
         height={75}
-        yValues={['100.0', '75.0', '150.0']}
         width={100}
+        yValues={['100.0', '75.0', '150.0']}
       />
     )
   ).toMatchSnapshot();
@@ -44,9 +44,9 @@ it('renders with yValues and yTicks', () => {
       <Histogram
         bars={[100, 75, 150]}
         height={75}
+        width={100}
         yTicks={['a', 'b', 'c']}
         yValues={['100.0', '75.0', '150.0']}
-        width={100}
       />
     )
   ).toMatchSnapshot();
@@ -58,10 +58,10 @@ it('renders with yValues, yTicks and yTooltips', () => {
       <Histogram
         bars={[100, 75, 150]}
         height={75}
+        width={100}
         yTicks={['a', 'b', 'c']}
         yTooltips={['a - 100', 'b - 75', 'c - 150']}
         yValues={['100.0', '75.0', '150.0']}
-        width={100}
       />
     )
   ).toMatchSnapshot();
index 93755541652434dfeaabdd6729bf96dfc43c5cff..d205f1d56a4856d1d620b6234cbd8511c040a6a1 100644 (file)
@@ -35,7 +35,11 @@ export default class MarkdownTips extends React.PureComponent {
         </a>
         {':'}
         <span className="spacer-left">*{translate('bold')}*</span>
-        <span className="spacer-left">``{translate('code')}``</span>
+        <span className="spacer-left">
+          ``
+          {translate('code')}
+          ``
+        </span>
         <span className="spacer-left">* {translate('bulleted_point')}</span>
       </div>
     );
index c479082670ec06c42fd6b61008364b766ca093c7..f9f5b25d8e3a806bbb048138a76896fa0f021a6d 100644 (file)
@@ -38,7 +38,7 @@ export default function OrganizationAvatar({ organization, small }: Props) {
         'is-small': small
       })}>
       {organization.avatar ? (
-        <img className="rounded" src={organization.avatar} alt={organization.name} />
+        <img alt={organization.name} className="rounded" src={organization.avatar} />
       ) : (
         <GenericAvatar name={organization.name} size={small ? 15 : 30} />
       )}
index 309564a9b5d259769ea696f07fca28a149361e4a..6e2ec4d664619c2806303535cb0d5739dc3e1eb9 100644 (file)
@@ -57,11 +57,11 @@ export default class SelectListItem extends React.PureComponent {
     return (
       <li>
         <a
-          href="#"
           className={classNames({ active: this.props.active === this.props.item })}
+          href="#"
           onClick={this.handleSelect}
-          onMouseOver={this.handleHover}
-          onFocus={this.handleHover}>
+          onFocus={this.handleHover}
+          onMouseOver={this.handleHover}>
           {children}
         </a>
       </li>
index 8956e411a50b12d5b01bb899258a69d10ebeae3b..aa54b80ef3392c17bea18c54534718c29a7bc73e 100644 (file)
@@ -23,10 +23,10 @@ import CodeSnippet from '../CodeSnippet';
 
 it('renders correctly', () => {
   expect(mount(<CodeSnippet snippet={'foo\nbar'} />)).toMatchSnapshot();
-  expect(mount(<CodeSnippet snippet={'foo\nbar'} noCopy={true} />)).toMatchSnapshot();
+  expect(mount(<CodeSnippet noCopy={true} snippet={'foo\nbar'} />)).toMatchSnapshot();
 });
 
 it('renders correctly with array snippet', () => {
   expect(mount(<CodeSnippet snippet={['foo', 'bar']} />)).toMatchSnapshot();
-  expect(mount(<CodeSnippet snippet={['foo', 'bar']} isOneLine={true} />)).toMatchSnapshot();
+  expect(mount(<CodeSnippet isOneLine={true} snippet={['foo', 'bar']} />)).toMatchSnapshot();
 });
index 892d3226d1b8358b4f5e3fc34eaa747041ede0f4..29832878a31197fd441d8bc6dfcf5bf915be614c 100644 (file)
@@ -28,8 +28,8 @@ it('should render correctly without children', () => {
   expect(
     shallow(
       <SelectList
-        items={['item', 'seconditem', 'third']}
         currentItem="seconditem"
+        items={['item', 'seconditem', 'third']}
         onSelect={onSelect}
       />
     )
@@ -41,10 +41,11 @@ it('should render correctly with children', () => {
   const items = ['item', 'seconditem', 'third'];
   expect(
     shallow(
-      <SelectList items={items} currentItem="seconditem" onSelect={onSelect}>
+      <SelectList currentItem="seconditem" items={items} onSelect={onSelect}>
         {items.map(item => (
-          <SelectListItem key={item} item={item}>
-            <i className="myicon" />item
+          <SelectListItem item={item} key={item}>
+            <i className="myicon" />
+            item
           </SelectListItem>
         ))}
       </SelectList>
@@ -56,10 +57,11 @@ it('should correclty handle user actions', () => {
   const onSelect = jest.fn();
   const items = ['item', 'seconditem', 'third'];
   const list = mount(
-    <SelectList items={items} currentItem="seconditem" onSelect={onSelect}>
+    <SelectList currentItem="seconditem" items={items} onSelect={onSelect}>
       {items.map(item => (
-        <SelectListItem key={item} item={item}>
-          <i className="myicon" />item
+        <SelectListItem item={item} key={item}>
+          <i className="myicon" />
+          item
         </SelectListItem>
       ))}
     </SelectList>
index 5d8d59db66327a0ef74caf03ee7cf88d9288f255..8d9da47f1a3d27f009bf74059ab459f944d4c45a 100644 (file)
@@ -52,4 +52,7 @@ const mapDispatchToProps = (dispatch: Function, ownProps: any) => ({
   removeFavorite: () => dispatch(removeFavorite(ownProps.componentKey))
 });
 
-export default connect(mapStateToProps, mapDispatchToProps)(FavoriteBaseStateless);
+export default connect(
+  mapStateToProps,
+  mapDispatchToProps
+)(FavoriteBaseStateless);
index 3c1ec66c76aa190c6ef0afe54f2e4bb0a12cad5d..d71cec022b5373736337d34c4b0df77172f8ae29 100644 (file)
@@ -87,4 +87,7 @@ const mapStateToProps = (state: any): StateProps => ({
 
 const mapDispatchToProps: DispatchProps = { setHomePage };
 
-export default connect(mapStateToProps, mapDispatchToProps)(HomePageSelect);
+export default connect(
+  mapStateToProps,
+  mapDispatchToProps
+)(HomePageSelect);
index 3bc54c832858a0c8fbe0b39dc99e85e84ea27c85..33689460fde1bda0fd8fc14020daa41602a5a06a 100644 (file)
@@ -53,13 +53,13 @@ export default class RadioToggle extends React.PureComponent<Props> {
     return (
       <li key={option.value}>
         <input
-          type="radio"
+          checked={checked}
           disabled={option.disabled}
-          name={this.props.name}
-          value={option.value}
           id={htmlId}
-          checked={checked}
+          name={this.props.name}
           onChange={this.handleChange}
+          type="radio"
+          value={option.value}
         />
         <Tooltip overlay={option.tooltip || undefined}>
           <label htmlFor={htmlId}>{option.label}</label>
index fe437c24b8629675d31fe4623e2146c46b43a70c..b31f8e1ed7500e9093926db04bec5e17206544e0 100644 (file)
@@ -37,10 +37,10 @@ export default class ReloadButton extends React.PureComponent<Props> {
   };
 
   renderIcon = () => (
-    <svg width="18" height="24" viewBox="0 0 18 24">
+    <svg height="24" viewBox="0 0 18 24" width="18">
       <path
-        fill={theme.secondFontColor}
         d="M16.6454 8.1084c-.3-.5-.9-.7-1.4-.4-.5.3-.7.9-.4 1.4.9 1.6 1.1 3.4.6 5.1-.5 1.7-1.7 3.2-3.2 4-3.3 1.8-7.4.6-9.1-2.7-1.8-3.1-.8-6.9 2.1-8.8v3.3h2v-7h-7v2h3.9c-3.7 2.5-5 7.5-2.8 11.4 1.6 3 4.6 4.6 7.7 4.6 1.4 0 2.8-.3 4.2-1.1 2-1.1 3.5-3 4.2-5.2.6-2.2.3-4.6-.8-6.6z"
+        fill={theme.secondFontColor}
       />
     </svg>
   );
index ebf28cf924a6f787d7e7aae46b6042067fb5332f..4e3819370049aeec3d66c4b61d7eb3be8dcdef56 100644 (file)
@@ -80,26 +80,26 @@ export default class ScreenPositionFixer extends React.Component<Props, Fixes> {
   position = () => {
     // eslint-disable-next-line react/no-find-dom-node
     const node = findDOMNode(this);
-
-    const { width, height, left, top } = node.getBoundingClientRect();
-
-    const { clientHeight, clientWidth } = document.body;
-
-    let leftFix = 0;
-    if (left < EDGE_MARGIN) {
-      leftFix = EDGE_MARGIN - left;
-    } else if (left + width > clientWidth - EDGE_MARGIN) {
-      leftFix = clientWidth - EDGE_MARGIN - left - width;
+    if (node && node instanceof Element) {
+      const { width, height, left, top } = node.getBoundingClientRect();
+      const { clientHeight, clientWidth } = document.body;
+
+      let leftFix = 0;
+      if (left < EDGE_MARGIN) {
+        leftFix = EDGE_MARGIN - left;
+      } else if (left + width > clientWidth - EDGE_MARGIN) {
+        leftFix = clientWidth - EDGE_MARGIN - left - width;
+      }
+
+      let topFix = 0;
+      if (top < EDGE_MARGIN) {
+        topFix = EDGE_MARGIN - top;
+      } else if (top + height > clientHeight - EDGE_MARGIN) {
+        topFix = clientHeight - EDGE_MARGIN - top - height;
+      }
+
+      this.setState({ leftFix, topFix });
     }
-
-    let topFix = 0;
-    if (top < EDGE_MARGIN) {
-      topFix = EDGE_MARGIN - top;
-    } else if (top + height > clientHeight - EDGE_MARGIN) {
-      topFix = clientHeight - EDGE_MARGIN - top - height;
-    }
-
-    this.setState({ leftFix, topFix });
   };
 
   render() {
index 17a017881b7524805cc0f4c04afdc02741cc271b..9e25efbdb5cc1d9dcc12a56b31bee7149df86e5c 100644 (file)
@@ -157,7 +157,7 @@ export class TooltipInner extends React.Component<Props, State> {
     // eslint-disable-next-line react/no-find-dom-node
     const toggleNode = findDOMNode(this);
 
-    if (toggleNode && this.tooltipNode) {
+    if (toggleNode && toggleNode instanceof Element && this.tooltipNode) {
       const toggleRect = toggleNode.getBoundingClientRect();
       const tooltipRect = this.tooltipNode.getBoundingClientRect();
       const { width, height } = tooltipRect;
index 1e1640410d96a2c3b758ef666e032a7494994c0c..32118beae7ca5144409ff278a3ed682ec6ed38aa 100644 (file)
@@ -49,8 +49,8 @@ it('should remove favorite', () => {
 function renderFavoriteBase(props: Partial<Props> = {}) {
   return shallow(
     <FavoriteBase
-      favorite={true}
       addFavorite={jest.fn()}
+      favorite={true}
       qualifier="TRK"
       removeFavorite={jest.fn()}
       {...props}
index 153e7556bc0e0feebb6d989cb7e544ec8b2698ed..4aad9d7e3ac65e7a38b050ed8cff83572feb77a4 100644 (file)
@@ -48,5 +48,5 @@ it('accepts advanced options fields', () => {
 
 function getSample(props?: any) {
   const options = [{ value: 'one', label: 'first' }, { value: 'two', label: 'second' }];
-  return <RadioToggle options={options} name="sample" onCheck={() => true} {...props} />;
+  return <RadioToggle name="sample" onCheck={() => true} options={options} {...props} />;
 }
index 9e3893266298b210f3d04ecaf71e00cdad5cbce7..41fa47340bdf10799160ea2c3d99ab42f8f2545d 100644 (file)
@@ -29,9 +29,7 @@ jest.mock('lodash', () => {
 });
 
 jest.mock('react-dom', () => ({
-  findDOMNode: jest.fn(() => ({
-    getBoundingClientRect: () => ({ width: 0, height: 0, left: 0, top: 0 })
-  }))
+  findDOMNode: jest.fn()
 }));
 
 beforeEach(() => {
@@ -92,7 +90,7 @@ it('should re-position when window is resized', () => {
 
 function setNodeRect(rect: { width: number; height: number; left: number; top: number }) {
   const findDOMNode = require('react-dom').findDOMNode as jest.Mock<any>;
-  findDOMNode.mockImplementation(() => ({
-    getBoundingClientRect: () => rect
-  }));
+  const element = document.createElement('div');
+  Object.defineProperty(element, 'getBoundingClientRect', { value: () => rect });
+  findDOMNode.mockReturnValue(element);
 }
index f3048542aa14f1ca0e978dacc91de36bbc469d40..741736da349573641fbf79c6ebbd61d252e9d9cd 100644 (file)
@@ -40,15 +40,15 @@ function getWrapper(props = {}) {
       initialValues={{ field: 'foo' }}
       isInitialValid={true}
       onClose={jest.fn()}
-      validate={(values: Values) => ({ field: values.field.length < 2 && 'Too small' })}
       onSubmit={jest.fn(() => Promise.resolve())}
+      validate={(values: Values) => ({ field: values.field.length < 2 && 'Too small' })}
       {...props}>
       {(props: FormikProps<Values>) => (
         <form onSubmit={props.handleSubmit}>
           <input
-            onChange={props.handleChange}
-            onBlur={props.handleBlur}
             name="field"
+            onBlur={props.handleBlur}
+            onChange={props.handleChange}
             type="text"
             value={props.values.field}
           />
index 47b8c96183da7130d72244bdf6f984cd7fba9e71..081da9449eadc0e22f05af3b32c9897e42160bdf 100644 (file)
@@ -36,7 +36,7 @@ export default class DocCollapsibleBlock extends React.PureComponent<{}, State>
   renderTitle(children: any) {
     return (
       <a
-        aria-expanded={String(this.state.open)}
+        aria-expanded={this.state.open}
         aria-haspopup={true}
         className="link-no-underline"
         href="#"
index 763267113d63bc98a9836cfaf48c5eb95741cde8..67244fe808ab382bc5ca285ca9c4f19360d0bf47 100644 (file)
@@ -7,7 +7,7 @@ exports[`should render a collapsible block 1`] = `
   className="collapse-container"
 >
   <a
-    aria-expanded="false"
+    aria-expanded={false}
     aria-haspopup={true}
     className="link-no-underline"
     href="#"
@@ -27,7 +27,7 @@ exports[`should render a collapsible block 2`] = `
   className="collapse-container"
 >
   <a
-    aria-expanded="true"
+    aria-expanded={true}
     aria-haspopup={true}
     className="link-no-underline"
     href="#"
index 50990b4f72c9a3d9f51ccc76fc67773ce5dba25e..30ff382cf5c8054d06e3a3b0beda6e5760a32825 100644 (file)
@@ -36,7 +36,7 @@ export default function DropdownIcon({
       height={size}
       style={turned ? { transform: 'rotate(180deg)' } : undefined}
       viewBox="0 0 7 16"
-      width={size / 16 * 7}>
+      width={(size / 16) * 7}>
       <path
         d="M7 6.469a.42.42 0 0 1-.13.307L3.808 9.84a.42.42 0 0 1-.308.13.42.42 0 0 1-.308-.13L.13 6.776A.42.42 0 0 1 0 6.47a.42.42 0 0 1 .13-.308.42.42 0 0 1 .307-.13h6.126a.42.42 0 0 1 .307.13.42.42 0 0 1 .13.308z"
         style={{ fill }}
index 40a3f9ccdaa20e8aec74b349b78c52f525eda79f..25560e4eac8ca268b2581b2ff523801b472d9367 100644 (file)
@@ -55,7 +55,7 @@ export default function Icon({
         fillRule: 'evenodd',
         clipRule: 'evenodd',
         strokeLinejoin: 'round',
-        strokeMiterlimit: '1.41421',
+        strokeMiterlimit: 1.41421,
         ...style
       }}
       version="1.1"
index 0edabcb727fed13cae3c0ebcbdcf5ff9112d0a55..8371d6376b007600af7d6bb4eff20d10f95d1d23 100644 (file)
@@ -25,9 +25,9 @@ it('should render with the message and a link to open the rule', () => {
   const element = shallow(
     <IssueMessage
       manualVulnerability={false}
-      rule="javascript:S1067"
       message="Reduce the number of conditional operators (4) used in the expression"
       organization="myorg"
+      rule="javascript:S1067"
     />,
     { context: { workspace: {} } }
   );
index 38e804a1cd573ffdd5314bc3265fd5ab0d820a48..4a917cf1ead44c27c67c50d317f1e9c79d32fffa 100644 (file)
@@ -50,8 +50,8 @@ it('should render the titlebar correctly', () => {
   const element = shallow(
     <IssueTitleBar
       branchLike={{ isMain: false, name: 'feature-1.0', type: 'SHORT' }}
-      issue={issue}
       currentPopup={null}
+      issue={issue}
       onFail={jest.fn()}
       togglePopup={jest.fn()}
     />
@@ -62,8 +62,8 @@ it('should render the titlebar correctly', () => {
 it('should render the titlebar with the filter', () => {
   const element = shallow(
     <IssueTitleBar
-      issue={issue}
       currentPopup={null}
+      issue={issue}
       onFail={jest.fn()}
       onFilter={jest.fn()}
       togglePopup={jest.fn()}
index 3c60cad23a2f257c20050f0438875802d9c58282..a9ec681f27b861914f790fbb4354e00a697d7ee0 100644 (file)
@@ -110,7 +110,9 @@ export default class ChangelogPopup extends React.PureComponent {
                         {item.userName}
                       </p>
                     )}
-                    {item.diffs.map(diff => <IssueChangelogDiff diff={diff} key={diff.key} />)}
+                    {item.diffs.map(diff => (
+                      <IssueChangelogDiff diff={diff} key={diff.key} />
+                    ))}
                   </td>
                 </tr>
               ))}
index 9f790afa5cfb4c49b624c47d3cebe164132903ea..b98fb9b22ff28dfe7bdd8ed00aa6a1b26eae336a 100644 (file)
@@ -168,9 +168,7 @@ export default class PreviewGraph extends React.PureComponent {
           <div>
             <AdvancedTimeline
               endDate={null}
-              startDate={null}
               height={80}
-              width={width}
               hideGrid={true}
               hideXAxis={true}
               interpolate="linear"
@@ -178,7 +176,9 @@ export default class PreviewGraph extends React.PureComponent {
               padding={GRAPH_PADDING}
               series={series}
               showAreas={['coverage', 'duplications'].includes(graph)}
+              startDate={null}
               updateTooltip={this.updateTooltip}
+              width={width}
             />
             {selectedDate != null &&
               tooltipXPos != null &&
@@ -210,8 +210,8 @@ export default class PreviewGraph extends React.PureComponent {
       <div
         className="overview-analysis-graph big-spacer-bottom spacer-top"
         onClick={this.handleClick}
-        tabIndex={0}
-        role="link">
+        role="link"
+        tabIndex={0}>
         {this.renderTimeline()}
       </div>
     );
index 8836780c7f9ea299f58ac541fb7a77501976eaa8..8081a2c76d3a1a05e985dd91ae78a474297dbf87 100644 (file)
@@ -127,7 +127,7 @@ export default class DrilldownLink extends React.PureComponent<Props> {
     });
 
     return (
-      <Link to={url} className={this.props.className}>
+      <Link className={this.props.className} to={url}>
         {this.props.children}
       </Link>
     );
index ea0cc484b7fa35ec122fa0001cb0038f75d622b2..3f35a5fdf9b487f55c34784058b8b3542eaae283 100644 (file)
@@ -97,7 +97,7 @@ export default class Workspace extends React.PureComponent<{}, State> {
   };
 
   openComponent = (component: ComponentDescriptor) => {
-    this.setState((state: State): Partial<State> => ({
+    this.setState((state: State) => ({
       components: uniqBy([...state.components, component], component => component.key),
       open: { component: component.key }
     }));
@@ -108,7 +108,7 @@ export default class Workspace extends React.PureComponent<{}, State> {
   };
 
   openRule = (rule: RuleDescriptor) => {
-    this.setState((state: State): Partial<State> => ({
+    this.setState((state: State) => ({
       open: { rule: rule.key },
       rules: uniqBy([...state.rules, rule], rule => rule.key)
     }));
@@ -119,7 +119,7 @@ export default class Workspace extends React.PureComponent<{}, State> {
   };
 
   closeComponent = (componentKey: string) => {
-    this.setState((state: State): Partial<State> => ({
+    this.setState((state: State) => ({
       components: state.components.filter(x => x.key !== componentKey),
       open: {
         ...state.open,
@@ -129,7 +129,7 @@ export default class Workspace extends React.PureComponent<{}, State> {
   };
 
   closeRule = (ruleKey: string) => {
-    this.setState((state: State): Partial<State> => ({
+    this.setState((state: State) => ({
       rules: state.rules.filter(x => x.key !== ruleKey),
       open: {
         ...state.open,
@@ -141,7 +141,7 @@ export default class Workspace extends React.PureComponent<{}, State> {
   handleComponentLoad = (details: { key: string; name: string; qualifier: string }) => {
     if (this.mounted) {
       const { key, name, qualifier } = details;
-      this.setState((state: State): Partial<State> => ({
+      this.setState((state: State) => ({
         components: state.components.map(
           component => (component.key === key ? { ...component, name, qualifier } : component)
         )
@@ -152,7 +152,7 @@ export default class Workspace extends React.PureComponent<{}, State> {
   handleRuleLoad = (details: { key: string; name: string }) => {
     if (this.mounted) {
       const { key, name } = details;
-      this.setState((state: State): Partial<State> => ({
+      this.setState((state: State) => ({
         rules: state.rules.map(rule => (rule.key === key ? { ...rule, name } : rule))
       }));
     }
@@ -173,7 +173,7 @@ export default class Workspace extends React.PureComponent<{}, State> {
   resize = (deltaY: number) => {
     const minHeight = window.innerHeight * MIN_HEIGHT;
     const maxHeight = window.innerHeight * MAX_HEIGHT;
-    this.setState((state: State): Partial<State> => ({
+    this.setState((state: State) => ({
       height: Math.min(maxHeight, Math.max(minHeight, state.height - deltaY))
     }));
   };
index 9d6dabbe266e9acbf1a357dea2ed3f7b62030701..3c37516c6fd7e3679265cc24cbf75e60c5b57a48 100644 (file)
  */
 import { memoize } from 'lodash';
 
-const parseCookies = memoize((documentCookie: string): { [key: string]: string } => {
-  const rawCookies = documentCookie.split('; ');
-  const cookies: { [key: string]: string } = {};
-  rawCookies.forEach(candidate => {
-    const [key, value] = candidate.split('=');
-    cookies[key] = value;
-  });
-  return cookies;
-});
+const parseCookies = memoize(
+  (documentCookie: string): { [key: string]: string } => {
+    const rawCookies = documentCookie.split('; ');
+    const cookies: { [key: string]: string } = {};
+    rawCookies.forEach(candidate => {
+      const [key, value] = candidate.split('=');
+      cookies[key] = value;
+    });
+    return cookies;
+  }
+);
 
 export function getCookie(name: string): string | undefined {
   return parseCookies(document.cookie)[name];
index 3f007ae52e130365218a17d26d452bcc5538ac2a..5ac8d4d81eb774be6cc2047869625c77f00b7b99 100644 (file)
@@ -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 { Dispatch } from 'react-redux';
+import { Dispatch } from 'redux';
 import { getPendingPlugins, PluginPendingResult } from '../../api/plugins';
 
 interface SetPendingPluginsAction {
index a41ada6d570d0f5f1b22fdfe79ba6da0001be1b8..75bb516bfbe98f17049b34d83b95efc71fb0ed26 100644 (file)
@@ -30,7 +30,10 @@ if (process.env.NODE_ENV === 'development') {
   composed.push(window.devToolsExtension ? window.devToolsExtension() : f => f);
 }
 
-const finalCreateStore = compose(applyMiddleware(...middlewares), ...composed)(createStore);
+const finalCreateStore = compose(
+  applyMiddleware(...middlewares),
+  ...composed
+)(createStore);
 
 export default function configureStore(rootReducer, initialState) {
   return finalCreateStore(rootReducer, initialState);
diff --git a/server/sonar-web/src/main/js/store/withCurrentUser.tsx b/server/sonar-web/src/main/js/store/withCurrentUser.tsx
deleted file mode 100644 (file)
index 6656a74..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2018 SonarSource SA
- * mailto:info 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 { connect } from 'react-redux';
-import * as React from 'react';
-import { getCurrentUser } from './rootReducer';
-import { CurrentUser } from '../app/types';
-
-interface StateProps {
-  currentUser: CurrentUser;
-}
-
-export function withCurrentUser<P extends StateProps>(Component: React.ComponentClass<P>) {
-  function mapStateToProps(state: any): StateProps {
-    return { currentUser: getCurrentUser(state) };
-  }
-
-  return connect<StateProps>(mapStateToProps)(Component);
-}
index b54ea2c88e9b7848fb3dffcf6b10cd255a023b0e..ad5afff92e9ddc78cc9ef2f307cf3855945aa1ab 100644 (file)
   dependencies:
     "@types/d3-time" "*"
 
-"@types/d3-selection@*":
-  version "1.3.1"
-  resolved "https://registry.yarnpkg.com/@types/d3-selection/-/d3-selection-1.3.1.tgz#c6227f4e39d429cc429ce3882fd533facc7f014c"
-
-"@types/d3-selection@1.3.0":
+"@types/d3-selection@*", "@types/d3-selection@1.3.0":
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/@types/d3-selection/-/d3-selection-1.3.0.tgz#acede3d22c18ec085cc401d4fdab9f040e1a73c7"
 
   version "3.2.2"
   resolved "https://registry.yarnpkg.com/@types/history/-/history-3.2.2.tgz#b6affa240cb10b5f841c6443d8a24d7f3fc8bb0c"
 
-"@types/jest@22.2.3":
-  version "22.2.3"
-  resolved "https://registry.yarnpkg.com/@types/jest/-/jest-22.2.3.tgz#0157c0316dc3722c43a7b71de3fdf3acbccef10d"
+"@types/jest@23.3.1":
+  version "23.3.1"
+  resolved "https://registry.yarnpkg.com/@types/jest/-/jest-23.3.1.tgz#a4319aedb071d478e6f407d1c4578ec8156829cf"
 
 "@types/keymaster@1.6.28":
   version "1.6.28"
   version "6.0.90"
   resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.90.tgz#0ed74833fa1b73dcdb9409dcb1c97ec0a8b13b02"
 
-"@types/prop-types@*", "@types/prop-types@15.5.2":
-  version "15.5.2"
-  resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.5.2.tgz#3c6b8dceb2906cc87fe4358e809f9d20c8d59be1"
+"@types/prop-types@*", "@types/prop-types@15.5.4":
+  version "15.5.4"
+  resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.5.4.tgz#9e6199bad131786e24c2baa2a82705a02139fbf8"
+  dependencies:
+    "@types/react" "*"
 
-"@types/react-dom@16.0.3":
-  version "16.0.3"
-  resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.0.3.tgz#8accad7eabdab4cca3e1a56f5ccb57de2da0ff64"
+"@types/react-dom@16.0.7":
+  version "16.0.7"
+  resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.0.7.tgz#54d0f867a76b90597e8432030d297982f25c20ba"
   dependencies:
     "@types/node" "*"
     "@types/react" "*"
   dependencies:
     "@types/react" "*"
 
-"@types/react-redux@5.0.12":
-  version "5.0.12"
-  resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-5.0.12.tgz#c066812eb970009b373372f439d08265ed2a6f8e"
+"@types/react-redux@6.0.6":
+  version "6.0.6"
+  resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-6.0.6.tgz#87f1d0a6ea901b93fcaf95fa57641ff64079d277"
   dependencies:
     "@types/react" "*"
-    redux "^3.6.0"
+    redux "^4.0.0"
 
 "@types/react-router@3.0.13":
   version "3.0.13"
     "@types/prop-types" "*"
     "@types/react" "*"
 
-"@types/react@*", "@types/react@16.0.29":
-  version "16.0.29"
-  resolved "https://registry.yarnpkg.com/@types/react/-/react-16.0.29.tgz#4eea6a8de9f40ca71d580ae7a9f3b4b77b368de8"
+"@types/react@*", "@types/react@16.4.8":
+  version "16.4.8"
+  resolved "https://registry.yarnpkg.com/@types/react/-/react-16.4.8.tgz#ff0440429783df0927bdcd430fa1225f7c08cf36"
+  dependencies:
+    "@types/prop-types" "*"
+    csstype "^2.2.0"
 
 "@webassemblyjs/ast@1.5.13":
   version "1.5.13"
@@ -355,11 +356,7 @@ acorn@^3.0.4:
   version "3.3.0"
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
 
-acorn@^5.0.0, acorn@^5.1.2, acorn@^5.3.0, acorn@^5.5.0:
-  version "5.5.3"
-  resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.3.tgz#f473dd47e0277a08e28e9bec5aeeb04751f0b8c9"
-
-acorn@^5.6.2:
+acorn@^5.0.0, acorn@^5.1.2, acorn@^5.3.0, acorn@^5.5.0, acorn@^5.6.2:
   version "5.7.1"
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8"
 
@@ -711,7 +708,7 @@ babel-code-frame@6.26.0, babel-code-frame@^6.22.0, babel-code-frame@^6.26.0:
     esutils "^2.0.2"
     js-tokens "^3.0.2"
 
-babel-core@6.26.3, babel-core@^6.0.0, babel-core@^6.26.0, babel-core@^6.26.3:
+babel-core@6.26.3, babel-core@^6.0.0, babel-core@^6.26.0:
   version "6.26.3"
   resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207"
   dependencies:
@@ -864,12 +861,12 @@ babel-helpers@^6.24.1:
     babel-runtime "^6.22.0"
     babel-template "^6.24.1"
 
-babel-jest@23.0.1, babel-jest@^23.0.1:
-  version "23.0.1"
-  resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-23.0.1.tgz#bbad3bf523fb202da05ed0a6540b48c84eed13a6"
+babel-jest@23.4.2, babel-jest@^23.4.2:
+  version "23.4.2"
+  resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-23.4.2.tgz#f276de67798a5d68f2d6e87ff518c2f6e1609877"
   dependencies:
     babel-plugin-istanbul "^4.1.6"
-    babel-preset-jest "^23.0.1"
+    babel-preset-jest "^23.2.0"
 
 babel-loader@7.1.4:
   version "7.1.4"
@@ -906,13 +903,9 @@ babel-plugin-istanbul@^4.1.6:
     istanbul-lib-instrument "^1.10.1"
     test-exclude "^4.2.1"
 
-babel-plugin-jest-hoist@^22.4.3:
-  version "22.4.3"
-  resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.3.tgz#7d8bcccadc2667f96a0dcc6afe1891875ee6c14a"
-
-babel-plugin-jest-hoist@^23.0.1:
-  version "23.0.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.0.1.tgz#eaa11c964563aea9c21becef2bdf7853f7f3c148"
+babel-plugin-jest-hoist@^23.2.0:
+  version "23.2.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz#e61fae05a1ca8801aadee57a6d66b8cefaf44167"
 
 babel-plugin-lodash@3.3.2:
   version "3.3.2"
@@ -1057,7 +1050,7 @@ babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015
     babel-runtime "^6.22.0"
     babel-template "^6.24.1"
 
-babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1, babel-plugin-transform-es2015-modules-commonjs@^6.26.2:
+babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1:
   version "6.26.2"
   resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3"
   dependencies:
@@ -1259,18 +1252,11 @@ babel-preset-flow@^6.23.0:
   dependencies:
     babel-plugin-transform-flow-strip-types "^6.22.0"
 
-babel-preset-jest@^22.4.3:
-  version "22.4.3"
-  resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-22.4.3.tgz#e92eef9813b7026ab4ca675799f37419b5a44156"
-  dependencies:
-    babel-plugin-jest-hoist "^22.4.3"
-    babel-plugin-syntax-object-rest-spread "^6.13.0"
-
-babel-preset-jest@^23.0.1:
-  version "23.0.1"
-  resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-23.0.1.tgz#631cc545c6cf021943013bcaf22f45d87fe62198"
+babel-preset-jest@^23.2.0:
+  version "23.2.0"
+  resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz#8ec7a03a138f001a1a8fb1e8113652bf1a55da46"
   dependencies:
-    babel-plugin-jest-hoist "^23.0.1"
+    babel-plugin-jest-hoist "^23.2.0"
     babel-plugin-syntax-object-rest-spread "^6.13.0"
 
 babel-preset-react@^6.22.0:
@@ -1303,7 +1289,7 @@ babel-runtime@6.23.0:
     core-js "^2.4.0"
     regenerator-runtime "^0.10.0"
 
-babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0, babel-runtime@^6.9.2:
+babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0:
   version "6.26.0"
   resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
   dependencies:
@@ -1320,7 +1306,7 @@ babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0:
     babylon "^6.18.0"
     lodash "^4.17.4"
 
-babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0:
+babel-traverse@^6.0.0, babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0:
   version "6.26.0"
   resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
   dependencies:
@@ -1342,7 +1328,7 @@ babel-types@7.0.0-beta.3:
     lodash "^4.2.0"
     to-fast-properties "^2.0.0"
 
-babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0:
+babel-types@^6.0.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0:
   version "6.26.0"
   resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
   dependencies:
@@ -1511,9 +1497,9 @@ browser-process-hrtime@^0.1.2:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e"
 
-browser-resolve@^1.11.2:
-  version "1.11.2"
-  resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce"
+browser-resolve@^1.11.3:
+  version "1.11.3"
+  resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6"
   dependencies:
     resolve "1.1.7"
 
@@ -1774,21 +1760,6 @@ cheerio@^1.0.0-rc.2:
     lodash "^4.15.0"
     parse5 "^3.0.1"
 
-chokidar@^1.6.0:
-  version "1.7.0"
-  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468"
-  dependencies:
-    anymatch "^1.3.0"
-    async-each "^1.0.0"
-    glob-parent "^2.0.0"
-    inherits "^2.0.1"
-    is-binary-path "^1.0.0"
-    is-glob "^2.0.0"
-    path-is-absolute "^1.0.0"
-    readdirp "^2.0.0"
-  optionalDependencies:
-    fsevents "^1.0.0"
-
 chokidar@^2.0.0, chokidar@^2.0.2:
   version "2.0.2"
   resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.2.tgz#4dc65139eeb2714977735b6a35d06e97b494dfd7"
@@ -1919,6 +1890,10 @@ clone@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149"
 
+closest-file-data@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/closest-file-data/-/closest-file-data-0.1.4.tgz#975f87c132f299d24a0375b9f63ca3fb88f72b3a"
+
 co@^4.6.0:
   version "4.6.0"
   resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
@@ -2162,22 +2137,6 @@ cosmiconfig@^2.1.0, cosmiconfig@^2.1.1:
     parse-json "^2.2.0"
     require-from-string "^1.1.0"
 
-cpx@^1.5.0:
-  version "1.5.0"
-  resolved "https://registry.yarnpkg.com/cpx/-/cpx-1.5.0.tgz#185be018511d87270dedccc293171e37655ab88f"
-  dependencies:
-    babel-runtime "^6.9.2"
-    chokidar "^1.6.0"
-    duplexer "^0.1.1"
-    glob "^7.0.5"
-    glob2base "^0.0.12"
-    minimatch "^3.0.2"
-    mkdirp "^0.5.1"
-    resolve "^1.1.7"
-    safe-buffer "^5.0.1"
-    shell-quote "^1.6.1"
-    subarg "^1.0.0"
-
 create-ecdh@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d"
@@ -2354,6 +2313,10 @@ cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0":
   dependencies:
     cssom "0.3.x"
 
+csstype@^2.2.0:
+  version "2.5.6"
+  resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.5.6.tgz#2ae1db2319642d8b80a668d2d025c6196071e788"
+
 currently-unhandled@^0.4.1:
   version "0.4.1"
   resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
@@ -2808,14 +2771,10 @@ elliptic@^6.0.0:
     minimalistic-assert "^1.0.0"
     minimalistic-crypto-utils "^1.0.0"
 
-"emoji-regex@>=6.0.0 <=6.1.1":
+"emoji-regex@>=6.0.0 <=6.1.1", emoji-regex@^6.1.0:
   version "6.1.1"
   resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.1.1.tgz#c6cd0ec1b0642e2a3c67a1137efc5e796da4f88e"
 
-emoji-regex@^6.1.0:
-  version "6.5.1"
-  resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.5.1.tgz#9baea929b155565c11ea41c6626eaa65cef992c2"
-
 emojis-list@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
@@ -2836,15 +2795,7 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0:
   dependencies:
     once "^1.4.0"
 
-enhanced-resolve@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.0.0.tgz#e34a6eaa790f62fccd71d93959f56b2b432db10a"
-  dependencies:
-    graceful-fs "^4.1.2"
-    memory-fs "^0.4.0"
-    tapable "^1.0.0"
-
-enhanced-resolve@^4.1.0:
+enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f"
   dependencies:
@@ -3205,27 +3156,16 @@ expand-tilde@^2.0.0, expand-tilde@^2.0.2:
   dependencies:
     homedir-polyfill "^1.0.1"
 
-expect@^22.4.3:
-  version "22.4.3"
-  resolved "https://registry.yarnpkg.com/expect/-/expect-22.4.3.tgz#d5a29d0a0e1fb2153557caef2674d4547e914674"
-  dependencies:
-    ansi-styles "^3.2.0"
-    jest-diff "^22.4.3"
-    jest-get-type "^22.4.3"
-    jest-matcher-utils "^22.4.3"
-    jest-message-util "^22.4.3"
-    jest-regex-util "^22.4.3"
-
-expect@^23.1.0:
-  version "23.1.0"
-  resolved "https://registry.yarnpkg.com/expect/-/expect-23.1.0.tgz#bfdfd57a2a20170d875999ee9787cc71f01c205f"
+expect@^23.4.0:
+  version "23.4.0"
+  resolved "https://registry.yarnpkg.com/expect/-/expect-23.4.0.tgz#6da4ecc99c1471253e7288338983ad1ebadb60c3"
   dependencies:
     ansi-styles "^3.2.0"
-    jest-diff "^23.0.1"
+    jest-diff "^23.2.0"
     jest-get-type "^22.1.0"
-    jest-matcher-utils "^23.0.1"
-    jest-message-util "^23.1.0"
-    jest-regex-util "^23.0.0"
+    jest-matcher-utils "^23.2.0"
+    jest-message-util "^23.4.0"
+    jest-regex-util "^23.3.0"
 
 expose-loader@0.7.5:
   version "0.7.5"
@@ -3442,10 +3382,6 @@ find-cache-dir@^1.0.0:
     make-dir "^1.0.0"
     pkg-dir "^2.0.0"
 
-find-index@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4"
-
 find-up@^1.0.0:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
@@ -3548,9 +3484,9 @@ from2@^2.1.0:
     inherits "^2.0.1"
     readable-stream "^2.0.0"
 
-fs-extra@6.0.0:
-  version "6.0.0"
-  resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-6.0.0.tgz#0f0afb290bb3deb87978da816fcd3c7797f3a817"
+fs-extra@6.0.1:
+  version "6.0.1"
+  resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-6.0.1.tgz#8abc128f7946e310135ddc93b98bddb410e7a34b"
   dependencies:
     graceful-fs "^4.1.2"
     jsonfile "^4.0.0"
@@ -3680,12 +3616,6 @@ glob-promise@3.4.0:
   dependencies:
     "@types/glob" "*"
 
-glob2base@^0.0.12:
-  version "0.0.12"
-  resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56"
-  dependencies:
-    find-index "^0.1.1"
-
 glob@7.1.2, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2:
   version "7.1.2"
   resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
@@ -4118,14 +4048,10 @@ icss-utils@^2.1.0:
   dependencies:
     postcss "^6.0.1"
 
-ieee754@^1.1.11:
+ieee754@^1.1.11, ieee754@^1.1.4:
   version "1.1.12"
   resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b"
 
-ieee754@^1.1.4:
-  version "1.1.8"
-  resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4"
-
 iferr@^0.1.5:
   version "0.1.5"
   resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
@@ -4676,15 +4602,15 @@ istanbul-reports@^1.3.0:
   dependencies:
     handlebars "^4.0.3"
 
-jest-changed-files@^23.0.1:
-  version "23.0.1"
-  resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-23.0.1.tgz#f79572d0720844ea5df84c2a448e862c2254f60c"
+jest-changed-files@^23.4.2:
+  version "23.4.2"
+  resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-23.4.2.tgz#1eed688370cd5eebafe4ae93d34bb3b64968fe83"
   dependencies:
     throat "^4.0.0"
 
-jest-cli@^23.1.0:
-  version "23.1.0"
-  resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-23.1.0.tgz#eb8bdd4ce0d15250892e31ad9b69bc99d2a8f6bf"
+jest-cli@^23.4.2:
+  version "23.4.2"
+  resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-23.4.2.tgz#49d56bcfe6cf01871bfcc4a0494e08edaf2b61d0"
   dependencies:
     ansi-escapes "^3.0.0"
     chalk "^2.0.1"
@@ -4697,23 +4623,24 @@ jest-cli@^23.1.0:
     istanbul-lib-coverage "^1.2.0"
     istanbul-lib-instrument "^1.10.1"
     istanbul-lib-source-maps "^1.2.4"
-    jest-changed-files "^23.0.1"
-    jest-config "^23.1.0"
-    jest-environment-jsdom "^23.1.0"
+    jest-changed-files "^23.4.2"
+    jest-config "^23.4.2"
+    jest-environment-jsdom "^23.4.0"
     jest-get-type "^22.1.0"
-    jest-haste-map "^23.1.0"
-    jest-message-util "^23.1.0"
-    jest-regex-util "^23.0.0"
-    jest-resolve-dependencies "^23.0.1"
-    jest-runner "^23.1.0"
-    jest-runtime "^23.1.0"
-    jest-snapshot "^23.0.1"
-    jest-util "^23.1.0"
-    jest-validate "^23.0.1"
-    jest-watcher "^23.1.0"
-    jest-worker "^23.0.1"
+    jest-haste-map "^23.4.1"
+    jest-message-util "^23.4.0"
+    jest-regex-util "^23.3.0"
+    jest-resolve-dependencies "^23.4.2"
+    jest-runner "^23.4.2"
+    jest-runtime "^23.4.2"
+    jest-snapshot "^23.4.2"
+    jest-util "^23.4.0"
+    jest-validate "^23.4.0"
+    jest-watcher "^23.4.0"
+    jest-worker "^23.2.0"
     micromatch "^2.3.11"
     node-notifier "^5.2.1"
+    prompts "^0.1.9"
     realpath-native "^1.0.0"
     rimraf "^2.5.4"
     slash "^1.0.0"
@@ -4722,178 +4649,115 @@ jest-cli@^23.1.0:
     which "^1.2.12"
     yargs "^11.0.0"
 
-jest-config@^22.4.3:
-  version "22.4.3"
-  resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-22.4.3.tgz#0e9d57db267839ea31309119b41dc2fa31b76403"
-  dependencies:
-    chalk "^2.0.1"
-    glob "^7.1.1"
-    jest-environment-jsdom "^22.4.3"
-    jest-environment-node "^22.4.3"
-    jest-get-type "^22.4.3"
-    jest-jasmine2 "^22.4.3"
-    jest-regex-util "^22.4.3"
-    jest-resolve "^22.4.3"
-    jest-util "^22.4.3"
-    jest-validate "^22.4.3"
-    pretty-format "^22.4.3"
-
-jest-config@^23.1.0:
-  version "23.1.0"
-  resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-23.1.0.tgz#708ca0f431d356ee424fb4895d3308006bdd8241"
+jest-config@^23.4.2:
+  version "23.4.2"
+  resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-23.4.2.tgz#62a105e14b8266458f2bf4d32403b2c44418fa77"
   dependencies:
     babel-core "^6.0.0"
-    babel-jest "^23.0.1"
+    babel-jest "^23.4.2"
     chalk "^2.0.1"
     glob "^7.1.1"
-    jest-environment-jsdom "^23.1.0"
-    jest-environment-node "^23.1.0"
+    jest-environment-jsdom "^23.4.0"
+    jest-environment-node "^23.4.0"
     jest-get-type "^22.1.0"
-    jest-jasmine2 "^23.1.0"
-    jest-regex-util "^23.0.0"
-    jest-resolve "^23.1.0"
-    jest-util "^23.1.0"
-    jest-validate "^23.0.1"
-    pretty-format "^23.0.1"
-
-jest-diff@^22.4.3:
-  version "22.4.3"
-  resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-22.4.3.tgz#e18cc3feff0aeef159d02310f2686d4065378030"
-  dependencies:
-    chalk "^2.0.1"
-    diff "^3.2.0"
-    jest-get-type "^22.4.3"
-    pretty-format "^22.4.3"
+    jest-jasmine2 "^23.4.2"
+    jest-regex-util "^23.3.0"
+    jest-resolve "^23.4.1"
+    jest-util "^23.4.0"
+    jest-validate "^23.4.0"
+    pretty-format "^23.2.0"
 
-jest-diff@^23.0.1:
-  version "23.0.1"
-  resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-23.0.1.tgz#3d49137cee12c320a4b4d2b4a6fa6e82d491a16a"
+jest-diff@^23.2.0:
+  version "23.2.0"
+  resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-23.2.0.tgz#9f2cf4b51e12c791550200abc16b47130af1062a"
   dependencies:
     chalk "^2.0.1"
     diff "^3.2.0"
     jest-get-type "^22.1.0"
-    pretty-format "^23.0.1"
+    pretty-format "^23.2.0"
 
-jest-docblock@^23.0.1:
-  version "23.0.1"
-  resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-23.0.1.tgz#deddd18333be5dc2415260a04ef3fce9276b5725"
+jest-docblock@^23.2.0:
+  version "23.2.0"
+  resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-23.2.0.tgz#f085e1f18548d99fdd69b20207e6fd55d91383a7"
   dependencies:
     detect-newline "^2.1.0"
 
-jest-each@^23.1.0:
-  version "23.1.0"
-  resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-23.1.0.tgz#16146b592c354867a5ae5e13cdf15c6c65b696c6"
+jest-each@^23.4.0:
+  version "23.4.0"
+  resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-23.4.0.tgz#2fa9edd89daa1a4edc9ff9bf6062a36b71345143"
   dependencies:
     chalk "^2.0.1"
-    pretty-format "^23.0.1"
-
-jest-environment-jsdom@^22.4.3:
-  version "22.4.3"
-  resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-22.4.3.tgz#d67daa4155e33516aecdd35afd82d4abf0fa8a1e"
-  dependencies:
-    jest-mock "^22.4.3"
-    jest-util "^22.4.3"
-    jsdom "^11.5.1"
+    pretty-format "^23.2.0"
 
-jest-environment-jsdom@^23.1.0:
-  version "23.1.0"
-  resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-23.1.0.tgz#85929914e23bed3577dac9755f4106d0697c479c"
+jest-environment-jsdom@^23.4.0:
+  version "23.4.0"
+  resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz#056a7952b3fea513ac62a140a2c368c79d9e6023"
   dependencies:
-    jest-mock "^23.1.0"
-    jest-util "^23.1.0"
+    jest-mock "^23.2.0"
+    jest-util "^23.4.0"
     jsdom "^11.5.1"
 
-jest-environment-node@^22.4.3:
-  version "22.4.3"
-  resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-22.4.3.tgz#54c4eaa374c83dd52a9da8759be14ebe1d0b9129"
-  dependencies:
-    jest-mock "^22.4.3"
-    jest-util "^22.4.3"
-
-jest-environment-node@^23.1.0:
-  version "23.1.0"
-  resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-23.1.0.tgz#452c0bf949cfcbbacda1e1762eeed70bc784c7d5"
+jest-environment-node@^23.4.0:
+  version "23.4.0"
+  resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-23.4.0.tgz#57e80ed0841dea303167cce8cd79521debafde10"
   dependencies:
-    jest-mock "^23.1.0"
-    jest-util "^23.1.0"
+    jest-mock "^23.2.0"
+    jest-util "^23.4.0"
 
 jest-get-type@^21.2.0:
   version "21.2.0"
   resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-21.2.0.tgz#f6376ab9db4b60d81e39f30749c6c466f40d4a23"
 
-jest-get-type@^22.1.0, jest-get-type@^22.4.3:
+jest-get-type@^22.1.0:
   version "22.4.3"
   resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.4.3.tgz#e3a8504d8479342dd4420236b322869f18900ce4"
 
-jest-haste-map@^23.1.0:
-  version "23.1.0"
-  resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-23.1.0.tgz#18e6c7d5a8d27136f91b7d9852f85de0c7074c49"
+jest-haste-map@^23.4.1:
+  version "23.4.1"
+  resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-23.4.1.tgz#43a174ba7ac079ae1dd74eaf5a5fe78989474dd2"
   dependencies:
     fb-watchman "^2.0.0"
     graceful-fs "^4.1.11"
-    jest-docblock "^23.0.1"
+    jest-docblock "^23.2.0"
     jest-serializer "^23.0.1"
-    jest-worker "^23.0.1"
+    jest-worker "^23.2.0"
     micromatch "^2.3.11"
     sane "^2.0.0"
 
-jest-jasmine2@^22.4.3:
-  version "22.4.3"
-  resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-22.4.3.tgz#4daf64cd14c793da9db34a7c7b8dcfe52a745965"
+jest-jasmine2@^23.4.2:
+  version "23.4.2"
+  resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-23.4.2.tgz#2fbf52f93e43ed4c5e7326a90bb1d785be4321ac"
   dependencies:
+    babel-traverse "^6.0.0"
     chalk "^2.0.1"
     co "^4.6.0"
-    expect "^22.4.3"
-    graceful-fs "^4.1.11"
+    expect "^23.4.0"
     is-generator-fn "^1.0.0"
-    jest-diff "^22.4.3"
-    jest-matcher-utils "^22.4.3"
-    jest-message-util "^22.4.3"
-    jest-snapshot "^22.4.3"
-    jest-util "^22.4.3"
-    source-map-support "^0.5.0"
+    jest-diff "^23.2.0"
+    jest-each "^23.4.0"
+    jest-matcher-utils "^23.2.0"
+    jest-message-util "^23.4.0"
+    jest-snapshot "^23.4.2"
+    jest-util "^23.4.0"
+    pretty-format "^23.2.0"
 
-jest-jasmine2@^23.1.0:
-  version "23.1.0"
-  resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-23.1.0.tgz#4afab31729b654ddcd2b074add849396f13b30b8"
+jest-leak-detector@^23.2.0:
+  version "23.2.0"
+  resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-23.2.0.tgz#c289d961dc638f14357d4ef96e0431ecc1aa377d"
   dependencies:
-    chalk "^2.0.1"
-    co "^4.6.0"
-    expect "^23.1.0"
-    is-generator-fn "^1.0.0"
-    jest-diff "^23.0.1"
-    jest-each "^23.1.0"
-    jest-matcher-utils "^23.0.1"
-    jest-message-util "^23.1.0"
-    jest-snapshot "^23.0.1"
-    jest-util "^23.1.0"
-    pretty-format "^23.0.1"
-
-jest-leak-detector@^23.0.1:
-  version "23.0.1"
-  resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-23.0.1.tgz#9dba07505ac3495c39d3ec09ac1e564599e861a0"
-  dependencies:
-    pretty-format "^23.0.1"
+    pretty-format "^23.2.0"
 
-jest-matcher-utils@^22.4.3:
-  version "22.4.3"
-  resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz#4632fe428ebc73ebc194d3c7b65d37b161f710ff"
-  dependencies:
-    chalk "^2.0.1"
-    jest-get-type "^22.4.3"
-    pretty-format "^22.4.3"
-
-jest-matcher-utils@^23.0.1:
-  version "23.0.1"
-  resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-23.0.1.tgz#0c6c0daedf9833c2a7f36236069efecb4c3f6e5f"
+jest-matcher-utils@^23.2.0:
+  version "23.2.0"
+  resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-23.2.0.tgz#4d4981f23213e939e3cedf23dc34c747b5ae1913"
   dependencies:
     chalk "^2.0.1"
     jest-get-type "^22.1.0"
-    pretty-format "^23.0.1"
+    pretty-format "^23.2.0"
 
-jest-message-util@^22.4.3:
-  version "22.4.3"
-  resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-22.4.3.tgz#cf3d38aafe4befddbfc455e57d65d5239e399eb7"
+jest-message-util@^23.4.0:
+  version "23.4.0"
+  resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-23.4.0.tgz#17610c50942349508d01a3d1e0bda2c079086a9f"
   dependencies:
     "@babel/code-frame" "^7.0.0-beta.35"
     chalk "^2.0.1"
@@ -4901,75 +4765,50 @@ jest-message-util@^22.4.3:
     slash "^1.0.0"
     stack-utils "^1.0.1"
 
-jest-message-util@^23.1.0:
-  version "23.1.0"
-  resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-23.1.0.tgz#9a809ba487ecac5ce511d4e698ee3b5ee2461ea9"
-  dependencies:
-    "@babel/code-frame" "^7.0.0-beta.35"
-    chalk "^2.0.1"
-    micromatch "^2.3.11"
-    slash "^1.0.0"
-    stack-utils "^1.0.1"
-
-jest-mock@^22.4.3:
-  version "22.4.3"
-  resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-22.4.3.tgz#f63ba2f07a1511772cdc7979733397df770aabc7"
+jest-mock@^23.2.0:
+  version "23.2.0"
+  resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-23.2.0.tgz#ad1c60f29e8719d47c26e1138098b6d18b261134"
 
-jest-mock@^23.1.0:
-  version "23.1.0"
-  resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-23.1.0.tgz#a381c31b121ab1f60c462a2dadb7b86dcccac487"
+jest-regex-util@^23.3.0:
+  version "23.3.0"
+  resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-23.3.0.tgz#5f86729547c2785c4002ceaa8f849fe8ca471bc5"
 
-jest-regex-util@^22.4.3:
-  version "22.4.3"
-  resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-22.4.3.tgz#a826eb191cdf22502198c5401a1fc04de9cef5af"
-
-jest-regex-util@^23.0.0:
-  version "23.0.0"
-  resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-23.0.0.tgz#dd5c1fde0c46f4371314cf10f7a751a23f4e8f76"
-
-jest-resolve-dependencies@^23.0.1:
-  version "23.0.1"
-  resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-23.0.1.tgz#d01a10ddad9152c4cecdf5eac2b88571c4b6a64d"
+jest-resolve-dependencies@^23.4.2:
+  version "23.4.2"
+  resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-23.4.2.tgz#0675ba876a5b819deffc449ad72e9985c2592048"
   dependencies:
-    jest-regex-util "^23.0.0"
-    jest-snapshot "^23.0.1"
+    jest-regex-util "^23.3.0"
+    jest-snapshot "^23.4.2"
 
-jest-resolve@^22.4.3:
-  version "22.4.3"
-  resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-22.4.3.tgz#0ce9d438c8438229aa9b916968ec6b05c1abb4ea"
+jest-resolve@^23.4.1:
+  version "23.4.1"
+  resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-23.4.1.tgz#7f3c17104732a2c0c940a01256025ed745814982"
   dependencies:
-    browser-resolve "^1.11.2"
-    chalk "^2.0.1"
-
-jest-resolve@^23.1.0:
-  version "23.1.0"
-  resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-23.1.0.tgz#b9e316eecebd6f00bc50a3960d1527bae65792d2"
-  dependencies:
-    browser-resolve "^1.11.2"
+    browser-resolve "^1.11.3"
     chalk "^2.0.1"
     realpath-native "^1.0.0"
 
-jest-runner@^23.1.0:
-  version "23.1.0"
-  resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-23.1.0.tgz#fa20a933fff731a5432b3561e7f6426594fa29b5"
+jest-runner@^23.4.2:
+  version "23.4.2"
+  resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-23.4.2.tgz#579a88524ac52c846075b0129a21c7b483e75a7e"
   dependencies:
     exit "^0.1.2"
     graceful-fs "^4.1.11"
-    jest-config "^23.1.0"
-    jest-docblock "^23.0.1"
-    jest-haste-map "^23.1.0"
-    jest-jasmine2 "^23.1.0"
-    jest-leak-detector "^23.0.1"
-    jest-message-util "^23.1.0"
-    jest-runtime "^23.1.0"
-    jest-util "^23.1.0"
-    jest-worker "^23.0.1"
+    jest-config "^23.4.2"
+    jest-docblock "^23.2.0"
+    jest-haste-map "^23.4.1"
+    jest-jasmine2 "^23.4.2"
+    jest-leak-detector "^23.2.0"
+    jest-message-util "^23.4.0"
+    jest-runtime "^23.4.2"
+    jest-util "^23.4.0"
+    jest-worker "^23.2.0"
     source-map-support "^0.5.6"
     throat "^4.0.0"
 
-jest-runtime@^23.1.0:
-  version "23.1.0"
-  resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-23.1.0.tgz#b4ae0e87259ecacfd4a884b639db07cf4dd620af"
+jest-runtime@^23.4.2:
+  version "23.4.2"
+  resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-23.4.2.tgz#00c3bb8385253d401a394a27d1112d3615e5a65c"
   dependencies:
     babel-core "^6.0.0"
     babel-plugin-istanbul "^4.1.6"
@@ -4978,14 +4817,14 @@ jest-runtime@^23.1.0:
     exit "^0.1.2"
     fast-json-stable-stringify "^2.0.0"
     graceful-fs "^4.1.11"
-    jest-config "^23.1.0"
-    jest-haste-map "^23.1.0"
-    jest-message-util "^23.1.0"
-    jest-regex-util "^23.0.0"
-    jest-resolve "^23.1.0"
-    jest-snapshot "^23.0.1"
-    jest-util "^23.1.0"
-    jest-validate "^23.0.1"
+    jest-config "^23.4.2"
+    jest-haste-map "^23.4.1"
+    jest-message-util "^23.4.0"
+    jest-regex-util "^23.3.0"
+    jest-resolve "^23.4.1"
+    jest-snapshot "^23.4.2"
+    jest-util "^23.4.0"
+    jest-validate "^23.4.0"
     micromatch "^2.3.11"
     realpath-native "^1.0.0"
     slash "^1.0.0"
@@ -4997,49 +4836,30 @@ jest-serializer@^23.0.1:
   version "23.0.1"
   resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-23.0.1.tgz#a3776aeb311e90fe83fab9e533e85102bd164165"
 
-jest-snapshot@^22.4.3:
-  version "22.4.3"
-  resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-22.4.3.tgz#b5c9b42846ffb9faccb76b841315ba67887362d2"
-  dependencies:
-    chalk "^2.0.1"
-    jest-diff "^22.4.3"
-    jest-matcher-utils "^22.4.3"
-    mkdirp "^0.5.1"
-    natural-compare "^1.4.0"
-    pretty-format "^22.4.3"
-
-jest-snapshot@^23.0.1:
-  version "23.0.1"
-  resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-23.0.1.tgz#6674fa19b9eb69a99cabecd415bddc42d6af3e7e"
+jest-snapshot@^23.4.2:
+  version "23.4.2"
+  resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-23.4.2.tgz#8fa6130feb5a527dac73e5fa80d86f29f7c42ab6"
   dependencies:
+    babel-types "^6.0.0"
     chalk "^2.0.1"
-    jest-diff "^23.0.1"
-    jest-matcher-utils "^23.0.1"
+    jest-diff "^23.2.0"
+    jest-matcher-utils "^23.2.0"
+    jest-message-util "^23.4.0"
+    jest-resolve "^23.4.1"
     mkdirp "^0.5.1"
     natural-compare "^1.4.0"
-    pretty-format "^23.0.1"
+    pretty-format "^23.2.0"
+    semver "^5.5.0"
 
-jest-util@^22.4.3:
-  version "22.4.3"
-  resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-22.4.3.tgz#c70fec8eec487c37b10b0809dc064a7ecf6aafac"
-  dependencies:
-    callsites "^2.0.0"
-    chalk "^2.0.1"
-    graceful-fs "^4.1.11"
-    is-ci "^1.0.10"
-    jest-message-util "^22.4.3"
-    mkdirp "^0.5.1"
-    source-map "^0.6.0"
-
-jest-util@^23.1.0:
-  version "23.1.0"
-  resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-23.1.0.tgz#c0251baf34644c6dd2fea78a962f4263ac55772d"
+jest-util@^23.4.0:
+  version "23.4.0"
+  resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-23.4.0.tgz#4d063cb927baf0a23831ff61bec2cbbf49793561"
   dependencies:
     callsites "^2.0.0"
     chalk "^2.0.1"
     graceful-fs "^4.1.11"
     is-ci "^1.0.10"
-    jest-message-util "^23.1.0"
+    jest-message-util "^23.4.0"
     mkdirp "^0.5.1"
     slash "^1.0.0"
     source-map "^0.6.0"
@@ -5053,45 +4873,35 @@ jest-validate@^21.1.0:
     leven "^2.1.0"
     pretty-format "^21.2.1"
 
-jest-validate@^22.4.3:
-  version "22.4.3"
-  resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-22.4.3.tgz#0780954a5a7daaeec8d3c10834b9280865976b30"
-  dependencies:
-    chalk "^2.0.1"
-    jest-config "^22.4.3"
-    jest-get-type "^22.4.3"
-    leven "^2.1.0"
-    pretty-format "^22.4.3"
-
-jest-validate@^23.0.1:
-  version "23.0.1"
-  resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-23.0.1.tgz#cd9f01a89d26bb885f12a8667715e9c865a5754f"
+jest-validate@^23.4.0:
+  version "23.4.0"
+  resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-23.4.0.tgz#d96eede01ef03ac909c009e9c8e455197d48c201"
   dependencies:
     chalk "^2.0.1"
     jest-get-type "^22.1.0"
     leven "^2.1.0"
-    pretty-format "^23.0.1"
+    pretty-format "^23.2.0"
 
-jest-watcher@^23.1.0:
-  version "23.1.0"
-  resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-23.1.0.tgz#a8d5842e38d9fb4afff823df6abb42a58ae6cdbd"
+jest-watcher@^23.4.0:
+  version "23.4.0"
+  resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-23.4.0.tgz#d2e28ce74f8dad6c6afc922b92cabef6ed05c91c"
   dependencies:
     ansi-escapes "^3.0.0"
     chalk "^2.0.1"
     string-length "^2.0.0"
 
-jest-worker@^23.0.1:
-  version "23.0.1"
-  resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-23.0.1.tgz#9e649dd963ff4046026f91c4017f039a6aa4a7bc"
+jest-worker@^23.2.0:
+  version "23.2.0"
+  resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-23.2.0.tgz#faf706a8da36fae60eb26957257fa7b5d8ea02b9"
   dependencies:
     merge-stream "^1.0.1"
 
-jest@23.1.0:
-  version "23.1.0"
-  resolved "https://registry.yarnpkg.com/jest/-/jest-23.1.0.tgz#bbb7f893100a11a742dd8bd0d047a54b0968ad1a"
+jest@23.4.2:
+  version "23.4.2"
+  resolved "https://registry.yarnpkg.com/jest/-/jest-23.4.2.tgz#1fae3ed832192143070ae85156b25cea891a1260"
   dependencies:
     import-local "^1.0.0"
-    jest-cli "^23.1.0"
+    jest-cli "^23.4.2"
 
 js-base64@^2.1.9:
   version "2.3.2"
@@ -5251,6 +5061,10 @@ kind-of@^6.0.0, kind-of@^6.0.2:
   version "6.0.2"
   resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
 
+kleur@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/kleur/-/kleur-2.0.1.tgz#7cc64b0d188d0dcbc98bdcdfdda2cc10619ddce8"
+
 lazy-cache@^1.0.3:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
@@ -5761,7 +5575,7 @@ minimist@0.0.8:
   version "0.0.8"
   resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
 
-minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0:
+minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
 
@@ -6751,9 +6565,9 @@ preserve@^0.2.0:
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
 
-prettier@1.11.1:
-  version "1.11.1"
-  resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.11.1.tgz#61e43fc4cd44e68f2b0dfc2c38cd4bb0fccdcc75"
+prettier@1.14.0:
+  version "1.14.0"
+  resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.14.0.tgz#847c235522035fd988100f1f43cf20a7d24f9372"
 
 pretty-error@^2.0.2:
   version "2.1.1"
@@ -6769,16 +6583,9 @@ pretty-format@^21.2.1:
     ansi-regex "^3.0.0"
     ansi-styles "^3.2.0"
 
-pretty-format@^22.4.3:
-  version "22.4.3"
-  resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-22.4.3.tgz#f873d780839a9c02e9664c8a082e9ee79eaac16f"
-  dependencies:
-    ansi-regex "^3.0.0"
-    ansi-styles "^3.2.0"
-
-pretty-format@^23.0.1:
-  version "23.0.1"
-  resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.0.1.tgz#d61d065268e4c759083bccbca27a01ad7c7601f4"
+pretty-format@^23.2.0:
+  version "23.2.0"
+  resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.2.0.tgz#3b0aaa63c018a53583373c1cb3a5d96cc5e83017"
   dependencies:
     ansi-regex "^3.0.0"
     ansi-styles "^3.2.0"
@@ -6809,6 +6616,13 @@ promise@^7.1.1:
   dependencies:
     asap "~2.0.3"
 
+prompts@^0.1.9:
+  version "0.1.14"
+  resolved "https://registry.yarnpkg.com/prompts/-/prompts-0.1.14.tgz#a8e15c612c5c9ec8f8111847df3337c9cbd443b2"
+  dependencies:
+    kleur "^2.0.1"
+    sisteransi "^0.1.1"
+
 prop-types@15.6.1, 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, prop-types@^15.6.1:
   version "15.6.1"
   resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca"
@@ -7017,9 +6831,9 @@ react-dev-utils@^3.0.0:
     strip-ansi "3.0.1"
     text-table "0.2.0"
 
-react-dom@16.2.0:
-  version "16.2.0"
-  resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.2.0.tgz#69003178601c0ca19b709b33a83369fe6124c044"
+react-dom@16.4.2:
+  version "16.4.2"
+  resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.4.2.tgz#4afed569689f2c561d2b8da0b819669c38a0bda4"
   dependencies:
     fbjs "^0.8.16"
     loose-envify "^1.1.0"
@@ -7079,6 +6893,10 @@ react-intl@2.4.0:
     intl-relativeformat "^2.0.0"
     invariant "^2.1.1"
 
+react-is@^16.4.2:
+  version "16.4.2"
+  resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.4.2.tgz#84891b56c2b6d9efdee577cc83501dfc5ecead88"
+
 react-lifecycles-compat@^3.0.0:
   version "3.0.3"
   resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.3.tgz#473820154732f1ccd762e89324abab154255da6b"
@@ -7139,13 +6957,14 @@ react-side-effect@^1.1.0:
     exenv "^1.2.1"
     shallowequal "^1.0.1"
 
-react-test-renderer@16.2.0, react-test-renderer@^16.0.0-0:
-  version "16.2.0"
-  resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.2.0.tgz#bddf259a6b8fcd8555f012afc8eacc238872a211"
+react-test-renderer@16.4.2, react-test-renderer@^16.0.0-0:
+  version "16.4.2"
+  resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.4.2.tgz#4e03eca9359bb3210d4373f7547d1364218ef74e"
   dependencies:
     fbjs "^0.8.16"
     object-assign "^4.1.1"
     prop-types "^15.6.0"
+    react-is "^16.4.2"
 
 react-virtualized@9.18.5:
   version "9.18.5"
@@ -7157,18 +6976,9 @@ react-virtualized@9.18.5:
     loose-envify "^1.3.0"
     prop-types "^15.6.0"
 
-react@16.2.0:
-  version "16.2.0"
-  resolved "https://registry.yarnpkg.com/react/-/react-16.2.0.tgz#a31bd2dab89bff65d42134fa187f24d054c273ba"
-  dependencies:
-    fbjs "^0.8.16"
-    loose-envify "^1.1.0"
-    object-assign "^4.1.1"
-    prop-types "^15.6.0"
-
-"react@^15.6.2 || ^16.0":
-  version "16.4.1"
-  resolved "https://registry.yarnpkg.com/react/-/react-16.4.1.tgz#de51ba5764b5dbcd1f9079037b862bd26b82fe32"
+react@16.4.2, "react@^15.6.2 || ^16.0":
+  version "16.4.2"
+  resolved "https://registry.yarnpkg.com/react/-/react-16.4.2.tgz#2cd90154e3a9d9dd8da2991149fdca3c260e129f"
   dependencies:
     fbjs "^0.8.16"
     loose-envify "^1.1.0"
@@ -7285,7 +7095,7 @@ redux-thunk@2.2.0:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.2.0.tgz#e615a16e16b47a19a515766133d1e3e99b7852e5"
 
-redux@3.7.2, redux@^3.6.0:
+redux@3.7.2:
   version "3.7.2"
   resolved "https://registry.yarnpkg.com/redux/-/redux-3.7.2.tgz#06b73123215901d25d065be342eb026bc1c8537b"
   dependencies:
@@ -7294,6 +7104,13 @@ redux@3.7.2, redux@^3.6.0:
     loose-envify "^1.1.0"
     symbol-observable "^1.0.3"
 
+redux@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.0.tgz#aa698a92b729315d22b34a0553d7e6533555cc03"
+  dependencies:
+    loose-envify "^1.1.0"
+    symbol-observable "^1.2.0"
+
 regenerate@^1.2.1:
   version "1.3.3"
   resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f"
@@ -7594,7 +7411,7 @@ resolve@1.1.7:
   version "1.1.7"
   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
 
-resolve@^1.1.7, resolve@^1.2.0, resolve@^1.6.0:
+resolve@^1.2.0, resolve@^1.6.0:
   version "1.7.1"
   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.7.1.tgz#aadd656374fd298aee895bc026b8297418677fd3"
   dependencies:
@@ -7721,7 +7538,7 @@ selfsigned@^1.9.1:
   dependencies:
     node-forge "0.6.33"
 
-"semver@2 || 3 || 4 || 5", semver@5.5.0, semver@^5.0.1, semver@^5.3.0, semver@^5.4.1:
+"semver@2 || 3 || 4 || 5", semver@5.5.0, semver@^5.0.1, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0:
   version "5.5.0"
   resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
 
@@ -7837,7 +7654,7 @@ shebang-regex@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
 
-shell-quote@1.6.1, shell-quote@^1.6.1:
+shell-quote@1.6.1:
   version "1.6.1"
   resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767"
   dependencies:
@@ -7854,6 +7671,10 @@ signal-exit@^3.0.0, signal-exit@^3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
 
+sisteransi@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-0.1.1.tgz#5431447d5f7d1675aac667ccd0b865a4994cb3ce"
+
 slash@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
@@ -7951,13 +7772,7 @@ source-map-support@^0.4.15:
   dependencies:
     source-map "^0.5.6"
 
-source-map-support@^0.5.0:
-  version "0.5.0"
-  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.0.tgz#2018a7ad2bdf8faf2691e5fddab26bed5a2bacab"
-  dependencies:
-    source-map "^0.6.0"
-
-source-map-support@^0.5.5, source-map-support@^0.5.6:
+source-map-support@^0.5.6:
   version "0.5.6"
   resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13"
   dependencies:
@@ -8218,12 +8033,6 @@ style-loader@0.21.0:
     loader-utils "^1.1.0"
     schema-utils "^0.4.5"
 
-subarg@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2"
-  dependencies:
-    minimist "^1.1.0"
-
 supports-color@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
@@ -8252,7 +8061,7 @@ svgo@^0.7.0:
     sax "~1.2.1"
     whet.extend "~0.9.9"
 
-symbol-observable@^1.0.1, symbol-observable@^1.0.3:
+symbol-observable@^1.0.1, symbol-observable@^1.0.3, symbol-observable@^1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
 
@@ -8431,21 +8240,13 @@ tryit@^1.0.1:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb"
 
-ts-jest@22.4.6:
-  version "22.4.6"
-  resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-22.4.6.tgz#a5d7f5e8b809626d1f4143209d301287472ec344"
+ts-jest@23.1.3:
+  version "23.1.3"
+  resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-23.1.3.tgz#33e3187d3ef0d42adada6347acf2c3539ac56107"
   dependencies:
-    babel-core "^6.26.3"
-    babel-plugin-istanbul "^4.1.6"
-    babel-plugin-transform-es2015-modules-commonjs "^6.26.2"
-    babel-preset-jest "^22.4.3"
-    cpx "^1.5.0"
-    fs-extra "6.0.0"
-    jest-config "^22.4.3"
+    closest-file-data "^0.1.4"
+    fs-extra "6.0.1"
     lodash "^4.17.10"
-    pkg-dir "^2.0.0"
-    source-map-support "^0.5.5"
-    yargs "^11.0.0"
 
 ts-loader@4.3.0:
   version "4.3.0"
@@ -8492,16 +8293,16 @@ typedarray@^0.0.6:
   version "0.0.6"
   resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
 
-typescript-eslint-parser@15.0.0:
-  version "15.0.0"
-  resolved "https://registry.yarnpkg.com/typescript-eslint-parser/-/typescript-eslint-parser-15.0.0.tgz#882fd3d7aabffbab0a7f98d2a59fb9a989c2b37f"
+typescript-eslint-parser@18.0.0:
+  version "18.0.0"
+  resolved "https://registry.yarnpkg.com/typescript-eslint-parser/-/typescript-eslint-parser-18.0.0.tgz#3e5055a44980d69e4154350fc5d8b1ab4e2332a8"
   dependencies:
     lodash.unescape "4.0.1"
     semver "5.5.0"
 
-typescript@2.8.3:
-  version "2.8.3"
-  resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.3.tgz#5d817f9b6f31bb871835f4edf0089f21abe6c170"
+typescript@3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.0.1.tgz#43738f29585d3a87575520a4b93ab6026ef11fdb"
 
 ua-parser-js@^0.7.9:
   version "0.7.17"