eslint.config.mjs 6.7 KB

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