eslint-plugin-react-x 3.0.0-next.40 → 3.0.0-next.42

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 (2) hide show
  1. package/dist/index.js +53 -75
  2. package/package.json +6 -6
package/dist/index.js CHANGED
@@ -68,7 +68,7 @@ const rules$7 = {
68
68
  //#endregion
69
69
  //#region package.json
70
70
  var name$6 = "eslint-plugin-react-x";
71
- var version = "3.0.0-next.40";
71
+ var version = "3.0.0-next.42";
72
72
 
73
73
  //#endregion
74
74
  //#region src/utils/create-rule.ts
@@ -2246,10 +2246,14 @@ function create$39(context) {
2246
2246
  const RULE_NAME$38 = "no-context-provider";
2247
2247
  var no_context_provider_default = createRule({
2248
2248
  meta: {
2249
- type: "problem",
2249
+ type: "suggestion",
2250
2250
  docs: { description: "Replaces usage of '<Context.Provider>' with '<Context>'." },
2251
2251
  fixable: "code",
2252
- messages: { default: "In React 19, you can render '<Context>' as a provider instead of '<Context.Provider>'." },
2252
+ hasSuggestions: true,
2253
+ messages: {
2254
+ default: "In React 19, you can render '<Context>' as a provider instead of '<Context.Provider>'.",
2255
+ replace: "Replace '<Context.Provider>' with '<Context>'."
2256
+ },
2253
2257
  schema: []
2254
2258
  },
2255
2259
  name: RULE_NAME$38,
@@ -2270,13 +2274,16 @@ function create$38(context) {
2270
2274
  context.report({
2271
2275
  messageId: "default",
2272
2276
  node,
2273
- fix(fixer) {
2274
- if (!core.isComponentNameLoose(contextSelfName)) return null;
2275
- const openingElement = node.openingElement;
2276
- const closingElement = node.closingElement;
2277
- if (closingElement == null) return fixer.replaceText(openingElement.name, contextFullName);
2278
- return [fixer.replaceText(openingElement.name, contextFullName), fixer.replaceText(closingElement.name, contextFullName)];
2279
- }
2277
+ suggest: [{
2278
+ messageId: "replace",
2279
+ fix(fixer) {
2280
+ if (!core.isComponentNameLoose(contextSelfName)) return null;
2281
+ const openingElement = node.openingElement;
2282
+ const closingElement = node.closingElement;
2283
+ if (closingElement == null) return fixer.replaceText(openingElement.name, contextFullName);
2284
+ return [fixer.replaceText(openingElement.name, contextFullName), fixer.replaceText(closingElement.name, contextFullName)];
2285
+ }
2286
+ }]
2280
2287
  });
2281
2288
  } });
2282
2289
  }
@@ -2405,10 +2412,14 @@ function create$35(context) {
2405
2412
  const RULE_NAME$34 = "no-forward-ref";
2406
2413
  var no_forward_ref_default = createRule({
2407
2414
  meta: {
2408
- type: "problem",
2415
+ type: "suggestion",
2409
2416
  docs: { description: "Replaces usage of 'forwardRef' with passing 'ref' as a prop." },
2410
2417
  fixable: "code",
2411
- messages: { default: "In React 19, 'forwardRef' is no longer necessary. Pass 'ref' as a prop instead." },
2418
+ hasSuggestions: true,
2419
+ messages: {
2420
+ default: "In React 19, 'forwardRef' is no longer necessary. Pass 'ref' as a prop instead.",
2421
+ replace: "Replace 'forwardRef' with passing 'ref' as a prop."
2422
+ },
2412
2423
  schema: []
2413
2424
  },
2414
2425
  name: RULE_NAME$34,
@@ -2422,11 +2433,14 @@ function create$34(context) {
2422
2433
  return defineRuleListener({ CallExpression(node) {
2423
2434
  if (!core.isForwardRefCall(context, node)) return;
2424
2435
  const id = ast.getFunctionId(node);
2425
- const fix = canFix(context, node) ? getFix(context, node) : null;
2436
+ const suggest = canFix(context, node) ? [{
2437
+ messageId: "replace",
2438
+ fix: getFix(context, node)
2439
+ }] : [];
2426
2440
  context.report({
2427
2441
  messageId: "default",
2428
2442
  node: id ?? node,
2429
- fix
2443
+ suggest
2430
2444
  });
2431
2445
  } });
2432
2446
  }
@@ -3897,10 +3911,14 @@ function create$11(context) {
3897
3911
  const RULE_NAME$10 = "no-use-context";
3898
3912
  var no_use_context_default = createRule({
3899
3913
  meta: {
3900
- type: "problem",
3914
+ type: "suggestion",
3901
3915
  docs: { description: "Replaces usage of 'useContext' with 'use'." },
3902
3916
  fixable: "code",
3903
- messages: { default: "In React 19, 'use' is preferred over 'useContext' because it is more flexible." },
3917
+ hasSuggestions: true,
3918
+ messages: {
3919
+ default: "In React 19, 'use' is preferred over 'useContext' because it is more flexible.",
3920
+ replace: "Replace 'useContext' with 'use'."
3921
+ },
3904
3922
  schema: []
3905
3923
  },
3906
3924
  name: RULE_NAME$10,
@@ -3909,65 +3927,25 @@ var no_use_context_default = createRule({
3909
3927
  });
3910
3928
  function create$10(context) {
3911
3929
  if (!context.sourceCode.text.includes("useContext")) return {};
3912
- const settings = getSettingsFromContext(context);
3913
- if (compare(settings.version, "19.0.0", "<")) return {};
3914
- const hookCalls = /* @__PURE__ */ new Set();
3915
- return defineRuleListener({
3916
- CallExpression(node) {
3917
- if (!core.isHookCall(node)) return;
3918
- hookCalls.add(node);
3919
- },
3920
- ImportDeclaration(node) {
3921
- if (node.source.value !== settings.importSource) return;
3922
- const isUseImported = node.specifiers.some(isMatching({ local: {
3923
- type: AST_NODE_TYPES.Identifier,
3924
- name: "use"
3925
- } }));
3926
- for (const specifier of node.specifiers) {
3927
- if (specifier.type !== AST_NODE_TYPES.ImportSpecifier) continue;
3928
- if (specifier.imported.type !== AST_NODE_TYPES.Identifier) continue;
3929
- if (specifier.imported.name === "useContext") context.report({
3930
- messageId: "default",
3931
- node: specifier,
3932
- fix(fixer) {
3933
- if (isUseImported) {
3934
- const tokenBefore = context.sourceCode.getTokenBefore(specifier);
3935
- return [
3936
- fixer.remove(specifier),
3937
- ...tokenBefore?.value === "," ? [fixer.replaceTextRange([tokenBefore.range[1], specifier.range[0]], "")] : [],
3938
- ...getCorrelativeTokens(context, specifier).map((token) => fixer.remove(token))
3939
- ];
3940
- }
3941
- return fixer.replaceText(specifier.imported, "use");
3942
- }
3943
- });
3944
- }
3945
- },
3946
- "Program:exit"() {
3947
- for (const node of hookCalls) {
3948
- if (!core.isUseContextCall(node)) continue;
3949
- context.report({
3950
- messageId: "default",
3951
- node: node.callee,
3952
- fix(fixer) {
3953
- switch (node.callee.type) {
3954
- case AST_NODE_TYPES.Identifier: return fixer.replaceText(node.callee, "use");
3955
- case AST_NODE_TYPES.MemberExpression: return fixer.replaceText(node.callee.property, "use");
3956
- }
3957
- return null;
3930
+ const { version } = getSettingsFromContext(context);
3931
+ if (compare(version, "19.0.0", "<")) return {};
3932
+ return defineRuleListener({ CallExpression(node) {
3933
+ if (!core.isUseContextCall(node)) return;
3934
+ context.report({
3935
+ messageId: "default",
3936
+ node: node.callee,
3937
+ suggest: [{
3938
+ messageId: "replace",
3939
+ fix(fixer) {
3940
+ switch (node.callee.type) {
3941
+ case AST_NODE_TYPES.Identifier: return fixer.replaceText(node.callee, "use");
3942
+ case AST_NODE_TYPES.MemberExpression: return fixer.replaceText(node.callee.property, "use");
3958
3943
  }
3959
- });
3960
- }
3961
- }
3962
- });
3963
- }
3964
- function getCorrelativeTokens(context, node) {
3965
- const tokenBefore = context.sourceCode.getTokenBefore(node);
3966
- const tokenAfter = context.sourceCode.getTokenAfter(node);
3967
- const tokens = [];
3968
- if (tokenAfter?.value !== "," && tokenBefore?.value === ",") tokens.push(tokenBefore);
3969
- if (tokenAfter?.value === ",") tokens.push(tokenAfter);
3970
- return tokens;
3944
+ return null;
3945
+ }
3946
+ }]
3947
+ });
3948
+ } });
3971
3949
  }
3972
3950
 
3973
3951
  //#endregion
@@ -4115,7 +4093,7 @@ function trimLikeReact(text) {
4115
4093
  const RULE_NAME$8 = "prefer-destructuring-assignment";
4116
4094
  var prefer_destructuring_assignment_default = createRule({
4117
4095
  meta: {
4118
- type: "problem",
4096
+ type: "suggestion",
4119
4097
  docs: { description: "Enforces destructuring assignment for component props and context." },
4120
4098
  messages: { default: "Use destructuring assignment for component props." },
4121
4099
  schema: []
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eslint-plugin-react-x",
3
- "version": "3.0.0-next.40",
3
+ "version": "3.0.0-next.42",
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",
@@ -45,11 +45,11 @@
45
45
  "string-ts": "^2.3.1",
46
46
  "ts-api-utils": "^2.4.0",
47
47
  "ts-pattern": "^5.9.0",
48
- "@eslint-react/ast": "3.0.0-next.40",
49
- "@eslint-react/core": "3.0.0-next.40",
50
- "@eslint-react/eff": "3.0.0-next.40",
51
- "@eslint-react/var": "3.0.0-next.40",
52
- "@eslint-react/shared": "3.0.0-next.40"
48
+ "@eslint-react/ast": "3.0.0-next.42",
49
+ "@eslint-react/core": "3.0.0-next.42",
50
+ "@eslint-react/eff": "3.0.0-next.42",
51
+ "@eslint-react/shared": "3.0.0-next.42",
52
+ "@eslint-react/var": "3.0.0-next.42"
53
53
  },
54
54
  "devDependencies": {
55
55
  "@types/react": "^19.2.14",