Browse Source

use eslint for typescript, update eslint configuration (#2742)

tags/7.0-RC1
Stas Vilchik 6 years ago
parent
commit
3aeea07185
78 changed files with 547 additions and 561 deletions
  1. 169
    164
      server/sonar-web/.eslintrc
  2. 8
    8
      server/sonar-web/package.json
  3. 6
    2
      server/sonar-web/src/main/js/app/components/App.tsx
  4. 1
    0
      server/sonar-web/src/main/js/app/components/__tests__/ComponentContainer-test.tsx
  5. 11
    7
      server/sonar-web/src/main/js/app/components/nav/component/ComponentNavBranch.tsx
  6. 5
    1
      server/sonar-web/src/main/js/app/components/nav/component/ComponentNavBranchesMenu.tsx
  7. 0
    1
      server/sonar-web/src/main/js/app/components/nav/component/ComponentNavMenu.tsx
  8. 4
    1
      server/sonar-web/src/main/js/app/components/nav/component/__tests__/ComponentNav-test.tsx
  9. 1
    0
      server/sonar-web/src/main/js/app/components/nav/component/__tests__/ComponentNavBgTaskNotif-test.tsx
  10. 2
    2
      server/sonar-web/src/main/js/apps/background-tasks/components/TaskActions.tsx
  11. 1
    1
      server/sonar-web/src/main/js/apps/background-tasks/components/Workers.tsx
  12. 1
    0
      server/sonar-web/src/main/js/apps/background-tasks/components/__tests__/ScannerContext-test.tsx
  13. 1
    0
      server/sonar-web/src/main/js/apps/background-tasks/components/__tests__/Stacktrace-test.tsx
  14. 1
    0
      server/sonar-web/src/main/js/apps/background-tasks/components/__tests__/WorkersForm-test.tsx
  15. 5
    5
      server/sonar-web/src/main/js/apps/code/components/App.tsx
  16. 1
    1
      server/sonar-web/src/main/js/apps/code/components/ComponentName.tsx
  17. 2
    2
      server/sonar-web/src/main/js/apps/issues/components/ComponentBreadcrumbs.tsx
  18. 2
    2
      server/sonar-web/src/main/js/apps/portfolio/components/Activity.tsx
  19. 4
    4
      server/sonar-web/src/main/js/apps/portfolio/components/App.tsx
  20. 1
    0
      server/sonar-web/src/main/js/apps/portfolio/components/__tests__/Activity-test.tsx
  21. 3
    0
      server/sonar-web/src/main/js/apps/portfolio/components/__tests__/App-test.tsx
  22. 1
    0
      server/sonar-web/src/main/js/apps/portfolio/components/__tests__/Report-test.tsx
  23. 1
    0
      server/sonar-web/src/main/js/apps/portfolio/components/__tests__/Subscription-test.tsx
  24. 2
    2
      server/sonar-web/src/main/js/apps/projectBranches/components/App.tsx
  25. 1
    1
      server/sonar-web/src/main/js/apps/projectBranches/components/BranchRow.tsx
  26. 1
    1
      server/sonar-web/src/main/js/apps/projectBranches/components/RenameBranchModal.tsx
  27. 1
    0
      server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/App-test.tsx
  28. 1
    0
      server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/DeleteBranchModal-test.tsx
  29. 2
    1
      server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/LongBranchesPattern-test.tsx
  30. 1
    0
      server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/RenameBranchModal-test.tsx
  31. 1
    0
      server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/SettingForm-test.tsx
  32. 1
    0
      server/sonar-web/src/main/js/apps/projectQualityGate/__tests__/App-test.tsx
  33. 2
    1
      server/sonar-web/src/main/js/apps/projectQualityProfiles/__tests__/App-test.tsx
  34. 1
    1
      server/sonar-web/src/main/js/apps/projectQualityProfiles/__tests__/Table-test.tsx
  35. 1
    0
      server/sonar-web/src/main/js/apps/projects/__tests__/utils-test.ts
  36. 8
    4
      server/sonar-web/src/main/js/apps/projects/components/AllProjects.tsx
  37. 1
    1
      server/sonar-web/src/main/js/apps/projects/components/ProjectCardLanguages.tsx
  38. 1
    1
      server/sonar-web/src/main/js/apps/projects/components/ProjectCardOverall.tsx
  39. 1
    1
      server/sonar-web/src/main/js/apps/projects/components/ProjectCardOverallMeasures.tsx
  40. 4
    0
      server/sonar-web/src/main/js/apps/projects/components/__tests__/AllProjects-test.tsx
  41. 2
    0
      server/sonar-web/src/main/js/apps/projects/components/__tests__/DefaultPageSelector-test.tsx
  42. 1
    0
      server/sonar-web/src/main/js/apps/projects/components/__tests__/FavoriteFilter-test.tsx
  43. 1
    1
      server/sonar-web/src/main/js/apps/projects/filters/Filter.tsx
  44. 2
    2
      server/sonar-web/src/main/js/apps/projects/utils.ts
  45. 1
    1
      server/sonar-web/src/main/js/apps/projectsManagement/BulkApplyTemplateModal.tsx
  46. 1
    2
      server/sonar-web/src/main/js/apps/projectsManagement/Search.tsx
  47. 3
    1
      server/sonar-web/src/main/js/apps/projectsManagement/__tests__/App-test.tsx
  48. 1
    0
      server/sonar-web/src/main/js/apps/projectsManagement/__tests__/BulkApplyTemplateModal-test.tsx
  49. 1
    0
      server/sonar-web/src/main/js/apps/projectsManagement/__tests__/CreateProjectForm-test.tsx
  50. 1
    0
      server/sonar-web/src/main/js/apps/projectsManagement/__tests__/DeleteModal-test.tsx
  51. 1
    0
      server/sonar-web/src/main/js/apps/projectsManagement/__tests__/Projects-test.tsx
  52. 1
    1
      server/sonar-web/src/main/js/apps/quality-profiles/components/ProfileContainer.tsx
  53. 1
    1
      server/sonar-web/src/main/js/apps/quality-profiles/details/ProfilePermissionsForm.tsx
  54. 1
    1
      server/sonar-web/src/main/js/apps/quality-profiles/details/ProfilePermissionsFormSelect.tsx
  55. 1
    0
      server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissions-test.tsx
  56. 1
    0
      server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissionsForm-test.tsx
  57. 1
    0
      server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissionsFormSelect-test.tsx
  58. 1
    0
      server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissionsGroup-test.tsx
  59. 1
    0
      server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissionsUser-test.tsx
  60. 5
    1
      server/sonar-web/src/main/js/apps/system/components/App.tsx
  61. 3
    3
      server/sonar-web/src/main/js/apps/system/utils.ts
  62. 10
    6
      server/sonar-web/src/main/js/apps/web-api/components/WebApiApp.tsx
  63. 2
    2
      server/sonar-web/src/main/js/apps/web-api/components/__tests__/Domain-test.tsx
  64. 4
    4
      server/sonar-web/src/main/js/components/charts/bar-chart.js
  65. 1
    1
      server/sonar-web/src/main/js/components/common/SelectListItem.js
  66. 1
    1
      server/sonar-web/src/main/js/components/controls/DateInput.tsx
  67. 3
    5
      server/sonar-web/src/main/js/components/intl/DateFormatter.tsx
  68. 1
    1
      server/sonar-web/src/main/js/components/intl/DateFromNow.tsx
  69. 5
    1
      server/sonar-web/src/main/js/components/intl/DateTimeFormatter.tsx
  70. 3
    5
      server/sonar-web/src/main/js/components/intl/TimeFormatter.tsx
  71. 2
    2
      server/sonar-web/src/main/js/components/measure/Measure.tsx
  72. 1
    0
      server/sonar-web/src/main/js/components/measure/__tests__/Measure-test.tsx
  73. 1
    1
      server/sonar-web/src/main/js/components/ui/Rating.tsx
  74. 1
    1
      server/sonar-web/src/main/js/helpers/issues.ts
  75. 2
    0
      server/sonar-web/src/main/js/helpers/l10n.ts
  76. 3
    3
      server/sonar-web/src/main/js/helpers/measures.ts
  77. 1
    3
      server/sonar-web/tsconfig.json
  78. 214
    296
      server/sonar-web/yarn.lock

+ 169
- 164
server/sonar-web/.eslintrc View File

@@ -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$"]
}
}

+ 8
- 8
server/sonar-web/package.json View File

@@ -67,7 +67,6 @@
"autoprefixer": "7.1.1",
"awesome-typescript-loader": "3.2.3",
"babel-core": "^6.22.1",
"babel-eslint": "7.2.3",
"babel-jest": "20.0.3",
"babel-loader": "7.0.0",
"babel-plugin-dynamic-import-node": "1.0.2",
@@ -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"
},

+ 6
- 2
server/sonar-web/src/main/js/app/components/App.tsx View File

@@ -40,7 +40,6 @@ interface State {

class App extends React.PureComponent<Props, State> {
mounted: boolean;
state: State = { branchesEnabled: false, canAdmin: false, loading: true, onSonarCloud: false };

static childContextTypes = {
branchesEnabled: PropTypes.bool.isRequired,
@@ -48,6 +47,11 @@ class App extends React.PureComponent<Props, State> {
onSonarCloud: PropTypes.bool
};

constructor(props: Props) {
super(props);
this.state = { branchesEnabled: false, canAdmin: false, loading: true, onSonarCloud: false };
}

getChildContext() {
return {
branchesEnabled: this.state.branchesEnabled,
@@ -73,7 +77,7 @@ class App extends React.PureComponent<Props, State> {
return this.props.fetchAppState().then(appState => {
if (this.mounted) {
const onSonarCloud =
appState.settings != undefined &&
appState.settings !== undefined &&
appState.settings['sonar.sonarcloud.enabled'] === 'true';
this.setState({
branchesEnabled: appState.branchesEnabled,

+ 1
- 0
server/sonar-web/src/main/js/app/components/__tests__/ComponentContainer-test.tsx View File

@@ -17,6 +17,7 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/* eslint-disable import/first */
jest.mock('../../../api/branches', () => ({ getBranches: jest.fn() }));
jest.mock('../../../api/components', () => ({ getComponentData: jest.fn() }));
jest.mock('../../../api/nav', () => ({ getComponentNavigation: jest.fn() }));

+ 11
- 7
server/sonar-web/src/main/js/app/components/nav/component/ComponentNavBranch.tsx View File

@@ -46,17 +46,21 @@ interface State {

export default class ComponentNavBranch extends React.PureComponent<Props, State> {
mounted: boolean;
state: State = {
dropdownOpen: false,
noBranchSupportPopupOpen: false,
singleBranchPopupOpen: false
};

static contextTypes = {
branchesEnabled: PropTypes.bool.isRequired,
onSonarCloud: PropTypes.bool
};

constructor(props: Props) {
super(props);
this.state = {
dropdownOpen: false,
noBranchSupportPopupOpen: false,
singleBranchPopupOpen: false
};
}

componentDidMount() {
this.mounted = true;
}
@@ -94,7 +98,7 @@ export default class ComponentNavBranch extends React.PureComponent<Props, State
};

toggleSingleBranchPopup = (show?: boolean) => {
if (show != undefined) {
if (show !== undefined) {
this.setState({ singleBranchPopupOpen: show });
} else {
this.setState(state => ({ singleBranchPopupOpen: !state.singleBranchPopupOpen }));
@@ -102,7 +106,7 @@ export default class ComponentNavBranch extends React.PureComponent<Props, State
};

toggleNoBranchSupportPopup = (show?: boolean) => {
if (show != undefined) {
if (show !== undefined) {
this.setState({ noBranchSupportPopupOpen: show });
} else {
this.setState(state => ({ noBranchSupportPopupOpen: !state.noBranchSupportPopupOpen }));

+ 5
- 1
server/sonar-web/src/main/js/app/components/nav/component/ComponentNavBranchesMenu.tsx View File

@@ -46,12 +46,16 @@ interface State {

export default class ComponentNavBranchesMenu extends React.PureComponent<Props, State> {
private node: HTMLElement | null;
state = { query: '', selected: null };

static contextTypes = {
router: PropTypes.object
};

constructor(props: Props) {
super(props);
this.state = { query: '', selected: null };
}

componentDidMount() {
window.addEventListener('click', this.handleClickOutside);
}

+ 0
- 1
server/sonar-web/src/main/js/app/components/nav/component/ComponentNavMenu.tsx View File

@@ -127,7 +127,6 @@ export default class ComponentNavMenu extends React.PureComponent<Props> {
}

renderActivityLink() {

if (this.props.branch && isShortLivingBranch(this.props.branch)) {
return null;
}

+ 4
- 1
server/sonar-web/src/main/js/app/components/nav/component/__tests__/ComponentNav-test.tsx View File

@@ -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;
}

+ 1
- 0
server/sonar-web/src/main/js/app/components/nav/component/__tests__/ComponentNavBgTaskNotif-test.tsx View File

@@ -17,6 +17,7 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/* eslint-disable import/first */
jest.mock('../../../../../helpers/l10n', () => {
const l10n = require.requireActual('../../../../../helpers/l10n');
l10n.hasMessage = jest.fn(() => true);

+ 2
- 2
server/sonar-web/src/main/js/apps/background-tasks/components/TaskActions.tsx View File

@@ -69,9 +69,9 @@ export default class TaskActions extends React.PureComponent<Props, State> {
render() {
const { component, task } = this.props;

const canFilter = component == undefined;
const canFilter = component === undefined;
const canCancel = task.status === STATUSES.PENDING;
const canShowStacktrace = task.errorMessage != undefined;
const canShowStacktrace = task.errorMessage !== undefined;
const hasActions = canFilter || canCancel || task.hasScannerContext || canShowStacktrace;

if (!hasActions) {

+ 1
- 1
server/sonar-web/src/main/js/apps/background-tasks/components/Workers.tsx View File

@@ -83,7 +83,7 @@ export default class Workers extends React.PureComponent<{}, State> {
};

toggleNoSupportPopup = (show?: boolean) => {
if (show != undefined) {
if (show !== undefined) {
this.setState({ noSupportPopup: show });
} else {
this.setState(state => ({ noSupportPopup: !state.noSupportPopup }));

+ 1
- 0
server/sonar-web/src/main/js/apps/background-tasks/components/__tests__/ScannerContext-test.tsx View File

@@ -17,6 +17,7 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/* eslint-disable import/first, import/order */
jest.mock('../../../../api/ce', () => ({
getTask: jest.fn()
}));

+ 1
- 0
server/sonar-web/src/main/js/apps/background-tasks/components/__tests__/Stacktrace-test.tsx View File

@@ -17,6 +17,7 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/* eslint-disable import/first, import/order */
jest.mock('../../../../api/ce', () => ({
getTask: jest.fn()
}));

+ 1
- 0
server/sonar-web/src/main/js/apps/background-tasks/components/__tests__/WorkersForm-test.tsx View File

@@ -17,6 +17,7 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/* eslint-disable import/first, import/order */
jest.mock('../../../../api/ce', () => ({
setWorkerCount: () => Promise.resolve()
}));

+ 5
- 5
server/sonar-web/src/main/js/apps/code/components/App.tsx View File

@@ -222,8 +222,8 @@ export default class App extends React.PureComponent<Props, State> {
<Breadcrumbs branch={branchName} breadcrumbs={breadcrumbs} rootComponent={component} />
)}

{sourceViewer == undefined &&
components != undefined && (
{sourceViewer === undefined &&
components !== undefined && (
<div className={componentsClassName}>
<Components
baseComponent={baseComponent}
@@ -234,12 +234,12 @@ export default class App extends React.PureComponent<Props, State> {
</div>
)}

{sourceViewer == undefined &&
components != undefined && (
{sourceViewer === undefined &&
components !== undefined && (
<ListFooter count={components.length} total={total} loadMore={this.handleLoadMore} />
)}

{sourceViewer != undefined && (
{sourceViewer !== undefined && (
<div className="spacer-top">
<SourceViewer branch={branchName} component={sourceViewer.key} />
</div>

+ 1
- 1
server/sonar-web/src/main/js/apps/code/components/ComponentName.tsx View File

@@ -59,7 +59,7 @@ export default function ComponentName(props: Props) {
const { branch, component, rootComponent, previous, canBrowse = false } = props;
const areBothDirs = component.qualifier === 'DIR' && previous && previous.qualifier === 'DIR';
const prefix =
areBothDirs && previous != undefined
areBothDirs && previous !== undefined
? mostCommitPrefix([component.name + '/', previous.name + '/'])
: '';
const name = prefix ? (

+ 2
- 2
server/sonar-web/src/main/js/apps/issues/components/ComponentBreadcrumbs.tsx View File

@@ -61,8 +61,8 @@ export default function ComponentBreadcrumbs({ branch, component, issue, organiz
)}

{displaySubProject &&
issue.subProject != undefined &&
issue.subProjectName != undefined && (
issue.subProject !== undefined &&
issue.subProjectName !== undefined && (
<span title={issue.subProjectName}>
<Link to={getProjectUrl(issue.subProject, branch)} className="link-no-underline">
{limitComponentName(issue.subProjectName)}

+ 2
- 2
server/sonar-web/src/main/js/apps/portfolio/components/Activity.tsx View File

@@ -103,8 +103,8 @@ export default class Activity extends React.PureComponent<Props> {
{this.state.loading ? (
<i className="spinner" />
) : (
this.state.metrics != undefined &&
this.state.history != undefined && (
this.state.metrics !== undefined &&
this.state.history !== undefined && (
<AnyPreviewGraph
history={this.state.history}
metrics={this.state.metrics}

+ 4
- 4
server/sonar-web/src/main/js/apps/portfolio/components/App.tsx View File

@@ -98,10 +98,10 @@ export default class App extends React.PureComponent<Props, State> {
);
}

isEmpty = () => this.state.measures == undefined || this.state.measures['ncloc'] == undefined;
isEmpty = () => this.state.measures === undefined || this.state.measures['ncloc'] === undefined;

isNotComputed = () =>
this.state.measures && this.state.measures['reliability_rating'] == undefined;
this.state.measures && this.state.measures['reliability_rating'] === undefined;

renderSpinner() {
return (
@@ -151,8 +151,8 @@ export default class App extends React.PureComponent<Props, State> {
<MaintainabilityBox component={component.key} measures={measures!} />
</div>

{subComponents != undefined &&
totalSubComponents != undefined && (
{subComponents !== undefined &&
totalSubComponents !== undefined && (
<WorstProjects
component={component.key}
subComponents={subComponents}

+ 1
- 0
server/sonar-web/src/main/js/apps/portfolio/components/__tests__/Activity-test.tsx View File

@@ -17,6 +17,7 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/* eslint-disable import/first, import/order */
jest.mock('../../../../helpers/storage', () => ({
getCustomGraph: () => ['coverage'],
getGraph: () => 'custom'

+ 3
- 0
server/sonar-web/src/main/js/apps/portfolio/components/__tests__/App-test.tsx View File

@@ -17,6 +17,7 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/* eslint-disable import/first, import/order */
jest.mock('../../../../api/measures', () => ({
getMeasures: jest.fn(() => Promise.resolve([]))
}));
@@ -27,12 +28,14 @@ jest.mock('../../../../api/components', () => ({

// mock Activity to not deal with localstorage
jest.mock('../Activity', () => ({
// eslint-disable-next-line
default: function Activity() {
return null;
}
}));

jest.mock('../Report', () => ({
// eslint-disable-next-line
default: function Report() {
return null;
}

+ 1
- 0
server/sonar-web/src/main/js/apps/portfolio/components/__tests__/Report-test.tsx View File

@@ -17,6 +17,7 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/* eslint-disable import/first, import/order */
jest.mock('../../../../api/report', () => {
const report = require.requireActual('../../../../api/report');
report.getReportStatus = jest.fn(() => Promise.resolve({}));

+ 1
- 0
server/sonar-web/src/main/js/apps/portfolio/components/__tests__/Subscription-test.tsx View File

@@ -17,6 +17,7 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/* eslint-disable import/first, import/order */
jest.mock('../../../../api/report', () => {
const report = require.requireActual('../../../../api/report');
report.subscribe = jest.fn(() => Promise.resolve());

+ 2
- 2
server/sonar-web/src/main/js/apps/projectBranches/components/App.tsx View File

@@ -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[];

+ 1
- 1
server/sonar-web/src/main/js/apps/projectBranches/components/BranchRow.tsx View File

@@ -18,8 +18,8 @@
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
import * as React from 'react';
import { Branch } from '../../../app/types';
import * as classNames from 'classnames';
import { Branch } from '../../../app/types';
import DeleteBranchModal from './DeleteBranchModal';
import LeakPeriodForm from './LeakPeriodForm';
import BranchStatus from '../../../components/common/BranchStatus';

+ 1
- 1
server/sonar-web/src/main/js/apps/projectBranches/components/RenameBranchModal.tsx View File

@@ -109,7 +109,7 @@ export default class RenameBranchModal extends React.PureComponent<Props, State>
required={true}
size={50}
type="text"
value={this.state.name != undefined ? this.state.name : branch.name}
value={this.state.name !== undefined ? this.state.name : branch.name}
/>
</div>
</div>

+ 1
- 0
server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/App-test.tsx View File

@@ -17,6 +17,7 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/* eslint-disable import/first, import/order */
jest.mock('../../../../api/settings', () => ({
getValues: jest.fn(() => Promise.resolve([]))
}));

+ 1
- 0
server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/DeleteBranchModal-test.tsx View File

@@ -17,6 +17,7 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/* eslint-disable import/first */
jest.mock('../../../../api/branches', () => ({ deleteBranch: jest.fn() }));

import * as React from 'react';

+ 2
- 1
server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/LongBranchesPattern-test.tsx View File

@@ -17,6 +17,7 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/* eslint-disable import/first, import/order */
jest.mock('../../../../api/settings', () => ({
getValues: jest.fn(() => Promise.resolve([]))
}));
@@ -40,7 +41,7 @@ it('renders', () => {

it('opens form', () => {
const wrapper = shallow(<LongBranchesPattern project="project" />);
(wrapper.instance() as LongBranchesPattern) .mounted = true;
(wrapper.instance() as LongBranchesPattern).mounted = true;
wrapper.setState({ loading: false, setting: { value: 'release-.*' } });

click(wrapper.find('a'));

+ 1
- 0
server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/RenameBranchModal-test.tsx View File

@@ -17,6 +17,7 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/* eslint-disable import/first */
jest.mock('../../../../api/branches', () => ({ renameBranch: jest.fn() }));

import * as React from 'react';

+ 1
- 0
server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/SettingForm-test.tsx View File

@@ -17,6 +17,7 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/* eslint-disable import/first, import/order */
jest.mock('../../../../api/settings', () => ({
setSimpleSettingValue: jest.fn(() => Promise.resolve()),
resetSettingValue: jest.fn(() => Promise.resolve())

+ 1
- 0
server/sonar-web/src/main/js/apps/projectQualityGate/__tests__/App-test.tsx View File

@@ -17,6 +17,7 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/* eslint-disable import/first, import/order */
jest.mock('../../../api/quality-gates', () => ({
associateGateWithProject: jest.fn(() => Promise.resolve()),
dissociateGateWithProject: jest.fn(() => Promise.resolve()),

+ 2
- 1
server/sonar-web/src/main/js/apps/projectQualityProfiles/__tests__/App-test.tsx View File

@@ -17,6 +17,7 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/* eslint-disable import/first, import/order */
jest.mock('../../../api/quality-profiles', () => ({
associateProject: jest.fn(() => Promise.resolve()),
dissociateProject: jest.fn(() => Promise.resolve()),
@@ -116,7 +117,7 @@ function randomProfile(key: string, language: string, isDefault = false) {
isDefault,
key,
name: key,
language: language,
language,
languageName: language,
organization: 'org'
};

+ 1
- 1
server/sonar-web/src/main/js/apps/projectQualityProfiles/__tests__/Table-test.tsx View File

@@ -42,7 +42,7 @@ function randomProfile(key: string, language: string) {
activeDeprecatedRuleCount: 0,
key,
name: key,
language: language,
language,
languageName: language,
organization: 'org'
};

+ 1
- 0
server/sonar-web/src/main/js/apps/projects/__tests__/utils-test.ts View File

@@ -49,6 +49,7 @@ describe('cumulativeMapFacetValues', () => {
{ val: '4', count: 2 },
{ val: '5', count: 0 }
])
// eslint-disable-next-line
).toEqual({ '1': 50, '2': 9, '3': 8, '4': 2, '5': 0 });
});
it('should correctly cumulate facets with NO_DATA items', () => {

+ 8
- 4
server/sonar-web/src/main/js/apps/projects/components/AllProjects.tsx View File

@@ -51,7 +51,6 @@ interface State {

export default class AllProjects extends React.PureComponent<Props, State> {
mounted: boolean;
state: State = { loading: true, query: {} };

static contextTypes = {
currentUser: PropTypes.object.isRequired,
@@ -59,6 +58,11 @@ export default class AllProjects extends React.PureComponent<Props, State> {
router: PropTypes.object.isRequired
};

constructor(props: Props) {
super(props);
this.state = { loading: true, query: {} };
}

componentDidMount() {
this.mounted = true;
if (this.props.isFavorite && !this.context.currentUser.isLoggedIn) {
@@ -88,7 +92,7 @@ export default class AllProjects extends React.PureComponent<Props, State> {

getSort = () => this.state.query.sort || 'name';

isFiltered = () => Object.values(this.state.query).some(value => value != undefined);
isFiltered = () => Object.values(this.state.query).some(value => value !== undefined);

stopLoading = () => {
if (this.mounted) {
@@ -280,10 +284,10 @@ export default class AllProjects extends React.PureComponent<Props, State> {
/>
)}
<ListFooter
count={this.state.projects != undefined ? this.state.projects.length : 0}
count={this.state.projects !== undefined ? this.state.projects.length : 0}
loadMore={this.fetchMoreProjects}
ready={!this.state.loading}
total={this.state.total != undefined ? this.state.total : 0}
total={this.state.total !== undefined ? this.state.total : 0}
/>
</div>
);

+ 1
- 1
server/sonar-web/src/main/js/apps/projects/components/ProjectCardLanguages.tsx View File

@@ -37,7 +37,7 @@ export default class ProjectCardLanguages extends React.PureComponent<Props> {
};

render() {
if (this.props.distribution == undefined) {
if (this.props.distribution === undefined) {
return null;
}


+ 1
- 1
server/sonar-web/src/main/js/apps/projects/components/ProjectCardOverall.tsx View File

@@ -43,7 +43,7 @@ export default function ProjectCardOverall({ organization, project }: Props) {
return (
<div data-key={project.key} className="boxed-group project-card">
<div className="boxed-group-header clearfix">
{project.isFavorite != undefined && (
{project.isFavorite !== undefined && (
<Favorite
className="spacer-right"
component={project.key}

+ 1
- 1
server/sonar-web/src/main/js/apps/projects/components/ProjectCardOverallMeasures.tsx View File

@@ -34,7 +34,7 @@ interface Props {
}

export default function ProjectCardOverallMeasures({ measures }: Props) {
if (measures == undefined) {
if (measures === undefined) {
return null;
}


+ 4
- 0
server/sonar-web/src/main/js/apps/projects/components/__tests__/AllProjects-test.tsx View File

@@ -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;
}

+ 2
- 0
server/sonar-web/src/main/js/apps/projects/components/__tests__/DefaultPageSelector-test.tsx View File

@@ -17,7 +17,9 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/* eslint-disable import/first, import/order */
jest.mock('../AllProjects', () => ({
// eslint-disable-next-line
default: function AllProjects() {
return null;
}

+ 1
- 0
server/sonar-web/src/main/js/apps/projects/components/__tests__/FavoriteFilter-test.tsx View File

@@ -17,6 +17,7 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/* eslint-disable import/first */
jest.mock('../../../../helpers/storage', () => ({
saveAll: jest.fn(),
saveFavorite: jest.fn()

+ 1
- 1
server/sonar-web/src/main/js/apps/projects/filters/Filter.tsx View File

@@ -85,7 +85,7 @@ export default class Filter extends React.PureComponent<Props> {
}

renderOptionBar(facetValue: number | undefined) {
if (facetValue == undefined || !this.props.maxFacetValue) {
if (facetValue === undefined || !this.props.maxFacetValue) {
return null;
}
return (

+ 2
- 2
server/sonar-web/src/main/js/apps/projects/utils.ts View File

@@ -198,7 +198,7 @@ export function fetchProjects(
const value = isDiffMetric(measure.metric)
? getPeriodValue(measure, 1)
: measure.value;
if (value != undefined) {
if (value !== undefined) {
componentMeasures[measure.metric] = value;
}
});
@@ -248,7 +248,7 @@ function convertToQueryData(
if (sort.s) {
data.s = sort.s;
}
if (sort.hasOwnProperty('asc')) {
if (sort.asc !== undefined) {
data.asc = sort.asc;
}
return data;

+ 1
- 1
server/sonar-web/src/main/js/apps/projectsManagement/BulkApplyTemplateModal.tsx View File

@@ -69,7 +69,7 @@ export default class BulkApplyTemplateModal extends React.PureComponent<Props, S
loading: false,
permissionTemplate:
permissionTemplates.length > 0 ? permissionTemplates[0].id : undefined,
permissionTemplates: permissionTemplates
permissionTemplates
});
}
},

+ 1
- 2
server/sonar-web/src/main/js/apps/projectsManagement/Search.tsx View File

@@ -22,8 +22,7 @@ import * as Select from 'react-select';
import { sortBy } from 'lodash';
import BulkApplyTemplateModal from './BulkApplyTemplateModal';
import DeleteModal from './DeleteModal';
import { QUALIFIERS_ORDER } from './utils';
import { Project } from './utils';
import { QUALIFIERS_ORDER, Project } from './utils';
import { Organization } from '../../app/types';
import Checkbox from '../../components/controls/Checkbox';
import { translate } from '../../helpers/l10n';

+ 3
- 1
server/sonar-web/src/main/js/apps/projectsManagement/__tests__/App-test.tsx View File

@@ -17,6 +17,7 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/* eslint-disable import/first, import/order */
jest.mock('lodash', () => {
const lodash = require.requireActual('lodash');
lodash.debounce = (fn: Function) => (...args: any[]) => fn(args);
@@ -25,6 +26,7 @@ jest.mock('lodash', () => {

// actual version breaks `mount`
jest.mock('rc-tooltip', () => ({
// eslint-disable-next-line
default: function Tooltip() {
return null;
}
@@ -81,7 +83,7 @@ it('searches', () => {
expect(getComponents).lastCalledWith({ ...defaultSearchParameters, q: 'foo', qualifiers: 'TRK' });
});

it('loads more', async () => {
it('loads more', () => {
const wrapper = mountRender();
wrapper.find('ListFooter').prop<Function>('loadMore')();
expect(getComponents).lastCalledWith({ ...defaultSearchParameters, p: 2, qualifiers: 'TRK' });

+ 1
- 0
server/sonar-web/src/main/js/apps/projectsManagement/__tests__/BulkApplyTemplateModal-test.tsx View File

@@ -17,6 +17,7 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/* eslint-disable import/first, import/order */
jest.mock('../../../api/permissions', () => ({
bulkApplyTemplate: jest.fn(() => Promise.resolve()),
getPermissionTemplates: jest.fn(() => Promise.resolve({ permissionTemplates: [] }))

+ 1
- 0
server/sonar-web/src/main/js/apps/projectsManagement/__tests__/CreateProjectForm-test.tsx View File

@@ -17,6 +17,7 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/* eslint-disable import/first, import/order */
jest.mock('../../../api/components', () => ({
createProject: jest.fn(({ name }: { name: string }) =>
Promise.resolve({ project: { key: name, name } })

+ 1
- 0
server/sonar-web/src/main/js/apps/projectsManagement/__tests__/DeleteModal-test.tsx View File

@@ -17,6 +17,7 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/* eslint-disable import/first, import/order */
jest.mock('../../../api/components', () => ({
bulkDeleteProjects: jest.fn(() => Promise.resolve())
}));

+ 1
- 0
server/sonar-web/src/main/js/apps/projectsManagement/__tests__/Projects-test.tsx View File

@@ -17,6 +17,7 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/* eslint-disable import/first */
jest.mock('../../permissions/project/views/ApplyTemplateView');

import * as React from 'react';

+ 1
- 1
server/sonar-web/src/main/js/apps/quality-profiles/components/ProfileContainer.tsx View File

@@ -32,7 +32,7 @@ interface Props {
onRequestFail: (reasong: any) => void;
organization: string | null;
profiles: Profile[];
router: { replace: ({}) => void };
router: { replace: (path: any) => void };
updateProfiles: () => Promise<void>;
}


+ 1
- 1
server/sonar-web/src/main/js/apps/quality-profiles/details/ProfilePermissionsForm.tsx View File

@@ -82,7 +82,7 @@ export default class ProfilePermissionsForm extends React.PureComponent<Props, S
const { selected } = this.state;
if (selected) {
this.setState({ submitting: true });
if ((selected as User).login != undefined) {
if ((selected as User).login !== undefined) {
this.handleUserAdd(selected as User);
} else {
this.handleGroupAdd(selected as Group);

+ 1
- 1
server/sonar-web/src/main/js/apps/quality-profiles/details/ProfilePermissionsFormSelect.tsx View File

@@ -113,7 +113,7 @@ export default class ProfilePermissionsFormSelect extends React.PureComponent<Pr
}

function isUser(option: Option): option is User {
return (option as User).login != undefined;
return (option as User).login !== undefined;
}

function getStringValue(option: Option) {

+ 1
- 0
server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissions-test.tsx View File

@@ -17,6 +17,7 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/* eslint-disable import/first, import/order */
jest.mock('../../../../api/quality-profiles', () => ({
searchUsers: jest.fn(() => Promise.resolve([])),
searchGroups: jest.fn(() => Promise.resolve([]))

+ 1
- 0
server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissionsForm-test.tsx View File

@@ -17,6 +17,7 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/* eslint-disable import/first, import/order */
jest.mock('../../../../api/quality-profiles', () => ({
addUser: jest.fn(() => Promise.resolve()),
addGroup: jest.fn(() => Promise.resolve())

+ 1
- 0
server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissionsFormSelect-test.tsx View File

@@ -17,6 +17,7 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/* eslint-disable import/first */
jest.mock('lodash', () => {
const lodash = require.requireActual('lodash');
lodash.debounce = (fn: Function) => (...args: any[]) => fn(...args);

+ 1
- 0
server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissionsGroup-test.tsx View File

@@ -17,6 +17,7 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/* eslint-disable import/first, import/order */
jest.mock('../../../../api/quality-profiles', () => ({
removeGroup: jest.fn(() => Promise.resolve())
}));

+ 1
- 0
server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfilePermissionsUser-test.tsx View File

@@ -17,6 +17,7 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/* eslint-disable import/first, import/order */
jest.mock('../../../../api/quality-profiles', () => ({
removeUser: jest.fn(() => Promise.resolve())
}));

+ 5
- 1
server/sonar-web/src/main/js/apps/system/components/App.tsx View File

@@ -41,12 +41,16 @@ interface State {

export default class App extends React.PureComponent<Props, State> {
mounted: boolean;
state: State = { loading: true };

static contextTypes = {
router: PropTypes.object
};

constructor(props: Props) {
super(props);
this.state = { loading: true };
}

componentDidMount() {
this.mounted = true;
this.fetchSysInfo();

+ 3
- 3
server/sonar-web/src/main/js/apps/system/utils.ts View File

@@ -94,7 +94,7 @@ export function getSearchNodes(sysInfoData: ClusterSysInfo): NodeInfo[] {

export function isCluster(sysInfoData?: SysInfo): boolean {
return (
sysInfoData != undefined && sysInfoData['System'] && sysInfoData['System'][HA_FIELD] === true
sysInfoData !== undefined && sysInfoData['System'] && sysInfoData['System'][HA_FIELD] === true
);
}

@@ -165,8 +165,8 @@ export function getStandaloneSecondarySections(sysInfoData: SysInfo): SysInfoSec
}

export function groupSections(sysInfoData: SysValueObject) {
let mainSection: SysValueObject = {};
let sections: SysInfoSection = {};
const mainSection: SysValueObject = {};
const sections: SysInfoSection = {};
each(sysInfoData, (item, key) => {
if (typeof item !== 'object' || item instanceof Array) {
mainSection[key] = item;

+ 10
- 6
server/sonar-web/src/main/js/apps/web-api/components/WebApiApp.tsx View File

@@ -44,17 +44,21 @@ interface State {

export default class WebApiApp extends React.PureComponent<Props, State> {
mounted: boolean;
state: State = {
domains: [],
searchQuery: '',
showDeprecated: false,
showInternal: false
};

static contextTypes = {
router: PropTypes.object.isRequired
};

constructor(props: Props) {
super(props);
this.state = {
domains: [],
searchQuery: '',
showDeprecated: false,
showInternal: false
};
}

componentDidMount() {
this.mounted = true;
this.fetchList();

+ 2
- 2
server/sonar-web/src/main/js/apps/web-api/components/__tests__/Domain-test.tsx View File

@@ -77,7 +77,7 @@ it('should not render internal actions', () => {

it('should render only actions matching the query', () => {
const actions = [ACTION, { ...ACTION, key: 'bar', description: 'Bar desc' }];
const domain = { ...DOMAIN, actions: actions };
const domain = { ...DOMAIN, actions };
expect(
shallow(<Domain {...DEFAULT_PROPS} domain={domain} searchQuery="Foo" />)
).toMatchSnapshot();
@@ -89,7 +89,7 @@ it('should also render actions with a description matching the query', () => {
{ ...ACTION, key: 'bar', description: 'Bar desc' },
{ ...ACTION, key: 'baz', description: 'foobar' }
];
const domain = { ...DOMAIN, actions: actions };
const domain = { ...DOMAIN, actions };
expect(
shallow(<Domain {...DEFAULT_PROPS} domain={domain} searchQuery="Foo" />)
).toMatchSnapshot();

+ 4
- 4
server/sonar-web/src/main/js/components/charts/bar-chart.js View File

@@ -48,6 +48,10 @@ export const BarChart = createReactClass({
};
},

getInitialState() {
return { width: this.props.width, height: this.props.height };
},

componentDidUpdate(prevProps) {
if (this.props.width && prevProps.width !== this.props.width) {
this.setState({ width: this.props.width });
@@ -57,10 +61,6 @@ export const BarChart = createReactClass({
}
},

getInitialState() {
return { width: this.props.width, height: this.props.height };
},

handleClick(point) {
this.props.onBarClick(point);
},

+ 1
- 1
server/sonar-web/src/main/js/components/common/SelectListItem.js View File

@@ -47,7 +47,7 @@ export default class SelectListItem extends React.PureComponent {

renderLink() {
let children = this.props.item;
if (this.props.hasOwnProperty('children')) {
if (this.props.children) {
children = this.props.children;
}
return (

+ 1
- 1
server/sonar-web/src/main/js/components/controls/DateInput.tsx View File

@@ -105,7 +105,7 @@ export default class DateInput extends React.PureComponent<Props> {
<path d="M5.5 6h2v2h-2V6zm3 0h2v2h-2V6zm3 0h2v2h-2V6zm-9 6h2v2h-2v-2zm3 0h2v2h-2v-2zm3 0h2v2h-2v-2zm-3-3h2v2h-2V9zm3 0h2v2h-2V9zm3 0h2v2h-2V9zm-9 0h2v2h-2V9zm11-9v1h-2V0h-7v1h-2V0h-2v16h15V0h-2zm1 15h-13V4h13v11z" />
</svg>
</span>
{this.props.value != undefined && (
{this.props.value !== undefined && (
<a className="date-input-control-reset" href="#" onClick={this.handleResetClick}>
<CloseIcon className="" />
</a>

+ 3
- 5
server/sonar-web/src/main/js/components/intl/DateFormatter.tsx View File

@@ -33,10 +33,8 @@ export const longFormatterOption = { year: 'numeric', month: 'long', day: 'numer

export default function DateFormatter({ children, date, long }: Props) {
return (
<FormattedDate
children={children}
value={parseDate(date)}
{...(long ? longFormatterOption : formatterOption)}
/>
<FormattedDate value={parseDate(date)} {...(long ? longFormatterOption : formatterOption)}>
{children}
</FormattedDate>
);
}

+ 1
- 1
server/sonar-web/src/main/js/components/intl/DateFromNow.tsx View File

@@ -27,5 +27,5 @@ interface Props {
}

export default function DateFromNow({ children, date }: Props) {
return <FormattedRelative children={children} value={parseDate(date)} />;
return <FormattedRelative value={parseDate(date)}>{children}</FormattedRelative>;
}

+ 5
- 1
server/sonar-web/src/main/js/components/intl/DateTimeFormatter.tsx View File

@@ -35,5 +35,9 @@ export const formatterOption = {
};

export default function DateTimeFormatter({ children, date }: Props) {
return <FormattedDate children={children} value={parseDate(date)} {...formatterOption} />;
return (
<FormattedDate value={parseDate(date)} {...formatterOption}>
{children}
</FormattedDate>
);
}

+ 3
- 5
server/sonar-web/src/main/js/components/intl/TimeFormatter.tsx View File

@@ -33,10 +33,8 @@ export const longFormatterOption = { hour: 'numeric', minute: 'numeric', second:

export default function TimeFormatter({ children, date, long }: Props) {
return (
<FormattedTime
children={children}
value={parseDate(date)}
{...(long ? longFormatterOption : formatterOption)}
/>
<FormattedTime value={parseDate(date)} {...(long ? longFormatterOption : formatterOption)}>
{children}
</FormattedTime>
);
}

+ 2
- 2
server/sonar-web/src/main/js/components/measure/Measure.tsx View File

@@ -31,14 +31,14 @@ interface Props {
}

export default function Measure({ className, decimals, measure }: Props) {
if (measure == undefined) {
if (measure === undefined) {
return <span>{'–'}</span>;
}

const metric = measure.metric;
const value = isDiffMetric(metric.key) ? measure.leak : measure.value;

if (value == undefined) {
if (value === undefined) {
return <span>{'–'}</span>;
}


+ 1
- 0
server/sonar-web/src/main/js/components/measure/__tests__/Measure-test.tsx View File

@@ -17,6 +17,7 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/* eslint-disable import/first */
jest.mock('../../../helpers/measures', () => {
const measures = require.requireActual('../../../helpers/measures');
measures.getRatingTooltip = jest.fn(() => 'tooltip');

+ 1
- 1
server/sonar-web/src/main/js/components/ui/Rating.tsx View File

@@ -30,7 +30,7 @@ interface Props {
}

export default function Rating({ className, muted = false, small = false, value }: Props) {
if (value == undefined) {
if (value === undefined) {
return <span>{'–'}</span>;
}
const formatted = formatMeasure(value, 'RATING');

+ 1
- 1
server/sonar-web/src/main/js/helpers/issues.ts View File

@@ -81,7 +81,7 @@ function injectRelational(
) {
const newFields: { [x: string]: any } = {};
const baseValue = issue[baseField];
if (baseValue != undefined && source != undefined) {
if (baseValue !== undefined && source !== undefined) {
const lookupValue = source.find(candidate => candidate[lookupField] === baseValue);
if (lookupValue != null) {
Object.keys(lookupValue).forEach(key => {

+ 2
- 0
server/sonar-web/src/main/js/helpers/l10n.ts View File

@@ -42,6 +42,7 @@ export function translate(...keys: string[]): string {
const messageKey = keys.join('.');
if (process.env.NODE_ENV === 'development') {
if (!messages[messageKey]) {
// eslint-disable-next-line
console.error(`No message for: ${messageKey}`);
}
}
@@ -59,6 +60,7 @@ export function translateWithParameters(
.reduce((acc, parameter, index) => acc.replace(`{${index}}`, parameter), message);
} else {
if (process.env.NODE_ENV === 'development') {
// eslint-disable-next-line
console.error(`No message for: ${messageKey}`);
}
return `${messageKey}.${parameters.join('.')}`;

+ 3
- 3
server/sonar-web/src/main/js/helpers/measures.ts View File

@@ -101,7 +101,7 @@ function useFormatter(
formatter: Formatter,
options?: any
): string {
return value != undefined && value !== '' ? formatter(value, options) : '';
return value !== undefined && value !== '' ? formatter(value, options) : '';
}

function getFormatter(type: string): Formatter {
@@ -313,7 +313,7 @@ function formatDurationShort(

function durationFormatter(value: string | number): string {
if (typeof value === 'string') {
value = parseInt(value);
value = parseInt(value, 10);
}
if (value === 0) {
return '0';
@@ -330,7 +330,7 @@ function durationFormatter(value: string | number): string {

function shortDurationFormatter(value: string | number): string {
if (typeof value === 'string') {
value = parseInt(value);
value = parseInt(value, 10);
}
if (value === 0) {
return '0';

+ 1
- 3
server/sonar-web/tsconfig.json View File

@@ -8,9 +8,7 @@
"strict": true,
"target": "es5",
"jsx": "react",
// remove "es2015.promise", "es2015.iterable" when upgrading to TypeScript 2.5
// see https://github.com/Microsoft/TypeScript/issues/16017
"lib": ["es2015.promise", "es2015.iterable", "es2017", "dom"],
"lib": ["es2017", "dom"],
"module": "esnext",
"moduleResolution": "node",
"typeRoots": ["./src/main/js/typings", "./node_modules/@types"]

+ 214
- 296
server/sonar-web/yarn.lock View File

@@ -182,10 +182,14 @@ address@1.0.2, address@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/address/-/address-1.0.2.tgz#480081e82b587ba319459fef512f516fe03d58af"

ajv-keywords@^1.0.0, ajv-keywords@^1.1.1:
ajv-keywords@^1.1.1:
version "1.5.1"
resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c"

ajv-keywords@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.0.tgz#a296e17f7bfae7c1ce4f7e0de53d29cb32162df0"

ajv@^4.7.0, ajv@^4.9.1:
version "4.11.8"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536"
@@ -202,6 +206,15 @@ ajv@^5.0.0:
json-schema-traverse "^0.3.0"
json-stable-stringify "^1.0.1"

ajv@^5.2.0, ajv@^5.2.3:
version "5.2.3"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.2.3.tgz#c06f598778c44c6b161abafe3466b81ad1814ed2"
dependencies:
co "^4.6.0"
fast-deep-equal "^1.0.0"
json-schema-traverse "^0.3.0"
json-stable-stringify "^1.0.1"

align-text@^0.1.1, align-text@^0.1.3:
version "0.1.4"
resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
@@ -238,6 +251,10 @@ ansi-escapes@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-2.0.0.tgz#5bae52be424878dd9783e8910e3fc2922e83c81b"

ansi-escapes@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92"

ansi-html@0.0.7:
version "0.0.7"
resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e"
@@ -290,6 +307,12 @@ argparse@^1.0.7:
dependencies:
sprintf-js "~1.0.2"

aria-query@^0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-0.7.0.tgz#4af10a1e61573ddea0cf3b99b51c52c05b424d24"
dependencies:
ast-types-flow "0.0.7"

arr-diff@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
@@ -320,6 +343,13 @@ array-flatten@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"

array-includes@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d"
dependencies:
define-properties "^1.1.2"
es-abstract "^1.7.0"

array-map@~0.0.0:
version "0.0.0"
resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662"
@@ -346,13 +376,6 @@ array-unique@^0.3.2:
version "0.3.2"
resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"

array.prototype.find@^2.0.1:
version "2.0.4"
resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.0.4.tgz#556a5c5362c08648323ddaeb9de9d14bc1864c90"
dependencies:
define-properties "^1.1.2"
es-abstract "^1.7.0"

arrify@^1.0.0, arrify@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
@@ -387,6 +410,10 @@ assert@^1.1.1:
dependencies:
util "0.10.3"

ast-types-flow@0.0.7:
version "0.0.7"
resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad"

async-each@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
@@ -456,7 +483,13 @@ aws4@^1.2.1:
version "1.6.0"
resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"

babel-code-frame@6.22.0, babel-code-frame@^6.11.0, babel-code-frame@^6.16.0, babel-code-frame@^6.22.0:
axobject-query@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-0.1.0.tgz#62f59dbc59c9f9242759ca349960e7a2fe3c36c0"
dependencies:
ast-types-flow "0.0.7"

babel-code-frame@6.22.0, babel-code-frame@^6.11.0, babel-code-frame@^6.22.0:
version "6.22.0"
resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4"
dependencies:
@@ -488,15 +521,6 @@ babel-core@^6.0.0, babel-core@^6.22.1, babel-core@^6.24.1:
slash "^1.0.0"
source-map "^0.5.0"

babel-eslint@7.2.3:
version "7.2.3"
resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-7.2.3.tgz#b2fe2d80126470f5c19442dc757253a897710827"
dependencies:
babel-code-frame "^6.22.0"
babel-traverse "^6.23.1"
babel-types "^6.23.0"
babylon "^6.17.0"

babel-generator@^6.18.0, babel-generator@^6.25.0:
version "6.25.0"
resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.25.0.tgz#33a1af70d5f2890aeb465a4a7793c1df6a9ea9fc"
@@ -1055,7 +1079,7 @@ babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.25.0:
babylon "^6.17.2"
lodash "^4.2.0"

babel-traverse@^6.18.0, babel-traverse@^6.23.1, babel-traverse@^6.24.1, babel-traverse@^6.25.0:
babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.25.0:
version "6.25.0"
resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.25.0.tgz#2257497e2fcd19b89edc13c4c91381f9512496f1"
dependencies:
@@ -1069,7 +1093,7 @@ babel-traverse@^6.18.0, babel-traverse@^6.23.1, babel-traverse@^6.24.1, babel-tr
invariant "^2.2.0"
lodash "^4.2.0"

babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.23.0, babel-types@^6.24.1, babel-types@^6.25.0:
babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.25.0:
version "6.25.0"
resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.25.0.tgz#70afb248d5660e5d18f811d91c8303b54134a18e"
dependencies:
@@ -1078,7 +1102,7 @@ babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.23.0, babel-types@^6.24
lodash "^4.2.0"
to-fast-properties "^1.0.1"

babylon@^6.17.0, babylon@^6.17.2, babylon@^6.17.4:
babylon@^6.17.2, babylon@^6.17.4:
version "6.17.4"
resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.4.tgz#3e8b7402b88d22c3423e137a1577883b15ff869a"

@@ -1401,7 +1425,7 @@ center-align@^0.1.1:
align-text "^0.1.3"
lazy-cache "^1.0.3"

chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3:
chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
dependencies:
@@ -1500,12 +1524,6 @@ clean-css@4.1.x:
dependencies:
source-map "0.5.x"

cli-cursor@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987"
dependencies:
restore-cursor "^1.0.1"

cli-cursor@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
@@ -1656,7 +1674,7 @@ concat-map@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"

concat-stream@^1.4.6:
concat-stream@^1.6.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7"
dependencies:
@@ -1780,7 +1798,7 @@ cross-spawn@4.0.2:
lru-cache "^4.0.1"
which "^1.2.9"

cross-spawn@5.1.0, cross-spawn@^5.0.1:
cross-spawn@5.1.0, cross-spawn@^5.0.1, cross-spawn@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
dependencies:
@@ -1983,12 +2001,6 @@ d3-time@1:
version "1.0.7"
resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-1.0.7.tgz#94caf6edbb7879bb809d0d1f7572bc48482f7270"

d@1:
version "1.0.0"
resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f"
dependencies:
es5-ext "^0.10.9"

damerau-levenshtein@^1.0.0:
version "1.0.4"
resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz#03191c432cb6eea168bb77f3a55ffdccb8978514"
@@ -2013,6 +2025,12 @@ debug@2.6.8, debug@^2.1.1, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.
dependencies:
ms "2.0.0"

debug@^3.0.1:
version "3.1.0"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
dependencies:
ms "2.0.0"

decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2:
version "1.2.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
@@ -2126,13 +2144,20 @@ diffie-hellman@^5.0.0:
miller-rabin "^4.0.0"
randombytes "^2.0.0"

doctrine@1.5.0, doctrine@^1.2.2:
doctrine@1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa"
dependencies:
esutils "^2.0.2"
isarray "^1.0.0"

doctrine@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63"
dependencies:
esutils "^2.0.2"
isarray "^1.0.0"

dom-align@1.x:
version "1.6.3"
resolved "https://registry.yarnpkg.com/dom-align/-/dom-align-1.6.3.tgz#3017bcc87f02547b1f15b458649a8d94a71f5903"
@@ -2232,6 +2257,10 @@ elliptic@^6.0.0:
minimalistic-assert "^1.0.0"
minimalistic-crypto-utils "^1.0.0"

emoji-regex@^6.1.0:
version "6.5.1"
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.5.1.tgz#9baea929b155565c11ea41c6626eaa65cef992c2"

emojis-list@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
@@ -2325,58 +2354,6 @@ es-to-primitive@^1.1.1:
is-date-object "^1.0.1"
is-symbol "^1.0.1"

es5-ext@^0.10.14, es5-ext@^0.10.9, es5-ext@~0.10.14:
version "0.10.27"
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.27.tgz#bf926b058c62b1cb5de1a887930673b6aa6d9a66"
dependencies:
es6-iterator "2"
es6-symbol "~3.1"

es6-iterator@2, es6-iterator@^2.0.1, es6-iterator@~2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.1.tgz#8e319c9f0453bf575d374940a655920e59ca5512"
dependencies:
d "1"
es5-ext "^0.10.14"
es6-symbol "^3.1"

es6-map@^0.1.3:
version "0.1.5"
resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0"
dependencies:
d "1"
es5-ext "~0.10.14"
es6-iterator "~2.0.1"
es6-set "~0.1.5"
es6-symbol "~3.1.1"
event-emitter "~0.3.5"

es6-set@~0.1.5:
version "0.1.5"
resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1"
dependencies:
d "1"
es5-ext "~0.10.14"
es6-iterator "~2.0.1"
es6-symbol "3.1.1"
event-emitter "~0.3.5"

es6-symbol@3.1.1, es6-symbol@^3.1, es6-symbol@^3.1.1, es6-symbol@~3.1, es6-symbol@~3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77"
dependencies:
d "1"
es5-ext "~0.10.14"

es6-weak-map@^2.0.1:
version "2.0.2"
resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f"
dependencies:
d "1"
es5-ext "^0.10.14"
es6-iterator "^2.0.1"
es6-symbol "^3.1.1"

escape-html@1.0.3, escape-html@~1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
@@ -2396,15 +2373,6 @@ escodegen@^1.6.1:
optionalDependencies:
source-map "~0.2.0"

escope@^3.6.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3"
dependencies:
es6-map "^0.1.3"
es6-weak-map "^2.0.1"
esrecurse "^4.1.0"
estraverse "^4.1.1"

eslint-import-resolver-node@^0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.1.tgz#4422574cde66a9a7b099938ee4d508a199e0e3cc"
@@ -2429,15 +2397,9 @@ eslint-module-utils@^2.1.1:
debug "^2.6.8"
pkg-dir "^1.0.0"

eslint-plugin-flowtype@^2.29.1:
version "2.35.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.35.0.tgz#d17494f0ae8b727c632d8b9d4b4a848e7e0c04af"
dependencies:
lodash "^4.15.0"

eslint-plugin-import@2.7.0:
version "2.7.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.7.0.tgz#21de33380b9efb55f5ef6d2e210ec0e07e7fa69f"
eslint-plugin-import@2.8.0:
version "2.8.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.8.0.tgz#fa1b6ef31fcb3c501c09859c1b86f1fc5b986894"
dependencies:
builtin-modules "^1.1.1"
contains-path "^0.1.0"
@@ -2450,66 +2412,83 @@ eslint-plugin-import@2.7.0:
minimatch "^3.0.3"
read-pkg-up "^2.0.0"

eslint-plugin-jsx-a11y@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-3.0.2.tgz#9f0eabcafde3d2a2600d96a66adb90d099e841fe"
eslint-plugin-jsx-a11y@6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.0.2.tgz#659277a758b036c305a7e4a13057c301cd3be73f"
dependencies:
aria-query "^0.7.0"
array-includes "^3.0.3"
ast-types-flow "0.0.7"
axobject-query "^0.1.0"
damerau-levenshtein "^1.0.0"
jsx-ast-utils "^1.0.0"
object-assign "^4.0.1"
emoji-regex "^6.1.0"
jsx-ast-utils "^1.4.0"

eslint-plugin-promise@3.6.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-3.6.0.tgz#54b7658c8f454813dc2a870aff8152ec4969ba75"

eslint-plugin-react@^6.8.0:
version "6.10.3"
resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-6.10.3.tgz#c5435beb06774e12c7db2f6abaddcbf900cd3f78"
eslint-plugin-react@7.4.0:
version "7.4.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.4.0.tgz#300a95861b9729c087d362dd64abcc351a74364a"
dependencies:
array.prototype.find "^2.0.1"
doctrine "^1.2.2"
doctrine "^2.0.0"
has "^1.0.1"
jsx-ast-utils "^1.3.4"
object.assign "^4.0.4"
jsx-ast-utils "^2.0.0"
prop-types "^15.5.10"

eslint@3.14.1:
version "3.14.1"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.14.1.tgz#8a62175f2255109494747a1b25128d97b8eb3d97"
eslint-scope@^3.7.1:
version "3.7.1"
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8"
dependencies:
babel-code-frame "^6.16.0"
chalk "^1.1.3"
concat-stream "^1.4.6"
debug "^2.1.1"
doctrine "^1.2.2"
escope "^3.6.0"
espree "^3.3.1"
esrecurse "^4.1.0"
estraverse "^4.1.1"

eslint@4.9.0:
version "4.9.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.9.0.tgz#76879d274068261b191fe0f2f56c74c2f4208e8b"
dependencies:
ajv "^5.2.0"
babel-code-frame "^6.22.0"
chalk "^2.1.0"
concat-stream "^1.6.0"
cross-spawn "^5.1.0"
debug "^3.0.1"
doctrine "^2.0.0"
eslint-scope "^3.7.1"
espree "^3.5.1"
esquery "^1.0.0"
estraverse "^4.2.0"
esutils "^2.0.2"
file-entry-cache "^2.0.0"
glob "^7.0.3"
globals "^9.14.0"
ignore "^3.2.0"
functional-red-black-tree "^1.0.1"
glob "^7.1.2"
globals "^9.17.0"
ignore "^3.3.3"
imurmurhash "^0.1.4"
inquirer "^0.12.0"
is-my-json-valid "^2.10.0"
inquirer "^3.0.6"
is-resolvable "^1.0.0"
js-yaml "^3.5.1"
json-stable-stringify "^1.0.0"
js-yaml "^3.9.1"
json-stable-stringify "^1.0.1"
levn "^0.3.0"
lodash "^4.0.0"
mkdirp "^0.5.0"
lodash "^4.17.4"
minimatch "^3.0.2"
mkdirp "^0.5.1"
natural-compare "^1.4.0"
optionator "^0.8.2"
path-is-inside "^1.0.1"
pluralize "^1.2.1"
progress "^1.1.8"
require-uncached "^1.0.2"
shelljs "^0.7.5"
strip-bom "^3.0.0"
path-is-inside "^1.0.2"
pluralize "^7.0.0"
progress "^2.0.0"
require-uncached "^1.0.3"
semver "^5.3.0"
strip-ansi "^4.0.0"
strip-json-comments "~2.0.1"
table "^3.7.8"
table "^4.0.1"
text-table "~0.2.0"
user-home "^2.0.0"

espree@^3.3.1:
version "3.5.0"
resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.0.tgz#98358625bdd055861ea27e2867ea729faf463d8d"
espree@^3.5.1:
version "3.5.1"
resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.1.tgz#0c988b8ab46db53100a1954ae4ba995ddd27d87e"
dependencies:
acorn "^5.1.1"
acorn-jsx "^3.0.0"
@@ -2522,6 +2501,12 @@ esprima@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804"

esquery@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa"
dependencies:
estraverse "^4.0.0"

esrecurse@^4.1.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163"
@@ -2533,7 +2518,7 @@ estraverse@^1.9.1:
version "1.9.3"
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44"

estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"

@@ -2545,13 +2530,6 @@ etag@~1.8.0:
version "1.8.0"
resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.0.tgz#6f631aef336d6c46362b51764044ce216be3c051"

event-emitter@~0.3.5:
version "0.3.5"
resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
dependencies:
d "1"
es5-ext "~0.10.14"

eventemitter3@1.x.x:
version "1.2.0"
resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508"
@@ -2598,10 +2576,6 @@ exenv@^1.2.1:
version "1.2.2"
resolved "https://registry.yarnpkg.com/exenv/-/exenv-1.2.2.tgz#2ae78e85d9894158670b03d47bec1f03bd91bb9d"

exit-hook@^1.0.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8"

expand-brackets@^0.1.4:
version "0.1.5"
resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
@@ -2767,13 +2741,6 @@ fbjs@^0.8.9:
setimmediate "^1.0.5"
ua-parser-js "^0.7.9"

figures@^1.3.5:
version "1.7.0"
resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e"
dependencies:
escape-string-regexp "^1.0.5"
object-assign "^4.1.0"

figures@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962"
@@ -2973,6 +2940,10 @@ function.prototype.name@^1.0.0:
function-bind "^1.1.0"
is-callable "^1.1.3"

functional-red-black-tree@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"

gauge@~2.7.3:
version "2.7.4"
resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
@@ -2986,16 +2957,6 @@ gauge@~2.7.3:
strip-ansi "^3.0.1"
wide-align "^1.1.0"

generate-function@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74"

generate-object-property@^1.1.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0"
dependencies:
is-property "^1.0.0"

get-caller-file@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5"
@@ -3027,7 +2988,7 @@ glob-parent@^2.0.0:
dependencies:
is-glob "^2.0.0"

glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1:
glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2:
version "7.1.2"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
dependencies:
@@ -3056,7 +3017,7 @@ global-prefix@^1.0.1:
is-windows "^1.0.1"
which "^1.2.14"

globals@^9.0.0, globals@^9.14.0:
globals@^9.0.0, globals@^9.17.0:
version "9.18.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"

@@ -3367,9 +3328,9 @@ ieee754@^1.1.4:
version "1.1.8"
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4"

ignore@^3.2.0:
version "3.3.3"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.3.tgz#432352e57accd87ab3110e82d3fea0e47812156d"
ignore@^3.3.3:
version "3.3.5"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.5.tgz#c4e715455f6073a8d7e5dae72d2fc9d71663dba6"

image-size@~0.5.0:
version "0.5.5"
@@ -3443,22 +3404,23 @@ inquirer@3.2.1:
strip-ansi "^4.0.0"
through "^2.3.6"

inquirer@^0.12.0:
version "0.12.0"
resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e"
inquirer@^3.0.6:
version "3.3.0"
resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9"
dependencies:
ansi-escapes "^1.1.0"
ansi-regex "^2.0.0"
chalk "^1.0.0"
cli-cursor "^1.0.1"
ansi-escapes "^3.0.0"
chalk "^2.0.0"
cli-cursor "^2.1.0"
cli-width "^2.0.0"
figures "^1.3.5"
external-editor "^2.0.4"
figures "^2.0.0"
lodash "^4.3.0"
readline2 "^1.0.1"
run-async "^0.1.0"
rx-lite "^3.1.2"
string-width "^1.0.1"
strip-ansi "^3.0.0"
mute-stream "0.0.7"
run-async "^2.2.0"
rx-lite "^4.0.8"
rx-lite-aggregates "^4.0.8"
string-width "^2.1.0"
strip-ansi "^4.0.0"
through "^2.3.6"

interpret@^1.0.0:
@@ -3631,15 +3593,6 @@ is-glob@^3.1.0:
dependencies:
is-extglob "^2.1.0"

is-my-json-valid@^2.10.0:
version "2.16.0"
resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz#f079dd9bfdae65ee2038aae8acbc86ab109e3693"
dependencies:
generate-function "^2.0.0"
generate-object-property "^1.1.0"
jsonpointer "^4.0.0"
xtend "^4.0.0"

is-number@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
@@ -3696,10 +3649,6 @@ is-promise@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"

is-property@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"

is-regex@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491"
@@ -4069,13 +4018,20 @@ js-tokens@^3.0.0:
version "3.0.2"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"

js-yaml@^3.4.3, js-yaml@^3.5.1, js-yaml@^3.7.0:
js-yaml@^3.4.3, js-yaml@^3.7.0:
version "3.9.1"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.9.1.tgz#08775cebdfdd359209f0d2acd383c8f86a6904a0"
dependencies:
argparse "^1.0.7"
esprima "^4.0.0"

js-yaml@^3.9.1:
version "3.10.0"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc"
dependencies:
argparse "^1.0.7"
esprima "^4.0.0"

js-yaml@~3.7.0:
version "3.7.0"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80"
@@ -4135,7 +4091,7 @@ json-schema@0.2.3:
version "0.2.3"
resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"

json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1:
json-stable-stringify@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
dependencies:
@@ -4169,10 +4125,6 @@ jsonify@~0.0.0:
version "0.0.0"
resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"

jsonpointer@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9"

jsprim@^1.2.2:
version "1.4.1"
resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
@@ -4182,10 +4134,16 @@ jsprim@^1.2.2:
json-schema "0.2.3"
verror "1.10.0"

jsx-ast-utils@^1.0.0, jsx-ast-utils@^1.3.4:
jsx-ast-utils@^1.4.0:
version "1.4.1"
resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz#3867213e8dd79bf1e8f2300c0cfc1efb182c0df1"

jsx-ast-utils@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz#e801b1b39985e20fffc87b40e3748080e2dcac7f"
dependencies:
array-includes "^3.0.3"

keymaster@1.6.2:
version "1.6.2"
resolved "https://registry.yarnpkg.com/keymaster/-/keymaster-1.6.2.tgz#e1ae54d0ea9488f9f60b66b668f02e9a1946c6eb"
@@ -4421,11 +4379,15 @@ lodash.some@^4.4.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d"

lodash.unescape@4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c"

lodash.uniq@^4.5.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"

lodash@4.17.4, lodash@^4.0.0, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0:
lodash@4.17.4, lodash@^4.14.0, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0:
version "4.17.4"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"

@@ -4618,10 +4580,6 @@ ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"

mute-stream@0.0.5:
version "0.0.5"
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0"

mute-stream@0.0.7:
version "0.0.7"
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
@@ -4898,10 +4856,6 @@ once@^1.3.0, once@^1.3.3, once@^1.4.0:
dependencies:
wrappy "1"

onetime@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789"

onetime@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
@@ -5081,7 +5035,7 @@ path-is-absolute@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"

path-is-inside@^1.0.1:
path-is-inside@^1.0.1, path-is-inside@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"

@@ -5151,9 +5105,9 @@ pkg-dir@^2.0.0:
dependencies:
find-up "^2.1.0"

pluralize@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45"
pluralize@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777"

portfinder@^1.0.9:
version "1.0.13"
@@ -5487,9 +5441,9 @@ process@^0.11.0:
version "0.11.10"
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"

progress@^1.1.8:
version "1.1.8"
resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be"
progress@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f"

promise@^7.1.1:
version "7.3.1"
@@ -5877,20 +5831,6 @@ readdirp@^2.0.0:
readable-stream "^2.0.2"
set-immediate-shim "^1.0.1"

readline2@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35"
dependencies:
code-point-at "^1.0.0"
is-fullwidth-code-point "^1.0.0"
mute-stream "0.0.5"

rechoir@^0.6.2:
version "0.6.2"
resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384"
dependencies:
resolve "^1.1.6"

recursive-readdir@2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.1.tgz#90ef231d0778c5ce093c9a48d74e5c5422d13a99"
@@ -6066,7 +6006,7 @@ require-main-filename@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"

require-uncached@^1.0.2:
require-uncached@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3"
dependencies:
@@ -6096,19 +6036,12 @@ resolve@1.1.7:
version "1.1.7"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"

resolve@^1.1.6, resolve@^1.2.0, resolve@^1.3.2:
resolve@^1.2.0, resolve@^1.3.2:
version "1.4.0"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.4.0.tgz#a75be01c53da25d934a98ebd0e4c4a7312f92a86"
dependencies:
path-parse "^1.0.5"

restore-cursor@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541"
dependencies:
exit-hook "^1.0.0"
onetime "^1.0.0"

restore-cursor@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
@@ -6141,12 +6074,6 @@ ripemd160@^2.0.0, ripemd160@^2.0.1:
hash-base "^2.0.0"
inherits "^2.0.1"

run-async@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389"
dependencies:
once "^1.3.0"

run-async@^2.2.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0"
@@ -6163,10 +6090,6 @@ rx-lite@*, rx-lite@^4.0.8:
version "4.0.8"
resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444"

rx-lite@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102"

rx@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782"
@@ -6209,7 +6132,7 @@ select@^1.0.6:
version "1.1.2"
resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d"

"semver@2 || 3 || 4 || 5", semver@^5.3.0:
"semver@2 || 3 || 4 || 5", semver@5.4.1, semver@^5.3.0:
version "5.4.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e"

@@ -6322,14 +6245,6 @@ shell-quote@1.6.1:
array-reduce "~0.0.0"
jsonify "~0.0.0"

shelljs@^0.7.5:
version "0.7.8"
resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3"
dependencies:
glob "^7.0.0"
interpret "^1.0.0"
rechoir "^0.6.2"

shellwords@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.0.tgz#66afd47b6a12932d9071cbfd98a52e785cd0ba14"
@@ -6342,9 +6257,11 @@ slash@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"

slice-ansi@0.0.4:
version "0.0.4"
resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35"
slice-ansi@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d"
dependencies:
is-fullwidth-code-point "^2.0.0"

snapdragon-node@^2.0.1:
version "2.1.1"
@@ -6574,7 +6491,7 @@ string-width@^1.0.1, string-width@^1.0.2:
is-fullwidth-code-point "^1.0.0"
strip-ansi "^3.0.0"

string-width@^2.0.0, string-width@^2.1.0:
string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
dependencies:
@@ -6668,16 +6585,16 @@ symbol-tree@^3.2.1:
version "3.2.2"
resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6"

table@^3.7.8:
version "3.8.3"
resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f"
table@^4.0.1:
version "4.0.2"
resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36"
dependencies:
ajv "^4.7.0"
ajv-keywords "^1.0.0"
chalk "^1.1.1"
lodash "^4.0.0"
slice-ansi "0.0.4"
string-width "^2.0.0"
ajv "^5.2.3"
ajv-keywords "^2.1.0"
chalk "^2.1.0"
lodash "^4.17.4"
slice-ansi "1.0.0"
string-width "^2.1.1"

tapable@^0.2.5, tapable@^0.2.7, tapable@~0.2.5:
version "0.2.8"
@@ -6855,9 +6772,16 @@ typedarray@^0.0.6:
version "0.0.6"
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"

typescript@2.4.2:
version "2.4.2"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.4.2.tgz#f8395f85d459276067c988aa41837a8f82870844"
typescript-eslint-parser@8.0.0:
version "8.0.0"
resolved "https://registry.yarnpkg.com/typescript-eslint-parser/-/typescript-eslint-parser-8.0.0.tgz#81f70bbffca1139c1dc5a1301208a7fd8213f8b2"
dependencies:
lodash.unescape "4.0.1"
semver "5.4.1"

typescript@2.5.3:
version "2.5.3"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.5.3.tgz#df3dcdc38f3beb800d4bc322646b04a3f6ca7f0d"

ua-parser-js@^0.7.9:
version "0.7.14"
@@ -6978,12 +6902,6 @@ use@^2.0.0:
isobject "^3.0.0"
lazy-cache "^2.0.2"

user-home@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f"
dependencies:
os-homedir "^1.0.0"

util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"

Loading…
Cancel
Save