|
1 | 1 | { |
| 2 | + "root": true, |
2 | 3 | "parser": "@typescript-eslint/parser", |
3 | 4 | "parserOptions": { |
4 | 5 | "warnOnUnsupportedTypeScriptVersion": false, |
5 | | - "ecmaVersion": 6, |
6 | 6 | "sourceType": "module" |
7 | 7 | }, |
8 | 8 | "env": { |
|
11 | 11 | "es6": true |
12 | 12 | }, |
13 | 13 | "plugins": [ |
14 | | - "@typescript-eslint", "jsdoc", "no-null", "import" |
| 14 | + "@typescript-eslint", "no-null", "import", "eslint-plugin-local", "simple-import-sort" |
| 15 | + ], |
| 16 | + "ignorePatterns": [ |
| 17 | + "**/node_modules/**", |
| 18 | + "/built/**", |
| 19 | + "/tests/**", |
| 20 | + "/lib/**", |
| 21 | + "/src/lib/*.generated.d.ts", |
| 22 | + "/scripts/**/*.js", |
| 23 | + "/scripts/**/*.d.*", |
| 24 | + "/internal/**", |
| 25 | + "/coverage/**" |
15 | 26 | ], |
16 | 27 | "rules": { |
| 28 | + "simple-import-sort/imports": "error", |
| 29 | + "simple-import-sort/exports": "error", |
| 30 | + |
17 | 31 | "@typescript-eslint/adjacent-overload-signatures": "error", |
18 | 32 | "@typescript-eslint/array-type": "error", |
| 33 | + "@typescript-eslint/no-array-constructor": "error", |
19 | 34 |
|
20 | 35 | "brace-style": "off", |
21 | 36 | "@typescript-eslint/brace-style": ["error", "stroustrup", { "allowSingleLine": true }], |
|
27 | 42 | { "selector": "variable", "format": ["camelCase", "PascalCase", "UPPER_CASE"], "leadingUnderscore": "allow", "filter": { "regex": "^(_{1,2}filename|_{1,2}dirname|_+|[A-Za-z]+_[A-Za-z]+)$", "match": false } }, |
28 | 43 | { "selector": "function", "format": ["camelCase", "PascalCase"], "leadingUnderscore": "allow", "filter": { "regex": "^[A-Za-z]+_[A-Za-z]+$", "match": false } }, |
29 | 44 | { "selector": "parameter", "format": ["camelCase"], "leadingUnderscore": "allow", "filter": { "regex": "^(_+|[A-Za-z]+_[A-Z][a-z]+)$", "match": false } }, |
30 | | - { "selector": "method", "format": ["camelCase", "PascalCase"], "leadingUnderscore": "allow", "filter": { "regex": "^[A-Za-z]+_[A-Za-z]+$", "match": false } }, |
31 | | - { "selector": "memberLike", "format": ["camelCase"], "leadingUnderscore": "allow", "filter": { "regex": "^[A-Za-z]+_[A-Za-z]+$", "match": false } }, |
| 45 | + { "selector": "method", "format": ["camelCase", "PascalCase"], "leadingUnderscore": "allow", "filter": { "regex": "^([0-9]+|[A-Za-z]+_[A-Za-z]+)$", "match": false } }, |
| 46 | + { "selector": "memberLike", "format": ["camelCase"], "leadingUnderscore": "allow", "filter": { "regex": "^([0-9]+|[A-Za-z]+_[A-Za-z]+)$", "match": false } }, |
32 | 47 | { "selector": "enumMember", "format": ["camelCase", "PascalCase"], "leadingUnderscore": "allow", "filter": { "regex": "^[A-Za-z]+_[A-Za-z]+$", "match": false } }, |
33 | 48 | { "selector": "property", "format": null } |
34 | 49 | ], |
35 | 50 |
|
36 | 51 | "@typescript-eslint/consistent-type-definitions": ["error", "interface"], |
| 52 | + "@typescript-eslint/consistent-type-assertions": ["error", { "assertionStyle": "as" }], |
| 53 | + |
| 54 | + "max-statements-per-line": ["error", { "max": 1 }], |
37 | 55 |
|
38 | 56 | "no-duplicate-imports": "off", |
39 | 57 | "@typescript-eslint/no-duplicate-imports": "error", |
|
48 | 66 | "@typescript-eslint/prefer-for-of": "error", |
49 | 67 | "@typescript-eslint/prefer-function-type": "error", |
50 | 68 | "@typescript-eslint/prefer-namespace-keyword": "error", |
| 69 | + "@typescript-eslint/prefer-as-const": "error", |
51 | 70 |
|
52 | 71 | "quotes": "off", |
53 | 72 | "@typescript-eslint/quotes": ["error", "double", { "avoidEscape": true, "allowTemplateLiterals": true }], |
54 | 73 |
|
55 | 74 | "semi": "off", |
56 | 75 | "@typescript-eslint/semi": "error", |
| 76 | + "@typescript-eslint/no-extra-semi": "error", |
57 | 77 |
|
58 | 78 | "space-before-function-paren": "off", |
59 | 79 | "@typescript-eslint/space-before-function-paren": ["error", { |
|
66 | 86 | "@typescript-eslint/type-annotation-spacing": "error", |
67 | 87 | "@typescript-eslint/unified-signatures": "error", |
68 | 88 |
|
| 89 | + "@typescript-eslint/no-extra-non-null-assertion": "error", |
| 90 | + |
69 | 91 | // scripts/eslint/rules |
70 | | - "object-literal-surrounding-space": "error", |
71 | | - "no-type-assertion-whitespace": "error", |
72 | | - "type-operator-spacing": "error", |
73 | | - "only-arrow-functions": ["error", { |
| 92 | + "local/object-literal-surrounding-space": "error", |
| 93 | + "local/no-type-assertion-whitespace": "error", |
| 94 | + "local/type-operator-spacing": "error", |
| 95 | + "local/only-arrow-functions": ["error", { |
74 | 96 | "allowNamedFunctions": true , |
75 | 97 | "allowDeclarations": true |
76 | 98 | }], |
77 | | - "no-double-space": "error", |
78 | | - "boolean-trivia": "error", |
79 | | - "no-in-operator": "error", |
80 | | - "simple-indent": "error", |
81 | | - "debug-assert": "error", |
82 | | - "no-keywords": "error", |
83 | | - "one-namespace-per-file": "error", |
| 99 | + "local/no-double-space": "error", |
| 100 | + "local/boolean-trivia": "error", |
| 101 | + "local/no-in-operator": "error", |
| 102 | + "local/simple-indent": "error", |
| 103 | + "local/debug-assert": "error", |
| 104 | + "local/no-keywords": "error", |
| 105 | + "local/jsdoc-format": "error", |
84 | 106 |
|
85 | 107 | // eslint-plugin-import |
86 | 108 | "import/no-extraneous-dependencies": ["error", { "optionalDependencies": false }], |
87 | 109 |
|
88 | 110 | // eslint-plugin-no-null |
89 | 111 | "no-null/no-null": "error", |
90 | 112 |
|
91 | | - // eslint-plugin-jsdoc |
92 | | - "jsdoc/check-alignment": "error", |
93 | | - |
94 | 113 | // eslint |
95 | 114 | "constructor-super": "error", |
96 | 115 | "curly": ["error", "multi-line"], |
|
129 | 148 | "quote-props": ["error", "consistent-as-needed"], |
130 | 149 | "space-in-parens": "error", |
131 | 150 | "unicode-bom": ["error", "never"], |
132 | | - "use-isnan": "error" |
133 | | - } |
| 151 | + "use-isnan": "error", |
| 152 | + "no-prototype-builtins": "error", |
| 153 | + "no-self-assign": "error", |
| 154 | + "no-dupe-else-if": "error" |
| 155 | + }, |
| 156 | + "overrides": [ |
| 157 | + // By default, the ESLint CLI only looks at .js files. But, it will also look at |
| 158 | + // any files which are referenced in an override config. Most users of typescript-eslint |
| 159 | + // get this behavior by default by extending a recommended typescript-eslint config, which |
| 160 | + // just so happens to override some core ESLint rules. We don't extend from any config, so |
| 161 | + // explicitly reference TS files here so the CLI picks them up. |
| 162 | + // |
| 163 | + // ESLint in VS Code will lint any opened file (so long as it's not eslintignore'd), so |
| 164 | + // that will work regardless of the below. |
| 165 | + // |
| 166 | + // The same applies to mjs files; ESLint appears to not scan those either. |
| 167 | + { "files": ["*.ts", "*.mts", "*.cts", "*.mjs", "*.cjs"] }, |
| 168 | + { |
| 169 | + "files": ["*.mjs", "*.mts"], |
| 170 | + "rules": { |
| 171 | + // These globals don't exist outside of CJS files. |
| 172 | + "no-restricted-globals": ["error", |
| 173 | + { "name": "__filename" }, |
| 174 | + { "name": "__dirname" }, |
| 175 | + { "name": "require" }, |
| 176 | + { "name": "module" }, |
| 177 | + { "name": "exports" } |
| 178 | + ] |
| 179 | + } |
| 180 | + }, |
| 181 | + { |
| 182 | + // These files contain imports in a specific order that are generally unsafe to modify. |
| 183 | + "files": ["**/_namespaces/**"], |
| 184 | + "rules": { |
| 185 | + "simple-import-sort/imports": "off", |
| 186 | + "simple-import-sort/exports": "off" |
| 187 | + } |
| 188 | + } |
| 189 | + ] |
134 | 190 | } |
0 commit comments