@anren-utils/mcp-audit 1.0.0
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.
- package/.editorconfig +13 -0
- package/dist/audit/auditUtils.d.ts +12 -0
- package/dist/audit/auditUtils.d.ts.map +1 -0
- package/dist/audit/auditUtils.js +22 -0
- package/dist/audit/auditUtils.js.map +1 -0
- package/dist/audit/currentAudit.d.ts +53 -0
- package/dist/audit/currentAudit.d.ts.map +1 -0
- package/dist/audit/currentAudit.js +54 -0
- package/dist/audit/currentAudit.js.map +1 -0
- package/dist/audit/getDepChain.d.ts +16 -0
- package/dist/audit/getDepChain.d.ts.map +1 -0
- package/dist/audit/getDepChain.js +60 -0
- package/dist/audit/getDepChain.js.map +1 -0
- package/dist/audit/index.d.ts +11 -0
- package/dist/audit/index.d.ts.map +1 -0
- package/dist/audit/index.js +64 -0
- package/dist/audit/index.js.map +1 -0
- package/dist/audit/normalizeAuditResult.d.ts +13 -0
- package/dist/audit/normalizeAuditResult.d.ts.map +1 -0
- package/dist/audit/normalizeAuditResult.js +81 -0
- package/dist/audit/normalizeAuditResult.js.map +1 -0
- package/dist/audit/remoteAudit.d.ts +3 -0
- package/dist/audit/remoteAudit.d.ts.map +1 -0
- package/dist/audit/remoteAudit.js +24 -0
- package/dist/audit/remoteAudit.js.map +1 -0
- package/dist/generateLock/index.d.ts +17 -0
- package/dist/generateLock/index.d.ts.map +1 -0
- package/dist/generateLock/index.js +141 -0
- package/dist/generateLock/index.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +48 -0
- package/dist/index.js.map +1 -0
- package/dist/mcpServer.d.ts +2 -0
- package/dist/mcpServer.d.ts.map +1 -0
- package/dist/mcpServer.js +34 -0
- package/dist/mcpServer.js.map +1 -0
- package/dist/parseProject/detectPackageManager.d.ts +8 -0
- package/dist/parseProject/detectPackageManager.d.ts.map +1 -0
- package/dist/parseProject/detectPackageManager.js +22 -0
- package/dist/parseProject/detectPackageManager.js.map +1 -0
- package/dist/parseProject/index.d.ts +11 -0
- package/dist/parseProject/index.d.ts.map +1 -0
- package/dist/parseProject/index.js +20 -0
- package/dist/parseProject/index.js.map +1 -0
- package/dist/parseProject/parseLocalProject.d.ts +17 -0
- package/dist/parseProject/parseLocalProject.d.ts.map +1 -0
- package/dist/parseProject/parseLocalProject.js +28 -0
- package/dist/parseProject/parseLocalProject.js.map +1 -0
- package/dist/parseProject/parseLocalWorkspace.d.ts +2 -0
- package/dist/parseProject/parseLocalWorkspace.d.ts.map +1 -0
- package/dist/parseProject/parseLocalWorkspace.js +2 -0
- package/dist/parseProject/parseLocalWorkspace.js.map +1 -0
- package/dist/parseProject/parseRemoteProject.d.ts +41 -0
- package/dist/parseProject/parseRemoteProject.d.ts.map +1 -0
- package/dist/parseProject/parseRemoteProject.js +180 -0
- package/dist/parseProject/parseRemoteProject.js.map +1 -0
- package/dist/parseProject/parseRemoteWorkspace.d.ts +2 -0
- package/dist/parseProject/parseRemoteWorkspace.d.ts.map +1 -0
- package/dist/parseProject/parseRemoteWorkspace.js +2 -0
- package/dist/parseProject/parseRemoteWorkspace.js.map +1 -0
- package/dist/parseProject/parseWorkspace.d.ts +19 -0
- package/dist/parseProject/parseWorkspace.d.ts.map +1 -0
- package/dist/parseProject/parseWorkspace.js +140 -0
- package/dist/parseProject/parseWorkspace.js.map +1 -0
- package/dist/render/index.d.ts +9 -0
- package/dist/render/index.d.ts.map +1 -0
- package/dist/render/index.js +24 -0
- package/dist/render/index.js.map +1 -0
- package/dist/render/markdown.d.ts +12 -0
- package/dist/render/markdown.d.ts.map +1 -0
- package/dist/render/markdown.js +16 -0
- package/dist/render/markdown.js.map +1 -0
- package/dist/render/template/audit.ejs +30 -0
- package/dist/render/template/detail-item.ejs +32 -0
- package/dist/render/template/detail.ejs +7 -0
- package/dist/render/template/index.ejs +8 -0
- package/dist/types.d.ts +371 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/dirUtils.d.ts +11 -0
- package/dist/utils/dirUtils.d.ts.map +1 -0
- package/dist/utils/dirUtils.js +28 -0
- package/dist/utils/dirUtils.js.map +1 -0
- package/dist/utils/index.d.ts +34 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +74 -0
- package/dist/utils/index.js.map +1 -0
- package/eslint.config.js +38 -0
- package/package.json +38 -0
- package/src/audit/auditUtils.ts +24 -0
- package/src/audit/currentAudit.ts +116 -0
- package/src/audit/getDepChain.ts +71 -0
- package/src/audit/index.ts +90 -0
- package/src/audit/normalizeAuditResult.ts +99 -0
- package/src/audit/remoteAudit.ts +26 -0
- package/src/generateLock/index.ts +203 -0
- package/src/index.ts +48 -0
- package/src/mcpServer.ts +43 -0
- package/src/parseProject/detectPackageManager.ts +24 -0
- package/src/parseProject/index.ts +20 -0
- package/src/parseProject/parseLocalProject.ts +39 -0
- package/src/parseProject/parseRemoteProject.ts +225 -0
- package/src/parseProject/parseWorkspace.ts +202 -0
- package/src/render/index.ts +30 -0
- package/src/render/markdown.ts +29 -0
- package/src/render/template/audit.ejs +30 -0
- package/src/render/template/detail-item.ejs +32 -0
- package/src/render/template/detail.ejs +7 -0
- package/src/render/template/index.ejs +8 -0
- package/src/types.ts +429 -0
- package/src/utils/dirUtils.ts +31 -0
- package/src/utils/index.ts +88 -0
- package/tsconfig.json +42 -0
package/.editorconfig
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { AuditResult } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* @Desc: 执行npm audit命令,返回审计结果
|
|
4
|
+
* @param {string} workDir
|
|
5
|
+
*/
|
|
6
|
+
export declare function npmAudit(workDir: string): Promise<AuditResult>;
|
|
7
|
+
/**
|
|
8
|
+
* @Desc: 执行pnpm audit命令,返回审计结果
|
|
9
|
+
* @param {string} workDir
|
|
10
|
+
*/
|
|
11
|
+
export declare function pnpmAudit(workDir: string): Promise<AuditResult>;
|
|
12
|
+
//# sourceMappingURL=auditUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auditUtils.d.ts","sourceRoot":"","sources":["../../src/audit/auditUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,MAAM,wBAK7C;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,wBAK9C"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { runCommand } from "../utils/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* @Desc: 执行npm audit命令,返回审计结果
|
|
4
|
+
* @param {string} workDir
|
|
5
|
+
*/
|
|
6
|
+
export async function npmAudit(workDir) {
|
|
7
|
+
const cmd = `npm audit --json`;
|
|
8
|
+
const jsonResult = await runCommand(cmd, workDir); // 在工作目录中执行命令
|
|
9
|
+
const auditData = JSON.parse(jsonResult);
|
|
10
|
+
return auditData;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* @Desc: 执行pnpm audit命令,返回审计结果
|
|
14
|
+
* @param {string} workDir
|
|
15
|
+
*/
|
|
16
|
+
export async function pnpmAudit(workDir) {
|
|
17
|
+
const cmd = `pnpm audit --json`;
|
|
18
|
+
const jsonResult = await runCommand(cmd, workDir); // 在工作目录中执行命令
|
|
19
|
+
const auditData = JSON.parse(jsonResult);
|
|
20
|
+
return auditData;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=auditUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auditUtils.js","sourceRoot":"","sources":["../../src/audit/auditUtils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAe;IAC5C,MAAM,GAAG,GAAG,kBAAkB,CAAC;IAC/B,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa;IAChE,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAgB,CAAC;IACxD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAe;IAC7C,MAAM,GAAG,GAAG,mBAAmB,CAAC;IAChC,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa;IAChE,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAgB,CAAC;IACxD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { AuditSeverity } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* 单个漏洞问题的详细信息
|
|
4
|
+
*/
|
|
5
|
+
interface Problem {
|
|
6
|
+
/** 漏洞 ID (Advisory ID) */
|
|
7
|
+
source: number;
|
|
8
|
+
/** 包名 */
|
|
9
|
+
name: string;
|
|
10
|
+
/** 依赖名 */
|
|
11
|
+
dependency: string;
|
|
12
|
+
/** 漏洞标题 */
|
|
13
|
+
title: string;
|
|
14
|
+
/** 漏洞详情 URL */
|
|
15
|
+
url: string;
|
|
16
|
+
/** 严重程度 */
|
|
17
|
+
severity: AuditSeverity;
|
|
18
|
+
/** CWE 列表 */
|
|
19
|
+
cwe: string[];
|
|
20
|
+
/** CVSS 评分数据 */
|
|
21
|
+
cvss: {
|
|
22
|
+
score: number;
|
|
23
|
+
vectorString: string;
|
|
24
|
+
};
|
|
25
|
+
/** 受影响的版本范围 */
|
|
26
|
+
range: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* currentAudit 函数返回的最终结果对象
|
|
30
|
+
*/
|
|
31
|
+
interface CurrentAuditResult {
|
|
32
|
+
/** 包名 */
|
|
33
|
+
name: string;
|
|
34
|
+
/** 版本/范围 */
|
|
35
|
+
range: string;
|
|
36
|
+
/** 节点路径,当前工程通常为根目录 '.' */
|
|
37
|
+
nodes: string[];
|
|
38
|
+
/** 依赖链,当前工程通常为空 */
|
|
39
|
+
depChains: any[];
|
|
40
|
+
/** 检测到的所有漏洞问题列表 */
|
|
41
|
+
problems: Problem[];
|
|
42
|
+
/** 当前包的最高严重程度 */
|
|
43
|
+
severity: AuditSeverity;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* @Desc: 添加当前工程的审计结果
|
|
47
|
+
* @return {*}
|
|
48
|
+
* @param {string} name
|
|
49
|
+
* @param {string} version
|
|
50
|
+
*/
|
|
51
|
+
export declare function currentAudit(name: string, version: string): Promise<CurrentAuditResult | null>;
|
|
52
|
+
export {};
|
|
53
|
+
//# sourceMappingURL=currentAudit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"currentAudit.d.ts","sourceRoot":"","sources":["../../src/audit/currentAudit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD;;GAEG;AACH,UAAU,OAAO;IACf,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAC;IAEf,SAAS;IACT,IAAI,EAAE,MAAM,CAAC;IAEb,UAAU;IACV,UAAU,EAAE,MAAM,CAAC;IAEnB,WAAW;IACX,KAAK,EAAE,MAAM,CAAC;IAEd,eAAe;IACf,GAAG,EAAE,MAAM,CAAC;IAEZ,WAAW;IACX,QAAQ,EAAE,aAAa,CAAC;IAExB,aAAa;IACb,GAAG,EAAE,MAAM,EAAE,CAAC;IAEd,gBAAgB;IAChB,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IAEF,eAAe;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,UAAU,kBAAkB;IAC1B,SAAS;IACT,IAAI,EAAE,MAAM,CAAC;IAEb,YAAY;IACZ,KAAK,EAAE,MAAM,CAAC;IAEd,0BAA0B;IAC1B,KAAK,EAAE,MAAM,EAAE,CAAC;IAEhB,mBAAmB;IACnB,SAAS,EAAE,GAAG,EAAE,CAAC;IAEjB,mBAAmB;IACnB,QAAQ,EAAE,OAAO,EAAE,CAAC;IAEpB,iBAAiB;IACjB,QAAQ,EAAE,aAAa,CAAC;CACzB;AAUD;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,sCAwC/D"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { remoteAudit } from "./remoteAudit.js";
|
|
2
|
+
const severityLevelsMap = {
|
|
3
|
+
info: 0,
|
|
4
|
+
low: 1,
|
|
5
|
+
moderate: 2,
|
|
6
|
+
high: 3,
|
|
7
|
+
critical: 4,
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* @Desc: 添加当前工程的审计结果
|
|
11
|
+
* @return {*}
|
|
12
|
+
* @param {string} name
|
|
13
|
+
* @param {string} version
|
|
14
|
+
*/
|
|
15
|
+
export async function currentAudit(name, version) {
|
|
16
|
+
// 1. 调用 remoteAudit 函数获取审计结果
|
|
17
|
+
const auditResult = await remoteAudit(name, version);
|
|
18
|
+
// 2. 规格化审计结果
|
|
19
|
+
if (!auditResult.advisories ||
|
|
20
|
+
Object.keys(auditResult.advisories).length === 0) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
const result = {
|
|
24
|
+
name,
|
|
25
|
+
range: version,
|
|
26
|
+
nodes: ["."],
|
|
27
|
+
depChains: [],
|
|
28
|
+
problems: [],
|
|
29
|
+
severity: "info",
|
|
30
|
+
};
|
|
31
|
+
const advisories = Object.values(auditResult.advisories);
|
|
32
|
+
let maxSeverity = "info";
|
|
33
|
+
result.problems = advisories.map((advisory) => {
|
|
34
|
+
const problem = {
|
|
35
|
+
source: advisory.id,
|
|
36
|
+
name,
|
|
37
|
+
dependency: name,
|
|
38
|
+
title: advisory.title,
|
|
39
|
+
url: advisory.url,
|
|
40
|
+
severity: advisory.severity,
|
|
41
|
+
cwe: advisory.cwe,
|
|
42
|
+
cvss: advisory.cvss,
|
|
43
|
+
range: advisory.vulnerable_versions,
|
|
44
|
+
};
|
|
45
|
+
// 更新最大严重性
|
|
46
|
+
if (severityLevelsMap[problem.severity] > severityLevelsMap[maxSeverity]) {
|
|
47
|
+
maxSeverity = problem.severity;
|
|
48
|
+
}
|
|
49
|
+
return problem;
|
|
50
|
+
});
|
|
51
|
+
result.severity = maxSeverity;
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=currentAudit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"currentAudit.js","sourceRoot":"","sources":["../../src/audit/currentAudit.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AA4D/C,MAAM,iBAAiB,GAAkC;IACvD,IAAI,EAAE,CAAC;IACP,GAAG,EAAE,CAAC;IACN,QAAQ,EAAE,CAAC;IACX,IAAI,EAAE,CAAC;IACP,QAAQ,EAAE,CAAC;CACZ,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,OAAe;IAC9D,6BAA6B;IAC7B,MAAM,WAAW,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACrD,aAAa;IACb,IACE,CAAC,WAAW,CAAC,UAAU;QACvB,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,CAAC,EAChD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAuB;QACjC,IAAI;QACJ,KAAK,EAAE,OAAO;QACd,KAAK,EAAE,CAAC,GAAG,CAAC;QACZ,SAAS,EAAE,EAAE;QACb,QAAQ,EAAE,EAAE;QACZ,QAAQ,EAAE,MAAM;KACjB,CAAC;IACF,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IACzD,IAAI,WAAW,GAAkB,MAAM,CAAC;IACxC,MAAM,CAAC,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;QAC5C,MAAM,OAAO,GAAY;YACvB,MAAM,EAAE,QAAQ,CAAC,EAAE;YACnB,IAAI;YACJ,UAAU,EAAE,IAAI;YAChB,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,GAAG,EAAE,QAAQ,CAAC,GAAG;YACjB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,GAAG,EAAE,QAAQ,CAAC,GAAG;YACjB,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,KAAK,EAAE,QAAQ,CAAC,mBAAmB;SACpC,CAAC;QACF,UAAU;QACV,IAAI,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,iBAAiB,CAAC,WAAW,CAAC,EAAE,CAAC;YACzE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,QAAQ,GAAG,WAAW,CAAC;IAC9B,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { VulnerabilityInfo } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* 图的伸缩算法,用于获取从给定节点出发的所有依赖链条
|
|
4
|
+
* 给定图结构中的一个节点,获取从该节点的依赖节点出发一直走到终点,一共走出的所有链条
|
|
5
|
+
* 注意:图结构中可能存在环,遇到环时,环所在的节点直接作为终点即可
|
|
6
|
+
* @param {VulnerabilityInfo} vulnerabilityInfo - 给定的漏洞信息
|
|
7
|
+
* @param {Record<string, VulnerabilityInfo>} vulnerabilities - 所有漏洞信息的映射表,键为漏洞名称,值为漏洞信息
|
|
8
|
+
* @returns {Array<string[][]>} 返回所有依赖链,每个链是一个字符串数组,每个字符串是一个漏洞名称
|
|
9
|
+
* 返回结果示例:"depChains": [["@vue/cli-plugin-babel","@vue/cli-service","@intervolga/optimize-cssnano-plugin","postcss"],[
|
|
10
|
+
"@vue/cli-plugin-router",
|
|
11
|
+
"@vue/cli-service",
|
|
12
|
+
"@intervolga/optimize-cssnano-plugin",
|
|
13
|
+
"postcss"]]
|
|
14
|
+
*/
|
|
15
|
+
export declare function getDepChains(vulnerabilityInfo: VulnerabilityInfo, vulnerabilities: Record<string, VulnerabilityInfo>): string[][];
|
|
16
|
+
//# sourceMappingURL=getDepChain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getDepChain.d.ts","sourceRoot":"","sources":["../../src/audit/getDepChain.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAC1B,iBAAiB,EAAE,iBAAiB,EACpC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,cAqDnD"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 图的伸缩算法,用于获取从给定节点出发的所有依赖链条
|
|
3
|
+
* 给定图结构中的一个节点,获取从该节点的依赖节点出发一直走到终点,一共走出的所有链条
|
|
4
|
+
* 注意:图结构中可能存在环,遇到环时,环所在的节点直接作为终点即可
|
|
5
|
+
* @param {VulnerabilityInfo} vulnerabilityInfo - 给定的漏洞信息
|
|
6
|
+
* @param {Record<string, VulnerabilityInfo>} vulnerabilities - 所有漏洞信息的映射表,键为漏洞名称,值为漏洞信息
|
|
7
|
+
* @returns {Array<string[][]>} 返回所有依赖链,每个链是一个字符串数组,每个字符串是一个漏洞名称
|
|
8
|
+
* 返回结果示例:"depChains": [["@vue/cli-plugin-babel","@vue/cli-service","@intervolga/optimize-cssnano-plugin","postcss"],[
|
|
9
|
+
"@vue/cli-plugin-router",
|
|
10
|
+
"@vue/cli-service",
|
|
11
|
+
"@intervolga/optimize-cssnano-plugin",
|
|
12
|
+
"postcss"]]
|
|
13
|
+
*/
|
|
14
|
+
export function getDepChains(vulnerabilityInfo, vulnerabilities) {
|
|
15
|
+
// 存储所有找到的依赖链(存储最终结果:所有找到的完整路径)
|
|
16
|
+
const chains = [];
|
|
17
|
+
// 当前DFS路径(用于检测环)(当前正在探索的路径栈(用于记录路径和检测环))
|
|
18
|
+
const currentPath = [];
|
|
19
|
+
/**
|
|
20
|
+
* 深度优先搜索函数
|
|
21
|
+
* @param {VulnerabilityInfo} currentVulnerabilityInfo - 当前处理的漏洞信息
|
|
22
|
+
*/
|
|
23
|
+
function dfs(currentVulnerabilityInfo) {
|
|
24
|
+
// 1. 健壮性检查
|
|
25
|
+
if (!currentVulnerabilityInfo)
|
|
26
|
+
return;
|
|
27
|
+
// 2. 环检测
|
|
28
|
+
// 检查是否形成环(当前节点已在路径中)
|
|
29
|
+
// 如果当前节点的名字已经存在于当前路径中,说明我们遇到了一个环(A->B->C->A)。
|
|
30
|
+
// 将当前路径记录下来并停止该分支的搜索。
|
|
31
|
+
if (currentPath.includes(currentVulnerabilityInfo.name)) {
|
|
32
|
+
chains.push([...currentPath]); // 注意:这里并没有把重复的节点再次加入,而是截断
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
// 3. 前进:将当前节点加入路径头部
|
|
36
|
+
// 使用 unshift 是为了让链条保持顺序:[起点, ..., 当前节点]
|
|
37
|
+
currentPath.unshift(currentVulnerabilityInfo.name);
|
|
38
|
+
// 4. 终点判断
|
|
39
|
+
// 如果没有依赖节点,说明到达终点
|
|
40
|
+
if (!currentVulnerabilityInfo.effects ||
|
|
41
|
+
currentVulnerabilityInfo.effects.length === 0) {
|
|
42
|
+
chains.push([...currentPath]);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
// 5. 递归遍历
|
|
46
|
+
// 遍历当前节点的所有依赖项,对每一个依赖项递归调用 dfs
|
|
47
|
+
for (const effect of currentVulnerabilityInfo.effects) {
|
|
48
|
+
dfs(vulnerabilities[effect]);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// 6. 回溯
|
|
52
|
+
// 当递归返回(无论是找到了终点还是遇到了环),
|
|
53
|
+
// 必须将当前节点从路径中移除,以便探索下一条可能的路径。
|
|
54
|
+
currentPath.shift();
|
|
55
|
+
}
|
|
56
|
+
// 从给定节点开始DFS
|
|
57
|
+
dfs(vulnerabilityInfo);
|
|
58
|
+
return chains;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=getDepChain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getDepChain.js","sourceRoot":"","sources":["../../src/audit/getDepChain.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,YAAY,CAC1B,iBAAoC,EACpC,eAAkD;IAElD,+BAA+B;IAC/B,MAAM,MAAM,GAAe,EAAE,CAAC;IAE9B,yCAAyC;IACzC,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC;;;OAGG;IACH,SAAS,GAAG,CAAC,wBAA4C;QACvD,WAAW;QACX,IAAI,CAAC,wBAAwB;YAAE,OAAO;QAEtC,SAAS;QACT,qBAAqB;QACrB,8CAA8C;QAC9C,sBAAsB;QACtB,IAAI,WAAW,CAAC,QAAQ,CAAC,wBAAwB,CAAC,IAAI,CAAC,EAAE,CAAC;YACxD,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,0BAA0B;YACzD,OAAO;QACT,CAAC;QAED,oBAAoB;QACpB,wCAAwC;QACxC,WAAW,CAAC,OAAO,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;QAEnD,UAAU;QACV,kBAAkB;QAClB,IACE,CAAC,wBAAwB,CAAC,OAAO;YACjC,wBAAwB,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAC7C,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,UAAU;YACV,+BAA+B;YAC/B,KAAK,MAAM,MAAM,IAAI,wBAAwB,CAAC,OAAO,EAAE,CAAC;gBACtD,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QACD,QAAQ;QACR,yBAAyB;QACzB,8BAA8B;QAC9B,WAAW,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IAED,aAAa;IACb,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAEvB,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { RemoteWorkspaceInfo } from "../parseProject/parseWorkspace.js";
|
|
2
|
+
import type { PackageJsonInfo, PackageManager } from "../types.js";
|
|
3
|
+
interface AuditOptions {
|
|
4
|
+
workDir: string;
|
|
5
|
+
packageJson: PackageJsonInfo;
|
|
6
|
+
subPackageInfos: RemoteWorkspaceInfo | null;
|
|
7
|
+
currentPackageManager: PackageManager;
|
|
8
|
+
}
|
|
9
|
+
export declare function audit(options: AuditOptions): Promise<import("./normalizeAuditResult.js").NormalizedResult>;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/audit/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAKnE,UAAU,YAAY;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,eAAe,CAAC;IAC7B,eAAe,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAC5C,qBAAqB,EAAE,cAAc,CAAC;CACvC;AAED,wBAAsB,KAAK,CAAC,OAAO,EAAE,YAAY,iEAMhD"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { join } from "path";
|
|
2
|
+
import { npmAudit, pnpmAudit } from "./auditUtils.js";
|
|
3
|
+
import { currentAudit } from "./currentAudit.js";
|
|
4
|
+
import { normalizeAuditResult } from "./normalizeAuditResult.js";
|
|
5
|
+
export async function audit(options) {
|
|
6
|
+
const { subPackageInfos } = options;
|
|
7
|
+
if (subPackageInfos?.subPackageNames) {
|
|
8
|
+
return await monorepoAudit(options);
|
|
9
|
+
}
|
|
10
|
+
return await defaultAudit(options);
|
|
11
|
+
}
|
|
12
|
+
async function defaultAudit(options) {
|
|
13
|
+
const { workDir, packageJson, currentPackageManager } = options;
|
|
14
|
+
const auditFn = currentPackageManager === "npm" ? npmAudit : pnpmAudit;
|
|
15
|
+
// 调用 npmAudit 获取审计结果
|
|
16
|
+
const auditResult = await auditFn(workDir);
|
|
17
|
+
// 规范化审计结果
|
|
18
|
+
const normalizedResult = normalizeAuditResult(auditResult);
|
|
19
|
+
// 添加当前工程的审计结果
|
|
20
|
+
const current = await currentAudit(packageJson.name, packageJson.version);
|
|
21
|
+
if (current) {
|
|
22
|
+
normalizedResult.vulnerabilities[current.severity].unshift(current);
|
|
23
|
+
}
|
|
24
|
+
// 添加汇总信息
|
|
25
|
+
normalizedResult.summary = {
|
|
26
|
+
total: Object.values(normalizedResult.vulnerabilities).reduce((sum, arr) => sum + arr.length, 0),
|
|
27
|
+
critical: normalizedResult.vulnerabilities.critical.length,
|
|
28
|
+
high: normalizedResult.vulnerabilities.high.length,
|
|
29
|
+
moderate: normalizedResult.vulnerabilities.moderate.length,
|
|
30
|
+
low: normalizedResult.vulnerabilities.low.length,
|
|
31
|
+
info: normalizedResult.vulnerabilities.info.length,
|
|
32
|
+
};
|
|
33
|
+
return normalizedResult;
|
|
34
|
+
}
|
|
35
|
+
async function monorepoAudit(options) {
|
|
36
|
+
const { workDir, packageJson, subPackageInfos, currentPackageManager } = options;
|
|
37
|
+
if (!subPackageInfos) {
|
|
38
|
+
throw new Error("monorepo工程必须包含子包信息");
|
|
39
|
+
}
|
|
40
|
+
const auditFn = currentPackageManager === "npm" ? npmAudit : pnpmAudit;
|
|
41
|
+
// 调用 npmAudit 获取审计结果
|
|
42
|
+
const auditResult = await auditFn(workDir);
|
|
43
|
+
// 得到所有子包的审计结果
|
|
44
|
+
const subPackageAuditResults = await Promise.all(subPackageInfos.subPackageNames.map((subPackageName) => auditFn(join(workDir, subPackageName))));
|
|
45
|
+
const allAuditResults = [auditResult, ...subPackageAuditResults];
|
|
46
|
+
// 规范化审计结果
|
|
47
|
+
const normalizedResult = normalizeAuditResult(allAuditResults);
|
|
48
|
+
// 添加当前工程的审计结果
|
|
49
|
+
const current = await currentAudit(packageJson.name, packageJson.version);
|
|
50
|
+
if (current) {
|
|
51
|
+
normalizedResult.vulnerabilities[current.severity].unshift(current);
|
|
52
|
+
}
|
|
53
|
+
// 添加汇总信息
|
|
54
|
+
normalizedResult.summary = {
|
|
55
|
+
total: Object.values(normalizedResult.vulnerabilities).reduce((sum, arr) => sum + arr.length, 0),
|
|
56
|
+
critical: normalizedResult.vulnerabilities.critical.length,
|
|
57
|
+
high: normalizedResult.vulnerabilities.high.length,
|
|
58
|
+
moderate: normalizedResult.vulnerabilities.moderate.length,
|
|
59
|
+
low: normalizedResult.vulnerabilities.low.length,
|
|
60
|
+
info: normalizedResult.vulnerabilities.info.length,
|
|
61
|
+
};
|
|
62
|
+
return normalizedResult;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/audit/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AASjE,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,OAAqB;IAC/C,MAAM,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC;IACpC,IAAI,eAAe,EAAE,eAAe,EAAE,CAAC;QACrC,OAAO,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,OAAqB;IAC/C,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAC;IAChE,MAAM,OAAO,GAAG,qBAAqB,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IACvE,qBAAqB;IACrB,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAE3C,UAAU;IACV,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;IAE3D,cAAc;IACd,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAC1E,IAAI,OAAO,EAAE,CAAC;QACZ,gBAAgB,CAAC,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACtE,CAAC;IACD,SAAS;IACT,gBAAgB,CAAC,OAAO,GAAG;QACzB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC,MAAM,CAC3D,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,EAC9B,CAAC,CACF;QACD,QAAQ,EAAE,gBAAgB,CAAC,eAAe,CAAC,QAAQ,CAAC,MAAM;QAC1D,IAAI,EAAE,gBAAgB,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM;QAClD,QAAQ,EAAE,gBAAgB,CAAC,eAAe,CAAC,QAAQ,CAAC,MAAM;QAC1D,GAAG,EAAE,gBAAgB,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM;QAChD,IAAI,EAAE,gBAAgB,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM;KACnD,CAAC;IACF,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,OAAqB;IAChD,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,qBAAqB,EAAE,GACpE,OAAO,CAAC;IACV,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACxC,CAAC;IACD,MAAM,OAAO,GAAG,qBAAqB,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IACvE,qBAAqB;IACrB,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,cAAc;IACd,MAAM,sBAAsB,GAAG,MAAM,OAAO,CAAC,GAAG,CAC9C,eAAe,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,EAAE,CACrD,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CACvC,CACF,CAAC;IACF,MAAM,eAAe,GAAG,CAAC,WAAW,EAAE,GAAG,sBAAsB,CAAC,CAAC;IAEjE,UAAU;IACV,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,eAAe,CAAC,CAAC;IAE/D,cAAc;IACd,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAC1E,IAAI,OAAO,EAAE,CAAC;QACZ,gBAAgB,CAAC,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACtE,CAAC;IACD,SAAS;IACT,gBAAgB,CAAC,OAAO,GAAG;QACzB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC,MAAM,CAC3D,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,EAC9B,CAAC,CACF;QACD,QAAQ,EAAE,gBAAgB,CAAC,eAAe,CAAC,QAAQ,CAAC,MAAM;QAC1D,IAAI,EAAE,gBAAgB,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM;QAClD,QAAQ,EAAE,gBAAgB,CAAC,eAAe,CAAC,QAAQ,CAAC,MAAM;QAC1D,GAAG,EAAE,gBAAgB,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM;QAChD,IAAI,EAAE,gBAAgB,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM;KACnD,CAAC;IACF,OAAO,gBAAgB,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { AuditResult, AuditSeverity, NormalizedVulnerabilityInfo } from "../types.js";
|
|
2
|
+
export interface NormalizedResult {
|
|
3
|
+
vulnerabilities: Record<AuditSeverity, NormalizedVulnerabilityInfo[]>;
|
|
4
|
+
summary?: Record<AuditSeverity | "total", number>;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* 处理 auditResult 是数组的情况,合并多个审计结果
|
|
8
|
+
* @param auditResults AuditResult 数组
|
|
9
|
+
* @returns 合并后的标准化结果
|
|
10
|
+
*/
|
|
11
|
+
export declare function normalizeAuditResults(auditResults: AuditResult[]): NormalizedResult;
|
|
12
|
+
export declare function normalizeAuditResult(auditResult: AuditResult | AuditResult[]): NormalizedResult;
|
|
13
|
+
//# sourceMappingURL=normalizeAuditResult.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalizeAuditResult.d.ts","sourceRoot":"","sources":["../../src/audit/normalizeAuditResult.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACb,2BAA2B,EAE5B,MAAM,aAAa,CAAC;AAGrB,MAAM,WAAW,gBAAgB;IAC/B,eAAe,EAAE,MAAM,CAAC,aAAa,EAAE,2BAA2B,EAAE,CAAC,CAAC;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC,aAAa,GAAG,OAAO,EAAE,MAAM,CAAC,CAAC;CACnD;AA8CD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,WAAW,EAAE,GAuB1D,gBAAgB,CACtB;AAED,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,WAAW,GAAG,WAAW,EAAE,oBAU5E"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { getDepChains } from "./getDepChain.js";
|
|
2
|
+
function _normalizeVulnerabilities(auditResult) {
|
|
3
|
+
// 漏洞级别分类组别,用于后续统计漏洞数量
|
|
4
|
+
const result = {
|
|
5
|
+
critical: [],
|
|
6
|
+
high: [],
|
|
7
|
+
moderate: [],
|
|
8
|
+
low: [],
|
|
9
|
+
info: [],
|
|
10
|
+
};
|
|
11
|
+
for (const key in auditResult.vulnerabilities) {
|
|
12
|
+
// 获取当前漏洞的包信息
|
|
13
|
+
const packageInfo = auditResult.vulnerabilities[key];
|
|
14
|
+
const normalizedPackage = _normalizePackage(packageInfo);
|
|
15
|
+
if (normalizedPackage) {
|
|
16
|
+
result[normalizedPackage.severity].push(normalizedPackage);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return result;
|
|
20
|
+
function _normalizePackage(packageInfo) {
|
|
21
|
+
if (!packageInfo) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
const { via = [] } = packageInfo;
|
|
25
|
+
// 只需要记录自身有漏洞的包,而不是依赖的包
|
|
26
|
+
const validVia = via.filter((it) => typeof it === "object");
|
|
27
|
+
if (validVia.length === 0) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
// 规格化漏洞信息
|
|
31
|
+
const info = {
|
|
32
|
+
name: packageInfo.name,
|
|
33
|
+
severity: packageInfo.severity,
|
|
34
|
+
problems: validVia,
|
|
35
|
+
nodes: packageInfo.nodes || [],
|
|
36
|
+
};
|
|
37
|
+
info.depChains = getDepChains(packageInfo, auditResult.vulnerabilities);
|
|
38
|
+
// info.depChains = info.depChains.filter(
|
|
39
|
+
// (chain) => !isInvalidChain(chain, packageInfo.name)
|
|
40
|
+
// );
|
|
41
|
+
return info;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 处理 auditResult 是数组的情况,合并多个审计结果
|
|
46
|
+
* @param auditResults AuditResult 数组
|
|
47
|
+
* @returns 合并后的标准化结果
|
|
48
|
+
*/
|
|
49
|
+
export function normalizeAuditResults(auditResults) {
|
|
50
|
+
// 初始化结果对象
|
|
51
|
+
const result = {
|
|
52
|
+
critical: [],
|
|
53
|
+
high: [],
|
|
54
|
+
moderate: [],
|
|
55
|
+
low: [],
|
|
56
|
+
info: [],
|
|
57
|
+
};
|
|
58
|
+
// 遍历所有审计结果
|
|
59
|
+
for (const auditResult of auditResults) {
|
|
60
|
+
const normalizedResult = _normalizeVulnerabilities(auditResult);
|
|
61
|
+
// 合并每个级别的漏洞
|
|
62
|
+
for (const severity in normalizedResult) {
|
|
63
|
+
const vulnerabilities = normalizedResult[severity];
|
|
64
|
+
result[severity].push(...vulnerabilities);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
vulnerabilities: result,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
export function normalizeAuditResult(auditResult) {
|
|
72
|
+
if (Array.isArray(auditResult)) {
|
|
73
|
+
return {
|
|
74
|
+
vulnerabilities: normalizeAuditResults(auditResult).vulnerabilities,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
vulnerabilities: _normalizeVulnerabilities(auditResult),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=normalizeAuditResult.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalizeAuditResult.js","sourceRoot":"","sources":["../../src/audit/normalizeAuditResult.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAOhD,SAAS,yBAAyB,CAAC,WAAwB;IACzD,sBAAsB;IACtB,MAAM,MAAM,GAAyD;QACnE,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,EAAE;QACR,QAAQ,EAAE,EAAE;QACZ,GAAG,EAAE,EAAE;QACP,IAAI,EAAE,EAAE;KACT,CAAC;IACF,KAAK,MAAM,GAAG,IAAI,WAAW,CAAC,eAAe,EAAE,CAAC;QAC9C,aAAa;QACb,MAAM,WAAW,GAAG,WAAW,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QACrD,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;QACzD,IAAI,iBAAiB,EAAE,CAAC;YACtB,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;IAEd,SAAS,iBAAiB,CAAC,WAA+B;QACxD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,WAAW,CAAC;QACjC,uBAAuB;QACvB,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC;QAC5D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,UAAU;QACV,MAAM,IAAI,GAAgC;YACxC,IAAI,EAAE,WAAW,CAAC,IAAI;YACtB,QAAQ,EAAE,WAAW,CAAC,QAAQ;YAC9B,QAAQ,EAAE,QAAQ;YAClB,KAAK,EAAE,WAAW,CAAC,KAAK,IAAI,EAAE;SAC/B,CAAC;QACF,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC,WAAW,EAAE,WAAW,CAAC,eAAe,CAAC,CAAC;QACxE,0CAA0C;QAC1C,wDAAwD;QACxD,KAAK;QACL,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,YAA2B;IAC/D,UAAU;IACV,MAAM,MAAM,GAAyD;QACnE,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,EAAE;QACR,QAAQ,EAAE,EAAE;QACZ,GAAG,EAAE,EAAE;QACP,IAAI,EAAE,EAAE;KACT,CAAC;IAEF,WAAW;IACX,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;QACvC,MAAM,gBAAgB,GAAG,yBAAyB,CAAC,WAAW,CAAC,CAAC;QAEhE,YAAY;QACZ,KAAK,MAAM,QAAQ,IAAI,gBAAgB,EAAE,CAAC;YACxC,MAAM,eAAe,GAAG,gBAAgB,CAAC,QAAyB,CAAC,CAAC;YACpE,MAAM,CAAC,QAAyB,CAAC,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,OAAO;QACL,eAAe,EAAE,MAAM;KACJ,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,WAAwC;IAC3E,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,OAAO;YACL,eAAe,EAAE,qBAAqB,CAAC,WAAW,CAAC,CAAC,eAAe;SAChD,CAAC;IACxB,CAAC;IAED,OAAO;QACL,eAAe,EAAE,yBAAyB,CAAC,WAAW,CAAC;KACpC,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remoteAudit.d.ts","sourceRoot":"","sources":["../../src/audit/remoteAudit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAIpD,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,6BAqB5E"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
const URL = "https://registry.npmjs.org/-/npm/v1/security/audits";
|
|
2
|
+
export async function remoteAudit(packageName, packageVersion) {
|
|
3
|
+
const body = {
|
|
4
|
+
name: "example-audit", // 项目名字随便写
|
|
5
|
+
version: "1.0.0", // 项目的版本,随便写
|
|
6
|
+
requires: {
|
|
7
|
+
[packageName]: packageVersion,
|
|
8
|
+
},
|
|
9
|
+
dependencies: {
|
|
10
|
+
[packageName]: {
|
|
11
|
+
version: packageVersion,
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
const resp = await fetch(URL, {
|
|
16
|
+
method: "POST",
|
|
17
|
+
headers: {
|
|
18
|
+
"Content-Type": "application/json",
|
|
19
|
+
},
|
|
20
|
+
body: JSON.stringify(body),
|
|
21
|
+
});
|
|
22
|
+
return (await resp.json());
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=remoteAudit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remoteAudit.js","sourceRoot":"","sources":["../../src/audit/remoteAudit.ts"],"names":[],"mappings":"AAEA,MAAM,GAAG,GAAG,qDAAqD,CAAC;AAElE,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,WAAmB,EAAE,cAAsB;IAC3E,MAAM,IAAI,GAAG;QACX,IAAI,EAAE,eAAe,EAAE,UAAU;QACjC,OAAO,EAAE,OAAO,EAAE,YAAY;QAC9B,QAAQ,EAAE;YACR,CAAC,WAAW,CAAC,EAAE,cAAc;SAC9B;QACD,YAAY,EAAE;YACZ,CAAC,WAAW,CAAC,EAAE;gBACb,OAAO,EAAE,cAAc;aACxB;SACF;KACF,CAAC;IACF,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC5B,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAC;IACH,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAqB,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { PackageJsonInfo, PackageManager } from "../types.js";
|
|
2
|
+
import type { RemoteWorkspaceInfo } from "../parseProject/parseWorkspace.js";
|
|
3
|
+
interface GenerateLockOptions {
|
|
4
|
+
workDir: string;
|
|
5
|
+
packageJson: PackageJsonInfo;
|
|
6
|
+
subPackageInfos: RemoteWorkspaceInfo | null;
|
|
7
|
+
projectRoot: string;
|
|
8
|
+
currentPackageManager: PackageManager;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* @Desc: 向工作目录添加package.json文件,然后生成lock文件
|
|
12
|
+
* @param {string} workDir 工作目录
|
|
13
|
+
* @param {Object} packageJson package.json文件内容
|
|
14
|
+
*/
|
|
15
|
+
export declare function generateLock(options: GenerateLockOptions): Promise<void>;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/generateLock/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAE7E,UAAU,mBAAmB;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,eAAe,CAAC;IAC7B,eAAe,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,qBAAqB,EAAE,cAAc,CAAC;CACvC;AAkLD;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,mBAAmB,iBAO9D"}
|