@rushstack/npm-check-fork 0.1.14 → 0.2.0
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 +20 -0
- package/CHANGELOG.md +8 -1
- package/lib-esm/BestGuessHomepage.js +19 -0
- package/lib-esm/BestGuessHomepage.js.map +1 -0
- package/lib-esm/CreatePackageSummary.js +78 -0
- package/lib-esm/CreatePackageSummary.js.map +1 -0
- package/lib-esm/FindModulePath.js +21 -0
- package/lib-esm/FindModulePath.js.map +1 -0
- package/lib-esm/GetLatestFromRegistry.js +71 -0
- package/lib-esm/GetLatestFromRegistry.js.map +1 -0
- package/lib-esm/NpmCheck.js +23 -0
- package/lib-esm/NpmCheck.js.map +1 -0
- package/lib-esm/NpmCheckState.js +19 -0
- package/lib-esm/NpmCheckState.js.map +1 -0
- package/lib-esm/NpmRegistryClient.js +134 -0
- package/lib-esm/NpmRegistryClient.js.map +1 -0
- package/lib-esm/ReadPackageJson.js +18 -0
- package/lib-esm/ReadPackageJson.js.map +1 -0
- package/lib-esm/index.js +4 -0
- package/lib-esm/index.js.map +1 -0
- package/lib-esm/interfaces/INpmCheck.js +6 -0
- package/lib-esm/interfaces/INpmCheck.js.map +1 -0
- package/lib-esm/interfaces/INpmCheckPackageSummary.js +2 -0
- package/lib-esm/interfaces/INpmCheckPackageSummary.js.map +1 -0
- package/lib-esm/interfaces/INpmCheckRegistry.js +2 -0
- package/lib-esm/interfaces/INpmCheckRegistry.js.map +1 -0
- package/lib-esm/tests/BestGuessHomepage.test.js.map +1 -0
- package/lib-esm/tests/CreatePackageSummary.test.js.map +1 -0
- package/lib-esm/tests/FindModulePath.test.js.map +1 -0
- package/lib-esm/tests/GetLatestFromRegistry.test.js.map +1 -0
- package/lib-esm/tests/NpmCheck.test.js.map +1 -0
- package/lib-esm/tests/NpmCheckState.test.js.map +1 -0
- package/lib-esm/tests/NpmRegistryClient.test.js.map +1 -0
- package/lib-esm/tests/ReadPackageJson.test.js.map +1 -0
- package/package.json +27 -5
- /package/{lib → lib-commonjs}/BestGuessHomepage.js +0 -0
- /package/{lib → lib-commonjs}/BestGuessHomepage.js.map +0 -0
- /package/{lib → lib-commonjs}/CreatePackageSummary.js +0 -0
- /package/{lib → lib-commonjs}/CreatePackageSummary.js.map +0 -0
- /package/{lib → lib-commonjs}/FindModulePath.js +0 -0
- /package/{lib → lib-commonjs}/FindModulePath.js.map +0 -0
- /package/{lib → lib-commonjs}/GetLatestFromRegistry.js +0 -0
- /package/{lib → lib-commonjs}/GetLatestFromRegistry.js.map +0 -0
- /package/{lib → lib-commonjs}/NpmCheck.js +0 -0
- /package/{lib → lib-commonjs}/NpmCheck.js.map +0 -0
- /package/{lib → lib-commonjs}/NpmCheckState.js +0 -0
- /package/{lib → lib-commonjs}/NpmCheckState.js.map +0 -0
- /package/{lib → lib-commonjs}/NpmRegistryClient.js +0 -0
- /package/{lib → lib-commonjs}/NpmRegistryClient.js.map +0 -0
- /package/{lib → lib-commonjs}/ReadPackageJson.js +0 -0
- /package/{lib → lib-commonjs}/ReadPackageJson.js.map +0 -0
- /package/{lib → lib-commonjs}/index.js +0 -0
- /package/{lib → lib-commonjs}/index.js.map +0 -0
- /package/{lib → lib-commonjs}/interfaces/INpmCheck.js +0 -0
- /package/{lib → lib-commonjs}/interfaces/INpmCheck.js.map +0 -0
- /package/{lib → lib-commonjs}/interfaces/INpmCheckPackageSummary.js +0 -0
- /package/{lib → lib-commonjs}/interfaces/INpmCheckPackageSummary.js.map +0 -0
- /package/{lib → lib-commonjs}/interfaces/INpmCheckRegistry.js +0 -0
- /package/{lib → lib-commonjs}/interfaces/INpmCheckRegistry.js.map +0 -0
- /package/{lib → lib-commonjs}/tests/BestGuessHomepage.test.js.map +0 -0
- /package/{lib → lib-commonjs}/tests/CreatePackageSummary.test.js.map +0 -0
- /package/{lib → lib-commonjs}/tests/FindModulePath.test.js.map +0 -0
- /package/{lib → lib-commonjs}/tests/GetLatestFromRegistry.test.js.map +0 -0
- /package/{lib → lib-commonjs}/tests/NpmCheck.test.js.map +0 -0
- /package/{lib → lib-commonjs}/tests/NpmCheckState.test.js.map +0 -0
- /package/{lib → lib-commonjs}/tests/NpmRegistryClient.test.js.map +0 -0
- /package/{lib → lib-commonjs}/tests/ReadPackageJson.test.js.map +0 -0
- /package/{lib → lib-dts}/BestGuessHomepage.d.ts +0 -0
- /package/{lib → lib-dts}/BestGuessHomepage.d.ts.map +0 -0
- /package/{lib → lib-dts}/CreatePackageSummary.d.ts +0 -0
- /package/{lib → lib-dts}/CreatePackageSummary.d.ts.map +0 -0
- /package/{lib → lib-dts}/FindModulePath.d.ts +0 -0
- /package/{lib → lib-dts}/FindModulePath.d.ts.map +0 -0
- /package/{lib → lib-dts}/GetLatestFromRegistry.d.ts +0 -0
- /package/{lib → lib-dts}/GetLatestFromRegistry.d.ts.map +0 -0
- /package/{lib → lib-dts}/NpmCheck.d.ts +0 -0
- /package/{lib → lib-dts}/NpmCheck.d.ts.map +0 -0
- /package/{lib → lib-dts}/NpmCheckState.d.ts +0 -0
- /package/{lib → lib-dts}/NpmCheckState.d.ts.map +0 -0
- /package/{lib → lib-dts}/NpmRegistryClient.d.ts +0 -0
- /package/{lib → lib-dts}/NpmRegistryClient.d.ts.map +0 -0
- /package/{lib → lib-dts}/ReadPackageJson.d.ts +0 -0
- /package/{lib → lib-dts}/ReadPackageJson.d.ts.map +0 -0
- /package/{lib → lib-dts}/index.d.ts +0 -0
- /package/{lib → lib-dts}/index.d.ts.map +0 -0
- /package/{lib → lib-dts}/interfaces/INpmCheck.d.ts +0 -0
- /package/{lib → lib-dts}/interfaces/INpmCheck.d.ts.map +0 -0
- /package/{lib → lib-dts}/interfaces/INpmCheckPackageSummary.d.ts +0 -0
- /package/{lib → lib-dts}/interfaces/INpmCheckPackageSummary.d.ts.map +0 -0
- /package/{lib → lib-dts}/interfaces/INpmCheckRegistry.d.ts +0 -0
- /package/{lib → lib-dts}/interfaces/INpmCheckRegistry.d.ts.map +0 -0
- /package/{lib → lib-dts}/tests/BestGuessHomepage.test.d.ts +0 -0
- /package/{lib → lib-dts}/tests/BestGuessHomepage.test.d.ts.map +0 -0
- /package/{lib → lib-dts}/tests/CreatePackageSummary.test.d.ts +0 -0
- /package/{lib → lib-dts}/tests/CreatePackageSummary.test.d.ts.map +0 -0
- /package/{lib → lib-dts}/tests/FindModulePath.test.d.ts +0 -0
- /package/{lib → lib-dts}/tests/FindModulePath.test.d.ts.map +0 -0
- /package/{lib → lib-dts}/tests/GetLatestFromRegistry.test.d.ts +0 -0
- /package/{lib → lib-dts}/tests/GetLatestFromRegistry.test.d.ts.map +0 -0
- /package/{lib → lib-dts}/tests/NpmCheck.test.d.ts +0 -0
- /package/{lib → lib-dts}/tests/NpmCheck.test.d.ts.map +0 -0
- /package/{lib → lib-dts}/tests/NpmCheckState.test.d.ts +0 -0
- /package/{lib → lib-dts}/tests/NpmCheckState.test.d.ts.map +0 -0
- /package/{lib → lib-dts}/tests/NpmRegistryClient.test.d.ts +0 -0
- /package/{lib → lib-dts}/tests/NpmRegistryClient.test.d.ts.map +0 -0
- /package/{lib → lib-dts}/tests/ReadPackageJson.test.d.ts +0 -0
- /package/{lib → lib-dts}/tests/ReadPackageJson.test.d.ts.map +0 -0
package/CHANGELOG.json
CHANGED
|
@@ -1,6 +1,26 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rushstack/npm-check-fork",
|
|
3
3
|
"entries": [
|
|
4
|
+
{
|
|
5
|
+
"version": "0.2.0",
|
|
6
|
+
"tag": "@rushstack/npm-check-fork_v0.2.0",
|
|
7
|
+
"date": "Thu, 19 Feb 2026 00:04:53 GMT",
|
|
8
|
+
"comments": {
|
|
9
|
+
"minor": [
|
|
10
|
+
{
|
|
11
|
+
"comment": "Normalize package layout. CommonJS is now under `lib-commonjs`, DTS is now under `lib-dts`, and ESM is now under `lib-esm`. Imports to `lib` still work as before, handled by the `\"exports\"` field in `package.json`."
|
|
12
|
+
}
|
|
13
|
+
],
|
|
14
|
+
"dependency": [
|
|
15
|
+
{
|
|
16
|
+
"comment": "Updating dependency \"@rushstack/node-core-library\" to `5.20.0`"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"comment": "Updating dependency \"@rushstack/heft\" to `1.2.0`"
|
|
20
|
+
}
|
|
21
|
+
]
|
|
22
|
+
}
|
|
23
|
+
},
|
|
4
24
|
{
|
|
5
25
|
"version": "0.1.14",
|
|
6
26
|
"tag": "@rushstack/npm-check-fork_v0.1.14",
|
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
# Change Log - @rushstack/npm-check-fork
|
|
2
2
|
|
|
3
|
-
This log was last generated on
|
|
3
|
+
This log was last generated on Thu, 19 Feb 2026 00:04:53 GMT and should not be manually modified.
|
|
4
|
+
|
|
5
|
+
## 0.2.0
|
|
6
|
+
Thu, 19 Feb 2026 00:04:53 GMT
|
|
7
|
+
|
|
8
|
+
### Minor changes
|
|
9
|
+
|
|
10
|
+
- Normalize package layout. CommonJS is now under `lib-commonjs`, DTS is now under `lib-dts`, and ESM is now under `lib-esm`. Imports to `lib` still work as before, handled by the `"exports"` field in `package.json`.
|
|
4
11
|
|
|
5
12
|
## 0.1.14
|
|
6
13
|
Sat, 07 Feb 2026 01:13:26 GMT
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/// <reference path="./types/giturl-typings.d.ts" preserve="true" />
|
|
2
|
+
import gitUrl from 'giturl';
|
|
3
|
+
export default function bestGuessHomepage(data) {
|
|
4
|
+
if (!data) {
|
|
5
|
+
return false;
|
|
6
|
+
}
|
|
7
|
+
const packageDataForLatest = data.versions[data['dist-tags'].latest];
|
|
8
|
+
return packageDataForLatest
|
|
9
|
+
? packageDataForLatest.homepage ||
|
|
10
|
+
(packageDataForLatest.bugs &&
|
|
11
|
+
packageDataForLatest.bugs.url &&
|
|
12
|
+
gitUrl.parse(packageDataForLatest.bugs.url.trim())) ||
|
|
13
|
+
(packageDataForLatest.repository &&
|
|
14
|
+
packageDataForLatest.repository.url &&
|
|
15
|
+
gitUrl.parse(packageDataForLatest.repository.url.trim())) ||
|
|
16
|
+
false
|
|
17
|
+
: false;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=BestGuessHomepage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BestGuessHomepage.js","sourceRoot":"","sources":["../src/BestGuessHomepage.ts"],"names":[],"mappings":"AAAA,oEAAoE;AAEpE,OAAO,MAAM,MAAM,QAAQ,CAAC;AAI5B,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,IAAuC;IAC/E,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,oBAAoB,GAA4B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;IAE9F,OAAO,oBAAoB;QACzB,CAAC,CAAC,oBAAoB,CAAC,QAAQ;YAC3B,CAAC,oBAAoB,CAAC,IAAI;gBACxB,oBAAoB,CAAC,IAAI,CAAC,GAAG;gBAC7B,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;YACrD,CAAC,oBAAoB,CAAC,UAAU;gBAC9B,oBAAoB,CAAC,UAAU,CAAC,GAAG;gBACnC,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;YAC3D,KAAK;QACT,CAAC,CAAC,KAAK,CAAC;AACZ,CAAC","sourcesContent":["/// <reference path=\"./types/giturl-typings.d.ts\" preserve=\"true\" />\n\nimport gitUrl from 'giturl';\n\nimport type { INpmCheckPackageVersion, INpmCheckRegistryData } from './interfaces/INpmCheckRegistry';\n\nexport default function bestGuessHomepage(data: INpmCheckRegistryData | undefined): string | false {\n if (!data) {\n return false;\n }\n const packageDataForLatest: INpmCheckPackageVersion = data.versions[data['dist-tags'].latest];\n\n return packageDataForLatest\n ? packageDataForLatest.homepage ||\n (packageDataForLatest.bugs &&\n packageDataForLatest.bugs.url &&\n gitUrl.parse(packageDataForLatest.bugs.url.trim())) ||\n (packageDataForLatest.repository &&\n packageDataForLatest.repository.url &&\n gitUrl.parse(packageDataForLatest.repository.url.trim())) ||\n false\n : false;\n}\n"]}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import _ from 'lodash';
|
|
4
|
+
import semver from 'semver';
|
|
5
|
+
import findModulePath from './FindModulePath';
|
|
6
|
+
import getLatestFromRegistry from './GetLatestFromRegistry';
|
|
7
|
+
import readPackageJson from './ReadPackageJson';
|
|
8
|
+
export default async function createPackageSummary(moduleName, state) {
|
|
9
|
+
const cwdPackageJson = state.cwdPackageJson;
|
|
10
|
+
const modulePath = findModulePath(moduleName, state);
|
|
11
|
+
const packageIsInstalled = existsSync(modulePath);
|
|
12
|
+
const modulePackageJson = readPackageJson(path.join(modulePath, 'package.json'));
|
|
13
|
+
// Ignore private packages
|
|
14
|
+
const isPrivate = Boolean(modulePackageJson.private);
|
|
15
|
+
if (isPrivate) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
// Ignore packages that are using github or file urls
|
|
19
|
+
const packageJsonVersion = (cwdPackageJson === null || cwdPackageJson === void 0 ? void 0 : cwdPackageJson.dependencies[moduleName]) || (cwdPackageJson === null || cwdPackageJson === void 0 ? void 0 : cwdPackageJson.devDependencies[moduleName]);
|
|
20
|
+
if (packageJsonVersion && !semver.validRange(packageJsonVersion)) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
return getLatestFromRegistry(moduleName).then((fromRegistry) => {
|
|
24
|
+
var _a;
|
|
25
|
+
const installedVersion = modulePackageJson.version;
|
|
26
|
+
const latest = installedVersion &&
|
|
27
|
+
fromRegistry.latest &&
|
|
28
|
+
fromRegistry.next &&
|
|
29
|
+
semver.gt(installedVersion, fromRegistry.latest)
|
|
30
|
+
? fromRegistry.next
|
|
31
|
+
: fromRegistry.latest;
|
|
32
|
+
const versions = fromRegistry.versions || [];
|
|
33
|
+
let versionWanted = null;
|
|
34
|
+
if (packageJsonVersion) {
|
|
35
|
+
versionWanted = semver.maxSatisfying(versions, packageJsonVersion);
|
|
36
|
+
}
|
|
37
|
+
const versionToUse = installedVersion || versionWanted;
|
|
38
|
+
const usingNonSemver = latest !== undefined && semver.valid(latest) && semver.lt(latest, '1.0.0-pre');
|
|
39
|
+
let bump;
|
|
40
|
+
const bumpRaw = semver.valid(latest) &&
|
|
41
|
+
semver.valid(versionToUse) &&
|
|
42
|
+
(usingNonSemver && versionToUse && latest
|
|
43
|
+
? semver.diff(versionToUse, latest)
|
|
44
|
+
? 'nonSemver'
|
|
45
|
+
: semver.diff(versionToUse, latest)
|
|
46
|
+
: versionToUse && latest
|
|
47
|
+
? semver.diff(versionToUse, latest)
|
|
48
|
+
: undefined);
|
|
49
|
+
if (bumpRaw && bumpRaw !== null) {
|
|
50
|
+
bump = bumpRaw;
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
bump = undefined;
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
// info
|
|
57
|
+
moduleName: moduleName,
|
|
58
|
+
homepage: (_a = fromRegistry.homepage) !== null && _a !== void 0 ? _a : '',
|
|
59
|
+
regError: new Error(fromRegistry.error),
|
|
60
|
+
pkgError: modulePackageJson.error,
|
|
61
|
+
// versions
|
|
62
|
+
latest: latest !== null && latest !== void 0 ? latest : '',
|
|
63
|
+
installed: versionToUse === null ? '' : versionToUse,
|
|
64
|
+
notInstalled: !packageIsInstalled,
|
|
65
|
+
packageJson: packageJsonVersion !== null && packageJsonVersion !== void 0 ? packageJsonVersion : '',
|
|
66
|
+
// meta
|
|
67
|
+
devDependency: _.has(cwdPackageJson === null || cwdPackageJson === void 0 ? void 0 : cwdPackageJson.devDependencies, moduleName),
|
|
68
|
+
mismatch: packageJsonVersion !== undefined &&
|
|
69
|
+
versionToUse !== null &&
|
|
70
|
+
semver.validRange(packageJsonVersion) &&
|
|
71
|
+
semver.valid(versionToUse)
|
|
72
|
+
? !semver.satisfies(versionToUse, packageJsonVersion)
|
|
73
|
+
: false,
|
|
74
|
+
bump: bump
|
|
75
|
+
};
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=CreatePackageSummary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CreatePackageSummary.js","sourceRoot":"","sources":["../src/CreatePackageSummary.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from 'node:fs';\nimport path from 'node:path';\n\nimport _ from 'lodash';\nimport semver from 'semver';\n\nimport type { INpmCheckState, INpmCheckPackageJson } from './interfaces/INpmCheck.ts';\nimport type { INpmCheckPackageSummary, INpmCheckVersionBumpType } from './interfaces/INpmCheckPackageSummary';\nimport type { INpmRegistryInfo } from './interfaces/INpmCheckRegistry';\nimport findModulePath from './FindModulePath';\nimport getLatestFromRegistry from './GetLatestFromRegistry';\nimport readPackageJson from './ReadPackageJson';\n\nexport default async function createPackageSummary(\n moduleName: string,\n state: INpmCheckState\n): Promise<INpmCheckPackageSummary | false> {\n const cwdPackageJson: INpmCheckPackageJson | undefined = state.cwdPackageJson;\n\n const modulePath: string = findModulePath(moduleName, state);\n const packageIsInstalled: boolean = existsSync(modulePath);\n const modulePackageJson: INpmCheckPackageJson = readPackageJson(path.join(modulePath, 'package.json'));\n\n // Ignore private packages\n const isPrivate: boolean = Boolean(modulePackageJson.private);\n if (isPrivate) {\n return false;\n }\n\n // Ignore packages that are using github or file urls\n const packageJsonVersion: string | undefined =\n cwdPackageJson?.dependencies[moduleName] || cwdPackageJson?.devDependencies[moduleName];\n if (packageJsonVersion && !semver.validRange(packageJsonVersion)) {\n return false;\n }\n\n return getLatestFromRegistry(moduleName).then((fromRegistry: INpmRegistryInfo) => {\n const installedVersion: string | undefined = modulePackageJson.version;\n const latest: string | undefined =\n installedVersion &&\n fromRegistry.latest &&\n fromRegistry.next &&\n semver.gt(installedVersion, fromRegistry.latest)\n ? fromRegistry.next\n : fromRegistry.latest;\n const versions: string[] = fromRegistry.versions || [];\n let versionWanted: string | null = null;\n if (packageJsonVersion) {\n versionWanted = semver.maxSatisfying(versions, packageJsonVersion);\n }\n const versionToUse: string | undefined | null = installedVersion || versionWanted;\n const usingNonSemver: boolean | '' | null =\n latest !== undefined && semver.valid(latest) && semver.lt(latest, '1.0.0-pre');\n\n let bump: INpmCheckVersionBumpType;\n const bumpRaw: INpmCheckVersionBumpType =\n semver.valid(latest) &&\n semver.valid(versionToUse) &&\n (usingNonSemver && versionToUse && latest\n ? semver.diff(versionToUse, latest)\n ? 'nonSemver'\n : semver.diff(versionToUse, latest)\n : versionToUse && latest\n ? semver.diff(versionToUse, latest)\n : undefined);\n if (bumpRaw && bumpRaw !== null) {\n bump = bumpRaw as INpmCheckVersionBumpType;\n } else {\n bump = undefined;\n }\n\n return {\n // info\n moduleName: moduleName,\n homepage: fromRegistry.homepage ?? '',\n regError: new Error(fromRegistry.error),\n pkgError: modulePackageJson.error,\n\n // versions\n latest: latest ?? '',\n installed: versionToUse === null ? '' : versionToUse,\n notInstalled: !packageIsInstalled,\n packageJson: packageJsonVersion ?? '',\n\n // meta\n devDependency: _.has(cwdPackageJson?.devDependencies, moduleName),\n mismatch:\n packageJsonVersion !== undefined &&\n versionToUse !== null &&\n semver.validRange(packageJsonVersion) &&\n semver.valid(versionToUse)\n ? !semver.satisfies(versionToUse, packageJsonVersion)\n : false,\n bump: bump\n };\n });\n}\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import Module from 'node:module';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
/**
|
|
5
|
+
* Searches the directory hierarchy to return the path to the requested node module.
|
|
6
|
+
* If the module can't be found, returns the initial (deepest) tried path.
|
|
7
|
+
*/
|
|
8
|
+
export default function findModulePath(moduleName, currentState) {
|
|
9
|
+
const cwd = currentState.cwd;
|
|
10
|
+
// Module._nodeModulePaths does not include some places the node module resolver searches, such as
|
|
11
|
+
// the global prefix or other special directories. This is desirable because if a module is missing
|
|
12
|
+
// in the project directory we want to be sure to report it as missing.
|
|
13
|
+
// We can't use require.resolve because it fails if the module doesn't have an entry point.
|
|
14
|
+
// @ts-ignore
|
|
15
|
+
const nodeModulesPaths = Module._nodeModulePaths(cwd);
|
|
16
|
+
const possibleModulePaths = nodeModulesPaths.map((x) => path.join(x, moduleName));
|
|
17
|
+
const modulePath = possibleModulePaths.find((p) => existsSync(p));
|
|
18
|
+
// if no existing path was found, return the first tried path anyway
|
|
19
|
+
return modulePath || path.join(cwd, moduleName);
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=FindModulePath.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FindModulePath.js","sourceRoot":"","sources":["../src/FindModulePath.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,UAAkB,EAAE,YAA4B;IACrF,MAAM,GAAG,GAAW,YAAY,CAAC,GAAG,CAAC;IAErC,kGAAkG;IAClG,mGAAmG;IACnG,uEAAuE;IACvE,2FAA2F;IAC3F,aAAa;IACb,MAAM,gBAAgB,GAAa,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAChE,MAAM,mBAAmB,GAAa,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;IAC5F,MAAM,UAAU,GAAuB,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IACtF,oEAAoE;IACpE,OAAO,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;AAClD,CAAC","sourcesContent":["import { existsSync } from 'node:fs';\nimport Module from 'node:module';\nimport path from 'node:path';\n\nimport type { INpmCheckState } from './interfaces/INpmCheck.ts';\n\n/**\n * Searches the directory hierarchy to return the path to the requested node module.\n * If the module can't be found, returns the initial (deepest) tried path.\n */\nexport default function findModulePath(moduleName: string, currentState: INpmCheckState): string {\n const cwd: string = currentState.cwd;\n\n // Module._nodeModulePaths does not include some places the node module resolver searches, such as\n // the global prefix or other special directories. This is desirable because if a module is missing\n // in the project directory we want to be sure to report it as missing.\n // We can't use require.resolve because it fails if the module doesn't have an entry point.\n // @ts-ignore\n const nodeModulesPaths: string[] = Module._nodeModulePaths(cwd);\n const possibleModulePaths: string[] = nodeModulesPaths.map((x) => path.join(x, moduleName));\n const modulePath: string | undefined = possibleModulePaths.find((p) => existsSync(p));\n // if no existing path was found, return the first tried path anyway\n return modulePath || path.join(cwd, moduleName);\n}\n"]}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
|
|
2
|
+
// See LICENSE in the project root for license information.
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import _ from 'lodash';
|
|
5
|
+
import semver from 'semver';
|
|
6
|
+
import { Async } from '@rushstack/node-core-library';
|
|
7
|
+
import bestGuessHomepage from './BestGuessHomepage';
|
|
8
|
+
import { NpmRegistryClient } from './NpmRegistryClient';
|
|
9
|
+
// Module-level registry client instance (lazy initialized)
|
|
10
|
+
let _registryClient;
|
|
11
|
+
/**
|
|
12
|
+
* Gets or creates the shared registry client instance.
|
|
13
|
+
*/
|
|
14
|
+
function getRegistryClient() {
|
|
15
|
+
if (!_registryClient) {
|
|
16
|
+
_registryClient = new NpmRegistryClient();
|
|
17
|
+
}
|
|
18
|
+
return _registryClient;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Fetches package information from the npm registry.
|
|
22
|
+
*
|
|
23
|
+
* @param packageName - The name of the package to fetch
|
|
24
|
+
* @returns A promise that resolves to the package registry info
|
|
25
|
+
*/
|
|
26
|
+
export default async function getNpmInfo(packageName) {
|
|
27
|
+
const client = getRegistryClient();
|
|
28
|
+
const result = await client.fetchPackageMetadataAsync(packageName);
|
|
29
|
+
if (result.error) {
|
|
30
|
+
return {
|
|
31
|
+
error: `Registry error ${result.error}`
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
const rawData = result.data;
|
|
35
|
+
const CRAZY_HIGH_SEMVER = '8000.0.0';
|
|
36
|
+
const sortedVersions = _(rawData.versions)
|
|
37
|
+
.keys()
|
|
38
|
+
.remove((version) => semver.gt(CRAZY_HIGH_SEMVER, version))
|
|
39
|
+
.sort(semver.compare)
|
|
40
|
+
.valueOf();
|
|
41
|
+
const latest = rawData['dist-tags'].latest;
|
|
42
|
+
const next = rawData['dist-tags'].next;
|
|
43
|
+
const latestStableRelease = semver.satisfies(latest, '*')
|
|
44
|
+
? latest
|
|
45
|
+
: semver.maxSatisfying(sortedVersions, '*') || '';
|
|
46
|
+
// Cast to INpmCheckRegistryData for bestGuessHomepage compatibility
|
|
47
|
+
// INpmRegistryPackageResponse is a superset of INpmCheckRegistryData
|
|
48
|
+
const registryData = rawData;
|
|
49
|
+
return {
|
|
50
|
+
latest: latestStableRelease,
|
|
51
|
+
next: next,
|
|
52
|
+
versions: sortedVersions,
|
|
53
|
+
homepage: bestGuessHomepage(registryData) || ''
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Fetches package information for multiple packages concurrently.
|
|
58
|
+
*
|
|
59
|
+
* @param packageNames - Array of package names to fetch
|
|
60
|
+
* @param concurrency - Maximum number of concurrent requests (defaults to CPU count)
|
|
61
|
+
* @returns A promise that resolves to a Map of package name to registry info
|
|
62
|
+
*/
|
|
63
|
+
export async function getNpmInfoBatch(packageNames, concurrency = os.cpus().length) {
|
|
64
|
+
const results = new Map();
|
|
65
|
+
// TODO: Refactor createPackageSummary to use this batch function to reduce registry requests
|
|
66
|
+
await Async.forEachAsync(packageNames, async (packageName) => {
|
|
67
|
+
results.set(packageName, await getNpmInfo(packageName));
|
|
68
|
+
}, { concurrency });
|
|
69
|
+
return results;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=GetLatestFromRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GetLatestFromRegistry.js","sourceRoot":"","sources":["../src/GetLatestFromRegistry.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,2DAA2D;AAE3D,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,OAAO,CAAC,MAAM,QAAQ,CAAC;AACvB,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,OAAO,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAErD,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAiC,MAAM,qBAAqB,CAAC;AAOvF,2DAA2D;AAC3D,IAAI,eAA8C,CAAC;AAEnD;;GAEG;AACH,SAAS,iBAAiB;IACxB,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,eAAe,GAAG,IAAI,iBAAiB,EAAE,CAAC;IAC5C,CAAC;IACD,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,OAAO,CAAC,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,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;SACjD,IAAI,EAAE;SACN,MAAM,CAAC,CAAC,OAAe,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;SAClE,IAAI,CAAC,MAAM,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,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC;QAC3E,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,MAAM,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,iBAAiB,CAAC,YAAY,CAAC,IAAI,EAAE;KAChD,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,YAAsB,EACtB,cAAsB,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM;IAEtC,MAAM,OAAO,GAAkC,IAAI,GAAG,EAAE,CAAC;IAEzD,6FAA6F;IAC7F,MAAM,KAAK,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((version: string) => semver.gt(CRAZY_HIGH_SEMVER, version))\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,23 @@
|
|
|
1
|
+
import _ from 'lodash';
|
|
2
|
+
import createPackageSummary from './CreatePackageSummary';
|
|
3
|
+
import initializeState from './NpmCheckState';
|
|
4
|
+
export default async function NpmCheck(initialOptions) {
|
|
5
|
+
const state = await initializeState(initialOptions);
|
|
6
|
+
const cwdPackageJson = state.cwdPackageJson;
|
|
7
|
+
const allDependencies = getDependencies(cwdPackageJson);
|
|
8
|
+
let packages = [];
|
|
9
|
+
if (allDependencies) {
|
|
10
|
+
const packageSummaryPromises = Object.keys(allDependencies).map((moduleName) => createPackageSummary(moduleName, state));
|
|
11
|
+
packages = await Promise.all(packageSummaryPromises).then((results) => {
|
|
12
|
+
return results.filter((pkg) => pkg !== false);
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
return { ...state, packages };
|
|
16
|
+
}
|
|
17
|
+
function getDependencies(pkg) {
|
|
18
|
+
if (!pkg) {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
return _.extend(pkg.dependencies, pkg.devDependencies);
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=NpmCheck.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NpmCheck.js","sourceRoot":"","sources":["../src/NpmCheck.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,QAAQ,CAAC;AAIvB,OAAO,oBAAoB,MAAM,wBAAwB,CAAC;AAC1D,OAAO,eAAe,MAAM,iBAAiB,CAAC;AAE9C,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,QAAQ,CAAC,cAA+B;IACpE,MAAM,KAAK,GAAmB,MAAM,eAAe,CAAC,cAAc,CAAC,CAAC;IACpE,MAAM,cAAc,GAAqC,KAAK,CAAC,cAAc,CAAC;IAC9E,MAAM,eAAe,GAAuC,eAAe,CAAC,cAAc,CAAC,CAAC;IAE5F,IAAI,QAAQ,GAA8B,EAAE,CAAC;IAC7C,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,sBAAsB,GAA+C,MAAM,CAAC,IAAI,CACpF,eAAe,CAChB,CAAC,GAAG,CAAC,CAAC,UAAkB,EAAE,EAAE,CAAC,oBAAoB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;QACvE,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,IAAI,CACvD,CAAC,OAA4C,EAAE,EAAE;YAC/C,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAkC,EAAE,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC;QAChF,CAAC,CACF,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,CAAC;AAChC,CAAC;AAED,SAAS,eAAe,CAAC,GAAqC;IAC5D,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC;AACzD,CAAC","sourcesContent":["import _ from 'lodash';\n\nimport type { INpmCheckPackageJson, INpmCheckState } from './interfaces/INpmCheck.ts';\nimport type { INpmCheckPackageSummary } from './interfaces/INpmCheckPackageSummary';\nimport createPackageSummary from './CreatePackageSummary';\nimport initializeState from './NpmCheckState';\n\nexport default async function NpmCheck(initialOptions?: INpmCheckState): Promise<INpmCheckState> {\n const state: INpmCheckState = await initializeState(initialOptions);\n const cwdPackageJson: INpmCheckPackageJson | undefined = state.cwdPackageJson;\n const allDependencies: Record<string, string> | undefined = getDependencies(cwdPackageJson);\n\n let packages: INpmCheckPackageSummary[] = [];\n if (allDependencies) {\n const packageSummaryPromises: Promise<INpmCheckPackageSummary | false>[] = Object.keys(\n allDependencies\n ).map((moduleName: string) => createPackageSummary(moduleName, state));\n packages = await Promise.all(packageSummaryPromises).then(\n (results: (INpmCheckPackageSummary | false)[]) => {\n return results.filter((pkg): pkg is INpmCheckPackageSummary => pkg !== false);\n }\n );\n }\n\n return { ...state, packages };\n}\n\nfunction getDependencies(pkg: INpmCheckPackageJson | undefined): Record<string, string> | undefined {\n if (!pkg) {\n return undefined;\n }\n\n return _.extend(pkg.dependencies, pkg.devDependencies);\n}\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import _ from 'lodash';
|
|
3
|
+
import { DefaultNpmCheckOptions } from './interfaces/INpmCheck';
|
|
4
|
+
import readPackageJson from './ReadPackageJson';
|
|
5
|
+
export default async function initializeState(initialOptions) {
|
|
6
|
+
var _a;
|
|
7
|
+
const state = _.extend(DefaultNpmCheckOptions, initialOptions);
|
|
8
|
+
if (state.cwd) {
|
|
9
|
+
const cwd = path.resolve(state.cwd);
|
|
10
|
+
const pkg = readPackageJson(path.join(cwd, 'package.json'));
|
|
11
|
+
state.cwdPackageJson = pkg;
|
|
12
|
+
state.cwd = cwd;
|
|
13
|
+
}
|
|
14
|
+
if ((_a = state.cwdPackageJson) === null || _a === void 0 ? void 0 : _a.error) {
|
|
15
|
+
return Promise.reject(state.cwdPackageJson.error);
|
|
16
|
+
}
|
|
17
|
+
return Promise.resolve(state);
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=NpmCheckState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NpmCheckState.js","sourceRoot":"","sources":["../src/NpmCheckState.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,CAAC,MAAM,QAAQ,CAAC;AAEvB,OAAO,EACL,sBAAsB,EAGvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAEhD,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,eAAe,CAAC,cAA+B;;IAC3E,MAAM,KAAK,GAAmB,CAAC,CAAC,MAAM,CAAC,sBAAsB,EAAE,cAAc,CAAC,CAAC;IAE/E,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;QACd,MAAM,GAAG,GAAW,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAyB,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC;QAClF,KAAK,CAAC,cAAc,GAAG,GAAG,CAAC;QAC3B,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC;IAClB,CAAC;IAED,IAAI,MAAA,KAAK,CAAC,cAAc,0CAAE,KAAK,EAAE,CAAC;QAChC,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC","sourcesContent":["import path from 'node:path';\n\nimport _ from 'lodash';\n\nimport {\n DefaultNpmCheckOptions,\n type INpmCheckPackageJson,\n type INpmCheckState\n} from './interfaces/INpmCheck';\nimport readPackageJson from './ReadPackageJson';\n\nexport default async function initializeState(initialOptions?: INpmCheckState): Promise<INpmCheckState> {\n const state: INpmCheckState = _.extend(DefaultNpmCheckOptions, initialOptions);\n\n if (state.cwd) {\n const cwd: string = path.resolve(state.cwd);\n const pkg: INpmCheckPackageJson = readPackageJson(path.join(cwd, 'package.json'));\n state.cwdPackageJson = pkg;\n state.cwd = cwd;\n }\n\n if (state.cwdPackageJson?.error) {\n return Promise.reject(state.cwdPackageJson.error);\n }\n\n return Promise.resolve(state);\n}\n"]}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
|
|
2
|
+
// See LICENSE in the project root for license information.
|
|
3
|
+
import * as https from 'node:https';
|
|
4
|
+
import * as http from 'node:http';
|
|
5
|
+
import * as os from 'node:os';
|
|
6
|
+
import * as process from 'node:process';
|
|
7
|
+
import * as zlib from 'node:zlib';
|
|
8
|
+
const DEFAULT_REGISTRY_URL = 'https://registry.npmjs.org';
|
|
9
|
+
const DEFAULT_TIMEOUT_MS = 30000;
|
|
10
|
+
/**
|
|
11
|
+
* A client for fetching package metadata from the npm registry.
|
|
12
|
+
*
|
|
13
|
+
* @remarks
|
|
14
|
+
* This client provides a simple interface for fetching package metadata
|
|
15
|
+
* without external dependencies like `package-json`.
|
|
16
|
+
*
|
|
17
|
+
* @public
|
|
18
|
+
*/
|
|
19
|
+
export class NpmRegistryClient {
|
|
20
|
+
constructor(options) {
|
|
21
|
+
var _a, _b, _c;
|
|
22
|
+
// trim trailing slash if one was provided
|
|
23
|
+
this._registryUrl = ((_a = options === null || options === void 0 ? void 0 : options.registryUrl) !== null && _a !== void 0 ? _a : DEFAULT_REGISTRY_URL).replace(/\/$/, '');
|
|
24
|
+
this._userAgent =
|
|
25
|
+
(_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()}`;
|
|
26
|
+
this._timeoutMs = (_c = options === null || options === void 0 ? void 0 : options.timeoutMs) !== null && _c !== void 0 ? _c : DEFAULT_TIMEOUT_MS;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Builds the URL for fetching package metadata.
|
|
30
|
+
*
|
|
31
|
+
* @remarks
|
|
32
|
+
* Handles scoped packages by URL-encoding the package name.
|
|
33
|
+
* For example, `@scope/name` becomes `@scope%2Fname`.
|
|
34
|
+
*
|
|
35
|
+
* @param packageName - The name of the package
|
|
36
|
+
* @returns The full URL for fetching the package metadata
|
|
37
|
+
*/
|
|
38
|
+
_buildPackageUrl(packageName) {
|
|
39
|
+
// Scoped packages need the slash encoded
|
|
40
|
+
// @scope/name -> @scope%2Fname
|
|
41
|
+
const encodedName = packageName.replace(/\//g, '%2F');
|
|
42
|
+
return `${this._registryUrl}/${encodedName}`;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Fetches package metadata from the npm registry.
|
|
46
|
+
*
|
|
47
|
+
* @param packageName - The name of the package to fetch
|
|
48
|
+
* @returns A promise that resolves to the result containing either data or an error
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```ts
|
|
52
|
+
* const client = new NpmRegistryClient();
|
|
53
|
+
* const result = await client.fetchPackageMetadataAsync('lodash');
|
|
54
|
+
* if (result.error) {
|
|
55
|
+
* console.error(result.error);
|
|
56
|
+
* } else {
|
|
57
|
+
* console.log(result.data?.['dist-tags'].latest);
|
|
58
|
+
* }
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
async fetchPackageMetadataAsync(packageName) {
|
|
62
|
+
const url = this._buildPackageUrl(packageName);
|
|
63
|
+
return new Promise((resolve) => {
|
|
64
|
+
const parsedUrl = new URL(url);
|
|
65
|
+
const isHttps = parsedUrl.protocol === 'https:';
|
|
66
|
+
const requestModule = isHttps ? https : http;
|
|
67
|
+
const requestOptions = {
|
|
68
|
+
hostname: parsedUrl.hostname,
|
|
69
|
+
port: parsedUrl.port || (isHttps ? 443 : 80),
|
|
70
|
+
path: parsedUrl.pathname + parsedUrl.search,
|
|
71
|
+
method: 'GET',
|
|
72
|
+
timeout: this._timeoutMs,
|
|
73
|
+
headers: {
|
|
74
|
+
Accept: 'application/json',
|
|
75
|
+
'Accept-Encoding': 'gzip, deflate',
|
|
76
|
+
'User-Agent': this._userAgent
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
// TODO: Extract WebClient from rush-lib so that we can use it here
|
|
80
|
+
// instead of this reimplementation of HTTP request logic.
|
|
81
|
+
const request = requestModule.request(requestOptions, (response) => {
|
|
82
|
+
const chunks = [];
|
|
83
|
+
response.on('data', (chunk) => {
|
|
84
|
+
chunks.push(chunk);
|
|
85
|
+
});
|
|
86
|
+
response.on('end', () => {
|
|
87
|
+
var _a;
|
|
88
|
+
const statusCode = (_a = response.statusCode) !== null && _a !== void 0 ? _a : 0;
|
|
89
|
+
// Handle 404 - Package not found
|
|
90
|
+
if (statusCode === 404) {
|
|
91
|
+
resolve({ error: 'Package not found' });
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
// Handle other HTTP errors
|
|
95
|
+
if (statusCode < 200 || statusCode >= 300) {
|
|
96
|
+
resolve({ error: `HTTP error ${statusCode}: ${response.statusMessage}` });
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
try {
|
|
100
|
+
let buffer = Buffer.concat(chunks);
|
|
101
|
+
// Decompress if needed
|
|
102
|
+
const contentEncoding = response.headers['content-encoding'];
|
|
103
|
+
if (contentEncoding === 'gzip') {
|
|
104
|
+
buffer = zlib.gunzipSync(buffer);
|
|
105
|
+
}
|
|
106
|
+
else if (contentEncoding === 'deflate') {
|
|
107
|
+
buffer = zlib.inflateSync(buffer);
|
|
108
|
+
}
|
|
109
|
+
const data = JSON.parse(buffer.toString('utf8'));
|
|
110
|
+
// Successfully retrieved and parsed data
|
|
111
|
+
resolve({ data });
|
|
112
|
+
}
|
|
113
|
+
catch (parseError) {
|
|
114
|
+
resolve({
|
|
115
|
+
error: `Failed to parse response: ${parseError instanceof Error ? parseError.message : String(parseError)}`
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
response.on('error', (error) => {
|
|
120
|
+
resolve({ error: `Response error: ${error.message}` });
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
request.on('error', (error) => {
|
|
124
|
+
resolve({ error: `Network error: ${error.message}` });
|
|
125
|
+
});
|
|
126
|
+
request.on('timeout', () => {
|
|
127
|
+
request.destroy();
|
|
128
|
+
resolve({ error: `Request timed out after ${this._timeoutMs}ms` });
|
|
129
|
+
});
|
|
130
|
+
request.end();
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
//# 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"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import _ from 'lodash';
|
|
2
|
+
export default function readPackageJson(filename) {
|
|
3
|
+
let pkg = undefined;
|
|
4
|
+
let error = undefined;
|
|
5
|
+
try {
|
|
6
|
+
pkg = require(filename);
|
|
7
|
+
}
|
|
8
|
+
catch (e) {
|
|
9
|
+
if (e && typeof e === 'object' && 'code' in e && e.code === 'MODULE_NOT_FOUND') {
|
|
10
|
+
error = new Error(`A package.json was not found at ${filename}`);
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
error = new Error(`A package.json was found at ${filename}, but it is not valid.`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return _.extend({ devDependencies: {}, dependencies: {}, error: error }, pkg);
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=ReadPackageJson.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReadPackageJson.js","sourceRoot":"","sources":["../src/ReadPackageJson.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,QAAQ,CAAC;AAIvB,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,QAAgB;IACtD,IAAI,GAAG,GAAqC,SAAS,CAAC;IACtD,IAAI,KAAK,GAAsB,SAAS,CAAC;IACzC,IAAI,CAAC;QACH,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;YAC/E,KAAK,GAAG,IAAI,KAAK,CAAC,mCAAmC,QAAQ,EAAE,CAAC,CAAC;QACnE,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,IAAI,KAAK,CAAC,+BAA+B,QAAQ,wBAAwB,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAC,MAAM,CAAC,EAAE,eAAe,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC;AAChF,CAAC","sourcesContent":["import _ from 'lodash';\n\nimport type { INpmCheckPackageJson } from './interfaces/INpmCheck.ts';\n\nexport default function readPackageJson(filename: string): INpmCheckPackageJson {\n let pkg: INpmCheckPackageJson | undefined = undefined;\n let error: Error | undefined = undefined;\n try {\n pkg = require(filename);\n } catch (e: unknown) {\n if (e && typeof e === 'object' && 'code' in e && e.code === 'MODULE_NOT_FOUND') {\n error = new Error(`A package.json was not found at ${filename}`);\n } else {\n error = new Error(`A package.json was found at ${filename}, but it is not valid.`);\n }\n }\n return _.extend({ devDependencies: {}, dependencies: {}, error: error }, pkg);\n}\n"]}
|
package/lib-esm/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGjD,OAAO,EACL,iBAAiB,EAGlB,MAAM,qBAAqB,CAAC;AAM7B,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC","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"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"INpmCheck.js","sourceRoot":"","sources":["../../src/interfaces/INpmCheck.ts"],"names":[],"mappings":"AAmBA,MAAM,CAAC,MAAM,sBAAsB,GAAmB;IACpD,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;IAClB,cAAc,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE;IACzD,QAAQ,EAAE,SAAS;CACpB,CAAC","sourcesContent":["import type { INpmCheckPackageSummary } from './INpmCheckPackageSummary';\n\nexport interface INpmCheckPackageJson {\n name?: string;\n version?: string;\n devDependencies: Record<string, string>;\n dependencies: Record<string, string>;\n error?: Error;\n scripts?: Record<string, string>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any;\n}\n\nexport interface INpmCheckState {\n cwd: string;\n cwdPackageJson?: INpmCheckPackageJson;\n packages?: INpmCheckPackageSummary[];\n}\n\nexport const DefaultNpmCheckOptions: INpmCheckState = {\n cwd: process.cwd(),\n cwdPackageJson: { devDependencies: {}, dependencies: {} },\n packages: undefined\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"INpmCheckPackageSummary.js","sourceRoot":"","sources":["../../src/interfaces/INpmCheckPackageSummary.ts"],"names":[],"mappings":"","sourcesContent":["export type INpmCheckVersionBumpType =\n | ''\n | 'build'\n | 'major'\n | 'premajor'\n | 'minor'\n | 'preminor'\n | 'patch'\n | 'prepatch'\n | 'prerelease'\n | 'nonSemver'\n | undefined\n // eslint-disable-next-line @rushstack/no-new-null\n | null;\n\nexport interface INpmCheckPackageSummary {\n moduleName: string; // name of the module.\n homepage: string; // url to the home page.\n regError?: Error; // error communicating with the registry\n pkgError?: Error; // error reading the package.json\n latest: string; // latest according to the registry.\n installed: string; // version installed\n notInstalled: boolean; // Is it installed?\n packageJson: string; // Version or range requested in the parent package.json.\n devDependency: boolean; // Is this a devDependency?\n mismatch: boolean; // Does the version installed not match the range in package.json?\n bump?: INpmCheckVersionBumpType; // What kind of bump is required to get the latest\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
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"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BestGuessHomepage.test.js","sourceRoot":"","sources":["../../src/tests/BestGuessHomepage.test.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAE7D,OAAO,iBAAiB,MAAM,sBAAsB,CAAC;AAGrD,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,IAAI,GAA0B;YAClC,QAAQ,EAAE;gBACR,MAAM,EAAE;oBACN,QAAQ,EAAE,sBAAsB;iBACjC;aACF;YACD,WAAW,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;SAClC,CAAC;QACF,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,IAAI,GAA0B;YAClC,QAAQ,EAAE;gBACR,MAAM,EAAE;oBACN,IAAI,EAAE,EAAE,GAAG,EAAE,kBAAkB,EAAE;iBAClC;aACF;YACD,WAAW,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;SAClC,CAAC;QACF,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,IAAI,GAA0B;YAClC,QAAQ,EAAE;gBACR,MAAM,EAAE;oBACN,UAAU,EAAE,EAAE,GAAG,EAAE,kBAAkB,EAAE;iBACxC;aACF;YACD,WAAW,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;SAClC,CAAC;QACF,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,IAAI,GAA0B;YAClC,QAAQ,EAAE;gBACR,MAAM,EAAE,EAAE;aACX;YACD,WAAW,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;SAClC,CAAC;QACF,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["// Mock gitUrl.parse\njest.mock('giturl', () => ({ parse: (url: string) => url }));\n\nimport bestGuessHomepage from '../BestGuessHomepage';\nimport type { INpmCheckRegistryData } from '../interfaces/INpmCheckRegistry';\n\ndescribe('bestGuessHomepage', () => {\n it('returns false if data is undefined', () => {\n expect(bestGuessHomepage(undefined)).toBe(false);\n });\n\n it('returns homepage if present', () => {\n const data: INpmCheckRegistryData = {\n versions: {\n latest: {\n homepage: 'https://homepage.com'\n }\n },\n 'dist-tags': { latest: 'latest' }\n };\n expect(bestGuessHomepage(data)).toBe('https://homepage.com');\n });\n\n it('returns bugs.url if homepage is missing', () => {\n const data: INpmCheckRegistryData = {\n versions: {\n latest: {\n bugs: { url: 'https://bugs.com' }\n }\n },\n 'dist-tags': { latest: 'latest' }\n };\n expect(bestGuessHomepage(data)).toBe('https://bugs.com');\n });\n\n it('returns repository.url if homepage and bugs.url are missing', () => {\n const data: INpmCheckRegistryData = {\n versions: {\n latest: {\n repository: { url: 'https://repo.com' }\n }\n },\n 'dist-tags': { latest: 'latest' }\n };\n expect(bestGuessHomepage(data)).toBe('https://repo.com');\n });\n\n it('returns false if no homepage, bugs.url, or repository.url', () => {\n const data: INpmCheckRegistryData = {\n versions: {\n latest: {}\n },\n 'dist-tags': { latest: 'latest' }\n };\n expect(bestGuessHomepage(data)).toBe(false);\n });\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CreatePackageSummary.test.js","sourceRoot":"","sources":["../../src/tests/CreatePackageSummary.test.ts"],"names":[],"mappings":"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","sourcesContent":["jest.mock('../GetLatestFromRegistry');\njest.mock('../ReadPackageJson');\njest.mock('../FindModulePath');\n\nimport createPackageSummary from '../CreatePackageSummary';\nimport getLatestFromRegistry from '../GetLatestFromRegistry';\nimport readPackageJson from '../ReadPackageJson';\nimport findModulePath from '../FindModulePath';\nimport type { INpmCheckState, INpmCheckPackageJson } from '../interfaces/INpmCheck';\nimport type { INpmRegistryInfo } from '../interfaces/INpmCheckRegistry';\nimport type { INpmCheckPackageSummary } from '../interfaces/INpmCheckPackageSummary';\n\nconst mockGetLatestFromRegistry = getLatestFromRegistry as jest.MockedFunction<typeof getLatestFromRegistry>;\nconst mockReadPackageJson = readPackageJson as jest.MockedFunction<typeof readPackageJson>;\nconst mockFindModulePath = findModulePath as jest.MockedFunction<typeof findModulePath>;\n\ndescribe('createPackageSummary', () => {\n afterEach(() => {\n jest.clearAllMocks();\n });\n\n it('returns false for private package', async () => {\n mockFindModulePath.mockReturnValue('/mock/path/private-pkg');\n mockReadPackageJson.mockReturnValue({\n dependencies: {},\n devDependencies: {},\n private: true\n } as INpmCheckPackageJson);\n const state: INpmCheckState = {\n cwd: process.cwd(),\n cwdPackageJson: { dependencies: {}, devDependencies: {} }\n };\n const result: INpmCheckPackageSummary | boolean = await createPackageSummary('private-pkg', state);\n expect(result).toBe(false);\n });\n\n it('returns false for invalid semver range', async () => {\n mockFindModulePath.mockReturnValue('/mock/path');\n mockReadPackageJson.mockReturnValue({\n dependencies: {},\n devDependencies: {}\n } as INpmCheckPackageJson);\n const state: INpmCheckState = {\n cwd: process.cwd(),\n cwdPackageJson: {\n dependencies: { 'bad-pkg': 'github:foo/bar' },\n devDependencies: {}\n }\n };\n const result: INpmCheckPackageSummary | boolean = await createPackageSummary('bad-pkg', state);\n expect(result).toBe(false);\n });\n\n it('returns summary for valid package', async () => {\n mockFindModulePath.mockReturnValue('/mock/path');\n mockReadPackageJson.mockReturnValue({\n dependencies: {},\n devDependencies: {}\n } as INpmCheckPackageJson);\n mockGetLatestFromRegistry.mockResolvedValue({\n latest: '2.0.0',\n next: '3.0.0',\n versions: ['1.0.0', '2.0.0', '3.0.0'],\n homepage: 'https://homepage.com'\n } as INpmRegistryInfo);\n const state: INpmCheckState = {\n cwd: process.cwd(),\n cwdPackageJson: { dependencies: { 'good-pkg': '1.0.0' }, devDependencies: {} },\n unusedDependencies: ['good-pkg'],\n missingFromPackageJson: {}\n } as INpmCheckState;\n const result: INpmCheckPackageSummary | boolean = await createPackageSummary('good-pkg', state);\n expect(result).toBeTruthy();\n expect(result).toHaveProperty('moduleName', 'good-pkg');\n expect(result).toHaveProperty('homepage', 'https://homepage.com');\n expect(result).toHaveProperty('latest', '2.0.0');\n expect(result).toHaveProperty('installed', '1.0.0');\n });\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FindModulePath.test.js","sourceRoot":"","sources":["../../src/tests/FindModulePath.test.ts"],"names":[],"mappings":"AAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACvB,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1C,mCAAmC;CACpC,CAAC,CAAC,CAAC;AAEJ,OAAO,cAAc,MAAM,mBAAmB,CAAC;AAE/C,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;AAEtC,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI;aACD,KAAK,CAAC,MAAM,EAAE,kBAAkB,CAAC;aACjC,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC,yBAAyB,EAAE,iCAAiC,CAAC,CAAC,CAAC;IAC9F,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,GAAG,EAAE;QACZ,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC5B,MAAM,KAAK,GAAmB,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAoB,CAAC;QACpF,MAAM,MAAM,GAAG,cAAc,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,KAAK,GAAmB,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAoB,CAAC;QACpF,MAAM,MAAM,GAAG,cAAc,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;QACvD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["jest.mock('path', () => ({\n join: jest.fn((...args) => args.join('/'))\n // Add other path methods as needed\n}));\n\nimport findModulePath from '../FindModulePath';\nimport type { INpmCheckState } from '../interfaces/INpmCheck';\nimport path from 'node:path';\n\nconst Module = require('node:module');\n\ndescribe('findModulePath', () => {\n beforeAll(() => {\n jest\n .spyOn(Module, '_nodeModulePaths')\n .mockImplementation(() => ['/mock/path/node_modules', '/another/mock/path/node_modules']);\n });\n\n afterAll(() => {\n jest.restoreAllMocks();\n });\n\n it('returns found path', () => {\n const state: INpmCheckState = { cwd: '/test/cwd', global: false } as INpmCheckState;\n const result = findModulePath('my-module', state);\n expect(result).toBe(path.join('/test/cwd', 'my-module'));\n });\n\n it('returns first tried path', () => {\n const state: INpmCheckState = { cwd: '/test/cwd', global: false } as INpmCheckState;\n const result = findModulePath('missing-module', state);\n expect(result).toBe(path.join('/test/cwd', 'missing-module'));\n });\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
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 it('filters out versions exceeding CRAZY_HIGH_SEMVER threshold', 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 '9000.0.0': {\n name: 'test-package',\n version: '9000.0.0'\n }\n },\n 'dist-tags': { latest: '2.0.0', next: '2.0.0' }\n };\n mockFetchPackageMetadataAsync.mockResolvedValue({ data: mockData });\n\n const result: INpmRegistryInfo = await getNpmInfo('test-package');\n // Versions exceeding 8000.0.0 should be filtered out\n expect(result.versions).toEqual(['1.0.0', '2.0.0']);\n expect(result.versions).not.toContain('9000.0.0');\n });\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NpmCheck.test.js","sourceRoot":"","sources":["../../src/tests/NpmCheck.test.ts"],"names":[],"mappings":"AAAA,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1C,UAAU,EAAE,IAAI;IAChB,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;CACnC,CAAC,CAAC,CAAC;AAEJ,OAAO,oBAAoB,MAAM,yBAAyB,CAAC;AAC3D,MAAM,wBAAwB,GAAG,oBAAwE,CAAC;AAG1G,OAAO,QAAQ,MAAM,aAAa,CAAC;AAEnC,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,wBAAwB,CAAC,kBAAkB,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;YACjE,UAAU;YACV,QAAQ,EAAE,EAAE;YACZ,MAAM,EAAE,EAAE;YACV,SAAS,EAAE,EAAE;YACb,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,EAAE;YACjB,WAAW,EAAE,EAAE;YACf,gBAAgB,EAAE,SAAS;YAC3B,aAAa,EAAE,KAAK;YACpB,cAAc,EAAE,KAAK;YACrB,QAAQ,EAAE,KAAK;YACf,IAAI,EAAE,SAAS;SAChB,CAAC,CAAC,CAAC;QACJ,MAAM,MAAM,GAAmB,MAAM,QAAQ,CAAC;YAC5C,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;SACnB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QACtC,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClD,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["jest.mock('../CreatePackageSummary', () => ({\n __esModule: true,\n default: jest.fn(async () => ({}))\n}));\n\nimport createPackageSummary from '../CreatePackageSummary';\nconst mockCreatePackageSummary = createPackageSummary as jest.MockedFunction<typeof createPackageSummary>;\n\nimport type { INpmCheckState } from '../interfaces/INpmCheck';\nimport NpmCheck from '../NpmCheck';\n\ndescribe('NpmCheck', () => {\n it('should mimic rush initial options', async () => {\n mockCreatePackageSummary.mockImplementation(async (moduleName) => ({\n moduleName,\n homepage: '',\n latest: '',\n installed: '',\n notInstalled: true,\n packageWanted: '',\n packageJson: '',\n notInPackageJson: undefined,\n devDependency: false,\n peerDependency: false,\n mismatch: false,\n bump: undefined\n }));\n const result: INpmCheckState = await NpmCheck({\n cwd: process.cwd()\n });\n expect(result.packages).toBeDefined();\n if (result.packages && result.packages.length > 0) {\n expect(result.packages[0]).toHaveProperty('moduleName');\n }\n });\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NpmCheckState.test.js","sourceRoot":"","sources":["../../src/tests/NpmCheckState.test.ts"],"names":[],"mappings":"AACA,OAAO,eAAe,MAAM,kBAAkB,CAAC;AAE/C,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,KAAK,GAAmB,MAAM,eAAe,EAAE,CAAC;QACtD,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5B,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import type { INpmCheckState } from '../interfaces/INpmCheck';\nimport initializeState from '../NpmCheckState';\n\ndescribe('NpmCheckState', () => {\n it('should create with default options', async () => {\n const state: INpmCheckState = await initializeState();\n expect(state).toBeDefined();\n expect(state.cwd).toBe(process.cwd());\n expect(state.cwdPackageJson).toHaveProperty('name');\n expect(state.cwdPackageJson).toHaveProperty('version');\n });\n});\n"]}
|
|
@@ -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"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReadPackageJson.test.js","sourceRoot":"","sources":["../../src/tests/ReadPackageJson.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,eAAe,MAAM,oBAAoB,CAAC;AAGjD,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,QAAQ,GAAW,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;QAClE,MAAM,MAAM,GAAyB,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;QAErE,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import path from 'node:path';\n\nimport readPackageJson from '../ReadPackageJson';\nimport type { INpmCheckPackageJson } from '../interfaces/INpmCheck';\n\ndescribe('readPackageJson', () => {\n it('should return valid packageJson if it exists', async () => {\n const fileName: string = path.join(process.cwd(), 'package.json');\n const result: INpmCheckPackageJson = await readPackageJson(fileName);\n\n expect(result).toBeDefined();\n expect(result).toHaveProperty('name');\n });\n});\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rushstack/npm-check-fork",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "A fork of npm-check.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -8,22 +8,44 @@
|
|
|
8
8
|
"directory": "libraries/npm-check-fork"
|
|
9
9
|
},
|
|
10
10
|
"homepage": "https://github.com/dylang/npm-check",
|
|
11
|
-
"main": "lib/index.js",
|
|
12
|
-
"
|
|
11
|
+
"main": "./lib-commonjs/index.js",
|
|
12
|
+
"module": "./lib-esm/index.js",
|
|
13
|
+
"types": "./lib-dts/index.d.ts",
|
|
14
|
+
"exports": {
|
|
15
|
+
".": {
|
|
16
|
+
"types": "./lib-dts/index.d.ts",
|
|
17
|
+
"import": "./lib-esm/index.js",
|
|
18
|
+
"require": "./lib-commonjs/index.js"
|
|
19
|
+
},
|
|
20
|
+
"./lib/*": {
|
|
21
|
+
"types": "./lib-dts/*.d.ts",
|
|
22
|
+
"import": "./lib-esm/*.js",
|
|
23
|
+
"require": "./lib-commonjs/*.js"
|
|
24
|
+
},
|
|
25
|
+
"./package.json": "./package.json"
|
|
26
|
+
},
|
|
27
|
+
"typesVersions": {
|
|
28
|
+
"*": {
|
|
29
|
+
"lib/*": [
|
|
30
|
+
"lib-dts/*"
|
|
31
|
+
]
|
|
32
|
+
}
|
|
33
|
+
},
|
|
13
34
|
"license": "MIT",
|
|
14
35
|
"dependencies": {
|
|
15
36
|
"giturl": "^2.0.0",
|
|
16
37
|
"lodash": "~4.17.23",
|
|
17
38
|
"semver": "~7.5.4",
|
|
18
|
-
"@rushstack/node-core-library": "5.
|
|
39
|
+
"@rushstack/node-core-library": "5.20.0"
|
|
19
40
|
},
|
|
20
41
|
"devDependencies": {
|
|
21
42
|
"@types/lodash": "4.17.23",
|
|
22
43
|
"@types/semver": "7.5.0",
|
|
23
44
|
"eslint": "~9.37.0",
|
|
24
45
|
"local-node-rig": "1.0.0",
|
|
25
|
-
"@rushstack/heft": "1.
|
|
46
|
+
"@rushstack/heft": "1.2.0"
|
|
26
47
|
},
|
|
48
|
+
"sideEffects": false,
|
|
27
49
|
"scripts": {
|
|
28
50
|
"build": "heft build --clean",
|
|
29
51
|
"test": "heft test --clean",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|