Skip to content

Commit 69fb0cb

Browse files
committed
feat: accept local package-lock.json as target
Signed-off-by: Kirill Usubyan <[email protected]>
1 parent 9b27e36 commit 69fb0cb

File tree

3 files changed

+54
-5
lines changed

3 files changed

+54
-5
lines changed

hipcheck/src/cli.rs

+34-4
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ use crate::{
1313
shell::{color_choice::ColorChoice, verbosity::Verbosity},
1414
source,
1515
target::{
16-
pm, LocalGitRepo, MavenPackage, Package, PackageHost, Sbom, SbomStandard, SingleTargetSeed,
17-
SingleTargetSeedKind, TargetSeed, TargetSeedKind, TargetType, ToTargetSeed,
18-
ToTargetSeedKind, VcsUrl,
16+
pm, LocalGitRepo, MavenPackage, MultiTargetSeed, MultiTargetSeedKind, Package, PackageHost,
17+
Sbom, SbomStandard, SingleTargetSeed, SingleTargetSeedKind, TargetSeed, TargetSeedKind,
18+
TargetType, ToTargetSeed, ToTargetSeedKind, VcsUrl,
1919
},
2020
};
2121
use clap::{Parser as _, ValueEnum};
@@ -651,7 +651,13 @@ impl ToTargetSeed for CheckArgs {
651651

652652
Ok(TargetSeed::Single(seed))
653653
}
654-
TargetSeedKind::Multi(_multi_target_seed_kind) => todo!(),
654+
TargetSeedKind::Multi(multi_target_seed_kind) => {
655+
let seed = MultiTargetSeed {
656+
kind: multi_target_seed_kind,
657+
specifier: command.get_specifier().to_string(),
658+
};
659+
Ok(TargetSeed::Multi(seed))
660+
}
655661
}
656662
}
657663
}
@@ -673,6 +679,9 @@ pub enum CheckCommand {
673679
/// Analyze packages specified in an SBOM document
674680
#[command(hide = true)]
675681
Sbom(CheckSbomArgs),
682+
/// Analyze npm dependencies specified in an package-lock.json document
683+
#[command(hide = true)]
684+
PackageLockJson(CheckPackageLockJsonArgs),
676685
}
677686

678687
impl CheckCommand {
@@ -684,6 +693,7 @@ impl CheckCommand {
684693
Pypi(args) => &args.package,
685694
Repo(args) => &args.source,
686695
Sbom(args) => &args.path,
696+
PackageLockJson(args) => &args.path,
687697
}
688698
}
689699
}
@@ -696,6 +706,7 @@ impl ToTargetSeedKind for CheckCommand {
696706
CheckCommand::Pypi(args) => args.to_target_seed_kind(),
697707
CheckCommand::Repo(args) => args.to_target_seed_kind(),
698708
CheckCommand::Sbom(args) => args.to_target_seed_kind(),
709+
CheckCommand::PackageLockJson(args) => args.to_target_seed_kind(),
699710
}
700711
}
701712
}
@@ -887,6 +898,24 @@ impl ToTargetSeedKind for CheckSbomArgs {
887898
}
888899
}
889900

901+
#[derive(Debug, Clone, clap::Args)]
902+
pub struct CheckPackageLockJsonArgs {
903+
/// package-lock.json to analyze
904+
pub path: String,
905+
}
906+
907+
impl ToTargetSeedKind for CheckPackageLockJsonArgs {
908+
fn to_target_seed_kind(&self) -> Result<TargetSeedKind> {
909+
let path = PathBuf::from(&self.path);
910+
if path.exists() && self.path.ends_with("package-lock.json") {
911+
return Ok(TargetSeedKind::Multi(MultiTargetSeedKind::PackageLockJson(
912+
path,
913+
)));
914+
}
915+
Err(hc_error!("The provided package-lock.json does not exist"))
916+
}
917+
}
918+
890919
#[derive(Debug, Clone, clap::Args)]
891920
pub struct SchemaArgs {
892921
#[clap(subcommand)]
@@ -1616,6 +1645,7 @@ mod tests {
16161645
CheckCommand::Pypi(args) => args.package,
16171646
CheckCommand::Repo(args) => args.source,
16181647
CheckCommand::Sbom(args) => args.path,
1648+
CheckCommand::PackageLockJson(args) => args.path,
16191649
}
16201650
}
16211651

hipcheck/src/target/mod.rs

+5
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ pub enum TargetType {
6060
Repo,
6161
Request,
6262
Sbom,
63+
#[serde(rename = "package-lock-json")]
64+
PackageLockJson,
6365
}
6466

6567
impl TargetType {
@@ -96,6 +98,9 @@ impl TargetType {
9698
|| tgt.ends_with(".cdx.xml")
9799
{
98100
Some((Sbom, tgt.to_string()))
101+
// Otherwise check if it is a package-lock.json for a local npm project
102+
} else if tgt.ends_with("package-lock.json") {
103+
Some((PackageLockJson, tgt.to_string()))
99104
// If is path to a file/dir that exists, treat as a local Repo
100105
} else if PathBuf::from(tgt).exists() {
101106
Some((Repo, tgt.to_string()))

hipcheck/src/target/types.rs

+15-1
Original file line numberDiff line numberDiff line change
@@ -237,11 +237,25 @@ impl Display for SingleTargetSeedKind {
237237
}
238238
}
239239

240+
impl Display for MultiTargetSeedKind {
241+
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
242+
use MultiTargetSeedKind::*;
243+
match self {
244+
GoMod(path) => {
245+
write!(f, "go.mod file at {}", path.display())
246+
}
247+
PackageLockJson(path) => {
248+
write!(f, "package-lock.json file at {}", path.display())
249+
}
250+
}
251+
}
252+
}
253+
240254
impl Display for TargetSeed {
241255
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
242256
match self {
243257
TargetSeed::Single(x) => x.kind.fmt(f),
244-
TargetSeed::Multi(_x) => unimplemented!(),
258+
TargetSeed::Multi(x) => x.kind.fmt(f),
245259
}
246260
}
247261
}

0 commit comments

Comments
 (0)