-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcheck.js
More file actions
47 lines (38 loc) · 1.42 KB
/
Copy pathcheck.js
File metadata and controls
47 lines (38 loc) · 1.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
//辅助脚本,检测有哪些不存在的npm包
import { exec } from 'node:child_process';
import { readFileSync } from 'node:fs';
import { promisify } from 'node:util';
const execAsync = promisify(exec);
// 1. 读取并解析 package-lock.json
const lockData = JSON.parse(readFileSync('./package-lock.json', 'utf8'));
const packages = lockData.packages || {};
// 2. 提取纯净的包名和版本
const pkgList = Object.keys(packages)
.filter(path => path !== "") // 过滤根目录
.map(path => {
// 关键修正:取最后一个 node_modules/ 之后的内容作为包名
const pathParts = path.split('node_modules/');
const name = pathParts[pathParts.length - 1];
const version = packages[path].version;
return `${name}@${version}`;
});
// 去重(不同的路径下可能有相同版本的同一个包,没必要重复查多次)
const uniquePkgs = [...new Set(pkgList)];
console.error(`📦 待检查的独立包总数: ${uniquePkgs.length}`);
// 3. 并发检查
const CONCURRENCY = 15;
async function check(pkg) {
try {
await execAsync(`npm view ${pkg} version --silent`);
} catch (err) {
// 只输出纯净的 pkg 字符串到标准输出
process.stdout.write(`${pkg}\n`);
}
}
async function main() {
for (let i = 0; i < uniquePkgs.length; i += CONCURRENCY) {
const chunk = uniquePkgs.slice(i, i + CONCURRENCY);
await Promise.all(chunk.map(pkg => check(pkg)));
}
}
main();