diff options
author | Bartek IwaĆczuk <biwanczuk@gmail.com> | 2023-11-17 02:28:38 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-11-17 01:28:38 +0000 |
commit | 9534e6e1131542653c4e266f712c4067af2c8ec0 (patch) | |
tree | 1a74cccdcdb6bb12c10ab3e2a34d93fd8c4ccc55 /cli/graph_util.rs | |
parent | 544923afdc67e9946453901642746f37f22c8e24 (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.rs | 59 |
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; |