Package URL toolkit with CycloneDX/SPDX import, canonicalization, inventory policy, and cross-format diff
///|
test {
let value = @moon_purl.parse(
"pkg:npm/%40Acme/Widget@2.1.0?os=linux&arch=arm64",
)
assert_eq(
value.to_string(),
"pkg:npm/%40acme/widget@2.1.0?arch=arm64&os=linux",
)
assert_eq(value.identity(), "pkg:npm/%40acme/widget@2.1.0")
}moon add forey217/moon_purl@0.2.0moon run cmd/main --target js
moon run cmd/benchmark --target jsrows=20000 ready=16000 duplicate=2000 invalid=1000 unversioned=1000 blocked=0
cyclonedx=5000 imported=4500 missing=250 invalid-purl=250 ready=4000 duplicate=500let report = @moon_purl.audit_inventory(
[
{ record_id: "a", purl: "pkg:pypi/Requests@2.32.3" },
{ record_id: "b", purl: "pkg:pypi/requests@2.32.3#vendor" },
{ record_id: "c", purl: "pkg:npm/lodash" },
],
)
assert_eq(report.ready, 1)
assert_eq(report.duplicate, 1)
assert_eq(report.unversioned, 1)moon fmt --check
moon check --target js --deny-warn
moon test --target js --deny-warnpub(all) struct InventoryFinding {
record_id : String
input : String
canonical : String
decision : InventoryDecision
code : String
offset : Int
} derive(Eq, Debug)pub(all) struct InventoryReport {
findings : Array[InventoryFinding]
ready : Int
invalid : Int
unversioned : Int
duplicate : Int
policy_blocked : Int
} derive(Eq, Debug)pub(all) struct ParseReport {
findings : Array[ParseFinding]
valid : Int
invalid : Int
} derive(Eq, Debug)pub(all) struct SbomAuditReport {
import_report : SbomImportReport
inventory_report : InventoryReport
} derive(Eq, Debug)pub(all) struct SbomImportFinding {
record_id : String
decision : SbomImportDecision
input : String
canonical : String
code : String
offset : Int
} derive(Eq, Debug)pub(all) struct SbomImportReport {
format : SbomFormat
entries : Array[InventoryEntry]
findings : Array[SbomImportFinding]
imported : Int
missing : Int
invalid : Int
} derive(Eq, Debug)fn audit_cyclonedx_json(input : String, policy? : InventoryPolicy) -> SbomAuditReport raise PurlErrorInstall
Download zipPackage URL toolkit with CycloneDX/SPDX import, canonicalization, inventory policy, and cross-format diff