From 35c1f984f814ecccab38ef6abf4360edc9deae2f Mon Sep 17 00:00:00 2001 From: Risu <79110363+risu729@users.noreply.github.com> Date: Mon, 16 Feb 2026 23:48:48 +1100 Subject: [PATCH 1/2] perf: call npm view only once --- src/backend/npm.rs | 42 +++++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/src/backend/npm.rs b/src/backend/npm.rs index 6af1e01c97..b08e302aa5 100644 --- a/src/backend/npm.rs +++ b/src/backend/npm.rs @@ -83,26 +83,34 @@ impl Backend for NPMBackend { async || { let env = self.dependency_env(config).await?; - // Fetch versions and timestamps in parallel - let versions_raw = - cmd!(NPM_PROGRAM, "view", self.tool_name(), "versions", "--json") - .full_env(&env) - .env("NPM_CONFIG_UPDATE_NOTIFIER", "false") - .read()?; - let time_raw = cmd!(NPM_PROGRAM, "view", self.tool_name(), "time", "--json") - .full_env(&env) - .env("NPM_CONFIG_UPDATE_NOTIFIER", "false") - .read()?; - - let versions: Vec = serde_json::from_str(&versions_raw)?; - let time: HashMap = serde_json::from_str(&time_raw)?; - + let raw = cmd!( + NPM_PROGRAM, + "view", + self.tool_name(), + "versions", + "time", + "--json" + ) + .full_env(&env) + .env("NPM_CONFIG_UPDATE_NOTIFIER", "false") + .read()?; + let data: Value = serde_json::from_str(&raw)?; + let versions = data["versions"] + .as_array() + .ok_or_else(|| eyre::eyre!("invalid versions"))?; + let time = data["time"] + .as_object() + .ok_or_else(|| eyre::eyre!("invalid time"))?; let version_info = versions - .into_iter() + .iter() + .filter_map(|v| v.as_str()) .map(|version| { - let created_at = time.get(&version).cloned(); + let created_at = time + .get(version) + .and_then(|v| v.as_str()) + .map(|s| s.to_string()); VersionInfo { - version, + version: version.to_string(), created_at, ..Default::default() } From f9a363ed275fd89930cdf0e2755390601ad44bbc Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Mon, 16 Feb 2026 12:53:53 +0000 Subject: [PATCH 2/2] [autofix.ci] apply automated fixes --- src/backend/npm.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/backend/npm.rs b/src/backend/npm.rs index b08e302aa5..3e7eb26620 100644 --- a/src/backend/npm.rs +++ b/src/backend/npm.rs @@ -11,7 +11,6 @@ use crate::timeout; use crate::toolset::ToolVersion; use async_trait::async_trait; use serde_json::Value; -use std::collections::HashMap; use std::{fmt::Debug, sync::Arc}; use tokio::sync::Mutex as TokioMutex;