using StellaOps.Scanner.Analyzers.Lang.Node.Internal; namespace StellaOps.Scanner.Analyzers.Lang.Node; public sealed class NodeLanguageAnalyzer : ILanguageAnalyzer { public string Id => "node"; public string DisplayName => "Node.js Analyzer"; public async ValueTask AnalyzeAsync(LanguageAnalyzerContext context, LanguageComponentWriter writer, CancellationToken cancellationToken) { ArgumentNullException.ThrowIfNull(context); ArgumentNullException.ThrowIfNull(writer); var lockData = await NodeLockData.LoadAsync(context.RootPath, cancellationToken).ConfigureAwait(false); var packages = NodePackageCollector.CollectPackages(context, lockData, cancellationToken); foreach (var package in packages.OrderBy(static p => p.ComponentKey, StringComparer.Ordinal)) { cancellationToken.ThrowIfCancellationRequested(); var metadata = package.CreateMetadata(); var evidence = package.CreateEvidence(); writer.AddFromPurl( analyzerId: Id, purl: package.Purl, name: package.Name, version: package.Version, type: "npm", metadata: metadata, evidence: evidence, usedByEntrypoint: package.IsUsedByEntrypoint); } } }