@eslint-react/core 1.40.3-next.1 → 1.40.4-beta.0
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 +70 -7
- package/dist/index.d.ts +70 -7
- package/dist/index.js +128 -67
- package/dist/index.mjs +114 -67
- package/package.json +7 -7
package/dist/index.d.mts
CHANGED
|
@@ -145,15 +145,23 @@ declare function getComponentFlagFromInitPath(initPath: FunctionComponent["initP
|
|
|
145
145
|
|
|
146
146
|
type ComponentKind = "classComponent" | "functionComponent";
|
|
147
147
|
|
|
148
|
+
declare function isComponentDidCatch(node: TSESTree.Node): node is AST.TSESTreeMethodOrProperty;
|
|
148
149
|
declare function isComponentDidMount(node: TSESTree.Node): node is AST.TSESTreeMethodOrProperty;
|
|
150
|
+
declare function isComponentDidUpdate(node: TSESTree.Node): node is AST.TSESTreeMethodOrProperty;
|
|
151
|
+
declare function isComponentWillMount(node: TSESTree.Node): node is AST.TSESTreeMethodOrProperty;
|
|
152
|
+
declare function isComponentWillReceiveProps(node: TSESTree.Node): node is AST.TSESTreeMethodOrProperty;
|
|
149
153
|
declare function isComponentWillUnmount(node: TSESTree.Node): node is AST.TSESTreeMethodOrProperty;
|
|
150
|
-
declare function
|
|
151
|
-
declare function
|
|
154
|
+
declare function isComponentWillUpdate(node: TSESTree.Node): node is AST.TSESTreeMethodOrProperty;
|
|
155
|
+
declare function isGetChildContext(node: TSESTree.Node): node is AST.TSESTreeMethodOrProperty;
|
|
156
|
+
declare function isGetDefaultProps(node: TSESTree.Node): node is AST.TSESTreeMethodOrProperty;
|
|
157
|
+
declare function isGetInitialState(node: TSESTree.Node): node is AST.TSESTreeMethodOrProperty;
|
|
158
|
+
declare function isGetSnapshotBeforeUpdate(node: TSESTree.Node): node is AST.TSESTreeMethodOrProperty;
|
|
159
|
+
declare function isShouldComponentUpdate(node: TSESTree.Node): node is AST.TSESTreeMethodOrProperty;
|
|
160
|
+
declare function isUnsafeComponentWillMount(node: TSESTree.Node): node is AST.TSESTreeMethodOrProperty;
|
|
161
|
+
declare function isUnsafeComponentWillReceiveProps(node: TSESTree.Node): node is AST.TSESTreeMethodOrProperty;
|
|
162
|
+
declare function isUnsafeComponentWillUpdate(node: TSESTree.Node): node is AST.TSESTreeMethodOrProperty;
|
|
152
163
|
declare function isGetDerivedStateFromProps(node: TSESTree.Node): node is AST.TSESTreeMethodOrProperty;
|
|
153
|
-
declare function
|
|
154
|
-
declare function isFunctionOfComponentWillUnmount(node: TSESTree.Node): boolean;
|
|
155
|
-
declare function isRenderMethodLike(node: TSESTree.Node): node is AST.TSESTreeMethodOrProperty;
|
|
156
|
-
declare function isFunctionOfRenderMethod(node: AST.TSESTreeFunction): boolean;
|
|
164
|
+
declare function isGetDerivedStateFromError(node: TSESTree.Node): node is AST.TSESTreeMethodOrProperty;
|
|
157
165
|
|
|
158
166
|
declare const RE_COMPONENT_NAME: RegExp;
|
|
159
167
|
declare const RE_COMPONENT_NAME_LOOSE: RegExp;
|
|
@@ -174,6 +182,46 @@ declare const isInversePhase: {
|
|
|
174
182
|
(a: ComponentPhaseKind, b: ComponentPhaseKind): boolean;
|
|
175
183
|
};
|
|
176
184
|
|
|
185
|
+
/**
|
|
186
|
+
* Check whether given node is a render function of a class component
|
|
187
|
+
* @example
|
|
188
|
+
* ```tsx
|
|
189
|
+
* class Component extends React.Component {
|
|
190
|
+
* render() {
|
|
191
|
+
* return <div />;
|
|
192
|
+
* }
|
|
193
|
+
* }
|
|
194
|
+
* ```
|
|
195
|
+
* @param node The AST node to check
|
|
196
|
+
* @returns `true` if node is a render function, `false` if not
|
|
197
|
+
*/
|
|
198
|
+
declare function isRenderLike(node: TSESTree.Node): node is AST.TSESTreeMethodOrProperty;
|
|
199
|
+
/**
|
|
200
|
+
* Check whether given node is a function of a render function of a class component
|
|
201
|
+
* @example
|
|
202
|
+
* ```tsx
|
|
203
|
+
* class Component extends React.Component {
|
|
204
|
+
* render = () => <div />;
|
|
205
|
+
* ```
|
|
206
|
+
* @param node The AST node to check
|
|
207
|
+
* @returns `true` if node is a render function, `false` if not
|
|
208
|
+
*/
|
|
209
|
+
declare function isFunctionOfRender(node: AST.TSESTreeFunction): boolean;
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Check whether given node is a render method of a class component
|
|
213
|
+
* @example
|
|
214
|
+
* ```tsx
|
|
215
|
+
* class Component extends React.Component {
|
|
216
|
+
* renderHeader = () => <div />;
|
|
217
|
+
* renderFooter = () => <div />;
|
|
218
|
+
* }
|
|
219
|
+
* ```
|
|
220
|
+
* @param node The AST node to check
|
|
221
|
+
* @returns `true` if node is a render function, `false` if not
|
|
222
|
+
*/
|
|
223
|
+
declare function isRenderMethodLike(node: TSESTree.Node): node is AST.TSESTreeMethodOrProperty;
|
|
224
|
+
|
|
177
225
|
/**
|
|
178
226
|
* Unsafe check whether given node is a render function
|
|
179
227
|
* ```tsx
|
|
@@ -266,6 +314,21 @@ declare function isChildrenOfCreateElement(context: RuleContext, node: TSESTree.
|
|
|
266
314
|
* @returns `true` if node is inside class component's render block, `false` if not
|
|
267
315
|
*/
|
|
268
316
|
declare function isInsideRenderMethod(node: TSESTree.Node): boolean;
|
|
317
|
+
declare function isFunctionOfComponentDidMount(node: TSESTree.Node): boolean;
|
|
318
|
+
declare function isFunctionOfComponentWillUnmount(node: TSESTree.Node): boolean;
|
|
319
|
+
/**
|
|
320
|
+
* Check whether given node is a function of a render method of a class component
|
|
321
|
+
* @example
|
|
322
|
+
* ```tsx
|
|
323
|
+
* class Component extends React.Component {
|
|
324
|
+
* renderHeader = () => <div />;
|
|
325
|
+
* renderFooter = () => <div />;
|
|
326
|
+
* }
|
|
327
|
+
* ```
|
|
328
|
+
* @param node The AST node to check
|
|
329
|
+
* @returns `true` if node is a render function, `false` if not
|
|
330
|
+
*/
|
|
331
|
+
declare function isFunctionOfRenderMethod(node: AST.TSESTreeFunction): boolean;
|
|
269
332
|
|
|
270
333
|
/**
|
|
271
334
|
* Check if a node is a React class component
|
|
@@ -418,4 +481,4 @@ declare const isCreateRefCall: isCallFromReact.ReturnType;
|
|
|
418
481
|
declare const isForwardRefCall: isCallFromReact.ReturnType;
|
|
419
482
|
declare const isMemoCall: isCallFromReact.ReturnType;
|
|
420
483
|
|
|
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 };
|
|
484
|
+
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, isComponentDidUpdate, isComponentName, isComponentNameLoose, isComponentWillMount, isComponentWillReceiveProps, isComponentWillUnmount, isComponentWillUpdate, isComponentWrapperCall, isComponentWrapperCallLoose, isCreateContext, isCreateContextCall, isCreateElement, isCreateElementCall, isCreateRef, isCreateRefCall, isDeclaredInRenderPropLoose, isDirectValueOfRenderPropertyLoose, isForwardRef, isForwardRefCall, isFromReact, isFromReactLoose, isFromReactObject, isFromReactStrict, isFunctionOfComponentDidMount, isFunctionOfComponentWillUnmount, isFunctionOfRender, isFunctionOfRenderMethod, isFunctionOfUseEffectCleanup, isFunctionOfUseEffectSetup, isGetChildContext, isGetDefaultProps, isGetDerivedStateFromError, isGetDerivedStateFromProps, isGetInitialState, isGetSnapshotBeforeUpdate, isInitializedFromReact, isInsideRenderMethod, isInstanceIdEqual, isInversePhase, isMemo, isMemoCall, isPureComponent, isReactAPI, isReactAPICall, isReactHook, isReactHookCall, isReactHookCallWithName, isReactHookCallWithNameAlias, isReactHookCallWithNameLoose, isReactHookName, isReactHookNameLoose, isRenderFunctionLoose, isRenderLike, isRenderMethodLike, isRenderPropLoose, isShouldComponentUpdate, isThisSetState, isUnsafeComponentWillMount, isUnsafeComponentWillReceiveProps, isUnsafeComponentWillUpdate, 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
|
@@ -145,15 +145,23 @@ declare function getComponentFlagFromInitPath(initPath: FunctionComponent["initP
|
|
|
145
145
|
|
|
146
146
|
type ComponentKind = "classComponent" | "functionComponent";
|
|
147
147
|
|
|
148
|
+
declare function isComponentDidCatch(node: TSESTree.Node): node is AST.TSESTreeMethodOrProperty;
|
|
148
149
|
declare function isComponentDidMount(node: TSESTree.Node): node is AST.TSESTreeMethodOrProperty;
|
|
150
|
+
declare function isComponentDidUpdate(node: TSESTree.Node): node is AST.TSESTreeMethodOrProperty;
|
|
151
|
+
declare function isComponentWillMount(node: TSESTree.Node): node is AST.TSESTreeMethodOrProperty;
|
|
152
|
+
declare function isComponentWillReceiveProps(node: TSESTree.Node): node is AST.TSESTreeMethodOrProperty;
|
|
149
153
|
declare function isComponentWillUnmount(node: TSESTree.Node): node is AST.TSESTreeMethodOrProperty;
|
|
150
|
-
declare function
|
|
151
|
-
declare function
|
|
154
|
+
declare function isComponentWillUpdate(node: TSESTree.Node): node is AST.TSESTreeMethodOrProperty;
|
|
155
|
+
declare function isGetChildContext(node: TSESTree.Node): node is AST.TSESTreeMethodOrProperty;
|
|
156
|
+
declare function isGetDefaultProps(node: TSESTree.Node): node is AST.TSESTreeMethodOrProperty;
|
|
157
|
+
declare function isGetInitialState(node: TSESTree.Node): node is AST.TSESTreeMethodOrProperty;
|
|
158
|
+
declare function isGetSnapshotBeforeUpdate(node: TSESTree.Node): node is AST.TSESTreeMethodOrProperty;
|
|
159
|
+
declare function isShouldComponentUpdate(node: TSESTree.Node): node is AST.TSESTreeMethodOrProperty;
|
|
160
|
+
declare function isUnsafeComponentWillMount(node: TSESTree.Node): node is AST.TSESTreeMethodOrProperty;
|
|
161
|
+
declare function isUnsafeComponentWillReceiveProps(node: TSESTree.Node): node is AST.TSESTreeMethodOrProperty;
|
|
162
|
+
declare function isUnsafeComponentWillUpdate(node: TSESTree.Node): node is AST.TSESTreeMethodOrProperty;
|
|
152
163
|
declare function isGetDerivedStateFromProps(node: TSESTree.Node): node is AST.TSESTreeMethodOrProperty;
|
|
153
|
-
declare function
|
|
154
|
-
declare function isFunctionOfComponentWillUnmount(node: TSESTree.Node): boolean;
|
|
155
|
-
declare function isRenderMethodLike(node: TSESTree.Node): node is AST.TSESTreeMethodOrProperty;
|
|
156
|
-
declare function isFunctionOfRenderMethod(node: AST.TSESTreeFunction): boolean;
|
|
164
|
+
declare function isGetDerivedStateFromError(node: TSESTree.Node): node is AST.TSESTreeMethodOrProperty;
|
|
157
165
|
|
|
158
166
|
declare const RE_COMPONENT_NAME: RegExp;
|
|
159
167
|
declare const RE_COMPONENT_NAME_LOOSE: RegExp;
|
|
@@ -174,6 +182,46 @@ declare const isInversePhase: {
|
|
|
174
182
|
(a: ComponentPhaseKind, b: ComponentPhaseKind): boolean;
|
|
175
183
|
};
|
|
176
184
|
|
|
185
|
+
/**
|
|
186
|
+
* Check whether given node is a render function of a class component
|
|
187
|
+
* @example
|
|
188
|
+
* ```tsx
|
|
189
|
+
* class Component extends React.Component {
|
|
190
|
+
* render() {
|
|
191
|
+
* return <div />;
|
|
192
|
+
* }
|
|
193
|
+
* }
|
|
194
|
+
* ```
|
|
195
|
+
* @param node The AST node to check
|
|
196
|
+
* @returns `true` if node is a render function, `false` if not
|
|
197
|
+
*/
|
|
198
|
+
declare function isRenderLike(node: TSESTree.Node): node is AST.TSESTreeMethodOrProperty;
|
|
199
|
+
/**
|
|
200
|
+
* Check whether given node is a function of a render function of a class component
|
|
201
|
+
* @example
|
|
202
|
+
* ```tsx
|
|
203
|
+
* class Component extends React.Component {
|
|
204
|
+
* render = () => <div />;
|
|
205
|
+
* ```
|
|
206
|
+
* @param node The AST node to check
|
|
207
|
+
* @returns `true` if node is a render function, `false` if not
|
|
208
|
+
*/
|
|
209
|
+
declare function isFunctionOfRender(node: AST.TSESTreeFunction): boolean;
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Check whether given node is a render method of a class component
|
|
213
|
+
* @example
|
|
214
|
+
* ```tsx
|
|
215
|
+
* class Component extends React.Component {
|
|
216
|
+
* renderHeader = () => <div />;
|
|
217
|
+
* renderFooter = () => <div />;
|
|
218
|
+
* }
|
|
219
|
+
* ```
|
|
220
|
+
* @param node The AST node to check
|
|
221
|
+
* @returns `true` if node is a render function, `false` if not
|
|
222
|
+
*/
|
|
223
|
+
declare function isRenderMethodLike(node: TSESTree.Node): node is AST.TSESTreeMethodOrProperty;
|
|
224
|
+
|
|
177
225
|
/**
|
|
178
226
|
* Unsafe check whether given node is a render function
|
|
179
227
|
* ```tsx
|
|
@@ -266,6 +314,21 @@ declare function isChildrenOfCreateElement(context: RuleContext, node: TSESTree.
|
|
|
266
314
|
* @returns `true` if node is inside class component's render block, `false` if not
|
|
267
315
|
*/
|
|
268
316
|
declare function isInsideRenderMethod(node: TSESTree.Node): boolean;
|
|
317
|
+
declare function isFunctionOfComponentDidMount(node: TSESTree.Node): boolean;
|
|
318
|
+
declare function isFunctionOfComponentWillUnmount(node: TSESTree.Node): boolean;
|
|
319
|
+
/**
|
|
320
|
+
* Check whether given node is a function of a render method of a class component
|
|
321
|
+
* @example
|
|
322
|
+
* ```tsx
|
|
323
|
+
* class Component extends React.Component {
|
|
324
|
+
* renderHeader = () => <div />;
|
|
325
|
+
* renderFooter = () => <div />;
|
|
326
|
+
* }
|
|
327
|
+
* ```
|
|
328
|
+
* @param node The AST node to check
|
|
329
|
+
* @returns `true` if node is a render function, `false` if not
|
|
330
|
+
*/
|
|
331
|
+
declare function isFunctionOfRenderMethod(node: AST.TSESTreeFunction): boolean;
|
|
269
332
|
|
|
270
333
|
/**
|
|
271
334
|
* Check if a node is a React class component
|
|
@@ -418,4 +481,4 @@ declare const isCreateRefCall: isCallFromReact.ReturnType;
|
|
|
418
481
|
declare const isForwardRefCall: isCallFromReact.ReturnType;
|
|
419
482
|
declare const isMemoCall: isCallFromReact.ReturnType;
|
|
420
483
|
|
|
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 };
|
|
484
|
+
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, isComponentDidUpdate, isComponentName, isComponentNameLoose, isComponentWillMount, isComponentWillReceiveProps, isComponentWillUnmount, isComponentWillUpdate, isComponentWrapperCall, isComponentWrapperCallLoose, isCreateContext, isCreateContextCall, isCreateElement, isCreateElementCall, isCreateRef, isCreateRefCall, isDeclaredInRenderPropLoose, isDirectValueOfRenderPropertyLoose, isForwardRef, isForwardRefCall, isFromReact, isFromReactLoose, isFromReactObject, isFromReactStrict, isFunctionOfComponentDidMount, isFunctionOfComponentWillUnmount, isFunctionOfRender, isFunctionOfRenderMethod, isFunctionOfUseEffectCleanup, isFunctionOfUseEffectSetup, isGetChildContext, isGetDefaultProps, isGetDerivedStateFromError, isGetDerivedStateFromProps, isGetInitialState, isGetSnapshotBeforeUpdate, isInitializedFromReact, isInsideRenderMethod, isInstanceIdEqual, isInversePhase, isMemo, isMemoCall, isPureComponent, isReactAPI, isReactAPICall, isReactHook, isReactHookCall, isReactHookCallWithName, isReactHookCallWithNameAlias, isReactHookCallWithNameLoose, isReactHookName, isReactHookNameLoose, isRenderFunctionLoose, isRenderLike, isRenderMethodLike, isRenderPropLoose, isShouldComponentUpdate, isThisSetState, isUnsafeComponentWillMount, isUnsafeComponentWillReceiveProps, isUnsafeComponentWillUpdate, 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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var AST6 = require('@eslint-react/ast');
|
|
4
4
|
var eff = require('@eslint-react/eff');
|
|
5
5
|
var JSX3 = require('@eslint-react/jsx');
|
|
6
6
|
var shared = require('@eslint-react/shared');
|
|
@@ -30,7 +30,7 @@ function _interopNamespace(e) {
|
|
|
30
30
|
return Object.freeze(n);
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
var
|
|
33
|
+
var AST6__namespace = /*#__PURE__*/_interopNamespace(AST6);
|
|
34
34
|
var JSX3__namespace = /*#__PURE__*/_interopNamespace(JSX3);
|
|
35
35
|
var VAR__namespace = /*#__PURE__*/_interopNamespace(VAR);
|
|
36
36
|
var birecord__default = /*#__PURE__*/_interopDefault(birecord);
|
|
@@ -46,15 +46,6 @@ var DISPLAY_NAME_ASSIGNMENT_SELECTOR = [
|
|
|
46
46
|
"[left.property.name='displayName']"
|
|
47
47
|
].join("");
|
|
48
48
|
|
|
49
|
-
// src/hook/hook-name.ts
|
|
50
|
-
var RE_HOOK_NAME = /^use[A-Z\d]/u;
|
|
51
|
-
function isReactHookName(name) {
|
|
52
|
-
return name === "use" || RE_HOOK_NAME.test(name);
|
|
53
|
-
}
|
|
54
|
-
function isReactHookNameLoose(name) {
|
|
55
|
-
return name.startsWith("use");
|
|
56
|
-
}
|
|
57
|
-
|
|
58
49
|
// ../../node_modules/.pnpm/valibot@1.0.0_typescript@5.8.2/node_modules/valibot/dist/index.js
|
|
59
50
|
var store;
|
|
60
51
|
// @__NO_SIDE_EFFECTS__
|
|
@@ -560,7 +551,7 @@ function isInitializedFromReact(name, importSource, initialScope) {
|
|
|
560
551
|
}
|
|
561
552
|
const args = getRequireExpressionArguments(init);
|
|
562
553
|
const arg0 = args?.[0];
|
|
563
|
-
if (arg0 == null || !
|
|
554
|
+
if (arg0 == null || !AST6__namespace.isKindOfLiteral(arg0, "string")) {
|
|
564
555
|
return false;
|
|
565
556
|
}
|
|
566
557
|
return arg0.value === importSource || arg0.value.startsWith(`${importSource}/`);
|
|
@@ -625,7 +616,7 @@ function isCallFromReactObject(objectName, propertyName) {
|
|
|
625
616
|
});
|
|
626
617
|
}
|
|
627
618
|
function isInstanceIdEqual(context, a, b) {
|
|
628
|
-
return
|
|
619
|
+
return AST6__namespace.isNodeEqual(a, b) || VAR__namespace.isNodeValueEqual(a, b, [
|
|
629
620
|
context.sourceCode.getScope(a),
|
|
630
621
|
context.sourceCode.getScope(b)
|
|
631
622
|
]);
|
|
@@ -661,10 +652,19 @@ var isCreateRefCall = isReactAPICall("createRef");
|
|
|
661
652
|
var isForwardRefCall = isReactAPICall("forwardRef");
|
|
662
653
|
var isMemoCall = isReactAPICall("memo");
|
|
663
654
|
|
|
655
|
+
// src/hook/hook-name.ts
|
|
656
|
+
var RE_HOOK_NAME = /^use[A-Z\d]/u;
|
|
657
|
+
function isReactHookName(name) {
|
|
658
|
+
return name === "use" || RE_HOOK_NAME.test(name);
|
|
659
|
+
}
|
|
660
|
+
function isReactHookNameLoose(name) {
|
|
661
|
+
return name.startsWith("use");
|
|
662
|
+
}
|
|
663
|
+
|
|
664
664
|
// src/hook/is.ts
|
|
665
665
|
function isReactHook(node) {
|
|
666
666
|
if (node == null) return false;
|
|
667
|
-
const id =
|
|
667
|
+
const id = AST6__namespace.getFunctionIdentifier(node);
|
|
668
668
|
return id?.name != null && isReactHookName(id.name);
|
|
669
669
|
}
|
|
670
670
|
function isReactHookCall(node) {
|
|
@@ -762,12 +762,23 @@ var isUseStateCall = eff.flip(isReactHookCallWithName)("useState");
|
|
|
762
762
|
var isUseSyncExternalStoreCall = eff.flip(isReactHookCallWithName)("useSyncExternalStore");
|
|
763
763
|
var isUseTransitionCall = eff.flip(isReactHookCallWithName)("useTransition");
|
|
764
764
|
|
|
765
|
-
// src/hook/
|
|
765
|
+
// src/hook/hierarchy.ts
|
|
766
|
+
function isFunctionOfUseEffectSetup(node) {
|
|
767
|
+
if (node == null) return false;
|
|
768
|
+
return node.parent?.type === types.AST_NODE_TYPES.CallExpression && node.parent.callee !== node && node.parent.callee.type === types.AST_NODE_TYPES.Identifier && node.parent.arguments.at(0) === node && isUseEffectCallLoose(node.parent);
|
|
769
|
+
}
|
|
770
|
+
function isFunctionOfUseEffectCleanup(node) {
|
|
771
|
+
if (node == null) return false;
|
|
772
|
+
const returnStatement = AST6__namespace.findParentNode(node, AST6__namespace.is(types.AST_NODE_TYPES.ReturnStatement));
|
|
773
|
+
const enclosingFunction = AST6__namespace.findParentNode(node, AST6__namespace.isFunction);
|
|
774
|
+
const functionOfReturnStatement = AST6__namespace.findParentNode(returnStatement, AST6__namespace.isFunction);
|
|
775
|
+
return enclosingFunction === functionOfReturnStatement && isFunctionOfUseEffectSetup(enclosingFunction);
|
|
776
|
+
}
|
|
766
777
|
function useHookCollector() {
|
|
767
778
|
const hooks = /* @__PURE__ */ new Map();
|
|
768
779
|
const functionEntries = [];
|
|
769
780
|
const onFunctionEnter = (node) => {
|
|
770
|
-
const id =
|
|
781
|
+
const id = AST6__namespace.getFunctionIdentifier(node);
|
|
771
782
|
const key = shared.getId();
|
|
772
783
|
const name = id?.name;
|
|
773
784
|
if (name != null && isReactHookName(name)) {
|
|
@@ -846,6 +857,57 @@ var ComponentDetectionHint = {
|
|
|
846
857
|
SkipClassProperty: 1n << 69n
|
|
847
858
|
};
|
|
848
859
|
var DEFAULT_COMPONENT_DETECTION_HINT = 0n | ComponentDetectionHint.SkipBooleanLiteral | ComponentDetectionHint.SkipEmptyArray | ComponentDetectionHint.SkipArrayMapArgument | ComponentDetectionHint.SkipNumberLiteral | ComponentDetectionHint.SkipStringLiteral | ComponentDetectionHint.SkipUndefined | ComponentDetectionHint.StrictArray | ComponentDetectionHint.StrictConditional | ComponentDetectionHint.StrictLogical;
|
|
860
|
+
function isComponentDidCatch(node) {
|
|
861
|
+
return AST6__namespace.isMethodOrProperty(node) && !node.static && node.key.type === types.AST_NODE_TYPES.Identifier && node.key.name === "componentDidCatch";
|
|
862
|
+
}
|
|
863
|
+
function isComponentDidMount(node) {
|
|
864
|
+
return AST6__namespace.isMethodOrProperty(node) && !node.static && node.key.type === types.AST_NODE_TYPES.Identifier && node.key.name === "componentDidMount";
|
|
865
|
+
}
|
|
866
|
+
function isComponentDidUpdate(node) {
|
|
867
|
+
return AST6__namespace.isMethodOrProperty(node) && !node.static && node.key.type === types.AST_NODE_TYPES.Identifier && node.key.name === "componentDidUpdate";
|
|
868
|
+
}
|
|
869
|
+
function isComponentWillMount(node) {
|
|
870
|
+
return AST6__namespace.isMethodOrProperty(node) && !node.static && node.key.type === types.AST_NODE_TYPES.Identifier && node.key.name === "componentWillMount";
|
|
871
|
+
}
|
|
872
|
+
function isComponentWillReceiveProps(node) {
|
|
873
|
+
return AST6__namespace.isMethodOrProperty(node) && !node.static && node.key.type === types.AST_NODE_TYPES.Identifier && node.key.name === "componentWillReceiveProps";
|
|
874
|
+
}
|
|
875
|
+
function isComponentWillUnmount(node) {
|
|
876
|
+
return AST6__namespace.isMethodOrProperty(node) && !node.static && node.key.type === types.AST_NODE_TYPES.Identifier && node.key.name === "componentWillUnmount";
|
|
877
|
+
}
|
|
878
|
+
function isComponentWillUpdate(node) {
|
|
879
|
+
return AST6__namespace.isMethodOrProperty(node) && !node.static && node.key.type === types.AST_NODE_TYPES.Identifier && node.key.name === "componentWillUpdate";
|
|
880
|
+
}
|
|
881
|
+
function isGetChildContext(node) {
|
|
882
|
+
return AST6__namespace.isMethodOrProperty(node) && !node.static && node.key.type === types.AST_NODE_TYPES.Identifier && node.key.name === "getChildContext";
|
|
883
|
+
}
|
|
884
|
+
function isGetDefaultProps(node) {
|
|
885
|
+
return AST6__namespace.isMethodOrProperty(node) && node.static && node.key.type === types.AST_NODE_TYPES.Identifier && node.key.name === "getDefaultProps";
|
|
886
|
+
}
|
|
887
|
+
function isGetInitialState(node) {
|
|
888
|
+
return AST6__namespace.isMethodOrProperty(node) && !node.static && node.key.type === types.AST_NODE_TYPES.Identifier && node.key.name === "getInitialState";
|
|
889
|
+
}
|
|
890
|
+
function isGetSnapshotBeforeUpdate(node) {
|
|
891
|
+
return AST6__namespace.isMethodOrProperty(node) && !node.static && node.key.type === types.AST_NODE_TYPES.Identifier && node.key.name === "getSnapshotBeforeUpdate";
|
|
892
|
+
}
|
|
893
|
+
function isShouldComponentUpdate(node) {
|
|
894
|
+
return AST6__namespace.isMethodOrProperty(node) && !node.static && node.key.type === types.AST_NODE_TYPES.Identifier && node.key.name === "shouldComponentUpdate";
|
|
895
|
+
}
|
|
896
|
+
function isUnsafeComponentWillMount(node) {
|
|
897
|
+
return AST6__namespace.isMethodOrProperty(node) && !node.static && node.key.type === types.AST_NODE_TYPES.Identifier && node.key.name === "UNSAFE_componentWillMount";
|
|
898
|
+
}
|
|
899
|
+
function isUnsafeComponentWillReceiveProps(node) {
|
|
900
|
+
return AST6__namespace.isMethodOrProperty(node) && !node.static && node.key.type === types.AST_NODE_TYPES.Identifier && node.key.name === "UNSAFE_componentWillReceiveProps";
|
|
901
|
+
}
|
|
902
|
+
function isUnsafeComponentWillUpdate(node) {
|
|
903
|
+
return AST6__namespace.isMethodOrProperty(node) && !node.static && node.key.type === types.AST_NODE_TYPES.Identifier && node.key.name === "UNSAFE_componentWillUpdate";
|
|
904
|
+
}
|
|
905
|
+
function isGetDerivedStateFromProps(node) {
|
|
906
|
+
return AST6__namespace.isMethodOrProperty(node) && node.static && node.key.type === types.AST_NODE_TYPES.Identifier && node.key.name === "getDerivedStateFromProps";
|
|
907
|
+
}
|
|
908
|
+
function isGetDerivedStateFromError(node) {
|
|
909
|
+
return AST6__namespace.isMethodOrProperty(node) && node.static && node.key.type === types.AST_NODE_TYPES.Identifier && node.key.name === "getDerivedStateFromError";
|
|
910
|
+
}
|
|
849
911
|
function isClassComponent(node) {
|
|
850
912
|
if ("superClass" in node && node.superClass != null) {
|
|
851
913
|
const re = /^(?:Pure)?Component$/u;
|
|
@@ -871,30 +933,35 @@ function isPureComponent(node) {
|
|
|
871
933
|
return false;
|
|
872
934
|
}
|
|
873
935
|
|
|
874
|
-
// src/component/component-
|
|
875
|
-
function
|
|
876
|
-
return
|
|
936
|
+
// src/component/component-render.ts
|
|
937
|
+
function isRenderLike(node) {
|
|
938
|
+
return AST6__namespace.isMethodOrProperty(node) && node.key.type === types.AST_NODE_TYPES.Identifier && node.key.name === "render" && node.parent.parent.type === types.AST_NODE_TYPES.ClassDeclaration;
|
|
877
939
|
}
|
|
878
|
-
function
|
|
879
|
-
|
|
940
|
+
function isFunctionOfRender(node) {
|
|
941
|
+
if (!isRenderLike(node.parent)) {
|
|
942
|
+
return false;
|
|
943
|
+
}
|
|
944
|
+
return isClassComponent(node.parent.parent.parent);
|
|
880
945
|
}
|
|
881
|
-
function
|
|
882
|
-
return
|
|
946
|
+
function isRenderMethodLike(node) {
|
|
947
|
+
return AST6__namespace.isMethodOrProperty(node) && node.key.type === types.AST_NODE_TYPES.Identifier && node.key.name.startsWith("render") && node.parent.parent.type === types.AST_NODE_TYPES.ClassDeclaration;
|
|
883
948
|
}
|
|
884
|
-
|
|
885
|
-
|
|
949
|
+
|
|
950
|
+
// src/component/hierarchy.ts
|
|
951
|
+
function isChildrenOfCreateElement(context, node) {
|
|
952
|
+
const parent = node.parent;
|
|
953
|
+
if (parent == null || parent.type !== types.AST_NODE_TYPES.CallExpression) return false;
|
|
954
|
+
if (!isCreateElementCall(context, parent)) return false;
|
|
955
|
+
return parent.arguments.slice(2).some((arg) => arg === node);
|
|
886
956
|
}
|
|
887
|
-
function
|
|
888
|
-
return
|
|
957
|
+
function isInsideRenderMethod(node) {
|
|
958
|
+
return AST6__namespace.findParentNode(node, (n) => isRenderLike(n) && isClassComponent(n.parent.parent)) != null;
|
|
889
959
|
}
|
|
890
960
|
function isFunctionOfComponentDidMount(node) {
|
|
891
|
-
return
|
|
961
|
+
return AST6__namespace.isFunction(node) && isComponentDidMount(node.parent) && node.parent.value === node;
|
|
892
962
|
}
|
|
893
963
|
function isFunctionOfComponentWillUnmount(node) {
|
|
894
|
-
return
|
|
895
|
-
}
|
|
896
|
-
function isRenderMethodLike(node) {
|
|
897
|
-
return AST5__namespace.isMethodOrProperty(node) && node.key.type === types.AST_NODE_TYPES.Identifier && node.key.name === "render" && node.parent.parent.type === types.AST_NODE_TYPES.ClassDeclaration;
|
|
964
|
+
return AST6__namespace.isFunction(node) && isComponentWillUnmount(node.parent) && node.parent.value === node;
|
|
898
965
|
}
|
|
899
966
|
function isFunctionOfRenderMethod(node) {
|
|
900
967
|
if (!isRenderMethodLike(node.parent)) {
|
|
@@ -902,15 +969,6 @@ function isFunctionOfRenderMethod(node) {
|
|
|
902
969
|
}
|
|
903
970
|
return isClassComponent(node.parent.parent.parent);
|
|
904
971
|
}
|
|
905
|
-
function isChildrenOfCreateElement(context, node) {
|
|
906
|
-
const parent = node.parent;
|
|
907
|
-
if (parent == null || parent.type !== types.AST_NODE_TYPES.CallExpression) return false;
|
|
908
|
-
if (!isCreateElementCall(context, parent)) return false;
|
|
909
|
-
return parent.arguments.slice(2).some((arg) => arg === node);
|
|
910
|
-
}
|
|
911
|
-
function isInsideRenderMethod(node) {
|
|
912
|
-
return AST5__namespace.findParentNode(node, (n) => isRenderMethodLike(n) && isClassComponent(n.parent.parent)) != null;
|
|
913
|
-
}
|
|
914
972
|
|
|
915
973
|
// src/component/component-definition.ts
|
|
916
974
|
var isFunctionOfClassMethod = tsPattern.isMatching({
|
|
@@ -943,12 +1001,12 @@ function isValidComponentDefinition(context, node, hint) {
|
|
|
943
1001
|
if (hint & ComponentDetectionHint.SkipClassProperty && isFunctionOfClassProperty(node.parent)) {
|
|
944
1002
|
return false;
|
|
945
1003
|
}
|
|
946
|
-
if (hint & ComponentDetectionHint.SkipArrayMapArgument &&
|
|
1004
|
+
if (hint & ComponentDetectionHint.SkipArrayMapArgument && AST6__namespace.isArrayMapCallLoose(node.parent)) {
|
|
947
1005
|
return false;
|
|
948
1006
|
}
|
|
949
|
-
const boundaryNode =
|
|
1007
|
+
const boundaryNode = AST6__namespace.findParentNode(
|
|
950
1008
|
node,
|
|
951
|
-
|
|
1009
|
+
AST6__namespace.isOneOf([
|
|
952
1010
|
types.AST_NODE_TYPES.JSXExpressionContainer,
|
|
953
1011
|
types.AST_NODE_TYPES.ArrowFunctionExpression,
|
|
954
1012
|
types.AST_NODE_TYPES.FunctionExpression,
|
|
@@ -969,7 +1027,7 @@ function isComponentWrapperCallLoose(context, node) {
|
|
|
969
1027
|
|
|
970
1028
|
// src/component/component-id.ts
|
|
971
1029
|
function getFunctionComponentId(context, node) {
|
|
972
|
-
const functionId =
|
|
1030
|
+
const functionId = AST6__namespace.getFunctionIdentifier(node);
|
|
973
1031
|
if (functionId != null) {
|
|
974
1032
|
return functionId;
|
|
975
1033
|
}
|
|
@@ -996,10 +1054,10 @@ var ComponentFlag = {
|
|
|
996
1054
|
// src/component/component-init-path.ts
|
|
997
1055
|
function getComponentFlagFromInitPath(initPath) {
|
|
998
1056
|
let flag = ComponentFlag.None;
|
|
999
|
-
if (initPath != null &&
|
|
1057
|
+
if (initPath != null && AST6__namespace.hasCallInFunctionInitPath("memo", initPath)) {
|
|
1000
1058
|
flag |= ComponentFlag.Memo;
|
|
1001
1059
|
}
|
|
1002
|
-
if (initPath != null &&
|
|
1060
|
+
if (initPath != null && AST6__namespace.hasCallInFunctionInitPath("forwardRef", initPath)) {
|
|
1003
1061
|
flag |= ComponentFlag.ForwardRef;
|
|
1004
1062
|
}
|
|
1005
1063
|
return flag;
|
|
@@ -1042,7 +1100,7 @@ function useComponentCollector(context, options = {}) {
|
|
|
1042
1100
|
const entry = functionEntries.at(-1);
|
|
1043
1101
|
if (entry == null) return;
|
|
1044
1102
|
if (!entry.isComponent) return functionEntries.pop();
|
|
1045
|
-
const shouldDrop =
|
|
1103
|
+
const shouldDrop = AST6__namespace.getNestedReturnStatements(entry.node.body).slice().reverse().some((r) => {
|
|
1046
1104
|
return context.sourceCode.getScope(r).block === entry.node && r.argument != null && !JSX3__namespace.isJSXLike(r.argument, jsxCtx, hint);
|
|
1047
1105
|
});
|
|
1048
1106
|
if (shouldDrop) {
|
|
@@ -1069,7 +1127,7 @@ function useComponentCollector(context, options = {}) {
|
|
|
1069
1127
|
const { body } = entry.node;
|
|
1070
1128
|
const isComponent = hasNoneOrLooseComponentName(context, entry.node) && JSX3__namespace.isJSXLike(body, jsxCtx, hint) && isValidComponentDefinition(context, entry.node, hint);
|
|
1071
1129
|
if (!isComponent) return;
|
|
1072
|
-
const initPath =
|
|
1130
|
+
const initPath = AST6__namespace.getFunctionInitPath(entry.node);
|
|
1073
1131
|
const id = getFunctionComponentId(context, entry.node);
|
|
1074
1132
|
const name = getComponentNameFromId(id);
|
|
1075
1133
|
const key = shared.getId();
|
|
@@ -1110,7 +1168,7 @@ function useComponentCollector(context, options = {}) {
|
|
|
1110
1168
|
const isComponent = hasNoneOrLooseComponentName(context, entry.node) && JSX3__namespace.isJSXLike(node.argument, jsxCtx, hint) && isValidComponentDefinition(context, entry.node, hint);
|
|
1111
1169
|
if (!isComponent) return;
|
|
1112
1170
|
entry.isComponent = true;
|
|
1113
|
-
const initPath =
|
|
1171
|
+
const initPath = AST6__namespace.getFunctionInitPath(entry.node);
|
|
1114
1172
|
const id = getFunctionComponentId(context, entry.node);
|
|
1115
1173
|
const name = getComponentNameFromId(id);
|
|
1116
1174
|
components.set(entry.key, {
|
|
@@ -1141,7 +1199,7 @@ function useComponentCollectorLegacy() {
|
|
|
1141
1199
|
if (!isClassComponent(node)) {
|
|
1142
1200
|
return;
|
|
1143
1201
|
}
|
|
1144
|
-
const id =
|
|
1202
|
+
const id = AST6__namespace.getClassIdentifier(node);
|
|
1145
1203
|
const key = shared.getId();
|
|
1146
1204
|
const flag = isPureComponent(node) ? ComponentFlag.PureComponent : ComponentFlag.None;
|
|
1147
1205
|
components.set(
|
|
@@ -1174,7 +1232,7 @@ var ComponentPhaseRelevance = birecord__default.default({
|
|
|
1174
1232
|
var isInversePhase = eff.dual(2, (a, b) => ComponentPhaseRelevance.get(a) === b);
|
|
1175
1233
|
function isRenderFunctionLoose(context, node) {
|
|
1176
1234
|
const { body, parent } = node;
|
|
1177
|
-
if (
|
|
1235
|
+
if (AST6__namespace.getFunctionIdentifier(node)?.name.startsWith("render")) {
|
|
1178
1236
|
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
1237
|
}
|
|
1180
1238
|
return JSX3__namespace.isJSXLike(
|
|
@@ -1189,7 +1247,7 @@ function isRenderPropLoose(context, node) {
|
|
|
1189
1247
|
if (node.name.type !== types.AST_NODE_TYPES.JSXIdentifier) {
|
|
1190
1248
|
return false;
|
|
1191
1249
|
}
|
|
1192
|
-
return node.name.name.startsWith("render") && node.value?.type === types.AST_NODE_TYPES.JSXExpressionContainer &&
|
|
1250
|
+
return node.name.name.startsWith("render") && node.value?.type === types.AST_NODE_TYPES.JSXExpressionContainer && AST6__namespace.isFunction(node.value.expression) && isRenderFunctionLoose(context, node.value.expression);
|
|
1193
1251
|
}
|
|
1194
1252
|
function isDirectValueOfRenderPropertyLoose(node) {
|
|
1195
1253
|
const matching = (node2) => {
|
|
@@ -1201,7 +1259,7 @@ function isDeclaredInRenderPropLoose(node) {
|
|
|
1201
1259
|
if (isDirectValueOfRenderPropertyLoose(node)) {
|
|
1202
1260
|
return true;
|
|
1203
1261
|
}
|
|
1204
|
-
const parent =
|
|
1262
|
+
const parent = AST6__namespace.findParentNode(node, AST6__namespace.is(types.AST_NODE_TYPES.JSXExpressionContainer))?.parent;
|
|
1205
1263
|
if (parent?.type !== types.AST_NODE_TYPES.JSXAttribute) {
|
|
1206
1264
|
return false;
|
|
1207
1265
|
}
|
|
@@ -1209,22 +1267,11 @@ function isDeclaredInRenderPropLoose(node) {
|
|
|
1209
1267
|
}
|
|
1210
1268
|
function isThisSetState(node) {
|
|
1211
1269
|
const { callee } = node;
|
|
1212
|
-
return callee.type === types.AST_NODE_TYPES.MemberExpression &&
|
|
1270
|
+
return callee.type === types.AST_NODE_TYPES.MemberExpression && AST6__namespace.isThisExpression(callee.object) && callee.property.type === types.AST_NODE_TYPES.Identifier && callee.property.name === "setState";
|
|
1213
1271
|
}
|
|
1214
1272
|
function isAssignmentToThisState(node) {
|
|
1215
1273
|
const { left } = node;
|
|
1216
|
-
return left.type === types.AST_NODE_TYPES.MemberExpression &&
|
|
1217
|
-
}
|
|
1218
|
-
function isFunctionOfUseEffectSetup(node) {
|
|
1219
|
-
if (node == null) return false;
|
|
1220
|
-
return node.parent?.type === types.AST_NODE_TYPES.CallExpression && node.parent.callee !== node && node.parent.callee.type === types.AST_NODE_TYPES.Identifier && node.parent.arguments.at(0) === node && isUseEffectCallLoose(node.parent);
|
|
1221
|
-
}
|
|
1222
|
-
function isFunctionOfUseEffectCleanup(node) {
|
|
1223
|
-
if (node == null) return false;
|
|
1224
|
-
const returnStatement = AST5__namespace.findParentNode(node, AST5__namespace.is(types.AST_NODE_TYPES.ReturnStatement));
|
|
1225
|
-
const enclosingFunction = AST5__namespace.findParentNode(node, AST5__namespace.isFunction);
|
|
1226
|
-
const functionOfReturnStatement = AST5__namespace.findParentNode(returnStatement, AST5__namespace.isFunction);
|
|
1227
|
-
return enclosingFunction === functionOfReturnStatement && isFunctionOfUseEffectSetup(enclosingFunction);
|
|
1274
|
+
return left.type === types.AST_NODE_TYPES.MemberExpression && AST6__namespace.isThisExpression(left.object) && AST6__namespace.getPropertyName(left.property) === "state";
|
|
1228
1275
|
}
|
|
1229
1276
|
|
|
1230
1277
|
exports.ComponentDetectionHint = ComponentDetectionHint;
|
|
@@ -1259,9 +1306,13 @@ exports.isCloneElement = isCloneElement;
|
|
|
1259
1306
|
exports.isCloneElementCall = isCloneElementCall;
|
|
1260
1307
|
exports.isComponentDidCatch = isComponentDidCatch;
|
|
1261
1308
|
exports.isComponentDidMount = isComponentDidMount;
|
|
1309
|
+
exports.isComponentDidUpdate = isComponentDidUpdate;
|
|
1262
1310
|
exports.isComponentName = isComponentName;
|
|
1263
1311
|
exports.isComponentNameLoose = isComponentNameLoose;
|
|
1312
|
+
exports.isComponentWillMount = isComponentWillMount;
|
|
1313
|
+
exports.isComponentWillReceiveProps = isComponentWillReceiveProps;
|
|
1264
1314
|
exports.isComponentWillUnmount = isComponentWillUnmount;
|
|
1315
|
+
exports.isComponentWillUpdate = isComponentWillUpdate;
|
|
1265
1316
|
exports.isComponentWrapperCall = isComponentWrapperCall;
|
|
1266
1317
|
exports.isComponentWrapperCallLoose = isComponentWrapperCallLoose;
|
|
1267
1318
|
exports.isCreateContext = isCreateContext;
|
|
@@ -1280,11 +1331,16 @@ exports.isFromReactObject = isFromReactObject;
|
|
|
1280
1331
|
exports.isFromReactStrict = isFromReactStrict;
|
|
1281
1332
|
exports.isFunctionOfComponentDidMount = isFunctionOfComponentDidMount;
|
|
1282
1333
|
exports.isFunctionOfComponentWillUnmount = isFunctionOfComponentWillUnmount;
|
|
1334
|
+
exports.isFunctionOfRender = isFunctionOfRender;
|
|
1283
1335
|
exports.isFunctionOfRenderMethod = isFunctionOfRenderMethod;
|
|
1284
1336
|
exports.isFunctionOfUseEffectCleanup = isFunctionOfUseEffectCleanup;
|
|
1285
1337
|
exports.isFunctionOfUseEffectSetup = isFunctionOfUseEffectSetup;
|
|
1338
|
+
exports.isGetChildContext = isGetChildContext;
|
|
1339
|
+
exports.isGetDefaultProps = isGetDefaultProps;
|
|
1286
1340
|
exports.isGetDerivedStateFromError = isGetDerivedStateFromError;
|
|
1287
1341
|
exports.isGetDerivedStateFromProps = isGetDerivedStateFromProps;
|
|
1342
|
+
exports.isGetInitialState = isGetInitialState;
|
|
1343
|
+
exports.isGetSnapshotBeforeUpdate = isGetSnapshotBeforeUpdate;
|
|
1288
1344
|
exports.isInitializedFromReact = isInitializedFromReact;
|
|
1289
1345
|
exports.isInsideRenderMethod = isInsideRenderMethod;
|
|
1290
1346
|
exports.isInstanceIdEqual = isInstanceIdEqual;
|
|
@@ -1302,9 +1358,14 @@ exports.isReactHookCallWithNameLoose = isReactHookCallWithNameLoose;
|
|
|
1302
1358
|
exports.isReactHookName = isReactHookName;
|
|
1303
1359
|
exports.isReactHookNameLoose = isReactHookNameLoose;
|
|
1304
1360
|
exports.isRenderFunctionLoose = isRenderFunctionLoose;
|
|
1361
|
+
exports.isRenderLike = isRenderLike;
|
|
1305
1362
|
exports.isRenderMethodLike = isRenderMethodLike;
|
|
1306
1363
|
exports.isRenderPropLoose = isRenderPropLoose;
|
|
1364
|
+
exports.isShouldComponentUpdate = isShouldComponentUpdate;
|
|
1307
1365
|
exports.isThisSetState = isThisSetState;
|
|
1366
|
+
exports.isUnsafeComponentWillMount = isUnsafeComponentWillMount;
|
|
1367
|
+
exports.isUnsafeComponentWillReceiveProps = isUnsafeComponentWillReceiveProps;
|
|
1368
|
+
exports.isUnsafeComponentWillUpdate = isUnsafeComponentWillUpdate;
|
|
1308
1369
|
exports.isUseActionStateCall = isUseActionStateCall;
|
|
1309
1370
|
exports.isUseCall = isUseCall;
|
|
1310
1371
|
exports.isUseCallbackCall = isUseCallbackCall;
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as AST6 from '@eslint-react/ast';
|
|
2
2
|
import { flip, dual, constFalse, identity, _ } from '@eslint-react/eff';
|
|
3
3
|
import * as JSX3 from '@eslint-react/jsx';
|
|
4
4
|
import { DEFAULT_ESLINT_REACT_SETTINGS as DEFAULT_ESLINT_REACT_SETTINGS$1, unsafeDecodeSettings, getId } from '@eslint-react/shared';
|
|
@@ -19,15 +19,6 @@ var DISPLAY_NAME_ASSIGNMENT_SELECTOR = [
|
|
|
19
19
|
"[left.property.name='displayName']"
|
|
20
20
|
].join("");
|
|
21
21
|
|
|
22
|
-
// src/hook/hook-name.ts
|
|
23
|
-
var RE_HOOK_NAME = /^use[A-Z\d]/u;
|
|
24
|
-
function isReactHookName(name) {
|
|
25
|
-
return name === "use" || RE_HOOK_NAME.test(name);
|
|
26
|
-
}
|
|
27
|
-
function isReactHookNameLoose(name) {
|
|
28
|
-
return name.startsWith("use");
|
|
29
|
-
}
|
|
30
|
-
|
|
31
22
|
// ../../node_modules/.pnpm/valibot@1.0.0_typescript@5.8.2/node_modules/valibot/dist/index.js
|
|
32
23
|
var store;
|
|
33
24
|
// @__NO_SIDE_EFFECTS__
|
|
@@ -533,7 +524,7 @@ function isInitializedFromReact(name, importSource, initialScope) {
|
|
|
533
524
|
}
|
|
534
525
|
const args = getRequireExpressionArguments(init);
|
|
535
526
|
const arg0 = args?.[0];
|
|
536
|
-
if (arg0 == null || !
|
|
527
|
+
if (arg0 == null || !AST6.isKindOfLiteral(arg0, "string")) {
|
|
537
528
|
return false;
|
|
538
529
|
}
|
|
539
530
|
return arg0.value === importSource || arg0.value.startsWith(`${importSource}/`);
|
|
@@ -598,7 +589,7 @@ function isCallFromReactObject(objectName, propertyName) {
|
|
|
598
589
|
});
|
|
599
590
|
}
|
|
600
591
|
function isInstanceIdEqual(context, a, b) {
|
|
601
|
-
return
|
|
592
|
+
return AST6.isNodeEqual(a, b) || VAR.isNodeValueEqual(a, b, [
|
|
602
593
|
context.sourceCode.getScope(a),
|
|
603
594
|
context.sourceCode.getScope(b)
|
|
604
595
|
]);
|
|
@@ -634,10 +625,19 @@ var isCreateRefCall = isReactAPICall("createRef");
|
|
|
634
625
|
var isForwardRefCall = isReactAPICall("forwardRef");
|
|
635
626
|
var isMemoCall = isReactAPICall("memo");
|
|
636
627
|
|
|
628
|
+
// src/hook/hook-name.ts
|
|
629
|
+
var RE_HOOK_NAME = /^use[A-Z\d]/u;
|
|
630
|
+
function isReactHookName(name) {
|
|
631
|
+
return name === "use" || RE_HOOK_NAME.test(name);
|
|
632
|
+
}
|
|
633
|
+
function isReactHookNameLoose(name) {
|
|
634
|
+
return name.startsWith("use");
|
|
635
|
+
}
|
|
636
|
+
|
|
637
637
|
// src/hook/is.ts
|
|
638
638
|
function isReactHook(node) {
|
|
639
639
|
if (node == null) return false;
|
|
640
|
-
const id =
|
|
640
|
+
const id = AST6.getFunctionIdentifier(node);
|
|
641
641
|
return id?.name != null && isReactHookName(id.name);
|
|
642
642
|
}
|
|
643
643
|
function isReactHookCall(node) {
|
|
@@ -735,12 +735,23 @@ var isUseStateCall = flip(isReactHookCallWithName)("useState");
|
|
|
735
735
|
var isUseSyncExternalStoreCall = flip(isReactHookCallWithName)("useSyncExternalStore");
|
|
736
736
|
var isUseTransitionCall = flip(isReactHookCallWithName)("useTransition");
|
|
737
737
|
|
|
738
|
-
// src/hook/
|
|
738
|
+
// src/hook/hierarchy.ts
|
|
739
|
+
function isFunctionOfUseEffectSetup(node) {
|
|
740
|
+
if (node == null) return false;
|
|
741
|
+
return node.parent?.type === AST_NODE_TYPES.CallExpression && node.parent.callee !== node && node.parent.callee.type === AST_NODE_TYPES.Identifier && node.parent.arguments.at(0) === node && isUseEffectCallLoose(node.parent);
|
|
742
|
+
}
|
|
743
|
+
function isFunctionOfUseEffectCleanup(node) {
|
|
744
|
+
if (node == null) return false;
|
|
745
|
+
const returnStatement = AST6.findParentNode(node, AST6.is(AST_NODE_TYPES.ReturnStatement));
|
|
746
|
+
const enclosingFunction = AST6.findParentNode(node, AST6.isFunction);
|
|
747
|
+
const functionOfReturnStatement = AST6.findParentNode(returnStatement, AST6.isFunction);
|
|
748
|
+
return enclosingFunction === functionOfReturnStatement && isFunctionOfUseEffectSetup(enclosingFunction);
|
|
749
|
+
}
|
|
739
750
|
function useHookCollector() {
|
|
740
751
|
const hooks = /* @__PURE__ */ new Map();
|
|
741
752
|
const functionEntries = [];
|
|
742
753
|
const onFunctionEnter = (node) => {
|
|
743
|
-
const id =
|
|
754
|
+
const id = AST6.getFunctionIdentifier(node);
|
|
744
755
|
const key = getId();
|
|
745
756
|
const name = id?.name;
|
|
746
757
|
if (name != null && isReactHookName(name)) {
|
|
@@ -819,6 +830,57 @@ var ComponentDetectionHint = {
|
|
|
819
830
|
SkipClassProperty: 1n << 69n
|
|
820
831
|
};
|
|
821
832
|
var DEFAULT_COMPONENT_DETECTION_HINT = 0n | ComponentDetectionHint.SkipBooleanLiteral | ComponentDetectionHint.SkipEmptyArray | ComponentDetectionHint.SkipArrayMapArgument | ComponentDetectionHint.SkipNumberLiteral | ComponentDetectionHint.SkipStringLiteral | ComponentDetectionHint.SkipUndefined | ComponentDetectionHint.StrictArray | ComponentDetectionHint.StrictConditional | ComponentDetectionHint.StrictLogical;
|
|
833
|
+
function isComponentDidCatch(node) {
|
|
834
|
+
return AST6.isMethodOrProperty(node) && !node.static && node.key.type === AST_NODE_TYPES.Identifier && node.key.name === "componentDidCatch";
|
|
835
|
+
}
|
|
836
|
+
function isComponentDidMount(node) {
|
|
837
|
+
return AST6.isMethodOrProperty(node) && !node.static && node.key.type === AST_NODE_TYPES.Identifier && node.key.name === "componentDidMount";
|
|
838
|
+
}
|
|
839
|
+
function isComponentDidUpdate(node) {
|
|
840
|
+
return AST6.isMethodOrProperty(node) && !node.static && node.key.type === AST_NODE_TYPES.Identifier && node.key.name === "componentDidUpdate";
|
|
841
|
+
}
|
|
842
|
+
function isComponentWillMount(node) {
|
|
843
|
+
return AST6.isMethodOrProperty(node) && !node.static && node.key.type === AST_NODE_TYPES.Identifier && node.key.name === "componentWillMount";
|
|
844
|
+
}
|
|
845
|
+
function isComponentWillReceiveProps(node) {
|
|
846
|
+
return AST6.isMethodOrProperty(node) && !node.static && node.key.type === AST_NODE_TYPES.Identifier && node.key.name === "componentWillReceiveProps";
|
|
847
|
+
}
|
|
848
|
+
function isComponentWillUnmount(node) {
|
|
849
|
+
return AST6.isMethodOrProperty(node) && !node.static && node.key.type === AST_NODE_TYPES.Identifier && node.key.name === "componentWillUnmount";
|
|
850
|
+
}
|
|
851
|
+
function isComponentWillUpdate(node) {
|
|
852
|
+
return AST6.isMethodOrProperty(node) && !node.static && node.key.type === AST_NODE_TYPES.Identifier && node.key.name === "componentWillUpdate";
|
|
853
|
+
}
|
|
854
|
+
function isGetChildContext(node) {
|
|
855
|
+
return AST6.isMethodOrProperty(node) && !node.static && node.key.type === AST_NODE_TYPES.Identifier && node.key.name === "getChildContext";
|
|
856
|
+
}
|
|
857
|
+
function isGetDefaultProps(node) {
|
|
858
|
+
return AST6.isMethodOrProperty(node) && node.static && node.key.type === AST_NODE_TYPES.Identifier && node.key.name === "getDefaultProps";
|
|
859
|
+
}
|
|
860
|
+
function isGetInitialState(node) {
|
|
861
|
+
return AST6.isMethodOrProperty(node) && !node.static && node.key.type === AST_NODE_TYPES.Identifier && node.key.name === "getInitialState";
|
|
862
|
+
}
|
|
863
|
+
function isGetSnapshotBeforeUpdate(node) {
|
|
864
|
+
return AST6.isMethodOrProperty(node) && !node.static && node.key.type === AST_NODE_TYPES.Identifier && node.key.name === "getSnapshotBeforeUpdate";
|
|
865
|
+
}
|
|
866
|
+
function isShouldComponentUpdate(node) {
|
|
867
|
+
return AST6.isMethodOrProperty(node) && !node.static && node.key.type === AST_NODE_TYPES.Identifier && node.key.name === "shouldComponentUpdate";
|
|
868
|
+
}
|
|
869
|
+
function isUnsafeComponentWillMount(node) {
|
|
870
|
+
return AST6.isMethodOrProperty(node) && !node.static && node.key.type === AST_NODE_TYPES.Identifier && node.key.name === "UNSAFE_componentWillMount";
|
|
871
|
+
}
|
|
872
|
+
function isUnsafeComponentWillReceiveProps(node) {
|
|
873
|
+
return AST6.isMethodOrProperty(node) && !node.static && node.key.type === AST_NODE_TYPES.Identifier && node.key.name === "UNSAFE_componentWillReceiveProps";
|
|
874
|
+
}
|
|
875
|
+
function isUnsafeComponentWillUpdate(node) {
|
|
876
|
+
return AST6.isMethodOrProperty(node) && !node.static && node.key.type === AST_NODE_TYPES.Identifier && node.key.name === "UNSAFE_componentWillUpdate";
|
|
877
|
+
}
|
|
878
|
+
function isGetDerivedStateFromProps(node) {
|
|
879
|
+
return AST6.isMethodOrProperty(node) && node.static && node.key.type === AST_NODE_TYPES.Identifier && node.key.name === "getDerivedStateFromProps";
|
|
880
|
+
}
|
|
881
|
+
function isGetDerivedStateFromError(node) {
|
|
882
|
+
return AST6.isMethodOrProperty(node) && node.static && node.key.type === AST_NODE_TYPES.Identifier && node.key.name === "getDerivedStateFromError";
|
|
883
|
+
}
|
|
822
884
|
function isClassComponent(node) {
|
|
823
885
|
if ("superClass" in node && node.superClass != null) {
|
|
824
886
|
const re = /^(?:Pure)?Component$/u;
|
|
@@ -844,30 +906,35 @@ function isPureComponent(node) {
|
|
|
844
906
|
return false;
|
|
845
907
|
}
|
|
846
908
|
|
|
847
|
-
// src/component/component-
|
|
848
|
-
function
|
|
849
|
-
return
|
|
909
|
+
// src/component/component-render.ts
|
|
910
|
+
function isRenderLike(node) {
|
|
911
|
+
return AST6.isMethodOrProperty(node) && node.key.type === AST_NODE_TYPES.Identifier && node.key.name === "render" && node.parent.parent.type === AST_NODE_TYPES.ClassDeclaration;
|
|
850
912
|
}
|
|
851
|
-
function
|
|
852
|
-
|
|
913
|
+
function isFunctionOfRender(node) {
|
|
914
|
+
if (!isRenderLike(node.parent)) {
|
|
915
|
+
return false;
|
|
916
|
+
}
|
|
917
|
+
return isClassComponent(node.parent.parent.parent);
|
|
853
918
|
}
|
|
854
|
-
function
|
|
855
|
-
return
|
|
919
|
+
function isRenderMethodLike(node) {
|
|
920
|
+
return AST6.isMethodOrProperty(node) && node.key.type === AST_NODE_TYPES.Identifier && node.key.name.startsWith("render") && node.parent.parent.type === AST_NODE_TYPES.ClassDeclaration;
|
|
856
921
|
}
|
|
857
|
-
|
|
858
|
-
|
|
922
|
+
|
|
923
|
+
// src/component/hierarchy.ts
|
|
924
|
+
function isChildrenOfCreateElement(context, node) {
|
|
925
|
+
const parent = node.parent;
|
|
926
|
+
if (parent == null || parent.type !== AST_NODE_TYPES.CallExpression) return false;
|
|
927
|
+
if (!isCreateElementCall(context, parent)) return false;
|
|
928
|
+
return parent.arguments.slice(2).some((arg) => arg === node);
|
|
859
929
|
}
|
|
860
|
-
function
|
|
861
|
-
return
|
|
930
|
+
function isInsideRenderMethod(node) {
|
|
931
|
+
return AST6.findParentNode(node, (n) => isRenderLike(n) && isClassComponent(n.parent.parent)) != null;
|
|
862
932
|
}
|
|
863
933
|
function isFunctionOfComponentDidMount(node) {
|
|
864
|
-
return
|
|
934
|
+
return AST6.isFunction(node) && isComponentDidMount(node.parent) && node.parent.value === node;
|
|
865
935
|
}
|
|
866
936
|
function isFunctionOfComponentWillUnmount(node) {
|
|
867
|
-
return
|
|
868
|
-
}
|
|
869
|
-
function isRenderMethodLike(node) {
|
|
870
|
-
return AST5.isMethodOrProperty(node) && node.key.type === AST_NODE_TYPES.Identifier && node.key.name === "render" && node.parent.parent.type === AST_NODE_TYPES.ClassDeclaration;
|
|
937
|
+
return AST6.isFunction(node) && isComponentWillUnmount(node.parent) && node.parent.value === node;
|
|
871
938
|
}
|
|
872
939
|
function isFunctionOfRenderMethod(node) {
|
|
873
940
|
if (!isRenderMethodLike(node.parent)) {
|
|
@@ -875,15 +942,6 @@ function isFunctionOfRenderMethod(node) {
|
|
|
875
942
|
}
|
|
876
943
|
return isClassComponent(node.parent.parent.parent);
|
|
877
944
|
}
|
|
878
|
-
function isChildrenOfCreateElement(context, node) {
|
|
879
|
-
const parent = node.parent;
|
|
880
|
-
if (parent == null || parent.type !== AST_NODE_TYPES.CallExpression) return false;
|
|
881
|
-
if (!isCreateElementCall(context, parent)) return false;
|
|
882
|
-
return parent.arguments.slice(2).some((arg) => arg === node);
|
|
883
|
-
}
|
|
884
|
-
function isInsideRenderMethod(node) {
|
|
885
|
-
return AST5.findParentNode(node, (n) => isRenderMethodLike(n) && isClassComponent(n.parent.parent)) != null;
|
|
886
|
-
}
|
|
887
945
|
|
|
888
946
|
// src/component/component-definition.ts
|
|
889
947
|
var isFunctionOfClassMethod = isMatching({
|
|
@@ -916,12 +974,12 @@ function isValidComponentDefinition(context, node, hint) {
|
|
|
916
974
|
if (hint & ComponentDetectionHint.SkipClassProperty && isFunctionOfClassProperty(node.parent)) {
|
|
917
975
|
return false;
|
|
918
976
|
}
|
|
919
|
-
if (hint & ComponentDetectionHint.SkipArrayMapArgument &&
|
|
977
|
+
if (hint & ComponentDetectionHint.SkipArrayMapArgument && AST6.isArrayMapCallLoose(node.parent)) {
|
|
920
978
|
return false;
|
|
921
979
|
}
|
|
922
|
-
const boundaryNode =
|
|
980
|
+
const boundaryNode = AST6.findParentNode(
|
|
923
981
|
node,
|
|
924
|
-
|
|
982
|
+
AST6.isOneOf([
|
|
925
983
|
AST_NODE_TYPES.JSXExpressionContainer,
|
|
926
984
|
AST_NODE_TYPES.ArrowFunctionExpression,
|
|
927
985
|
AST_NODE_TYPES.FunctionExpression,
|
|
@@ -942,7 +1000,7 @@ function isComponentWrapperCallLoose(context, node) {
|
|
|
942
1000
|
|
|
943
1001
|
// src/component/component-id.ts
|
|
944
1002
|
function getFunctionComponentId(context, node) {
|
|
945
|
-
const functionId =
|
|
1003
|
+
const functionId = AST6.getFunctionIdentifier(node);
|
|
946
1004
|
if (functionId != null) {
|
|
947
1005
|
return functionId;
|
|
948
1006
|
}
|
|
@@ -969,10 +1027,10 @@ var ComponentFlag = {
|
|
|
969
1027
|
// src/component/component-init-path.ts
|
|
970
1028
|
function getComponentFlagFromInitPath(initPath) {
|
|
971
1029
|
let flag = ComponentFlag.None;
|
|
972
|
-
if (initPath != null &&
|
|
1030
|
+
if (initPath != null && AST6.hasCallInFunctionInitPath("memo", initPath)) {
|
|
973
1031
|
flag |= ComponentFlag.Memo;
|
|
974
1032
|
}
|
|
975
|
-
if (initPath != null &&
|
|
1033
|
+
if (initPath != null && AST6.hasCallInFunctionInitPath("forwardRef", initPath)) {
|
|
976
1034
|
flag |= ComponentFlag.ForwardRef;
|
|
977
1035
|
}
|
|
978
1036
|
return flag;
|
|
@@ -1015,7 +1073,7 @@ function useComponentCollector(context, options = {}) {
|
|
|
1015
1073
|
const entry = functionEntries.at(-1);
|
|
1016
1074
|
if (entry == null) return;
|
|
1017
1075
|
if (!entry.isComponent) return functionEntries.pop();
|
|
1018
|
-
const shouldDrop =
|
|
1076
|
+
const shouldDrop = AST6.getNestedReturnStatements(entry.node.body).slice().reverse().some((r) => {
|
|
1019
1077
|
return context.sourceCode.getScope(r).block === entry.node && r.argument != null && !JSX3.isJSXLike(r.argument, jsxCtx, hint);
|
|
1020
1078
|
});
|
|
1021
1079
|
if (shouldDrop) {
|
|
@@ -1042,7 +1100,7 @@ function useComponentCollector(context, options = {}) {
|
|
|
1042
1100
|
const { body } = entry.node;
|
|
1043
1101
|
const isComponent = hasNoneOrLooseComponentName(context, entry.node) && JSX3.isJSXLike(body, jsxCtx, hint) && isValidComponentDefinition(context, entry.node, hint);
|
|
1044
1102
|
if (!isComponent) return;
|
|
1045
|
-
const initPath =
|
|
1103
|
+
const initPath = AST6.getFunctionInitPath(entry.node);
|
|
1046
1104
|
const id = getFunctionComponentId(context, entry.node);
|
|
1047
1105
|
const name = getComponentNameFromId(id);
|
|
1048
1106
|
const key = getId();
|
|
@@ -1083,7 +1141,7 @@ function useComponentCollector(context, options = {}) {
|
|
|
1083
1141
|
const isComponent = hasNoneOrLooseComponentName(context, entry.node) && JSX3.isJSXLike(node.argument, jsxCtx, hint) && isValidComponentDefinition(context, entry.node, hint);
|
|
1084
1142
|
if (!isComponent) return;
|
|
1085
1143
|
entry.isComponent = true;
|
|
1086
|
-
const initPath =
|
|
1144
|
+
const initPath = AST6.getFunctionInitPath(entry.node);
|
|
1087
1145
|
const id = getFunctionComponentId(context, entry.node);
|
|
1088
1146
|
const name = getComponentNameFromId(id);
|
|
1089
1147
|
components.set(entry.key, {
|
|
@@ -1114,7 +1172,7 @@ function useComponentCollectorLegacy() {
|
|
|
1114
1172
|
if (!isClassComponent(node)) {
|
|
1115
1173
|
return;
|
|
1116
1174
|
}
|
|
1117
|
-
const id =
|
|
1175
|
+
const id = AST6.getClassIdentifier(node);
|
|
1118
1176
|
const key = getId();
|
|
1119
1177
|
const flag = isPureComponent(node) ? ComponentFlag.PureComponent : ComponentFlag.None;
|
|
1120
1178
|
components.set(
|
|
@@ -1147,7 +1205,7 @@ var ComponentPhaseRelevance = birecord({
|
|
|
1147
1205
|
var isInversePhase = dual(2, (a, b) => ComponentPhaseRelevance.get(a) === b);
|
|
1148
1206
|
function isRenderFunctionLoose(context, node) {
|
|
1149
1207
|
const { body, parent } = node;
|
|
1150
|
-
if (
|
|
1208
|
+
if (AST6.getFunctionIdentifier(node)?.name.startsWith("render")) {
|
|
1151
1209
|
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
1210
|
}
|
|
1153
1211
|
return JSX3.isJSXLike(
|
|
@@ -1162,7 +1220,7 @@ function isRenderPropLoose(context, node) {
|
|
|
1162
1220
|
if (node.name.type !== AST_NODE_TYPES.JSXIdentifier) {
|
|
1163
1221
|
return false;
|
|
1164
1222
|
}
|
|
1165
|
-
return node.name.name.startsWith("render") && node.value?.type === AST_NODE_TYPES.JSXExpressionContainer &&
|
|
1223
|
+
return node.name.name.startsWith("render") && node.value?.type === AST_NODE_TYPES.JSXExpressionContainer && AST6.isFunction(node.value.expression) && isRenderFunctionLoose(context, node.value.expression);
|
|
1166
1224
|
}
|
|
1167
1225
|
function isDirectValueOfRenderPropertyLoose(node) {
|
|
1168
1226
|
const matching = (node2) => {
|
|
@@ -1174,7 +1232,7 @@ function isDeclaredInRenderPropLoose(node) {
|
|
|
1174
1232
|
if (isDirectValueOfRenderPropertyLoose(node)) {
|
|
1175
1233
|
return true;
|
|
1176
1234
|
}
|
|
1177
|
-
const parent =
|
|
1235
|
+
const parent = AST6.findParentNode(node, AST6.is(AST_NODE_TYPES.JSXExpressionContainer))?.parent;
|
|
1178
1236
|
if (parent?.type !== AST_NODE_TYPES.JSXAttribute) {
|
|
1179
1237
|
return false;
|
|
1180
1238
|
}
|
|
@@ -1182,22 +1240,11 @@ function isDeclaredInRenderPropLoose(node) {
|
|
|
1182
1240
|
}
|
|
1183
1241
|
function isThisSetState(node) {
|
|
1184
1242
|
const { callee } = node;
|
|
1185
|
-
return callee.type === AST_NODE_TYPES.MemberExpression &&
|
|
1243
|
+
return callee.type === AST_NODE_TYPES.MemberExpression && AST6.isThisExpression(callee.object) && callee.property.type === AST_NODE_TYPES.Identifier && callee.property.name === "setState";
|
|
1186
1244
|
}
|
|
1187
1245
|
function isAssignmentToThisState(node) {
|
|
1188
1246
|
const { left } = node;
|
|
1189
|
-
return left.type === AST_NODE_TYPES.MemberExpression &&
|
|
1190
|
-
}
|
|
1191
|
-
function isFunctionOfUseEffectSetup(node) {
|
|
1192
|
-
if (node == null) return false;
|
|
1193
|
-
return node.parent?.type === AST_NODE_TYPES.CallExpression && node.parent.callee !== node && node.parent.callee.type === AST_NODE_TYPES.Identifier && node.parent.arguments.at(0) === node && isUseEffectCallLoose(node.parent);
|
|
1194
|
-
}
|
|
1195
|
-
function isFunctionOfUseEffectCleanup(node) {
|
|
1196
|
-
if (node == null) return false;
|
|
1197
|
-
const returnStatement = AST5.findParentNode(node, AST5.is(AST_NODE_TYPES.ReturnStatement));
|
|
1198
|
-
const enclosingFunction = AST5.findParentNode(node, AST5.isFunction);
|
|
1199
|
-
const functionOfReturnStatement = AST5.findParentNode(returnStatement, AST5.isFunction);
|
|
1200
|
-
return enclosingFunction === functionOfReturnStatement && isFunctionOfUseEffectSetup(enclosingFunction);
|
|
1247
|
+
return left.type === AST_NODE_TYPES.MemberExpression && AST6.isThisExpression(left.object) && AST6.getPropertyName(left.property) === "state";
|
|
1201
1248
|
}
|
|
1202
1249
|
|
|
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 };
|
|
1250
|
+
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, isComponentDidUpdate, isComponentName, isComponentNameLoose, isComponentWillMount, isComponentWillReceiveProps, isComponentWillUnmount, isComponentWillUpdate, isComponentWrapperCall, isComponentWrapperCallLoose, isCreateContext, isCreateContextCall, isCreateElement, isCreateElementCall, isCreateRef, isCreateRefCall, isDeclaredInRenderPropLoose, isDirectValueOfRenderPropertyLoose, isForwardRef, isForwardRefCall, isFromReact, isFromReactLoose, isFromReactObject, isFromReactStrict, isFunctionOfComponentDidMount, isFunctionOfComponentWillUnmount, isFunctionOfRender, isFunctionOfRenderMethod, isFunctionOfUseEffectCleanup, isFunctionOfUseEffectSetup, isGetChildContext, isGetDefaultProps, isGetDerivedStateFromError, isGetDerivedStateFromProps, isGetInitialState, isGetSnapshotBeforeUpdate, isInitializedFromReact, isInsideRenderMethod, isInstanceIdEqual, isInversePhase, isMemo, isMemoCall, isPureComponent, isReactAPI, isReactAPICall, isReactHook, isReactHookCall, isReactHookCallWithName, isReactHookCallWithNameAlias, isReactHookCallWithNameLoose, isReactHookName, isReactHookNameLoose, isRenderFunctionLoose, isRenderLike, isRenderMethodLike, isRenderPropLoose, isShouldComponentUpdate, isThisSetState, isUnsafeComponentWillMount, isUnsafeComponentWillReceiveProps, isUnsafeComponentWillUpdate, 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
|
+
"version": "1.40.4-beta.0",
|
|
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.
|
|
45
|
-
"@eslint-react/eff": "1.40.
|
|
46
|
-
"@eslint-react/jsx": "1.40.
|
|
47
|
-
"@eslint-react/kit": "1.40.
|
|
48
|
-
"@eslint-react/shared": "1.40.
|
|
49
|
-
"@eslint-react/var": "1.40.
|
|
44
|
+
"@eslint-react/ast": "1.40.4-beta.0",
|
|
45
|
+
"@eslint-react/eff": "1.40.4-beta.0",
|
|
46
|
+
"@eslint-react/jsx": "1.40.4-beta.0",
|
|
47
|
+
"@eslint-react/kit": "1.40.4-beta.0",
|
|
48
|
+
"@eslint-react/shared": "1.40.4-beta.0",
|
|
49
|
+
"@eslint-react/var": "1.40.4-beta.0"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
52
|
"tsup": "^8.4.0",
|