Current section

14 Versions

Jump to

Compare versions

529 files changed
+2600 additions
-2475 deletions
  @@ -3,7 +3,7 @@
3 3 {<<"Issues">>,<<"https://github.com/erlef/mix_sbom/issues">>},
4 4 {<<"Releases">>,<<"https://github.com/erlef/mix_sbom/releases">>}]}.
5 5 {<<"name">>,<<"sbom">>}.
6 - {<<"version">>,<<"0.8.0-beta.2">>}.
6 + {<<"version">>,<<"0.8.0-beta.3">>}.
7 7 {<<"description">>,
8 8 <<"Mix task to generate a Software Bill-of-Materials (SBoM) in CycloneDX format">>}.
9 9 {<<"elixir">>,<<"~> 1.16 and >= 1.16.2">>}.
  @@ -9,14 +9,10 @@ defmodule SBoM.CLI do
9 9 # This module is used by both the Mix task and escript implementations.
10 10
11 11 alias SBoM.CycloneDX
12 - alias SBoM.Fetcher
13 12
14 13 @version Mix.Project.config()[:version]
15 14
16 15 @type cli_mode() :: :mix | :escript | :burrito
17 - @type format() :: :xml | :json | :protobuf
18 - @type schema_version() :: String.t()
19 - @type pretty() :: boolean()
20 16
21 17 @schema_versions ~w[1.7 1.6 1.5 1.4 1.3]
22 18
  @@ -87,13 +83,13 @@ defmodule SBoM.CLI do
87 83
88 84 @spec generate_bom_content_in_app(Optimus.ParseResult.t()) :: :ok
89 85 defp generate_bom_content_in_app(parse_result) do
90 - Fetcher.fetch()
91 - |> CycloneDX.bom(
86 + [
92 87 version: parse_result.options.schema,
93 88 only: parse_result.options.only,
94 89 targets: parse_result.options.targets,
95 90 classification: parse_result.options.classification
96 - )
91 + ]
92 + |> CycloneDX.bom()
97 93 |> CycloneDX.encode(parse_result.options.format, parse_result.flags.pretty)
98 94 |> write_file(parse_result.options.output, parse_result.flags.force)
99 95 end
  @@ -134,7 +130,7 @@ defmodule SBoM.CLI do
134 130 end
135 131 end
136 132
137 - @spec safe_decode(String.t(), format()) :: {:ok, CycloneDX.t()} | {:error, any()}
133 + @spec safe_decode(String.t(), CycloneDX.format()) :: {:ok, CycloneDX.t()} | {:error, any()}
138 134 defp safe_decode(content, format) do
139 135 {:ok, CycloneDX.decode(content, format)}
140 136 rescue
  @@ -361,7 +357,7 @@ defmodule SBoM.CLI do
361 357 end)
362 358 end
363 359
364 - @spec format_from_path(Path.t()) :: format()
360 + @spec format_from_path(Path.t()) :: CycloneDX.format()
365 361 defp format_from_path(path) do
366 362 case Path.extname(path) do
367 363 ".json" -> :json
  @@ -371,13 +367,13 @@ defmodule SBoM.CLI do
371 367 end
372 368 end
373 369
374 - @spec parse_schema(String.t()) :: {:ok, schema_version()} | {:error, String.t()}
370 + @spec parse_schema(String.t()) :: {:ok, CycloneDX.schema_version()} | {:error, String.t()}
375 371 defp parse_schema(schema)
376 372 defp parse_schema(schema) when schema in @schema_versions, do: {:ok, schema}
377 373
378 374 defp parse_schema(_other), do: {:error, "available versions are #{Enum.join(@schema_versions, ", ")}"}
379 375
380 - @spec parse_format(String.t()) :: {:ok, format()} | {:error, String.t()}
376 + @spec parse_format(String.t()) :: {:ok, CycloneDX.format()} | {:error, String.t()}
381 377 defp parse_format(format)
382 378 defp parse_format("xml"), do: {:ok, :xml}
383 379 defp parse_format("json"), do: {:ok, :json}
  @@ -2,74 +2,82 @@
2 2 # SPDX-FileCopyrightText: 2025 Erlang Ecosystem Foundation
3 3
4 4 defmodule SBoM.CycloneDX do
5 - @moduledoc false
5 + @moduledoc "SBoM CycloneDX encoding and decoding."
6 6
7 7 alias SBoM.CycloneDX.JSON
8 8 alias SBoM.CycloneDX.Protobuf
9 9 alias SBoM.CycloneDX.XML
10 + alias SBoM.Fetcher
10 11
11 12 @type t() ::
12 - SBoM.Cyclonedx.V13.Bom.t()
13 - | SBoM.Cyclonedx.V14.Bom.t()
14 - | SBoM.Cyclonedx.V15.Bom.t()
15 - | SBoM.Cyclonedx.V16.Bom.t()
16 - | SBoM.Cyclonedx.V17.Bom.t()
17 - @type components_map() :: %{SBoM.Fetcher.app_name() => SBoM.Fetcher.dependency()}
18 - @type component() ::
19 - SBoM.Cyclonedx.V13.Component.t()
20 - | SBoM.Cyclonedx.V14.Component.t()
21 - | SBoM.Cyclonedx.V15.Component.t()
22 - | SBoM.Cyclonedx.V16.Component.t()
23 - | SBoM.Cyclonedx.V17.Component.t()
13 + SBoM.CycloneDX.V13.Bom.t()
14 + | SBoM.CycloneDX.V14.Bom.t()
15 + | SBoM.CycloneDX.V15.Bom.t()
16 + | SBoM.CycloneDX.V16.Bom.t()
17 + | SBoM.CycloneDX.V17.Bom.t()
18 +
19 + @type format() :: :protobuf | :json | :xml
20 + @type schema_version() :: String.t()
21 +
22 + @typep components_map() :: %{Fetcher.app_name() => Fetcher.dependency()}
23 + @typep component() ::
24 + SBoM.CycloneDX.V13.Component.t()
25 + | SBoM.CycloneDX.V14.Component.t()
26 + | SBoM.CycloneDX.V15.Component.t()
27 + | SBoM.CycloneDX.V16.Component.t()
28 + | SBoM.CycloneDX.V17.Component.t()
24 29 @type classification() ::
25 - SBoM.Cyclonedx.V13.Classification.t()
26 - | SBoM.Cyclonedx.V14.Classification.t()
27 - | SBoM.Cyclonedx.V15.Classification.t()
28 - | SBoM.Cyclonedx.V16.Classification.t()
29 - | SBoM.Cyclonedx.V17.Classification.t()
30 - @type dependency_list() :: [
31 - SBoM.Cyclonedx.V13.Dependency.t()
32 - | SBoM.Cyclonedx.V14.Dependency.t()
33 - | SBoM.Cyclonedx.V15.Dependency.t()
34 - | SBoM.Cyclonedx.V16.Dependency.t()
35 - | SBoM.Cyclonedx.V17.Dependency.t()
36 - ]
37 - @type license_list() :: [
38 - SBoM.Cyclonedx.V13.LicenseChoice.t()
39 - | SBoM.Cyclonedx.V14.LicenseChoice.t()
40 - | SBoM.Cyclonedx.V15.LicenseChoice.t()
41 - | SBoM.Cyclonedx.V16.LicenseChoice.t()
42 - | SBoM.Cyclonedx.V17.LicenseChoice.t()
43 - ]
44 - @type scope() ::
45 - SBoM.Cyclonedx.V13.Scope.t()
46 - | SBoM.Cyclonedx.V14.Scope.t()
47 - | SBoM.Cyclonedx.V15.Scope.t()
48 - | SBoM.Cyclonedx.V16.Scope.t()
49 - | SBoM.Cyclonedx.V17.Scope.t()
50 - @type metadata() ::
51 - SBoM.Cyclonedx.V13.Metadata.t()
52 - | SBoM.Cyclonedx.V14.Metadata.t()
53 - | SBoM.Cyclonedx.V15.Metadata.t()
54 - | SBoM.Cyclonedx.V16.Metadata.t()
55 - | SBoM.Cyclonedx.V17.Metadata.t()
56 - @type tool() ::
57 - SBoM.Cyclonedx.V13.Tool.t()
58 - | SBoM.Cyclonedx.V14.Tool.t()
59 - | SBoM.Cyclonedx.V15.Tool.t()
60 - | SBoM.Cyclonedx.V16.Tool.t()
61 - | SBoM.Cyclonedx.V17.Tool.t()
62 - @type external_reference() ::
63 - SBoM.Cyclonedx.V13.ExternalReference.t()
64 - | SBoM.Cyclonedx.V14.ExternalReference.t()
65 - | SBoM.Cyclonedx.V15.ExternalReference.t()
66 - | SBoM.Cyclonedx.V16.ExternalReference.t()
67 - | SBoM.Cyclonedx.V17.ExternalReference.t()
68 - @type uuid() :: <<_::288>>
30 + SBoM.CycloneDX.V13.Classification.t()
31 + | SBoM.CycloneDX.V14.Classification.t()
32 + | SBoM.CycloneDX.V15.Classification.t()
33 + | SBoM.CycloneDX.V16.Classification.t()
34 + | SBoM.CycloneDX.V17.Classification.t()
35 + @typep dependency_list() :: [
36 + SBoM.CycloneDX.V13.Dependency.t()
37 + | SBoM.CycloneDX.V14.Dependency.t()
38 + | SBoM.CycloneDX.V15.Dependency.t()
39 + | SBoM.CycloneDX.V16.Dependency.t()
40 + | SBoM.CycloneDX.V17.Dependency.t()
41 + ]
42 + @typep license_list() :: [
43 + SBoM.CycloneDX.V13.LicenseChoice.t()
44 + | SBoM.CycloneDX.V14.LicenseChoice.t()
45 + | SBoM.CycloneDX.V15.LicenseChoice.t()
46 + | SBoM.CycloneDX.V16.LicenseChoice.t()
47 + | SBoM.CycloneDX.V17.LicenseChoice.t()
48 + ]
49 + @typep scope() ::
50 + SBoM.CycloneDX.V13.Scope.t()
51 + | SBoM.CycloneDX.V14.Scope.t()
52 + | SBoM.CycloneDX.V15.Scope.t()
53 + | SBoM.CycloneDX.V16.Scope.t()
54 + | SBoM.CycloneDX.V17.Scope.t()
55 + @typep metadata() ::
56 + SBoM.CycloneDX.V13.Metadata.t()
57 + | SBoM.CycloneDX.V14.Metadata.t()
58 + | SBoM.CycloneDX.V15.Metadata.t()
59 + | SBoM.CycloneDX.V16.Metadata.t()
60 + | SBoM.CycloneDX.V17.Metadata.t()
61 + @typep tool() ::
62 + SBoM.CycloneDX.V13.Tool.t()
63 + | SBoM.CycloneDX.V14.Tool.t()
64 + | SBoM.CycloneDX.V15.Tool.t()
65 + | SBoM.CycloneDX.V16.Tool.t()
66 + | SBoM.CycloneDX.V17.Tool.t()
67 + @typep external_reference() ::
68 + SBoM.CycloneDX.V13.ExternalReference.t()
69 + | SBoM.CycloneDX.V14.ExternalReference.t()
70 + | SBoM.CycloneDX.V15.ExternalReference.t()
71 + | SBoM.CycloneDX.V16.ExternalReference.t()
72 + | SBoM.CycloneDX.V17.ExternalReference.t()
73 + @typep uuid() :: <<_::288>>
69 74
70 75 @version Mix.Project.config()[:version]
71 76
72 - @spec empty(SBoM.CLI.schema_version()) :: t()
77 + @doc """
78 + Create an empty BOM structure for the given schema version.
79 + """
80 + @spec empty(schema_version()) :: t()
73 81 def empty(version \\ "1.7") do
74 82 bom_struct(:Bom, version,
75 83 spec_version: version,
  @@ -88,8 +96,15 @@ defmodule SBoM.CycloneDX do
88 96 classification: classification()
89 97 ]
90 98
91 - @spec bom(components_map(), bom_opts()) :: t()
92 - def bom(components, opts \\ []) do
99 + @doc """
100 + Generate a BOM for the current Mix project and its dependencies.
101 + """
102 + @spec bom(bom_opts()) :: t()
103 + def bom(opts \\ []), do: bom_for_components(Fetcher.fetch(), opts)
104 +
105 + @doc false
106 + @spec bom_for_components(components_map(), bom_opts()) :: t()
107 + def bom_for_components(components, opts \\ []) do
93 108 version = Keyword.get(opts, :version, "1.7")
94 109 starting_bom = Keyword.get(opts, :starting_bom, empty(version))
95 110 serial = Keyword.get(opts, :serial, urn_uuid())
  @@ -110,17 +125,14 @@ defmodule SBoM.CycloneDX do
110 125 |> Map.put(:dependencies, attach_dependencies(filtered_components, version))
111 126 end
112 127
113 - @spec encode(t(), SBoM.CLI.format(), SBoM.CLI.pretty()) :: iodata()
128 + @doc "Encode a BOM"
129 + @spec encode(t(), format(), boolean()) :: iodata()
114 130 def encode(bom, type, pretty \\ false)
115 131 def encode(bom, :protobuf, _pretty), do: Protobuf.encode(bom)
116 132 def encode(bom, :json, pretty), do: JSON.encode(bom, pretty)
117 133 def encode(bom, :xml, pretty), do: XML.encode(bom, pretty)
118 134
119 - @doc """
120 - Decode a BOM from JSON format.
121 -
122 - Returns the parsed BOM struct based on the version found in the JSON.
123 - """
135 + @doc "Decode a BOM"
124 136 @spec decode(String.t(), :json) :: t()
125 137 def decode(data, format)
126 138 def decode(data, :protobuf), do: Protobuf.decode(data)
  @@ -159,7 +171,7 @@ defmodule SBoM.CycloneDX do
159 171 Map.put(metadata, :timestamp, nil)
160 172 end
161 173
162 - @spec attach_metadata(metadata(), SBoM.CLI.schema_version(), components_map(), classification()) ::
174 + @spec attach_metadata(metadata(), schema_version(), components_map(), classification()) ::
163 175 metadata()
164 176 defp attach_metadata(metadata, version, components, classification)
165 177
  @@ -195,9 +207,9 @@ defmodule SBoM.CycloneDX do
195 207 @spec timestamp_now() :: Google.Protobuf.Timestamp.t()
196 208 defp timestamp_now, do: DateTime.utc_now() |> DateTime.truncate(:second) |> Google.Protobuf.from_datetime()
197 209
198 - @spec root_component(components_map(), SBoM.CLI.schema_version(), classification()) ::
199 - {SBoM.Fetcher.app_name(), SBoM.Fetcher.dependency()} | nil
200 - def root_component(components, version, classification) do
210 + @spec root_component(components_map(), schema_version(), classification()) ::
211 + {Fetcher.app_name(), Fetcher.dependency()} | nil
212 + defp root_component(components, version, classification) do
201 213 components
202 214 |> Enum.find(&match?({_name, %{root: true}}, &1))
203 215 |> case do
  @@ -243,7 +255,7 @@ defmodule SBoM.CycloneDX do
243 255 end)
244 256 end
245 257
246 - @spec attach_components(components_map(), SBoM.CLI.schema_version()) :: [component()]
258 + @spec attach_components(components_map(), schema_version()) :: [component()]
247 259 defp attach_components(components, version) do
248 260 Enum.flat_map(components, fn
249 261 {_name, %{root: true}} ->
  @@ -255,9 +267,9 @@ defmodule SBoM.CycloneDX do
255 267 end
256 268
257 269 @spec convert_component(
258 - SBoM.Fetcher.app_name(),
259 - SBoM.Fetcher.dependency(),
260 - SBoM.CLI.schema_version()
270 + Fetcher.app_name(),
271 + Fetcher.dependency(),
272 + schema_version()
261 273 ) :: struct()
262 274 defp convert_component(name, component, schema_version) do
263 275 source_url_reference =
  @@ -308,7 +320,7 @@ defmodule SBoM.CycloneDX do
308 320
309 321 @spec source_url_reference(
310 322 source_url :: String.t(),
311 - SBoM.CLI.schema_version()
323 + schema_version()
312 324 ) :: external_reference()
313 325 defp source_url_reference(source_url, version) do
314 326 bom_struct(:ExternalReference, version,
  @@ -318,8 +330,8 @@ defmodule SBoM.CycloneDX do
318 330 end
319 331
320 332 @spec asset_reference(
321 - component :: SBoM.Fetcher.dependency(),
322 - SBoM.CLI.schema_version()
333 + component :: Fetcher.dependency(),
334 + schema_version()
323 335 ) :: external_reference() | nil
324 336 defp asset_reference(component, version)
325 337
  @@ -338,7 +350,7 @@ defmodule SBoM.CycloneDX do
338 350
339 351 @spec links_references(
340 352 links :: %{optional(String.t()) => String.t()},
341 - SBoM.CLI.schema_version()
353 + schema_version()
342 354 ) :: [external_reference()]
343 355 defp links_references(links, version) do
344 356 alias SBoM.Fetcher.Links
  @@ -380,15 +392,12 @@ defmodule SBoM.CycloneDX do
380 392 end)
381 393 end
382 394
383 - @spec dependency_scope(SBoM.Fetcher.dependency()) :: scope()
395 + @spec dependency_scope(Fetcher.dependency()) :: scope()
384 396 defp dependency_scope(dependency) do
385 397 optional? = Map.get(dependency, :optional, false)
386 398
387 - prod? =
388 - case Map.get(dependency, :only, []) do
389 - :* -> true
390 - only -> :prod in List.wrap(only)
391 - end
399 + only = Map.get(dependency, :only, [:*])
400 + prod? = :prod in List.wrap(only) or :* in List.wrap(only)
392 401
393 402 cond do
394 403 optional? ->
  @@ -402,7 +411,7 @@ defmodule SBoM.CycloneDX do
402 411 end
403 412 end
404 413
405 - @spec convert_licenses([String.t()], SBoM.CLI.schema_version()) :: license_list()
414 + @spec convert_licenses([String.t()], schema_version()) :: license_list()
406 415 defp convert_licenses(licenses, version) do
407 416 Enum.map(
408 417 licenses,
  @@ -410,7 +419,7 @@ defmodule SBoM.CycloneDX do
410 419 )
411 420 end
412 421
413 - @spec attach_dependencies(components_map(), SBoM.CLI.schema_version()) :: dependency_list()
422 + @spec attach_dependencies(components_map(), schema_version()) :: dependency_list()
414 423 defp attach_dependencies(components, version) do
415 424 for {_name, component_data} <- components do
416 425 dependency_refs =
  @@ -433,7 +442,7 @@ defmodule SBoM.CycloneDX do
433 442 "otp:component:#{purl.name}:#{purl.type}:#{hash}"
434 443 end
435 444
436 - @spec tool(SBoM.CLI.schema_version()) :: tool() | component()
445 + @spec tool(schema_version()) :: tool() | component()
437 446 defp tool(version)
438 447
439 448 defp tool(version) when version in ["1.3", "1.4"] do
  @@ -472,18 +481,20 @@ defmodule SBoM.CycloneDX do
472 481 )
473 482 end
474 483
475 - @spec bom_struct(module(), SBoM.CLI.schema_version(), Keyword.t()) :: struct()
484 + @doc false
485 + @spec bom_struct(module(), schema_version(), Keyword.t()) :: struct()
476 486 defp bom_struct(module, version, attrs \\ [])
477 487
478 - @spec bom_struct_module(module(), SBoM.CLI.schema_version()) :: module()
488 + @doc false
489 + @spec bom_struct_module(module(), schema_version()) :: module()
479 490 def bom_struct_module(module, version)
480 491
481 492 for {schema_version, prefix} <- %{
482 - "1.7" => SBoM.Cyclonedx.V17,
483 - "1.6" => SBoM.Cyclonedx.V16,
484 - "1.5" => SBoM.Cyclonedx.V15,
485 - "1.4" => SBoM.Cyclonedx.V14,
486 - "1.3" => SBoM.Cyclonedx.V13
493 + "1.7" => SBoM.CycloneDX.V17,
494 + "1.6" => SBoM.CycloneDX.V16,
495 + "1.5" => SBoM.CycloneDX.V15,
496 + "1.4" => SBoM.CycloneDX.V14,
497 + "1.3" => SBoM.CycloneDX.V13
487 498 } do
488 499 # Safe: Module.concat is called at compile time with well-known module names from a fixed map
489 500 # credo:disable-for-next-line Credo.Check.Warning.UnsafeToAtom
  @@ -494,9 +505,10 @@ defmodule SBoM.CycloneDX do
494 505 def bom_struct_module(module, unquote(schema_version)), do: Module.concat([unquote(prefix), module])
495 506 end
496 507
497 - @spec bom_struct_version(module()) :: SBoM.CLI.schema_version()
508 + @doc false
509 + @spec bom_struct_version(module()) :: schema_version()
498 510 def bom_struct_version(module) do
499 - ["SBoM", "Cyclonedx", "V" <> version | _rest] = Module.split(module)
511 + ["SBoM", "CycloneDX", "V" <> version | _rest] = Module.split(module)
500 512
501 513 case version do
502 514 "13" -> "1.3"
  @@ -507,7 +519,7 @@ defmodule SBoM.CycloneDX do
507 519 end
508 520 end
509 521
510 - @spec qualifiers_to_hashes(map(), SBoM.CLI.schema_version()) :: [struct()]
522 + @spec qualifiers_to_hashes(map(), schema_version()) :: [struct()]
511 523 defp qualifiers_to_hashes(%{"checksum" => "sha256:" <> hash}, version) do
512 524 [
513 525 bom_struct(:Hash, version,
  @@ -519,7 +531,7 @@ defmodule SBoM.CycloneDX do
519 531
520 532 defp qualifiers_to_hashes(_qualifiers, _version), do: []
521 533
522 - @spec component_version(SBoM.Fetcher.dependency(), SBoM.CLI.schema_version()) ::
534 + @spec component_version(Fetcher.dependency(), schema_version()) ::
523 535 String.t() | nil
524 536 defp component_version(component, schema_version) do
525 537 case schema_version do
  @@ -5,32 +5,32 @@ defmodule SBoM.CycloneDX.Common.EnumHelpers do
5 5 @moduledoc false
6 6
7 7 @type hash_alg() ::
8 - SBoM.Cyclonedx.V13.HashAlg.t()
9 - | SBoM.Cyclonedx.V14.HashAlg.t()
10 - | SBoM.Cyclonedx.V15.HashAlg.t()
11 - | SBoM.Cyclonedx.V16.HashAlg.t()
12 - | SBoM.Cyclonedx.V17.HashAlg.t()
8 + SBoM.CycloneDX.V13.HashAlg.t()
9 + | SBoM.CycloneDX.V14.HashAlg.t()
10 + | SBoM.CycloneDX.V15.HashAlg.t()
11 + | SBoM.CycloneDX.V16.HashAlg.t()
12 + | SBoM.CycloneDX.V17.HashAlg.t()
13 13
14 14 @type external_reference_type() ::
15 - SBoM.Cyclonedx.V13.ExternalReferenceType.t()
16 - | SBoM.Cyclonedx.V14.ExternalReferenceType.t()
17 - | SBoM.Cyclonedx.V15.ExternalReferenceType.t()
18 - | SBoM.Cyclonedx.V16.ExternalReferenceType.t()
19 - | SBoM.Cyclonedx.V17.ExternalReferenceType.t()
15 + SBoM.CycloneDX.V13.ExternalReferenceType.t()
16 + | SBoM.CycloneDX.V14.ExternalReferenceType.t()
17 + | SBoM.CycloneDX.V15.ExternalReferenceType.t()
18 + | SBoM.CycloneDX.V16.ExternalReferenceType.t()
19 + | SBoM.CycloneDX.V17.ExternalReferenceType.t()
20 20
21 21 @type classification() ::
22 - SBoM.Cyclonedx.V13.Classification.t()
23 - | SBoM.Cyclonedx.V14.Classification.t()
24 - | SBoM.Cyclonedx.V15.Classification.t()
25 - | SBoM.Cyclonedx.V16.Classification.t()
26 - | SBoM.Cyclonedx.V17.Classification.t()
22 + SBoM.CycloneDX.V13.Classification.t()
23 + | SBoM.CycloneDX.V14.Classification.t()
24 + | SBoM.CycloneDX.V15.Classification.t()
25 + | SBoM.CycloneDX.V16.Classification.t()
26 + | SBoM.CycloneDX.V17.Classification.t()
27 27
28 28 @type scope() ::
29 - SBoM.Cyclonedx.V13.Scope.t()
30 - | SBoM.Cyclonedx.V14.Scope.t()
31 - | SBoM.Cyclonedx.V15.Scope.t()
32 - | SBoM.Cyclonedx.V16.Scope.t()
33 - | SBoM.Cyclonedx.V17.Scope.t()
29 + SBoM.CycloneDX.V13.Scope.t()
30 + | SBoM.CycloneDX.V14.Scope.t()
31 + | SBoM.CycloneDX.V15.Scope.t()
32 + | SBoM.CycloneDX.V16.Scope.t()
33 + | SBoM.CycloneDX.V17.Scope.t()
34 34
35 35 @hash_alg_mappings %{
36 36 HASH_ALG_NULL: "",
  @@ -289,11 +289,11 @@ end
289 289
290 290 defimpl SBoM.CycloneDX.JSON.Decodable,
291 291 for: [
292 - SBoM.Cyclonedx.V17.Component,
293 - SBoM.Cyclonedx.V16.Component,
294 - SBoM.Cyclonedx.V15.Component,
295 - SBoM.Cyclonedx.V14.Component,
296 - SBoM.Cyclonedx.V13.Component
292 + SBoM.CycloneDX.V17.Component,
293 + SBoM.CycloneDX.V16.Component,
294 + SBoM.CycloneDX.V15.Component,
295 + SBoM.CycloneDX.V14.Component,
296 + SBoM.CycloneDX.V13.Component
297 297 ] do
298 298 alias SBoM.CycloneDX.Common.EnumHelpers
299 299 alias SBoM.CycloneDX.JSON.Decoder
  @@ -340,11 +340,11 @@ end
340 340
341 341 defimpl SBoM.CycloneDX.JSON.Decodable,
342 342 for: [
343 - SBoM.Cyclonedx.V17.Hash,
344 - SBoM.Cyclonedx.V16.Hash,
345 - SBoM.Cyclonedx.V15.Hash,
346 - SBoM.Cyclonedx.V14.Hash,
347 - SBoM.Cyclonedx.V13.Hash
343 + SBoM.CycloneDX.V17.Hash,
344 + SBoM.CycloneDX.V16.Hash,
345 + SBoM.CycloneDX.V15.Hash,
346 + SBoM.CycloneDX.V14.Hash,
347 + SBoM.CycloneDX.V13.Hash
348 348 ] do
349 349 alias SBoM.CycloneDX.Common.EnumHelpers
350 350 alias SBoM.CycloneDX.JSON.Decoder
  @@ -380,11 +380,11 @@ end
380 380
381 381 defimpl SBoM.CycloneDX.JSON.Decodable,
382 382 for: [
383 - SBoM.Cyclonedx.V17.ExternalReference,
384 - SBoM.Cyclonedx.V16.ExternalReference,
385 - SBoM.Cyclonedx.V15.ExternalReference,
386 - SBoM.Cyclonedx.V14.ExternalReference,
387 - SBoM.Cyclonedx.V13.ExternalReference
383 + SBoM.CycloneDX.V17.ExternalReference,
384 + SBoM.CycloneDX.V16.ExternalReference,
385 + SBoM.CycloneDX.V15.ExternalReference,
386 + SBoM.CycloneDX.V14.ExternalReference,
387 + SBoM.CycloneDX.V13.ExternalReference
388 388 ] do
389 389 alias SBoM.CycloneDX.Common.EnumHelpers
390 390 alias SBoM.CycloneDX.JSON.Decoder
  @@ -409,11 +409,11 @@ end
409 409
410 410 defimpl SBoM.CycloneDX.JSON.Decodable,
411 411 for: [
412 - SBoM.Cyclonedx.V17.Dependency,
413 - SBoM.Cyclonedx.V16.Dependency,
414 - SBoM.Cyclonedx.V15.Dependency,
415 - SBoM.Cyclonedx.V14.Dependency,
416 - SBoM.Cyclonedx.V13.Dependency
412 + SBoM.CycloneDX.V17.Dependency,
413 + SBoM.CycloneDX.V16.Dependency,
414 + SBoM.CycloneDX.V15.Dependency,
415 + SBoM.CycloneDX.V14.Dependency,
416 + SBoM.CycloneDX.V13.Dependency
417 417 ] do
418 418 alias SBoM.CycloneDX.JSON.Decoder
Loading more files…