@cyclonedx/cyclonedx-library 1.0.2 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/README.md +2 -1
  2. package/dist.node/builders/{fromPackageJson.node.js → fromNodePackageJson.node.js} +10 -1
  3. package/dist.node/builders/fromNodePackageJson.node.js.map +1 -0
  4. package/dist.node/builders/index.node.js +3 -2
  5. package/dist.node/builders/index.node.js.map +1 -1
  6. package/dist.node/factories/{fromPackageJson.node.js → fromNodePackageJson.node.js} +1 -1
  7. package/dist.node/factories/fromNodePackageJson.node.js.map +1 -0
  8. package/dist.node/factories/index.node.js +3 -2
  9. package/dist.node/factories/index.node.js.map +1 -1
  10. package/dist.node/factories/packageUrl.js +17 -5
  11. package/dist.node/factories/packageUrl.js.map +1 -1
  12. package/dist.node/helpers/tree.js +23 -0
  13. package/dist.node/helpers/tree.js.map +1 -0
  14. package/dist.node/models/component.js +8 -0
  15. package/dist.node/models/component.js.map +1 -1
  16. package/dist.node/serialize/bomRefDiscriminator.js +3 -0
  17. package/dist.node/serialize/bomRefDiscriminator.js.map +1 -1
  18. package/dist.node/serialize/json/normalize.js +18 -4
  19. package/dist.node/serialize/json/normalize.js.map +1 -1
  20. package/dist.node/serialize/jsonSerializer.js +3 -0
  21. package/dist.node/serialize/jsonSerializer.js.map +1 -1
  22. package/dist.node/serialize/xml/normalize.js +24 -5
  23. package/dist.node/serialize/xml/normalize.js.map +1 -1
  24. package/dist.node/serialize/xmlBaseSerializer.js +3 -0
  25. package/dist.node/serialize/xmlBaseSerializer.js.map +1 -1
  26. package/dist.node/spec.js +11 -6
  27. package/dist.node/spec.js.map +1 -1
  28. package/dist.node/types/cpe.js +1 -1
  29. package/dist.node/types/cpe.js.map +1 -1
  30. package/dist.web/lib.dev.js +120 -21
  31. package/dist.web/lib.dev.js.map +1 -1
  32. package/dist.web/lib.js +1 -1
  33. package/package.json +4 -2
  34. package/src/builders/{fromPackageJson.node.ts → fromNodePackageJson.node.ts} +16 -4
  35. package/src/builders/index.node.ts +4 -1
  36. package/src/factories/{fromPackageJson.node.ts → fromNodePackageJson.node.ts} +0 -0
  37. package/src/factories/index.node.ts +4 -1
  38. package/src/factories/packageUrl.ts +31 -8
  39. package/src/helpers/tree.ts +20 -0
  40. package/src/models/component.ts +10 -0
  41. package/src/serialize/bomRefDiscriminator.ts +5 -0
  42. package/src/serialize/json/normalize.ts +19 -5
  43. package/src/serialize/jsonSerializer.ts +4 -0
  44. package/src/serialize/xml/normalize.ts +30 -9
  45. package/src/serialize/xmlBaseSerializer.ts +4 -0
  46. package/src/spec.ts +16 -4
  47. package/src/types/cpe.ts +2 -2
  48. package/dist.node/builders/fromPackageJson.node.js.map +0 -1
  49. package/dist.node/factories/fromPackageJson.node.js.map +0 -1
@@ -23,6 +23,7 @@ import * as Models from '../../models'
23
23
  import { Protocol as Spec, Version as SpecVersion } from '../../spec'
24
24
  import { NormalizerOptions } from '../types'
25
25
  import { JsonSchema, Normalized } from './types'
26
+ import { treeIterator } from '../../helpers/tree'
26
27
 
27
28
  export class Factory {
28
29
  readonly #spec: Spec
@@ -103,6 +104,10 @@ abstract class Base implements Normalizer {
103
104
  this._factory = factory
104
105
  }
105
106
 
107
+ get factory (): Factory {
108
+ return this._factory
109
+ }
110
+
106
111
  abstract normalize (data: object, options: NormalizerOptions): object | undefined
107
112
  }
108
113
 
@@ -238,13 +243,16 @@ export class OrganizationalEntityNormalizer extends Base {
238
243
 
239
244
  export class ComponentNormalizer extends Base {
240
245
  normalize (data: Models.Component, options: NormalizerOptions): Normalized.Component | undefined {
241
- return this._factory.spec.supportsComponentType(data.type)
246
+ const spec = this._factory.spec
247
+ const version: string = data.version ?? ''
248
+ return spec.supportsComponentType(data.type)
242
249
  ? {
243
250
  type: data.type,
244
251
  name: data.name,
245
252
  group: data.group || undefined,
246
- // version fallback to string for spec < 1.4
247
- version: data.version || '',
253
+ version: version.length > 0 || spec.requiresComponentVersion
254
+ ? version
255
+ : undefined,
248
256
  'bom-ref': data.bomRef.value || undefined,
249
257
  supplier: data.supplier === undefined
250
258
  ? undefined
@@ -267,6 +275,9 @@ export class ComponentNormalizer extends Base {
267
275
  : this._factory.makeForSWID().normalize(data.swid, options),
268
276
  externalReferences: data.externalReferences.size > 0
269
277
  ? this._factory.makeForExternalReference().normalizeRepository(data.externalReferences, options)
278
+ : undefined,
279
+ components: data.components.size > 0
280
+ ? this.normalizeRepository(data.components, options)
270
281
  : undefined
271
282
  }
272
283
  : undefined
@@ -391,9 +402,12 @@ export class DependencyGraphNormalizer extends Base {
391
402
  const allRefs = new Map<Models.BomRef, Models.BomRefRepository>()
392
403
  if (data.metadata.component !== undefined) {
393
404
  allRefs.set(data.metadata.component.bomRef, data.metadata.component.dependencies)
405
+ for (const component of data.metadata.component.components[treeIterator]()) {
406
+ allRefs.set(component.bomRef, component.dependencies)
407
+ }
394
408
  }
395
- for (const c of data.components) {
396
- allRefs.set(c.bomRef, new Models.BomRefRepository(c.dependencies))
409
+ for (const component of data.components[treeIterator]()) {
410
+ allRefs.set(component.bomRef, component.dependencies)
397
411
  }
398
412
 
399
413
  const normalized: Normalized.Dependency[] = []
@@ -42,6 +42,10 @@ export class JsonSerializer extends BaseSerializer<Normalized.Bom> {
42
42
  this.#normalizerFactory = normalizerFactory
43
43
  }
44
44
 
45
+ get normalizerFactory (): NormalizerFactory {
46
+ return this.#normalizerFactory
47
+ }
48
+
45
49
  protected _normalize (
46
50
  bom: Bom,
47
51
  options: NormalizerOptions = {}
@@ -23,6 +23,7 @@ import * as Models from '../../models'
23
23
  import { Protocol as Spec, Version as SpecVersion } from '../../spec'
24
24
  import { NormalizerOptions } from '../types'
25
25
  import { SimpleXml, XmlSchema } from './types'
26
+ import { treeIterator } from '../../helpers/tree'
26
27
 
27
28
  export class Factory {
28
29
  readonly #spec: Spec
@@ -103,6 +104,10 @@ abstract class Base implements Normalizer {
103
104
  this._factory = factory
104
105
  }
105
106
 
107
+ get factory (): Factory {
108
+ return this._factory
109
+ }
110
+
106
111
  /**
107
112
  * @param {*} data
108
113
  * @param {NormalizerOptions} options
@@ -295,12 +300,21 @@ export class OrganizationalEntityNormalizer extends Base {
295
300
 
296
301
  export class ComponentNormalizer extends Base {
297
302
  normalize (data: Models.Component, options: NormalizerOptions, elementName: string): SimpleXml.Element | undefined {
298
- if (!this._factory.spec.supportsComponentType(data.type)) {
303
+ const spec = this._factory.spec
304
+ if (!spec.supportsComponentType(data.type)) {
299
305
  return undefined
300
306
  }
301
307
  const supplier: SimpleXml.Element | undefined = data.supplier === undefined
302
308
  ? undefined
303
309
  : this._factory.makeForOrganizationalEntity().normalize(data.supplier, options, 'supplier')
310
+ const version: SimpleXml.Element | undefined = (
311
+ spec.requiresComponentVersion
312
+ ? makeTextElement
313
+ : makeOptionalTextElement
314
+ )(
315
+ data.version ?? '',
316
+ 'version'
317
+ )
304
318
  const hashes: SimpleXml.Element | undefined = data.hashes.size > 0
305
319
  ? {
306
320
  type: 'element',
@@ -326,6 +340,13 @@ export class ComponentNormalizer extends Base {
326
340
  .normalizeRepository(data.externalReferences, options, 'reference')
327
341
  }
328
342
  : undefined
343
+ const components: SimpleXml.Element | undefined = data.components.size > 0
344
+ ? {
345
+ type: 'element',
346
+ name: 'components',
347
+ children: this.normalizeRepository(data.components, options, 'component')
348
+ }
349
+ : undefined
329
350
  return {
330
351
  type: 'element',
331
352
  name: elementName,
@@ -339,11 +360,7 @@ export class ComponentNormalizer extends Base {
339
360
  makeOptionalTextElement(data.publisher, 'publisher'),
340
361
  makeOptionalTextElement(data.group, 'group'),
341
362
  makeTextElement(data.name, 'name'),
342
- makeTextElement(
343
- // version fallback to string for spec < 1.4
344
- data.version ?? '',
345
- 'version'
346
- ),
363
+ version,
347
364
  makeOptionalTextElement(data.description, 'description'),
348
365
  makeOptionalTextElement(data.scope, 'scope'),
349
366
  hashes,
@@ -352,7 +369,8 @@ export class ComponentNormalizer extends Base {
352
369
  makeOptionalTextElement(data.cpe, 'cpe'),
353
370
  makeOptionalTextElement(data.purl, 'purl'),
354
371
  swid,
355
- extRefs
372
+ extRefs,
373
+ components
356
374
  ].filter(isNotUndefined)
357
375
  }
358
376
  }
@@ -504,9 +522,12 @@ export class DependencyGraphNormalizer extends Base {
504
522
  const allRefs = new Map<Models.BomRef, Models.BomRefRepository>()
505
523
  if (data.metadata.component !== undefined) {
506
524
  allRefs.set(data.metadata.component.bomRef, data.metadata.component.dependencies)
525
+ for (const component of data.metadata.component.components[treeIterator]()) {
526
+ allRefs.set(component.bomRef, component.dependencies)
527
+ }
507
528
  }
508
- for (const c of data.components) {
509
- allRefs.set(c.bomRef, new Models.BomRefRepository(c.dependencies))
529
+ for (const component of data.components[treeIterator]()) {
530
+ allRefs.set(component.bomRef, component.dependencies)
510
531
  }
511
532
 
512
533
  const normalized: Array<(SimpleXml.Element & { attributes: { ref: string } })> = []
@@ -42,6 +42,10 @@ export abstract class XmlBaseSerializer extends BaseSerializer<SimpleXml.Element
42
42
  this.#normalizerFactory = normalizerFactory
43
43
  }
44
44
 
45
+ get normalizerFactory (): NormalizerFactory {
46
+ return this.#normalizerFactory
47
+ }
48
+
45
49
  protected _normalize (
46
50
  bom: Bom,
47
51
  options: NormalizerOptions = {}
package/src/spec.ts CHANGED
@@ -52,6 +52,8 @@ export interface Protocol {
52
52
  readonly supportsDependencyGraph: boolean
53
53
 
54
54
  readonly supportsToolReferences: boolean
55
+
56
+ readonly requiresComponentVersion: boolean
55
57
  }
56
58
 
57
59
  /**
@@ -67,6 +69,7 @@ class Spec implements Protocol {
67
69
  readonly #externalReferenceTypes: ReadonlySet<ExternalReferenceType>
68
70
  readonly #supportsDependencyGraph: boolean
69
71
  readonly #supportsToolReferences: boolean
72
+ readonly #requiresComponentVersion: boolean
70
73
 
71
74
  constructor (
72
75
  version: Version,
@@ -76,7 +79,8 @@ class Spec implements Protocol {
76
79
  hashValuePattern: RegExp,
77
80
  externalReferenceTypes: Iterable<ExternalReferenceType>,
78
81
  supportsDependencyGraph: boolean,
79
- supportsToolReferences: boolean
82
+ supportsToolReferences: boolean,
83
+ requiresComponentVersion: boolean
80
84
  ) {
81
85
  this.#version = version
82
86
  this.#formats = new Set(formats)
@@ -86,6 +90,7 @@ class Spec implements Protocol {
86
90
  this.#externalReferenceTypes = new Set(externalReferenceTypes)
87
91
  this.#supportsDependencyGraph = supportsDependencyGraph
88
92
  this.#supportsToolReferences = supportsToolReferences
93
+ this.#requiresComponentVersion = requiresComponentVersion
89
94
  }
90
95
 
91
96
  get version (): Version {
@@ -120,6 +125,10 @@ class Spec implements Protocol {
120
125
  get supportsToolReferences (): boolean {
121
126
  return this.#supportsToolReferences
122
127
  }
128
+
129
+ get requiresComponentVersion (): boolean {
130
+ return this.#requiresComponentVersion
131
+ }
123
132
  }
124
133
 
125
134
  /** Specification v1.2 */
@@ -172,7 +181,8 @@ export const Spec1dot2: Readonly<Protocol> = Object.freeze(new Spec(
172
181
  ExternalReferenceType.Other
173
182
  ],
174
183
  true,
175
- false
184
+ false,
185
+ true
176
186
  ))
177
187
 
178
188
  /** Specification v1.3 */
@@ -225,7 +235,8 @@ export const Spec1dot3: Readonly<Protocol> = Object.freeze(new Spec(
225
235
  ExternalReferenceType.Other
226
236
  ],
227
237
  true,
228
- false
238
+ false,
239
+ true
229
240
  ))
230
241
 
231
242
  /** Specification v1.4 */
@@ -279,7 +290,8 @@ export const Spec1dot4: Readonly<Protocol> = Object.freeze(new Spec(
279
290
  ExternalReferenceType.Other
280
291
  ],
281
292
  true,
282
- true
293
+ true,
294
+ false
283
295
  ))
284
296
 
285
297
  export const SpecVersionDict = Object.freeze(Object.fromEntries([
package/src/types/cpe.ts CHANGED
@@ -24,8 +24,8 @@ Copyright (c) OWASP Foundation. All Rights Reserved.
24
24
  */
25
25
  export type CPE = string
26
26
 
27
- /* eslint-disable-next-line no-useless-escape -- value directly from XML or JSON spec, surrounded with ^$ */
28
- const cpePattern = /^([c][pP][eE]:\/[AHOaho]?(:[A-Za-z0-9\._\-~%]*){0,6})$|^(cpe:2\.3:[aho\*\-](:(((\?*|\*?)([a-zA-Z0-9\-\._]|(\\[\\\*\?!&quot;#$$%&amp;'\(\)\+,\/:;&lt;=&gt;@\[\]\^`\{\|}~]))+(\?*|\*?))|[\*\-])){5}(:(([a-zA-Z]{2,3}(-([a-zA-Z]{2}|[0-9]{3}))?)|[\*\-]))(:(((\?*|\*?)([a-zA-Z0-9\-\._]|(\\[\\\*\?!&quot;#$$%&amp;'\(\)\+,\/:;&lt;=&gt;@\[\]\^`\{\|}~]))+(\?*|\*?))|[\*\-])){4})$/
27
+ /* eslint-disable-next-line no-useless-escape -- value directly from XML, revert special-chars(like `&amp;` -> `&`), and surrounded with `^` and `$` */
28
+ const cpePattern = /^([c][pP][eE]:\/[AHOaho]?(:[A-Za-z0-9\._\-~%]*){0,6})$|^(cpe:2\.3:[aho\*\-](:(((\?*|\*?)([a-zA-Z0-9\-\._]|(\\[\\\*\?!"#$$%&'\(\)\+,\/:;<=>@\[\]\^`\{\|}~]))+(\?*|\*?))|[\*\-])){5}(:(([a-zA-Z]{2,3}(-([a-zA-Z]{2}|[0-9]{3}))?)|[\*\-]))(:(((\?*|\*?)([a-zA-Z0-9\-\._]|(\\[\\\*\?!"#$$%&'\(\)\+,\/:;<=>@\[\]\^`\{\|}~]))+(\?*|\*?))|[\*\-])){4})$/
29
29
 
30
30
  export function isCPE (value: any): value is CPE {
31
31
  return typeof value === 'string' &&
@@ -1 +0,0 @@
1
- {"version":3,"file":"fromPackageJson.node.js","sourceRoot":"","sources":["../../src/builders/fromPackageJson.node.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"fromPackageJson.node.js","sourceRoot":"","sources":["../../src/factories/fromPackageJson.node.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;EAiBE;;;;;;;;;;;;;;;;;;;;;;;;;;AAEF,kDAAmC;AACnC,gDAAiC;AACjC,0DAAwD;AAOxD,MAAa,wBAAwB;IACnC,sBAAsB,CAAE,IAAiB;QACvC,MAAM,IAAI,GAAgD,EAAE,CAAA;QAE5D,IAAI;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;SAAE;QAAC,MAAM,GAAc;QAC1D,IAAI;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAA;SAAE;QAAC,MAAM,GAAc;QAC/D,IAAI;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAA;SAAE;QAAC,MAAM,GAAc;QAEnE,OAAO,IAAI,CAAC,MAAM,CAAC,6BAAc,CAAC,CAAA;IACpC,CAAC;IAED,OAAO,CAAE,IAAiB;QAExB,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAA;QAClC,IAAI,GAAG,CAAA;QACP,IAAI,OAA2B,CAAA;QAC/B,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE;YAClC,GAAG,GAAG,UAAU,CAAC,GAAG,CAAA;YACpB,OAAO,GAAG,wDAAwD,CAAA;YAClE,IAAI,OAAO,UAAU,CAAC,SAAS,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE;gBAEzF,GAAG,IAAI,GAAG,GAAG,UAAU,CAAC,SAAS,CAAA;gBACjC,OAAO,IAAI,6BAA6B,CAAA;aACzC;SACF;aAAM;YACL,GAAG,GAAG,UAAU,CAAA;YAChB,OAAO,GAAG,oDAAoD,CAAA;SAC/D;QACD,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;YAC9C,CAAC,CAAC,IAAI,MAAM,CAAC,iBAAiB,CAAC,GAAG,EAAE,KAAK,CAAC,qBAAqB,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC;YACjF,CAAC,CAAC,SAAS,CAAA;IACf,CAAC;IAED,YAAY,CAAE,IAAiB;QAE7B,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAA;QACzB,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;YAC9C,CAAC,CAAC,IAAI,MAAM,CAAC,iBAAiB,CAC5B,GAAG,EAAE,KAAK,CAAC,qBAAqB,CAAC,OAAO,EACxC,EAAE,OAAO,EAAE,kDAAkD,EAAE,CAAC;YAClE,CAAC,CAAC,SAAS,CAAA;IACf,CAAC;IAED,gBAAgB,CAAE,IAAiB;QAEjC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;QACtB,IAAI,GAAG,CAAA;QACP,IAAI,OAA2B,CAAA;QAC/B,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;YAC5B,GAAG,GAAG,IAAI,CAAC,GAAG,CAAA;YACd,OAAO,GAAG,kDAAkD,CAAA;SAC7D;aAAM;YACL,GAAG,GAAG,IAAI,CAAA;YACV,OAAO,GAAG,8CAA8C,CAAA;SACzD;QACD,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;YAC9C,CAAC,CAAC,IAAI,MAAM,CAAC,iBAAiB,CAAC,GAAG,EAAE,KAAK,CAAC,qBAAqB,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,CAAC;YAC1F,CAAC,CAAC,SAAS,CAAA;IACf,CAAC;CACF;AA3DD,4DA2DC"}