eslint.config.mjs 7.6 KB

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