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.rs59
1 files changed, 55 insertions, 4 deletions
diff --git a/cli/graph_util.rs b/cli/graph_util.rs
index f2713a9db..727037748 100644
--- a/cli/graph_util.rs
+++ b/cli/graph_util.rs
@@ -19,6 +19,7 @@ use crate::util::sync::TaskQueue;
use crate::util::sync::TaskQueuePermit;
use deno_core::anyhow::bail;
+use deno_core::anyhow::Context;
use deno_core::error::custom_error;
use deno_core::error::AnyError;
use deno_core::parking_lot::Mutex;
@@ -269,6 +270,12 @@ impl ModuleGraphBuilder {
options: CreateGraphOptions<'_>,
) -> Result<deno_graph::ModuleGraph, AnyError> {
let maybe_imports = self.options.to_maybe_imports()?;
+ let maybe_workspace_config = self.options.maybe_workspace_config();
+ let workspace_members = if let Some(wc) = maybe_workspace_config {
+ workspace_config_to_workspace_members(wc)?
+ } else {
+ vec![]
+ };
let cli_resolver = self.resolver.clone();
let graph_resolver = cli_resolver.as_graph_resolver();
@@ -291,8 +298,7 @@ impl ModuleGraphBuilder {
npm_resolver: Some(graph_npm_resolver),
module_analyzer: Some(options.analyzer),
reporter: maybe_file_watcher_reporter,
- // todo(dsherret): workspace support
- workspace_members: vec![],
+ workspace_members,
},
)
.await?;
@@ -312,6 +318,12 @@ impl ModuleGraphBuilder {
) -> Result<Arc<deno_graph::ModuleGraph>, AnyError> {
let mut cache = self.create_graph_loader();
let maybe_imports = self.options.to_maybe_imports()?;
+ let maybe_workspace_config = self.options.maybe_workspace_config();
+ let workspace_members = if let Some(wc) = maybe_workspace_config {
+ workspace_config_to_workspace_members(wc)?
+ } else {
+ vec![]
+ };
let cli_resolver = self.resolver.clone();
let graph_resolver = cli_resolver.as_graph_resolver();
let graph_npm_resolver = cli_resolver.as_graph_npm_resolver();
@@ -336,8 +348,7 @@ impl ModuleGraphBuilder {
npm_resolver: Some(graph_npm_resolver),
module_analyzer: Some(&analyzer),
reporter: maybe_file_watcher_reporter,
- // todo(dsherret): workspace support
- workspace_members: vec![],
+ workspace_members,
},
)
.await?;
@@ -719,6 +730,46 @@ impl deno_graph::source::Reporter for FileWatcherReporter {
}
}
+pub fn workspace_config_to_workspace_members(
+ workspace_config: &deno_config::WorkspaceConfig,
+) -> Result<Vec<deno_graph::WorkspaceMember>, AnyError> {
+ workspace_config
+ .members
+ .iter()
+ .map(|member| {
+ workspace_member_config_try_into_workspace_member(member).with_context(
+ || {
+ format!(
+ "Failed to resolve configuration for '{}' workspace member at '{}'",
+ member.member_name,
+ member.config_file.specifier.as_str()
+ )
+ },
+ )
+ })
+ .collect()
+}
+
+fn workspace_member_config_try_into_workspace_member(
+ config: &deno_config::WorkspaceMemberConfig,
+) -> Result<deno_graph::WorkspaceMember, AnyError> {
+ let nv = deno_semver::package::PackageNv {
+ name: config.package_name.clone(),
+ version: deno_semver::Version::parse_standard(&config.package_version)?,
+ };
+ Ok(deno_graph::WorkspaceMember {
+ base: ModuleSpecifier::from_directory_path(&config.path).unwrap(),
+ nv,
+ exports: config
+ .config_file
+ .to_exports_config()?
+ .into_map()
+ // todo(dsherret): deno_graph should use an IndexMap
+ .into_iter()
+ .collect(),
+ })
+}
+
#[cfg(test)]
mod test {
use std::sync::Arc;