eslint.config.mjs 6.3 KB

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