UNPKG

@cyclonedx/cyclonedx-library

Version:

Core functionality of CycloneDX for JavaScript (Node.js or WebBrowser).

787 lines (783 loc) 32.6 kB
"use strict"; /*! This file is part of CycloneDX JavaScript Library. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. SPDX-License-Identifier: Apache-2.0 Copyright (c) OWASP Foundation. All Rights Reserved. */ Object.defineProperty(exports, "__esModule", { value: true }); exports.VulnerabilityAnalysisNormalizer = exports.VulnerabilityAffectedVersionNormalizer = exports.VulnerabilityAffectNormalizer = exports.VulnerabilityCreditsNormalizer = exports.VulnerabilityAdvisoryNormalizer = exports.VulnerabilityRatingNormalizer = exports.VulnerabilityReferenceNormalizer = exports.VulnerabilitySourceNormalizer = exports.VulnerabilityNormalizer = exports.DependencyGraphNormalizer = exports.PropertyNormalizer = exports.AttachmentNormalizer = exports.ExternalReferenceNormalizer = exports.SWIDNormalizer = exports.LicenseNormalizer = exports.ComponentEvidenceNormalizer = exports.ServiceNormalizer = exports.ComponentNormalizer = exports.OrganizationalEntityNormalizer = exports.OrganizationalContactNormalizer = exports.HashNormalizer = exports.ToolsNormalizer = exports.ToolNormalizer = exports.LifecycleNormalizer = exports.MetadataNormalizer = exports.BomNormalizer = exports.Factory = void 0; const iterable_1 = require("../../_helpers/iterable"); const notUndefined_1 = require("../../_helpers/notUndefined"); const tree_1 = require("../../_helpers/tree"); const uri_1 = require("../../_helpers/uri"); const license_1 = require("../../models/license"); const lifecycle_1 = require("../../models/lifecycle"); const tool_1 = require("../../models/tool"); const affect_1 = require("../../models/vulnerability/affect"); const spdx_1 = require("../../spdx"); const enums_1 = require("../../spec/enums"); const types_1 = require("./types"); class Factory { #spec; constructor(spec) { this.#spec = spec; } get spec() { return this.#spec; } makeForBom() { return new BomNormalizer(this); } makeForMetadata() { return new MetadataNormalizer(this); } makeForComponent() { return new ComponentNormalizer(this); } makeForService() { return new ServiceNormalizer(this); } makeForComponentEvidence() { return new ComponentEvidenceNormalizer(this); } makeForLifecycle() { return new LifecycleNormalizer(this); } makeForTool() { return new ToolNormalizer(this); } makeForTools() { return new ToolsNormalizer(this); } makeForOrganizationalContact() { return new OrganizationalContactNormalizer(this); } makeForOrganizationalEntity() { return new OrganizationalEntityNormalizer(this); } makeForHash() { return new HashNormalizer(this); } makeForLicense() { return new LicenseNormalizer(this); } makeForSWID() { return new SWIDNormalizer(this); } makeForExternalReference() { return new ExternalReferenceNormalizer(this); } makeForAttachment() { return new AttachmentNormalizer(this); } makeForProperty() { return new PropertyNormalizer(this); } makeForDependencyGraph() { return new DependencyGraphNormalizer(this); } makeForVulnerability() { return new VulnerabilityNormalizer(this); } makeForVulnerabilitySource() { return new VulnerabilitySourceNormalizer(this); } makeForVulnerabilityReference() { return new VulnerabilityReferenceNormalizer(this); } makeForVulnerabilityRating() { return new VulnerabilityRatingNormalizer(this); } makeForVulnerabilityAdvisory() { return new VulnerabilityAdvisoryNormalizer(this); } makeForVulnerabilityCredits() { return new VulnerabilityCreditsNormalizer(this); } makeForVulnerabilityAffect() { return new VulnerabilityAffectNormalizer(this); } makeForVulnerabilityAffectedVersion() { return new VulnerabilityAffectedVersionNormalizer(this); } makeForVulnerabilityAnalysis() { return new VulnerabilityAnalysisNormalizer(this); } } exports.Factory = Factory; const schemaUrl = new Map([ [enums_1.Version.v1dot6, 'http://cyclonedx.org/schema/bom-1.6.schema.json'], [enums_1.Version.v1dot5, 'http://cyclonedx.org/schema/bom-1.5.schema.json'], [enums_1.Version.v1dot4, 'http://cyclonedx.org/schema/bom-1.4.schema.json'], [enums_1.Version.v1dot3, 'http://cyclonedx.org/schema/bom-1.3a.schema.json'], [enums_1.Version.v1dot2, 'http://cyclonedx.org/schema/bom-1.2b.schema.json'] ]); class BaseJsonNormalizer { _factory; constructor(factory) { this._factory = factory; } get factory() { return this._factory; } } class BomNormalizer extends BaseJsonNormalizer { normalize(data, options) { return { $schema: schemaUrl.get(this._factory.spec.version), bomFormat: 'CycloneDX', specVersion: this._factory.spec.version, version: data.version, serialNumber: this.#isEligibleSerialNumber(data.serialNumber) ? data.serialNumber : undefined, metadata: this._factory.makeForMetadata().normalize(data.metadata, options), components: data.components.size > 0 ? this._factory.makeForComponent().normalizeIterable(data.components, options) : [], services: this._factory.spec.supportsServices && data.services.size > 0 ? this._factory.makeForService().normalizeIterable(data.services, options) : undefined, dependencies: this._factory.spec.supportsDependencyGraph ? this._factory.makeForDependencyGraph().normalize(data, options) : undefined, vulnerabilities: this._factory.spec.supportsVulnerabilities && data.vulnerabilities.size > 0 ? this._factory.makeForVulnerability().normalizeIterable(data.vulnerabilities, options) : undefined }; } #isEligibleSerialNumber(v) { return v !== undefined && /^urn:uuid:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/.test(v); } } exports.BomNormalizer = BomNormalizer; class MetadataNormalizer extends BaseJsonNormalizer { normalize(data, options) { const orgEntityNormalizer = this._factory.makeForOrganizationalEntity(); return { timestamp: data.timestamp?.toISOString(), lifecycles: this._factory.spec.supportsMetadataLifecycles && data.lifecycles.size > 0 ? this._factory.makeForLifecycle().normalizeIterable(data.lifecycles, options) : undefined, tools: data.tools.size > 0 ? this._factory.makeForTools().normalize(data.tools, options) : undefined, authors: data.authors.size > 0 ? this._factory.makeForOrganizationalContact().normalizeIterable(data.authors, options) : undefined, component: data.component === undefined ? undefined : this._factory.makeForComponent().normalize(data.component, options), manufacture: data.manufacture === undefined ? undefined : orgEntityNormalizer.normalize(data.manufacture, options), supplier: data.supplier === undefined ? undefined : orgEntityNormalizer.normalize(data.supplier, options), licenses: this._factory.spec.supportsMetadataLicenses && data.licenses.size > 0 ? this._factory.makeForLicense().normalizeIterable(data.licenses, options) : undefined, properties: this._factory.spec.supportsMetadataProperties && data.properties.size > 0 ? this._factory.makeForProperty().normalizeIterable(data.properties, options) : undefined }; } } exports.MetadataNormalizer = MetadataNormalizer; class LifecycleNormalizer extends BaseJsonNormalizer { normalize(data, options) { return data instanceof lifecycle_1.NamedLifecycle ? { name: data.name, description: data.description } : { phase: data }; } normalizeIterable(data, options) { return (options.sortLists ?? false ? data.sorted() : Array.from(data)).map(lc => this.normalize(lc, options)); } } exports.LifecycleNormalizer = LifecycleNormalizer; class ToolNormalizer extends BaseJsonNormalizer { normalize(data, options) { return { vendor: data.vendor || undefined, name: data.name || undefined, version: data.version || undefined, hashes: data.hashes.size > 0 ? this._factory.makeForHash().normalizeIterable(data.hashes, options) : undefined, externalReferences: this._factory.spec.supportsToolReferences && data.externalReferences.size > 0 ? this._factory.makeForExternalReference().normalizeIterable(data.externalReferences, options) : undefined }; } normalizeIterable(data, options) { return (options.sortLists ?? false ? data.sorted() : Array.from(data)).map(t => this.normalize(t, options)); } } exports.ToolNormalizer = ToolNormalizer; class ToolsNormalizer extends BaseJsonNormalizer { normalize(data, options) { if (data.tools.size > 0 || !this._factory.spec.supportsToolsComponentsServices) { return this._factory.makeForTool().normalizeIterable(new tool_1.ToolRepository((0, iterable_1.chainI)(Array.from(data.components, tool_1.Tool.fromComponent), Array.from(data.services, tool_1.Tool.fromService), data.tools)), options); } return { components: data.components.size > 0 ? this._factory.makeForComponent().normalizeIterable(data.components, options) : undefined, services: data.services.size > 0 ? this._factory.makeForService().normalizeIterable(data.services, options) : undefined }; } } exports.ToolsNormalizer = ToolsNormalizer; class HashNormalizer extends BaseJsonNormalizer { normalize([algorithm, content], options) { const spec = this._factory.spec; return spec.supportsHashAlgorithm(algorithm) && spec.supportsHashValue(content) ? { alg: algorithm, content } : undefined; } normalizeIterable(data, options) { return (options.sortLists ?? false ? data.sorted() : Array.from(data)).map(h => this.normalize(h, options)).filter(notUndefined_1.isNotUndefined); } } exports.HashNormalizer = HashNormalizer; class OrganizationalContactNormalizer extends BaseJsonNormalizer { normalize(data, options) { return { name: data.name || undefined, email: types_1.JsonSchema.isIdnEmail(data.email) ? data.email : undefined, phone: data.phone || undefined }; } normalizeIterable(data, options) { return (options.sortLists ?? false ? data.sorted() : Array.from(data)).map(oc => this.normalize(oc, options)); } } exports.OrganizationalContactNormalizer = OrganizationalContactNormalizer; class OrganizationalEntityNormalizer extends BaseJsonNormalizer { normalize(data, options) { const urls = normalizeStringableIter(Array.from(data.url, (s) => (0, uri_1.escapeUri)(s.toString())), options).filter(types_1.JsonSchema.isIriReference); return { name: data.name || undefined, url: urls.length > 0 ? urls : undefined, contact: data.contact.size > 0 ? this._factory.makeForOrganizationalContact().normalizeIterable(data.contact, options) : undefined }; } normalizeIterable(data, options) { return (options.sortLists ?? false ? data.sorted() : Array.from(data)).map(oe => this.normalize(oe, options)); } } exports.OrganizationalEntityNormalizer = OrganizationalEntityNormalizer; class ComponentNormalizer extends BaseJsonNormalizer { normalize(data, options) { const spec = this._factory.spec; if (!spec.supportsComponentType(data.type)) { return undefined; } const version = data.version ?? ''; return { type: data.type, name: data.name, group: data.group || undefined, version: version.length > 0 || spec.requiresComponentVersion ? version : undefined, 'bom-ref': data.bomRef.value || undefined, supplier: data.supplier === undefined ? undefined : this._factory.makeForOrganizationalEntity().normalize(data.supplier, options), author: data.author || undefined, publisher: data.publisher || undefined, description: data.description || undefined, scope: data.scope, hashes: data.hashes.size > 0 ? this._factory.makeForHash().normalizeIterable(data.hashes, options) : undefined, licenses: data.licenses.size > 0 ? this._factory.makeForLicense().normalizeIterable(data.licenses, options) : undefined, copyright: data.copyright?.toString() || undefined, cpe: data.cpe || undefined, purl: data.purl?.toString(), swid: data.swid === undefined ? undefined : this._factory.makeForSWID().normalize(data.swid, options), externalReferences: data.externalReferences.size > 0 ? this._factory.makeForExternalReference().normalizeIterable(data.externalReferences, options) : undefined, properties: spec.supportsProperties(data) && data.properties.size > 0 ? this._factory.makeForProperty().normalizeIterable(data.properties, options) : undefined, components: data.components.size > 0 ? this.normalizeIterable(data.components, options) : undefined, evidence: spec.supportsComponentEvidence && data.evidence !== undefined ? this._factory.makeForComponentEvidence().normalize(data.evidence, options) : undefined }; } normalizeIterable(data, options) { return (options.sortLists ?? false ? data.sorted() : Array.from(data)).map(c => this.normalize(c, options)).filter(notUndefined_1.isNotUndefined); } } exports.ComponentNormalizer = ComponentNormalizer; class ServiceNormalizer extends BaseJsonNormalizer { normalize(data, options) { const spec = this._factory.spec; return { 'bom-ref': data.bomRef.value || undefined, provider: data.provider ? this._factory.makeForOrganizationalEntity().normalize(data.provider, options) : undefined, group: data.group, name: data.name, version: data.version || undefined, description: data.description || undefined, licenses: data.licenses.size > 0 ? this._factory.makeForLicense().normalizeIterable(data.licenses, options) : undefined, externalReferences: data.externalReferences.size > 0 ? this._factory.makeForExternalReference().normalizeIterable(data.externalReferences, options) : undefined, services: data.services.size > 0 ? this._factory.makeForService().normalizeIterable(data.services, options) : undefined, properties: spec.supportsProperties(data) && data.properties.size > 0 ? this._factory.makeForProperty().normalizeIterable(data.properties, options) : undefined, }; } normalizeIterable(data, options) { return (options.sortLists ?? false ? data.sorted() : Array.from(data)).map(s => this.normalize(s, options)); } } exports.ServiceNormalizer = ServiceNormalizer; class ComponentEvidenceNormalizer extends BaseJsonNormalizer { normalize(data, options) { return { licenses: data.licenses.size > 0 ? this._factory.makeForLicense().normalizeIterable(data.licenses, options) : undefined, copyright: data.copyright.size > 0 ? (options.sortLists ? data.copyright.sorted().map(ComponentEvidenceNormalizer.#normalizeCopyright) : Array.from(data.copyright, ComponentEvidenceNormalizer.#normalizeCopyright)) : undefined }; } static #normalizeCopyright(c) { return { text: c.toString() }; } } exports.ComponentEvidenceNormalizer = ComponentEvidenceNormalizer; class LicenseNormalizer extends BaseJsonNormalizer { normalize(data, options) { switch (true) { case data instanceof license_1.NamedLicense: return this.#normalizeNamedLicense(data, options); case data instanceof license_1.SpdxLicense: return (0, spdx_1.isSupportedSpdxId)(data.id) ? this.#normalizeSpdxLicense(data, options) : this.#normalizeNamedLicense(new license_1.NamedLicense(data.id, { url: data.url }), options); case data instanceof license_1.LicenseExpression: return this.#normalizeLicenseExpression(data); default: throw new TypeError('Unexpected LicenseChoice'); } } #normalizeNamedLicense(data, options) { const url = (0, uri_1.escapeUri)(data.url?.toString()); return { license: { name: data.name, acknowledgement: this._factory.spec.supportsLicenseAcknowledgement ? data.acknowledgement : undefined, text: data.text === undefined ? undefined : this._factory.makeForAttachment().normalize(data.text, options), url: types_1.JsonSchema.isIriReference(url) ? url : undefined } }; } #normalizeSpdxLicense(data, options) { const url = (0, uri_1.escapeUri)(data.url?.toString()); return { license: { id: data.id, acknowledgement: this._factory.spec.supportsLicenseAcknowledgement ? data.acknowledgement : undefined, text: data.text === undefined ? undefined : this._factory.makeForAttachment().normalize(data.text, options), url: types_1.JsonSchema.isIriReference(url) ? url : undefined } }; } #normalizeLicenseExpression(data) { return { expression: data.expression, acknowledgement: this._factory.spec.supportsLicenseAcknowledgement ? data.acknowledgement : undefined }; } normalizeIterable(data, options) { const licenses = options.sortLists ?? false ? data.sorted() : Array.from(data); if (licenses.length > 1) { const expressions = licenses.filter(l => l instanceof license_1.LicenseExpression); if (expressions.length > 0) { return [this.#normalizeLicenseExpression(expressions[0])]; } } return licenses.map(l => this.normalize(l, options)); } } exports.LicenseNormalizer = LicenseNormalizer; class SWIDNormalizer extends BaseJsonNormalizer { normalize(data, options) { const url = (0, uri_1.escapeUri)(data.url?.toString()); return { tagId: data.tagId, name: data.name, version: data.version || undefined, tagVersion: data.tagVersion, patch: data.patch, text: data.text === undefined ? undefined : this._factory.makeForAttachment().normalize(data.text, options), url: types_1.JsonSchema.isIriReference(url) ? url : undefined }; } } exports.SWIDNormalizer = SWIDNormalizer; class ExternalReferenceNormalizer extends BaseJsonNormalizer { normalize(data, options) { return this._factory.spec.supportsExternalReferenceType(data.type) ? { url: (0, uri_1.escapeUri)(data.url.toString()), type: data.type, hashes: this._factory.spec.supportsExternalReferenceHashes && data.hashes.size > 0 ? this._factory.makeForHash().normalizeIterable(data.hashes, options) : undefined, comment: data.comment || undefined } : undefined; } normalizeIterable(data, options) { return (options.sortLists ?? false ? data.sorted() : Array.from(data)).map(r => this.normalize(r, options)).filter(notUndefined_1.isNotUndefined); } } exports.ExternalReferenceNormalizer = ExternalReferenceNormalizer; class AttachmentNormalizer extends BaseJsonNormalizer { normalize(data, options) { return { content: data.content.toString(), contentType: data.contentType || undefined, encoding: data.encoding }; } } exports.AttachmentNormalizer = AttachmentNormalizer; class PropertyNormalizer extends BaseJsonNormalizer { normalize(data, options) { return { name: data.name, value: data.value }; } normalizeIterable(data, options) { return (options.sortLists ?? false ? data.sorted() : Array.from(data)).map(p => this.normalize(p, options)); } } exports.PropertyNormalizer = PropertyNormalizer; class DependencyGraphNormalizer extends BaseJsonNormalizer { normalize(data, options) { const allRefs = new Map(); if (data.metadata.component !== undefined) { allRefs.set(data.metadata.component.bomRef, data.metadata.component.dependencies); for (const component of data.metadata.component.components[tree_1.treeIteratorSymbol]()) { allRefs.set(component.bomRef, component.dependencies); } } for (const component of data.components[tree_1.treeIteratorSymbol]()) { allRefs.set(component.bomRef, component.dependencies); } for (const service of data.services[tree_1.treeIteratorSymbol]()) { allRefs.set(service.bomRef, service.dependencies); } const normalized = []; for (const [ref, deps] of allRefs) { const dep = this.#normalizeDependency(ref, deps, allRefs, options); if ((0, notUndefined_1.isNotUndefined)(dep)) { normalized.push(dep); } } if (options.sortLists ?? false) { normalized.sort(({ ref: a }, { ref: b }) => a.localeCompare(b)); } return normalized; } #normalizeDependency(ref, deps, allRefs, options) { const bomRef = ref.toString(); if (bomRef.length === 0) { return undefined; } const dependsOn = normalizeStringableIter(Array.from(deps).filter(d => allRefs.has(d) && d !== ref), options).filter(d => d.length > 0); return { ref: bomRef, dependsOn: dependsOn.length > 0 ? dependsOn : undefined }; } } exports.DependencyGraphNormalizer = DependencyGraphNormalizer; class VulnerabilityNormalizer extends BaseJsonNormalizer { normalize(data, options) { return { 'bom-ref': data.bomRef.value || undefined, id: data.id || undefined, source: data.source === undefined ? undefined : this._factory.makeForVulnerabilitySource().normalize(data.source, options), references: data.references.size > 0 ? this._factory.makeForVulnerabilityReference().normalizeIterable(data.references, options) : undefined, ratings: data.ratings.size > 0 ? this._factory.makeForVulnerabilityRating().normalizeIterable(data.ratings, options) : undefined, cwes: data.cwes.size > 0 ? (options.sortLists ?? false ? data.cwes.sorted() : Array.from(data.cwes)) : undefined, description: data.description, detail: data.detail, recommendation: data.recommendation, advisories: data.advisories.size > 0 ? this._factory.makeForVulnerabilityAdvisory().normalizeIterable(data.advisories, options) : undefined, created: data.created?.toISOString(), published: data.published?.toISOString(), updated: data.updated?.toISOString(), credits: data.credits === undefined ? undefined : this._factory.makeForVulnerabilityCredits().normalize(data.credits, options), tools: data.tools.size > 0 ? this._factory.makeForTools().normalize(data.tools, options) : undefined, analysis: data.analysis === undefined ? undefined : this._factory.makeForVulnerabilityAnalysis().normalize(data.analysis, options), affects: data.affects.size > 0 ? this._factory.makeForVulnerabilityAffect().normalizeIterable(data.affects, options) : undefined, properties: data.properties.size > 0 ? this._factory.makeForProperty().normalizeIterable(data.properties, options) : undefined }; } normalizeIterable(data, options) { return (options.sortLists ?? false ? data.sorted() : Array.from(data)).map(v => this.normalize(v, options)); } } exports.VulnerabilityNormalizer = VulnerabilityNormalizer; class VulnerabilitySourceNormalizer extends BaseJsonNormalizer { normalize(data, options) { return { name: data.name, url: data.url?.toString() }; } } exports.VulnerabilitySourceNormalizer = VulnerabilitySourceNormalizer; class VulnerabilityReferenceNormalizer extends BaseJsonNormalizer { normalize(data, options) { return { id: data.id, source: this._factory.makeForVulnerabilitySource().normalize(data.source, options) }; } normalizeIterable(data, options) { return (options.sortLists ?? false ? data.sorted() : Array.from(data)).map(r => this.normalize(r, options)); } } exports.VulnerabilityReferenceNormalizer = VulnerabilityReferenceNormalizer; class VulnerabilityRatingNormalizer extends BaseJsonNormalizer { normalize(data, options) { return { source: data.source === undefined ? undefined : this._factory.makeForVulnerabilitySource().normalize(data.source, options), score: data.score, severity: data.severity, method: this._factory.spec.supportsVulnerabilityRatingMethod(data.method) ? data.method : undefined, vector: data.vector, justification: data.justification }; } normalizeIterable(data, options) { return (options.sortLists ?? false ? data.sorted() : Array.from(data)).map(r => this.normalize(r, options)); } } exports.VulnerabilityRatingNormalizer = VulnerabilityRatingNormalizer; class VulnerabilityAdvisoryNormalizer extends BaseJsonNormalizer { normalize(data, options) { const url = (0, uri_1.escapeUri)(data.url.toString()); if (!types_1.JsonSchema.isIriReference(url)) { return undefined; } return { title: data.title, url }; } normalizeIterable(data, options) { return (options.sortLists ?? false ? data.sorted() : Array.from(data)).map(a => this.normalize(a, options)).filter(notUndefined_1.isNotUndefined); } } exports.VulnerabilityAdvisoryNormalizer = VulnerabilityAdvisoryNormalizer; class VulnerabilityCreditsNormalizer extends BaseJsonNormalizer { normalize(data, options) { return { organizations: data.organizations.size > 0 ? this._factory.makeForOrganizationalEntity().normalizeIterable(data.organizations, options) : undefined, individuals: data.individuals.size > 0 ? this._factory.makeForOrganizationalContact().normalizeIterable(data.individuals, options) : undefined }; } } exports.VulnerabilityCreditsNormalizer = VulnerabilityCreditsNormalizer; class VulnerabilityAffectNormalizer extends BaseJsonNormalizer { normalize(data, options) { return { ref: data.ref.toString(), versions: data.versions.size > 0 ? this._factory.makeForVulnerabilityAffectedVersion().normalizeIterable(data.versions, options) : undefined }; } normalizeIterable(data, options) { return (options.sortLists ?? false ? data.sorted() : Array.from(data)).map(a => this.normalize(a, options)); } } exports.VulnerabilityAffectNormalizer = VulnerabilityAffectNormalizer; class VulnerabilityAffectedVersionNormalizer extends BaseJsonNormalizer { normalize(data, options) { switch (true) { case data instanceof affect_1.AffectedSingleVersion: return this.#normalizeAffectedSingleVersion(data); case data instanceof affect_1.AffectedVersionRange: return this.#normalizeAffectedVersionRange(data); default: throw new TypeError('Unexpected Vulnerability AffectedVersion'); } } #normalizeAffectedSingleVersion(data) { return data.version.length < 1 ? undefined : { version: data.version.substring(0, 1024), status: data.status }; } #normalizeAffectedVersionRange(data) { return data.range.length < 1 ? undefined : { range: data.range.substring(0, 1024), status: data.status }; } normalizeIterable(data, options) { return (options.sortLists ?? false ? data.sorted() : Array.from(data)).map(av => this.normalize(av, options)).filter(notUndefined_1.isNotUndefined); } } exports.VulnerabilityAffectedVersionNormalizer = VulnerabilityAffectedVersionNormalizer; class VulnerabilityAnalysisNormalizer extends BaseJsonNormalizer { normalize(data, options) { return { state: data.state, justification: data.justification, response: data.response.size > 0 ? (options.sortLists ?? false ? data.response.sorted() : Array.from(data.response)) : undefined, detail: data.detail }; } } exports.VulnerabilityAnalysisNormalizer = VulnerabilityAnalysisNormalizer; function normalizeStringableIter(data, options) { const r = Array.from(data, d => d.toString()); if (options.sortLists ?? false) { r.sort((a, b) => a.localeCompare(b)); } return r; } //# sourceMappingURL=normalize.js.map