summaryrefslogtreecommitdiff
path: root/cli/proc_state.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/proc_state.rs')
-rw-r--r--cli/proc_state.rs251
1 files changed, 110 insertions, 141 deletions
diff --git a/cli/proc_state.rs b/cli/proc_state.rs
index edd59427c..86af11ec3 100644
--- a/cli/proc_state.rs
+++ b/cli/proc_state.rs
@@ -17,12 +17,12 @@ use crate::cache::ParsedSourceCache;
use crate::cache::TypeCheckCache;
use crate::emit::emit_parsed_source;
use crate::file_fetcher::FileFetcher;
+use crate::graph_util::build_graph_with_npm_resolution;
use crate::graph_util::graph_lock_or_exit;
use crate::graph_util::graph_valid_with_cli_options;
use crate::http_util::HttpClient;
use crate::node;
use crate::node::NodeResolution;
-use crate::npm::resolve_graph_npm_info;
use crate::npm::NpmCache;
use crate::npm::NpmPackageResolver;
use crate::npm::NpmRegistryApi;
@@ -43,12 +43,11 @@ use deno_core::resolve_url_or_path;
use deno_core::CompiledWasmModuleStore;
use deno_core::ModuleSpecifier;
use deno_core::SharedArrayBufferStore;
-use deno_graph::npm::NpmPackageReq;
use deno_graph::npm::NpmPackageReqReference;
use deno_graph::source::Loader;
use deno_graph::source::Resolver;
+use deno_graph::Module;
use deno_graph::ModuleGraph;
-use deno_graph::ModuleKind;
use deno_graph::Resolution;
use deno_runtime::deno_broadcast_channel::InMemoryBroadcastChannel;
use deno_runtime::deno_node::NodeResolutionMode;
@@ -209,6 +208,29 @@ impl ProcState {
let lockfile = cli_options.maybe_lock_file();
+ let registry_url = NpmRegistryApi::default_url().to_owned();
+ let npm_cache = NpmCache::from_deno_dir(
+ &dir,
+ cli_options.cache_setting(),
+ http_client.clone(),
+ progress_bar.clone(),
+ );
+ let api = NpmRegistryApi::new(
+ registry_url,
+ npm_cache.clone(),
+ http_client.clone(),
+ progress_bar.clone(),
+ );
+ let npm_resolver = NpmPackageResolver::new_with_maybe_lockfile(
+ npm_cache.clone(),
+ api,
+ cli_options
+ .resolve_local_node_modules_folder()
+ .with_context(|| "Resolving local node_modules folder.")?,
+ cli_options.get_npm_resolution_snapshot(),
+ lockfile.as_ref().cloned(),
+ )
+ .await?;
let maybe_import_map = cli_options
.resolve_import_map(&file_fetcher)
.await?
@@ -217,16 +239,18 @@ impl ProcState {
cli_options.resolve_inspector_server().map(Arc::new);
let maybe_package_json_deps = cli_options.maybe_package_json_deps()?;
- let package_json_reqs = if let Some(deps) = &maybe_package_json_deps {
+ if let Some(deps) = &maybe_package_json_deps {
+ // resolve the package.json npm requirements ahead of time
let mut package_reqs = deps.values().cloned().collect::<Vec<_>>();
package_reqs.sort(); // deterministic resolution
- package_reqs
- } else {
- Vec::new()
- };
+ npm_resolver.add_package_reqs(package_reqs).await?;
+ }
let resolver = Arc::new(CliGraphResolver::new(
cli_options.to_maybe_jsx_import_source_config(),
maybe_import_map.clone(),
+ cli_options.no_npm(),
+ npm_resolver.api().clone(),
+ npm_resolver.resolution().clone(),
maybe_package_json_deps,
));
@@ -244,31 +268,12 @@ impl ProcState {
let emit_cache = EmitCache::new(dir.gen_cache.clone());
let parsed_source_cache =
ParsedSourceCache::new(Some(dir.dep_analysis_db_file_path()));
- let registry_url = NpmRegistryApi::default_url();
let npm_cache = NpmCache::from_deno_dir(
&dir,
cli_options.cache_setting(),
http_client.clone(),
progress_bar.clone(),
);
- let api = NpmRegistryApi::new(
- registry_url.clone(),
- npm_cache.clone(),
- http_client.clone(),
- progress_bar.clone(),
- );
- let npm_resolver = NpmPackageResolver::new_with_maybe_lockfile(
- npm_cache.clone(),
- api,
- cli_options.no_npm(),
- cli_options
- .resolve_local_node_modules_folder()
- .with_context(|| "Resolving local node_modules folder.")?,
- cli_options.get_npm_resolution_snapshot(),
- lockfile.as_ref().cloned(),
- )
- .await?;
- npm_resolver.add_package_reqs(package_json_reqs).await?;
let node_analysis_cache =
NodeAnalysisCache::new(Some(dir.node_analysis_db_file_path()));
@@ -326,7 +331,8 @@ impl ProcState {
dynamic_permissions,
);
let maybe_imports = self.options.to_maybe_imports()?;
- let resolver = self.resolver.as_graph_resolver();
+ let graph_resolver = self.resolver.as_graph_resolver();
+ let graph_npm_resolver = self.resolver.as_graph_npm_resolver();
let maybe_file_watcher_reporter: Option<&dyn deno_graph::source::Reporter> =
if let Some(reporter) = &self.maybe_file_watcher_reporter {
Some(reporter)
@@ -344,40 +350,35 @@ impl ProcState {
let reload_exclusions: HashSet<ModuleSpecifier> =
graph.specifiers().map(|(s, _)| s.clone()).collect();
- graph
- .build(
- roots.clone(),
- &mut cache,
- deno_graph::BuildOptions {
- is_dynamic,
- imports: maybe_imports,
- resolver: Some(resolver),
- module_analyzer: Some(&*analyzer),
- reporter: maybe_file_watcher_reporter,
- },
- )
- .await;
+ build_graph_with_npm_resolution(
+ &mut graph,
+ &self.npm_resolver,
+ roots.clone(),
+ &mut cache,
+ deno_graph::BuildOptions {
+ is_dynamic,
+ imports: maybe_imports,
+ resolver: Some(graph_resolver),
+ npm_resolver: Some(graph_npm_resolver),
+ module_analyzer: Some(&*analyzer),
+ reporter: maybe_file_watcher_reporter,
+ },
+ )
+ .await?;
// If there is a lockfile, validate the integrity of all the modules.
if let Some(lockfile) = &self.lockfile {
graph_lock_or_exit(&graph, &mut lockfile.lock());
}
- let (npm_package_reqs, has_node_builtin_specifier) = {
+ let graph = {
graph_valid_with_cli_options(&graph, &roots, &self.options)?;
let mut graph_data = self.graph_data.write();
graph_data.update_graph(Arc::new(graph));
- (
- graph_data.npm_packages.clone(),
- graph_data.has_node_builtin_specifier,
- )
+ graph_data.graph.clone()
};
- if !npm_package_reqs.is_empty() {
- self.npm_resolver.add_package_reqs(npm_package_reqs).await?;
- }
-
- if has_node_builtin_specifier
+ if graph.has_node_specifier
&& self.options.type_check_mode() != TypeCheckMode::None
{
self
@@ -394,12 +395,9 @@ impl ProcState {
{
log::debug!("Type checking.");
let maybe_config_specifier = self.options.maybe_config_file_specifier();
- let (graph, has_node_builtin_specifier) = {
+ let graph = {
let graph_data = self.graph_data.read();
- (
- Arc::new(graph_data.graph.segment(&roots)),
- graph_data.has_node_builtin_specifier,
- )
+ Arc::new(graph_data.graph.segment(&roots))
};
let options = check::CheckOptions {
type_check_mode: self.options.type_check_mode(),
@@ -412,7 +410,6 @@ impl ProcState {
log_checks: true,
reload: self.options.reload_flag()
&& !roots.iter().all(|r| reload_exclusions.contains(r)),
- has_node_builtin_specifier,
};
let check_cache =
TypeCheckCache::new(&self.dir.type_checking_cache_db_file_path());
@@ -501,7 +498,7 @@ impl ProcState {
let graph_data = self.graph_data.read();
let graph = &graph_data.graph;
let maybe_resolved = match graph.get(&referrer) {
- Some(module) => module
+ Some(Module::Esm(module)) => module
.dependencies
.get(specifier)
.map(|d| (&module.specifier, &d.maybe_code)),
@@ -512,33 +509,36 @@ impl ProcState {
Some((found_referrer, Resolution::Ok(resolved))) => {
let specifier = &resolved.specifier;
- if specifier.scheme() == "node" {
- return node::resolve_builtin_node_module(specifier.path());
- }
-
- if let Ok(reference) =
- NpmPackageReqReference::from_specifier(specifier)
- {
- if !self.options.unstable()
- && matches!(found_referrer.scheme(), "http" | "https")
- {
- return Err(custom_error(
+ return match graph.get(specifier) {
+ Some(Module::Npm(module)) => {
+ if !self.options.unstable()
+ && matches!(found_referrer.scheme(), "http" | "https")
+ {
+ return Err(custom_error(
"NotSupported",
format!("importing npm specifiers in remote modules requires the --unstable flag (referrer: {found_referrer})"),
));
+ }
+
+ self
+ .handle_node_resolve_result(node::node_resolve_npm_reference(
+ &module.nv_reference,
+ NodeResolutionMode::Execution,
+ &self.npm_resolver,
+ permissions,
+ ))
+ .with_context(|| {
+ format!("Could not resolve '{}'.", module.nv_reference)
+ })
}
-
- return self
- .handle_node_resolve_result(node::node_resolve_npm_reference(
- &reference,
- NodeResolutionMode::Execution,
- &self.npm_resolver,
- permissions,
- ))
- .with_context(|| format!("Could not resolve '{reference}'."));
- } else {
- return Ok(specifier.clone());
- }
+ Some(Module::Node(module)) => {
+ node::resolve_builtin_node_module(&module.module_name)
+ }
+ Some(Module::Esm(module)) => Ok(module.specifier.clone()),
+ Some(Module::External(module)) => Ok(module.specifier.clone()),
+ Some(Module::Json(module)) => Ok(module.specifier.clone()),
+ None => Ok(specifier.clone()),
+ };
}
Some((_, Resolution::Err(err))) => {
return Err(custom_error(
@@ -579,6 +579,10 @@ impl ProcState {
if let Ok(reference) =
NpmPackageReqReference::from_specifier(&specifier)
{
+ let reference = self
+ .npm_resolver
+ .resolution()
+ .pkg_req_ref_to_nv_ref(reference)?;
return self
.handle_node_resolve_result(node::node_resolve_npm_reference(
&reference,
@@ -597,8 +601,8 @@ impl ProcState {
pub fn cache_module_emits(&self) -> Result<(), AnyError> {
let graph = self.graph();
for module in graph.modules() {
- let is_emittable = module.kind != ModuleKind::External
- && matches!(
+ if let Module::Esm(module) = module {
+ let is_emittable = matches!(
module.media_type,
MediaType::TypeScript
| MediaType::Mts
@@ -606,14 +610,13 @@ impl ProcState {
| MediaType::Jsx
| MediaType::Tsx
);
- if is_emittable {
- if let Some(code) = &module.maybe_source {
+ if is_emittable {
emit_parsed_source(
&self.emit_cache,
&self.parsed_source_cache,
&module.specifier,
module.media_type,
- code,
+ &module.source,
&self.emit_options,
self.emit_options_hash,
)?;
@@ -651,36 +654,34 @@ impl ProcState {
let cli_resolver = CliGraphResolver::new(
self.options.to_maybe_jsx_import_source_config(),
self.maybe_import_map.clone(),
+ self.options.no_npm(),
+ self.npm_resolver.api().clone(),
+ self.npm_resolver.resolution().clone(),
// TODO(bartlomieju): this should use dependencies from `package.json`?
None,
);
let graph_resolver = cli_resolver.as_graph_resolver();
+ let graph_npm_resolver = cli_resolver.as_graph_npm_resolver();
let analyzer = self.parsed_source_cache.as_analyzer();
let mut graph = ModuleGraph::default();
- graph
- .build(
- roots,
- loader,
- 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,
+ &self.npm_resolver,
+ roots,
+ loader,
+ 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?;
- // add the found npm package requirements to the npm resolver and cache them
- let graph_npm_info = resolve_graph_npm_info(&graph);
- if !graph_npm_info.package_reqs.is_empty() {
- self
- .npm_resolver
- .add_package_reqs(graph_npm_info.package_reqs)
- .await?;
- }
- if graph_npm_info.has_node_builtin_specifier
+ if graph.has_node_specifier
&& self.options.type_check_mode() != TypeCheckMode::None
{
self
@@ -697,7 +698,7 @@ impl ProcState {
}
pub fn has_node_builtin_specifier(&self) -> bool {
- self.graph_data.read().has_node_builtin_specifier
+ self.graph_data.read().graph.has_node_specifier
}
}
@@ -728,44 +729,12 @@ impl deno_graph::source::Reporter for FileWatcherReporter {
#[derive(Debug, Default)]
struct GraphData {
graph: Arc<ModuleGraph>,
- /// The npm package requirements from all the encountered graphs
- /// in the order that they should be resolved.
- npm_packages: Vec<NpmPackageReq>,
- /// If the graph had a "node:" specifier.
- has_node_builtin_specifier: bool,
checked_libs: HashMap<TsTypeLib, HashSet<ModuleSpecifier>>,
}
impl GraphData {
/// Store data from `graph` into `self`.
pub fn update_graph(&mut self, graph: Arc<ModuleGraph>) {
- let mut has_npm_specifier_in_graph = false;
-
- for (specifier, _) in graph.specifiers() {
- match specifier.scheme() {
- "node" => {
- // We don't ever set this back to false because once it's
- // on then it's on globally.
- self.has_node_builtin_specifier = true;
- }
- "npm" => {
- if !has_npm_specifier_in_graph
- && NpmPackageReqReference::from_specifier(specifier).is_ok()
- {
- has_npm_specifier_in_graph = true;
- }
- }
- _ => {}
- }
-
- if has_npm_specifier_in_graph && self.has_node_builtin_specifier {
- break; // exit early
- }
- }
-
- if has_npm_specifier_in_graph {
- self.npm_packages = resolve_graph_npm_info(&graph).package_reqs;
- }
self.graph = graph;
}