@blumintinc/eslint-plugin-blumint 1.20.41 β 1.20.43
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/README.md +196 -197
- package/lib/index.js +1 -1
- package/lib/rules/enforce-callback-memo.js +9 -0
- package/lib/rules/logical-top-to-bottom-grouping.js +41 -1
- package/lib/rules/memo-nested-react-components.js +127 -1
- package/lib/utils/ASTHelpers.d.ts +41 -0
- package/lib/utils/ASTHelpers.js +146 -0
- package/lib/utils/installValidCaseGuard.d.ts +1 -0
- package/lib/utils/installValidCaseGuard.js +24 -0
- package/lib/utils/validCaseFalsifiability.d.ts +48 -0
- package/lib/utils/validCaseFalsifiability.js +118 -0
- package/package.json +2 -2
- package/release-manifest.json +38 -0
package/README.md
CHANGED
|
@@ -73,209 +73,208 @@ full closed loop is documented in agora's `.claude/skills/eslint-autonomy/SKILL.
|
|
|
73
73
|
<!-- begin auto-generated rules list -->
|
|
74
74
|
|
|
75
75
|
πΌ Configurations enabled in.\
|
|
76
|
-
β οΈ Configurations set to warn in.\
|
|
77
76
|
π« Configurations disabled in.\
|
|
78
77
|
β
Set in the `recommended` configuration.\
|
|
79
78
|
π§ Automatically fixable by the [`--fix` CLI option](https://eslint.org/docs/user-guide/command-line-interface#--fix).\
|
|
80
79
|
π‘ Manually fixable by [editor suggestions](https://eslint.org/docs/latest/use/core-concepts#rule-suggestions).\
|
|
81
80
|
π Requires [type information](https://typescript-eslint.io/linting/typed-linting).
|
|
82
81
|
|
|
83
|
-
| NameΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β | Description | πΌ |
|
|
84
|
-
| :----------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :- | :- | :- | :- | :- |
|
|
85
|
-
| [array-methods-this-context](docs/rules/array-methods-this-context.md) | Prevent misuse of Array methods in OOP | β
| | | | |
|
|
86
|
-
| [avoid-utils-directory](docs/rules/avoid-utils-directory.md) | Enforce using util/ instead of utils/ directory | β
| | | | |
|
|
87
|
-
| [class-methods-read-top-to-bottom](docs/rules/class-methods-read-top-to-bottom.md) | Enforces a top-to-bottom class layout so callers lead into the helpers they rely on. | β
| |
|
|
88
|
-
| [consistent-callback-naming](docs/rules/consistent-callback-naming.md) | Enforce consistent naming conventions for callback props and functions | β
| |
|
|
89
|
-
| [dynamic-https-errors](docs/rules/dynamic-https-errors.md) | Keep HttpsError messages static and move request-specific details to the third argument so error identifiers remain stable and debugging context is preserved. | β
| | | | |
|
|
90
|
-
| [enforce-assert-safe-object-key](docs/rules/enforce-assert-safe-object-key.md) | Enforce the use of assertSafe(id) when accessing object properties with computed keys that involve string interpolation or explicit string conversion. | β
| |
|
|
91
|
-
| [enforce-assert-throws](docs/rules/enforce-assert-throws.md) | Enforce that functions with an assert prefix must throw an error or call process.exit(1), and functions that call assert-prefixed methods should themselves be assert-prefixed | β
| | | | |
|
|
92
|
-
| [enforce-boolean-naming-prefixes](docs/rules/enforce-boolean-naming-prefixes.md) | Enforce consistent naming conventions for boolean values by requiring approved prefixes | β
| | | | |
|
|
93
|
-
| [enforce-callable-types](docs/rules/enforce-callable-types.md) | Enforce Props and Response type exports in callable functions | β
| | | | |
|
|
94
|
-
| [enforce-callback-memo](docs/rules/enforce-callback-memo.md) | Enforce useCallback for inline functions and useMemo for objects/arrays containing functions in JSX props to prevent unnecessary re-renders. This improves React component performance by ensuring stable function references across renders and memoizing complex objects. | β
| | | | |
|
|
95
|
-
| [enforce-centralized-mock-firestore](docs/rules/enforce-centralized-mock-firestore.md) | Enforce usage of centralized mockFirestore from predefined location | β
| |
|
|
96
|
-
| [enforce-cloud-function-id-length](docs/rules/enforce-cloud-function-id-length.md) | Ensures .f.ts file paths generate Firebase Cloud Function IDs within the 62-character limit | β
| | | | |
|
|
97
|
-
| [enforce-console-error](docs/rules/enforce-console-error.md) | Enforce proper logging for useAlertDialog based on severity. When severity is "error", console.error must be included. When severity is "warning", console.warn must be included. This ensures all user-facing errors and warnings are properly logged to observability systems. | β
| | | | |
|
|
98
|
-
| [enforce-css-media-queries](docs/rules/enforce-css-media-queries.md) | Enforce CSS media queries over JS breakpoints | β
| | | | |
|
|
99
|
-
| [enforce-date-ttime](docs/rules/enforce-date-ttime.md) | Enforce that any generic type parameter named TTime is explicitly set to Date in frontend code | β
| |
|
|
100
|
-
| [enforce-dynamic-file-naming](docs/rules/enforce-dynamic-file-naming.md) | Enforce .dynamic.ts(x) file naming when @blumintinc/blumint/enforce-dynamic-imports or @blumintinc/blumint/require-dynamic-firebase-imports rule is disabled | | | | | |
|
|
101
|
-
| [enforce-dynamic-firebase-imports](docs/rules/enforce-dynamic-firebase-imports.md) | Require firebaseCloud modules to be loaded via dynamic import so Firebase code stays out of the initial bundle and only loads when needed. | β
| |
|
|
102
|
-
| [enforce-dynamic-imports](docs/rules/enforce-dynamic-imports.md) | Enforce dynamic imports for external libraries by default to optimize bundle size, unless explicitly ignored | β
| | | | |
|
|
103
|
-
| [enforce-early-destructuring](docs/rules/enforce-early-destructuring.md) | Hoist object destructuring out of React hooks so dependency arrays track the fields in use instead of the entire object. | β
| |
|
|
104
|
-
| [enforce-empty-object-check](docs/rules/enforce-empty-object-check.md) | Ensure object existence checks also guard against empty objects so that empty payloads are treated like missing data. | β
| |
|
|
105
|
-
| [enforce-exported-function-types](docs/rules/enforce-exported-function-types.md) | Enforce exporting types for function props and return values | β
| | | | |
|
|
106
|
-
| [enforce-f-extension-for-entry-points](docs/rules/enforce-f-extension-for-entry-points.md) | Enforce .f.ts extension for entry points | β
| | | | |
|
|
107
|
-
| [enforce-fieldpath-syntax-in-docsetter](docs/rules/enforce-fieldpath-syntax-in-docsetter.md) | Enforce the use of Firestore FieldPath syntax when passing documentData into DocSetter. Instead of using nested object syntax, developers should use dot notation for deeply nested fields. | β
| |
|
|
108
|
-
| [enforce-firestore-doc-ref-generic](docs/rules/enforce-firestore-doc-ref-generic.md) | Enforce generic argument for Firestore DocumentReference, CollectionReference and CollectionGroup | β
| | | |
|
|
109
|
-
| [enforce-firestore-facade](docs/rules/enforce-firestore-facade.md) | Enforce usage of Firestore facades instead of direct Firestore methods | β
| | | | |
|
|
110
|
-
| [enforce-firestore-path-utils](docs/rules/enforce-firestore-path-utils.md) | Enforce usage of utility functions for Firestore paths to ensure type safety, maintainability, and consistent path construction. This prevents errors from manual string concatenation and makes path changes easier to manage. | β
| | | | |
|
|
111
|
-
| [enforce-firestore-rules-get-access](docs/rules/enforce-firestore-rules-get-access.md) | Ensure Firestore security rules use .get() with a default value instead of direct field access comparisons (e.g., resource.data.fieldX.fieldY != null). | β
| |
|
|
112
|
-
| [enforce-firestore-set-merge](docs/rules/enforce-firestore-set-merge.md) | Enforce using set() with { merge: true } instead of update() for Firestore operations to ensure consistent behavior. The update() method fails if the document does not exist, while set() with { merge: true } creates the document if needed and safely merges fields, making it more reliable and predictable. | β
| |
|
|
113
|
-
| [enforce-global-constants](docs/rules/enforce-global-constants.md) | Enforce global static constants for React components/hooks | β
| |
|
|
114
|
-
| [enforce-id-capitalization](docs/rules/enforce-id-capitalization.md) | Enforce the use of "ID" instead of "id" in user-facing text | β
| |
|
|
115
|
-
| [enforce-identifiable-firestore-type](docs/rules/enforce-identifiable-firestore-type.md) | Enforce that Firestore type definitions extend Identifiable and match their folder name | β
| | | | |
|
|
116
|
-
| [enforce-is-prefix-validators](docs/rules/enforce-is-prefix-validators.md) | Enforce the `is` (or other allowed predicate) prefix for exported validators in **/validators/**/*.ts files | β
| | | | |
|
|
117
|
-
| [enforce-m3-sentence-case](docs/rules/enforce-m3-sentence-case.md) | Enforce Material Design 3 sentence-case capitalisation for user-facing text β flag Title Case and ALL CAPS strings in JSX text and configured string props. | β
| | |
|
|
118
|
-
| [enforce-memoize-async](docs/rules/enforce-memoize-async.md) | Enforce @Memoize() decorator on async methods with 0-1 parameters to cache results and prevent redundant API calls or expensive computations. Without memoization, repeated calls trigger redundant requests or expensive computations, increasing latency. @Memoize() caches results by parameter, ensuring subsequent calls with identical inputs return immediately. | β
| |
|
|
119
|
-
| [enforce-memoize-getters](docs/rules/enforce-memoize-getters.md) | Enforce @Memoize() decorator on private class getters to avoid re-instantiation and preserve state across accesses. | β
| |
|
|
120
|
-
| [enforce-microdiff](docs/rules/enforce-microdiff.md) | Enforce using microdiff for object and array comparison operations | β
| |
|
|
121
|
-
| [enforce-mock-firestore](docs/rules/enforce-mock-firestore.md) | Enforce using the standardized mockFirestore utility instead of manual Firestore mocking or third-party mocks. This ensures consistent test behavior across the codebase, reduces boilerplate, and provides type-safe mocking of Firestore operations. | β
| | | | |
|
|
122
|
-
| [enforce-mui-rounded-icons](docs/rules/enforce-mui-rounded-icons.md) | Enforce the use of -Rounded variant for MUI icons | β
| |
|
|
123
|
-
| [enforce-object-literal-as-const](docs/rules/enforce-object-literal-as-const.md) | Enforce that object literals returned from functions should be marked with `as const` to ensure type safety and immutability. | β
| |
|
|
124
|
-
| [enforce-positive-naming](docs/rules/enforce-positive-naming.md) | Enforce positive naming for boolean variables and avoid negations | β
| | | | |
|
|
125
|
-
| [enforce-props-argument-name](docs/rules/enforce-props-argument-name.md) | Authoritative rule: parameters with types ending in "Props" should be named "props" (or prefixed variants when multiple Props params exist) | β
| |
|
|
126
|
-
| [enforce-props-naming-consistency](docs/rules/enforce-props-naming-consistency.md) | Prefer naming single "Props"-typed parameters as "props"; enforcement defers to enforce-props-argument-name for multi-Props cases | β
| |
|
|
127
|
-
| [enforce-querykey-ts](docs/rules/enforce-querykey-ts.md) | Enforce using centralized router state key constants from queryKeys.ts for useRouterState key parameter | β
| |
|
|
128
|
-
| [enforce-react-type-naming](docs/rules/enforce-react-type-naming.md) | Enforce naming conventions for React types | β
| |
|
|
129
|
-
| [enforce-realtimedb-path-utils](docs/rules/enforce-realtimedb-path-utils.md) | Enforce usage of utility functions for Realtime Database paths | β
| | | | |
|
|
130
|
-
| [enforce-render-hits-memoization](docs/rules/enforce-render-hits-memoization.md) | Enforce proper memoization and usage of useRenderHits and renderHits | β
| | | | |
|
|
131
|
-
| [enforce-safe-stringify](docs/rules/enforce-safe-stringify.md) | Enforce using safe-stable-stringify instead of JSON.stringify to handle circular references and ensure deterministic output. JSON.stringify can throw errors on circular references and produce inconsistent output for objects with the same properties in different orders. safe-stable-stringify handles these cases safely. | β
| | |
|
|
132
|
-
| [enforce-serializable-params](docs/rules/enforce-serializable-params.md) | Enforce serializable parameters for Firebase callable/HTTPS functions. | β
| | | | |
|
|
133
|
-
| [enforce-single-exported-unit-per-file](docs/rules/enforce-single-exported-unit-per-file.md) | Enforce that a .tsx/.jsx file exports at most one React component and any file exports at most one class | β
| | | | |
|
|
134
|
-
| [enforce-singular-type-names](docs/rules/enforce-singular-type-names.md) | Enforce TypeScript type names to be singular | β
| | | | |
|
|
135
|
-
| [enforce-snapshot-state-narrowing](docs/rules/enforce-snapshot-state-narrowing.md) | Enforce correct narrowing of FirestoreSnapshotState<T> variables. Falsy/truthy checks are semantic bugs because all string states are truthy; raw typeof narrowing to data bypasses the isSnapshotReady abstraction. | β
| | |
|
|
136
|
-
| [enforce-stable-hash-spread-props](docs/rules/enforce-stable-hash-spread-props.md) | Require stableHash wrapping when spread props rest objects are used in React hook dependency arrays to avoid re-renders triggered by new object references on every render. | β
| |
|
|
137
|
-
| [enforce-storage-context](docs/rules/enforce-storage-context.md) | Require storage access to go through the LocalStorage and SessionStorage context providers instead of direct browser APIs | β
| | | | |
|
|
138
|
-
| [enforce-timestamp-now](docs/rules/enforce-timestamp-now.md) | Enforce the use of Timestamp.now() for getting the current timestamp in backend code. This rule prevents using alternatives like Timestamp.fromDate(new Date()) or other date creation patterns that could lead to inconsistency. | β
| |
|
|
139
|
-
| [enforce-transform-memoization](docs/rules/enforce-transform-memoization.md) | Enforce memoization of transformValue and transformOnChange in adaptValue | β
| | | | |
|
|
140
|
-
| [enforce-types-directory-placement](docs/rules/enforce-types-directory-placement.md) | Enforce that type-only files (containing only type/interface/enum declarations) live under the canonical types directory | β
| | | | |
|
|
141
|
-
| [enforce-typescript-markdown-code-blocks](docs/rules/enforce-typescript-markdown-code-blocks.md) | Ensure Markdown fenced code blocks without a language specifier default to typescript for consistent highlighting. | β
| |
|
|
142
|
-
| [enforce-unique-cursor-headers](docs/rules/enforce-unique-cursor-headers.md) | Ensure files have exactly one cursor header containing required tags (e.g., @fileoverview) before any code | β
| |
|
|
143
|
-
| [enforce-verb-noun-naming](docs/rules/enforce-verb-noun-naming.md) | Enforce verb phrases for functions and methods | β
| | | | |
|
|
144
|
-
| [ensure-pointer-events-none](docs/rules/ensure-pointer-events-none.md) | Ensure pointer-events: none is added to non-interactive pseudo-elements | β
| |
|
|
145
|
-
| [export-if-in-doubt](docs/rules/export-if-in-doubt.md) | All top-level variable declarations, type definitions, and functions should be exported | β
| | | | |
|
|
146
|
-
| [extract-global-constants](docs/rules/extract-global-constants.md) | Extract static constants and functions to the global scope when possible, and enforce type narrowing with as const for numeric literals in loops | β
| | | | |
|
|
147
|
-
| [fast-deep-equal-over-microdiff](docs/rules/fast-deep-equal-over-microdiff.md) | Enforce using fast-deep-equal for equality checks instead of microdiff | β
| |
|
|
148
|
-
| [firestore-transaction-reads-before-writes](docs/rules/firestore-transaction-reads-before-writes.md) | Enforce that all Firestore transaction read operations are performed before any write operations | β
| | | | |
|
|
149
|
-
| [flatten-push-calls](docs/rules/flatten-push-calls.md) | Consolidate consecutive push calls on the same array into a single push with multiple arguments. | β
| |
|
|
150
|
-
| [generic-starts-with-t](docs/rules/generic-starts-with-t.md) | Enforce TypeScript generic type parameters to start with T so they stand out from runtime values. | β
| | | | |
|
|
151
|
-
| [global-const-style](docs/rules/global-const-style.md) | Enforce UPPER_SNAKE_CASE and as const for global static constants | β
| |
|
|
152
|
-
| [jsdoc-above-field](docs/rules/jsdoc-above-field.md) | Require JSDoc blocks to sit above fields instead of trailing inline so IDE hovers surface the documentation. | β
| |
|
|
153
|
-
| [key-only-outermost-element](docs/rules/key-only-outermost-element.md) | Enforce that only the outermost element in list rendering has a key prop | β
| |
|
|
154
|
-
| [logical-top-to-bottom-grouping](docs/rules/logical-top-to-bottom-grouping.md) | Enforce logical top-to-bottom grouping of related statements | β
| |
|
|
155
|
-
| [memo-compare-deeply-complex-props](docs/rules/memo-compare-deeply-complex-props.md) | Suggest compareDeeply for memoized components that receive object/array props to avoid shallow comparison re-renders. | β
| |
|
|
156
|
-
| [memo-nested-react-components](docs/rules/memo-nested-react-components.md) | Disallow React components defined in render bodies, hooks, or passed as props | β
| | | | |
|
|
157
|
-
| [memoize-root-level-hocs](docs/rules/memoize-root-level-hocs.md) | Prevent creating Higher-Order Components at the root level of React components/hooks without wrapping them in useMemo to keep wrapped component identities stable across renders. | β
| | | | |
|
|
158
|
-
| [no-always-true-false-conditions](docs/rules/no-always-true-false-conditions.md) | Detect conditions that are always truthy or always falsy | β
| | | | |
|
|
159
|
-
| [no-array-length-in-deps](docs/rules/no-array-length-in-deps.md) | Detects array.length entries in React hook dependency arrays because length ignores content changes; auto-fixes by memoizing stableHash(array) with useMemo and depending on the hash instead. | β
| |
|
|
160
|
-
| [no-async-array-filter](docs/rules/no-async-array-filter.md) | Disallow async callbacks in Array.filter(). Async predicates return Promises that are always truthy to the filter, so no element is ever removed. Resolve async checks first (Promise.all + map) or use a synchronous predicate to decide which items to keep. | β
| | | | |
|
|
161
|
-
| [no-async-foreach](docs/rules/no-async-foreach.md) | Disallow async callbacks to Array.forEach | β
| | | | |
|
|
162
|
-
| [no-circular-references](docs/rules/no-circular-references.md) | Disallow circular references in objects | β
| | | | |
|
|
163
|
-
| [no-class-instance-destructuring](docs/rules/no-class-instance-destructuring.md) | Disallow destructuring of class instances to prevent loss of `this` context | β
| |
|
|
164
|
-
| [no-complex-cloud-params](docs/rules/no-complex-cloud-params.md) | Disallow passing complex objects to cloud functions | β
| | | | |
|
|
165
|
-
| [no-compositing-layer-props](docs/rules/no-compositing-layer-props.md) | Discourage CSS properties that force GPU compositing layers (e.g., transform, filter, will-change). Extra layers consume GPU memory and split rendering work, which slows scrolling and animation when sprinkled across a page. The rule inspects inline style objects and MUI sx props so layer promotion stays intentional rather than incidental. | β
| | | | |
|
|
166
|
-
| [no-conditional-literals-in-jsx](docs/rules/no-conditional-literals-in-jsx.md) | Disallow conditional string literals beside other JSX text to avoid fragmented text nodes, translation issues, and hydration mismatches. | β
| | | | |
|
|
167
|
-
| [no-console-error](docs/rules/no-console-error.md) | Disallow console.error so errors flow through structured handling (HttpsError/useErrorAlert on frontend, structured loggers on backend). | β
| | | | |
|
|
168
|
-
| [no-curly-brackets-around-commented-properties](docs/rules/no-curly-brackets-around-commented-properties.md) | Disallow curly-brace blocks that only wrap commented-out members inside type declarations | β
| |
|
|
169
|
-
| [no-direct-function-state](docs/rules/no-direct-function-state.md) | Prevent passing a function directly to a useState setter β React will invoke it as a functional updater instead of storing it. Wrap in a thunk: setState(() => fn). | β
| |
|
|
170
|
-
| [no-empty-dependency-use-callbacks](docs/rules/no-empty-dependency-use-callbacks.md) | Discourage useCallback([]) or useLatestCallback around static functions. Static callbacks do not need hook machineryβextract them to module-level utilities for clarity and to avoid unnecessary hook overhead. | β
| |
|
|
171
|
-
| [no-entire-object-hook-deps](docs/rules/no-entire-object-hook-deps.md) | Avoid using entire objects in React hook dependency arrays. | β
| |
|
|
172
|
-
| [no-excessive-parent-chain](docs/rules/no-excessive-parent-chain.md) | Discourage excessive use of the ref.parent property chain in Firestore and RealtimeDB change handlers | | | |
|
|
173
|
-
| [no-explicit-return-type](docs/rules/no-explicit-return-type.md) | Disallow explicit return type annotations on functions when TypeScript can infer them. This reduces code verbosity and maintenance burden while leveraging TypeScript's powerful type inference. Exceptions are made for type guard functions (using the `is` keyword), recursive functions, overloaded functions, interface methods, and abstract methods where explicit types improve clarity. | β
| |
|
|
174
|
-
| [no-fill-template-mutation](docs/rules/no-fill-template-mutation.md) | Disallow mutating the return value of fillTemplate() via string concatenation, template literals, or string method calls. The filled Algolia filter must be used verbatim so matchesTemplate() can regex-match it; post-fill modification silently breaks realtime hash parity. | β
| | | | |
|
|
175
|
-
| [no-filter-without-return](docs/rules/no-filter-without-return.md) | Disallow Array.filter callbacks without an explicit return (if part of a block statement) | β
| | | | |
|
|
176
|
-
| [no-firestore-jest-mock](docs/rules/no-firestore-jest-mock.md) | Prevent importing firestore-jest-mock in test files | β
| |
|
|
177
|
-
| [no-firestore-object-arrays](docs/rules/no-firestore-object-arrays.md) | Disallow arrays of object types in Firestore models. Prefer Record maps keyed by id with an index field, or subcollections/arrays of IDs. | β
| | | | |
|
|
178
|
-
| [no-handler-suffix](docs/rules/no-handler-suffix.md) | Disallow the generic "handler" suffix in callback names so names explain the action they perform | β
| | | | |
|
|
179
|
-
| [no-harness-coupled-disables](docs/rules/no-harness-coupled-disables.md) | Disallow eslint-disable justifications that reference the agent development harness (worktree, cwd, stop-hook, claude) instead of the codeβs own semantics. | β
| | | | |
|
|
180
|
-
| [no-hungarian](docs/rules/no-hungarian.md) | Disallow Hungarian notation in locally declared variables, types, and classes | β
| | | | |
|
|
181
|
-
| [no-inline-component-prop](docs/rules/no-inline-component-prop.md) | Prevent inline function components defined in render from being passed to component-type props like CatalogWrapper to avoid remounts and UI flashes. | β
| | | | |
|
|
182
|
-
| [no-jsx-in-hooks](docs/rules/no-jsx-in-hooks.md) | Prevent hooks from returning JSX | β
| | | | |
|
|
183
|
-
| [no-jsx-whitespace-literal](docs/rules/no-jsx-whitespace-literal.md) | Disallow the use of {" "} elements in JSX code | β
| | | | |
|
|
184
|
-
| [no-margin-properties](docs/rules/no-margin-properties.md) | Prevent margin properties (margin, marginLeft, marginRight, marginTop, marginBottom, mx, my, etc.) in MUI styling because margins fight container-controlled spacing, double gutters, and misaligned breakpoints; keep spacing centralized with padding, gap, or spacing props instead. | β
| | | | |
|
|
185
|
-
| [no-memoize-on-static](docs/rules/no-memoize-on-static.md) | Prevent using @Memoize() decorator on static methods | β
| | | | |
|
|
186
|
-
| [no-misleading-boolean-prefixes](docs/rules/no-misleading-boolean-prefixes.md) | Reserve boolean-style prefixes (is/has/should) for functions that actually return boolean values to avoid misleading call sites. | β
| | | | |
|
|
187
|
-
| [no-misused-switch-case](docs/rules/no-misused-switch-case.md) | Prevent misuse of logical OR (\|\|) in switch case statements, which can lead to confusing and error-prone code. Instead of using OR operators in case expressions, use multiple case statements in sequence to handle multiple values. This improves code readability and follows the standard switch-case pattern. | β
| | | | |
|
|
188
|
-
| [no-mixed-firestore-transactions](docs/rules/no-mixed-firestore-transactions.md) | Prevent mixing transactional and non-transactional Firestore operations within a transaction | β
| | | | |
|
|
189
|
-
| [no-mock-firebase-admin](docs/rules/no-mock-firebase-admin.md) | Prevent direct mocking of firebaseAdmin; use shared test helpers instead | β
| | | | |
|
|
190
|
-
| [no-object-values-on-strings](docs/rules/no-object-values-on-strings.md) | Disallow Object.values() on strings as it treats strings as arrays of characters, which is likely unintended behavior. | β
| | | | |
|
|
191
|
-
| [no-overridable-method-calls-in-constructor](docs/rules/no-overridable-method-calls-in-constructor.md) | Disallow calling overridable methods in constructors to prevent unexpected behavior | β
| | | | |
|
|
192
|
-
| [no-passthrough-getters](docs/rules/no-passthrough-getters.md) | Avoid getter methods that only re-expose nested properties on constructor-injected objects without adding behavior | β
| | | | |
|
|
193
|
-
| [no-portal-inside-tooltip](docs/rules/no-portal-inside-tooltip.md) | Disallow portal-rendering components (Dialog, Drawer, Menu, Popover, Portal, Modal) inside Tooltip wrapper components. React Portals preserve React-tree event bubbling, so a portal nested under a Tooltip leaves the tooltip orphaned over the modal. | β
| | | | |
|
|
194
|
-
| [no-redundant-annotation-assertion](docs/rules/no-redundant-annotation-assertion.md) | Disallow combining a type annotation with an identical type assertion on the same value. Keep a single source of truth to avoid redundant type declarations that can drift apart. | β
| |
|
|
195
|
-
| [no-redundant-boolean-callback-props](docs/rules/no-redundant-boolean-callback-props.md) | Disallow redundant boolean props that duplicate the semantic meaning of optional callback props, violating the Interface Segregation Principle. | β
| | | | |
|
|
196
|
-
| [no-redundant-param-types](docs/rules/no-redundant-param-types.md) | Disallow redundant parameter type annotations | β
| |
|
|
197
|
-
| [no-redundant-this-params](docs/rules/no-redundant-this-params.md) | Disallow passing class instance members (this.foo) into class instance methods; access the member from this inside the method instead. | β
| | | | |
|
|
198
|
-
| [no-redundant-usecallback-wrapper](docs/rules/no-redundant-usecallback-wrapper.md) | Prevent wrapping already memoized/stable callbacks from hooks/contexts in an extra useCallback() | β
| |
|
|
199
|
-
| [no-render-function-components](docs/rules/no-render-function-components.md) | Disallow declaring a local `render*` function that returns JSX and consuming it as a plain function (direct call or array-iteration callback); author it as a real component rendered with JSX instead | β
| | | | |
|
|
200
|
-
| [no-res-error-status-in-onrequest](docs/rules/no-res-error-status-in-onrequest.md) | Forbid sending 4xx/5xx Express responses inside onRequest handlers; throw structured HttpsError instances instead so the wrapper can format, log, and map errors consistently. | β
| | | | |
|
|
201
|
-
| [no-restricted-properties-fix](docs/rules/no-restricted-properties-fix.md) | Disallow certain properties on certain objects, with special handling for Object.keys() and Object.values() | | | | | |
|
|
202
|
-
| [no-satisfies-in-frontend-bundle](docs/rules/no-satisfies-in-frontend-bundle.md) | Disallow the `satisfies` operator in files that reach the frontend webpack bundle (Next.js 12 SWC cannot parse it) | β
| | | | |
|
|
203
|
-
| [no-separate-loading-state](docs/rules/no-separate-loading-state.md) | Disallow separate loading state variables that track the loading status of other state | β
| | | | |
|
|
204
|
-
| [no-single-dismiss-dialog-button](docs/rules/no-single-dismiss-dialog-button.md) | Disallow a single dialog button whose label is a dismiss action (Cancel, Close, Dismiss, Not now, Never mind). Use navigation.onClose for dismissal; the buttons array should only contain affirmative actions. | β
| | | | |
|
|
205
|
-
| [no-stablehash-react-nodes](docs/rules/no-stablehash-react-nodes.md) | Prevent passing ReactNodes or render-tree values to stableHash(), which deep-stringifies its argument and can freeze the browser. | β
| | | | |
|
|
206
|
-
| [no-stale-state-across-await](docs/rules/no-stale-state-across-await.md) | Prevent stale intermediate state by disallowing useState setter calls both before and after async boundaries (await, .then(), yield) within the same function | β
| | | | |
|
|
207
|
-
| [no-static-constants-in-dynamic-files](docs/rules/no-static-constants-in-dynamic-files.md) | Disallow exporting SCREAMING_SNAKE_CASE constants from .dynamic.ts/.dynamic.tsx files; move static constants to non-dynamic modules instead. | β
| | | | |
|
|
208
|
-
| [no-try-catch-already-exists-in-transaction](docs/rules/no-try-catch-already-exists-in-transaction.md) | Disallow catching ALREADY_EXISTS errors inside Firestore transaction callbacks | β
| | | | |
|
|
209
|
-
| [no-type-assertion-returns](docs/rules/no-type-assertion-returns.md) | Enforce typing variables before returning them, rather than using type assertions or explicit return types | β
| | | | |
|
|
210
|
-
| [no-undefined-null-passthrough](docs/rules/no-undefined-null-passthrough.md) | Avoid functions that return undefined or null when their single argument is undefined or null | β
| | | | |
|
|
211
|
-
| [no-unmemoized-memo-without-props](docs/rules/no-unmemoized-memo-without-props.md) | Prevent wrapping prop-less Unmemoized components in memo since memo provides no benefit without props and adds unnecessary indirection | β
| | | | |
|
|
212
|
-
| [no-unnecessary-destructuring](docs/rules/no-unnecessary-destructuring.md) | Avoid object patterns that only spread an existing object, since they clone the whole value without selecting properties | β
| |
|
|
213
|
-
| [no-unnecessary-destructuring-rename](docs/rules/no-unnecessary-destructuring-rename.md) | Disallow destructuring renames that are only used to assign back to the original property name | β
| |
|
|
214
|
-
| [no-unnecessary-verb-suffix](docs/rules/no-unnecessary-verb-suffix.md) | Prevent unnecessary verb suffixes in function and method names | β
| |
|
|
215
|
-
| [no-unpinned-dependencies](docs/rules/no-unpinned-dependencies.md) | Enforces pinned dependencies | β
| |
|
|
216
|
-
| [no-unsafe-firestore-spread](docs/rules/no-unsafe-firestore-spread.md) | Prevent unsafe object/array spreads in Firestore updates | β
| | | | |
|
|
217
|
-
| [no-unused-props](docs/rules/no-unused-props.md) | Detect unused props in React component type definitions | β
| | | | |
|
|
218
|
-
| [no-unused-usestate](docs/rules/no-unused-usestate.md) | Disallow unused useState hooks | β
| |
|
|
219
|
-
| [no-useless-fragment](docs/rules/no-useless-fragment.md) | Prevent unnecessary use of React fragments | β
| |
|
|
220
|
-
| [no-useless-usememo-primitives](docs/rules/no-useless-usememo-primitives.md) | Disallow useless useMemo with primitive values. | β
| |
|
|
221
|
-
| [no-usememo-for-pass-by-value](docs/rules/no-usememo-for-pass-by-value.md) | Disallow returning useMemo results from custom hooks when the memoized value is pass-by-value: primitives with value equality (string, number, boolean, null, undefined, bigint) or arrays/tuples composed exclusively of these primitives. Requires type information. | β
| |
|
|
222
|
-
| [no-uuidv4-base62-as-key](docs/rules/no-uuidv4-base62-as-key.md) | Disallow using uuidv4Base62() to generate keys for elements in a list or loop | β
| | | | |
|
|
223
|
-
| [omit-index-html](docs/rules/omit-index-html.md) | Disallow the use of "index.html" in URLs | β
| |
|
|
224
|
-
| [optimize-object-boolean-conditions](docs/rules/optimize-object-boolean-conditions.md) | Detects and suggests optimizations for boolean conditions formed over objects in React hook dependencies. Suggests extracting boolean conditions into separate variables to reduce unnecessary re-computations when objects change frequently but the boolean condition changes less frequently. | β
| | | | |
|
|
225
|
-
| [parallelize-async-operations](docs/rules/parallelize-async-operations.md) | Enforce the use of Promise.all() when multiple independent asynchronous operations are awaited sequentially | β
| |
|
|
226
|
-
| [parallelize-loop-awaits](docs/rules/parallelize-loop-awaits.md) | Disallow sequential await expressions inside loops when iterations could be parallelized with Promise.all(items.map(...)) | β
| | | | |
|
|
227
|
-
| [prefer-batch-operations](docs/rules/prefer-batch-operations.md) | Enforce using setAll() and overwriteAll() instead of multiple set() or overwrite() calls | β
| | | | |
|
|
228
|
-
| [prefer-block-comments-for-declarations](docs/rules/prefer-block-comments-for-declarations.md) | Enforce the use of block comments for declarations | β
| |
|
|
229
|
-
| [prefer-clone-deep](docs/rules/prefer-clone-deep.md) | Prefer using cloneDeep over nested spread copying | β
| |
|
|
230
|
-
| [prefer-destructuring-no-class](docs/rules/prefer-destructuring-no-class.md) | Enforce destructuring when accessing object properties, except for class instances | β
| |
|
|
231
|
-
| [prefer-docsetter-setall](docs/rules/prefer-docsetter-setall.md) | Enforce batching DocSetter and DocSetterTransaction writes by using setAll instead of set inside loops or array callbacks. | β
| | | | |
|
|
232
|
-
| [prefer-document-flattening](docs/rules/prefer-document-flattening.md) | Enforce using the shouldFlatten option when setting deeply nested objects in Firestore documents | | | |
|
|
233
|
-
| [prefer-field-paths-in-transforms](docs/rules/prefer-field-paths-in-transforms.md) | Flatten aggregation updates inside transformEach so diff-based deletes remove only the intended fields instead of wiping sibling data. | β
| | | | |
|
|
234
|
-
| [prefer-flat-transform-each-keys](docs/rules/prefer-flat-transform-each-keys.md) | Warn when transformEach in a propagation strategy returns nested object values instead of flat dot-notation keys. | β
| | | | |
|
|
235
|
-
| [prefer-fragment-component](docs/rules/prefer-fragment-component.md) | Require the Fragment named import instead of shorthand fragments or React.Fragment to keep fragments explicit and prop-friendly | |
|
|
236
|
-
| [prefer-fragment-shorthand](docs/rules/prefer-fragment-shorthand.md) | Prefer <> shorthand for <React.Fragment> | β
| |
|
|
237
|
-
| [prefer-getter-over-parameterless-method](docs/rules/prefer-getter-over-parameterless-method.md) | Enforce getter syntax for synchronous parameterless methods that return values, improving semantic clarity and avoiding accidental method invocation without parentheses. | β
| |
|
|
238
|
-
| [prefer-global-router-state-key](docs/rules/prefer-global-router-state-key.md) | Enforce using centralized router state key constants from queryKeys.ts for useRouterState key parameter | β
| |
|
|
239
|
-
| [prefer-map-over-conditional-dispatch](docs/rules/prefer-map-over-conditional-dispatch.md) | Prefer a Record<Discriminant, Value> lookup over switch/ternary/if-else dispatch on a literal-union discriminant where every branch returns or assigns a single value. | β
| |
|
|
240
|
-
| [prefer-next-dynamic](docs/rules/prefer-next-dynamic.md) | Prefer Next.js dynamic() over custom useDynamic() for component imports | β
| |
|
|
241
|
-
| [prefer-nullish-coalescing-boolean-props](docs/rules/prefer-nullish-coalescing-boolean-props.md) | Prefer nullish coalescing over logical OR, but allow logical OR in boolean contexts | β
| |
|
|
242
|
-
| [prefer-params-over-parent-id](docs/rules/prefer-params-over-parent-id.md) | Prefer event.params over ref.parent.id for type-safe Firebase trigger paths. | β
| |
|
|
243
|
-
| [prefer-settings-object](docs/rules/prefer-settings-object.md) | Enforce using a settings object for functions with multiple parameters | β
| | | | |
|
|
244
|
-
| [prefer-spread-over-reassembly](docs/rules/prefer-spread-over-reassembly.md) | Prefer spread syntax over destructure-then-reassemble when all destructured fields are forwarded identically to a single target | β
| |
|
|
245
|
-
| [prefer-sx-prop-over-system-props](docs/rules/prefer-sx-prop-over-system-props.md) | Enforce using the MUI `sx` prop instead of deprecated system props (e.g. `mt`, `display`, `flexDirection`) on MUI components. | β
| |
|
|
246
|
-
| [prefer-type-alias-over-typeof-constant](docs/rules/prefer-type-alias-over-typeof-constant.md) | Prefer named type aliases over `typeof` on same-file global constants; ensure types are declared before constants. | β
| | | | |
|
|
247
|
-
| [prefer-type-over-interface](docs/rules/prefer-type-over-interface.md) | Prefer using type alias over interface | β
| |
|
|
248
|
-
| [prefer-union-from-const-array](docs/rules/prefer-union-from-const-array.md) | Derive string-literal union types from an `as const` array instead of declaring the union inline, so the runtime value set and the type share a single source of truth | β
| |
|
|
249
|
-
| [prefer-url-tostring-over-tojson](docs/rules/prefer-url-tostring-over-tojson.md) | Enforce the use of toString() over toJSON() on URL objects. | β
| |
|
|
250
|
-
| [prefer-use-base62-id](docs/rules/prefer-use-base62-id.md) | Prefer `useBase62Id()` over `uuidv4Base62()` inside useState/useRef/useMemo for stable component IDs to avoid SSR hydration mismatches | β
| | | | |
|
|
251
|
-
| [prefer-use-deep-compare-memo](docs/rules/prefer-use-deep-compare-memo.md) | Enforce using useDeepCompareMemo when dependency array contains non-primitive values (objects, arrays) that are not already memoized. This prevents unnecessary re-renders due to reference changes. | β
| |
|
|
252
|
-
| [prefer-use-theme](docs/rules/prefer-use-theme.md) | Enforce reading MUI theme values via useTheme() or the sx theme callback instead of importing theme constants directly from src/styles/* modules. | β
| | | | |
|
|
253
|
-
| [prefer-usecallback-over-usememo-for-functions](docs/rules/prefer-usecallback-over-usememo-for-functions.md) | Enforce using useCallback instead of useMemo for memoizing functions | β
| |
|
|
254
|
-
| [prefer-usememo-over-useeffect-usestate](docs/rules/prefer-usememo-over-useeffect-usestate.md) | Prefer useMemo over useEffect + useState for pure computations to avoid extra render cycles and stale derived state. | β
| | | | |
|
|
255
|
-
| [prefer-utility-function-over-private-static](docs/rules/prefer-utility-function-over-private-static.md) | Enforce abstraction of private static methods into utility functions | β
| | | | |
|
|
256
|
-
| [prefer-utility-function-own-file](docs/rules/prefer-utility-function-own-file.md) | Enforce that sizable utility functions live in their own file rather than being co-located inside an entry-point or consumer file | β
| | | | |
|
|
257
|
-
| [prevent-children-clobber](docs/rules/prevent-children-clobber.md) | Prevent JSX spreads from silently discarding props.children | β
| | | | |
|
|
258
|
-
| [react-memoize-literals](docs/rules/react-memoize-literals.md) | Detect object, array, and function literals created in React components or hooks that create new references every render. Prefer memoized values (useMemo/useCallback) or module-level constants to keep referential stability. | β
| | |
|
|
259
|
-
| [react-usememo-should-be-component](docs/rules/react-usememo-should-be-component.md) | Enforce that useMemo hooks explicitly returning JSX should be abstracted into separate React components | β
| | | | |
|
|
260
|
-
| [require-dynamic-firebase-imports](docs/rules/require-dynamic-firebase-imports.md) | Enforce dynamic imports for Firebase dependencies | β
| |
|
|
261
|
-
| [require-hooks-default-params](docs/rules/require-hooks-default-params.md) | Enforce React hooks with optional parameters to default to an empty object | β
| |
|
|
262
|
-
| [require-https-error](docs/rules/require-https-error.md) | Enforce using proprietary HttpsError instead of throw new Error or firebase-admin HttpsError in functions/src | β
| | | | |
|
|
263
|
-
| [require-https-error-cause](docs/rules/require-https-error-cause.md) | Ensure HttpsError calls inside catch blocks pass the caught error as the fourth "cause" argument to preserve stack traces for monitoring. | β
| | | | |
|
|
264
|
-
| [require-image-optimized](docs/rules/require-image-optimized.md) | Enforce using ImageOptimized component instead of next/image or img tags | β
| |
|
|
265
|
-
| [require-memo](docs/rules/require-memo.md) | React components must be memoized | β
| |
|
|
266
|
-
| [require-memoize-jsx-returners](docs/rules/require-memoize-jsx-returners.md) | Require @Memoize() decorator on instance members that return JSX or JSX factories | β
| |
|
|
267
|
-
| [require-migration-script-metadata](docs/rules/require-migration-script-metadata.md) | Enforce JSDoc migration metadata in callable scripts | β
| | | | |
|
|
268
|
-
| [require-props-composition](docs/rules/require-props-composition.md) | Require React component Props types to compose (via Pick/Omit) with the props types of non-leaf child components rendered in JSX | β
| | | | |
|
|
269
|
-
| [require-server-timestamp-for-firestore-dates](docs/rules/require-server-timestamp-for-firestore-dates.md) | Enforce serverTimestamp() instead of new Date() for Firestore timestamp fields | β
| | | | |
|
|
270
|
-
| [semantic-function-prefixes](docs/rules/semantic-function-prefixes.md) | Require semantic function prefixes instead of generic verbs so callers know whether a function fetches data, transforms input, or mutates state | β
| | | | |
|
|
271
|
-
| [sync-onwrite-name-func](docs/rules/sync-onwrite-name-func.md) | Ensure that the name field matches the func field in onWrite handlers | β
| |
|
|
272
|
-
| [test-file-location-enforcement](docs/rules/test-file-location-enforcement.md) | Enforce colocating *.test.ts or *.test.tsx files with the code they cover. | β
| | | | |
|
|
273
|
-
| [use-custom-link](docs/rules/use-custom-link.md) | Enforce using src/components/Link instead of next/link | β
| |
|
|
274
|
-
| [use-custom-memo](docs/rules/use-custom-memo.md) | Enforce using src/util/memo instead of React memo | β
| |
|
|
275
|
-
| [use-custom-router](docs/rules/use-custom-router.md) | Enforce using src/hooks/routing/useRouter instead of next/router | β
| |
|
|
276
|
-
| [use-latest-callback](docs/rules/use-latest-callback.md) | Enforce using useLatestCallback from use-latest-callback instead of React useCallback | β
| |
|
|
277
|
-
| [vertically-group-related-functions](docs/rules/vertically-group-related-functions.md) | Keep top-level functions grouped vertically so callers, exports, and helpers read top-down. | β
| |
|
|
278
|
-
| [warn-https-error-message-user-friendly](docs/rules/warn-https-error-message-user-friendly.md) | Warn when messageUserFriendly is used in HttpsError or toHttpsError to ensure it is truly a user-caused error. | β
| | | | |
|
|
82
|
+
| NameΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β | Description | πΌ | π« | π§ | π‘ | π |
|
|
83
|
+
| :----------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :- | :- | :- | :- | :- |
|
|
84
|
+
| [array-methods-this-context](docs/rules/array-methods-this-context.md) | Prevent misuse of Array methods in OOP | β
| | | | |
|
|
85
|
+
| [avoid-utils-directory](docs/rules/avoid-utils-directory.md) | Enforce using util/ instead of utils/ directory | β
| | | | |
|
|
86
|
+
| [class-methods-read-top-to-bottom](docs/rules/class-methods-read-top-to-bottom.md) | Enforces a top-to-bottom class layout so callers lead into the helpers they rely on. | β
| | π§ | | |
|
|
87
|
+
| [consistent-callback-naming](docs/rules/consistent-callback-naming.md) | Enforce consistent naming conventions for callback props and functions | β
| | π§ | | |
|
|
88
|
+
| [dynamic-https-errors](docs/rules/dynamic-https-errors.md) | Keep HttpsError messages static and move request-specific details to the third argument so error identifiers remain stable and debugging context is preserved. | β
| | | | |
|
|
89
|
+
| [enforce-assert-safe-object-key](docs/rules/enforce-assert-safe-object-key.md) | Enforce the use of assertSafe(id) when accessing object properties with computed keys that involve string interpolation or explicit string conversion. | β
| | π§ | | |
|
|
90
|
+
| [enforce-assert-throws](docs/rules/enforce-assert-throws.md) | Enforce that functions with an assert prefix must throw an error or call process.exit(1), and functions that call assert-prefixed methods should themselves be assert-prefixed | β
| | | | |
|
|
91
|
+
| [enforce-boolean-naming-prefixes](docs/rules/enforce-boolean-naming-prefixes.md) | Enforce consistent naming conventions for boolean values by requiring approved prefixes | β
| | | | |
|
|
92
|
+
| [enforce-callable-types](docs/rules/enforce-callable-types.md) | Enforce Props and Response type exports in callable functions | β
| | | | |
|
|
93
|
+
| [enforce-callback-memo](docs/rules/enforce-callback-memo.md) | Enforce useCallback for inline functions and useMemo for objects/arrays containing functions in JSX props to prevent unnecessary re-renders. This improves React component performance by ensuring stable function references across renders and memoizing complex objects. | β
| | | | |
|
|
94
|
+
| [enforce-centralized-mock-firestore](docs/rules/enforce-centralized-mock-firestore.md) | Enforce usage of centralized mockFirestore from predefined location | β
| | π§ | | |
|
|
95
|
+
| [enforce-cloud-function-id-length](docs/rules/enforce-cloud-function-id-length.md) | Ensures .f.ts file paths generate Firebase Cloud Function IDs within the 62-character limit | β
| | | | |
|
|
96
|
+
| [enforce-console-error](docs/rules/enforce-console-error.md) | Enforce proper logging for useAlertDialog based on severity. When severity is "error", console.error must be included. When severity is "warning", console.warn must be included. This ensures all user-facing errors and warnings are properly logged to observability systems. | β
| | | | |
|
|
97
|
+
| [enforce-css-media-queries](docs/rules/enforce-css-media-queries.md) | Enforce CSS media queries over JS breakpoints | β
| | | | |
|
|
98
|
+
| [enforce-date-ttime](docs/rules/enforce-date-ttime.md) | Enforce that any generic type parameter named TTime is explicitly set to Date in frontend code | β
| | π§ | | |
|
|
99
|
+
| [enforce-dynamic-file-naming](docs/rules/enforce-dynamic-file-naming.md) | Enforce .dynamic.ts(x) file naming when @blumintinc/blumint/enforce-dynamic-imports or @blumintinc/blumint/require-dynamic-firebase-imports rule is disabled | | | | | |
|
|
100
|
+
| [enforce-dynamic-firebase-imports](docs/rules/enforce-dynamic-firebase-imports.md) | Require firebaseCloud modules to be loaded via dynamic import so Firebase code stays out of the initial bundle and only loads when needed. | β
| | π§ | π‘ | |
|
|
101
|
+
| [enforce-dynamic-imports](docs/rules/enforce-dynamic-imports.md) | Enforce dynamic imports for external libraries by default to optimize bundle size, unless explicitly ignored | β
| | | | |
|
|
102
|
+
| [enforce-early-destructuring](docs/rules/enforce-early-destructuring.md) | Hoist object destructuring out of React hooks so dependency arrays track the fields in use instead of the entire object. | β
| | π§ | | |
|
|
103
|
+
| [enforce-empty-object-check](docs/rules/enforce-empty-object-check.md) | Ensure object existence checks also guard against empty objects so that empty payloads are treated like missing data. | β
| | π§ | | |
|
|
104
|
+
| [enforce-exported-function-types](docs/rules/enforce-exported-function-types.md) | Enforce exporting types for function props and return values | β
| | | | |
|
|
105
|
+
| [enforce-f-extension-for-entry-points](docs/rules/enforce-f-extension-for-entry-points.md) | Enforce .f.ts extension for entry points | β
| | | | |
|
|
106
|
+
| [enforce-fieldpath-syntax-in-docsetter](docs/rules/enforce-fieldpath-syntax-in-docsetter.md) | Enforce the use of Firestore FieldPath syntax when passing documentData into DocSetter. Instead of using nested object syntax, developers should use dot notation for deeply nested fields. | β
| | π§ | | |
|
|
107
|
+
| [enforce-firestore-doc-ref-generic](docs/rules/enforce-firestore-doc-ref-generic.md) | Enforce generic argument for Firestore DocumentReference, CollectionReference and CollectionGroup | β
| | | | π |
|
|
108
|
+
| [enforce-firestore-facade](docs/rules/enforce-firestore-facade.md) | Enforce usage of Firestore facades instead of direct Firestore methods | β
| | | | |
|
|
109
|
+
| [enforce-firestore-path-utils](docs/rules/enforce-firestore-path-utils.md) | Enforce usage of utility functions for Firestore paths to ensure type safety, maintainability, and consistent path construction. This prevents errors from manual string concatenation and makes path changes easier to manage. | β
| | | | |
|
|
110
|
+
| [enforce-firestore-rules-get-access](docs/rules/enforce-firestore-rules-get-access.md) | Ensure Firestore security rules use .get() with a default value instead of direct field access comparisons (e.g., resource.data.fieldX.fieldY != null). | β
| | π§ | | |
|
|
111
|
+
| [enforce-firestore-set-merge](docs/rules/enforce-firestore-set-merge.md) | Enforce using set() with { merge: true } instead of update() for Firestore operations to ensure consistent behavior. The update() method fails if the document does not exist, while set() with { merge: true } creates the document if needed and safely merges fields, making it more reliable and predictable. | β
| | π§ | | |
|
|
112
|
+
| [enforce-global-constants](docs/rules/enforce-global-constants.md) | Enforce global static constants for React components/hooks | β
| | π§ | | |
|
|
113
|
+
| [enforce-id-capitalization](docs/rules/enforce-id-capitalization.md) | Enforce the use of "ID" instead of "id" in user-facing text | β
| | π§ | | |
|
|
114
|
+
| [enforce-identifiable-firestore-type](docs/rules/enforce-identifiable-firestore-type.md) | Enforce that Firestore type definitions extend Identifiable and match their folder name | β
| | | | |
|
|
115
|
+
| [enforce-is-prefix-validators](docs/rules/enforce-is-prefix-validators.md) | Enforce the `is` (or other allowed predicate) prefix for exported validators in **/validators/**/*.ts files | β
| | | | |
|
|
116
|
+
| [enforce-m3-sentence-case](docs/rules/enforce-m3-sentence-case.md) | Enforce Material Design 3 sentence-case capitalisation for user-facing text β flag Title Case and ALL CAPS strings in JSX text and configured string props. | β
| | | π‘ | |
|
|
117
|
+
| [enforce-memoize-async](docs/rules/enforce-memoize-async.md) | Enforce @Memoize() decorator on async methods with 0-1 parameters to cache results and prevent redundant API calls or expensive computations. Without memoization, repeated calls trigger redundant requests or expensive computations, increasing latency. @Memoize() caches results by parameter, ensuring subsequent calls with identical inputs return immediately. | β
| | π§ | | |
|
|
118
|
+
| [enforce-memoize-getters](docs/rules/enforce-memoize-getters.md) | Enforce @Memoize() decorator on private class getters to avoid re-instantiation and preserve state across accesses. | β
| | π§ | | |
|
|
119
|
+
| [enforce-microdiff](docs/rules/enforce-microdiff.md) | Enforce using microdiff for object and array comparison operations | β
| | π§ | | |
|
|
120
|
+
| [enforce-mock-firestore](docs/rules/enforce-mock-firestore.md) | Enforce using the standardized mockFirestore utility instead of manual Firestore mocking or third-party mocks. This ensures consistent test behavior across the codebase, reduces boilerplate, and provides type-safe mocking of Firestore operations. | β
| | | | |
|
|
121
|
+
| [enforce-mui-rounded-icons](docs/rules/enforce-mui-rounded-icons.md) | Enforce the use of -Rounded variant for MUI icons | β
| | π§ | | |
|
|
122
|
+
| [enforce-object-literal-as-const](docs/rules/enforce-object-literal-as-const.md) | Enforce that object literals returned from functions should be marked with `as const` to ensure type safety and immutability. | β
| | π§ | | |
|
|
123
|
+
| [enforce-positive-naming](docs/rules/enforce-positive-naming.md) | Enforce positive naming for boolean variables and avoid negations | β
| | | | |
|
|
124
|
+
| [enforce-props-argument-name](docs/rules/enforce-props-argument-name.md) | Authoritative rule: parameters with types ending in "Props" should be named "props" (or prefixed variants when multiple Props params exist) | β
| | π§ | | |
|
|
125
|
+
| [enforce-props-naming-consistency](docs/rules/enforce-props-naming-consistency.md) | Prefer naming single "Props"-typed parameters as "props"; enforcement defers to enforce-props-argument-name for multi-Props cases | β
| | π§ | | |
|
|
126
|
+
| [enforce-querykey-ts](docs/rules/enforce-querykey-ts.md) | Enforce using centralized router state key constants from queryKeys.ts for useRouterState key parameter | β
| | π§ | | |
|
|
127
|
+
| [enforce-react-type-naming](docs/rules/enforce-react-type-naming.md) | Enforce naming conventions for React types | β
| | π§ | | |
|
|
128
|
+
| [enforce-realtimedb-path-utils](docs/rules/enforce-realtimedb-path-utils.md) | Enforce usage of utility functions for Realtime Database paths | β
| | | | |
|
|
129
|
+
| [enforce-render-hits-memoization](docs/rules/enforce-render-hits-memoization.md) | Enforce proper memoization and usage of useRenderHits and renderHits | β
| | | | |
|
|
130
|
+
| [enforce-safe-stringify](docs/rules/enforce-safe-stringify.md) | Enforce using safe-stable-stringify instead of JSON.stringify to handle circular references and ensure deterministic output. JSON.stringify can throw errors on circular references and produce inconsistent output for objects with the same properties in different orders. safe-stable-stringify handles these cases safely. | β
| | | π‘ | |
|
|
131
|
+
| [enforce-serializable-params](docs/rules/enforce-serializable-params.md) | Enforce serializable parameters for Firebase callable/HTTPS functions. | β
| | | | |
|
|
132
|
+
| [enforce-single-exported-unit-per-file](docs/rules/enforce-single-exported-unit-per-file.md) | Enforce that a .tsx/.jsx file exports at most one React component and any file exports at most one class | β
| | | | |
|
|
133
|
+
| [enforce-singular-type-names](docs/rules/enforce-singular-type-names.md) | Enforce TypeScript type names to be singular | β
| | | | |
|
|
134
|
+
| [enforce-snapshot-state-narrowing](docs/rules/enforce-snapshot-state-narrowing.md) | Enforce correct narrowing of FirestoreSnapshotState<T> variables. Falsy/truthy checks are semantic bugs because all string states are truthy; raw typeof narrowing to data bypasses the isSnapshotReady abstraction. | β
| | | π‘ | |
|
|
135
|
+
| [enforce-stable-hash-spread-props](docs/rules/enforce-stable-hash-spread-props.md) | Require stableHash wrapping when spread props rest objects are used in React hook dependency arrays to avoid re-renders triggered by new object references on every render. | β
| | π§ | | |
|
|
136
|
+
| [enforce-storage-context](docs/rules/enforce-storage-context.md) | Require storage access to go through the LocalStorage and SessionStorage context providers instead of direct browser APIs | β
| | | | |
|
|
137
|
+
| [enforce-timestamp-now](docs/rules/enforce-timestamp-now.md) | Enforce the use of Timestamp.now() for getting the current timestamp in backend code. This rule prevents using alternatives like Timestamp.fromDate(new Date()) or other date creation patterns that could lead to inconsistency. | β
| | π§ | | |
|
|
138
|
+
| [enforce-transform-memoization](docs/rules/enforce-transform-memoization.md) | Enforce memoization of transformValue and transformOnChange in adaptValue | β
| | | | |
|
|
139
|
+
| [enforce-types-directory-placement](docs/rules/enforce-types-directory-placement.md) | Enforce that type-only files (containing only type/interface/enum declarations) live under the canonical types directory | β
| | | | |
|
|
140
|
+
| [enforce-typescript-markdown-code-blocks](docs/rules/enforce-typescript-markdown-code-blocks.md) | Ensure Markdown fenced code blocks without a language specifier default to typescript for consistent highlighting. | β
| | π§ | | |
|
|
141
|
+
| [enforce-unique-cursor-headers](docs/rules/enforce-unique-cursor-headers.md) | Ensure files have exactly one cursor header containing required tags (e.g., @fileoverview) before any code | β
| | π§ | | |
|
|
142
|
+
| [enforce-verb-noun-naming](docs/rules/enforce-verb-noun-naming.md) | Enforce verb phrases for functions and methods | β
| | | | |
|
|
143
|
+
| [ensure-pointer-events-none](docs/rules/ensure-pointer-events-none.md) | Ensure pointer-events: none is added to non-interactive pseudo-elements | β
| | π§ | | |
|
|
144
|
+
| [export-if-in-doubt](docs/rules/export-if-in-doubt.md) | All top-level variable declarations, type definitions, and functions should be exported | β
| | | | |
|
|
145
|
+
| [extract-global-constants](docs/rules/extract-global-constants.md) | Extract static constants and functions to the global scope when possible, and enforce type narrowing with as const for numeric literals in loops | β
| | | | |
|
|
146
|
+
| [fast-deep-equal-over-microdiff](docs/rules/fast-deep-equal-over-microdiff.md) | Enforce using fast-deep-equal for equality checks instead of microdiff | β
| | π§ | | |
|
|
147
|
+
| [firestore-transaction-reads-before-writes](docs/rules/firestore-transaction-reads-before-writes.md) | Enforce that all Firestore transaction read operations are performed before any write operations | β
| | | | |
|
|
148
|
+
| [flatten-push-calls](docs/rules/flatten-push-calls.md) | Consolidate consecutive push calls on the same array into a single push with multiple arguments. | β
| | π§ | | |
|
|
149
|
+
| [generic-starts-with-t](docs/rules/generic-starts-with-t.md) | Enforce TypeScript generic type parameters to start with T so they stand out from runtime values. | β
| | | | |
|
|
150
|
+
| [global-const-style](docs/rules/global-const-style.md) | Enforce UPPER_SNAKE_CASE and as const for global static constants | β
| | π§ | | |
|
|
151
|
+
| [jsdoc-above-field](docs/rules/jsdoc-above-field.md) | Require JSDoc blocks to sit above fields instead of trailing inline so IDE hovers surface the documentation. | β
| | π§ | | |
|
|
152
|
+
| [key-only-outermost-element](docs/rules/key-only-outermost-element.md) | Enforce that only the outermost element in list rendering has a key prop | β
| | π§ | | |
|
|
153
|
+
| [logical-top-to-bottom-grouping](docs/rules/logical-top-to-bottom-grouping.md) | Enforce logical top-to-bottom grouping of related statements | β
| | π§ | | |
|
|
154
|
+
| [memo-compare-deeply-complex-props](docs/rules/memo-compare-deeply-complex-props.md) | Suggest compareDeeply for memoized components that receive object/array props to avoid shallow comparison re-renders. | β
| | π§ | | π |
|
|
155
|
+
| [memo-nested-react-components](docs/rules/memo-nested-react-components.md) | Disallow React components defined in render bodies, hooks, or passed as props | β
| | | | |
|
|
156
|
+
| [memoize-root-level-hocs](docs/rules/memoize-root-level-hocs.md) | Prevent creating Higher-Order Components at the root level of React components/hooks without wrapping them in useMemo to keep wrapped component identities stable across renders. | β
| | | | |
|
|
157
|
+
| [no-always-true-false-conditions](docs/rules/no-always-true-false-conditions.md) | Detect conditions that are always truthy or always falsy | β
| | | | |
|
|
158
|
+
| [no-array-length-in-deps](docs/rules/no-array-length-in-deps.md) | Detects array.length entries in React hook dependency arrays because length ignores content changes; auto-fixes by memoizing stableHash(array) with useMemo and depending on the hash instead. | β
| | π§ | | |
|
|
159
|
+
| [no-async-array-filter](docs/rules/no-async-array-filter.md) | Disallow async callbacks in Array.filter(). Async predicates return Promises that are always truthy to the filter, so no element is ever removed. Resolve async checks first (Promise.all + map) or use a synchronous predicate to decide which items to keep. | β
| | | | |
|
|
160
|
+
| [no-async-foreach](docs/rules/no-async-foreach.md) | Disallow async callbacks to Array.forEach | β
| | | | |
|
|
161
|
+
| [no-circular-references](docs/rules/no-circular-references.md) | Disallow circular references in objects | β
| | | | |
|
|
162
|
+
| [no-class-instance-destructuring](docs/rules/no-class-instance-destructuring.md) | Disallow destructuring of class instances to prevent loss of `this` context | β
| | π§ | | |
|
|
163
|
+
| [no-complex-cloud-params](docs/rules/no-complex-cloud-params.md) | Disallow passing complex objects to cloud functions | β
| | | | |
|
|
164
|
+
| [no-compositing-layer-props](docs/rules/no-compositing-layer-props.md) | Discourage CSS properties that force GPU compositing layers (e.g., transform, filter, will-change). Extra layers consume GPU memory and split rendering work, which slows scrolling and animation when sprinkled across a page. The rule inspects inline style objects and MUI sx props so layer promotion stays intentional rather than incidental. | β
| | | | |
|
|
165
|
+
| [no-conditional-literals-in-jsx](docs/rules/no-conditional-literals-in-jsx.md) | Disallow conditional string literals beside other JSX text to avoid fragmented text nodes, translation issues, and hydration mismatches. | β
| | | | |
|
|
166
|
+
| [no-console-error](docs/rules/no-console-error.md) | Disallow console.error so errors flow through structured handling (HttpsError/useErrorAlert on frontend, structured loggers on backend). | β
| | | | |
|
|
167
|
+
| [no-curly-brackets-around-commented-properties](docs/rules/no-curly-brackets-around-commented-properties.md) | Disallow curly-brace blocks that only wrap commented-out members inside type declarations | β
| | π§ | | |
|
|
168
|
+
| [no-direct-function-state](docs/rules/no-direct-function-state.md) | Prevent passing a function directly to a useState setter β React will invoke it as a functional updater instead of storing it. Wrap in a thunk: setState(() => fn). | β
| | π§ | | |
|
|
169
|
+
| [no-empty-dependency-use-callbacks](docs/rules/no-empty-dependency-use-callbacks.md) | Discourage useCallback([]) or useLatestCallback around static functions. Static callbacks do not need hook machineryβextract them to module-level utilities for clarity and to avoid unnecessary hook overhead. | β
| | π§ | | |
|
|
170
|
+
| [no-entire-object-hook-deps](docs/rules/no-entire-object-hook-deps.md) | Avoid using entire objects in React hook dependency arrays. | β
| | π§ | | π |
|
|
171
|
+
| [no-excessive-parent-chain](docs/rules/no-excessive-parent-chain.md) | Discourage excessive use of the ref.parent property chain in Firestore and RealtimeDB change handlers | | | | π‘ | |
|
|
172
|
+
| [no-explicit-return-type](docs/rules/no-explicit-return-type.md) | Disallow explicit return type annotations on functions when TypeScript can infer them. This reduces code verbosity and maintenance burden while leveraging TypeScript's powerful type inference. Exceptions are made for type guard functions (using the `is` keyword), recursive functions, overloaded functions, interface methods, and abstract methods where explicit types improve clarity. | β
| | π§ | | |
|
|
173
|
+
| [no-fill-template-mutation](docs/rules/no-fill-template-mutation.md) | Disallow mutating the return value of fillTemplate() via string concatenation, template literals, or string method calls. The filled Algolia filter must be used verbatim so matchesTemplate() can regex-match it; post-fill modification silently breaks realtime hash parity. | β
| | | | |
|
|
174
|
+
| [no-filter-without-return](docs/rules/no-filter-without-return.md) | Disallow Array.filter callbacks without an explicit return (if part of a block statement) | β
| | | | |
|
|
175
|
+
| [no-firestore-jest-mock](docs/rules/no-firestore-jest-mock.md) | Prevent importing firestore-jest-mock in test files | β
| | π§ | | |
|
|
176
|
+
| [no-firestore-object-arrays](docs/rules/no-firestore-object-arrays.md) | Disallow arrays of object types in Firestore models. Prefer Record maps keyed by id with an index field, or subcollections/arrays of IDs. | β
| | | | |
|
|
177
|
+
| [no-handler-suffix](docs/rules/no-handler-suffix.md) | Disallow the generic "handler" suffix in callback names so names explain the action they perform | β
| | | | |
|
|
178
|
+
| [no-harness-coupled-disables](docs/rules/no-harness-coupled-disables.md) | Disallow eslint-disable justifications that reference the agent development harness (worktree, cwd, stop-hook, claude) instead of the codeβs own semantics. | β
| | | | |
|
|
179
|
+
| [no-hungarian](docs/rules/no-hungarian.md) | Disallow Hungarian notation in locally declared variables, types, and classes | β
| | | | |
|
|
180
|
+
| [no-inline-component-prop](docs/rules/no-inline-component-prop.md) | Prevent inline function components defined in render from being passed to component-type props like CatalogWrapper to avoid remounts and UI flashes. | β
| | | | |
|
|
181
|
+
| [no-jsx-in-hooks](docs/rules/no-jsx-in-hooks.md) | Prevent hooks from returning JSX | β
| | | | |
|
|
182
|
+
| [no-jsx-whitespace-literal](docs/rules/no-jsx-whitespace-literal.md) | Disallow the use of {" "} elements in JSX code | β
| | | | |
|
|
183
|
+
| [no-margin-properties](docs/rules/no-margin-properties.md) | Prevent margin properties (margin, marginLeft, marginRight, marginTop, marginBottom, mx, my, etc.) in MUI styling because margins fight container-controlled spacing, double gutters, and misaligned breakpoints; keep spacing centralized with padding, gap, or spacing props instead. | β
| | | | |
|
|
184
|
+
| [no-memoize-on-static](docs/rules/no-memoize-on-static.md) | Prevent using @Memoize() decorator on static methods | β
| | | | |
|
|
185
|
+
| [no-misleading-boolean-prefixes](docs/rules/no-misleading-boolean-prefixes.md) | Reserve boolean-style prefixes (is/has/should) for functions that actually return boolean values to avoid misleading call sites. | β
| | | | |
|
|
186
|
+
| [no-misused-switch-case](docs/rules/no-misused-switch-case.md) | Prevent misuse of logical OR (\|\|) in switch case statements, which can lead to confusing and error-prone code. Instead of using OR operators in case expressions, use multiple case statements in sequence to handle multiple values. This improves code readability and follows the standard switch-case pattern. | β
| | | | |
|
|
187
|
+
| [no-mixed-firestore-transactions](docs/rules/no-mixed-firestore-transactions.md) | Prevent mixing transactional and non-transactional Firestore operations within a transaction | β
| | | | |
|
|
188
|
+
| [no-mock-firebase-admin](docs/rules/no-mock-firebase-admin.md) | Prevent direct mocking of firebaseAdmin; use shared test helpers instead | β
| | | | |
|
|
189
|
+
| [no-object-values-on-strings](docs/rules/no-object-values-on-strings.md) | Disallow Object.values() on strings as it treats strings as arrays of characters, which is likely unintended behavior. | β
| | | | |
|
|
190
|
+
| [no-overridable-method-calls-in-constructor](docs/rules/no-overridable-method-calls-in-constructor.md) | Disallow calling overridable methods in constructors to prevent unexpected behavior | β
| | | | |
|
|
191
|
+
| [no-passthrough-getters](docs/rules/no-passthrough-getters.md) | Avoid getter methods that only re-expose nested properties on constructor-injected objects without adding behavior | β
| | | | |
|
|
192
|
+
| [no-portal-inside-tooltip](docs/rules/no-portal-inside-tooltip.md) | Disallow portal-rendering components (Dialog, Drawer, Menu, Popover, Portal, Modal) inside Tooltip wrapper components. React Portals preserve React-tree event bubbling, so a portal nested under a Tooltip leaves the tooltip orphaned over the modal. | β
| | | | |
|
|
193
|
+
| [no-redundant-annotation-assertion](docs/rules/no-redundant-annotation-assertion.md) | Disallow combining a type annotation with an identical type assertion on the same value. Keep a single source of truth to avoid redundant type declarations that can drift apart. | β
| | π§ | | π |
|
|
194
|
+
| [no-redundant-boolean-callback-props](docs/rules/no-redundant-boolean-callback-props.md) | Disallow redundant boolean props that duplicate the semantic meaning of optional callback props, violating the Interface Segregation Principle. | β
| | | | |
|
|
195
|
+
| [no-redundant-param-types](docs/rules/no-redundant-param-types.md) | Disallow redundant parameter type annotations | β
| | π§ | | |
|
|
196
|
+
| [no-redundant-this-params](docs/rules/no-redundant-this-params.md) | Disallow passing class instance members (this.foo) into class instance methods; access the member from this inside the method instead. | β
| | | | |
|
|
197
|
+
| [no-redundant-usecallback-wrapper](docs/rules/no-redundant-usecallback-wrapper.md) | Prevent wrapping already memoized/stable callbacks from hooks/contexts in an extra useCallback() | β
| | π§ | | |
|
|
198
|
+
| [no-render-function-components](docs/rules/no-render-function-components.md) | Disallow declaring a local `render*` function that returns JSX and consuming it as a plain function (direct call or array-iteration callback); author it as a real component rendered with JSX instead | β
| | | | |
|
|
199
|
+
| [no-res-error-status-in-onrequest](docs/rules/no-res-error-status-in-onrequest.md) | Forbid sending 4xx/5xx Express responses inside onRequest handlers; throw structured HttpsError instances instead so the wrapper can format, log, and map errors consistently. | β
| | | | |
|
|
200
|
+
| [no-restricted-properties-fix](docs/rules/no-restricted-properties-fix.md) | Disallow certain properties on certain objects, with special handling for Object.keys() and Object.values() | | | | | |
|
|
201
|
+
| [no-satisfies-in-frontend-bundle](docs/rules/no-satisfies-in-frontend-bundle.md) | Disallow the `satisfies` operator in files that reach the frontend webpack bundle (Next.js 12 SWC cannot parse it) | β
| | | | |
|
|
202
|
+
| [no-separate-loading-state](docs/rules/no-separate-loading-state.md) | Disallow separate loading state variables that track the loading status of other state | β
| | | | |
|
|
203
|
+
| [no-single-dismiss-dialog-button](docs/rules/no-single-dismiss-dialog-button.md) | Disallow a single dialog button whose label is a dismiss action (Cancel, Close, Dismiss, Not now, Never mind). Use navigation.onClose for dismissal; the buttons array should only contain affirmative actions. | β
| | | | |
|
|
204
|
+
| [no-stablehash-react-nodes](docs/rules/no-stablehash-react-nodes.md) | Prevent passing ReactNodes or render-tree values to stableHash(), which deep-stringifies its argument and can freeze the browser. | β
| | | | |
|
|
205
|
+
| [no-stale-state-across-await](docs/rules/no-stale-state-across-await.md) | Prevent stale intermediate state by disallowing useState setter calls both before and after async boundaries (await, .then(), yield) within the same function | β
| | | | |
|
|
206
|
+
| [no-static-constants-in-dynamic-files](docs/rules/no-static-constants-in-dynamic-files.md) | Disallow exporting SCREAMING_SNAKE_CASE constants from .dynamic.ts/.dynamic.tsx files; move static constants to non-dynamic modules instead. | β
| | | | |
|
|
207
|
+
| [no-try-catch-already-exists-in-transaction](docs/rules/no-try-catch-already-exists-in-transaction.md) | Disallow catching ALREADY_EXISTS errors inside Firestore transaction callbacks | β
| | | | |
|
|
208
|
+
| [no-type-assertion-returns](docs/rules/no-type-assertion-returns.md) | Enforce typing variables before returning them, rather than using type assertions or explicit return types | β
| | | | |
|
|
209
|
+
| [no-undefined-null-passthrough](docs/rules/no-undefined-null-passthrough.md) | Avoid functions that return undefined or null when their single argument is undefined or null | β
| | | | |
|
|
210
|
+
| [no-unmemoized-memo-without-props](docs/rules/no-unmemoized-memo-without-props.md) | Prevent wrapping prop-less Unmemoized components in memo since memo provides no benefit without props and adds unnecessary indirection | β
| | | | |
|
|
211
|
+
| [no-unnecessary-destructuring](docs/rules/no-unnecessary-destructuring.md) | Avoid object patterns that only spread an existing object, since they clone the whole value without selecting properties | β
| | π§ | | |
|
|
212
|
+
| [no-unnecessary-destructuring-rename](docs/rules/no-unnecessary-destructuring-rename.md) | Disallow destructuring renames that are only used to assign back to the original property name | β
| | π§ | | |
|
|
213
|
+
| [no-unnecessary-verb-suffix](docs/rules/no-unnecessary-verb-suffix.md) | Prevent unnecessary verb suffixes in function and method names | β
| | π§ | | |
|
|
214
|
+
| [no-unpinned-dependencies](docs/rules/no-unpinned-dependencies.md) | Enforces pinned dependencies | β
| | π§ | | |
|
|
215
|
+
| [no-unsafe-firestore-spread](docs/rules/no-unsafe-firestore-spread.md) | Prevent unsafe object/array spreads in Firestore updates | β
| | | | |
|
|
216
|
+
| [no-unused-props](docs/rules/no-unused-props.md) | Detect unused props in React component type definitions | β
| | | | |
|
|
217
|
+
| [no-unused-usestate](docs/rules/no-unused-usestate.md) | Disallow unused useState hooks | β
| | π§ | | |
|
|
218
|
+
| [no-useless-fragment](docs/rules/no-useless-fragment.md) | Prevent unnecessary use of React fragments | β
| | π§ | | |
|
|
219
|
+
| [no-useless-usememo-primitives](docs/rules/no-useless-usememo-primitives.md) | Disallow useless useMemo with primitive values. | β
| | π§ | | |
|
|
220
|
+
| [no-usememo-for-pass-by-value](docs/rules/no-usememo-for-pass-by-value.md) | Disallow returning useMemo results from custom hooks when the memoized value is pass-by-value: primitives with value equality (string, number, boolean, null, undefined, bigint) or arrays/tuples composed exclusively of these primitives. Requires type information. | β
| | π§ | | π |
|
|
221
|
+
| [no-uuidv4-base62-as-key](docs/rules/no-uuidv4-base62-as-key.md) | Disallow using uuidv4Base62() to generate keys for elements in a list or loop | β
| | | | |
|
|
222
|
+
| [omit-index-html](docs/rules/omit-index-html.md) | Disallow the use of "index.html" in URLs | β
| | π§ | | |
|
|
223
|
+
| [optimize-object-boolean-conditions](docs/rules/optimize-object-boolean-conditions.md) | Detects and suggests optimizations for boolean conditions formed over objects in React hook dependencies. Suggests extracting boolean conditions into separate variables to reduce unnecessary re-computations when objects change frequently but the boolean condition changes less frequently. | β
| | | | |
|
|
224
|
+
| [parallelize-async-operations](docs/rules/parallelize-async-operations.md) | Enforce the use of Promise.all() when multiple independent asynchronous operations are awaited sequentially | β
| | π§ | | |
|
|
225
|
+
| [parallelize-loop-awaits](docs/rules/parallelize-loop-awaits.md) | Disallow sequential await expressions inside loops when iterations could be parallelized with Promise.all(items.map(...)) | β
| | | | |
|
|
226
|
+
| [prefer-batch-operations](docs/rules/prefer-batch-operations.md) | Enforce using setAll() and overwriteAll() instead of multiple set() or overwrite() calls | β
| | | | |
|
|
227
|
+
| [prefer-block-comments-for-declarations](docs/rules/prefer-block-comments-for-declarations.md) | Enforce the use of block comments for declarations | β
| | π§ | | |
|
|
228
|
+
| [prefer-clone-deep](docs/rules/prefer-clone-deep.md) | Prefer using cloneDeep over nested spread copying | β
| | π§ | | |
|
|
229
|
+
| [prefer-destructuring-no-class](docs/rules/prefer-destructuring-no-class.md) | Enforce destructuring when accessing object properties, except for class instances | β
| | π§ | | |
|
|
230
|
+
| [prefer-docsetter-setall](docs/rules/prefer-docsetter-setall.md) | Enforce batching DocSetter and DocSetterTransaction writes by using setAll instead of set inside loops or array callbacks. | β
| | | | |
|
|
231
|
+
| [prefer-document-flattening](docs/rules/prefer-document-flattening.md) | Enforce using the shouldFlatten option when setting deeply nested objects in Firestore documents | | | | π‘ | |
|
|
232
|
+
| [prefer-field-paths-in-transforms](docs/rules/prefer-field-paths-in-transforms.md) | Flatten aggregation updates inside transformEach so diff-based deletes remove only the intended fields instead of wiping sibling data. | β
| | | | |
|
|
233
|
+
| [prefer-flat-transform-each-keys](docs/rules/prefer-flat-transform-each-keys.md) | Warn when transformEach in a propagation strategy returns nested object values instead of flat dot-notation keys. | β
| | | | |
|
|
234
|
+
| [prefer-fragment-component](docs/rules/prefer-fragment-component.md) | Require the Fragment named import instead of shorthand fragments or React.Fragment to keep fragments explicit and prop-friendly | | β
| π§ | | |
|
|
235
|
+
| [prefer-fragment-shorthand](docs/rules/prefer-fragment-shorthand.md) | Prefer <> shorthand for <React.Fragment> | β
| | π§ | | |
|
|
236
|
+
| [prefer-getter-over-parameterless-method](docs/rules/prefer-getter-over-parameterless-method.md) | Enforce getter syntax for synchronous parameterless methods that return values, improving semantic clarity and avoiding accidental method invocation without parentheses. | β
| | π§ | | |
|
|
237
|
+
| [prefer-global-router-state-key](docs/rules/prefer-global-router-state-key.md) | Enforce using centralized router state key constants from queryKeys.ts for useRouterState key parameter | β
| | π§ | | |
|
|
238
|
+
| [prefer-map-over-conditional-dispatch](docs/rules/prefer-map-over-conditional-dispatch.md) | Prefer a Record<Discriminant, Value> lookup over switch/ternary/if-else dispatch on a literal-union discriminant where every branch returns or assigns a single value. | β
| | π§ | | π |
|
|
239
|
+
| [prefer-next-dynamic](docs/rules/prefer-next-dynamic.md) | Prefer Next.js dynamic() over custom useDynamic() for component imports | β
| | π§ | | |
|
|
240
|
+
| [prefer-nullish-coalescing-boolean-props](docs/rules/prefer-nullish-coalescing-boolean-props.md) | Prefer nullish coalescing over logical OR, but allow logical OR in boolean contexts | β
| | π§ | | |
|
|
241
|
+
| [prefer-params-over-parent-id](docs/rules/prefer-params-over-parent-id.md) | Prefer event.params over ref.parent.id for type-safe Firebase trigger paths. | β
| | π§ | | |
|
|
242
|
+
| [prefer-settings-object](docs/rules/prefer-settings-object.md) | Enforce using a settings object for functions with multiple parameters | β
| | | | |
|
|
243
|
+
| [prefer-spread-over-reassembly](docs/rules/prefer-spread-over-reassembly.md) | Prefer spread syntax over destructure-then-reassemble when all destructured fields are forwarded identically to a single target | β
| | π§ | | |
|
|
244
|
+
| [prefer-sx-prop-over-system-props](docs/rules/prefer-sx-prop-over-system-props.md) | Enforce using the MUI `sx` prop instead of deprecated system props (e.g. `mt`, `display`, `flexDirection`) on MUI components. | β
| | π§ | | |
|
|
245
|
+
| [prefer-type-alias-over-typeof-constant](docs/rules/prefer-type-alias-over-typeof-constant.md) | Prefer named type aliases over `typeof` on same-file global constants; ensure types are declared before constants. | β
| | | | |
|
|
246
|
+
| [prefer-type-over-interface](docs/rules/prefer-type-over-interface.md) | Prefer using type alias over interface | β
| | π§ | | |
|
|
247
|
+
| [prefer-union-from-const-array](docs/rules/prefer-union-from-const-array.md) | Derive string-literal union types from an `as const` array instead of declaring the union inline, so the runtime value set and the type share a single source of truth | β
| | π§ | | |
|
|
248
|
+
| [prefer-url-tostring-over-tojson](docs/rules/prefer-url-tostring-over-tojson.md) | Enforce the use of toString() over toJSON() on URL objects. | β
| | π§ | | |
|
|
249
|
+
| [prefer-use-base62-id](docs/rules/prefer-use-base62-id.md) | Prefer `useBase62Id()` over `uuidv4Base62()` inside useState/useRef/useMemo for stable component IDs to avoid SSR hydration mismatches | β
| | | | |
|
|
250
|
+
| [prefer-use-deep-compare-memo](docs/rules/prefer-use-deep-compare-memo.md) | Enforce using useDeepCompareMemo when dependency array contains non-primitive values (objects, arrays) that are not already memoized. This prevents unnecessary re-renders due to reference changes. | β
| | π§ | | |
|
|
251
|
+
| [prefer-use-theme](docs/rules/prefer-use-theme.md) | Enforce reading MUI theme values via useTheme() or the sx theme callback instead of importing theme constants directly from src/styles/* modules. | β
| | | | |
|
|
252
|
+
| [prefer-usecallback-over-usememo-for-functions](docs/rules/prefer-usecallback-over-usememo-for-functions.md) | Enforce using useCallback instead of useMemo for memoizing functions | β
| | π§ | | |
|
|
253
|
+
| [prefer-usememo-over-useeffect-usestate](docs/rules/prefer-usememo-over-useeffect-usestate.md) | Prefer useMemo over useEffect + useState for pure computations to avoid extra render cycles and stale derived state. | β
| | | | |
|
|
254
|
+
| [prefer-utility-function-over-private-static](docs/rules/prefer-utility-function-over-private-static.md) | Enforce abstraction of private static methods into utility functions | β
| | | | |
|
|
255
|
+
| [prefer-utility-function-own-file](docs/rules/prefer-utility-function-own-file.md) | Enforce that sizable utility functions live in their own file rather than being co-located inside an entry-point or consumer file | β
| | | | |
|
|
256
|
+
| [prevent-children-clobber](docs/rules/prevent-children-clobber.md) | Prevent JSX spreads from silently discarding props.children | β
| | | | |
|
|
257
|
+
| [react-memoize-literals](docs/rules/react-memoize-literals.md) | Detect object, array, and function literals created in React components or hooks that create new references every render. Prefer memoized values (useMemo/useCallback) or module-level constants to keep referential stability. | β
| | | π‘ | |
|
|
258
|
+
| [react-usememo-should-be-component](docs/rules/react-usememo-should-be-component.md) | Enforce that useMemo hooks explicitly returning JSX should be abstracted into separate React components | β
| | | | |
|
|
259
|
+
| [require-dynamic-firebase-imports](docs/rules/require-dynamic-firebase-imports.md) | Enforce dynamic imports for Firebase dependencies | β
| | π§ | | |
|
|
260
|
+
| [require-hooks-default-params](docs/rules/require-hooks-default-params.md) | Enforce React hooks with optional parameters to default to an empty object | β
| | π§ | | |
|
|
261
|
+
| [require-https-error](docs/rules/require-https-error.md) | Enforce using proprietary HttpsError instead of throw new Error or firebase-admin HttpsError in functions/src | β
| | | | |
|
|
262
|
+
| [require-https-error-cause](docs/rules/require-https-error-cause.md) | Ensure HttpsError calls inside catch blocks pass the caught error as the fourth "cause" argument to preserve stack traces for monitoring. | β
| | | | |
|
|
263
|
+
| [require-image-optimized](docs/rules/require-image-optimized.md) | Enforce using ImageOptimized component instead of next/image or img tags | β
| | π§ | | |
|
|
264
|
+
| [require-memo](docs/rules/require-memo.md) | React components must be memoized | β
| | π§ | | |
|
|
265
|
+
| [require-memoize-jsx-returners](docs/rules/require-memoize-jsx-returners.md) | Require @Memoize() decorator on instance members that return JSX or JSX factories | β
| | π§ | | |
|
|
266
|
+
| [require-migration-script-metadata](docs/rules/require-migration-script-metadata.md) | Enforce JSDoc migration metadata in callable scripts | β
| | | | |
|
|
267
|
+
| [require-props-composition](docs/rules/require-props-composition.md) | Require React component Props types to compose (via Pick/Omit) with the props types of non-leaf child components rendered in JSX | β
| | | | |
|
|
268
|
+
| [require-server-timestamp-for-firestore-dates](docs/rules/require-server-timestamp-for-firestore-dates.md) | Enforce serverTimestamp() instead of new Date() for Firestore timestamp fields | β
| | | | |
|
|
269
|
+
| [semantic-function-prefixes](docs/rules/semantic-function-prefixes.md) | Require semantic function prefixes instead of generic verbs so callers know whether a function fetches data, transforms input, or mutates state | β
| | | | |
|
|
270
|
+
| [sync-onwrite-name-func](docs/rules/sync-onwrite-name-func.md) | Ensure that the name field matches the func field in onWrite handlers | β
| | π§ | | |
|
|
271
|
+
| [test-file-location-enforcement](docs/rules/test-file-location-enforcement.md) | Enforce colocating *.test.ts or *.test.tsx files with the code they cover. | β
| | | | |
|
|
272
|
+
| [use-custom-link](docs/rules/use-custom-link.md) | Enforce using src/components/Link instead of next/link | β
| | π§ | | |
|
|
273
|
+
| [use-custom-memo](docs/rules/use-custom-memo.md) | Enforce using src/util/memo instead of React memo | β
| | π§ | | |
|
|
274
|
+
| [use-custom-router](docs/rules/use-custom-router.md) | Enforce using src/hooks/routing/useRouter instead of next/router | β
| | π§ | | |
|
|
275
|
+
| [use-latest-callback](docs/rules/use-latest-callback.md) | Enforce using useLatestCallback from use-latest-callback instead of React useCallback | β
| | π§ | | |
|
|
276
|
+
| [vertically-group-related-functions](docs/rules/vertically-group-related-functions.md) | Keep top-level functions grouped vertically so callers, exports, and helpers read top-down. | β
| | π§ | | |
|
|
277
|
+
| [warn-https-error-message-user-friendly](docs/rules/warn-https-error-message-user-friendly.md) | Warn when messageUserFriendly is used in HttpsError or toHttpsError to ensure it is truly a user-caused error. | β
| | | | |
|
|
279
278
|
|
|
280
279
|
<!-- end auto-generated rules list -->
|
|
281
280
|
|