summaryrefslogtreecommitdiff
path: root/cli/graph_util.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/graph_util.rs')
-rw-r--r--cli/graph_util.rs114
1 files changed, 67 insertions, 47 deletions
diff --git a/cli/graph_util.rs b/cli/graph_util.rs
index 77dc3011c..ef1e0f59a 100644
--- a/cli/graph_util.rs
+++ b/cli/graph_util.rs
@@ -8,7 +8,7 @@ use crate::cache;
use crate::cache::TypeCheckCache;
use crate::colors;
use crate::errors::get_error_class_name;
-use crate::npm::resolve_graph_npm_info;
+use crate::npm::NpmPackageResolver;
use crate::proc_state::ProcState;
use crate::resolver::CliGraphResolver;
use crate::tools::check;
@@ -17,6 +17,7 @@ use deno_core::anyhow::bail;
use deno_core::error::custom_error;
use deno_core::error::AnyError;
use deno_core::ModuleSpecifier;
+use deno_graph::Module;
use deno_graph::ModuleGraph;
use deno_graph::ModuleGraphError;
use deno_graph::ResolutionError;
@@ -121,20 +122,23 @@ pub fn graph_valid(
/// Checks the lockfile against the graph and and exits on errors.
pub fn graph_lock_or_exit(graph: &ModuleGraph, lockfile: &mut Lockfile) {
for module in graph.modules() {
- if let Some(source) = &module.maybe_source {
- if !lockfile.check_or_insert_remote(module.specifier.as_str(), source) {
- let err = format!(
- concat!(
- "The source code is invalid, as it does not match the expected hash in the lock file.\n",
- " Specifier: {}\n",
- " Lock file: {}",
- ),
- module.specifier,
- lockfile.filename.display(),
- );
- log::error!("{} {}", colors::red("error:"), err);
- std::process::exit(10);
- }
+ let source = match module {
+ Module::Esm(module) => &module.source,
+ Module::Json(module) => &module.source,
+ Module::Node(_) | Module::Npm(_) | Module::External(_) => continue,
+ };
+ if !lockfile.check_or_insert_remote(module.specifier().as_str(), source) {
+ let err = format!(
+ concat!(
+ "The source code is invalid, as it does not match the expected hash in the lock file.\n",
+ " Specifier: {}\n",
+ " Lock file: {}",
+ ),
+ module.specifier(),
+ lockfile.filename.display(),
+ );
+ log::error!("{} {}", colors::red("error:"), err);
+ std::process::exit(10);
}
}
}
@@ -154,30 +158,33 @@ pub async fn create_graph_and_maybe_check(
let cli_resolver = CliGraphResolver::new(
ps.options.to_maybe_jsx_import_source_config(),
ps.maybe_import_map.clone(),
+ ps.options.no_npm(),
+ ps.npm_resolver.api().clone(),
+ ps.npm_resolver.resolution().clone(),
maybe_package_json_deps,
);
let graph_resolver = cli_resolver.as_graph_resolver();
+ let graph_npm_resolver = cli_resolver.as_graph_npm_resolver();
let analyzer = ps.parsed_source_cache.as_analyzer();
let mut graph = ModuleGraph::default();
- graph
- .build(
- vec![root],
- &mut cache,
- deno_graph::BuildOptions {
- is_dynamic: false,
- imports: maybe_imports,
- resolver: Some(graph_resolver),
- module_analyzer: Some(&*analyzer),
- reporter: None,
- },
- )
- .await;
+ build_graph_with_npm_resolution(
+ &mut graph,
+ &ps.npm_resolver,
+ vec![root],
+ &mut cache,
+ deno_graph::BuildOptions {
+ is_dynamic: false,
+ imports: maybe_imports,
+ resolver: Some(graph_resolver),
+ npm_resolver: Some(graph_npm_resolver),
+ module_analyzer: Some(&*analyzer),
+ reporter: None,
+ },
+ )
+ .await?;
+
graph_valid_with_cli_options(&graph, &graph.roots, &ps.options)?;
let graph = Arc::new(graph);
- let npm_graph_info = resolve_graph_npm_info(&graph);
- ps.npm_resolver
- .add_package_reqs(npm_graph_info.package_reqs)
- .await?;
if let Some(lockfile) = &ps.lockfile {
graph_lock_or_exit(&graph, &mut lockfile.lock());
}
@@ -185,7 +192,7 @@ pub async fn create_graph_and_maybe_check(
if ps.options.type_check_mode() != TypeCheckMode::None {
// node built-in specifiers use the @types/node package to determine
// types, so inject that now after the lockfile has been written
- if npm_graph_info.has_node_builtin_specifier {
+ if graph.has_node_specifier {
ps.npm_resolver
.inject_synthetic_types_node_package()
.await?;
@@ -211,7 +218,6 @@ pub async fn create_graph_and_maybe_check(
ts_config: ts_config_result.ts_config,
log_checks: true,
reload: ps.options.reload_flag(),
- has_node_builtin_specifier: npm_graph_info.has_node_builtin_specifier,
},
)?;
log::debug!("{}", check_result.stats);
@@ -223,23 +229,37 @@ pub async fn create_graph_and_maybe_check(
Ok(graph)
}
+pub async fn build_graph_with_npm_resolution<'a>(
+ graph: &mut ModuleGraph,
+ npm_resolver: &NpmPackageResolver,
+ roots: Vec<ModuleSpecifier>,
+ loader: &mut dyn deno_graph::source::Loader,
+ options: deno_graph::BuildOptions<'a>,
+) -> Result<(), AnyError> {
+ graph.build(roots, loader, options).await;
+
+ // resolve the dependencies of any pending dependencies
+ // that were inserted by building the graph
+ npm_resolver.resolve_pending().await?;
+
+ Ok(())
+}
+
pub fn error_for_any_npm_specifier(
- graph: &deno_graph::ModuleGraph,
+ graph: &ModuleGraph,
) -> Result<(), AnyError> {
- let first_npm_specifier = graph
- .specifiers()
- .filter_map(|(_, r)| match r {
- Ok(module) if module.kind == deno_graph::ModuleKind::External => {
- Some(&module.specifier)
+ for module in graph.modules() {
+ match module {
+ Module::Npm(module) => {
+ bail!("npm specifiers have not yet been implemented for this sub command (https://github.com/denoland/deno/issues/15960). Found: {}", module.specifier)
}
- _ => None,
- })
- .next();
- if let Some(npm_specifier) = first_npm_specifier {
- bail!("npm specifiers have not yet been implemented for this sub command (https://github.com/denoland/deno/issues/15960). Found: {}", npm_specifier)
- } else {
- Ok(())
+ Module::Node(module) => {
+ bail!("Node specifiers have not yet been implemented for this sub command (https://github.com/denoland/deno/issues/15960). Found: node:{}", module.module_name)
+ }
+ Module::Esm(_) | Module::Json(_) | Module::External(_) => {}
+ }
}
+ Ok(())
}
/// Adds more explanatory information to a resolution error.