diff options
Diffstat (limited to 'server')
78 files changed, 547 insertions, 561 deletions
diff --git a/server/sonar-web/.eslintrc b/server/sonar-web/.eslintrc index 6bbf8a9e0d5..edb289cdb23 100644 --- a/server/sonar-web/.eslintrc +++ b/server/sonar-web/.eslintrc @@ -1,6 +1,10 @@ { "extends": [ - "eslint:recommended" + "eslint:recommended", + "plugin:import/errors", + "plugin:react/recommended", + "plugin:jsx-a11y/recommended", + "plugin:promise/recommended" ], "env": { @@ -10,180 +14,181 @@ "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$"] } } diff --git a/server/sonar-web/package.json b/server/sonar-web/package.json index 336b9affc41..bb98241f947 100644 --- a/server/sonar-web/package.json +++ b/server/sonar-web/package.json @@ -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", @@ -83,12 +82,12 @@ "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", @@ -106,7 +105,8 @@ "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" @@ -118,7 +118,7 @@ "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" }, diff --git a/server/sonar-web/src/main/js/app/components/App.tsx b/server/sonar-web/src/main/js/app/components/App.tsx index e69c1116cda..44528fc0b4d 100644 --- a/server/sonar-web/src/main/js/app/components/App.tsx +++ b/server/sonar-web/src/main/js/app/components/App.tsx @@ -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, diff --git a/server/sonar-web/src/main/js/app/components/__tests__/ComponentContainer-test.tsx b/server/sonar-web/src/main/js/app/components/__tests__/ComponentContainer-test.tsx index ed7838f8ea3..623451a6542 100644 --- a/server/sonar-web/src/main/js/app/components/__tests__/ComponentContainer-test.tsx +++ b/server/sonar-web/src/main/js/app/components/__tests__/ComponentContainer-test.tsx @@ -17,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() })); diff --git a/server/sonar-web/src/main/js/app/components/nav/component/ComponentNavBranch.tsx b/server/sonar-web/src/main/js/app/components/nav/component/ComponentNavBranch.tsx index e3a27248da2..c062c716722 100644 --- a/server/sonar-web/src/main/js/app/components/nav/component/ComponentNavBranch.tsx +++ b/server/sonar-web/src/main/js/app/components/nav/component/ComponentNavBranch.tsx @@ -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 })); diff --git a/server/sonar-web/src/main/js/app/components/nav/component/ComponentNavBranchesMenu.tsx b/server/sonar-web/src/main/js/app/components/nav/component/ComponentNavBranchesMenu.tsx index e3f468d2dd0..a4d7899387b 100644 --- a/server/sonar-web/src/main/js/app/components/nav/component/ComponentNavBranchesMenu.tsx +++ b/server/sonar-web/src/main/js/app/components/nav/component/ComponentNavBranchesMenu.tsx @@ -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); } diff --git a/server/sonar-web/src/main/js/app/components/nav/component/ComponentNavMenu.tsx b/server/sonar-web/src/main/js/app/components/nav/component/ComponentNavMenu.tsx index 5f770db9ed4..ef2234c896d 100644 --- a/server/sonar-web/src/main/js/app/components/nav/component/ComponentNavMenu.tsx +++ b/server/sonar-web/src/main/js/app/components/nav/component/ComponentNavMenu.tsx @@ -127,7 +127,6 @@ export default class ComponentNavMenu extends React.PureComponent<Props> { } renderActivityLink() { - if (this.props.branch && isShortLivingBranch(this.props.branch)) { return null; } diff --git a/server/sonar-web/src/main/js/app/components/nav/component/__tests__/ComponentNav-test.tsx b/server/sonar-web/src/main/js/app/components/nav/component/__tests__/ComponentNav-test.tsx index 7db06bfa00c..9975e19bf06 100644 --- a/server/sonar-web/src/main/js/app/components/nav/component/__tests__/ComponentNav-test.tsx +++ b/server/sonar-web/src/main/js/app/components/nav/component/__tests__/ComponentNav-test.tsx @@ -17,20 +17,23 @@ * 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; } diff --git a/server/sonar-web/src/main/js/app/components/nav/component/__tests__/ComponentNavBgTaskNotif-test.tsx b/server/sonar-web/src/main/js/app/components/nav/component/__tests__/ComponentNavBgTaskNotif-test.tsx index 72e517426cc..e5441faa51f 100644 --- a/server/sonar-web/src/main/js/app/components/nav/component/__tests__/ComponentNavBgTaskNotif-test.tsx +++ b/server/sonar-web/src/main/js/app/components/nav/component/__tests__/ComponentNavBgTaskNotif-test.tsx @@ -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); diff --git a/server/sonar-web/src/main/js/apps/background-tasks/components/TaskActions.tsx b/server/sonar-web/src/main/js/apps/background-tasks/components/TaskActions.tsx index 748acacd729..285e7a4d50f 100644 --- a/server/sonar-web/src/main/js/apps/background-tasks/components/TaskActions.tsx +++ b/server/sonar-web/src/main/js/apps/background-tasks/components/TaskActions.tsx @@ -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) { diff --git a/server/sonar-web/src/main/js/apps/background-tasks/components/Workers.tsx b/server/sonar-web/src/main/js/apps/background-tasks/components/Workers.tsx index 9c51b4a9c10..87fa85e25e7 100644 --- a/server/sonar-web/src/main/js/apps/background-tasks/components/Workers.tsx +++ b/server/sonar-web/src/main/js/apps/background-tasks/components/Workers.tsx @@ -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 })); diff --git a/server/sonar-web/src/main/js/apps/background-tasks/components/__tests__/ScannerContext-test.tsx b/server/sonar-web/src/main/js/apps/background-tasks/components/__tests__/ScannerContext-test.tsx index af7194151d6..64cd98c8f77 100644 --- a/server/sonar-web/src/main/js/apps/background-tasks/components/__tests__/ScannerContext-test.tsx +++ b/server/sonar-web/src/main/js/apps/background-tasks/components/__tests__/ScannerContext-test.tsx @@ -17,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() })); diff --git a/server/sonar-web/src/main/js/apps/background-tasks/components/__tests__/Stacktrace-test.tsx b/server/sonar-web/src/main/js/apps/background-tasks/components/__tests__/Stacktrace-test.tsx index 979af8df09e..28bddab75a8 100644 --- a/server/sonar-web/src/main/js/apps/background-tasks/components/__tests__/Stacktrace-test.tsx +++ b/server/sonar-web/src/main/js/apps/background-tasks/components/__tests__/Stacktrace-test.tsx @@ -17,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() })); diff --git a/server/sonar-web/src/main/js/apps/background-tasks/components/__tests__/WorkersForm-test.tsx b/server/sonar-web/src/main/js/apps/background-tasks/components/__tests__/WorkersForm-test.tsx index 813eff21896..94bd72f7542 100644 --- a/server/sonar-web/src/main/js/apps/background-tasks/components/__tests__/WorkersForm-test.tsx +++ b/server/sonar-web/src/main/js/apps/background-tasks/components/__tests__/WorkersForm-test.tsx @@ -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() })); diff --git a/server/sonar-web/src/main/js/apps/code/components/App.tsx b/server/sonar-web/src/main/js/apps/code/components/App.tsx index aa773ae2177..2fd66d70ad7 100644 --- a/server/sonar-web/src/main/js/apps/code/components/App.tsx +++ b/server/sonar-web/src/main/js/apps/code/components/App.tsx @@ -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> diff --git a/server/sonar-web/src/main/js/apps/code/components/ComponentName.tsx b/server/sonar-web/src/main/js/apps/code/components/ComponentName.tsx index c0947e98ec0..65f855700ed 100644 --- a/server/sonar-web/src/main/js/apps/code/components/ComponentName.tsx +++ b/server/sonar-web/src/main/js/apps/code/components/ComponentName.tsx @@ -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 ? ( diff --git a/server/sonar-web/src/main/js/apps/issues/components/ComponentBreadcrumbs.tsx b/server/sonar-web/src/main/js/apps/issues/components/ComponentBreadcrumbs.tsx index 6e4b9a13805..b086fb5a125 100644 --- a/server/sonar-web/src/main/js/apps/issues/components/ComponentBreadcrumbs.tsx +++ b/server/sonar-web/src/main/js/apps/issues/components/ComponentBreadcrumbs.tsx @@ -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)} diff --git a/server/sonar-web/src/main/js/apps/portfolio/components/Activity.tsx b/server/sonar-web/src/main/js/apps/portfolio/components/Activity.tsx index 66cef7e572d..7816da08c76 100644 --- a/server/sonar-web/src/main/js/apps/portfolio/components/Activity.tsx +++ b/server/sonar-web/src/main/js/apps/portfolio/components/Activity.tsx @@ -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} diff --git a/server/sonar-web/src/main/js/apps/portfolio/components/App.tsx b/server/sonar-web/src/main/js/apps/portfolio/components/App.tsx index ec7f35fc0b2..7d3efb507bf 100644 --- a/server/sonar-web/src/main/js/apps/portfolio/components/App.tsx +++ b/server/sonar-web/src/main/js/apps/portfolio/components/App.tsx @@ -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} diff --git a/server/sonar-web/src/main/js/apps/portfolio/components/__tests__/Activity-test.tsx b/server/sonar-web/src/main/js/apps/portfolio/components/__tests__/Activity-test.tsx index 1959dc4daaf..e0fc5b8ff9d 100644 --- a/server/sonar-web/src/main/js/apps/portfolio/components/__tests__/Activity-test.tsx +++ b/server/sonar-web/src/main/js/apps/portfolio/components/__tests__/Activity-test.tsx @@ -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' diff --git a/server/sonar-web/src/main/js/apps/portfolio/components/__tests__/App-test.tsx b/server/sonar-web/src/main/js/apps/portfolio/components/__tests__/App-test.tsx index e9c93fb7279..0a894272da3 100644 --- a/server/sonar-web/src/main/js/apps/portfolio/components/__tests__/App-test.tsx +++ b/server/sonar-web/src/main/js/apps/portfolio/components/__tests__/App-test.tsx @@ -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; } diff --git a/server/sonar-web/src/main/js/apps/portfolio/components/__tests__/Report-test.tsx b/server/sonar-web/src/main/js/apps/portfolio/components/__tests__/Report-test.tsx index 1a21649ae06..7b725a0ee5e 100644 --- a/server/sonar-web/src/main/js/apps/portfolio/components/__tests__/Report-test.tsx +++ b/server/sonar-web/src/main/js/apps/portfolio/components/__tests__/Report-test.tsx @@ -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({})); diff --git a/server/sonar-web/src/main/js/apps/portfolio/components/__tests__/Subscription-test.tsx b/server/sonar-web/src/main/js/apps/portfolio/components/__tests__/Subscription-test.tsx index 4fa146bc940..003d49545a6 100644 --- a/server/sonar-web/src/main/js/apps/portfolio/components/__tests__/Subscription-test.tsx +++ b/server/sonar-web/src/main/js/apps/portfolio/components/__tests__/Subscription-test.tsx @@ -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()); diff --git a/server/sonar-web/src/main/js/apps/projectBranches/components/App.tsx b/server/sonar-web/src/main/js/apps/projectBranches/components/App.tsx index 5ff696ef9d7..19092afe655 100644 --- a/server/sonar-web/src/main/js/apps/projectBranches/components/App.tsx +++ b/server/sonar-web/src/main/js/apps/projectBranches/components/App.tsx @@ -18,15 +18,15 @@ * 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[]; diff --git a/server/sonar-web/src/main/js/apps/projectBranches/components/BranchRow.tsx b/server/sonar-web/src/main/js/apps/projectBranches/components/BranchRow.tsx index 3cbc25df9a4..5290f17718c 100644 --- a/server/sonar-web/src/main/js/apps/projectBranches/components/BranchRow.tsx +++ b/server/sonar-web/src/main/js/apps/projectBranches/components/BranchRow.tsx @@ -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'; diff --git a/server/sonar-web/src/main/js/apps/projectBranches/components/RenameBranchModal.tsx b/server/sonar-web/src/main/js/apps/projectBranches/components/RenameBranchModal.tsx index 181fee72365..02bd8572c9c 100644 --- a/server/sonar-web/src/main/js/apps/projectBranches/components/RenameBranchModal.tsx +++ b/server/sonar-web/src/main/js/apps/projectBranches/components/RenameBranchModal.tsx @@ -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> diff --git a/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/App-test.tsx b/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/App-test.tsx index 9ffafb34d72..166c8d4a99a 100644 --- a/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/App-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/App-test.tsx @@ -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([])) })); diff --git a/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/DeleteBranchModal-test.tsx b/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/DeleteBranchModal-test.tsx index b2870587114..c5455dbcac6 100644 --- a/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/DeleteBranchModal-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/DeleteBranchModal-test.tsx @@ -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'; diff --git a/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/LongBranchesPattern-test.tsx b/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/LongBranchesPattern-test.tsx index ff142d2065c..48c79f25fed 100644 --- a/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/LongBranchesPattern-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/LongBranchesPattern-test.tsx @@ -17,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')); diff --git a/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/RenameBranchModal-test.tsx b/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/RenameBranchModal-test.tsx index 3a1c962d68e..9c2b6602815 100644 --- a/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/RenameBranchModal-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/RenameBranchModal-test.tsx @@ -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'; diff --git a/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/SettingForm-test.tsx b/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/SettingForm-test.tsx index f74831cd522..60ffeb3fbb4 100644 --- a/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/SettingForm-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/SettingForm-test.tsx @@ -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()) diff --git a/server/sonar-web/src/main/js/apps/projectQualityGate/__tests__/App-test.tsx b/server/sonar-web/src/main/js/apps/projectQualityGate/__tests__/App-test.tsx index ac0d97d33d7..4fa2bc575af 100644 --- a/server/sonar-web/src/main/js/apps/projectQualityGate/__tests__/App-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectQualityGate/__tests__/App-test.tsx @@ -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()), diff --git a/server/sonar-web/src/main/js/apps/projectQualityProfiles/__tests__/App-test.tsx b/server/sonar-web/src/main/js/apps/projectQualityProfiles/__tests__/App-test.tsx index 2323bad9cfe..9e873f1187f 100644 --- a/server/sonar-web/src/main/js/apps/projectQualityProfiles/__tests__/App-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectQualityProfiles/__tests__/App-test.tsx @@ -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' }; diff --git a/server/sonar-web/src/main/js/apps/projectQualityProfiles/__tests__/Table-test.tsx b/server/sonar-web/src/main/js/apps/projectQualityProfiles/__tests__/Table-test.tsx index 84e70359fab..14b93b8fc10 100644 --- a/server/sonar-web/src/main/js/apps/projectQualityProfiles/__tests__/Table-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectQualityProfiles/__tests__/Table-test.tsx @@ -42,7 +42,7 @@ function randomProfile(key: string, language: string) { activeDeprecatedRuleCount: 0, key, name: key, - language: language, + language, languageName: language, organization: 'org' }; diff --git a/server/sonar-web/src/main/js/apps/projects/__tests__/utils-test.ts b/server/sonar-web/src/main/js/apps/projects/__tests__/utils-test.ts index e40971e373b..7f4330bbf52 100644 --- a/server/sonar-web/src/main/js/apps/projects/__tests__/utils-test.ts +++ b/server/sonar-web/src/main/js/apps/projects/__tests__/utils-test.ts @@ -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', () => { diff --git a/server/sonar-web/src/main/js/apps/projects/components/AllProjects.tsx b/server/sonar-web/src/main/js/apps/projects/components/AllProjects.tsx index 4181d618a10..65bdfac3f43 100644 --- a/server/sonar-web/src/main/js/apps/projects/components/AllProjects.tsx +++ b/server/sonar-web/src/main/js/apps/projects/components/AllProjects.tsx @@ -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> ); diff --git a/server/sonar-web/src/main/js/apps/projects/components/ProjectCardLanguages.tsx b/server/sonar-web/src/main/js/apps/projects/components/ProjectCardLanguages.tsx index 4bf823864e0..277a3b6eec8 100644 --- a/server/sonar-web/src/main/js/apps/projects/components/ProjectCardLanguages.tsx +++ b/server/sonar-web/src/main/js/apps/projects/components/ProjectCardLanguages.tsx @@ -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; } diff --git a/server/sonar-web/src/main/js/apps/projects/components/ProjectCardOverall.tsx b/server/sonar-web/src/main/js/apps/projects/components/ProjectCardOverall.tsx index 80ce9ceadb0..7dcae1fe7a2 100644 --- a/server/sonar-web/src/main/js/apps/projects/components/ProjectCardOverall.tsx +++ b/server/sonar-web/src/main/js/apps/projects/components/ProjectCardOverall.tsx @@ -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} diff --git a/server/sonar-web/src/main/js/apps/projects/components/ProjectCardOverallMeasures.tsx b/server/sonar-web/src/main/js/apps/projects/components/ProjectCardOverallMeasures.tsx index 8c3cdc978f2..5bba45518c1 100644 --- a/server/sonar-web/src/main/js/apps/projects/components/ProjectCardOverallMeasures.tsx +++ b/server/sonar-web/src/main/js/apps/projects/components/ProjectCardOverallMeasures.tsx @@ -34,7 +34,7 @@ interface Props { } export default function ProjectCardOverallMeasures({ measures }: Props) { - if (measures == undefined) { + if (measures === undefined) { return null; } diff --git a/server/sonar-web/src/main/js/apps/projects/components/__tests__/AllProjects-test.tsx b/server/sonar-web/src/main/js/apps/projects/components/__tests__/AllProjects-test.tsx index 5afb5f49874..c696b9509c9 100644 --- a/server/sonar-web/src/main/js/apps/projects/components/__tests__/AllProjects-test.tsx +++ b/server/sonar-web/src/main/js/apps/projects/components/__tests__/AllProjects-test.tsx @@ -17,19 +17,23 @@ * 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; } diff --git a/server/sonar-web/src/main/js/apps/projects/components/__tests__/DefaultPageSelector-test.tsx b/server/sonar-web/src/main/js/apps/projects/components/__tests__/DefaultPageSelector-test.tsx index ce03b94e0b3..b5d80b02f7e 100644 --- a/server/sonar-web/src/main/js/apps/projects/components/__tests__/DefaultPageSelector-test.tsx +++ b/server/sonar-web/src/main/js/apps/projects/components/__tests__/DefaultPageSelector-test.tsx @@ -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; } diff --git a/server/sonar-web/src/main/js/apps/projects/components/__tests__/FavoriteFilter-test.tsx b/server/sonar-web/src/main/js/apps/projects/components/__tests__/FavoriteFilter-test.tsx index b7971fb416a..658ee1ab158 100644 --- a/server/sonar-web/src/main/js/apps/projects/components/__tests__/FavoriteFilter-test.tsx +++ b/server/sonar-web/src/main/js/apps/projects/components/__tests__/FavoriteFilter-test.tsx @@ -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() diff --git a/server/sonar-web/src/main/js/apps/projects/filters/Filter.tsx b/server/sonar-web/src/main/js/apps/projects/filters/Filter.tsx index 2da7a189b2a..655dd4ce491 100644 --- a/server/sonar-web/src/main/js/apps/projects/filters/Filter.tsx +++ b/server/sonar-web/src/main/js/apps/projects/filters/Filter.tsx @@ -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 ( diff --git a/server/sonar-web/src/main/js/apps/projects/utils.ts b/server/sonar-web/src/main/js/apps/projects/utils.ts index c8f99c27b56..7ad9dd4e7c0 100644 --- a/server/sonar-web/src/main/js/apps/projects/utils.ts +++ b/server/sonar-web/src/main/js/apps/projects/utils.ts @@ -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; diff --git a/server/sonar-web/src/main/js/apps/projectsManagement/BulkApplyTemplateModal.tsx b/server/sonar-web/src/main/js/apps/projectsManagement/BulkApplyTemplateModal.tsx index 314988d7eed..3e81e28cb5c 100644 --- a/server/sonar-web/src/main/js/apps/projectsManagement/BulkApplyTemplateModal.tsx +++ b/server/sonar-web/src/main/js/apps/projectsManagement/BulkApplyTemplateModal.tsx @@ -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 }); } }, diff --git a/server/sonar-web/src/main/js/apps/projectsManagement/Search.tsx b/server/sonar-web/src/main/js/apps/projectsManagement/Search.tsx index d41a5c5e1bb..94318dbae7c 100644 --- a/server/sonar-web/src/main/js/apps/projectsManagement/Search.tsx +++ b/server/sonar-web/src/main/js/apps/projectsManagement/Search.tsx @@ -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'; diff --git a/server/sonar-web/src/main/js/apps/projectsManagement/__tests__/App-test.tsx b/server/sonar-web/src/main/js/apps/projectsManagement/__tests__/App-test.tsx index 0fb6b1d21d0..dadd3a45a1b 100644 --- a/server/sonar-web/src/main/js/apps/projectsManagement/__tests__/App-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectsManagement/__tests__/App-test.tsx @@ -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' }); diff --git a/server/sonar-web/src/main/js/apps/projectsManagement/__tests__/BulkApplyTemplateModal-test.tsx b/server/sonar-web/src/main/js/apps/projectsManagement/__tests__/BulkApplyTemplateModal-test.tsx index cdb33cf7f33..75368168411 100644 --- a/server/sonar-web/src/main/js/apps/projectsManagement/__tests__/BulkApplyTemplateModal-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectsManagement/__tests__/BulkApplyTemplateModal-test.tsx @@ -17,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: [] })) diff --git a/server/sonar-web/src/main/js/apps/projectsManagement/__tests__/CreateProjectForm-test.tsx b/server/sonar-web/src/main/js/apps/projectsManagement/__tests__/CreateProjectForm-test.tsx index bd8c3114b4e..c514345b78a 100644 --- a/server/sonar-web/src/main/js/apps/projectsManagement/__tests__/CreateProjectForm-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectsManagement/__tests__/CreateProjectForm-test.tsx @@ -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 } }) diff --git a/server/sonar-web/src/main/js/apps/projectsManagement/__tests__/DeleteModal-test.tsx b/server/sonar-web/src/main/js/apps/projectsManagement/__tests__/DeleteModal-test.tsx index 976be4403a8..d73e5306632 100644 --- a/server/sonar-web/src/main/js/apps/projectsManagement/__tests__/DeleteModal-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectsManagement/__tests__/DeleteModal-test.tsx @@ -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()) })); diff --git a/server/sonar-web/src/main/js/apps/projectsManagement/__tests__/Projects-test.tsx b/server/sonar-web/src/main/js/apps/projectsManagement/__tests__/Projects-test.tsx index 792e29ccc48..cc29a0e243d 100644 --- a/server/sonar-web/src/main/js/apps/projectsManagement/__tests__/Projects-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectsManagement/__tests__/Projects-test.tsx @@ -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'; diff --git a/server/sonar-web/src/main/js/apps/quality-profiles/components/ProfileContainer.tsx b/server/sonar-web/src/main/js/apps/quality-profiles/components/ProfileContainer.tsx index 1d16a885659..d159d8354a3 100644 --- a/server/sonar-web/src/main/js/apps/quality-profiles/components/ProfileContainer.tsx +++ b/server/sonar-web/src/main/js/apps/quality-profiles/components/ProfileContainer.tsx @@ -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>; } diff --git a/server/sonar-web/src/main/js/apps/quality-profiles/details/ProfilePermissionsForm.tsx b/server/sonar-web/src/main/js/apps/quality-profiles/details/ProfilePermissionsForm.tsx index fe94b38b03d..8d892127fc7 100644 --- a/server/sonar-web/src/main/js/apps/quality-profiles/details/ProfilePermissionsForm.tsx +++ b/server/sonar-web/src/main/js/apps/quality-profiles/details/ProfilePermissionsForm.tsx @@ -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); diff --git a/server/sonar-web/src/main/js/apps/quality-profiles/details/ProfilePermissionsFormSelect.tsx b/server/sonar-web/src/main/js/apps/quality-profiles/details/ProfilePermissionsFormSelect.tsx index e265206a49f..911bf55cca4 100644 --- a/server/sonar-web/src/main/js/apps/quality-profiles/details/ProfilePermissionsFormSelect.tsx +++ b/server/sonar-web/src/main/js/apps/quality-profiles/details/ProfilePermissionsFormSelect.tsx @@ -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) { diff --git a/server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissions-test.tsx b/server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissions-test.tsx index c61a60d83a8..fc13a173960 100644 --- a/server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissions-test.tsx +++ b/server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissions-test.tsx @@ -17,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([])) diff --git a/server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissionsForm-test.tsx b/server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissionsForm-test.tsx index 603967ba787..a71948cbbbd 100644 --- a/server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissionsForm-test.tsx +++ b/server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissionsForm-test.tsx @@ -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()) diff --git a/server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissionsFormSelect-test.tsx b/server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissionsFormSelect-test.tsx index 3483c66c085..7a029559e80 100644 --- a/server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissionsFormSelect-test.tsx +++ b/server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissionsFormSelect-test.tsx @@ -17,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); diff --git a/server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissionsGroup-test.tsx b/server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissionsGroup-test.tsx index d792b2c36bf..d9edeb1d1a1 100644 --- a/server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissionsGroup-test.tsx +++ b/server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissionsGroup-test.tsx @@ -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()) })); diff --git a/server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissionsUser-test.tsx b/server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissionsUser-test.tsx index 6fbd6f8ec9b..f2b26b8ce41 100644 --- a/server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissionsUser-test.tsx +++ b/server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissionsUser-test.tsx @@ -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()) })); diff --git a/server/sonar-web/src/main/js/apps/system/components/App.tsx b/server/sonar-web/src/main/js/apps/system/components/App.tsx index 2211ed17dd5..a8108bf1865 100644 --- a/server/sonar-web/src/main/js/apps/system/components/App.tsx +++ b/server/sonar-web/src/main/js/apps/system/components/App.tsx @@ -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(); diff --git a/server/sonar-web/src/main/js/apps/system/utils.ts b/server/sonar-web/src/main/js/apps/system/utils.ts index 7048439a678..7d6ccca5a0d 100644 --- a/server/sonar-web/src/main/js/apps/system/utils.ts +++ b/server/sonar-web/src/main/js/apps/system/utils.ts @@ -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; diff --git a/server/sonar-web/src/main/js/apps/web-api/components/WebApiApp.tsx b/server/sonar-web/src/main/js/apps/web-api/components/WebApiApp.tsx index ebc579d5ca5..8ddcd805b10 100644 --- a/server/sonar-web/src/main/js/apps/web-api/components/WebApiApp.tsx +++ b/server/sonar-web/src/main/js/apps/web-api/components/WebApiApp.tsx @@ -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(); diff --git a/server/sonar-web/src/main/js/apps/web-api/components/__tests__/Domain-test.tsx b/server/sonar-web/src/main/js/apps/web-api/components/__tests__/Domain-test.tsx index 4114f4944e0..539f425e8d4 100644 --- a/server/sonar-web/src/main/js/apps/web-api/components/__tests__/Domain-test.tsx +++ b/server/sonar-web/src/main/js/apps/web-api/components/__tests__/Domain-test.tsx @@ -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(); diff --git a/server/sonar-web/src/main/js/components/charts/bar-chart.js b/server/sonar-web/src/main/js/components/charts/bar-chart.js index 1548036d0c6..87786e6d9dd 100644 --- a/server/sonar-web/src/main/js/components/charts/bar-chart.js +++ b/server/sonar-web/src/main/js/components/charts/bar-chart.js @@ -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); }, diff --git a/server/sonar-web/src/main/js/components/common/SelectListItem.js b/server/sonar-web/src/main/js/components/common/SelectListItem.js index 0fa49725305..dd6e81957bb 100644 --- a/server/sonar-web/src/main/js/components/common/SelectListItem.js +++ b/server/sonar-web/src/main/js/components/common/SelectListItem.js @@ -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 ( diff --git a/server/sonar-web/src/main/js/components/controls/DateInput.tsx b/server/sonar-web/src/main/js/components/controls/DateInput.tsx index 5a0c0911f61..265643354e6 100644 --- a/server/sonar-web/src/main/js/components/controls/DateInput.tsx +++ b/server/sonar-web/src/main/js/components/controls/DateInput.tsx @@ -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> diff --git a/server/sonar-web/src/main/js/components/intl/DateFormatter.tsx b/server/sonar-web/src/main/js/components/intl/DateFormatter.tsx index 91670a3c895..9c12362ba9d 100644 --- a/server/sonar-web/src/main/js/components/intl/DateFormatter.tsx +++ b/server/sonar-web/src/main/js/components/intl/DateFormatter.tsx @@ -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> ); } diff --git a/server/sonar-web/src/main/js/components/intl/DateFromNow.tsx b/server/sonar-web/src/main/js/components/intl/DateFromNow.tsx index ce2adea2a94..3e600273471 100644 --- a/server/sonar-web/src/main/js/components/intl/DateFromNow.tsx +++ b/server/sonar-web/src/main/js/components/intl/DateFromNow.tsx @@ -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>; } diff --git a/server/sonar-web/src/main/js/components/intl/DateTimeFormatter.tsx b/server/sonar-web/src/main/js/components/intl/DateTimeFormatter.tsx index 9d9c1bcd03c..c26c72f4010 100644 --- a/server/sonar-web/src/main/js/components/intl/DateTimeFormatter.tsx +++ b/server/sonar-web/src/main/js/components/intl/DateTimeFormatter.tsx @@ -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> + ); } diff --git a/server/sonar-web/src/main/js/components/intl/TimeFormatter.tsx b/server/sonar-web/src/main/js/components/intl/TimeFormatter.tsx index efa15fc38a0..e6324cb6b01 100644 --- a/server/sonar-web/src/main/js/components/intl/TimeFormatter.tsx +++ b/server/sonar-web/src/main/js/components/intl/TimeFormatter.tsx @@ -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> ); } diff --git a/server/sonar-web/src/main/js/components/measure/Measure.tsx b/server/sonar-web/src/main/js/components/measure/Measure.tsx index e52c12a7512..cb9a85aab5e 100644 --- a/server/sonar-web/src/main/js/components/measure/Measure.tsx +++ b/server/sonar-web/src/main/js/components/measure/Measure.tsx @@ -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>; } diff --git a/server/sonar-web/src/main/js/components/measure/__tests__/Measure-test.tsx b/server/sonar-web/src/main/js/components/measure/__tests__/Measure-test.tsx index 5eb0a6efa3e..80f2e31efab 100644 --- a/server/sonar-web/src/main/js/components/measure/__tests__/Measure-test.tsx +++ b/server/sonar-web/src/main/js/components/measure/__tests__/Measure-test.tsx @@ -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'); diff --git a/server/sonar-web/src/main/js/components/ui/Rating.tsx b/server/sonar-web/src/main/js/components/ui/Rating.tsx index 183994c7eae..1225efed716 100644 --- a/server/sonar-web/src/main/js/components/ui/Rating.tsx +++ b/server/sonar-web/src/main/js/components/ui/Rating.tsx @@ -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'); diff --git a/server/sonar-web/src/main/js/helpers/issues.ts b/server/sonar-web/src/main/js/helpers/issues.ts index efa8b272af6..33f8792bab6 100644 --- a/server/sonar-web/src/main/js/helpers/issues.ts +++ b/server/sonar-web/src/main/js/helpers/issues.ts @@ -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 => { diff --git a/server/sonar-web/src/main/js/helpers/l10n.ts b/server/sonar-web/src/main/js/helpers/l10n.ts index a6598790266..aa54768bea1 100644 --- a/server/sonar-web/src/main/js/helpers/l10n.ts +++ b/server/sonar-web/src/main/js/helpers/l10n.ts @@ -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('.')}`; diff --git a/server/sonar-web/src/main/js/helpers/measures.ts b/server/sonar-web/src/main/js/helpers/measures.ts index 8c200a239ac..c0e89838f59 100644 --- a/server/sonar-web/src/main/js/helpers/measures.ts +++ b/server/sonar-web/src/main/js/helpers/measures.ts @@ -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'; diff --git a/server/sonar-web/tsconfig.json b/server/sonar-web/tsconfig.json index 8186016873d..427192d12e7 100644 --- a/server/sonar-web/tsconfig.json +++ b/server/sonar-web/tsconfig.json @@ -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"] diff --git a/server/sonar-web/yarn.lock b/server/sonar-web/yarn.lock index 5d70c6f3d03..b5e611c2c9b 100644 --- a/server/sonar-web/yarn.lock +++ b/server/sonar-web/yarn.lock @@ -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" |