Skip to content

Commit 09280d4

Browse files
authored
fix: diagnostic for imports and scopes in member when root has import map (#157)
For denoland/deno#28110
1 parent 8e25dd1 commit 09280d4

File tree

1 file changed

+43
-1
lines changed

1 file changed

+43
-1
lines changed

src/workspace/mod.rs

+43-1
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,8 @@ pub enum WorkspaceDiagnosticKind {
136136
MissingExports,
137137
#[error("\"importMap\" field is ignored when \"imports\" or \"scopes\" are specified in the config file.")]
138138
ImportMapReferencingImportMap,
139+
#[error("\"imports\" and \"scopes\" field is ignored when \"importMap\" is specified in the root config file.")]
140+
MemberImportsScopesIgnored,
139141
#[error("Patching npm packages ({package_json_url}) is not implemented.")]
140142
NpmPatchNotImplemented { package_json_url: Url },
141143
#[error("`\"nodeModulesDir\": {previous}` is deprecated in Deno 2.0. Use `\"nodeModulesDir\": \"{suggestion}\"` instead")]
@@ -630,13 +632,27 @@ impl Workspace {
630632
pub fn diagnostics(&self) -> Vec<WorkspaceDiagnostic> {
631633
fn check_member_diagnostics(
632634
member_config: &ConfigFile,
635+
root_config: Option<&ConfigFile>,
633636
diagnostics: &mut Vec<WorkspaceDiagnostic>,
634637
) {
635638
if member_config.json.import_map.is_some() {
636639
diagnostics.push(WorkspaceDiagnostic {
637640
config_url: member_config.specifier.clone(),
638641
kind: WorkspaceDiagnosticKind::RootOnlyOption("importMap"),
639642
});
643+
} else if member_config.is_an_import_map()
644+
&& root_config
645+
.map(|c| {
646+
c.json.import_map.is_some()
647+
&& c.json.imports.is_none()
648+
&& c.json.scopes.is_none()
649+
})
650+
.unwrap_or(false)
651+
{
652+
diagnostics.push(WorkspaceDiagnostic {
653+
config_url: member_config.specifier.clone(),
654+
kind: WorkspaceDiagnosticKind::MemberImportsScopesIgnored,
655+
});
640656
}
641657
if member_config.json.lock.is_some() {
642658
diagnostics.push(WorkspaceDiagnostic {
@@ -746,7 +762,11 @@ impl Workspace {
746762
if let Some(config) = &folder.deno_json {
747763
let is_root = url == &self.root_dir;
748764
if !is_root {
749-
check_member_diagnostics(config, &mut diagnostics);
765+
check_member_diagnostics(
766+
config,
767+
self.root_deno_json().map(|r| r.as_ref()),
768+
&mut diagnostics,
769+
);
750770
}
751771

752772
check_all_configs(config, &mut diagnostics);
@@ -2750,6 +2770,28 @@ pub mod test {
27502770
);
27512771
}
27522772

2773+
#[test]
2774+
fn test_root_import_map_with_member_imports_and_scopes() {
2775+
let workspace_dir = workspace_for_root_and_member(
2776+
json!({
2777+
"importMap": "./other.json"
2778+
}),
2779+
json!({
2780+
"imports": {
2781+
"@scope/pkg": "jsr:@scope/pkg@3"
2782+
}
2783+
}),
2784+
);
2785+
assert_eq!(
2786+
workspace_dir.workspace.diagnostics(),
2787+
vec![WorkspaceDiagnostic {
2788+
kind: WorkspaceDiagnosticKind::MemberImportsScopesIgnored,
2789+
config_url: Url::from_file_path(root_dir().join("member/deno.json"))
2790+
.unwrap(),
2791+
}]
2792+
);
2793+
}
2794+
27532795
#[test]
27542796
fn test_root_member_exclude() {
27552797
let workspace_dir = workspace_for_root_and_member(

0 commit comments

Comments
 (0)