123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 |
- 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());
- }
|