@rushstack/npm-check-fork 0.1.9 → 0.1.11
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/CHANGELOG.json +24 -0
- package/CHANGELOG.md +13 -1
- package/lib/GetLatestFromRegistry.d.ts +14 -0
- package/lib/GetLatestFromRegistry.d.ts.map +1 -1
- package/lib/GetLatestFromRegistry.js +63 -28
- package/lib/GetLatestFromRegistry.js.map +1 -1
- package/lib/NpmRegistryClient.d.ts +81 -0
- package/lib/NpmRegistryClient.d.ts.map +1 -0
- package/lib/NpmRegistryClient.js +171 -0
- package/lib/NpmRegistryClient.js.map +1 -0
- package/lib/index.d.ts +3 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +5 -1
- package/lib/index.js.map +1 -1
- package/lib/interfaces/INpmCheckRegistry.d.ts +38 -0
- package/lib/interfaces/INpmCheckRegistry.d.ts.map +1 -1
- package/lib/interfaces/INpmCheckRegistry.js.map +1 -1
- package/lib/tests/GetLatestFromRegistry.test.js.map +1 -1
- package/lib/tests/NpmRegistryClient.test.d.ts +2 -0
- package/lib/tests/NpmRegistryClient.test.d.ts.map +1 -0
- package/lib/tests/NpmRegistryClient.test.js.map +1 -0
- package/package.json +3 -4
package/CHANGELOG.json
CHANGED
|
@@ -1,6 +1,30 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rushstack/npm-check-fork",
|
|
3
3
|
"entries": [
|
|
4
|
+
{
|
|
5
|
+
"version": "0.1.11",
|
|
6
|
+
"tag": "@rushstack/npm-check-fork_v0.1.11",
|
|
7
|
+
"date": "Fri, 30 Jan 2026 01:16:13 GMT",
|
|
8
|
+
"comments": {
|
|
9
|
+
"dependency": [
|
|
10
|
+
{
|
|
11
|
+
"comment": "Updating dependency \"@rushstack/heft\" to `1.1.11`"
|
|
12
|
+
}
|
|
13
|
+
]
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"version": "0.1.10",
|
|
18
|
+
"tag": "@rushstack/npm-check-fork_v0.1.10",
|
|
19
|
+
"date": "Wed, 28 Jan 2026 01:15:23 GMT",
|
|
20
|
+
"comments": {
|
|
21
|
+
"patch": [
|
|
22
|
+
{
|
|
23
|
+
"comment": "Remove dependencies on throat and package-json"
|
|
24
|
+
}
|
|
25
|
+
]
|
|
26
|
+
}
|
|
27
|
+
},
|
|
4
28
|
{
|
|
5
29
|
"version": "0.1.9",
|
|
6
30
|
"tag": "@rushstack/npm-check-fork_v0.1.9",
|
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
# Change Log - @rushstack/npm-check-fork
|
|
2
2
|
|
|
3
|
-
This log was last generated on
|
|
3
|
+
This log was last generated on Fri, 30 Jan 2026 01:16:13 GMT and should not be manually modified.
|
|
4
|
+
|
|
5
|
+
## 0.1.11
|
|
6
|
+
Fri, 30 Jan 2026 01:16:13 GMT
|
|
7
|
+
|
|
8
|
+
_Version update only_
|
|
9
|
+
|
|
10
|
+
## 0.1.10
|
|
11
|
+
Wed, 28 Jan 2026 01:15:23 GMT
|
|
12
|
+
|
|
13
|
+
### Patches
|
|
14
|
+
|
|
15
|
+
- Remove dependencies on throat and package-json
|
|
4
16
|
|
|
5
17
|
## 0.1.9
|
|
6
18
|
Thu, 08 Jan 2026 01:12:30 GMT
|
|
@@ -1,3 +1,17 @@
|
|
|
1
1
|
import type { INpmRegistryInfo } from './interfaces/INpmCheckRegistry';
|
|
2
|
+
/**
|
|
3
|
+
* Fetches package information from the npm registry.
|
|
4
|
+
*
|
|
5
|
+
* @param packageName - The name of the package to fetch
|
|
6
|
+
* @returns A promise that resolves to the package registry info
|
|
7
|
+
*/
|
|
2
8
|
export default function getNpmInfo(packageName: string): Promise<INpmRegistryInfo>;
|
|
9
|
+
/**
|
|
10
|
+
* Fetches package information for multiple packages concurrently.
|
|
11
|
+
*
|
|
12
|
+
* @param packageNames - Array of package names to fetch
|
|
13
|
+
* @param concurrency - Maximum number of concurrent requests (defaults to CPU count)
|
|
14
|
+
* @returns A promise that resolves to a Map of package name to registry info
|
|
15
|
+
*/
|
|
16
|
+
export declare function getNpmInfoBatch(packageNames: string[], concurrency?: number): Promise<Map<string, INpmRegistryInfo>>;
|
|
3
17
|
//# sourceMappingURL=GetLatestFromRegistry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GetLatestFromRegistry.d.ts","sourceRoot":"","sources":["../src/GetLatestFromRegistry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"GetLatestFromRegistry.d.ts","sourceRoot":"","sources":["../src/GetLatestFromRegistry.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACV,gBAAgB,EAGjB,MAAM,gCAAgC,CAAC;AAexC;;;;;GAKG;AACH,wBAA8B,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAkCvF;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,YAAY,EAAE,MAAM,EAAE,EACtB,WAAW,GAAE,MAAyB,GACrC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAaxC"}
|
|
@@ -1,43 +1,78 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
|
|
3
|
+
// See LICENSE in the project root for license information.
|
|
2
4
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
5
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
6
|
};
|
|
5
7
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
8
|
exports.default = getNpmInfo;
|
|
9
|
+
exports.getNpmInfoBatch = getNpmInfoBatch;
|
|
7
10
|
const node_os_1 = __importDefault(require("node:os"));
|
|
8
11
|
const lodash_1 = __importDefault(require("lodash"));
|
|
9
12
|
const semver_1 = __importDefault(require("semver"));
|
|
10
|
-
const
|
|
11
|
-
const throat_1 = __importDefault(require("throat"));
|
|
13
|
+
const node_core_library_1 = require("@rushstack/node-core-library");
|
|
12
14
|
const BestGuessHomepage_1 = __importDefault(require("./BestGuessHomepage"));
|
|
13
|
-
const
|
|
15
|
+
const NpmRegistryClient_1 = require("./NpmRegistryClient");
|
|
16
|
+
// Module-level registry client instance (lazy initialized)
|
|
17
|
+
let _registryClient;
|
|
18
|
+
/**
|
|
19
|
+
* Gets or creates the shared registry client instance.
|
|
20
|
+
*/
|
|
21
|
+
function getRegistryClient() {
|
|
22
|
+
if (!_registryClient) {
|
|
23
|
+
_registryClient = new NpmRegistryClient_1.NpmRegistryClient();
|
|
24
|
+
}
|
|
25
|
+
return _registryClient;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Fetches package information from the npm registry.
|
|
29
|
+
*
|
|
30
|
+
* @param packageName - The name of the package to fetch
|
|
31
|
+
* @returns A promise that resolves to the package registry info
|
|
32
|
+
*/
|
|
14
33
|
async function getNpmInfo(packageName) {
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
const CRAZY_HIGH_SEMVER = '8000.0.0';
|
|
19
|
-
const sortedVersions = (0, lodash_1.default)(rawData.versions)
|
|
20
|
-
.keys()
|
|
21
|
-
.remove(lodash_1.default.partial(semver_1.default.gt, CRAZY_HIGH_SEMVER))
|
|
22
|
-
.sort(semver_1.default.compare)
|
|
23
|
-
.valueOf();
|
|
24
|
-
const latest = rawData['dist-tags'].latest;
|
|
25
|
-
const next = rawData['dist-tags'].next;
|
|
26
|
-
const latestStableRelease = semver_1.default.satisfies(latest, '*')
|
|
27
|
-
? latest
|
|
28
|
-
: semver_1.default.maxSatisfying(sortedVersions, '*') || '';
|
|
29
|
-
return {
|
|
30
|
-
latest: latestStableRelease,
|
|
31
|
-
next: next,
|
|
32
|
-
versions: sortedVersions,
|
|
33
|
-
homepage: (0, BestGuessHomepage_1.default)(rawData) || ''
|
|
34
|
-
};
|
|
35
|
-
})
|
|
36
|
-
.catch((error) => {
|
|
37
|
-
const errorMessage = `Registry error ${error.message}`;
|
|
34
|
+
const client = getRegistryClient();
|
|
35
|
+
const result = await client.fetchPackageMetadataAsync(packageName);
|
|
36
|
+
if (result.error) {
|
|
38
37
|
return {
|
|
39
|
-
error:
|
|
38
|
+
error: `Registry error ${result.error}`
|
|
40
39
|
};
|
|
41
|
-
}
|
|
40
|
+
}
|
|
41
|
+
const rawData = result.data;
|
|
42
|
+
const CRAZY_HIGH_SEMVER = '8000.0.0';
|
|
43
|
+
const sortedVersions = (0, lodash_1.default)(rawData.versions)
|
|
44
|
+
.keys()
|
|
45
|
+
.remove(lodash_1.default.partial(semver_1.default.gt, CRAZY_HIGH_SEMVER))
|
|
46
|
+
.sort(semver_1.default.compare)
|
|
47
|
+
.valueOf();
|
|
48
|
+
const latest = rawData['dist-tags'].latest;
|
|
49
|
+
const next = rawData['dist-tags'].next;
|
|
50
|
+
const latestStableRelease = semver_1.default.satisfies(latest, '*')
|
|
51
|
+
? latest
|
|
52
|
+
: semver_1.default.maxSatisfying(sortedVersions, '*') || '';
|
|
53
|
+
// Cast to INpmCheckRegistryData for bestGuessHomepage compatibility
|
|
54
|
+
// INpmRegistryPackageResponse is a superset of INpmCheckRegistryData
|
|
55
|
+
const registryData = rawData;
|
|
56
|
+
return {
|
|
57
|
+
latest: latestStableRelease,
|
|
58
|
+
next: next,
|
|
59
|
+
versions: sortedVersions,
|
|
60
|
+
homepage: (0, BestGuessHomepage_1.default)(registryData) || ''
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Fetches package information for multiple packages concurrently.
|
|
65
|
+
*
|
|
66
|
+
* @param packageNames - Array of package names to fetch
|
|
67
|
+
* @param concurrency - Maximum number of concurrent requests (defaults to CPU count)
|
|
68
|
+
* @returns A promise that resolves to a Map of package name to registry info
|
|
69
|
+
*/
|
|
70
|
+
async function getNpmInfoBatch(packageNames, concurrency = node_os_1.default.cpus().length) {
|
|
71
|
+
const results = new Map();
|
|
72
|
+
// TODO: Refactor createPackageSummary to use this batch function to reduce registry requests
|
|
73
|
+
await node_core_library_1.Async.forEachAsync(packageNames, async (packageName) => {
|
|
74
|
+
results.set(packageName, await getNpmInfo(packageName));
|
|
75
|
+
}, { concurrency });
|
|
76
|
+
return results;
|
|
42
77
|
}
|
|
43
78
|
//# sourceMappingURL=GetLatestFromRegistry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GetLatestFromRegistry.js","sourceRoot":"","sources":["../src/GetLatestFromRegistry.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"GetLatestFromRegistry.js","sourceRoot":"","sources":["../src/GetLatestFromRegistry.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;;;AAoC3D,6BAkCC;AASD,0CAgBC;AA7FD,sDAAyB;AAEzB,oDAAuB;AACvB,oDAA4B;AAE5B,oEAAqD;AAErD,4EAAoD;AACpD,2DAAuF;AAOvF,2DAA2D;AAC3D,IAAI,eAA8C,CAAC;AAEnD;;GAEG;AACH,SAAS,iBAAiB;IACxB,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,eAAe,GAAG,IAAI,qCAAiB,EAAE,CAAC;IAC5C,CAAC;IACD,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;;;;GAKG;AACY,KAAK,UAAU,UAAU,CAAC,WAAmB;IAC1D,MAAM,MAAM,GAAsB,iBAAiB,EAAE,CAAC;IACtD,MAAM,MAAM,GAA6B,MAAM,MAAM,CAAC,yBAAyB,CAAC,WAAW,CAAC,CAAC;IAE7F,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO;YACL,KAAK,EAAE,kBAAkB,MAAM,CAAC,KAAK,EAAE;SACxC,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAgC,MAAM,CAAC,IAAK,CAAC;IAC1D,MAAM,iBAAiB,GAAW,UAAU,CAAC;IAC7C,MAAM,cAAc,GAAa,IAAA,gBAAC,EAAC,OAAO,CAAC,QAAQ,CAAC;SACjD,IAAI,EAAE;SACN,MAAM,CAAC,gBAAC,CAAC,OAAO,CAAC,gBAAM,CAAC,EAAE,EAAE,iBAAiB,CAAC,CAAC;SAC/C,IAAI,CAAC,gBAAM,CAAC,OAAO,CAAC;SACpB,OAAO,EAAE,CAAC;IAEb,MAAM,MAAM,GAAW,OAAO,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC;IACnD,MAAM,IAAI,GAAW,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC;IAC/C,MAAM,mBAAmB,GAAuB,gBAAM,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC;QAC3E,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,gBAAM,CAAC,aAAa,CAAC,cAAc,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;IAEpD,oEAAoE;IACpE,qEAAqE;IACrE,MAAM,YAAY,GAA0B,OAA2C,CAAC;IAExF,OAAO;QACL,MAAM,EAAE,mBAAmB;QAC3B,IAAI,EAAE,IAAI;QACV,QAAQ,EAAE,cAAc;QACxB,QAAQ,EAAE,IAAA,2BAAiB,EAAC,YAAY,CAAC,IAAI,EAAE;KAChD,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,eAAe,CACnC,YAAsB,EACtB,cAAsB,iBAAE,CAAC,IAAI,EAAE,CAAC,MAAM;IAEtC,MAAM,OAAO,GAAkC,IAAI,GAAG,EAAE,CAAC;IAEzD,6FAA6F;IAC7F,MAAM,yBAAK,CAAC,YAAY,CACtB,YAAY,EACZ,KAAK,EAAE,WAAmB,EAAE,EAAE;QAC5B,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC;IAC1D,CAAC,EACD,EAAE,WAAW,EAAE,CAChB,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport os from 'node:os';\n\nimport _ from 'lodash';\nimport semver from 'semver';\n\nimport { Async } from '@rushstack/node-core-library';\n\nimport bestGuessHomepage from './BestGuessHomepage';\nimport { NpmRegistryClient, type INpmRegistryClientResult } from './NpmRegistryClient';\nimport type {\n INpmRegistryInfo,\n INpmCheckRegistryData,\n INpmRegistryPackageResponse\n} from './interfaces/INpmCheckRegistry';\n\n// Module-level registry client instance (lazy initialized)\nlet _registryClient: NpmRegistryClient | undefined;\n\n/**\n * Gets or creates the shared registry client instance.\n */\nfunction getRegistryClient(): NpmRegistryClient {\n if (!_registryClient) {\n _registryClient = new NpmRegistryClient();\n }\n return _registryClient;\n}\n\n/**\n * Fetches package information from the npm registry.\n *\n * @param packageName - The name of the package to fetch\n * @returns A promise that resolves to the package registry info\n */\nexport default async function getNpmInfo(packageName: string): Promise<INpmRegistryInfo> {\n const client: NpmRegistryClient = getRegistryClient();\n const result: INpmRegistryClientResult = await client.fetchPackageMetadataAsync(packageName);\n\n if (result.error) {\n return {\n error: `Registry error ${result.error}`\n };\n }\n\n const rawData: INpmRegistryPackageResponse = result.data!;\n const CRAZY_HIGH_SEMVER: string = '8000.0.0';\n const sortedVersions: string[] = _(rawData.versions)\n .keys()\n .remove(_.partial(semver.gt, CRAZY_HIGH_SEMVER))\n .sort(semver.compare)\n .valueOf();\n\n const latest: string = rawData['dist-tags'].latest;\n const next: string = rawData['dist-tags'].next;\n const latestStableRelease: string | undefined = semver.satisfies(latest, '*')\n ? latest\n : semver.maxSatisfying(sortedVersions, '*') || '';\n\n // Cast to INpmCheckRegistryData for bestGuessHomepage compatibility\n // INpmRegistryPackageResponse is a superset of INpmCheckRegistryData\n const registryData: INpmCheckRegistryData = rawData as unknown as INpmCheckRegistryData;\n\n return {\n latest: latestStableRelease,\n next: next,\n versions: sortedVersions,\n homepage: bestGuessHomepage(registryData) || ''\n };\n}\n\n/**\n * Fetches package information for multiple packages concurrently.\n *\n * @param packageNames - Array of package names to fetch\n * @param concurrency - Maximum number of concurrent requests (defaults to CPU count)\n * @returns A promise that resolves to a Map of package name to registry info\n */\nexport async function getNpmInfoBatch(\n packageNames: string[],\n concurrency: number = os.cpus().length\n): Promise<Map<string, INpmRegistryInfo>> {\n const results: Map<string, INpmRegistryInfo> = new Map();\n\n // TODO: Refactor createPackageSummary to use this batch function to reduce registry requests\n await Async.forEachAsync(\n packageNames,\n async (packageName: string) => {\n results.set(packageName, await getNpmInfo(packageName));\n },\n { concurrency }\n );\n\n return results;\n}\n"]}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { INpmRegistryPackageResponse } from './interfaces/INpmCheckRegistry';
|
|
2
|
+
/**
|
|
3
|
+
* Options for configuring the NpmRegistryClient.
|
|
4
|
+
* @public
|
|
5
|
+
*/
|
|
6
|
+
export interface INpmRegistryClientOptions {
|
|
7
|
+
/**
|
|
8
|
+
* The base URL of the npm registry.
|
|
9
|
+
* @defaultValue 'https://registry.npmjs.org'
|
|
10
|
+
*/
|
|
11
|
+
registryUrl?: string;
|
|
12
|
+
/**
|
|
13
|
+
* The User-Agent header to send with requests.
|
|
14
|
+
* @defaultValue A string containing npm-check-fork version and platform info
|
|
15
|
+
*/
|
|
16
|
+
userAgent?: string;
|
|
17
|
+
/**
|
|
18
|
+
* Request timeout in milliseconds.
|
|
19
|
+
* @defaultValue 30000
|
|
20
|
+
*/
|
|
21
|
+
timeoutMs?: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Result from fetching package metadata from the npm registry.
|
|
25
|
+
* @public
|
|
26
|
+
*/
|
|
27
|
+
export interface INpmRegistryClientResult {
|
|
28
|
+
/**
|
|
29
|
+
* The package metadata if the request was successful.
|
|
30
|
+
*/
|
|
31
|
+
data?: INpmRegistryPackageResponse;
|
|
32
|
+
/**
|
|
33
|
+
* Error message if the request failed.
|
|
34
|
+
*/
|
|
35
|
+
error?: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* A client for fetching package metadata from the npm registry.
|
|
39
|
+
*
|
|
40
|
+
* @remarks
|
|
41
|
+
* This client provides a simple interface for fetching package metadata
|
|
42
|
+
* without external dependencies like `package-json`.
|
|
43
|
+
*
|
|
44
|
+
* @public
|
|
45
|
+
*/
|
|
46
|
+
export declare class NpmRegistryClient {
|
|
47
|
+
private readonly _registryUrl;
|
|
48
|
+
private readonly _userAgent;
|
|
49
|
+
private readonly _timeoutMs;
|
|
50
|
+
constructor(options?: INpmRegistryClientOptions);
|
|
51
|
+
/**
|
|
52
|
+
* Builds the URL for fetching package metadata.
|
|
53
|
+
*
|
|
54
|
+
* @remarks
|
|
55
|
+
* Handles scoped packages by URL-encoding the package name.
|
|
56
|
+
* For example, `@scope/name` becomes `@scope%2Fname`.
|
|
57
|
+
*
|
|
58
|
+
* @param packageName - The name of the package
|
|
59
|
+
* @returns The full URL for fetching the package metadata
|
|
60
|
+
*/
|
|
61
|
+
private _buildPackageUrl;
|
|
62
|
+
/**
|
|
63
|
+
* Fetches package metadata from the npm registry.
|
|
64
|
+
*
|
|
65
|
+
* @param packageName - The name of the package to fetch
|
|
66
|
+
* @returns A promise that resolves to the result containing either data or an error
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```ts
|
|
70
|
+
* const client = new NpmRegistryClient();
|
|
71
|
+
* const result = await client.fetchPackageMetadataAsync('lodash');
|
|
72
|
+
* if (result.error) {
|
|
73
|
+
* console.error(result.error);
|
|
74
|
+
* } else {
|
|
75
|
+
* console.log(result.data?.['dist-tags'].latest);
|
|
76
|
+
* }
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
fetchPackageMetadataAsync(packageName: string): Promise<INpmRegistryClientResult>;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=NpmRegistryClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NpmRegistryClient.d.ts","sourceRoot":"","sources":["../src/NpmRegistryClient.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AAElF;;;GAGG;AACH,MAAM,WAAW,yBAAyB;IACxC;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,IAAI,CAAC,EAAE,2BAA2B,CAAC;IAEnC;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAKD;;;;;;;;GAQG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAEjB,OAAO,CAAC,EAAE,yBAAyB;IAQtD;;;;;;;;;OASG;IACH,OAAO,CAAC,gBAAgB;IAOxB;;;;;;;;;;;;;;;;OAgBG;IACU,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC;CAyF/F"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
|
|
3
|
+
// See LICENSE in the project root for license information.
|
|
4
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
5
|
+
if (k2 === undefined) k2 = k;
|
|
6
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
7
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
8
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
9
|
+
}
|
|
10
|
+
Object.defineProperty(o, k2, desc);
|
|
11
|
+
}) : (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
o[k2] = m[k];
|
|
14
|
+
}));
|
|
15
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
16
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
17
|
+
}) : function(o, v) {
|
|
18
|
+
o["default"] = v;
|
|
19
|
+
});
|
|
20
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
21
|
+
var ownKeys = function(o) {
|
|
22
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
23
|
+
var ar = [];
|
|
24
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
25
|
+
return ar;
|
|
26
|
+
};
|
|
27
|
+
return ownKeys(o);
|
|
28
|
+
};
|
|
29
|
+
return function (mod) {
|
|
30
|
+
if (mod && mod.__esModule) return mod;
|
|
31
|
+
var result = {};
|
|
32
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
33
|
+
__setModuleDefault(result, mod);
|
|
34
|
+
return result;
|
|
35
|
+
};
|
|
36
|
+
})();
|
|
37
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
|
+
exports.NpmRegistryClient = void 0;
|
|
39
|
+
const https = __importStar(require("node:https"));
|
|
40
|
+
const http = __importStar(require("node:http"));
|
|
41
|
+
const os = __importStar(require("node:os"));
|
|
42
|
+
const process = __importStar(require("node:process"));
|
|
43
|
+
const zlib = __importStar(require("node:zlib"));
|
|
44
|
+
const DEFAULT_REGISTRY_URL = 'https://registry.npmjs.org';
|
|
45
|
+
const DEFAULT_TIMEOUT_MS = 30000;
|
|
46
|
+
/**
|
|
47
|
+
* A client for fetching package metadata from the npm registry.
|
|
48
|
+
*
|
|
49
|
+
* @remarks
|
|
50
|
+
* This client provides a simple interface for fetching package metadata
|
|
51
|
+
* without external dependencies like `package-json`.
|
|
52
|
+
*
|
|
53
|
+
* @public
|
|
54
|
+
*/
|
|
55
|
+
class NpmRegistryClient {
|
|
56
|
+
constructor(options) {
|
|
57
|
+
var _a, _b, _c;
|
|
58
|
+
// trim trailing slash if one was provided
|
|
59
|
+
this._registryUrl = ((_a = options === null || options === void 0 ? void 0 : options.registryUrl) !== null && _a !== void 0 ? _a : DEFAULT_REGISTRY_URL).replace(/\/$/, '');
|
|
60
|
+
this._userAgent =
|
|
61
|
+
(_b = options === null || options === void 0 ? void 0 : options.userAgent) !== null && _b !== void 0 ? _b : `npm-check-fork node/${process.version} ${os.platform()} ${os.arch()}`;
|
|
62
|
+
this._timeoutMs = (_c = options === null || options === void 0 ? void 0 : options.timeoutMs) !== null && _c !== void 0 ? _c : DEFAULT_TIMEOUT_MS;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Builds the URL for fetching package metadata.
|
|
66
|
+
*
|
|
67
|
+
* @remarks
|
|
68
|
+
* Handles scoped packages by URL-encoding the package name.
|
|
69
|
+
* For example, `@scope/name` becomes `@scope%2Fname`.
|
|
70
|
+
*
|
|
71
|
+
* @param packageName - The name of the package
|
|
72
|
+
* @returns The full URL for fetching the package metadata
|
|
73
|
+
*/
|
|
74
|
+
_buildPackageUrl(packageName) {
|
|
75
|
+
// Scoped packages need the slash encoded
|
|
76
|
+
// @scope/name -> @scope%2Fname
|
|
77
|
+
const encodedName = packageName.replace(/\//g, '%2F');
|
|
78
|
+
return `${this._registryUrl}/${encodedName}`;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Fetches package metadata from the npm registry.
|
|
82
|
+
*
|
|
83
|
+
* @param packageName - The name of the package to fetch
|
|
84
|
+
* @returns A promise that resolves to the result containing either data or an error
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
* ```ts
|
|
88
|
+
* const client = new NpmRegistryClient();
|
|
89
|
+
* const result = await client.fetchPackageMetadataAsync('lodash');
|
|
90
|
+
* if (result.error) {
|
|
91
|
+
* console.error(result.error);
|
|
92
|
+
* } else {
|
|
93
|
+
* console.log(result.data?.['dist-tags'].latest);
|
|
94
|
+
* }
|
|
95
|
+
* ```
|
|
96
|
+
*/
|
|
97
|
+
async fetchPackageMetadataAsync(packageName) {
|
|
98
|
+
const url = this._buildPackageUrl(packageName);
|
|
99
|
+
return new Promise((resolve) => {
|
|
100
|
+
const parsedUrl = new URL(url);
|
|
101
|
+
const isHttps = parsedUrl.protocol === 'https:';
|
|
102
|
+
const requestModule = isHttps ? https : http;
|
|
103
|
+
const requestOptions = {
|
|
104
|
+
hostname: parsedUrl.hostname,
|
|
105
|
+
port: parsedUrl.port || (isHttps ? 443 : 80),
|
|
106
|
+
path: parsedUrl.pathname + parsedUrl.search,
|
|
107
|
+
method: 'GET',
|
|
108
|
+
timeout: this._timeoutMs,
|
|
109
|
+
headers: {
|
|
110
|
+
Accept: 'application/json',
|
|
111
|
+
'Accept-Encoding': 'gzip, deflate',
|
|
112
|
+
'User-Agent': this._userAgent
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
// TODO: Extract WebClient from rush-lib so that we can use it here
|
|
116
|
+
// instead of this reimplementation of HTTP request logic.
|
|
117
|
+
const request = requestModule.request(requestOptions, (response) => {
|
|
118
|
+
const chunks = [];
|
|
119
|
+
response.on('data', (chunk) => {
|
|
120
|
+
chunks.push(chunk);
|
|
121
|
+
});
|
|
122
|
+
response.on('end', () => {
|
|
123
|
+
var _a;
|
|
124
|
+
const statusCode = (_a = response.statusCode) !== null && _a !== void 0 ? _a : 0;
|
|
125
|
+
// Handle 404 - Package not found
|
|
126
|
+
if (statusCode === 404) {
|
|
127
|
+
resolve({ error: 'Package not found' });
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
// Handle other HTTP errors
|
|
131
|
+
if (statusCode < 200 || statusCode >= 300) {
|
|
132
|
+
resolve({ error: `HTTP error ${statusCode}: ${response.statusMessage}` });
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
try {
|
|
136
|
+
let buffer = Buffer.concat(chunks);
|
|
137
|
+
// Decompress if needed
|
|
138
|
+
const contentEncoding = response.headers['content-encoding'];
|
|
139
|
+
if (contentEncoding === 'gzip') {
|
|
140
|
+
buffer = zlib.gunzipSync(buffer);
|
|
141
|
+
}
|
|
142
|
+
else if (contentEncoding === 'deflate') {
|
|
143
|
+
buffer = zlib.inflateSync(buffer);
|
|
144
|
+
}
|
|
145
|
+
const data = JSON.parse(buffer.toString('utf8'));
|
|
146
|
+
// Successfully retrieved and parsed data
|
|
147
|
+
resolve({ data });
|
|
148
|
+
}
|
|
149
|
+
catch (parseError) {
|
|
150
|
+
resolve({
|
|
151
|
+
error: `Failed to parse response: ${parseError instanceof Error ? parseError.message : String(parseError)}`
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
response.on('error', (error) => {
|
|
156
|
+
resolve({ error: `Response error: ${error.message}` });
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
request.on('error', (error) => {
|
|
160
|
+
resolve({ error: `Network error: ${error.message}` });
|
|
161
|
+
});
|
|
162
|
+
request.on('timeout', () => {
|
|
163
|
+
request.destroy();
|
|
164
|
+
resolve({ error: `Request timed out after ${this._timeoutMs}ms` });
|
|
165
|
+
});
|
|
166
|
+
request.end();
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
exports.NpmRegistryClient = NpmRegistryClient;
|
|
171
|
+
//# sourceMappingURL=NpmRegistryClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NpmRegistryClient.js","sourceRoot":"","sources":["../src/NpmRegistryClient.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport * as https from 'node:https';\nimport * as http from 'node:http';\nimport * as os from 'node:os';\nimport * as process from 'node:process';\nimport * as zlib from 'node:zlib';\n\nimport type { INpmRegistryPackageResponse } from './interfaces/INpmCheckRegistry';\n\n/**\n * Options for configuring the NpmRegistryClient.\n * @public\n */\nexport interface INpmRegistryClientOptions {\n /**\n * The base URL of the npm registry.\n * @defaultValue 'https://registry.npmjs.org'\n */\n registryUrl?: string;\n\n /**\n * The User-Agent header to send with requests.\n * @defaultValue A string containing npm-check-fork version and platform info\n */\n userAgent?: string;\n\n /**\n * Request timeout in milliseconds.\n * @defaultValue 30000\n */\n timeoutMs?: number;\n}\n\n/**\n * Result from fetching package metadata from the npm registry.\n * @public\n */\nexport interface INpmRegistryClientResult {\n /**\n * The package metadata if the request was successful.\n */\n data?: INpmRegistryPackageResponse;\n\n /**\n * Error message if the request failed.\n */\n error?: string;\n}\n\nconst DEFAULT_REGISTRY_URL: string = 'https://registry.npmjs.org';\nconst DEFAULT_TIMEOUT_MS: number = 30000;\n\n/**\n * A client for fetching package metadata from the npm registry.\n *\n * @remarks\n * This client provides a simple interface for fetching package metadata\n * without external dependencies like `package-json`.\n *\n * @public\n */\nexport class NpmRegistryClient {\n private readonly _registryUrl: string;\n private readonly _userAgent: string;\n private readonly _timeoutMs: number;\n\n public constructor(options?: INpmRegistryClientOptions) {\n // trim trailing slash if one was provided\n this._registryUrl = (options?.registryUrl ?? DEFAULT_REGISTRY_URL).replace(/\\/$/, '');\n this._userAgent =\n options?.userAgent ?? `npm-check-fork node/${process.version} ${os.platform()} ${os.arch()}`;\n this._timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n }\n\n /**\n * Builds the URL for fetching package metadata.\n *\n * @remarks\n * Handles scoped packages by URL-encoding the package name.\n * For example, `@scope/name` becomes `@scope%2Fname`.\n *\n * @param packageName - The name of the package\n * @returns The full URL for fetching the package metadata\n */\n private _buildPackageUrl(packageName: string): string {\n // Scoped packages need the slash encoded\n // @scope/name -> @scope%2Fname\n const encodedName: string = packageName.replace(/\\//g, '%2F');\n return `${this._registryUrl}/${encodedName}`;\n }\n\n /**\n * Fetches package metadata from the npm registry.\n *\n * @param packageName - The name of the package to fetch\n * @returns A promise that resolves to the result containing either data or an error\n *\n * @example\n * ```ts\n * const client = new NpmRegistryClient();\n * const result = await client.fetchPackageMetadataAsync('lodash');\n * if (result.error) {\n * console.error(result.error);\n * } else {\n * console.log(result.data?.['dist-tags'].latest);\n * }\n * ```\n */\n public async fetchPackageMetadataAsync(packageName: string): Promise<INpmRegistryClientResult> {\n const url: string = this._buildPackageUrl(packageName);\n\n return new Promise<INpmRegistryClientResult>((resolve) => {\n const parsedUrl: URL = new URL(url);\n const isHttps: boolean = parsedUrl.protocol === 'https:';\n const requestModule: typeof https | typeof http = isHttps ? https : http;\n\n const requestOptions: https.RequestOptions = {\n hostname: parsedUrl.hostname,\n port: parsedUrl.port || (isHttps ? 443 : 80),\n path: parsedUrl.pathname + parsedUrl.search,\n method: 'GET',\n timeout: this._timeoutMs,\n headers: {\n Accept: 'application/json',\n 'Accept-Encoding': 'gzip, deflate',\n 'User-Agent': this._userAgent\n }\n };\n\n // TODO: Extract WebClient from rush-lib so that we can use it here\n // instead of this reimplementation of HTTP request logic.\n const request: http.ClientRequest = requestModule.request(\n requestOptions,\n (response: http.IncomingMessage) => {\n const chunks: Buffer[] = [];\n\n response.on('data', (chunk: Buffer) => {\n chunks.push(chunk);\n });\n\n response.on('end', () => {\n const statusCode: number = response.statusCode ?? 0;\n\n // Handle 404 - Package not found\n if (statusCode === 404) {\n resolve({ error: 'Package not found' });\n return;\n }\n\n // Handle other HTTP errors\n if (statusCode < 200 || statusCode >= 300) {\n resolve({ error: `HTTP error ${statusCode}: ${response.statusMessage}` });\n return;\n }\n\n try {\n let buffer: Buffer = Buffer.concat(chunks);\n\n // Decompress if needed\n const contentEncoding: string | undefined = response.headers['content-encoding'];\n if (contentEncoding === 'gzip') {\n buffer = zlib.gunzipSync(buffer);\n } else if (contentEncoding === 'deflate') {\n buffer = zlib.inflateSync(buffer);\n }\n\n const data: INpmRegistryPackageResponse = JSON.parse(buffer.toString('utf8'));\n\n // Successfully retrieved and parsed data\n resolve({ data });\n } catch (parseError) {\n resolve({\n error: `Failed to parse response: ${\n parseError instanceof Error ? parseError.message : String(parseError)\n }`\n });\n }\n });\n\n response.on('error', (error: Error) => {\n resolve({ error: `Response error: ${error.message}` });\n });\n }\n );\n\n request.on('error', (error: Error) => {\n resolve({ error: `Network error: ${error.message}` });\n });\n\n request.on('timeout', () => {\n request.destroy();\n resolve({ error: `Request timed out after ${this._timeoutMs}ms` });\n });\n\n request.end();\n });\n }\n}\n"]}
|
package/lib/index.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
export { default as NpmCheck } from './NpmCheck';
|
|
2
2
|
export type { INpmCheckPackageSummary } from './interfaces/INpmCheckPackageSummary';
|
|
3
3
|
export type { INpmCheckState } from './interfaces/INpmCheck';
|
|
4
|
+
export { NpmRegistryClient, type INpmRegistryClientOptions, type INpmRegistryClientResult } from './NpmRegistryClient';
|
|
5
|
+
export type { INpmRegistryInfo, INpmRegistryPackageResponse, INpmRegistryVersionMetadata } from './interfaces/INpmCheckRegistry';
|
|
6
|
+
export { getNpmInfoBatch } from './GetLatestFromRegistry';
|
|
4
7
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjD,YAAY,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AACpF,YAAY,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjD,YAAY,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AACpF,YAAY,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EACL,iBAAiB,EACjB,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,EAC9B,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,gBAAgB,EAChB,2BAA2B,EAC3B,2BAA2B,EAC5B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC"}
|
package/lib/index.js
CHANGED
|
@@ -3,7 +3,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.NpmCheck = void 0;
|
|
6
|
+
exports.getNpmInfoBatch = exports.NpmRegistryClient = exports.NpmCheck = void 0;
|
|
7
7
|
var NpmCheck_1 = require("./NpmCheck");
|
|
8
8
|
Object.defineProperty(exports, "NpmCheck", { enumerable: true, get: function () { return __importDefault(NpmCheck_1).default; } });
|
|
9
|
+
var NpmRegistryClient_1 = require("./NpmRegistryClient");
|
|
10
|
+
Object.defineProperty(exports, "NpmRegistryClient", { enumerable: true, get: function () { return NpmRegistryClient_1.NpmRegistryClient; } });
|
|
11
|
+
var GetLatestFromRegistry_1 = require("./GetLatestFromRegistry");
|
|
12
|
+
Object.defineProperty(exports, "getNpmInfoBatch", { enumerable: true, get: function () { return GetLatestFromRegistry_1.getNpmInfoBatch; } });
|
|
9
13
|
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,uCAAiD;AAAxC,qHAAA,OAAO,OAAY","sourcesContent":["export { default as NpmCheck } from './NpmCheck';\nexport type { INpmCheckPackageSummary } from './interfaces/INpmCheckPackageSummary';\nexport type { INpmCheckState } from './interfaces/INpmCheck';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,uCAAiD;AAAxC,qHAAA,OAAO,OAAY;AAG5B,yDAI6B;AAH3B,sHAAA,iBAAiB,OAAA;AASnB,iEAA0D;AAAjD,wHAAA,eAAe,OAAA","sourcesContent":["export { default as NpmCheck } from './NpmCheck';\nexport type { INpmCheckPackageSummary } from './interfaces/INpmCheckPackageSummary';\nexport type { INpmCheckState } from './interfaces/INpmCheck';\nexport {\n NpmRegistryClient,\n type INpmRegistryClientOptions,\n type INpmRegistryClientResult\n} from './NpmRegistryClient';\nexport type {\n INpmRegistryInfo,\n INpmRegistryPackageResponse,\n INpmRegistryVersionMetadata\n} from './interfaces/INpmCheckRegistry';\nexport { getNpmInfoBatch } from './GetLatestFromRegistry';\n"]}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The result returned by getNpmInfo for a single package.
|
|
3
|
+
*/
|
|
1
4
|
export interface INpmRegistryInfo {
|
|
2
5
|
latest?: string;
|
|
3
6
|
next?: string;
|
|
@@ -22,5 +25,40 @@ export interface INpmCheckRegistryData {
|
|
|
22
25
|
latest: string;
|
|
23
26
|
};
|
|
24
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Metadata for a specific package version from the npm registry.
|
|
30
|
+
*
|
|
31
|
+
* @remarks
|
|
32
|
+
* This interface extends the existing INpmCheckPackageVersion with additional
|
|
33
|
+
* fields that are present in the npm registry response.
|
|
34
|
+
*
|
|
35
|
+
* @see https://github.com/npm/registry/blob/main/docs/responses/package-metadata.md
|
|
36
|
+
*/
|
|
37
|
+
export interface INpmRegistryVersionMetadata extends INpmCheckPackageVersion {
|
|
38
|
+
/** Package name */
|
|
39
|
+
name: string;
|
|
40
|
+
/** Version string */
|
|
41
|
+
version: string;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Response structure from npm registry API for full metadata.
|
|
45
|
+
*
|
|
46
|
+
* @remarks
|
|
47
|
+
* This interface represents the full response from the npm registry when
|
|
48
|
+
* fetching package metadata. It is structurally compatible with INpmCheckRegistryData
|
|
49
|
+
* to maintain compatibility with existing code like bestGuessHomepage.
|
|
50
|
+
*
|
|
51
|
+
* @see https://github.com/npm/registry/blob/main/docs/responses/package-metadata.md
|
|
52
|
+
*/
|
|
53
|
+
export interface INpmRegistryPackageResponse {
|
|
54
|
+
/** Package name */
|
|
55
|
+
name: string;
|
|
56
|
+
/** Distribution tags (latest, next, etc.) */
|
|
57
|
+
'dist-tags': Record<string, string>;
|
|
58
|
+
/** All published versions with their metadata */
|
|
59
|
+
versions: Record<string, INpmRegistryVersionMetadata>;
|
|
60
|
+
/** Modification timestamps for each version */
|
|
61
|
+
time?: Record<string, string>;
|
|
62
|
+
}
|
|
25
63
|
export {};
|
|
26
64
|
//# sourceMappingURL=INpmCheckRegistry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"INpmCheckRegistry.d.ts","sourceRoot":"","sources":["../../src/interfaces/INpmCheckRegistry.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,yBAAyB;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AACD,UAAU,mBAAmB;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AACD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,yBAAyB,CAAC;IACjC,UAAU,CAAC,EAAE,mBAAmB,CAAC;CAClC;AACD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;IAClD,CAAC,WAAW,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACnC"}
|
|
1
|
+
{"version":3,"file":"INpmCheckRegistry.d.ts","sourceRoot":"","sources":["../../src/interfaces/INpmCheckRegistry.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,yBAAyB;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AACD,UAAU,mBAAmB;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AACD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,yBAAyB,CAAC;IACjC,UAAU,CAAC,EAAE,mBAAmB,CAAC;CAClC;AACD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;IAClD,CAAC,WAAW,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACnC;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,2BAA4B,SAAQ,uBAAuB;IAC1E,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IAEb,qBAAqB;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,2BAA2B;IAC1C,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IAEb,6CAA6C;IAC7C,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEpC,iDAAiD;IACjD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,2BAA2B,CAAC,CAAC;IAEtD,+CAA+C;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"INpmCheckRegistry.js","sourceRoot":"","sources":["../../src/interfaces/INpmCheckRegistry.ts"],"names":[],"mappings":"","sourcesContent":["
|
|
1
|
+
{"version":3,"file":"INpmCheckRegistry.js","sourceRoot":"","sources":["../../src/interfaces/INpmCheckRegistry.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * The result returned by getNpmInfo for a single package.\n */\nexport interface INpmRegistryInfo {\n latest?: string;\n next?: string;\n versions?: string[];\n homepage?: string;\n error?: string;\n}\n\ninterface INpmCheckRegistryInfoBugs {\n url?: string;\n}\ninterface INpmCheckRepository {\n url?: string;\n}\nexport interface INpmCheckPackageVersion {\n homepage?: string;\n bugs?: INpmCheckRegistryInfoBugs;\n repository?: INpmCheckRepository;\n}\nexport interface INpmCheckRegistryData {\n versions: Record<string, INpmCheckPackageVersion>;\n ['dist-tags']: { latest: string };\n}\n\n/**\n * Metadata for a specific package version from the npm registry.\n *\n * @remarks\n * This interface extends the existing INpmCheckPackageVersion with additional\n * fields that are present in the npm registry response.\n *\n * @see https://github.com/npm/registry/blob/main/docs/responses/package-metadata.md\n */\nexport interface INpmRegistryVersionMetadata extends INpmCheckPackageVersion {\n /** Package name */\n name: string;\n\n /** Version string */\n version: string;\n}\n\n/**\n * Response structure from npm registry API for full metadata.\n *\n * @remarks\n * This interface represents the full response from the npm registry when\n * fetching package metadata. It is structurally compatible with INpmCheckRegistryData\n * to maintain compatibility with existing code like bestGuessHomepage.\n *\n * @see https://github.com/npm/registry/blob/main/docs/responses/package-metadata.md\n */\nexport interface INpmRegistryPackageResponse {\n /** Package name */\n name: string;\n\n /** Distribution tags (latest, next, etc.) */\n 'dist-tags': Record<string, string>;\n\n /** All published versions with their metadata */\n versions: Record<string, INpmRegistryVersionMetadata>;\n\n /** Modification timestamps for each version */\n time?: Record<string, string>;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GetLatestFromRegistry.test.js","sourceRoot":"","sources":["../../src/tests/GetLatestFromRegistry.test.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"GetLatestFromRegistry.test.js","sourceRoot":"","sources":["../../src/tests/GetLatestFromRegistry.test.ts"],"names":[],"mappings":"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","sourcesContent":["// Mock the NpmRegistryClient before imports\njest.mock('../NpmRegistryClient');\n\nimport type { INpmRegistryInfo, INpmRegistryPackageResponse } from '../interfaces/INpmCheckRegistry';\n\ndescribe('getNpmInfo', () => {\n let getNpmInfo: (packageName: string) => Promise<INpmRegistryInfo>;\n let mockFetchPackageMetadataAsync: jest.Mock;\n\n beforeEach(() => {\n jest.resetModules();\n jest.clearAllMocks();\n\n // Re-require to get fresh module instances\n mockFetchPackageMetadataAsync = jest.fn();\n\n // Set up the mock implementation before importing getNpmInfo\n const mockNpmRegistryClient = jest.requireMock('../NpmRegistryClient');\n mockNpmRegistryClient.NpmRegistryClient.mockImplementation(() => ({\n fetchPackageMetadataAsync: mockFetchPackageMetadataAsync\n }));\n\n // Import the module under test\n const module = jest.requireActual('../GetLatestFromRegistry');\n getNpmInfo = module.default;\n });\n\n it('returns registry info with homepage', async () => {\n const mockData: INpmRegistryPackageResponse = {\n name: 'test-package',\n versions: {\n '1.0.0': {\n name: 'test-package',\n version: '1.0.0',\n homepage: 'https://homepage.com'\n },\n '2.0.0': {\n name: 'test-package',\n version: '2.0.0',\n bugs: { url: 'https://bugs.com' }\n }\n },\n 'dist-tags': { latest: '1.0.0', next: '2.0.0' }\n };\n mockFetchPackageMetadataAsync.mockResolvedValue({ data: mockData });\n\n const result: INpmRegistryInfo = await getNpmInfo('test-package');\n expect(result).toHaveProperty('latest', '1.0.0');\n expect(result).toHaveProperty('next', '2.0.0');\n expect(result).toHaveProperty('versions', ['1.0.0', '2.0.0']);\n expect(result).toHaveProperty('homepage', 'https://homepage.com');\n });\n\n it('returns error if fetch fails', async () => {\n mockFetchPackageMetadataAsync.mockResolvedValue({ error: 'Registry down' });\n\n const result: INpmRegistryInfo = await getNpmInfo('test-package');\n expect(result).toHaveProperty('error');\n expect(result.error).toBe('Registry error Registry down');\n });\n\n it('returns \"\" homepage if not present', async () => {\n const mockData: INpmRegistryPackageResponse = {\n name: 'test-package',\n versions: {\n '1.0.0': {\n name: 'test-package',\n version: '1.0.0'\n },\n '2.0.0': {\n name: 'test-package',\n version: '2.0.0'\n }\n },\n 'dist-tags': { latest: '1.0.0', next: '2.0.0' }\n };\n mockFetchPackageMetadataAsync.mockResolvedValue({ data: mockData });\n\n const result: INpmRegistryInfo = await getNpmInfo('test-package');\n expect(result).toHaveProperty('homepage', '');\n });\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NpmRegistryClient.test.d.ts","sourceRoot":"","sources":["../../src/tests/NpmRegistryClient.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NpmRegistryClient.test.js","sourceRoot":"","sources":["../../src/tests/NpmRegistryClient.test.ts"],"names":[],"mappings":"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","sourcesContent":["// Mock modules\njest.mock('node:https');\njest.mock('node:http');\n\nimport type * as http from 'node:http';\nimport type * as https from 'node:https';\nimport { EventEmitter } from 'node:events';\nimport * as zlib from 'node:zlib';\n\nimport { NpmRegistryClient, type INpmRegistryClientOptions } from '../NpmRegistryClient';\nimport type { INpmRegistryPackageResponse } from '../interfaces/INpmCheckRegistry';\n\ndescribe('NpmRegistryClient', () => {\n let mockHttpsRequest: jest.Mock;\n let mockHttpRequest: jest.Mock;\n\n beforeEach(() => {\n jest.clearAllMocks();\n\n // Get the mocked modules\n const httpsModule = jest.requireMock('node:https');\n const httpModule = jest.requireMock('node:http');\n\n mockHttpsRequest = httpsModule.request = jest.fn();\n mockHttpRequest = httpModule.request = jest.fn();\n });\n\n describe('constructor', () => {\n it('uses default registry URL when not provided', () => {\n const client = new NpmRegistryClient();\n expect(client).toBeDefined();\n });\n\n it('accepts custom options', () => {\n const options: INpmRegistryClientOptions = {\n registryUrl: 'https://custom.registry.com',\n userAgent: 'custom-agent',\n timeoutMs: 10000\n };\n const client = new NpmRegistryClient(options);\n expect(client).toBeDefined();\n });\n\n it('removes trailing slash from registry URL', () => {\n const options: INpmRegistryClientOptions = {\n registryUrl: 'https://registry.example.com/'\n };\n const client = new NpmRegistryClient(options);\n expect(client).toBeDefined();\n });\n });\n\n describe('fetchPackageMetadataAsync', () => {\n interface IMockRequest extends EventEmitter {\n destroy: jest.Mock;\n end: jest.Mock;\n }\n\n interface IMockResponse extends EventEmitter {\n statusCode?: number;\n statusMessage?: string;\n headers: Record<string, string>;\n }\n\n function createMockRequest(): {\n request: IMockRequest;\n response: IMockResponse;\n } {\n const request = new EventEmitter() as IMockRequest;\n const response = new EventEmitter() as IMockResponse;\n\n request.destroy = jest.fn();\n request.end = jest.fn();\n response.headers = {};\n\n return { request, response };\n }\n\n it('successfully fetches package metadata with https', async () => {\n const client = new NpmRegistryClient();\n const { request, response } = createMockRequest();\n\n const mockData: INpmRegistryPackageResponse = {\n name: 'test-package',\n versions: {\n '1.0.0': {\n name: 'test-package',\n version: '1.0.0'\n }\n },\n 'dist-tags': { latest: '1.0.0' }\n };\n\n mockHttpsRequest.mockImplementation(\n (options: https.RequestOptions, callback: (res: http.IncomingMessage) => void) => {\n // Verify request options\n expect(options.hostname).toBe('registry.npmjs.org');\n expect(options.method).toBe('GET');\n expect(options.headers).toMatchObject({\n Accept: 'application/json',\n 'Accept-Encoding': 'gzip, deflate',\n 'User-Agent': expect.stringContaining('npm-check-fork')\n });\n\n // Trigger callback with response\n setImmediate(() => callback(response as http.IncomingMessage));\n return request;\n }\n );\n\n const fetchPromise = client.fetchPackageMetadataAsync('test-package');\n\n // Simulate response\n response.statusCode = 200;\n response.statusMessage = 'OK';\n setImmediate(() => {\n response.emit('data', Buffer.from(JSON.stringify(mockData)));\n response.emit('end');\n });\n\n const result = await fetchPromise;\n expect(result.data).toEqual(mockData);\n expect(result.error).toBeUndefined();\n });\n\n it('builds correct URL for scoped packages', async () => {\n const client = new NpmRegistryClient();\n const { request, response } = createMockRequest();\n\n mockHttpsRequest.mockImplementation(\n (options: https.RequestOptions, callback: (res: http.IncomingMessage) => void) => {\n // Verify that scoped package name is URL-encoded\n expect(options.path).toBe('/@scope%2Fpackage-name');\n\n setImmediate(() => callback(response as http.IncomingMessage));\n return request;\n }\n );\n\n const fetchPromise = client.fetchPackageMetadataAsync('@scope/package-name');\n\n response.statusCode = 200;\n setImmediate(() => {\n response.emit(\n 'data',\n Buffer.from(JSON.stringify({ name: '@scope/package-name', versions: {}, 'dist-tags': {} }))\n );\n response.emit('end');\n });\n\n await fetchPromise;\n });\n\n it('uses custom registry URL', async () => {\n const client = new NpmRegistryClient({ registryUrl: 'https://custom.registry.com' });\n const { request, response } = createMockRequest();\n\n mockHttpsRequest.mockImplementation(\n (options: https.RequestOptions, callback: (res: http.IncomingMessage) => void) => {\n expect(options.hostname).toBe('custom.registry.com');\n\n setImmediate(() => callback(response as http.IncomingMessage));\n return request;\n }\n );\n\n const fetchPromise = client.fetchPackageMetadataAsync('test-package');\n\n response.statusCode = 200;\n setImmediate(() => {\n response.emit('data', Buffer.from(JSON.stringify({ name: 'test', versions: {}, 'dist-tags': {} })));\n response.emit('end');\n });\n\n await fetchPromise;\n });\n\n it('uses http for http URLs', async () => {\n const client = new NpmRegistryClient({ registryUrl: 'http://custom.registry.com' });\n const { request, response } = createMockRequest();\n\n mockHttpRequest.mockImplementation(\n (options: http.RequestOptions, callback: (res: http.IncomingMessage) => void) => {\n expect(options.hostname).toBe('custom.registry.com');\n expect(options.port).toBe(80);\n\n setImmediate(() => callback(response as http.IncomingMessage));\n return request;\n }\n );\n\n const fetchPromise = client.fetchPackageMetadataAsync('test-package');\n\n response.statusCode = 200;\n setImmediate(() => {\n response.emit('data', Buffer.from(JSON.stringify({ name: 'test', versions: {}, 'dist-tags': {} })));\n response.emit('end');\n });\n\n await fetchPromise;\n expect(mockHttpRequest).toHaveBeenCalled();\n expect(mockHttpsRequest).not.toHaveBeenCalled();\n });\n\n it('handles gzip-encoded responses', async () => {\n const client = new NpmRegistryClient();\n const { request, response } = createMockRequest();\n\n const mockData: INpmRegistryPackageResponse = {\n name: 'test-package',\n versions: {},\n 'dist-tags': { latest: '1.0.0' }\n };\n\n mockHttpsRequest.mockImplementation(\n (options: https.RequestOptions, callback: (res: http.IncomingMessage) => void) => {\n setImmediate(() => callback(response as http.IncomingMessage));\n return request;\n }\n );\n\n const fetchPromise = client.fetchPackageMetadataAsync('test-package');\n\n response.statusCode = 200;\n response.headers['content-encoding'] = 'gzip';\n\n setImmediate(() => {\n const compressed = zlib.gzipSync(Buffer.from(JSON.stringify(mockData)));\n response.emit('data', compressed);\n response.emit('end');\n });\n\n const result = await fetchPromise;\n expect(result.data).toEqual(mockData);\n expect(result.error).toBeUndefined();\n });\n\n it('handles deflate-encoded responses', async () => {\n const client = new NpmRegistryClient();\n const { request, response } = createMockRequest();\n\n const mockData: INpmRegistryPackageResponse = {\n name: 'test-package',\n versions: {},\n 'dist-tags': { latest: '1.0.0' }\n };\n\n mockHttpsRequest.mockImplementation(\n (options: https.RequestOptions, callback: (res: http.IncomingMessage) => void) => {\n setImmediate(() => callback(response as http.IncomingMessage));\n return request;\n }\n );\n\n const fetchPromise = client.fetchPackageMetadataAsync('test-package');\n\n response.statusCode = 200;\n response.headers['content-encoding'] = 'deflate';\n\n setImmediate(() => {\n const compressed = zlib.deflateSync(Buffer.from(JSON.stringify(mockData)));\n response.emit('data', compressed);\n response.emit('end');\n });\n\n const result = await fetchPromise;\n expect(result.data).toEqual(mockData);\n expect(result.error).toBeUndefined();\n });\n\n it('handles 404 status code', async () => {\n const client = new NpmRegistryClient();\n const { request, response } = createMockRequest();\n\n mockHttpsRequest.mockImplementation(\n (options: https.RequestOptions, callback: (res: http.IncomingMessage) => void) => {\n setImmediate(() => callback(response as http.IncomingMessage));\n return request;\n }\n );\n\n const fetchPromise = client.fetchPackageMetadataAsync('nonexistent-package');\n\n response.statusCode = 404;\n response.statusMessage = 'Not Found';\n setImmediate(() => {\n response.emit('data', Buffer.from('Not found'));\n response.emit('end');\n });\n\n const result = await fetchPromise;\n expect(result.data).toBeUndefined();\n expect(result.error).toBe('Package not found');\n });\n\n it('handles non-2xx status codes', async () => {\n const client = new NpmRegistryClient();\n const { request, response } = createMockRequest();\n\n mockHttpsRequest.mockImplementation(\n (options: https.RequestOptions, callback: (res: http.IncomingMessage) => void) => {\n setImmediate(() => callback(response as http.IncomingMessage));\n return request;\n }\n );\n\n const fetchPromise = client.fetchPackageMetadataAsync('test-package');\n\n response.statusCode = 500;\n response.statusMessage = 'Internal Server Error';\n setImmediate(() => {\n response.emit('data', Buffer.from('Error'));\n response.emit('end');\n });\n\n const result = await fetchPromise;\n expect(result.data).toBeUndefined();\n expect(result.error).toBe('HTTP error 500: Internal Server Error');\n });\n\n it('handles network errors', async () => {\n const client = new NpmRegistryClient();\n const { request } = createMockRequest();\n\n mockHttpsRequest.mockImplementation(() => {\n return request;\n });\n\n const fetchPromise = client.fetchPackageMetadataAsync('test-package');\n\n setImmediate(() => {\n request.emit('error', new Error('Network connection failed'));\n });\n\n const result = await fetchPromise;\n expect(result.data).toBeUndefined();\n expect(result.error).toBe('Network error: Network connection failed');\n });\n\n it('handles response errors', async () => {\n const client = new NpmRegistryClient();\n const { request, response } = createMockRequest();\n\n mockHttpsRequest.mockImplementation(\n (options: https.RequestOptions, callback: (res: http.IncomingMessage) => void) => {\n setImmediate(() => callback(response as http.IncomingMessage));\n return request;\n }\n );\n\n const fetchPromise = client.fetchPackageMetadataAsync('test-package');\n\n response.statusCode = 200;\n setImmediate(() => {\n response.emit('error', new Error('Stream error'));\n });\n\n const result = await fetchPromise;\n expect(result.data).toBeUndefined();\n expect(result.error).toBe('Response error: Stream error');\n });\n\n it('handles timeout', async () => {\n const client = new NpmRegistryClient({ timeoutMs: 1000 });\n const { request } = createMockRequest();\n\n mockHttpsRequest.mockImplementation(() => {\n return request;\n });\n\n const fetchPromise = client.fetchPackageMetadataAsync('test-package');\n\n setImmediate(() => {\n request.emit('timeout');\n });\n\n const result = await fetchPromise;\n expect(result.data).toBeUndefined();\n expect(result.error).toBe('Request timed out after 1000ms');\n expect(request.destroy).toHaveBeenCalled();\n });\n\n it('handles JSON parse errors', async () => {\n const client = new NpmRegistryClient();\n const { request, response } = createMockRequest();\n\n mockHttpsRequest.mockImplementation(\n (options: https.RequestOptions, callback: (res: http.IncomingMessage) => void) => {\n setImmediate(() => callback(response as http.IncomingMessage));\n return request;\n }\n );\n\n const fetchPromise = client.fetchPackageMetadataAsync('test-package');\n\n response.statusCode = 200;\n setImmediate(() => {\n response.emit('data', Buffer.from('invalid json'));\n response.emit('end');\n });\n\n const result = await fetchPromise;\n expect(result.data).toBeUndefined();\n expect(result.error).toContain('Failed to parse response');\n });\n\n it('uses custom User-Agent header', async () => {\n const client = new NpmRegistryClient({ userAgent: 'custom-agent/1.0' });\n const { request, response } = createMockRequest();\n\n mockHttpsRequest.mockImplementation(\n (options: https.RequestOptions, callback: (res: http.IncomingMessage) => void) => {\n expect(options.headers?.['User-Agent']).toBe('custom-agent/1.0');\n\n setImmediate(() => callback(response as http.IncomingMessage));\n return request;\n }\n );\n\n const fetchPromise = client.fetchPackageMetadataAsync('test-package');\n\n response.statusCode = 200;\n setImmediate(() => {\n response.emit('data', Buffer.from(JSON.stringify({ name: 'test', versions: {}, 'dist-tags': {} })));\n response.emit('end');\n });\n\n await fetchPromise;\n });\n\n it('uses custom timeout value', async () => {\n const client = new NpmRegistryClient({ timeoutMs: 5000 });\n const { request, response } = createMockRequest();\n\n mockHttpsRequest.mockImplementation(\n (options: https.RequestOptions, callback: (res: http.IncomingMessage) => void) => {\n expect(options.timeout).toBe(5000);\n\n setImmediate(() => callback(response as http.IncomingMessage));\n return request;\n }\n );\n\n const fetchPromise = client.fetchPackageMetadataAsync('test-package');\n\n response.statusCode = 200;\n setImmediate(() => {\n response.emit('data', Buffer.from(JSON.stringify({ name: 'test', versions: {}, 'dist-tags': {} })));\n response.emit('end');\n });\n\n await fetchPromise;\n });\n });\n});\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rushstack/npm-check-fork",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.11",
|
|
4
4
|
"description": "A fork of npm-check.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -14,15 +14,14 @@
|
|
|
14
14
|
"dependencies": {
|
|
15
15
|
"giturl": "^2.0.0",
|
|
16
16
|
"lodash": "~4.17.15",
|
|
17
|
-
"package-json": "^10.0.1",
|
|
18
17
|
"semver": "~7.5.4",
|
|
19
|
-
"
|
|
18
|
+
"@rushstack/node-core-library": "5.19.1"
|
|
20
19
|
},
|
|
21
20
|
"devDependencies": {
|
|
22
21
|
"@types/lodash": "4.14.116",
|
|
23
22
|
"@types/semver": "7.5.0",
|
|
24
23
|
"eslint": "~9.37.0",
|
|
25
|
-
"@rushstack/heft": "1.1.
|
|
24
|
+
"@rushstack/heft": "1.1.11",
|
|
26
25
|
"local-node-rig": "1.0.0"
|
|
27
26
|
},
|
|
28
27
|
"scripts": {
|