Skip to content

Commit 8cb8673

Browse files
committed
fix(utils): 重构包版本检查逻辑并添加错误处理
- 引入 tryFlatten 函数以简化错误处理 - 优化 checkPkgVersion 函数,增加错误处理逻辑 - 更新单元测试,增加对错误情况的测试
1 parent 7d0177d commit 8cb8673

File tree

2 files changed

+12
-25
lines changed

2 files changed

+12
-25
lines changed

src/utils.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { type ExecOptions, exec } from 'node:child_process';
22
import fs from 'node:fs';
33
import path from 'node:path/posix';
4+
import { tryFlatten } from 'try-flatten';
45
import type { PkgMeta } from './types';
56

67
export function isDirectory(p: string): boolean {
@@ -33,12 +34,14 @@ export async function checkPkgVersion(pkg: PkgMeta) {
3334
const url = new URL(pkg.registry || 'https://registry.npmjs.org');
3435
url.pathname = path.join(pkg.name, pkg.distTag || 'latest');
3536

36-
const resp = await fetch(url.toString());
37+
const [err1, resp] = await tryFlatten(fetch(url.toString()));
38+
if (err1) return '';
3739

3840
if (!resp.ok) return '';
3941
if (!resp.headers.get('content-type')?.includes('application/json')) return '';
4042

41-
const { version } = (await resp.json()) as { version?: string };
43+
const [err2, json] = await tryFlatten<{ version?: string }>(resp.json());
44+
if (err2) return '';
4245

43-
return version || '';
46+
return json.version || '';
4447
}

test/utils.test.ts

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -80,35 +80,19 @@ describe('命令执行', () => {
8080
});
8181

8282
describe('包版本检查', () => {
83-
it('应该从 npm registry 返回包版本', async () => {
84-
const mockResponse = { version: '1.2.3' };
85-
const mockFetch = vi.fn().mockResolvedValue({
86-
json: () => Promise.resolve(mockResponse),
87-
});
88-
vi.stubGlobal('fetch', mockFetch);
89-
83+
it('应该从 npm registry 返回包版本', { timeout: 30 * 1000 }, async () => {
9084
const version = await checkPkgVersion({
91-
name: 'test-package',
92-
distTag: 'xxx',
93-
registry: 'https://registry.yyy.org',
85+
name: 'v2c',
9486
});
9587

96-
expect(version).toBe('1.2.3');
97-
expect(mockFetch).toHaveBeenCalledWith('https://registry.yyy.org/test-package/xxx');
88+
expect(version).toBe('1.0.0');
9889
});
9990

100-
it('当未提供 distTag 和 registry 时应该使用默认值', async () => {
101-
const mockResponse = { version: '1.0.0' };
102-
const mockFetch = vi.fn().mockResolvedValue({
103-
json: () => Promise.resolve(mockResponse),
104-
});
105-
vi.stubGlobal('fetch', mockFetch);
106-
91+
it('不存在的包应该返回空字符串', { timeout: 30 * 1000 }, async () => {
10792
const version = await checkPkgVersion({
108-
name: 'test-package',
93+
name: 'v2c-not-exist',
10994
});
11095

111-
expect(version).toBe('1.0.0');
112-
expect(mockFetch).toHaveBeenCalledWith('https://registry.npmjs.org/test-package/latest');
96+
expect(version).toBe('');
11397
});
11498
});

0 commit comments

Comments
 (0)