{ "root": true, "parser": "@typescript-eslint/parser", "parserOptions": { "warnOnUnsupportedTypeScriptVersion": false, "sourceType": "module" }, "env": { "browser": false, "node": true, "es6": true }, "plugins": [ "@typescript-eslint", "no-null", "import", "eslint-plugin-local" ], "ignorePatterns": [ "**/node_modules/**", "/built/**", "/tests/**", "/lib/**", "/src/lib/*.generated.d.ts", "/scripts/**/*.js", "/scripts/**/*.d.*", "/internal/**", "/coverage/**" ], "rules": { "sort-imports": ["error", { "ignoreCase": true, "ignoreDeclarationSort": true, "allowSeparatedGroups": true }], "@typescript-eslint/adjacent-overload-signatures": "error", "@typescript-eslint/array-type": "error", "@typescript-eslint/no-array-constructor": "error", "brace-style": "off", "@typescript-eslint/brace-style": ["error", "stroustrup", { "allowSingleLine": true }], "@typescript-eslint/naming-convention": [ "error", { "selector": "typeLike", "format": ["PascalCase"], "filter": { "regex": "^(__String|[A-Za-z]+_[A-Za-z]+)$", "match": false } }, { "selector": "interface", "format": ["PascalCase"], "custom": { "regex": "^I[A-Z]", "match": false }, "filter": { "regex": "^I(Arguments|TextWriter|O([A-Z][a-z]+[A-Za-z]*)?)$", "match": false } }, { "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 } }, { "selector": "function", "format": ["camelCase", "PascalCase"], "leadingUnderscore": "allow", "filter": { "regex": "^[A-Za-z]+_[A-Za-z]+$", "match": false } }, { "selector": "parameter", "format": ["camelCase"], "leadingUnderscore": "allow", "filter": { "regex": "^(_+|[A-Za-z]+_[A-Z][a-z]+)$", "match": false } }, { "selector": "method", "format": ["camelCase", "PascalCase"], "leadingUnderscore": "allow", "filter": { "regex": "^([0-9]+|[A-Za-z]+_[A-Za-z]+)$", "match": false } }, { "selector": "memberLike", "format": ["camelCase"], "leadingUnderscore": "allow", "filter": { "regex": "^([0-9]+|[A-Za-z]+_[A-Za-z]+)$", "match": false } }, { "selector": "enumMember", "format": ["camelCase", "PascalCase"], "leadingUnderscore": "allow", "filter": { "regex": "^[A-Za-z]+_[A-Za-z]+$", "match": false } }, { "selector": "property", "format": null } ], "@typescript-eslint/consistent-type-definitions": ["error", "interface"], "@typescript-eslint/consistent-type-assertions": ["error", { "assertionStyle": "as" }], "max-statements-per-line": ["error", { "max": 1 }], "no-duplicate-imports": "off", "@typescript-eslint/no-duplicate-imports": "error", "@typescript-eslint/no-inferrable-types": "error", "@typescript-eslint/no-misused-new": "error", "@typescript-eslint/no-this-alias": "error", "no-unused-expressions": "off", "@typescript-eslint/no-unused-expressions": ["error", { "allowTernary": true }], "@typescript-eslint/prefer-for-of": "error", "@typescript-eslint/prefer-function-type": "error", "@typescript-eslint/prefer-namespace-keyword": "error", "@typescript-eslint/prefer-as-const": "error", "quotes": "off", "@typescript-eslint/quotes": ["error", "double", { "avoidEscape": true, "allowTemplateLiterals": true }], "semi": "off", "@typescript-eslint/semi": "error", "@typescript-eslint/no-extra-semi": "error", "space-before-function-paren": "off", "@typescript-eslint/space-before-function-paren": ["error", { "asyncArrow": "always", "anonymous": "always", "named": "never" }], "@typescript-eslint/triple-slash-reference": "error", "@typescript-eslint/type-annotation-spacing": "error", "@typescript-eslint/unified-signatures": "error", "@typescript-eslint/no-extra-non-null-assertion": "error", // scripts/eslint/rules "local/object-literal-surrounding-space": "error", "local/no-type-assertion-whitespace": "error", "local/type-operator-spacing": "error", "local/only-arrow-functions": ["error", { "allowNamedFunctions": true , "allowDeclarations": true }], "local/no-double-space": "error", "local/boolean-trivia": "error", "local/no-in-operator": "error", "local/simple-indent": "error", "local/debug-assert": "error", "local/no-keywords": "error", "local/jsdoc-format": "error", // eslint-plugin-import "import/no-extraneous-dependencies": ["error", { "optionalDependencies": false }], // eslint-plugin-no-null "no-null/no-null": "error", // eslint "constructor-super": "error", "curly": ["error", "multi-line"], "dot-notation": "error", "eqeqeq": "error", "linebreak-style": ["error", "windows"], "new-parens": "error", "no-caller": "error", "no-duplicate-case": "error", "no-empty": "error", "no-eval": "error", "no-extra-bind": "error", "no-fallthrough": "error", "no-new-func": "error", "no-new-wrappers": "error", "no-return-await": "error", "no-restricted-globals": ["error", { "name": "setTimeout" }, { "name": "clearTimeout" }, { "name": "setInterval" }, { "name": "clearInterval" }, { "name": "setImmediate" }, { "name": "clearImmediate" } ], "no-sparse-arrays": "error", "no-template-curly-in-string": "error", "no-throw-literal": "error", "no-trailing-spaces": "error", "no-undef-init": "error", "no-unsafe-finally": "error", "no-unused-labels": "error", "no-var": "error", "object-shorthand": "error", "prefer-const": "error", "prefer-object-spread": "error", "quote-props": ["error", "consistent-as-needed"], "space-in-parens": "error", "unicode-bom": ["error", "never"], "use-isnan": "error", "no-prototype-builtins": "error", "no-self-assign": "error", "no-dupe-else-if": "error" }, "overrides": [ // By default, the ESLint CLI only looks at .js files. But, it will also look at // any files which are referenced in an override config. Most users of typescript-eslint // get this behavior by default by extending a recommended typescript-eslint config, which // just so happens to override some core ESLint rules. We don't extend from any config, so // explicitly reference TS files here so the CLI picks them up. // // ESLint in VS Code will lint any opened file (so long as it's not eslintignore'd), so // that will work regardless of the below. // // The same applies to mjs files; ESLint appears to not scan those either. { "files": ["*.ts", "*.mts", "*.cts", "*.mjs", "*.cjs"] }, { "files": ["*.mjs", "*.mts"], "rules": { // These globals don't exist outside of CJS files. "no-restricted-globals": ["error", { "name": "__filename" }, { "name": "__dirname" }, { "name": "require" }, { "name": "module" }, { "name": "exports" } ] } } ] }