@yanhe-su/cli
Version:
CLI tool for DAO Style projects - providing project scaffolding, template generation and dependency management
65 lines (64 loc) • 2.35 kB
JavaScript
import pacote from 'pacote';
/**
* 获取 npm 包的最新版本信息
* @param packageName 包名
* @param options 选项
* @returns 版本信息
*/
export async function getPackageVersions(packageName, options = {}) {
const { registry = 'https://registry.npmmirror.com' } = options;
try {
const manifest = await pacote.manifest(`${packageName}@latest`, {
registry,
});
const versions = {
latest: manifest.version,
};
// 如果需要获取预发布版本
if (options.includePrerelease) {
const packument = (await pacote.packument(packageName, {
registry,
fullMetadata: true, // 确保获取完整的元数据
}));
// 获取所有版本并按时间排序
const allVersions = Object.keys(packument.versions).sort((a, b) => {
const timeA = packument.time[a] || '';
const timeB = packument.time[b] || '';
return new Date(timeB).getTime() - new Date(timeA).getTime();
});
// 查找最新的 next、beta 和 alpha 版本
for (const version of allVersions) {
if (version.includes('next') && !versions.next) {
versions.next = version;
}
else if (version.includes('beta') && !versions.beta) {
versions.beta = version;
}
else if (version.includes('alpha') && !versions.alpha) {
versions.alpha = version;
}
// 如果所有类型都找到了就退出
if (versions.next && versions.beta && versions.alpha) {
break;
}
}
}
return versions;
}
catch (error) {
throw new Error(`Failed to fetch version for ${packageName}: ${error}`);
}
}
/**
* 获取多个包的最新版本
* @param packages 包名数组
* @param options 选项
* @returns 包版本映射
*/
export async function getMultiplePackageVersions(packages, options) {
const results = await Promise.all(packages.map((pkg) => getPackageVersions(pkg, options)));
return packages.reduce((acc, pkg, index) => {
acc[pkg] = results[index];
return acc;
}, {});
}