eslint-plugin-react-x 1.23.1-next.6 → 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 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.1-next.6";
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.normalizeSettings(shared.decodeSettings(context.settings));
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.normalizeSettings(shared.decodeSettings(context.settings));
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.normalizeSettings(shared.decodeSettings(context.settings));
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) return context.report({ messageId: "noUselessFragment", node });
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
- return context.report({ messageId: "noUselessFragment", node });
2577
+ context.report({ messageId: "noUselessFragment", node });
2578
+ return;
2575
2579
  }
2576
2580
  case (!allowExpressions && !isChildElement && node.children.length === 1): {
2577
- return context.report({ messageId: "noUselessFragment", node });
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
- return context.report({ messageId: "noUselessFragment", node });
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.decodeSettings(context.settings).importSource ?? "react";
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, normalizeSettings, decodeSettings, unsafeReadSettings } from '@eslint-react/shared';
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.1-next.6";
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 } = normalizeSettings(decodeSettings(context.settings));
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 } = normalizeSettings(decodeSettings(context.settings));
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 } = normalizeSettings(decodeSettings(context.settings));
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) return context.report({ messageId: "noUselessFragment", node });
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
- return context.report({ messageId: "noUselessFragment", node });
2550
+ context.report({ messageId: "noUselessFragment", node });
2551
+ return;
2548
2552
  }
2549
2553
  case (!allowExpressions && !isChildElement && node.children.length === 1): {
2550
- return context.report({ messageId: "noUselessFragment", node });
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
- return context.report({ messageId: "noUselessFragment", node });
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 = decodeSettings(context.settings).importSource ?? "react";
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.1-next.6",
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.1-next.6",
53
- "@eslint-react/eff": "1.23.1-next.6",
54
- "@eslint-react/core": "1.23.1-next.6",
55
- "@eslint-react/shared": "1.23.1-next.6",
56
- "@eslint-react/types": "1.23.1-next.6",
57
- "@eslint-react/jsx": "1.23.1-next.6",
58
- "@eslint-react/var": "1.23.1-next.6"
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",