@nodesecure/scanner
Version:
A package API to run a static analysis of your module's dependencies.
60 lines • 2.08 kB
JavaScript
// Import Third-party Dependencies
import { parseNpmSpec } from "@nodesecure/mama/utils/parseNpmSpec.js";
import semver from "semver";
export class HighlightedPackages {
level = "manifest";
#semverRanges;
#highlightedPackages = new Set();
constructor(packages) {
this.#semverRanges = this.#parseSemverRange(packages);
}
#parseSemverRange(packages) {
const pkgs = Array.isArray(packages) ? this.#parseSpecs(packages) : packages;
return Object.entries(pkgs).reduce((acc, [name, semverRange]) => {
if (Array.isArray(semverRange)) {
acc[name] = semverRange.join(" || ");
}
else {
acc[name] = semverRange;
}
return acc;
}, {});
}
#parseSpecs(specs) {
return specs.reduce((acc, spec) => {
// Handle scope-only entries like "@fastify", matching all packages under that scope
if (/^@[^/@]+$/.test(spec)) {
acc[spec] = ["*"];
return acc;
}
const parsedSpec = parseNpmSpec(spec);
if (!parsedSpec) {
return acc;
}
const { name, semver } = parsedSpec;
const version = semver || "*";
if (name in acc) {
acc[name].push(version);
}
else {
acc[name] = [version];
}
return acc;
}, {});
}
next(version, _, parent) {
const packageRange = this.#semverRanges?.[parent.name];
const org = parseNpmSpec(parent.name)?.org;
const isScopeHighlighted = org !== null && `@${org}` in this.#semverRanges;
if ((packageRange && semver.satisfies(version, packageRange)) ||
isScopeHighlighted) {
this.#highlightedPackages.add(`${parent.name}@${version}`);
}
}
done() {
return {
highlightedPackages: [...this.#highlightedPackages]
};
}
}
//# sourceMappingURL=HighlightedPackagesExtractor.class.js.map