@effective/eslint-cfg
Version:
A library for generating ESLint Flat Configs with React and TypeScript support.
875 lines (874 loc) • 27.8 kB
JavaScript
import { createRequire } from "module";
const require = createRequire(import.meta.url);
export default [
{
settings: {
n: {
tryExtensions: [".js", ".ts"],
},
},
linterOptions: {
reportUnusedDisableDirectives: "off",
reportUnusedInlineConfigs: "off",
},
rules: {
"for-direction": "error",
"no-async-promise-executor": "error",
"no-case-declarations": "error",
"no-compare-neg-zero": "error",
"no-cond-assign": ["error", "except-parens"],
"no-constant-binary-expression": "error",
"no-constant-condition": [
"error",
{
checkLoops: "allExceptWhileTrue",
},
],
"no-control-regex": "error",
"no-debugger": "error",
"no-delete-var": "error",
"no-dupe-else-if": "error",
"no-duplicate-case": "error",
"no-empty": [
"error",
{
allowEmptyCatch: false,
},
],
"no-empty-pattern": [
"error",
{
allowObjectPatternsAsParameters: false,
},
],
"no-empty-static-block": "error",
"no-ex-assign": "error",
"no-extra-boolean-cast": ["error", {}],
"no-fallthrough": [
"error",
{
allowEmptyCase: false,
reportUnusedFallthroughComment: false,
},
],
"no-global-assign": [
"error",
{
exceptions: [],
},
],
"no-irregular-whitespace": [
"error",
{
skipComments: false,
skipJSXText: false,
skipRegExps: false,
skipStrings: true,
skipTemplates: false,
},
],
"no-loss-of-precision": "error",
"no-misleading-character-class": "error",
"no-nonoctal-decimal-escape": "error",
"no-octal": "error",
"no-prototype-builtins": "error",
"no-regex-spaces": "error",
"no-self-assign": [
"error",
{
props: true,
},
],
"no-shadow-restricted-names": [
"error",
{
reportGlobalThis: false,
},
],
"no-sparse-arrays": "error",
"no-unsafe-finally": "error",
"no-unsafe-optional-chaining": [
"error",
{
disallowArithmeticOperators: false,
},
],
"no-unused-labels": "error",
"no-unused-private-class-members": "error",
"no-useless-catch": "error",
"no-useless-escape": [
"error",
{
allowRegexCharacters: [],
},
],
"no-var": "error",
"prefer-const": [
"error",
{
destructuring: "any",
ignoreReadBeforeAssign: false,
},
],
"prefer-regex-literals": [
"error",
{
disallowRedundantWrapping: false,
},
],
"prefer-rest-params": "error",
"prefer-spread": "error",
"require-yield": "error",
"use-isnan": [
"error",
{
enforceForIndexOf: false,
enforceForSwitchCase: true,
},
],
"valid-typeof": [
"error",
{
requireStringLiterals: false,
},
],
"@typescript-eslint/adjacent-overload-signatures": "error",
"@typescript-eslint/array-type": [
"error",
{
default: "array-simple",
},
],
"@typescript-eslint/await-thenable": "error",
"@typescript-eslint/ban-ts-comment": "error",
"@typescript-eslint/ban-tslint-comment": "error",
"@typescript-eslint/class-literal-property-style": "error",
"@typescript-eslint/consistent-generic-constructors": "error",
"@typescript-eslint/consistent-indexed-object-style": "error",
"@typescript-eslint/consistent-type-assertions": "error",
"@typescript-eslint/consistent-type-definitions": "error",
"@typescript-eslint/dot-notation": [
"error",
{
allowIndexSignaturePropertyAccess: false,
allowKeywords: true,
allowPattern: "",
allowPrivateClassPropertyAccess: false,
allowProtectedClassPropertyAccess: false,
},
],
"@typescript-eslint/no-array-constructor": "error",
"@typescript-eslint/no-array-delete": "error",
"@typescript-eslint/no-base-to-string": "error",
"@typescript-eslint/no-confusing-non-null-assertion": "error",
"@typescript-eslint/no-duplicate-enum-values": "error",
"@typescript-eslint/no-duplicate-type-constituents": "error",
"@typescript-eslint/no-empty-function": [
"error",
{
allow: [],
},
],
"@typescript-eslint/no-empty-object-type": "error",
"@typescript-eslint/no-explicit-any": "error",
"@typescript-eslint/no-extra-non-null-assertion": "error",
"@typescript-eslint/no-floating-promises": "error",
"@typescript-eslint/no-for-in-array": "error",
"@typescript-eslint/no-implied-eval": "error",
"@typescript-eslint/no-inferrable-types": "error",
"@typescript-eslint/no-misused-new": "error",
"@typescript-eslint/no-misused-promises": "error",
"@typescript-eslint/no-namespace": "error",
"@typescript-eslint/no-non-null-asserted-optional-chain": "error",
"@typescript-eslint/no-redundant-type-constituents": "error",
"@typescript-eslint/no-require-imports": "error",
"@typescript-eslint/no-this-alias": "error",
"@typescript-eslint/no-unnecessary-type-assertion": "error",
"@typescript-eslint/no-unnecessary-type-constraint": "error",
"@typescript-eslint/no-unsafe-argument": "error",
"@typescript-eslint/no-unsafe-assignment": "error",
"@typescript-eslint/no-unsafe-call": "error",
"@typescript-eslint/no-unsafe-declaration-merging": "error",
"@typescript-eslint/no-unsafe-enum-comparison": "error",
"@typescript-eslint/no-unsafe-function-type": "error",
"@typescript-eslint/no-unsafe-member-access": "error",
"@typescript-eslint/no-unsafe-return": "error",
"@typescript-eslint/no-unsafe-unary-minus": "error",
"@typescript-eslint/no-unused-expressions": [
"error",
{
allowShortCircuit: false,
allowTaggedTemplates: false,
allowTernary: false,
},
],
"@typescript-eslint/no-unused-vars": [
"error",
{
args: "all",
argsIgnorePattern: "^_",
caughtErrors: "all",
caughtErrorsIgnorePattern: "^_",
destructuredArrayIgnorePattern: "^_",
varsIgnorePattern: "^_",
ignoreRestSiblings: true,
},
],
"@typescript-eslint/no-wrapper-object-types": "error",
"@typescript-eslint/non-nullable-type-assertion-style": "error",
"@typescript-eslint/only-throw-error": "error",
"@typescript-eslint/prefer-as-const": "error",
"@typescript-eslint/prefer-find": "error",
"@typescript-eslint/prefer-for-of": "error",
"@typescript-eslint/prefer-function-type": "error",
"@typescript-eslint/prefer-includes": "error",
"@typescript-eslint/prefer-namespace-keyword": "error",
"@typescript-eslint/prefer-nullish-coalescing": "error",
"@typescript-eslint/prefer-optional-chain": "error",
"@typescript-eslint/prefer-promise-reject-errors": "error",
"@typescript-eslint/prefer-regexp-exec": "error",
"@typescript-eslint/prefer-string-starts-ends-with": "error",
"@typescript-eslint/require-await": "error",
"@typescript-eslint/restrict-plus-operands": "error",
"@typescript-eslint/restrict-template-expressions": "error",
"@typescript-eslint/triple-slash-reference": "error",
"@typescript-eslint/unbound-method": "error",
"jsdoc/check-access": "error",
"jsdoc/check-alignment": "error",
"jsdoc/check-param-names": [
"error",
{
checkDestructured: false,
},
],
"jsdoc/check-property-names": "error",
"jsdoc/check-syntax": "error",
"jsdoc/check-tag-names": "error",
"jsdoc/check-template-names": "error",
"jsdoc/check-types": "error",
"jsdoc/check-values": "error",
"jsdoc/empty-tags": "error",
"jsdoc/implements-on-classes": "error",
"jsdoc/match-description": "error",
"jsdoc/multiline-blocks": "error",
"jsdoc/no-bad-blocks": "error",
"jsdoc/no-blank-block-descriptions": "error",
"jsdoc/no-blank-blocks": "error",
"jsdoc/no-defaults": "error",
"jsdoc/no-multi-asterisks": "error",
"jsdoc/no-types": "error",
"jsdoc/no-undefined-types": "error",
"jsdoc/require-asterisk-prefix": "error",
"jsdoc/require-hyphen-before-param-description": ["error", "always"],
"jsdoc/require-returns-check": "error",
"jsdoc/require-yields-check": "error",
"jsdoc/tag-lines": [
"error",
"never",
{
startLines: 1,
},
],
"jsdoc/valid-types": "error",
"n/hashbang": "error",
"n/no-deprecated-api": "error",
"n/no-exports-assign": "error",
"n/no-extraneous-import": "error",
"n/no-extraneous-require": "error",
"n/no-missing-import": "error",
"n/no-missing-require": "error",
"n/no-process-exit": "error",
"n/no-unpublished-bin": "error",
"n/no-unpublished-import": "error",
"n/no-unpublished-require": "error",
"n/no-unsupported-features/es-builtins": "error",
"n/no-unsupported-features/es-syntax": [
"error",
{
ignores: ["modules"],
},
],
"n/no-unsupported-features/node-builtins": "error",
"n/process-exit-as-throw": "error",
"regexp/confusing-quantifier": "warn",
"regexp/control-character-escape": "error",
"regexp/match-any": "error",
"regexp/negation": "error",
"regexp/no-contradiction-with-assertion": "error",
"regexp/no-dupe-characters-character-class": "error",
"regexp/no-dupe-disjunctions": "error",
"regexp/no-empty-alternative": "warn",
"regexp/no-empty-capturing-group": "error",
"regexp/no-empty-character-class": "error",
"regexp/no-empty-group": "error",
"regexp/no-empty-lookarounds-assertion": "error",
"regexp/no-empty-string-literal": "error",
"regexp/no-escape-backspace": "error",
"regexp/no-extra-lookaround-assertions": "error",
"regexp/no-invalid-regexp": "error",
"regexp/no-invisible-character": "error",
"regexp/no-lazy-ends": "warn",
"regexp/no-legacy-features": "error",
"regexp/no-misleading-capturing-group": "error",
"regexp/no-misleading-unicode-character": "error",
"regexp/no-missing-g-flag": "error",
"regexp/no-non-standard-flag": "error",
"regexp/no-obscure-range": "error",
"regexp/no-optional-assertion": "error",
"regexp/no-potentially-useless-backreference": "warn",
"regexp/no-super-linear-backtracking": "error",
"regexp/no-trivially-nested-assertion": "error",
"regexp/no-trivially-nested-quantifier": "error",
"regexp/no-unused-capturing-group": "error",
"regexp/no-useless-assertions": "error",
"regexp/no-useless-backreference": "error",
"regexp/no-useless-character-class": "error",
"regexp/no-useless-dollar-replacements": "error",
"regexp/no-useless-escape": "error",
"regexp/no-useless-flag": "warn",
"regexp/no-useless-lazy": "error",
"regexp/no-useless-non-capturing-group": "error",
"regexp/no-useless-quantifier": "error",
"regexp/no-useless-range": "error",
"regexp/no-useless-set-operand": "error",
"regexp/no-useless-string-literal": "error",
"regexp/no-useless-two-nums-quantifier": "error",
"regexp/no-zero-quantifier": "error",
"regexp/optimal-lookaround-quantifier": "warn",
"regexp/optimal-quantifier-concatenation": "error",
"regexp/prefer-character-class": "error",
"regexp/prefer-d": "error",
"regexp/prefer-plus-quantifier": "error",
"regexp/prefer-predefined-assertion": "error",
"regexp/prefer-question-quantifier": "error",
"regexp/prefer-range": "error",
"regexp/prefer-set-operation": "error",
"regexp/prefer-star-quantifier": "error",
"regexp/prefer-unicode-codepoint-escapes": "error",
"regexp/prefer-w": "error",
"regexp/simplify-set-operations": "error",
"regexp/sort-flags": "error",
"regexp/strict": "error",
"regexp/use-ignore-case": "error",
"simple-import-sort/exports": "error",
"simple-import-sort/imports": "error",
},
plugins: {
"@typescript-eslint": require("@typescript-eslint/eslint-plugin"),
"simple-import-sort": require("eslint-plugin-simple-import-sort"),
jsdoc: require("eslint-plugin-jsdoc"),
regexp: require("eslint-plugin-regexp"),
n: require("eslint-plugin-n"),
},
languageOptions: {
sourceType: "module",
ecmaVersion: 2025,
parser: require("@typescript-eslint/parser"),
parserOptions: {
ecmaVersion: "latest",
ecmaFeatures: {
jsx: false,
},
projectService: true,
},
globals: {
__dirname: "off",
__filename: "off",
AbortController: false,
AbortSignal: false,
atob: false,
Blob: false,
BroadcastChannel: false,
btoa: false,
Buffer: false,
ByteLengthQueuingStrategy: false,
clearImmediate: false,
clearInterval: false,
clearTimeout: false,
CloseEvent: false,
CompressionStream: false,
console: false,
CountQueuingStrategy: false,
crypto: false,
Crypto: false,
CryptoKey: false,
CustomEvent: false,
DecompressionStream: false,
DOMException: false,
Event: false,
EventTarget: false,
exports: "off",
fetch: false,
File: false,
FormData: false,
global: false,
Headers: false,
MessageChannel: false,
MessageEvent: false,
MessagePort: false,
module: "off",
navigator: false,
Navigator: false,
performance: false,
Performance: false,
PerformanceEntry: false,
PerformanceMark: false,
PerformanceMeasure: false,
PerformanceObserver: false,
PerformanceObserverEntryList: false,
PerformanceResourceTiming: false,
process: false,
queueMicrotask: false,
ReadableByteStreamController: false,
ReadableStream: false,
ReadableStreamBYOBReader: false,
ReadableStreamBYOBRequest: false,
ReadableStreamDefaultController: false,
ReadableStreamDefaultReader: false,
Request: false,
require: "off",
Response: false,
setImmediate: false,
setInterval: false,
setTimeout: false,
structuredClone: false,
SubtleCrypto: false,
TextDecoder: false,
TextDecoderStream: false,
TextEncoder: false,
TextEncoderStream: false,
TransformStream: false,
TransformStreamDefaultController: false,
URL: false,
URLSearchParams: false,
WebAssembly: false,
WebSocket: false,
WritableStream: false,
WritableStreamDefaultController: false,
WritableStreamDefaultWriter: false,
AggregateError: false,
Array: false,
ArrayBuffer: false,
Atomics: false,
BigInt: false,
BigInt64Array: false,
BigUint64Array: false,
Boolean: false,
DataView: false,
Date: false,
decodeURI: false,
decodeURIComponent: false,
encodeURI: false,
encodeURIComponent: false,
Error: false,
escape: false,
eval: false,
EvalError: false,
FinalizationRegistry: false,
Float32Array: false,
Float64Array: false,
Function: false,
globalThis: false,
Infinity: false,
Int16Array: false,
Int32Array: false,
Int8Array: false,
Intl: false,
isFinite: false,
isNaN: false,
JSON: false,
Map: false,
Math: false,
NaN: false,
Number: false,
Object: false,
parseFloat: false,
parseInt: false,
Promise: false,
Proxy: false,
RangeError: false,
ReferenceError: false,
Reflect: false,
RegExp: false,
Set: false,
SharedArrayBuffer: false,
String: false,
Symbol: false,
SyntaxError: false,
TypeError: false,
Uint16Array: false,
Uint32Array: false,
Uint8Array: false,
Uint8ClampedArray: false,
undefined: false,
unescape: false,
URIError: false,
WeakMap: false,
WeakRef: false,
WeakSet: false,
},
},
name: "effective/base",
},
{
rules: {
"jest/no-alias-methods": "warn",
"jest/prefer-to-be": "error",
"jest/prefer-to-contain": "error",
"jest/prefer-to-have-length": "error",
"testing-library/await-async-events": [
"error",
{
eventModule: "userEvent",
},
],
"testing-library/await-async-queries": "error",
"testing-library/await-async-utils": "error",
"testing-library/no-await-sync-events": [
"error",
{
eventModules: ["fire-event"],
},
],
"testing-library/no-await-sync-queries": "error",
"testing-library/no-global-regexp-flag-in-query": "error",
"testing-library/no-node-access": "error",
"testing-library/no-promise-in-fire-event": "error",
"testing-library/no-wait-for-multiple-assertions": "error",
"testing-library/no-wait-for-side-effects": "error",
"testing-library/no-wait-for-snapshot": "error",
"testing-library/prefer-find-by": "error",
"testing-library/prefer-presence-queries": "error",
"testing-library/prefer-query-by-disappearance": "error",
"testing-library/prefer-screen-queries": "error",
},
languageOptions: {
globals: {
afterAll: false,
afterEach: false,
beforeAll: false,
beforeEach: false,
describe: false,
expect: false,
fit: false,
it: false,
jest: false,
test: false,
xdescribe: false,
xit: false,
xtest: false,
__dirname: "off",
__filename: "off",
AbortController: false,
AbortSignal: false,
atob: false,
Blob: false,
BroadcastChannel: false,
btoa: false,
Buffer: false,
ByteLengthQueuingStrategy: false,
clearImmediate: false,
clearInterval: false,
clearTimeout: false,
CloseEvent: false,
CompressionStream: false,
console: false,
CountQueuingStrategy: false,
crypto: false,
Crypto: false,
CryptoKey: false,
CustomEvent: false,
DecompressionStream: false,
DOMException: false,
Event: false,
EventTarget: false,
exports: "off",
fetch: false,
File: false,
FormData: false,
global: false,
Headers: false,
MessageChannel: false,
MessageEvent: false,
MessagePort: false,
module: "off",
navigator: false,
Navigator: false,
performance: false,
Performance: false,
PerformanceEntry: false,
PerformanceMark: false,
PerformanceMeasure: false,
PerformanceObserver: false,
PerformanceObserverEntryList: false,
PerformanceResourceTiming: false,
process: false,
queueMicrotask: false,
ReadableByteStreamController: false,
ReadableStream: false,
ReadableStreamBYOBReader: false,
ReadableStreamBYOBRequest: false,
ReadableStreamDefaultController: false,
ReadableStreamDefaultReader: false,
Request: false,
require: "off",
Response: false,
setImmediate: false,
setInterval: false,
setTimeout: false,
structuredClone: false,
SubtleCrypto: false,
TextDecoder: false,
TextDecoderStream: false,
TextEncoder: false,
TextEncoderStream: false,
TransformStream: false,
TransformStreamDefaultController: false,
URL: false,
URLSearchParams: false,
WebAssembly: false,
WebSocket: false,
WritableStream: false,
WritableStreamDefaultController: false,
WritableStreamDefaultWriter: false,
AggregateError: false,
Array: false,
ArrayBuffer: false,
Atomics: false,
BigInt: false,
BigInt64Array: false,
BigUint64Array: false,
Boolean: false,
DataView: false,
Date: false,
decodeURI: false,
decodeURIComponent: false,
encodeURI: false,
encodeURIComponent: false,
Error: false,
escape: false,
eval: false,
EvalError: false,
FinalizationRegistry: false,
Float32Array: false,
Float64Array: false,
Function: false,
globalThis: false,
Infinity: false,
Int16Array: false,
Int32Array: false,
Int8Array: false,
Intl: false,
isFinite: false,
isNaN: false,
JSON: false,
Map: false,
Math: false,
NaN: false,
Number: false,
Object: false,
parseFloat: false,
parseInt: false,
Promise: false,
Proxy: false,
RangeError: false,
ReferenceError: false,
Reflect: false,
RegExp: false,
Set: false,
SharedArrayBuffer: false,
String: false,
Symbol: false,
SyntaxError: false,
TypeError: false,
Uint16Array: false,
Uint32Array: false,
Uint8Array: false,
Uint8ClampedArray: false,
undefined: false,
unescape: false,
URIError: false,
WeakMap: false,
WeakRef: false,
WeakSet: false,
},
},
plugins: {
jest: require("eslint-plugin-jest"),
"testing-library": require("eslint-plugin-testing-library"),
},
files: ["**/*.test.{ts,tsx}"],
name: "effective/test",
},
{
rules: {
"playwright/expect-expect": "warn",
"playwright/max-nested-describe": "warn",
"playwright/missing-playwright-await": "error",
"playwright/no-conditional-expect": "warn",
"playwright/no-conditional-in-test": "warn",
"playwright/no-element-handle": "warn",
"playwright/no-eval": "warn",
"playwright/no-focused-test": "error",
"playwright/no-force-option": "warn",
"playwright/no-nested-step": "warn",
"playwright/no-networkidle": "error",
"playwright/no-page-pause": "warn",
"playwright/no-skipped-test": "warn",
"playwright/no-standalone-expect": "error",
"playwright/no-unsafe-references": "error",
"playwright/no-useless-await": "warn",
"playwright/no-useless-not": "warn",
"playwright/no-wait-for-selector": "warn",
"playwright/no-wait-for-timeout": "warn",
"playwright/prefer-web-first-assertions": "error",
"playwright/valid-describe-callback": "error",
"playwright/valid-expect": "error",
"playwright/valid-expect-in-promise": "error",
"playwright/valid-title": "error",
},
languageOptions: {
globals: {
AbortController: false,
AbortSignal: false,
atob: false,
Blob: false,
BroadcastChannel: false,
btoa: false,
ByteLengthQueuingStrategy: false,
clearInterval: false,
clearTimeout: false,
CompressionStream: false,
console: false,
CountQueuingStrategy: false,
crypto: false,
Crypto: false,
CryptoKey: false,
CustomEvent: false,
DecompressionStream: false,
DOMException: false,
Event: false,
EventTarget: false,
fetch: false,
File: false,
FormData: false,
Headers: false,
Intl: false,
MessageChannel: false,
MessageEvent: false,
MessagePort: false,
performance: false,
PerformanceEntry: false,
PerformanceMark: false,
PerformanceMeasure: false,
PerformanceObserver: false,
PerformanceObserverEntryList: false,
PerformanceResourceTiming: false,
queueMicrotask: false,
ReadableByteStreamController: false,
ReadableStream: false,
ReadableStreamBYOBReader: false,
ReadableStreamBYOBRequest: false,
ReadableStreamDefaultController: false,
ReadableStreamDefaultReader: false,
Request: false,
Response: false,
setInterval: false,
setTimeout: false,
structuredClone: false,
SubtleCrypto: false,
TextDecoder: false,
TextDecoderStream: false,
TextEncoder: false,
TextEncoderStream: false,
TransformStream: false,
TransformStreamDefaultController: false,
URL: false,
URLSearchParams: false,
WebAssembly: false,
WritableStream: false,
WritableStreamDefaultController: false,
WritableStreamDefaultWriter: false,
__dirname: "off",
__filename: "off",
Buffer: false,
clearImmediate: false,
CloseEvent: false,
exports: "off",
global: false,
module: "off",
navigator: false,
Navigator: false,
Performance: false,
process: false,
require: "off",
setImmediate: false,
WebSocket: false,
AggregateError: false,
Array: false,
ArrayBuffer: false,
Atomics: false,
BigInt: false,
BigInt64Array: false,
BigUint64Array: false,
Boolean: false,
DataView: false,
Date: false,
decodeURI: false,
decodeURIComponent: false,
encodeURI: false,
encodeURIComponent: false,
Error: false,
escape: false,
eval: false,
EvalError: false,
FinalizationRegistry: false,
Float32Array: false,
Float64Array: false,
Function: false,
globalThis: false,
Infinity: false,
Int16Array: false,
Int32Array: false,
Int8Array: false,
isFinite: false,
isNaN: false,
JSON: false,
Map: false,
Math: false,
NaN: false,
Number: false,
Object: false,
parseFloat: false,
parseInt: false,
Promise: false,
Proxy: false,
RangeError: false,
ReferenceError: false,
Reflect: false,
RegExp: false,
Set: false,
SharedArrayBuffer: false,
String: false,
Symbol: false,
SyntaxError: false,
TypeError: false,
Uint16Array: false,
Uint32Array: false,
Uint8Array: false,
Uint8ClampedArray: false,
undefined: false,
unescape: false,
URIError: false,
WeakMap: false,
WeakRef: false,
WeakSet: false,
},
},
plugins: {
playwright: require("eslint-plugin-playwright"),
},
files: ["**/*.spec.{ts}"],
name: "effective/e2e",
},
];