UNPKG

@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
"use strict"; 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;