Skip to content

Commit 523d7ec

Browse files
authored
fix: get npm version registry not work && add get npm info cache (#164)
* fix: get npm version registry not work && add get npm info cache * export getNpmPackageInfo function * fix: lint error
1 parent b5cf846 commit 523d7ec

File tree

6 files changed

+64
-27
lines changed

6 files changed

+64
-27
lines changed

.changeset/dull-lies-sneeze.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
"@modern-js/codesmith": patch
3+
---
4+
5+
fix: get npm version registry not work && add get npm info cache
6+
7+
fix: 修复获取 npm 版本 registry 不生效 && 新增获取 npm 信息缓存
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import { NPM_API_TIMEOUT } from '@/constants';
2+
import axios from 'axios';
3+
import { getNpmRegistry } from './getNpmRegistry';
4+
import { timeoutPromise } from './timeoutPromise';
5+
6+
interface Options {
7+
registryUrl?: string;
8+
}
9+
10+
interface PackageInfo {
11+
version: string;
12+
dist: {
13+
tarball: string;
14+
};
15+
}
16+
17+
const NpmPackageInfoCache = new Map<string, PackageInfo>();
18+
19+
export async function getNpmPackageInfo(
20+
pkgName: string,
21+
pkgVersion: string,
22+
options?: Options,
23+
): Promise<PackageInfo> {
24+
const packageName = `${pkgName}/${pkgVersion}`;
25+
const packageInfo = NpmPackageInfoCache.get(packageName);
26+
if (packageInfo) {
27+
return packageInfo;
28+
}
29+
const { registryUrl = await getNpmRegistry() } = options || {};
30+
31+
const url = `${registryUrl}/${pkgName}/${pkgVersion}`;
32+
33+
const response = await timeoutPromise(
34+
axios.get(url),
35+
NPM_API_TIMEOUT,
36+
`Get npm package info of '${pkgName}'`,
37+
);
38+
39+
NpmPackageInfoCache.set(packageName, response.data);
40+
41+
return response.data;
42+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { execa } from '@modern-js/codesmith-utils/execa';
2+
3+
export async function getNpmRegistry() {
4+
const { stdout } = await execa('npm', ['config', 'get', 'registry']);
5+
return stdout.replace(/\/$/, '') || 'https://registry.npmjs.org';
6+
}
Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
import { NPM_API_TIMEOUT } from '@/constants';
2-
import axios from 'axios';
3-
import { timeoutPromise } from './timeoutPromise';
1+
import { getNpmPackageInfo } from './getNpmPackageInfo';
42

53
interface Options {
64
registryUrl?: string;
@@ -11,15 +9,7 @@ export async function getNpmTarballUrl(
119
pkgVersion: string,
1210
options?: Options,
1311
): Promise<string> {
14-
const { registryUrl = 'https://registry.npmjs.org' } = options || {};
12+
const packageInfo = await getNpmPackageInfo(pkgName, pkgVersion, options);
1513

16-
const url = `${registryUrl}/${pkgName}/${pkgVersion}`;
17-
18-
const response = await timeoutPromise(
19-
axios.get(url),
20-
NPM_API_TIMEOUT,
21-
`Get npm tarball of '${pkgName}'`,
22-
);
23-
24-
return response.data.dist.tarball;
14+
return packageInfo.dist.tarball;
2515
}
Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
import { NPM_API_TIMEOUT } from '@/constants';
2-
import axios from 'axios';
3-
import { timeoutPromise } from './timeoutPromise';
1+
import { getNpmPackageInfo } from './getNpmPackageInfo';
42

53
/**
64
* get package version
@@ -18,16 +16,8 @@ export async function getNpmVersion(
1816
packageName: string,
1917
options?: Options,
2018
): Promise<string> {
21-
const { version = 'latest', registryUrl = 'https://registry.npmjs.org' } =
22-
options || {};
19+
const { version = 'latest' } = options || {};
20+
const packageInfo = await getNpmPackageInfo(packageName, version, options);
2321

24-
const url = `${registryUrl}/${packageName}/${version}`;
25-
26-
const response = await timeoutPromise(
27-
axios.get(url),
28-
NPM_API_TIMEOUT,
29-
`Get npm version of '${packageName}'`,
30-
);
31-
32-
return response.data.version;
22+
return packageInfo.version;
3323
}

packages/core/src/utils/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,5 @@ export { timeoutPromise } from './timeoutPromise';
55
export { downloadPackage, getGeneratorVersion } from './downloadPackage';
66
export { getNpmVersion } from './getNpmVersion';
77
export { getPackageInfo } from './getPackageInfo';
8+
export { getNpmRegistry } from './getNpmRegistry';
9+
export { getNpmPackageInfo } from './getNpmPackageInfo';

0 commit comments

Comments
 (0)