diff --git a/src/rs_lib/Cargo.lock b/src/rs_lib/Cargo.lock index 981db4c..edce36c 100644 --- a/src/rs_lib/Cargo.lock +++ b/src/rs_lib/Cargo.lock @@ -1869,6 +1869,7 @@ dependencies = [ "deno_graph", "deno_npm_cache", "deno_npm_installer", + "deno_package_json", "deno_path_util", "deno_resolver", "deno_semver", diff --git a/src/rs_lib/Cargo.toml b/src/rs_lib/Cargo.toml index b8c8c21..32cd236 100644 --- a/src/rs_lib/Cargo.toml +++ b/src/rs_lib/Cargo.toml @@ -56,6 +56,11 @@ path = "../../deno/libs/npm_cache" path = "../../deno/libs/npm_installer" default-features = false +[dependencies.deno_package_json] +path = "../../deno/libs/package_json" +features = ["sync"] + + [dependencies.deno_resolver] path = "../../deno/libs/resolver" features = ["deno_ast","graph","sync"] @@ -80,4 +85,4 @@ features = ["real","wasm"] codegen-units = 1 incremental = true lto = true -opt-level = "z" +opt-level = 3 diff --git a/src/rs_lib/lib.rs b/src/rs_lib/lib.rs index b023675..394418e 100644 --- a/src/rs_lib/lib.rs +++ b/src/rs_lib/lib.rs @@ -7,6 +7,7 @@ use std::path::Path; use std::path::PathBuf; use std::rc::Rc; use std::sync::Arc; +use std::sync::Mutex; use std::sync::OnceLock; use anyhow::Context; @@ -31,6 +32,8 @@ use deno_npm_installer::NpmInstallerFactory; use deno_npm_installer::NpmInstallerFactoryOptions; use deno_npm_installer::Reporter; use deno_npm_installer::lifecycle_scripts::NullLifecycleScriptsExecutor; +use deno_package_json::PackageJsonCacheResult; +use deno_package_json::PackageJsonRc; use deno_resolver::DenoResolveError; use deno_resolver::DenoResolveErrorKind; use deno_resolver::cache::ParsedSourceCache; @@ -71,7 +74,6 @@ use log::Metadata; use log::Record; use node_resolver::NodeConditionOptions; use node_resolver::NodeResolverOptions; -use node_resolver::PackageJsonThreadLocalCache; use node_resolver::analyze::NodeCodeTranslatorMode; use node_resolver::cache::NodeResolutionThreadLocalCache; use node_resolver::errors::NodeJsErrorCode; @@ -188,9 +190,29 @@ pub struct DenoWorkspace { workspace_factory: Arc>, } -impl Drop for DenoWorkspace { - fn drop(&mut self) { - PackageJsonThreadLocalCache::clear(); +#[derive(Debug)] +pub struct PackageJsonOwnedCache { + map: Mutex>>, +} + +impl PackageJsonOwnedCache { + pub fn new() -> Self { + Self { + map: Mutex::new(std::collections::HashMap::new()), + } + } +} + +impl deno_package_json::PackageJsonCache for PackageJsonOwnedCache { + fn get(&self, path: &Path) -> PackageJsonCacheResult { + self.map.lock().unwrap().get(path).cloned().map_or_else( + || PackageJsonCacheResult::NotCached, + |value| PackageJsonCacheResult::Hit(value), + ) + } + + fn set(&self, path: PathBuf, package_json: Option) { + self.map.lock().unwrap().insert(path, package_json); } } @@ -301,7 +323,7 @@ impl DenoWorkspace { node_analysis_cache: None, node_code_translator_mode: NodeCodeTranslatorMode::Disabled, node_resolution_cache: Some(Arc::new(NodeResolutionThreadLocalCache)), - package_json_cache: Some(Arc::new(PackageJsonThreadLocalCache)), + package_json_cache: Some(Arc::new(PackageJsonOwnedCache::new())), package_json_dep_resolution: None, specified_import_map: None, bare_node_builtins: true,