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