54 lines
1.1 KiB
JavaScript
54 lines
1.1 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
/**
|
||
|
Check if node matches object name or key path.
|
||
|
|
||
|
@param {Node} node - The AST node to check.
|
||
|
@param {string} nameOrPath - The object name or key path.
|
||
|
@returns {boolean}
|
||
|
*/
|
||
|
function isNodeMatchesNameOrPath(node, nameOrPath) {
|
||
|
const names = nameOrPath.trim().split('.');
|
||
|
for (let index = names.length - 1; index >= 0; index--) {
|
||
|
const name = names[index];
|
||
|
if (!name) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if (index === 0) {
|
||
|
return (
|
||
|
(node.type === 'Identifier' && node.name === name)
|
||
|
|| (name === 'this' && node.type === 'ThisExpression')
|
||
|
);
|
||
|
}
|
||
|
|
||
|
if (
|
||
|
node.type !== 'MemberExpression'
|
||
|
|| node.optional
|
||
|
|| node.computed
|
||
|
|| node.property.type !== 'Identifier'
|
||
|
|| node.property.name !== name
|
||
|
) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
node = node.object;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
Check if node matches any object name or key path.
|
||
|
|
||
|
@param {Node} node - The AST node to check.
|
||
|
@param {string[]} nameOrPaths - The object name or key paths.
|
||
|
@returns {boolean}
|
||
|
*/
|
||
|
function isNodeMatches(node, nameOrPaths) {
|
||
|
return nameOrPaths.some(nameOrPath => isNodeMatchesNameOrPath(node, nameOrPath));
|
||
|
}
|
||
|
|
||
|
module.exports = {
|
||
|
isNodeMatchesNameOrPath,
|
||
|
isNodeMatches,
|
||
|
};
|