@nodesecure/scanner 5.3.0 → 6.0.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.
Files changed (90) hide show
  1. package/README.md +6 -116
  2. package/dist/class/logger.class.d.ts +27 -0
  3. package/dist/class/logger.class.d.ts.map +1 -0
  4. package/dist/class/logger.class.js +52 -0
  5. package/dist/class/logger.class.js.map +1 -0
  6. package/dist/comparePayloads.d.ts +66 -0
  7. package/dist/comparePayloads.d.ts.map +1 -0
  8. package/dist/comparePayloads.js +147 -0
  9. package/dist/comparePayloads.js.map +1 -0
  10. package/dist/depWalker.d.ts +10 -0
  11. package/dist/depWalker.d.ts.map +1 -0
  12. package/dist/depWalker.js +205 -0
  13. package/dist/depWalker.js.map +1 -0
  14. package/dist/i18n/english.d.ts +9 -0
  15. package/dist/i18n/english.d.ts.map +1 -0
  16. package/dist/i18n/english.js +6 -0
  17. package/dist/i18n/english.js.map +1 -0
  18. package/dist/i18n/french.d.ts +9 -0
  19. package/dist/i18n/french.d.ts.map +1 -0
  20. package/dist/i18n/french.js +6 -0
  21. package/dist/i18n/french.js.map +1 -0
  22. package/dist/index.d.ts +11 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +68 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/npmRegistry.d.ts +9 -0
  27. package/dist/npmRegistry.d.ts.map +1 -0
  28. package/dist/npmRegistry.js +125 -0
  29. package/dist/npmRegistry.js.map +1 -0
  30. package/dist/types.d.ts +216 -0
  31. package/dist/types.d.ts.map +1 -0
  32. package/dist/types.js +4 -0
  33. package/dist/types.js.map +1 -0
  34. package/dist/utils/addMissingVersionFlags.d.ts +3 -0
  35. package/dist/utils/addMissingVersionFlags.d.ts.map +1 -0
  36. package/dist/utils/addMissingVersionFlags.js +21 -0
  37. package/dist/utils/addMissingVersionFlags.js.map +1 -0
  38. package/dist/utils/dirname.d.ts +2 -0
  39. package/dist/utils/dirname.d.ts.map +1 -0
  40. package/dist/utils/dirname.js +8 -0
  41. package/dist/utils/dirname.js.map +1 -0
  42. package/dist/utils/getLinks.d.ts +7 -0
  43. package/dist/utils/getLinks.d.ts.map +1 -0
  44. package/dist/utils/getLinks.js +32 -0
  45. package/dist/utils/getLinks.js.map +1 -0
  46. package/dist/utils/index.d.ts +11 -0
  47. package/dist/utils/index.d.ts.map +1 -0
  48. package/dist/utils/index.js +9 -0
  49. package/dist/utils/index.js.map +1 -0
  50. package/dist/utils/urlToString.d.ts +2 -0
  51. package/dist/utils/urlToString.d.ts.map +1 -0
  52. package/dist/utils/urlToString.js +6 -0
  53. package/dist/utils/urlToString.js.map +1 -0
  54. package/dist/utils/warnings.d.ts +9 -0
  55. package/dist/utils/warnings.d.ts.map +1 -0
  56. package/dist/utils/warnings.js +49 -0
  57. package/dist/utils/warnings.js.map +1 -0
  58. package/package.json +23 -42
  59. package/LICENSE +0 -21
  60. package/i18n/english.js +0 -6
  61. package/i18n/french.js +0 -7
  62. package/index.d.ts +0 -14
  63. package/index.js +0 -74
  64. package/src/class/dependency.class.js +0 -113
  65. package/src/class/logger.class.js +0 -54
  66. package/src/constants.js +0 -13
  67. package/src/depWalker.js +0 -388
  68. package/src/manifest.js +0 -94
  69. package/src/npmRegistry.js +0 -168
  70. package/src/tarball.js +0 -210
  71. package/src/utils/addMissingVersionFlags.js +0 -24
  72. package/src/utils/analyzeDependencies.js +0 -71
  73. package/src/utils/booleanToFlags.js +0 -12
  74. package/src/utils/dirname.js +0 -9
  75. package/src/utils/filterDependencyKind.js +0 -44
  76. package/src/utils/getLinks.js +0 -36
  77. package/src/utils/getPackageName.js +0 -21
  78. package/src/utils/getTarballComposition.js +0 -38
  79. package/src/utils/index.js +0 -18
  80. package/src/utils/isGitDependency.js +0 -11
  81. package/src/utils/isSensitiveFile.js +0 -17
  82. package/src/utils/mergeDependencies.js +0 -30
  83. package/src/utils/parseManifestAuthor.js +0 -45
  84. package/src/utils/semver.js +0 -62
  85. package/src/utils/warnings.js +0 -44
  86. package/types/api.d.ts +0 -15
  87. package/types/logger.d.ts +0 -38
  88. package/types/scanner.d.ts +0 -251
  89. package/types/tarball.d.ts +0 -63
  90. package/types/walker.d.ts +0 -8
@@ -0,0 +1,205 @@
1
+ // Import Node.js Dependencies
2
+ import path from "node:path";
3
+ import { readFileSync, promises as fs } from "node:fs";
4
+ import timers from "node:timers/promises";
5
+ import os from "node:os";
6
+ // Import Third-party Dependencies
7
+ import { Mutex, MutexRelease } from "@openally/mutex";
8
+ import { scanDirOrArchive } from "@nodesecure/tarball";
9
+ import * as vuln from "@nodesecure/vuln";
10
+ import { npm } from "@nodesecure/tree-walker";
11
+ // Import Internal Dependencies
12
+ import { getDependenciesWarnings, addMissingVersionFlags } from "./utils/index.js";
13
+ import { packageMetadata, manifestMetadata } from "./npmRegistry.js";
14
+ import { Logger, ScannerLoggerEvents } from "./class/logger.class.js";
15
+ // CONSTANTS
16
+ const kDefaultDependencyVersionFields = {
17
+ description: "",
18
+ size: 0,
19
+ author: null,
20
+ engines: {},
21
+ scripts: {},
22
+ licenses: [],
23
+ uniqueLicenseIds: [],
24
+ composition: {
25
+ extensions: [],
26
+ files: [],
27
+ minified: [],
28
+ unused: [],
29
+ missing: [],
30
+ required_files: [],
31
+ required_nodejs: [],
32
+ required_thirdparty: [],
33
+ required_subpath: []
34
+ }
35
+ };
36
+ const kDefaultDependencyMetadata = {
37
+ publishedCount: 0,
38
+ lastUpdateAt: new Date(),
39
+ lastVersion: "N/A",
40
+ hasChangedAuthor: false,
41
+ hasManyPublishers: false,
42
+ hasReceivedUpdateInOneYear: true,
43
+ homepage: null,
44
+ author: null,
45
+ publishers: [],
46
+ maintainers: [],
47
+ integrity: {}
48
+ };
49
+ const { version: packageVersion } = JSON.parse(readFileSync(new URL(path.join("..", "package.json"), import.meta.url), "utf-8"));
50
+ export async function depWalker(manifest, options, logger = new Logger()) {
51
+ const { scanRootNode = false, includeDevDeps = false, packageLock, maxDepth, location, vulnerabilityStrategy = vuln.strategies.NONE, registry } = options;
52
+ // Create TMP directory
53
+ const tmpLocation = await fs.mkdtemp(path.join(os.tmpdir(), "/"));
54
+ const payload = {
55
+ id: tmpLocation.slice(-6),
56
+ rootDependencyName: manifest.name,
57
+ scannerVersion: packageVersion,
58
+ vulnerabilityStrategy,
59
+ warnings: []
60
+ };
61
+ const dependencies = new Map();
62
+ const npmTreeWalker = new npm.TreeWalker({
63
+ registry
64
+ });
65
+ {
66
+ logger
67
+ .start(ScannerLoggerEvents.analysis.tree)
68
+ .start(ScannerLoggerEvents.analysis.tarball)
69
+ .start(ScannerLoggerEvents.analysis.registry);
70
+ const fetchedMetadataPackages = new Set();
71
+ const operationsQueue = [];
72
+ const locker = new Mutex({ concurrency: 5 });
73
+ locker.on(MutexRelease, () => logger.tick(ScannerLoggerEvents.analysis.tarball));
74
+ const rootDepsOptions = {
75
+ maxDepth,
76
+ includeDevDeps,
77
+ packageLock
78
+ };
79
+ for await (const current of npmTreeWalker.walk(manifest, rootDepsOptions)) {
80
+ const { name, version, ...currentVersion } = current;
81
+ const dependency = {
82
+ versions: {
83
+ [version]: {
84
+ ...currentVersion,
85
+ ...structuredClone(kDefaultDependencyVersionFields)
86
+ }
87
+ },
88
+ vulnerabilities: [],
89
+ metadata: structuredClone(kDefaultDependencyMetadata)
90
+ };
91
+ let proceedDependencyScan = true;
92
+ if (dependencies.has(name)) {
93
+ const dep = dependencies.get(name);
94
+ operationsQueue.push(manifestMetadata(name, version, dep));
95
+ if (version in dep.versions) {
96
+ // The dependency has already entered the analysis
97
+ // This happens if the package is used by multiple packages in the tree
98
+ proceedDependencyScan = false;
99
+ }
100
+ else {
101
+ dep.versions[version] = dependency.versions[version];
102
+ }
103
+ }
104
+ else {
105
+ dependencies.set(name, dependency);
106
+ }
107
+ // If the dependency is a DevDependencies we ignore it.
108
+ if (current.isDevDependency || !proceedDependencyScan) {
109
+ continue;
110
+ }
111
+ logger.tick(ScannerLoggerEvents.analysis.tree);
112
+ // There is no need to fetch 'N' times the npm metadata for the same package.
113
+ if (fetchedMetadataPackages.has(name) || !current.existOnRemoteRegistry) {
114
+ logger.tick(ScannerLoggerEvents.analysis.registry);
115
+ }
116
+ else {
117
+ fetchedMetadataPackages.add(name);
118
+ operationsQueue.push(packageMetadata(name, version, {
119
+ dependency,
120
+ logger
121
+ }));
122
+ }
123
+ const scanDirOptions = {
124
+ ref: dependency.versions[version],
125
+ location,
126
+ tmpLocation: scanRootNode && name === manifest.name ? null : tmpLocation,
127
+ registry
128
+ };
129
+ operationsQueue.push(scanDirOrArchiveEx(name, version, locker, scanDirOptions));
130
+ }
131
+ logger.end(ScannerLoggerEvents.analysis.tree);
132
+ await Promise.allSettled(operationsQueue);
133
+ await timers.setImmediate();
134
+ logger
135
+ .end(ScannerLoggerEvents.analysis.tarball)
136
+ .end(ScannerLoggerEvents.analysis.registry);
137
+ }
138
+ const { hydratePayloadDependencies, strategy } = await vuln.setStrategy(vulnerabilityStrategy);
139
+ await hydratePayloadDependencies(dependencies, {
140
+ useStandardFormat: true,
141
+ path: location
142
+ });
143
+ payload.vulnerabilityStrategy = strategy;
144
+ // We do this because it "seem" impossible to link all dependencies in the first walk.
145
+ // Because we are dealing with package only one time it may happen sometimes.
146
+ const globalWarnings = [];
147
+ for (const [packageName, dependency] of dependencies) {
148
+ const metadataIntegrities = dependency.metadata?.integrity ?? {};
149
+ for (const [version, integrity] of Object.entries(metadataIntegrities)) {
150
+ const dependencyVer = dependency.versions[version];
151
+ // @ts-ignore
152
+ const isEmptyPackage = dependencyVer.warnings.some((warning) => warning.kind === "empty-package");
153
+ if (isEmptyPackage) {
154
+ globalWarnings.push(`${packageName}@${version} only contain a package.json file!`);
155
+ }
156
+ if (!("integrity" in dependencyVer) || dependencyVer.flags.includes("isGit")) {
157
+ continue;
158
+ }
159
+ if (dependencyVer.integrity !== integrity) {
160
+ globalWarnings.push(`${packageName}@${version} manifest & tarball integrity doesn't match!`);
161
+ }
162
+ }
163
+ for (const version of Object.entries(dependency.versions)) {
164
+ const [verStr, verDescriptor] = version;
165
+ verDescriptor.flags.push(...addMissingVersionFlags(new Set(verDescriptor.flags), dependency));
166
+ const usedDeps = npmTreeWalker.relationsMap.get(`${packageName}@${verStr}`) || new Set();
167
+ if (usedDeps.size === 0) {
168
+ continue;
169
+ }
170
+ const usedBy = Object.create(null);
171
+ for (const [name, version] of [...usedDeps].map((name) => name.split("@"))) {
172
+ usedBy[name] = version;
173
+ }
174
+ Object.assign(verDescriptor.usedBy, usedBy);
175
+ }
176
+ }
177
+ try {
178
+ const { warnings, illuminated } = await getDependenciesWarnings(dependencies, options.highlight?.contacts);
179
+ payload.warnings = globalWarnings.concat(warnings);
180
+ payload.highlighted = {
181
+ contacts: illuminated
182
+ };
183
+ payload.dependencies = Object.fromEntries(dependencies);
184
+ return payload;
185
+ }
186
+ finally {
187
+ await timers.setImmediate();
188
+ await fs.rm(tmpLocation, { recursive: true, force: true });
189
+ logger.emit(ScannerLoggerEvents.done);
190
+ }
191
+ }
192
+ // eslint-disable-next-line max-params
193
+ async function scanDirOrArchiveEx(name, version, locker, options) {
194
+ const free = await locker.acquire();
195
+ try {
196
+ await scanDirOrArchive(name, version, options);
197
+ }
198
+ catch {
199
+ // ignore
200
+ }
201
+ finally {
202
+ free();
203
+ }
204
+ }
205
+ //# sourceMappingURL=depWalker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"depWalker.js","sourceRoot":"","sources":["../src/depWalker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ declare namespace _default {
2
+ export { scanner };
3
+ }
4
+ export default _default;
5
+ declare namespace scanner {
6
+ let disable_scarf: string;
7
+ let keylogging: string;
8
+ }
9
+ //# sourceMappingURL=english.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"english.d.ts","sourceRoot":"","sources":["../../src/i18n/english.js"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ const scanner = {
2
+ disable_scarf: "This dependency could collect data against your consent so think to disable it with the env var: SCARF_ANALYTICS",
3
+ keylogging: "This dependency can retrieve your keyboard and mouse inputs. It can be used for 'keylogging' attacks/malwares."
4
+ };
5
+ export default { scanner };
6
+ //# sourceMappingURL=english.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"english.js","sourceRoot":"","sources":["../../src/i18n/english.js"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG;IACd,aAAa,EAAE,kHAAkH;IACjI,UAAU,EAAE,gHAAgH;CAC7H,CAAC;AAEF,eAAe,EAAE,OAAO,EAAE,CAAC"}
@@ -0,0 +1,9 @@
1
+ declare namespace _default {
2
+ export { scanner };
3
+ }
4
+ export default _default;
5
+ declare namespace scanner {
6
+ let disable_scarf: string;
7
+ let keylogging: string;
8
+ }
9
+ //# sourceMappingURL=french.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"french.d.ts","sourceRoot":"","sources":["../../src/i18n/french.js"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ const scanner = {
2
+ disable_scarf: "Cette dépendance peut récolter des données contre votre volonté, pensez donc à la désactiver en fournissant la variable d'environnement SCARF_ANALYTICS",
3
+ keylogging: "Cette dépendance peut obtenir vos entrées clavier ou de souris. Cette dépendance peut être utilisée en tant que 'keylogging' attacks/malwares."
4
+ };
5
+ export default { scanner };
6
+ //# sourceMappingURL=french.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"french.js","sourceRoot":"","sources":["../../src/i18n/french.js"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG;IACd,aAAa,EAAE,yJAAyJ;IACxK,UAAU,EAAE,gJAAgJ;CAC7J,CAAC;AAEF,eAAe,EAAE,OAAO,EAAE,CAAC"}
@@ -0,0 +1,11 @@
1
+ import * as tarball from "@nodesecure/tarball";
2
+ import { depWalker } from "./depWalker.js";
3
+ import { Logger, ScannerLoggerEvents } from "./class/logger.class.js";
4
+ import { comparePayloads } from "./comparePayloads.js";
5
+ import type { Options } from "./types.js";
6
+ export * from "./types.js";
7
+ export declare function cwd(location?: string, options?: Options, logger?: Logger): Promise<import("./types.js").Payload>;
8
+ export declare function from(packageName: string, options?: Omit<Options, "includeDevDeps">, logger?: Logger): Promise<import("./types.js").Payload>;
9
+ export declare function verify(packageName?: string): Promise<tarball.ScannedPackageResult>;
10
+ export { depWalker, tarball, comparePayloads, Logger, ScannerLoggerEvents };
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,OAAO,MAAM,qBAAqB,CAAC;AAI/C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAS1C,cAAc,YAAY,CAAC;AAE3B,wBAAsB,GAAG,CACvB,QAAQ,SAAgB,EACxB,OAAO,GAAE,OAAY,EACrB,MAAM,SAAe,yCAyBtB;AAED,wBAAsB,IAAI,CACxB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAM,EAC7C,MAAM,SAAe,yCAkBtB;AAED,wBAAsB,MAAM,CAC1B,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAuBvC;AAED,OAAO,EACL,SAAS,EACT,OAAO,EACP,eAAe,EACf,MAAM,EACN,mBAAmB,EACpB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,68 @@
1
+ // Import Node.js Dependencies
2
+ import path from "node:path";
3
+ import fs from "node:fs/promises";
4
+ import timers from "node:timers/promises";
5
+ import os from "node:os";
6
+ // Import Third-party Dependencies
7
+ import pacote from "pacote";
8
+ import { getLocalRegistryURL } from "@nodesecure/npm-registry-sdk";
9
+ import * as tarball from "@nodesecure/tarball";
10
+ // Import Internal Dependencies
11
+ import { depWalker } from "./depWalker.js";
12
+ import { NPM_TOKEN, urlToString } from "./utils/index.js";
13
+ import { Logger, ScannerLoggerEvents } from "./class/logger.class.js";
14
+ import { comparePayloads } from "./comparePayloads.js";
15
+ // CONSTANTS
16
+ const kDefaultCwdOptions = {
17
+ forceRootAnalysis: true,
18
+ usePackageLock: true,
19
+ includeDevDeps: false
20
+ };
21
+ export * from "./types.js";
22
+ export async function cwd(location = process.cwd(), options = {}, logger = new Logger()) {
23
+ const registry = options.registry ?
24
+ urlToString(options.registry) :
25
+ getLocalRegistryURL();
26
+ const finalizedOptions = Object.assign({ location }, kDefaultCwdOptions, {
27
+ ...options,
28
+ registry
29
+ });
30
+ logger.start(ScannerLoggerEvents.manifest.read);
31
+ const packagePath = path.join(location, "package.json");
32
+ const str = await fs.readFile(packagePath, "utf-8");
33
+ logger.end(ScannerLoggerEvents.manifest.read);
34
+ return depWalker(JSON.parse(str), finalizedOptions, logger);
35
+ }
36
+ export async function from(packageName, options = {}, logger = new Logger()) {
37
+ const registry = options.registry ?
38
+ urlToString(options.registry) :
39
+ getLocalRegistryURL();
40
+ logger.start(ScannerLoggerEvents.manifest.fetch);
41
+ const manifest = await pacote.manifest(packageName, {
42
+ ...NPM_TOKEN, registry, cache: `${os.homedir()}/.npm`
43
+ });
44
+ logger.end(ScannerLoggerEvents.manifest.fetch);
45
+ return depWalker(
46
+ // FIX: find a way to merge pacote & registry interfaces
47
+ manifest, Object.assign(options, { registry }), logger);
48
+ }
49
+ export async function verify(packageName) {
50
+ if (typeof packageName === "undefined") {
51
+ return tarball.scanPackage(process.cwd());
52
+ }
53
+ const tmpLocation = await fs.mkdtemp(path.join(os.tmpdir(), "nsecure-"));
54
+ const dest = path.join(tmpLocation, packageName);
55
+ try {
56
+ await pacote.extract(packageName, dest, {
57
+ ...NPM_TOKEN, registry: getLocalRegistryURL(), cache: `${os.homedir()}/.npm`
58
+ });
59
+ const scanResult = await tarball.scanPackage(dest, packageName);
60
+ return scanResult;
61
+ }
62
+ finally {
63
+ await timers.setImmediate();
64
+ await fs.rm(tmpLocation, { recursive: true, force: true });
65
+ }
66
+ }
67
+ export { depWalker, tarball, comparePayloads, Logger, ScannerLoggerEvents };
68
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { Logger } from "./class/logger.class.js";
2
+ import type { Dependency } from "./types.js";
3
+ export declare function manifestMetadata(name: string, version: string, dependency: any): Promise<void>;
4
+ export interface PackageMetadataOptions {
5
+ logger: Logger;
6
+ dependency: Dependency;
7
+ }
8
+ export declare function packageMetadata(name: string, version: string, options: PackageMetadataOptions): Promise<void>;
9
+ //# sourceMappingURL=npmRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npmRegistry.d.ts","sourceRoot":"","sources":["../src/npmRegistry.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,KAAK,EAGV,UAAU,EACX,MAAM,YAAY,CAAC;AAEpB,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,GAAG,iBAuBhB;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,UAAU,CAAC;CACxB;AAED,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAqFf"}
@@ -0,0 +1,125 @@
1
+ // Import Third-party Dependencies
2
+ import semver from "semver";
3
+ import * as npmRegistrySDK from "@nodesecure/npm-registry-sdk";
4
+ import { packageJSONIntegrityHash } from "@nodesecure/mama";
5
+ // Import Internal Dependencies
6
+ import { getLinks } from "./utils/index.js";
7
+ import { Logger } from "./class/logger.class.js";
8
+ export async function manifestMetadata(name, version, dependency) {
9
+ try {
10
+ const pkgVersion = await npmRegistrySDK.packumentVersion(name, version);
11
+ const integrity = packageJSONIntegrityHash(pkgVersion, {
12
+ isFromRemoteRegistry: true
13
+ });
14
+ Object.assign(dependency.versions[version], {
15
+ links: getLinks(pkgVersion)
16
+ });
17
+ dependency.metadata.integrity[version] = integrity;
18
+ }
19
+ catch {
20
+ // Ignore
21
+ }
22
+ }
23
+ export async function packageMetadata(name, version, options) {
24
+ const { dependency, logger } = options;
25
+ const spec = `${name}:${version}`;
26
+ try {
27
+ const pkg = await npmRegistrySDK.packument(name);
28
+ const oneYearFromToday = new Date();
29
+ oneYearFromToday.setFullYear(oneYearFromToday.getFullYear() - 1);
30
+ const lastVersion = pkg["dist-tags"].latest;
31
+ const lastUpdateAt = new Date(pkg.time[lastVersion]);
32
+ const metadata = {
33
+ author: pkg.author ?? null,
34
+ homepage: pkg.homepage || null,
35
+ publishedCount: Object.values(pkg.versions).length,
36
+ lastVersion,
37
+ lastUpdateAt,
38
+ hasReceivedUpdateInOneYear: !(oneYearFromToday > lastUpdateAt),
39
+ hasManyPublishers: false,
40
+ hasChangedAuthor: false,
41
+ maintainers: pkg.maintainers ?? [],
42
+ publishers: [],
43
+ integrity: {}
44
+ };
45
+ const isOutdated = semver.neq(version, lastVersion);
46
+ const flags = dependency.versions[version].flags;
47
+ if (isOutdated) {
48
+ flags.push("isOutdated");
49
+ }
50
+ const publishers = new Set();
51
+ let searchForMaintainersInVersions = metadata.maintainers.length === 0;
52
+ for (const ver of Object.values(pkg.versions).reverse()) {
53
+ if (spec === `${ver.name}:${ver.version}`) {
54
+ if ("deprecated" in ver && !flags.includes("isDeprecated")) {
55
+ flags.push("isDeprecated");
56
+ }
57
+ metadata.integrity[ver.version] = packageJSONIntegrityHash(ver, { isFromRemoteRegistry: true });
58
+ }
59
+ const { _npmUser = null, version, maintainers = [] } = ver;
60
+ if (_npmUser !== null) {
61
+ const authorName = metadata.author?.name ?? null;
62
+ if (authorName === null) {
63
+ metadata.author = _npmUser;
64
+ }
65
+ else if (authorName !== null && _npmUser.name !== authorName) {
66
+ metadata.hasManyPublishers = true;
67
+ }
68
+ if (!publishers.has(_npmUser.name)) {
69
+ publishers.add(_npmUser.name);
70
+ metadata.publishers.push({
71
+ ..._npmUser,
72
+ version,
73
+ at: new Date(pkg.time[version]).toISOString()
74
+ });
75
+ }
76
+ }
77
+ if (searchForMaintainersInVersions) {
78
+ metadata.maintainers.push(...maintainers);
79
+ searchForMaintainersInVersions = false;
80
+ }
81
+ }
82
+ await addNpmAvatar(metadata);
83
+ Object.assign(dependency.versions[version], { links: getLinks(pkg.versions[version]) });
84
+ dependency.metadata = metadata;
85
+ }
86
+ catch {
87
+ // ignore
88
+ }
89
+ finally {
90
+ logger.tick("registry");
91
+ }
92
+ }
93
+ async function addNpmAvatar(metadata) {
94
+ const contributors = [
95
+ ...metadata.maintainers,
96
+ ...metadata.publishers
97
+ ];
98
+ if (metadata.author !== null) {
99
+ contributors.push(metadata.author);
100
+ }
101
+ const emailToAvatar = {};
102
+ const promises = contributors.map((contributor) => {
103
+ if (contributor.email && emailToAvatar[contributor.email]) {
104
+ contributor.npmAvatar = emailToAvatar[contributor.email];
105
+ return Promise.resolve();
106
+ }
107
+ return npmRegistrySDK.user(contributor.name, { perPage: 1 })
108
+ .then((profile) => {
109
+ contributor.npmAvatar = profile.avatars.small;
110
+ if (contributor.email && contributor.npmAvatar) {
111
+ emailToAvatar[contributor.email] = contributor.npmAvatar;
112
+ }
113
+ }).catch(() => {
114
+ contributor.npmAvatar = undefined;
115
+ });
116
+ });
117
+ await Promise.all(promises);
118
+ // back fill npmAvatar if any name property was not npm username in first pass
119
+ for (const contributor of contributors) {
120
+ if (!contributor.npmAvatar && contributor.email && emailToAvatar[contributor.email]) {
121
+ contributor.npmAvatar = emailToAvatar[contributor.email];
122
+ }
123
+ }
124
+ }
125
+ //# sourceMappingURL=npmRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npmRegistry.js","sourceRoot":"","sources":["../src/npmRegistry.ts"],"names":[],"mappings":"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"}