eslint.config.mjs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. import localRulesPlugin from "eslint-plugin-local-rules";
  2. import reactHooks from "eslint-plugin-react-hooks";
  3. import importPlugin from "eslint-plugin-import";
  4. import jsoncParser from "jsonc-eslint-parser";
  5. import jsxA11y from "eslint-plugin-jsx-a11y";
  6. import tseslint from "typescript-eslint";
  7. import react from "eslint-plugin-react";
  8. import jsonc from "eslint-plugin-jsonc";
  9. import globals from "globals";
  10. import js from "@eslint/js";
  11. export default tseslint.config(
  12. {
  13. ignores: [
  14. "node_modules",
  15. "dist",
  16. "lib",
  17. ".history"
  18. ]
  19. },
  20. js.configs.recommended,
  21. ...tseslint.configs.recommended,
  22. {
  23. files: [
  24. "**/*.{ts,tsx,js,jsx}"
  25. ],
  26. plugins: {
  27. react,
  28. "react-hooks": reactHooks,
  29. "jsx-a11y": jsxA11y,
  30. import: importPlugin,
  31. "local-rules": {
  32. rules: localRulesPlugin.rules
  33. }
  34. },
  35. languageOptions: {
  36. ecmaVersion: "latest",
  37. sourceType: "module",
  38. parser: tseslint.parser,
  39. parserOptions: {
  40. ecmaFeatures: {
  41. jsx: true
  42. }
  43. },
  44. globals: {
  45. "clearInterval": "readonly",
  46. "clearTimeout": "readonly",
  47. "setInterval": "readonly",
  48. "setTimeout": "readonly",
  49. "FormData": "readonly",
  50. "console": "readonly",
  51. "__DEV__": "readonly",
  52. "fetch": "readonly"
  53. }
  54. },
  55. settings: {
  56. react: {
  57. version: "detect"
  58. },
  59. "import/resolver": {
  60. typescript: {
  61. alwaysTryTypes: true,
  62. project: "./tsconfig.json"
  63. }
  64. }
  65. },
  66. rules: {
  67. "local-rules/multiline-import-specifiers": "error",
  68. "local-rules/multiline-object-properties": "error",
  69. "local-rules/multiline-jsx-attributes": "error",
  70. "local-rules/multiline-array-elements": "error",
  71. "local-rules/custom-import-order": "error",
  72. "@typescript-eslint/no-namespace": "off",
  73. "quotes": [
  74. "error",
  75. "double",
  76. {
  77. "avoidEscape": true
  78. }
  79. ],
  80. "semi": [
  81. "error",
  82. "always"
  83. ],
  84. "no-var": "error",
  85. "prefer-const": "error",
  86. "comma-spacing": [
  87. "error",
  88. {
  89. "before": false,
  90. "after": true
  91. }
  92. ],
  93. "object-curly-spacing": [
  94. "error",
  95. "always"
  96. ],
  97. "indent": [
  98. "error",
  99. 4,
  100. {
  101. "SwitchCase": 1
  102. }
  103. ],
  104. "no-trailing-spaces": [
  105. "error",
  106. {
  107. "skipBlankLines": false
  108. }
  109. ],
  110. "@typescript-eslint/no-empty-object-type": [
  111. "error",
  112. {
  113. "allowInterfaces": "with-single-extends"
  114. }
  115. ],
  116. "eol-last": [
  117. "error",
  118. "always"
  119. ],
  120. "object-curly-newline": [
  121. "error",
  122. {
  123. "ObjectExpression": {
  124. "minProperties": 1,
  125. "consistent": true,
  126. "multiline": true
  127. },
  128. "ObjectPattern": {
  129. "minProperties": 1,
  130. "consistent": true,
  131. "multiline": true
  132. },
  133. "ImportDeclaration": {
  134. "minProperties": 1,
  135. "consistent": true,
  136. "multiline": true
  137. },
  138. "ExportDeclaration": {
  139. "minProperties": 1,
  140. "consistent": true,
  141. "multiline": true
  142. }
  143. }
  144. ],
  145. "object-property-newline": [
  146. "error",
  147. {
  148. "allowAllPropertiesOnSameLine": false
  149. }
  150. ],
  151. "array-element-newline": [
  152. "error",
  153. {
  154. "multiline": true,
  155. "minItems": 1
  156. }
  157. ],
  158. "array-bracket-newline": [
  159. "error",
  160. "consistent"
  161. ],
  162. "react/jsx-indent": [
  163. "error",
  164. 4
  165. ],
  166. "react/jsx-indent-props": [
  167. "error",
  168. 4
  169. ],
  170. "react/react-in-jsx-scope": "off"
  171. }
  172. },
  173. {
  174. files: [
  175. "eslint-local-rules/**/*.js",
  176. "babel.config.js",
  177. "**/*.config.mjs",
  178. "**/*.config.js"
  179. ],
  180. languageOptions: {
  181. globals: {
  182. ...globals.node
  183. }
  184. }
  185. },
  186. {
  187. files: [
  188. "**/*.json"
  189. ],
  190. plugins: {
  191. jsonc
  192. },
  193. languageOptions: {
  194. parser: jsoncParser
  195. },
  196. rules: {
  197. "jsonc/indent": [
  198. "error",
  199. 4
  200. ],
  201. "jsonc/object-property-newline": [
  202. "error",
  203. {
  204. "allowAllPropertiesOnSameLine": false
  205. }
  206. ],
  207. "jsonc/object-curly-newline": [
  208. "error",
  209. {
  210. "minProperties": 0,
  211. "consistent": true,
  212. "multiline": true
  213. }
  214. ],
  215. "jsonc/array-element-newline": [
  216. "error",
  217. {
  218. "multiline": true,
  219. "minItems": 1
  220. }
  221. ],
  222. "jsonc/array-bracket-newline": [
  223. "error",
  224. "always"
  225. ]
  226. }
  227. }
  228. );