@cdxgen/cdxgen 13.6.0 → 13.7.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 (264) hide show
  1. package/README.md +15 -8
  2. package/bin/audit.js +7 -4
  3. package/bin/cdxgen.js +256 -37
  4. package/bin/convert.js +146 -22
  5. package/bin/evinse.js +25 -3
  6. package/bin/repl.js +47 -3
  7. package/bin/sign.js +211 -34
  8. package/bin/tracebom.js +18 -6
  9. package/bin/validate.js +18 -3
  10. package/bin/verify.js +113 -5
  11. package/data/behavior-taxonomy.schema.json +1491 -0
  12. package/data/cyclonedx-2.0-bundled.schema.json +18606 -5528
  13. package/data/cyclonedx-2.0-cryptography-defs.schema.json +857 -0
  14. package/data/pqc-migration.json +239 -0
  15. package/data/remediations.json +52 -0
  16. package/data/rules/cbom-security.yaml +4 -3
  17. package/data/rules/package-integrity.yaml +28 -0
  18. package/lib/audit/index.js +25 -3
  19. package/lib/cli/bomAssembly.js +80 -1
  20. package/lib/cli/cliOptions.js +121 -17
  21. package/lib/cli/index.js +609 -898
  22. package/lib/cli/jsBom.js +3 -0
  23. package/lib/cli/jvmBom.js +365 -40
  24. package/lib/cli/managedBom.js +19 -3
  25. package/lib/cli/nativeBom.js +10 -0
  26. package/lib/core/env.js +26 -0
  27. package/lib/core/fs.js +126 -3
  28. package/lib/core/globPatterns.js +218 -0
  29. package/lib/core/processTree.js +99 -12
  30. package/lib/core/projectConfig.js +332 -25
  31. package/lib/core/toolRegistry.js +15 -1
  32. package/lib/ecosystems/denoutils.js +2 -2
  33. package/lib/ecosystems/golem.js +3 -8
  34. package/lib/ecosystems/gradleutils.js +1082 -6
  35. package/lib/ecosystems/jsEvidence.js +90 -38
  36. package/lib/ecosystems/kosi.js +3 -5
  37. package/lib/ecosystems/npmVersionResolution.js +376 -0
  38. package/lib/ecosystems/parsers-python.js +89 -28
  39. package/lib/ecosystems/parsers-rust.js +117 -15
  40. package/lib/ecosystems/remote/huggingface.js +22 -0
  41. package/lib/ecosystems/rusi.js +2 -4
  42. package/lib/ecosystems/scalasem.js +2 -1
  43. package/lib/evinser/evinser.js +196 -34
  44. package/lib/evinser/scalasem.js +5 -1
  45. package/lib/helpers/agenticToolutils.js +112 -1
  46. package/lib/helpers/bomSigner.js +43 -9
  47. package/lib/helpers/jssSigner.js +1276 -0
  48. package/lib/inventory/agentBlueprint.js +193 -0
  49. package/lib/inventory/agentToolNames.js +145 -0
  50. package/lib/inventory/aiCollector.js +153 -7
  51. package/lib/inventory/aiInventory.js +44 -8
  52. package/lib/inventory/aiProviders.js +324 -0
  53. package/lib/inventory/bomUtils.js +8 -1
  54. package/lib/inventory/ciParsers/githubActionsLock.js +821 -0
  55. package/lib/inventory/citations.js +31 -2
  56. package/lib/inventory/communityAiConfigParser.js +978 -80
  57. package/lib/inventory/cyclonedx20.js +152 -0
  58. package/lib/inventory/cyclonedx20Common.js +286 -0
  59. package/lib/inventory/cyclonedx20Derived.js +159 -0
  60. package/lib/inventory/cyclonedx20Parties.js +552 -0
  61. package/lib/inventory/cyclonedx20Read.js +768 -0
  62. package/lib/inventory/cyclonedx20ReadCommon.js +374 -0
  63. package/lib/inventory/cyclonedx20ReadComponents.js +692 -0
  64. package/lib/inventory/cyclonedx20ReadContext.js +380 -0
  65. package/lib/inventory/cyclonedx20ReadEvidence.js +466 -0
  66. package/lib/inventory/cyclonedx20ReadSections.js +599 -0
  67. package/lib/inventory/cyclonedx20Render.js +766 -0
  68. package/lib/inventory/cyclonedx20RenderComponents.js +716 -0
  69. package/lib/inventory/cyclonedx20RenderDefinitions.js +405 -0
  70. package/lib/inventory/cyclonedx20RenderEvidence.js +726 -0
  71. package/lib/inventory/cyclonedx20RenderHardware.js +203 -0
  72. package/lib/inventory/cyclonedx20RenderPatents.js +174 -0
  73. package/lib/inventory/cyclonedx20RenderRefIds.js +314 -0
  74. package/lib/inventory/cyclonedx20RenderSections.js +499 -0
  75. package/lib/inventory/cyclonedx20Tables.js +594 -0
  76. package/lib/inventory/deps.js +106 -13
  77. package/lib/inventory/dosai.js +236 -1
  78. package/lib/inventory/dosaiParsers.js +3 -6
  79. package/lib/inventory/dotnetRuntime.js +164 -14
  80. package/lib/inventory/ecosystemFormulationParsers.js +979 -0
  81. package/lib/inventory/envcontext.js +132 -38
  82. package/lib/inventory/evidenceUtils.js +2 -1
  83. package/lib/inventory/formulationParsers.js +95 -13
  84. package/lib/inventory/hbom.js +45 -6
  85. package/lib/inventory/hbomLoader.js +166 -0
  86. package/lib/inventory/mcpConfigParser.js +5 -0
  87. package/lib/inventory/occurrenceKey.js +90 -0
  88. package/lib/inventory/pqcMigration.js +426 -0
  89. package/lib/inventory/rustFormulationParser.js +21 -10
  90. package/lib/inventory/source.js +65 -6
  91. package/lib/parsers/huggingfaceManifest.js +9 -1
  92. package/lib/parsers/huggingfaceUtils.js +18 -0
  93. package/lib/parsers/kiroPermissions.js +166 -0
  94. package/lib/server/server.js +36 -34
  95. package/lib/stages/postgen/postgen.js +41 -1
  96. package/lib/stages/postgen/specVersionCompat.js +76 -0
  97. package/lib/validator/bomValidator.js +8 -1
  98. package/lib/validator/complianceEngine.js +30 -3
  99. package/lib/validator/complianceRules.js +1416 -4
  100. package/lib/validator/generated/validate-2.0.mjs +57554 -13851
  101. package/lib/validator/index.js +48 -7
  102. package/lib/validator/reporters/json.js +6 -0
  103. package/package.json +9 -9
  104. package/types/bin/repl.d.ts.map +1 -1
  105. package/types/lib/audit/index.d.ts +6 -2
  106. package/types/lib/audit/index.d.ts.map +1 -1
  107. package/types/lib/cli/bomAssembly.d.ts +16 -0
  108. package/types/lib/cli/bomAssembly.d.ts.map +1 -1
  109. package/types/lib/cli/cliOptions.d.ts +6 -0
  110. package/types/lib/cli/cliOptions.d.ts.map +1 -1
  111. package/types/lib/cli/index.d.ts.map +1 -1
  112. package/types/lib/cli/jsBom.d.ts +2 -1
  113. package/types/lib/cli/jsBom.d.ts.map +1 -1
  114. package/types/lib/cli/jvmBom.d.ts +15 -0
  115. package/types/lib/cli/jvmBom.d.ts.map +1 -1
  116. package/types/lib/cli/managedBom.d.ts.map +1 -1
  117. package/types/lib/cli/nativeBom.d.ts.map +1 -1
  118. package/types/lib/core/boundedFile.d.ts +30 -0
  119. package/types/lib/core/boundedFile.d.ts.map +1 -1
  120. package/types/lib/core/env.d.ts +10 -0
  121. package/types/lib/core/env.d.ts.map +1 -1
  122. package/types/lib/core/fs.d.ts +4 -0
  123. package/types/lib/core/fs.d.ts.map +1 -1
  124. package/types/lib/core/globPatterns.d.ts +70 -0
  125. package/types/lib/core/globPatterns.d.ts.map +1 -0
  126. package/types/lib/core/paths.d.ts +9 -0
  127. package/types/lib/core/paths.d.ts.map +1 -1
  128. package/types/lib/core/processTree.d.ts +16 -5
  129. package/types/lib/core/processTree.d.ts.map +1 -1
  130. package/types/lib/core/projectConfig.d.ts +47 -8
  131. package/types/lib/core/projectConfig.d.ts.map +1 -1
  132. package/types/lib/core/toolRegistry.d.ts.map +1 -1
  133. package/types/lib/ecosystems/golem.d.ts.map +1 -1
  134. package/types/lib/ecosystems/gradleutils.d.ts +248 -8
  135. package/types/lib/ecosystems/gradleutils.d.ts.map +1 -1
  136. package/types/lib/ecosystems/jsEvidence.d.ts +14 -1
  137. package/types/lib/ecosystems/jsEvidence.d.ts.map +1 -1
  138. package/types/lib/ecosystems/kosi.d.ts.map +1 -1
  139. package/types/lib/ecosystems/npmVersionResolution.d.ts +119 -0
  140. package/types/lib/ecosystems/npmVersionResolution.d.ts.map +1 -0
  141. package/types/lib/ecosystems/parsers-python.d.ts.map +1 -1
  142. package/types/lib/ecosystems/parsers-rust.d.ts.map +1 -1
  143. package/types/lib/ecosystems/pythonutils.d.ts +1 -1
  144. package/types/lib/ecosystems/remote/huggingface.d.ts.map +1 -1
  145. package/types/lib/ecosystems/rusi.d.ts.map +1 -1
  146. package/types/lib/ecosystems/scalasem.d.ts +58 -16
  147. package/types/lib/ecosystems/scalasem.d.ts.map +1 -1
  148. package/types/lib/evinser/evinser.d.ts +61 -9
  149. package/types/lib/evinser/evinser.d.ts.map +1 -1
  150. package/types/lib/evinser/scalasem.d.ts.map +1 -1
  151. package/types/lib/helpers/agenticToolutils.d.ts +53 -19
  152. package/types/lib/helpers/agenticToolutils.d.ts.map +1 -1
  153. package/types/lib/helpers/bomSigner.d.ts +20 -3
  154. package/types/lib/helpers/bomSigner.d.ts.map +1 -1
  155. package/types/lib/helpers/jssSigner.d.ts +288 -0
  156. package/types/lib/helpers/jssSigner.d.ts.map +1 -0
  157. package/types/lib/helpers/vsixutils.d.ts +303 -19
  158. package/types/lib/helpers/vsixutils.d.ts.map +1 -1
  159. package/types/lib/inventory/agentBlueprint.d.ts +70 -0
  160. package/types/lib/inventory/agentBlueprint.d.ts.map +1 -0
  161. package/types/lib/inventory/agentToolNames.d.ts +51 -0
  162. package/types/lib/inventory/agentToolNames.d.ts.map +1 -0
  163. package/types/lib/inventory/aiCollector.d.ts.map +1 -1
  164. package/types/lib/inventory/aiInventory.d.ts.map +1 -1
  165. package/types/lib/inventory/aiProviders.d.ts +85 -0
  166. package/types/lib/inventory/aiProviders.d.ts.map +1 -0
  167. package/types/lib/inventory/bomUtils.d.ts.map +1 -1
  168. package/types/lib/inventory/ciParsers/githubActionsLock.d.ts +101 -0
  169. package/types/lib/inventory/ciParsers/githubActionsLock.d.ts.map +1 -0
  170. package/types/lib/inventory/citations.d.ts +5 -0
  171. package/types/lib/inventory/citations.d.ts.map +1 -1
  172. package/types/lib/inventory/communityAiConfigParser.d.ts.map +1 -1
  173. package/types/lib/inventory/cyclonedx20.d.ts +99 -0
  174. package/types/lib/inventory/cyclonedx20.d.ts.map +1 -0
  175. package/types/lib/inventory/cyclonedx20Common.d.ts +102 -0
  176. package/types/lib/inventory/cyclonedx20Common.d.ts.map +1 -0
  177. package/types/lib/inventory/cyclonedx20Derived.d.ts +74 -0
  178. package/types/lib/inventory/cyclonedx20Derived.d.ts.map +1 -0
  179. package/types/lib/inventory/cyclonedx20Parties.d.ts +91 -0
  180. package/types/lib/inventory/cyclonedx20Parties.d.ts.map +1 -0
  181. package/types/lib/inventory/cyclonedx20Read.d.ts +51 -0
  182. package/types/lib/inventory/cyclonedx20Read.d.ts.map +1 -0
  183. package/types/lib/inventory/cyclonedx20ReadCommon.d.ts +69 -0
  184. package/types/lib/inventory/cyclonedx20ReadCommon.d.ts.map +1 -0
  185. package/types/lib/inventory/cyclonedx20ReadComponents.d.ts +77 -0
  186. package/types/lib/inventory/cyclonedx20ReadComponents.d.ts.map +1 -0
  187. package/types/lib/inventory/cyclonedx20ReadContext.d.ts +118 -0
  188. package/types/lib/inventory/cyclonedx20ReadContext.d.ts.map +1 -0
  189. package/types/lib/inventory/cyclonedx20ReadEvidence.d.ts +40 -0
  190. package/types/lib/inventory/cyclonedx20ReadEvidence.d.ts.map +1 -0
  191. package/types/lib/inventory/cyclonedx20ReadSections.d.ts +45 -0
  192. package/types/lib/inventory/cyclonedx20ReadSections.d.ts.map +1 -0
  193. package/types/lib/inventory/cyclonedx20Render.d.ts +53 -0
  194. package/types/lib/inventory/cyclonedx20Render.d.ts.map +1 -0
  195. package/types/lib/inventory/cyclonedx20RenderComponents.d.ts +73 -0
  196. package/types/lib/inventory/cyclonedx20RenderComponents.d.ts.map +1 -0
  197. package/types/lib/inventory/cyclonedx20RenderDefinitions.d.ts +29 -0
  198. package/types/lib/inventory/cyclonedx20RenderDefinitions.d.ts.map +1 -0
  199. package/types/lib/inventory/cyclonedx20RenderEvidence.d.ts +110 -0
  200. package/types/lib/inventory/cyclonedx20RenderEvidence.d.ts.map +1 -0
  201. package/types/lib/inventory/cyclonedx20RenderHardware.d.ts +42 -0
  202. package/types/lib/inventory/cyclonedx20RenderHardware.d.ts.map +1 -0
  203. package/types/lib/inventory/cyclonedx20RenderPatents.d.ts +26 -0
  204. package/types/lib/inventory/cyclonedx20RenderPatents.d.ts.map +1 -0
  205. package/types/lib/inventory/cyclonedx20RenderRefIds.d.ts +55 -0
  206. package/types/lib/inventory/cyclonedx20RenderRefIds.d.ts.map +1 -0
  207. package/types/lib/inventory/cyclonedx20RenderSections.d.ts +45 -0
  208. package/types/lib/inventory/cyclonedx20RenderSections.d.ts.map +1 -0
  209. package/types/lib/inventory/cyclonedx20Tables.d.ts +134 -0
  210. package/types/lib/inventory/cyclonedx20Tables.d.ts.map +1 -0
  211. package/types/lib/inventory/deps.d.ts +35 -2
  212. package/types/lib/inventory/deps.d.ts.map +1 -1
  213. package/types/lib/inventory/dosai.d.ts +19 -0
  214. package/types/lib/inventory/dosai.d.ts.map +1 -1
  215. package/types/lib/inventory/dosaiParsers.d.ts.map +1 -1
  216. package/types/lib/inventory/dotnetRuntime.d.ts +51 -4
  217. package/types/lib/inventory/dotnetRuntime.d.ts.map +1 -1
  218. package/types/lib/inventory/ecosystemFormulationParsers.d.ts +73 -0
  219. package/types/lib/inventory/ecosystemFormulationParsers.d.ts.map +1 -0
  220. package/types/lib/inventory/envcontext.d.ts +22 -6
  221. package/types/lib/inventory/envcontext.d.ts.map +1 -1
  222. package/types/lib/inventory/evidenceUtils.d.ts.map +1 -1
  223. package/types/lib/inventory/formulationParsers.d.ts.map +1 -1
  224. package/types/lib/inventory/hbom.d.ts +11 -0
  225. package/types/lib/inventory/hbom.d.ts.map +1 -1
  226. package/types/lib/inventory/hbomLoader.d.ts +54 -0
  227. package/types/lib/inventory/hbomLoader.d.ts.map +1 -1
  228. package/types/lib/inventory/jvmLocalRepos.d.ts +5 -1
  229. package/types/lib/inventory/jvmLocalRepos.d.ts.map +1 -1
  230. package/types/lib/inventory/mcpConfigParser.d.ts.map +1 -1
  231. package/types/lib/inventory/occurrenceKey.d.ts +52 -0
  232. package/types/lib/inventory/occurrenceKey.d.ts.map +1 -0
  233. package/types/lib/inventory/pqcMigration.d.ts +84 -0
  234. package/types/lib/inventory/pqcMigration.d.ts.map +1 -0
  235. package/types/lib/inventory/rustFormulationParser.d.ts +7 -2
  236. package/types/lib/inventory/rustFormulationParser.d.ts.map +1 -1
  237. package/types/lib/inventory/scalaCoords.d.ts.map +1 -1
  238. package/types/lib/inventory/scalaDedupe.d.ts +43 -0
  239. package/types/lib/inventory/scalaDedupe.d.ts.map +1 -0
  240. package/types/lib/inventory/source.d.ts +15 -0
  241. package/types/lib/inventory/source.d.ts.map +1 -1
  242. package/types/lib/parsers/huggingfaceManifest.d.ts +10 -1
  243. package/types/lib/parsers/huggingfaceManifest.d.ts.map +1 -1
  244. package/types/lib/parsers/huggingfaceUtils.d.ts +12 -0
  245. package/types/lib/parsers/huggingfaceUtils.d.ts.map +1 -1
  246. package/types/lib/parsers/kiroPermissions.d.ts +62 -0
  247. package/types/lib/parsers/kiroPermissions.d.ts.map +1 -0
  248. package/types/lib/parsers/vscodeExtensionId.d.ts +48 -0
  249. package/types/lib/parsers/vscodeExtensionId.d.ts.map +1 -0
  250. package/types/lib/server/server.d.ts.map +1 -1
  251. package/types/lib/stages/postgen/postgen.d.ts +7 -0
  252. package/types/lib/stages/postgen/postgen.d.ts.map +1 -1
  253. package/types/lib/stages/postgen/ruleEngine.d.ts.map +1 -1
  254. package/types/lib/stages/postgen/specVersionCompat.d.ts +25 -0
  255. package/types/lib/stages/postgen/specVersionCompat.d.ts.map +1 -1
  256. package/types/lib/validator/bomValidator.d.ts +5 -1
  257. package/types/lib/validator/bomValidator.d.ts.map +1 -1
  258. package/types/lib/validator/complianceEngine.d.ts +4 -4
  259. package/types/lib/validator/complianceEngine.d.ts.map +1 -1
  260. package/types/lib/validator/complianceRules.d.ts +14 -2
  261. package/types/lib/validator/complianceRules.d.ts.map +1 -1
  262. package/types/lib/validator/index.d.ts +10 -0
  263. package/types/lib/validator/index.d.ts.map +1 -1
  264. package/types/lib/validator/reporters/json.d.ts.map +1 -1
@@ -0,0 +1,405 @@
1
+ /**
2
+ * Render-side conversion of the 1.x definitions standards and the root
3
+ * `declarations` (#/$defs/cyclonedx-standard-2.0 and
4
+ * #/$defs/cyclonedx-declaration-2.0). Their members keep their names; the
5
+ * 1.x `bom-ref` becomes `refId`, organizations and contacts take the 2.0
6
+ * common shapes, attachments the 2.0 attachment, and a 1.x JSF `signature`
7
+ * is counted and left out (see countSignatureDrop).
8
+ */
9
+
10
+ import {
11
+ clone,
12
+ copyDefined,
13
+ countDrop,
14
+ countSignatureDrop,
15
+ countUnmapped,
16
+ isNonEmptyString,
17
+ isObjectRecord,
18
+ setDefined,
19
+ } from "./cyclonedx20Common.js";
20
+ import { toCommonContact, toCommonEntity } from "./cyclonedx20Parties.js";
21
+ import {
22
+ convertComponent,
23
+ convertDataContents,
24
+ convertGovernance,
25
+ convertService,
26
+ toDataClassification,
27
+ } from "./cyclonedx20RenderComponents.js";
28
+
29
+ /** Start a converted object with the 1.x `bom-ref` as its `refId`. */
30
+ function withRefId(source) {
31
+ return isNonEmptyString(source["bom-ref"])
32
+ ? { refId: source["bom-ref"] }
33
+ : {};
34
+ }
35
+
36
+ /**
37
+ * Convert each object of a 1.x list with `convertEntry(entry)`, counting
38
+ * entries that are not objects. Returns undefined for an empty result.
39
+ */
40
+ function convertList(list, label, stats, convertEntry) {
41
+ if (!Array.isArray(list)) {
42
+ if (list !== undefined) {
43
+ countDrop(stats, `${label} (not a list)`);
44
+ }
45
+ return undefined;
46
+ }
47
+ const converted = [];
48
+ for (const entry of list) {
49
+ if (!isObjectRecord(entry)) {
50
+ countDrop(stats, `${label} (not an object)`);
51
+ continue;
52
+ }
53
+ const out = convertEntry(entry);
54
+ if (out) {
55
+ converted.push(out);
56
+ }
57
+ }
58
+ return converted.length ? converted : undefined;
59
+ }
60
+
61
+ /**
62
+ * Copy `fields`, rename `bom-ref`, count a `signature` and every member not
63
+ * in `fields` or `extraHandled`.
64
+ */
65
+ function convertPlain(entry, label, fields, stats, extraHandled = []) {
66
+ const out = withRefId(entry);
67
+ copyDefined(out, entry, fields);
68
+ if (entry.signature !== undefined) {
69
+ countSignatureDrop(stats, `${label}.signature`);
70
+ }
71
+ countUnmapped(
72
+ stats,
73
+ label,
74
+ entry,
75
+ new Set([...fields, ...extraHandled, "bom-ref", "signature"]),
76
+ );
77
+ return out;
78
+ }
79
+
80
+ const STANDARD_FIELDS = [
81
+ "name",
82
+ "version",
83
+ "description",
84
+ "owner",
85
+ "externalReferences",
86
+ ];
87
+ const REQUIREMENT_FIELDS = [
88
+ "identifier",
89
+ "title",
90
+ "text",
91
+ "descriptions",
92
+ "openCre",
93
+ "parent",
94
+ "properties",
95
+ "externalReferences",
96
+ ];
97
+ const LEVEL_FIELDS = ["identifier", "title", "description", "requirements"];
98
+
99
+ /**
100
+ * Convert 1.x definitions.standards
101
+ * (#/$defs/cyclonedx-standard-2.0/$defs/standards). Requirement `parent`
102
+ * and level `requirements` are refLinkType values; the refIds keep the
103
+ * bom-ref values, so they still resolve.
104
+ *
105
+ * @param {object[]} standards 1.x standards
106
+ * @param {object} stats Render counters
107
+ * @returns {object[]|undefined} 2.0 standards
108
+ */
109
+ export function convertStandards(standards, stats) {
110
+ return convertList(standards, "definitions.standards", stats, (standard) => {
111
+ const out = convertPlain(
112
+ standard,
113
+ "definitions.standards",
114
+ STANDARD_FIELDS,
115
+ stats,
116
+ ["requirements", "levels"],
117
+ );
118
+ setDefined(
119
+ out,
120
+ "requirements",
121
+ convertList(
122
+ standard.requirements,
123
+ "definitions.standards.requirements",
124
+ stats,
125
+ (requirement) =>
126
+ convertPlain(
127
+ requirement,
128
+ "definitions.standards.requirements",
129
+ REQUIREMENT_FIELDS,
130
+ stats,
131
+ ),
132
+ ),
133
+ );
134
+ setDefined(
135
+ out,
136
+ "levels",
137
+ convertList(
138
+ standard.levels,
139
+ "definitions.standards.levels",
140
+ stats,
141
+ (level) =>
142
+ convertPlain(
143
+ level,
144
+ "definitions.standards.levels",
145
+ LEVEL_FIELDS,
146
+ stats,
147
+ ),
148
+ ),
149
+ );
150
+ return out;
151
+ });
152
+ }
153
+
154
+ /** Declaration evidence data: contents, classification and governance. */
155
+ function convertEvidenceData(data, stats) {
156
+ return convertList(data, "declarations.evidence.data", stats, (entry) => {
157
+ const out = {};
158
+ copyDefined(out, entry, ["name", "sensitiveData"]);
159
+ setDefined(out, "contents", convertDataContents(entry.contents, stats));
160
+ setDefined(
161
+ out,
162
+ "classification",
163
+ toDataClassification(entry.classification),
164
+ );
165
+ setDefined(out, "governance", convertGovernance(entry.governance, stats));
166
+ countUnmapped(
167
+ stats,
168
+ "declarations.evidence.data",
169
+ entry,
170
+ new Set([
171
+ "name",
172
+ "sensitiveData",
173
+ "contents",
174
+ "classification",
175
+ "governance",
176
+ ]),
177
+ );
178
+ return Object.keys(out).length ? out : undefined;
179
+ });
180
+ }
181
+
182
+ /**
183
+ * Affirmation signatories. A 2.0 signatory needs either `signatures` or both
184
+ * `externalReference` and `organization`; one that relied on its 1.x JSF
185
+ * signature alone cannot be carried.
186
+ */
187
+ function convertSignatories(signatories, stats) {
188
+ const label = "declarations.affirmation.signatories";
189
+ return convertList(signatories, label, stats, (signatory) => {
190
+ if (signatory.signature !== undefined) {
191
+ countSignatureDrop(stats, `${label}.signature`);
192
+ }
193
+ const organization = toCommonEntity(signatory.organization, stats);
194
+ if (!organization || !isObjectRecord(signatory.externalReference)) {
195
+ countDrop(stats, `${label} (no organization and external reference)`);
196
+ return undefined;
197
+ }
198
+ const out = {};
199
+ copyDefined(out, signatory, ["name", "role"]);
200
+ out.organization = organization;
201
+ out.externalReference = clone(signatory.externalReference);
202
+ countUnmapped(
203
+ stats,
204
+ label,
205
+ signatory,
206
+ new Set([
207
+ "name",
208
+ "role",
209
+ "organization",
210
+ "externalReference",
211
+ "signature",
212
+ ]),
213
+ );
214
+ return out;
215
+ });
216
+ }
217
+
218
+ /** Declaration targets: organizations, and components with the services. */
219
+ function convertTargets(targets, stats) {
220
+ if (!isObjectRecord(targets)) {
221
+ countDrop(stats, "declarations.targets (not an object)");
222
+ return undefined;
223
+ }
224
+ const out = {};
225
+ setDefined(
226
+ out,
227
+ "organizations",
228
+ convertList(
229
+ targets.organizations,
230
+ "declarations.targets.organizations",
231
+ stats,
232
+ (organization) => toCommonEntity(organization, stats),
233
+ ),
234
+ );
235
+ // 2.0 has no services; a 1.x service is a component of type `service`.
236
+ const components = [
237
+ ...(convertList(
238
+ targets.components,
239
+ "declarations.targets.components",
240
+ stats,
241
+ (component) => convertComponent(component, stats),
242
+ ) || []),
243
+ ...(convertList(
244
+ targets.services,
245
+ "declarations.targets.services",
246
+ stats,
247
+ (service) => convertService(service, stats),
248
+ ) || []),
249
+ ];
250
+ if (components.length) {
251
+ out.components = components;
252
+ }
253
+ countUnmapped(
254
+ stats,
255
+ "declarations.targets",
256
+ targets,
257
+ new Set(["organizations", "components", "services"]),
258
+ );
259
+ return Object.keys(out).length ? out : undefined;
260
+ }
261
+
262
+ /**
263
+ * Render the root `declarations`
264
+ * (#/$defs/cyclonedx-declaration-2.0/$defs/declarations).
265
+ *
266
+ * @param {object} declarations 1.x declarations
267
+ * @param {object} stats Render counters
268
+ * @returns {object|undefined} 2.0 declarations
269
+ */
270
+ export function renderDeclarations(declarations, stats) {
271
+ if (!isObjectRecord(declarations)) {
272
+ if (declarations !== undefined) {
273
+ countDrop(stats, "declarations (not an object)");
274
+ }
275
+ return undefined;
276
+ }
277
+ const out = {};
278
+ setDefined(
279
+ out,
280
+ "assessors",
281
+ convertList(
282
+ declarations.assessors,
283
+ "declarations.assessors",
284
+ stats,
285
+ (assessor) => {
286
+ const converted = convertPlain(
287
+ assessor,
288
+ "declarations.assessors",
289
+ ["thirdParty"],
290
+ stats,
291
+ ["organization"],
292
+ );
293
+ setDefined(
294
+ converted,
295
+ "organization",
296
+ toCommonEntity(assessor.organization, stats),
297
+ );
298
+ return converted;
299
+ },
300
+ ),
301
+ );
302
+ setDefined(
303
+ out,
304
+ "attestations",
305
+ convertList(
306
+ declarations.attestations,
307
+ "declarations.attestations",
308
+ stats,
309
+ (attestation) =>
310
+ convertPlain(
311
+ attestation,
312
+ "declarations.attestations",
313
+ ["summary", "assessor", "map"],
314
+ stats,
315
+ ),
316
+ ),
317
+ );
318
+ setDefined(
319
+ out,
320
+ "claims",
321
+ convertList(declarations.claims, "declarations.claims", stats, (claim) =>
322
+ convertPlain(
323
+ claim,
324
+ "declarations.claims",
325
+ [
326
+ "target",
327
+ "predicate",
328
+ "mitigationStrategies",
329
+ "reasoning",
330
+ "evidence",
331
+ "counterEvidence",
332
+ "externalReferences",
333
+ ],
334
+ stats,
335
+ ),
336
+ ),
337
+ );
338
+ setDefined(
339
+ out,
340
+ "evidence",
341
+ convertList(
342
+ declarations.evidence,
343
+ "declarations.evidence",
344
+ stats,
345
+ (evidence) => {
346
+ const converted = convertPlain(
347
+ evidence,
348
+ "declarations.evidence",
349
+ ["propertyName", "description", "created", "expires"],
350
+ stats,
351
+ ["data", "author", "reviewer"],
352
+ );
353
+ setDefined(
354
+ converted,
355
+ "data",
356
+ convertEvidenceData(evidence.data, stats),
357
+ );
358
+ for (const field of ["author", "reviewer"]) {
359
+ setDefined(converted, field, toCommonContact(evidence[field], stats));
360
+ }
361
+ return converted;
362
+ },
363
+ ),
364
+ );
365
+ if (declarations.targets !== undefined) {
366
+ setDefined(out, "targets", convertTargets(declarations.targets, stats));
367
+ }
368
+ if (isObjectRecord(declarations.affirmation)) {
369
+ const affirmation = convertPlain(
370
+ declarations.affirmation,
371
+ "declarations.affirmation",
372
+ ["statement"],
373
+ stats,
374
+ ["signatories"],
375
+ );
376
+ setDefined(
377
+ affirmation,
378
+ "signatories",
379
+ convertSignatories(declarations.affirmation.signatories, stats),
380
+ );
381
+ if (Object.keys(affirmation).length) {
382
+ out.affirmation = affirmation;
383
+ }
384
+ } else if (declarations.affirmation !== undefined) {
385
+ countDrop(stats, "declarations.affirmation (not an object)");
386
+ }
387
+ if (declarations.signature !== undefined) {
388
+ countSignatureDrop(stats, "declarations.signature");
389
+ }
390
+ countUnmapped(
391
+ stats,
392
+ "declarations",
393
+ declarations,
394
+ new Set([
395
+ "assessors",
396
+ "attestations",
397
+ "claims",
398
+ "evidence",
399
+ "targets",
400
+ "affirmation",
401
+ "signature",
402
+ ]),
403
+ );
404
+ return Object.keys(out).length ? out : undefined;
405
+ }