eslint-plugin-react-x 1.22.2-next.1 → 1.22.2-next.11

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.
Files changed (3) hide show
  1. package/dist/index.js +152 -216
  2. package/dist/index.mjs +153 -217
  3. package/package.json +11 -11
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var eff = require('@eslint-react/eff');
4
- var JSX8 = require('@eslint-react/jsx');
4
+ var JSX7 = require('@eslint-react/jsx');
5
5
  var shared = require('@eslint-react/shared');
6
6
  var AST11 = require('@eslint-react/ast');
7
7
  var core = require('@eslint-react/core');
@@ -35,14 +35,14 @@ function _interopNamespace(e) {
35
35
  return Object.freeze(n);
36
36
  }
37
37
 
38
- var JSX8__namespace = /*#__PURE__*/_interopNamespace(JSX8);
38
+ var JSX7__namespace = /*#__PURE__*/_interopNamespace(JSX7);
39
39
  var AST11__namespace = /*#__PURE__*/_interopNamespace(AST11);
40
40
  var VAR__namespace = /*#__PURE__*/_interopNamespace(VAR);
41
41
  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-next.1";
45
+ var version = "1.22.2-next.11";
46
46
  var createRule = shared.createRuleForPlugin("x");
47
47
 
48
48
  // src/rules/avoid-shorthand-boolean.ts
@@ -70,7 +70,7 @@ var avoid_shorthand_boolean_default = createRule({
70
70
  messageId: "avoidShorthandBoolean",
71
71
  node,
72
72
  data: {
73
- propName: JSX8__namespace.getPropName(node)
73
+ propName: JSX7__namespace.getPropName(node)
74
74
  },
75
75
  fix: (fixer) => fixer.insertTextAfter(node.name, `={true}`)
76
76
  });
@@ -151,7 +151,7 @@ var RULE_FEATURES4 = [
151
151
  "CHK"
152
152
  ];
153
153
  function getName(node) {
154
- if (node.type === types.AST_NODE_TYPES.TSAsExpression) {
154
+ if (AST11__namespace.isTypeExpression(node)) {
155
155
  return getName(node.expression);
156
156
  }
157
157
  if (node.type === types.AST_NODE_TYPES.Identifier || node.type === types.AST_NODE_TYPES.PrivateIdentifier) {
@@ -327,12 +327,10 @@ var no_array_index_key_default = createRule({
327
327
  name: RULE_NAME5,
328
328
  create(context) {
329
329
  const indexParamNames = [];
330
+ const isCreateOrCloneElementCall = eff.or(core.isCreateElementCall(context), core.isCloneElementCall(context));
330
331
  function isArrayIndex(node) {
331
332
  return node.type === types.AST_NODE_TYPES.Identifier && indexParamNames.some(eff.O.exists((name2) => name2 === node.name));
332
333
  }
333
- function isCreateOrCloneElementCall(node) {
334
- return core.isCreateElementCall(node, context) || core.isCloneElementCall(node, context);
335
- }
336
334
  function getReportDescriptor(node) {
337
335
  if (isArrayIndex(node)) return [{ messageId: "noArrayIndexKey", node }];
338
336
  if (AST11__namespace.isOneOf([types.AST_NODE_TYPES.TemplateLiteral, types.AST_NODE_TYPES.BinaryExpression])(node)) {
@@ -537,7 +535,7 @@ var no_children_prop_default = createRule({
537
535
  return {
538
536
  JSXElement(node) {
539
537
  const initialScope = context.sourceCode.getScope(node);
540
- const prop = JSX8__namespace.getProp(node.openingElement.attributes, "children", initialScope);
538
+ const prop = JSX7__namespace.getProp(node.openingElement.attributes, "children", initialScope);
541
539
  const reportDescriptor = eff.O.map(prop, (prop2) => ({ messageId: "noChildrenProp", node: prop2 }));
542
540
  eff.O.map(reportDescriptor, context.report);
543
541
  }
@@ -912,7 +910,7 @@ var no_context_provider_default = createRule({
912
910
  if (compareVersions.compare(version2, "19.0.0", "<")) return {};
913
911
  return {
914
912
  JSXElement(node) {
915
- const elementName = JSX8__namespace.getElementName(node.openingElement);
913
+ const elementName = JSX7__namespace.getElementName(node.openingElement);
916
914
  if (!elementName.endsWith(".Provider")) return;
917
915
  context.report({
918
916
  messageId: "noContextProvider",
@@ -1009,7 +1007,7 @@ var RULE_FEATURES22 = [
1009
1007
  "CHK"
1010
1008
  ];
1011
1009
  function getName2(node) {
1012
- if (node.type === types.AST_NODE_TYPES.TSAsExpression) {
1010
+ if (AST11__namespace.isTypeExpression(node)) {
1013
1011
  return getName2(node.expression);
1014
1012
  }
1015
1013
  if (node.type === types.AST_NODE_TYPES.Identifier || node.type === types.AST_NODE_TYPES.PrivateIdentifier) {
@@ -1123,116 +1121,61 @@ var no_duplicate_key_default = createRule({
1123
1121
  },
1124
1122
  name: RULE_NAME24,
1125
1123
  create(context) {
1126
- const isWithinChildrenToArrayRef = eff.MutRef.make(false);
1127
- function isKeyEqual(a, b) {
1128
- return VAR__namespace.isNodeValueEqual(a, b, [context.sourceCode.getScope(a), context.sourceCode.getScope(b)]);
1129
- }
1130
- function checkIteratorElement(node) {
1131
- if (node.type !== types.AST_NODE_TYPES.JSXElement) return eff.O.none();
1132
- const initialScope = context.sourceCode.getScope(node);
1133
- return eff.F.pipe(
1134
- JSX8__namespace.findPropInAttributes(node.openingElement.attributes, initialScope)("key"),
1135
- eff.O.flatMap((k) => "value" in k ? eff.O.fromNullable(k.value) : eff.O.none()),
1136
- eff.O.flatMap((v) => {
1137
- return isKeyEqual(v, v) ? eff.O.some({
1138
- messageId: "noDuplicateKey",
1139
- node: v,
1140
- data: {
1141
- value: context.sourceCode.getText(v)
1142
- }
1143
- }) : eff.O.none();
1144
- })
1145
- );
1146
- }
1147
- function checkExpression(node) {
1148
- switch (node.type) {
1149
- case types.AST_NODE_TYPES.ConditionalExpression:
1150
- if (!("consequent" in node)) return eff.O.none();
1151
- return eff.F.pipe(
1152
- checkIteratorElement(node.consequent),
1153
- eff.O.orElse(() => checkIteratorElement(node.alternate))
1154
- );
1155
- case types.AST_NODE_TYPES.JSXElement:
1156
- case types.AST_NODE_TYPES.JSXFragment:
1157
- return checkIteratorElement(node);
1158
- case types.AST_NODE_TYPES.LogicalExpression:
1159
- if (!("left" in node)) return eff.O.none();
1160
- return eff.F.pipe(
1161
- checkIteratorElement(node.left),
1162
- eff.O.orElse(() => checkIteratorElement(node.right))
1163
- );
1164
- default:
1165
- return eff.O.none();
1166
- }
1167
- }
1168
- function checkBlockStatement(node) {
1169
- return AST11__namespace.getNestedReturnStatements(node).reduce((acc, statement) => {
1170
- if (!statement.argument) return acc;
1171
- const maybeDescriptor = checkIteratorElement(statement.argument);
1172
- if (eff.O.isNone(maybeDescriptor)) return acc;
1173
- const descriptor = maybeDescriptor.value;
1174
- return [...acc, descriptor];
1175
- }, []);
1124
+ if (!context.sourceCode.getText().includes("key=")) return {};
1125
+ const keyedEntries = /* @__PURE__ */ new Map();
1126
+ function isKeyValueEqual(a, b) {
1127
+ const aValue = a.value;
1128
+ const bValue = b.value;
1129
+ if (aValue === null || bValue === null) return false;
1130
+ return AST11__namespace.isNodeEqual(aValue, bValue);
1176
1131
  }
1177
- const seen = /* @__PURE__ */ new WeakSet();
1178
1132
  return {
1179
- "ArrayExpression, JSXElement > JSXElement"(node) {
1180
- if (eff.MutRef.get(isWithinChildrenToArrayRef)) return;
1181
- const elements = tsPattern.match(node).with({ type: types.AST_NODE_TYPES.ArrayExpression }, ({ elements: elements2 }) => elements2).with({ type: types.AST_NODE_TYPES.JSXElement }, ({ parent }) => "children" in parent ? parent.children : []).otherwise(() => []).filter(AST11__namespace.is(types.AST_NODE_TYPES.JSXElement)).filter((element) => !seen.has(element));
1182
- const keys = elements.reduce(
1183
- (acc, element) => {
1184
- const attr = element.openingElement.attributes.findLast((attr2) => {
1185
- if (attr2.type !== types.AST_NODE_TYPES.JSXAttribute) return false;
1186
- return attr2.name.name === "key";
1133
+ "JSXAttribute[name.name='key']"(node) {
1134
+ const jsxElement = node.parent.parent;
1135
+ switch (jsxElement.parent.type) {
1136
+ case types.AST_NODE_TYPES.ArrayExpression:
1137
+ case types.AST_NODE_TYPES.JSXElement:
1138
+ case types.AST_NODE_TYPES.JSXFragment: {
1139
+ const root = jsxElement.parent;
1140
+ const prevKeys = keyedEntries.get(root)?.keys ?? [];
1141
+ keyedEntries.set(root, {
1142
+ hasDuplicate: prevKeys.some((prevKey) => isKeyValueEqual(prevKey, node)),
1143
+ keys: [...prevKeys, node],
1144
+ root: jsxElement.parent
1187
1145
  });
1188
- if (!attr || !("value" in attr) || attr.value === null) return acc;
1189
- const { value } = attr;
1190
- if (acc.length === 0) return [[element, attr, value]];
1191
- if (acc.some(([_, _1, v]) => isKeyEqual(v, value))) {
1192
- return [...acc, [element, attr, value]];
1193
- }
1194
- return acc;
1195
- },
1196
- []
1197
- );
1198
- if (keys.length < 2) return;
1199
- for (const [element, attr, value] of keys) {
1200
- seen.add(element);
1201
- context.report({
1202
- messageId: "noDuplicateKey",
1203
- node: attr,
1204
- data: {
1205
- value: context.sourceCode.getText(value)
1146
+ break;
1147
+ }
1148
+ default: {
1149
+ const entry = eff.F.pipe(
1150
+ eff.O.Do,
1151
+ eff.O.bind("call", () => AST11__namespace.traverseUpGuard(jsxElement, AST11__namespace.isMapCallLoose)),
1152
+ eff.O.bind("iter", ({ call }) => AST11__namespace.traverseUpStop(jsxElement, call, AST11__namespace.isFunction)),
1153
+ eff.O.bind("arg0", ({ call }) => eff.O.fromNullable(call.arguments[0]))
1154
+ );
1155
+ for (const { arg0, call, iter } of eff.O.toArray(entry)) {
1156
+ if (AST11__namespace.unwrapTypeExpression(arg0) !== iter) continue;
1157
+ keyedEntries.set(call, {
1158
+ hasDuplicate: node.value?.type === types.AST_NODE_TYPES.Literal,
1159
+ keys: [node],
1160
+ root: call
1161
+ });
1206
1162
  }
1207
- });
1163
+ }
1208
1164
  }
1209
1165
  },
1210
- CallExpression(node) {
1211
- if (core.isChildrenToArrayCall(node, context)) eff.MutRef.set(isWithinChildrenToArrayRef, true);
1212
- const isMapCall = AST11__namespace.isMapCallLoose(node);
1213
- const isArrayFromCall = tsPattern.isMatching({
1214
- type: types.AST_NODE_TYPES.CallExpression,
1215
- callee: {
1216
- type: types.AST_NODE_TYPES.MemberExpression,
1217
- property: {
1218
- name: "from"
1219
- }
1220
- }
1221
- }, node);
1222
- if (!isMapCall && !isArrayFromCall) return;
1223
- if (eff.MutRef.get(isWithinChildrenToArrayRef)) return;
1224
- const fn = node.arguments[isMapCall ? 0 : 1];
1225
- if (!AST11__namespace.isOneOf([types.AST_NODE_TYPES.ArrowFunctionExpression, types.AST_NODE_TYPES.FunctionExpression])(fn)) return;
1226
- if (fn.body.type === types.AST_NODE_TYPES.BlockStatement) {
1227
- for (const descriptor of checkBlockStatement(fn.body)) {
1228
- context.report(descriptor);
1166
+ "Program:exit"() {
1167
+ for (const { hasDuplicate, keys } of keyedEntries.values()) {
1168
+ if (!hasDuplicate) continue;
1169
+ for (const key of keys) {
1170
+ context.report({
1171
+ messageId: "noDuplicateKey",
1172
+ node: key,
1173
+ data: {
1174
+ value: context.sourceCode.getText(key)
1175
+ }
1176
+ });
1229
1177
  }
1230
- return;
1231
1178
  }
1232
- eff.O.map(checkExpression(fn.body), context.report);
1233
- },
1234
- "CallExpression:exit"(node) {
1235
- if (core.isChildrenToArrayCall(node, context)) eff.MutRef.set(isWithinChildrenToArrayRef, false);
1236
1179
  }
1237
1180
  };
1238
1181
  },
@@ -1355,7 +1298,7 @@ var no_implicit_key_default = createRule({
1355
1298
  create(context) {
1356
1299
  function getReportDescriptor(node) {
1357
1300
  const initialScope = context.sourceCode.getScope(node);
1358
- const keyPropFound = JSX8__namespace.findPropInAttributes(node.attributes, initialScope)("key");
1301
+ const keyPropFound = JSX7__namespace.findPropInAttributes(node.attributes, initialScope)("key");
1359
1302
  const keyPropOnElement = node.attributes.some(
1360
1303
  (n) => AST11__namespace.is(types.AST_NODE_TYPES.JSXAttribute)(n) && n.name.name === "key"
1361
1304
  );
@@ -1595,12 +1538,12 @@ var no_missing_key_default = createRule({
1595
1538
  },
1596
1539
  name: RULE_NAME29,
1597
1540
  create(context) {
1598
- const isWithinChildrenToArrayRef = eff.MutRef.make(false);
1541
+ const state = { isWithinChildrenToArray: false };
1599
1542
  function checkIteratorElement(node) {
1600
1543
  switch (node.type) {
1601
1544
  case types.AST_NODE_TYPES.JSXElement: {
1602
1545
  const initialScope = context.sourceCode.getScope(node);
1603
- if (!JSX8__namespace.hasProp(node.openingElement.attributes, "key", initialScope)) {
1546
+ if (!JSX7__namespace.hasProp(node.openingElement.attributes, "key", initialScope)) {
1604
1547
  return eff.O.some({
1605
1548
  messageId: "noMissingKey",
1606
1549
  node
@@ -1644,12 +1587,12 @@ var no_missing_key_default = createRule({
1644
1587
  }
1645
1588
  return {
1646
1589
  ArrayExpression(node) {
1647
- if (eff.MutRef.get(isWithinChildrenToArrayRef)) return;
1590
+ if (state.isWithinChildrenToArray) return;
1648
1591
  const elements = node.elements.filter(AST11__namespace.is(types.AST_NODE_TYPES.JSXElement));
1649
1592
  if (elements.length === 0) return;
1650
1593
  const initialScope = context.sourceCode.getScope(node);
1651
1594
  for (const element of elements) {
1652
- if (!JSX8__namespace.hasProp(element.openingElement.attributes, "key", initialScope)) {
1595
+ if (!JSX7__namespace.hasProp(element.openingElement.attributes, "key", initialScope)) {
1653
1596
  context.report({
1654
1597
  messageId: "noMissingKey",
1655
1598
  node: element
@@ -1658,7 +1601,8 @@ var no_missing_key_default = createRule({
1658
1601
  }
1659
1602
  },
1660
1603
  CallExpression(node) {
1661
- if (core.isChildrenToArrayCall(node, context)) eff.MutRef.set(isWithinChildrenToArrayRef, true);
1604
+ state.isWithinChildrenToArray ||= core.isChildrenToArrayCall(node, context);
1605
+ if (state.isWithinChildrenToArray) return;
1662
1606
  const isMapCall = AST11__namespace.isMapCallLoose(node);
1663
1607
  const isArrayFromCall = tsPattern.isMatching({
1664
1608
  type: types.AST_NODE_TYPES.CallExpression,
@@ -1670,7 +1614,6 @@ var no_missing_key_default = createRule({
1670
1614
  }
1671
1615
  }, node);
1672
1616
  if (!isMapCall && !isArrayFromCall) return;
1673
- if (eff.MutRef.get(isWithinChildrenToArrayRef)) return;
1674
1617
  const fn = node.arguments[isMapCall ? 0 : 1];
1675
1618
  if (!AST11__namespace.isOneOf([types.AST_NODE_TYPES.ArrowFunctionExpression, types.AST_NODE_TYPES.FunctionExpression])(fn)) return;
1676
1619
  if (fn.body.type === types.AST_NODE_TYPES.BlockStatement) {
@@ -1682,10 +1625,11 @@ var no_missing_key_default = createRule({
1682
1625
  eff.O.map(checkExpression(fn.body), context.report);
1683
1626
  },
1684
1627
  "CallExpression:exit"(node) {
1685
- if (core.isChildrenToArrayCall(node, context)) eff.MutRef.set(isWithinChildrenToArrayRef, false);
1628
+ if (!core.isChildrenToArrayCall(node, context)) return;
1629
+ state.isWithinChildrenToArray = false;
1686
1630
  },
1687
1631
  JSXFragment(node) {
1688
- if (eff.MutRef.get(isWithinChildrenToArrayRef)) return;
1632
+ if (state.isWithinChildrenToArray) return;
1689
1633
  if (node.parent.type === types.AST_NODE_TYPES.ArrayExpression) {
1690
1634
  context.report({
1691
1635
  messageId: "noMissingKeyWithFragment",
@@ -1736,7 +1680,7 @@ var no_nested_components_default = createRule({
1736
1680
  if (eff.O.isNone(componentName)) continue;
1737
1681
  const name2 = componentName.value;
1738
1682
  const isInsideProperty = component.parent.type === types.AST_NODE_TYPES.Property;
1739
- const isInsideJSXPropValue = component.parent.type === types.AST_NODE_TYPES.JSXAttribute || eff.O.isSome(JSX8__namespace.traverseUpProp(node, (n) => n.value?.type === types.AST_NODE_TYPES.JSXExpressionContainer));
1683
+ const isInsideJSXPropValue = component.parent.type === types.AST_NODE_TYPES.JSXAttribute || eff.O.isSome(JSX7__namespace.traverseUpProp(node, (n) => n.value?.type === types.AST_NODE_TYPES.JSXExpressionContainer));
1740
1684
  if (isInsideJSXPropValue) {
1741
1685
  if (!core.isDeclaredInRenderPropLoose(component)) {
1742
1686
  context.report({
@@ -1782,7 +1726,7 @@ var no_nested_components_default = createRule({
1782
1726
  }
1783
1727
  }
1784
1728
  for (const { name: name2, node: component } of classComponents) {
1785
- if (eff.O.isNone(AST11__namespace.traverseUp(component, (node2) => isClassComponent11(node2) || isFunctionComponent(node2)))) {
1729
+ if (eff.O.isNone(AST11__namespace.traverseUp(component, eff.or(isClassComponent11, isFunctionComponent)))) {
1786
1730
  continue;
1787
1731
  }
1788
1732
  context.report({
@@ -1912,22 +1856,25 @@ var no_set_state_in_component_did_mount_default = createRule({
1912
1856
  if (!context.sourceCode.text.includes("componentDidMount")) return {};
1913
1857
  function getReportDescriptor(node) {
1914
1858
  if (!core.isThisSetState(node)) return eff.O.none();
1915
- const maybeParentClass = AST11__namespace.traverseUp(
1916
- node,
1917
- AST11__namespace.isOneOf([types.AST_NODE_TYPES.ClassDeclaration, types.AST_NODE_TYPES.ClassExpression])
1859
+ return eff.F.pipe(
1860
+ eff.O.Do,
1861
+ eff.O.bind("clazz", () => AST11__namespace.traverseUpGuard(node, core.isClassComponent)),
1862
+ eff.O.bind("method", ({ clazz }) => AST11__namespace.traverseUpStop(node, clazz, isComponentDidMount)),
1863
+ eff.O.bind("methodScope", ({ method }) => eff.O.some(context.sourceCode.getScope(method))),
1864
+ eff.O.bind("upperScope", () => eff.O.fromNullable(context.sourceCode.getScope(node).upper)),
1865
+ eff.O.filter(
1866
+ ({
1867
+ clazz,
1868
+ method,
1869
+ methodScope,
1870
+ upperScope
1871
+ }) => method.parent === clazz.body && upperScope === methodScope
1872
+ ),
1873
+ eff.O.map(() => ({
1874
+ messageId: "noSetStateInComponentDidMount",
1875
+ node
1876
+ }))
1918
1877
  );
1919
- if (eff.O.isNone(maybeParentClass)) return eff.O.none();
1920
- const parentClass = maybeParentClass.value;
1921
- if (!core.isClassComponent(parentClass)) return eff.O.none();
1922
- const maybeParentMethod = AST11__namespace.traverseUp(node, isComponentDidMount);
1923
- if (eff.O.isNone(maybeParentMethod)) return eff.O.none();
1924
- const parentMethod = maybeParentMethod.value;
1925
- if (parentMethod.parent !== parentClass.body) return eff.O.none();
1926
- if (context.sourceCode.getScope(node).upper !== context.sourceCode.getScope(parentMethod)) return eff.O.none();
1927
- return eff.O.some({
1928
- messageId: "noSetStateInComponentDidMount",
1929
- node
1930
- });
1931
1878
  }
1932
1879
  return {
1933
1880
  CallExpression: eff.F.flow(getReportDescriptor, eff.O.map(context.report))
@@ -1959,22 +1906,19 @@ var no_set_state_in_component_did_update_default = createRule({
1959
1906
  if (!context.sourceCode.text.includes("componentDidUpdate")) return {};
1960
1907
  function getReportDescriptor(node) {
1961
1908
  if (!core.isThisSetState(node)) return eff.O.none();
1962
- const maybeParentClass = AST11__namespace.traverseUp(
1963
- node,
1964
- AST11__namespace.isOneOf([types.AST_NODE_TYPES.ClassDeclaration, types.AST_NODE_TYPES.ClassExpression])
1909
+ return eff.F.pipe(
1910
+ eff.O.Do,
1911
+ eff.O.bind("clazz", () => AST11__namespace.traverseUpGuard(node, core.isClassComponent)),
1912
+ eff.O.bind("method", ({ clazz }) => AST11__namespace.traverseUpStop(node, clazz, isComponentDidUpdate)),
1913
+ eff.O.bind("upperScope", () => eff.O.fromNullable(context.sourceCode.getScope(node).upper)),
1914
+ eff.O.filter(
1915
+ ({ clazz, method, upperScope }) => method.parent === clazz.body && upperScope === context.sourceCode.getScope(method)
1916
+ ),
1917
+ eff.O.map(() => ({
1918
+ messageId: "noSetStateInComponentDidUpdate",
1919
+ node
1920
+ }))
1965
1921
  );
1966
- if (eff.O.isNone(maybeParentClass)) return eff.O.none();
1967
- const parentClass = maybeParentClass.value;
1968
- if (!core.isClassComponent(parentClass)) return eff.O.none();
1969
- const maybeParentMethod = AST11__namespace.traverseUp(node, isComponentDidUpdate);
1970
- if (eff.O.isNone(maybeParentMethod)) return eff.O.none();
1971
- const parentMethod = maybeParentMethod.value;
1972
- if (parentMethod.parent !== parentClass.body) return eff.O.none();
1973
- if (context.sourceCode.getScope(node).upper !== context.sourceCode.getScope(parentMethod)) return eff.O.none();
1974
- return eff.O.some({
1975
- messageId: "noSetStateInComponentDidUpdate",
1976
- node
1977
- });
1978
1922
  }
1979
1923
  return {
1980
1924
  CallExpression: eff.F.flow(getReportDescriptor, eff.O.map(context.report))
@@ -2006,22 +1950,19 @@ var no_set_state_in_component_will_update_default = createRule({
2006
1950
  if (!context.sourceCode.text.includes("componentWillUpdate")) return {};
2007
1951
  function getReportDescriptor(node) {
2008
1952
  if (!core.isThisSetState(node)) return eff.O.none();
2009
- const maybeParentClass = AST11__namespace.traverseUp(
2010
- node,
2011
- AST11__namespace.isOneOf([types.AST_NODE_TYPES.ClassDeclaration, types.AST_NODE_TYPES.ClassExpression])
1953
+ return eff.F.pipe(
1954
+ eff.O.Do,
1955
+ eff.O.bind("clazz", () => AST11__namespace.traverseUpGuard(node, core.isClassComponent)),
1956
+ eff.O.bind("method", ({ clazz }) => AST11__namespace.traverseUpStop(node, clazz, isComponentWillUpdate3)),
1957
+ eff.O.bind("upperScope", () => eff.O.fromNullable(context.sourceCode.getScope(node).upper)),
1958
+ eff.O.filter(
1959
+ ({ clazz, method, upperScope }) => method.parent === clazz.body && upperScope === context.sourceCode.getScope(method)
1960
+ ),
1961
+ eff.O.map(() => ({
1962
+ messageId: "noSetStateInComponentWillUpdate",
1963
+ node
1964
+ }))
2012
1965
  );
2013
- if (eff.O.isNone(maybeParentClass)) return eff.O.none();
2014
- const parentClass = maybeParentClass.value;
2015
- if (!core.isClassComponent(parentClass)) return eff.O.none();
2016
- const maybeParentMethod = AST11__namespace.traverseUp(node, isComponentWillUpdate3);
2017
- if (eff.O.isNone(maybeParentMethod)) return eff.O.none();
2018
- const parentMethod = maybeParentMethod.value;
2019
- if (parentMethod.parent !== parentClass.body) return eff.O.none();
2020
- if (context.sourceCode.getScope(node).upper !== context.sourceCode.getScope(parentMethod)) return eff.O.none();
2021
- return eff.O.some({
2022
- messageId: "noSetStateInComponentWillUpdate",
2023
- node
2024
- });
2025
1966
  }
2026
1967
  return {
2027
1968
  CallExpression: eff.F.flow(getReportDescriptor, eff.O.map(context.report))
@@ -2219,39 +2160,40 @@ var no_unstable_context_value_default = createRule({
2219
2160
  name: RULE_NAME40,
2220
2161
  create(context) {
2221
2162
  const { ctx, listeners } = core.useComponentCollector(context);
2222
- const possibleValueConstructions = /* @__PURE__ */ new Map();
2163
+ const constructions = /* @__PURE__ */ new Map();
2223
2164
  return {
2224
2165
  ...listeners,
2225
2166
  JSXOpeningElement(node) {
2226
2167
  const openingElementName = node.name;
2227
2168
  if (openingElementName.type !== types.AST_NODE_TYPES.JSXMemberExpression) return;
2228
2169
  if (openingElementName.property.name !== "Provider") return;
2229
- const maybeJSXValueAttribute = eff.O.fromNullable(
2230
- node.attributes.find((attribute) => {
2231
- return attribute.type === types.AST_NODE_TYPES.JSXAttribute && attribute.name.name === "value";
2232
- })
2170
+ const constructionEntry = eff.F.pipe(
2171
+ eff.O.Do,
2172
+ eff.O.bind("function", ctx.getCurrentFunction),
2173
+ eff.O.bind("attribute", () => eff.O.fromNullable(
2174
+ node.attributes.find((attribute) => {
2175
+ return attribute.type === types.AST_NODE_TYPES.JSXAttribute && attribute.name.name === "value";
2176
+ })
2177
+ )),
2178
+ eff.O.bind("value", ({ attribute }) => "value" in attribute ? eff.O.some(attribute.value) : eff.O.none()),
2179
+ eff.O.bind("valueExpression", ({ value }) => value?.type === types.AST_NODE_TYPES.JSXExpressionContainer ? eff.O.some(value.expression) : eff.O.none()),
2180
+ eff.O.bind("construction", ({ valueExpression }) => {
2181
+ const initialScope = context.sourceCode.getScope(valueExpression);
2182
+ return eff.O.some(VAR__namespace.inspectConstruction(valueExpression, initialScope));
2183
+ }),
2184
+ eff.O.filter(({ construction }) => construction._tag !== "None")
2233
2185
  );
2234
- if (eff.O.isNone(maybeJSXValueAttribute) || !("value" in maybeJSXValueAttribute.value)) return;
2235
- const valueNode = maybeJSXValueAttribute.value.value;
2236
- if (valueNode?.type !== types.AST_NODE_TYPES.JSXExpressionContainer) return;
2237
- const valueExpression = valueNode.expression;
2238
- const initialScope = context.sourceCode.getScope(valueExpression);
2239
- const construction = VAR__namespace.inspectConstruction(valueExpression, initialScope);
2240
- if (construction._tag === "None") return;
2241
- eff.O.map(
2242
- ctx.getCurrentFunction(),
2243
- ([_, currentFn]) => possibleValueConstructions.set(currentFn, [
2244
- ...possibleValueConstructions.get(currentFn) ?? [],
2186
+ for (const { construction, function: [_, fNode] } of eff.O.toArray(constructionEntry)) {
2187
+ constructions.set(fNode, [
2188
+ ...constructions.get(fNode) ?? [],
2245
2189
  construction
2246
- ])
2247
- );
2190
+ ]);
2191
+ }
2248
2192
  },
2249
2193
  "Program:exit"(node) {
2250
2194
  const components = ctx.getAllComponents(node).values();
2251
2195
  for (const { node: component } of components) {
2252
- const constructions = possibleValueConstructions.get(component);
2253
- if (!constructions) continue;
2254
- for (const construction of constructions) {
2196
+ for (const construction of constructions.get(component) ?? []) {
2255
2197
  if (construction._tag === "None") continue;
2256
2198
  const { node: constructionNode, _tag } = construction;
2257
2199
  const messageId = _tag.startsWith("Function") ? "noUnstableContextValueWithFunction" : "noUnstableContextValueWithIdentifier";
@@ -2288,7 +2230,7 @@ var no_unstable_default_props_default = createRule({
2288
2230
  name: RULE_NAME41,
2289
2231
  create(context) {
2290
2232
  const { ctx, listeners } = core.useComponentCollector(context);
2291
- const possibleDestructuringDeclarators = /* @__PURE__ */ new WeakMap();
2233
+ const declarators = /* @__PURE__ */ new WeakMap();
2292
2234
  return {
2293
2235
  ...listeners,
2294
2236
  "Program:exit"(node) {
@@ -2298,10 +2240,7 @@ var no_unstable_default_props_default = createRule({
2298
2240
  const [props] = params;
2299
2241
  if (!props) continue;
2300
2242
  const properties = tsPattern.match(props).with({ type: types.AST_NODE_TYPES.ObjectPattern }, ({ properties: properties2 }) => properties2).with({ type: types.AST_NODE_TYPES.Identifier }, ({ name: name2 }) => {
2301
- const variableDeclarators = possibleDestructuringDeclarators.get(component);
2302
- if (!variableDeclarators) return [];
2303
- const declarators = variableDeclarators.filter((d) => d.init.name === name2);
2304
- return declarators.flatMap((d) => d.id.properties);
2243
+ return declarators.get(component)?.filter((d) => d.init.name === name2).flatMap((d) => d.id.properties) ?? [];
2305
2244
  }).otherwise(() => []);
2306
2245
  for (const prop of properties) {
2307
2246
  if (prop.type !== types.AST_NODE_TYPES.Property || prop.value.type !== types.AST_NODE_TYPES.AssignmentPattern) continue;
@@ -2326,13 +2265,10 @@ var no_unstable_default_props_default = createRule({
2326
2265
  }
2327
2266
  },
2328
2267
  "VariableDeclarator[id.type='ObjectPattern'][init.type='Identifier']"(node) {
2329
- eff.O.map(
2330
- ctx.getCurrentFunction(),
2331
- ([_, currentFn]) => possibleDestructuringDeclarators.set(currentFn, [
2332
- ...possibleDestructuringDeclarators.get(currentFn) ?? [],
2333
- node
2334
- ])
2335
- );
2268
+ for (const [_, currentFn] of eff.O.toArray(ctx.getCurrentFunction())) {
2269
+ const prevDeclarators = declarators.get(currentFn) ?? [];
2270
+ declarators.set(currentFn, [...prevDeclarators, node]);
2271
+ }
2336
2272
  }
2337
2273
  };
2338
2274
  },
@@ -2360,7 +2296,7 @@ var LIFECYCLE_METHODS = /* @__PURE__ */ new Set([
2360
2296
  "UNSAFE_componentWillUpdate"
2361
2297
  ]);
2362
2298
  function getName3(node) {
2363
- if (node.type === types.AST_NODE_TYPES.TSAsExpression) {
2299
+ if (AST11__namespace.isTypeExpression(node)) {
2364
2300
  return getName3(node.expression);
2365
2301
  }
2366
2302
  if (node.type === types.AST_NODE_TYPES.Identifier || node.type === types.AST_NODE_TYPES.PrivateIdentifier) {
@@ -2460,7 +2396,9 @@ var no_unused_class_component_members_default = createRule({
2460
2396
  if (node.init && AST11__namespace.isThisExpression(node.init) && node.id.type === types.AST_NODE_TYPES.ObjectPattern) {
2461
2397
  for (const prop of node.id.properties) {
2462
2398
  if (prop.type === types.AST_NODE_TYPES.Property && AST11__namespace.isKeyLiteralLike(prop, prop.key)) {
2463
- eff.O.map(getName3(prop.key), (name2) => propertyUsages.get(currentClass)?.add(name2));
2399
+ for (const name2 of eff.O.toArray(getName3(prop.key))) {
2400
+ propertyUsages.get(currentClass)?.add(name2);
2401
+ }
2464
2402
  }
2465
2403
  }
2466
2404
  }
@@ -2474,7 +2412,7 @@ var RULE_FEATURES43 = [
2474
2412
  "CHK"
2475
2413
  ];
2476
2414
  function getName4(node) {
2477
- if (node.type === types.AST_NODE_TYPES.TSAsExpression) {
2415
+ if (AST11__namespace.isTypeExpression(node)) {
2478
2416
  return getName4(node.expression);
2479
2417
  }
2480
2418
  if (node.type === types.AST_NODE_TYPES.Identifier || node.type === types.AST_NODE_TYPES.PrivateIdentifier) {
@@ -2617,18 +2555,18 @@ var no_unused_state_default = createRule({
2617
2555
  var RULE_NAME44 = "no-useless-fragment";
2618
2556
  function check(node, context, allowExpressions) {
2619
2557
  const initialScope = context.sourceCode.getScope(node);
2620
- if (JSX8__namespace.isKeyedElement(node, initialScope)) return;
2621
- if (JSX8__namespace.isBuiltInElement(node.parent)) context.report({ messageId: "noUselessFragmentInBuiltIn", node });
2558
+ if (JSX7__namespace.isKeyedElement(node, initialScope)) return;
2559
+ if (JSX7__namespace.isBuiltInElement(node.parent)) context.report({ messageId: "noUselessFragmentInBuiltIn", node });
2622
2560
  if (node.children.length === 0) return context.report({ messageId: "noUselessFragment", node });
2623
2561
  const isChildren = AST11__namespace.isOneOf([types.AST_NODE_TYPES.JSXElement, types.AST_NODE_TYPES.JSXFragment])(node.parent);
2624
2562
  const [firstChildren] = node.children;
2625
- if (allowExpressions && node.children.length === 1 && JSX8__namespace.isLiteral(firstChildren) && !isChildren) return;
2563
+ if (allowExpressions && node.children.length === 1 && JSX7__namespace.isLiteral(firstChildren) && !isChildren) return;
2626
2564
  if (!allowExpressions && isChildren) {
2627
2565
  return context.report({ messageId: "noUselessFragment", node });
2628
2566
  } else if (!allowExpressions && !isChildren && node.children.length === 1) {
2629
2567
  return context.report({ messageId: "noUselessFragment", node });
2630
2568
  }
2631
- const nonPaddingChildren = node.children.filter((child) => !JSX8__namespace.isPaddingSpaces(child));
2569
+ const nonPaddingChildren = node.children.filter((child) => !JSX7__namespace.isPaddingSpaces(child));
2632
2570
  if (nonPaddingChildren.length > 1) return;
2633
2571
  if (nonPaddingChildren.length === 0) return context.report({ messageId: "noUselessFragment", node });
2634
2572
  const [first] = nonPaddingChildren;
@@ -2870,7 +2808,7 @@ var prefer_shorthand_boolean_default = createRule({
2870
2808
  create(context) {
2871
2809
  function getReportDescriptor(node) {
2872
2810
  const { value } = node;
2873
- const propName = JSX8__namespace.getPropName(node);
2811
+ const propName = JSX7__namespace.getPropName(node);
2874
2812
  const hasValueTrue = value?.type === types.AST_NODE_TYPES.JSXExpressionContainer && value.expression.type === types.AST_NODE_TYPES.Literal && value.expression.value === true;
2875
2813
  if (!hasValueTrue) return eff.O.none();
2876
2814
  return eff.O.some({
@@ -2927,10 +2865,8 @@ var use_jsx_vars_default = createRule({
2927
2865
  meta: {
2928
2866
  type: "problem",
2929
2867
  docs: {
2930
- description: (
2931
- // eslint-disable-next-line eslint-plugin/require-meta-docs-description
2932
- "helpes `eslint/no-unused-vars` to correctly mark JSX variables as used."
2933
- ),
2868
+ // eslint-disable-next-line eslint-plugin/require-meta-docs-description
2869
+ description: "helpes `eslint/no-unused-vars` to correctly mark JSX variables as used.",
2934
2870
  [Symbol.for("rule_features")]: RULE_FEATURES49
2935
2871
  },
2936
2872
  messages: {
@@ -2953,9 +2889,9 @@ var use_jsx_vars_default = createRule({
2953
2889
  return {
2954
2890
  JSXOpeningElement(node) {
2955
2891
  if (node.name.type === types.AST_NODE_TYPES.JSXIdentifier && /^[a-z]/u.test(node.name.name)) return;
2956
- eff.O.map(getName5(node.name), (name2) => {
2892
+ for (const name2 of eff.O.toArray(getName5(node.name))) {
2957
2893
  context.sourceCode.markVariableAsUsed(name2, node);
2958
- });
2894
+ }
2959
2895
  }
2960
2896
  };
2961
2897
  },
package/dist/index.mjs CHANGED
@@ -1,8 +1,8 @@
1
- import { F, O, isString, MutRef, isNullable } from '@eslint-react/eff';
2
- import * as JSX8 from '@eslint-react/jsx';
1
+ import { F, O, or, isString, isNullable } from '@eslint-react/eff';
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, isChildrenCount, isChildrenForEach, isChildrenMap, isChildrenOnly, isChildrenToArray, useComponentCollectorLegacy, isCloneElementCall, isCreateRefCall, isComponentName, isChildrenToArrayCall, useComponentCollector, ERFunctionComponentFlag, ERComponentHint, isDirectValueOfRenderPropertyLoose, isDeclaredInRenderPropLoose, isInsideCreateElementProps, isInsideRenderMethod, ERClassComponentFlag, isFragmentElement, isCreateElementCall, 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, isFragmentElement, 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-next.1";
18
+ var version = "1.22.2-next.11";
19
19
  var createRule = createRuleForPlugin("x");
20
20
 
21
21
  // src/rules/avoid-shorthand-boolean.ts
@@ -43,7 +43,7 @@ var avoid_shorthand_boolean_default = createRule({
43
43
  messageId: "avoidShorthandBoolean",
44
44
  node,
45
45
  data: {
46
- propName: JSX8.getPropName(node)
46
+ propName: JSX7.getPropName(node)
47
47
  },
48
48
  fix: (fixer) => fixer.insertTextAfter(node.name, `={true}`)
49
49
  });
@@ -124,7 +124,7 @@ var RULE_FEATURES4 = [
124
124
  "CHK"
125
125
  ];
126
126
  function getName(node) {
127
- if (node.type === AST_NODE_TYPES.TSAsExpression) {
127
+ if (AST11.isTypeExpression(node)) {
128
128
  return getName(node.expression);
129
129
  }
130
130
  if (node.type === AST_NODE_TYPES.Identifier || node.type === AST_NODE_TYPES.PrivateIdentifier) {
@@ -300,12 +300,10 @@ var no_array_index_key_default = createRule({
300
300
  name: RULE_NAME5,
301
301
  create(context) {
302
302
  const indexParamNames = [];
303
+ const isCreateOrCloneElementCall = or(isCreateElementCall(context), isCloneElementCall(context));
303
304
  function isArrayIndex(node) {
304
305
  return node.type === AST_NODE_TYPES.Identifier && indexParamNames.some(O.exists((name2) => name2 === node.name));
305
306
  }
306
- function isCreateOrCloneElementCall(node) {
307
- return isCreateElementCall(node, context) || isCloneElementCall(node, context);
308
- }
309
307
  function getReportDescriptor(node) {
310
308
  if (isArrayIndex(node)) return [{ messageId: "noArrayIndexKey", node }];
311
309
  if (AST11.isOneOf([AST_NODE_TYPES.TemplateLiteral, AST_NODE_TYPES.BinaryExpression])(node)) {
@@ -510,7 +508,7 @@ var no_children_prop_default = createRule({
510
508
  return {
511
509
  JSXElement(node) {
512
510
  const initialScope = context.sourceCode.getScope(node);
513
- const prop = JSX8.getProp(node.openingElement.attributes, "children", initialScope);
511
+ const prop = JSX7.getProp(node.openingElement.attributes, "children", initialScope);
514
512
  const reportDescriptor = O.map(prop, (prop2) => ({ messageId: "noChildrenProp", node: prop2 }));
515
513
  O.map(reportDescriptor, context.report);
516
514
  }
@@ -885,7 +883,7 @@ var no_context_provider_default = createRule({
885
883
  if (compare(version2, "19.0.0", "<")) return {};
886
884
  return {
887
885
  JSXElement(node) {
888
- const elementName = JSX8.getElementName(node.openingElement);
886
+ const elementName = JSX7.getElementName(node.openingElement);
889
887
  if (!elementName.endsWith(".Provider")) return;
890
888
  context.report({
891
889
  messageId: "noContextProvider",
@@ -982,7 +980,7 @@ var RULE_FEATURES22 = [
982
980
  "CHK"
983
981
  ];
984
982
  function getName2(node) {
985
- if (node.type === AST_NODE_TYPES.TSAsExpression) {
983
+ if (AST11.isTypeExpression(node)) {
986
984
  return getName2(node.expression);
987
985
  }
988
986
  if (node.type === AST_NODE_TYPES.Identifier || node.type === AST_NODE_TYPES.PrivateIdentifier) {
@@ -1096,116 +1094,61 @@ var no_duplicate_key_default = createRule({
1096
1094
  },
1097
1095
  name: RULE_NAME24,
1098
1096
  create(context) {
1099
- const isWithinChildrenToArrayRef = MutRef.make(false);
1100
- function isKeyEqual(a, b) {
1101
- return VAR.isNodeValueEqual(a, b, [context.sourceCode.getScope(a), context.sourceCode.getScope(b)]);
1102
- }
1103
- function checkIteratorElement(node) {
1104
- if (node.type !== AST_NODE_TYPES.JSXElement) return O.none();
1105
- const initialScope = context.sourceCode.getScope(node);
1106
- return F.pipe(
1107
- JSX8.findPropInAttributes(node.openingElement.attributes, initialScope)("key"),
1108
- O.flatMap((k) => "value" in k ? O.fromNullable(k.value) : O.none()),
1109
- O.flatMap((v) => {
1110
- return isKeyEqual(v, v) ? O.some({
1111
- messageId: "noDuplicateKey",
1112
- node: v,
1113
- data: {
1114
- value: context.sourceCode.getText(v)
1115
- }
1116
- }) : O.none();
1117
- })
1118
- );
1119
- }
1120
- function checkExpression(node) {
1121
- switch (node.type) {
1122
- case AST_NODE_TYPES.ConditionalExpression:
1123
- if (!("consequent" in node)) return O.none();
1124
- return F.pipe(
1125
- checkIteratorElement(node.consequent),
1126
- O.orElse(() => checkIteratorElement(node.alternate))
1127
- );
1128
- case AST_NODE_TYPES.JSXElement:
1129
- case AST_NODE_TYPES.JSXFragment:
1130
- return checkIteratorElement(node);
1131
- case AST_NODE_TYPES.LogicalExpression:
1132
- if (!("left" in node)) return O.none();
1133
- return F.pipe(
1134
- checkIteratorElement(node.left),
1135
- O.orElse(() => checkIteratorElement(node.right))
1136
- );
1137
- default:
1138
- return O.none();
1139
- }
1140
- }
1141
- function checkBlockStatement(node) {
1142
- return AST11.getNestedReturnStatements(node).reduce((acc, statement) => {
1143
- if (!statement.argument) return acc;
1144
- const maybeDescriptor = checkIteratorElement(statement.argument);
1145
- if (O.isNone(maybeDescriptor)) return acc;
1146
- const descriptor = maybeDescriptor.value;
1147
- return [...acc, descriptor];
1148
- }, []);
1097
+ if (!context.sourceCode.getText().includes("key=")) return {};
1098
+ const keyedEntries = /* @__PURE__ */ new Map();
1099
+ function isKeyValueEqual(a, b) {
1100
+ const aValue = a.value;
1101
+ const bValue = b.value;
1102
+ if (aValue === null || bValue === null) return false;
1103
+ return AST11.isNodeEqual(aValue, bValue);
1149
1104
  }
1150
- const seen = /* @__PURE__ */ new WeakSet();
1151
1105
  return {
1152
- "ArrayExpression, JSXElement > JSXElement"(node) {
1153
- if (MutRef.get(isWithinChildrenToArrayRef)) return;
1154
- const elements = match(node).with({ type: AST_NODE_TYPES.ArrayExpression }, ({ elements: elements2 }) => elements2).with({ type: AST_NODE_TYPES.JSXElement }, ({ parent }) => "children" in parent ? parent.children : []).otherwise(() => []).filter(AST11.is(AST_NODE_TYPES.JSXElement)).filter((element) => !seen.has(element));
1155
- const keys = elements.reduce(
1156
- (acc, element) => {
1157
- const attr = element.openingElement.attributes.findLast((attr2) => {
1158
- if (attr2.type !== AST_NODE_TYPES.JSXAttribute) return false;
1159
- return attr2.name.name === "key";
1106
+ "JSXAttribute[name.name='key']"(node) {
1107
+ const jsxElement = node.parent.parent;
1108
+ switch (jsxElement.parent.type) {
1109
+ case AST_NODE_TYPES.ArrayExpression:
1110
+ case AST_NODE_TYPES.JSXElement:
1111
+ case AST_NODE_TYPES.JSXFragment: {
1112
+ const root = jsxElement.parent;
1113
+ const prevKeys = keyedEntries.get(root)?.keys ?? [];
1114
+ keyedEntries.set(root, {
1115
+ hasDuplicate: prevKeys.some((prevKey) => isKeyValueEqual(prevKey, node)),
1116
+ keys: [...prevKeys, node],
1117
+ root: jsxElement.parent
1160
1118
  });
1161
- if (!attr || !("value" in attr) || attr.value === null) return acc;
1162
- const { value } = attr;
1163
- if (acc.length === 0) return [[element, attr, value]];
1164
- if (acc.some(([_, _1, v]) => isKeyEqual(v, value))) {
1165
- return [...acc, [element, attr, value]];
1166
- }
1167
- return acc;
1168
- },
1169
- []
1170
- );
1171
- if (keys.length < 2) return;
1172
- for (const [element, attr, value] of keys) {
1173
- seen.add(element);
1174
- context.report({
1175
- messageId: "noDuplicateKey",
1176
- node: attr,
1177
- data: {
1178
- value: context.sourceCode.getText(value)
1119
+ break;
1120
+ }
1121
+ default: {
1122
+ const entry = F.pipe(
1123
+ O.Do,
1124
+ O.bind("call", () => AST11.traverseUpGuard(jsxElement, AST11.isMapCallLoose)),
1125
+ O.bind("iter", ({ call }) => AST11.traverseUpStop(jsxElement, call, AST11.isFunction)),
1126
+ O.bind("arg0", ({ call }) => O.fromNullable(call.arguments[0]))
1127
+ );
1128
+ for (const { arg0, call, iter } of O.toArray(entry)) {
1129
+ if (AST11.unwrapTypeExpression(arg0) !== iter) continue;
1130
+ keyedEntries.set(call, {
1131
+ hasDuplicate: node.value?.type === AST_NODE_TYPES.Literal,
1132
+ keys: [node],
1133
+ root: call
1134
+ });
1179
1135
  }
1180
- });
1136
+ }
1181
1137
  }
1182
1138
  },
1183
- CallExpression(node) {
1184
- if (isChildrenToArrayCall(node, context)) MutRef.set(isWithinChildrenToArrayRef, true);
1185
- const isMapCall = AST11.isMapCallLoose(node);
1186
- const isArrayFromCall = isMatching({
1187
- type: AST_NODE_TYPES.CallExpression,
1188
- callee: {
1189
- type: AST_NODE_TYPES.MemberExpression,
1190
- property: {
1191
- name: "from"
1192
- }
1193
- }
1194
- }, node);
1195
- if (!isMapCall && !isArrayFromCall) return;
1196
- if (MutRef.get(isWithinChildrenToArrayRef)) return;
1197
- const fn = node.arguments[isMapCall ? 0 : 1];
1198
- if (!AST11.isOneOf([AST_NODE_TYPES.ArrowFunctionExpression, AST_NODE_TYPES.FunctionExpression])(fn)) return;
1199
- if (fn.body.type === AST_NODE_TYPES.BlockStatement) {
1200
- for (const descriptor of checkBlockStatement(fn.body)) {
1201
- context.report(descriptor);
1139
+ "Program:exit"() {
1140
+ for (const { hasDuplicate, keys } of keyedEntries.values()) {
1141
+ if (!hasDuplicate) continue;
1142
+ for (const key of keys) {
1143
+ context.report({
1144
+ messageId: "noDuplicateKey",
1145
+ node: key,
1146
+ data: {
1147
+ value: context.sourceCode.getText(key)
1148
+ }
1149
+ });
1202
1150
  }
1203
- return;
1204
1151
  }
1205
- O.map(checkExpression(fn.body), context.report);
1206
- },
1207
- "CallExpression:exit"(node) {
1208
- if (isChildrenToArrayCall(node, context)) MutRef.set(isWithinChildrenToArrayRef, false);
1209
1152
  }
1210
1153
  };
1211
1154
  },
@@ -1328,7 +1271,7 @@ var no_implicit_key_default = createRule({
1328
1271
  create(context) {
1329
1272
  function getReportDescriptor(node) {
1330
1273
  const initialScope = context.sourceCode.getScope(node);
1331
- const keyPropFound = JSX8.findPropInAttributes(node.attributes, initialScope)("key");
1274
+ const keyPropFound = JSX7.findPropInAttributes(node.attributes, initialScope)("key");
1332
1275
  const keyPropOnElement = node.attributes.some(
1333
1276
  (n) => AST11.is(AST_NODE_TYPES.JSXAttribute)(n) && n.name.name === "key"
1334
1277
  );
@@ -1568,12 +1511,12 @@ var no_missing_key_default = createRule({
1568
1511
  },
1569
1512
  name: RULE_NAME29,
1570
1513
  create(context) {
1571
- const isWithinChildrenToArrayRef = MutRef.make(false);
1514
+ const state = { isWithinChildrenToArray: false };
1572
1515
  function checkIteratorElement(node) {
1573
1516
  switch (node.type) {
1574
1517
  case AST_NODE_TYPES.JSXElement: {
1575
1518
  const initialScope = context.sourceCode.getScope(node);
1576
- if (!JSX8.hasProp(node.openingElement.attributes, "key", initialScope)) {
1519
+ if (!JSX7.hasProp(node.openingElement.attributes, "key", initialScope)) {
1577
1520
  return O.some({
1578
1521
  messageId: "noMissingKey",
1579
1522
  node
@@ -1617,12 +1560,12 @@ var no_missing_key_default = createRule({
1617
1560
  }
1618
1561
  return {
1619
1562
  ArrayExpression(node) {
1620
- if (MutRef.get(isWithinChildrenToArrayRef)) return;
1563
+ if (state.isWithinChildrenToArray) return;
1621
1564
  const elements = node.elements.filter(AST11.is(AST_NODE_TYPES.JSXElement));
1622
1565
  if (elements.length === 0) return;
1623
1566
  const initialScope = context.sourceCode.getScope(node);
1624
1567
  for (const element of elements) {
1625
- if (!JSX8.hasProp(element.openingElement.attributes, "key", initialScope)) {
1568
+ if (!JSX7.hasProp(element.openingElement.attributes, "key", initialScope)) {
1626
1569
  context.report({
1627
1570
  messageId: "noMissingKey",
1628
1571
  node: element
@@ -1631,7 +1574,8 @@ var no_missing_key_default = createRule({
1631
1574
  }
1632
1575
  },
1633
1576
  CallExpression(node) {
1634
- if (isChildrenToArrayCall(node, context)) MutRef.set(isWithinChildrenToArrayRef, true);
1577
+ state.isWithinChildrenToArray ||= isChildrenToArrayCall(node, context);
1578
+ if (state.isWithinChildrenToArray) return;
1635
1579
  const isMapCall = AST11.isMapCallLoose(node);
1636
1580
  const isArrayFromCall = isMatching({
1637
1581
  type: AST_NODE_TYPES.CallExpression,
@@ -1643,7 +1587,6 @@ var no_missing_key_default = createRule({
1643
1587
  }
1644
1588
  }, node);
1645
1589
  if (!isMapCall && !isArrayFromCall) return;
1646
- if (MutRef.get(isWithinChildrenToArrayRef)) return;
1647
1590
  const fn = node.arguments[isMapCall ? 0 : 1];
1648
1591
  if (!AST11.isOneOf([AST_NODE_TYPES.ArrowFunctionExpression, AST_NODE_TYPES.FunctionExpression])(fn)) return;
1649
1592
  if (fn.body.type === AST_NODE_TYPES.BlockStatement) {
@@ -1655,10 +1598,11 @@ var no_missing_key_default = createRule({
1655
1598
  O.map(checkExpression(fn.body), context.report);
1656
1599
  },
1657
1600
  "CallExpression:exit"(node) {
1658
- if (isChildrenToArrayCall(node, context)) MutRef.set(isWithinChildrenToArrayRef, false);
1601
+ if (!isChildrenToArrayCall(node, context)) return;
1602
+ state.isWithinChildrenToArray = false;
1659
1603
  },
1660
1604
  JSXFragment(node) {
1661
- if (MutRef.get(isWithinChildrenToArrayRef)) return;
1605
+ if (state.isWithinChildrenToArray) return;
1662
1606
  if (node.parent.type === AST_NODE_TYPES.ArrayExpression) {
1663
1607
  context.report({
1664
1608
  messageId: "noMissingKeyWithFragment",
@@ -1709,7 +1653,7 @@ var no_nested_components_default = createRule({
1709
1653
  if (O.isNone(componentName)) continue;
1710
1654
  const name2 = componentName.value;
1711
1655
  const isInsideProperty = component.parent.type === AST_NODE_TYPES.Property;
1712
- const isInsideJSXPropValue = component.parent.type === AST_NODE_TYPES.JSXAttribute || O.isSome(JSX8.traverseUpProp(node, (n) => n.value?.type === AST_NODE_TYPES.JSXExpressionContainer));
1656
+ const isInsideJSXPropValue = component.parent.type === AST_NODE_TYPES.JSXAttribute || O.isSome(JSX7.traverseUpProp(node, (n) => n.value?.type === AST_NODE_TYPES.JSXExpressionContainer));
1713
1657
  if (isInsideJSXPropValue) {
1714
1658
  if (!isDeclaredInRenderPropLoose(component)) {
1715
1659
  context.report({
@@ -1755,7 +1699,7 @@ var no_nested_components_default = createRule({
1755
1699
  }
1756
1700
  }
1757
1701
  for (const { name: name2, node: component } of classComponents) {
1758
- if (O.isNone(AST11.traverseUp(component, (node2) => isClassComponent11(node2) || isFunctionComponent(node2)))) {
1702
+ if (O.isNone(AST11.traverseUp(component, or(isClassComponent11, isFunctionComponent)))) {
1759
1703
  continue;
1760
1704
  }
1761
1705
  context.report({
@@ -1885,22 +1829,25 @@ var no_set_state_in_component_did_mount_default = createRule({
1885
1829
  if (!context.sourceCode.text.includes("componentDidMount")) return {};
1886
1830
  function getReportDescriptor(node) {
1887
1831
  if (!isThisSetState(node)) return O.none();
1888
- const maybeParentClass = AST11.traverseUp(
1889
- node,
1890
- AST11.isOneOf([AST_NODE_TYPES.ClassDeclaration, AST_NODE_TYPES.ClassExpression])
1832
+ return F.pipe(
1833
+ O.Do,
1834
+ O.bind("clazz", () => AST11.traverseUpGuard(node, isClassComponent)),
1835
+ O.bind("method", ({ clazz }) => AST11.traverseUpStop(node, clazz, isComponentDidMount)),
1836
+ O.bind("methodScope", ({ method }) => O.some(context.sourceCode.getScope(method))),
1837
+ O.bind("upperScope", () => O.fromNullable(context.sourceCode.getScope(node).upper)),
1838
+ O.filter(
1839
+ ({
1840
+ clazz,
1841
+ method,
1842
+ methodScope,
1843
+ upperScope
1844
+ }) => method.parent === clazz.body && upperScope === methodScope
1845
+ ),
1846
+ O.map(() => ({
1847
+ messageId: "noSetStateInComponentDidMount",
1848
+ node
1849
+ }))
1891
1850
  );
1892
- if (O.isNone(maybeParentClass)) return O.none();
1893
- const parentClass = maybeParentClass.value;
1894
- if (!isClassComponent(parentClass)) return O.none();
1895
- const maybeParentMethod = AST11.traverseUp(node, isComponentDidMount);
1896
- if (O.isNone(maybeParentMethod)) return O.none();
1897
- const parentMethod = maybeParentMethod.value;
1898
- if (parentMethod.parent !== parentClass.body) return O.none();
1899
- if (context.sourceCode.getScope(node).upper !== context.sourceCode.getScope(parentMethod)) return O.none();
1900
- return O.some({
1901
- messageId: "noSetStateInComponentDidMount",
1902
- node
1903
- });
1904
1851
  }
1905
1852
  return {
1906
1853
  CallExpression: F.flow(getReportDescriptor, O.map(context.report))
@@ -1932,22 +1879,19 @@ var no_set_state_in_component_did_update_default = createRule({
1932
1879
  if (!context.sourceCode.text.includes("componentDidUpdate")) return {};
1933
1880
  function getReportDescriptor(node) {
1934
1881
  if (!isThisSetState(node)) return O.none();
1935
- const maybeParentClass = AST11.traverseUp(
1936
- node,
1937
- AST11.isOneOf([AST_NODE_TYPES.ClassDeclaration, AST_NODE_TYPES.ClassExpression])
1882
+ return F.pipe(
1883
+ O.Do,
1884
+ O.bind("clazz", () => AST11.traverseUpGuard(node, isClassComponent)),
1885
+ O.bind("method", ({ clazz }) => AST11.traverseUpStop(node, clazz, isComponentDidUpdate)),
1886
+ O.bind("upperScope", () => O.fromNullable(context.sourceCode.getScope(node).upper)),
1887
+ O.filter(
1888
+ ({ clazz, method, upperScope }) => method.parent === clazz.body && upperScope === context.sourceCode.getScope(method)
1889
+ ),
1890
+ O.map(() => ({
1891
+ messageId: "noSetStateInComponentDidUpdate",
1892
+ node
1893
+ }))
1938
1894
  );
1939
- if (O.isNone(maybeParentClass)) return O.none();
1940
- const parentClass = maybeParentClass.value;
1941
- if (!isClassComponent(parentClass)) return O.none();
1942
- const maybeParentMethod = AST11.traverseUp(node, isComponentDidUpdate);
1943
- if (O.isNone(maybeParentMethod)) return O.none();
1944
- const parentMethod = maybeParentMethod.value;
1945
- if (parentMethod.parent !== parentClass.body) return O.none();
1946
- if (context.sourceCode.getScope(node).upper !== context.sourceCode.getScope(parentMethod)) return O.none();
1947
- return O.some({
1948
- messageId: "noSetStateInComponentDidUpdate",
1949
- node
1950
- });
1951
1895
  }
1952
1896
  return {
1953
1897
  CallExpression: F.flow(getReportDescriptor, O.map(context.report))
@@ -1979,22 +1923,19 @@ var no_set_state_in_component_will_update_default = createRule({
1979
1923
  if (!context.sourceCode.text.includes("componentWillUpdate")) return {};
1980
1924
  function getReportDescriptor(node) {
1981
1925
  if (!isThisSetState(node)) return O.none();
1982
- const maybeParentClass = AST11.traverseUp(
1983
- node,
1984
- AST11.isOneOf([AST_NODE_TYPES.ClassDeclaration, AST_NODE_TYPES.ClassExpression])
1926
+ return F.pipe(
1927
+ O.Do,
1928
+ O.bind("clazz", () => AST11.traverseUpGuard(node, isClassComponent)),
1929
+ O.bind("method", ({ clazz }) => AST11.traverseUpStop(node, clazz, isComponentWillUpdate3)),
1930
+ O.bind("upperScope", () => O.fromNullable(context.sourceCode.getScope(node).upper)),
1931
+ O.filter(
1932
+ ({ clazz, method, upperScope }) => method.parent === clazz.body && upperScope === context.sourceCode.getScope(method)
1933
+ ),
1934
+ O.map(() => ({
1935
+ messageId: "noSetStateInComponentWillUpdate",
1936
+ node
1937
+ }))
1985
1938
  );
1986
- if (O.isNone(maybeParentClass)) return O.none();
1987
- const parentClass = maybeParentClass.value;
1988
- if (!isClassComponent(parentClass)) return O.none();
1989
- const maybeParentMethod = AST11.traverseUp(node, isComponentWillUpdate3);
1990
- if (O.isNone(maybeParentMethod)) return O.none();
1991
- const parentMethod = maybeParentMethod.value;
1992
- if (parentMethod.parent !== parentClass.body) return O.none();
1993
- if (context.sourceCode.getScope(node).upper !== context.sourceCode.getScope(parentMethod)) return O.none();
1994
- return O.some({
1995
- messageId: "noSetStateInComponentWillUpdate",
1996
- node
1997
- });
1998
1939
  }
1999
1940
  return {
2000
1941
  CallExpression: F.flow(getReportDescriptor, O.map(context.report))
@@ -2192,39 +2133,40 @@ var no_unstable_context_value_default = createRule({
2192
2133
  name: RULE_NAME40,
2193
2134
  create(context) {
2194
2135
  const { ctx, listeners } = useComponentCollector(context);
2195
- const possibleValueConstructions = /* @__PURE__ */ new Map();
2136
+ const constructions = /* @__PURE__ */ new Map();
2196
2137
  return {
2197
2138
  ...listeners,
2198
2139
  JSXOpeningElement(node) {
2199
2140
  const openingElementName = node.name;
2200
2141
  if (openingElementName.type !== AST_NODE_TYPES.JSXMemberExpression) return;
2201
2142
  if (openingElementName.property.name !== "Provider") return;
2202
- const maybeJSXValueAttribute = O.fromNullable(
2203
- node.attributes.find((attribute) => {
2204
- return attribute.type === AST_NODE_TYPES.JSXAttribute && attribute.name.name === "value";
2205
- })
2143
+ const constructionEntry = F.pipe(
2144
+ O.Do,
2145
+ O.bind("function", ctx.getCurrentFunction),
2146
+ O.bind("attribute", () => O.fromNullable(
2147
+ node.attributes.find((attribute) => {
2148
+ return attribute.type === AST_NODE_TYPES.JSXAttribute && attribute.name.name === "value";
2149
+ })
2150
+ )),
2151
+ O.bind("value", ({ attribute }) => "value" in attribute ? O.some(attribute.value) : O.none()),
2152
+ O.bind("valueExpression", ({ value }) => value?.type === AST_NODE_TYPES.JSXExpressionContainer ? O.some(value.expression) : O.none()),
2153
+ O.bind("construction", ({ valueExpression }) => {
2154
+ const initialScope = context.sourceCode.getScope(valueExpression);
2155
+ return O.some(VAR.inspectConstruction(valueExpression, initialScope));
2156
+ }),
2157
+ O.filter(({ construction }) => construction._tag !== "None")
2206
2158
  );
2207
- if (O.isNone(maybeJSXValueAttribute) || !("value" in maybeJSXValueAttribute.value)) return;
2208
- const valueNode = maybeJSXValueAttribute.value.value;
2209
- if (valueNode?.type !== AST_NODE_TYPES.JSXExpressionContainer) return;
2210
- const valueExpression = valueNode.expression;
2211
- const initialScope = context.sourceCode.getScope(valueExpression);
2212
- const construction = VAR.inspectConstruction(valueExpression, initialScope);
2213
- if (construction._tag === "None") return;
2214
- O.map(
2215
- ctx.getCurrentFunction(),
2216
- ([_, currentFn]) => possibleValueConstructions.set(currentFn, [
2217
- ...possibleValueConstructions.get(currentFn) ?? [],
2159
+ for (const { construction, function: [_, fNode] } of O.toArray(constructionEntry)) {
2160
+ constructions.set(fNode, [
2161
+ ...constructions.get(fNode) ?? [],
2218
2162
  construction
2219
- ])
2220
- );
2163
+ ]);
2164
+ }
2221
2165
  },
2222
2166
  "Program:exit"(node) {
2223
2167
  const components = ctx.getAllComponents(node).values();
2224
2168
  for (const { node: component } of components) {
2225
- const constructions = possibleValueConstructions.get(component);
2226
- if (!constructions) continue;
2227
- for (const construction of constructions) {
2169
+ for (const construction of constructions.get(component) ?? []) {
2228
2170
  if (construction._tag === "None") continue;
2229
2171
  const { node: constructionNode, _tag } = construction;
2230
2172
  const messageId = _tag.startsWith("Function") ? "noUnstableContextValueWithFunction" : "noUnstableContextValueWithIdentifier";
@@ -2261,7 +2203,7 @@ var no_unstable_default_props_default = createRule({
2261
2203
  name: RULE_NAME41,
2262
2204
  create(context) {
2263
2205
  const { ctx, listeners } = useComponentCollector(context);
2264
- const possibleDestructuringDeclarators = /* @__PURE__ */ new WeakMap();
2206
+ const declarators = /* @__PURE__ */ new WeakMap();
2265
2207
  return {
2266
2208
  ...listeners,
2267
2209
  "Program:exit"(node) {
@@ -2271,10 +2213,7 @@ var no_unstable_default_props_default = createRule({
2271
2213
  const [props] = params;
2272
2214
  if (!props) continue;
2273
2215
  const properties = match(props).with({ type: AST_NODE_TYPES.ObjectPattern }, ({ properties: properties2 }) => properties2).with({ type: AST_NODE_TYPES.Identifier }, ({ name: name2 }) => {
2274
- const variableDeclarators = possibleDestructuringDeclarators.get(component);
2275
- if (!variableDeclarators) return [];
2276
- const declarators = variableDeclarators.filter((d) => d.init.name === name2);
2277
- return declarators.flatMap((d) => d.id.properties);
2216
+ return declarators.get(component)?.filter((d) => d.init.name === name2).flatMap((d) => d.id.properties) ?? [];
2278
2217
  }).otherwise(() => []);
2279
2218
  for (const prop of properties) {
2280
2219
  if (prop.type !== AST_NODE_TYPES.Property || prop.value.type !== AST_NODE_TYPES.AssignmentPattern) continue;
@@ -2299,13 +2238,10 @@ var no_unstable_default_props_default = createRule({
2299
2238
  }
2300
2239
  },
2301
2240
  "VariableDeclarator[id.type='ObjectPattern'][init.type='Identifier']"(node) {
2302
- O.map(
2303
- ctx.getCurrentFunction(),
2304
- ([_, currentFn]) => possibleDestructuringDeclarators.set(currentFn, [
2305
- ...possibleDestructuringDeclarators.get(currentFn) ?? [],
2306
- node
2307
- ])
2308
- );
2241
+ for (const [_, currentFn] of O.toArray(ctx.getCurrentFunction())) {
2242
+ const prevDeclarators = declarators.get(currentFn) ?? [];
2243
+ declarators.set(currentFn, [...prevDeclarators, node]);
2244
+ }
2309
2245
  }
2310
2246
  };
2311
2247
  },
@@ -2333,7 +2269,7 @@ var LIFECYCLE_METHODS = /* @__PURE__ */ new Set([
2333
2269
  "UNSAFE_componentWillUpdate"
2334
2270
  ]);
2335
2271
  function getName3(node) {
2336
- if (node.type === AST_NODE_TYPES.TSAsExpression) {
2272
+ if (AST11.isTypeExpression(node)) {
2337
2273
  return getName3(node.expression);
2338
2274
  }
2339
2275
  if (node.type === AST_NODE_TYPES.Identifier || node.type === AST_NODE_TYPES.PrivateIdentifier) {
@@ -2433,7 +2369,9 @@ var no_unused_class_component_members_default = createRule({
2433
2369
  if (node.init && AST11.isThisExpression(node.init) && node.id.type === AST_NODE_TYPES.ObjectPattern) {
2434
2370
  for (const prop of node.id.properties) {
2435
2371
  if (prop.type === AST_NODE_TYPES.Property && AST11.isKeyLiteralLike(prop, prop.key)) {
2436
- O.map(getName3(prop.key), (name2) => propertyUsages.get(currentClass)?.add(name2));
2372
+ for (const name2 of O.toArray(getName3(prop.key))) {
2373
+ propertyUsages.get(currentClass)?.add(name2);
2374
+ }
2437
2375
  }
2438
2376
  }
2439
2377
  }
@@ -2447,7 +2385,7 @@ var RULE_FEATURES43 = [
2447
2385
  "CHK"
2448
2386
  ];
2449
2387
  function getName4(node) {
2450
- if (node.type === AST_NODE_TYPES.TSAsExpression) {
2388
+ if (AST11.isTypeExpression(node)) {
2451
2389
  return getName4(node.expression);
2452
2390
  }
2453
2391
  if (node.type === AST_NODE_TYPES.Identifier || node.type === AST_NODE_TYPES.PrivateIdentifier) {
@@ -2590,18 +2528,18 @@ var no_unused_state_default = createRule({
2590
2528
  var RULE_NAME44 = "no-useless-fragment";
2591
2529
  function check(node, context, allowExpressions) {
2592
2530
  const initialScope = context.sourceCode.getScope(node);
2593
- if (JSX8.isKeyedElement(node, initialScope)) return;
2594
- if (JSX8.isBuiltInElement(node.parent)) context.report({ messageId: "noUselessFragmentInBuiltIn", node });
2531
+ if (JSX7.isKeyedElement(node, initialScope)) return;
2532
+ if (JSX7.isBuiltInElement(node.parent)) context.report({ messageId: "noUselessFragmentInBuiltIn", node });
2595
2533
  if (node.children.length === 0) return context.report({ messageId: "noUselessFragment", node });
2596
2534
  const isChildren = AST11.isOneOf([AST_NODE_TYPES.JSXElement, AST_NODE_TYPES.JSXFragment])(node.parent);
2597
2535
  const [firstChildren] = node.children;
2598
- if (allowExpressions && node.children.length === 1 && JSX8.isLiteral(firstChildren) && !isChildren) return;
2536
+ if (allowExpressions && node.children.length === 1 && JSX7.isLiteral(firstChildren) && !isChildren) return;
2599
2537
  if (!allowExpressions && isChildren) {
2600
2538
  return context.report({ messageId: "noUselessFragment", node });
2601
2539
  } else if (!allowExpressions && !isChildren && node.children.length === 1) {
2602
2540
  return context.report({ messageId: "noUselessFragment", node });
2603
2541
  }
2604
- const nonPaddingChildren = node.children.filter((child) => !JSX8.isPaddingSpaces(child));
2542
+ const nonPaddingChildren = node.children.filter((child) => !JSX7.isPaddingSpaces(child));
2605
2543
  if (nonPaddingChildren.length > 1) return;
2606
2544
  if (nonPaddingChildren.length === 0) return context.report({ messageId: "noUselessFragment", node });
2607
2545
  const [first] = nonPaddingChildren;
@@ -2843,7 +2781,7 @@ var prefer_shorthand_boolean_default = createRule({
2843
2781
  create(context) {
2844
2782
  function getReportDescriptor(node) {
2845
2783
  const { value } = node;
2846
- const propName = JSX8.getPropName(node);
2784
+ const propName = JSX7.getPropName(node);
2847
2785
  const hasValueTrue = value?.type === AST_NODE_TYPES.JSXExpressionContainer && value.expression.type === AST_NODE_TYPES.Literal && value.expression.value === true;
2848
2786
  if (!hasValueTrue) return O.none();
2849
2787
  return O.some({
@@ -2900,10 +2838,8 @@ var use_jsx_vars_default = createRule({
2900
2838
  meta: {
2901
2839
  type: "problem",
2902
2840
  docs: {
2903
- description: (
2904
- // eslint-disable-next-line eslint-plugin/require-meta-docs-description
2905
- "helpes `eslint/no-unused-vars` to correctly mark JSX variables as used."
2906
- ),
2841
+ // eslint-disable-next-line eslint-plugin/require-meta-docs-description
2842
+ description: "helpes `eslint/no-unused-vars` to correctly mark JSX variables as used.",
2907
2843
  [Symbol.for("rule_features")]: RULE_FEATURES49
2908
2844
  },
2909
2845
  messages: {
@@ -2926,9 +2862,9 @@ var use_jsx_vars_default = createRule({
2926
2862
  return {
2927
2863
  JSXOpeningElement(node) {
2928
2864
  if (node.name.type === AST_NODE_TYPES.JSXIdentifier && /^[a-z]/u.test(node.name.name)) return;
2929
- O.map(getName5(node.name), (name2) => {
2865
+ for (const name2 of O.toArray(getName5(node.name))) {
2930
2866
  context.sourceCode.markVariableAsUsed(name2, node);
2931
- });
2867
+ }
2932
2868
  }
2933
2869
  };
2934
2870
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eslint-plugin-react-x",
3
- "version": "1.22.2-next.1",
3
+ "version": "1.22.2-next.11",
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",
@@ -9,13 +9,13 @@
9
9
  "eslint-plugin",
10
10
  "eslint-plugin-react-x"
11
11
  ],
12
- "homepage": "https://github.com/rel1cx/eslint-react",
12
+ "homepage": "https://github.com/rEl1cx/eslint-react",
13
13
  "bugs": {
14
- "url": "https://github.com/rel1cx/eslint-react/issues"
14
+ "url": "https://github.com/rEl1cx/eslint-react/issues"
15
15
  },
16
16
  "repository": {
17
17
  "type": "git",
18
- "url": "git+https://github.com/Rel1cx/eslint-react.git",
18
+ "url": "git+https://github.com/rEl1cx/eslint-react.git",
19
19
  "directory": "packages/plugins/eslint-plugin-react-x"
20
20
  },
21
21
  "license": "MIT",
@@ -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-next.1",
53
- "@eslint-react/core": "1.22.2-next.1",
54
- "@eslint-react/jsx": "1.22.2-next.1",
55
- "@eslint-react/types": "1.22.2-next.1",
56
- "@eslint-react/eff": "1.22.2-next.1",
57
- "@eslint-react/shared": "1.22.2-next.1",
58
- "@eslint-react/var": "1.22.2-next.1"
52
+ "@eslint-react/ast": "1.22.2-next.11",
53
+ "@eslint-react/core": "1.22.2-next.11",
54
+ "@eslint-react/eff": "1.22.2-next.11",
55
+ "@eslint-react/jsx": "1.22.2-next.11",
56
+ "@eslint-react/shared": "1.22.2-next.11",
57
+ "@eslint-react/types": "1.22.2-next.11",
58
+ "@eslint-react/var": "1.22.2-next.11"
59
59
  },
60
60
  "devDependencies": {
61
61
  "@types/react": "^19.0.2",