@codeque/core
Version:
Multiline code search for every language. Structural code search for JavaScript, TypeScript, HTML and CSS
71 lines (65 loc) • 2.55 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.createMatchOptionalFlagInMemberExpressionNodesComparator = void 0;
/**
*
* This is probably ipml only for babel, other estree parsers will have common impl
* - Move this to babel dir
* - change this impl to be compliant with estree (check other estree ASTs)
* - do it at the end, as nested nodes matching is tricky and risky
*/
/*
* Support for matching optional flag in MemberExpressions
* Q: path?.to?.obj, C: path.to.obj
* Q: path.to.obj, C: path?.to?.obj
*/
const createMatchOptionalFlagInMemberExpressionNodesComparator = () => ({
queryNode,
fileNode,
searchSettings,
matchContext
}, compareNodes, {
fileKeysToTraverseForOtherMatches,
queryKeysMapper,
fileKeysMapper
}) => {
const isExact = searchSettings.mode === 'exact';
if (queryNode && fileNode && !isExact) {
const memberExpressionsNodeTypes = ['MemberExpression', 'OptionalMemberExpression' // babel only, keep here for now
];
if (memberExpressionsNodeTypes.includes(queryNode.type) && memberExpressionsNodeTypes.includes(fileNode.type) && queryNode.computed === fileNode.computed // this could be also supported in more flexible way
) {
/**
We skip comparing 'optional' property on the nodes, to match them interchangeably
*/
const keysToTraverseForValidatingMatch = ['object', 'property'];
return {
levelMatch: true,
queryKeysToTraverseForValidatingMatch: keysToTraverseForValidatingMatch.map(queryKeysMapper),
fileKeysToTraverseForValidatingMatch: keysToTraverseForValidatingMatch.map(fileKeysMapper),
fileKeysToTraverseForOtherMatches
};
} else if (memberExpressionsNodeTypes.includes(queryNode.type) && fileNode.type === 'ChainExpression') {
return compareNodes({
fileNode: fileNode.expression,
queryNode,
searchSettings,
queryKeysPrefix: queryKeysMapper(''),
fileKeysPrefix: fileKeysMapper('expression'),
matchContext
});
} else if (queryNode.type === 'ChainExpression' && memberExpressionsNodeTypes.includes(fileNode.type)) {
return compareNodes({
fileNode,
queryNode: queryNode.expression,
searchSettings,
queryKeysPrefix: queryKeysMapper('expression'),
fileKeysPrefix: fileKeysMapper(''),
matchContext
});
}
}
};
exports.createMatchOptionalFlagInMemberExpressionNodesComparator = createMatchOptionalFlagInMemberExpressionNodesComparator;