@codeque/core
Version:
Multiline code search for every language. Structural code search for JavaScript, TypeScript, HTML and CSS
193 lines (159 loc) • 5.21 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = exports.babelParserSettings = void 0;
var _parser = require("@babel/parser");
var _utils = require("../../utils");
var _beforeWildcardsComparators = require("./beforeWildcardsComparators");
var _afterWildcardsComparators = require("./afterWildcardsComparators");
var _JSFamilyCommon = require("../_common/JSFamilyCommon");
var _common = require("./common");
const getProgramNodeFromRootNode = fileNode => fileNode.program;
const getProgramBodyFromRootNode = fileNode => {
return getProgramNodeFromRootNode(fileNode).body;
};
const unwrapExpressionStatement = node => {
if (typeof node !== 'object') {
return node;
}
if (node.type === 'ExpressionStatement') {
return node.expression;
}
return node;
};
const createBlockStatementNode = (body, position) => ({
type: 'BlockStatement',
body,
directives: [],
// whatever it is
...position
});
const isNode = maybeNode => {
return typeof maybeNode?.type === 'string';
};
const astPropsToSkip = ['loc', 'start', 'end', 'extra', 'trailingComments', 'leadingComments', 'innerComments', 'comments', 'tail' // Support for partial matching of template literals
];
const parseCode = (code, filePath = '') => {
const maybeWrappedJSON = /\.json$/.test(filePath) ? `(${code})` : code;
try {
return (0, _parser.parse)(maybeWrappedJSON, _JSFamilyCommon.babelParseOptionsWithJSX);
} catch (e) {
return (0, _parser.parse)(maybeWrappedJSON, _JSFamilyCommon.babelParseOptionsWithoutJSX);
}
};
const sanitizeJSXTextExtraValue = ({
raw,
rawValue
}) => {
return {
raw: (0, _utils.normalizeText)(raw),
rawValue: (0, _utils.normalizeText)(rawValue)
};
};
const sanitizeTemplateElementValue = ({
raw,
cooked
}) => {
return {
raw: (0, _utils.normalizeText)(raw),
cooked: (0, _utils.normalizeText)(cooked)
};
};
const nodeValuesSanitizers = {
['JSXText']: {
value: _utils.normalizeText,
extra: sanitizeJSXTextExtraValue
},
['TemplateElement']: {
value: sanitizeTemplateElementValue
}
};
const getSanitizedNodeValue = (nodeType, valueKey, value) => {
const valueSanitizer = nodeValuesSanitizers?.[nodeType]?.[valueKey];
if (valueSanitizer) {
return valueSanitizer(value);
}
return value;
};
const shouldCompareNode = node => {
if (node.type === 'JSXText') {
const value = getSanitizedNodeValue('JSXText', 'value', node.value);
return value.length > 0;
}
return true;
};
const compareNodesBeforeWildcardsComparison = (...nodeComparatorParams) => {
return (0, _utils.runNodesComparators)(_beforeWildcardsComparators.beforeWildcardsComparators, nodeComparatorParams);
};
const compareNodesAfterWildcardsComparison = (...nodeComparatorParams) => {
return (0, _utils.runNodesComparators)(_afterWildcardsComparators.afterWildcardsComparators, nodeComparatorParams);
};
const isIdentifierNode = node => _common.identifierNodeTypes.includes((0, _common.getNodeType)(node));
const stringLikeLiteralUtils = {
isStringLikeLiteralNode: node => node.type === 'StringLiteral' || node.type === 'TemplateElement' || node.type === 'JSXText',
getStringLikeLiteralValue: node => {
if (node.type === 'TemplateElement') {
const {
raw
} = sanitizeTemplateElementValue(node.value);
return raw;
} // (node.type === 'StringLiteral' || node.type === 'JSXText'
return (0, _utils.normalizeText)(node.value);
}
};
const numericLiteralUtils = {
isNumericLiteralNode: node => node.type === 'NumericLiteral',
getNumericLiteralValue: node => node.extra.raw
};
const programNodeAndBlockNodeUtils = {
isProgramNode: node => node.type === 'Program',
isBlockNode: node => node.type === 'BlockStatement',
programNodeBodyKey: 'body',
blockNodeBodyKey: 'body'
};
const getNodePosition = node => ({
start: node.start,
end: node.end,
loc: node.loc
});
const getParseErrorLocation = e => ({
line: e.loc?.line ?? 0,
column: e.loc?.column ?? 0
});
const alternativeNodeTypes = {
Identifier: _common.identifierNodeTypes,
MemberExpression: ['OptionalMemberExpression'],
OptionalMemberExpression: ['MemberExpression'],
BlockStatement: ['Program']
};
const babelParserSettings = {
supportedExtensions: _JSFamilyCommon.supportedExtensions,
parseCode,
isNode,
isIdentifierNode,
identifierNodeTypes: _common.identifierNodeTypes,
astPropsToSkip,
getProgramBodyFromRootNode,
getProgramNodeFromRootNode,
getIdentifierNodeName: _common.getIdentifierNodeName,
setIdentifierNodeName: _common.setIdentifierNodeName,
getNodeType: _common.getNodeType,
unwrapExpressionStatement,
createBlockStatementNode,
getSanitizedNodeValue,
shouldCompareNode,
wildcardUtils: _common.wildcardUtils,
compareNodesBeforeWildcardsComparison,
compareNodesAfterWildcardsComparison,
identifierTypeAnnotationFieldName: 'typeAnnotation',
stringLikeLiteralUtils,
numericLiteralUtils,
programNodeAndBlockNodeUtils,
getNodePosition,
getParseErrorLocation,
alternativeNodeTypes
};
exports.babelParserSettings = babelParserSettings;
var _default = babelParserSettings;
exports.default = _default;
;