eslint-plugin-react-x 1.25.1-next.0 → 1.26.0-beta.3
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 +136 -27
- package/dist/index.mjs +137 -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.3";
|
|
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,99 @@ 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
|
+
context.report({
|
|
2892
|
+
messageId: "noUseContext",
|
|
2893
|
+
node: specifier
|
|
2894
|
+
});
|
|
2895
|
+
return;
|
|
2896
|
+
}
|
|
2897
|
+
context.report({
|
|
2898
|
+
messageId: "noUseContext",
|
|
2899
|
+
node: specifier,
|
|
2900
|
+
fix(fixer) {
|
|
2901
|
+
if (isUseImported) {
|
|
2902
|
+
const tokenBefore = context.sourceCode.getTokenBefore(specifier);
|
|
2903
|
+
return [
|
|
2904
|
+
fixer.remove(specifier),
|
|
2905
|
+
...tokenBefore?.value === "," ? [fixer.replaceTextRange([tokenBefore.range[1], specifier.range[0]], "")] : [],
|
|
2906
|
+
...getAssociatedTokens(
|
|
2907
|
+
context,
|
|
2908
|
+
specifier
|
|
2909
|
+
).map((token) => fixer.remove(token))
|
|
2910
|
+
];
|
|
2911
|
+
}
|
|
2912
|
+
return fixer.replaceText(specifier.imported, "use");
|
|
2913
|
+
}
|
|
2914
|
+
});
|
|
2915
|
+
}
|
|
2916
|
+
}
|
|
2917
|
+
}
|
|
2918
|
+
};
|
|
2919
|
+
},
|
|
2920
|
+
defaultOptions: []
|
|
2921
|
+
});
|
|
2922
|
+
var RULE_NAME45 = "no-useless-fragment";
|
|
2815
2923
|
var defaultOptions = [{
|
|
2816
2924
|
allowExpressions: true
|
|
2817
2925
|
}];
|
|
@@ -2903,7 +3011,7 @@ var no_useless_fragment_default = createRule({
|
|
|
2903
3011
|
}
|
|
2904
3012
|
}]
|
|
2905
3013
|
},
|
|
2906
|
-
name:
|
|
3014
|
+
name: RULE_NAME45,
|
|
2907
3015
|
create(context, [option]) {
|
|
2908
3016
|
const { allowExpressions = true } = option;
|
|
2909
3017
|
return {
|
|
@@ -2918,8 +3026,8 @@ var no_useless_fragment_default = createRule({
|
|
|
2918
3026
|
},
|
|
2919
3027
|
defaultOptions
|
|
2920
3028
|
});
|
|
2921
|
-
var
|
|
2922
|
-
var
|
|
3029
|
+
var RULE_NAME46 = "prefer-destructuring-assignment";
|
|
3030
|
+
var RULE_FEATURES45 = [
|
|
2923
3031
|
"CHK"
|
|
2924
3032
|
];
|
|
2925
3033
|
function isMemberExpressionWithObjectName(node) {
|
|
@@ -2930,14 +3038,14 @@ var prefer_destructuring_assignment_default = createRule({
|
|
|
2930
3038
|
type: "problem",
|
|
2931
3039
|
docs: {
|
|
2932
3040
|
description: "enforce using destructuring assignment in component props and context",
|
|
2933
|
-
[Symbol.for("rule_features")]:
|
|
3041
|
+
[Symbol.for("rule_features")]: RULE_FEATURES45
|
|
2934
3042
|
},
|
|
2935
3043
|
messages: {
|
|
2936
3044
|
preferDestructuringAssignment: "Use destructuring assignment for {{name}}."
|
|
2937
3045
|
},
|
|
2938
3046
|
schema: []
|
|
2939
3047
|
},
|
|
2940
|
-
name:
|
|
3048
|
+
name: RULE_NAME46,
|
|
2941
3049
|
create(context) {
|
|
2942
3050
|
const { ctx, listeners } = core.useComponentCollector(context);
|
|
2943
3051
|
const memberExpressionWithNames = [];
|
|
@@ -3000,8 +3108,8 @@ var prefer_destructuring_assignment_default = createRule({
|
|
|
3000
3108
|
},
|
|
3001
3109
|
defaultOptions: []
|
|
3002
3110
|
});
|
|
3003
|
-
var
|
|
3004
|
-
var
|
|
3111
|
+
var RULE_NAME47 = "prefer-react-namespace-import";
|
|
3112
|
+
var RULE_FEATURES46 = [
|
|
3005
3113
|
"CHK",
|
|
3006
3114
|
"FIX"
|
|
3007
3115
|
];
|
|
@@ -3010,7 +3118,7 @@ var prefer_react_namespace_import_default = createRule({
|
|
|
3010
3118
|
type: "problem",
|
|
3011
3119
|
docs: {
|
|
3012
3120
|
description: "enforce React is imported via a namespace import",
|
|
3013
|
-
[Symbol.for("rule_features")]:
|
|
3121
|
+
[Symbol.for("rule_features")]: RULE_FEATURES46
|
|
3014
3122
|
},
|
|
3015
3123
|
fixable: "code",
|
|
3016
3124
|
messages: {
|
|
@@ -3018,7 +3126,7 @@ var prefer_react_namespace_import_default = createRule({
|
|
|
3018
3126
|
},
|
|
3019
3127
|
schema: []
|
|
3020
3128
|
},
|
|
3021
|
-
name:
|
|
3129
|
+
name: RULE_NAME47,
|
|
3022
3130
|
create(context) {
|
|
3023
3131
|
const { importSource } = shared.getSettingsFromContext(context);
|
|
3024
3132
|
return {
|
|
@@ -3054,8 +3162,8 @@ ${importStringPrefix} ${specifiers} from ${importSourceQuoted}${semiColon}`
|
|
|
3054
3162
|
},
|
|
3055
3163
|
defaultOptions: []
|
|
3056
3164
|
});
|
|
3057
|
-
var
|
|
3058
|
-
var
|
|
3165
|
+
var RULE_NAME48 = "prefer-read-only-props";
|
|
3166
|
+
var RULE_FEATURES47 = [
|
|
3059
3167
|
"CHK",
|
|
3060
3168
|
"TSC"
|
|
3061
3169
|
];
|
|
@@ -3072,14 +3180,14 @@ var prefer_read_only_props_default = createRule({
|
|
|
3072
3180
|
type: "problem",
|
|
3073
3181
|
docs: {
|
|
3074
3182
|
description: "enforce read-only props in components",
|
|
3075
|
-
[Symbol.for("rule_features")]:
|
|
3183
|
+
[Symbol.for("rule_features")]: RULE_FEATURES47
|
|
3076
3184
|
},
|
|
3077
3185
|
messages: {
|
|
3078
3186
|
preferReadOnlyProps: "A function component's props should be read-only."
|
|
3079
3187
|
},
|
|
3080
3188
|
schema: []
|
|
3081
3189
|
},
|
|
3082
|
-
name:
|
|
3190
|
+
name: RULE_NAME48,
|
|
3083
3191
|
create(context) {
|
|
3084
3192
|
const services = utils.ESLintUtils.getParserServices(context, false);
|
|
3085
3193
|
const { ctx, listeners } = core.useComponentCollector(context);
|
|
@@ -3103,8 +3211,8 @@ var prefer_read_only_props_default = createRule({
|
|
|
3103
3211
|
},
|
|
3104
3212
|
defaultOptions: []
|
|
3105
3213
|
});
|
|
3106
|
-
var
|
|
3107
|
-
var
|
|
3214
|
+
var RULE_NAME49 = "prefer-shorthand-boolean";
|
|
3215
|
+
var RULE_FEATURES48 = [
|
|
3108
3216
|
"CHK",
|
|
3109
3217
|
"FIX"
|
|
3110
3218
|
];
|
|
@@ -3113,7 +3221,7 @@ var prefer_shorthand_boolean_default = createRule({
|
|
|
3113
3221
|
type: "problem",
|
|
3114
3222
|
docs: {
|
|
3115
3223
|
description: "enforce using shorthand boolean attributes",
|
|
3116
|
-
[Symbol.for("rule_features")]:
|
|
3224
|
+
[Symbol.for("rule_features")]: RULE_FEATURES48
|
|
3117
3225
|
},
|
|
3118
3226
|
fixable: "code",
|
|
3119
3227
|
messages: {
|
|
@@ -3121,7 +3229,7 @@ var prefer_shorthand_boolean_default = createRule({
|
|
|
3121
3229
|
},
|
|
3122
3230
|
schema: []
|
|
3123
3231
|
},
|
|
3124
|
-
name:
|
|
3232
|
+
name: RULE_NAME49,
|
|
3125
3233
|
create(context) {
|
|
3126
3234
|
return {
|
|
3127
3235
|
JSXAttribute(node) {
|
|
@@ -3144,8 +3252,8 @@ var prefer_shorthand_boolean_default = createRule({
|
|
|
3144
3252
|
},
|
|
3145
3253
|
defaultOptions: []
|
|
3146
3254
|
});
|
|
3147
|
-
var
|
|
3148
|
-
var
|
|
3255
|
+
var RULE_NAME50 = "prefer-shorthand-fragment";
|
|
3256
|
+
var RULE_FEATURES49 = [
|
|
3149
3257
|
"CHK",
|
|
3150
3258
|
"FIX"
|
|
3151
3259
|
];
|
|
@@ -3154,7 +3262,7 @@ var prefer_shorthand_fragment_default = createRule({
|
|
|
3154
3262
|
type: "problem",
|
|
3155
3263
|
docs: {
|
|
3156
3264
|
description: "enforce using fragment syntax instead of 'Fragment' component",
|
|
3157
|
-
[Symbol.for("rule_features")]:
|
|
3265
|
+
[Symbol.for("rule_features")]: RULE_FEATURES49
|
|
3158
3266
|
},
|
|
3159
3267
|
fixable: "code",
|
|
3160
3268
|
messages: {
|
|
@@ -3162,7 +3270,7 @@ var prefer_shorthand_fragment_default = createRule({
|
|
|
3162
3270
|
},
|
|
3163
3271
|
schema: []
|
|
3164
3272
|
},
|
|
3165
|
-
name:
|
|
3273
|
+
name: RULE_NAME50,
|
|
3166
3274
|
create(context) {
|
|
3167
3275
|
return {
|
|
3168
3276
|
JSXElement(node) {
|
|
@@ -3190,21 +3298,21 @@ var prefer_shorthand_fragment_default = createRule({
|
|
|
3190
3298
|
},
|
|
3191
3299
|
defaultOptions: []
|
|
3192
3300
|
});
|
|
3193
|
-
var
|
|
3194
|
-
var
|
|
3301
|
+
var RULE_NAME51 = "use-jsx-vars";
|
|
3302
|
+
var RULE_FEATURES50 = [];
|
|
3195
3303
|
var use_jsx_vars_default = createRule({
|
|
3196
3304
|
meta: {
|
|
3197
3305
|
type: "problem",
|
|
3198
3306
|
docs: {
|
|
3199
3307
|
description: "helpes `eslint/no-unused-vars` to correctly mark JSX variables as used.",
|
|
3200
|
-
[Symbol.for("rule_features")]:
|
|
3308
|
+
[Symbol.for("rule_features")]: RULE_FEATURES50
|
|
3201
3309
|
},
|
|
3202
3310
|
messages: {
|
|
3203
3311
|
useJsxVars: ""
|
|
3204
3312
|
},
|
|
3205
3313
|
schema: []
|
|
3206
3314
|
},
|
|
3207
|
-
name:
|
|
3315
|
+
name: RULE_NAME51,
|
|
3208
3316
|
create(context) {
|
|
3209
3317
|
return {
|
|
3210
3318
|
JSXOpeningElement(node) {
|
|
@@ -3280,6 +3388,7 @@ var index_default = {
|
|
|
3280
3388
|
"no-unstable-default-props": no_unstable_default_props_default,
|
|
3281
3389
|
"no-unused-class-component-members": no_unused_class_component_members_default,
|
|
3282
3390
|
"no-unused-state": no_unused_state_default,
|
|
3391
|
+
"no-use-context": no_use_context_default,
|
|
3283
3392
|
"no-useless-fragment": no_useless_fragment_default,
|
|
3284
3393
|
"prefer-destructuring-assignment": prefer_destructuring_assignment_default,
|
|
3285
3394
|
"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.3";
|
|
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,99 @@ 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
|
+
context.report({
|
|
2865
|
+
messageId: "noUseContext",
|
|
2866
|
+
node: specifier
|
|
2867
|
+
});
|
|
2868
|
+
return;
|
|
2869
|
+
}
|
|
2870
|
+
context.report({
|
|
2871
|
+
messageId: "noUseContext",
|
|
2872
|
+
node: specifier,
|
|
2873
|
+
fix(fixer) {
|
|
2874
|
+
if (isUseImported) {
|
|
2875
|
+
const tokenBefore = context.sourceCode.getTokenBefore(specifier);
|
|
2876
|
+
return [
|
|
2877
|
+
fixer.remove(specifier),
|
|
2878
|
+
...tokenBefore?.value === "," ? [fixer.replaceTextRange([tokenBefore.range[1], specifier.range[0]], "")] : [],
|
|
2879
|
+
...getAssociatedTokens(
|
|
2880
|
+
context,
|
|
2881
|
+
specifier
|
|
2882
|
+
).map((token) => fixer.remove(token))
|
|
2883
|
+
];
|
|
2884
|
+
}
|
|
2885
|
+
return fixer.replaceText(specifier.imported, "use");
|
|
2886
|
+
}
|
|
2887
|
+
});
|
|
2888
|
+
}
|
|
2889
|
+
}
|
|
2890
|
+
}
|
|
2891
|
+
};
|
|
2892
|
+
},
|
|
2893
|
+
defaultOptions: []
|
|
2894
|
+
});
|
|
2895
|
+
var RULE_NAME45 = "no-useless-fragment";
|
|
2788
2896
|
var defaultOptions = [{
|
|
2789
2897
|
allowExpressions: true
|
|
2790
2898
|
}];
|
|
@@ -2876,7 +2984,7 @@ var no_useless_fragment_default = createRule({
|
|
|
2876
2984
|
}
|
|
2877
2985
|
}]
|
|
2878
2986
|
},
|
|
2879
|
-
name:
|
|
2987
|
+
name: RULE_NAME45,
|
|
2880
2988
|
create(context, [option]) {
|
|
2881
2989
|
const { allowExpressions = true } = option;
|
|
2882
2990
|
return {
|
|
@@ -2891,8 +2999,8 @@ var no_useless_fragment_default = createRule({
|
|
|
2891
2999
|
},
|
|
2892
3000
|
defaultOptions
|
|
2893
3001
|
});
|
|
2894
|
-
var
|
|
2895
|
-
var
|
|
3002
|
+
var RULE_NAME46 = "prefer-destructuring-assignment";
|
|
3003
|
+
var RULE_FEATURES45 = [
|
|
2896
3004
|
"CHK"
|
|
2897
3005
|
];
|
|
2898
3006
|
function isMemberExpressionWithObjectName(node) {
|
|
@@ -2903,14 +3011,14 @@ var prefer_destructuring_assignment_default = createRule({
|
|
|
2903
3011
|
type: "problem",
|
|
2904
3012
|
docs: {
|
|
2905
3013
|
description: "enforce using destructuring assignment in component props and context",
|
|
2906
|
-
[Symbol.for("rule_features")]:
|
|
3014
|
+
[Symbol.for("rule_features")]: RULE_FEATURES45
|
|
2907
3015
|
},
|
|
2908
3016
|
messages: {
|
|
2909
3017
|
preferDestructuringAssignment: "Use destructuring assignment for {{name}}."
|
|
2910
3018
|
},
|
|
2911
3019
|
schema: []
|
|
2912
3020
|
},
|
|
2913
|
-
name:
|
|
3021
|
+
name: RULE_NAME46,
|
|
2914
3022
|
create(context) {
|
|
2915
3023
|
const { ctx, listeners } = useComponentCollector(context);
|
|
2916
3024
|
const memberExpressionWithNames = [];
|
|
@@ -2973,8 +3081,8 @@ var prefer_destructuring_assignment_default = createRule({
|
|
|
2973
3081
|
},
|
|
2974
3082
|
defaultOptions: []
|
|
2975
3083
|
});
|
|
2976
|
-
var
|
|
2977
|
-
var
|
|
3084
|
+
var RULE_NAME47 = "prefer-react-namespace-import";
|
|
3085
|
+
var RULE_FEATURES46 = [
|
|
2978
3086
|
"CHK",
|
|
2979
3087
|
"FIX"
|
|
2980
3088
|
];
|
|
@@ -2983,7 +3091,7 @@ var prefer_react_namespace_import_default = createRule({
|
|
|
2983
3091
|
type: "problem",
|
|
2984
3092
|
docs: {
|
|
2985
3093
|
description: "enforce React is imported via a namespace import",
|
|
2986
|
-
[Symbol.for("rule_features")]:
|
|
3094
|
+
[Symbol.for("rule_features")]: RULE_FEATURES46
|
|
2987
3095
|
},
|
|
2988
3096
|
fixable: "code",
|
|
2989
3097
|
messages: {
|
|
@@ -2991,7 +3099,7 @@ var prefer_react_namespace_import_default = createRule({
|
|
|
2991
3099
|
},
|
|
2992
3100
|
schema: []
|
|
2993
3101
|
},
|
|
2994
|
-
name:
|
|
3102
|
+
name: RULE_NAME47,
|
|
2995
3103
|
create(context) {
|
|
2996
3104
|
const { importSource } = getSettingsFromContext(context);
|
|
2997
3105
|
return {
|
|
@@ -3027,8 +3135,8 @@ ${importStringPrefix} ${specifiers} from ${importSourceQuoted}${semiColon}`
|
|
|
3027
3135
|
},
|
|
3028
3136
|
defaultOptions: []
|
|
3029
3137
|
});
|
|
3030
|
-
var
|
|
3031
|
-
var
|
|
3138
|
+
var RULE_NAME48 = "prefer-read-only-props";
|
|
3139
|
+
var RULE_FEATURES47 = [
|
|
3032
3140
|
"CHK",
|
|
3033
3141
|
"TSC"
|
|
3034
3142
|
];
|
|
@@ -3045,14 +3153,14 @@ var prefer_read_only_props_default = createRule({
|
|
|
3045
3153
|
type: "problem",
|
|
3046
3154
|
docs: {
|
|
3047
3155
|
description: "enforce read-only props in components",
|
|
3048
|
-
[Symbol.for("rule_features")]:
|
|
3156
|
+
[Symbol.for("rule_features")]: RULE_FEATURES47
|
|
3049
3157
|
},
|
|
3050
3158
|
messages: {
|
|
3051
3159
|
preferReadOnlyProps: "A function component's props should be read-only."
|
|
3052
3160
|
},
|
|
3053
3161
|
schema: []
|
|
3054
3162
|
},
|
|
3055
|
-
name:
|
|
3163
|
+
name: RULE_NAME48,
|
|
3056
3164
|
create(context) {
|
|
3057
3165
|
const services = ESLintUtils.getParserServices(context, false);
|
|
3058
3166
|
const { ctx, listeners } = useComponentCollector(context);
|
|
@@ -3076,8 +3184,8 @@ var prefer_read_only_props_default = createRule({
|
|
|
3076
3184
|
},
|
|
3077
3185
|
defaultOptions: []
|
|
3078
3186
|
});
|
|
3079
|
-
var
|
|
3080
|
-
var
|
|
3187
|
+
var RULE_NAME49 = "prefer-shorthand-boolean";
|
|
3188
|
+
var RULE_FEATURES48 = [
|
|
3081
3189
|
"CHK",
|
|
3082
3190
|
"FIX"
|
|
3083
3191
|
];
|
|
@@ -3086,7 +3194,7 @@ var prefer_shorthand_boolean_default = createRule({
|
|
|
3086
3194
|
type: "problem",
|
|
3087
3195
|
docs: {
|
|
3088
3196
|
description: "enforce using shorthand boolean attributes",
|
|
3089
|
-
[Symbol.for("rule_features")]:
|
|
3197
|
+
[Symbol.for("rule_features")]: RULE_FEATURES48
|
|
3090
3198
|
},
|
|
3091
3199
|
fixable: "code",
|
|
3092
3200
|
messages: {
|
|
@@ -3094,7 +3202,7 @@ var prefer_shorthand_boolean_default = createRule({
|
|
|
3094
3202
|
},
|
|
3095
3203
|
schema: []
|
|
3096
3204
|
},
|
|
3097
|
-
name:
|
|
3205
|
+
name: RULE_NAME49,
|
|
3098
3206
|
create(context) {
|
|
3099
3207
|
return {
|
|
3100
3208
|
JSXAttribute(node) {
|
|
@@ -3117,8 +3225,8 @@ var prefer_shorthand_boolean_default = createRule({
|
|
|
3117
3225
|
},
|
|
3118
3226
|
defaultOptions: []
|
|
3119
3227
|
});
|
|
3120
|
-
var
|
|
3121
|
-
var
|
|
3228
|
+
var RULE_NAME50 = "prefer-shorthand-fragment";
|
|
3229
|
+
var RULE_FEATURES49 = [
|
|
3122
3230
|
"CHK",
|
|
3123
3231
|
"FIX"
|
|
3124
3232
|
];
|
|
@@ -3127,7 +3235,7 @@ var prefer_shorthand_fragment_default = createRule({
|
|
|
3127
3235
|
type: "problem",
|
|
3128
3236
|
docs: {
|
|
3129
3237
|
description: "enforce using fragment syntax instead of 'Fragment' component",
|
|
3130
|
-
[Symbol.for("rule_features")]:
|
|
3238
|
+
[Symbol.for("rule_features")]: RULE_FEATURES49
|
|
3131
3239
|
},
|
|
3132
3240
|
fixable: "code",
|
|
3133
3241
|
messages: {
|
|
@@ -3135,7 +3243,7 @@ var prefer_shorthand_fragment_default = createRule({
|
|
|
3135
3243
|
},
|
|
3136
3244
|
schema: []
|
|
3137
3245
|
},
|
|
3138
|
-
name:
|
|
3246
|
+
name: RULE_NAME50,
|
|
3139
3247
|
create(context) {
|
|
3140
3248
|
return {
|
|
3141
3249
|
JSXElement(node) {
|
|
@@ -3163,21 +3271,21 @@ var prefer_shorthand_fragment_default = createRule({
|
|
|
3163
3271
|
},
|
|
3164
3272
|
defaultOptions: []
|
|
3165
3273
|
});
|
|
3166
|
-
var
|
|
3167
|
-
var
|
|
3274
|
+
var RULE_NAME51 = "use-jsx-vars";
|
|
3275
|
+
var RULE_FEATURES50 = [];
|
|
3168
3276
|
var use_jsx_vars_default = createRule({
|
|
3169
3277
|
meta: {
|
|
3170
3278
|
type: "problem",
|
|
3171
3279
|
docs: {
|
|
3172
3280
|
description: "helpes `eslint/no-unused-vars` to correctly mark JSX variables as used.",
|
|
3173
|
-
[Symbol.for("rule_features")]:
|
|
3281
|
+
[Symbol.for("rule_features")]: RULE_FEATURES50
|
|
3174
3282
|
},
|
|
3175
3283
|
messages: {
|
|
3176
3284
|
useJsxVars: ""
|
|
3177
3285
|
},
|
|
3178
3286
|
schema: []
|
|
3179
3287
|
},
|
|
3180
|
-
name:
|
|
3288
|
+
name: RULE_NAME51,
|
|
3181
3289
|
create(context) {
|
|
3182
3290
|
return {
|
|
3183
3291
|
JSXOpeningElement(node) {
|
|
@@ -3253,6 +3361,7 @@ var index_default = {
|
|
|
3253
3361
|
"no-unstable-default-props": no_unstable_default_props_default,
|
|
3254
3362
|
"no-unused-class-component-members": no_unused_class_component_members_default,
|
|
3255
3363
|
"no-unused-state": no_unused_state_default,
|
|
3364
|
+
"no-use-context": no_use_context_default,
|
|
3256
3365
|
"no-useless-fragment": no_useless_fragment_default,
|
|
3257
3366
|
"prefer-destructuring-assignment": prefer_destructuring_assignment_default,
|
|
3258
3367
|
"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.3",
|
|
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.3",
|
|
52
|
+
"@eslint-react/core": "1.26.0-beta.3",
|
|
53
|
+
"@eslint-react/eff": "1.26.0-beta.3",
|
|
54
|
+
"@eslint-react/jsx": "1.26.0-beta.3",
|
|
55
|
+
"@eslint-react/var": "1.26.0-beta.3",
|
|
56
|
+
"@eslint-react/shared": "1.26.0-beta.3"
|
|
57
57
|
},
|
|
58
58
|
"devDependencies": {
|
|
59
59
|
"@types/react": "^19.0.8",
|