@eslint-react/core
Advanced tools
Comparing version 1.28.1-beta.0 to 1.28.1-beta.1
'use strict'; | ||
var AST8 = require('@eslint-react/ast'); | ||
var AST7 = require('@eslint-react/ast'); | ||
var eff = require('@eslint-react/eff'); | ||
@@ -32,3 +32,3 @@ var JSX3 = require('@eslint-react/jsx'); | ||
var AST8__namespace = /*#__PURE__*/_interopNamespace(AST8); | ||
var AST7__namespace = /*#__PURE__*/_interopNamespace(AST7); | ||
var JSX3__namespace = /*#__PURE__*/_interopNamespace(JSX3); | ||
@@ -512,2 +512,13 @@ var VAR__namespace = /*#__PURE__*/_interopNamespace(VAR); | ||
importSource: "react"}; | ||
var DISPLAY_NAME_ASSIGNMENT_SELECTOR = [ | ||
"AssignmentExpression", | ||
"[type]", | ||
"[operator='=']", | ||
"[left.type='MemberExpression']", | ||
"[left.property.name='displayName']" | ||
].join(""); | ||
function isDisplayNameAssignment(node) { | ||
if (node == null) return false; | ||
return node.type === types.AST_NODE_TYPES.AssignmentExpression && node.operator === "=" && node.left.type === types.AST_NODE_TYPES.MemberExpression && node.left.property.type === types.AST_NODE_TYPES.Identifier && node.left.property.name === "displayName"; | ||
} | ||
function getRequireExpressionArguments(node) { | ||
@@ -531,3 +542,3 @@ return tsPattern.match(node).with({ type: types.AST_NODE_TYPES.CallExpression, arguments: tsPattern.P.select(), callee: { type: types.AST_NODE_TYPES.Identifier, name: "require" } }, eff.identity).with({ type: types.AST_NODE_TYPES.MemberExpression, object: tsPattern.P.select() }, getRequireExpressionArguments).otherwise(() => eff._); | ||
const arg0 = args?.[0]; | ||
if (arg0 == null || !AST8__namespace.isKindOfLiteral(arg0, "string")) { | ||
if (arg0 == null || !AST7__namespace.isKindOfLiteral(arg0, "string")) { | ||
return false; | ||
@@ -563,78 +574,65 @@ } | ||
function isFromReact(name) { | ||
return (context, node) => { | ||
return eff.dual(2, (context, node) => { | ||
if (node == null) return false; | ||
const { importSource = defaultImportSource, skipImportCheck = true } = shared.unsafeDecodeSettings(context.settings); | ||
if (skipImportCheck) return isFromReactLoose(node, name); | ||
return isFromReactStrict(node, name, importSource, context.sourceCode.getScope(node)); | ||
}; | ||
}); | ||
} | ||
function isFromReactMember(memberName, name) { | ||
return (context, node) => { | ||
function isFromReactObject(objectName, propertyName) { | ||
return eff.dual(2, (context, node) => { | ||
if (node?.type !== types.AST_NODE_TYPES.MemberExpression) return false; | ||
const { importSource = defaultImportSource, skipImportCheck = true } = shared.unsafeDecodeSettings(context.settings); | ||
const { object: object2, property } = node; | ||
if (skipImportCheck) return isFromReactLoose(object2, memberName) && isFromReactLoose(property, name); | ||
if (skipImportCheck) return isFromReactLoose(object2, objectName) && isFromReactLoose(property, propertyName); | ||
return isFromReactStrict( | ||
object2, | ||
memberName, | ||
objectName, | ||
importSource, | ||
context.sourceCode.getScope(object2) | ||
) && isFromReactStrict(property, name, importSource, context.sourceCode.getScope(property)); | ||
}; | ||
) && isFromReactLoose(property, propertyName); | ||
}); | ||
} | ||
// src/utils/is-call-from-react.ts | ||
function isCallFromReact(name) { | ||
return eff.dual(2, (context, node) => { | ||
if (node.type !== types.AST_NODE_TYPES.CallExpression) return false; | ||
if (!AST8__namespace.isOneOf([types.AST_NODE_TYPES.Identifier, types.AST_NODE_TYPES.MemberExpression])(node.callee)) return false; | ||
return isFromReact(name)(context, node.callee); | ||
}); | ||
} | ||
function isCallFromReactMember(pragmaMemberName, name) { | ||
function isCallFromReactObject(objectName, propertyName) { | ||
return eff.dual(2, (context, node) => { | ||
if (node.type !== types.AST_NODE_TYPES.CallExpression) return false; | ||
if (!AST8__namespace.is(types.AST_NODE_TYPES.MemberExpression)(node.callee)) return false; | ||
return isFromReactMember(pragmaMemberName, name)(context, node.callee); | ||
return isFromReactObject(objectName, propertyName)(context, node.callee); | ||
}); | ||
} | ||
var DISPLAY_NAME_ASSIGNMENT_SELECTOR = [ | ||
"AssignmentExpression", | ||
"[type]", | ||
"[operator='=']", | ||
"[left.type='MemberExpression']", | ||
"[left.property.name='displayName']" | ||
].join(""); | ||
function isDisplayNameAssignment(node) { | ||
if (node == null) return false; | ||
return node.type === types.AST_NODE_TYPES.AssignmentExpression && node.operator === "=" && node.left.type === types.AST_NODE_TYPES.MemberExpression && node.left.property.type === types.AST_NODE_TYPES.Identifier && node.left.property.name === "displayName"; | ||
} | ||
// src/utils/is-react-api.ts | ||
function isReactAPIWithName(name, member) { | ||
return member != null ? isFromReactMember(name, member) : isFromReact(name); | ||
function isReactAPI(arg0, arg1) { | ||
return arg1 == null ? isFromReact(arg0) : isFromReactObject(arg0, arg1); | ||
} | ||
function isReactAPICallWithName(name, member) { | ||
return member != null ? isCallFromReactMember(name, member) : isCallFromReact(name); | ||
function isReactAPICall(arg0, arg1) { | ||
return arg1 == null ? isCallFromReact(arg0) : isCallFromReactObject(arg0, arg1); | ||
} | ||
var isChildrenCount = isReactAPIWithName("Children", "count"); | ||
var isChildrenForEach = isReactAPIWithName("Children", "forEach"); | ||
var isChildrenMap = isReactAPIWithName("Children", "map"); | ||
var isChildrenOnly = isReactAPIWithName("Children", "only"); | ||
var isChildrenToArray = isReactAPIWithName("Children", "toArray"); | ||
var isCloneElement = isReactAPIWithName("cloneElement"); | ||
var isCreateContext = isReactAPIWithName("createContext"); | ||
var isCreateElement = isReactAPIWithName("createElement"); | ||
var isCreateRef = isReactAPIWithName("createRef"); | ||
var isForwardRef = isReactAPIWithName("forwardRef"); | ||
var isMemo = isReactAPIWithName("memo"); | ||
var isChildrenCountCall = isReactAPICallWithName("Children", "count"); | ||
var isChildrenForEachCall = isReactAPICallWithName("Children", "forEach"); | ||
var isChildrenMapCall = isReactAPICallWithName("Children", "map"); | ||
var isChildrenOnlyCall = isReactAPICallWithName("Children", "only"); | ||
var isChildrenToArrayCall = isReactAPICallWithName("Children", "toArray"); | ||
var isCloneElementCall = isReactAPICallWithName("cloneElement"); | ||
var isCreateContextCall = isReactAPICallWithName("createContext"); | ||
var isCreateElementCall = isReactAPICallWithName("createElement"); | ||
var isCreateRefCall = isReactAPICallWithName("createRef"); | ||
var isForwardRefCall = isReactAPICallWithName("forwardRef"); | ||
var isMemoCall = isReactAPICallWithName("memo"); | ||
var isChildrenCount = isReactAPI("Children", "count"); | ||
var isChildrenForEach = isReactAPI("Children", "forEach"); | ||
var isChildrenMap = isReactAPI("Children", "map"); | ||
var isChildrenOnly = isReactAPI("Children", "only"); | ||
var isChildrenToArray = isReactAPI("Children", "toArray"); | ||
var isCloneElement = isReactAPI("cloneElement"); | ||
var isCreateContext = isReactAPI("createContext"); | ||
var isCreateElement = isReactAPI("createElement"); | ||
var isCreateRef = isReactAPI("createRef"); | ||
var isForwardRef = isReactAPI("forwardRef"); | ||
var isMemo = isReactAPI("memo"); | ||
var isChildrenCountCall = isReactAPICall("Children", "count"); | ||
var isChildrenForEachCall = isReactAPICall("Children", "forEach"); | ||
var isChildrenMapCall = isReactAPICall("Children", "map"); | ||
var isChildrenOnlyCall = isReactAPICall("Children", "only"); | ||
var isChildrenToArrayCall = isReactAPICall("Children", "toArray"); | ||
var isCloneElementCall = isReactAPICall("cloneElement"); | ||
var isCreateContextCall = isReactAPICall("createContext"); | ||
var isCreateElementCall = isReactAPICall("createElement"); | ||
var isCreateRefCall = isReactAPICall("createRef"); | ||
var isForwardRefCall = isReactAPICall("forwardRef"); | ||
var isMemoCall = isReactAPICall("memo"); | ||
@@ -650,3 +648,3 @@ // src/hook/hook-name.ts | ||
if (node == null) return eff._; | ||
const id = AST8__namespace.getFunctionIdentifier(node); | ||
const id = AST7__namespace.getFunctionIdentifier(node); | ||
return id?.name != null && isReactHookName(id.name); | ||
@@ -747,3 +745,3 @@ } | ||
function isInsideReactHook(node) { | ||
return isReactHook(AST8__namespace.findParentNode(node, AST8__namespace.isFunction)); | ||
return isReactHook(AST7__namespace.findParentNode(node, AST7__namespace.isFunction)); | ||
} | ||
@@ -754,3 +752,3 @@ function useHookCollector() { | ||
const onFunctionEnter = (node) => { | ||
const id = AST8__namespace.getFunctionIdentifier(node); | ||
const id = AST7__namespace.getFunctionIdentifier(node); | ||
const key = shared.getId(); | ||
@@ -851,3 +849,3 @@ const name = id?.name; | ||
function getFunctionComponentIdentifier(context, node) { | ||
const functionId = AST8__namespace.getFunctionIdentifier(node); | ||
const functionId = AST7__namespace.getFunctionIdentifier(node); | ||
if (functionId != null) { | ||
@@ -880,5 +878,5 @@ return functionId; | ||
function isInsideCreateElementProps(context, node) { | ||
const call = AST8__namespace.findParentNode(node, isCreateElementCall(context)); | ||
const call = AST7__namespace.findParentNode(node, isCreateElementCall(context)); | ||
if (call == null) return false; | ||
const prop = AST8__namespace.findParentNode(node, AST8__namespace.is(types.AST_NODE_TYPES.ObjectExpression)); | ||
const prop = AST7__namespace.findParentNode(node, AST7__namespace.is(types.AST_NODE_TYPES.ObjectExpression)); | ||
if (prop == null) return false; | ||
@@ -920,24 +918,24 @@ return prop === call.arguments[1]; | ||
function isComponentDidMount(node) { | ||
return AST8__namespace.isMethodOrProperty(node) && node.key.type === types.AST_NODE_TYPES.Identifier && node.key.name === "componentDidMount"; | ||
return AST7__namespace.isMethodOrProperty(node) && node.key.type === types.AST_NODE_TYPES.Identifier && node.key.name === "componentDidMount"; | ||
} | ||
function isComponentWillUnmount(node) { | ||
return AST8__namespace.isMethodOrProperty(node) && node.key.type === types.AST_NODE_TYPES.Identifier && node.key.name === "componentWillUnmount"; | ||
return AST7__namespace.isMethodOrProperty(node) && node.key.type === types.AST_NODE_TYPES.Identifier && node.key.name === "componentWillUnmount"; | ||
} | ||
function isComponentDidCatch(node) { | ||
return AST8__namespace.isMethodOrProperty(node) && !node.static && node.key.type === types.AST_NODE_TYPES.Identifier && node.key.name === "componentDidCatch"; | ||
return AST7__namespace.isMethodOrProperty(node) && !node.static && node.key.type === types.AST_NODE_TYPES.Identifier && node.key.name === "componentDidCatch"; | ||
} | ||
function isGetDerivedStateFromError(node) { | ||
return AST8__namespace.isMethodOrProperty(node) && node.static && node.key.type === types.AST_NODE_TYPES.Identifier && node.key.name === "getDerivedStateFromError"; | ||
return AST7__namespace.isMethodOrProperty(node) && node.static && node.key.type === types.AST_NODE_TYPES.Identifier && node.key.name === "getDerivedStateFromError"; | ||
} | ||
function isGetDerivedStateFromProps(node) { | ||
return AST8__namespace.isMethodOrProperty(node) && node.static && node.key.type === types.AST_NODE_TYPES.Identifier && node.key.name === "getDerivedStateFromProps"; | ||
return AST7__namespace.isMethodOrProperty(node) && node.static && node.key.type === types.AST_NODE_TYPES.Identifier && node.key.name === "getDerivedStateFromProps"; | ||
} | ||
function isFunctionOfComponentDidMount(node) { | ||
return AST8__namespace.isFunction(node) && isComponentDidMount(node.parent) && node.parent.value === node; | ||
return AST7__namespace.isFunction(node) && isComponentDidMount(node.parent) && node.parent.value === node; | ||
} | ||
function isFunctionOfComponentWillUnmount(node) { | ||
return AST8__namespace.isFunction(node) && isComponentWillUnmount(node.parent) && node.parent.value === node; | ||
return AST7__namespace.isFunction(node) && isComponentWillUnmount(node.parent) && node.parent.value === node; | ||
} | ||
function isRenderMethodLike(node) { | ||
return AST8__namespace.isMethodOrProperty(node) && node.key.type === types.AST_NODE_TYPES.Identifier && node.key.name === "render" && node.parent.parent.type === types.AST_NODE_TYPES.ClassDeclaration; | ||
return AST7__namespace.isMethodOrProperty(node) && node.key.type === types.AST_NODE_TYPES.Identifier && node.key.name === "render" && node.parent.parent.type === types.AST_NODE_TYPES.ClassDeclaration; | ||
} | ||
@@ -951,3 +949,3 @@ function isFunctionOfRenderMethod(node) { | ||
function isInsideRenderMethod(node) { | ||
return AST8__namespace.findParentNode(node, (node2) => isRenderMethodLike(node2) && isClassComponent(node2.parent.parent)) != null; | ||
return AST7__namespace.findParentNode(node, (node2) => isRenderMethodLike(node2) && isClassComponent(node2.parent.parent)) != null; | ||
} | ||
@@ -960,3 +958,3 @@ | ||
} | ||
if (hint & ERComponentHint.SkipMapCallback && AST8__namespace.isMapCallLoose(node.parent)) { | ||
if (hint & ERComponentHint.SkipMapCallback && AST7__namespace.isMapCallLoose(node.parent)) { | ||
return false; | ||
@@ -973,5 +971,5 @@ } | ||
} | ||
const boundaryNode = AST8__namespace.findParentNode( | ||
const boundaryNode = AST7__namespace.findParentNode( | ||
node, | ||
AST8__namespace.isOneOf([ | ||
AST7__namespace.isOneOf([ | ||
types.AST_NODE_TYPES.JSXExpressionContainer, | ||
@@ -1011,3 +1009,3 @@ types.AST_NODE_TYPES.ArrowFunctionExpression, | ||
if (!entry.isComponent) return functionEntries.pop(); | ||
const shouldDrop = AST8__namespace.getNestedReturnStatements(entry.node.body).slice().reverse().some((r) => { | ||
const shouldDrop = AST7__namespace.getNestedReturnStatements(entry.node.body).slice().reverse().some((r) => { | ||
return context.sourceCode.getScope(r).block === entry.node && r.argument != null && !JSX3__namespace.isJSXValue(r.argument, jsxCtx, hint); | ||
@@ -1039,3 +1037,3 @@ }); | ||
if (!isComponent) return; | ||
const initPath = AST8__namespace.getFunctionInitPath(entry.node); | ||
const initPath = AST7__namespace.getFunctionInitPath(entry.node); | ||
const id = getFunctionComponentIdentifier(context, entry.node); | ||
@@ -1081,3 +1079,3 @@ const name = getComponentNameFromIdentifier(id); | ||
entry.isComponent = true; | ||
const initPath = AST8__namespace.getFunctionInitPath(entry.node); | ||
const initPath = AST7__namespace.getFunctionInitPath(entry.node); | ||
const id = getFunctionComponentIdentifier(context, entry.node); | ||
@@ -1103,6 +1101,6 @@ const name = getComponentNameFromIdentifier(id); | ||
let flag = ERComponentFlag.None; | ||
if (initPath != null && AST8__namespace.hasCallInFunctionInitPath("memo", initPath)) { | ||
if (initPath != null && AST7__namespace.hasCallInFunctionInitPath("memo", initPath)) { | ||
flag |= ERComponentFlag.Memo; | ||
} | ||
if (initPath != null && AST8__namespace.hasCallInFunctionInitPath("forwardRef", initPath)) { | ||
if (initPath != null && AST7__namespace.hasCallInFunctionInitPath("forwardRef", initPath)) { | ||
flag |= ERComponentFlag.ForwardRef; | ||
@@ -1124,3 +1122,3 @@ } | ||
} | ||
const id = AST8__namespace.getClassIdentifier(node); | ||
const id = AST7__namespace.getClassIdentifier(node); | ||
const key = shared.getId(); | ||
@@ -1158,3 +1156,3 @@ const flag = isPureComponent(node) ? ERComponentFlag.PureComponent : ERComponentFlag.None; | ||
const { body, parent } = node; | ||
if (AST8__namespace.getFunctionIdentifier(node)?.name.startsWith("render")) { | ||
if (AST7__namespace.getFunctionIdentifier(node)?.name.startsWith("render")) { | ||
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"); | ||
@@ -1174,3 +1172,3 @@ } | ||
} | ||
return node.name.name.startsWith("render") && node.value?.type === types.AST_NODE_TYPES.JSXExpressionContainer && AST8__namespace.isFunction(node.value.expression) && isRenderFunctionLoose(context, node.value.expression); | ||
return node.name.name.startsWith("render") && node.value?.type === types.AST_NODE_TYPES.JSXExpressionContainer && AST7__namespace.isFunction(node.value.expression) && isRenderFunctionLoose(context, node.value.expression); | ||
} | ||
@@ -1187,3 +1185,3 @@ function isDirectValueOfRenderPropertyLoose(node) { | ||
} | ||
const parent = AST8__namespace.findParentNode(node, AST8__namespace.is(types.AST_NODE_TYPES.JSXExpressionContainer))?.parent; | ||
const parent = AST7__namespace.findParentNode(node, AST7__namespace.is(types.AST_NODE_TYPES.JSXExpressionContainer))?.parent; | ||
if (parent?.type !== types.AST_NODE_TYPES.JSXAttribute) { | ||
@@ -1196,3 +1194,3 @@ return false; | ||
const { callee } = node; | ||
return callee.type === types.AST_NODE_TYPES.MemberExpression && AST8__namespace.isThisExpression(callee.object) && callee.property.type === types.AST_NODE_TYPES.Identifier && callee.property.name === "setState"; | ||
return callee.type === types.AST_NODE_TYPES.MemberExpression && AST7__namespace.isThisExpression(callee.object) && callee.property.type === types.AST_NODE_TYPES.Identifier && callee.property.name === "setState"; | ||
} | ||
@@ -1204,5 +1202,5 @@ function isFunctionOfUseEffectSetup(node) { | ||
function isFunctionOfUseEffectCleanup(node) { | ||
const nearReturn = AST8__namespace.findParentNode(node, AST8__namespace.is(types.AST_NODE_TYPES.ReturnStatement)); | ||
const nearFunction = AST8__namespace.findParentNode(node, AST8__namespace.isFunction); | ||
const nearFunctionOfReturn = AST8__namespace.findParentNode(nearReturn, AST8__namespace.isFunction); | ||
const nearReturn = AST7__namespace.findParentNode(node, AST7__namespace.is(types.AST_NODE_TYPES.ReturnStatement)); | ||
const nearFunction = AST7__namespace.findParentNode(node, AST7__namespace.isFunction); | ||
const nearFunctionOfReturn = AST7__namespace.findParentNode(nearReturn, AST7__namespace.isFunction); | ||
return nearFunction === nearFunctionOfReturn && isFunctionOfUseEffectSetup(nearFunction); | ||
@@ -1223,3 +1221,3 @@ } | ||
exports.isCallFromReact = isCallFromReact; | ||
exports.isCallFromReactMember = isCallFromReactMember; | ||
exports.isCallFromReactObject = isCallFromReactObject; | ||
exports.isChildrenCount = isChildrenCount; | ||
@@ -1256,3 +1254,3 @@ exports.isChildrenCountCall = isChildrenCountCall; | ||
exports.isFromReactLoose = isFromReactLoose; | ||
exports.isFromReactMember = isFromReactMember; | ||
exports.isFromReactObject = isFromReactObject; | ||
exports.isFromReactStrict = isFromReactStrict; | ||
@@ -1274,4 +1272,4 @@ exports.isFunctionOfComponentDidMount = isFunctionOfComponentDidMount; | ||
exports.isPureComponent = isPureComponent; | ||
exports.isReactAPICallWithName = isReactAPICallWithName; | ||
exports.isReactAPIWithName = isReactAPIWithName; | ||
exports.isReactAPI = isReactAPI; | ||
exports.isReactAPICall = isReactAPICall; | ||
exports.isReactHook = isReactHook; | ||
@@ -1278,0 +1276,0 @@ exports.isReactHookCall = isReactHookCall; |
{ | ||
"name": "@eslint-react/core", | ||
"version": "1.28.1-beta.0", | ||
"version": "1.28.1-beta.1", | ||
"description": "ESLint React's ESLint utility module for static analysis of React core APIs and Patterns.", | ||
@@ -44,7 +44,7 @@ "homepage": "https://github.com/Rel1cx/eslint-react", | ||
"ts-pattern": "^5.6.2", | ||
"@eslint-react/ast": "1.28.1-beta.0", | ||
"@eslint-react/jsx": "1.28.1-beta.0", | ||
"@eslint-react/shared": "1.28.1-beta.0", | ||
"@eslint-react/eff": "1.28.1-beta.0", | ||
"@eslint-react/var": "1.28.1-beta.0" | ||
"@eslint-react/ast": "1.28.1-beta.1", | ||
"@eslint-react/eff": "1.28.1-beta.1", | ||
"@eslint-react/shared": "1.28.1-beta.1", | ||
"@eslint-react/jsx": "1.28.1-beta.1", | ||
"@eslint-react/var": "1.28.1-beta.1" | ||
}, | ||
@@ -51,0 +51,0 @@ "devDependencies": { |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
136409
2793
+ Added@eslint-react/ast@1.28.1-beta.1(transitive)
+ Added@eslint-react/eff@1.28.1-beta.1(transitive)
+ Added@eslint-react/jsx@1.28.1-beta.1(transitive)
+ Added@eslint-react/shared@1.28.1-beta.1(transitive)
+ Added@eslint-react/var@1.28.1-beta.1(transitive)
- Removed@eslint-react/ast@1.28.1-beta.0(transitive)
- Removed@eslint-react/eff@1.28.1-beta.0(transitive)
- Removed@eslint-react/jsx@1.28.1-beta.0(transitive)
- Removed@eslint-react/shared@1.28.1-beta.0(transitive)
- Removed@eslint-react/var@1.28.1-beta.0(transitive)