eslint-plugin-react-x 1.25.1-next.0 → 1.26.0-beta.4
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/README.md +1 -0
- package/dist/index.d.mts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +131 -27
- package/dist/index.mjs +132 -28
- package/package.json +11 -11
package/README.md
CHANGED
package/dist/index.d.mts
CHANGED
|
@@ -57,6 +57,7 @@ declare const _default: {
|
|
|
57
57
|
"no-unstable-default-props": _typescript_eslint_utils_ts_eslint.RuleModule<"noUnstableDefaultProps", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
58
58
|
"no-unused-class-component-members": _typescript_eslint_utils_ts_eslint.RuleModule<"noUnusedClassComponentMembers", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
59
59
|
"no-unused-state": _typescript_eslint_utils_ts_eslint.RuleModule<"noUnusedState", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
60
|
+
"no-use-context": _typescript_eslint_utils_ts_eslint.RuleModule<"noUseContext", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
60
61
|
"no-useless-fragment": _typescript_eslint_utils_ts_eslint.RuleModule<MessageID$3, [{
|
|
61
62
|
allowExpressions: boolean;
|
|
62
63
|
}], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
package/dist/index.d.ts
CHANGED
|
@@ -57,6 +57,7 @@ declare const _default: {
|
|
|
57
57
|
"no-unstable-default-props": _typescript_eslint_utils_ts_eslint.RuleModule<"noUnstableDefaultProps", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
58
58
|
"no-unused-class-component-members": _typescript_eslint_utils_ts_eslint.RuleModule<"noUnusedClassComponentMembers", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
59
59
|
"no-unused-state": _typescript_eslint_utils_ts_eslint.RuleModule<"noUnusedState", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
60
|
+
"no-use-context": _typescript_eslint_utils_ts_eslint.RuleModule<"noUseContext", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
|
60
61
|
"no-useless-fragment": _typescript_eslint_utils_ts_eslint.RuleModule<MessageID$3, [{
|
|
61
62
|
allowExpressions: boolean;
|
|
62
63
|
}], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
|
package/dist/index.js
CHANGED
|
@@ -42,9 +42,25 @@ var ts__default = /*#__PURE__*/_interopDefault(ts);
|
|
|
42
42
|
|
|
43
43
|
// package.json
|
|
44
44
|
var name = "eslint-plugin-react-x";
|
|
45
|
-
var version = "1.
|
|
45
|
+
var version = "1.26.0-beta.4";
|
|
46
46
|
var createRule = shared.createRuleForPlugin("x");
|
|
47
47
|
|
|
48
|
+
// src/utils/get-associated-tokens.ts
|
|
49
|
+
function getAssociatedTokens(context, node) {
|
|
50
|
+
{
|
|
51
|
+
const tokenBefore = context.sourceCode.getTokenBefore(node);
|
|
52
|
+
const tokenAfter = context.sourceCode.getTokenAfter(node);
|
|
53
|
+
const tokens = [];
|
|
54
|
+
if (tokenAfter?.value !== "," && tokenBefore?.value === ",") {
|
|
55
|
+
tokens.push(tokenBefore);
|
|
56
|
+
}
|
|
57
|
+
if (tokenAfter?.value === ",") {
|
|
58
|
+
tokens.push(tokenAfter);
|
|
59
|
+
}
|
|
60
|
+
return tokens;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
48
64
|
// src/rules/avoid-shorthand-boolean.ts
|
|
49
65
|
var RULE_NAME = "avoid-shorthand-boolean";
|
|
50
66
|
var RULE_FEATURES = [
|
|
@@ -2811,7 +2827,94 @@ var no_unused_state_default = createRule({
|
|
|
2811
2827
|
},
|
|
2812
2828
|
defaultOptions: []
|
|
2813
2829
|
});
|
|
2814
|
-
var RULE_NAME44 = "no-
|
|
2830
|
+
var RULE_NAME44 = "no-use-context";
|
|
2831
|
+
var RULE_FEATURES44 = [
|
|
2832
|
+
"CHK",
|
|
2833
|
+
"MOD"
|
|
2834
|
+
];
|
|
2835
|
+
var no_use_context_default = createRule({
|
|
2836
|
+
meta: {
|
|
2837
|
+
type: "problem",
|
|
2838
|
+
docs: {
|
|
2839
|
+
description: "disallow the use of 'useContext'",
|
|
2840
|
+
[Symbol.for("rule_features")]: RULE_FEATURES44
|
|
2841
|
+
},
|
|
2842
|
+
fixable: "code",
|
|
2843
|
+
messages: {
|
|
2844
|
+
noUseContext: "In React 19, 'use' is preferred over 'useContext' because it is more flexible."
|
|
2845
|
+
},
|
|
2846
|
+
schema: []
|
|
2847
|
+
},
|
|
2848
|
+
name: RULE_NAME44,
|
|
2849
|
+
create(context) {
|
|
2850
|
+
const settings = shared.getSettingsFromContext(context);
|
|
2851
|
+
const useContextAlias = /* @__PURE__ */ new Set();
|
|
2852
|
+
if (!context.sourceCode.text.includes("useContext")) {
|
|
2853
|
+
return {};
|
|
2854
|
+
}
|
|
2855
|
+
if (compareVersions.compare(settings.version, "19.0.0", "<")) {
|
|
2856
|
+
return {};
|
|
2857
|
+
}
|
|
2858
|
+
return {
|
|
2859
|
+
CallExpression(node) {
|
|
2860
|
+
if (!core.isReactHookCall(node)) {
|
|
2861
|
+
return;
|
|
2862
|
+
}
|
|
2863
|
+
if (!core.isReactHookCallWithNameAlias("useContext", context, [...useContextAlias])(node)) {
|
|
2864
|
+
return;
|
|
2865
|
+
}
|
|
2866
|
+
context.report({
|
|
2867
|
+
messageId: "noUseContext",
|
|
2868
|
+
node,
|
|
2869
|
+
fix(fixer) {
|
|
2870
|
+
switch (node.callee.type) {
|
|
2871
|
+
case types.AST_NODE_TYPES.Identifier:
|
|
2872
|
+
return fixer.replaceText(node.callee, "use");
|
|
2873
|
+
case types.AST_NODE_TYPES.MemberExpression:
|
|
2874
|
+
return fixer.replaceText(node.callee.property, "use");
|
|
2875
|
+
}
|
|
2876
|
+
return null;
|
|
2877
|
+
}
|
|
2878
|
+
});
|
|
2879
|
+
},
|
|
2880
|
+
ImportDeclaration(node) {
|
|
2881
|
+
if (node.source.value !== settings.importSource) {
|
|
2882
|
+
return;
|
|
2883
|
+
}
|
|
2884
|
+
const isUseImported = node.specifiers.some(tsPattern.isMatching({ local: { type: types.AST_NODE_TYPES.Identifier, name: "use" } }));
|
|
2885
|
+
for (const specifier of node.specifiers) {
|
|
2886
|
+
if (specifier.type !== types.AST_NODE_TYPES.ImportSpecifier) continue;
|
|
2887
|
+
if (specifier.imported.type !== types.AST_NODE_TYPES.Identifier) continue;
|
|
2888
|
+
if (specifier.imported.name === "useContext") {
|
|
2889
|
+
if (specifier.local.name !== "useContext") {
|
|
2890
|
+
useContextAlias.add(specifier.local.name);
|
|
2891
|
+
}
|
|
2892
|
+
context.report({
|
|
2893
|
+
messageId: "noUseContext",
|
|
2894
|
+
node: specifier,
|
|
2895
|
+
fix(fixer) {
|
|
2896
|
+
if (isUseImported) {
|
|
2897
|
+
const tokenBefore = context.sourceCode.getTokenBefore(specifier);
|
|
2898
|
+
return [
|
|
2899
|
+
fixer.remove(specifier),
|
|
2900
|
+
...tokenBefore?.value === "," ? [fixer.replaceTextRange([tokenBefore.range[1], specifier.range[0]], "")] : [],
|
|
2901
|
+
...getAssociatedTokens(
|
|
2902
|
+
context,
|
|
2903
|
+
specifier
|
|
2904
|
+
).map((token) => fixer.remove(token))
|
|
2905
|
+
];
|
|
2906
|
+
}
|
|
2907
|
+
return fixer.replaceText(specifier.imported, "use");
|
|
2908
|
+
}
|
|
2909
|
+
});
|
|
2910
|
+
}
|
|
2911
|
+
}
|
|
2912
|
+
}
|
|
2913
|
+
};
|
|
2914
|
+
},
|
|
2915
|
+
defaultOptions: []
|
|
2916
|
+
});
|
|
2917
|
+
var RULE_NAME45 = "no-useless-fragment";
|
|
2815
2918
|
var defaultOptions = [{
|
|
2816
2919
|
allowExpressions: true
|
|
2817
2920
|
}];
|
|
@@ -2903,7 +3006,7 @@ var no_useless_fragment_default = createRule({
|
|
|
2903
3006
|
}
|
|
2904
3007
|
}]
|
|
2905
3008
|
},
|
|
2906
|
-
name:
|
|
3009
|
+
name: RULE_NAME45,
|
|
2907
3010
|
create(context, [option]) {
|
|
2908
3011
|
const { allowExpressions = true } = option;
|
|
2909
3012
|
return {
|
|
@@ -2918,8 +3021,8 @@ var no_useless_fragment_default = createRule({
|
|
|
2918
3021
|
},
|
|
2919
3022
|
defaultOptions
|
|
2920
3023
|
});
|
|
2921
|
-
var
|
|
2922
|
-
var
|
|
3024
|
+
var RULE_NAME46 = "prefer-destructuring-assignment";
|
|
3025
|
+
var RULE_FEATURES45 = [
|
|
2923
3026
|
"CHK"
|
|
2924
3027
|
];
|
|
2925
3028
|
function isMemberExpressionWithObjectName(node) {
|
|
@@ -2930,14 +3033,14 @@ var prefer_destructuring_assignment_default = createRule({
|
|
|
2930
3033
|
type: "problem",
|
|
2931
3034
|
docs: {
|
|
2932
3035
|
description: "enforce using destructuring assignment in component props and context",
|
|
2933
|
-
[Symbol.for("rule_features")]:
|
|
3036
|
+
[Symbol.for("rule_features")]: RULE_FEATURES45
|
|
2934
3037
|
},
|
|
2935
3038
|
messages: {
|
|
2936
3039
|
preferDestructuringAssignment: "Use destructuring assignment for {{name}}."
|
|
2937
3040
|
},
|
|
2938
3041
|
schema: []
|
|
2939
3042
|
},
|
|
2940
|
-
name:
|
|
3043
|
+
name: RULE_NAME46,
|
|
2941
3044
|
create(context) {
|
|
2942
3045
|
const { ctx, listeners } = core.useComponentCollector(context);
|
|
2943
3046
|
const memberExpressionWithNames = [];
|
|
@@ -3000,8 +3103,8 @@ var prefer_destructuring_assignment_default = createRule({
|
|
|
3000
3103
|
},
|
|
3001
3104
|
defaultOptions: []
|
|
3002
3105
|
});
|
|
3003
|
-
var
|
|
3004
|
-
var
|
|
3106
|
+
var RULE_NAME47 = "prefer-react-namespace-import";
|
|
3107
|
+
var RULE_FEATURES46 = [
|
|
3005
3108
|
"CHK",
|
|
3006
3109
|
"FIX"
|
|
3007
3110
|
];
|
|
@@ -3010,7 +3113,7 @@ var prefer_react_namespace_import_default = createRule({
|
|
|
3010
3113
|
type: "problem",
|
|
3011
3114
|
docs: {
|
|
3012
3115
|
description: "enforce React is imported via a namespace import",
|
|
3013
|
-
[Symbol.for("rule_features")]:
|
|
3116
|
+
[Symbol.for("rule_features")]: RULE_FEATURES46
|
|
3014
3117
|
},
|
|
3015
3118
|
fixable: "code",
|
|
3016
3119
|
messages: {
|
|
@@ -3018,7 +3121,7 @@ var prefer_react_namespace_import_default = createRule({
|
|
|
3018
3121
|
},
|
|
3019
3122
|
schema: []
|
|
3020
3123
|
},
|
|
3021
|
-
name:
|
|
3124
|
+
name: RULE_NAME47,
|
|
3022
3125
|
create(context) {
|
|
3023
3126
|
const { importSource } = shared.getSettingsFromContext(context);
|
|
3024
3127
|
return {
|
|
@@ -3054,8 +3157,8 @@ ${importStringPrefix} ${specifiers} from ${importSourceQuoted}${semiColon}`
|
|
|
3054
3157
|
},
|
|
3055
3158
|
defaultOptions: []
|
|
3056
3159
|
});
|
|
3057
|
-
var
|
|
3058
|
-
var
|
|
3160
|
+
var RULE_NAME48 = "prefer-read-only-props";
|
|
3161
|
+
var RULE_FEATURES47 = [
|
|
3059
3162
|
"CHK",
|
|
3060
3163
|
"TSC"
|
|
3061
3164
|
];
|
|
@@ -3072,14 +3175,14 @@ var prefer_read_only_props_default = createRule({
|
|
|
3072
3175
|
type: "problem",
|
|
3073
3176
|
docs: {
|
|
3074
3177
|
description: "enforce read-only props in components",
|
|
3075
|
-
[Symbol.for("rule_features")]:
|
|
3178
|
+
[Symbol.for("rule_features")]: RULE_FEATURES47
|
|
3076
3179
|
},
|
|
3077
3180
|
messages: {
|
|
3078
3181
|
preferReadOnlyProps: "A function component's props should be read-only."
|
|
3079
3182
|
},
|
|
3080
3183
|
schema: []
|
|
3081
3184
|
},
|
|
3082
|
-
name:
|
|
3185
|
+
name: RULE_NAME48,
|
|
3083
3186
|
create(context) {
|
|
3084
3187
|
const services = utils.ESLintUtils.getParserServices(context, false);
|
|
3085
3188
|
const { ctx, listeners } = core.useComponentCollector(context);
|
|
@@ -3103,8 +3206,8 @@ var prefer_read_only_props_default = createRule({
|
|
|
3103
3206
|
},
|
|
3104
3207
|
defaultOptions: []
|
|
3105
3208
|
});
|
|
3106
|
-
var
|
|
3107
|
-
var
|
|
3209
|
+
var RULE_NAME49 = "prefer-shorthand-boolean";
|
|
3210
|
+
var RULE_FEATURES48 = [
|
|
3108
3211
|
"CHK",
|
|
3109
3212
|
"FIX"
|
|
3110
3213
|
];
|
|
@@ -3113,7 +3216,7 @@ var prefer_shorthand_boolean_default = createRule({
|
|
|
3113
3216
|
type: "problem",
|
|
3114
3217
|
docs: {
|
|
3115
3218
|
description: "enforce using shorthand boolean attributes",
|
|
3116
|
-
[Symbol.for("rule_features")]:
|
|
3219
|
+
[Symbol.for("rule_features")]: RULE_FEATURES48
|
|
3117
3220
|
},
|
|
3118
3221
|
fixable: "code",
|
|
3119
3222
|
messages: {
|
|
@@ -3121,7 +3224,7 @@ var prefer_shorthand_boolean_default = createRule({
|
|
|
3121
3224
|
},
|
|
3122
3225
|
schema: []
|
|
3123
3226
|
},
|
|
3124
|
-
name:
|
|
3227
|
+
name: RULE_NAME49,
|
|
3125
3228
|
create(context) {
|
|
3126
3229
|
return {
|
|
3127
3230
|
JSXAttribute(node) {
|
|
@@ -3144,8 +3247,8 @@ var prefer_shorthand_boolean_default = createRule({
|
|
|
3144
3247
|
},
|
|
3145
3248
|
defaultOptions: []
|
|
3146
3249
|
});
|
|
3147
|
-
var
|
|
3148
|
-
var
|
|
3250
|
+
var RULE_NAME50 = "prefer-shorthand-fragment";
|
|
3251
|
+
var RULE_FEATURES49 = [
|
|
3149
3252
|
"CHK",
|
|
3150
3253
|
"FIX"
|
|
3151
3254
|
];
|
|
@@ -3154,7 +3257,7 @@ var prefer_shorthand_fragment_default = createRule({
|
|
|
3154
3257
|
type: "problem",
|
|
3155
3258
|
docs: {
|
|
3156
3259
|
description: "enforce using fragment syntax instead of 'Fragment' component",
|
|
3157
|
-
[Symbol.for("rule_features")]:
|
|
3260
|
+
[Symbol.for("rule_features")]: RULE_FEATURES49
|
|
3158
3261
|
},
|
|
3159
3262
|
fixable: "code",
|
|
3160
3263
|
messages: {
|
|
@@ -3162,7 +3265,7 @@ var prefer_shorthand_fragment_default = createRule({
|
|
|
3162
3265
|
},
|
|
3163
3266
|
schema: []
|
|
3164
3267
|
},
|
|
3165
|
-
name:
|
|
3268
|
+
name: RULE_NAME50,
|
|
3166
3269
|
create(context) {
|
|
3167
3270
|
return {
|
|
3168
3271
|
JSXElement(node) {
|
|
@@ -3190,21 +3293,21 @@ var prefer_shorthand_fragment_default = createRule({
|
|
|
3190
3293
|
},
|
|
3191
3294
|
defaultOptions: []
|
|
3192
3295
|
});
|
|
3193
|
-
var
|
|
3194
|
-
var
|
|
3296
|
+
var RULE_NAME51 = "use-jsx-vars";
|
|
3297
|
+
var RULE_FEATURES50 = [];
|
|
3195
3298
|
var use_jsx_vars_default = createRule({
|
|
3196
3299
|
meta: {
|
|
3197
3300
|
type: "problem",
|
|
3198
3301
|
docs: {
|
|
3199
3302
|
description: "helpes `eslint/no-unused-vars` to correctly mark JSX variables as used.",
|
|
3200
|
-
[Symbol.for("rule_features")]:
|
|
3303
|
+
[Symbol.for("rule_features")]: RULE_FEATURES50
|
|
3201
3304
|
},
|
|
3202
3305
|
messages: {
|
|
3203
3306
|
useJsxVars: ""
|
|
3204
3307
|
},
|
|
3205
3308
|
schema: []
|
|
3206
3309
|
},
|
|
3207
|
-
name:
|
|
3310
|
+
name: RULE_NAME51,
|
|
3208
3311
|
create(context) {
|
|
3209
3312
|
return {
|
|
3210
3313
|
JSXOpeningElement(node) {
|
|
@@ -3280,6 +3383,7 @@ var index_default = {
|
|
|
3280
3383
|
"no-unstable-default-props": no_unstable_default_props_default,
|
|
3281
3384
|
"no-unused-class-component-members": no_unused_class_component_members_default,
|
|
3282
3385
|
"no-unused-state": no_unused_state_default,
|
|
3386
|
+
"no-use-context": no_use_context_default,
|
|
3283
3387
|
"no-useless-fragment": no_useless_fragment_default,
|
|
3284
3388
|
"prefer-destructuring-assignment": prefer_destructuring_assignment_default,
|
|
3285
3389
|
"prefer-react-namespace-import": prefer_react_namespace_import_default,
|
package/dist/index.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as JSX7 from '@eslint-react/jsx';
|
|
2
2
|
import { createRuleForPlugin, getSettingsFromContext, unsafeDecodeSettings } from '@eslint-react/shared';
|
|
3
3
|
import * as AST11 from '@eslint-react/ast';
|
|
4
|
-
import { isForwardRefCall, isThisSetState, isClassComponent, isChildrenCount, isChildrenForEach, isChildrenMap, isChildrenOnly, isChildrenToArray, useComponentCollectorLegacy, isComponentDidCatch, isGetDerivedStateFromError, isCloneElementCall, isCreateRefCall, isComponentName, useComponentCollector, DEFAULT_COMPONENT_HINT, ERComponentFlag, isChildrenToArrayCall, ERComponentHint, isDirectValueOfRenderPropertyLoose, isDeclaredInRenderPropLoose, isInsideCreateElementProps, isInsideRenderMethod, isReactHookCall, isCreateElementCall, isGetDerivedStateFromProps, isInitializedFromReact } from '@eslint-react/core';
|
|
4
|
+
import { isForwardRefCall, isThisSetState, isClassComponent, isChildrenCount, isChildrenForEach, isChildrenMap, isChildrenOnly, isChildrenToArray, useComponentCollectorLegacy, isComponentDidCatch, isGetDerivedStateFromError, isCloneElementCall, isCreateRefCall, isComponentName, useComponentCollector, DEFAULT_COMPONENT_HINT, ERComponentFlag, isChildrenToArrayCall, ERComponentHint, isDirectValueOfRenderPropertyLoose, isDeclaredInRenderPropLoose, isInsideCreateElementProps, isInsideRenderMethod, isReactHookCall, isReactHookCallWithNameAlias, isCreateElementCall, isGetDerivedStateFromProps, isInitializedFromReact } from '@eslint-react/core';
|
|
5
5
|
import { _, getOrUpdate, identity } from '@eslint-react/eff';
|
|
6
6
|
import { AST_NODE_TYPES } from '@typescript-eslint/types';
|
|
7
7
|
import { isMatching, match, P } from 'ts-pattern';
|
|
@@ -15,9 +15,25 @@ import { getTypeImmutability, isUnknown, isImmutable, isReadonlyShallow, isReado
|
|
|
15
15
|
|
|
16
16
|
// package.json
|
|
17
17
|
var name = "eslint-plugin-react-x";
|
|
18
|
-
var version = "1.
|
|
18
|
+
var version = "1.26.0-beta.4";
|
|
19
19
|
var createRule = createRuleForPlugin("x");
|
|
20
20
|
|
|
21
|
+
// src/utils/get-associated-tokens.ts
|
|
22
|
+
function getAssociatedTokens(context, node) {
|
|
23
|
+
{
|
|
24
|
+
const tokenBefore = context.sourceCode.getTokenBefore(node);
|
|
25
|
+
const tokenAfter = context.sourceCode.getTokenAfter(node);
|
|
26
|
+
const tokens = [];
|
|
27
|
+
if (tokenAfter?.value !== "," && tokenBefore?.value === ",") {
|
|
28
|
+
tokens.push(tokenBefore);
|
|
29
|
+
}
|
|
30
|
+
if (tokenAfter?.value === ",") {
|
|
31
|
+
tokens.push(tokenAfter);
|
|
32
|
+
}
|
|
33
|
+
return tokens;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
21
37
|
// src/rules/avoid-shorthand-boolean.ts
|
|
22
38
|
var RULE_NAME = "avoid-shorthand-boolean";
|
|
23
39
|
var RULE_FEATURES = [
|
|
@@ -2784,7 +2800,94 @@ var no_unused_state_default = createRule({
|
|
|
2784
2800
|
},
|
|
2785
2801
|
defaultOptions: []
|
|
2786
2802
|
});
|
|
2787
|
-
var RULE_NAME44 = "no-
|
|
2803
|
+
var RULE_NAME44 = "no-use-context";
|
|
2804
|
+
var RULE_FEATURES44 = [
|
|
2805
|
+
"CHK",
|
|
2806
|
+
"MOD"
|
|
2807
|
+
];
|
|
2808
|
+
var no_use_context_default = createRule({
|
|
2809
|
+
meta: {
|
|
2810
|
+
type: "problem",
|
|
2811
|
+
docs: {
|
|
2812
|
+
description: "disallow the use of 'useContext'",
|
|
2813
|
+
[Symbol.for("rule_features")]: RULE_FEATURES44
|
|
2814
|
+
},
|
|
2815
|
+
fixable: "code",
|
|
2816
|
+
messages: {
|
|
2817
|
+
noUseContext: "In React 19, 'use' is preferred over 'useContext' because it is more flexible."
|
|
2818
|
+
},
|
|
2819
|
+
schema: []
|
|
2820
|
+
},
|
|
2821
|
+
name: RULE_NAME44,
|
|
2822
|
+
create(context) {
|
|
2823
|
+
const settings = getSettingsFromContext(context);
|
|
2824
|
+
const useContextAlias = /* @__PURE__ */ new Set();
|
|
2825
|
+
if (!context.sourceCode.text.includes("useContext")) {
|
|
2826
|
+
return {};
|
|
2827
|
+
}
|
|
2828
|
+
if (compare(settings.version, "19.0.0", "<")) {
|
|
2829
|
+
return {};
|
|
2830
|
+
}
|
|
2831
|
+
return {
|
|
2832
|
+
CallExpression(node) {
|
|
2833
|
+
if (!isReactHookCall(node)) {
|
|
2834
|
+
return;
|
|
2835
|
+
}
|
|
2836
|
+
if (!isReactHookCallWithNameAlias("useContext", context, [...useContextAlias])(node)) {
|
|
2837
|
+
return;
|
|
2838
|
+
}
|
|
2839
|
+
context.report({
|
|
2840
|
+
messageId: "noUseContext",
|
|
2841
|
+
node,
|
|
2842
|
+
fix(fixer) {
|
|
2843
|
+
switch (node.callee.type) {
|
|
2844
|
+
case AST_NODE_TYPES.Identifier:
|
|
2845
|
+
return fixer.replaceText(node.callee, "use");
|
|
2846
|
+
case AST_NODE_TYPES.MemberExpression:
|
|
2847
|
+
return fixer.replaceText(node.callee.property, "use");
|
|
2848
|
+
}
|
|
2849
|
+
return null;
|
|
2850
|
+
}
|
|
2851
|
+
});
|
|
2852
|
+
},
|
|
2853
|
+
ImportDeclaration(node) {
|
|
2854
|
+
if (node.source.value !== settings.importSource) {
|
|
2855
|
+
return;
|
|
2856
|
+
}
|
|
2857
|
+
const isUseImported = node.specifiers.some(isMatching({ local: { type: AST_NODE_TYPES.Identifier, name: "use" } }));
|
|
2858
|
+
for (const specifier of node.specifiers) {
|
|
2859
|
+
if (specifier.type !== AST_NODE_TYPES.ImportSpecifier) continue;
|
|
2860
|
+
if (specifier.imported.type !== AST_NODE_TYPES.Identifier) continue;
|
|
2861
|
+
if (specifier.imported.name === "useContext") {
|
|
2862
|
+
if (specifier.local.name !== "useContext") {
|
|
2863
|
+
useContextAlias.add(specifier.local.name);
|
|
2864
|
+
}
|
|
2865
|
+
context.report({
|
|
2866
|
+
messageId: "noUseContext",
|
|
2867
|
+
node: specifier,
|
|
2868
|
+
fix(fixer) {
|
|
2869
|
+
if (isUseImported) {
|
|
2870
|
+
const tokenBefore = context.sourceCode.getTokenBefore(specifier);
|
|
2871
|
+
return [
|
|
2872
|
+
fixer.remove(specifier),
|
|
2873
|
+
...tokenBefore?.value === "," ? [fixer.replaceTextRange([tokenBefore.range[1], specifier.range[0]], "")] : [],
|
|
2874
|
+
...getAssociatedTokens(
|
|
2875
|
+
context,
|
|
2876
|
+
specifier
|
|
2877
|
+
).map((token) => fixer.remove(token))
|
|
2878
|
+
];
|
|
2879
|
+
}
|
|
2880
|
+
return fixer.replaceText(specifier.imported, "use");
|
|
2881
|
+
}
|
|
2882
|
+
});
|
|
2883
|
+
}
|
|
2884
|
+
}
|
|
2885
|
+
}
|
|
2886
|
+
};
|
|
2887
|
+
},
|
|
2888
|
+
defaultOptions: []
|
|
2889
|
+
});
|
|
2890
|
+
var RULE_NAME45 = "no-useless-fragment";
|
|
2788
2891
|
var defaultOptions = [{
|
|
2789
2892
|
allowExpressions: true
|
|
2790
2893
|
}];
|
|
@@ -2876,7 +2979,7 @@ var no_useless_fragment_default = createRule({
|
|
|
2876
2979
|
}
|
|
2877
2980
|
}]
|
|
2878
2981
|
},
|
|
2879
|
-
name:
|
|
2982
|
+
name: RULE_NAME45,
|
|
2880
2983
|
create(context, [option]) {
|
|
2881
2984
|
const { allowExpressions = true } = option;
|
|
2882
2985
|
return {
|
|
@@ -2891,8 +2994,8 @@ var no_useless_fragment_default = createRule({
|
|
|
2891
2994
|
},
|
|
2892
2995
|
defaultOptions
|
|
2893
2996
|
});
|
|
2894
|
-
var
|
|
2895
|
-
var
|
|
2997
|
+
var RULE_NAME46 = "prefer-destructuring-assignment";
|
|
2998
|
+
var RULE_FEATURES45 = [
|
|
2896
2999
|
"CHK"
|
|
2897
3000
|
];
|
|
2898
3001
|
function isMemberExpressionWithObjectName(node) {
|
|
@@ -2903,14 +3006,14 @@ var prefer_destructuring_assignment_default = createRule({
|
|
|
2903
3006
|
type: "problem",
|
|
2904
3007
|
docs: {
|
|
2905
3008
|
description: "enforce using destructuring assignment in component props and context",
|
|
2906
|
-
[Symbol.for("rule_features")]:
|
|
3009
|
+
[Symbol.for("rule_features")]: RULE_FEATURES45
|
|
2907
3010
|
},
|
|
2908
3011
|
messages: {
|
|
2909
3012
|
preferDestructuringAssignment: "Use destructuring assignment for {{name}}."
|
|
2910
3013
|
},
|
|
2911
3014
|
schema: []
|
|
2912
3015
|
},
|
|
2913
|
-
name:
|
|
3016
|
+
name: RULE_NAME46,
|
|
2914
3017
|
create(context) {
|
|
2915
3018
|
const { ctx, listeners } = useComponentCollector(context);
|
|
2916
3019
|
const memberExpressionWithNames = [];
|
|
@@ -2973,8 +3076,8 @@ var prefer_destructuring_assignment_default = createRule({
|
|
|
2973
3076
|
},
|
|
2974
3077
|
defaultOptions: []
|
|
2975
3078
|
});
|
|
2976
|
-
var
|
|
2977
|
-
var
|
|
3079
|
+
var RULE_NAME47 = "prefer-react-namespace-import";
|
|
3080
|
+
var RULE_FEATURES46 = [
|
|
2978
3081
|
"CHK",
|
|
2979
3082
|
"FIX"
|
|
2980
3083
|
];
|
|
@@ -2983,7 +3086,7 @@ var prefer_react_namespace_import_default = createRule({
|
|
|
2983
3086
|
type: "problem",
|
|
2984
3087
|
docs: {
|
|
2985
3088
|
description: "enforce React is imported via a namespace import",
|
|
2986
|
-
[Symbol.for("rule_features")]:
|
|
3089
|
+
[Symbol.for("rule_features")]: RULE_FEATURES46
|
|
2987
3090
|
},
|
|
2988
3091
|
fixable: "code",
|
|
2989
3092
|
messages: {
|
|
@@ -2991,7 +3094,7 @@ var prefer_react_namespace_import_default = createRule({
|
|
|
2991
3094
|
},
|
|
2992
3095
|
schema: []
|
|
2993
3096
|
},
|
|
2994
|
-
name:
|
|
3097
|
+
name: RULE_NAME47,
|
|
2995
3098
|
create(context) {
|
|
2996
3099
|
const { importSource } = getSettingsFromContext(context);
|
|
2997
3100
|
return {
|
|
@@ -3027,8 +3130,8 @@ ${importStringPrefix} ${specifiers} from ${importSourceQuoted}${semiColon}`
|
|
|
3027
3130
|
},
|
|
3028
3131
|
defaultOptions: []
|
|
3029
3132
|
});
|
|
3030
|
-
var
|
|
3031
|
-
var
|
|
3133
|
+
var RULE_NAME48 = "prefer-read-only-props";
|
|
3134
|
+
var RULE_FEATURES47 = [
|
|
3032
3135
|
"CHK",
|
|
3033
3136
|
"TSC"
|
|
3034
3137
|
];
|
|
@@ -3045,14 +3148,14 @@ var prefer_read_only_props_default = createRule({
|
|
|
3045
3148
|
type: "problem",
|
|
3046
3149
|
docs: {
|
|
3047
3150
|
description: "enforce read-only props in components",
|
|
3048
|
-
[Symbol.for("rule_features")]:
|
|
3151
|
+
[Symbol.for("rule_features")]: RULE_FEATURES47
|
|
3049
3152
|
},
|
|
3050
3153
|
messages: {
|
|
3051
3154
|
preferReadOnlyProps: "A function component's props should be read-only."
|
|
3052
3155
|
},
|
|
3053
3156
|
schema: []
|
|
3054
3157
|
},
|
|
3055
|
-
name:
|
|
3158
|
+
name: RULE_NAME48,
|
|
3056
3159
|
create(context) {
|
|
3057
3160
|
const services = ESLintUtils.getParserServices(context, false);
|
|
3058
3161
|
const { ctx, listeners } = useComponentCollector(context);
|
|
@@ -3076,8 +3179,8 @@ var prefer_read_only_props_default = createRule({
|
|
|
3076
3179
|
},
|
|
3077
3180
|
defaultOptions: []
|
|
3078
3181
|
});
|
|
3079
|
-
var
|
|
3080
|
-
var
|
|
3182
|
+
var RULE_NAME49 = "prefer-shorthand-boolean";
|
|
3183
|
+
var RULE_FEATURES48 = [
|
|
3081
3184
|
"CHK",
|
|
3082
3185
|
"FIX"
|
|
3083
3186
|
];
|
|
@@ -3086,7 +3189,7 @@ var prefer_shorthand_boolean_default = createRule({
|
|
|
3086
3189
|
type: "problem",
|
|
3087
3190
|
docs: {
|
|
3088
3191
|
description: "enforce using shorthand boolean attributes",
|
|
3089
|
-
[Symbol.for("rule_features")]:
|
|
3192
|
+
[Symbol.for("rule_features")]: RULE_FEATURES48
|
|
3090
3193
|
},
|
|
3091
3194
|
fixable: "code",
|
|
3092
3195
|
messages: {
|
|
@@ -3094,7 +3197,7 @@ var prefer_shorthand_boolean_default = createRule({
|
|
|
3094
3197
|
},
|
|
3095
3198
|
schema: []
|
|
3096
3199
|
},
|
|
3097
|
-
name:
|
|
3200
|
+
name: RULE_NAME49,
|
|
3098
3201
|
create(context) {
|
|
3099
3202
|
return {
|
|
3100
3203
|
JSXAttribute(node) {
|
|
@@ -3117,8 +3220,8 @@ var prefer_shorthand_boolean_default = createRule({
|
|
|
3117
3220
|
},
|
|
3118
3221
|
defaultOptions: []
|
|
3119
3222
|
});
|
|
3120
|
-
var
|
|
3121
|
-
var
|
|
3223
|
+
var RULE_NAME50 = "prefer-shorthand-fragment";
|
|
3224
|
+
var RULE_FEATURES49 = [
|
|
3122
3225
|
"CHK",
|
|
3123
3226
|
"FIX"
|
|
3124
3227
|
];
|
|
@@ -3127,7 +3230,7 @@ var prefer_shorthand_fragment_default = createRule({
|
|
|
3127
3230
|
type: "problem",
|
|
3128
3231
|
docs: {
|
|
3129
3232
|
description: "enforce using fragment syntax instead of 'Fragment' component",
|
|
3130
|
-
[Symbol.for("rule_features")]:
|
|
3233
|
+
[Symbol.for("rule_features")]: RULE_FEATURES49
|
|
3131
3234
|
},
|
|
3132
3235
|
fixable: "code",
|
|
3133
3236
|
messages: {
|
|
@@ -3135,7 +3238,7 @@ var prefer_shorthand_fragment_default = createRule({
|
|
|
3135
3238
|
},
|
|
3136
3239
|
schema: []
|
|
3137
3240
|
},
|
|
3138
|
-
name:
|
|
3241
|
+
name: RULE_NAME50,
|
|
3139
3242
|
create(context) {
|
|
3140
3243
|
return {
|
|
3141
3244
|
JSXElement(node) {
|
|
@@ -3163,21 +3266,21 @@ var prefer_shorthand_fragment_default = createRule({
|
|
|
3163
3266
|
},
|
|
3164
3267
|
defaultOptions: []
|
|
3165
3268
|
});
|
|
3166
|
-
var
|
|
3167
|
-
var
|
|
3269
|
+
var RULE_NAME51 = "use-jsx-vars";
|
|
3270
|
+
var RULE_FEATURES50 = [];
|
|
3168
3271
|
var use_jsx_vars_default = createRule({
|
|
3169
3272
|
meta: {
|
|
3170
3273
|
type: "problem",
|
|
3171
3274
|
docs: {
|
|
3172
3275
|
description: "helpes `eslint/no-unused-vars` to correctly mark JSX variables as used.",
|
|
3173
|
-
[Symbol.for("rule_features")]:
|
|
3276
|
+
[Symbol.for("rule_features")]: RULE_FEATURES50
|
|
3174
3277
|
},
|
|
3175
3278
|
messages: {
|
|
3176
3279
|
useJsxVars: ""
|
|
3177
3280
|
},
|
|
3178
3281
|
schema: []
|
|
3179
3282
|
},
|
|
3180
|
-
name:
|
|
3283
|
+
name: RULE_NAME51,
|
|
3181
3284
|
create(context) {
|
|
3182
3285
|
return {
|
|
3183
3286
|
JSXOpeningElement(node) {
|
|
@@ -3253,6 +3356,7 @@ var index_default = {
|
|
|
3253
3356
|
"no-unstable-default-props": no_unstable_default_props_default,
|
|
3254
3357
|
"no-unused-class-component-members": no_unused_class_component_members_default,
|
|
3255
3358
|
"no-unused-state": no_unused_state_default,
|
|
3359
|
+
"no-use-context": no_use_context_default,
|
|
3256
3360
|
"no-useless-fragment": no_useless_fragment_default,
|
|
3257
3361
|
"prefer-destructuring-assignment": prefer_destructuring_assignment_default,
|
|
3258
3362
|
"prefer-react-namespace-import": prefer_react_namespace_import_default,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eslint-plugin-react-x",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.26.0-beta.4",
|
|
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",
|
|
@@ -40,20 +40,20 @@
|
|
|
40
40
|
"./package.json"
|
|
41
41
|
],
|
|
42
42
|
"dependencies": {
|
|
43
|
-
"@typescript-eslint/scope-manager": "^8.
|
|
44
|
-
"@typescript-eslint/type-utils": "^8.
|
|
45
|
-
"@typescript-eslint/types": "^8.
|
|
46
|
-
"@typescript-eslint/utils": "^8.
|
|
43
|
+
"@typescript-eslint/scope-manager": "^8.22.0",
|
|
44
|
+
"@typescript-eslint/type-utils": "^8.22.0",
|
|
45
|
+
"@typescript-eslint/types": "^8.22.0",
|
|
46
|
+
"@typescript-eslint/utils": "^8.22.0",
|
|
47
47
|
"compare-versions": "^6.1.1",
|
|
48
48
|
"is-immutable-type": "^5.0.1",
|
|
49
49
|
"string-ts": "^2.2.0",
|
|
50
50
|
"ts-pattern": "^5.6.2",
|
|
51
|
-
"@eslint-react/ast": "1.
|
|
52
|
-
"@eslint-react/core": "1.
|
|
53
|
-
"@eslint-react/eff": "1.
|
|
54
|
-
"@eslint-react/
|
|
55
|
-
"@eslint-react/
|
|
56
|
-
"@eslint-react/
|
|
51
|
+
"@eslint-react/ast": "1.26.0-beta.4",
|
|
52
|
+
"@eslint-react/core": "1.26.0-beta.4",
|
|
53
|
+
"@eslint-react/eff": "1.26.0-beta.4",
|
|
54
|
+
"@eslint-react/jsx": "1.26.0-beta.4",
|
|
55
|
+
"@eslint-react/var": "1.26.0-beta.4",
|
|
56
|
+
"@eslint-react/shared": "1.26.0-beta.4"
|
|
57
57
|
},
|
|
58
58
|
"devDependencies": {
|
|
59
59
|
"@types/react": "^19.0.8",
|