eslint.config.mjs 7.9 KB

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