import type { ApiScanResultItem } from '@/types/scan' import type { ScanConfigSchema } from '@/scripts/op-config' import t from '@babel/types' const transformStringLiteralToPattern = (value: string) => { const [url] = value.split('?') return url } const transformTemplateLiteralToPattern = ( ast: t.TemplateLiteral, patternTemplate: ScanConfigSchema['patternFragment'], ) => { const { quasis = [] } = ast const url = quasis.map((quasi) => quasi.value.raw.split('?')[0]).join(patternTemplate.placeholder) return url } const transformBinaryExpressionToPattern = ( ast: t.BinaryExpression, patternTemplate: ScanConfigSchema['patternFragment'], ) => { let pattern = '' const { left, right } = ast for (const subNode of [right, left]) { if (t.isStringLiteral(subNode)) { pattern = transformStringLiteralToPattern(subNode.value) + pattern } else if (t.isTemplateLiteral(subNode)) { pattern = transformTemplateLiteralToPattern(subNode, patternTemplate) + pattern } else if (t.isBinaryExpression(subNode, { operator: '+' })) { pattern = transformBinaryExpressionToPattern(subNode, patternTemplate) + pattern } else { pattern = patternTemplate.placeholder + pattern } } return pattern } export const transformScanResultToPattern = ( scanResult: ApiScanResultItem, patternFragment: ScanConfigSchema['patternFragment'], ) => { const { ast, value } = scanResult const { pre, post } = patternFragment let patternStr = '' if (!ast) { // 注释节点没有保存ast信息 patternStr = transformStringLiteralToPattern(value) } else if (t.isStringLiteral(ast)) { patternStr = transformStringLiteralToPattern(ast.value) } else if (t.isTemplateLiteral(ast)) { patternStr = transformTemplateLiteralToPattern(ast, patternFragment) } else if (t.isBinaryExpression(ast, { operator: '+' })) { patternStr = transformBinaryExpressionToPattern(ast, patternFragment) } return `${pre}${patternStr}${post}` }