diff options
author | David Sherret <dsherret@users.noreply.github.com> | 2024-06-26 17:24:10 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-06-26 21:24:10 +0000 |
commit | 0da01c0ca6b537f74be32126e567bdfc2c73ed16 (patch) | |
tree | ef29d32cffb03a975a58c16827b0691dda50a5b3 /cli | |
parent | 86e0292733d6d08bf338b68fd50863aef17b1e44 (diff) |
refactor: move PackageJson to deno_config (#24348)
Diffstat (limited to 'cli')
-rw-r--r-- | cli/Cargo.toml | 2 | ||||
-rw-r--r-- | cli/args/mod.rs | 18 | ||||
-rw-r--r-- | cli/args/package_json.rs | 231 | ||||
-rw-r--r-- | cli/factory.rs | 1 | ||||
-rw-r--r-- | cli/lsp/config.rs | 27 | ||||
-rw-r--r-- | cli/lsp/language_server.rs | 2 | ||||
-rw-r--r-- | cli/lsp/resolver.rs | 12 | ||||
-rw-r--r-- | cli/npm/byonm.rs | 152 | ||||
-rw-r--r-- | cli/resolver.rs | 11 | ||||
-rw-r--r-- | cli/standalone/binary.rs | 4 | ||||
-rw-r--r-- | cli/tools/lint/mod.rs | 2 | ||||
-rw-r--r-- | cli/tools/registry/pm.rs | 6 | ||||
-rw-r--r-- | cli/tools/registry/unfurl.rs | 15 | ||||
-rw-r--r-- | cli/worker.rs | 2 |
14 files changed, 141 insertions, 344 deletions
diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 4a01f2305..9b318a22c 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -65,7 +65,7 @@ winres.workspace = true [dependencies] deno_ast = { workspace = true, features = ["bundler", "cjs", "codegen", "proposal", "react", "sourcemap", "transforms", "typescript", "view", "visit"] } deno_cache_dir = { workspace = true } -deno_config = "=0.16.4" +deno_config = { workspace = true, features = ["deno_json", "package_json"] } deno_core = { workspace = true, features = ["include_js_files_for_snapshotting"] } deno_doc = { version = "=0.140.0", features = ["html", "syntect"] } deno_emit = "=0.43.0" diff --git a/cli/args/mod.rs b/cli/args/mod.rs index 742249835..ccf00425b 100644 --- a/cli/args/mod.rs +++ b/cli/args/mod.rs @@ -8,9 +8,9 @@ mod lockfile; pub mod package_json; pub use self::import_map::resolve_import_map; -use self::package_json::PackageJsonDeps; use ::import_map::ImportMap; use deno_ast::SourceMapOption; +use deno_config::package_json::PackageJsonDeps; use deno_core::resolve_url_or_path; use deno_graph::GraphKind; use deno_npm::npm_rc::NpmRc; @@ -537,7 +537,7 @@ fn discover_package_json( flags: &Flags, maybe_stop_at: Option<PathBuf>, current_dir: &Path, -) -> Result<Option<PackageJson>, AnyError> { +) -> Result<Option<Arc<PackageJson>>, AnyError> { // TODO(bartlomieju): discover for all subcommands, but print warnings that // `package.json` is ignored in bundle/compile/etc. @@ -798,7 +798,7 @@ pub struct CliOptions { maybe_node_modules_folder: Option<PathBuf>, maybe_vendor_folder: Option<PathBuf>, maybe_config_file: Option<ConfigFile>, - maybe_package_json: Option<PackageJson>, + maybe_package_json: Option<Arc<PackageJson>>, npmrc: Arc<ResolvedNpmRc>, maybe_lockfile: Option<Arc<Mutex<Lockfile>>>, overrides: CliOptionOverrides, @@ -813,7 +813,7 @@ impl CliOptions { initial_cwd: PathBuf, maybe_config_file: Option<ConfigFile>, maybe_lockfile: Option<Arc<Mutex<Lockfile>>>, - maybe_package_json: Option<PackageJson>, + maybe_package_json: Option<Arc<PackageJson>>, npmrc: Arc<ResolvedNpmRc>, force_global_cache: bool, ) -> Result<Self, AnyError> { @@ -839,7 +839,7 @@ impl CliOptions { &initial_cwd, &flags, maybe_config_file.as_ref(), - maybe_package_json.as_ref(), + maybe_package_json.as_deref(), ) .with_context(|| "Resolving node_modules folder.")?; let maybe_vendor_folder = if force_global_cache { @@ -949,7 +949,7 @@ impl CliOptions { let maybe_lock_file = lockfile::discover( &flags, maybe_config_file.as_ref(), - maybe_package_json.as_ref(), + maybe_package_json.as_deref(), )?; Self::new( flags, @@ -1395,8 +1395,8 @@ impl CliOptions { &self.maybe_workspace_config } - pub fn maybe_package_json(&self) -> &Option<PackageJson> { - &self.maybe_package_json + pub fn maybe_package_json(&self) -> Option<&Arc<PackageJson>> { + self.maybe_package_json.as_ref() } pub fn npmrc(&self) -> &Arc<ResolvedNpmRc> { @@ -1414,7 +1414,7 @@ impl CliOptions { self .maybe_package_json() .as_ref() - .map(package_json::get_local_package_json_version_reqs) + .map(|p| p.resolve_local_package_json_version_reqs()) } } diff --git a/cli/args/package_json.rs b/cli/args/package_json.rs index b1ff39abc..b6ccb33a4 100644 --- a/cli/args/package_json.rs +++ b/cli/args/package_json.rs @@ -2,27 +2,15 @@ use std::path::Path; use std::path::PathBuf; +use std::sync::Arc; +use deno_config::package_json::PackageJsonDeps; use deno_core::anyhow::bail; use deno_core::error::AnyError; -use deno_npm::registry::parse_dep_entry_name_and_raw_version; +use deno_runtime::deno_fs::RealFs; +use deno_runtime::deno_node::load_pkg_json; use deno_runtime::deno_node::PackageJson; -use deno_semver::npm::NpmVersionReqParseError; use deno_semver::package::PackageReq; -use deno_semver::VersionReq; -use indexmap::IndexMap; -use thiserror::Error; - -#[derive(Debug, Error, Clone)] -pub enum PackageJsonDepValueParseError { - #[error(transparent)] - VersionReq(#[from] NpmVersionReqParseError), - #[error("Not implemented scheme '{scheme}'")] - Unsupported { scheme: String }, -} - -pub type PackageJsonDeps = - IndexMap<String, Result<PackageReq, PackageJsonDepValueParseError>>; #[derive(Debug, Default)] pub struct PackageJsonDepsProvider(Option<PackageJsonDeps>); @@ -51,79 +39,21 @@ impl PackageJsonDepsProvider { } } -/// Gets an application level package.json's npm package requirements. -/// -/// Note that this function is not general purpose. It is specifically for -/// parsing the application level package.json that the user has control -/// over. This is a design limitation to allow mapping these dependency -/// entries to npm specifiers which can then be used in the resolver. -pub fn get_local_package_json_version_reqs( - package_json: &PackageJson, -) -> PackageJsonDeps { - fn parse_entry( - key: &str, - value: &str, - ) -> Result<PackageReq, PackageJsonDepValueParseError> { - if value.starts_with("workspace:") - || value.starts_with("file:") - || value.starts_with("git:") - || value.starts_with("http:") - || value.starts_with("https:") - { - return Err(PackageJsonDepValueParseError::Unsupported { - scheme: value.split(':').next().unwrap().to_string(), - }); - } - let (name, version_req) = parse_dep_entry_name_and_raw_version(key, value); - let result = VersionReq::parse_from_npm(version_req); - match result { - Ok(version_req) => Ok(PackageReq { - name: name.to_string(), - version_req, - }), - Err(err) => Err(PackageJsonDepValueParseError::VersionReq(err)), - } - } - - fn insert_deps( - deps: Option<&IndexMap<String, String>>, - result: &mut PackageJsonDeps, - ) { - if let Some(deps) = deps { - for (key, value) in deps { - result - .entry(key.to_string()) - .or_insert_with(|| parse_entry(key, value)); - } - } - } - - let deps = package_json.dependencies.as_ref(); - let dev_deps = package_json.dev_dependencies.as_ref(); - let mut result = IndexMap::new(); - - // favors the deps over dev_deps - insert_deps(deps, &mut result); - insert_deps(dev_deps, &mut result); - - result -} - /// Attempts to discover the package.json file, maybe stopping when it /// reaches the specified `maybe_stop_at` directory. pub fn discover_from( start: &Path, maybe_stop_at: Option<PathBuf>, -) -> Result<Option<PackageJson>, AnyError> { +) -> Result<Option<Arc<PackageJson>>, AnyError> { const PACKAGE_JSON_NAME: &str = "package.json"; // note: ancestors() includes the `start` path for ancestor in start.ancestors() { let path = ancestor.join(PACKAGE_JSON_NAME); - let source = match std::fs::read_to_string(&path) { - Ok(source) => source, - Err(err) if err.kind() == std::io::ErrorKind::NotFound => { + let package_json = match load_pkg_json(&RealFs, &path) { + Ok(Some(package_json)) => package_json, + Ok(None) => { if let Some(stop_at) = maybe_stop_at.as_ref() { if ancestor == stop_at { break; @@ -138,7 +68,6 @@ pub fn discover_from( ), }; - let package_json = PackageJson::load_from_string(path.clone(), source)?; log::debug!("package.json file found at '{}'", path.display()); return Ok(Some(package_json)); } @@ -146,147 +75,3 @@ pub fn discover_from( log::debug!("No package.json file found"); Ok(None) } - -#[cfg(test)] -mod test { - use pretty_assertions::assert_eq; - use std::path::PathBuf; - - use super::*; - - fn get_local_package_json_version_reqs_for_tests( - package_json: &PackageJson, - ) -> IndexMap<String, Result<PackageReq, String>> { - get_local_package_json_version_reqs(package_json) - .into_iter() - .map(|(k, v)| { - ( - k, - match v { - Ok(v) => Ok(v), - Err(err) => Err(err.to_string()), - }, - ) - }) - .collect::<IndexMap<_, _>>() - } - - #[test] - fn test_get_local_package_json_version_reqs() { - let mut package_json = PackageJson::empty(PathBuf::from("/package.json")); - package_json.dependencies = Some(IndexMap::from([ - ("test".to_string(), "^1.2".to_string()), - ("other".to_string(), "npm:package@~1.3".to_string()), - ])); - package_json.dev_dependencies = Some(IndexMap::from([ - ("package_b".to_string(), "~2.2".to_string()), - // should be ignored - ("other".to_string(), "^3.2".to_string()), - ])); - let deps = get_local_package_json_version_reqs_for_tests(&package_json); - assert_eq!( - deps, - IndexMap::from([ - ( - "test".to_string(), - Ok(PackageReq::from_str("test@^1.2").unwrap()) - ), - ( - "other".to_string(), - Ok(PackageReq::from_str("package@~1.3").unwrap()) - ), - ( - "package_b".to_string(), - Ok(PackageReq::from_str("package_b@~2.2").unwrap()) - ) - ]) - ); - } - - #[test] - fn test_get_local_package_json_version_reqs_errors_non_npm_specifier() { - let mut package_json = PackageJson::empty(PathBuf::from("/package.json")); - package_json.dependencies = Some(IndexMap::from([( - "test".to_string(), - "%*(#$%()".to_string(), - )])); - let map = get_local_package_json_version_reqs_for_tests(&package_json); - assert_eq!( - map, - IndexMap::from([( - "test".to_string(), - Err( - concat!( - "Invalid npm version requirement. Unexpected character.\n", - " %*(#$%()\n", - " ~" - ) - .to_string() - ) - )]) - ); - } - - #[test] - fn test_get_local_package_json_version_reqs_range() { - let mut package_json = PackageJson::empty(PathBuf::from("/package.json")); - package_json.dependencies = Some(IndexMap::from([( - "test".to_string(), - "1.x - 1.3".to_string(), - )])); - let map = get_local_package_json_version_reqs_for_tests(&package_json); - assert_eq!( - map, - IndexMap::from([( - "test".to_string(), - Ok(PackageReq { - name: "test".to_string(), - version_req: VersionReq::parse_from_npm("1.x - 1.3").unwrap() - }) - )]) - ); - } - - #[test] - fn test_get_local_package_json_version_reqs_skips_certain_specifiers() { - let mut package_json = PackageJson::empty(PathBuf::from("/package.json")); - package_json.dependencies = Some(IndexMap::from([ - ("test".to_string(), "1".to_string()), - ("work-test".to_string(), "workspace:1.1.1".to_string()), - ("file-test".to_string(), "file:something".to_string()), - ("git-test".to_string(), "git:something".to_string()), - ("http-test".to_string(), "http://something".to_string()), - ("https-test".to_string(), "https://something".to_string()), - ])); - let result = get_local_package_json_version_reqs_for_tests(&package_json); - assert_eq!( - result, - IndexMap::from([ - ( - "file-test".to_string(), - Err("Not implemented scheme 'file'".to_string()), - ), - ( - "git-test".to_string(), - Err("Not implemented scheme 'git'".to_string()), - ), - ( - "http-test".to_string(), - Err("Not implemented scheme 'http'".to_string()), - ), - ( - "https-test".to_string(), - Err("Not implemented scheme 'https'".to_string()), - ), - ( - "test".to_string(), - Ok(PackageReq::from_str("test@1").unwrap()) - ), - ( - "work-test".to_string(), - Err("Not implemented scheme 'workspace'".to_string()), - ) - ]) - ); - } -} diff --git a/cli/factory.rs b/cli/factory.rs index ddd63e079..c2a5425c0 100644 --- a/cli/factory.rs +++ b/cli/factory.rs @@ -314,7 +314,6 @@ impl CliFactory { // any package.jsons that are in different folders options .maybe_package_json() - .as_ref() .map(|package_json| { package_json.path.parent() != lockfile.lock().filename.parent() }) diff --git a/cli/lsp/config.rs b/cli/lsp/config.rs index da5af0c2d..4f96d45a4 100644 --- a/cli/lsp/config.rs +++ b/cli/lsp/config.rs @@ -1520,25 +1520,20 @@ impl ConfigData { }) }); - let is_workspace_root = config_file + let workspace = config_file .as_ref() - .is_some_and(|c| !c.json.workspaces.is_empty()); - let workspace_members = if is_workspace_root { + .and_then(|c| c.json.workspace.as_ref().map(|w| (c, w))); + let is_workspace_root = workspace.is_some(); + let workspace_members = if let Some((config, workspace)) = workspace { Arc::new( - config_file - .as_ref() - .map(|c| { - c.json - .workspaces - .iter() - .flat_map(|p| { - let dir_specifier = c.specifier.join(p).ok()?; - let dir_path = specifier_to_file_path(&dir_specifier).ok()?; - Url::from_directory_path(normalize_path(dir_path)).ok() - }) - .collect() + workspace + .iter() + .flat_map(|p| { + let dir_specifier = config.specifier.join(p).ok()?; + let dir_path = specifier_to_file_path(&dir_specifier).ok()?; + Url::from_directory_path(normalize_path(dir_path)).ok() }) - .unwrap_or_default(), + .collect(), ) } else if let Some(workspace_data) = workspace_root { workspace_data.workspace_members.clone() diff --git a/cli/lsp/language_server.rs b/cli/lsp/language_server.rs index be1b27cda..a921584c2 100644 --- a/cli/lsp/language_server.rs +++ b/cli/lsp/language_server.rs @@ -3496,7 +3496,7 @@ impl Inner { self.initial_cwd.clone(), config_data.and_then(|d| d.config_file.as_deref().cloned()), config_data.and_then(|d| d.lockfile.clone()), - config_data.and_then(|d| d.package_json.as_deref().cloned()), + config_data.and_then(|d| d.package_json.clone()), config_data .and_then(|d| d.npmrc.clone()) .unwrap_or_else(create_default_npmrc), diff --git a/cli/lsp/resolver.rs b/cli/lsp/resolver.rs index c4c66f114..45d44032f 100644 --- a/cli/lsp/resolver.rs +++ b/cli/lsp/resolver.rs @@ -48,7 +48,6 @@ use std::collections::BTreeMap; use std::collections::BTreeSet; use std::collections::HashMap; use std::collections::HashSet; -use std::rc::Rc; use std::sync::Arc; use super::cache::LspCache; @@ -359,15 +358,12 @@ impl LspResolver { pub fn get_closest_package_json( &self, referrer: &ModuleSpecifier, - ) -> Result<Option<Rc<PackageJson>>, AnyError> { + ) -> Result<Option<Arc<PackageJson>>, AnyError> { let resolver = self.get_scope_resolver(Some(referrer)); let Some(node_resolver) = resolver.node_resolver.as_ref() else { return Ok(None); }; - node_resolver.get_closest_package_json( - referrer, - &mut deno_runtime::deno_node::AllowAllNodePermissions, - ) + node_resolver.get_closest_package_json(referrer) } pub fn resolve_redirects( @@ -462,7 +458,7 @@ async fn create_npm_resolver( config_data .and_then(|d| d.package_json.as_ref()) .map(|package_json| { - package_json::get_local_package_json_version_reqs(package_json) + package_json.resolve_local_package_json_version_reqs() }), )), npmrc: config_data @@ -506,7 +502,7 @@ fn create_graph_resolver( config_data .and_then(|d| d.package_json.as_ref()) .map(|package_json| { - package_json::get_local_package_json_version_reqs(package_json) + package_json.resolve_local_package_json_version_reqs() }), )), maybe_jsx_import_source_config: config_file diff --git a/cli/npm/byonm.rs b/cli/npm/byonm.rs index ec3fb00e9..0d4b9d4d4 100644 --- a/cli/npm/byonm.rs +++ b/cli/npm/byonm.rs @@ -3,7 +3,6 @@ use std::borrow::Cow; use std::path::Path; use std::path::PathBuf; -use std::rc::Rc; use std::sync::Arc; use deno_ast::ModuleSpecifier; @@ -11,12 +10,12 @@ use deno_core::anyhow::bail; use deno_core::error::AnyError; use deno_core::serde_json; use deno_runtime::deno_fs::FileSystem; +use deno_runtime::deno_node::load_pkg_json; use deno_runtime::deno_node::NodePermissions; use deno_runtime::deno_node::NpmResolver; use deno_runtime::deno_node::PackageJson; use deno_semver::package::PackageReq; -use crate::args::package_json::get_local_package_json_version_reqs; use crate::args::NpmProcessState; use crate::args::NpmProcessStateKind; use crate::util::fs::canonicalize_path_maybe_not_exists_with_fs; @@ -51,13 +50,13 @@ impl ByonmCliNpmResolver { &self, dep_name: &str, referrer: &ModuleSpecifier, - ) -> Option<Rc<PackageJson>> { + ) -> Option<Arc<PackageJson>> { let referrer_path = referrer.to_file_path().ok()?; let mut current_folder = referrer_path.parent()?; loop { let pkg_json_path = current_folder.join("package.json"); - if let Ok(pkg_json) = - PackageJson::load_skip_read_permission(self.fs.as_ref(), pkg_json_path) + if let Ok(Some(pkg_json)) = + load_pkg_json(self.fs.as_ref(), &pkg_json_path) { if let Some(deps) = &pkg_json.dependencies { if deps.contains_key(dep_name) { @@ -78,6 +77,70 @@ impl ByonmCliNpmResolver { } } } + + fn resolve_pkg_json_and_alias_for_req( + &self, + req: &PackageReq, + referrer: &ModuleSpecifier, + ) -> Result<(Arc<PackageJson>, String), AnyError> { + fn resolve_alias_from_pkg_json( + req: &PackageReq, + pkg_json: &PackageJson, + ) -> Option<String> { + let deps = pkg_json.resolve_local_package_json_version_reqs(); + for (key, value) in deps { + if let Ok(value) = value { + if value.name == req.name + && value.version_req.intersects(&req.version_req) + { + return Some(key); + } + } + } + None + } + + // attempt to resolve the npm specifier from the referrer's package.json, + if let Ok(file_path) = specifier_to_file_path(referrer) { + let mut current_path = file_path.as_path(); + while let Some(dir_path) = current_path.parent() { + let package_json_path = dir_path.join("package.json"); + if let Some(pkg_json) = + load_pkg_json(self.fs.as_ref(), &package_json_path)? + { + if let Some(alias) = + resolve_alias_from_pkg_json(req, pkg_json.as_ref()) + { + return Ok((pkg_json, alias)); + } + } + current_path = dir_path; + } + } + + // otherwise, fall fallback to the project's package.json + let root_pkg_json_path = self + .root_node_modules_dir + .parent() + .unwrap() + .join("package.json"); + if let Some(pkg_json) = + load_pkg_json(self.fs.as_ref(), &root_pkg_json_path)? + { + if let Some(alias) = resolve_alias_from_pkg_json(req, pkg_json.as_ref()) { + return Ok((pkg_json, alias)); + } + } + + bail!( + concat!( + "Could not find a matching package for 'npm:{}' in a package.json file. ", + "You must specify this as a package.json dependency when the ", + "node_modules folder is not managed by Deno.", + ), + req, + ); + } } impl NpmResolver for ByonmCliNpmResolver { @@ -181,68 +244,29 @@ impl CliNpmResolver for ByonmCliNpmResolver { req: &PackageReq, referrer: &ModuleSpecifier, ) -> Result<PathBuf, AnyError> { - fn resolve_from_package_json( - req: &PackageReq, - fs: &dyn FileSystem, - path: PathBuf, - ) -> Result<PathBuf, AnyError> { - let package_json = PackageJson::load_skip_read_permission(fs, path)?; - let deps = get_local_package_json_version_reqs(&package_json); - for (key, value) in deps { - if let Ok(value) = value { - if value.name == req.name - && value.version_req.intersects(&req.version_req) - { - let package_path = package_json - .path - .parent() - .unwrap() - .join("node_modules") - .join(key); - return Ok(canonicalize_path_maybe_not_exists_with_fs( - &package_path, - fs, - )?); - } - } - } - bail!( - concat!( - "Could not find a matching package for 'npm:{}' in '{}'. ", - "You must specify this as a package.json dependency when the ", - "node_modules folder is not managed by Deno.", - ), - req, - package_json.path.display() - ); - } - - // attempt to resolve the npm specifier from the referrer's package.json, - // but otherwise fallback to the project's package.json - if let Ok(file_path) = specifier_to_file_path(referrer) { - let mut current_path = file_path.as_path(); - while let Some(dir_path) = current_path.parent() { - let package_json_path = dir_path.join("package.json"); - if self.fs.exists_sync(&package_json_path) { - return resolve_from_package_json( - req, - self.fs.as_ref(), - package_json_path, - ); - } - current_path = dir_path; + // resolve the pkg json and alias + let (pkg_json, alias) = + self.resolve_pkg_json_and_alias_for_req(req, referrer)?; + // now try node resolution + for ancestor in pkg_json.path.parent().unwrap().ancestors() { + let node_modules_folder = ancestor.join("node_modules"); + let sub_dir = join_package_name(&node_modules_folder, &alias); + if self.fs.is_dir_sync(&sub_dir) { + return Ok(canonicalize_path_maybe_not_exists_with_fs( + &sub_dir, + self.fs.as_ref(), + )?); } } - resolve_from_package_json( - req, - self.fs.as_ref(), - self - .root_node_modules_dir - .parent() - .unwrap() - .join("package.json"), - ) + bail!( + concat!( + "Could not find \"{}\" in a node_modules folder. ", + "Deno expects the node_modules/ directory to be up to date. ", + "Did you forget to run `npm install`?" + ), + alias, + ); } fn check_state_hash(&self) -> Option<u64> { diff --git a/cli/resolver.rs b/cli/resolver.rs index 87a82dda0..2117f250b 100644 --- a/cli/resolver.rs +++ b/cli/resolver.rs @@ -4,6 +4,7 @@ use async_trait::async_trait; use dashmap::DashMap; use dashmap::DashSet; use deno_ast::MediaType; +use deno_config::package_json::PackageJsonDeps; use deno_core::anyhow::anyhow; use deno_core::anyhow::Context; use deno_core::error::AnyError; @@ -21,7 +22,6 @@ use deno_runtime::deno_fs; use deno_runtime::deno_fs::FileSystem; use deno_runtime::deno_node::is_builtin_node_module; use deno_runtime::deno_node::parse_npm_pkg_name; -use deno_runtime::deno_node::NodePermissions; use deno_runtime::deno_node::NodeResolution; use deno_runtime::deno_node::NodeResolutionMode; use deno_runtime::deno_node::NodeResolver; @@ -34,10 +34,8 @@ use import_map::ImportMap; use std::borrow::Cow; use std::path::Path; use std::path::PathBuf; -use std::rc::Rc; use std::sync::Arc; -use crate::args::package_json::PackageJsonDeps; use crate::args::JsxImportSourceConfig; use crate::args::PackageJsonDepsProvider; use crate::args::DENO_DISABLE_PEDANTIC_NODE_WARNINGS; @@ -95,11 +93,8 @@ impl CliNodeResolver { pub fn get_closest_package_json( &self, referrer: &ModuleSpecifier, - permissions: &mut dyn NodePermissions, - ) -> Result<Option<Rc<PackageJson>>, AnyError> { - self - .node_resolver - .get_closest_package_json(referrer, permissions) + ) -> Result<Option<Arc<PackageJson>>, AnyError> { + self.node_resolver.get_closest_package_json(referrer) } pub fn resolve_if_in_npm_package( diff --git a/cli/standalone/binary.rs b/cli/standalone/binary.rs index 8df52e3eb..98af5fa77 100644 --- a/cli/standalone/binary.rs +++ b/cli/standalone/binary.rs @@ -15,6 +15,8 @@ use std::path::PathBuf; use std::process::Command; use deno_ast::ModuleSpecifier; +use deno_config::package_json::PackageJsonDepValueParseError; +use deno_config::package_json::PackageJsonDeps; use deno_core::anyhow::bail; use deno_core::anyhow::Context; use deno_core::error::AnyError; @@ -31,8 +33,6 @@ use log::Level; use serde::Deserialize; use serde::Serialize; -use crate::args::package_json::PackageJsonDepValueParseError; -use crate::args::package_json::PackageJsonDeps; use crate::args::CaData; use crate::args::CliOptions; use crate::args::CompileFlags; diff --git a/cli/tools/lint/mod.rs b/cli/tools/lint/mod.rs index 712b95e34..0d9868cf2 100644 --- a/cli/tools/lint/mod.rs +++ b/cli/tools/lint/mod.rs @@ -911,7 +911,7 @@ pub fn get_configured_rules( ) -> ConfiguredRules { const NO_SLOW_TYPES_NAME: &str = "no-slow-types"; let implicit_no_slow_types = maybe_config_file - .map(|c| c.is_package() || !c.json.workspaces.is_empty()) + .map(|c| c.is_package() || c.json.workspace.is_some()) .unwrap_or(false); let no_slow_types = implicit_no_slow_types && !rules diff --git a/cli/tools/registry/pm.rs b/cli/tools/registry/pm.rs index 40493c6bf..4fdc02550 100644 --- a/cli/tools/registry/pm.rs +++ b/cli/tools/registry/pm.rs @@ -50,7 +50,7 @@ impl DenoConfigFormat { enum DenoOrPackageJson { Deno(deno_config::ConfigFile, DenoConfigFormat), - Npm(deno_node::PackageJson, Option<FmtOptionsConfig>), + Npm(Arc<deno_node::PackageJson>, Option<FmtOptionsConfig>), } impl DenoOrPackageJson { @@ -306,8 +306,8 @@ pub async fn add(flags: Flags, add_flags: AddFlags) -> Result<(), AnyError> { .await .context("Failed to update configuration file")?; - // TODO(bartlomieju): we should now cache the imports from the deno.json. - + // clear the previously cached package.json from memory before reloading it + deno_node::PackageJsonThreadLocalCache::clear(); // make a new CliFactory to pick up the updated config file let cli_factory = CliFactory::from_flags(flags)?; // cache deps diff --git a/cli/tools/registry/unfurl.rs b/cli/tools/registry/unfurl.rs index bc3272835..36bff64bb 100644 --- a/cli/tools/registry/unfurl.rs +++ b/cli/tools/registry/unfurl.rs @@ -305,7 +305,6 @@ fn to_range( mod tests { use std::sync::Arc; - use crate::args::package_json::get_local_package_json_version_reqs; use crate::args::PackageJsonDepsProvider; use super::*; @@ -316,7 +315,6 @@ mod tests { use deno_runtime::deno_fs::RealFs; use deno_runtime::deno_node::PackageJson; use import_map::ImportMapWithDiagnostics; - use indexmap::IndexMap; use pretty_assertions::assert_eq; use test_util::testdata_path; @@ -349,13 +347,18 @@ mod tests { }); let ImportMapWithDiagnostics { import_map, .. } = import_map::parse_from_value(deno_json_url, value).unwrap(); - let mut package_json = PackageJson::empty(cwd.join("package.json")); - package_json.dependencies = - Some(IndexMap::from([("chalk".to_string(), "5".to_string())])); + let package_json = PackageJson::load_from_value( + cwd.join("package.json"), + json!({ + "dependencies": { + "chalk": 5 + } + }), + ); let mapped_resolver = MappedSpecifierResolver::new( Some(Arc::new(import_map)), Arc::new(PackageJsonDepsProvider::new(Some( - get_local_package_json_version_reqs(&package_json), + package_json.resolve_local_package_json_version_reqs(), ))), ); diff --git a/cli/worker.rs b/cli/worker.rs index f332fc6bb..420d92c02 100644 --- a/cli/worker.rs +++ b/cli/worker.rs @@ -6,6 +6,7 @@ use std::rc::Rc; use std::sync::Arc; use deno_ast::ModuleSpecifier; +use deno_config::package_json::PackageJsonDeps; use deno_core::anyhow::bail; use deno_core::error::AnyError; use deno_core::futures::FutureExt; @@ -46,7 +47,6 @@ use deno_semver::package::PackageReqReference; use deno_terminal::colors; use tokio::select; -use crate::args::package_json::PackageJsonDeps; use crate::args::write_lockfile_if_has_changes; use crate::args::DenoSubcommand; use crate::args::StorageKeyResolver; |