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
- recommended: false,
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
- recommended: false,
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
- recommended: true,
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
- recommended: false,
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
- recommended: false,
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
- recommended: true,
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
- recommended: true,
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
- recommended: true,
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
- recommended: false,
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
- recommended: false,
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
- recommended: true,
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
- recommended: true,
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
- recommended: false,
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
- recommended: true,
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
- recommended: false,
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
- recommended: true,
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
- recommended: true,
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
- recommended: true,
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
- recommended: true,
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
- recommended: true,
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
- recommended: false,
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
- recommended: false,
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
- recommended: false,
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
- recommended: true,
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
- recommended: true,
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
- recommended: true,
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.UseMemo,
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.recommended,
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.recommended).reduce((acc, 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 compilerRuleConfigs = Object.fromEntries(Object.entries(recommendedRules).map(([name, ruleConfig]) => {
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 allRuleConfigs = Object.assign(Object.assign({}, basicRuleConfigs), compilerRuleConfigs);
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: allRuleConfigs,
57742
+ rules: recommendedRuleConfigs,
57714
57743
  },
57715
57744
  'recommended-latest': {
57716
57745
  plugins,
57717
- rules: allRuleConfigs,
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
- recommended: false,
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
- recommended: false,
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
- recommended: true,
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
- recommended: false,
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
- recommended: false,
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
- recommended: true,
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
- recommended: true,
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
- recommended: true,
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
- recommended: false,
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
- recommended: false,
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
- recommended: true,
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
- recommended: true,
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
- recommended: false,
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
- recommended: true,
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
- recommended: false,
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
- recommended: true,
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
- recommended: true,
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
- recommended: true,
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
- recommended: true,
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
- recommended: true,
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
- recommended: false,
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
- recommended: false,
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
- recommended: false,
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
- recommended: true,
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
- recommended: true,
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
- recommended: true,
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.UseMemo,
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.recommended,
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.recommended).reduce((acc, 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 compilerRuleConfigs = Object.fromEntries(Object.entries(recommendedRules).map(([name, ruleConfig]) => {
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 allRuleConfigs = Object.assign(Object.assign({}, basicRuleConfigs), compilerRuleConfigs);
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: allRuleConfigs,
57569
+ rules: recommendedRuleConfigs,
57541
57570
  },
57542
57571
  'recommended-latest': {
57543
57572
  plugins,
57544
- rules: allRuleConfigs,
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": "6.2.0-canary-03c6454d-20251008",
4
+ "version": "7.0.0-canary-4b3e662e-20251008",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "https://github.com/facebook/react.git",