eslint.config.mjs 6.5 KB

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