eslint-plugin-react-x 1.23.1 → 1.23.2-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +27 -11
- package/dist/index.mjs +28 -12
- package/package.json +8 -8
package/dist/index.js
CHANGED
|
@@ -42,7 +42,7 @@ var ts__default = /*#__PURE__*/_interopDefault(ts);
|
|
|
42
42
|
|
|
43
43
|
// package.json
|
|
44
44
|
var name = "eslint-plugin-react-x";
|
|
45
|
-
var version = "1.23.
|
|
45
|
+
var version = "1.23.2-beta.2";
|
|
46
46
|
var createRule = shared.createRuleForPlugin("x");
|
|
47
47
|
|
|
48
48
|
// src/rules/avoid-shorthand-boolean.ts
|
|
@@ -906,7 +906,7 @@ var no_context_provider_default = createRule({
|
|
|
906
906
|
name: RULE_NAME19,
|
|
907
907
|
create(context) {
|
|
908
908
|
if (!context.sourceCode.text.includes(".Provider")) return {};
|
|
909
|
-
const { version: version2 } = shared.
|
|
909
|
+
const { version: version2 } = shared.getSettingsFromContext(context);
|
|
910
910
|
if (compareVersions.compare(version2, "19.0.0", "<")) return {};
|
|
911
911
|
return {
|
|
912
912
|
JSXElement(node) {
|
|
@@ -1202,7 +1202,7 @@ var no_forward_ref_default = createRule({
|
|
|
1202
1202
|
name: RULE_NAME25,
|
|
1203
1203
|
create(context) {
|
|
1204
1204
|
if (!context.sourceCode.text.includes("forwardRef")) return {};
|
|
1205
|
-
const { version: version2 } = shared.
|
|
1205
|
+
const { version: version2 } = shared.getSettingsFromContext(context);
|
|
1206
1206
|
if (compareVersions.compare(version2, "19.0.0", "<")) return {};
|
|
1207
1207
|
return {
|
|
1208
1208
|
CallExpression(node) {
|
|
@@ -1425,7 +1425,7 @@ var no_leaked_conditional_rendering_default = createRule({
|
|
|
1425
1425
|
name: RULE_NAME27,
|
|
1426
1426
|
create(context) {
|
|
1427
1427
|
if (!context.sourceCode.text.includes("&&") && !context.sourceCode.text.includes("?")) return {};
|
|
1428
|
-
const { version: version2 } = shared.
|
|
1428
|
+
const { version: version2 } = shared.getSettingsFromContext(context);
|
|
1429
1429
|
const allowedVariants = [
|
|
1430
1430
|
"any",
|
|
1431
1431
|
"boolean",
|
|
@@ -2562,7 +2562,10 @@ function checkAndReport(node, context, allowExpressions) {
|
|
|
2562
2562
|
const initialScope = context.sourceCode.getScope(node);
|
|
2563
2563
|
if (JSX7__namespace.isKeyedElement(node, initialScope)) return;
|
|
2564
2564
|
if (JSX7__namespace.isBuiltInElement(node.parent)) context.report({ messageId: "noUselessFragmentInBuiltIn", node });
|
|
2565
|
-
if (node.children.length === 0)
|
|
2565
|
+
if (node.children.length === 0) {
|
|
2566
|
+
context.report({ messageId: "noUselessFragment", node });
|
|
2567
|
+
return;
|
|
2568
|
+
}
|
|
2566
2569
|
const isChildElement = AST11__namespace.isOneOf([types.AST_NODE_TYPES.JSXElement, types.AST_NODE_TYPES.JSXFragment])(node.parent);
|
|
2567
2570
|
switch (true) {
|
|
2568
2571
|
// <Foo content={<>ee eeee eeee ...</>} />
|
|
@@ -2571,10 +2574,12 @@ function checkAndReport(node, context, allowExpressions) {
|
|
|
2571
2574
|
}
|
|
2572
2575
|
// <Foo><>hello, world</></Foo>
|
|
2573
2576
|
case (!allowExpressions && isChildElement): {
|
|
2574
|
-
|
|
2577
|
+
context.report({ messageId: "noUselessFragment", node });
|
|
2578
|
+
return;
|
|
2575
2579
|
}
|
|
2576
2580
|
case (!allowExpressions && !isChildElement && node.children.length === 1): {
|
|
2577
|
-
|
|
2581
|
+
context.report({ messageId: "noUselessFragment", node });
|
|
2582
|
+
return;
|
|
2578
2583
|
}
|
|
2579
2584
|
}
|
|
2580
2585
|
const nonPaddingChildren = node.children.filter((child) => !JSX7__namespace.isPaddingSpaces(child));
|
|
@@ -2582,7 +2587,8 @@ function checkAndReport(node, context, allowExpressions) {
|
|
|
2582
2587
|
switch (true) {
|
|
2583
2588
|
case nonPaddingChildren.length === 0:
|
|
2584
2589
|
case (nonPaddingChildren.length === 1 && firstNonPaddingChild?.type !== types.AST_NODE_TYPES.JSXExpressionContainer): {
|
|
2585
|
-
|
|
2590
|
+
context.report({ messageId: "noUselessFragment", node });
|
|
2591
|
+
return;
|
|
2586
2592
|
}
|
|
2587
2593
|
}
|
|
2588
2594
|
return;
|
|
@@ -2718,7 +2724,7 @@ var prefer_react_namespace_import_default = createRule({
|
|
|
2718
2724
|
},
|
|
2719
2725
|
name: RULE_NAME46,
|
|
2720
2726
|
create(context) {
|
|
2721
|
-
const importSource = shared.
|
|
2727
|
+
const importSource = shared.getSettingsFromContext(context).importSource ?? "react";
|
|
2722
2728
|
return {
|
|
2723
2729
|
[`ImportDeclaration[source.value="${importSource}"] ImportDefaultSpecifier`](node) {
|
|
2724
2730
|
const hasOtherSpecifiers = node.parent.specifiers.length > 1;
|
|
@@ -2839,7 +2845,8 @@ var prefer_shorthand_boolean_default = createRule({
|
|
|
2839
2845
|
});
|
|
2840
2846
|
var RULE_NAME49 = "prefer-shorthand-fragment";
|
|
2841
2847
|
var RULE_FEATURES48 = [
|
|
2842
|
-
"CHK"
|
|
2848
|
+
"CHK",
|
|
2849
|
+
"FIX"
|
|
2843
2850
|
];
|
|
2844
2851
|
var prefer_shorthand_fragment_default = createRule({
|
|
2845
2852
|
meta: {
|
|
@@ -2848,6 +2855,7 @@ var prefer_shorthand_fragment_default = createRule({
|
|
|
2848
2855
|
description: "enforce using fragment syntax instead of 'Fragment' component",
|
|
2849
2856
|
[Symbol.for("rule_features")]: RULE_FEATURES48
|
|
2850
2857
|
},
|
|
2858
|
+
fixable: "code",
|
|
2851
2859
|
messages: {
|
|
2852
2860
|
preferShorthandFragment: "Use fragment shorthand syntax instead of 'Fragment' component."
|
|
2853
2861
|
},
|
|
@@ -2861,7 +2869,15 @@ var prefer_shorthand_fragment_default = createRule({
|
|
|
2861
2869
|
if (hasAttributes) return eff.O.none();
|
|
2862
2870
|
return eff.O.some({
|
|
2863
2871
|
messageId: "preferShorthandFragment",
|
|
2864
|
-
node
|
|
2872
|
+
node,
|
|
2873
|
+
fix: (fixer) => {
|
|
2874
|
+
const { closingElement, openingElement } = node;
|
|
2875
|
+
if (!closingElement) return [];
|
|
2876
|
+
return [
|
|
2877
|
+
fixer.replaceTextRange([openingElement.range[0], openingElement.range[1]], "<>"),
|
|
2878
|
+
fixer.replaceTextRange([closingElement.range[0], closingElement.range[1]], "</>")
|
|
2879
|
+
];
|
|
2880
|
+
}
|
|
2865
2881
|
});
|
|
2866
2882
|
}
|
|
2867
2883
|
return {
|
package/dist/index.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { F, O, or, isString, isNullable } from '@eslint-react/eff';
|
|
2
2
|
import * as JSX7 from '@eslint-react/jsx';
|
|
3
|
-
import { createRuleForPlugin,
|
|
3
|
+
import { createRuleForPlugin, getSettingsFromContext, unsafeReadSettings } from '@eslint-react/shared';
|
|
4
4
|
import * as AST11 from '@eslint-react/ast';
|
|
5
5
|
import { isForwardRefCall, isThisSetState, isClassComponent, isCreateElementCall, isCloneElementCall, isChildrenCount, isChildrenForEach, isChildrenMap, isChildrenOnly, isChildrenToArray, useComponentCollectorLegacy, isCreateRefCall, isComponentName, useComponentCollector, ERFunctionComponentFlag, isChildrenToArrayCall, ERComponentHint, isDirectValueOfRenderPropertyLoose, isDeclaredInRenderPropLoose, isInsideCreateElementProps, isInsideRenderMethod, ERClassComponentFlag, isReactHookCall, isInitializedFromReact } from '@eslint-react/core';
|
|
6
6
|
import { AST_NODE_TYPES } from '@typescript-eslint/types';
|
|
@@ -15,7 +15,7 @@ import { getTypeImmutability, isUnknown, isImmutable, isReadonlyShallow, isReado
|
|
|
15
15
|
|
|
16
16
|
// package.json
|
|
17
17
|
var name = "eslint-plugin-react-x";
|
|
18
|
-
var version = "1.23.
|
|
18
|
+
var version = "1.23.2-beta.2";
|
|
19
19
|
var createRule = createRuleForPlugin("x");
|
|
20
20
|
|
|
21
21
|
// src/rules/avoid-shorthand-boolean.ts
|
|
@@ -879,7 +879,7 @@ var no_context_provider_default = createRule({
|
|
|
879
879
|
name: RULE_NAME19,
|
|
880
880
|
create(context) {
|
|
881
881
|
if (!context.sourceCode.text.includes(".Provider")) return {};
|
|
882
|
-
const { version: version2 } =
|
|
882
|
+
const { version: version2 } = getSettingsFromContext(context);
|
|
883
883
|
if (compare(version2, "19.0.0", "<")) return {};
|
|
884
884
|
return {
|
|
885
885
|
JSXElement(node) {
|
|
@@ -1175,7 +1175,7 @@ var no_forward_ref_default = createRule({
|
|
|
1175
1175
|
name: RULE_NAME25,
|
|
1176
1176
|
create(context) {
|
|
1177
1177
|
if (!context.sourceCode.text.includes("forwardRef")) return {};
|
|
1178
|
-
const { version: version2 } =
|
|
1178
|
+
const { version: version2 } = getSettingsFromContext(context);
|
|
1179
1179
|
if (compare(version2, "19.0.0", "<")) return {};
|
|
1180
1180
|
return {
|
|
1181
1181
|
CallExpression(node) {
|
|
@@ -1398,7 +1398,7 @@ var no_leaked_conditional_rendering_default = createRule({
|
|
|
1398
1398
|
name: RULE_NAME27,
|
|
1399
1399
|
create(context) {
|
|
1400
1400
|
if (!context.sourceCode.text.includes("&&") && !context.sourceCode.text.includes("?")) return {};
|
|
1401
|
-
const { version: version2 } =
|
|
1401
|
+
const { version: version2 } = getSettingsFromContext(context);
|
|
1402
1402
|
const allowedVariants = [
|
|
1403
1403
|
"any",
|
|
1404
1404
|
"boolean",
|
|
@@ -2535,7 +2535,10 @@ function checkAndReport(node, context, allowExpressions) {
|
|
|
2535
2535
|
const initialScope = context.sourceCode.getScope(node);
|
|
2536
2536
|
if (JSX7.isKeyedElement(node, initialScope)) return;
|
|
2537
2537
|
if (JSX7.isBuiltInElement(node.parent)) context.report({ messageId: "noUselessFragmentInBuiltIn", node });
|
|
2538
|
-
if (node.children.length === 0)
|
|
2538
|
+
if (node.children.length === 0) {
|
|
2539
|
+
context.report({ messageId: "noUselessFragment", node });
|
|
2540
|
+
return;
|
|
2541
|
+
}
|
|
2539
2542
|
const isChildElement = AST11.isOneOf([AST_NODE_TYPES.JSXElement, AST_NODE_TYPES.JSXFragment])(node.parent);
|
|
2540
2543
|
switch (true) {
|
|
2541
2544
|
// <Foo content={<>ee eeee eeee ...</>} />
|
|
@@ -2544,10 +2547,12 @@ function checkAndReport(node, context, allowExpressions) {
|
|
|
2544
2547
|
}
|
|
2545
2548
|
// <Foo><>hello, world</></Foo>
|
|
2546
2549
|
case (!allowExpressions && isChildElement): {
|
|
2547
|
-
|
|
2550
|
+
context.report({ messageId: "noUselessFragment", node });
|
|
2551
|
+
return;
|
|
2548
2552
|
}
|
|
2549
2553
|
case (!allowExpressions && !isChildElement && node.children.length === 1): {
|
|
2550
|
-
|
|
2554
|
+
context.report({ messageId: "noUselessFragment", node });
|
|
2555
|
+
return;
|
|
2551
2556
|
}
|
|
2552
2557
|
}
|
|
2553
2558
|
const nonPaddingChildren = node.children.filter((child) => !JSX7.isPaddingSpaces(child));
|
|
@@ -2555,7 +2560,8 @@ function checkAndReport(node, context, allowExpressions) {
|
|
|
2555
2560
|
switch (true) {
|
|
2556
2561
|
case nonPaddingChildren.length === 0:
|
|
2557
2562
|
case (nonPaddingChildren.length === 1 && firstNonPaddingChild?.type !== AST_NODE_TYPES.JSXExpressionContainer): {
|
|
2558
|
-
|
|
2563
|
+
context.report({ messageId: "noUselessFragment", node });
|
|
2564
|
+
return;
|
|
2559
2565
|
}
|
|
2560
2566
|
}
|
|
2561
2567
|
return;
|
|
@@ -2691,7 +2697,7 @@ var prefer_react_namespace_import_default = createRule({
|
|
|
2691
2697
|
},
|
|
2692
2698
|
name: RULE_NAME46,
|
|
2693
2699
|
create(context) {
|
|
2694
|
-
const importSource =
|
|
2700
|
+
const importSource = getSettingsFromContext(context).importSource ?? "react";
|
|
2695
2701
|
return {
|
|
2696
2702
|
[`ImportDeclaration[source.value="${importSource}"] ImportDefaultSpecifier`](node) {
|
|
2697
2703
|
const hasOtherSpecifiers = node.parent.specifiers.length > 1;
|
|
@@ -2812,7 +2818,8 @@ var prefer_shorthand_boolean_default = createRule({
|
|
|
2812
2818
|
});
|
|
2813
2819
|
var RULE_NAME49 = "prefer-shorthand-fragment";
|
|
2814
2820
|
var RULE_FEATURES48 = [
|
|
2815
|
-
"CHK"
|
|
2821
|
+
"CHK",
|
|
2822
|
+
"FIX"
|
|
2816
2823
|
];
|
|
2817
2824
|
var prefer_shorthand_fragment_default = createRule({
|
|
2818
2825
|
meta: {
|
|
@@ -2821,6 +2828,7 @@ var prefer_shorthand_fragment_default = createRule({
|
|
|
2821
2828
|
description: "enforce using fragment syntax instead of 'Fragment' component",
|
|
2822
2829
|
[Symbol.for("rule_features")]: RULE_FEATURES48
|
|
2823
2830
|
},
|
|
2831
|
+
fixable: "code",
|
|
2824
2832
|
messages: {
|
|
2825
2833
|
preferShorthandFragment: "Use fragment shorthand syntax instead of 'Fragment' component."
|
|
2826
2834
|
},
|
|
@@ -2834,7 +2842,15 @@ var prefer_shorthand_fragment_default = createRule({
|
|
|
2834
2842
|
if (hasAttributes) return O.none();
|
|
2835
2843
|
return O.some({
|
|
2836
2844
|
messageId: "preferShorthandFragment",
|
|
2837
|
-
node
|
|
2845
|
+
node,
|
|
2846
|
+
fix: (fixer) => {
|
|
2847
|
+
const { closingElement, openingElement } = node;
|
|
2848
|
+
if (!closingElement) return [];
|
|
2849
|
+
return [
|
|
2850
|
+
fixer.replaceTextRange([openingElement.range[0], openingElement.range[1]], "<>"),
|
|
2851
|
+
fixer.replaceTextRange([closingElement.range[0], closingElement.range[1]], "</>")
|
|
2852
|
+
];
|
|
2853
|
+
}
|
|
2838
2854
|
});
|
|
2839
2855
|
}
|
|
2840
2856
|
return {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eslint-plugin-react-x",
|
|
3
|
-
"version": "1.23.
|
|
3
|
+
"version": "1.23.2-beta.2",
|
|
4
4
|
"description": "A set of composable ESLint rules for libraries and frameworks that use React as a UI runtime.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"react",
|
|
@@ -49,13 +49,13 @@
|
|
|
49
49
|
"string-ts": "^2.2.0",
|
|
50
50
|
"ts-api-utils": "^2.0.0",
|
|
51
51
|
"ts-pattern": "^5.6.0",
|
|
52
|
-
"@eslint-react/ast": "1.23.
|
|
53
|
-
"@eslint-react/core": "1.23.
|
|
54
|
-
"@eslint-react/
|
|
55
|
-
"@eslint-react/
|
|
56
|
-
"@eslint-react/
|
|
57
|
-
"@eslint-react/
|
|
58
|
-
"@eslint-react/var": "1.23.
|
|
52
|
+
"@eslint-react/ast": "1.23.2-beta.2",
|
|
53
|
+
"@eslint-react/core": "1.23.2-beta.2",
|
|
54
|
+
"@eslint-react/jsx": "1.23.2-beta.2",
|
|
55
|
+
"@eslint-react/eff": "1.23.2-beta.2",
|
|
56
|
+
"@eslint-react/types": "1.23.2-beta.2",
|
|
57
|
+
"@eslint-react/shared": "1.23.2-beta.2",
|
|
58
|
+
"@eslint-react/var": "1.23.2-beta.2"
|
|
59
59
|
},
|
|
60
60
|
"devDependencies": {
|
|
61
61
|
"@types/react": "^19.0.2",
|