summaryrefslogtreecommitdiff
path: root/cli/graph_util.rs
diff options
context:
space:
mode:
authorhaturau <135221985+haturatu@users.noreply.github.com>2024-11-20 01:20:47 +0900
committerGitHub <noreply@github.com>2024-11-20 01:20:47 +0900
commit85719a67e59c7aa45bead26e4942d7df8b1b42d4 (patch)
treeface0aecaac53e93ce2f23b53c48859bcf1a36ec /cli/graph_util.rs
parent67697bc2e4a62a9670699fd18ad0dd8efc5bd955 (diff)
parent186b52731c6bb326c4d32905c5e732d082e83465 (diff)
Merge branch 'denoland:main' into main
Diffstat (limited to 'cli/graph_util.rs')
-rw-r--r--cli/graph_util.rs152
1 files changed, 112 insertions, 40 deletions
diff --git a/cli/graph_util.rs b/cli/graph_util.rs
index e2f6246e7..6ed0506dd 100644
--- a/cli/graph_util.rs
+++ b/cli/graph_util.rs
@@ -13,16 +13,19 @@ use crate::colors;
use crate::errors::get_error_class_name;
use crate::file_fetcher::FileFetcher;
use crate::npm::CliNpmResolver;
-use crate::resolver::CliGraphResolver;
+use crate::resolver::CjsTracker;
+use crate::resolver::CliResolver;
use crate::resolver::CliSloppyImportsResolver;
use crate::resolver::SloppyImportsCachedFs;
use crate::tools::check;
use crate::tools::check::TypeChecker;
use crate::util::file_watcher::WatcherCommunicator;
use crate::util::fs::canonicalize_path;
+use deno_config::deno_json::JsxImportSourceConfig;
use deno_config::workspace::JsrPackageConfig;
use deno_core::anyhow::bail;
use deno_graph::source::LoaderChecksum;
+use deno_graph::source::ResolutionMode;
use deno_graph::FillFromLockfileOptions;
use deno_graph::JsrLoadError;
use deno_graph::ModuleLoadError;
@@ -48,6 +51,7 @@ use deno_runtime::deno_permissions::PermissionsContainer;
use deno_semver::jsr::JsrDepPackageReq;
use deno_semver::package::PackageNv;
use import_map::ImportMapError;
+use node_resolver::InNpmPackageChecker;
use std::collections::HashSet;
use std::error::Error;
use std::ops::Deref;
@@ -184,7 +188,7 @@ pub fn graph_exit_integrity_errors(graph: &ModuleGraph) {
fn exit_for_integrity_error(err: &ModuleError) {
if let Some(err_message) = enhanced_integrity_error_message(err) {
log::error!("{} {}", colors::red("error:"), err_message);
- std::process::exit(10);
+ deno_runtime::exit(10);
}
}
@@ -377,48 +381,54 @@ pub struct BuildFastCheckGraphOptions<'a> {
}
pub struct ModuleGraphBuilder {
- options: Arc<CliOptions>,
caches: Arc<cache::Caches>,
+ cjs_tracker: Arc<CjsTracker>,
+ cli_options: Arc<CliOptions>,
+ file_fetcher: Arc<FileFetcher>,
fs: Arc<dyn FileSystem>,
- resolver: Arc<CliGraphResolver>,
- npm_resolver: Arc<dyn CliNpmResolver>,
- module_info_cache: Arc<ModuleInfoCache>,
- parsed_source_cache: Arc<ParsedSourceCache>,
+ global_http_cache: Arc<GlobalHttpCache>,
+ in_npm_pkg_checker: Arc<dyn InNpmPackageChecker>,
lockfile: Option<Arc<CliLockfile>>,
maybe_file_watcher_reporter: Option<FileWatcherReporter>,
- file_fetcher: Arc<FileFetcher>,
- global_http_cache: Arc<GlobalHttpCache>,
+ module_info_cache: Arc<ModuleInfoCache>,
+ npm_resolver: Arc<dyn CliNpmResolver>,
+ parsed_source_cache: Arc<ParsedSourceCache>,
+ resolver: Arc<CliResolver>,
root_permissions_container: PermissionsContainer,
}
impl ModuleGraphBuilder {
#[allow(clippy::too_many_arguments)]
pub fn new(
- options: Arc<CliOptions>,
caches: Arc<cache::Caches>,
+ cjs_tracker: Arc<CjsTracker>,
+ cli_options: Arc<CliOptions>,
+ file_fetcher: Arc<FileFetcher>,
fs: Arc<dyn FileSystem>,
- resolver: Arc<CliGraphResolver>,
- npm_resolver: Arc<dyn CliNpmResolver>,
- module_info_cache: Arc<ModuleInfoCache>,
- parsed_source_cache: Arc<ParsedSourceCache>,
+ global_http_cache: Arc<GlobalHttpCache>,
+ in_npm_pkg_checker: Arc<dyn InNpmPackageChecker>,
lockfile: Option<Arc<CliLockfile>>,
maybe_file_watcher_reporter: Option<FileWatcherReporter>,
- file_fetcher: Arc<FileFetcher>,
- global_http_cache: Arc<GlobalHttpCache>,
+ module_info_cache: Arc<ModuleInfoCache>,
+ npm_resolver: Arc<dyn CliNpmResolver>,
+ parsed_source_cache: Arc<ParsedSourceCache>,
+ resolver: Arc<CliResolver>,
root_permissions_container: PermissionsContainer,
) -> Self {
Self {
- options,
caches,
+ cjs_tracker,
+ cli_options,
+ file_fetcher,
fs,
- resolver,
- npm_resolver,
- module_info_cache,
- parsed_source_cache,
+ global_http_cache,
+ in_npm_pkg_checker,
lockfile,
maybe_file_watcher_reporter,
- file_fetcher,
- global_http_cache,
+ module_info_cache,
+ npm_resolver,
+ parsed_source_cache,
+ resolver,
root_permissions_container,
}
}
@@ -504,19 +514,17 @@ impl ModuleGraphBuilder {
}
let maybe_imports = if options.graph_kind.include_types() {
- self.options.to_compiler_option_types()?
+ self.cli_options.to_compiler_option_types()?
} else {
Vec::new()
};
- let analyzer = self
- .module_info_cache
- .as_module_analyzer(&self.parsed_source_cache);
+ let analyzer = self.module_info_cache.as_module_analyzer();
let mut loader = match options.loader {
Some(loader) => MutLoaderRef::Borrowed(loader),
None => MutLoaderRef::Owned(self.create_graph_loader()),
};
let cli_resolver = &self.resolver;
- let graph_resolver = cli_resolver.as_graph_resolver();
+ let graph_resolver = self.create_graph_resolver()?;
let graph_npm_resolver = cli_resolver.create_graph_npm_resolver();
let maybe_file_watcher_reporter = self
.maybe_file_watcher_reporter
@@ -541,7 +549,7 @@ impl ModuleGraphBuilder {
npm_resolver: Some(&graph_npm_resolver),
module_analyzer: &analyzer,
reporter: maybe_file_watcher_reporter,
- resolver: Some(graph_resolver),
+ resolver: Some(&graph_resolver),
locker: locker.as_mut().map(|l| l as _),
},
)
@@ -558,7 +566,7 @@ impl ModuleGraphBuilder {
// ensure an "npm install" is done if the user has explicitly
// opted into using a node_modules directory
if self
- .options
+ .cli_options
.node_modules_dir()?
.map(|m| m.uses_node_modules_dir())
.unwrap_or(false)
@@ -664,16 +672,16 @@ impl ModuleGraphBuilder {
};
let parser = self.parsed_source_cache.as_capturing_parser();
let cli_resolver = &self.resolver;
- let graph_resolver = cli_resolver.as_graph_resolver();
+ let graph_resolver = self.create_graph_resolver()?;
let graph_npm_resolver = cli_resolver.create_graph_npm_resolver();
graph.build_fast_check_type_graph(
deno_graph::BuildFastCheckTypeGraphOptions {
- jsr_url_provider: &CliJsrUrlProvider,
+ es_parser: Some(&parser),
fast_check_cache: fast_check_cache.as_ref().map(|c| c as _),
fast_check_dts: false,
- module_parser: Some(&parser),
- resolver: Some(graph_resolver),
+ jsr_url_provider: &CliJsrUrlProvider,
+ resolver: Some(&graph_resolver),
npm_resolver: Some(&graph_npm_resolver),
workspace_fast_check: options.workspace_fast_check,
},
@@ -692,14 +700,15 @@ impl ModuleGraphBuilder {
) -> cache::FetchCacher {
cache::FetchCacher::new(
self.file_fetcher.clone(),
+ self.fs.clone(),
self.global_http_cache.clone(),
- self.npm_resolver.clone(),
+ self.in_npm_pkg_checker.clone(),
self.module_info_cache.clone(),
cache::FetchCacherOptions {
- file_header_overrides: self.options.resolve_file_header_overrides(),
+ file_header_overrides: self.cli_options.resolve_file_header_overrides(),
permissions,
is_deno_publish: matches!(
- self.options.sub_command(),
+ self.cli_options.sub_command(),
crate::args::DenoSubcommand::Publish { .. }
),
},
@@ -726,16 +735,28 @@ impl ModuleGraphBuilder {
&self.fs,
roots,
GraphValidOptions {
- kind: if self.options.type_check_mode().is_true() {
+ kind: if self.cli_options.type_check_mode().is_true() {
GraphKind::All
} else {
GraphKind::CodeOnly
},
- check_js: self.options.check_js(),
+ check_js: self.cli_options.check_js(),
exit_integrity_errors: true,
},
)
}
+
+ fn create_graph_resolver(&self) -> Result<CliGraphResolver, AnyError> {
+ let jsx_import_source_config = self
+ .cli_options
+ .workspace()
+ .to_maybe_jsx_import_source_config()?;
+ Ok(CliGraphResolver {
+ cjs_tracker: &self.cjs_tracker,
+ resolver: &self.resolver,
+ jsx_import_source_config,
+ })
+ }
}
/// Adds more explanatory information to a resolution error.
@@ -998,7 +1019,11 @@ impl deno_graph::source::Reporter for FileWatcherReporter {
) {
let mut file_paths = self.file_paths.lock();
if specifier.scheme() == "file" {
- file_paths.push(specifier.to_file_path().unwrap());
+ // Don't trust that the path is a valid path at this point:
+ // https://github.com/denoland/deno/issues/26209.
+ if let Ok(file_path) = specifier.to_file_path() {
+ file_paths.push(file_path);
+ }
}
if modules_done == modules_total {
@@ -1136,6 +1161,53 @@ fn format_deno_graph_error(err: &dyn Error) -> String {
message
}
+#[derive(Debug)]
+struct CliGraphResolver<'a> {
+ cjs_tracker: &'a CjsTracker,
+ resolver: &'a CliResolver,
+ jsx_import_source_config: Option<JsxImportSourceConfig>,
+}
+
+impl<'a> deno_graph::source::Resolver for CliGraphResolver<'a> {
+ fn default_jsx_import_source(&self) -> Option<String> {
+ self
+ .jsx_import_source_config
+ .as_ref()
+ .and_then(|c| c.default_specifier.clone())
+ }
+
+ fn default_jsx_import_source_types(&self) -> Option<String> {
+ self
+ .jsx_import_source_config
+ .as_ref()
+ .and_then(|c| c.default_types_specifier.clone())
+ }
+
+ fn jsx_import_source_module(&self) -> &str {
+ self
+ .jsx_import_source_config
+ .as_ref()
+ .map(|c| c.module.as_str())
+ .unwrap_or(deno_graph::source::DEFAULT_JSX_IMPORT_SOURCE_MODULE)
+ }
+
+ fn resolve(
+ &self,
+ raw_specifier: &str,
+ referrer_range: &deno_graph::Range,
+ mode: ResolutionMode,
+ ) -> Result<ModuleSpecifier, ResolveError> {
+ self.resolver.resolve(
+ raw_specifier,
+ referrer_range,
+ self
+ .cjs_tracker
+ .get_referrer_kind(&referrer_range.specifier),
+ mode,
+ )
+ }
+}
+
#[cfg(test)]
mod test {
use std::sync::Arc;