@seanblonien/eslint-config-base 1.0.11 → 1.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +267 -212
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -78,16 +78,14 @@ var booleanNameConvention = new RegExp(
|
|
|
78
78
|
|
|
79
79
|
// src/index.ts
|
|
80
80
|
var config = [
|
|
81
|
-
// Base
|
|
81
|
+
// Base configurations
|
|
82
82
|
eslint.configs.recommended,
|
|
83
|
-
// TypeScript recommended configs
|
|
84
83
|
...tseslint.configs.recommendedTypeChecked,
|
|
85
84
|
...tseslint.configs.stylisticTypeChecked,
|
|
86
85
|
...tseslint.configs.strict,
|
|
87
|
-
//
|
|
86
|
+
// Plugin configurations
|
|
88
87
|
stylistic.configs.customize({
|
|
89
88
|
arrowParens: true,
|
|
90
|
-
// jsx: true,
|
|
91
89
|
braceStyle: "1tbs",
|
|
92
90
|
commaDangle: "always-multiline",
|
|
93
91
|
indent: 2,
|
|
@@ -95,15 +93,13 @@ var config = [
|
|
|
95
93
|
quotes: "single",
|
|
96
94
|
semi: true
|
|
97
95
|
}),
|
|
98
|
-
// Import plugin configuration
|
|
99
96
|
importXPlugin.flatConfigs.recommended,
|
|
100
97
|
importXPlugin.flatConfigs.typescript,
|
|
101
98
|
sortPlugin.configs["flat/recommended"],
|
|
102
|
-
// Code quality plugins
|
|
103
99
|
unicornPlugin.configs.recommended,
|
|
104
100
|
comments.recommended,
|
|
105
101
|
sonarjsPlugin.configs.recommended,
|
|
106
|
-
//
|
|
102
|
+
// Main configuration
|
|
107
103
|
{
|
|
108
104
|
files: ["**/*.{js,mjs,cjs,ts,tsx}"],
|
|
109
105
|
languageOptions: {
|
|
@@ -130,44 +126,99 @@ var config = [
|
|
|
130
126
|
"unused-imports": unusedImports
|
|
131
127
|
},
|
|
132
128
|
rules: {
|
|
133
|
-
//
|
|
134
|
-
//
|
|
129
|
+
// === DISABLED CORE RULES (replaced by plugins) ===
|
|
130
|
+
// These core ESLint rules are disabled because we use enhanced versions from plugins:
|
|
135
131
|
"quotes": "off",
|
|
132
|
+
// Replaced by @stylistic/quotes with better formatting options and JSX support
|
|
136
133
|
"jsx-quotes": "off",
|
|
134
|
+
// Replaced by @stylistic/jsx-quotes for JSX-specific quote handling
|
|
137
135
|
"func-call-spacing": "off",
|
|
136
|
+
// Replaced by @stylistic/function-call-spacing for consistent spacing
|
|
138
137
|
"dot-notation": "off",
|
|
138
|
+
// Replaced by @typescript-eslint/dot-notation with TypeScript awareness
|
|
139
139
|
"no-unused-expressions": "off",
|
|
140
|
+
// Replaced by @typescript-eslint/no-unused-expressions with better TS support
|
|
140
141
|
"no-use-before-define": "off",
|
|
142
|
+
// Replaced by @typescript-eslint/no-use-before-define for TypeScript hoisting rules
|
|
141
143
|
"default-param-last": "off",
|
|
144
|
+
// Replaced by @typescript-eslint/default-param-last with TS parameter awareness
|
|
142
145
|
"no-redeclare": "off",
|
|
146
|
+
// Replaced by @typescript-eslint/no-redeclare for better type checking
|
|
143
147
|
"no-shadow": "off",
|
|
144
|
-
//
|
|
145
|
-
"
|
|
148
|
+
// Replaced by @typescript-eslint/no-shadow for TypeScript variable shadowing
|
|
149
|
+
"spaced-comment": "off",
|
|
150
|
+
// Replaced by @stylistic/spaced-comment with more formatting options
|
|
151
|
+
"no-unused-vars": "off",
|
|
152
|
+
// Replaced by @typescript-eslint/no-unused-vars and unused-imports plugin
|
|
153
|
+
"@stylistic/no-unused-vars": "off",
|
|
154
|
+
// Replaced by unused-imports/no-unused-vars for better import handling
|
|
155
|
+
"sonarjs/no-unused-vars": "off",
|
|
156
|
+
// Replaced by unused-imports/no-unused-vars to avoid conflicts
|
|
157
|
+
"no-magic-numbers": "off",
|
|
158
|
+
// Replaced by @typescript-eslint/no-magic-numbers with TypeScript-aware exceptions
|
|
159
|
+
// === DISABLED PLUGIN RULES (intentionally turned off) ===
|
|
160
|
+
// Sort plugin rules (replaced by import-x/order):
|
|
161
|
+
"sort/imports": "off",
|
|
162
|
+
// Replaced by import-x/order which has better TypeScript support
|
|
163
|
+
"sort/object-properties": "off",
|
|
164
|
+
// Object property sorting is not required
|
|
165
|
+
"sort/string-unions": "off",
|
|
166
|
+
// String union sorting is not required
|
|
167
|
+
// Unicorn rules that are too restrictive or don't match our style:
|
|
168
|
+
"unicorn/prefer-global-this": "off",
|
|
169
|
+
// GlobalThis is not always preferred over window/global
|
|
170
|
+
"unicorn/prevent-abbreviations": "off",
|
|
171
|
+
// Common abbreviations (props, args, etc.) are acceptable
|
|
172
|
+
"unicorn/no-array-reduce": "off",
|
|
173
|
+
// Array.reduce is a valid and useful method
|
|
174
|
+
"unicorn/no-array-for-each": "off",
|
|
175
|
+
// Array.forEach is preferred over for...of in many cases
|
|
176
|
+
"unicorn/prefer-top-level-await": "off",
|
|
177
|
+
// Top-level await is not always appropriate
|
|
178
|
+
"unicorn/no-array-callback-reference": "off",
|
|
179
|
+
// Method references as callbacks are acceptable
|
|
180
|
+
"unicorn/prefer-switch": "off",
|
|
181
|
+
// Switch statements are banned (see no-restricted-syntax below)
|
|
182
|
+
"unicorn/prefer-object-from-entries": "off",
|
|
183
|
+
// Object.fromEntries is not always better
|
|
184
|
+
"unicorn/no-null": "off",
|
|
185
|
+
// Null is still a valid value in many contexts
|
|
186
|
+
// SonarJS rules that are disabled for various reasons:
|
|
187
|
+
"sonarjs/cognitive-complexity": "off",
|
|
188
|
+
// Replaced by core complexity rule which is simpler
|
|
189
|
+
"sonarjs/no-nested-functions": "off",
|
|
190
|
+
// Replaced by complexity rule, nested functions are sometimes needed
|
|
191
|
+
"sonarjs/function-return-type": "off",
|
|
192
|
+
// TypeScript handles return type checking better
|
|
193
|
+
"sonarjs/no-redundant-optional": "off",
|
|
194
|
+
// TypeScript handles optional types better
|
|
195
|
+
"sonarjs/no-commented-code": "off",
|
|
196
|
+
// Performance-intensive rule, commented code is sometimes useful
|
|
197
|
+
"sonarjs/todo-tag": "off",
|
|
198
|
+
// TODO comments are acceptable during development
|
|
199
|
+
"sonarjs/pseudo-random": "off",
|
|
200
|
+
// Math.random() is acceptable for non-cryptographic uses
|
|
201
|
+
"sonarjs/void-use": "off",
|
|
202
|
+
// Allow void operators for type assertions and async function annotations
|
|
203
|
+
"sonarjs/no-nested-conditional": "off",
|
|
204
|
+
// Replaced by no-nested-ternary rule
|
|
205
|
+
"sonarjs/no-hardcoded-passwords": "off",
|
|
206
|
+
// Import and testing rules:
|
|
207
|
+
"import-x/no-named-as-default-member": "off",
|
|
208
|
+
// Named default exports are sometimes necessary
|
|
209
|
+
// === STYLISTIC & FORMATTING ===
|
|
146
210
|
"@stylistic/quotes": ["warn", "single", { avoidEscape: true }],
|
|
147
211
|
"@stylistic/jsx-quotes": ["warn", "prefer-single"],
|
|
148
|
-
"@stylistic/jsx-one-expression-per-line": "off",
|
|
149
212
|
"@stylistic/block-spacing": ["warn", "never"],
|
|
150
213
|
"@stylistic/object-curly-newline": [
|
|
151
214
|
"warn",
|
|
152
215
|
{ ObjectPattern: { multiline: true, consistent: true } }
|
|
153
216
|
],
|
|
154
|
-
"object-property-newline": [
|
|
155
|
-
"warn",
|
|
156
|
-
{ allowAllPropertiesOnSameLine: true }
|
|
157
|
-
],
|
|
158
|
-
"function-call-argument-newline": ["warn", "consistent"],
|
|
159
|
-
"no-multiple-empty-lines": ["warn", { max: 1, maxEOF: 1 }],
|
|
160
|
-
"no-multi-spaces": "warn",
|
|
161
|
-
"no-useless-rename": "warn",
|
|
162
|
-
"arrow-spacing": "warn",
|
|
163
|
-
"space-infix-ops": "warn",
|
|
164
217
|
"@stylistic/operator-linebreak": [
|
|
165
218
|
"warn",
|
|
166
219
|
"after",
|
|
167
220
|
{ overrides: { "?": "before", ":": "before" } }
|
|
168
221
|
],
|
|
169
|
-
"comma-style": ["warn", "last"],
|
|
170
|
-
"complexity": ["warn", { max: 20 }],
|
|
171
222
|
"@stylistic/max-len": [
|
|
172
223
|
"warn",
|
|
173
224
|
{
|
|
@@ -181,16 +232,6 @@ var config = [
|
|
|
181
232
|
ignoreRegExpLiterals: true
|
|
182
233
|
}
|
|
183
234
|
],
|
|
184
|
-
"no-extra-parens": [
|
|
185
|
-
"error",
|
|
186
|
-
"all",
|
|
187
|
-
{
|
|
188
|
-
ignoreJSX: "all",
|
|
189
|
-
// don’t complain about JSX parens
|
|
190
|
-
enforceForArrowConditionals: false,
|
|
191
|
-
nestedBinaryExpressions: false
|
|
192
|
-
}
|
|
193
|
-
],
|
|
194
235
|
"@stylistic/jsx-wrap-multilines": [
|
|
195
236
|
"error",
|
|
196
237
|
{
|
|
@@ -202,47 +243,156 @@ var config = [
|
|
|
202
243
|
logical: "parens-new-line"
|
|
203
244
|
}
|
|
204
245
|
],
|
|
246
|
+
"@stylistic/brace-style": ["warn", "1tbs", { allowSingleLine: true }],
|
|
247
|
+
"@stylistic/comma-dangle": ["warn", "always-multiline"],
|
|
248
|
+
"@stylistic/comma-spacing": "warn",
|
|
249
|
+
"@stylistic/function-call-spacing": ["error"],
|
|
250
|
+
"@stylistic/array-element-newline": ["warn", { multiline: true, consistent: true }],
|
|
251
|
+
"@stylistic/array-bracket-newline": ["warn", "consistent"],
|
|
252
|
+
"@stylistic/no-mixed-operators": ["warn", { allowSamePrecedence: true }],
|
|
253
|
+
"@stylistic/rest-spread-spacing": ["warn", "never"],
|
|
254
|
+
"@stylistic/spaced-comment": ["warn", "always", { line: { markers: ["!", "?", "-", "**"] } }],
|
|
255
|
+
"@stylistic/jsx-one-expression-per-line": "warn",
|
|
256
|
+
// === CODE QUALITY & STRUCTURE ===
|
|
257
|
+
// Complexity and size limits:
|
|
258
|
+
"complexity": ["warn", { max: 20 }],
|
|
259
|
+
// Warn when cyclomatic complexity exceeds 20
|
|
205
260
|
"max-lines-per-function": ["error", 120],
|
|
206
|
-
|
|
261
|
+
// Error when functions exceed 120 lines
|
|
262
|
+
"max-lines": ["error", { max: 600, skipBlankLines: true }],
|
|
263
|
+
// Error when files exceed 900 lines
|
|
264
|
+
// Code style preferences:
|
|
207
265
|
"func-style": ["warn", "expression"],
|
|
266
|
+
// Prefer function expressions over declarations
|
|
267
|
+
"object-shorthand": ["warn", "always"],
|
|
268
|
+
// Use object shorthand ({ name } instead of { name: name })
|
|
269
|
+
"arrow-body-style": ["warn", "as-needed"],
|
|
270
|
+
// Use concise arrow functions when possible
|
|
271
|
+
"prefer-destructuring": "warn",
|
|
272
|
+
// Prefer destructuring for object/array access
|
|
273
|
+
"prefer-arrow-callback": "error",
|
|
274
|
+
// Prefer arrow functions for callbacks
|
|
275
|
+
"prefer-template": "warn",
|
|
276
|
+
// Use template literals instead of string concatenation
|
|
277
|
+
"one-var": ["error", "never"],
|
|
278
|
+
// Declare each variable separately
|
|
279
|
+
"no-bitwise": "error",
|
|
280
|
+
// Disallow bitwise operators (often used for obfuscation)
|
|
281
|
+
// Parentheses and expression clarity:
|
|
282
|
+
"no-extra-parens": [
|
|
283
|
+
"error",
|
|
284
|
+
"all",
|
|
285
|
+
{
|
|
286
|
+
ignoreJSX: "all",
|
|
287
|
+
// JSX requires parentheses for multi-line expressions
|
|
288
|
+
enforceForArrowConditionals: false,
|
|
289
|
+
// Allow parentheses in arrow conditionals
|
|
290
|
+
nestedBinaryExpressions: false
|
|
291
|
+
// Allow parentheses for clarity in nested expressions
|
|
292
|
+
}
|
|
293
|
+
],
|
|
294
|
+
// === SECURITY & BEST PRACTICES ===
|
|
295
|
+
// Prevent dangerous code execution patterns:
|
|
296
|
+
"no-eval": "error",
|
|
297
|
+
// Disallows eval() which can execute arbitrary code
|
|
298
|
+
"no-implied-eval": "error",
|
|
299
|
+
// Catches indirect eval usage (setTimeout with string, etc.)
|
|
300
|
+
"no-new-func": "error",
|
|
301
|
+
// Prevents Function constructor which is similar to eval
|
|
302
|
+
"no-script-url": "error",
|
|
303
|
+
// Disallows javascript: URLs which are XSS vectors
|
|
304
|
+
// Error handling and promises:
|
|
305
|
+
"prefer-promise-reject-errors": "error",
|
|
306
|
+
// Ensures promises are rejected with Error objects
|
|
307
|
+
"no-throw-literal": "error",
|
|
308
|
+
// Prevents throwing non-Error objects (strings, numbers, etc.)
|
|
309
|
+
// Code quality and safety:
|
|
310
|
+
"no-unreachable-loop": "error",
|
|
311
|
+
// Catches loops with unreachable iterations
|
|
312
|
+
"no-unsafe-negation": "error",
|
|
313
|
+
// Prevents unsafe negation patterns that can cause bugs
|
|
314
|
+
"yoda": "error",
|
|
315
|
+
// Enforces consistent comparison order (variable == constant, not constant == variable)
|
|
316
|
+
// Promise constructor safety:
|
|
317
|
+
"no-promise-executor-return": "error",
|
|
318
|
+
// Prevents returning values from promise executor
|
|
319
|
+
"no-async-promise-executor": "error",
|
|
320
|
+
// Prevents async promise constructors (anti-pattern)
|
|
321
|
+
// === GENERAL JAVASCRIPT RULES ===
|
|
322
|
+
"quote-props": ["warn", "consistent-as-needed"],
|
|
323
|
+
"object-property-newline": ["warn", { allowAllPropertiesOnSameLine: true }],
|
|
324
|
+
"function-call-argument-newline": ["warn", "consistent"],
|
|
325
|
+
"no-multiple-empty-lines": ["warn", { max: 1, maxEOF: 1 }],
|
|
326
|
+
"no-multi-spaces": "warn",
|
|
327
|
+
"no-useless-rename": "warn",
|
|
328
|
+
"arrow-spacing": "warn",
|
|
329
|
+
"space-infix-ops": "warn",
|
|
330
|
+
"comma-style": ["warn", "last"],
|
|
331
|
+
"no-nested-ternary": "warn",
|
|
332
|
+
"no-unneeded-ternary": "warn",
|
|
333
|
+
"no-else-return": "error",
|
|
334
|
+
"no-console": "warn",
|
|
335
|
+
"no-useless-concat": "warn",
|
|
336
|
+
"no-new": "error",
|
|
337
|
+
"no-extra-semi": "error",
|
|
338
|
+
"no-implicit-coercion": ["warn", { allow: ["!!"] }],
|
|
339
|
+
"no-extra-boolean-cast": "warn",
|
|
208
340
|
"padding-line-between-statements": [
|
|
209
341
|
"error",
|
|
210
342
|
{
|
|
211
|
-
// Require a blank line after directive prologues ("use client", "use strict", etc.)
|
|
212
343
|
blankLine: "always",
|
|
213
344
|
prev: "directive",
|
|
214
345
|
next: "*"
|
|
215
346
|
},
|
|
216
347
|
{
|
|
217
|
-
// But we *don't* want to require blank lines between multiple directives
|
|
218
|
-
// (so `"use client";` can be followed immediately by `"use strict";`)
|
|
219
348
|
blankLine: "any",
|
|
220
349
|
prev: "directive",
|
|
221
350
|
next: "directive"
|
|
222
351
|
},
|
|
223
352
|
{
|
|
224
|
-
// No blank line between import and import statements
|
|
225
353
|
blankLine: "never",
|
|
226
354
|
prev: "import",
|
|
227
355
|
next: "import"
|
|
228
356
|
}
|
|
229
357
|
],
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
"
|
|
233
|
-
"
|
|
234
|
-
"prefer-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
358
|
+
// === TYPESCRIPT RULES ===
|
|
359
|
+
// Type safety & preferences
|
|
360
|
+
"@typescript-eslint/no-explicit-any": ["warn", { fixToUnknown: true }],
|
|
361
|
+
"@typescript-eslint/no-inferrable-types": ["warn", { ignoreParameters: true }],
|
|
362
|
+
"@typescript-eslint/prefer-nullish-coalescing": [
|
|
363
|
+
"warn",
|
|
364
|
+
{ ignorePrimitives: { string: true } }
|
|
365
|
+
],
|
|
366
|
+
"@typescript-eslint/no-non-null-asserted-nullish-coalescing": "error",
|
|
367
|
+
"@typescript-eslint/no-non-null-asserted-optional-chain": "error",
|
|
368
|
+
"@typescript-eslint/no-extra-non-null-assertion": "error",
|
|
369
|
+
"@typescript-eslint/no-confusing-non-null-assertion": "error",
|
|
370
|
+
"@typescript-eslint/ban-ts-comment": [
|
|
371
|
+
"error",
|
|
372
|
+
{ "ts-expect-error": "allow-with-description", "ts-ignore": "allow-with-description" }
|
|
373
|
+
],
|
|
374
|
+
"@typescript-eslint/no-empty-object-type": "warn",
|
|
375
|
+
"@typescript-eslint/no-unsafe-function-type": "warn",
|
|
376
|
+
"@typescript-eslint/no-wrapper-object-types": "warn",
|
|
377
|
+
"@typescript-eslint/array-type": ["warn", { default: "array" }],
|
|
378
|
+
"@typescript-eslint/no-unnecessary-condition": "warn",
|
|
379
|
+
"@typescript-eslint/no-unnecessary-boolean-literal-compare": "warn",
|
|
380
|
+
"@typescript-eslint/no-floating-promises": "error",
|
|
381
|
+
"@typescript-eslint/await-thenable": "error",
|
|
382
|
+
"@typescript-eslint/prefer-readonly": "warn",
|
|
383
|
+
"@typescript-eslint/no-invalid-void-type": "error",
|
|
384
|
+
// Void types are valid in many contexts (e.g., Promise<void>)
|
|
385
|
+
"@typescript-eslint/no-misused-promises": "error",
|
|
386
|
+
// Too many false positives with promise handling
|
|
387
|
+
// TypeScript consistency
|
|
388
|
+
"@typescript-eslint/consistent-indexed-object-style": ["error", "record"],
|
|
389
|
+
"@typescript-eslint/consistent-type-assertions": ["error", { assertionStyle: "as" }],
|
|
390
|
+
"@typescript-eslint/consistent-type-definitions": ["error", "type"],
|
|
391
|
+
"@typescript-eslint/consistent-type-exports": "error",
|
|
392
|
+
"@typescript-eslint/method-signature-style": "error",
|
|
393
|
+
// TypeScript equivalents of core rules
|
|
238
394
|
"@typescript-eslint/no-redeclare": "error",
|
|
239
395
|
"@typescript-eslint/default-param-last": "error",
|
|
240
|
-
"@typescript-eslint/require-await": "off",
|
|
241
|
-
"no-return-await": "warn",
|
|
242
|
-
"no-nested-ternary": "warn",
|
|
243
|
-
"no-unneeded-ternary": "warn",
|
|
244
|
-
"no-else-return": "warn",
|
|
245
|
-
"no-constant-condition": "off",
|
|
246
396
|
"@typescript-eslint/dot-notation": "error",
|
|
247
397
|
"@typescript-eslint/no-unused-expressions": [
|
|
248
398
|
"error",
|
|
@@ -256,14 +406,7 @@ var config = [
|
|
|
256
406
|
"error",
|
|
257
407
|
{ variables: true, functions: false }
|
|
258
408
|
],
|
|
259
|
-
"no-
|
|
260
|
-
"no-useless-concat": "warn",
|
|
261
|
-
"no-new": "error",
|
|
262
|
-
"no-extra-semi": "error",
|
|
263
|
-
"no-implicit-coercion": ["warn", { allow: ["!!"] }],
|
|
264
|
-
"no-extra-boolean-cast": "warn",
|
|
265
|
-
// Magic numbers
|
|
266
|
-
"no-magic-numbers": "off",
|
|
409
|
+
"@typescript-eslint/no-shadow": "error",
|
|
267
410
|
"@typescript-eslint/no-magic-numbers": [
|
|
268
411
|
"error",
|
|
269
412
|
{
|
|
@@ -274,44 +417,44 @@ var config = [
|
|
|
274
417
|
ignore: [0, 1, -1, 2]
|
|
275
418
|
}
|
|
276
419
|
],
|
|
277
|
-
//
|
|
278
|
-
"@
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
420
|
+
// Expressions and async
|
|
421
|
+
"@typescript-eslint/no-confusing-void-expression": [
|
|
422
|
+
"error",
|
|
423
|
+
{ ignoreArrowShorthand: true }
|
|
424
|
+
],
|
|
425
|
+
"@typescript-eslint/no-meaningless-void-operator": "error",
|
|
426
|
+
// TypeScript modern preferences
|
|
427
|
+
"@typescript-eslint/prefer-includes": "error",
|
|
428
|
+
"@typescript-eslint/prefer-optional-chain": "error",
|
|
429
|
+
"@typescript-eslint/prefer-reduce-type-parameter": "error",
|
|
430
|
+
"@typescript-eslint/prefer-string-starts-ends-with": "error",
|
|
431
|
+
// === NAMING CONVENTIONS ===
|
|
283
432
|
"camelcase": ["warn", { allow: ["^_", "content_type", "reply_to"] }],
|
|
284
433
|
"@typescript-eslint/naming-convention": [
|
|
285
434
|
"warn",
|
|
286
|
-
// Property naming rules
|
|
287
435
|
{
|
|
288
436
|
selector: "property",
|
|
289
437
|
format: ["camelCase", "UPPER_CASE"],
|
|
290
438
|
leadingUnderscore: "allow",
|
|
291
439
|
filter: {
|
|
292
440
|
regex: String.raw`^_|[- /?:{}@%]|Provider|Comp|^item$|^condition$|^container$|^Container$|^\d+$`,
|
|
293
|
-
// ignore properties with dashes/slashes/spaces
|
|
294
441
|
match: false
|
|
295
442
|
}
|
|
296
443
|
},
|
|
297
|
-
// Variable-like naming rules
|
|
298
444
|
{
|
|
299
445
|
selector: "variableLike",
|
|
300
446
|
format: ["camelCase", "UPPER_CASE", "PascalCase"],
|
|
301
447
|
trailingUnderscore: "allow"
|
|
302
448
|
},
|
|
303
|
-
// Function variable naming rules
|
|
304
449
|
{
|
|
305
450
|
selector: "variable",
|
|
306
451
|
format: ["camelCase", "PascalCase"],
|
|
307
452
|
types: ["function"],
|
|
308
453
|
filter: {
|
|
309
454
|
regex: "^_|Comp|Provider|Stack|Wrapper|Root",
|
|
310
|
-
// allowing for 'Component' parameter names
|
|
311
455
|
match: false
|
|
312
456
|
}
|
|
313
457
|
},
|
|
314
|
-
// Type naming rules
|
|
315
458
|
{
|
|
316
459
|
selector: "typeLike",
|
|
317
460
|
format: ["PascalCase"],
|
|
@@ -320,12 +463,10 @@ var config = [
|
|
|
320
463
|
match: false
|
|
321
464
|
}
|
|
322
465
|
},
|
|
323
|
-
// Boolean naming rules
|
|
324
466
|
{
|
|
325
467
|
selector: ["variable", "property", "parameter", "typeProperty"],
|
|
326
468
|
types: ["boolean"],
|
|
327
469
|
format: ["UPPER_CASE", "PascalCase"],
|
|
328
|
-
// must be PascalCase because prefix is trimmed
|
|
329
470
|
prefix: booleanNamePrefixes,
|
|
330
471
|
filter: {
|
|
331
472
|
regex: booleanNameExceptions,
|
|
@@ -333,149 +474,86 @@ var config = [
|
|
|
333
474
|
}
|
|
334
475
|
}
|
|
335
476
|
],
|
|
336
|
-
//
|
|
337
|
-
|
|
338
|
-
"
|
|
339
|
-
|
|
340
|
-
"
|
|
341
|
-
|
|
342
|
-
"
|
|
477
|
+
// === IMPORTS & EXPORTS ===
|
|
478
|
+
// Import path and structure validation:
|
|
479
|
+
"import-x/no-absolute-path": "warn",
|
|
480
|
+
// Prevent absolute paths in imports (should use relative or package imports)
|
|
481
|
+
"import-x/newline-after-import": ["warn", { count: 1 }],
|
|
482
|
+
// Require exactly one blank line after imports
|
|
483
|
+
"import-x/no-cycle": ["error", { maxDepth: 1, ignoreExternal: true }],
|
|
484
|
+
// Prevent circular dependencies
|
|
485
|
+
"import-x/order": [
|
|
343
486
|
"warn",
|
|
344
|
-
{
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
"@typescript-eslint/no-unnecessary-boolean-literal-compare": "warn",
|
|
364
|
-
// TS consistency
|
|
365
|
-
"@typescript-eslint/consistent-indexed-object-style": ["error", "record"],
|
|
366
|
-
"@typescript-eslint/consistent-type-assertions": [
|
|
367
|
-
"error",
|
|
368
|
-
{ assertionStyle: "as" }
|
|
369
|
-
],
|
|
370
|
-
"@typescript-eslint/consistent-type-definitions": ["error", "type"],
|
|
371
|
-
"@typescript-eslint/consistent-type-exports": "error",
|
|
372
|
-
"@typescript-eslint/method-signature-style": "error",
|
|
373
|
-
// Expressions and async
|
|
374
|
-
"@typescript-eslint/no-confusing-void-expression": [
|
|
375
|
-
"error",
|
|
376
|
-
{ ignoreArrowShorthand: true }
|
|
487
|
+
{
|
|
488
|
+
"groups": [
|
|
489
|
+
"builtin",
|
|
490
|
+
// Node.js built-in modules
|
|
491
|
+
"external",
|
|
492
|
+
// Packages from node_modules
|
|
493
|
+
["type", "internal"],
|
|
494
|
+
// Type imports, Absolute imports (often aliased like 'src/components')
|
|
495
|
+
"parent",
|
|
496
|
+
// Relative imports from parent directories (../)
|
|
497
|
+
"sibling",
|
|
498
|
+
// Relative imports from sibling directories (./)
|
|
499
|
+
"index",
|
|
500
|
+
// Index file imports (./index.js)
|
|
501
|
+
"object"
|
|
502
|
+
// Imports from object notation
|
|
503
|
+
],
|
|
504
|
+
"newlines-between": "never"
|
|
505
|
+
}
|
|
377
506
|
],
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
"@typescript-eslint/no-misused-promises": "off",
|
|
381
|
-
"@typescript-eslint/no-var-requires": "off",
|
|
382
|
-
// TS modern prefs
|
|
383
|
-
"@typescript-eslint/prefer-includes": "error",
|
|
384
|
-
"@typescript-eslint/prefer-optional-chain": "error",
|
|
385
|
-
"@typescript-eslint/prefer-reduce-type-parameter": "error",
|
|
386
|
-
"@typescript-eslint/prefer-string-starts-ends-with": "error",
|
|
387
|
-
// --- Comment Formatting Rules ---
|
|
388
|
-
"spaced-comment": "off",
|
|
389
|
-
"@stylistic/spaced-comment": ["warn", "always", { line: { markers: ["!", "?", "-", "**"] } }],
|
|
390
|
-
// --- Unused Variables & Imports Rules ---
|
|
391
|
-
"no-unused-vars": "off",
|
|
392
|
-
"@stylistic/no-unused-vars": "off",
|
|
393
|
-
"sonarjs/no-unused-vars": "off",
|
|
507
|
+
// === UNUSED IMPORTS & VARIABLES ===
|
|
508
|
+
// Automatically remove unused imports:
|
|
394
509
|
"unused-imports/no-unused-imports": "error",
|
|
510
|
+
// Error on unused imports (auto-fixable)
|
|
511
|
+
// Handle unused variables with underscore convention:
|
|
395
512
|
"unused-imports/no-unused-vars": [
|
|
396
513
|
"warn",
|
|
397
514
|
{
|
|
398
515
|
vars: "all",
|
|
516
|
+
// Check all variables
|
|
399
517
|
varsIgnorePattern: "^_",
|
|
518
|
+
// Ignore variables starting with underscore
|
|
400
519
|
args: "after-used",
|
|
520
|
+
// Only check arguments after the last used one
|
|
401
521
|
argsIgnorePattern: "^_"
|
|
522
|
+
// Ignore arguments starting with underscore
|
|
402
523
|
}
|
|
403
524
|
],
|
|
404
|
-
//
|
|
525
|
+
// === BANNED APIS ===
|
|
526
|
+
// Ban imperative array/object operations in favor of modern syntax:
|
|
405
527
|
"ban/ban": [
|
|
406
528
|
"warn",
|
|
407
529
|
{
|
|
408
530
|
name: ["*", "concat"],
|
|
409
|
-
message: "
|
|
531
|
+
message: "Array.concat is an imperative operation. Use ES6 spread syntax instead: [...items, newItem]"
|
|
410
532
|
},
|
|
411
533
|
{
|
|
412
534
|
name: ["Object", "assign"],
|
|
413
|
-
message: "Use the spread operator
|
|
535
|
+
message: "Object.assign is imperative. Use the spread operator instead: {...obj}"
|
|
414
536
|
}
|
|
415
537
|
],
|
|
416
|
-
//
|
|
417
|
-
//
|
|
538
|
+
// === CODE STRUCTURE RESTRICTIONS ===
|
|
539
|
+
// Enforce functional programming patterns:
|
|
418
540
|
"no-loops/no-loops": "error",
|
|
419
|
-
//
|
|
541
|
+
// Ban for/while/do-while loops, use array methods instead
|
|
542
|
+
// Enforce pattern-based conditional logic:
|
|
420
543
|
"no-restricted-syntax": [
|
|
421
544
|
"error",
|
|
422
545
|
{
|
|
423
546
|
selector: "SwitchStatement",
|
|
424
|
-
message: "Switch statements are banned. Use `ts-pattern` instead."
|
|
547
|
+
message: "Switch statements are banned. Use `ts-pattern` library for pattern matching instead."
|
|
425
548
|
}
|
|
426
549
|
],
|
|
427
|
-
//
|
|
550
|
+
// === ESLINT COMMENTS ===
|
|
428
551
|
"@eslint-community/eslint-comments/require-description": ["error", { ignore: ["eslint-enable"] }],
|
|
429
|
-
//
|
|
552
|
+
// === TESTING LIBRARY ===
|
|
430
553
|
"testing-library/no-render-in-lifecycle": ["error", { allowTestingFrameworkSetupHook: "beforeEach" }],
|
|
431
|
-
|
|
432
|
-
// --- Import Rules ---
|
|
433
|
-
// Commented out rules kept for reference
|
|
434
|
-
// 'import/no-default-export': 'warn',
|
|
435
|
-
// 'import/no-restricted-paths': ['warn', { zones: restrictedPaths }], // Define restrictedPaths
|
|
436
|
-
"import-x/no-named-as-default-member": "off",
|
|
437
|
-
"import-x/no-absolute-path": "warn",
|
|
438
|
-
"import-x/newline-after-import": ["warn", { count: 1 }],
|
|
439
|
-
"import-x/no-cycle": ["error", { maxDepth: 1, ignoreExternal: true }],
|
|
440
|
-
"import-x/order": [
|
|
441
|
-
"warn",
|
|
442
|
-
{
|
|
443
|
-
"groups": [
|
|
444
|
-
"builtin",
|
|
445
|
-
// Node.js built-in modules
|
|
446
|
-
"external",
|
|
447
|
-
// Packages from node_modules
|
|
448
|
-
["type", "internal"],
|
|
449
|
-
// Type imports, Absolute imports (often aliased like 'src/components')
|
|
450
|
-
"parent",
|
|
451
|
-
// Relative imports from parent directories (../)
|
|
452
|
-
"sibling",
|
|
453
|
-
// Relative imports from sibling directories (./)
|
|
454
|
-
"index",
|
|
455
|
-
// Index file imports (./index.js)
|
|
456
|
-
"object"
|
|
457
|
-
// Imports from object notation
|
|
458
|
-
],
|
|
459
|
-
"newlines-between": "never"
|
|
460
|
-
}
|
|
461
|
-
],
|
|
462
|
-
// --- Sort Rules ---
|
|
463
|
-
"sort/imports": "off",
|
|
464
|
-
// use 'import-x/order' rule instead
|
|
465
|
-
"sort/object-properties": "off",
|
|
554
|
+
// === SORTING ===
|
|
466
555
|
"sort/type-properties": "warn",
|
|
467
|
-
|
|
468
|
-
// --- Unicorn Rules ---
|
|
469
|
-
"unicorn/prefer-global-this": "off",
|
|
470
|
-
"unicorn/prevent-abbreviations": "off",
|
|
471
|
-
"unicorn/no-array-reduce": "off",
|
|
472
|
-
"unicorn/no-array-for-each": "off",
|
|
473
|
-
"unicorn/prefer-top-level-await": "off",
|
|
474
|
-
"unicorn/no-array-callback-reference": "off",
|
|
475
|
-
"unicorn/prefer-switch": "off",
|
|
476
|
-
"unicorn/no-abusive-eslint-disable": "off",
|
|
477
|
-
"unicorn/prefer-object-from-entries": "off",
|
|
478
|
-
"unicorn/no-null": "off",
|
|
556
|
+
// === UNICORN ===
|
|
479
557
|
"unicorn/filename-case": [
|
|
480
558
|
"warn",
|
|
481
559
|
{
|
|
@@ -487,31 +565,8 @@ var config = [
|
|
|
487
565
|
"unicorn/no-unused-properties": "warn",
|
|
488
566
|
"unicorn/consistent-destructuring": "warn",
|
|
489
567
|
"unicorn/no-useless-undefined": ["warn", { checkArguments: false }],
|
|
490
|
-
//
|
|
491
|
-
"sonarjs/no-duplicated-branches": "warn"
|
|
492
|
-
"sonarjs/no-duplicate-string": "off",
|
|
493
|
-
"sonarjs/deprecation": "off",
|
|
494
|
-
"sonarjs/cognitive-complexity": "off",
|
|
495
|
-
// use 'complexity' rule instead
|
|
496
|
-
"sonarjs/no-nested-functions": "off",
|
|
497
|
-
// use 'complexity' rule instead
|
|
498
|
-
"sonarjs/function-return-type": "off",
|
|
499
|
-
// use '@typescript-eslint/explicit-module-boundary-types' rule instead
|
|
500
|
-
"sonarjs/no-redundant-optional": "off",
|
|
501
|
-
// use '@typescript-eslint/no-redundant-optional' rule instead
|
|
502
|
-
"sonarjs/no-commented-code": "off",
|
|
503
|
-
// slow rule
|
|
504
|
-
"sonarjs/todo-tag": "off",
|
|
505
|
-
// eventually re-enable
|
|
506
|
-
"sonarjs/pseudo-random": "off",
|
|
507
|
-
"sonarjs/different-types-comparison": "off",
|
|
508
|
-
// too many false positives
|
|
509
|
-
"sonarjs/redundant-type-aliases": "off",
|
|
510
|
-
"sonarjs/void-use": "off",
|
|
511
|
-
// allow to annotate async functions not explicitly awaited
|
|
512
|
-
"sonarjs/no-nested-conditional": "off",
|
|
513
|
-
// use 'no-nested-ternary' rule instead
|
|
514
|
-
"sonarjs/no-hardcoded-passwords": "off"
|
|
568
|
+
// === SONARJS ===
|
|
569
|
+
"sonarjs/no-duplicated-branches": "warn"
|
|
515
570
|
},
|
|
516
571
|
settings: {
|
|
517
572
|
"import-x/extensions": [".js", ".cjs", ".mjs"],
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/boolean-naming.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-magic-numbers -- config file */\n/* eslint-disable @typescript-eslint/naming-convention -- config file */\nimport eslint from '@eslint/js';\n// @ts-expect-error - no types available\nimport comments from '@eslint-community/eslint-plugin-eslint-comments/configs';\nimport stylistic from '@stylistic/eslint-plugin';\nimport { createTypeScriptImportResolver } from 'eslint-import-resolver-typescript';\nimport importXPlugin from 'eslint-plugin-import-x';\nimport sonarjsPlugin from 'eslint-plugin-sonarjs';\nimport sortPlugin from 'eslint-plugin-sort';\nimport testingLibraryPlugin from 'eslint-plugin-testing-library';\nimport unicornPlugin from 'eslint-plugin-unicorn';\nimport unusedImports from 'eslint-plugin-unused-imports';\nimport globals from 'globals';\nimport tseslint from 'typescript-eslint';\n// @ts-expect-error - no types available\nimport noLoopsPlugin from 'eslint-plugin-no-loops';\n// @ts-expect-error - no types available\nimport banPlugin from 'eslint-plugin-ban';\nimport type { Linter } from 'eslint';\nimport { booleanNameExceptions, booleanNamePrefixes } from './boolean-naming';\n\ntype Plugin = typeof testingLibraryPlugin;\n\nconst config: Linter.Config[] = [\n // Base recommended rules from ESLint\n eslint.configs.recommended,\n\n // TypeScript recommended configs\n ...tseslint.configs.recommendedTypeChecked,\n ...tseslint.configs.stylisticTypeChecked,\n ...tseslint.configs.strict,\n\n // Apply stylistic rules with customized settings\n stylistic.configs.customize({\n arrowParens: true,\n // jsx: true,\n braceStyle: '1tbs',\n commaDangle: 'always-multiline',\n indent: 2,\n quoteProps: 'consistent-as-needed',\n quotes: 'single',\n semi: true,\n }),\n\n // Import plugin configuration\n importXPlugin.flatConfigs.recommended,\n importXPlugin.flatConfigs.typescript,\n sortPlugin.configs['flat/recommended'],\n\n // Code quality plugins\n unicornPlugin.configs.recommended,\n (comments as { recommended: Linter.Config }).recommended,\n sonarjsPlugin.configs.recommended,\n\n // General JavaScript/TypeScript configuration\n {\n files: ['**/*.{js,mjs,cjs,ts,tsx}'],\n languageOptions: {\n ecmaVersion: 'latest',\n globals: {\n ...globals.browser,\n ...globals.node,\n ...globals.es2025,\n ...globals.vitest,\n },\n parserOptions: {\n projectService: true,\n warnOnUnsupportedTypeScriptVersion: true,\n },\n sourceType: 'module',\n },\n linterOptions: {\n reportUnusedDisableDirectives: true,\n },\n plugins: {\n 'no-loops': noLoopsPlugin as Plugin,\n 'ban': banPlugin as Plugin,\n 'testing-library': testingLibraryPlugin,\n 'unused-imports': unusedImports,\n },\n rules: {\n // --- Stylistic Rules ---\n // Core rules turned off in favor of stylistic rules\n 'quotes': 'off',\n 'jsx-quotes': 'off',\n 'func-call-spacing': 'off',\n 'dot-notation': 'off',\n 'no-unused-expressions': 'off',\n 'no-use-before-define': 'off',\n 'default-param-last': 'off',\n 'no-redeclare': 'off',\n 'no-shadow': 'off',\n\n // Stylistic (overrides vs stylistic recommended)\n 'quote-props': ['warn', 'consistent-as-needed'],\n '@stylistic/quotes': ['warn', 'single', { avoidEscape: true }],\n '@stylistic/jsx-quotes': ['warn', 'prefer-single'],\n '@stylistic/jsx-one-expression-per-line': 'off',\n '@stylistic/block-spacing': ['warn', 'never'],\n '@stylistic/object-curly-newline': [\n 'warn',\n { ObjectPattern: { multiline: true, consistent: true } },\n ],\n 'object-property-newline': [\n 'warn',\n { allowAllPropertiesOnSameLine: true },\n ],\n 'function-call-argument-newline': ['warn', 'consistent'],\n 'no-multiple-empty-lines': ['warn', { max: 1, maxEOF: 1 }],\n 'no-multi-spaces': 'warn',\n 'no-useless-rename': 'warn',\n 'arrow-spacing': 'warn',\n 'space-infix-ops': 'warn',\n '@stylistic/operator-linebreak': [\n 'warn',\n 'after',\n { overrides: { '?': 'before', ':': 'before' } },\n ],\n 'comma-style': ['warn', 'last'],\n 'complexity': ['warn', { max: 20 }],\n '@stylistic/max-len': [\n 'warn',\n {\n code: 100,\n comments: 120,\n ignoreUrls: true,\n ignoreTrailingComments: true,\n ignorePattern:\n String.raw`^.*eslint-(disable|enable).+|it\\(|ErrorCodes|@param|@return|^\\s*\\[[^\\]]+\\]:\\s*.+?;$`,\n ignoreTemplateLiterals: true,\n ignoreStrings: true,\n ignoreRegExpLiterals: true,\n },\n ],\n 'no-extra-parens': [\n 'error',\n 'all',\n {\n ignoreJSX: 'all', // don’t complain about JSX parens\n enforceForArrowConditionals: false,\n nestedBinaryExpressions: false,\n },\n ],\n '@stylistic/jsx-wrap-multilines': [\n 'error',\n {\n declaration: 'parens-new-line',\n assignment: 'parens-new-line',\n return: 'parens-new-line',\n arrow: 'parens-new-line',\n condition: 'parens-new-line',\n logical: 'parens-new-line',\n },\n ],\n 'max-lines-per-function': ['error', 120],\n 'max-lines': ['error', { max: 900, skipBlankLines: true }],\n 'func-style': ['warn', 'expression'],\n 'padding-line-between-statements': [\n 'error',\n {\n // Require a blank line after directive prologues (\"use client\", \"use strict\", etc.)\n blankLine: 'always',\n prev: 'directive',\n next: '*',\n },\n {\n // But we *don't* want to require blank lines between multiple directives\n // (so `\"use client\";` can be followed immediately by `\"use strict\";`)\n blankLine: 'any',\n prev: 'directive',\n next: 'directive',\n },\n {\n // No blank line between import and import statements\n blankLine: 'never',\n prev: 'import',\n next: 'import',\n },\n ],\n 'object-shorthand': ['warn', 'always'],\n 'arrow-body-style': ['warn', 'as-needed'],\n 'prefer-destructuring': 'warn',\n 'prefer-arrow-callback': 'error',\n 'prefer-template': 'warn',\n 'one-var': ['error', 'never'],\n 'no-bitwise': 'error',\n\n // TypeScript equivalents and customizations\n '@typescript-eslint/no-redeclare': 'error',\n '@typescript-eslint/default-param-last': 'error',\n '@typescript-eslint/require-await': 'off',\n 'no-return-await': 'warn',\n 'no-nested-ternary': 'warn',\n 'no-unneeded-ternary': 'warn',\n 'no-else-return': 'warn',\n 'no-constant-condition': 'off',\n '@typescript-eslint/dot-notation': 'error',\n '@typescript-eslint/no-unused-expressions': [\n 'error',\n {\n allowShortCircuit: true,\n allowTernary: true,\n allowTaggedTemplates: true,\n },\n ],\n '@typescript-eslint/no-use-before-define': [\n 'error',\n { variables: true, functions: false },\n ],\n 'no-console': 'warn',\n 'no-useless-concat': 'warn',\n 'no-new': 'error',\n 'no-extra-semi': 'error',\n 'no-implicit-coercion': ['warn', { allow: ['!!'] }],\n 'no-extra-boolean-cast': 'warn',\n\n // Magic numbers\n 'no-magic-numbers': 'off',\n '@typescript-eslint/no-magic-numbers': [\n 'error',\n {\n ignoreEnums: true,\n ignoreArrayIndexes: true,\n ignoreDefaultValues: true,\n ignoreTypeIndexes: true,\n ignore: [0, 1, -1, 2],\n },\n ],\n\n // More stylistic specifics\n '@stylistic/brace-style': ['warn', '1tbs', { allowSingleLine: true }],\n '@stylistic/comma-dangle': ['warn', 'always-multiline'],\n '@stylistic/comma-spacing': 'warn',\n '@stylistic/function-call-spacing': ['error'],\n\n // Naming\n 'camelcase': ['warn', { allow: ['^_', 'content_type', 'reply_to'] }],\n '@typescript-eslint/naming-convention': [\n 'warn',\n // Property naming rules\n {\n selector: 'property',\n format: ['camelCase', 'UPPER_CASE'],\n leadingUnderscore: 'allow',\n filter: {\n regex: String.raw`^_|[- /?:{}@%]|Provider|Comp|^item$|^condition$|^container$|^Container$|^\\d+$`, // ignore properties with dashes/slashes/spaces\n match: false,\n },\n },\n // Variable-like naming rules\n {\n selector: 'variableLike',\n format: ['camelCase', 'UPPER_CASE', 'PascalCase'],\n trailingUnderscore: 'allow',\n },\n // Function variable naming rules\n {\n selector: 'variable',\n format: ['camelCase', 'PascalCase'],\n types: ['function'],\n filter: {\n regex: '^_|Comp|Provider|Stack|Wrapper|Root', // allowing for 'Component' parameter names\n match: false,\n },\n },\n // Type naming rules\n {\n selector: 'typeLike',\n format: ['PascalCase'],\n filter: {\n regex: '^_|_$',\n match: false,\n },\n },\n // Boolean naming rules\n {\n selector: ['variable', 'property', 'parameter', 'typeProperty'],\n types: ['boolean'],\n format: ['UPPER_CASE', 'PascalCase'], // must be PascalCase because prefix is trimmed\n prefix: booleanNamePrefixes,\n filter: {\n regex: booleanNameExceptions,\n match: false,\n },\n },\n ],\n\n // TS type safety and preferences\n '@typescript-eslint/no-explicit-any': ['warn', { fixToUnknown: true }],\n '@typescript-eslint/no-inferrable-types': ['warn', { ignoreParameters: true }],\n '@typescript-eslint/no-shadow': 'error',\n '@typescript-eslint/no-unsafe-enum-comparison': 'off',\n '@typescript-eslint/no-base-to-string': 'off',\n '@typescript-eslint/prefer-nullish-coalescing': [\n 'warn',\n { ignorePrimitives: { string: true } },\n ],\n '@typescript-eslint/no-non-null-asserted-nullish-coalescing': 'error',\n '@typescript-eslint/no-non-null-asserted-optional-chain': 'error',\n '@typescript-eslint/no-extra-non-null-assertion': 'error',\n '@typescript-eslint/no-confusing-non-null-assertion': 'error',\n '@typescript-eslint/ban-ts-comment': [\n 'error',\n { 'ts-expect-error': 'allow-with-description', 'ts-ignore': 'allow-with-description' },\n ],\n '@typescript-eslint/no-empty-object-type': 'warn',\n '@typescript-eslint/no-unsafe-function-type': 'warn',\n '@typescript-eslint/no-wrapper-object-types': 'warn',\n '@typescript-eslint/array-type': ['warn', { default: 'array' }],\n '@stylistic/array-element-newline': ['warn', { multiline: true, consistent: true }],\n '@stylistic/array-bracket-newline': ['warn', 'consistent'],\n '@stylistic/no-mixed-operators': ['warn', { allowSamePrecedence: true }],\n '@stylistic/rest-spread-spacing': ['warn', 'never'],\n '@typescript-eslint/no-unnecessary-condition': 'warn',\n '@typescript-eslint/no-unnecessary-boolean-literal-compare': 'warn',\n\n // TS consistency\n '@typescript-eslint/consistent-indexed-object-style': ['error', 'record'],\n '@typescript-eslint/consistent-type-assertions': [\n 'error',\n { assertionStyle: 'as' },\n ],\n '@typescript-eslint/consistent-type-definitions': ['error', 'type'],\n '@typescript-eslint/consistent-type-exports': 'error',\n '@typescript-eslint/method-signature-style': 'error',\n\n // Expressions and async\n '@typescript-eslint/no-confusing-void-expression': [\n 'error',\n { ignoreArrowShorthand: true },\n ],\n '@typescript-eslint/no-invalid-void-type': 'off',\n '@typescript-eslint/no-meaningless-void-operator': 'error',\n '@typescript-eslint/no-misused-promises': 'off',\n '@typescript-eslint/no-var-requires': 'off',\n\n // TS modern prefs\n '@typescript-eslint/prefer-includes': 'error',\n '@typescript-eslint/prefer-optional-chain': 'error',\n '@typescript-eslint/prefer-reduce-type-parameter': 'error',\n '@typescript-eslint/prefer-string-starts-ends-with': 'error',\n\n // --- Comment Formatting Rules ---\n 'spaced-comment': 'off',\n '@stylistic/spaced-comment': ['warn', 'always', { line: { markers: ['!', '?', '-', '**'] } }],\n\n // --- Unused Variables & Imports Rules ---\n 'no-unused-vars': 'off',\n '@stylistic/no-unused-vars': 'off',\n 'sonarjs/no-unused-vars': 'off',\n 'unused-imports/no-unused-imports': 'error',\n 'unused-imports/no-unused-vars': [\n 'warn',\n {\n vars: 'all',\n varsIgnorePattern: '^_',\n args: 'after-used',\n argsIgnorePattern: '^_',\n },\n ],\n\n // --- Banned API Rules ---\n 'ban/ban': [\n 'warn',\n {\n name: ['*', 'concat'],\n message:\n 'Imperative operation: prefer use ES6 spread, i.e. [...items, newItem]',\n },\n {\n name: ['Object', 'assign'],\n message: 'Use the spread operator `{...obj}` instead',\n },\n ],\n\n // --- Code Structure Restrictions ---\n // No loops rule\n 'no-loops/no-loops': 'error',\n\n // Syntax restrictions\n 'no-restricted-syntax': [\n 'error',\n {\n selector: 'SwitchStatement',\n message:\n 'Switch statements are banned. Use `ts-pattern` instead.',\n },\n ],\n\n // --- ESLint Comments Rules ---\n '@eslint-community/eslint-comments/require-description': ['error', { ignore: ['eslint-enable'] }],\n\n // --- Testing Library Rules ---\n 'testing-library/no-render-in-lifecycle': ['error', { allowTestingFrameworkSetupHook: 'beforeEach' }],\n 'testing-library/no-unnecessary-act': 'off',\n\n // --- Import Rules ---\n // Commented out rules kept for reference\n // 'import/no-default-export': 'warn',\n // 'import/no-restricted-paths': ['warn', { zones: restrictedPaths }], // Define restrictedPaths\n 'import-x/no-named-as-default-member': 'off',\n 'import-x/no-absolute-path': 'warn',\n 'import-x/newline-after-import': ['warn', { count: 1 }],\n 'import-x/no-cycle': ['error', { maxDepth: 1, ignoreExternal: true }],\n 'import-x/order': ['warn',\n {\n 'groups': [\n 'builtin', // Node.js built-in modules\n 'external', // Packages from node_modules\n ['type', 'internal'], // Type imports, Absolute imports (often aliased like 'src/components')\n 'parent', // Relative imports from parent directories (../)\n 'sibling', // Relative imports from sibling directories (./)\n 'index', // Index file imports (./index.js)\n 'object', // Imports from object notation\n ],\n 'newlines-between': 'never',\n }],\n\n // --- Sort Rules ---\n 'sort/imports': 'off', // use 'import-x/order' rule instead\n 'sort/object-properties': 'off',\n 'sort/type-properties': 'warn',\n 'sort/string-unions': 'off',\n\n // --- Unicorn Rules ---\n 'unicorn/prefer-global-this': 'off',\n 'unicorn/prevent-abbreviations': 'off',\n 'unicorn/no-array-reduce': 'off',\n 'unicorn/no-array-for-each': 'off',\n 'unicorn/prefer-top-level-await': 'off',\n 'unicorn/no-array-callback-reference': 'off',\n 'unicorn/prefer-switch': 'off',\n 'unicorn/no-abusive-eslint-disable': 'off',\n 'unicorn/prefer-object-from-entries': 'off',\n 'unicorn/no-null': 'off',\n 'unicorn/filename-case': [\n 'warn',\n {\n cases: { camelCase: true, kebabCase: true },\n ignore: [/\\.(js|cjs)$/], // Keep ignoring JS/CJS if needed\n },\n ],\n 'unicorn/no-unused-properties': 'warn',\n 'unicorn/consistent-destructuring': 'warn',\n 'unicorn/no-useless-undefined': ['warn', { checkArguments: false }],\n\n // --- SonarJS Rules ---\n 'sonarjs/no-duplicated-branches': 'warn',\n 'sonarjs/no-duplicate-string': 'off',\n 'sonarjs/deprecation': 'off',\n 'sonarjs/cognitive-complexity': 'off', // use 'complexity' rule instead\n 'sonarjs/no-nested-functions': 'off', // use 'complexity' rule instead\n 'sonarjs/function-return-type': 'off', // use '@typescript-eslint/explicit-module-boundary-types' rule instead\n 'sonarjs/no-redundant-optional': 'off', // use '@typescript-eslint/no-redundant-optional' rule instead\n 'sonarjs/no-commented-code': 'off', // slow rule\n 'sonarjs/todo-tag': 'off', // eventually re-enable\n 'sonarjs/pseudo-random': 'off',\n 'sonarjs/different-types-comparison': 'off', // too many false positives\n 'sonarjs/redundant-type-aliases': 'off',\n 'sonarjs/void-use': 'off', // allow to annotate async functions not explicitly awaited\n 'sonarjs/no-nested-conditional': 'off', // use 'no-nested-ternary' rule instead\n 'sonarjs/no-hardcoded-passwords': 'off',\n },\n settings: {\n 'import-x/extensions': ['.js', '.cjs', '.mjs'],\n 'import-x/parsers': { 'typescript-eslint': ['.ts', '.tsx'] },\n 'import-x/resolver-next': [\n createTypeScriptImportResolver({\n alwaysTryTypes: true,\n bun: true,\n }),\n ],\n },\n },\n\n // Config files overrides\n {\n files: ['**/*.config.{ts,js,mjs,cjs}'],\n rules: {\n '@typescript-eslint/no-magic-numbers': 'off',\n '@typescript-eslint/naming-convention': 'off',\n },\n },\n];\n\n// Export shared utilities for use in other packages\nexport { booleanNameConvention, booleanNameExceptions, booleanNamePrefixes } from './boolean-naming';\n\nexport default config;\n\n/* eslint-enable @typescript-eslint/no-magic-numbers */\n/* eslint-enable @typescript-eslint/naming-convention */\n","/**\n * Combines an array of regex expressions into a single regex expression via the union operator.\n */\nconst concatElementsByRegexUnion = (elements: string[]) =>\n elements.reduce((element, accum, index) => `${accum}${index === 0 ? '' : '|'}${element}`, '');\n\n// Prefixes allowed at the start of a boolean variable/parameter name\nexport const booleanNamePrefixes = [\n 'is',\n 'as',\n 'are',\n 'was',\n 'should',\n 'has',\n 'can',\n 'did',\n 'will',\n 'use',\n 'does',\n 'show',\n 'allow',\n 'enabled',\n 'enable',\n 'disable',\n 'editable',\n 'refetch',\n 'destructive',\n 'hide',\n 'error',\n 'override',\n 'need',\n 'must',\n 'require',\n 'want',\n 'with',\n];\n// Regex for the rest of a boolean variable/parameter name (the part after the prefix)\nconst booleanNameSuffixes = '[A-Z]([A-Za-z]?)+';\n// Exceptions to the rule for allowable boolean variable/parameter names\nconst booleanNameExceptionsList = [\n '^_',\n '_$',\n '[- /?:{}@%]',\n '^[A-Z][a-z]*([A-Z][a-z]*)',\n '^item$',\n '^value$',\n '^condition$',\n '^container$',\n '^included',\n '^center$',\n '^debug$',\n '^concurrent',\n '^animated$',\n '^allow',\n '^visible',\n '^merge$',\n '^ssr$',\n '^multiSelect$',\n 'Shown$',\n '^enumerable$',\n '^configurable$',\n];\n// A singular regex string for the boolean name exceptions (instead of array of expressions)\nexport const booleanNameExceptions = concatElementsByRegexUnion(booleanNameExceptionsList);\n\n// The full boolean naming convetions regex\nexport const booleanNameConvention = new RegExp(\n `${concatElementsByRegexUnion(\n booleanNamePrefixes,\n )}|${booleanNameSuffixes}|${booleanNameExceptions}`,\n).toString();\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/boolean-naming.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-magic-numbers, @typescript-eslint/naming-convention -- config file */\nimport eslint from '@eslint/js';\n// @ts-expect-error - no types available\nimport comments from '@eslint-community/eslint-plugin-eslint-comments/configs';\nimport stylistic from '@stylistic/eslint-plugin';\nimport { createTypeScriptImportResolver } from 'eslint-import-resolver-typescript';\nimport importXPlugin from 'eslint-plugin-import-x';\nimport sonarjsPlugin from 'eslint-plugin-sonarjs';\nimport sortPlugin from 'eslint-plugin-sort';\nimport testingLibraryPlugin from 'eslint-plugin-testing-library';\nimport unicornPlugin from 'eslint-plugin-unicorn';\nimport unusedImports from 'eslint-plugin-unused-imports';\nimport globals from 'globals';\nimport tseslint from 'typescript-eslint';\n// @ts-expect-error - no types available\nimport noLoopsPlugin from 'eslint-plugin-no-loops';\n// @ts-expect-error - no types available\nimport banPlugin from 'eslint-plugin-ban';\nimport type { Linter } from 'eslint';\nimport { booleanNameExceptions, booleanNamePrefixes } from './boolean-naming';\n\ntype Plugin = typeof testingLibraryPlugin;\n\nconst config: Linter.Config[] = [\n // Base configurations\n eslint.configs.recommended,\n ...tseslint.configs.recommendedTypeChecked,\n ...tseslint.configs.stylisticTypeChecked,\n ...tseslint.configs.strict,\n\n // Plugin configurations\n stylistic.configs.customize({\n arrowParens: true,\n braceStyle: '1tbs',\n commaDangle: 'always-multiline',\n indent: 2,\n quoteProps: 'consistent-as-needed',\n quotes: 'single',\n semi: true,\n }),\n importXPlugin.flatConfigs.recommended,\n importXPlugin.flatConfigs.typescript,\n sortPlugin.configs['flat/recommended'],\n unicornPlugin.configs.recommended,\n (comments as { recommended: Linter.Config }).recommended,\n sonarjsPlugin.configs.recommended,\n\n // Main configuration\n {\n files: ['**/*.{js,mjs,cjs,ts,tsx}'],\n languageOptions: {\n ecmaVersion: 'latest',\n globals: {\n ...globals.browser,\n ...globals.node,\n ...globals.es2025,\n ...globals.vitest,\n },\n parserOptions: {\n projectService: true,\n warnOnUnsupportedTypeScriptVersion: true,\n },\n sourceType: 'module',\n },\n linterOptions: {\n reportUnusedDisableDirectives: true,\n },\n plugins: {\n 'no-loops': noLoopsPlugin as Plugin,\n 'ban': banPlugin as Plugin,\n 'testing-library': testingLibraryPlugin,\n 'unused-imports': unusedImports,\n },\n rules: {\n // === DISABLED CORE RULES (replaced by plugins) ===\n // These core ESLint rules are disabled because we use enhanced versions from plugins:\n 'quotes': 'off', // Replaced by @stylistic/quotes with better formatting options and JSX support\n 'jsx-quotes': 'off', // Replaced by @stylistic/jsx-quotes for JSX-specific quote handling\n 'func-call-spacing': 'off', // Replaced by @stylistic/function-call-spacing for consistent spacing\n 'dot-notation': 'off', // Replaced by @typescript-eslint/dot-notation with TypeScript awareness\n 'no-unused-expressions': 'off', // Replaced by @typescript-eslint/no-unused-expressions with better TS support\n 'no-use-before-define': 'off', // Replaced by @typescript-eslint/no-use-before-define for TypeScript hoisting rules\n 'default-param-last': 'off', // Replaced by @typescript-eslint/default-param-last with TS parameter awareness\n 'no-redeclare': 'off', // Replaced by @typescript-eslint/no-redeclare for better type checking\n 'no-shadow': 'off', // Replaced by @typescript-eslint/no-shadow for TypeScript variable shadowing\n 'spaced-comment': 'off', // Replaced by @stylistic/spaced-comment with more formatting options\n 'no-unused-vars': 'off', // Replaced by @typescript-eslint/no-unused-vars and unused-imports plugin\n '@stylistic/no-unused-vars': 'off', // Replaced by unused-imports/no-unused-vars for better import handling\n 'sonarjs/no-unused-vars': 'off', // Replaced by unused-imports/no-unused-vars to avoid conflicts\n 'no-magic-numbers': 'off', // Replaced by @typescript-eslint/no-magic-numbers with TypeScript-aware exceptions\n\n // === DISABLED PLUGIN RULES (intentionally turned off) ===\n // Sort plugin rules (replaced by import-x/order):\n 'sort/imports': 'off', // Replaced by import-x/order which has better TypeScript support\n 'sort/object-properties': 'off', // Object property sorting is not required\n 'sort/string-unions': 'off', // String union sorting is not required\n\n // Unicorn rules that are too restrictive or don't match our style:\n 'unicorn/prefer-global-this': 'off', // GlobalThis is not always preferred over window/global\n 'unicorn/prevent-abbreviations': 'off', // Common abbreviations (props, args, etc.) are acceptable\n 'unicorn/no-array-reduce': 'off', // Array.reduce is a valid and useful method\n 'unicorn/no-array-for-each': 'off', // Array.forEach is preferred over for...of in many cases\n 'unicorn/prefer-top-level-await': 'off', // Top-level await is not always appropriate\n 'unicorn/no-array-callback-reference': 'off', // Method references as callbacks are acceptable\n 'unicorn/prefer-switch': 'off', // Switch statements are banned (see no-restricted-syntax below)\n 'unicorn/prefer-object-from-entries': 'off', // Object.fromEntries is not always better\n 'unicorn/no-null': 'off', // Null is still a valid value in many contexts\n\n // SonarJS rules that are disabled for various reasons:\n 'sonarjs/cognitive-complexity': 'off', // Replaced by core complexity rule which is simpler\n 'sonarjs/no-nested-functions': 'off', // Replaced by complexity rule, nested functions are sometimes needed\n 'sonarjs/function-return-type': 'off', // TypeScript handles return type checking better\n 'sonarjs/no-redundant-optional': 'off', // TypeScript handles optional types better\n 'sonarjs/no-commented-code': 'off', // Performance-intensive rule, commented code is sometimes useful\n 'sonarjs/todo-tag': 'off', // TODO comments are acceptable during development\n 'sonarjs/pseudo-random': 'off', // Math.random() is acceptable for non-cryptographic uses\n 'sonarjs/void-use': 'off', // Allow void operators for type assertions and async function annotations\n 'sonarjs/no-nested-conditional': 'off', // Replaced by no-nested-ternary rule\n 'sonarjs/no-hardcoded-passwords': 'off',\n\n // Import and testing rules:\n 'import-x/no-named-as-default-member': 'off', // Named default exports are sometimes necessary\n\n // === STYLISTIC & FORMATTING ===\n '@stylistic/quotes': ['warn', 'single', { avoidEscape: true }],\n '@stylistic/jsx-quotes': ['warn', 'prefer-single'],\n '@stylistic/block-spacing': ['warn', 'never'],\n '@stylistic/object-curly-newline': [\n 'warn',\n { ObjectPattern: { multiline: true, consistent: true } },\n ],\n '@stylistic/operator-linebreak': [\n 'warn',\n 'after',\n { overrides: { '?': 'before', ':': 'before' } },\n ],\n '@stylistic/max-len': [\n 'warn',\n {\n code: 100,\n comments: 120,\n ignoreUrls: true,\n ignoreTrailingComments: true,\n ignorePattern: String.raw`^.*eslint-(disable|enable).+|it\\(|ErrorCodes|@param|@return|^\\s*\\[[^\\]]+\\]:\\s*.+?;$`,\n ignoreTemplateLiterals: true,\n ignoreStrings: true,\n ignoreRegExpLiterals: true,\n },\n ],\n '@stylistic/jsx-wrap-multilines': [\n 'error',\n {\n declaration: 'parens-new-line',\n assignment: 'parens-new-line',\n return: 'parens-new-line',\n arrow: 'parens-new-line',\n condition: 'parens-new-line',\n logical: 'parens-new-line',\n },\n ],\n '@stylistic/brace-style': ['warn', '1tbs', { allowSingleLine: true }],\n '@stylistic/comma-dangle': ['warn', 'always-multiline'],\n '@stylistic/comma-spacing': 'warn',\n '@stylistic/function-call-spacing': ['error'],\n '@stylistic/array-element-newline': ['warn', { multiline: true, consistent: true }],\n '@stylistic/array-bracket-newline': ['warn', 'consistent'],\n '@stylistic/no-mixed-operators': ['warn', { allowSamePrecedence: true }],\n '@stylistic/rest-spread-spacing': ['warn', 'never'],\n '@stylistic/spaced-comment': ['warn', 'always', { line: { markers: ['!', '?', '-', '**'] } }],\n '@stylistic/jsx-one-expression-per-line': 'warn',\n\n // === CODE QUALITY & STRUCTURE ===\n // Complexity and size limits:\n 'complexity': ['warn', { max: 20 }], // Warn when cyclomatic complexity exceeds 20\n 'max-lines-per-function': ['error', 120], // Error when functions exceed 120 lines\n 'max-lines': ['error', { max: 600, skipBlankLines: true }], // Error when files exceed 900 lines\n\n // Code style preferences:\n 'func-style': ['warn', 'expression'], // Prefer function expressions over declarations\n 'object-shorthand': ['warn', 'always'], // Use object shorthand ({ name } instead of { name: name })\n 'arrow-body-style': ['warn', 'as-needed'], // Use concise arrow functions when possible\n 'prefer-destructuring': 'warn', // Prefer destructuring for object/array access\n 'prefer-arrow-callback': 'error', // Prefer arrow functions for callbacks\n 'prefer-template': 'warn', // Use template literals instead of string concatenation\n 'one-var': ['error', 'never'], // Declare each variable separately\n 'no-bitwise': 'error', // Disallow bitwise operators (often used for obfuscation)\n\n // Parentheses and expression clarity:\n 'no-extra-parens': [\n 'error',\n 'all',\n {\n ignoreJSX: 'all', // JSX requires parentheses for multi-line expressions\n enforceForArrowConditionals: false, // Allow parentheses in arrow conditionals\n nestedBinaryExpressions: false, // Allow parentheses for clarity in nested expressions\n },\n ],\n\n // === SECURITY & BEST PRACTICES ===\n // Prevent dangerous code execution patterns:\n 'no-eval': 'error', // Disallows eval() which can execute arbitrary code\n 'no-implied-eval': 'error', // Catches indirect eval usage (setTimeout with string, etc.)\n 'no-new-func': 'error', // Prevents Function constructor which is similar to eval\n 'no-script-url': 'error', // Disallows javascript: URLs which are XSS vectors\n\n // Error handling and promises:\n 'prefer-promise-reject-errors': 'error', // Ensures promises are rejected with Error objects\n 'no-throw-literal': 'error', // Prevents throwing non-Error objects (strings, numbers, etc.)\n\n // Code quality and safety:\n 'no-unreachable-loop': 'error', // Catches loops with unreachable iterations\n 'no-unsafe-negation': 'error', // Prevents unsafe negation patterns that can cause bugs\n 'yoda': 'error', // Enforces consistent comparison order (variable == constant, not constant == variable)\n\n // Promise constructor safety:\n 'no-promise-executor-return': 'error', // Prevents returning values from promise executor\n 'no-async-promise-executor': 'error', // Prevents async promise constructors (anti-pattern)\n\n // === GENERAL JAVASCRIPT RULES ===\n 'quote-props': ['warn', 'consistent-as-needed'],\n 'object-property-newline': ['warn', { allowAllPropertiesOnSameLine: true }],\n 'function-call-argument-newline': ['warn', 'consistent'],\n 'no-multiple-empty-lines': ['warn', { max: 1, maxEOF: 1 }],\n 'no-multi-spaces': 'warn',\n 'no-useless-rename': 'warn',\n 'arrow-spacing': 'warn',\n 'space-infix-ops': 'warn',\n 'comma-style': ['warn', 'last'],\n 'no-nested-ternary': 'warn',\n 'no-unneeded-ternary': 'warn',\n 'no-else-return': 'error',\n 'no-console': 'warn',\n 'no-useless-concat': 'warn',\n 'no-new': 'error',\n 'no-extra-semi': 'error',\n 'no-implicit-coercion': ['warn', { allow: ['!!'] }],\n 'no-extra-boolean-cast': 'warn',\n 'padding-line-between-statements': [\n 'error',\n {\n blankLine: 'always',\n prev: 'directive',\n next: '*',\n },\n {\n blankLine: 'any',\n prev: 'directive',\n next: 'directive',\n },\n {\n blankLine: 'never',\n prev: 'import',\n next: 'import',\n },\n ],\n\n // === TYPESCRIPT RULES ===\n // Type safety & preferences\n '@typescript-eslint/no-explicit-any': ['warn', { fixToUnknown: true }],\n '@typescript-eslint/no-inferrable-types': ['warn', { ignoreParameters: true }],\n '@typescript-eslint/prefer-nullish-coalescing': [\n 'warn',\n { ignorePrimitives: { string: true } },\n ],\n '@typescript-eslint/no-non-null-asserted-nullish-coalescing': 'error',\n '@typescript-eslint/no-non-null-asserted-optional-chain': 'error',\n '@typescript-eslint/no-extra-non-null-assertion': 'error',\n '@typescript-eslint/no-confusing-non-null-assertion': 'error',\n '@typescript-eslint/ban-ts-comment': [\n 'error',\n { 'ts-expect-error': 'allow-with-description', 'ts-ignore': 'allow-with-description' },\n ],\n '@typescript-eslint/no-empty-object-type': 'warn',\n '@typescript-eslint/no-unsafe-function-type': 'warn',\n '@typescript-eslint/no-wrapper-object-types': 'warn',\n '@typescript-eslint/array-type': ['warn', { default: 'array' }],\n '@typescript-eslint/no-unnecessary-condition': 'warn',\n '@typescript-eslint/no-unnecessary-boolean-literal-compare': 'warn',\n '@typescript-eslint/no-floating-promises': 'error',\n '@typescript-eslint/await-thenable': 'error',\n '@typescript-eslint/prefer-readonly': 'warn',\n '@typescript-eslint/no-invalid-void-type': 'error', // Void types are valid in many contexts (e.g., Promise<void>)\n '@typescript-eslint/no-misused-promises': 'error', // Too many false positives with promise handling\n\n // TypeScript consistency\n '@typescript-eslint/consistent-indexed-object-style': ['error', 'record'],\n '@typescript-eslint/consistent-type-assertions': ['error', { assertionStyle: 'as' }],\n '@typescript-eslint/consistent-type-definitions': ['error', 'type'],\n '@typescript-eslint/consistent-type-exports': 'error',\n '@typescript-eslint/method-signature-style': 'error',\n\n // TypeScript equivalents of core rules\n '@typescript-eslint/no-redeclare': 'error',\n '@typescript-eslint/default-param-last': 'error',\n '@typescript-eslint/dot-notation': 'error',\n '@typescript-eslint/no-unused-expressions': [\n 'error',\n {\n allowShortCircuit: true,\n allowTernary: true,\n allowTaggedTemplates: true,\n },\n ],\n '@typescript-eslint/no-use-before-define': [\n 'error',\n { variables: true, functions: false },\n ],\n '@typescript-eslint/no-shadow': 'error',\n '@typescript-eslint/no-magic-numbers': [\n 'error',\n {\n ignoreEnums: true,\n ignoreArrayIndexes: true,\n ignoreDefaultValues: true,\n ignoreTypeIndexes: true,\n ignore: [0, 1, -1, 2],\n },\n ],\n\n // Expressions and async\n '@typescript-eslint/no-confusing-void-expression': [\n 'error',\n { ignoreArrowShorthand: true },\n ],\n '@typescript-eslint/no-meaningless-void-operator': 'error',\n\n // TypeScript modern preferences\n '@typescript-eslint/prefer-includes': 'error',\n '@typescript-eslint/prefer-optional-chain': 'error',\n '@typescript-eslint/prefer-reduce-type-parameter': 'error',\n '@typescript-eslint/prefer-string-starts-ends-with': 'error',\n\n // === NAMING CONVENTIONS ===\n 'camelcase': ['warn', { allow: ['^_', 'content_type', 'reply_to'] }],\n '@typescript-eslint/naming-convention': [\n 'warn',\n {\n selector: 'property',\n format: ['camelCase', 'UPPER_CASE'],\n leadingUnderscore: 'allow',\n filter: {\n regex: String.raw`^_|[- /?:{}@%]|Provider|Comp|^item$|^condition$|^container$|^Container$|^\\d+$`,\n match: false,\n },\n },\n {\n selector: 'variableLike',\n format: ['camelCase', 'UPPER_CASE', 'PascalCase'],\n trailingUnderscore: 'allow',\n },\n {\n selector: 'variable',\n format: ['camelCase', 'PascalCase'],\n types: ['function'],\n filter: {\n regex: '^_|Comp|Provider|Stack|Wrapper|Root',\n match: false,\n },\n },\n {\n selector: 'typeLike',\n format: ['PascalCase'],\n filter: {\n regex: '^_|_$',\n match: false,\n },\n },\n {\n selector: ['variable', 'property', 'parameter', 'typeProperty'],\n types: ['boolean'],\n format: ['UPPER_CASE', 'PascalCase'],\n prefix: booleanNamePrefixes,\n filter: {\n regex: booleanNameExceptions,\n match: false,\n },\n },\n ],\n\n // === IMPORTS & EXPORTS ===\n // Import path and structure validation:\n 'import-x/no-absolute-path': 'warn', // Prevent absolute paths in imports (should use relative or package imports)\n 'import-x/newline-after-import': ['warn', { count: 1 }], // Require exactly one blank line after imports\n 'import-x/no-cycle': ['error', { maxDepth: 1, ignoreExternal: true }], // Prevent circular dependencies\n 'import-x/order': ['warn',\n {\n 'groups': [\n 'builtin', // Node.js built-in modules\n 'external', // Packages from node_modules\n ['type', 'internal'], // Type imports, Absolute imports (often aliased like 'src/components')\n 'parent', // Relative imports from parent directories (../)\n 'sibling', // Relative imports from sibling directories (./)\n 'index', // Index file imports (./index.js)\n 'object', // Imports from object notation\n ],\n 'newlines-between': 'never',\n }],\n\n // === UNUSED IMPORTS & VARIABLES ===\n // Automatically remove unused imports:\n 'unused-imports/no-unused-imports': 'error', // Error on unused imports (auto-fixable)\n\n // Handle unused variables with underscore convention:\n 'unused-imports/no-unused-vars': [\n 'warn',\n {\n vars: 'all', // Check all variables\n varsIgnorePattern: '^_', // Ignore variables starting with underscore\n args: 'after-used', // Only check arguments after the last used one\n argsIgnorePattern: '^_', // Ignore arguments starting with underscore\n },\n ],\n\n // === BANNED APIS ===\n // Ban imperative array/object operations in favor of modern syntax:\n 'ban/ban': [\n 'warn',\n {\n name: ['*', 'concat'],\n message: 'Array.concat is an imperative operation. Use ES6 spread syntax instead: [...items, newItem]',\n },\n {\n name: ['Object', 'assign'],\n message: 'Object.assign is imperative. Use the spread operator instead: {...obj}',\n },\n ],\n\n // === CODE STRUCTURE RESTRICTIONS ===\n // Enforce functional programming patterns:\n 'no-loops/no-loops': 'error', // Ban for/while/do-while loops, use array methods instead\n\n // Enforce pattern-based conditional logic:\n 'no-restricted-syntax': [\n 'error',\n {\n selector: 'SwitchStatement',\n message: 'Switch statements are banned. Use `ts-pattern` library for pattern matching instead.',\n },\n ],\n\n // === ESLINT COMMENTS ===\n '@eslint-community/eslint-comments/require-description': ['error', { ignore: ['eslint-enable'] }],\n\n // === TESTING LIBRARY ===\n 'testing-library/no-render-in-lifecycle': ['error', { allowTestingFrameworkSetupHook: 'beforeEach' }],\n\n // === SORTING ===\n 'sort/type-properties': 'warn',\n\n // === UNICORN ===\n 'unicorn/filename-case': [\n 'warn',\n {\n cases: { camelCase: true, kebabCase: true },\n ignore: [/\\.(js|cjs)$/], // Keep ignoring JS/CJS if needed\n },\n ],\n 'unicorn/no-unused-properties': 'warn',\n 'unicorn/consistent-destructuring': 'warn',\n 'unicorn/no-useless-undefined': ['warn', { checkArguments: false }],\n\n // === SONARJS ===\n 'sonarjs/no-duplicated-branches': 'warn',\n },\n settings: {\n 'import-x/extensions': ['.js', '.cjs', '.mjs'],\n 'import-x/parsers': { 'typescript-eslint': ['.ts', '.tsx'] },\n 'import-x/resolver-next': [\n createTypeScriptImportResolver({\n alwaysTryTypes: true,\n bun: true,\n }),\n ],\n },\n },\n\n // Config files overrides\n {\n files: ['**/*.config.{ts,js,mjs,cjs}'],\n rules: {\n '@typescript-eslint/no-magic-numbers': 'off',\n '@typescript-eslint/naming-convention': 'off',\n },\n },\n];\n\n// Export shared utilities for use in other packages\nexport { booleanNameConvention, booleanNameExceptions, booleanNamePrefixes } from './boolean-naming';\n\nexport default config;\n\n/* eslint-enable @typescript-eslint/no-magic-numbers */\n/* eslint-enable @typescript-eslint/naming-convention */\n","/**\n * Combines an array of regex expressions into a single regex expression via the union operator.\n */\nconst concatElementsByRegexUnion = (elements: string[]) =>\n elements.reduce((element, accum, index) => `${accum}${index === 0 ? '' : '|'}${element}`, '');\n\n// Prefixes allowed at the start of a boolean variable/parameter name\nexport const booleanNamePrefixes = [\n 'is',\n 'as',\n 'are',\n 'was',\n 'should',\n 'has',\n 'can',\n 'did',\n 'will',\n 'use',\n 'does',\n 'show',\n 'allow',\n 'enabled',\n 'enable',\n 'disable',\n 'editable',\n 'refetch',\n 'destructive',\n 'hide',\n 'error',\n 'override',\n 'need',\n 'must',\n 'require',\n 'want',\n 'with',\n];\n// Regex for the rest of a boolean variable/parameter name (the part after the prefix)\nconst booleanNameSuffixes = '[A-Z]([A-Za-z]?)+';\n// Exceptions to the rule for allowable boolean variable/parameter names\nconst booleanNameExceptionsList = [\n '^_',\n '_$',\n '[- /?:{}@%]',\n '^[A-Z][a-z]*([A-Z][a-z]*)',\n '^item$',\n '^value$',\n '^condition$',\n '^container$',\n '^included',\n '^center$',\n '^debug$',\n '^concurrent',\n '^animated$',\n '^allow',\n '^visible',\n '^merge$',\n '^ssr$',\n '^multiSelect$',\n 'Shown$',\n '^enumerable$',\n '^configurable$',\n];\n// A singular regex string for the boolean name exceptions (instead of array of expressions)\nexport const booleanNameExceptions = concatElementsByRegexUnion(booleanNameExceptionsList);\n\n// The full boolean naming convetions regex\nexport const booleanNameConvention = new RegExp(\n `${concatElementsByRegexUnion(\n booleanNamePrefixes,\n )}|${booleanNameSuffixes}|${booleanNameExceptions}`,\n).toString();\n"],"mappings":"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","names":[]}
|