eslint.config.mjs 7.7 KB

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