UNPKG

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