AstHelper.js 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. let parser;
  2. let parserResult;
  3. window.fileList ;
  4. function parseCodeToAST(files) {
  5. fileList = files;
  6. try {
  7. // 使用 Babel.transform 方法来获取 AST
  8. parser = AstParser.CreateParser();
  9. for (let file of files) {
  10. let result = Babel.transform(file.code, { ast: true });
  11. parser.Insert(result.ast, file.name);
  12. }
  13. parserResult = parser.AnalyzeObjectList();
  14. return parser;
  15. } catch (error) {
  16. console.error('Error while parsing code to AST:', error);
  17. }
  18. }
  19. const typeNames = {
  20. func: "函数",
  21. event: "事件",
  22. arrow: "箭头函数",
  23. immediately: "立即函数",
  24. property: "属性",
  25. variable: "变量",
  26. global: "全局",
  27. sub: "子函数"
  28. };
  29. function findallfunc(fileName) {
  30. //查找所有函数列表
  31. let funcs = parserResult.FuncList(fileName);
  32. for (let func of funcs) {
  33. let calleds = func.called;
  34. for (let called of calleds) {
  35. let findFunc = funcs.find(m => m.name == called.name);
  36. if (findFunc) {
  37. let call = findFunc.call;
  38. if (call) {
  39. call.push({ ...func })
  40. }
  41. else {
  42. call = [{ ...func }];
  43. findFunc.call = call;
  44. }
  45. }
  46. }
  47. }
  48. let 函数数据 = funcs.map(func => {
  49. return {
  50. "resource_detail_id": guid(),
  51. "resource_type_id": "de2f035423672a1b2f0ff74d88c54756",
  52. "d854ab8d2487be0e2caac9a4001aa6ab": func.name,
  53. "b5fd8a0958baed8aaff2b793672ef655": "",//参数
  54. "a2c46810d7c99ee4a269078d8153bdbc": "函数声明",
  55. "f6ae5fc6bf5061d5923bb404a0ad2275": typeNames[func.range] ?? "",
  56. "bc3bb60044ec600b5711b9c9d0a263b9": func.des,
  57. "b8c1a900bce94c210e7e8d4f603d7895": func.isAsync,
  58. "c131ddc066f8d6cb3078b5df8abb9e90": func.isNested,
  59. "a1c97b91948f092b88bc22ac848dfd17": ((func.risk.length > 0) ? true : false),
  60. "a7cd11313b0b5b0d21f98209cacf3348": func.isConflict,
  61. "d8f32bdc31d5fdc7aa5206bd0d2ffb8e": func.isIgnoreCatch,
  62. "a6c281a67df62f8f20ab73eb6a8f6a4e": func.isHtmlModify,
  63. "c5f764c313411ff575836738d7c082cd": func.isNullFunc,
  64. "a291970b851f939474ebb0f625322036": ((func.called.length > 0) ? true : false),
  65. "cd8057e29bebf2fdd145bfcf201350b0": func.path,
  66. "eab5bd8b5fa1a0f1878257f53f4c5238": func.codeDepth,
  67. "b8c4c4fd09f303cd69cd97a66cdbfeef": func.isLoopHtmlModify,
  68. "called": func.called.map(called => {
  69. let find = funcs.find(m => m.name == called.name);
  70. return {
  71. "resource_detail_id": guid(),
  72. "resource_type_id": "d281da9b6d86ba9323e8308b318afe97",
  73. "d321c3d8d2d5574b62fec208aaabb835": called.name,
  74. "a1292a65e29df148841fa0e43b2fd8e3": typeNames[called.kind] ?? "",
  75. "bc8ef1810d5e530026fd739d5bb7b66e": called.member ?? "",
  76. "f19def05eb5c70bc140e1930dd62ef0e": called.path,
  77. "b00d955adbfff1e3e054625413b4035a": find?.des,
  78. "c8ddedccca109862726415460ca8190f": called.file,
  79. }
  80. }),
  81. "call": (func?.call ?? []).map(call => {
  82. return {
  83. "resource_detail_id": guid(),
  84. "resource_type_id": "b6318d316773a165ec06130e78d2d729",
  85. "e60d542571f6281994b5829a3d93f766": call.name,
  86. "f7003c73081c0acf745bff998dd9a4af": call.path,
  87. "d90b72a5c7ef8d17b45d5d42e12c4246": call.des,
  88. "b9d3edead8492db52d7f8da179fcb3d1": call.file,
  89. };
  90. })
  91. }
  92. });
  93. js函数.SetData(函数数据);
  94. }
  95. function findGlobalVar(fileName) {
  96. let vars = parserResult.GlobalVarList(fileName);
  97. let 函数数据 = vars.map(v => {
  98. return {
  99. "resource_detail_id": guid(),
  100. "resource_type_id": "a0d645f628cd30f812bc7b27d1a87b92",
  101. "b20f37469ec826b6fd95391da5479fe2": v.name,
  102. "b98a0b9fd812126fbb89131de6855520": v.defWay,
  103. "b4073318880da3292598a489e3294ab5": v.isConflict,
  104. "a669038ca3a4c3482f442fce4bc03353": v.isRepetDefine,
  105. "ad30ad61da41fc5c9123332423176a50": v.isValueTypeChange,
  106. "a65e6ba83f66901b8af02925e629cd13": !!v.called.length,
  107. "e9feee0739cc7bcec5172d72524cb5e5": v?.des,
  108. "ebc5b84a0461ab54880682c9621da7fb": (v?.types ?? []).join(','),
  109. "called": (v?.called ?? []).map(call => {
  110. return {
  111. "resource_detail_id": guid(),
  112. "resource_type_id": "b3aa6403c0221ba3c21378f686589151",
  113. "ab6230195a6cae401afe732cbd726442": call.name,
  114. "ebc0610c86b669055a229f272960ad90": typeNames[call.kind] ?? "",
  115. "b1c7f0f3325bd37db67280a7df3198d1": call.member,
  116. "dee51340937b6c839340eb497e64e162": call.isAssignment,
  117. "ef5fef184f22233385cce6e8111de720": call.path,
  118. "b97e41b1e97dffbe664592bc5fbc62b0": call.file,
  119. }
  120. })
  121. }
  122. })
  123. 变量定义.SetData(函数数据);
  124. }
  125. function removeParentKey(obj) {
  126. if (obj && typeof obj === 'object') {
  127. for (let key in obj) {
  128. if (key === 'parent' || key == "nodeRel") {
  129. delete obj[key];
  130. } else {
  131. removeParentKey(obj[key]);
  132. }
  133. }
  134. }
  135. }
  136. function findSelector() {
  137. let 选择器数据 = parserResult.AllSelectorList.map(v => {
  138. let ast = parser._ast.find(o => o.file == v?.file)?.program;
  139. if (ast) {
  140. removeParentKey(ast);
  141. } else {
  142. ast = {};
  143. }
  144. return {
  145. "resource_detail_id": guid(),
  146. "JS文件": v?.file,
  147. "过滤器": v?.selectorFilter,
  148. "选择器类型": v?.selectorWay,
  149. "调用方式": v.selectorCall,
  150. "所在位置": (v?.funcInfo?.member ? v.funcInfo.name + "." + v.funcInfo.member : v?.funcInfo?.name),
  151. "DOM操作分类": v.kind,
  152. "astJSON": ast,
  153. "source_data":v
  154. };
  155. })
  156. return 选择器数据;
  157. }
  158. window.findallfunc = findallfunc;
  159. window.findGlobalVar = findGlobalVar;
  160. window.findSelector = findSelector;
  161. window.parseCodeToAST = parseCodeToAST;
  162. const GuidLetter = ['a', 'b', 'c', 'd', 'e', 'f'];
  163. function Guid_S4Letter() {
  164. return GuidLetter[(parseInt(Math.random() * 10) % 6)] + (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(2);
  165. }
  166. function Guid_S4() {
  167. return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
  168. }
  169. //生成随机 GUID 数
  170. function guid() {
  171. return (Guid_S4Letter() + Guid_S4() + Guid_S4() + Guid_S4() + Guid_S4() + Guid_S4() + Guid_S4() + Guid_S4());
  172. }