eslint.config.mjs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. // For more info, see https://github.com/storybookjs/eslint-plugin-storybook#configuration-flat-config-format
  2. import storybook from "eslint-plugin-storybook";
  3. import localRulesPlugin from "eslint-plugin-local-rules";
  4. import reactHooks from "eslint-plugin-react-hooks";
  5. import importPlugin from "eslint-plugin-import";
  6. import jsoncParser from "jsonc-eslint-parser";
  7. import jsxA11y from "eslint-plugin-jsx-a11y";
  8. import tseslint from "typescript-eslint";
  9. import react from "eslint-plugin-react";
  10. import jsonc from "eslint-plugin-jsonc";
  11. import globals from "globals";
  12. import js from "@eslint/js";
  13. export default tseslint.config({
  14. ignores: [
  15. "node_modules",
  16. "dist",
  17. "lib",
  18. ".history",
  19. "version.mjs"
  20. ]
  21. }, js.configs.recommended, ...tseslint.configs.recommended, {
  22. files: [
  23. "**/*.{ts,tsx,js,jsx}"
  24. ],
  25. plugins: {
  26. react,
  27. "react-hooks": reactHooks,
  28. "jsx-a11y": jsxA11y,
  29. import: importPlugin,
  30. "local-rules": {
  31. rules: localRulesPlugin.rules
  32. }
  33. },
  34. languageOptions: {
  35. ecmaVersion: "latest",
  36. sourceType: "module",
  37. parser: tseslint.parser,
  38. parserOptions: {
  39. ecmaFeatures: {
  40. jsx: true
  41. }
  42. },
  43. globals: {
  44. "clearInterval": "readonly",
  45. "clearTimeout": "readonly",
  46. "setInterval": "readonly",
  47. "setTimeout": "readonly",
  48. "FormData": "readonly",
  49. "console": "readonly",
  50. "__DEV__": "readonly",
  51. "fetch": "readonly"
  52. }
  53. },
  54. settings: {
  55. react: {
  56. version: "detect"
  57. },
  58. "import/resolver": {
  59. typescript: {
  60. alwaysTryTypes: true,
  61. project: "./tsconfig.json"
  62. }
  63. }
  64. },
  65. rules: {
  66. "local-rules/multiline-import-specifiers": "error",
  67. "local-rules/multiline-object-properties": "error",
  68. "local-rules/multiline-jsx-attributes": "error",
  69. "local-rules/multiline-array-elements": "error",
  70. "local-rules/custom-import-order": "error",
  71. "@typescript-eslint/no-namespace": "off",
  72. "quotes": [
  73. "error",
  74. "double",
  75. {
  76. "avoidEscape": true
  77. }
  78. ],
  79. "semi": [
  80. "error",
  81. "always"
  82. ],
  83. "no-var": "error",
  84. "prefer-const": "error",
  85. "comma-spacing": [
  86. "error",
  87. {
  88. "before": false,
  89. "after": true
  90. }
  91. ],
  92. "object-curly-spacing": [
  93. "error",
  94. "always"
  95. ],
  96. "indent": [
  97. "error",
  98. 4,
  99. {
  100. "SwitchCase": 1
  101. }
  102. ],
  103. "no-trailing-spaces": [
  104. "error",
  105. {
  106. "skipBlankLines": false
  107. }
  108. ],
  109. "@typescript-eslint/no-empty-object-type": [
  110. "error",
  111. {
  112. "allowInterfaces": "with-single-extends"
  113. }
  114. ],
  115. "eol-last": [
  116. "error",
  117. "always"
  118. ],
  119. "object-curly-newline": [
  120. "error",
  121. {
  122. "ObjectExpression": {
  123. "minProperties": 1,
  124. "consistent": true,
  125. "multiline": true
  126. },
  127. "ObjectPattern": {
  128. "minProperties": 1,
  129. "consistent": true,
  130. "multiline": true
  131. },
  132. "ImportDeclaration": {
  133. "minProperties": 1,
  134. "consistent": true,
  135. "multiline": true
  136. },
  137. "ExportDeclaration": {
  138. "minProperties": 1,
  139. "consistent": true,
  140. "multiline": true
  141. }
  142. }
  143. ],
  144. "object-property-newline": [
  145. "error",
  146. {
  147. "allowAllPropertiesOnSameLine": false
  148. }
  149. ],
  150. "array-element-newline": [
  151. "error",
  152. {
  153. "multiline": true,
  154. "minItems": 1
  155. }
  156. ],
  157. "array-bracket-newline": [
  158. "error",
  159. "consistent"
  160. ],
  161. "react/jsx-indent": [
  162. "error",
  163. 4
  164. ],
  165. "react/jsx-indent-props": [
  166. "error",
  167. 4
  168. ],
  169. "react/react-in-jsx-scope": "off"
  170. }
  171. }, {
  172. files: [
  173. "eslint-local-rules/**/*.js",
  174. "babel.config.js",
  175. "**/*.config.mjs",
  176. "**/*.config.js"
  177. ],
  178. languageOptions: {
  179. globals: {
  180. ...globals.node
  181. }
  182. }
  183. }, {
  184. files: [
  185. "**/*.json"
  186. ],
  187. plugins: {
  188. jsonc
  189. },
  190. languageOptions: {
  191. parser: jsoncParser
  192. },
  193. rules: {
  194. "jsonc/indent": [
  195. "error",
  196. 4
  197. ],
  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. }
  224. }, storybook.configs["flat/recommended"]);