let parser; let parserResult; window.fileList ; function parseCodeToAST(files) { fileList = files; try { // 使用 Babel.transform 方法来获取 AST parser = AstParser.CreateParser(); for (let file of files) { let result = Babel.transform(file.code, { ast: true }); parser.Insert(result.ast, file.name); } parserResult = parser.AnalyzeObjectList(); return parser; } catch (error) { console.error('Error while parsing code to AST:', error); } } const typeNames = { func: "函数", event: "事件", arrow: "箭头函数", immediately: "立即函数", property: "属性", variable: "变量", global: "全局", sub: "子函数" }; function findallfunc(fileName) { //查找所有函数列表 let funcs = parserResult.FuncList(fileName); for (let func of funcs) { let calleds = func.called; for (let called of calleds) { let findFunc = funcs.find(m => m.name == called.name); if (findFunc) { let call = findFunc.call; if (call) { call.push({ ...func }) } else { call = [{ ...func }]; findFunc.call = call; } } } } let 函数数据 = funcs.map(func => { return { "resource_detail_id": guid(), "resource_type_id": "de2f035423672a1b2f0ff74d88c54756", "d854ab8d2487be0e2caac9a4001aa6ab": func.name, "b5fd8a0958baed8aaff2b793672ef655": "",//参数 "a2c46810d7c99ee4a269078d8153bdbc": "函数声明", "f6ae5fc6bf5061d5923bb404a0ad2275": typeNames[func.range] ?? "", "bc3bb60044ec600b5711b9c9d0a263b9": func.des, "b8c1a900bce94c210e7e8d4f603d7895": func.isAsync, "c131ddc066f8d6cb3078b5df8abb9e90": func.isNested, "a1c97b91948f092b88bc22ac848dfd17": ((func.risk.length > 0) ? true : false), "a7cd11313b0b5b0d21f98209cacf3348": func.isConflict, "d8f32bdc31d5fdc7aa5206bd0d2ffb8e": func.isIgnoreCatch, "a6c281a67df62f8f20ab73eb6a8f6a4e": func.isHtmlModify, "c5f764c313411ff575836738d7c082cd": func.isNullFunc, "a291970b851f939474ebb0f625322036": ((func.called.length > 0) ? true : false), "cd8057e29bebf2fdd145bfcf201350b0": func.path, "eab5bd8b5fa1a0f1878257f53f4c5238": func.codeDepth, "b8c4c4fd09f303cd69cd97a66cdbfeef": func.isLoopHtmlModify, "called": func.called.map(called => { let find = funcs.find(m => m.name == called.name); return { "resource_detail_id": guid(), "resource_type_id": "d281da9b6d86ba9323e8308b318afe97", "d321c3d8d2d5574b62fec208aaabb835": called.name, "a1292a65e29df148841fa0e43b2fd8e3": typeNames[called.kind] ?? "", "bc8ef1810d5e530026fd739d5bb7b66e": called.member ?? "", "f19def05eb5c70bc140e1930dd62ef0e": called.path, "b00d955adbfff1e3e054625413b4035a": find?.des, "c8ddedccca109862726415460ca8190f": called.file, } }), "call": (func?.call ?? []).map(call => { return { "resource_detail_id": guid(), "resource_type_id": "b6318d316773a165ec06130e78d2d729", "e60d542571f6281994b5829a3d93f766": call.name, "f7003c73081c0acf745bff998dd9a4af": call.path, "d90b72a5c7ef8d17b45d5d42e12c4246": call.des, "b9d3edead8492db52d7f8da179fcb3d1": call.file, }; }) } }); js函数.SetData(函数数据); } function findGlobalVar(fileName) { let vars = parserResult.GlobalVarList(fileName); let 函数数据 = vars.map(v => { return { "resource_detail_id": guid(), "resource_type_id": "a0d645f628cd30f812bc7b27d1a87b92", "b20f37469ec826b6fd95391da5479fe2": v.name, "b98a0b9fd812126fbb89131de6855520": v.defWay, "b4073318880da3292598a489e3294ab5": v.isConflict, "a669038ca3a4c3482f442fce4bc03353": v.isRepetDefine, "ad30ad61da41fc5c9123332423176a50": v.isValueTypeChange, "a65e6ba83f66901b8af02925e629cd13": !!v.called.length, "e9feee0739cc7bcec5172d72524cb5e5": v?.des, "ebc5b84a0461ab54880682c9621da7fb": (v?.types ?? []).join(','), "called": (v?.called ?? []).map(call => { return { "resource_detail_id": guid(), "resource_type_id": "b3aa6403c0221ba3c21378f686589151", "ab6230195a6cae401afe732cbd726442": call.name, "ebc0610c86b669055a229f272960ad90": typeNames[call.kind] ?? "", "b1c7f0f3325bd37db67280a7df3198d1": call.member, "dee51340937b6c839340eb497e64e162": call.isAssignment, "ef5fef184f22233385cce6e8111de720": call.path, "b97e41b1e97dffbe664592bc5fbc62b0": call.file, } }) } }) 变量定义.SetData(函数数据); } function removeParentKey(obj) { if (obj && typeof obj === 'object') { for (let key in obj) { if (key === 'parent' || key == "nodeRel") { delete obj[key]; } else { removeParentKey(obj[key]); } } } } function findSelector() { let 选择器数据 = parserResult.AllSelectorList.map(v => { let ast = parser._ast.find(o => o.file == v?.file)?.program; if (ast) { removeParentKey(ast); } else { ast = {}; } return { "resource_detail_id": guid(), "JS文件": v?.file, "过滤器": v?.selectorFilter, "选择器类型": v?.selectorWay, "调用方式": v.selectorCall, "所在位置": (v?.funcInfo?.member ? v.funcInfo.name + "." + v.funcInfo.member : v?.funcInfo?.name), "DOM操作分类": v.kind, "astJSON": ast, "source_data":v }; }) return 选择器数据; } window.findallfunc = findallfunc; window.findGlobalVar = findGlobalVar; window.findSelector = findSelector; window.parseCodeToAST = parseCodeToAST; const GuidLetter = ['a', 'b', 'c', 'd', 'e', 'f']; function Guid_S4Letter() { return GuidLetter[(parseInt(Math.random() * 10) % 6)] + (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(2); } function Guid_S4() { return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1); } //生成随机 GUID 数 function guid() { return (Guid_S4Letter() + Guid_S4() + Guid_S4() + Guid_S4() + Guid_S4() + Guid_S4() + Guid_S4() + Guid_S4()); }