mirror of
https://github.com/denoland/deno.git
synced 2025-08-04 10:59:13 +00:00
feat(unstable): Respect --cached-only flags for npm: specifiers (#15512)
This commit changes "npm:" specifier handling to respect "--cached-only" flags and adds "Download" messages for npm registry api calls. Co-authored-by: David Sherret <dsherret@gmail.com>
This commit is contained in:
parent
57d48134d1
commit
c66386dbd2
15 changed files with 263 additions and 27 deletions
|
@ -7,12 +7,14 @@ use std::path::PathBuf;
|
|||
use deno_ast::ModuleSpecifier;
|
||||
use deno_core::anyhow::bail;
|
||||
use deno_core::anyhow::Context;
|
||||
use deno_core::error::custom_error;
|
||||
use deno_core::error::AnyError;
|
||||
use deno_core::url::Url;
|
||||
use deno_runtime::colors;
|
||||
use deno_runtime::deno_fetch::reqwest;
|
||||
|
||||
use crate::deno_dir::DenoDir;
|
||||
use crate::file_fetcher::CacheSetting;
|
||||
use crate::fs_util;
|
||||
|
||||
use super::tarball::verify_and_extract_tarball;
|
||||
|
@ -152,15 +154,24 @@ impl ReadonlyNpmCache {
|
|||
|
||||
/// Stores a single copy of npm packages in a cache.
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct NpmCache(ReadonlyNpmCache);
|
||||
pub struct NpmCache {
|
||||
readonly: ReadonlyNpmCache,
|
||||
cache_setting: CacheSetting,
|
||||
}
|
||||
|
||||
impl NpmCache {
|
||||
pub fn from_deno_dir(dir: &DenoDir) -> Result<Self, AnyError> {
|
||||
Ok(Self(ReadonlyNpmCache::from_deno_dir(dir)?))
|
||||
pub fn from_deno_dir(
|
||||
dir: &DenoDir,
|
||||
cache_setting: CacheSetting,
|
||||
) -> Result<Self, AnyError> {
|
||||
Ok(Self {
|
||||
readonly: ReadonlyNpmCache::from_deno_dir(dir)?,
|
||||
cache_setting,
|
||||
})
|
||||
}
|
||||
|
||||
pub fn as_readonly(&self) -> ReadonlyNpmCache {
|
||||
self.0.clone()
|
||||
self.readonly.clone()
|
||||
}
|
||||
|
||||
pub async fn ensure_package(
|
||||
|
@ -169,13 +180,22 @@ impl NpmCache {
|
|||
dist: &NpmPackageVersionDistInfo,
|
||||
registry_url: &Url,
|
||||
) -> Result<(), AnyError> {
|
||||
let package_folder = self.0.package_folder(id, registry_url);
|
||||
let package_folder = self.readonly.package_folder(id, registry_url);
|
||||
if package_folder.exists()
|
||||
// if this file exists, then the package didn't successfully extract
|
||||
// the first time, or another process is currently extracting the zip file
|
||||
&& !package_folder.join(NPM_PACKAGE_SYNC_LOCK_FILENAME).exists()
|
||||
{
|
||||
return Ok(());
|
||||
} else if self.cache_setting == CacheSetting::Only {
|
||||
return Err(custom_error(
|
||||
"NotCached",
|
||||
format!(
|
||||
"An npm specifier not found in cache: \"{}\", --cached-only is specified.",
|
||||
id.name
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
log::log!(
|
||||
|
@ -225,15 +245,15 @@ impl NpmCache {
|
|||
id: &NpmPackageId,
|
||||
registry_url: &Url,
|
||||
) -> PathBuf {
|
||||
self.0.package_folder(id, registry_url)
|
||||
self.readonly.package_folder(id, registry_url)
|
||||
}
|
||||
|
||||
pub fn package_name_folder(&self, name: &str, registry_url: &Url) -> PathBuf {
|
||||
self.0.package_name_folder(name, registry_url)
|
||||
self.readonly.package_name_folder(name, registry_url)
|
||||
}
|
||||
|
||||
pub fn registry_folder(&self, registry_url: &Url) -> PathBuf {
|
||||
self.0.registry_folder(registry_url)
|
||||
self.readonly.registry_folder(registry_url)
|
||||
}
|
||||
|
||||
pub fn resolve_package_id_from_specifier(
|
||||
|
@ -242,7 +262,7 @@ impl NpmCache {
|
|||
registry_url: &Url,
|
||||
) -> Result<NpmPackageId, AnyError> {
|
||||
self
|
||||
.0
|
||||
.readonly
|
||||
.resolve_package_id_from_specifier(specifier, registry_url)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue