js-code-detector 0.0.43 → 0.0.47

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/bin/runDiffDetect.js +3 -0
  2. package/dist/cjs/index.d.ts +35 -12
  3. package/dist/cjs/index.js +23 -8
  4. package/dist/cjs/services/DetectService.d.ts +35 -0
  5. package/dist/cjs/services/DetectService.js +177 -0
  6. package/dist/cjs/services/ProjectService.d.ts +16 -0
  7. package/dist/cjs/services/ProjectService.js +17 -0
  8. package/dist/cjs/services/projectServiceClass/UmiProjectService.d.ts +13 -0
  9. package/dist/cjs/services/projectServiceClass/UmiProjectService.js +97 -0
  10. package/dist/cjs/util/ast_util/AstUtil.d.ts +4 -7
  11. package/dist/cjs/util/ast_util/AstUtil.js +158 -50
  12. package/dist/cjs/util/ast_util/FileUtil.js +5 -1
  13. package/dist/cjs/util/createRandomStr.d.ts +1 -0
  14. package/dist/cjs/util/createRandomStr.js +38 -0
  15. package/dist/cjs/util/parseGitLabDiffUril.js +1 -1
  16. package/dist/cjs/util/report_util/createDependenceMap.d.ts +6 -1
  17. package/dist/cjs/util/report_util/createDependenceMap.js +73 -28
  18. package/dist/cjs/util/report_util/filterEffectedCode.d.ts +13 -0
  19. package/dist/cjs/util/report_util/filterEffectedCode.js +72 -0
  20. package/dist/cjs/util/report_util/filterEffectedExportMember.d.ts +1 -0
  21. package/dist/cjs/util/report_util/filterEffectedExportMember.js +43 -0
  22. package/dist/cjs/util/report_util/generateGitDiffReport.d.ts +9 -4
  23. package/dist/cjs/util/report_util/generateGitDiffReport.js +24 -19
  24. package/dist/cjs/util/report_util.d.ts +3 -1
  25. package/dist/cjs/util/report_util.js +10 -0
  26. package/dist/cjs/util/shared/collectUpstreamFiles.d.ts +2 -0
  27. package/dist/cjs/util/shared/collectUpstreamFiles.js +39 -0
  28. package/dist/cjs/util/shared/getRepoSupportFlag.d.ts +2 -1
  29. package/dist/cjs/util/shared/getRepoSupportFlag.js +15 -6
  30. package/dist/cjs/util/shared/gitDiffTool.d.ts +45 -7
  31. package/dist/cjs/util/shared/gitDiffTool.js +80 -29
  32. package/dist/cjs/util/shared/gitUtil.d.ts +4 -0
  33. package/dist/cjs/util/shared/gitUtil.js +18 -2
  34. package/dist/cjs/util/shared/umi4ProjectUtil.d.ts +2 -1
  35. package/dist/cjs/util/shared/umi4ProjectUtil.js +6 -8
  36. package/package.json +3 -2
  37. package/bin/eslintOutput.js +0 -3
  38. package/dist/cjs/sh/detect.sh +0 -15
@@ -4,14 +4,19 @@ export declare function generateGitDiffReport(arg: {
4
4
  madgeResult: IMadgeInstance;
5
5
  parsedAlias: Record<string, any>;
6
6
  targetDirPath: string;
7
- generateFile?: ('dependence_map.json' | 'partial_dependence_map.json' | 'report.json' | typeof reportFileName)[];
7
+ generateFile?: ('dependence_map.json' | 'partial_dependence_map.json' | 'report.json' | 'gitDiffDetail.json' | typeof reportFileName)[];
8
8
  }): Promise<{
9
- mdContent: string;
10
- dependenceJson: Record<string, any>;
11
- upstreamDependenceJson: Record<string, any>;
9
+ dependenceJson: {
10
+ import2export: Record<string, string>;
11
+ export2export: Record<string, string>;
12
+ mapFilePathToExportAllSources: Record<string, string[]>;
13
+ indirectExportMembers: Record<string, string>;
14
+ };
12
15
  partialDependenceJson: Record<string, any>;
13
16
  reports: {
14
17
  dangerIdentifiers: string[];
18
+ topEffectedExportsAdded: string[];
19
+ topEffectedExportsRemoved: string[];
15
20
  blockReports: {
16
21
  diff_txt: string[];
17
22
  infos: {
@@ -38,42 +38,47 @@ var import__ = require("../../index");
38
38
  var import_format_git_diff_content = require("../format_git_diff_content");
39
39
  var import_utils = require("@umijs/utils");
40
40
  var import_report_util = require("../report_util");
41
- var import_createMdByJson = require("./createMdByJson");
42
41
  var import_createDependenceMap = require("./createDependenceMap");
43
42
  var import_dayjs = __toESM(require("dayjs"));
43
+ var import_collectUpstreamFiles = __toESM(require("../shared/collectUpstreamFiles"));
44
+ var import_filterEffectedCode = __toESM(require("./filterEffectedCode"));
44
45
  var reportFileName = "git_diff_report.md";
45
46
  async function generateGitDiffReport(arg) {
46
- const { madgeResult, parsedAlias, targetDirPath, generateFile = ["upstream_dependence_map.json", "dependence_map.json", "partial_dependence_map.json", "report.json", reportFileName] } = arg;
47
+ const { madgeResult, parsedAlias, targetDirPath, generateFile = ["upstream_dependence_map.json", "dependence_map.json", "partial_dependence_map.json", "report.json", "gitDiffDetail.json", reportFileName] } = arg;
48
+ const absPathPrefix = targetDirPath + "/";
47
49
  const { tree } = madgeResult;
50
+ const projectFilePaths = Object.keys(tree);
51
+ import_utils.logger.info("读取 git diff 内容,生成 json 文件");
48
52
  const diff_txt = (0, import_fs.readFileSync)((0, import_path.join)(targetDirPath, import__.gitDiffFileName), "utf-8");
49
53
  const gitDiffDetail = (0, import_format_git_diff_content.formatGitDiffContent)(diff_txt);
50
- const absPathPrefix = targetDirPath + "/";
51
- const usingFileNoPrefix = Object.keys(tree);
52
- const usingFilePaths = usingFileNoPrefix.map((item) => (0, import_utils.winPath)((0, import_path.join)(absPathPrefix, item)));
53
- const groupGitDiffLines = gitDiffDetail.filter((item) => usingFileNoPrefix.includes(item.filePath));
54
- const changedFilePaths = groupGitDiffLines.map((item) => item.filePath);
54
+ const modifiedFilePaths = gitDiffDetail.map((item) => item.filePath);
55
+ const upstreamFilePaths = (0, import_collectUpstreamFiles.default)(madgeResult, modifiedFilePaths);
56
+ const upstreamFileFullPaths = upstreamFilePaths.map((item) => (0, import_utils.winPath)((0, import_path.join)(absPathPrefix, item)));
57
+ const groupGitDiffLines = gitDiffDetail.filter((item) => upstreamFilePaths.includes(item.filePath));
55
58
  const time = (0, import_dayjs.default)().format("YYYYMDD_HHmm");
56
- let dependenceJson = {};
59
+ let dependenceJson = {
60
+ indirectExportMembers: {},
61
+ import2export: {},
62
+ export2export: {},
63
+ mapFilePathToExportAllSources: {}
64
+ };
57
65
  let partialDependenceJson = {};
58
- let upstreamDependenceJson = {};
66
+ let reports = [];
59
67
  try {
60
- dependenceJson = (0, import_createDependenceMap.createDependenceMap)(usingFilePaths, parsedAlias, absPathPrefix);
61
- partialDependenceJson = Object.fromEntries(changedFilePaths.map((p) => [p, dependenceJson[p]]));
62
- upstreamDependenceJson = Object.fromEntries(changedFilePaths.map((p) => [p, madgeResult.depends(p)]));
68
+ import_utils.logger.info("生成 dependenceJson ...");
69
+ dependenceJson = (0, import_createDependenceMap.createExportedNameToReferenceLocalSet)(upstreamFileFullPaths, parsedAlias, absPathPrefix, projectFilePaths);
70
+ reports = (0, import_report_util.createDetectReport)({ groupGitDiffLines, tree, absPathPrefix });
71
+ partialDependenceJson = (0, import_filterEffectedCode.default)(reports, dependenceJson);
63
72
  } catch (e) {
64
- console.warn("dependenceJson 生成失败", e);
73
+ import_utils.logger.warn("dependenceJson 生成失败", e);
65
74
  }
66
- const reports = (0, import_report_util.createDetectReport)({ groupGitDiffLines, tree, absPathPrefix });
67
- const mdContent = (0, import_createMdByJson.createMdByJson)(reports);
68
- generateFile.includes("upstream_dependence_map.json") && (0, import_fs.writeFileSync)((0, import_path.join)(targetDirPath, "..", "..", `${time}_upstream_dependence_map.json`), JSON.stringify(dependenceJson, null, 2), { encoding: "utf-8", flag: "w" });
75
+ import_utils.logger.info("完成");
69
76
  generateFile.includes("dependence_map.json") && (0, import_fs.writeFileSync)((0, import_path.join)(targetDirPath, "..", "..", `${time}_dependence_map.json`), JSON.stringify(dependenceJson, null, 2), { encoding: "utf-8", flag: "w" });
70
77
  generateFile.includes("partial_dependence_map.json") && (0, import_fs.writeFileSync)((0, import_path.join)(targetDirPath, "..", "..", `${time}_partial_dependence_map.json`), JSON.stringify(partialDependenceJson, null, 2), { encoding: "utf-8", flag: "w" });
71
78
  generateFile.includes("report.json") && (0, import_fs.writeFileSync)((0, import_path.join)(targetDirPath, "..", "..", `${time}_report.json`), JSON.stringify(reports, null, 2), { encoding: "utf-8", flag: "w" });
72
- generateFile.includes(reportFileName) && (0, import_fs.writeFileSync)((0, import_path.join)(targetDirPath, "..", "..", `${time}_${reportFileName}`), mdContent, { encoding: "utf-8", flag: "w" });
79
+ generateFile.includes("gitDiffDetail.json") && (0, import_fs.writeFileSync)((0, import_path.join)(targetDirPath, "..", "..", `${time}_gitDiffDetail.json`), JSON.stringify(gitDiffDetail, null, 2), { encoding: "utf-8", flag: "w" });
73
80
  return {
74
- mdContent,
75
81
  dependenceJson,
76
- upstreamDependenceJson,
77
82
  partialDependenceJson,
78
83
  reports
79
84
  };
@@ -26,6 +26,8 @@ type Arg = {
26
26
  };
27
27
  export declare function createDetectReport(arg: Arg): {
28
28
  dangerIdentifiers: string[];
29
+ topEffectedExportsAdded: string[];
30
+ topEffectedExportsRemoved: string[];
29
31
  blockReports: {
30
32
  diff_txt: string[];
31
33
  infos: {
@@ -35,7 +37,7 @@ export declare function createDetectReport(arg: Arg): {
35
37
  effectsDownstream: string[];
36
38
  }[];
37
39
  }[];
38
- type: "add" | "delete" | "modify";
40
+ type: "delete" | "modify" | "add";
39
41
  filesDependsOnMe: string[];
40
42
  undefinedIdentifiers: string[];
41
43
  filePath: string;
@@ -63,6 +63,14 @@ function createDetectReport(arg) {
63
63
  });
64
64
  return reports.map((reportItem) => {
65
65
  const { _fileAddedNodesPaths, _fileRemovedNodesPaths, filePath, blockReports, ...reportProperties } = reportItem;
66
+ const topEffectedExportsAdded = _fileAddedNodesPaths.map((e) => {
67
+ const { node } = e;
68
+ return import_AstUtil.default.findExportedMembersNameFromAncestors(node);
69
+ }).flat();
70
+ const topEffectedExportsRemoved = _fileRemovedNodesPaths.map((e) => {
71
+ const { node } = e;
72
+ return import_AstUtil.default.findExportedMembersNameFromAncestors(node);
73
+ }).flat();
66
74
  (0, import_diffBlockDetect.reportItemDetect)(reportItem, absPathPrefix);
67
75
  const fileAddedNodesPaths = reportItem._fileAddedNodesPaths.map((item) => item.nodePath);
68
76
  const fileRemovedNodesPaths = reportItem._fileRemovedNodesPaths.map((item) => import_AstUtil.default.getShortNodeMsg(item.node, true));
@@ -70,6 +78,8 @@ function createDetectReport(arg) {
70
78
  filePath,
71
79
  ...reportProperties,
72
80
  dangerIdentifiers: fileRemovedNodesPaths,
81
+ topEffectedExportsAdded: [...new Set(topEffectedExportsAdded)],
82
+ topEffectedExportsRemoved: [...new Set(topEffectedExportsRemoved)],
73
83
  blockReports: blockReports.map((blockReport) => {
74
84
  const { diff_txt } = blockReport;
75
85
  const addNodeAndPaths = blockReport.addNodeAndPaths.filter((e) => fileAddedNodesPaths.includes(e.nodePath));
@@ -0,0 +1,2 @@
1
+ import { IMadgeInstance } from "../report_util/getMadgeInstance";
2
+ export default function collectUpstreamFiles(madgeResult: IMadgeInstance, modifiedFilePaths: string[], maxCount?: number): string[];
@@ -0,0 +1,39 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+
19
+ // src/util/shared/collectUpstreamFiles.ts
20
+ var collectUpstreamFiles_exports = {};
21
+ __export(collectUpstreamFiles_exports, {
22
+ default: () => collectUpstreamFiles
23
+ });
24
+ module.exports = __toCommonJS(collectUpstreamFiles_exports);
25
+ function collectUpstreamFiles(madgeResult, modifiedFilePaths, maxCount = 30) {
26
+ const changedFilePaths = [...modifiedFilePaths];
27
+ let tmpFiles = [...modifiedFilePaths];
28
+ for (let i = 0; i < 3; i++) {
29
+ tmpFiles = tmpFiles.map((file) => madgeResult.depends(file)).flat();
30
+ if (tmpFiles.length === 0) {
31
+ break;
32
+ }
33
+ changedFilePaths.push(...tmpFiles);
34
+ if (changedFilePaths.length > maxCount) {
35
+ break;
36
+ }
37
+ }
38
+ return [...new Set(changedFilePaths)];
39
+ }
@@ -1,3 +1,4 @@
1
1
  import { semver } from "@umijs/utils";
2
- export declare function getRepoType(jsonPath: string): "umi" | null | undefined;
2
+ export declare function isRepoTypeSupported(repoType: string): boolean;
3
+ export declare function getRepoType(jsonPath: string): "unknown" | "umi" | "vue2";
3
4
  export declare function getMinVersion(jsonPath: string, depName: string): semver.SemVer | null | undefined;
@@ -20,27 +20,35 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  var getRepoSupportFlag_exports = {};
21
21
  __export(getRepoSupportFlag_exports, {
22
22
  getMinVersion: () => getMinVersion,
23
- getRepoType: () => getRepoType
23
+ getRepoType: () => getRepoType,
24
+ isRepoTypeSupported: () => isRepoTypeSupported
24
25
  });
25
26
  module.exports = __toCommonJS(getRepoSupportFlag_exports);
26
27
  var import_fs = require("fs");
27
28
  var import_utils = require("@umijs/utils");
29
+ function isRepoTypeSupported(repoType) {
30
+ return ["umi"].includes(repoType);
31
+ }
28
32
  function getRepoType(jsonPath) {
29
- var _a;
33
+ var _a, _b, _c;
30
34
  const isExist = (0, import_fs.existsSync)(jsonPath);
31
35
  if (!isExist)
32
- return null;
36
+ return "unknown";
33
37
  const packageJson = (0, import_fs.readFileSync)(jsonPath, "utf-8");
34
38
  if (!packageJson)
35
- return null;
39
+ return "unknown";
36
40
  try {
37
41
  const packageJsonObj = JSON.parse(packageJson);
38
42
  if ((_a = packageJsonObj == null ? void 0 : packageJsonObj.dependencies) == null ? void 0 : _a["@umijs/max"]) {
39
43
  return "umi";
40
44
  }
45
+ if (((_b = packageJsonObj == null ? void 0 : packageJsonObj.dependencies) == null ? void 0 : _b["@vue/cli-service"]) || ((_c = packageJsonObj == null ? void 0 : packageJsonObj.devDependencies) == null ? void 0 : _c["@vue/cli-service"])) {
46
+ return "vue2";
47
+ }
41
48
  } catch (e) {
42
- return null;
49
+ import_utils.logger.error(e.message);
43
50
  }
51
+ return "unknown";
44
52
  }
45
53
  function getMinVersion(jsonPath, depName) {
46
54
  var _a, _b;
@@ -60,5 +68,6 @@ function getMinVersion(jsonPath, depName) {
60
68
  // Annotate the CommonJS export names for ESM import in node:
61
69
  0 && (module.exports = {
62
70
  getMinVersion,
63
- getRepoType
71
+ getRepoType,
72
+ isRepoTypeSupported
64
73
  });
@@ -1,11 +1,44 @@
1
1
  import { generateGitDiffReport } from "../report_util/generateGitDiffReport";
2
- export type CloneType = 'ssh' | 'token';
3
2
  export declare function cloneGitRepoAndGetDiff(gitRepoUrl: string, branchName: string, extra?: {
4
- cloneType?: CloneType;
5
3
  token?: string;
4
+ jsonKeys?: (keyof Awaited<ReturnType<typeof cloneGitRepoAndGetDiff>>)[];
6
5
  }): Promise<{
7
- [k: string]: string[];
8
- } | undefined>;
6
+ reports: {
7
+ dangerIdentifiers: string[];
8
+ topEffectedExportsAdded: string[];
9
+ topEffectedExportsRemoved: string[];
10
+ blockReports: {
11
+ diff_txt: string[];
12
+ infos: {
13
+ causeBy: string;
14
+ effectsUpstream: string[];
15
+ occupations: string[];
16
+ effectsDownstream: string[];
17
+ }[];
18
+ }[];
19
+ type: "modify" | "add" | "delete";
20
+ filesDependsOnMe: string[];
21
+ undefinedIdentifiers: string[];
22
+ filePath: string;
23
+ }[];
24
+ dependenceJson: {
25
+ import2export: Record<string, string>;
26
+ export2export: Record<string, string>;
27
+ mapFilePathToExportAllSources: Record<string, string[]>;
28
+ indirectExportMembers: Record<string, string>;
29
+ };
30
+ effectedCode: Record<string, any>;
31
+ upstreamDependenceJson: {};
32
+ repoType: string;
33
+ message: string;
34
+ } | {
35
+ effectedCode: Record<string, any>;
36
+ upstreamDependenceJson: {};
37
+ repoType: string;
38
+ message: any;
39
+ reports?: undefined;
40
+ dependenceJson?: undefined;
41
+ }>;
9
42
  export declare function gitDiffTool(arg: {
10
43
  gitRepoUrl: string;
11
44
  baseBranch: string;
@@ -13,12 +46,17 @@ export declare function gitDiffTool(arg: {
13
46
  tempDirPath: string;
14
47
  generateFile: Parameters<typeof generateGitDiffReport>[0]['generateFile'];
15
48
  }): Promise<{
16
- mdContent: string;
17
- dependenceJson: Record<string, any>;
18
- upstreamDependenceJson: Record<string, any>;
49
+ dependenceJson: {
50
+ import2export: Record<string, string>;
51
+ export2export: Record<string, string>;
52
+ mapFilePathToExportAllSources: Record<string, string[]>;
53
+ indirectExportMembers: Record<string, string>;
54
+ };
19
55
  partialDependenceJson: Record<string, any>;
20
56
  reports: {
21
57
  dangerIdentifiers: string[];
58
+ topEffectedExportsAdded: string[];
59
+ topEffectedExportsRemoved: string[];
22
60
  blockReports: {
23
61
  diff_txt: string[];
24
62
  infos: {
@@ -44,32 +44,58 @@ var import_umi4ProjectUtil = require("./umi4ProjectUtil");
44
44
  var import_generateGitDiffReport = require("../report_util/generateGitDiffReport");
45
45
  var import_vueProjectUtil = require("./vueProjectUtil");
46
46
  var import__ = require("../../index");
47
- var import_dayjs = __toESM(require("dayjs"));
48
47
  var import_fs = require("fs");
49
48
  var import_format_git_diff_content = require("../format_git_diff_content");
50
49
  var import_gitUtil = require("./gitUtil");
50
+ var import_perf_hooks = require("perf_hooks");
51
+ var import_createDependenceMap = require("../report_util/createDependenceMap");
52
+ var import_collectUpstreamFiles = __toESM(require("./collectUpstreamFiles"));
53
+ var import_filterEffectedCode = __toESM(require("../report_util/filterEffectedCode"));
54
+ var import_report_util = require("../report_util");
55
+ var import_createRandomStr = __toESM(require("../createRandomStr"));
51
56
  async function cloneGitRepoAndGetDiff(gitRepoUrl, branchName, extra = {}) {
52
- const { token } = extra;
53
- const today = (0, import_dayjs.default)().format("YYYYMDD_HHmmss") + Math.random().toString(36).slice(-5);
57
+ import_perf_hooks.performance.mark("stage 0");
58
+ const { token, jsonKeys = ["upstreamDependenceJson"] } = extra;
59
+ const today = (0, import_createRandomStr.default)();
54
60
  import_utils.logger.ready("准备生成临时工作目录...");
55
61
  const [err] = await (0, import_await_to_js.default)(import_utils.execa.execa(`rm -rf ${today}`, { shell: true }));
56
62
  if (err) {
57
63
  import_utils.logger.error("临时目录删除失败");
58
64
  }
59
- await import_utils.execa.execa(`mkdir -p ${today}`, { shell: true });
65
+ let stderr, failed;
66
+ ({ stderr, failed } = await import_utils.execa.execa(`mkdir -p ${today}`, { shell: true }));
67
+ (0, import_handleExecaError.handleExecaError)({ failed, stderr });
60
68
  import_utils.logger.info("临时目录建立完成");
69
+ let upstreamDependenceJson = {};
70
+ let dependenceJson = {
71
+ indirectExportMembers: {},
72
+ import2export: {},
73
+ export2export: {},
74
+ mapFilePathToExportAllSources: {}
75
+ };
76
+ let effectedCode = {};
77
+ let reports = [];
61
78
  try {
62
- let stderr, failed;
63
79
  import_utils.logger.ready(`准备clone 源代码到临时目录下的 ${today}/${import_constants.TARGET} 文件夹`);
64
80
  const repoUrl = (0, import_parseGitLabDiffUril.getGitRepoUrlByToken)(gitRepoUrl, token || "");
81
+ import_perf_hooks.performance.mark("stage 1");
65
82
  await (0, import_gitUtil.cloneRepoWithBranchAndDefault)(repoUrl, branchName, (0, import_path.join)(today, import_constants.TARGET));
83
+ import_perf_hooks.performance.mark("stage 2");
84
+ import_utils.logger.info(`stage 1 --> stage 2 耗时: ${import_perf_hooks.performance.measure("stage 1 --> stage 2", "stage 1", "stage 2").duration}ms`);
85
+ await (0, import_gitUtil.cloneRepoWithBranchAndDefault)(repoUrl, "master", (0, import_path.join)(today, import_constants.SOURCE));
86
+ import_perf_hooks.performance.mark("stage 3");
87
+ import_utils.logger.info(`stage 2 --> stage 3 耗时: ${import_perf_hooks.performance.measure("stage 2 --> stage 3", "stage 2", "stage 3").duration}ms`);
66
88
  import_utils.logger.ready("准备生成git_diff.txt文件");
67
89
  ({ stderr, failed } = await import_utils.execa.execa(`cd ${today}/${import_constants.TARGET} && git diff master..${branchName} --unified=0 --output=${import__.gitDiffFileName}`, { shell: true }));
90
+ import_perf_hooks.performance.mark("stage 4");
91
+ import_utils.logger.info(`stage 3 --> stage 4 耗时: ${import_perf_hooks.performance.measure("stage 3 --> stage 4", "stage 3", "stage 4").duration}ms`);
68
92
  (0, import_handleExecaError.handleExecaError)({ failed, stderr });
69
93
  const repoType = await (0, import_getRepoSupportFlag.getRepoType)((0, import_path.join)(process.cwd(), today, import_constants.TARGET, "package.json"));
70
94
  import_utils.logger.info(`项目类型为: ${repoType}`);
71
95
  if (repoType === "umi") {
72
- const { madgeResult, shellExeResult } = await (0, import_umi4ProjectUtil.umi4SetUp)({ targetDirPath: (0, import_path.join)(process.cwd(), today, import_constants.TARGET) });
96
+ const { madgeResult, shellExeResult, parsedAlias } = await (0, import_umi4ProjectUtil.umi4SetUp)({ targetDirPath: (0, import_path.join)(process.cwd(), today, import_constants.TARGET), invokeType: "remote" });
97
+ import_perf_hooks.performance.mark("stage 5");
98
+ import_utils.logger.info(`stage 4 --> stage 5 耗时: ${import_perf_hooks.performance.measure("stage 4 --> stage 5", "stage 4", "stage 5").duration}ms`);
73
99
  ({ stderr, failed } = shellExeResult);
74
100
  (0, import_handleExecaError.handleExecaError)({ failed, stderr });
75
101
  const targetDirPath = (0, import_path.join)(process.cwd(), today, import_constants.TARGET);
@@ -78,11 +104,47 @@ async function cloneGitRepoAndGetDiff(gitRepoUrl, branchName, extra = {}) {
78
104
  const usingFileNoPrefix = Object.keys(madgeResult.tree);
79
105
  const groupGitDiffLines = gitDiffDetail.filter((item) => usingFileNoPrefix.includes(item.filePath));
80
106
  const changedFilePaths = groupGitDiffLines.map((item) => item.filePath);
81
- const upstreamDependenceJson = Object.fromEntries(changedFilePaths.map((p) => [p, madgeResult.depends(p)]));
82
- return upstreamDependenceJson;
107
+ upstreamDependenceJson = Object.fromEntries(changedFilePaths.map((p) => [p, madgeResult.depends(p)]));
108
+ const absPathPrefix = targetDirPath + "/";
109
+ const modifiedFilePaths = gitDiffDetail.map((item) => item.filePath);
110
+ import_perf_hooks.performance.mark("stage 6");
111
+ import_utils.logger.info(`stage 5 --> stage 6 耗时: ${import_perf_hooks.performance.measure("stage 5 --> stage 6", "stage 5", "stage 6").duration}ms`);
112
+ const effectedFilePaths = (0, import_collectUpstreamFiles.default)(madgeResult, modifiedFilePaths).map((item) => (0, import_utils.winPath)((0, import_path.join)(absPathPrefix, item)));
113
+ import_perf_hooks.performance.mark("stage 7");
114
+ import_utils.logger.info(`stage 6 --> stage 7 耗时: ${import_perf_hooks.performance.measure("stage 6 --> stage 7", "stage 6", "stage 7").duration}ms`);
115
+ if (jsonKeys.includes("dependenceJson")) {
116
+ dependenceJson = (0, import_createDependenceMap.createExportedNameToReferenceLocalSet)(effectedFilePaths, parsedAlias, absPathPrefix, Object.keys(madgeResult.tree));
117
+ }
118
+ import_perf_hooks.performance.mark("stage 8");
119
+ import_utils.logger.info(`stage 7 --> stage 8 耗时: ${import_perf_hooks.performance.measure("stage 7 --> stage 8", "stage 7", "stage 8").duration}ms`);
120
+ if (jsonKeys.includes("reports")) {
121
+ reports = (0, import_report_util.createDetectReport)({ groupGitDiffLines, tree: madgeResult.tree, absPathPrefix });
122
+ }
123
+ import_perf_hooks.performance.mark("stage 9");
124
+ import_utils.logger.info(`stage 8 --> stage 9 耗时: ${import_perf_hooks.performance.measure("stage 8 --> stage 9", "stage 8", "stage 9").duration}ms`);
125
+ if (jsonKeys.includes("effectedCode")) {
126
+ effectedCode = (0, import_filterEffectedCode.default)(reports, dependenceJson);
127
+ }
128
+ import_perf_hooks.performance.mark("stage 10");
129
+ import_utils.logger.info(`stage 9 --> stage 10 耗时: ${import_perf_hooks.performance.measure("stage 9 --> stage 10", "stage 9", "stage 10").duration}ms`);
130
+ import_utils.logger.info(`total 耗时: ${import_perf_hooks.performance.measure("stage 0 --> stage 10", "stage 0", "stage 10").duration}ms`);
83
131
  }
132
+ return {
133
+ reports,
134
+ dependenceJson,
135
+ effectedCode,
136
+ upstreamDependenceJson,
137
+ repoType,
138
+ message: ""
139
+ };
84
140
  } catch (error) {
85
141
  import_utils.logger.error(error);
142
+ return {
143
+ effectedCode,
144
+ upstreamDependenceJson,
145
+ repoType: "",
146
+ message: error.message
147
+ };
86
148
  } finally {
87
149
  (0, import_utils.rimraf)((0, import_path.join)(process.cwd(), today), () => {
88
150
  import_utils.logger.info("临时目录已删除");
@@ -99,45 +161,34 @@ async function gitDiffTool(arg) {
99
161
  await import_utils.execa.execa(`mkdir -p ${today}`, { shell: true });
100
162
  import_utils.logger.info("临时目录建立完成");
101
163
  try {
102
- import_utils.logger.ready(`准备clone 源代码到临时目录下的 ${import_constants.TARGET} 文件夹`);
164
+ import_utils.logger.ready(`准备clone 源代码 分支:${branchName} 到临时目录下的 ${import_constants.TARGET} 文件夹`);
165
+ await (0, import_gitUtil.cloneRepoWithBranchAndDefault)(gitUrl, branchName, (0, import_path.join)(process.cwd(), today, import_constants.TARGET));
103
166
  let stderr, failed;
104
- ({ stderr, failed } = await import_utils.execa.execa(`git clone ${gitUrl} ${today}/${import_constants.TARGET}`, { shell: true }));
105
- (0, import_handleExecaError.handleExecaError)({ failed, stderr });
106
167
  import_utils.logger.info("源代码clone完成");
107
168
  import_utils.logger.wait("检测项目类型");
108
169
  const repoType = await (0, import_getRepoSupportFlag.getRepoType)((0, import_path.join)(process.cwd(), today, import_constants.TARGET, "package.json"));
109
170
  import_utils.logger.info(`项目类型为: ${repoType}`);
110
- if (!repoType) {
171
+ if (!(0, import_getRepoSupportFlag.isRepoTypeSupported)(repoType)) {
111
172
  import_utils.logger.error("该项目不支持检测");
112
173
  (0, import_utils.rimraf)((0, import_path.join)(process.cwd(), today), () => {
113
174
  import_utils.logger.info("临时目录已删除");
114
175
  });
115
176
  return;
116
177
  }
117
- import_utils.logger.ready(`准备clone 源代码到临时目录下的 ${import_constants.SOURCE} 文件夹`);
118
- ({ stderr, failed } = await import_utils.execa.execa(`git clone ${gitUrl} ${today}/${import_constants.SOURCE}`, { shell: true }));
119
- (0, import_handleExecaError.handleExecaError)({ failed, stderr });
120
- import_utils.logger.info("源代码clone完成");
121
- if (baseBranch !== "master") {
122
- import_utils.logger.ready("准备切换到基准分支");
123
- ({ stderr, failed } = await import_utils.execa.execa(`cd ${today}/${import_constants.SOURCE} && git fetch origin ${baseBranch}:${baseBranch} && git checkout ${baseBranch}`, { shell: true }));
124
- (0, import_handleExecaError.handleExecaError)({ failed, stderr });
125
- import_utils.logger.info("源代码切换到基准分支完成");
126
- }
127
- import_utils.logger.ready("准备切换到目标分支");
128
- ({ stderr, failed } = await import_utils.execa.execa(`cd ${today}/${import_constants.TARGET} && git fetch origin ${branchName}:${branchName} && git checkout ${branchName}`, { shell: true }));
129
- (0, import_handleExecaError.handleExecaError)({ failed, stderr });
130
- import_utils.logger.info("分支切换完成");
178
+ import_utils.logger.ready(`准备clone 源代码 分支:master 到临时目录下的 ${import_constants.SOURCE} 文件夹`);
179
+ await (0, import_gitUtil.cloneRepoWithBranchAndDefault)(gitUrl, "master", (0, import_path.join)(process.cwd(), today, import_constants.SOURCE));
180
+ import_utils.logger.info(`分支 ${branchName} 代码 clone 完成`);
131
181
  import_utils.logger.ready("准备生成git_diff.txt文件");
132
182
  ({ stderr, failed } = await import_utils.execa.execa(`cd ${today}/${import_constants.TARGET} && git diff ${baseBranch}..${branchName} --unified=0 --output=${import__.gitDiffFileName}`, { shell: true }));
133
183
  (0, import_handleExecaError.handleExecaError)({ failed, stderr });
134
184
  import_utils.logger.info("git_diff.txt文件生成完成");
135
185
  if (repoType === "umi") {
136
- const { madgeResult, shellExeResult, parsedAlias } = await (0, import_umi4ProjectUtil.umi4SetUp)({ targetDirPath: (0, import_path.join)(process.cwd(), today, import_constants.TARGET) });
186
+ const { madgeResult, shellExeResult, parsedAlias } = await (0, import_umi4ProjectUtil.umi4SetUp)({ targetDirPath: (0, import_path.join)(process.cwd(), today, import_constants.TARGET), invokeType: "local" });
137
187
  ({ stderr, failed } = shellExeResult);
138
188
  (0, import_handleExecaError.handleExecaError)({ failed, stderr });
139
- return await (0, import_generateGitDiffReport.generateGitDiffReport)({ madgeResult, parsedAlias, targetDirPath: (0, import_path.join)(process.cwd(), today, import_constants.TARGET), generateFile });
140
- } else if (repoType === "vue") {
189
+ const reports = await (0, import_generateGitDiffReport.generateGitDiffReport)({ madgeResult, parsedAlias, targetDirPath: (0, import_path.join)(process.cwd(), today, import_constants.TARGET), generateFile });
190
+ return reports;
191
+ } else if (repoType === "vue2") {
141
192
  const { madgeResult, shellExeResult, parsedAlias } = await (0, import_vueProjectUtil.vueSetUp)({ targetDir: `${today}/${import_constants.TARGET}` });
142
193
  ({ stderr, failed } = shellExeResult);
143
194
  (0, import_handleExecaError.handleExecaError)({ failed, stderr });
@@ -6,3 +6,7 @@
6
6
  * @returns {Promise<string>} 克隆目录路径
7
7
  */
8
8
  export declare function cloneRepoWithBranchAndDefault(repoUrl: string, targetBranch: string, targetDir: string): Promise<string>;
9
+ /**
10
+ * 执行 baseBranch 和 targetBranch 的 diff
11
+ */
12
+ export declare function execGitDiff(targetDir: string, baseBranch: string, targetBranch: string): Promise<any>;
@@ -19,9 +19,11 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
19
19
  // src/util/shared/gitUtil.ts
20
20
  var gitUtil_exports = {};
21
21
  __export(gitUtil_exports, {
22
- cloneRepoWithBranchAndDefault: () => cloneRepoWithBranchAndDefault
22
+ cloneRepoWithBranchAndDefault: () => cloneRepoWithBranchAndDefault,
23
+ execGitDiff: () => execGitDiff
23
24
  });
24
25
  module.exports = __toCommonJS(gitUtil_exports);
26
+ var import__ = require("../../index");
25
27
  var simpleGit = require("simple-git");
26
28
  async function cloneRepoWithBranchAndDefault(repoUrl, targetBranch, targetDir) {
27
29
  try {
@@ -45,7 +47,21 @@ async function cloneRepoWithBranchAndDefault(repoUrl, targetBranch, targetDir) {
45
47
  throw error;
46
48
  }
47
49
  }
50
+ async function execGitDiff(targetDir, baseBranch, targetBranch) {
51
+ try {
52
+ const repoGit = simpleGit(targetDir);
53
+ await repoGit.checkout(targetBranch);
54
+ await repoGit.pull("origin", targetBranch);
55
+ const diffFiles = await repoGit.diffSummary([baseBranch, "--unified=0", `--output=${import__.gitDiffFileName}`]);
56
+ console.log(`${targetBranch} 与 ${baseBranch} 的差异:`, diffFiles);
57
+ return diffFiles;
58
+ } catch (error) {
59
+ console.error(`获取差异失败:${error.message}`);
60
+ throw error;
61
+ }
62
+ }
48
63
  // Annotate the CommonJS export names for ESM import in node:
49
64
  0 && (module.exports = {
50
- cloneRepoWithBranchAndDefault
65
+ cloneRepoWithBranchAndDefault,
66
+ execGitDiff
51
67
  });
@@ -1,6 +1,7 @@
1
1
  import { execa } from "@umijs/utils";
2
- export declare function umi4SetUp({ targetDirPath }: {
2
+ export declare function umi4SetUp({ targetDirPath, invokeType }: {
3
3
  targetDirPath: string;
4
+ invokeType: 'local' | 'remote';
4
5
  }): Promise<{
5
6
  shellExeResult: execa.ExecaReturnValue<string>;
6
7
  madgeResult: import("../report_util/getMadgeInstance").IMadgeInstance;
@@ -35,14 +35,12 @@ var userAliasGetter = (cwd, appData) => {
35
35
  "@umijs/max": "@@/exports"
36
36
  };
37
37
  };
38
- async function umi4SetUp({ targetDirPath }) {
39
- import_utils.logger.info(`正在删除 yarn.lock 文件...`);
40
- const yarnLockPath = (0, import_path.join)(targetDirPath, "yarn.lock");
41
- if ((0, import_fs.existsSync)(yarnLockPath)) {
42
- await import_utils.execa.execa(`mv ${yarnLockPath} ${(0, import_path.join)(targetDirPath, "yarn.lock.bak")}`, { shell: true });
43
- }
44
- import_utils.logger.info(`正在安装 @umijs/max 并执行 setup 脚本...`);
45
- const shellExeResult = await import_utils.execa.execa(`cd ${targetDirPath} && npm uninstall @umijs/max && npm install @umijs/max && npx max setup`, { shell: true });
38
+ async function getUmiInvokeResult(targetDirPath, invokeType) {
39
+ return await import_utils.execa.execa(`cd ${targetDirPath} && npx max setup`, { shell: true });
40
+ }
41
+ async function umi4SetUp({ targetDirPath, invokeType }) {
42
+ import_utils.logger.info(`正在执行 setup 脚本...`);
43
+ const shellExeResult = await getUmiInvokeResult(targetDirPath, invokeType);
46
44
  const tsconfig = await import_utils.tsconfigPaths.loadConfig(targetDirPath);
47
45
  let appData = { config: null };
48
46
  try {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "js-code-detector",
3
- "version": "0.0.43",
3
+ "version": "0.0.47",
4
4
  "description": "",
5
5
  "main": "dist/cjs/index.js",
6
6
  "types": "dist/cjs/index.d.ts",
@@ -31,7 +31,8 @@
31
31
  "@types/crypto-js": "^4.2.2",
32
32
  "@types/lodash": "^4.17.20",
33
33
  "@types/madge": "^5.0.3",
34
- "father": "^4.6.3"
34
+ "father": "^4.6.3",
35
+ "tsx": "^4.20.6"
35
36
  },
36
37
  "dependencies": {
37
38
  "@babel/parser": "^7.28.3",
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- require('../dist/cjs/index').getEslintCheckResult();
@@ -1,15 +0,0 @@
1
- #!/bin/sh
2
- time=$(date "+%Y%-m%d%H%M%S")
3
- mkdir -p $time
4
- cd $time
5
-
6
- git clone $1 target
7
- cd target
8
- yarn install
9
-
10
- git fetch origin $2:$2
11
- git checkout $2
12
-
13
- git diff master..$2 --unified=0 --output=git_diff.txt
14
- cd ..
15
- git clone $1 source