eslint-plugin-react-hooks-extra 1.20.2-next.7 → 1.21.0-beta.0
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 +1 -1
- package/dist/index.d.mts +7 -3
- package/dist/index.d.ts +7 -3
- package/dist/index.js +60 -52
- package/dist/index.mjs +61 -53
- package/package.json +8 -8
package/README.md
CHANGED
|
@@ -30,7 +30,7 @@ export default [
|
|
|
30
30
|
rules: {
|
|
31
31
|
// react-hooks-extra recommended rules
|
|
32
32
|
"react-hooks-extra/no-direct-set-state-in-use-effect": "warn",
|
|
33
|
-
"react-hooks-extra/no-
|
|
33
|
+
"react-hooks-extra/no-useless-custom-hooks": "warn",
|
|
34
34
|
"react-hooks-extra/prefer-use-state-lazy-initialization": "warn",
|
|
35
35
|
},
|
|
36
36
|
},
|
package/dist/index.d.mts
CHANGED
|
@@ -8,14 +8,18 @@ declare const _default: {
|
|
|
8
8
|
readonly rules: {
|
|
9
9
|
readonly "no-direct-set-state-in-use-effect": _typescript_eslint_utils_ts_eslint.RuleModule<"noDirectSetStateInUseEffect", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
10
10
|
readonly "no-direct-set-state-in-use-layout-effect": _typescript_eslint_utils_ts_eslint.RuleModule<"noDirectSetStateInUseLayoutEffect", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
11
|
-
readonly "no-
|
|
11
|
+
readonly "no-useless-custom-hooks": _typescript_eslint_utils_ts_eslint.RuleModule<"noUselessCustomHooks", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
12
12
|
readonly "no-unnecessary-use-callback": _typescript_eslint_utils_ts_eslint.RuleModule<"noUnnecessaryUseCallback", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
13
13
|
readonly "no-unnecessary-use-memo": _typescript_eslint_utils_ts_eslint.RuleModule<"noUnnecessaryUseMemo", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
14
14
|
readonly "prefer-use-state-lazy-initialization": _typescript_eslint_utils_ts_eslint.RuleModule<"preferUseStateLazyInitialization", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
15
|
-
/** @deprecated Use `no-
|
|
16
|
-
readonly "
|
|
15
|
+
/** @deprecated Use `no-useless-custom-hooks` instead */
|
|
16
|
+
readonly "no-redundant-custom-hook": _typescript_eslint_utils_ts_eslint.RuleModule<"noUselessCustomHooks", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
17
|
+
/** @deprecated Use `no-useless-custom-hooks` instead */
|
|
18
|
+
readonly "ensure-custom-hooks-using-other-hooks": _typescript_eslint_utils_ts_eslint.RuleModule<"noUselessCustomHooks", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
17
19
|
/** @deprecated Use `no-unnecessary-use-memo` instead */
|
|
18
20
|
readonly "ensure-use-memo-has-non-empty-deps": _typescript_eslint_utils_ts_eslint.RuleModule<"noUnnecessaryUseMemo", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
21
|
+
/** @deprecated Use `no-unnecessary-use-callback` instead */
|
|
22
|
+
readonly "ensure-use-callback-has-non-empty-deps": _typescript_eslint_utils_ts_eslint.RuleModule<"noUnnecessaryUseCallback", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
19
23
|
};
|
|
20
24
|
};
|
|
21
25
|
|
package/dist/index.d.ts
CHANGED
|
@@ -8,14 +8,18 @@ declare const _default: {
|
|
|
8
8
|
readonly rules: {
|
|
9
9
|
readonly "no-direct-set-state-in-use-effect": _typescript_eslint_utils_ts_eslint.RuleModule<"noDirectSetStateInUseEffect", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
10
10
|
readonly "no-direct-set-state-in-use-layout-effect": _typescript_eslint_utils_ts_eslint.RuleModule<"noDirectSetStateInUseLayoutEffect", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
11
|
-
readonly "no-
|
|
11
|
+
readonly "no-useless-custom-hooks": _typescript_eslint_utils_ts_eslint.RuleModule<"noUselessCustomHooks", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
12
12
|
readonly "no-unnecessary-use-callback": _typescript_eslint_utils_ts_eslint.RuleModule<"noUnnecessaryUseCallback", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
13
13
|
readonly "no-unnecessary-use-memo": _typescript_eslint_utils_ts_eslint.RuleModule<"noUnnecessaryUseMemo", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
14
14
|
readonly "prefer-use-state-lazy-initialization": _typescript_eslint_utils_ts_eslint.RuleModule<"preferUseStateLazyInitialization", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
15
|
-
/** @deprecated Use `no-
|
|
16
|
-
readonly "
|
|
15
|
+
/** @deprecated Use `no-useless-custom-hooks` instead */
|
|
16
|
+
readonly "no-redundant-custom-hook": _typescript_eslint_utils_ts_eslint.RuleModule<"noUselessCustomHooks", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
17
|
+
/** @deprecated Use `no-useless-custom-hooks` instead */
|
|
18
|
+
readonly "ensure-custom-hooks-using-other-hooks": _typescript_eslint_utils_ts_eslint.RuleModule<"noUselessCustomHooks", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
17
19
|
/** @deprecated Use `no-unnecessary-use-memo` instead */
|
|
18
20
|
readonly "ensure-use-memo-has-non-empty-deps": _typescript_eslint_utils_ts_eslint.RuleModule<"noUnnecessaryUseMemo", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
21
|
+
/** @deprecated Use `no-unnecessary-use-callback` instead */
|
|
22
|
+
readonly "ensure-use-callback-has-non-empty-deps": _typescript_eslint_utils_ts_eslint.RuleModule<"noUnnecessaryUseCallback", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
19
23
|
};
|
|
20
24
|
};
|
|
21
25
|
|
package/dist/index.js
CHANGED
|
@@ -31,7 +31,7 @@ var VAR5__namespace = /*#__PURE__*/_interopNamespace(VAR5);
|
|
|
31
31
|
|
|
32
32
|
// package.json
|
|
33
33
|
var name = "eslint-plugin-react-hooks-extra";
|
|
34
|
-
var version = "1.
|
|
34
|
+
var version = "1.21.0-beta.0";
|
|
35
35
|
var createRule = shared.createRuleForPlugin("hooks-extra");
|
|
36
36
|
function isFromHookCall(name2, context, settings, predicate = eff.F.constTrue) {
|
|
37
37
|
const hookAlias = settings.additionalHooks?.[name2] ?? [];
|
|
@@ -475,62 +475,23 @@ var no_direct_set_state_in_use_layout_effect_default = createRule({
|
|
|
475
475
|
},
|
|
476
476
|
defaultOptions: []
|
|
477
477
|
});
|
|
478
|
-
var RULE_NAME3 = "no-
|
|
478
|
+
var RULE_NAME3 = "no-unnecessary-use-callback";
|
|
479
479
|
var RULE_FEATURES3 = [
|
|
480
480
|
"CHK"
|
|
481
481
|
];
|
|
482
|
-
var no_redundant_custom_hook_default = createRule({
|
|
483
|
-
meta: {
|
|
484
|
-
type: "problem",
|
|
485
|
-
docs: {
|
|
486
|
-
description: "enforce custom hooks to use at least one other hook inside",
|
|
487
|
-
[Symbol.for("rule_features")]: RULE_FEATURES3
|
|
488
|
-
},
|
|
489
|
-
messages: {
|
|
490
|
-
noRedundantCustomHook: "A custom hook '{{name}}' should use at least one other hook."
|
|
491
|
-
},
|
|
492
|
-
schema: []
|
|
493
|
-
},
|
|
494
|
-
name: RULE_NAME3,
|
|
495
|
-
create(context) {
|
|
496
|
-
const { ctx, listeners } = core.useHookCollector();
|
|
497
|
-
return {
|
|
498
|
-
...listeners,
|
|
499
|
-
"Program:exit"(node) {
|
|
500
|
-
const allHooks = ctx.getAllHooks(node);
|
|
501
|
-
for (const { name: name2, node: node2, hookCalls } of allHooks.values()) {
|
|
502
|
-
if (AST2__namespace.isEmptyFunction(node2)) continue;
|
|
503
|
-
if (hookCalls.length > 0) continue;
|
|
504
|
-
context.report({
|
|
505
|
-
messageId: "noRedundantCustomHook",
|
|
506
|
-
node: node2,
|
|
507
|
-
data: {
|
|
508
|
-
name: name2.value
|
|
509
|
-
}
|
|
510
|
-
});
|
|
511
|
-
}
|
|
512
|
-
}
|
|
513
|
-
};
|
|
514
|
-
},
|
|
515
|
-
defaultOptions: []
|
|
516
|
-
});
|
|
517
|
-
var RULE_NAME4 = "no-unnecessary-use-callback";
|
|
518
|
-
var RULE_FEATURES4 = [
|
|
519
|
-
"CHK"
|
|
520
|
-
];
|
|
521
482
|
var no_unnecessary_use_callback_default = createRule({
|
|
522
483
|
meta: {
|
|
523
484
|
type: "problem",
|
|
524
485
|
docs: {
|
|
525
486
|
description: "disallow unnecessary usage of 'useCallback'",
|
|
526
|
-
[Symbol.for("rule_features")]:
|
|
487
|
+
[Symbol.for("rule_features")]: RULE_FEATURES3
|
|
527
488
|
},
|
|
528
489
|
messages: {
|
|
529
490
|
noUnnecessaryUseCallback: "An 'useCallback' with empty deps and no references to the component scope may be unnecessary."
|
|
530
491
|
},
|
|
531
492
|
schema: []
|
|
532
493
|
},
|
|
533
|
-
name:
|
|
494
|
+
name: RULE_NAME3,
|
|
534
495
|
create(context) {
|
|
535
496
|
if (!context.sourceCode.text.includes("use")) return {};
|
|
536
497
|
const alias = shared.decodeSettings(context.settings).additionalHooks?.useCallback ?? [];
|
|
@@ -597,8 +558,8 @@ var no_unnecessary_use_callback_default = createRule({
|
|
|
597
558
|
},
|
|
598
559
|
defaultOptions: []
|
|
599
560
|
});
|
|
600
|
-
var
|
|
601
|
-
var
|
|
561
|
+
var RULE_NAME4 = "no-unnecessary-use-memo";
|
|
562
|
+
var RULE_FEATURES4 = [
|
|
602
563
|
"CHK"
|
|
603
564
|
];
|
|
604
565
|
var no_unnecessary_use_memo_default = createRule({
|
|
@@ -606,14 +567,14 @@ var no_unnecessary_use_memo_default = createRule({
|
|
|
606
567
|
type: "problem",
|
|
607
568
|
docs: {
|
|
608
569
|
description: "disallow unnecessary usage of 'useMemo'",
|
|
609
|
-
[Symbol.for("rule_features")]:
|
|
570
|
+
[Symbol.for("rule_features")]: RULE_FEATURES4
|
|
610
571
|
},
|
|
611
572
|
messages: {
|
|
612
573
|
noUnnecessaryUseMemo: "An 'useMemo' with empty deps and no references to the component scope may be unnecessary."
|
|
613
574
|
},
|
|
614
575
|
schema: []
|
|
615
576
|
},
|
|
616
|
-
name:
|
|
577
|
+
name: RULE_NAME4,
|
|
617
578
|
create(context) {
|
|
618
579
|
if (!context.sourceCode.text.includes("use")) return {};
|
|
619
580
|
const alias = shared.decodeSettings(context.settings).additionalHooks?.useMemo ?? [];
|
|
@@ -680,6 +641,49 @@ var no_unnecessary_use_memo_default = createRule({
|
|
|
680
641
|
},
|
|
681
642
|
defaultOptions: []
|
|
682
643
|
});
|
|
644
|
+
var RULE_NAME5 = "no-useless-custom-hooks";
|
|
645
|
+
var RULE_FEATURES5 = [
|
|
646
|
+
"CHK"
|
|
647
|
+
];
|
|
648
|
+
function isNodeContainsUseCallComments(node, context) {
|
|
649
|
+
return context.sourceCode.getCommentsInside(node).some((comment) => /use\w+\(/u.test(comment.value));
|
|
650
|
+
}
|
|
651
|
+
var no_useless_custom_hooks_default = createRule({
|
|
652
|
+
meta: {
|
|
653
|
+
type: "problem",
|
|
654
|
+
docs: {
|
|
655
|
+
description: "enforce custom hooks to use at least one other hook inside",
|
|
656
|
+
[Symbol.for("rule_features")]: RULE_FEATURES5
|
|
657
|
+
},
|
|
658
|
+
messages: {
|
|
659
|
+
noUselessCustomHooks: "A custom hook '{{name}}' should use at least one other hook."
|
|
660
|
+
},
|
|
661
|
+
schema: []
|
|
662
|
+
},
|
|
663
|
+
name: RULE_NAME5,
|
|
664
|
+
create(context) {
|
|
665
|
+
const { ctx, listeners } = core.useHookCollector();
|
|
666
|
+
return {
|
|
667
|
+
...listeners,
|
|
668
|
+
"Program:exit"(node) {
|
|
669
|
+
const allHooks = ctx.getAllHooks(node);
|
|
670
|
+
for (const { name: name2, node: node2, hookCalls } of allHooks.values()) {
|
|
671
|
+
if (AST2__namespace.isEmptyFunction(node2)) continue;
|
|
672
|
+
if (hookCalls.length > 0) continue;
|
|
673
|
+
if (isNodeContainsUseCallComments(node2, context)) continue;
|
|
674
|
+
context.report({
|
|
675
|
+
messageId: "noUselessCustomHooks",
|
|
676
|
+
node: node2,
|
|
677
|
+
data: {
|
|
678
|
+
name: name2.value
|
|
679
|
+
}
|
|
680
|
+
});
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
};
|
|
684
|
+
},
|
|
685
|
+
defaultOptions: []
|
|
686
|
+
});
|
|
683
687
|
var RULE_NAME6 = "prefer-use-state-lazy-initialization";
|
|
684
688
|
var RULE_FEATURES6 = [
|
|
685
689
|
"CHK"
|
|
@@ -734,15 +738,19 @@ var src_default = {
|
|
|
734
738
|
rules: {
|
|
735
739
|
"no-direct-set-state-in-use-effect": no_direct_set_state_in_use_effect_default,
|
|
736
740
|
"no-direct-set-state-in-use-layout-effect": no_direct_set_state_in_use_layout_effect_default,
|
|
737
|
-
"no-
|
|
741
|
+
"no-useless-custom-hooks": no_useless_custom_hooks_default,
|
|
738
742
|
"no-unnecessary-use-callback": no_unnecessary_use_callback_default,
|
|
739
743
|
"no-unnecessary-use-memo": no_unnecessary_use_memo_default,
|
|
740
744
|
"prefer-use-state-lazy-initialization": prefer_use_state_lazy_initialization_default,
|
|
741
|
-
// Deprecated
|
|
742
|
-
/** @deprecated Use `no-
|
|
743
|
-
"
|
|
745
|
+
// Deprecated rules
|
|
746
|
+
/** @deprecated Use `no-useless-custom-hooks` instead */
|
|
747
|
+
"no-redundant-custom-hook": no_useless_custom_hooks_default,
|
|
748
|
+
/** @deprecated Use `no-useless-custom-hooks` instead */
|
|
749
|
+
"ensure-custom-hooks-using-other-hooks": no_useless_custom_hooks_default,
|
|
744
750
|
/** @deprecated Use `no-unnecessary-use-memo` instead */
|
|
745
|
-
"ensure-use-memo-has-non-empty-deps": no_unnecessary_use_memo_default
|
|
751
|
+
"ensure-use-memo-has-non-empty-deps": no_unnecessary_use_memo_default,
|
|
752
|
+
/** @deprecated Use `no-unnecessary-use-callback` instead */
|
|
753
|
+
"ensure-use-callback-has-non-empty-deps": no_unnecessary_use_callback_default
|
|
746
754
|
}
|
|
747
755
|
};
|
|
748
756
|
|
package/dist/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as AST2 from '@eslint-react/ast';
|
|
2
|
-
import { isReactHookCallWithNameAlias,
|
|
2
|
+
import { isReactHookCallWithNameAlias, isReactHookCall, isUseCallbackCall, isReactHookCallWithNameLoose, isUseMemoCall, useHookCollector, isUseStateCall, isReactHookName } from '@eslint-react/core';
|
|
3
3
|
import { MutRef, O, F } from '@eslint-react/eff';
|
|
4
4
|
import { createRuleForPlugin, decodeSettings } from '@eslint-react/shared';
|
|
5
5
|
import * as VAR5 from '@eslint-react/var';
|
|
@@ -8,7 +8,7 @@ import { match, isMatching } from 'ts-pattern';
|
|
|
8
8
|
|
|
9
9
|
// package.json
|
|
10
10
|
var name = "eslint-plugin-react-hooks-extra";
|
|
11
|
-
var version = "1.
|
|
11
|
+
var version = "1.21.0-beta.0";
|
|
12
12
|
var createRule = createRuleForPlugin("hooks-extra");
|
|
13
13
|
function isFromHookCall(name2, context, settings, predicate = F.constTrue) {
|
|
14
14
|
const hookAlias = settings.additionalHooks?.[name2] ?? [];
|
|
@@ -452,62 +452,23 @@ var no_direct_set_state_in_use_layout_effect_default = createRule({
|
|
|
452
452
|
},
|
|
453
453
|
defaultOptions: []
|
|
454
454
|
});
|
|
455
|
-
var RULE_NAME3 = "no-
|
|
455
|
+
var RULE_NAME3 = "no-unnecessary-use-callback";
|
|
456
456
|
var RULE_FEATURES3 = [
|
|
457
457
|
"CHK"
|
|
458
458
|
];
|
|
459
|
-
var no_redundant_custom_hook_default = createRule({
|
|
460
|
-
meta: {
|
|
461
|
-
type: "problem",
|
|
462
|
-
docs: {
|
|
463
|
-
description: "enforce custom hooks to use at least one other hook inside",
|
|
464
|
-
[Symbol.for("rule_features")]: RULE_FEATURES3
|
|
465
|
-
},
|
|
466
|
-
messages: {
|
|
467
|
-
noRedundantCustomHook: "A custom hook '{{name}}' should use at least one other hook."
|
|
468
|
-
},
|
|
469
|
-
schema: []
|
|
470
|
-
},
|
|
471
|
-
name: RULE_NAME3,
|
|
472
|
-
create(context) {
|
|
473
|
-
const { ctx, listeners } = useHookCollector();
|
|
474
|
-
return {
|
|
475
|
-
...listeners,
|
|
476
|
-
"Program:exit"(node) {
|
|
477
|
-
const allHooks = ctx.getAllHooks(node);
|
|
478
|
-
for (const { name: name2, node: node2, hookCalls } of allHooks.values()) {
|
|
479
|
-
if (AST2.isEmptyFunction(node2)) continue;
|
|
480
|
-
if (hookCalls.length > 0) continue;
|
|
481
|
-
context.report({
|
|
482
|
-
messageId: "noRedundantCustomHook",
|
|
483
|
-
node: node2,
|
|
484
|
-
data: {
|
|
485
|
-
name: name2.value
|
|
486
|
-
}
|
|
487
|
-
});
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
};
|
|
491
|
-
},
|
|
492
|
-
defaultOptions: []
|
|
493
|
-
});
|
|
494
|
-
var RULE_NAME4 = "no-unnecessary-use-callback";
|
|
495
|
-
var RULE_FEATURES4 = [
|
|
496
|
-
"CHK"
|
|
497
|
-
];
|
|
498
459
|
var no_unnecessary_use_callback_default = createRule({
|
|
499
460
|
meta: {
|
|
500
461
|
type: "problem",
|
|
501
462
|
docs: {
|
|
502
463
|
description: "disallow unnecessary usage of 'useCallback'",
|
|
503
|
-
[Symbol.for("rule_features")]:
|
|
464
|
+
[Symbol.for("rule_features")]: RULE_FEATURES3
|
|
504
465
|
},
|
|
505
466
|
messages: {
|
|
506
467
|
noUnnecessaryUseCallback: "An 'useCallback' with empty deps and no references to the component scope may be unnecessary."
|
|
507
468
|
},
|
|
508
469
|
schema: []
|
|
509
470
|
},
|
|
510
|
-
name:
|
|
471
|
+
name: RULE_NAME3,
|
|
511
472
|
create(context) {
|
|
512
473
|
if (!context.sourceCode.text.includes("use")) return {};
|
|
513
474
|
const alias = decodeSettings(context.settings).additionalHooks?.useCallback ?? [];
|
|
@@ -574,8 +535,8 @@ var no_unnecessary_use_callback_default = createRule({
|
|
|
574
535
|
},
|
|
575
536
|
defaultOptions: []
|
|
576
537
|
});
|
|
577
|
-
var
|
|
578
|
-
var
|
|
538
|
+
var RULE_NAME4 = "no-unnecessary-use-memo";
|
|
539
|
+
var RULE_FEATURES4 = [
|
|
579
540
|
"CHK"
|
|
580
541
|
];
|
|
581
542
|
var no_unnecessary_use_memo_default = createRule({
|
|
@@ -583,14 +544,14 @@ var no_unnecessary_use_memo_default = createRule({
|
|
|
583
544
|
type: "problem",
|
|
584
545
|
docs: {
|
|
585
546
|
description: "disallow unnecessary usage of 'useMemo'",
|
|
586
|
-
[Symbol.for("rule_features")]:
|
|
547
|
+
[Symbol.for("rule_features")]: RULE_FEATURES4
|
|
587
548
|
},
|
|
588
549
|
messages: {
|
|
589
550
|
noUnnecessaryUseMemo: "An 'useMemo' with empty deps and no references to the component scope may be unnecessary."
|
|
590
551
|
},
|
|
591
552
|
schema: []
|
|
592
553
|
},
|
|
593
|
-
name:
|
|
554
|
+
name: RULE_NAME4,
|
|
594
555
|
create(context) {
|
|
595
556
|
if (!context.sourceCode.text.includes("use")) return {};
|
|
596
557
|
const alias = decodeSettings(context.settings).additionalHooks?.useMemo ?? [];
|
|
@@ -657,6 +618,49 @@ var no_unnecessary_use_memo_default = createRule({
|
|
|
657
618
|
},
|
|
658
619
|
defaultOptions: []
|
|
659
620
|
});
|
|
621
|
+
var RULE_NAME5 = "no-useless-custom-hooks";
|
|
622
|
+
var RULE_FEATURES5 = [
|
|
623
|
+
"CHK"
|
|
624
|
+
];
|
|
625
|
+
function isNodeContainsUseCallComments(node, context) {
|
|
626
|
+
return context.sourceCode.getCommentsInside(node).some((comment) => /use\w+\(/u.test(comment.value));
|
|
627
|
+
}
|
|
628
|
+
var no_useless_custom_hooks_default = createRule({
|
|
629
|
+
meta: {
|
|
630
|
+
type: "problem",
|
|
631
|
+
docs: {
|
|
632
|
+
description: "enforce custom hooks to use at least one other hook inside",
|
|
633
|
+
[Symbol.for("rule_features")]: RULE_FEATURES5
|
|
634
|
+
},
|
|
635
|
+
messages: {
|
|
636
|
+
noUselessCustomHooks: "A custom hook '{{name}}' should use at least one other hook."
|
|
637
|
+
},
|
|
638
|
+
schema: []
|
|
639
|
+
},
|
|
640
|
+
name: RULE_NAME5,
|
|
641
|
+
create(context) {
|
|
642
|
+
const { ctx, listeners } = useHookCollector();
|
|
643
|
+
return {
|
|
644
|
+
...listeners,
|
|
645
|
+
"Program:exit"(node) {
|
|
646
|
+
const allHooks = ctx.getAllHooks(node);
|
|
647
|
+
for (const { name: name2, node: node2, hookCalls } of allHooks.values()) {
|
|
648
|
+
if (AST2.isEmptyFunction(node2)) continue;
|
|
649
|
+
if (hookCalls.length > 0) continue;
|
|
650
|
+
if (isNodeContainsUseCallComments(node2, context)) continue;
|
|
651
|
+
context.report({
|
|
652
|
+
messageId: "noUselessCustomHooks",
|
|
653
|
+
node: node2,
|
|
654
|
+
data: {
|
|
655
|
+
name: name2.value
|
|
656
|
+
}
|
|
657
|
+
});
|
|
658
|
+
}
|
|
659
|
+
}
|
|
660
|
+
};
|
|
661
|
+
},
|
|
662
|
+
defaultOptions: []
|
|
663
|
+
});
|
|
660
664
|
var RULE_NAME6 = "prefer-use-state-lazy-initialization";
|
|
661
665
|
var RULE_FEATURES6 = [
|
|
662
666
|
"CHK"
|
|
@@ -711,15 +715,19 @@ var src_default = {
|
|
|
711
715
|
rules: {
|
|
712
716
|
"no-direct-set-state-in-use-effect": no_direct_set_state_in_use_effect_default,
|
|
713
717
|
"no-direct-set-state-in-use-layout-effect": no_direct_set_state_in_use_layout_effect_default,
|
|
714
|
-
"no-
|
|
718
|
+
"no-useless-custom-hooks": no_useless_custom_hooks_default,
|
|
715
719
|
"no-unnecessary-use-callback": no_unnecessary_use_callback_default,
|
|
716
720
|
"no-unnecessary-use-memo": no_unnecessary_use_memo_default,
|
|
717
721
|
"prefer-use-state-lazy-initialization": prefer_use_state_lazy_initialization_default,
|
|
718
|
-
// Deprecated
|
|
719
|
-
/** @deprecated Use `no-
|
|
720
|
-
"
|
|
722
|
+
// Deprecated rules
|
|
723
|
+
/** @deprecated Use `no-useless-custom-hooks` instead */
|
|
724
|
+
"no-redundant-custom-hook": no_useless_custom_hooks_default,
|
|
725
|
+
/** @deprecated Use `no-useless-custom-hooks` instead */
|
|
726
|
+
"ensure-custom-hooks-using-other-hooks": no_useless_custom_hooks_default,
|
|
721
727
|
/** @deprecated Use `no-unnecessary-use-memo` instead */
|
|
722
|
-
"ensure-use-memo-has-non-empty-deps": no_unnecessary_use_memo_default
|
|
728
|
+
"ensure-use-memo-has-non-empty-deps": no_unnecessary_use_memo_default,
|
|
729
|
+
/** @deprecated Use `no-unnecessary-use-callback` instead */
|
|
730
|
+
"ensure-use-callback-has-non-empty-deps": no_unnecessary_use_callback_default
|
|
723
731
|
}
|
|
724
732
|
};
|
|
725
733
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eslint-plugin-react-hooks-extra",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.21.0-beta.0",
|
|
4
4
|
"description": "ESLint React's ESLint plugin for React Hooks related rules.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"react",
|
|
@@ -49,13 +49,13 @@
|
|
|
49
49
|
"@typescript-eslint/types": "^8.18.1",
|
|
50
50
|
"@typescript-eslint/utils": "^8.18.1",
|
|
51
51
|
"ts-pattern": "^5.6.0",
|
|
52
|
-
"@eslint-react/
|
|
53
|
-
"@eslint-react/
|
|
54
|
-
"@eslint-react/jsx": "1.
|
|
55
|
-
"@eslint-react/
|
|
56
|
-
"@eslint-react/
|
|
57
|
-
"@eslint-react/
|
|
58
|
-
"@eslint-react/var": "1.
|
|
52
|
+
"@eslint-react/core": "1.21.0-beta.0",
|
|
53
|
+
"@eslint-react/ast": "1.21.0-beta.0",
|
|
54
|
+
"@eslint-react/jsx": "1.21.0-beta.0",
|
|
55
|
+
"@eslint-react/eff": "1.21.0-beta.0",
|
|
56
|
+
"@eslint-react/types": "1.21.0-beta.0",
|
|
57
|
+
"@eslint-react/shared": "1.21.0-beta.0",
|
|
58
|
+
"@eslint-react/var": "1.21.0-beta.0"
|
|
59
59
|
},
|
|
60
60
|
"devDependencies": {
|
|
61
61
|
"@types/react": "^19.0.2",
|