@rushstack/npm-check-fork 0.1.6 → 0.1.10

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 CHANGED
@@ -1,6 +1,54 @@
1
1
  {
2
2
  "name": "@rushstack/npm-check-fork",
3
3
  "entries": [
4
+ {
5
+ "version": "0.1.10",
6
+ "tag": "@rushstack/npm-check-fork_v0.1.10",
7
+ "date": "Wed, 28 Jan 2026 01:15:23 GMT",
8
+ "comments": {
9
+ "patch": [
10
+ {
11
+ "comment": "Remove dependencies on throat and package-json"
12
+ }
13
+ ]
14
+ }
15
+ },
16
+ {
17
+ "version": "0.1.9",
18
+ "tag": "@rushstack/npm-check-fork_v0.1.9",
19
+ "date": "Thu, 08 Jan 2026 01:12:30 GMT",
20
+ "comments": {
21
+ "dependency": [
22
+ {
23
+ "comment": "Updating dependency \"@rushstack/heft\" to `1.1.10`"
24
+ }
25
+ ]
26
+ }
27
+ },
28
+ {
29
+ "version": "0.1.8",
30
+ "tag": "@rushstack/npm-check-fork_v0.1.8",
31
+ "date": "Wed, 07 Jan 2026 01:12:25 GMT",
32
+ "comments": {
33
+ "dependency": [
34
+ {
35
+ "comment": "Updating dependency \"@rushstack/heft\" to `1.1.9`"
36
+ }
37
+ ]
38
+ }
39
+ },
40
+ {
41
+ "version": "0.1.7",
42
+ "tag": "@rushstack/npm-check-fork_v0.1.7",
43
+ "date": "Mon, 05 Jan 2026 16:12:50 GMT",
44
+ "comments": {
45
+ "dependency": [
46
+ {
47
+ "comment": "Updating dependency \"@rushstack/heft\" to `1.1.8`"
48
+ }
49
+ ]
50
+ }
51
+ },
4
52
  {
5
53
  "version": "0.1.6",
6
54
  "tag": "@rushstack/npm-check-fork_v0.1.6",
package/CHANGELOG.md CHANGED
@@ -1,6 +1,28 @@
1
1
  # Change Log - @rushstack/npm-check-fork
2
2
 
3
- This log was last generated on Sat, 06 Dec 2025 01:12:28 GMT and should not be manually modified.
3
+ This log was last generated on Wed, 28 Jan 2026 01:15:23 GMT and should not be manually modified.
4
+
5
+ ## 0.1.10
6
+ Wed, 28 Jan 2026 01:15:23 GMT
7
+
8
+ ### Patches
9
+
10
+ - Remove dependencies on throat and package-json
11
+
12
+ ## 0.1.9
13
+ Thu, 08 Jan 2026 01:12:30 GMT
14
+
15
+ _Version update only_
16
+
17
+ ## 0.1.8
18
+ Wed, 07 Jan 2026 01:12:25 GMT
19
+
20
+ _Version update only_
21
+
22
+ ## 0.1.7
23
+ Mon, 05 Jan 2026 16:12:50 GMT
24
+
25
+ _Version update only_
4
26
 
5
27
  ## 0.1.6
6
28
  Sat, 06 Dec 2025 01:12:28 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":"AAQA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAIvE,wBAA8B,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAgCvF"}
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 package_json_1 = __importDefault(require("package-json"));
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 cpuCount = node_os_1.default.cpus().length;
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 limit = (0, throat_1.default)(cpuCount, () => (0, package_json_1.default)(packageName, { fullMetadata: true, allVersions: true }));
16
- return limit()
17
- .then((rawData) => {
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: errorMessage
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":";;;;;AAYA,6BAgCC;AA5CD,sDAAyB;AAEzB,oDAAuB;AACvB,oDAA4B;AAC5B,gEAAuC;AACvC,oDAA4B;AAE5B,4EAAoD;AAGpD,MAAM,QAAQ,GAAW,iBAAE,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC;AAE3B,KAAK,UAAU,UAAU,CAAC,WAAmB;IAC1D,MAAM,KAAK,GAA4C,IAAA,gBAAM,EAAC,QAAQ,EAAE,GAAG,EAAE,CAC3E,IAAA,sBAAW,EAAC,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CACpE,CAAC;IACF,OAAO,KAAK,EAAE;SACX,IAAI,CAAC,CAAC,OAAiC,EAAE,EAAE;QAC1C,MAAM,iBAAiB,GAAW,UAAU,CAAC;QAC7C,MAAM,cAAc,GAAa,IAAA,gBAAC,EAAC,OAAO,CAAC,QAAQ,CAAC;aACjD,IAAI,EAAE;aACN,MAAM,CAAC,gBAAC,CAAC,OAAO,CAAC,gBAAM,CAAC,EAAE,EAAE,iBAAiB,CAAC,CAAC;aAC/C,IAAI,CAAC,gBAAM,CAAC,OAAO,CAAC;aACpB,OAAO,EAAE,CAAC;QAEb,MAAM,MAAM,GAAW,OAAO,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC;QACnD,MAAM,IAAI,GAAW,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC;QAC/C,MAAM,mBAAmB,GAAuB,gBAAM,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC;YAC3E,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,gBAAM,CAAC,aAAa,CAAC,cAAc,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;QAEpD,OAAO;YACL,MAAM,EAAE,mBAAmB;YAC3B,IAAI,EAAE,IAAI;YACV,QAAQ,EAAE,cAAc;YACxB,QAAQ,EAAE,IAAA,2BAAiB,EAAC,OAAO,CAAC,IAAI,EAAE;SAC3C,CAAC;IACJ,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACf,MAAM,YAAY,GAAW,kBAAkB,KAAK,CAAC,OAAO,EAAE,CAAC;QAC/D,OAAO;YACL,KAAK,EAAE,YAAY;SACpB,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC","sourcesContent":["import os from 'node:os';\n\nimport _ from 'lodash';\nimport semver from 'semver';\nimport packageJson from 'package-json';\nimport throat from 'throat';\n\nimport bestGuessHomepage from './BestGuessHomepage';\nimport type { INpmRegistryInfo } from './interfaces/INpmCheckRegistry';\n\nconst cpuCount: number = os.cpus().length;\n\nexport default async function getNpmInfo(packageName: string): Promise<INpmRegistryInfo> {\n const limit: () => Promise<packageJson.FullMetadata> = throat(cpuCount, () =>\n packageJson(packageName, { fullMetadata: true, allVersions: true })\n );\n return limit()\n .then((rawData: packageJson.FullMetadata) => {\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 return {\n latest: latestStableRelease,\n next: next,\n versions: sortedVersions,\n homepage: bestGuessHomepage(rawData) || ''\n };\n })\n .catch((error) => {\n const errorMessage: string = `Registry error ${error.message}`;\n return {\n error: errorMessage\n };\n });\n}\n"]}
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
@@ -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":["export 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"]}
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":";;;;;AAAA,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AAE1B,qFAAkD;AAClD,gEAAuC;AAGvC,MAAM,eAAe,GAAG,sBAAsD,CAAC;AAE/E,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,eAAe,CAAC,iBAAiB,CAAC;YAChC,QAAQ,EAAE;gBACR,OAAO,EAAE;oBACP,QAAQ,EAAE,sBAAsB;iBACjC;gBACD,OAAO,EAAE;oBACP,IAAI,EAAE,EAAE,GAAG,EAAE,kBAAkB,EAAE;iBAClC;aACF;YACD,WAAW,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE;SACT,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAqB,MAAM,IAAA,+BAAU,EAAC,cAAc,CAAC,CAAC;QAClE,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,UAAU,EAAE,sBAAsB,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,eAAe,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAqB,MAAM,IAAA,+BAAU,EAAC,cAAc,CAAC,CAAC;QAClE,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,eAAe,CAAC,iBAAiB,CAAC;YAChC,QAAQ,EAAE;gBACR,OAAO,EAAE,EAAE;gBACX,OAAO,EAAE,EAAE;aACZ;YACD,WAAW,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE;SACT,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAqB,MAAM,IAAA,+BAAU,EAAC,cAAc,CAAC,CAAC;QAClE,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["jest.mock('package-json');\n\nimport getNpmInfo from '../GetLatestFromRegistry';\nimport packageJson from 'package-json';\nimport type { INpmRegistryInfo } from '../interfaces/INpmCheckRegistry';\n\nconst mockPackageJson = packageJson as jest.MockedFunction<typeof packageJson>;\n\ndescribe('getNpmInfo', () => {\n beforeEach(() => {\n jest.clearAllMocks();\n });\n\n it('returns registry info with homepage', async () => {\n mockPackageJson.mockResolvedValue({\n versions: {\n '1.0.0': {\n homepage: 'https://homepage.com'\n },\n '2.0.0': {\n bugs: { url: 'https://bugs.com' }\n }\n },\n 'dist-tags': { latest: '1.0.0', next: '2.0.0' }\n } as unknown as packageJson.FullMetadata);\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 packageJson throws', async () => {\n mockPackageJson.mockRejectedValue(new Error('Registry down'));\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 mockPackageJson.mockResolvedValue({\n versions: {\n '1.0.0': {},\n '2.0.0': {}\n },\n 'dist-tags': { latest: '1.0.0', next: '2.0.0' }\n } as unknown as packageJson.FullMetadata);\n const result: INpmRegistryInfo = await getNpmInfo('test-package');\n expect(result).toHaveProperty('homepage', '');\n });\n});\n"]}
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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=NpmRegistryClient.test.d.ts.map
@@ -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.6",
3
+ "version": "0.1.10",
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
- "throat": "^6.0.2"
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.7",
24
+ "@rushstack/heft": "1.1.10",
26
25
  "local-node-rig": "1.0.0"
27
26
  },
28
27
  "scripts": {