]> source.dussan.org Git - sonarqube.git/commitdiff
use eslint for typescript, update eslint configuration (#2742)
authorStas Vilchik <stas.vilchik@sonarsource.com>
Mon, 23 Oct 2017 18:38:19 +0000 (20:38 +0200)
committerStas Vilchik <stas.vilchik@sonarsource.com>
Mon, 30 Oct 2017 08:20:37 +0000 (09:20 +0100)
78 files changed:
server/sonar-web/.eslintrc
server/sonar-web/package.json
server/sonar-web/src/main/js/app/components/App.tsx
server/sonar-web/src/main/js/app/components/__tests__/ComponentContainer-test.tsx
server/sonar-web/src/main/js/app/components/nav/component/ComponentNavBranch.tsx
server/sonar-web/src/main/js/app/components/nav/component/ComponentNavBranchesMenu.tsx
server/sonar-web/src/main/js/app/components/nav/component/ComponentNavMenu.tsx
server/sonar-web/src/main/js/app/components/nav/component/__tests__/ComponentNav-test.tsx
server/sonar-web/src/main/js/app/components/nav/component/__tests__/ComponentNavBgTaskNotif-test.tsx
server/sonar-web/src/main/js/apps/background-tasks/components/TaskActions.tsx
server/sonar-web/src/main/js/apps/background-tasks/components/Workers.tsx
server/sonar-web/src/main/js/apps/background-tasks/components/__tests__/ScannerContext-test.tsx
server/sonar-web/src/main/js/apps/background-tasks/components/__tests__/Stacktrace-test.tsx
server/sonar-web/src/main/js/apps/background-tasks/components/__tests__/WorkersForm-test.tsx
server/sonar-web/src/main/js/apps/code/components/App.tsx
server/sonar-web/src/main/js/apps/code/components/ComponentName.tsx
server/sonar-web/src/main/js/apps/issues/components/ComponentBreadcrumbs.tsx
server/sonar-web/src/main/js/apps/portfolio/components/Activity.tsx
server/sonar-web/src/main/js/apps/portfolio/components/App.tsx
server/sonar-web/src/main/js/apps/portfolio/components/__tests__/Activity-test.tsx
server/sonar-web/src/main/js/apps/portfolio/components/__tests__/App-test.tsx
server/sonar-web/src/main/js/apps/portfolio/components/__tests__/Report-test.tsx
server/sonar-web/src/main/js/apps/portfolio/components/__tests__/Subscription-test.tsx
server/sonar-web/src/main/js/apps/projectBranches/components/App.tsx
server/sonar-web/src/main/js/apps/projectBranches/components/BranchRow.tsx
server/sonar-web/src/main/js/apps/projectBranches/components/RenameBranchModal.tsx
server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/App-test.tsx
server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/DeleteBranchModal-test.tsx
server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/LongBranchesPattern-test.tsx
server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/RenameBranchModal-test.tsx
server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/SettingForm-test.tsx
server/sonar-web/src/main/js/apps/projectQualityGate/__tests__/App-test.tsx
server/sonar-web/src/main/js/apps/projectQualityProfiles/__tests__/App-test.tsx
server/sonar-web/src/main/js/apps/projectQualityProfiles/__tests__/Table-test.tsx
server/sonar-web/src/main/js/apps/projects/__tests__/utils-test.ts
server/sonar-web/src/main/js/apps/projects/components/AllProjects.tsx
server/sonar-web/src/main/js/apps/projects/components/ProjectCardLanguages.tsx
server/sonar-web/src/main/js/apps/projects/components/ProjectCardOverall.tsx
server/sonar-web/src/main/js/apps/projects/components/ProjectCardOverallMeasures.tsx
server/sonar-web/src/main/js/apps/projects/components/__tests__/AllProjects-test.tsx
server/sonar-web/src/main/js/apps/projects/components/__tests__/DefaultPageSelector-test.tsx
server/sonar-web/src/main/js/apps/projects/components/__tests__/FavoriteFilter-test.tsx
server/sonar-web/src/main/js/apps/projects/filters/Filter.tsx
server/sonar-web/src/main/js/apps/projects/utils.ts
server/sonar-web/src/main/js/apps/projectsManagement/BulkApplyTemplateModal.tsx
server/sonar-web/src/main/js/apps/projectsManagement/Search.tsx
server/sonar-web/src/main/js/apps/projectsManagement/__tests__/App-test.tsx
server/sonar-web/src/main/js/apps/projectsManagement/__tests__/BulkApplyTemplateModal-test.tsx
server/sonar-web/src/main/js/apps/projectsManagement/__tests__/CreateProjectForm-test.tsx
server/sonar-web/src/main/js/apps/projectsManagement/__tests__/DeleteModal-test.tsx
server/sonar-web/src/main/js/apps/projectsManagement/__tests__/Projects-test.tsx
server/sonar-web/src/main/js/apps/quality-profiles/components/ProfileContainer.tsx
server/sonar-web/src/main/js/apps/quality-profiles/details/ProfilePermissionsForm.tsx
server/sonar-web/src/main/js/apps/quality-profiles/details/ProfilePermissionsFormSelect.tsx
server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissions-test.tsx
server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissionsForm-test.tsx
server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissionsFormSelect-test.tsx
server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissionsGroup-test.tsx
server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissionsUser-test.tsx
server/sonar-web/src/main/js/apps/system/components/App.tsx
server/sonar-web/src/main/js/apps/system/utils.ts
server/sonar-web/src/main/js/apps/web-api/components/WebApiApp.tsx
server/sonar-web/src/main/js/apps/web-api/components/__tests__/Domain-test.tsx
server/sonar-web/src/main/js/components/charts/bar-chart.js
server/sonar-web/src/main/js/components/common/SelectListItem.js
server/sonar-web/src/main/js/components/controls/DateInput.tsx
server/sonar-web/src/main/js/components/intl/DateFormatter.tsx
server/sonar-web/src/main/js/components/intl/DateFromNow.tsx
server/sonar-web/src/main/js/components/intl/DateTimeFormatter.tsx
server/sonar-web/src/main/js/components/intl/TimeFormatter.tsx
server/sonar-web/src/main/js/components/measure/Measure.tsx
server/sonar-web/src/main/js/components/measure/__tests__/Measure-test.tsx
server/sonar-web/src/main/js/components/ui/Rating.tsx
server/sonar-web/src/main/js/helpers/issues.ts
server/sonar-web/src/main/js/helpers/l10n.ts
server/sonar-web/src/main/js/helpers/measures.ts
server/sonar-web/tsconfig.json
server/sonar-web/yarn.lock

index 6bbf8a9e0d515fac89a8de4041e9bbfc2f2edfeb..edb289cdb23e131b27f5d4b417a3b9af1e278c76 100644 (file)
@@ -1,6 +1,10 @@
 {
   "extends": [
-    "eslint:recommended"
+    "eslint:recommended",
+    "plugin:import/errors",
+    "plugin:react/recommended",
+    "plugin:jsx-a11y/recommended",
+    "plugin:promise/recommended"
   ],
 
   "env": {
     "node": true
   },
 
+  "parserOptions": {
+    "ecmaVersion": 6,
+    "sourceType": "module",
+    "ecmaFeatures": {
+      "jsx": true,
+      "modules": true
+    }
+  },
+
   "globals": {
     "baseUrl": true,
     "SyntheticInputEvent": true
   },
 
-  "parser": "babel-eslint",
+  "parser": "typescript-eslint-parser",
 
-  "plugins": [
-    "import",
-    "jsx-a11y",
-    "flowtype",
-    "react"
-  ],
+  "plugins": ["import", "jsx-a11y", "react", "promise"],
 
   "rules": {
-    "array-bracket-spacing": 2,
-    "array-callback-return": 2,
-    // "arrow-parens": [2, "as-needed"],
-    "arrow-spacing": 2,
-    "block-scoped-var": 2,
-    "block-spacing": 2,
-    "brace-style": 2,
-    "comma-dangle": [2, "never"],
-    "comma-spacing": 2,
-    "comma-style": 2,
-    "computed-property-spacing": 2,
-    "consistent-this": [2, "that"],
-    "curly": 2,
-    "dot-location": [2, "property"],
-    "eol-last": 2,
-    "eqeqeq": [2, "smart"],
-    "func-call-spacing": 2,
-    "func-name-matching": 2,
-    "func-names": [2, "never"],
-    "generator-star-spacing": 2,
-    "jsx-quotes": 2,
-    "key-spacing": 2,
-    "keyword-spacing": 2,
-    // "max-len": [2, 100],
-    "new-parens": 2,
-    "no-lonely-if": 2,
-    "no-multi-spaces": 2,
-    "no-multiple-empty-lines": [2, { "max": 2 }],
-    "no-self-compare": 2,
-    "no-template-curly-in-string": 2,
-    "no-trailing-spaces": 2,
-    "no-unneeded-ternary": 2,
-    "no-unsafe-negation": 2,
-    "no-useless-computed-key": 2,
-    "no-useless-rename": 2,
-    "no-var": 2,
-    "no-whitespace-before-property": 2,
-    "object-curly-spacing": [2, "always"],
-    "object-shorthand": 2,
-    "one-var": [2, "never"],
-    "operator-assignment": 2,
-    "padded-blocks": [2, "never"],
-    "prefer-arrow-callback": 2,
-    "prefer-const": 2,
-    "prefer-spread": 2,
-    "quote-props": [2, "as-needed"],
-    "quotes": [2, "single", { "avoidEscape": true }],
-    "rest-spread-spacing": 2,
-    "semi": [2, "always"],
-    "semi-spacing": 2,
-    "space-before-blocks": 2,
-    "space-before-function-paren": [2, "never"],
-    "space-in-parens": 2,
-    "space-unary-ops": 2,
-    "template-curly-spacing": 2,
-    "yield-star-spacing": 2,
-
-    "flowtype/boolean-style": 2,
-    "flowtype/generic-spacing": 2,
-    "flowtype/no-dupe-keys": 2,
-    "flowtype/no-primitive-constructor-types": 2,
-    "flowtype/no-weak-types": [2, {
-      "any": true,
-      "Object": false,
-      "Function": false
-    }],
-    "flowtype/object-type-delimiter": 2,
-    "flowtype/semi": 2,
-    "flowtype/space-after-type-colon": 2,
-    "flowtype/space-before-generic-bracket": 2,
-    "flowtype/space-before-type-colon": 2,
-    "flowtype/union-intersection-spacing": 2,
-
-    "import/no-unresolved": 0,
-    "import/named": 2,
-    "import/default": 2,
-    "import/namespace": 2,
-    "import/no-named-as-default": 2,
-    "import/no-named-as-default-member": 2,
-    "import/no-amd": 2,
-    "import/first": 2,
-    "import/no-duplicates": 2,
-    "import/extensions": 2,
-    "import/order": [2, {
-      "groups": ["builtin", "external"],
-      "newlines-between": "never"
-    }],
-    "import/newline-after-import": 2,
-    "import/no-named-default": 2,
-
-    "jsx-a11y/aria-props": 2,
-    "jsx-a11y/aria-proptypes": 2,
-    "jsx-a11y/aria-role": 2,
-    "jsx-a11y/aria-unsupported-elements": 2,
-    "jsx-a11y/heading-has-content": 2,
-    "jsx-a11y/html-has-lang": 2,
-    "jsx-a11y/img-has-alt": 2,
-    "jsx-a11y/img-redundant-alt": 2,
-    "jsx-a11y/lang": 2,
-    "jsx-a11y/mouse-events-have-key-events": 2,
-    "jsx-a11y/no-access-key": 2,
-    "jsx-a11y/no-marquee": 2,
-    "jsx-a11y/onclick-has-focus": 2,
-    "jsx-a11y/onclick-has-role": 2,
-    "jsx-a11y/role-has-required-aria-props": 2,
-    "jsx-a11y/role-supports-aria-props": 2,
-    "jsx-a11y/tabindex-no-positive": 2,
-
-    "react/jsx-boolean-value": [2, "always"],
-    "react/jsx-closing-bracket-location": [2, {
-      "nonEmpty": "after-props",
-      "selfClosing": "tag-aligned"
-    }],
-    "react/jsx-curly-spacing": [2, "never"],
-    "react/jsx-equals-spacing": [2, "never"],
-    "react/jsx-key": 2,
-    "react/jsx-no-duplicate-props": 2,
-    "react/jsx-no-undef": 2,
-    "react/jsx-pascal-case": 2,
-    "react/jsx-space-before-closing": 2,
-    "react/jsx-tag-spacing": [2, {
-      "closingSlash": "never",
-      "beforeSelfClosing": "always",
-      "afterOpening": "never"
-    }],
-    "react/jsx-uses-react": 2,
-    "react/jsx-uses-vars": 2,
-    "react/no-children-prop": 2,
-    "react/no-danger-with-children": 2,
-    "react/no-deprecated": 2,
-    "react/no-direct-mutation-state": 2,
-    "react/no-is-mounted": 2,
-    "react/no-render-return-value": 2,
-    "react/no-unescaped-entities": 2,
-    "react/no-unknown-property": 2,
-    "react/react-in-jsx-scope": 2,
-    "react/require-render-return": 2,
-    "react/self-closing-comp": 2,
-    "react/sort-comp": [2, {
-      "order": [
-        "type-annotations",
-        "static-methods",
-        "lifecycle",
-        "everything-else",
-        "rendering"
-      ],
-      "groups": {
-        "rendering": [
-          "/^render.+$/",
-          "render"
-        ]
+    // possible errors
+    "for-direction": "error",
+    "no-prototype-builtins": "error",
+    "no-template-curly-in-string": "error",
+    "no-unsafe-negation": "error",
+
+    // best practices
+    // TODO turn all rules to "error" eventually
+    "array-callback-return": "error",
+    "block-scoped-var": "error",
+    "complexity": "warn",
+    "consistent-return": "warn",
+    "eqeqeq": ["error", "smart"],
+    "guard-for-in": "error",
+    "no-alert": "error",
+    "no-caller": "error",
+    "no-div-regex": "error",
+    "no-eval": "error",
+    "no-extend-native": "error",
+    "no-extra-bind": "error",
+    "no-extra-label": "error",
+    "no-floating-decimal": "error",
+    "no-implied-eval": "error",
+    "no-iterator": "error",
+    "no-labels": "error",
+    "no-lone-blocks": "error",
+    "no-loop-func": "error",
+    "no-new": "warn",
+    "no-new-func": "error",
+    "no-new-wrappers": "error",
+    "no-proto": "error",
+    "no-restricted-properties": "error",
+    "no-return-assign": "error",
+    "no-return-await": "error",
+    "no-self-compare": "error",
+    "no-sequences": "error",
+    "no-throw-literal": "warn",
+    "no-unmodified-loop-condition": "error",
+    "no-unused-expressions": "warn",
+    "no-useless-call": "error",
+    "no-useless-concat": "warn",
+    "no-useless-escape": "warn",
+    "no-useless-return": "warn",
+    "no-void": "error",
+    "no-with": "error",
+    "radix": "error",
+    "require-await": "error",
+    "wrap-iife": "error",
+    "yoda": "warn",
+
+    // stylistic
+    "camelcase": "warn",
+    "consistent-this": ["warn", "that"],
+    "func-name-matching": "error",
+    "func-style": ["warn", "declaration", { "allowArrowFunctions": true }],
+    "max-depth": "warn",
+    "max-lines": ["warn", 1000],
+    "max-params": ["warn", 4],
+    "no-array-constructor": "warn",
+    "no-bitwise": "warn",
+    "no-lonely-if": "error",
+    "no-mixed-operators": "warn",
+    "no-multi-assign": "warn",
+    "no-nested-ternary": "warn",
+    "no-new-object": "warn",
+    "no-underscore-dangle": "warn",
+    "no-unneeded-ternary": "warn",
+    "one-var": ["warn", "never"],
+    "operator-assignment": "warn",
+
+    // es2015
+    "no-duplicate-imports": "error",
+    "no-useless-computed-key": "error",
+    "no-useless-rename": "error",
+    "no-var": "error",
+    "object-shorthand": "error",
+    "prefer-arrow-callback": "error",
+    "prefer-const": "error",
+    "prefer-destructuring": ["warn", { "object": true, "array": false }],
+    "prefer-numeric-literals": "warn",
+    "prefer-rest-params": "warn",
+    "prefer-spread": "warn",
+
+    // disabled because of the usage of typescript-eslint-parser
+    // https://github.com/eslint/typescript-eslint-parser/issues/77
+    "no-undef": "off",
+    "no-unused-vars": "off",
+
+    // import
+    "import/extensions": "error",
+    "import/first": "error",
+    "import/newline-after-import": "error",
+    "import/no-absolute-path": "error",
+    "import/no-amd": "error",
+    "import/no-deprecated": "error",
+    "import/no-duplicates": "error",
+    "import/no-dynamic-require": "error",
+    "import/no-extraneous-dependencies": "error",
+    "import/no-mutable-exports": "error",
+    "import/no-named-as-default": "error",
+    "import/no-named-as-default-member": "error",
+    "import/no-named-default": "error",
+    "import/no-webpack-loader-syntax": "error",
+    "import/order": ["error", { "groups": ["builtin", "external"], "newlines-between": "never" }],
+
+    // does not properly work with ts
+    "import/no-unresolved": "off",
+
+    // react
+    // TODO turn all rules to "error" eventually
+    "react/display-name": "warn",
+    "react/jsx-boolean-value": ["error", "always"],
+    "react/jsx-no-comment-textnodes": "warn",
+    "react/jsx-no-target-blank": "warn",
+    "react/jsx-pascal-case": "error",
+    "react/no-find-dom-node": "warn",
+    "react/no-string-refs": "warn",
+    "react/self-closing-comp": "error",
+    "react/sort-comp": [
+      "error",
+      {
+        "order": [
+          "type-annotations",
+          "static-methods",
+          "lifecycle",
+          "everything-else",
+          "rendering"
+        ],
+        "groups": { "rendering": ["/^render.+$/", "render"] }
       }
-    }]
+    ],
+
+    // turn off prop types validation, better use ts ;)
+    "react/prop-types": "off",
+
+    // jsx-a11y
+    "jsx-a11y/anchor-has-content": "warn",
+    "jsx-a11y/no-noninteractive-tabindex": "warn",
+    "jsx-a11y/no-redundant-roles": "warn",
+    "jsx-a11y/no-static-element-interactions": "warn",
+
+    "jsx-a11y/anchor-is-valid": "off",
+    "jsx-a11y/click-events-have-key-events": "off",
+    "jsx-a11y/no-autofocus": "off",
+    "jsx-a11y/no-noninteractive-element-interactions": "off",
+    // has FPs
+    "jsx-a11y/label-has-for": "off",
+
+    // promise
+    "promise/catch-or-return": ["warn", { "allowThen": true }],
+
+    "promise/always-return": "off",
+    "promise/avoid-new": "off"
   },
 
   "settings": {
-    "import/ignore": [
-      "node_modules",
-      "hbs$"
-    ]
+    "import/ignore": ["node_modules", "hbs$"]
   }
 }
index 336b9affc410d2ebf159066b5f52b96ebce9117b..bb98241f947e8843930a2dd8b9b4ebc7b22bd226 100644 (file)
@@ -67,7 +67,6 @@
     "autoprefixer": "7.1.1",
     "awesome-typescript-loader": "3.2.3",
     "babel-core": "^6.22.1",
-    "babel-eslint": "7.2.3",
     "babel-jest": "20.0.3",
     "babel-loader": "7.0.0",
     "babel-plugin-dynamic-import-node": "1.0.2",
     "css-loader": "0.28.4",
     "enzyme": "2.9.1",
     "enzyme-to-json": "1.5.1",
-    "eslint": "3.14.1",
+    "eslint": "4.9.0",
     "eslint-loader": "1.8.0",
-    "eslint-plugin-flowtype": "^2.29.1",
-    "eslint-plugin-import": "2.7.0",
-    "eslint-plugin-jsx-a11y": "^3.0.2",
-    "eslint-plugin-react": "^6.8.0",
+    "eslint-plugin-import": "2.8.0",
+    "eslint-plugin-jsx-a11y": "6.0.2",
+    "eslint-plugin-promise": "3.6.0",
+    "eslint-plugin-react": "7.4.0",
     "expose-loader": "0.7.3",
     "extract-text-webpack-plugin": "2.1.2",
     "flow-bin": "^0.52.0",
     "rimraf": "2.5.4",
     "style-loader": "0.18.2",
     "ts-jest": "20.0.10",
-    "typescript": "2.4.2",
+    "typescript": "2.5.3",
+    "typescript-eslint-parser": "8.0.0",
     "webpack": "2.6.1",
     "webpack-bundle-analyzer": "2.8.2",
     "webpack-dev-server": "2.4.5"
     "test": "node scripts/test.js",
     "coverage": "npm test -- --coverage",
     "format": "prettier --write --list-different 'src/main/{js,less}/!(libs)/**/*.{js,ts,tsx,css,less}'",
-    "lint": "eslint src/main/js",
+    "lint": "eslint --ext js,ts,tsx --quiet src/main/js",
     "typecheck": "flow src/main/js",
     "validate": "eslint src/main/js && flow check src/main/js && NODE_ENV=test jest"
   },
index e69c1116cda22eb354a1965b568dbcd03125fbae..44528fc0b4dbf9b0b0b13bd1bc658392b941dbb9 100644 (file)
@@ -40,7 +40,6 @@ interface State {
 
 class App extends React.PureComponent<Props, State> {
   mounted: boolean;
-  state: State = { branchesEnabled: false, canAdmin: false, loading: true, onSonarCloud: false };
 
   static childContextTypes = {
     branchesEnabled: PropTypes.bool.isRequired,
@@ -48,6 +47,11 @@ class App extends React.PureComponent<Props, State> {
     onSonarCloud: PropTypes.bool
   };
 
+  constructor(props: Props) {
+    super(props);
+    this.state = { branchesEnabled: false, canAdmin: false, loading: true, onSonarCloud: false };
+  }
+
   getChildContext() {
     return {
       branchesEnabled: this.state.branchesEnabled,
@@ -73,7 +77,7 @@ class App extends React.PureComponent<Props, State> {
     return this.props.fetchAppState().then(appState => {
       if (this.mounted) {
         const onSonarCloud =
-          appState.settings != undefined &&
+          appState.settings !== undefined &&
           appState.settings['sonar.sonarcloud.enabled'] === 'true';
         this.setState({
           branchesEnabled: appState.branchesEnabled,
index ed7838f8ea37e4b075c099da2e19c2c568538528..623451a6542962566d733cedb0eef017a4f06b38 100644 (file)
@@ -17,6 +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.
  */
+/* eslint-disable import/first */
 jest.mock('../../../api/branches', () => ({ getBranches: jest.fn() }));
 jest.mock('../../../api/components', () => ({ getComponentData: jest.fn() }));
 jest.mock('../../../api/nav', () => ({ getComponentNavigation: jest.fn() }));
index e3a27248da2e4eade7f86accd0ce920f683463a7..c062c71672264ec417601ff7d2e6ba7544a12082 100644 (file)
@@ -46,17 +46,21 @@ interface State {
 
 export default class ComponentNavBranch extends React.PureComponent<Props, State> {
   mounted: boolean;
-  state: State = {
-    dropdownOpen: false,
-    noBranchSupportPopupOpen: false,
-    singleBranchPopupOpen: false
-  };
 
   static contextTypes = {
     branchesEnabled: PropTypes.bool.isRequired,
     onSonarCloud: PropTypes.bool
   };
 
+  constructor(props: Props) {
+    super(props);
+    this.state = {
+      dropdownOpen: false,
+      noBranchSupportPopupOpen: false,
+      singleBranchPopupOpen: false
+    };
+  }
+
   componentDidMount() {
     this.mounted = true;
   }
@@ -94,7 +98,7 @@ export default class ComponentNavBranch extends React.PureComponent<Props, State
   };
 
   toggleSingleBranchPopup = (show?: boolean) => {
-    if (show != undefined) {
+    if (show !== undefined) {
       this.setState({ singleBranchPopupOpen: show });
     } else {
       this.setState(state => ({ singleBranchPopupOpen: !state.singleBranchPopupOpen }));
@@ -102,7 +106,7 @@ export default class ComponentNavBranch extends React.PureComponent<Props, State
   };
 
   toggleNoBranchSupportPopup = (show?: boolean) => {
-    if (show != undefined) {
+    if (show !== undefined) {
       this.setState({ noBranchSupportPopupOpen: show });
     } else {
       this.setState(state => ({ noBranchSupportPopupOpen: !state.noBranchSupportPopupOpen }));
index e3f468d2dd00605619ba2ffbe3ef905f452d2650..a4d7899387bb4aced0a5d560780804666ae569ec 100644 (file)
@@ -46,12 +46,16 @@ interface State {
 
 export default class ComponentNavBranchesMenu extends React.PureComponent<Props, State> {
   private node: HTMLElement | null;
-  state = { query: '', selected: null };
 
   static contextTypes = {
     router: PropTypes.object
   };
 
+  constructor(props: Props) {
+    super(props);
+    this.state = { query: '', selected: null };
+  }
+
   componentDidMount() {
     window.addEventListener('click', this.handleClickOutside);
   }
index 5f770db9ed4327ee758c4109f9add38d4ec99875..ef2234c896d6de462cb8405f33f92c3aeefb7ca9 100644 (file)
@@ -127,7 +127,6 @@ export default class ComponentNavMenu extends React.PureComponent<Props> {
   }
 
   renderActivityLink() {
-
     if (this.props.branch && isShortLivingBranch(this.props.branch)) {
       return null;
     }
index 7db06bfa00c24167c88e2ce6b59a9536995c698b..9975e19bf06d3c3b2660f5ddf60e51e71122e329 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.
  */
-
+/* eslint-disable import/first, import/order */
 jest.mock('../ComponentNavFavorite', () => ({
+  // eslint-disable-next-line
   default: function ComponentNavFavorite() {
     return null;
   }
 }));
 
 jest.mock('../ComponentNavBreadcrumbs', () => ({
+  // eslint-disable-next-line
   default: function ComponentNavBreadcrumbs() {
     return null;
   }
 }));
 
 jest.mock('../ComponentNavMenu', () => ({
+  // eslint-disable-next-line
   default: function ComponentNavMenu() {
     return null;
   }
index 72e517426ccb9e7e879d5c8bb1778c41e90497aa..e5441faa51fb5315ad7b4460a6d9d1175ed7f318 100644 (file)
@@ -17,6 +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.
  */
+/* eslint-disable import/first */
 jest.mock('../../../../../helpers/l10n', () => {
   const l10n = require.requireActual('../../../../../helpers/l10n');
   l10n.hasMessage = jest.fn(() => true);
index 748acacd7294052cdb60a766a43f8c6f3bbb5e28..285e7a4d50fa947059713402c66cab297a43ee06 100644 (file)
@@ -69,9 +69,9 @@ export default class TaskActions extends React.PureComponent<Props, State> {
   render() {
     const { component, task } = this.props;
 
-    const canFilter = component == undefined;
+    const canFilter = component === undefined;
     const canCancel = task.status === STATUSES.PENDING;
-    const canShowStacktrace = task.errorMessage != undefined;
+    const canShowStacktrace = task.errorMessage !== undefined;
     const hasActions = canFilter || canCancel || task.hasScannerContext || canShowStacktrace;
 
     if (!hasActions) {
index 9c51b4a9c1075d249d5cdc37049b5c364305757d..87fa85e25e72b66b4743cd2bd5adefe2a46cd729 100644 (file)
@@ -83,7 +83,7 @@ export default class Workers extends React.PureComponent<{}, State> {
   };
 
   toggleNoSupportPopup = (show?: boolean) => {
-    if (show != undefined) {
+    if (show !== undefined) {
       this.setState({ noSupportPopup: show });
     } else {
       this.setState(state => ({ noSupportPopup: !state.noSupportPopup }));
index af7194151d607ba1deac41b4c381872aa3b16d96..64cd98c8f7785ebabeb891e05db2b9f4af8622a3 100644 (file)
@@ -17,6 +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.
  */
+/* eslint-disable import/first, import/order */
 jest.mock('../../../../api/ce', () => ({
   getTask: jest.fn()
 }));
index 979af8df09eb9d49b4f04d0934ee97549d6d3d72..28bddab75a87c994c73f12287d6a5e20b40193ad 100644 (file)
@@ -17,6 +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.
  */
+/* eslint-disable import/first, import/order */
 jest.mock('../../../../api/ce', () => ({
   getTask: jest.fn()
 }));
index 813eff2189667c71a0cf216f83b58db93c2c50f3..94bd72f754205540b9cf813a35c00a1a589d2077 100644 (file)
@@ -17,6 +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.
  */
+/* eslint-disable import/first, import/order */
 jest.mock('../../../../api/ce', () => ({
   setWorkerCount: () => Promise.resolve()
 }));
index aa773ae2177d725b0cd35537b4202522f3f359c5..2fd66d70ad7bfd032c57b734a11c0e1bd13bef39 100644 (file)
@@ -222,8 +222,8 @@ export default class App extends React.PureComponent<Props, State> {
             <Breadcrumbs branch={branchName} breadcrumbs={breadcrumbs} rootComponent={component} />
           )}
 
-          {sourceViewer == undefined &&
-          components != undefined && (
+          {sourceViewer === undefined &&
+          components !== undefined && (
             <div className={componentsClassName}>
               <Components
                 baseComponent={baseComponent}
@@ -234,12 +234,12 @@ export default class App extends React.PureComponent<Props, State> {
             </div>
           )}
 
-          {sourceViewer == undefined &&
-          components != undefined && (
+          {sourceViewer === undefined &&
+          components !== undefined && (
             <ListFooter count={components.length} total={total} loadMore={this.handleLoadMore} />
           )}
 
-          {sourceViewer != undefined && (
+          {sourceViewer !== undefined && (
             <div className="spacer-top">
               <SourceViewer branch={branchName} component={sourceViewer.key} />
             </div>
index c0947e98ec0650bd94e6c56902d80494c6046262..65f855700ed474c28e4769b4d1b6a7b2a8960c9e 100644 (file)
@@ -59,7 +59,7 @@ export default function ComponentName(props: Props) {
   const { branch, component, rootComponent, previous, canBrowse = false } = props;
   const areBothDirs = component.qualifier === 'DIR' && previous && previous.qualifier === 'DIR';
   const prefix =
-    areBothDirs && previous != undefined
+    areBothDirs && previous !== undefined
       ? mostCommitPrefix([component.name + '/', previous.name + '/'])
       : '';
   const name = prefix ? (
index 6e4b9a13805b25e88b058c8d762115fbd8547e11..b086fb5a12534ac65b76e93a2dcdd58b0ecc53f6 100644 (file)
@@ -61,8 +61,8 @@ export default function ComponentBreadcrumbs({ branch, component, issue, organiz
       )}
 
       {displaySubProject &&
-      issue.subProject != undefined &&
-      issue.subProjectName != undefined && (
+      issue.subProject !== undefined &&
+      issue.subProjectName !== undefined && (
         <span title={issue.subProjectName}>
           <Link to={getProjectUrl(issue.subProject, branch)} className="link-no-underline">
             {limitComponentName(issue.subProjectName)}
index 66cef7e572d22970c8b937363998d434f885952a..7816da08c76717d4fd3cb6247e1712c3ef2a34df 100644 (file)
@@ -103,8 +103,8 @@ export default class Activity extends React.PureComponent<Props> {
         {this.state.loading ? (
           <i className="spinner" />
         ) : (
-          this.state.metrics != undefined &&
-          this.state.history != undefined && (
+          this.state.metrics !== undefined &&
+          this.state.history !== undefined && (
             <AnyPreviewGraph
               history={this.state.history}
               metrics={this.state.metrics}
index ec7f35fc0b2efaba65c66c13ea09459d119da320..7d3efb507bf0d1703ea8dba17564871c68f7ea8b 100644 (file)
@@ -98,10 +98,10 @@ export default class App extends React.PureComponent<Props, State> {
     );
   }
 
-  isEmpty = () => this.state.measures == undefined || this.state.measures['ncloc'] == undefined;
+  isEmpty = () => this.state.measures === undefined || this.state.measures['ncloc'] === undefined;
 
   isNotComputed = () =>
-    this.state.measures && this.state.measures['reliability_rating'] == undefined;
+    this.state.measures && this.state.measures['reliability_rating'] === undefined;
 
   renderSpinner() {
     return (
@@ -151,8 +151,8 @@ export default class App extends React.PureComponent<Props, State> {
           <MaintainabilityBox component={component.key} measures={measures!} />
         </div>
 
-        {subComponents != undefined &&
-        totalSubComponents != undefined && (
+        {subComponents !== undefined &&
+        totalSubComponents !== undefined && (
           <WorstProjects
             component={component.key}
             subComponents={subComponents}
index 1959dc4daaf977014d65ad22897b143f742de15d..e0fc5b8ff9d45efd7b9c5ed3b16f69b7987755fc 100644 (file)
@@ -17,6 +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.
  */
+/* eslint-disable import/first, import/order */
 jest.mock('../../../../helpers/storage', () => ({
   getCustomGraph: () => ['coverage'],
   getGraph: () => 'custom'
index e9c93fb7279ec5c75446815a7ac2d4d21ced2c98..0a894272da3da0f4802eeb27e40726fbbcff984f 100644 (file)
@@ -17,6 +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.
  */
+/* eslint-disable import/first, import/order */
 jest.mock('../../../../api/measures', () => ({
   getMeasures: jest.fn(() => Promise.resolve([]))
 }));
@@ -27,12 +28,14 @@ jest.mock('../../../../api/components', () => ({
 
 // mock Activity to not deal with localstorage
 jest.mock('../Activity', () => ({
+  // eslint-disable-next-line
   default: function Activity() {
     return null;
   }
 }));
 
 jest.mock('../Report', () => ({
+  // eslint-disable-next-line
   default: function Report() {
     return null;
   }
index 1a21649ae06de7a7a4bad7533be332d59a9aad61..7b725a0ee5e0ef3a60c3d9b90b0ccdfffd088fb9 100644 (file)
@@ -17,6 +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.
  */
+/* eslint-disable import/first, import/order */
 jest.mock('../../../../api/report', () => {
   const report = require.requireActual('../../../../api/report');
   report.getReportStatus = jest.fn(() => Promise.resolve({}));
index 4fa146bc940b0ce91518594a2c7552b38274648c..003d49545a6888c8e73e1f839b5a4bf685e5e875 100644 (file)
@@ -17,6 +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.
  */
+/* eslint-disable import/first, import/order */
 jest.mock('../../../../api/report', () => {
   const report = require.requireActual('../../../../api/report');
   report.subscribe = jest.fn(() => Promise.resolve());
index 5ff696ef9d7eee89196e6010b4325a690f88b28a..19092afe65523a7fdfb26c1045215f8dceff21fd 100644 (file)
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 import * as React from 'react';
+import { FormattedMessage } from 'react-intl';
+import { Link } from 'react-router';
 import BranchRow from './BranchRow';
 import LongBranchesPattern from './LongBranchesPattern';
 import { Branch } from '../../../app/types';
 import { sortBranchesAsTree } from '../../../helpers/branches';
 import { translate } from '../../../helpers/l10n';
 import { getValues } from '../../../api/settings';
-import { FormattedMessage } from 'react-intl';
 import { formatMeasure } from '../../../helpers/measures';
-import { Link } from 'react-router';
 
 interface Props {
   branches: Branch[];
index 3cbc25df9a4ee16674a9b58a949f495381286d47..5290f17718cc492cce9b7fd1111aa633f0a44db4 100644 (file)
@@ -18,8 +18,8 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 import * as React from 'react';
-import { Branch } from '../../../app/types';
 import * as classNames from 'classnames';
+import { Branch } from '../../../app/types';
 import DeleteBranchModal from './DeleteBranchModal';
 import LeakPeriodForm from './LeakPeriodForm';
 import BranchStatus from '../../../components/common/BranchStatus';
index 181fee723650855388e706ced425077998267354..02bd8572c9cb95b0c0f5757aabd49330a28ca4e8 100644 (file)
@@ -109,7 +109,7 @@ export default class RenameBranchModal extends React.PureComponent<Props, State>
                 required={true}
                 size={50}
                 type="text"
-                value={this.state.name != undefined ? this.state.name : branch.name}
+                value={this.state.name !== undefined ? this.state.name : branch.name}
               />
             </div>
           </div>
index 9ffafb34d725d863615758e72a0c4d63a17eee7d..166c8d4a99ac476e8d3bee49881d8c191d2f255b 100644 (file)
@@ -17,6 +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.
  */
+/* eslint-disable import/first, import/order */
 jest.mock('../../../../api/settings', () => ({
   getValues: jest.fn(() => Promise.resolve([]))
 }));
index b28705871141e2d99c03d87c9699ca89a523d0bb..c5455dbcac6103e6058e798cfbfdf44dbdd2be4e 100644 (file)
@@ -17,6 +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.
  */
+/* eslint-disable import/first */
 jest.mock('../../../../api/branches', () => ({ deleteBranch: jest.fn() }));
 
 import * as React from 'react';
index ff142d2065c7efbb0c76f8cc97c23abaa6161b28..48c79f25fedcc4d0bc00a7af93625fcb06556dd2 100644 (file)
@@ -17,6 +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.
  */
+/* eslint-disable import/first, import/order */
 jest.mock('../../../../api/settings', () => ({
   getValues: jest.fn(() => Promise.resolve([]))
 }));
@@ -40,7 +41,7 @@ it('renders', () => {
 
 it('opens form', () => {
   const wrapper = shallow(<LongBranchesPattern project="project" />);
-  (wrapper.instance() as LongBranchesPattern) .mounted = true;
+  (wrapper.instance() as LongBranchesPattern).mounted = true;
   wrapper.setState({ loading: false, setting: { value: 'release-.*' } });
 
   click(wrapper.find('a'));
index 3a1c962d68edd86c2de921735da21b4714e81671..9c2b66028155d6375888ab748094c264d2590d69 100644 (file)
@@ -17,6 +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.
  */
+/* eslint-disable import/first */
 jest.mock('../../../../api/branches', () => ({ renameBranch: jest.fn() }));
 
 import * as React from 'react';
index f74831cd522ff788722029328a60afd63db296ae..60ffeb3fbb4058085666952636bd6e8d5bed40af 100644 (file)
@@ -17,6 +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.
  */
+/* eslint-disable import/first, import/order */
 jest.mock('../../../../api/settings', () => ({
   setSimpleSettingValue: jest.fn(() => Promise.resolve()),
   resetSettingValue: jest.fn(() => Promise.resolve())
index ac0d97d33d7c63ebbe43fc858a2ea1894ccf6035..4fa2bc575af1b9514f408c70b82cc911feb14a6f 100644 (file)
@@ -17,6 +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.
  */
+/* eslint-disable import/first, import/order */
 jest.mock('../../../api/quality-gates', () => ({
   associateGateWithProject: jest.fn(() => Promise.resolve()),
   dissociateGateWithProject: jest.fn(() => Promise.resolve()),
index 2323bad9cfe9980122796861167c9f66f704cef4..9e873f1187f9ffe436a8992c32c6e7b4c09b2bd6 100644 (file)
@@ -17,6 +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.
  */
+/* eslint-disable import/first, import/order */
 jest.mock('../../../api/quality-profiles', () => ({
   associateProject: jest.fn(() => Promise.resolve()),
   dissociateProject: jest.fn(() => Promise.resolve()),
@@ -116,7 +117,7 @@ function randomProfile(key: string, language: string, isDefault = false) {
     isDefault,
     key,
     name: key,
-    language: language,
+    language,
     languageName: language,
     organization: 'org'
   };
index 84e70359fab264d3224f421a1455f0d0e5aa5d8b..14b93b8fc1002767098aada6db9f411356a8e8b6 100644 (file)
@@ -42,7 +42,7 @@ function randomProfile(key: string, language: string) {
     activeDeprecatedRuleCount: 0,
     key,
     name: key,
-    language: language,
+    language,
     languageName: language,
     organization: 'org'
   };
index e40971e373bc4e37514b2ca50a260c2e4d37292f..7f4330bbf5208e3358786e13e36806becec71c89 100644 (file)
@@ -49,6 +49,7 @@ describe('cumulativeMapFacetValues', () => {
         { val: '4', count: 2 },
         { val: '5', count: 0 }
       ])
+      // eslint-disable-next-line
     ).toEqual({ '1': 50, '2': 9, '3': 8, '4': 2, '5': 0 });
   });
   it('should correctly cumulate facets with NO_DATA items', () => {
index 4181d618a10b09643afeaa500709a47c3fda4d23..65bdfac3f43018817aae9190474fbffd649e7391 100644 (file)
@@ -51,7 +51,6 @@ interface State {
 
 export default class AllProjects extends React.PureComponent<Props, State> {
   mounted: boolean;
-  state: State = { loading: true, query: {} };
 
   static contextTypes = {
     currentUser: PropTypes.object.isRequired,
@@ -59,6 +58,11 @@ export default class AllProjects extends React.PureComponent<Props, State> {
     router: PropTypes.object.isRequired
   };
 
+  constructor(props: Props) {
+    super(props);
+    this.state = { loading: true, query: {} };
+  }
+
   componentDidMount() {
     this.mounted = true;
     if (this.props.isFavorite && !this.context.currentUser.isLoggedIn) {
@@ -88,7 +92,7 @@ export default class AllProjects extends React.PureComponent<Props, State> {
 
   getSort = () => this.state.query.sort || 'name';
 
-  isFiltered = () => Object.values(this.state.query).some(value => value != undefined);
+  isFiltered = () => Object.values(this.state.query).some(value => value !== undefined);
 
   stopLoading = () => {
     if (this.mounted) {
@@ -280,10 +284,10 @@ export default class AllProjects extends React.PureComponent<Props, State> {
           />
         )}
         <ListFooter
-          count={this.state.projects != undefined ? this.state.projects.length : 0}
+          count={this.state.projects !== undefined ? this.state.projects.length : 0}
           loadMore={this.fetchMoreProjects}
           ready={!this.state.loading}
-          total={this.state.total != undefined ? this.state.total : 0}
+          total={this.state.total !== undefined ? this.state.total : 0}
         />
       </div>
     );
index 4bf823864e0de536011f51279ab4853c86391b0b..277a3b6eec83a0e725483def2afc27885aa9bd97 100644 (file)
@@ -37,7 +37,7 @@ export default class ProjectCardLanguages extends React.PureComponent<Props> {
   };
 
   render() {
-    if (this.props.distribution == undefined) {
+    if (this.props.distribution === undefined) {
       return null;
     }
 
index 80ce9ceadb042d8823952295cb16bc2f940b0f29..7dcae1fe7a2bda05ec74aa5219e7a8366d6289b5 100644 (file)
@@ -43,7 +43,7 @@ export default function ProjectCardOverall({ organization, project }: Props) {
   return (
     <div data-key={project.key} className="boxed-group project-card">
       <div className="boxed-group-header clearfix">
-        {project.isFavorite != undefined && (
+        {project.isFavorite !== undefined && (
           <Favorite
             className="spacer-right"
             component={project.key}
index 8c3cdc978f24d940d473300823818ffd9fcc9f55..5bba45518c1d0e9033c580e8e7cfd77342fa332a 100644 (file)
@@ -34,7 +34,7 @@ interface Props {
 }
 
 export default function ProjectCardOverallMeasures({ measures }: Props) {
-  if (measures == undefined) {
+  if (measures === undefined) {
     return null;
   }
 
index 5afb5f49874c3d3f51cb5625ec470622c35b4eb9..c696b9509c9a40175759fccecc5fd0e54d3ba2de 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.
  */
+/* eslint-disable import/first, import/order */
 jest.mock('../ProjectsList', () => ({
+  // eslint-disable-next-line
   default: function ProjectsList() {
     return null;
   }
 }));
 
 jest.mock('../PageHeader', () => ({
+  // eslint-disable-next-line
   default: function PageHeader() {
     return null;
   }
 }));
 
 jest.mock('../PageSidebar', () => ({
+  // eslint-disable-next-line
   default: function PageSidebar() {
     return null;
   }
index ce03b94e0b3212ec33513bc9ef2b4ed7b4947938..b5d80b02f7ea16fb45c023e7cbf5ea9dd485e39f 100644 (file)
@@ -17,7 +17,9 @@
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
+/* eslint-disable import/first, import/order */
 jest.mock('../AllProjects', () => ({
+  // eslint-disable-next-line
   default: function AllProjects() {
     return null;
   }
index b7971fb416a6b69c4ef3f754460843b7cfd7e734..658ee1ab15864eec258936a71a1690847bdb5601 100644 (file)
@@ -17,6 +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.
  */
+/* eslint-disable import/first */
 jest.mock('../../../../helpers/storage', () => ({
   saveAll: jest.fn(),
   saveFavorite: jest.fn()
index 2da7a189b2ae87bdccddb2fdb8c9d366e9da399e..655dd4ce491eb42bc2adfbc786e8259f3c52576b 100644 (file)
@@ -85,7 +85,7 @@ export default class Filter extends React.PureComponent<Props> {
   }
 
   renderOptionBar(facetValue: number | undefined) {
-    if (facetValue == undefined || !this.props.maxFacetValue) {
+    if (facetValue === undefined || !this.props.maxFacetValue) {
       return null;
     }
     return (
index c8f99c27b56b37c3be3aa8855fb791a2102293f7..7ad9dd4e7c010bc45c65989ac3c5d57fa7f200ca 100644 (file)
@@ -198,7 +198,7 @@ export function fetchProjects(
               const value = isDiffMetric(measure.metric)
                 ? getPeriodValue(measure, 1)
                 : measure.value;
-              if (value != undefined) {
+              if (value !== undefined) {
                 componentMeasures[measure.metric] = value;
               }
             });
@@ -248,7 +248,7 @@ function convertToQueryData(
   if (sort.s) {
     data.s = sort.s;
   }
-  if (sort.hasOwnProperty('asc')) {
+  if (sort.asc !== undefined) {
     data.asc = sort.asc;
   }
   return data;
index 314988d7eed68a586a5456bf589dd17ef4c3e43c..3e81e28cb5cd724a57f700839383817475a864a6 100644 (file)
@@ -69,7 +69,7 @@ export default class BulkApplyTemplateModal extends React.PureComponent<Props, S
             loading: false,
             permissionTemplate:
               permissionTemplates.length > 0 ? permissionTemplates[0].id : undefined,
-            permissionTemplates: permissionTemplates
+            permissionTemplates
           });
         }
       },
index d41a5c5e1bb7d7414be1e1f74c998e87cd3fc555..94318dbae7c747acce6439080606ba3e337cee8b 100644 (file)
@@ -22,8 +22,7 @@ import * as Select from 'react-select';
 import { sortBy } from 'lodash';
 import BulkApplyTemplateModal from './BulkApplyTemplateModal';
 import DeleteModal from './DeleteModal';
-import { QUALIFIERS_ORDER } from './utils';
-import { Project } from './utils';
+import { QUALIFIERS_ORDER, Project } from './utils';
 import { Organization } from '../../app/types';
 import Checkbox from '../../components/controls/Checkbox';
 import { translate } from '../../helpers/l10n';
index 0fb6b1d21d057e220584a5425b97a3da13f6e644..dadd3a45a1b0ecb864ff27c4a311a688f74fcc44 100644 (file)
@@ -17,6 +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.
  */
+/* eslint-disable import/first, import/order */
 jest.mock('lodash', () => {
   const lodash = require.requireActual('lodash');
   lodash.debounce = (fn: Function) => (...args: any[]) => fn(args);
@@ -25,6 +26,7 @@ jest.mock('lodash', () => {
 
 // actual version breaks `mount`
 jest.mock('rc-tooltip', () => ({
+  // eslint-disable-next-line
   default: function Tooltip() {
     return null;
   }
@@ -81,7 +83,7 @@ it('searches', () => {
   expect(getComponents).lastCalledWith({ ...defaultSearchParameters, q: 'foo', qualifiers: 'TRK' });
 });
 
-it('loads more', async () => {
+it('loads more', () => {
   const wrapper = mountRender();
   wrapper.find('ListFooter').prop<Function>('loadMore')();
   expect(getComponents).lastCalledWith({ ...defaultSearchParameters, p: 2, qualifiers: 'TRK' });
index cdb33cf7f3321c05a766ed50c076b51c3026900a..75368168411f8ac9e93c133f52120e31343ad863 100644 (file)
@@ -17,6 +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.
  */
+/* eslint-disable import/first, import/order */
 jest.mock('../../../api/permissions', () => ({
   bulkApplyTemplate: jest.fn(() => Promise.resolve()),
   getPermissionTemplates: jest.fn(() => Promise.resolve({ permissionTemplates: [] }))
index bd8c3114b4eaf25d61cbfef548c278a44d9bd30e..c514345b78a3db06c609388d97aba8c7d5d758a9 100644 (file)
@@ -17,6 +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.
  */
+/* eslint-disable import/first, import/order */
 jest.mock('../../../api/components', () => ({
   createProject: jest.fn(({ name }: { name: string }) =>
     Promise.resolve({ project: { key: name, name } })
index 976be4403a8377066f011ea6d95e815c0839d22d..d73e53066325e59c85647e62f739b1d53fdad07e 100644 (file)
@@ -17,6 +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.
  */
+/* eslint-disable import/first, import/order */
 jest.mock('../../../api/components', () => ({
   bulkDeleteProjects: jest.fn(() => Promise.resolve())
 }));
index 792e29ccc486f9fddb612ad0832da3bdd9c2d02b..cc29a0e243d5d564955d6d6aa7e627b87fb28083 100644 (file)
@@ -17,6 +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.
  */
+/* eslint-disable import/first */
 jest.mock('../../permissions/project/views/ApplyTemplateView');
 
 import * as React from 'react';
index 1d16a88565951abd01d3e4b7f4e53f2a7aa6761a..d159d8354a307b43e6672b258cd68509cda12edb 100644 (file)
@@ -32,7 +32,7 @@ interface Props {
   onRequestFail: (reasong: any) => void;
   organization: string | null;
   profiles: Profile[];
-  router: { replace: ({}) => void };
+  router: { replace: (path: any) => void };
   updateProfiles: () => Promise<void>;
 }
 
index fe94b38b03dc6a11120e6b5ef949c50a32570fcc..8d892127fc78f26a315ec3017a6461a02390c065 100644 (file)
@@ -82,7 +82,7 @@ export default class ProfilePermissionsForm extends React.PureComponent<Props, S
     const { selected } = this.state;
     if (selected) {
       this.setState({ submitting: true });
-      if ((selected as User).login != undefined) {
+      if ((selected as User).login !== undefined) {
         this.handleUserAdd(selected as User);
       } else {
         this.handleGroupAdd(selected as Group);
index e265206a49f51dd42841464e0540e5cd872eabbb..911bf55cca4a9e6d4d97e02e10c03240a2244bba 100644 (file)
@@ -113,7 +113,7 @@ export default class ProfilePermissionsFormSelect extends React.PureComponent<Pr
 }
 
 function isUser(option: Option): option is User {
-  return (option as User).login != undefined;
+  return (option as User).login !== undefined;
 }
 
 function getStringValue(option: Option) {
index c61a60d83a8e566ffbf2aec0e3f98d7cfb5c0960..fc13a1739601711d06df4107e1f040bd5599c644 100644 (file)
@@ -17,6 +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.
  */
+/* eslint-disable import/first, import/order */
 jest.mock('../../../../api/quality-profiles', () => ({
   searchUsers: jest.fn(() => Promise.resolve([])),
   searchGroups: jest.fn(() => Promise.resolve([]))
index 603967ba787b5d0e3480009cece15679ec59147a..a71948cbbbda04d800646530760403a063264f9e 100644 (file)
@@ -17,6 +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.
  */
+/* eslint-disable import/first, import/order */
 jest.mock('../../../../api/quality-profiles', () => ({
   addUser: jest.fn(() => Promise.resolve()),
   addGroup: jest.fn(() => Promise.resolve())
index 3483c66c0851eaac204138871950a0604aa8febf..7a029559e8005da1ae7e6b8769a93015f0ffcbe4 100644 (file)
@@ -17,6 +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.
  */
+/* eslint-disable import/first */
 jest.mock('lodash', () => {
   const lodash = require.requireActual('lodash');
   lodash.debounce = (fn: Function) => (...args: any[]) => fn(...args);
index d792b2c36bf93458068888f60f369190ef8f69c0..d9edeb1d1a1bb9152ff4d3259701054c1f3dbe74 100644 (file)
@@ -17,6 +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.
  */
+/* eslint-disable import/first, import/order */
 jest.mock('../../../../api/quality-profiles', () => ({
   removeGroup: jest.fn(() => Promise.resolve())
 }));
index 6fbd6f8ec9b19a258c4bdce107cbe16491c5ec70..f2b26b8ce41bf1fc178295c74edb5a08745565a5 100644 (file)
@@ -17,6 +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.
  */
+/* eslint-disable import/first, import/order */
 jest.mock('../../../../api/quality-profiles', () => ({
   removeUser: jest.fn(() => Promise.resolve())
 }));
index 2211ed17dd570bbdddb0f846895fb8470c8d121a..a8108bf18655b7132017f33b44b369aea5e56db6 100644 (file)
@@ -41,12 +41,16 @@ interface State {
 
 export default class App extends React.PureComponent<Props, State> {
   mounted: boolean;
-  state: State = { loading: true };
 
   static contextTypes = {
     router: PropTypes.object
   };
 
+  constructor(props: Props) {
+    super(props);
+    this.state = { loading: true };
+  }
+
   componentDidMount() {
     this.mounted = true;
     this.fetchSysInfo();
index 7048439a6783eef10eaba969604fd8c101427ace..7d6ccca5a0dd6284543aac7abb6a36536d82fa94 100644 (file)
@@ -94,7 +94,7 @@ export function getSearchNodes(sysInfoData: ClusterSysInfo): NodeInfo[] {
 
 export function isCluster(sysInfoData?: SysInfo): boolean {
   return (
-    sysInfoData != undefined && sysInfoData['System'] && sysInfoData['System'][HA_FIELD] === true
+    sysInfoData !== undefined && sysInfoData['System'] && sysInfoData['System'][HA_FIELD] === true
   );
 }
 
@@ -165,8 +165,8 @@ export function getStandaloneSecondarySections(sysInfoData: SysInfo): SysInfoSec
 }
 
 export function groupSections(sysInfoData: SysValueObject) {
-  let mainSection: SysValueObject = {};
-  let sections: SysInfoSection = {};
+  const mainSection: SysValueObject = {};
+  const sections: SysInfoSection = {};
   each(sysInfoData, (item, key) => {
     if (typeof item !== 'object' || item instanceof Array) {
       mainSection[key] = item;
index ebc579d5ca5a35e778e1d884ad87b5f18d51edba..8ddcd805b105b18c1287a0cee2cac15aaf7f10fa 100644 (file)
@@ -44,17 +44,21 @@ interface State {
 
 export default class WebApiApp extends React.PureComponent<Props, State> {
   mounted: boolean;
-  state: State = {
-    domains: [],
-    searchQuery: '',
-    showDeprecated: false,
-    showInternal: false
-  };
 
   static contextTypes = {
     router: PropTypes.object.isRequired
   };
 
+  constructor(props: Props) {
+    super(props);
+    this.state = {
+      domains: [],
+      searchQuery: '',
+      showDeprecated: false,
+      showInternal: false
+    };
+  }
+
   componentDidMount() {
     this.mounted = true;
     this.fetchList();
index 4114f4944e0b0fb7e45ce53caa1aa6905a6e472e..539f425e8d41be3dfb64e8ef31a3dc0e525e215c 100644 (file)
@@ -77,7 +77,7 @@ it('should not render internal actions', () => {
 
 it('should render only actions matching the query', () => {
   const actions = [ACTION, { ...ACTION, key: 'bar', description: 'Bar desc' }];
-  const domain = { ...DOMAIN, actions: actions };
+  const domain = { ...DOMAIN, actions };
   expect(
     shallow(<Domain {...DEFAULT_PROPS} domain={domain} searchQuery="Foo" />)
   ).toMatchSnapshot();
@@ -89,7 +89,7 @@ it('should also render actions with a description matching the query', () => {
     { ...ACTION, key: 'bar', description: 'Bar desc' },
     { ...ACTION, key: 'baz', description: 'foobar' }
   ];
-  const domain = { ...DOMAIN, actions: actions };
+  const domain = { ...DOMAIN, actions };
   expect(
     shallow(<Domain {...DEFAULT_PROPS} domain={domain} searchQuery="Foo" />)
   ).toMatchSnapshot();
index 1548036d0c6672e2a18dfd642be1b1fb65ca37b3..87786e6d9dddd749aebc20745255e7199686649a 100644 (file)
@@ -48,6 +48,10 @@ export const BarChart = createReactClass({
     };
   },
 
+  getInitialState() {
+    return { width: this.props.width, height: this.props.height };
+  },
+
   componentDidUpdate(prevProps) {
     if (this.props.width && prevProps.width !== this.props.width) {
       this.setState({ width: this.props.width });
@@ -57,10 +61,6 @@ export const BarChart = createReactClass({
     }
   },
 
-  getInitialState() {
-    return { width: this.props.width, height: this.props.height };
-  },
-
   handleClick(point) {
     this.props.onBarClick(point);
   },
index 0fa49725305ddb717a93190065c4ca98718cd801..dd6e81957bb18ab7a0ba0693af8582d229b9f6c6 100644 (file)
@@ -47,7 +47,7 @@ export default class SelectListItem extends React.PureComponent {
 
   renderLink() {
     let children = this.props.item;
-    if (this.props.hasOwnProperty('children')) {
+    if (this.props.children) {
       children = this.props.children;
     }
     return (
index 5a0c0911f614fd4c979cfa76d4742c4393a0c182..265643354e67e760cd49aea978f472655f20cf04 100644 (file)
@@ -105,7 +105,7 @@ export default class DateInput extends React.PureComponent<Props> {
             <path d="M5.5 6h2v2h-2V6zm3 0h2v2h-2V6zm3 0h2v2h-2V6zm-9 6h2v2h-2v-2zm3 0h2v2h-2v-2zm3 0h2v2h-2v-2zm-3-3h2v2h-2V9zm3 0h2v2h-2V9zm3 0h2v2h-2V9zm-9 0h2v2h-2V9zm11-9v1h-2V0h-7v1h-2V0h-2v16h15V0h-2zm1 15h-13V4h13v11z" />
           </svg>
         </span>
-        {this.props.value != undefined && (
+        {this.props.value !== undefined && (
           <a className="date-input-control-reset" href="#" onClick={this.handleResetClick}>
             <CloseIcon className="" />
           </a>
index 91670a3c89506597831879a7914bd7a1b8d3396f..9c12362ba9d4b432441b58794ae7cccecf9e6f7f 100644 (file)
@@ -33,10 +33,8 @@ export const longFormatterOption = { year: 'numeric', month: 'long', day: 'numer
 
 export default function DateFormatter({ children, date, long }: Props) {
   return (
-    <FormattedDate
-      children={children}
-      value={parseDate(date)}
-      {...(long ? longFormatterOption : formatterOption)}
-    />
+    <FormattedDate value={parseDate(date)} {...(long ? longFormatterOption : formatterOption)}>
+      {children}
+    </FormattedDate>
   );
 }
index ce2adea2a9445ca0e16f2e12bb1d328fda8a76da..3e600273471f469019d33f5af719fb25c750dea6 100644 (file)
@@ -27,5 +27,5 @@ interface Props {
 }
 
 export default function DateFromNow({ children, date }: Props) {
-  return <FormattedRelative children={children} value={parseDate(date)} />;
+  return <FormattedRelative value={parseDate(date)}>{children}</FormattedRelative>;
 }
index 9d9c1bcd03c0b92d0be639472184c863cb2f4f09..c26c72f40101ee05dd1490d08ee2f878e9d58e7e 100644 (file)
@@ -35,5 +35,9 @@ export const formatterOption = {
 };
 
 export default function DateTimeFormatter({ children, date }: Props) {
-  return <FormattedDate children={children} value={parseDate(date)} {...formatterOption} />;
+  return (
+    <FormattedDate value={parseDate(date)} {...formatterOption}>
+      {children}
+    </FormattedDate>
+  );
 }
index efa15fc38a0104935b06a3f5b0fb42b4d28b726f..e6324cb6b017290b59fb6419d149d0ab3bddf592 100644 (file)
@@ -33,10 +33,8 @@ export const longFormatterOption = { hour: 'numeric', minute: 'numeric', second:
 
 export default function TimeFormatter({ children, date, long }: Props) {
   return (
-    <FormattedTime
-      children={children}
-      value={parseDate(date)}
-      {...(long ? longFormatterOption : formatterOption)}
-    />
+    <FormattedTime value={parseDate(date)} {...(long ? longFormatterOption : formatterOption)}>
+      {children}
+    </FormattedTime>
   );
 }
index e52c12a7512d326f02bce7a39bffb4bbff387d3c..cb9a85aab5e1e99fffbd10017cbeb7c910a85855 100644 (file)
@@ -31,14 +31,14 @@ interface Props {
 }
 
 export default function Measure({ className, decimals, measure }: Props) {
-  if (measure == undefined) {
+  if (measure === undefined) {
     return <span>{'–'}</span>;
   }
 
   const metric = measure.metric;
   const value = isDiffMetric(metric.key) ? measure.leak : measure.value;
 
-  if (value == undefined) {
+  if (value === undefined) {
     return <span>{'–'}</span>;
   }
 
index 5eb0a6efa3efc4bfc3a1a7842f2c4b5e868e5376..80f2e31efab375beb772274b9989e9674c617b36 100644 (file)
@@ -17,6 +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.
  */
+/* eslint-disable import/first */
 jest.mock('../../../helpers/measures', () => {
   const measures = require.requireActual('../../../helpers/measures');
   measures.getRatingTooltip = jest.fn(() => 'tooltip');
index 183994c7eae12154a3d30e0e6cbe561791d84969..1225efed716d8c66da67c47cce5f0cba566e86e1 100644 (file)
@@ -30,7 +30,7 @@ interface Props {
 }
 
 export default function Rating({ className, muted = false, small = false, value }: Props) {
-  if (value == undefined) {
+  if (value === undefined) {
     return <span>{'–'}</span>;
   }
   const formatted = formatMeasure(value, 'RATING');
index efa8b272af6c8d22bb30bb2065f01ab66ccca1ca..33f8792bab678535962f50f819c77fdd4242c9cd 100644 (file)
@@ -81,7 +81,7 @@ function injectRelational(
 ) {
   const newFields: { [x: string]: any } = {};
   const baseValue = issue[baseField];
-  if (baseValue != undefined && source != undefined) {
+  if (baseValue !== undefined && source !== undefined) {
     const lookupValue = source.find(candidate => candidate[lookupField] === baseValue);
     if (lookupValue != null) {
       Object.keys(lookupValue).forEach(key => {
index a65987902667e0f90c0361a07cc53d299e488097..aa54768bea1b77412e3e75ac25539f02bf300127 100644 (file)
@@ -42,6 +42,7 @@ export function translate(...keys: string[]): string {
   const messageKey = keys.join('.');
   if (process.env.NODE_ENV === 'development') {
     if (!messages[messageKey]) {
+      // eslint-disable-next-line
       console.error(`No message for: ${messageKey}`);
     }
   }
@@ -59,6 +60,7 @@ export function translateWithParameters(
       .reduce((acc, parameter, index) => acc.replace(`{${index}}`, parameter), message);
   } else {
     if (process.env.NODE_ENV === 'development') {
+      // eslint-disable-next-line
       console.error(`No message for: ${messageKey}`);
     }
     return `${messageKey}.${parameters.join('.')}`;
index 8c200a239acb962ca0001181ec93e8d12042fd46..c0e89838f5971097b647095c5da05c2045bc72c1 100644 (file)
@@ -101,7 +101,7 @@ function useFormatter(
   formatter: Formatter,
   options?: any
 ): string {
-  return value != undefined && value !== '' ? formatter(value, options) : '';
+  return value !== undefined && value !== '' ? formatter(value, options) : '';
 }
 
 function getFormatter(type: string): Formatter {
@@ -313,7 +313,7 @@ function formatDurationShort(
 
 function durationFormatter(value: string | number): string {
   if (typeof value === 'string') {
-    value = parseInt(value);
+    value = parseInt(value, 10);
   }
   if (value === 0) {
     return '0';
@@ -330,7 +330,7 @@ function durationFormatter(value: string | number): string {
 
 function shortDurationFormatter(value: string | number): string {
   if (typeof value === 'string') {
-    value = parseInt(value);
+    value = parseInt(value, 10);
   }
   if (value === 0) {
     return '0';
index 8186016873dee81713d198a9eddb912cacb49f15..427192d12e754db536c580000009eb0adc5ed893 100644 (file)
@@ -8,9 +8,7 @@
     "strict": true,
     "target": "es5",
     "jsx": "react",
-    // remove "es2015.promise", "es2015.iterable" when upgrading to TypeScript 2.5
-    // see https://github.com/Microsoft/TypeScript/issues/16017
-    "lib": ["es2015.promise", "es2015.iterable", "es2017", "dom"],
+    "lib": ["es2017", "dom"],
     "module": "esnext",
     "moduleResolution": "node",
     "typeRoots": ["./src/main/js/typings", "./node_modules/@types"]
index 5d70c6f3d034bcbe8cb85e3039af7baaf84d3d59..b5e611c2c9b80c61073f0b18a16d752e3429edc4 100644 (file)
@@ -182,10 +182,14 @@ address@1.0.2, address@^1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/address/-/address-1.0.2.tgz#480081e82b587ba319459fef512f516fe03d58af"
 
-ajv-keywords@^1.0.0, ajv-keywords@^1.1.1:
+ajv-keywords@^1.1.1:
   version "1.5.1"
   resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c"
 
+ajv-keywords@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.0.tgz#a296e17f7bfae7c1ce4f7e0de53d29cb32162df0"
+
 ajv@^4.7.0, ajv@^4.9.1:
   version "4.11.8"
   resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536"
@@ -202,6 +206,15 @@ ajv@^5.0.0:
     json-schema-traverse "^0.3.0"
     json-stable-stringify "^1.0.1"
 
+ajv@^5.2.0, ajv@^5.2.3:
+  version "5.2.3"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.2.3.tgz#c06f598778c44c6b161abafe3466b81ad1814ed2"
+  dependencies:
+    co "^4.6.0"
+    fast-deep-equal "^1.0.0"
+    json-schema-traverse "^0.3.0"
+    json-stable-stringify "^1.0.1"
+
 align-text@^0.1.1, align-text@^0.1.3:
   version "0.1.4"
   resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
@@ -238,6 +251,10 @@ ansi-escapes@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-2.0.0.tgz#5bae52be424878dd9783e8910e3fc2922e83c81b"
 
+ansi-escapes@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92"
+
 ansi-html@0.0.7:
   version "0.0.7"
   resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e"
@@ -290,6 +307,12 @@ argparse@^1.0.7:
   dependencies:
     sprintf-js "~1.0.2"
 
+aria-query@^0.7.0:
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-0.7.0.tgz#4af10a1e61573ddea0cf3b99b51c52c05b424d24"
+  dependencies:
+    ast-types-flow "0.0.7"
+
 arr-diff@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
@@ -320,6 +343,13 @@ array-flatten@1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
 
+array-includes@^3.0.3:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d"
+  dependencies:
+    define-properties "^1.1.2"
+    es-abstract "^1.7.0"
+
 array-map@~0.0.0:
   version "0.0.0"
   resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662"
@@ -346,13 +376,6 @@ array-unique@^0.3.2:
   version "0.3.2"
   resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
 
-array.prototype.find@^2.0.1:
-  version "2.0.4"
-  resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.0.4.tgz#556a5c5362c08648323ddaeb9de9d14bc1864c90"
-  dependencies:
-    define-properties "^1.1.2"
-    es-abstract "^1.7.0"
-
 arrify@^1.0.0, arrify@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
@@ -387,6 +410,10 @@ assert@^1.1.1:
   dependencies:
     util "0.10.3"
 
+ast-types-flow@0.0.7:
+  version "0.0.7"
+  resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad"
+
 async-each@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
@@ -456,7 +483,13 @@ aws4@^1.2.1:
   version "1.6.0"
   resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"
 
-babel-code-frame@6.22.0, babel-code-frame@^6.11.0, babel-code-frame@^6.16.0, babel-code-frame@^6.22.0:
+axobject-query@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-0.1.0.tgz#62f59dbc59c9f9242759ca349960e7a2fe3c36c0"
+  dependencies:
+    ast-types-flow "0.0.7"
+
+babel-code-frame@6.22.0, babel-code-frame@^6.11.0, babel-code-frame@^6.22.0:
   version "6.22.0"
   resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4"
   dependencies:
@@ -488,15 +521,6 @@ babel-core@^6.0.0, babel-core@^6.22.1, babel-core@^6.24.1:
     slash "^1.0.0"
     source-map "^0.5.0"
 
-babel-eslint@7.2.3:
-  version "7.2.3"
-  resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-7.2.3.tgz#b2fe2d80126470f5c19442dc757253a897710827"
-  dependencies:
-    babel-code-frame "^6.22.0"
-    babel-traverse "^6.23.1"
-    babel-types "^6.23.0"
-    babylon "^6.17.0"
-
 babel-generator@^6.18.0, babel-generator@^6.25.0:
   version "6.25.0"
   resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.25.0.tgz#33a1af70d5f2890aeb465a4a7793c1df6a9ea9fc"
@@ -1055,7 +1079,7 @@ babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.25.0:
     babylon "^6.17.2"
     lodash "^4.2.0"
 
-babel-traverse@^6.18.0, babel-traverse@^6.23.1, babel-traverse@^6.24.1, babel-traverse@^6.25.0:
+babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.25.0:
   version "6.25.0"
   resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.25.0.tgz#2257497e2fcd19b89edc13c4c91381f9512496f1"
   dependencies:
@@ -1069,7 +1093,7 @@ babel-traverse@^6.18.0, babel-traverse@^6.23.1, babel-traverse@^6.24.1, babel-tr
     invariant "^2.2.0"
     lodash "^4.2.0"
 
-babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.23.0, babel-types@^6.24.1, babel-types@^6.25.0:
+babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.25.0:
   version "6.25.0"
   resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.25.0.tgz#70afb248d5660e5d18f811d91c8303b54134a18e"
   dependencies:
@@ -1078,7 +1102,7 @@ babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.23.0, babel-types@^6.24
     lodash "^4.2.0"
     to-fast-properties "^1.0.1"
 
-babylon@^6.17.0, babylon@^6.17.2, babylon@^6.17.4:
+babylon@^6.17.2, babylon@^6.17.4:
   version "6.17.4"
   resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.4.tgz#3e8b7402b88d22c3423e137a1577883b15ff869a"
 
@@ -1401,7 +1425,7 @@ center-align@^0.1.1:
     align-text "^0.1.3"
     lazy-cache "^1.0.3"
 
-chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3:
+chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.3:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
   dependencies:
@@ -1500,12 +1524,6 @@ clean-css@4.1.x:
   dependencies:
     source-map "0.5.x"
 
-cli-cursor@^1.0.1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987"
-  dependencies:
-    restore-cursor "^1.0.1"
-
 cli-cursor@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
@@ -1656,7 +1674,7 @@ concat-map@0.0.1:
   version "0.0.1"
   resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
 
-concat-stream@^1.4.6:
+concat-stream@^1.6.0:
   version "1.6.0"
   resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7"
   dependencies:
@@ -1780,7 +1798,7 @@ cross-spawn@4.0.2:
     lru-cache "^4.0.1"
     which "^1.2.9"
 
-cross-spawn@5.1.0, cross-spawn@^5.0.1:
+cross-spawn@5.1.0, cross-spawn@^5.0.1, cross-spawn@^5.1.0:
   version "5.1.0"
   resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
   dependencies:
@@ -1983,12 +2001,6 @@ d3-time@1:
   version "1.0.7"
   resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-1.0.7.tgz#94caf6edbb7879bb809d0d1f7572bc48482f7270"
 
-d@1:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f"
-  dependencies:
-    es5-ext "^0.10.9"
-
 damerau-levenshtein@^1.0.0:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz#03191c432cb6eea168bb77f3a55ffdccb8978514"
@@ -2013,6 +2025,12 @@ debug@2.6.8, debug@^2.1.1, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.
   dependencies:
     ms "2.0.0"
 
+debug@^3.0.1:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
+  dependencies:
+    ms "2.0.0"
+
 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"
@@ -2126,13 +2144,20 @@ diffie-hellman@^5.0.0:
     miller-rabin "^4.0.0"
     randombytes "^2.0.0"
 
-doctrine@1.5.0, doctrine@^1.2.2:
+doctrine@1.5.0:
   version "1.5.0"
   resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa"
   dependencies:
     esutils "^2.0.2"
     isarray "^1.0.0"
 
+doctrine@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63"
+  dependencies:
+    esutils "^2.0.2"
+    isarray "^1.0.0"
+
 dom-align@1.x:
   version "1.6.3"
   resolved "https://registry.yarnpkg.com/dom-align/-/dom-align-1.6.3.tgz#3017bcc87f02547b1f15b458649a8d94a71f5903"
@@ -2232,6 +2257,10 @@ elliptic@^6.0.0:
     minimalistic-assert "^1.0.0"
     minimalistic-crypto-utils "^1.0.0"
 
+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"
@@ -2325,58 +2354,6 @@ es-to-primitive@^1.1.1:
     is-date-object "^1.0.1"
     is-symbol "^1.0.1"
 
-es5-ext@^0.10.14, es5-ext@^0.10.9, es5-ext@~0.10.14:
-  version "0.10.27"
-  resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.27.tgz#bf926b058c62b1cb5de1a887930673b6aa6d9a66"
-  dependencies:
-    es6-iterator "2"
-    es6-symbol "~3.1"
-
-es6-iterator@2, es6-iterator@^2.0.1, es6-iterator@~2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.1.tgz#8e319c9f0453bf575d374940a655920e59ca5512"
-  dependencies:
-    d "1"
-    es5-ext "^0.10.14"
-    es6-symbol "^3.1"
-
-es6-map@^0.1.3:
-  version "0.1.5"
-  resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0"
-  dependencies:
-    d "1"
-    es5-ext "~0.10.14"
-    es6-iterator "~2.0.1"
-    es6-set "~0.1.5"
-    es6-symbol "~3.1.1"
-    event-emitter "~0.3.5"
-
-es6-set@~0.1.5:
-  version "0.1.5"
-  resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1"
-  dependencies:
-    d "1"
-    es5-ext "~0.10.14"
-    es6-iterator "~2.0.1"
-    es6-symbol "3.1.1"
-    event-emitter "~0.3.5"
-
-es6-symbol@3.1.1, es6-symbol@^3.1, es6-symbol@^3.1.1, es6-symbol@~3.1, es6-symbol@~3.1.1:
-  version "3.1.1"
-  resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77"
-  dependencies:
-    d "1"
-    es5-ext "~0.10.14"
-
-es6-weak-map@^2.0.1:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f"
-  dependencies:
-    d "1"
-    es5-ext "^0.10.14"
-    es6-iterator "^2.0.1"
-    es6-symbol "^3.1.1"
-
 escape-html@1.0.3, escape-html@~1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
@@ -2396,15 +2373,6 @@ escodegen@^1.6.1:
   optionalDependencies:
     source-map "~0.2.0"
 
-escope@^3.6.0:
-  version "3.6.0"
-  resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3"
-  dependencies:
-    es6-map "^0.1.3"
-    es6-weak-map "^2.0.1"
-    esrecurse "^4.1.0"
-    estraverse "^4.1.1"
-
 eslint-import-resolver-node@^0.3.1:
   version "0.3.1"
   resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.1.tgz#4422574cde66a9a7b099938ee4d508a199e0e3cc"
@@ -2429,15 +2397,9 @@ eslint-module-utils@^2.1.1:
     debug "^2.6.8"
     pkg-dir "^1.0.0"
 
-eslint-plugin-flowtype@^2.29.1:
-  version "2.35.0"
-  resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.35.0.tgz#d17494f0ae8b727c632d8b9d4b4a848e7e0c04af"
-  dependencies:
-    lodash "^4.15.0"
-
-eslint-plugin-import@2.7.0:
-  version "2.7.0"
-  resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.7.0.tgz#21de33380b9efb55f5ef6d2e210ec0e07e7fa69f"
+eslint-plugin-import@2.8.0:
+  version "2.8.0"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.8.0.tgz#fa1b6ef31fcb3c501c09859c1b86f1fc5b986894"
   dependencies:
     builtin-modules "^1.1.1"
     contains-path "^0.1.0"
@@ -2450,66 +2412,83 @@ eslint-plugin-import@2.7.0:
     minimatch "^3.0.3"
     read-pkg-up "^2.0.0"
 
-eslint-plugin-jsx-a11y@^3.0.2:
-  version "3.0.2"
-  resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-3.0.2.tgz#9f0eabcafde3d2a2600d96a66adb90d099e841fe"
+eslint-plugin-jsx-a11y@6.0.2:
+  version "6.0.2"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.0.2.tgz#659277a758b036c305a7e4a13057c301cd3be73f"
   dependencies:
+    aria-query "^0.7.0"
+    array-includes "^3.0.3"
+    ast-types-flow "0.0.7"
+    axobject-query "^0.1.0"
     damerau-levenshtein "^1.0.0"
-    jsx-ast-utils "^1.0.0"
-    object-assign "^4.0.1"
+    emoji-regex "^6.1.0"
+    jsx-ast-utils "^1.4.0"
+
+eslint-plugin-promise@3.6.0:
+  version "3.6.0"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-3.6.0.tgz#54b7658c8f454813dc2a870aff8152ec4969ba75"
 
-eslint-plugin-react@^6.8.0:
-  version "6.10.3"
-  resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-6.10.3.tgz#c5435beb06774e12c7db2f6abaddcbf900cd3f78"
+eslint-plugin-react@7.4.0:
+  version "7.4.0"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.4.0.tgz#300a95861b9729c087d362dd64abcc351a74364a"
   dependencies:
-    array.prototype.find "^2.0.1"
-    doctrine "^1.2.2"
+    doctrine "^2.0.0"
     has "^1.0.1"
-    jsx-ast-utils "^1.3.4"
-    object.assign "^4.0.4"
+    jsx-ast-utils "^2.0.0"
+    prop-types "^15.5.10"
 
-eslint@3.14.1:
-  version "3.14.1"
-  resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.14.1.tgz#8a62175f2255109494747a1b25128d97b8eb3d97"
+eslint-scope@^3.7.1:
+  version "3.7.1"
+  resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8"
   dependencies:
-    babel-code-frame "^6.16.0"
-    chalk "^1.1.3"
-    concat-stream "^1.4.6"
-    debug "^2.1.1"
-    doctrine "^1.2.2"
-    escope "^3.6.0"
-    espree "^3.3.1"
+    esrecurse "^4.1.0"
+    estraverse "^4.1.1"
+
+eslint@4.9.0:
+  version "4.9.0"
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.9.0.tgz#76879d274068261b191fe0f2f56c74c2f4208e8b"
+  dependencies:
+    ajv "^5.2.0"
+    babel-code-frame "^6.22.0"
+    chalk "^2.1.0"
+    concat-stream "^1.6.0"
+    cross-spawn "^5.1.0"
+    debug "^3.0.1"
+    doctrine "^2.0.0"
+    eslint-scope "^3.7.1"
+    espree "^3.5.1"
+    esquery "^1.0.0"
     estraverse "^4.2.0"
     esutils "^2.0.2"
     file-entry-cache "^2.0.0"
-    glob "^7.0.3"
-    globals "^9.14.0"
-    ignore "^3.2.0"
+    functional-red-black-tree "^1.0.1"
+    glob "^7.1.2"
+    globals "^9.17.0"
+    ignore "^3.3.3"
     imurmurhash "^0.1.4"
-    inquirer "^0.12.0"
-    is-my-json-valid "^2.10.0"
+    inquirer "^3.0.6"
     is-resolvable "^1.0.0"
-    js-yaml "^3.5.1"
-    json-stable-stringify "^1.0.0"
+    js-yaml "^3.9.1"
+    json-stable-stringify "^1.0.1"
     levn "^0.3.0"
-    lodash "^4.0.0"
-    mkdirp "^0.5.0"
+    lodash "^4.17.4"
+    minimatch "^3.0.2"
+    mkdirp "^0.5.1"
     natural-compare "^1.4.0"
     optionator "^0.8.2"
-    path-is-inside "^1.0.1"
-    pluralize "^1.2.1"
-    progress "^1.1.8"
-    require-uncached "^1.0.2"
-    shelljs "^0.7.5"
-    strip-bom "^3.0.0"
+    path-is-inside "^1.0.2"
+    pluralize "^7.0.0"
+    progress "^2.0.0"
+    require-uncached "^1.0.3"
+    semver "^5.3.0"
+    strip-ansi "^4.0.0"
     strip-json-comments "~2.0.1"
-    table "^3.7.8"
+    table "^4.0.1"
     text-table "~0.2.0"
-    user-home "^2.0.0"
 
-espree@^3.3.1:
-  version "3.5.0"
-  resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.0.tgz#98358625bdd055861ea27e2867ea729faf463d8d"
+espree@^3.5.1:
+  version "3.5.1"
+  resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.1.tgz#0c988b8ab46db53100a1954ae4ba995ddd27d87e"
   dependencies:
     acorn "^5.1.1"
     acorn-jsx "^3.0.0"
@@ -2522,6 +2501,12 @@ esprima@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804"
 
+esquery@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa"
+  dependencies:
+    estraverse "^4.0.0"
+
 esrecurse@^4.1.0:
   version "4.2.0"
   resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163"
@@ -2533,7 +2518,7 @@ estraverse@^1.9.1:
   version "1.9.3"
   resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44"
 
-estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
+estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
   version "4.2.0"
   resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
 
@@ -2545,13 +2530,6 @@ etag@~1.8.0:
   version "1.8.0"
   resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.0.tgz#6f631aef336d6c46362b51764044ce216be3c051"
 
-event-emitter@~0.3.5:
-  version "0.3.5"
-  resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
-  dependencies:
-    d "1"
-    es5-ext "~0.10.14"
-
 eventemitter3@1.x.x:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508"
@@ -2598,10 +2576,6 @@ exenv@^1.2.1:
   version "1.2.2"
   resolved "https://registry.yarnpkg.com/exenv/-/exenv-1.2.2.tgz#2ae78e85d9894158670b03d47bec1f03bd91bb9d"
 
-exit-hook@^1.0.0:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8"
-
 expand-brackets@^0.1.4:
   version "0.1.5"
   resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
@@ -2767,13 +2741,6 @@ fbjs@^0.8.9:
     setimmediate "^1.0.5"
     ua-parser-js "^0.7.9"
 
-figures@^1.3.5:
-  version "1.7.0"
-  resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e"
-  dependencies:
-    escape-string-regexp "^1.0.5"
-    object-assign "^4.1.0"
-
 figures@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962"
@@ -2973,6 +2940,10 @@ function.prototype.name@^1.0.0:
     function-bind "^1.1.0"
     is-callable "^1.1.3"
 
+functional-red-black-tree@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
+
 gauge@~2.7.3:
   version "2.7.4"
   resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
@@ -2986,16 +2957,6 @@ gauge@~2.7.3:
     strip-ansi "^3.0.1"
     wide-align "^1.1.0"
 
-generate-function@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74"
-
-generate-object-property@^1.1.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0"
-  dependencies:
-    is-property "^1.0.0"
-
 get-caller-file@^1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5"
@@ -3027,7 +2988,7 @@ glob-parent@^2.0.0:
   dependencies:
     is-glob "^2.0.0"
 
-glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.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"
   dependencies:
@@ -3056,7 +3017,7 @@ global-prefix@^1.0.1:
     is-windows "^1.0.1"
     which "^1.2.14"
 
-globals@^9.0.0, globals@^9.14.0:
+globals@^9.0.0, globals@^9.17.0:
   version "9.18.0"
   resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
 
@@ -3367,9 +3328,9 @@ ieee754@^1.1.4:
   version "1.1.8"
   resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4"
 
-ignore@^3.2.0:
-  version "3.3.3"
-  resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.3.tgz#432352e57accd87ab3110e82d3fea0e47812156d"
+ignore@^3.3.3:
+  version "3.3.5"
+  resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.5.tgz#c4e715455f6073a8d7e5dae72d2fc9d71663dba6"
 
 image-size@~0.5.0:
   version "0.5.5"
@@ -3443,22 +3404,23 @@ inquirer@3.2.1:
     strip-ansi "^4.0.0"
     through "^2.3.6"
 
-inquirer@^0.12.0:
-  version "0.12.0"
-  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e"
+inquirer@^3.0.6:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9"
   dependencies:
-    ansi-escapes "^1.1.0"
-    ansi-regex "^2.0.0"
-    chalk "^1.0.0"
-    cli-cursor "^1.0.1"
+    ansi-escapes "^3.0.0"
+    chalk "^2.0.0"
+    cli-cursor "^2.1.0"
     cli-width "^2.0.0"
-    figures "^1.3.5"
+    external-editor "^2.0.4"
+    figures "^2.0.0"
     lodash "^4.3.0"
-    readline2 "^1.0.1"
-    run-async "^0.1.0"
-    rx-lite "^3.1.2"
-    string-width "^1.0.1"
-    strip-ansi "^3.0.0"
+    mute-stream "0.0.7"
+    run-async "^2.2.0"
+    rx-lite "^4.0.8"
+    rx-lite-aggregates "^4.0.8"
+    string-width "^2.1.0"
+    strip-ansi "^4.0.0"
     through "^2.3.6"
 
 interpret@^1.0.0:
@@ -3631,15 +3593,6 @@ is-glob@^3.1.0:
   dependencies:
     is-extglob "^2.1.0"
 
-is-my-json-valid@^2.10.0:
-  version "2.16.0"
-  resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz#f079dd9bfdae65ee2038aae8acbc86ab109e3693"
-  dependencies:
-    generate-function "^2.0.0"
-    generate-object-property "^1.1.0"
-    jsonpointer "^4.0.0"
-    xtend "^4.0.0"
-
 is-number@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
@@ -3696,10 +3649,6 @@ is-promise@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
 
-is-property@^1.0.0:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
-
 is-regex@^1.0.4:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491"
@@ -4069,13 +4018,20 @@ js-tokens@^3.0.0:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
 
-js-yaml@^3.4.3, js-yaml@^3.5.1, js-yaml@^3.7.0:
+js-yaml@^3.4.3, js-yaml@^3.7.0:
   version "3.9.1"
   resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.9.1.tgz#08775cebdfdd359209f0d2acd383c8f86a6904a0"
   dependencies:
     argparse "^1.0.7"
     esprima "^4.0.0"
 
+js-yaml@^3.9.1:
+  version "3.10.0"
+  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc"
+  dependencies:
+    argparse "^1.0.7"
+    esprima "^4.0.0"
+
 js-yaml@~3.7.0:
   version "3.7.0"
   resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80"
@@ -4135,7 +4091,7 @@ json-schema@0.2.3:
   version "0.2.3"
   resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
 
-json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1:
+json-stable-stringify@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
   dependencies:
@@ -4169,10 +4125,6 @@ jsonify@~0.0.0:
   version "0.0.0"
   resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
 
-jsonpointer@^4.0.0:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9"
-
 jsprim@^1.2.2:
   version "1.4.1"
   resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
@@ -4182,10 +4134,16 @@ jsprim@^1.2.2:
     json-schema "0.2.3"
     verror "1.10.0"
 
-jsx-ast-utils@^1.0.0, jsx-ast-utils@^1.3.4:
+jsx-ast-utils@^1.4.0:
   version "1.4.1"
   resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz#3867213e8dd79bf1e8f2300c0cfc1efb182c0df1"
 
+jsx-ast-utils@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz#e801b1b39985e20fffc87b40e3748080e2dcac7f"
+  dependencies:
+    array-includes "^3.0.3"
+
 keymaster@1.6.2:
   version "1.6.2"
   resolved "https://registry.yarnpkg.com/keymaster/-/keymaster-1.6.2.tgz#e1ae54d0ea9488f9f60b66b668f02e9a1946c6eb"
@@ -4421,11 +4379,15 @@ lodash.some@^4.4.0:
   version "4.6.0"
   resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d"
 
+lodash.unescape@4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c"
+
 lodash.uniq@^4.5.0:
   version "4.5.0"
   resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
 
-lodash@4.17.4, lodash@^4.0.0, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0:
+lodash@4.17.4, lodash@^4.14.0, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0:
   version "4.17.4"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
 
@@ -4618,10 +4580,6 @@ ms@2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
 
-mute-stream@0.0.5:
-  version "0.0.5"
-  resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0"
-
 mute-stream@0.0.7:
   version "0.0.7"
   resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
@@ -4898,10 +4856,6 @@ once@^1.3.0, once@^1.3.3, once@^1.4.0:
   dependencies:
     wrappy "1"
 
-onetime@^1.0.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789"
-
 onetime@^2.0.0:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
@@ -5081,7 +5035,7 @@ path-is-absolute@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
 
-path-is-inside@^1.0.1:
+path-is-inside@^1.0.1, path-is-inside@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
 
@@ -5151,9 +5105,9 @@ pkg-dir@^2.0.0:
   dependencies:
     find-up "^2.1.0"
 
-pluralize@^1.2.1:
-  version "1.2.1"
-  resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45"
+pluralize@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777"
 
 portfinder@^1.0.9:
   version "1.0.13"
@@ -5487,9 +5441,9 @@ process@^0.11.0:
   version "0.11.10"
   resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
 
-progress@^1.1.8:
-  version "1.1.8"
-  resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be"
+progress@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f"
 
 promise@^7.1.1:
   version "7.3.1"
@@ -5877,20 +5831,6 @@ readdirp@^2.0.0:
     readable-stream "^2.0.2"
     set-immediate-shim "^1.0.1"
 
-readline2@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35"
-  dependencies:
-    code-point-at "^1.0.0"
-    is-fullwidth-code-point "^1.0.0"
-    mute-stream "0.0.5"
-
-rechoir@^0.6.2:
-  version "0.6.2"
-  resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384"
-  dependencies:
-    resolve "^1.1.6"
-
 recursive-readdir@2.2.1:
   version "2.2.1"
   resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.1.tgz#90ef231d0778c5ce093c9a48d74e5c5422d13a99"
@@ -6066,7 +6006,7 @@ require-main-filename@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
 
-require-uncached@^1.0.2:
+require-uncached@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3"
   dependencies:
@@ -6096,19 +6036,12 @@ resolve@1.1.7:
   version "1.1.7"
   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
 
-resolve@^1.1.6, resolve@^1.2.0, resolve@^1.3.2:
+resolve@^1.2.0, resolve@^1.3.2:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.4.0.tgz#a75be01c53da25d934a98ebd0e4c4a7312f92a86"
   dependencies:
     path-parse "^1.0.5"
 
-restore-cursor@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541"
-  dependencies:
-    exit-hook "^1.0.0"
-    onetime "^1.0.0"
-
 restore-cursor@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
@@ -6141,12 +6074,6 @@ ripemd160@^2.0.0, ripemd160@^2.0.1:
     hash-base "^2.0.0"
     inherits "^2.0.1"
 
-run-async@^0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389"
-  dependencies:
-    once "^1.3.0"
-
 run-async@^2.2.0:
   version "2.3.0"
   resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0"
@@ -6163,10 +6090,6 @@ rx-lite@*, rx-lite@^4.0.8:
   version "4.0.8"
   resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444"
 
-rx-lite@^3.1.2:
-  version "3.1.2"
-  resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102"
-
 rx@^4.1.0:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782"
@@ -6209,7 +6132,7 @@ select@^1.0.6:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d"
 
-"semver@2 || 3 || 4 || 5", semver@^5.3.0:
+"semver@2 || 3 || 4 || 5", semver@5.4.1, semver@^5.3.0:
   version "5.4.1"
   resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e"
 
@@ -6322,14 +6245,6 @@ shell-quote@1.6.1:
     array-reduce "~0.0.0"
     jsonify "~0.0.0"
 
-shelljs@^0.7.5:
-  version "0.7.8"
-  resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3"
-  dependencies:
-    glob "^7.0.0"
-    interpret "^1.0.0"
-    rechoir "^0.6.2"
-
 shellwords@^0.1.0:
   version "0.1.0"
   resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.0.tgz#66afd47b6a12932d9071cbfd98a52e785cd0ba14"
@@ -6342,9 +6257,11 @@ slash@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
 
-slice-ansi@0.0.4:
-  version "0.0.4"
-  resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35"
+slice-ansi@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d"
+  dependencies:
+    is-fullwidth-code-point "^2.0.0"
 
 snapdragon-node@^2.0.1:
   version "2.1.1"
@@ -6574,7 +6491,7 @@ string-width@^1.0.1, string-width@^1.0.2:
     is-fullwidth-code-point "^1.0.0"
     strip-ansi "^3.0.0"
 
-string-width@^2.0.0, string-width@^2.1.0:
+string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
   dependencies:
@@ -6668,16 +6585,16 @@ symbol-tree@^3.2.1:
   version "3.2.2"
   resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6"
 
-table@^3.7.8:
-  version "3.8.3"
-  resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f"
+table@^4.0.1:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36"
   dependencies:
-    ajv "^4.7.0"
-    ajv-keywords "^1.0.0"
-    chalk "^1.1.1"
-    lodash "^4.0.0"
-    slice-ansi "0.0.4"
-    string-width "^2.0.0"
+    ajv "^5.2.3"
+    ajv-keywords "^2.1.0"
+    chalk "^2.1.0"
+    lodash "^4.17.4"
+    slice-ansi "1.0.0"
+    string-width "^2.1.1"
 
 tapable@^0.2.5, tapable@^0.2.7, tapable@~0.2.5:
   version "0.2.8"
@@ -6855,9 +6772,16 @@ typedarray@^0.0.6:
   version "0.0.6"
   resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
 
-typescript@2.4.2:
-  version "2.4.2"
-  resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.4.2.tgz#f8395f85d459276067c988aa41837a8f82870844"
+typescript-eslint-parser@8.0.0:
+  version "8.0.0"
+  resolved "https://registry.yarnpkg.com/typescript-eslint-parser/-/typescript-eslint-parser-8.0.0.tgz#81f70bbffca1139c1dc5a1301208a7fd8213f8b2"
+  dependencies:
+    lodash.unescape "4.0.1"
+    semver "5.4.1"
+
+typescript@2.5.3:
+  version "2.5.3"
+  resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.5.3.tgz#df3dcdc38f3beb800d4bc322646b04a3f6ca7f0d"
 
 ua-parser-js@^0.7.9:
   version "0.7.14"
@@ -6978,12 +6902,6 @@ use@^2.0.0:
     isobject "^3.0.0"
     lazy-cache "^2.0.2"
 
-user-home@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f"
-  dependencies:
-    os-homedir "^1.0.0"
-
 util-deprecate@~1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"