eslint-plugin-react-x 1.22.2 → 1.23.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/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.22.2";
45
+ var version = "1.23.0-beta.0";
46
46
  var createRule = shared.createRuleForPlugin("x");
47
47
 
48
48
  // src/rules/avoid-shorthand-boolean.ts
@@ -2553,29 +2553,38 @@ var no_unused_state_default = createRule({
2553
2553
  defaultOptions: []
2554
2554
  });
2555
2555
  var RULE_NAME44 = "no-useless-fragment";
2556
- function check(node, context, allowExpressions) {
2556
+ var defaultOptions = [{
2557
+ allowExpressions: true
2558
+ }];
2559
+ function checkAndReport(node, context, allowExpressions) {
2557
2560
  const initialScope = context.sourceCode.getScope(node);
2558
2561
  if (JSX7__namespace.isKeyedElement(node, initialScope)) return;
2559
2562
  if (JSX7__namespace.isBuiltInElement(node.parent)) context.report({ messageId: "noUselessFragmentInBuiltIn", node });
2560
2563
  if (node.children.length === 0) return context.report({ messageId: "noUselessFragment", node });
2561
- const isChildren = AST11__namespace.isOneOf([types.AST_NODE_TYPES.JSXElement, types.AST_NODE_TYPES.JSXFragment])(node.parent);
2562
- const [firstChildren] = node.children;
2563
- if (allowExpressions && node.children.length === 1 && JSX7__namespace.isLiteral(firstChildren) && !isChildren) return;
2564
- if (!allowExpressions && isChildren) {
2565
- return context.report({ messageId: "noUselessFragment", node });
2566
- } else if (!allowExpressions && !isChildren && node.children.length === 1) {
2567
- return context.report({ messageId: "noUselessFragment", node });
2564
+ const isChildElement = AST11__namespace.isOneOf([types.AST_NODE_TYPES.JSXElement, types.AST_NODE_TYPES.JSXFragment])(node.parent);
2565
+ switch (true) {
2566
+ // <Foo content={<>ee eeee eeee ...</>} />
2567
+ case (allowExpressions && !isChildElement && node.children.length === 1 && JSX7__namespace.isLiteral(node.children.at(0))): {
2568
+ return;
2569
+ }
2570
+ // <Foo><>hello, world</></Foo>
2571
+ case (!allowExpressions && isChildElement): {
2572
+ return context.report({ messageId: "noUselessFragment", node });
2573
+ }
2574
+ case (!allowExpressions && !isChildElement && node.children.length === 1): {
2575
+ return context.report({ messageId: "noUselessFragment", node });
2576
+ }
2568
2577
  }
2569
2578
  const nonPaddingChildren = node.children.filter((child) => !JSX7__namespace.isPaddingSpaces(child));
2570
- if (nonPaddingChildren.length > 1) return;
2571
- if (nonPaddingChildren.length === 0) return context.report({ messageId: "noUselessFragment", node });
2572
- const [first] = nonPaddingChildren;
2573
- if (tsPattern.isMatching({ type: types.AST_NODE_TYPES.JSXExpressionContainer, expression: tsPattern.P.not(types.AST_NODE_TYPES.CallExpression) }, first)) return;
2574
- context.report({ messageId: "noUselessFragment", node });
2579
+ const firstNonPaddingChild = nonPaddingChildren.at(0);
2580
+ switch (true) {
2581
+ case nonPaddingChildren.length === 0:
2582
+ case (nonPaddingChildren.length === 1 && firstNonPaddingChild?.type !== types.AST_NODE_TYPES.JSXExpressionContainer): {
2583
+ return context.report({ messageId: "noUselessFragment", node });
2584
+ }
2585
+ }
2586
+ return;
2575
2587
  }
2576
- var defaultOptions = [{
2577
- allowExpressions: true
2578
- }];
2579
2588
  var no_useless_fragment_default = createRule({
2580
2589
  meta: {
2581
2590
  type: "problem",
@@ -2603,11 +2612,11 @@ var no_useless_fragment_default = createRule({
2603
2612
  const { allowExpressions = true } = option;
2604
2613
  return {
2605
2614
  JSXElement(node) {
2606
- if (!core.isFragmentElement(node, context)) return;
2607
- check(node, context, allowExpressions);
2615
+ if (JSX7__namespace.getElementName(node.openingElement).split(".").at(-1) !== "Fragment") return;
2616
+ checkAndReport(node, context, allowExpressions);
2608
2617
  },
2609
2618
  JSXFragment(node) {
2610
- check(node, context, allowExpressions);
2619
+ checkAndReport(node, context, allowExpressions);
2611
2620
  }
2612
2621
  };
2613
2622
  },
@@ -2845,7 +2854,7 @@ var prefer_shorthand_fragment_default = createRule({
2845
2854
  name: RULE_NAME49,
2846
2855
  create(context) {
2847
2856
  function getReportDescriptor(node) {
2848
- if (!core.isFragmentElement(node, context)) return eff.O.none();
2857
+ if (JSX7__namespace.getElementName(node.openingElement).split(".").at(-1) !== "Fragment") return eff.O.none();
2849
2858
  const hasAttributes = node.openingElement.attributes.length > 0;
2850
2859
  if (hasAttributes) return eff.O.none();
2851
2860
  return eff.O.some({
package/dist/index.mjs CHANGED
@@ -2,7 +2,7 @@ import { F, O, or, isString, isNullable } from '@eslint-react/eff';
2
2
  import * as JSX7 from '@eslint-react/jsx';
3
3
  import { createRuleForPlugin, normalizeSettings, decodeSettings, unsafeReadSettings } from '@eslint-react/shared';
4
4
  import * as AST11 from '@eslint-react/ast';
5
- import { isForwardRefCall, isThisSetState, isClassComponent, isCreateElementCall, isCloneElementCall, isChildrenCount, isChildrenForEach, isChildrenMap, isChildrenOnly, isChildrenToArray, useComponentCollectorLegacy, isCreateRefCall, isComponentName, useComponentCollector, ERFunctionComponentFlag, isChildrenToArrayCall, ERComponentHint, isDirectValueOfRenderPropertyLoose, isDeclaredInRenderPropLoose, isInsideCreateElementProps, isInsideRenderMethod, ERClassComponentFlag, isFragmentElement, isInitializedFromReact } from '@eslint-react/core';
5
+ import { isForwardRefCall, isThisSetState, isClassComponent, isCreateElementCall, isCloneElementCall, isChildrenCount, isChildrenForEach, isChildrenMap, isChildrenOnly, isChildrenToArray, useComponentCollectorLegacy, isCreateRefCall, isComponentName, useComponentCollector, ERFunctionComponentFlag, isChildrenToArrayCall, ERComponentHint, isDirectValueOfRenderPropertyLoose, isDeclaredInRenderPropLoose, isInsideCreateElementProps, isInsideRenderMethod, ERClassComponentFlag, isInitializedFromReact } from '@eslint-react/core';
6
6
  import { AST_NODE_TYPES } from '@typescript-eslint/types';
7
7
  import { isMatching, P, match } from 'ts-pattern';
8
8
  import { compare } from 'compare-versions';
@@ -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.22.2";
18
+ var version = "1.23.0-beta.0";
19
19
  var createRule = createRuleForPlugin("x");
20
20
 
21
21
  // src/rules/avoid-shorthand-boolean.ts
@@ -2526,29 +2526,38 @@ var no_unused_state_default = createRule({
2526
2526
  defaultOptions: []
2527
2527
  });
2528
2528
  var RULE_NAME44 = "no-useless-fragment";
2529
- function check(node, context, allowExpressions) {
2529
+ var defaultOptions = [{
2530
+ allowExpressions: true
2531
+ }];
2532
+ function checkAndReport(node, context, allowExpressions) {
2530
2533
  const initialScope = context.sourceCode.getScope(node);
2531
2534
  if (JSX7.isKeyedElement(node, initialScope)) return;
2532
2535
  if (JSX7.isBuiltInElement(node.parent)) context.report({ messageId: "noUselessFragmentInBuiltIn", node });
2533
2536
  if (node.children.length === 0) return context.report({ messageId: "noUselessFragment", node });
2534
- const isChildren = AST11.isOneOf([AST_NODE_TYPES.JSXElement, AST_NODE_TYPES.JSXFragment])(node.parent);
2535
- const [firstChildren] = node.children;
2536
- if (allowExpressions && node.children.length === 1 && JSX7.isLiteral(firstChildren) && !isChildren) return;
2537
- if (!allowExpressions && isChildren) {
2538
- return context.report({ messageId: "noUselessFragment", node });
2539
- } else if (!allowExpressions && !isChildren && node.children.length === 1) {
2540
- return context.report({ messageId: "noUselessFragment", node });
2537
+ const isChildElement = AST11.isOneOf([AST_NODE_TYPES.JSXElement, AST_NODE_TYPES.JSXFragment])(node.parent);
2538
+ switch (true) {
2539
+ // <Foo content={<>ee eeee eeee ...</>} />
2540
+ case (allowExpressions && !isChildElement && node.children.length === 1 && JSX7.isLiteral(node.children.at(0))): {
2541
+ return;
2542
+ }
2543
+ // <Foo><>hello, world</></Foo>
2544
+ case (!allowExpressions && isChildElement): {
2545
+ return context.report({ messageId: "noUselessFragment", node });
2546
+ }
2547
+ case (!allowExpressions && !isChildElement && node.children.length === 1): {
2548
+ return context.report({ messageId: "noUselessFragment", node });
2549
+ }
2541
2550
  }
2542
2551
  const nonPaddingChildren = node.children.filter((child) => !JSX7.isPaddingSpaces(child));
2543
- if (nonPaddingChildren.length > 1) return;
2544
- if (nonPaddingChildren.length === 0) return context.report({ messageId: "noUselessFragment", node });
2545
- const [first] = nonPaddingChildren;
2546
- if (isMatching({ type: AST_NODE_TYPES.JSXExpressionContainer, expression: P.not(AST_NODE_TYPES.CallExpression) }, first)) return;
2547
- context.report({ messageId: "noUselessFragment", node });
2552
+ const firstNonPaddingChild = nonPaddingChildren.at(0);
2553
+ switch (true) {
2554
+ case nonPaddingChildren.length === 0:
2555
+ case (nonPaddingChildren.length === 1 && firstNonPaddingChild?.type !== AST_NODE_TYPES.JSXExpressionContainer): {
2556
+ return context.report({ messageId: "noUselessFragment", node });
2557
+ }
2558
+ }
2559
+ return;
2548
2560
  }
2549
- var defaultOptions = [{
2550
- allowExpressions: true
2551
- }];
2552
2561
  var no_useless_fragment_default = createRule({
2553
2562
  meta: {
2554
2563
  type: "problem",
@@ -2576,11 +2585,11 @@ var no_useless_fragment_default = createRule({
2576
2585
  const { allowExpressions = true } = option;
2577
2586
  return {
2578
2587
  JSXElement(node) {
2579
- if (!isFragmentElement(node, context)) return;
2580
- check(node, context, allowExpressions);
2588
+ if (JSX7.getElementName(node.openingElement).split(".").at(-1) !== "Fragment") return;
2589
+ checkAndReport(node, context, allowExpressions);
2581
2590
  },
2582
2591
  JSXFragment(node) {
2583
- check(node, context, allowExpressions);
2592
+ checkAndReport(node, context, allowExpressions);
2584
2593
  }
2585
2594
  };
2586
2595
  },
@@ -2818,7 +2827,7 @@ var prefer_shorthand_fragment_default = createRule({
2818
2827
  name: RULE_NAME49,
2819
2828
  create(context) {
2820
2829
  function getReportDescriptor(node) {
2821
- if (!isFragmentElement(node, context)) return O.none();
2830
+ if (JSX7.getElementName(node.openingElement).split(".").at(-1) !== "Fragment") return O.none();
2822
2831
  const hasAttributes = node.openingElement.attributes.length > 0;
2823
2832
  if (hasAttributes) return O.none();
2824
2833
  return O.some({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eslint-plugin-react-x",
3
- "version": "1.22.2",
3
+ "version": "1.23.0-beta.0",
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.22.2",
53
- "@eslint-react/core": "1.22.2",
54
- "@eslint-react/eff": "1.22.2",
55
- "@eslint-react/jsx": "1.22.2",
56
- "@eslint-react/types": "1.22.2",
57
- "@eslint-react/var": "1.22.2",
58
- "@eslint-react/shared": "1.22.2"
52
+ "@eslint-react/core": "1.23.0-beta.0",
53
+ "@eslint-react/ast": "1.23.0-beta.0",
54
+ "@eslint-react/eff": "1.23.0-beta.0",
55
+ "@eslint-react/jsx": "1.23.0-beta.0",
56
+ "@eslint-react/shared": "1.23.0-beta.0",
57
+ "@eslint-react/types": "1.23.0-beta.0",
58
+ "@eslint-react/var": "1.23.0-beta.0"
59
59
  },
60
60
  "devDependencies": {
61
61
  "@types/react": "^19.0.2",