eslint.config.mjs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. import { defineConfig, globalIgnores } from 'eslint/config';
  2. import mochaNoOnly from 'eslint-plugin-mocha-no-only';
  3. import globals from 'globals';
  4. import tseslint from 'typescript-eslint';
  5. import js from '@eslint/js';
  6. export default defineConfig([
  7. globalIgnores([
  8. '**/tools',
  9. '**/dist',
  10. 'test/files/*',
  11. '**/benchmarks',
  12. '**/*.min.js',
  13. '**/docs/js/native.js',
  14. '!**/.*',
  15. '**/node_modules',
  16. '**/.git',
  17. '**/data'
  18. ]),
  19. js.configs.recommended,
  20. // general options
  21. {
  22. languageOptions: {
  23. globals: globals.node,
  24. ecmaVersion: 2022, // nodejs 18.0.0,
  25. sourceType: 'commonjs'
  26. },
  27. rules: {
  28. 'comma-style': 'error',
  29. indent: ['error', 2, {
  30. SwitchCase: 1,
  31. VariableDeclarator: 2
  32. }],
  33. 'keyword-spacing': 'error',
  34. 'no-whitespace-before-property': 'error',
  35. 'no-buffer-constructor': 'warn',
  36. 'no-console': 'off',
  37. 'no-constant-condition': 'off',
  38. 'no-multi-spaces': 'error',
  39. 'func-call-spacing': 'error',
  40. 'no-trailing-spaces': 'error',
  41. 'no-undef': 'error',
  42. 'no-unneeded-ternary': 'error',
  43. 'no-const-assign': 'error',
  44. 'no-useless-rename': 'error',
  45. 'no-dupe-keys': 'error',
  46. 'space-in-parens': ['error', 'never'],
  47. 'spaced-comment': ['error', 'always', {
  48. block: {
  49. markers: ['!'],
  50. balanced: true
  51. }
  52. }],
  53. 'key-spacing': ['error', {
  54. beforeColon: false,
  55. afterColon: true
  56. }],
  57. 'comma-spacing': ['error', {
  58. before: false,
  59. after: true
  60. }],
  61. 'array-bracket-spacing': 1,
  62. 'arrow-spacing': ['error', {
  63. before: true,
  64. after: true
  65. }],
  66. 'object-curly-spacing': ['error', 'always'],
  67. 'comma-dangle': ['error', 'never'],
  68. 'no-unreachable': 'error',
  69. quotes: ['error', 'single'],
  70. 'quote-props': ['error', 'as-needed'],
  71. semi: 'error',
  72. 'no-extra-semi': 'error',
  73. 'semi-spacing': 'error',
  74. 'no-spaced-func': 'error',
  75. 'no-throw-literal': 'error',
  76. 'space-before-blocks': 'error',
  77. 'space-before-function-paren': ['error', 'never'],
  78. 'space-infix-ops': 'error',
  79. 'space-unary-ops': 'error',
  80. 'no-var': 'warn',
  81. 'prefer-const': 'warn',
  82. strict: ['error', 'global'],
  83. 'no-restricted-globals': ['error', {
  84. name: 'context',
  85. message: 'Don\'t use Mocha\'s global context'
  86. }],
  87. 'no-prototype-builtins': 'off',
  88. 'no-empty': 'off',
  89. 'eol-last': 'warn',
  90. 'no-multiple-empty-lines': ['warn', {
  91. max: 2
  92. }]
  93. }
  94. },
  95. // general typescript options
  96. {
  97. files: ['**/*.{ts,tsx}', '**/*.md/*.ts', '**/*.md/*.typescript'],
  98. extends: [
  99. tseslint.configs.recommended
  100. ],
  101. languageOptions: {
  102. parserOptions: {
  103. projectService: {
  104. allowDefaultProject: [],
  105. defaultProject: 'tsconfig.json'
  106. }
  107. }
  108. },
  109. rules: {
  110. '@typescript-eslint/triple-slash-reference': 'off',
  111. '@typescript-eslint/no-non-null-assertion': 'off',
  112. '@typescript-eslint/no-empty-function': 'off',
  113. 'spaced-comment': ['error', 'always', {
  114. block: {
  115. markers: ['!'],
  116. balanced: true
  117. },
  118. markers: ['/']
  119. }],
  120. '@typescript-eslint/no-explicit-any': 'off',
  121. '@typescript-eslint/ban-types': 'off',
  122. '@typescript-eslint/no-unused-vars': 'off',
  123. '@typescript-eslint/explicit-module-boundary-types': 'off',
  124. '@typescript-eslint/prefer-optional-chain': 'error',
  125. '@typescript-eslint/no-dupe-class-members': 'error',
  126. '@typescript-eslint/no-redeclare': 'error',
  127. '@typescript-eslint/space-infix-ops': 'off',
  128. '@typescript-eslint/no-require-imports': 'off',
  129. '@typescript-eslint/no-empty-object-type': 'off',
  130. '@typescript-eslint/no-wrapper-object-types': 'off',
  131. '@typescript-eslint/no-unused-expressions': 'off',
  132. '@typescript-eslint/no-unsafe-function-type': 'off'
  133. }
  134. },
  135. // type test specific options
  136. {
  137. files: ['test/types/**/*.ts'],
  138. rules: {
  139. '@typescript-eslint/no-empty-interface': 'off'
  140. }
  141. },
  142. // test specific options (including type tests)
  143. {
  144. files: ['test/**/*.js', 'test/**/*.ts'],
  145. ignores: ['deno*.mjs'],
  146. plugins: {
  147. 'mocha-no-only': mochaNoOnly
  148. },
  149. languageOptions: {
  150. globals: globals.mocha
  151. },
  152. rules: {
  153. 'no-self-assign': 'off',
  154. 'mocha-no-only/mocha-no-only': ['error']
  155. }
  156. },
  157. // deno specific options
  158. {
  159. files: ['**/deno*.mjs'],
  160. languageOptions: {
  161. globals: {
  162. // "globals" currently has no definition for deno
  163. Deno: 'readonly'
  164. }
  165. }
  166. },
  167. // general options for module files
  168. {
  169. files: ['**/*.mjs'],
  170. languageOptions: {
  171. sourceType: 'module'
  172. }
  173. },
  174. // doc script specific options
  175. {
  176. files: ['**/docs/js/**/*.js'],
  177. languageOptions: {
  178. globals: {
  179. ...Object.fromEntries(Object.entries(globals.node).map(([key]) => [key, 'off'])),
  180. ...globals.browser }
  181. }
  182. }
  183. ]);