summaryrefslogtreecommitdiff
path: root/cli/graph_util.rs
diff options
context:
space:
mode:
authorBartek IwaƄczuk <biwanczuk@gmail.com>2023-11-17 02:28:38 +0100
committerGitHub <noreply@github.com>2023-11-17 01:28:38 +0000
commit9534e6e1131542653c4e266f712c4067af2c8ec0 (patch)
tree1a74cccdcdb6bb12c10ab3e2a34d93fd8c4ccc55 /cli/graph_util.rs
parent544923afdc67e9946453901642746f37f22c8e24 (diff)
feat(unstable): Workspaces support (#20410)
This commit adds unstable workspace support. This is extremely bare-bones and minimal first-pass at this. With this change `deno.json` supports specifying `workspaces` key, that accepts a list of subdirectories. Each workspace can have its own import map. It's required to specify a `"name"` and `"version"` properties in the configuration file for the workspace: ```jsonc // deno.json { "workspaces": [ "a", "b" }, "imports": { "express": "npm:express@5" } } ``` ``` jsonc // a/deno.json { "name": "a", "version": "1.0.2", "imports": { "kleur": "npm:kleur" } } ``` ```jsonc // b/deno.json { "name": "b", "version": "0.51.0", "imports": { "chalk": "npm:chalk" } } ``` `--unstable-workspaces` flag is required to use this feature: ``` $ deno run --unstable-workspaces mod.ts ``` --------- Co-authored-by: David Sherret <dsherret@gmail.com>
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;