@eslint-react/core 1.40.3-beta.0 → 1.40.3-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +10 -8
- package/dist/index.d.ts +10 -8
- package/dist/index.js +17 -16
- package/dist/index.mjs +15 -15
- package/package.json +7 -7
package/dist/index.d.mts
CHANGED
|
@@ -6,11 +6,11 @@ import { _ } from '@eslint-react/eff';
|
|
|
6
6
|
import * as birecord from 'birecord';
|
|
7
7
|
import { Scope } from '@typescript-eslint/scope-manager';
|
|
8
8
|
|
|
9
|
-
type
|
|
9
|
+
type ComponentDetectionHint = bigint;
|
|
10
10
|
/**
|
|
11
11
|
* Hints for component collector
|
|
12
12
|
*/
|
|
13
|
-
declare const
|
|
13
|
+
declare const ComponentDetectionHint: {
|
|
14
14
|
/**
|
|
15
15
|
* Skip function component created by React.memo
|
|
16
16
|
*/
|
|
@@ -49,9 +49,9 @@ declare const ComponentCollectorHint: {
|
|
|
49
49
|
readonly StrictConditional: bigint;
|
|
50
50
|
};
|
|
51
51
|
/**
|
|
52
|
-
* Default component
|
|
52
|
+
* Default component detection hint
|
|
53
53
|
*/
|
|
54
|
-
declare const
|
|
54
|
+
declare const DEFAULT_COMPONENT_DETECTION_HINT: bigint;
|
|
55
55
|
|
|
56
56
|
interface SemanticNode {
|
|
57
57
|
id: _ | TSESTree.Identifier | TSESTree.Identifier[];
|
|
@@ -78,7 +78,7 @@ interface FunctionComponent extends SemanticNode {
|
|
|
78
78
|
kind: "function";
|
|
79
79
|
node: AST.TSESTreeFunction;
|
|
80
80
|
flag: ComponentFlag;
|
|
81
|
-
hint:
|
|
81
|
+
hint: ComponentDetectionHint;
|
|
82
82
|
initPath: _ | AST.FunctionInitPath;
|
|
83
83
|
hookCalls: TSESTree.CallExpression[];
|
|
84
84
|
displayName: _ | TSESTree.Expression;
|
|
@@ -88,7 +88,7 @@ interface ClassComponent extends SemanticNode {
|
|
|
88
88
|
kind: "class";
|
|
89
89
|
node: AST.TSESTreeClass;
|
|
90
90
|
flag: ComponentFlag;
|
|
91
|
-
hint:
|
|
91
|
+
hint: ComponentDetectionHint;
|
|
92
92
|
methods: AST.TSESTreeMethodOrProperty[];
|
|
93
93
|
displayName: _ | TSESTree.Expression;
|
|
94
94
|
}
|
|
@@ -104,7 +104,7 @@ declare namespace useComponentCollector {
|
|
|
104
104
|
type Options = {
|
|
105
105
|
collectDisplayName?: boolean;
|
|
106
106
|
collectHookCalls?: boolean;
|
|
107
|
-
hint?:
|
|
107
|
+
hint?: ComponentDetectionHint;
|
|
108
108
|
};
|
|
109
109
|
type ReturnType = {
|
|
110
110
|
ctx: {
|
|
@@ -137,6 +137,8 @@ declare namespace useComponentCollectorLegacy {
|
|
|
137
137
|
*/
|
|
138
138
|
declare function useComponentCollectorLegacy(): useComponentCollectorLegacy.ReturnType;
|
|
139
139
|
|
|
140
|
+
declare function isValidComponentDefinition(context: RuleContext, node: AST.TSESTreeFunction, hint: bigint): boolean;
|
|
141
|
+
|
|
140
142
|
declare function getFunctionComponentId(context: RuleContext, node: AST.TSESTreeFunction): TSESTree.Identifier | TSESTree.Identifier[] | _;
|
|
141
143
|
|
|
142
144
|
declare function getComponentFlagFromInitPath(initPath: FunctionComponent["initPath"]): bigint;
|
|
@@ -416,4 +418,4 @@ declare const isCreateRefCall: isCallFromReact.ReturnType;
|
|
|
416
418
|
declare const isForwardRefCall: isCallFromReact.ReturnType;
|
|
417
419
|
declare const isMemoCall: isCallFromReact.ReturnType;
|
|
418
420
|
|
|
419
|
-
export { type ClassComponent, type Component,
|
|
421
|
+
export { type ClassComponent, type Component, ComponentDetectionHint, type ComponentEffectPhaseKind, ComponentFlag, type ComponentKind, type ComponentLifecyclePhaseKind, type ComponentPhaseKind, ComponentPhaseRelevance, type ComponentStateKind, DEFAULT_COMPONENT_DETECTION_HINT, DISPLAY_NAME_ASSIGNMENT_SELECTOR, type EffectKind, type FunctionComponent, type Hook, type HookKind, RE_COMPONENT_NAME, RE_COMPONENT_NAME_LOOSE, RE_HOOK_NAME, type SemanticEntry, type SemanticNode, getComponentFlagFromInitPath, getComponentNameFromId, getFunctionComponentId, getInstanceId, hasNoneOrLooseComponentName, isAssignmentToThisState, isCallFromReact, isCallFromReactObject, isChildrenCount, isChildrenCountCall, isChildrenForEach, isChildrenForEachCall, isChildrenMap, isChildrenMapCall, isChildrenOfCreateElement, isChildrenOnly, isChildrenOnlyCall, isChildrenToArray, isChildrenToArrayCall, isClassComponent, isCloneElement, isCloneElementCall, isComponentDidCatch, isComponentDidMount, isComponentName, isComponentNameLoose, isComponentWillUnmount, isComponentWrapperCall, isComponentWrapperCallLoose, isCreateContext, isCreateContextCall, isCreateElement, isCreateElementCall, isCreateRef, isCreateRefCall, isDeclaredInRenderPropLoose, isDirectValueOfRenderPropertyLoose, isForwardRef, isForwardRefCall, isFromReact, isFromReactLoose, isFromReactObject, isFromReactStrict, isFunctionOfComponentDidMount, isFunctionOfComponentWillUnmount, isFunctionOfRenderMethod, isFunctionOfUseEffectCleanup, isFunctionOfUseEffectSetup, isGetDerivedStateFromError, isGetDerivedStateFromProps, isInitializedFromReact, isInsideRenderMethod, isInstanceIdEqual, isInversePhase, isMemo, isMemoCall, isPureComponent, isReactAPI, isReactAPICall, isReactHook, isReactHookCall, isReactHookCallWithName, isReactHookCallWithNameAlias, isReactHookCallWithNameLoose, isReactHookName, isReactHookNameLoose, isRenderFunctionLoose, isRenderMethodLike, isRenderPropLoose, isThisSetState, isUseActionStateCall, isUseCall, isUseCallbackCall, isUseContextCall, isUseDebugValueCall, isUseDeferredValueCall, isUseEffectCall, isUseEffectCallLoose, isUseFormStatusCall, isUseIdCall, isUseImperativeHandleCall, isUseInsertionEffectCall, isUseLayoutEffectCall, isUseMemoCall, isUseOptimisticCall, isUseReducerCall, isUseRefCall, isUseStateCall, isUseSyncExternalStoreCall, isUseTransitionCall, isValidComponentDefinition, useComponentCollector, useComponentCollectorLegacy, useHookCollector };
|
package/dist/index.d.ts
CHANGED
|
@@ -6,11 +6,11 @@ import { _ } from '@eslint-react/eff';
|
|
|
6
6
|
import * as birecord from 'birecord';
|
|
7
7
|
import { Scope } from '@typescript-eslint/scope-manager';
|
|
8
8
|
|
|
9
|
-
type
|
|
9
|
+
type ComponentDetectionHint = bigint;
|
|
10
10
|
/**
|
|
11
11
|
* Hints for component collector
|
|
12
12
|
*/
|
|
13
|
-
declare const
|
|
13
|
+
declare const ComponentDetectionHint: {
|
|
14
14
|
/**
|
|
15
15
|
* Skip function component created by React.memo
|
|
16
16
|
*/
|
|
@@ -49,9 +49,9 @@ declare const ComponentCollectorHint: {
|
|
|
49
49
|
readonly StrictConditional: bigint;
|
|
50
50
|
};
|
|
51
51
|
/**
|
|
52
|
-
* Default component
|
|
52
|
+
* Default component detection hint
|
|
53
53
|
*/
|
|
54
|
-
declare const
|
|
54
|
+
declare const DEFAULT_COMPONENT_DETECTION_HINT: bigint;
|
|
55
55
|
|
|
56
56
|
interface SemanticNode {
|
|
57
57
|
id: _ | TSESTree.Identifier | TSESTree.Identifier[];
|
|
@@ -78,7 +78,7 @@ interface FunctionComponent extends SemanticNode {
|
|
|
78
78
|
kind: "function";
|
|
79
79
|
node: AST.TSESTreeFunction;
|
|
80
80
|
flag: ComponentFlag;
|
|
81
|
-
hint:
|
|
81
|
+
hint: ComponentDetectionHint;
|
|
82
82
|
initPath: _ | AST.FunctionInitPath;
|
|
83
83
|
hookCalls: TSESTree.CallExpression[];
|
|
84
84
|
displayName: _ | TSESTree.Expression;
|
|
@@ -88,7 +88,7 @@ interface ClassComponent extends SemanticNode {
|
|
|
88
88
|
kind: "class";
|
|
89
89
|
node: AST.TSESTreeClass;
|
|
90
90
|
flag: ComponentFlag;
|
|
91
|
-
hint:
|
|
91
|
+
hint: ComponentDetectionHint;
|
|
92
92
|
methods: AST.TSESTreeMethodOrProperty[];
|
|
93
93
|
displayName: _ | TSESTree.Expression;
|
|
94
94
|
}
|
|
@@ -104,7 +104,7 @@ declare namespace useComponentCollector {
|
|
|
104
104
|
type Options = {
|
|
105
105
|
collectDisplayName?: boolean;
|
|
106
106
|
collectHookCalls?: boolean;
|
|
107
|
-
hint?:
|
|
107
|
+
hint?: ComponentDetectionHint;
|
|
108
108
|
};
|
|
109
109
|
type ReturnType = {
|
|
110
110
|
ctx: {
|
|
@@ -137,6 +137,8 @@ declare namespace useComponentCollectorLegacy {
|
|
|
137
137
|
*/
|
|
138
138
|
declare function useComponentCollectorLegacy(): useComponentCollectorLegacy.ReturnType;
|
|
139
139
|
|
|
140
|
+
declare function isValidComponentDefinition(context: RuleContext, node: AST.TSESTreeFunction, hint: bigint): boolean;
|
|
141
|
+
|
|
140
142
|
declare function getFunctionComponentId(context: RuleContext, node: AST.TSESTreeFunction): TSESTree.Identifier | TSESTree.Identifier[] | _;
|
|
141
143
|
|
|
142
144
|
declare function getComponentFlagFromInitPath(initPath: FunctionComponent["initPath"]): bigint;
|
|
@@ -416,4 +418,4 @@ declare const isCreateRefCall: isCallFromReact.ReturnType;
|
|
|
416
418
|
declare const isForwardRefCall: isCallFromReact.ReturnType;
|
|
417
419
|
declare const isMemoCall: isCallFromReact.ReturnType;
|
|
418
420
|
|
|
419
|
-
export { type ClassComponent, type Component,
|
|
421
|
+
export { type ClassComponent, type Component, ComponentDetectionHint, type ComponentEffectPhaseKind, ComponentFlag, type ComponentKind, type ComponentLifecyclePhaseKind, type ComponentPhaseKind, ComponentPhaseRelevance, type ComponentStateKind, DEFAULT_COMPONENT_DETECTION_HINT, DISPLAY_NAME_ASSIGNMENT_SELECTOR, type EffectKind, type FunctionComponent, type Hook, type HookKind, RE_COMPONENT_NAME, RE_COMPONENT_NAME_LOOSE, RE_HOOK_NAME, type SemanticEntry, type SemanticNode, getComponentFlagFromInitPath, getComponentNameFromId, getFunctionComponentId, getInstanceId, hasNoneOrLooseComponentName, isAssignmentToThisState, isCallFromReact, isCallFromReactObject, isChildrenCount, isChildrenCountCall, isChildrenForEach, isChildrenForEachCall, isChildrenMap, isChildrenMapCall, isChildrenOfCreateElement, isChildrenOnly, isChildrenOnlyCall, isChildrenToArray, isChildrenToArrayCall, isClassComponent, isCloneElement, isCloneElementCall, isComponentDidCatch, isComponentDidMount, isComponentName, isComponentNameLoose, isComponentWillUnmount, isComponentWrapperCall, isComponentWrapperCallLoose, isCreateContext, isCreateContextCall, isCreateElement, isCreateElementCall, isCreateRef, isCreateRefCall, isDeclaredInRenderPropLoose, isDirectValueOfRenderPropertyLoose, isForwardRef, isForwardRefCall, isFromReact, isFromReactLoose, isFromReactObject, isFromReactStrict, isFunctionOfComponentDidMount, isFunctionOfComponentWillUnmount, isFunctionOfRenderMethod, isFunctionOfUseEffectCleanup, isFunctionOfUseEffectSetup, isGetDerivedStateFromError, isGetDerivedStateFromProps, isInitializedFromReact, isInsideRenderMethod, isInstanceIdEqual, isInversePhase, isMemo, isMemoCall, isPureComponent, isReactAPI, isReactAPICall, isReactHook, isReactHookCall, isReactHookCallWithName, isReactHookCallWithNameAlias, isReactHookCallWithNameLoose, isReactHookName, isReactHookNameLoose, isRenderFunctionLoose, isRenderMethodLike, isRenderPropLoose, isThisSetState, isUseActionStateCall, isUseCall, isUseCallbackCall, isUseContextCall, isUseDebugValueCall, isUseDeferredValueCall, isUseEffectCall, isUseEffectCallLoose, isUseFormStatusCall, isUseIdCall, isUseImperativeHandleCall, isUseInsertionEffectCall, isUseLayoutEffectCall, isUseMemoCall, isUseOptimisticCall, isUseReducerCall, isUseRefCall, isUseStateCall, isUseSyncExternalStoreCall, isUseTransitionCall, isValidComponentDefinition, useComponentCollector, useComponentCollectorLegacy, useHookCollector };
|
package/dist/index.js
CHANGED
|
@@ -815,11 +815,11 @@ function useHookCollector() {
|
|
|
815
815
|
};
|
|
816
816
|
return { ctx, listeners };
|
|
817
817
|
}
|
|
818
|
-
var
|
|
818
|
+
var ComponentDetectionHint = {
|
|
819
819
|
/**
|
|
820
|
-
* 1n << 0n - 1n << 63n are reserved for
|
|
820
|
+
* 1n << 0n - 1n << 63n are reserved for JSXDetectionHint
|
|
821
821
|
*/
|
|
822
|
-
...JSX3__namespace.
|
|
822
|
+
...JSX3__namespace.JSXDetectionHint,
|
|
823
823
|
/**
|
|
824
824
|
* Skip function component created by React.memo
|
|
825
825
|
*/
|
|
@@ -845,7 +845,7 @@ var ComponentCollectorHint = {
|
|
|
845
845
|
*/
|
|
846
846
|
SkipClassProperty: 1n << 69n
|
|
847
847
|
};
|
|
848
|
-
var
|
|
848
|
+
var DEFAULT_COMPONENT_DETECTION_HINT = 0n | ComponentDetectionHint.SkipBooleanLiteral | ComponentDetectionHint.SkipEmptyArray | ComponentDetectionHint.SkipArrayMapArgument | ComponentDetectionHint.SkipNumberLiteral | ComponentDetectionHint.SkipStringLiteral | ComponentDetectionHint.SkipUndefined | ComponentDetectionHint.StrictArray | ComponentDetectionHint.StrictConditional | ComponentDetectionHint.StrictLogical;
|
|
849
849
|
function isClassComponent(node) {
|
|
850
850
|
if ("superClass" in node && node.superClass != null) {
|
|
851
851
|
const re = /^(?:Pure)?Component$/u;
|
|
@@ -934,16 +934,16 @@ function isValidComponentDefinition(context, node, hint) {
|
|
|
934
934
|
if (isChildrenOfCreateElement(context, node) || isFunctionOfRenderMethod(node)) {
|
|
935
935
|
return false;
|
|
936
936
|
}
|
|
937
|
-
if (hint &
|
|
937
|
+
if (hint & ComponentDetectionHint.SkipObjectMethod && isFunctionOfObjectMethod(node.parent)) {
|
|
938
938
|
return false;
|
|
939
939
|
}
|
|
940
|
-
if (hint &
|
|
940
|
+
if (hint & ComponentDetectionHint.SkipClassMethod && isFunctionOfClassMethod(node.parent)) {
|
|
941
941
|
return false;
|
|
942
942
|
}
|
|
943
|
-
if (hint &
|
|
943
|
+
if (hint & ComponentDetectionHint.SkipClassProperty && isFunctionOfClassProperty(node.parent)) {
|
|
944
944
|
return false;
|
|
945
945
|
}
|
|
946
|
-
if (hint &
|
|
946
|
+
if (hint & ComponentDetectionHint.SkipArrayMapArgument && AST5__namespace.isArrayMapCallLoose(node.parent)) {
|
|
947
947
|
return false;
|
|
948
948
|
}
|
|
949
949
|
const boundaryNode = AST5__namespace.findParentNode(
|
|
@@ -1028,7 +1028,7 @@ function useComponentCollector(context, options = {}) {
|
|
|
1028
1028
|
const {
|
|
1029
1029
|
collectDisplayName = false,
|
|
1030
1030
|
collectHookCalls = false,
|
|
1031
|
-
hint =
|
|
1031
|
+
hint = DEFAULT_COMPONENT_DETECTION_HINT
|
|
1032
1032
|
} = options;
|
|
1033
1033
|
const jsxCtx = { getScope: (node) => context.sourceCode.getScope(node) };
|
|
1034
1034
|
const components = /* @__PURE__ */ new Map();
|
|
@@ -1043,7 +1043,7 @@ function useComponentCollector(context, options = {}) {
|
|
|
1043
1043
|
if (entry == null) return;
|
|
1044
1044
|
if (!entry.isComponent) return functionEntries.pop();
|
|
1045
1045
|
const shouldDrop = AST5__namespace.getNestedReturnStatements(entry.node.body).slice().reverse().some((r) => {
|
|
1046
|
-
return context.sourceCode.getScope(r).block === entry.node && r.argument != null && !JSX3__namespace.
|
|
1046
|
+
return context.sourceCode.getScope(r).block === entry.node && r.argument != null && !JSX3__namespace.isJSXLike(r.argument, jsxCtx, hint);
|
|
1047
1047
|
});
|
|
1048
1048
|
if (shouldDrop) {
|
|
1049
1049
|
components.delete(entry.key);
|
|
@@ -1067,7 +1067,7 @@ function useComponentCollector(context, options = {}) {
|
|
|
1067
1067
|
const entry = getCurrentEntry();
|
|
1068
1068
|
if (entry == null) return;
|
|
1069
1069
|
const { body } = entry.node;
|
|
1070
|
-
const isComponent = hasNoneOrLooseComponentName(context, entry.node) && JSX3__namespace.
|
|
1070
|
+
const isComponent = hasNoneOrLooseComponentName(context, entry.node) && JSX3__namespace.isJSXLike(body, jsxCtx, hint) && isValidComponentDefinition(context, entry.node, hint);
|
|
1071
1071
|
if (!isComponent) return;
|
|
1072
1072
|
const initPath = AST5__namespace.getFunctionInitPath(entry.node);
|
|
1073
1073
|
const id = getFunctionComponentId(context, entry.node);
|
|
@@ -1107,7 +1107,7 @@ function useComponentCollector(context, options = {}) {
|
|
|
1107
1107
|
"ReturnStatement[type]"(node) {
|
|
1108
1108
|
const entry = getCurrentEntry();
|
|
1109
1109
|
if (entry == null) return;
|
|
1110
|
-
const isComponent = hasNoneOrLooseComponentName(context, entry.node) && JSX3__namespace.
|
|
1110
|
+
const isComponent = hasNoneOrLooseComponentName(context, entry.node) && JSX3__namespace.isJSXLike(node.argument, jsxCtx, hint) && isValidComponentDefinition(context, entry.node, hint);
|
|
1111
1111
|
if (!isComponent) return;
|
|
1112
1112
|
entry.isComponent = true;
|
|
1113
1113
|
const initPath = AST5__namespace.getFunctionInitPath(entry.node);
|
|
@@ -1177,12 +1177,12 @@ function isRenderFunctionLoose(context, node) {
|
|
|
1177
1177
|
if (AST5__namespace.getFunctionIdentifier(node)?.name.startsWith("render")) {
|
|
1178
1178
|
return parent.type === types.AST_NODE_TYPES.JSXExpressionContainer && parent.parent.type === types.AST_NODE_TYPES.JSXAttribute && parent.parent.name.type === types.AST_NODE_TYPES.JSXIdentifier && parent.parent.name.name.startsWith("render");
|
|
1179
1179
|
}
|
|
1180
|
-
return JSX3__namespace.
|
|
1180
|
+
return JSX3__namespace.isJSXLike(
|
|
1181
1181
|
body,
|
|
1182
1182
|
{
|
|
1183
1183
|
getScope: (node2) => context.sourceCode.getScope(node2)
|
|
1184
1184
|
},
|
|
1185
|
-
JSX3__namespace.
|
|
1185
|
+
JSX3__namespace.JSXDetectionHint.SkipNullLiteral | JSX3__namespace.JSXDetectionHint.SkipUndefined | JSX3__namespace.JSXDetectionHint.StrictLogical | JSX3__namespace.JSXDetectionHint.StrictConditional
|
|
1186
1186
|
);
|
|
1187
1187
|
}
|
|
1188
1188
|
function isRenderPropLoose(context, node) {
|
|
@@ -1227,10 +1227,10 @@ function isFunctionOfUseEffectCleanup(node) {
|
|
|
1227
1227
|
return enclosingFunction === functionOfReturnStatement && isFunctionOfUseEffectSetup(enclosingFunction);
|
|
1228
1228
|
}
|
|
1229
1229
|
|
|
1230
|
-
exports.
|
|
1230
|
+
exports.ComponentDetectionHint = ComponentDetectionHint;
|
|
1231
1231
|
exports.ComponentFlag = ComponentFlag;
|
|
1232
1232
|
exports.ComponentPhaseRelevance = ComponentPhaseRelevance;
|
|
1233
|
-
exports.
|
|
1233
|
+
exports.DEFAULT_COMPONENT_DETECTION_HINT = DEFAULT_COMPONENT_DETECTION_HINT;
|
|
1234
1234
|
exports.DISPLAY_NAME_ASSIGNMENT_SELECTOR = DISPLAY_NAME_ASSIGNMENT_SELECTOR;
|
|
1235
1235
|
exports.RE_COMPONENT_NAME = RE_COMPONENT_NAME;
|
|
1236
1236
|
exports.RE_COMPONENT_NAME_LOOSE = RE_COMPONENT_NAME_LOOSE;
|
|
@@ -1325,6 +1325,7 @@ exports.isUseRefCall = isUseRefCall;
|
|
|
1325
1325
|
exports.isUseStateCall = isUseStateCall;
|
|
1326
1326
|
exports.isUseSyncExternalStoreCall = isUseSyncExternalStoreCall;
|
|
1327
1327
|
exports.isUseTransitionCall = isUseTransitionCall;
|
|
1328
|
+
exports.isValidComponentDefinition = isValidComponentDefinition;
|
|
1328
1329
|
exports.useComponentCollector = useComponentCollector;
|
|
1329
1330
|
exports.useComponentCollectorLegacy = useComponentCollectorLegacy;
|
|
1330
1331
|
exports.useHookCollector = useHookCollector;
|
package/dist/index.mjs
CHANGED
|
@@ -788,11 +788,11 @@ function useHookCollector() {
|
|
|
788
788
|
};
|
|
789
789
|
return { ctx, listeners };
|
|
790
790
|
}
|
|
791
|
-
var
|
|
791
|
+
var ComponentDetectionHint = {
|
|
792
792
|
/**
|
|
793
|
-
* 1n << 0n - 1n << 63n are reserved for
|
|
793
|
+
* 1n << 0n - 1n << 63n are reserved for JSXDetectionHint
|
|
794
794
|
*/
|
|
795
|
-
...JSX3.
|
|
795
|
+
...JSX3.JSXDetectionHint,
|
|
796
796
|
/**
|
|
797
797
|
* Skip function component created by React.memo
|
|
798
798
|
*/
|
|
@@ -818,7 +818,7 @@ var ComponentCollectorHint = {
|
|
|
818
818
|
*/
|
|
819
819
|
SkipClassProperty: 1n << 69n
|
|
820
820
|
};
|
|
821
|
-
var
|
|
821
|
+
var DEFAULT_COMPONENT_DETECTION_HINT = 0n | ComponentDetectionHint.SkipBooleanLiteral | ComponentDetectionHint.SkipEmptyArray | ComponentDetectionHint.SkipArrayMapArgument | ComponentDetectionHint.SkipNumberLiteral | ComponentDetectionHint.SkipStringLiteral | ComponentDetectionHint.SkipUndefined | ComponentDetectionHint.StrictArray | ComponentDetectionHint.StrictConditional | ComponentDetectionHint.StrictLogical;
|
|
822
822
|
function isClassComponent(node) {
|
|
823
823
|
if ("superClass" in node && node.superClass != null) {
|
|
824
824
|
const re = /^(?:Pure)?Component$/u;
|
|
@@ -907,16 +907,16 @@ function isValidComponentDefinition(context, node, hint) {
|
|
|
907
907
|
if (isChildrenOfCreateElement(context, node) || isFunctionOfRenderMethod(node)) {
|
|
908
908
|
return false;
|
|
909
909
|
}
|
|
910
|
-
if (hint &
|
|
910
|
+
if (hint & ComponentDetectionHint.SkipObjectMethod && isFunctionOfObjectMethod(node.parent)) {
|
|
911
911
|
return false;
|
|
912
912
|
}
|
|
913
|
-
if (hint &
|
|
913
|
+
if (hint & ComponentDetectionHint.SkipClassMethod && isFunctionOfClassMethod(node.parent)) {
|
|
914
914
|
return false;
|
|
915
915
|
}
|
|
916
|
-
if (hint &
|
|
916
|
+
if (hint & ComponentDetectionHint.SkipClassProperty && isFunctionOfClassProperty(node.parent)) {
|
|
917
917
|
return false;
|
|
918
918
|
}
|
|
919
|
-
if (hint &
|
|
919
|
+
if (hint & ComponentDetectionHint.SkipArrayMapArgument && AST5.isArrayMapCallLoose(node.parent)) {
|
|
920
920
|
return false;
|
|
921
921
|
}
|
|
922
922
|
const boundaryNode = AST5.findParentNode(
|
|
@@ -1001,7 +1001,7 @@ function useComponentCollector(context, options = {}) {
|
|
|
1001
1001
|
const {
|
|
1002
1002
|
collectDisplayName = false,
|
|
1003
1003
|
collectHookCalls = false,
|
|
1004
|
-
hint =
|
|
1004
|
+
hint = DEFAULT_COMPONENT_DETECTION_HINT
|
|
1005
1005
|
} = options;
|
|
1006
1006
|
const jsxCtx = { getScope: (node) => context.sourceCode.getScope(node) };
|
|
1007
1007
|
const components = /* @__PURE__ */ new Map();
|
|
@@ -1016,7 +1016,7 @@ function useComponentCollector(context, options = {}) {
|
|
|
1016
1016
|
if (entry == null) return;
|
|
1017
1017
|
if (!entry.isComponent) return functionEntries.pop();
|
|
1018
1018
|
const shouldDrop = AST5.getNestedReturnStatements(entry.node.body).slice().reverse().some((r) => {
|
|
1019
|
-
return context.sourceCode.getScope(r).block === entry.node && r.argument != null && !JSX3.
|
|
1019
|
+
return context.sourceCode.getScope(r).block === entry.node && r.argument != null && !JSX3.isJSXLike(r.argument, jsxCtx, hint);
|
|
1020
1020
|
});
|
|
1021
1021
|
if (shouldDrop) {
|
|
1022
1022
|
components.delete(entry.key);
|
|
@@ -1040,7 +1040,7 @@ function useComponentCollector(context, options = {}) {
|
|
|
1040
1040
|
const entry = getCurrentEntry();
|
|
1041
1041
|
if (entry == null) return;
|
|
1042
1042
|
const { body } = entry.node;
|
|
1043
|
-
const isComponent = hasNoneOrLooseComponentName(context, entry.node) && JSX3.
|
|
1043
|
+
const isComponent = hasNoneOrLooseComponentName(context, entry.node) && JSX3.isJSXLike(body, jsxCtx, hint) && isValidComponentDefinition(context, entry.node, hint);
|
|
1044
1044
|
if (!isComponent) return;
|
|
1045
1045
|
const initPath = AST5.getFunctionInitPath(entry.node);
|
|
1046
1046
|
const id = getFunctionComponentId(context, entry.node);
|
|
@@ -1080,7 +1080,7 @@ function useComponentCollector(context, options = {}) {
|
|
|
1080
1080
|
"ReturnStatement[type]"(node) {
|
|
1081
1081
|
const entry = getCurrentEntry();
|
|
1082
1082
|
if (entry == null) return;
|
|
1083
|
-
const isComponent = hasNoneOrLooseComponentName(context, entry.node) && JSX3.
|
|
1083
|
+
const isComponent = hasNoneOrLooseComponentName(context, entry.node) && JSX3.isJSXLike(node.argument, jsxCtx, hint) && isValidComponentDefinition(context, entry.node, hint);
|
|
1084
1084
|
if (!isComponent) return;
|
|
1085
1085
|
entry.isComponent = true;
|
|
1086
1086
|
const initPath = AST5.getFunctionInitPath(entry.node);
|
|
@@ -1150,12 +1150,12 @@ function isRenderFunctionLoose(context, node) {
|
|
|
1150
1150
|
if (AST5.getFunctionIdentifier(node)?.name.startsWith("render")) {
|
|
1151
1151
|
return parent.type === AST_NODE_TYPES.JSXExpressionContainer && parent.parent.type === AST_NODE_TYPES.JSXAttribute && parent.parent.name.type === AST_NODE_TYPES.JSXIdentifier && parent.parent.name.name.startsWith("render");
|
|
1152
1152
|
}
|
|
1153
|
-
return JSX3.
|
|
1153
|
+
return JSX3.isJSXLike(
|
|
1154
1154
|
body,
|
|
1155
1155
|
{
|
|
1156
1156
|
getScope: (node2) => context.sourceCode.getScope(node2)
|
|
1157
1157
|
},
|
|
1158
|
-
JSX3.
|
|
1158
|
+
JSX3.JSXDetectionHint.SkipNullLiteral | JSX3.JSXDetectionHint.SkipUndefined | JSX3.JSXDetectionHint.StrictLogical | JSX3.JSXDetectionHint.StrictConditional
|
|
1159
1159
|
);
|
|
1160
1160
|
}
|
|
1161
1161
|
function isRenderPropLoose(context, node) {
|
|
@@ -1200,4 +1200,4 @@ function isFunctionOfUseEffectCleanup(node) {
|
|
|
1200
1200
|
return enclosingFunction === functionOfReturnStatement && isFunctionOfUseEffectSetup(enclosingFunction);
|
|
1201
1201
|
}
|
|
1202
1202
|
|
|
1203
|
-
export {
|
|
1203
|
+
export { ComponentDetectionHint, ComponentFlag, ComponentPhaseRelevance, DEFAULT_COMPONENT_DETECTION_HINT, DISPLAY_NAME_ASSIGNMENT_SELECTOR, RE_COMPONENT_NAME, RE_COMPONENT_NAME_LOOSE, RE_HOOK_NAME, getComponentFlagFromInitPath, getComponentNameFromId, getFunctionComponentId, getInstanceId, hasNoneOrLooseComponentName, isAssignmentToThisState, isCallFromReact, isCallFromReactObject, isChildrenCount, isChildrenCountCall, isChildrenForEach, isChildrenForEachCall, isChildrenMap, isChildrenMapCall, isChildrenOfCreateElement, isChildrenOnly, isChildrenOnlyCall, isChildrenToArray, isChildrenToArrayCall, isClassComponent, isCloneElement, isCloneElementCall, isComponentDidCatch, isComponentDidMount, isComponentName, isComponentNameLoose, isComponentWillUnmount, isComponentWrapperCall, isComponentWrapperCallLoose, isCreateContext, isCreateContextCall, isCreateElement, isCreateElementCall, isCreateRef, isCreateRefCall, isDeclaredInRenderPropLoose, isDirectValueOfRenderPropertyLoose, isForwardRef, isForwardRefCall, isFromReact, isFromReactLoose, isFromReactObject, isFromReactStrict, isFunctionOfComponentDidMount, isFunctionOfComponentWillUnmount, isFunctionOfRenderMethod, isFunctionOfUseEffectCleanup, isFunctionOfUseEffectSetup, isGetDerivedStateFromError, isGetDerivedStateFromProps, isInitializedFromReact, isInsideRenderMethod, isInstanceIdEqual, isInversePhase, isMemo, isMemoCall, isPureComponent, isReactAPI, isReactAPICall, isReactHook, isReactHookCall, isReactHookCallWithName, isReactHookCallWithNameAlias, isReactHookCallWithNameLoose, isReactHookName, isReactHookNameLoose, isRenderFunctionLoose, isRenderMethodLike, isRenderPropLoose, isThisSetState, isUseActionStateCall, isUseCall, isUseCallbackCall, isUseContextCall, isUseDebugValueCall, isUseDeferredValueCall, isUseEffectCall, isUseEffectCallLoose, isUseFormStatusCall, isUseIdCall, isUseImperativeHandleCall, isUseInsertionEffectCall, isUseLayoutEffectCall, isUseMemoCall, isUseOptimisticCall, isUseReducerCall, isUseRefCall, isUseStateCall, isUseSyncExternalStoreCall, isUseTransitionCall, isValidComponentDefinition, useComponentCollector, useComponentCollectorLegacy, useHookCollector };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@eslint-react/core",
|
|
3
|
-
"version": "1.40.3-
|
|
3
|
+
"version": "1.40.3-next.1",
|
|
4
4
|
"description": "ESLint React's ESLint utility module for static analysis of React core APIs and patterns.",
|
|
5
5
|
"homepage": "https://github.com/Rel1cx/eslint-react",
|
|
6
6
|
"bugs": {
|
|
@@ -41,12 +41,12 @@
|
|
|
41
41
|
"@typescript-eslint/utils": "^8.29.0",
|
|
42
42
|
"birecord": "^0.1.1",
|
|
43
43
|
"ts-pattern": "^5.7.0",
|
|
44
|
-
"@eslint-react/ast": "1.40.3-
|
|
45
|
-
"@eslint-react/eff": "1.40.3-
|
|
46
|
-
"@eslint-react/jsx": "1.40.3-
|
|
47
|
-
"@eslint-react/kit": "1.40.3-
|
|
48
|
-
"@eslint-react/shared": "1.40.3-
|
|
49
|
-
"@eslint-react/var": "1.40.3-
|
|
44
|
+
"@eslint-react/ast": "1.40.3-next.1",
|
|
45
|
+
"@eslint-react/eff": "1.40.3-next.1",
|
|
46
|
+
"@eslint-react/jsx": "1.40.3-next.1",
|
|
47
|
+
"@eslint-react/kit": "1.40.3-next.1",
|
|
48
|
+
"@eslint-react/shared": "1.40.3-next.1",
|
|
49
|
+
"@eslint-react/var": "1.40.3-next.1"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
52
|
"tsup": "^8.4.0",
|