eslint-plugin-react-hooks 6.2.0-canary-03c6454d-20251008 → 7.0.0-canary-4b3e662e-20251008
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.
|
@@ -17999,7 +17999,8 @@ function printErrorSummary(category, message) {
|
|
|
17999
17999
|
case ErrorCategory.StaticComponents:
|
|
18000
18000
|
case ErrorCategory.Suppression:
|
|
18001
18001
|
case ErrorCategory.Syntax:
|
|
18002
|
-
case ErrorCategory.UseMemo:
|
|
18002
|
+
case ErrorCategory.UseMemo:
|
|
18003
|
+
case ErrorCategory.VoidUseMemo: {
|
|
18003
18004
|
heading = 'Error';
|
|
18004
18005
|
break;
|
|
18005
18006
|
}
|
|
@@ -18030,6 +18031,7 @@ var ErrorCategory;
|
|
|
18030
18031
|
ErrorCategory["CapitalizedCalls"] = "CapitalizedCalls";
|
|
18031
18032
|
ErrorCategory["StaticComponents"] = "StaticComponents";
|
|
18032
18033
|
ErrorCategory["UseMemo"] = "UseMemo";
|
|
18034
|
+
ErrorCategory["VoidUseMemo"] = "VoidUseMemo";
|
|
18033
18035
|
ErrorCategory["Factories"] = "Factories";
|
|
18034
18036
|
ErrorCategory["PreserveManualMemo"] = "PreserveManualMemo";
|
|
18035
18037
|
ErrorCategory["IncompatibleLibrary"] = "IncompatibleLibrary";
|
|
@@ -18053,6 +18055,12 @@ var ErrorCategory;
|
|
|
18053
18055
|
ErrorCategory["Fire"] = "Fire";
|
|
18054
18056
|
ErrorCategory["FBT"] = "FBT";
|
|
18055
18057
|
})(ErrorCategory || (ErrorCategory = {}));
|
|
18058
|
+
var LintRulePreset;
|
|
18059
|
+
(function (LintRulePreset) {
|
|
18060
|
+
LintRulePreset["Recommended"] = "recommended";
|
|
18061
|
+
LintRulePreset["RecommendedLatest"] = "recommended-latest";
|
|
18062
|
+
LintRulePreset["Off"] = "off";
|
|
18063
|
+
})(LintRulePreset || (LintRulePreset = {}));
|
|
18056
18064
|
const RULE_NAME_PATTERN = /^[a-z]+(-[a-z]+)*$/;
|
|
18057
18065
|
function getRuleForCategory(category) {
|
|
18058
18066
|
const rule = getRuleForCategoryImpl(category);
|
|
@@ -18067,7 +18075,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18067
18075
|
severity: ErrorSeverity.Error,
|
|
18068
18076
|
name: 'automatic-effect-dependencies',
|
|
18069
18077
|
description: 'Verifies that automatic effect dependencies are compiled if opted-in',
|
|
18070
|
-
|
|
18078
|
+
preset: LintRulePreset.Off,
|
|
18071
18079
|
};
|
|
18072
18080
|
}
|
|
18073
18081
|
case ErrorCategory.CapitalizedCalls: {
|
|
@@ -18076,7 +18084,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18076
18084
|
severity: ErrorSeverity.Error,
|
|
18077
18085
|
name: 'capitalized-calls',
|
|
18078
18086
|
description: 'Validates against calling capitalized functions/methods instead of using JSX',
|
|
18079
|
-
|
|
18087
|
+
preset: LintRulePreset.Off,
|
|
18080
18088
|
};
|
|
18081
18089
|
}
|
|
18082
18090
|
case ErrorCategory.Config: {
|
|
@@ -18085,7 +18093,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18085
18093
|
severity: ErrorSeverity.Error,
|
|
18086
18094
|
name: 'config',
|
|
18087
18095
|
description: 'Validates the compiler configuration options',
|
|
18088
|
-
|
|
18096
|
+
preset: LintRulePreset.Recommended,
|
|
18089
18097
|
};
|
|
18090
18098
|
}
|
|
18091
18099
|
case ErrorCategory.EffectDependencies: {
|
|
@@ -18094,7 +18102,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18094
18102
|
severity: ErrorSeverity.Error,
|
|
18095
18103
|
name: 'memoized-effect-dependencies',
|
|
18096
18104
|
description: 'Validates that effect dependencies are memoized',
|
|
18097
|
-
|
|
18105
|
+
preset: LintRulePreset.Off,
|
|
18098
18106
|
};
|
|
18099
18107
|
}
|
|
18100
18108
|
case ErrorCategory.EffectDerivationsOfState: {
|
|
@@ -18103,7 +18111,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18103
18111
|
severity: ErrorSeverity.Error,
|
|
18104
18112
|
name: 'no-deriving-state-in-effects',
|
|
18105
18113
|
description: 'Validates against deriving values from state in an effect',
|
|
18106
|
-
|
|
18114
|
+
preset: LintRulePreset.Off,
|
|
18107
18115
|
};
|
|
18108
18116
|
}
|
|
18109
18117
|
case ErrorCategory.EffectSetState: {
|
|
@@ -18112,7 +18120,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18112
18120
|
severity: ErrorSeverity.Error,
|
|
18113
18121
|
name: 'set-state-in-effect',
|
|
18114
18122
|
description: 'Validates against calling setState synchronously in an effect, which can lead to re-renders that degrade performance',
|
|
18115
|
-
|
|
18123
|
+
preset: LintRulePreset.Recommended,
|
|
18116
18124
|
};
|
|
18117
18125
|
}
|
|
18118
18126
|
case ErrorCategory.ErrorBoundaries: {
|
|
@@ -18121,7 +18129,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18121
18129
|
severity: ErrorSeverity.Error,
|
|
18122
18130
|
name: 'error-boundaries',
|
|
18123
18131
|
description: 'Validates usage of error boundaries instead of try/catch for errors in child components',
|
|
18124
|
-
|
|
18132
|
+
preset: LintRulePreset.Recommended,
|
|
18125
18133
|
};
|
|
18126
18134
|
}
|
|
18127
18135
|
case ErrorCategory.Factories: {
|
|
@@ -18131,7 +18139,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18131
18139
|
name: 'component-hook-factories',
|
|
18132
18140
|
description: 'Validates against higher order functions defining nested components or hooks. ' +
|
|
18133
18141
|
'Components and hooks should be defined at the module level',
|
|
18134
|
-
|
|
18142
|
+
preset: LintRulePreset.Recommended,
|
|
18135
18143
|
};
|
|
18136
18144
|
}
|
|
18137
18145
|
case ErrorCategory.FBT: {
|
|
@@ -18140,7 +18148,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18140
18148
|
severity: ErrorSeverity.Error,
|
|
18141
18149
|
name: 'fbt',
|
|
18142
18150
|
description: 'Validates usage of fbt',
|
|
18143
|
-
|
|
18151
|
+
preset: LintRulePreset.Off,
|
|
18144
18152
|
};
|
|
18145
18153
|
}
|
|
18146
18154
|
case ErrorCategory.Fire: {
|
|
@@ -18149,7 +18157,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18149
18157
|
severity: ErrorSeverity.Error,
|
|
18150
18158
|
name: 'fire',
|
|
18151
18159
|
description: 'Validates usage of `fire`',
|
|
18152
|
-
|
|
18160
|
+
preset: LintRulePreset.Off,
|
|
18153
18161
|
};
|
|
18154
18162
|
}
|
|
18155
18163
|
case ErrorCategory.Gating: {
|
|
@@ -18158,7 +18166,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18158
18166
|
severity: ErrorSeverity.Error,
|
|
18159
18167
|
name: 'gating',
|
|
18160
18168
|
description: 'Validates configuration of [gating mode](https://react.dev/reference/react-compiler/gating)',
|
|
18161
|
-
|
|
18169
|
+
preset: LintRulePreset.Recommended,
|
|
18162
18170
|
};
|
|
18163
18171
|
}
|
|
18164
18172
|
case ErrorCategory.Globals: {
|
|
@@ -18168,7 +18176,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18168
18176
|
name: 'globals',
|
|
18169
18177
|
description: 'Validates against assignment/mutation of globals during render, part of ensuring that ' +
|
|
18170
18178
|
'[side effects must render outside of render](https://react.dev/reference/rules/components-and-hooks-must-be-pure#side-effects-must-run-outside-of-render)',
|
|
18171
|
-
|
|
18179
|
+
preset: LintRulePreset.Recommended,
|
|
18172
18180
|
};
|
|
18173
18181
|
}
|
|
18174
18182
|
case ErrorCategory.Hooks: {
|
|
@@ -18177,7 +18185,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18177
18185
|
severity: ErrorSeverity.Error,
|
|
18178
18186
|
name: 'hooks',
|
|
18179
18187
|
description: 'Validates the rules of hooks',
|
|
18180
|
-
|
|
18188
|
+
preset: LintRulePreset.Off,
|
|
18181
18189
|
};
|
|
18182
18190
|
}
|
|
18183
18191
|
case ErrorCategory.Immutability: {
|
|
@@ -18186,7 +18194,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18186
18194
|
severity: ErrorSeverity.Error,
|
|
18187
18195
|
name: 'immutability',
|
|
18188
18196
|
description: 'Validates against mutating props, state, and other values that [are immutable](https://react.dev/reference/rules/components-and-hooks-must-be-pure#props-and-state-are-immutable)',
|
|
18189
|
-
|
|
18197
|
+
preset: LintRulePreset.Recommended,
|
|
18190
18198
|
};
|
|
18191
18199
|
}
|
|
18192
18200
|
case ErrorCategory.Invariant: {
|
|
@@ -18195,7 +18203,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18195
18203
|
severity: ErrorSeverity.Error,
|
|
18196
18204
|
name: 'invariant',
|
|
18197
18205
|
description: 'Internal invariants',
|
|
18198
|
-
|
|
18206
|
+
preset: LintRulePreset.Off,
|
|
18199
18207
|
};
|
|
18200
18208
|
}
|
|
18201
18209
|
case ErrorCategory.PreserveManualMemo: {
|
|
@@ -18206,7 +18214,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18206
18214
|
description: 'Validates that existing manual memoized is preserved by the compiler. ' +
|
|
18207
18215
|
'React Compiler will only compile components and hooks if its inference ' +
|
|
18208
18216
|
'[matches or exceeds the existing manual memoization](https://react.dev/learn/react-compiler/introduction#what-should-i-do-about-usememo-usecallback-and-reactmemo)',
|
|
18209
|
-
|
|
18217
|
+
preset: LintRulePreset.Recommended,
|
|
18210
18218
|
};
|
|
18211
18219
|
}
|
|
18212
18220
|
case ErrorCategory.Purity: {
|
|
@@ -18215,7 +18223,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18215
18223
|
severity: ErrorSeverity.Error,
|
|
18216
18224
|
name: 'purity',
|
|
18217
18225
|
description: 'Validates that [components/hooks are pure](https://react.dev/reference/rules/components-and-hooks-must-be-pure) by checking that they do not call known-impure functions',
|
|
18218
|
-
|
|
18226
|
+
preset: LintRulePreset.Recommended,
|
|
18219
18227
|
};
|
|
18220
18228
|
}
|
|
18221
18229
|
case ErrorCategory.Refs: {
|
|
@@ -18224,7 +18232,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18224
18232
|
severity: ErrorSeverity.Error,
|
|
18225
18233
|
name: 'refs',
|
|
18226
18234
|
description: 'Validates correct usage of refs, not reading/writing during render. See the "pitfalls" section in [`useRef()` usage](https://react.dev/reference/react/useRef#usage)',
|
|
18227
|
-
|
|
18235
|
+
preset: LintRulePreset.Recommended,
|
|
18228
18236
|
};
|
|
18229
18237
|
}
|
|
18230
18238
|
case ErrorCategory.RenderSetState: {
|
|
@@ -18233,7 +18241,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18233
18241
|
severity: ErrorSeverity.Error,
|
|
18234
18242
|
name: 'set-state-in-render',
|
|
18235
18243
|
description: 'Validates against setting state during render, which can trigger additional renders and potential infinite render loops',
|
|
18236
|
-
|
|
18244
|
+
preset: LintRulePreset.Recommended,
|
|
18237
18245
|
};
|
|
18238
18246
|
}
|
|
18239
18247
|
case ErrorCategory.StaticComponents: {
|
|
@@ -18242,7 +18250,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18242
18250
|
severity: ErrorSeverity.Error,
|
|
18243
18251
|
name: 'static-components',
|
|
18244
18252
|
description: 'Validates that components are static, not recreated every render. Components that are recreated dynamically can reset state and trigger excessive re-rendering',
|
|
18245
|
-
|
|
18253
|
+
preset: LintRulePreset.Recommended,
|
|
18246
18254
|
};
|
|
18247
18255
|
}
|
|
18248
18256
|
case ErrorCategory.Suppression: {
|
|
@@ -18251,7 +18259,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18251
18259
|
severity: ErrorSeverity.Error,
|
|
18252
18260
|
name: 'rule-suppression',
|
|
18253
18261
|
description: 'Validates against suppression of other rules',
|
|
18254
|
-
|
|
18262
|
+
preset: LintRulePreset.Off,
|
|
18255
18263
|
};
|
|
18256
18264
|
}
|
|
18257
18265
|
case ErrorCategory.Syntax: {
|
|
@@ -18260,7 +18268,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18260
18268
|
severity: ErrorSeverity.Error,
|
|
18261
18269
|
name: 'syntax',
|
|
18262
18270
|
description: 'Validates against invalid syntax',
|
|
18263
|
-
|
|
18271
|
+
preset: LintRulePreset.Off,
|
|
18264
18272
|
};
|
|
18265
18273
|
}
|
|
18266
18274
|
case ErrorCategory.Todo: {
|
|
@@ -18269,7 +18277,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18269
18277
|
severity: ErrorSeverity.Hint,
|
|
18270
18278
|
name: 'todo',
|
|
18271
18279
|
description: 'Unimplemented features',
|
|
18272
|
-
|
|
18280
|
+
preset: LintRulePreset.Off,
|
|
18273
18281
|
};
|
|
18274
18282
|
}
|
|
18275
18283
|
case ErrorCategory.UnsupportedSyntax: {
|
|
@@ -18278,7 +18286,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18278
18286
|
severity: ErrorSeverity.Warning,
|
|
18279
18287
|
name: 'unsupported-syntax',
|
|
18280
18288
|
description: 'Validates against syntax that we do not plan to support in React Compiler',
|
|
18281
|
-
|
|
18289
|
+
preset: LintRulePreset.Recommended,
|
|
18282
18290
|
};
|
|
18283
18291
|
}
|
|
18284
18292
|
case ErrorCategory.UseMemo: {
|
|
@@ -18287,7 +18295,16 @@ function getRuleForCategoryImpl(category) {
|
|
|
18287
18295
|
severity: ErrorSeverity.Error,
|
|
18288
18296
|
name: 'use-memo',
|
|
18289
18297
|
description: 'Validates usage of the useMemo() hook against common mistakes. See [`useMemo()` docs](https://react.dev/reference/react/useMemo) for more information.',
|
|
18290
|
-
|
|
18298
|
+
preset: LintRulePreset.Recommended,
|
|
18299
|
+
};
|
|
18300
|
+
}
|
|
18301
|
+
case ErrorCategory.VoidUseMemo: {
|
|
18302
|
+
return {
|
|
18303
|
+
category,
|
|
18304
|
+
severity: ErrorSeverity.Error,
|
|
18305
|
+
name: 'void-use-memo',
|
|
18306
|
+
description: 'Validates that useMemos always return a value. See [`useMemo()` docs](https://react.dev/reference/react/useMemo) for more information.',
|
|
18307
|
+
preset: LintRulePreset.RecommendedLatest,
|
|
18291
18308
|
};
|
|
18292
18309
|
}
|
|
18293
18310
|
case ErrorCategory.IncompatibleLibrary: {
|
|
@@ -18296,7 +18313,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18296
18313
|
severity: ErrorSeverity.Warning,
|
|
18297
18314
|
name: 'incompatible-library',
|
|
18298
18315
|
description: 'Validates against usage of libraries which are incompatible with memoization (manual or automatic)',
|
|
18299
|
-
|
|
18316
|
+
preset: LintRulePreset.Recommended,
|
|
18300
18317
|
};
|
|
18301
18318
|
}
|
|
18302
18319
|
default: {
|
|
@@ -44528,7 +44545,7 @@ function dropManualMemoization(func) {
|
|
|
44528
44545
|
if (funcToCheck !== undefined && funcToCheck.loweredFunc.func) {
|
|
44529
44546
|
if (!hasNonVoidReturn(funcToCheck.loweredFunc.func)) {
|
|
44530
44547
|
errors.pushDiagnostic(CompilerDiagnostic.create({
|
|
44531
|
-
category: ErrorCategory.
|
|
44548
|
+
category: ErrorCategory.VoidUseMemo,
|
|
44532
44549
|
reason: 'useMemo() callbacks must return a value',
|
|
44533
44550
|
description: `This ${manualMemo.loadInstr.value.kind === 'PropertyLoad'
|
|
44534
44551
|
? 'React.useMemo'
|
|
@@ -54374,7 +54391,7 @@ function makeRule(rule) {
|
|
|
54374
54391
|
type: 'problem',
|
|
54375
54392
|
docs: {
|
|
54376
54393
|
description: rule.description,
|
|
54377
|
-
recommended: rule.
|
|
54394
|
+
recommended: rule.preset === LintRulePreset.Recommended,
|
|
54378
54395
|
},
|
|
54379
54396
|
fixable: 'code',
|
|
54380
54397
|
hasSuggestions: true,
|
|
@@ -54387,7 +54404,12 @@ const allRules = LintRules.reduce((acc, rule) => {
|
|
|
54387
54404
|
acc[rule.name] = { rule: makeRule(rule), severity: rule.severity };
|
|
54388
54405
|
return acc;
|
|
54389
54406
|
}, {});
|
|
54390
|
-
const recommendedRules = LintRules.filter(rule => rule.
|
|
54407
|
+
const recommendedRules = LintRules.filter(rule => rule.preset === LintRulePreset.Recommended).reduce((acc, rule) => {
|
|
54408
|
+
acc[rule.name] = { rule: makeRule(rule), severity: rule.severity };
|
|
54409
|
+
return acc;
|
|
54410
|
+
}, {});
|
|
54411
|
+
const recommendedLatestRules = LintRules.filter(rule => rule.preset === LintRulePreset.Recommended ||
|
|
54412
|
+
rule.preset === LintRulePreset.RecommendedLatest).reduce((acc, rule) => {
|
|
54391
54413
|
acc[rule.name] = { rule: makeRule(rule), severity: rule.severity };
|
|
54392
54414
|
return acc;
|
|
54393
54415
|
}, {});
|
|
@@ -57699,22 +57721,29 @@ const basicRuleConfigs = {
|
|
|
57699
57721
|
'react-hooks/rules-of-hooks': 'error',
|
|
57700
57722
|
'react-hooks/exhaustive-deps': 'warn',
|
|
57701
57723
|
};
|
|
57702
|
-
const
|
|
57724
|
+
const recommendedCompilerRuleConfigs = Object.fromEntries(Object.entries(recommendedRules).map(([name, ruleConfig]) => {
|
|
57725
|
+
return [
|
|
57726
|
+
`react-hooks/${name}`,
|
|
57727
|
+
mapErrorSeverityToESlint(ruleConfig.severity),
|
|
57728
|
+
];
|
|
57729
|
+
}));
|
|
57730
|
+
const recommendedLatestCompilerRuleConfigs = Object.fromEntries(Object.entries(recommendedLatestRules).map(([name, ruleConfig]) => {
|
|
57703
57731
|
return [
|
|
57704
57732
|
`react-hooks/${name}`,
|
|
57705
57733
|
mapErrorSeverityToESlint(ruleConfig.severity),
|
|
57706
57734
|
];
|
|
57707
57735
|
}));
|
|
57708
|
-
const
|
|
57736
|
+
const recommendedRuleConfigs = Object.assign(Object.assign({}, basicRuleConfigs), recommendedCompilerRuleConfigs);
|
|
57737
|
+
const recommendedLatestRuleConfigs = Object.assign(Object.assign({}, basicRuleConfigs), recommendedLatestCompilerRuleConfigs);
|
|
57709
57738
|
const plugins = ['react-hooks'];
|
|
57710
57739
|
const configs = {
|
|
57711
57740
|
recommended: {
|
|
57712
57741
|
plugins,
|
|
57713
|
-
rules:
|
|
57742
|
+
rules: recommendedRuleConfigs,
|
|
57714
57743
|
},
|
|
57715
57744
|
'recommended-latest': {
|
|
57716
57745
|
plugins,
|
|
57717
|
-
rules:
|
|
57746
|
+
rules: recommendedLatestRuleConfigs,
|
|
57718
57747
|
},
|
|
57719
57748
|
flat: {},
|
|
57720
57749
|
};
|
|
@@ -17990,7 +17990,8 @@ function printErrorSummary(category, message) {
|
|
|
17990
17990
|
case ErrorCategory.StaticComponents:
|
|
17991
17991
|
case ErrorCategory.Suppression:
|
|
17992
17992
|
case ErrorCategory.Syntax:
|
|
17993
|
-
case ErrorCategory.UseMemo:
|
|
17993
|
+
case ErrorCategory.UseMemo:
|
|
17994
|
+
case ErrorCategory.VoidUseMemo: {
|
|
17994
17995
|
heading = 'Error';
|
|
17995
17996
|
break;
|
|
17996
17997
|
}
|
|
@@ -18021,6 +18022,7 @@ var ErrorCategory;
|
|
|
18021
18022
|
ErrorCategory["CapitalizedCalls"] = "CapitalizedCalls";
|
|
18022
18023
|
ErrorCategory["StaticComponents"] = "StaticComponents";
|
|
18023
18024
|
ErrorCategory["UseMemo"] = "UseMemo";
|
|
18025
|
+
ErrorCategory["VoidUseMemo"] = "VoidUseMemo";
|
|
18024
18026
|
ErrorCategory["Factories"] = "Factories";
|
|
18025
18027
|
ErrorCategory["PreserveManualMemo"] = "PreserveManualMemo";
|
|
18026
18028
|
ErrorCategory["IncompatibleLibrary"] = "IncompatibleLibrary";
|
|
@@ -18044,6 +18046,12 @@ var ErrorCategory;
|
|
|
18044
18046
|
ErrorCategory["Fire"] = "Fire";
|
|
18045
18047
|
ErrorCategory["FBT"] = "FBT";
|
|
18046
18048
|
})(ErrorCategory || (ErrorCategory = {}));
|
|
18049
|
+
var LintRulePreset;
|
|
18050
|
+
(function (LintRulePreset) {
|
|
18051
|
+
LintRulePreset["Recommended"] = "recommended";
|
|
18052
|
+
LintRulePreset["RecommendedLatest"] = "recommended-latest";
|
|
18053
|
+
LintRulePreset["Off"] = "off";
|
|
18054
|
+
})(LintRulePreset || (LintRulePreset = {}));
|
|
18047
18055
|
const RULE_NAME_PATTERN = /^[a-z]+(-[a-z]+)*$/;
|
|
18048
18056
|
function getRuleForCategory(category) {
|
|
18049
18057
|
const rule = getRuleForCategoryImpl(category);
|
|
@@ -18058,7 +18066,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18058
18066
|
severity: ErrorSeverity.Error,
|
|
18059
18067
|
name: 'automatic-effect-dependencies',
|
|
18060
18068
|
description: 'Verifies that automatic effect dependencies are compiled if opted-in',
|
|
18061
|
-
|
|
18069
|
+
preset: LintRulePreset.Off,
|
|
18062
18070
|
};
|
|
18063
18071
|
}
|
|
18064
18072
|
case ErrorCategory.CapitalizedCalls: {
|
|
@@ -18067,7 +18075,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18067
18075
|
severity: ErrorSeverity.Error,
|
|
18068
18076
|
name: 'capitalized-calls',
|
|
18069
18077
|
description: 'Validates against calling capitalized functions/methods instead of using JSX',
|
|
18070
|
-
|
|
18078
|
+
preset: LintRulePreset.Off,
|
|
18071
18079
|
};
|
|
18072
18080
|
}
|
|
18073
18081
|
case ErrorCategory.Config: {
|
|
@@ -18076,7 +18084,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18076
18084
|
severity: ErrorSeverity.Error,
|
|
18077
18085
|
name: 'config',
|
|
18078
18086
|
description: 'Validates the compiler configuration options',
|
|
18079
|
-
|
|
18087
|
+
preset: LintRulePreset.Recommended,
|
|
18080
18088
|
};
|
|
18081
18089
|
}
|
|
18082
18090
|
case ErrorCategory.EffectDependencies: {
|
|
@@ -18085,7 +18093,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18085
18093
|
severity: ErrorSeverity.Error,
|
|
18086
18094
|
name: 'memoized-effect-dependencies',
|
|
18087
18095
|
description: 'Validates that effect dependencies are memoized',
|
|
18088
|
-
|
|
18096
|
+
preset: LintRulePreset.Off,
|
|
18089
18097
|
};
|
|
18090
18098
|
}
|
|
18091
18099
|
case ErrorCategory.EffectDerivationsOfState: {
|
|
@@ -18094,7 +18102,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18094
18102
|
severity: ErrorSeverity.Error,
|
|
18095
18103
|
name: 'no-deriving-state-in-effects',
|
|
18096
18104
|
description: 'Validates against deriving values from state in an effect',
|
|
18097
|
-
|
|
18105
|
+
preset: LintRulePreset.Off,
|
|
18098
18106
|
};
|
|
18099
18107
|
}
|
|
18100
18108
|
case ErrorCategory.EffectSetState: {
|
|
@@ -18103,7 +18111,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18103
18111
|
severity: ErrorSeverity.Error,
|
|
18104
18112
|
name: 'set-state-in-effect',
|
|
18105
18113
|
description: 'Validates against calling setState synchronously in an effect, which can lead to re-renders that degrade performance',
|
|
18106
|
-
|
|
18114
|
+
preset: LintRulePreset.Recommended,
|
|
18107
18115
|
};
|
|
18108
18116
|
}
|
|
18109
18117
|
case ErrorCategory.ErrorBoundaries: {
|
|
@@ -18112,7 +18120,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18112
18120
|
severity: ErrorSeverity.Error,
|
|
18113
18121
|
name: 'error-boundaries',
|
|
18114
18122
|
description: 'Validates usage of error boundaries instead of try/catch for errors in child components',
|
|
18115
|
-
|
|
18123
|
+
preset: LintRulePreset.Recommended,
|
|
18116
18124
|
};
|
|
18117
18125
|
}
|
|
18118
18126
|
case ErrorCategory.Factories: {
|
|
@@ -18122,7 +18130,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18122
18130
|
name: 'component-hook-factories',
|
|
18123
18131
|
description: 'Validates against higher order functions defining nested components or hooks. ' +
|
|
18124
18132
|
'Components and hooks should be defined at the module level',
|
|
18125
|
-
|
|
18133
|
+
preset: LintRulePreset.Recommended,
|
|
18126
18134
|
};
|
|
18127
18135
|
}
|
|
18128
18136
|
case ErrorCategory.FBT: {
|
|
@@ -18131,7 +18139,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18131
18139
|
severity: ErrorSeverity.Error,
|
|
18132
18140
|
name: 'fbt',
|
|
18133
18141
|
description: 'Validates usage of fbt',
|
|
18134
|
-
|
|
18142
|
+
preset: LintRulePreset.Off,
|
|
18135
18143
|
};
|
|
18136
18144
|
}
|
|
18137
18145
|
case ErrorCategory.Fire: {
|
|
@@ -18140,7 +18148,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18140
18148
|
severity: ErrorSeverity.Error,
|
|
18141
18149
|
name: 'fire',
|
|
18142
18150
|
description: 'Validates usage of `fire`',
|
|
18143
|
-
|
|
18151
|
+
preset: LintRulePreset.Off,
|
|
18144
18152
|
};
|
|
18145
18153
|
}
|
|
18146
18154
|
case ErrorCategory.Gating: {
|
|
@@ -18149,7 +18157,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18149
18157
|
severity: ErrorSeverity.Error,
|
|
18150
18158
|
name: 'gating',
|
|
18151
18159
|
description: 'Validates configuration of [gating mode](https://react.dev/reference/react-compiler/gating)',
|
|
18152
|
-
|
|
18160
|
+
preset: LintRulePreset.Recommended,
|
|
18153
18161
|
};
|
|
18154
18162
|
}
|
|
18155
18163
|
case ErrorCategory.Globals: {
|
|
@@ -18159,7 +18167,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18159
18167
|
name: 'globals',
|
|
18160
18168
|
description: 'Validates against assignment/mutation of globals during render, part of ensuring that ' +
|
|
18161
18169
|
'[side effects must render outside of render](https://react.dev/reference/rules/components-and-hooks-must-be-pure#side-effects-must-run-outside-of-render)',
|
|
18162
|
-
|
|
18170
|
+
preset: LintRulePreset.Recommended,
|
|
18163
18171
|
};
|
|
18164
18172
|
}
|
|
18165
18173
|
case ErrorCategory.Hooks: {
|
|
@@ -18168,7 +18176,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18168
18176
|
severity: ErrorSeverity.Error,
|
|
18169
18177
|
name: 'hooks',
|
|
18170
18178
|
description: 'Validates the rules of hooks',
|
|
18171
|
-
|
|
18179
|
+
preset: LintRulePreset.Off,
|
|
18172
18180
|
};
|
|
18173
18181
|
}
|
|
18174
18182
|
case ErrorCategory.Immutability: {
|
|
@@ -18177,7 +18185,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18177
18185
|
severity: ErrorSeverity.Error,
|
|
18178
18186
|
name: 'immutability',
|
|
18179
18187
|
description: 'Validates against mutating props, state, and other values that [are immutable](https://react.dev/reference/rules/components-and-hooks-must-be-pure#props-and-state-are-immutable)',
|
|
18180
|
-
|
|
18188
|
+
preset: LintRulePreset.Recommended,
|
|
18181
18189
|
};
|
|
18182
18190
|
}
|
|
18183
18191
|
case ErrorCategory.Invariant: {
|
|
@@ -18186,7 +18194,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18186
18194
|
severity: ErrorSeverity.Error,
|
|
18187
18195
|
name: 'invariant',
|
|
18188
18196
|
description: 'Internal invariants',
|
|
18189
|
-
|
|
18197
|
+
preset: LintRulePreset.Off,
|
|
18190
18198
|
};
|
|
18191
18199
|
}
|
|
18192
18200
|
case ErrorCategory.PreserveManualMemo: {
|
|
@@ -18197,7 +18205,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18197
18205
|
description: 'Validates that existing manual memoized is preserved by the compiler. ' +
|
|
18198
18206
|
'React Compiler will only compile components and hooks if its inference ' +
|
|
18199
18207
|
'[matches or exceeds the existing manual memoization](https://react.dev/learn/react-compiler/introduction#what-should-i-do-about-usememo-usecallback-and-reactmemo)',
|
|
18200
|
-
|
|
18208
|
+
preset: LintRulePreset.Recommended,
|
|
18201
18209
|
};
|
|
18202
18210
|
}
|
|
18203
18211
|
case ErrorCategory.Purity: {
|
|
@@ -18206,7 +18214,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18206
18214
|
severity: ErrorSeverity.Error,
|
|
18207
18215
|
name: 'purity',
|
|
18208
18216
|
description: 'Validates that [components/hooks are pure](https://react.dev/reference/rules/components-and-hooks-must-be-pure) by checking that they do not call known-impure functions',
|
|
18209
|
-
|
|
18217
|
+
preset: LintRulePreset.Recommended,
|
|
18210
18218
|
};
|
|
18211
18219
|
}
|
|
18212
18220
|
case ErrorCategory.Refs: {
|
|
@@ -18215,7 +18223,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18215
18223
|
severity: ErrorSeverity.Error,
|
|
18216
18224
|
name: 'refs',
|
|
18217
18225
|
description: 'Validates correct usage of refs, not reading/writing during render. See the "pitfalls" section in [`useRef()` usage](https://react.dev/reference/react/useRef#usage)',
|
|
18218
|
-
|
|
18226
|
+
preset: LintRulePreset.Recommended,
|
|
18219
18227
|
};
|
|
18220
18228
|
}
|
|
18221
18229
|
case ErrorCategory.RenderSetState: {
|
|
@@ -18224,7 +18232,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18224
18232
|
severity: ErrorSeverity.Error,
|
|
18225
18233
|
name: 'set-state-in-render',
|
|
18226
18234
|
description: 'Validates against setting state during render, which can trigger additional renders and potential infinite render loops',
|
|
18227
|
-
|
|
18235
|
+
preset: LintRulePreset.Recommended,
|
|
18228
18236
|
};
|
|
18229
18237
|
}
|
|
18230
18238
|
case ErrorCategory.StaticComponents: {
|
|
@@ -18233,7 +18241,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18233
18241
|
severity: ErrorSeverity.Error,
|
|
18234
18242
|
name: 'static-components',
|
|
18235
18243
|
description: 'Validates that components are static, not recreated every render. Components that are recreated dynamically can reset state and trigger excessive re-rendering',
|
|
18236
|
-
|
|
18244
|
+
preset: LintRulePreset.Recommended,
|
|
18237
18245
|
};
|
|
18238
18246
|
}
|
|
18239
18247
|
case ErrorCategory.Suppression: {
|
|
@@ -18242,7 +18250,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18242
18250
|
severity: ErrorSeverity.Error,
|
|
18243
18251
|
name: 'rule-suppression',
|
|
18244
18252
|
description: 'Validates against suppression of other rules',
|
|
18245
|
-
|
|
18253
|
+
preset: LintRulePreset.Off,
|
|
18246
18254
|
};
|
|
18247
18255
|
}
|
|
18248
18256
|
case ErrorCategory.Syntax: {
|
|
@@ -18251,7 +18259,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18251
18259
|
severity: ErrorSeverity.Error,
|
|
18252
18260
|
name: 'syntax',
|
|
18253
18261
|
description: 'Validates against invalid syntax',
|
|
18254
|
-
|
|
18262
|
+
preset: LintRulePreset.Off,
|
|
18255
18263
|
};
|
|
18256
18264
|
}
|
|
18257
18265
|
case ErrorCategory.Todo: {
|
|
@@ -18260,7 +18268,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18260
18268
|
severity: ErrorSeverity.Hint,
|
|
18261
18269
|
name: 'todo',
|
|
18262
18270
|
description: 'Unimplemented features',
|
|
18263
|
-
|
|
18271
|
+
preset: LintRulePreset.Off,
|
|
18264
18272
|
};
|
|
18265
18273
|
}
|
|
18266
18274
|
case ErrorCategory.UnsupportedSyntax: {
|
|
@@ -18269,7 +18277,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18269
18277
|
severity: ErrorSeverity.Warning,
|
|
18270
18278
|
name: 'unsupported-syntax',
|
|
18271
18279
|
description: 'Validates against syntax that we do not plan to support in React Compiler',
|
|
18272
|
-
|
|
18280
|
+
preset: LintRulePreset.Recommended,
|
|
18273
18281
|
};
|
|
18274
18282
|
}
|
|
18275
18283
|
case ErrorCategory.UseMemo: {
|
|
@@ -18278,7 +18286,16 @@ function getRuleForCategoryImpl(category) {
|
|
|
18278
18286
|
severity: ErrorSeverity.Error,
|
|
18279
18287
|
name: 'use-memo',
|
|
18280
18288
|
description: 'Validates usage of the useMemo() hook against common mistakes. See [`useMemo()` docs](https://react.dev/reference/react/useMemo) for more information.',
|
|
18281
|
-
|
|
18289
|
+
preset: LintRulePreset.Recommended,
|
|
18290
|
+
};
|
|
18291
|
+
}
|
|
18292
|
+
case ErrorCategory.VoidUseMemo: {
|
|
18293
|
+
return {
|
|
18294
|
+
category,
|
|
18295
|
+
severity: ErrorSeverity.Error,
|
|
18296
|
+
name: 'void-use-memo',
|
|
18297
|
+
description: 'Validates that useMemos always return a value. See [`useMemo()` docs](https://react.dev/reference/react/useMemo) for more information.',
|
|
18298
|
+
preset: LintRulePreset.RecommendedLatest,
|
|
18282
18299
|
};
|
|
18283
18300
|
}
|
|
18284
18301
|
case ErrorCategory.IncompatibleLibrary: {
|
|
@@ -18287,7 +18304,7 @@ function getRuleForCategoryImpl(category) {
|
|
|
18287
18304
|
severity: ErrorSeverity.Warning,
|
|
18288
18305
|
name: 'incompatible-library',
|
|
18289
18306
|
description: 'Validates against usage of libraries which are incompatible with memoization (manual or automatic)',
|
|
18290
|
-
|
|
18307
|
+
preset: LintRulePreset.Recommended,
|
|
18291
18308
|
};
|
|
18292
18309
|
}
|
|
18293
18310
|
default: {
|
|
@@ -44355,7 +44372,7 @@ function dropManualMemoization(func) {
|
|
|
44355
44372
|
if (funcToCheck !== undefined && funcToCheck.loweredFunc.func) {
|
|
44356
44373
|
if (!hasNonVoidReturn(funcToCheck.loweredFunc.func)) {
|
|
44357
44374
|
errors.pushDiagnostic(CompilerDiagnostic.create({
|
|
44358
|
-
category: ErrorCategory.
|
|
44375
|
+
category: ErrorCategory.VoidUseMemo,
|
|
44359
44376
|
reason: 'useMemo() callbacks must return a value',
|
|
44360
44377
|
description: `This ${manualMemo.loadInstr.value.kind === 'PropertyLoad'
|
|
44361
44378
|
? 'React.useMemo'
|
|
@@ -54201,7 +54218,7 @@ function makeRule(rule) {
|
|
|
54201
54218
|
type: 'problem',
|
|
54202
54219
|
docs: {
|
|
54203
54220
|
description: rule.description,
|
|
54204
|
-
recommended: rule.
|
|
54221
|
+
recommended: rule.preset === LintRulePreset.Recommended,
|
|
54205
54222
|
},
|
|
54206
54223
|
fixable: 'code',
|
|
54207
54224
|
hasSuggestions: true,
|
|
@@ -54214,7 +54231,12 @@ const allRules = LintRules.reduce((acc, rule) => {
|
|
|
54214
54231
|
acc[rule.name] = { rule: makeRule(rule), severity: rule.severity };
|
|
54215
54232
|
return acc;
|
|
54216
54233
|
}, {});
|
|
54217
|
-
const recommendedRules = LintRules.filter(rule => rule.
|
|
54234
|
+
const recommendedRules = LintRules.filter(rule => rule.preset === LintRulePreset.Recommended).reduce((acc, rule) => {
|
|
54235
|
+
acc[rule.name] = { rule: makeRule(rule), severity: rule.severity };
|
|
54236
|
+
return acc;
|
|
54237
|
+
}, {});
|
|
54238
|
+
const recommendedLatestRules = LintRules.filter(rule => rule.preset === LintRulePreset.Recommended ||
|
|
54239
|
+
rule.preset === LintRulePreset.RecommendedLatest).reduce((acc, rule) => {
|
|
54218
54240
|
acc[rule.name] = { rule: makeRule(rule), severity: rule.severity };
|
|
54219
54241
|
return acc;
|
|
54220
54242
|
}, {});
|
|
@@ -57526,22 +57548,29 @@ const basicRuleConfigs = {
|
|
|
57526
57548
|
'react-hooks/rules-of-hooks': 'error',
|
|
57527
57549
|
'react-hooks/exhaustive-deps': 'warn',
|
|
57528
57550
|
};
|
|
57529
|
-
const
|
|
57551
|
+
const recommendedCompilerRuleConfigs = Object.fromEntries(Object.entries(recommendedRules).map(([name, ruleConfig]) => {
|
|
57552
|
+
return [
|
|
57553
|
+
`react-hooks/${name}`,
|
|
57554
|
+
mapErrorSeverityToESlint(ruleConfig.severity),
|
|
57555
|
+
];
|
|
57556
|
+
}));
|
|
57557
|
+
const recommendedLatestCompilerRuleConfigs = Object.fromEntries(Object.entries(recommendedLatestRules).map(([name, ruleConfig]) => {
|
|
57530
57558
|
return [
|
|
57531
57559
|
`react-hooks/${name}`,
|
|
57532
57560
|
mapErrorSeverityToESlint(ruleConfig.severity),
|
|
57533
57561
|
];
|
|
57534
57562
|
}));
|
|
57535
|
-
const
|
|
57563
|
+
const recommendedRuleConfigs = Object.assign(Object.assign({}, basicRuleConfigs), recommendedCompilerRuleConfigs);
|
|
57564
|
+
const recommendedLatestRuleConfigs = Object.assign(Object.assign({}, basicRuleConfigs), recommendedLatestCompilerRuleConfigs);
|
|
57536
57565
|
const plugins = ['react-hooks'];
|
|
57537
57566
|
const configs = {
|
|
57538
57567
|
recommended: {
|
|
57539
57568
|
plugins,
|
|
57540
|
-
rules:
|
|
57569
|
+
rules: recommendedRuleConfigs,
|
|
57541
57570
|
},
|
|
57542
57571
|
'recommended-latest': {
|
|
57543
57572
|
plugins,
|
|
57544
|
-
rules:
|
|
57573
|
+
rules: recommendedLatestRuleConfigs,
|
|
57545
57574
|
},
|
|
57546
57575
|
flat: {},
|
|
57547
57576
|
};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eslint-plugin-react-hooks",
|
|
3
3
|
"description": "ESLint rules for React Hooks",
|
|
4
|
-
"version": "
|
|
4
|
+
"version": "7.0.0-canary-4b3e662e-20251008",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
7
7
|
"url": "https://github.com/facebook/react.git",
|