.eslintrc.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. module.exports = {
  2. env: {
  3. browser: true,
  4. es6: true,
  5. jest: true,
  6. },
  7. extends: [
  8. 'eslint:recommended',
  9. 'plugin:react/recommended',
  10. 'plugin:@typescript-eslint/recommended',
  11. 'prettier',
  12. 'prettier/@typescript-eslint',
  13. ],
  14. settings: {
  15. react: {
  16. version: 'detect',
  17. },
  18. },
  19. globals: {
  20. JSX: true,
  21. module: true,
  22. shallow: true,
  23. render: true,
  24. mount: true,
  25. global: true,
  26. },
  27. parser: '@typescript-eslint/parser',
  28. parserOptions: {
  29. ecmaFeatures: {
  30. jsx: true,
  31. },
  32. ecmaVersion: 11, // 2020
  33. sourceType: 'module',
  34. parserOptions: {
  35. project: './tsconfig.json',
  36. },
  37. },
  38. plugins: ['@typescript-eslint'],
  39. rules: {
  40. // TypeScript Rules
  41. '@typescript-eslint/no-explicit-any': 0,
  42. '@typescript-eslint/explicit-function-return-type': [
  43. 1,
  44. {
  45. allowExpressions: true,
  46. allowTypedFunctionExpressions: true,
  47. },
  48. ],
  49. // JavaScript Rules
  50. 'arrow-body-style': ['warn', 'as-needed'],
  51. 'arrow-parens': ['warn', 'as-needed'],
  52. 'arrow-spacing': 'error',
  53. 'block-spacing': ['error', 'never'],
  54. camelcase: ['error', {properties: 'always'}],
  55. 'comma-dangle': 0,
  56. 'comma-spacing': ['error', {before: false, after: true}],
  57. 'comma-style': ['error', 'last'],
  58. 'global-require': 0,
  59. indent: ['error', 2],
  60. 'key-spacing': ['error', {beforeColon: false, afterColon: true}],
  61. 'keyword-spacing': ['error', {before: true, after: true}],
  62. 'linebreak-style': ['error', 'unix'],
  63. 'no-confusing-arrow': ['error', {allowParens: false}],
  64. 'no-multi-spaces': 'error',
  65. 'no-shadow': 1,
  66. 'no-trailing-spaces': 'error',
  67. 'no-unused-expressions': 1,
  68. 'no-unused-vars': 1,
  69. 'no-useless-rename': 'error',
  70. 'no-whitespace-before-property': 'error',
  71. 'object-curly-newline': ['error', {consistent: true}],
  72. 'object-curly-spacing': ['error', 'never'],
  73. quotes: ['error', 'single'],
  74. semi: ['error', 'always'],
  75. 'semi-spacing': ['error', {before: false, after: true}],
  76. 'space-before-blocks': ['error', 'always'],
  77. 'space-before-function-paren': [
  78. 'error',
  79. {
  80. anonymous: 'never',
  81. named: 'never',
  82. asyncArrow: 'always',
  83. },
  84. ],
  85. 'space-in-parens': ['error', 'never'],
  86. 'space-infix-ops': ['error', {int32Hint: false}],
  87. 'space-unary-ops': [2, {words: true, nonwords: false}],
  88. // React Rules
  89. 'react/jsx-filename-extension': ['error', {extensions: ['.jsx', '.tsx']}],
  90. 'react/jsx-indent': [1, 2],
  91. 'react/jsx-key': 1,
  92. 'react/jsx-no-comment-textnodes': 1,
  93. 'react/jsx-no-duplicate-props': 1,
  94. 'react/jsx-no-target-blank': 2,
  95. 'react/jsx-props-no-multi-spaces': 1,
  96. 'react/jsx-sort-props': 1,
  97. 'react/jsx-tag-spacing': 2,
  98. 'react/no-children-prop': 1,
  99. 'react/no-deprecated': 1,
  100. 'react/no-direct-mutation-state': 2,
  101. 'react/no-typos': 1,
  102. 'react/no-unknown-property': 1,
  103. 'react/prefer-stateless-function': 1,
  104. 'react/prop-types': 1,
  105. 'react/react-in-jsx-scope': 2,
  106. 'react/require-default-props': 1,
  107. 'react/require-render-return': 1,
  108. 'react/sort-comp': 1,
  109. 'react/jsx-wrap-multilines': [
  110. 1,
  111. {
  112. declaration: 'parens-new-line',
  113. assignment: 'parens-new-line',
  114. return: 'parens-new-line',
  115. arrow: 'parens-new-line',
  116. condition: 'parens-new-line',
  117. logical: 'parens-new-line',
  118. prop: 'parens-new-line',
  119. },
  120. ],
  121. },
  122. };