@@ -30,6 +30,7 @@ import { isSupportedSpdxId } from '../../spdx'
3030import type { _SpecProtocol as Spec } from '../../spec/_protocol'
3131import { Version as SpecVersion } from '../../spec/enums'
3232import type { NormalizerOptions } from '../types'
33+ import { normalizedString , token } from './_xsd'
3334import type { SimpleXml } from './types'
3435import { XmlSchema } from './types'
3536
@@ -295,7 +296,7 @@ export class LifecycleNormalizer extends BaseXmlNormalizer<Models.Lifecycle> {
295296 type : 'element' ,
296297 name : elementName ,
297298 children : [
298- makeTextElement ( data . name , 'name' ) ,
299+ makeTextElement ( data . name , 'name' , normalizedString ) ,
299300 makeOptionalTextElement ( data . description , 'description' )
300301 ] . filter ( isNotUndefined )
301302 }
@@ -338,9 +339,9 @@ export class ToolNormalizer extends BaseXmlNormalizer<Models.Tool> {
338339 type : 'element' ,
339340 name : elementName ,
340341 children : [
341- makeOptionalTextElement ( data . vendor , 'vendor' ) ,
342- makeOptionalTextElement ( data . name , 'name' ) ,
343- makeOptionalTextElement ( data . version , 'version' ) ,
342+ makeOptionalTextElement ( data . vendor , 'vendor' , normalizedString ) ,
343+ makeOptionalTextElement ( data . name , 'name' , normalizedString ) ,
344+ makeOptionalTextElement ( data . version , 'version' , normalizedString ) ,
344345 hashes ,
345346 externalReferences
346347 ] . filter ( isNotUndefined )
@@ -364,7 +365,7 @@ export class HashNormalizer extends BaseXmlNormalizer<Models.Hash> {
364365 type : 'element' ,
365366 name : elementName ,
366367 attributes : { alg : algorithm } ,
367- children : content
368+ children : token ( content )
368369 }
369370 : undefined
370371 }
@@ -386,9 +387,9 @@ export class OrganizationalContactNormalizer extends BaseXmlNormalizer<Models.Or
386387 type : 'element' ,
387388 name : elementName ,
388389 children : [
389- makeOptionalTextElement ( data . name , 'name' ) ,
390- makeOptionalTextElement ( data . email , 'email' ) ,
391- makeOptionalTextElement ( data . phone , 'phone' )
390+ makeOptionalTextElement ( data . name , 'name' , normalizedString ) ,
391+ makeOptionalTextElement ( data . email , 'email' , normalizedString ) ,
392+ makeOptionalTextElement ( data . phone , 'phone' , normalizedString )
392393 ] . filter ( isNotUndefined )
393394 }
394395 }
@@ -408,7 +409,7 @@ export class OrganizationalEntityNormalizer extends BaseXmlNormalizer<Models.Org
408409 type : 'element' ,
409410 name : elementName ,
410411 children : [
411- makeOptionalTextElement ( data . name , 'name' ) ,
412+ makeOptionalTextElement ( data . name , 'name' , normalizedString ) ,
412413 ...makeTextElementIter ( Array . from (
413414 data . url , ( s ) : string => escapeUri ( s . toString ( ) )
414415 ) , options , 'url'
@@ -442,7 +443,8 @@ export class ComponentNormalizer extends BaseXmlNormalizer<Models.Component> {
442443 : makeOptionalTextElement
443444 ) (
444445 data . version ?? '' ,
445- 'version'
446+ 'version' ,
447+ normalizedString
446448 )
447449 const hashes : SimpleXml . Element | undefined = data . hashes . size > 0
448450 ? {
@@ -494,16 +496,16 @@ export class ComponentNormalizer extends BaseXmlNormalizer<Models.Component> {
494496 } ,
495497 children : [
496498 supplier ,
497- makeOptionalTextElement ( data . author , 'author' ) ,
498- makeOptionalTextElement ( data . publisher , 'publisher' ) ,
499- makeOptionalTextElement ( data . group , 'group' ) ,
500- makeTextElement ( data . name , 'name' ) ,
499+ makeOptionalTextElement ( data . author , 'author' , normalizedString ) ,
500+ makeOptionalTextElement ( data . publisher , 'publisher' , normalizedString ) ,
501+ makeOptionalTextElement ( data . group , 'group' , normalizedString ) ,
502+ makeTextElement ( data . name , 'name' , normalizedString ) ,
501503 version ,
502- makeOptionalTextElement ( data . description , 'description' ) ,
504+ makeOptionalTextElement ( data . description , 'description' , normalizedString ) ,
503505 makeOptionalTextElement ( data . scope , 'scope' ) ,
504506 hashes ,
505507 licenses ,
506- makeOptionalTextElement ( data . copyright , 'copyright' ) ,
508+ makeOptionalTextElement ( data . copyright , 'copyright' , normalizedString ) ,
507509 makeOptionalTextElement ( data . cpe , 'cpe' ) ,
508510 makeOptionalTextElement ( data . purl , 'purl' ) ,
509511 swid ,
@@ -587,7 +589,7 @@ export class LicenseNormalizer extends BaseXmlNormalizer<Models.License> {
587589 : undefined
588590 } ,
589591 children : [
590- makeTextElement ( data . name , 'name' ) ,
592+ makeTextElement ( data . name , 'name' , normalizedString ) ,
591593 data . text === undefined
592594 ? undefined
593595 : this . _factory . makeForAttachment ( ) . normalize ( data . text , options , 'text' ) ,
@@ -621,7 +623,7 @@ export class LicenseNormalizer extends BaseXmlNormalizer<Models.License> {
621623 }
622624
623625 #normalizeLicenseExpression ( data : Models . LicenseExpression ) : SimpleXml . Element {
624- const elem = makeTextElement ( data . expression , 'expression' )
626+ const elem = makeTextElement ( data . expression , 'expression' , normalizedString )
625627 elem . attributes = {
626628 acknowledgement : this . _factory . spec . supportsLicenseAcknowledgement
627629 ? data . acknowledgement
@@ -722,7 +724,9 @@ export class AttachmentNormalizer extends BaseXmlNormalizer<Models.Attachment> {
722724 type : 'element' ,
723725 name : elementName ,
724726 attributes : {
725- 'content-type' : data . contentType || undefined ,
727+ 'content-type' : data . contentType
728+ ? normalizedString ( data . contentType )
729+ : undefined ,
726730 encoding : data . encoding || undefined
727731 } ,
728732 children : data . content . toString ( )
@@ -738,7 +742,7 @@ export class PropertyNormalizer extends BaseXmlNormalizer<Models.Property> {
738742 attributes : {
739743 name : data . name
740744 } ,
741- children : data . value
745+ children : normalizedString ( data . value )
742746 }
743747 }
744748
@@ -875,7 +879,7 @@ export class VulnerabilityNormalizer extends BaseXmlNormalizer<Models.Vulnerabil
875879 name : elementName ,
876880 attributes : { 'bom-ref' : data . bomRef . value || undefined } ,
877881 children : [
878- makeOptionalTextElement ( data . id , 'id' ) ,
882+ makeOptionalTextElement ( data . id , 'id' , normalizedString ) ,
879883 data . source === undefined
880884 ? undefined
881885 : this . _factory . makeForVulnerabilitySource ( ) . normalize ( data . source , options , 'source' ) ,
@@ -918,7 +922,7 @@ export class VulnerabilitySourceNormalizer extends BaseXmlNormalizer<Models.Vuln
918922 type : 'element' ,
919923 name : elementName ,
920924 children : [
921- makeOptionalTextElement ( data . name , 'name' ) ,
925+ makeOptionalTextElement ( data . name , 'name' , normalizedString ) ,
922926 XmlSchema . isAnyURI ( url )
923927 ? makeTextElement ( url , 'url' )
924928 : undefined
@@ -962,7 +966,7 @@ export class VulnerabilityRatingNormalizer extends BaseXmlNormalizer<Models.Vuln
962966 this . _factory . spec . supportsVulnerabilityRatingMethod ( data . method )
963967 ? makeOptionalTextElement ( data . method , 'method' )
964968 : undefined ,
965- makeOptionalTextElement ( data . vector , 'vector' ) ,
969+ makeOptionalTextElement ( data . vector , 'vector' , normalizedString ) ,
966970 makeOptionalTextElement ( data . justification , 'justification' )
967971 ] . filter ( isNotUndefined )
968972 }
@@ -1106,7 +1110,7 @@ export class VulnerabilityAffectedVersionNormalizer extends BaseXmlNormalizer<Mo
11061110 type : 'element' ,
11071111 name : elementName ,
11081112 children : [
1109- makeTextElement ( data . version , 'version' ) ,
1113+ makeTextElement ( data . version , 'version' , normalizedString ) ,
11101114 makeOptionalTextElement ( data . status , 'status' )
11111115 ] . filter ( isNotUndefined )
11121116 }
@@ -1117,7 +1121,7 @@ export class VulnerabilityAffectedVersionNormalizer extends BaseXmlNormalizer<Mo
11171121 type : 'element' ,
11181122 name : elementName ,
11191123 children : [
1120- makeTextElement ( data . range , 'range' ) ,
1124+ makeTextElement ( data . range , 'range' , normalizedString ) ,
11211125 makeOptionalTextElement ( data . status , 'status' )
11221126 ] . filter ( isNotUndefined )
11231127 }
@@ -1136,32 +1140,35 @@ export class VulnerabilityAffectedVersionNormalizer extends BaseXmlNormalizer<Mo
11361140
11371141type StrictTextElement = SimpleXml . TextElement & { children : string }
11381142
1139- function makeOptionalTextElement ( data : null | undefined | Stringable , elementName : string ) : undefined | StrictTextElement {
1140- const s = data ?. toString ( ) ?? ''
1143+ type TextElementModifier = ( i :string ) => string
1144+ const noTEM : TextElementModifier = ( s ) => s
1145+
1146+ function makeOptionalTextElement ( data : null | undefined | Stringable , elementName : string , mod : TextElementModifier = noTEM ) : undefined | StrictTextElement {
1147+ const s = mod ( data ?. toString ( ) ?? '' )
11411148 return s . length > 0
11421149 ? makeTextElement ( s , elementName )
11431150 : undefined
11441151}
11451152
1146- function makeTextElement ( data : Stringable , elementName : string ) : StrictTextElement {
1153+ function makeTextElement ( data : Stringable , elementName : string , mod : TextElementModifier = noTEM ) : StrictTextElement {
11471154 return {
11481155 type : 'element' ,
11491156 name : elementName ,
1150- children : data . toString ( )
1157+ children : mod ( data . toString ( ) )
11511158 }
11521159}
11531160
1154- function makeTextElementIter ( data : Iterable < Stringable > , options : NormalizerOptions , elementName : string ) : StrictTextElement [ ] {
1155- const r : StrictTextElement [ ] = Array . from ( data , d => makeTextElement ( d , elementName ) )
1161+ function makeTextElementIter ( data : Iterable < Stringable > , options : NormalizerOptions , elementName : string , mod : TextElementModifier = noTEM ) : StrictTextElement [ ] {
1162+ const r : StrictTextElement [ ] = Array . from ( data , d => makeTextElement ( d , elementName , mod ) )
11561163 if ( options . sortLists ?? false ) {
11571164 r . sort ( ( { children : a } , { children : b } ) => a . localeCompare ( b ) )
11581165 }
11591166 return r
11601167}
11611168
1162- function makeOptionalDateTimeElement ( data : null | undefined | Date , elementName : string ) : undefined | StrictTextElement {
1169+ function makeOptionalDateTimeElement ( data : null | undefined | Date , elementName : string , mod : TextElementModifier = noTEM ) : undefined | StrictTextElement {
11631170 const d = data ?. toISOString ( )
11641171 return d === undefined
11651172 ? undefined
1166- : makeTextElement ( d , elementName )
1173+ : makeTextElement ( d , elementName , mod )
11671174}
0 commit comments