UNPKG

@nodesecure/scanner

Version:

A package API to run a static analysis of your module's dependencies.

60 lines 2.08 kB
// 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