.eslintrc.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. module.exports = {
  2. plugins: ['jsx-a11y', 'prettier', 'react', 'react-hooks', 'import', 'jest'],
  3. parser: '@typescript-eslint/parser',
  4. parserOptions: {
  5. ecmaVersion: 8,
  6. tokens: true,
  7. sourceType: 'module',
  8. },
  9. env: {
  10. browser: true,
  11. commonjs: true,
  12. es6: true,
  13. node: true,
  14. jest: true,
  15. },
  16. extends: [
  17. 'airbnb-base',
  18. 'prettier',
  19. 'plugin:@typescript-eslint/eslint-recommended',
  20. 'plugin:@typescript-eslint/recommended',
  21. 'plugin:jest/all',
  22. 'plugin:jsx-a11y/recommended',
  23. 'plugin:react/recommended',
  24. ],
  25. settings: {
  26. 'import/extensions': ['.ts', '.tsx', '.js', '.jsx'],
  27. 'import/parsers': {
  28. '@typescript-eslint/parser': ['.ts', '.tsx'],
  29. },
  30. 'import/resolver': {
  31. node: {
  32. extensions: ['.js', '.jsx', '.ts', '.tsx'],
  33. },
  34. },
  35. react: {
  36. version: 'detect',
  37. },
  38. },
  39. rules: {
  40. '@typescript-eslint/camelcase': 'off',
  41. '@typescript-eslint/explicit-function-return-type': 'off',
  42. '@typescript-eslint/no-explicit-any': [
  43. 'error',
  44. {
  45. ignoreRestArgs: true,
  46. },
  47. ],
  48. '@typescript-eslint/no-shadow': 'error',
  49. '@typescript-eslint/no-use-before-define': 'error',
  50. '@typescript-eslint/no-var-requires': 'off',
  51. camelcase: 'off',
  52. 'import/extensions': [
  53. 'error',
  54. 'ignorePackages',
  55. {
  56. '': 'never',
  57. js: 'never',
  58. jsx: 'never',
  59. ts: 'never',
  60. tsx: 'never',
  61. },
  62. ],
  63. 'import/order': [
  64. 'error',
  65. {
  66. groups: ['builtin', 'external', 'parent', 'sibling', 'index'],
  67. alphabetize: {
  68. order: 'asc',
  69. caseInsensitive: true,
  70. },
  71. },
  72. ],
  73. 'import/no-extraneous-dependencies': [
  74. 'error',
  75. {
  76. devDependencies: ['**/*spec.ts', '**/*.spec.tsx', '**/*.spec.js'],
  77. },
  78. ],
  79. 'import/prefer-default-export': 'off',
  80. 'jest/lowercase-name': 'off',
  81. 'jest/no-hooks': 'off',
  82. 'jest/prefer-expect-assertions': 'warn',
  83. 'jest/prefer-strict-equal': 'warn',
  84. 'jest/require-top-level-describe': 'off',
  85. 'jest/valid-title': [
  86. 'error',
  87. {
  88. ignoreTypeOfDescribeName: true,
  89. },
  90. ],
  91. 'max-len': ['error', 120],
  92. 'no-bitwise': 'off',
  93. 'no-underscore-dangle': 'off',
  94. 'no-shadow': 'off',
  95. 'no-use-before-define': 'off',
  96. 'no-warning-comments': 'warn',
  97. 'prettier/prettier': ['error'],
  98. 'react/jsx-filename-extension': [
  99. 2,
  100. {
  101. extensions: ['.js', '.jsx', '.tsx'],
  102. },
  103. ],
  104. 'react/prop-types': 'off',
  105. 'react-hooks/rules-of-hooks': 'error',
  106. 'react-hooks/exhaustive-deps': 'warn',
  107. },
  108. overrides: [
  109. {
  110. files: ['*.ts', '*.tsx'],
  111. rules: {
  112. 'no-undef-init': 'off',
  113. 'prefer-destructuring': 'off',
  114. '@typescript-eslint/explicit-function-return-type': ['error'],
  115. '@typescript-eslint/no-unused-vars': ['error', { ignoreRestSiblings: true }],
  116. '@typescript-eslint/no-var-requires': ['error'],
  117. },
  118. },
  119. ],
  120. };