Jack Franklin | aba8800 | 2020-11-26 16:23:05 | [diff] [blame] | 1 | // Copyright 2020 The Chromium Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
Jack Franklin | df0e931 | 2022-12-05 10:29:52 | [diff] [blame] | 5 | // clang-format off |
| 6 | |
Tim van der Lippe | d6c33c4 | 2020-03-10 16:57:22 | [diff] [blame] | 7 | const path = require('path'); |
Jack Franklin | aba8800 | 2020-11-26 16:23:05 | [diff] [blame] | 8 | const rulesDirPlugin = require('eslint-plugin-rulesdir'); |
Tim van der Lippe | d6c33c4 | 2020-03-10 16:57:22 | [diff] [blame] | 9 | rulesDirPlugin.RULES_DIR = path.join(__dirname, 'scripts', 'eslint_rules', 'lib'); |
| 10 | |
Blink Reformat | 4c46d09 | 2018-04-07 15:32:37 | [diff] [blame] | 11 | module.exports = { |
Tim van der Lippe | 1d6e57a | 2019-09-30 11:55:34 | [diff] [blame] | 12 | 'root': true, |
Blink Reformat | 4c46d09 | 2018-04-07 15:32:37 | [diff] [blame] | 13 | |
Tim van der Lippe | 1d6e57a | 2019-09-30 11:55:34 | [diff] [blame] | 14 | 'env': {'browser': true, 'es6': true}, |
Blink Reformat | 4c46d09 | 2018-04-07 15:32:37 | [diff] [blame] | 15 | |
Tim van der Lippe | 399a956 | 2020-01-16 10:53:28 | [diff] [blame] | 16 | 'parser': '@typescript-eslint/parser', |
| 17 | |
| 18 | 'plugins': [ |
| 19 | '@typescript-eslint', |
Jack Franklin | 8b9aa2f | 2020-02-12 16:35:15 | [diff] [blame] | 20 | 'mocha', |
Tim van der Lippe | d6c33c4 | 2020-03-10 16:57:22 | [diff] [blame] | 21 | 'rulesdir', |
Tim van der Lippe | 298b8cc | 2020-04-03 11:55:10 | [diff] [blame] | 22 | 'import', |
Jack Franklin | fd72c07 | 2022-12-21 11:45:01 | [diff] [blame] | 23 | 'jsdoc', |
Tim van der Lippe | 399a956 | 2020-01-16 10:53:28 | [diff] [blame] | 24 | ], |
| 25 | |
Tim van der Lippe | 1d6e57a | 2019-09-30 11:55:34 | [diff] [blame] | 26 | 'parserOptions': {'ecmaVersion': 9, 'sourceType': 'module'}, |
Blink Reformat | 4c46d09 | 2018-04-07 15:32:37 | [diff] [blame] | 27 | |
Tim van der Lippe | 1d6e57a | 2019-09-30 11:55:34 | [diff] [blame] | 28 | /** |
Tim van der Lippe | 406249f | 2020-12-14 14:59:10 | [diff] [blame] | 29 | * ESLint rules |
| 30 | * |
| 31 | * All available rules: http://eslint.org/docs/rules/ |
Tim van der Lippe | 406249f | 2020-12-14 14:59:10 | [diff] [blame] | 32 | */ |
Tim van der Lippe | 1d6e57a | 2019-09-30 11:55:34 | [diff] [blame] | 33 | 'rules': { |
| 34 | /** |
Tim van der Lippe | 406249f | 2020-12-14 14:59:10 | [diff] [blame] | 35 | * Enforced rules |
| 36 | */ |
Blink Reformat | 4c46d09 | 2018-04-07 15:32:37 | [diff] [blame] | 37 | |
Tim van der Lippe | 1d6e57a | 2019-09-30 11:55:34 | [diff] [blame] | 38 | // syntax preferences |
Nikolay Vitkov | c62f5c5 | 2024-01-17 13:23:34 | [diff] [blame] | 39 | 'quotes': ['error', 'single', {'avoidEscape': true, 'allowTemplateLiterals': false}], |
| 40 | 'semi': 'error', |
| 41 | 'no-extra-semi': 'error', |
| 42 | 'comma-style': ['error', 'last'], |
| 43 | 'wrap-iife': ['error', 'inside'], |
| 44 | 'spaced-comment': ['error', 'always', {'markers': ['*']}], |
| 45 | 'eqeqeq': 'error', |
| 46 | 'accessor-pairs': ['error', {'getWithoutSet': false, 'setWithoutGet': false}], |
| 47 | 'curly': 'error', |
| 48 | 'new-parens': 'error', |
| 49 | 'func-call-spacing': 'error', |
| 50 | 'arrow-parens': ['error', 'as-needed'], |
| 51 | 'eol-last': 'error', |
Blink Reformat | 4c46d09 | 2018-04-07 15:32:37 | [diff] [blame] | 52 | |
Tim van der Lippe | 1d6e57a | 2019-09-30 11:55:34 | [diff] [blame] | 53 | // anti-patterns |
Nikolay Vitkov | c62f5c5 | 2024-01-17 13:23:34 | [diff] [blame] | 54 | 'no-caller': 'error', |
| 55 | 'no-case-declarations': 'error', |
| 56 | 'no-cond-assign': 'error', |
| 57 | 'no-console': ['error', {'allow': ['assert', 'context', 'error', 'timeStamp', 'time', 'timeEnd', 'warn']}], |
| 58 | 'no-debugger': 'error', |
| 59 | 'no-dupe-keys': 'error', |
| 60 | 'no-duplicate-case': 'error', |
| 61 | 'no-else-return': ['error', {'allowElseIf': false}], |
| 62 | 'no-empty-character-class': 'error', |
| 63 | 'no-global-assign': 'error', |
| 64 | 'no-implied-eval': 'error', |
| 65 | 'no-labels': 'error', |
| 66 | 'no-multi-str': 'error', |
| 67 | 'no-new-object': 'error', |
| 68 | 'no-octal-escape': 'error', |
| 69 | 'no-self-compare': 'error', |
| 70 | 'no-shadow-restricted-names': 'error', |
| 71 | 'no-unreachable': 'error', |
| 72 | 'no-unsafe-negation': 'error', |
| 73 | 'no-unused-vars': ['error', {'args': 'none', 'vars': 'local'}], |
| 74 | 'no-var': 'error', |
| 75 | 'no-with': 'error', |
| 76 | 'prefer-const': 'error', |
| 77 | 'radix': 'error', |
| 78 | 'valid-typeof': 'error', |
| 79 | 'no-return-assign': ['error', 'always'], |
| 80 | 'no-implicit-coercion': 'error', |
Blink Reformat | 4c46d09 | 2018-04-07 15:32:37 | [diff] [blame] | 81 | |
Tim van der Lippe | 1d6e57a | 2019-09-30 11:55:34 | [diff] [blame] | 82 | // es2015 features |
Nikolay Vitkov | c62f5c5 | 2024-01-17 13:23:34 | [diff] [blame] | 83 | 'require-yield': 'error', |
| 84 | 'template-curly-spacing': ['error', 'never'], |
Blink Reformat | 4c46d09 | 2018-04-07 15:32:37 | [diff] [blame] | 85 | |
Tim van der Lippe | 1d6e57a | 2019-09-30 11:55:34 | [diff] [blame] | 86 | // file whitespace |
Nikolay Vitkov | c62f5c5 | 2024-01-17 13:23:34 | [diff] [blame] | 87 | 'no-multiple-empty-lines': ['error', {'max': 1}], |
| 88 | 'no-mixed-spaces-and-tabs': 'error', |
| 89 | 'no-trailing-spaces': 'error', |
| 90 | 'linebreak-style': ['error', 'unix'], |
Blink Reformat | 4c46d09 | 2018-04-07 15:32:37 | [diff] [blame] | 91 | |
Tim van der Lippe | 1d6e57a | 2019-09-30 11:55:34 | [diff] [blame] | 92 | /** |
Tim van der Lippe | 406249f | 2020-12-14 14:59:10 | [diff] [blame] | 93 | * Disabled, aspirational rules |
| 94 | */ |
Blink Reformat | 4c46d09 | 2018-04-07 15:32:37 | [diff] [blame] | 95 | |
Nikolay Vitkov | c62f5c5 | 2024-01-17 13:23:34 | [diff] [blame] | 96 | 'indent': ['off', 2, {'SwitchCase': 1, 'CallExpression': {'arguments': 2}, 'MemberExpression': 2}], |
Blink Reformat | 4c46d09 | 2018-04-07 15:32:37 | [diff] [blame] | 97 | |
Tim van der Lippe | 1d6e57a | 2019-09-30 11:55:34 | [diff] [blame] | 98 | // brace-style is disabled, as eslint cannot enforce 1tbs as default, but allman for functions |
Nikolay Vitkov | c62f5c5 | 2024-01-17 13:23:34 | [diff] [blame] | 99 | 'brace-style': ['off', 'allman', {'allowSingleLine': true}], |
Blink Reformat | 4c46d09 | 2018-04-07 15:32:37 | [diff] [blame] | 100 | |
Tim van der Lippe | 1d6e57a | 2019-09-30 11:55:34 | [diff] [blame] | 101 | // key-spacing is disabled, as some objects use value-aligned spacing, some not. |
Nikolay Vitkov | c62f5c5 | 2024-01-17 13:23:34 | [diff] [blame] | 102 | 'key-spacing': ['off', {'beforeColon': false, 'afterColon': true, 'align': 'value'}], |
Tim van der Lippe | 1d6e57a | 2019-09-30 11:55:34 | [diff] [blame] | 103 | // quote-props is diabled, as property quoting styles are too varied to enforce. |
Nikolay Vitkov | c62f5c5 | 2024-01-17 13:23:34 | [diff] [blame] | 104 | 'quote-props': ['off', 'as-needed'], |
Blink Reformat | 4c46d09 | 2018-04-07 15:32:37 | [diff] [blame] | 105 | |
Tim van der Lippe | 1d6e57a | 2019-09-30 11:55:34 | [diff] [blame] | 106 | // no-implicit-globals will prevent accidental globals |
Nikolay Vitkov | c62f5c5 | 2024-01-17 13:23:34 | [diff] [blame] | 107 | 'no-implicit-globals': 'off', |
| 108 | 'no-unused-private-class-members': 'error', |
Tim van der Lippe | 399a956 | 2020-01-16 10:53:28 | [diff] [blame] | 109 | |
Jack Franklin | 264237a | 2020-07-15 09:02:26 | [diff] [blame] | 110 | // forbids interfaces starting with an I prefix. |
Paul Lewis | 839037f | 2020-07-21 12:25:19 | [diff] [blame] | 111 | '@typescript-eslint/naming-convention': |
Nikolay Vitkov | c62f5c5 | 2024-01-17 13:23:34 | [diff] [blame] | 112 | ['error', {'selector': 'interface', 'format': ['PascalCase'], 'custom': {'regex': '^I[A-Z]', 'match': false}}], |
| 113 | '@typescript-eslint/explicit-member-accessibility': 'off', |
Benedikt Meurer | cfc8cd6 | 2024-01-17 10:08:28 | [diff] [blame] | 114 | '@typescript-eslint/no-explicit-any': [ |
| 115 | "error", |
| 116 | { |
| 117 | "ignoreRestArgs": true |
| 118 | } |
| 119 | ], |
Jack Franklin | 8b9aa2f | 2020-02-12 16:35:15 | [diff] [blame] | 120 | |
Tim van der Lippe | 298b8cc | 2020-04-03 11:55:10 | [diff] [blame] | 121 | // Closure does not properly typecheck default exports |
Nikolay Vitkov | c62f5c5 | 2024-01-17 13:23:34 | [diff] [blame] | 122 | 'import/no-default-export': 'error', |
Tim van der Lippe | 298b8cc | 2020-04-03 11:55:10 | [diff] [blame] | 123 | |
Jack Franklin | 6d9f877 | 2023-07-11 10:55:01 | [diff] [blame] | 124 | /** |
| 125 | * Catch duplicate import paths. For example this would catch the following example: |
| 126 | * import {Foo} from './foo.js' |
| 127 | * import * as FooModule from './foo.js' |
| 128 | **/ |
Nikolay Vitkov | c62f5c5 | 2024-01-17 13:23:34 | [diff] [blame] | 129 | 'import/no-duplicates': 'error', |
Jack Franklin | 6d9f877 | 2023-07-11 10:55:01 | [diff] [blame] | 130 | |
Jack Franklin | 02f0dbb | 2021-03-02 14:10:49 | [diff] [blame] | 131 | // Try to spot '// console.log()' left over from debugging |
Nikolay Vitkov | c62f5c5 | 2024-01-17 13:23:34 | [diff] [blame] | 132 | 'rulesdir/commented_out_console': 'error', |
Jack Franklin | 02f0dbb | 2021-03-02 14:10:49 | [diff] [blame] | 133 | |
Jack Franklin | df0e931 | 2022-12-05 10:29:52 | [diff] [blame] | 134 | // Prevent imports being commented out rather than deleted. |
Nikolay Vitkov | c62f5c5 | 2024-01-17 13:23:34 | [diff] [blame] | 135 | 'rulesdir/commented_out_import': 'error', |
Jack Franklin | df0e931 | 2022-12-05 10:29:52 | [diff] [blame] | 136 | |
Tim van der Lippe | d6c33c4 | 2020-03-10 16:57:22 | [diff] [blame] | 137 | // DevTools specific rules |
Nikolay Vitkov | c62f5c5 | 2024-01-17 13:23:34 | [diff] [blame] | 138 | 'rulesdir/es_modules_import': 'error', |
| 139 | 'rulesdir/check_license_header': 'error', |
Jack Franklin | c8d5dd2 | 2022-12-21 14:58:15 | [diff] [blame] | 140 | /** |
| 141 | * Ensures that JS Doc comments are properly aligned - all the starting |
| 142 | * `*` are in the right place. |
| 143 | */ |
Nikolay Vitkov | c62f5c5 | 2024-01-17 13:23:34 | [diff] [blame] | 144 | 'jsdoc/check-alignment': 'error', |
Tim van der Lippe | 399a956 | 2020-01-16 10:53:28 | [diff] [blame] | 145 | }, |
| 146 | 'overrides': [{ |
| 147 | 'files': ['*.ts'], |
Simon Zünd | 607774a | 2021-06-16 10:55:53 | [diff] [blame] | 148 | 'parserOptions': { |
| 149 | 'allowAutomaticSingleRunInference': true, |
Jack Franklin | 468d759 | 2023-06-02 13:17:33 | [diff] [blame] | 150 | 'project': path.join(__dirname, 'config', 'typescript', 'tsconfig.eslint.json'), |
Simon Zünd | 607774a | 2021-06-16 10:55:53 | [diff] [blame] | 151 | }, |
Tim van der Lippe | 399a956 | 2020-01-16 10:53:28 | [diff] [blame] | 152 | 'rules': { |
Nikolay Vitkov | c62f5c5 | 2024-01-17 13:23:34 | [diff] [blame] | 153 | '@typescript-eslint/explicit-member-accessibility': ['error', {'accessibility': 'no-public'}], |
Sigurd Schneider | 9c07567 | 2021-02-03 13:16:39 | [diff] [blame] | 154 | 'comma-dangle': 'off', |
Nikolay Vitkov | c62f5c5 | 2024-01-17 13:23:34 | [diff] [blame] | 155 | '@typescript-eslint/comma-dangle': ['error', 'always-multiline'], |
Tim van der Lippe | 0ebbf49 | 2020-12-03 12:13:21 | [diff] [blame] | 156 | |
Jack Franklin | 9531032 | 2020-03-20 14:34:04 | [diff] [blame] | 157 | // run just the TypeScript unused-vars rule, else we get duplicate errors |
Nikolay Vitkov | c62f5c5 | 2024-01-17 13:23:34 | [diff] [blame] | 158 | 'no-unused-vars': 'off', |
| 159 | '@typescript-eslint/no-unused-vars': ['error', {'argsIgnorePattern': '^_'}], |
Tim van der Lippe | 0ebbf49 | 2020-12-03 12:13:21 | [diff] [blame] | 160 | // run just the TypeScript semi rule, else we get duplicate errors |
Nikolay Vitkov | c62f5c5 | 2024-01-17 13:23:34 | [diff] [blame] | 161 | 'semi': 'off', |
| 162 | '@typescript-eslint/semi': 'error', |
Sigurd Schneider | 1576186 | 2021-02-04 08:05:36 | [diff] [blame] | 163 | '@typescript-eslint/member-delimiter-style': [ |
| 164 | 'error', { |
| 165 | 'multiline': {'delimiter': 'semi', 'requireLast': true}, |
| 166 | 'singleline': {'delimiter': 'comma', 'requireLast': false}, |
| 167 | 'overrides': { |
| 168 | 'interface': { |
| 169 | 'singleline': {'delimiter': 'semi', 'requireLast': false}, |
| 170 | 'multiline': {'delimiter': 'semi', 'requireLast': true} |
| 171 | }, |
| 172 | 'typeLiteral': { |
| 173 | 'singleline': {'delimiter': 'comma', 'requireLast': false}, |
| 174 | 'multiline': {'delimiter': 'comma', 'requireLast': true} |
| 175 | } |
| 176 | } |
| 177 | } |
| 178 | ], |
Nikolay Vitkov | c62f5c5 | 2024-01-17 13:23:34 | [diff] [blame] | 179 | '@typescript-eslint/no-floating-promises': ['error', {ignoreVoid: true}], |
Songtao Xia | 165a119 | 2021-01-28 14:09:40 | [diff] [blame] | 180 | // func-call-spacing doesn't work well with .ts |
Nikolay Vitkov | c62f5c5 | 2024-01-17 13:23:34 | [diff] [blame] | 181 | 'func-call-spacing': 'off', |
| 182 | '@typescript-eslint/func-call-spacing': 'error', |
Tim van der Lippe | 0ebbf49 | 2020-12-03 12:13:21 | [diff] [blame] | 183 | |
Jack Franklin | aba8800 | 2020-11-26 16:23:05 | [diff] [blame] | 184 | /** |
| 185 | * Enforce that enum members are explicitly defined: |
| 186 | * const enum Foo { A = 'a' } rather than const enum Foo { A } |
| 187 | */ |
Nikolay Vitkov | c62f5c5 | 2024-01-17 13:23:34 | [diff] [blame] | 188 | '@typescript-eslint/prefer-enum-initializers': 'error', |
Jack Franklin | fc49590 | 2020-12-01 17:24:37 | [diff] [blame] | 189 | /** |
| 190 | * Ban non-null assertion operator, e.g.: |
| 191 | * this.foo!.toLowerCase() |
| 192 | */ |
Nikolay Vitkov | c62f5c5 | 2024-01-17 13:23:34 | [diff] [blame] | 193 | '@typescript-eslint/no-non-null-assertion': 'error', |
| 194 | '@typescript-eslint/consistent-type-imports': 'error', |
Nikolay Vitkov | c62f5c5 | 2024-01-17 13:23:34 | [diff] [blame] | 195 | 'rulesdir/no_underscored_properties': 'error', |
| 196 | 'rulesdir/prefer_readonly_keyword': 'error', |
| 197 | 'rulesdir/inline_type_imports': 'error', |
Tim van der Lippe | 399a956 | 2020-01-16 10:53:28 | [diff] [blame] | 198 | } |
| 199 | }] |
Blink Reformat | 4c46d09 | 2018-04-07 15:32:37 | [diff] [blame] | 200 | }; |
Jack Franklin | df0e931 | 2022-12-05 10:29:52 | [diff] [blame] | 201 | |
| 202 | // clang-format on |