eslint.config.mjs 6.7 KB

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