pub(super) fn addon_self_ref(source: &str) -> Option<String> {
let spec = source.strip_prefix("ctxpkg:")?;
let remote_ref = crate::core::context_package::remote::parse_remote_ref(spec)?;
Some(format!("@{}/{}", remote_ref.namespace, remote_ref.name))
}
pub(super) fn refresh_pack_dependencies(
deps: &[crate::core::context_package::manifest::PackageDependency],
root_name: Option<&str>,
args: &[String],
) {
if deps.iter().all(|d| d.optional) {
return;
}
let base = crate::core::context_package::remote::registry_base(
super::addon_cmd::flag_value(args, "--registry").as_deref(),
);
let token = crate::core::context_package::remote::publish_token(None);
let project_root = super::common::detect_project_root(args);
println!("Refreshing declared dependencies (depth-1) …");
if let Err(e) = super::pack_remote::install_declared_dependencies(
deps,
root_name,
&base,
token.as_deref(),
&project_root,
true,
) {
eprintln!("Warning: dependency refresh failed: {e}\n The addon update itself succeeded.");
}
}
pub(super) fn resolve_declared_deps(
deps: &[crate::core::context_package::manifest::PackageDependency],
root_name: Option<&str>,
args: &[String],
) -> Vec<crate::core::context_package::deps::ResolvedDep> {
if deps.iter().all(|d| d.optional) {
return Vec::new();
}
let base = crate::core::context_package::remote::registry_base(
super::addon_cmd::flag_value(args, "--registry").as_deref(),
);
let token = crate::core::context_package::remote::publish_token(None);
match crate::core::context_package::deps::resolve_dependencies(
deps,
root_name,
&base,
token.as_deref(),
) {
Ok(v) => v,
Err(e) => {
eprintln!("Error: {e}");
std::process::exit(1);
}
}
}
pub(super) fn install_declared_deps(
deps: &[crate::core::context_package::manifest::PackageDependency],
root_name: Option<&str>,
args: &[String],
) -> Vec<crate::core::context_package::deps::ResolvedDep> {
let base = crate::core::context_package::remote::registry_base(
super::addon_cmd::flag_value(args, "--registry").as_deref(),
);
let token = crate::core::context_package::remote::publish_token(None);
let project_root = super::common::detect_project_root(args);
match super::pack_remote::install_declared_dependencies(
deps,
root_name,
&base,
token.as_deref(),
&project_root,
false,
) {
Ok(v) => v,
Err(e) => {
eprintln!("Error: dependency install failed: {e}\n Nothing was wired.");
std::process::exit(1);
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn addon_self_ref_is_scoped_for_hosted_sources_and_none_otherwise() {
assert_eq!(
addon_self_ref("ctxpkg:@dasTholo/lean-md@0.2.0").as_deref(),
Some("@dasTholo/lean-md")
);
assert_eq!(
addon_self_ref("ctxpkg:@dasTholo/lean-md").as_deref(),
Some("@dasTholo/lean-md")
);
assert_eq!(addon_self_ref("local"), None);
assert_eq!(addon_self_ref("registry"), None);
assert_eq!(addon_self_ref("ctxpkg:demo"), None);
}
}