@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/src/types.ts
ADDED
|
@@ -0,0 +1,429 @@
|
|
|
1
|
+
export interface PackageJsonInfo {
|
|
2
|
+
name: string;
|
|
3
|
+
version: string;
|
|
4
|
+
workspaces?: [];
|
|
5
|
+
[x: string]: any;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
/** 包管理器类型 */
|
|
9
|
+
export type PackageManager = "npm" | "pnpm" | "yarn";
|
|
10
|
+
|
|
11
|
+
export type AuditSeverity =
|
|
12
|
+
| "low" // 低危
|
|
13
|
+
| "moderate" // 中危
|
|
14
|
+
| "high" // 高危
|
|
15
|
+
| "critical" // 严重
|
|
16
|
+
| "info"; // 信息级
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* 表示漏洞来源的详细对象
|
|
20
|
+
* 当 npm audit 输出详细信息时,via 字段会包含此类对象的数组
|
|
21
|
+
*/
|
|
22
|
+
export interface VulnerabilitySourceDetail {
|
|
23
|
+
/**
|
|
24
|
+
* 漏洞在 npm 安全数据库中的唯一 ID
|
|
25
|
+
* 通常是一个数字,例如 1089234
|
|
26
|
+
*/
|
|
27
|
+
source: number;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* 存在漏洞的包名
|
|
31
|
+
* 这是真正引入安全问题的那个具体的包
|
|
32
|
+
*/
|
|
33
|
+
name: string;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* 依赖名称
|
|
37
|
+
* 通常与 name 相同,指代有问题的依赖项
|
|
38
|
+
*/
|
|
39
|
+
dependency: string;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* 漏洞的标题
|
|
43
|
+
* 简要描述漏洞的类型,例如 "Prototype Pollution in minimist"
|
|
44
|
+
*/
|
|
45
|
+
title: string;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* 漏洞详情的 URL
|
|
49
|
+
* 链接到 npm advisory 或 GitHub advisory 的详细报告页面
|
|
50
|
+
*/
|
|
51
|
+
url: string;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* 漏洞的严重程度
|
|
55
|
+
* 可选值: 'info' | 'low' | 'moderate' | 'high' | 'critical'
|
|
56
|
+
*/
|
|
57
|
+
severity: AuditSeverity;
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* 受影响的版本范围
|
|
61
|
+
* 使用 semver 语法描述哪些版本是脆弱的
|
|
62
|
+
* 例如: "<1.2.6" 表示小于 1.2.6 的所有版本
|
|
63
|
+
* 例如: ">=4.0.0 <4.1.5" 表示 4.0.0 到 4.1.5 之间的版本
|
|
64
|
+
*/
|
|
65
|
+
range: string;
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* (可选) 漏洞的简要描述
|
|
69
|
+
* 某些版本的 npm audit 输出可能包含此字段
|
|
70
|
+
*/
|
|
71
|
+
overview?: string;
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* (可选) 修复建议
|
|
75
|
+
* 某些版本的 npm audit 输出可能包含此字段,通常建议升级到特定版本
|
|
76
|
+
*/
|
|
77
|
+
recommendation?: string;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export interface VulnerabilityInfo {
|
|
81
|
+
/** 包的名称 */
|
|
82
|
+
packageName: string;
|
|
83
|
+
name: string;
|
|
84
|
+
/** 是否是工程直接依赖 */
|
|
85
|
+
isDirect: boolean;
|
|
86
|
+
/** 漏洞级别,取所有子依赖中漏洞级别的最高级 */
|
|
87
|
+
severity: AuditSeverity;
|
|
88
|
+
/**
|
|
89
|
+
* 漏洞的来源或传播路径
|
|
90
|
+
* @description 如果是字符串,表示是因为包的子依赖有漏洞导致的包本身产生了漏洞(字符串就是子依赖的名称);如果是对象,表示是因为包自身有漏洞导致的包本身产生了漏洞(字符串就是子依赖的名称)。如果是对象,则表示包自身有漏洞
|
|
91
|
+
*/
|
|
92
|
+
via: Array<string | VulnerabilitySourceDetail>;
|
|
93
|
+
/**
|
|
94
|
+
* 漏洞的影响范围
|
|
95
|
+
* @description 表示包自身的漏洞影响了哪些包,即:哪些包用到了自己
|
|
96
|
+
*/
|
|
97
|
+
effects: string[];
|
|
98
|
+
/** 包的位置路径 */
|
|
99
|
+
nodes: string[];
|
|
100
|
+
/** 包的版本范围 */
|
|
101
|
+
range: string;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export interface AuditMetadata {
|
|
105
|
+
/**
|
|
106
|
+
* 漏洞统计信息
|
|
107
|
+
* 按照严重程度分类的漏洞数量
|
|
108
|
+
*/
|
|
109
|
+
vulnerabilities: {
|
|
110
|
+
/**
|
|
111
|
+
* 信息级别漏洞
|
|
112
|
+
* 通常无害,仅提供信息
|
|
113
|
+
*/
|
|
114
|
+
info: number;
|
|
115
|
+
/**
|
|
116
|
+
* 低危漏洞
|
|
117
|
+
* 风险极低,利用难度大
|
|
118
|
+
*/
|
|
119
|
+
low: number;
|
|
120
|
+
/**
|
|
121
|
+
* 中危漏洞
|
|
122
|
+
* 有一定风险,需关注
|
|
123
|
+
*/
|
|
124
|
+
moderate: number;
|
|
125
|
+
/**
|
|
126
|
+
* 高危漏洞
|
|
127
|
+
* 可能导致数据泄露或服务中断,建议尽快修复
|
|
128
|
+
*/
|
|
129
|
+
high: number;
|
|
130
|
+
/**
|
|
131
|
+
* 严重漏洞
|
|
132
|
+
* 最高优先级,可能导致远程代码执行等严重后果
|
|
133
|
+
*/
|
|
134
|
+
critical: number;
|
|
135
|
+
/**
|
|
136
|
+
* 漏洞总数
|
|
137
|
+
*/
|
|
138
|
+
total: number;
|
|
139
|
+
};
|
|
140
|
+
/**
|
|
141
|
+
* 依赖包统计信息
|
|
142
|
+
* 按照依赖类型分类的包数量(注意:这里通常是包的数量,而非漏洞数量)
|
|
143
|
+
*/
|
|
144
|
+
dependencies: {
|
|
145
|
+
/**
|
|
146
|
+
* 生产环境依赖
|
|
147
|
+
* 最终打包上线所需的依赖包数量
|
|
148
|
+
*/
|
|
149
|
+
prod: number;
|
|
150
|
+
/**
|
|
151
|
+
* 开发环境依赖
|
|
152
|
+
* 仅在开发阶段(如构建、测试、Lint)使用的依赖包数量
|
|
153
|
+
*/
|
|
154
|
+
dev: number;
|
|
155
|
+
/**
|
|
156
|
+
* 可选依赖
|
|
157
|
+
* 安装时标记为 --optional 的依赖包数量
|
|
158
|
+
*/
|
|
159
|
+
optional: number;
|
|
160
|
+
/**
|
|
161
|
+
* 同伴依赖
|
|
162
|
+
* 要求宿主环境必须提供的依赖包数量
|
|
163
|
+
*/
|
|
164
|
+
peer: number;
|
|
165
|
+
/**
|
|
166
|
+
* 可选同伴依赖
|
|
167
|
+
*/
|
|
168
|
+
peerOptional: number;
|
|
169
|
+
/**
|
|
170
|
+
* 依赖包总数
|
|
171
|
+
*/
|
|
172
|
+
total: number;
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
export interface AuditResult {
|
|
177
|
+
/** 审计报告的版本号 */
|
|
178
|
+
auditReportVersion: number;
|
|
179
|
+
/** 所有被发现有漏洞的具体包相关信息 */
|
|
180
|
+
vulnerabilities: Record<string, VulnerabilityInfo>;
|
|
181
|
+
/** 关于漏洞严重程度和依赖数量的统计信息 */
|
|
182
|
+
metadata: AuditMetadata;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* 标准化后的漏洞信息对象
|
|
187
|
+
*/
|
|
188
|
+
export interface NormalizedVulnerabilityInfo {
|
|
189
|
+
/**
|
|
190
|
+
* 存在漏洞的包名
|
|
191
|
+
*/
|
|
192
|
+
name: string;
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* 漏洞的严重程度
|
|
196
|
+
*/
|
|
197
|
+
severity: AuditSeverity;
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* 有效的漏洞来源列表
|
|
201
|
+
* 经过筛选,仅保留对象类型的 via 信息
|
|
202
|
+
*/
|
|
203
|
+
problems: VulnerabilitySourceDetail[];
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* 受影响的节点 ID 列表
|
|
207
|
+
* 通常对应 package-lock.json 中的具体位置
|
|
208
|
+
*/
|
|
209
|
+
nodes: string[];
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* 依赖链列表
|
|
213
|
+
* 描述了该有漏洞的包的所有依赖路径(被哪些包依赖了该包)
|
|
214
|
+
* 示例结构是: string[][] (如 [["project", "parent", "child"]])
|
|
215
|
+
* 表示child有漏洞,parent依赖了child,project依赖了parent
|
|
216
|
+
*/
|
|
217
|
+
depChains?: any[]; // 建议根据 getDepChains 的实际返回值替换 any,例如 string[][] 或 DepNode[][]
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* npm security audit 完整响应结构
|
|
222
|
+
*/
|
|
223
|
+
export interface NpmAuditResponse {
|
|
224
|
+
/**
|
|
225
|
+
* 建议执行的操作列表,用于修复漏洞
|
|
226
|
+
*/
|
|
227
|
+
actions: AuditAction[];
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* 漏洞详情字典,键为 Advisory ID
|
|
231
|
+
* 包含漏洞的完整元数据(标题、概述、CVSS评分等)
|
|
232
|
+
*/
|
|
233
|
+
advisories: Record<number, Advisory>;
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* 用户选择忽略(静音)的漏洞列表
|
|
237
|
+
*/
|
|
238
|
+
muted: MutedItem[];
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* 审计元数据,包含统计信息
|
|
242
|
+
*/
|
|
243
|
+
metadata: AuditMetadata;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* 建议的修复操作
|
|
248
|
+
*/
|
|
249
|
+
export interface AuditAction {
|
|
250
|
+
/**
|
|
251
|
+
* 操作类型,通常是 'install' 或 'update'
|
|
252
|
+
*/
|
|
253
|
+
action: "install" | "update" | "review";
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* 涉及的模块名,通常包含版本号,如 "lodash@4.17.21"
|
|
257
|
+
*/
|
|
258
|
+
module: string;
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* 该操作能解决的漏洞路径列表
|
|
262
|
+
*/
|
|
263
|
+
resolves: AuditResolve[];
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* 操作能解决的漏洞详情
|
|
268
|
+
*/
|
|
269
|
+
export interface AuditResolve {
|
|
270
|
+
/**
|
|
271
|
+
* 漏洞的 Advisory ID
|
|
272
|
+
*/
|
|
273
|
+
id: number;
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* 漏洞在依赖树中的路径,用 ">" 分隔
|
|
277
|
+
*/
|
|
278
|
+
path: string;
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* 是否是开发依赖
|
|
282
|
+
*/
|
|
283
|
+
dev: boolean;
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* 是否是可选依赖
|
|
287
|
+
*/
|
|
288
|
+
optional: boolean;
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* 是否是打包依赖
|
|
292
|
+
*/
|
|
293
|
+
bundled: boolean;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* 漏洞的完整详情
|
|
298
|
+
*/
|
|
299
|
+
export interface Advisory {
|
|
300
|
+
/**
|
|
301
|
+
* 漏洞 ID
|
|
302
|
+
*/
|
|
303
|
+
id: number;
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* 漏洞详情页 URL
|
|
307
|
+
*/
|
|
308
|
+
url: string;
|
|
309
|
+
|
|
310
|
+
/**
|
|
311
|
+
* 漏洞标题
|
|
312
|
+
*/
|
|
313
|
+
title: string;
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* 严重程度: low, moderate, high, critical
|
|
317
|
+
*/
|
|
318
|
+
severity: AuditSeverity;
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* 通用弱点枚举代码
|
|
322
|
+
*/
|
|
323
|
+
cwe: string[];
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* 通用漏洞评分系统数据
|
|
327
|
+
*/
|
|
328
|
+
cvss: CvssData;
|
|
329
|
+
|
|
330
|
+
/**
|
|
331
|
+
* 发现者信息
|
|
332
|
+
*/
|
|
333
|
+
found_by: ReporterInfo;
|
|
334
|
+
|
|
335
|
+
/**
|
|
336
|
+
* 报告者信息
|
|
337
|
+
*/
|
|
338
|
+
reported_by: ReporterInfo;
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* 受影响的模块名称
|
|
342
|
+
*/
|
|
343
|
+
module_name: string;
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
* 漏洞发布时间
|
|
347
|
+
*/
|
|
348
|
+
publish_date: string;
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* 漏洞更新时间
|
|
352
|
+
*/
|
|
353
|
+
updated_date: string;
|
|
354
|
+
|
|
355
|
+
/**
|
|
356
|
+
* 漏洞概述
|
|
357
|
+
*/
|
|
358
|
+
overview: string;
|
|
359
|
+
|
|
360
|
+
/**
|
|
361
|
+
* 修复建议
|
|
362
|
+
*/
|
|
363
|
+
recommendation: string;
|
|
364
|
+
|
|
365
|
+
/**
|
|
366
|
+
* 参考链接
|
|
367
|
+
*/
|
|
368
|
+
references: string[];
|
|
369
|
+
|
|
370
|
+
/**
|
|
371
|
+
* 是否通过其他包间接访问
|
|
372
|
+
*/
|
|
373
|
+
accessed_via_other_package: boolean;
|
|
374
|
+
|
|
375
|
+
/**
|
|
376
|
+
* 受影响的版本范围
|
|
377
|
+
*/
|
|
378
|
+
vulnerable_versions: string;
|
|
379
|
+
|
|
380
|
+
/**
|
|
381
|
+
* 已修复的版本范围
|
|
382
|
+
*/
|
|
383
|
+
patched_versions: string;
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
/**
|
|
387
|
+
* CVSS 评分数据
|
|
388
|
+
*/
|
|
389
|
+
export interface CvssData {
|
|
390
|
+
/**
|
|
391
|
+
* 评分分数
|
|
392
|
+
*/
|
|
393
|
+
score: number;
|
|
394
|
+
|
|
395
|
+
/**
|
|
396
|
+
* 向量字符串
|
|
397
|
+
*/
|
|
398
|
+
vectorString: string;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
/**
|
|
402
|
+
* 报告者/发现者信息
|
|
403
|
+
*/
|
|
404
|
+
export interface ReporterInfo {
|
|
405
|
+
/**
|
|
406
|
+
* 链接
|
|
407
|
+
*/
|
|
408
|
+
link: string;
|
|
409
|
+
|
|
410
|
+
/**
|
|
411
|
+
* 名称
|
|
412
|
+
*/
|
|
413
|
+
name: string;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
/**
|
|
417
|
+
* 被静音的漏洞项
|
|
418
|
+
*/
|
|
419
|
+
export interface MutedItem {
|
|
420
|
+
/**
|
|
421
|
+
* 涉及的包名
|
|
422
|
+
*/
|
|
423
|
+
name: string;
|
|
424
|
+
|
|
425
|
+
/**
|
|
426
|
+
* 被静音的 Advisory ID 列表
|
|
427
|
+
*/
|
|
428
|
+
advisories: number[];
|
|
429
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
import { getDirname, uniqueId } from "./index.js";
|
|
4
|
+
|
|
5
|
+
// 获取当前文件的目录名称
|
|
6
|
+
const __dirname = getDirname(import.meta.url);
|
|
7
|
+
|
|
8
|
+
// 获取上两级目录(项目根目录)
|
|
9
|
+
const basepath = join(__dirname, "../..");
|
|
10
|
+
// 定义工作目录路径
|
|
11
|
+
const workBasePath = join(basepath, "work");
|
|
12
|
+
// 确保工作目录存在
|
|
13
|
+
fs.mkdirSync(workBasePath, { recursive: true });
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @Desc: 创建工作目录
|
|
17
|
+
* @return {string} 工作目录路径
|
|
18
|
+
*/
|
|
19
|
+
export async function createWorkDir(workDirPath = workBasePath) {
|
|
20
|
+
const workDir = join(workDirPath, uniqueId());
|
|
21
|
+
await fs.promises.mkdir(workDir, { recursive: true });
|
|
22
|
+
return workDir;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* @Desc: 删除工作目录
|
|
27
|
+
* @param {string} workDir 工作目录路径
|
|
28
|
+
*/
|
|
29
|
+
export async function deleteWorkDir(workDir = workBasePath) {
|
|
30
|
+
await fs.promises.rm(workDir, { recursive: true, force: true });
|
|
31
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { dirname } from "path";
|
|
2
|
+
import { fileURLToPath } from "url";
|
|
3
|
+
import { exec } from "child_process";
|
|
4
|
+
import { promisify } from "util";
|
|
5
|
+
import type { RemoteProjectUrlInfo } from "../parseProject/parseRemoteProject.js";
|
|
6
|
+
|
|
7
|
+
const execAsync = promisify(exec);
|
|
8
|
+
|
|
9
|
+
interface ExecAsyncError extends Error {
|
|
10
|
+
stdout: string;
|
|
11
|
+
stderr: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @Desc: 执行shell命令
|
|
16
|
+
* @return {*}
|
|
17
|
+
* @param {string} cmd 命令
|
|
18
|
+
* @param {string} cwd 工作目录
|
|
19
|
+
*/
|
|
20
|
+
export async function runCommand(cmd: string, cwd: string) {
|
|
21
|
+
try {
|
|
22
|
+
const stdout = await execAsync(cmd, {
|
|
23
|
+
cwd,
|
|
24
|
+
// stdio: ["ignore", "pipe", "pipe"],
|
|
25
|
+
});
|
|
26
|
+
// 返回 audit 的 JSON 结果
|
|
27
|
+
return stdout.stdout.toString();
|
|
28
|
+
} catch (err: unknown) {
|
|
29
|
+
const error = err as ExecAsyncError;
|
|
30
|
+
if (error.stdout) {
|
|
31
|
+
return error.stdout.toString();
|
|
32
|
+
}
|
|
33
|
+
throw err;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* @Desc: 生成唯一ID
|
|
39
|
+
* @return {string} 唯一ID
|
|
40
|
+
*/
|
|
41
|
+
export function uniqueId() {
|
|
42
|
+
return Math.random().toString(36).substring(2, 15) + Date.now().toString(36);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* @Desc: 获取文件名
|
|
47
|
+
* @return {string} 文件名
|
|
48
|
+
* @param {string} importMetaUrl 导入元URL
|
|
49
|
+
*/
|
|
50
|
+
export function getFilename(importMetaUrl: string) {
|
|
51
|
+
return fileURLToPath(importMetaUrl);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* @Desc: 获取文件目录
|
|
56
|
+
* @return {string} 文件目录
|
|
57
|
+
* @param {string} importMetaUrl 导入元URL
|
|
58
|
+
*/
|
|
59
|
+
export function getDirname(importMetaUrl: string) {
|
|
60
|
+
return dirname(getFilename(importMetaUrl));
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* @Desc: 根据不同的平台类型,得到获取文件内容的链接
|
|
65
|
+
* @param {RemoteProjectUrlInfo} gitInfo 仓库URL信息
|
|
66
|
+
* @param {string} branchName 分支名称
|
|
67
|
+
* @param {string} path 文件路径
|
|
68
|
+
* @return {string} 获取文件内容的链接
|
|
69
|
+
*/
|
|
70
|
+
export function getReadFileUrl(
|
|
71
|
+
gitInfo: RemoteProjectUrlInfo,
|
|
72
|
+
branchName: string,
|
|
73
|
+
path: string,
|
|
74
|
+
) {
|
|
75
|
+
const { owner, repo, platform } = gitInfo;
|
|
76
|
+
switch (platform) {
|
|
77
|
+
case "github":
|
|
78
|
+
return `https://raw.githubusercontent.com/${owner}/${repo}/${branchName}/${path}`;
|
|
79
|
+
case "gitee":
|
|
80
|
+
// return `https://raw.gitee.com/${owner}/${repo}/${branchName}/${path}`;
|
|
81
|
+
return `https://gitee.com/${owner}/${repo}/raw/${branchName}/${path}`;
|
|
82
|
+
case "gitlab":
|
|
83
|
+
// return `https://rawlab.com/${owner}/${repo}/${branchName}/${path}`;
|
|
84
|
+
return `https://gitlab.com/${owner}/${repo}/-/raw/${branchName}/${path}`;
|
|
85
|
+
default:
|
|
86
|
+
throw new Error(`Unsupported platform: ${platform}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
// Visit https://aka.ms/tsconfig to read more about this file
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
// File Layout
|
|
5
|
+
"rootDir": "./src",
|
|
6
|
+
"outDir": "./dist",
|
|
7
|
+
|
|
8
|
+
// Environment Settings
|
|
9
|
+
// See also https://aka.ms/tsconfig/module
|
|
10
|
+
"module": "nodenext",
|
|
11
|
+
"target": "esnext",
|
|
12
|
+
// For nodejs:
|
|
13
|
+
"lib": ["esnext"],
|
|
14
|
+
"types": ["node"],
|
|
15
|
+
// and npm install -D @types/node
|
|
16
|
+
|
|
17
|
+
// Other Outputs
|
|
18
|
+
"sourceMap": true,
|
|
19
|
+
"declaration": true,
|
|
20
|
+
"declarationMap": true,
|
|
21
|
+
|
|
22
|
+
// Stricter Typechecking Options
|
|
23
|
+
"noUncheckedIndexedAccess": true,
|
|
24
|
+
"exactOptionalPropertyTypes": true,
|
|
25
|
+
|
|
26
|
+
// Style Options
|
|
27
|
+
// "noImplicitReturns": true,
|
|
28
|
+
// "noImplicitOverride": true,
|
|
29
|
+
// "noUnusedLocals": true,
|
|
30
|
+
// "noUnusedParameters": true,
|
|
31
|
+
// "noFallthroughCasesInSwitch": true,
|
|
32
|
+
// "noPropertyAccessFromIndexSignature": true,
|
|
33
|
+
|
|
34
|
+
// Recommended Options
|
|
35
|
+
"strict": true,
|
|
36
|
+
"verbatimModuleSyntax": true,
|
|
37
|
+
"isolatedModules": true,
|
|
38
|
+
"noUncheckedSideEffectImports": true,
|
|
39
|
+
"moduleDetection": "force",
|
|
40
|
+
"skipLibCheck": true,
|
|
41
|
+
}
|
|
42
|
+
}
|