From 0e60bb9cf701fea3864403e6851abad86bc0b65d Mon Sep 17 00:00:00 2001 From: Marvin Hagemeister Date: Fri, 18 Oct 2024 21:45:05 +0200 Subject: [PATCH] fix(info): resolve workspace member mappings (#26350) This PR fixes the issue where mapped specifiers in a workspace member would never be found. Only mapped paths from the workspace root would resolve. This was caused by always passing the workspace root url to the import map resolver instead of the workspace member one. Fixes https://github.com/denoland/deno/issues/26138 Fixes https://github.com/denoland/fresh/issues/2615 --------- Signed-off-by: Marvin Hagemeister Co-authored-by: David Sherret --- cli/tools/info.rs | 23 +++++++++++-------- tests/specs/info/import_map/__test__.jsonc | 10 +++++--- .../info/workspace_member/__test__.jsonc | 16 +++++++++++++ tests/specs/info/workspace_member/deno.json | 3 +++ .../info_workspace_member.out | 6 +++++ .../info_workspace_member_sub.out | 6 +++++ .../info/workspace_member/member/deno.json | 5 ++++ .../info/workspace_member/member/sub/file.ts | 1 + 8 files changed, 57 insertions(+), 13 deletions(-) create mode 100644 tests/specs/info/workspace_member/__test__.jsonc create mode 100644 tests/specs/info/workspace_member/deno.json create mode 100644 tests/specs/info/workspace_member/info_workspace_member.out create mode 100644 tests/specs/info/workspace_member/info_workspace_member_sub.out create mode 100644 tests/specs/info/workspace_member/member/deno.json create mode 100644 tests/specs/info/workspace_member/member/sub/file.ts diff --git a/cli/tools/info.rs b/cli/tools/info.rs index 7f8d68ae1c..3febaff579 100644 --- a/cli/tools/info.rs +++ b/cli/tools/info.rs @@ -11,6 +11,7 @@ use deno_core::anyhow::bail; use deno_core::error::AnyError; use deno_core::resolve_url_or_path; use deno_core::serde_json; +use deno_core::url; use deno_graph::Dependency; use deno_graph::GraphKind; use deno_graph::Module; @@ -51,18 +52,20 @@ pub async fn info( let npmrc = cli_options.npmrc(); let resolver = factory.workspace_resolver().await?; - let maybe_import_specifier = - if let Some(import_map) = resolver.maybe_import_map() { - if let Ok(imports_specifier) = - import_map.resolve(&specifier, import_map.base_url()) - { - Some(imports_specifier) - } else { - None - } + let cwd_url = + url::Url::from_directory_path(cli_options.initial_cwd()).unwrap(); + + let maybe_import_specifier = if let Some(import_map) = + resolver.maybe_import_map() + { + if let Ok(imports_specifier) = import_map.resolve(&specifier, &cwd_url) { + Some(imports_specifier) } else { None - }; + } + } else { + None + }; let specifier = match maybe_import_specifier { Some(specifier) => specifier, diff --git a/tests/specs/info/import_map/__test__.jsonc b/tests/specs/info/import_map/__test__.jsonc index 725276925e..7aba603e0b 100644 --- a/tests/specs/info/import_map/__test__.jsonc +++ b/tests/specs/info/import_map/__test__.jsonc @@ -1,5 +1,9 @@ { - "args": "info preact/debug", - "output": "with_import_map.out", - "exitCode": 0 + "steps": [ + { + "args": "info preact/debug", + "output": "with_import_map.out", + "exitCode": 0 + } + ] } diff --git a/tests/specs/info/workspace_member/__test__.jsonc b/tests/specs/info/workspace_member/__test__.jsonc new file mode 100644 index 0000000000..d13d3b03e8 --- /dev/null +++ b/tests/specs/info/workspace_member/__test__.jsonc @@ -0,0 +1,16 @@ +{ + "tests": { + "member_folder": { + "args": "info --quiet foo", + "cwd": "member", + "output": "info_workspace_member.out", + "exitCode": 0 + }, + "member_folder_sub": { + "args": "info --quiet foo", + "cwd": "member/sub", + "output": "info_workspace_member_sub.out", + "exitCode": 0 + } + } +} diff --git a/tests/specs/info/workspace_member/deno.json b/tests/specs/info/workspace_member/deno.json new file mode 100644 index 0000000000..f88028aeab --- /dev/null +++ b/tests/specs/info/workspace_member/deno.json @@ -0,0 +1,3 @@ +{ + "workspace": ["./member"] +} diff --git a/tests/specs/info/workspace_member/info_workspace_member.out b/tests/specs/info/workspace_member/info_workspace_member.out new file mode 100644 index 0000000000..e0dc0b6753 --- /dev/null +++ b/tests/specs/info/workspace_member/info_workspace_member.out @@ -0,0 +1,6 @@ +local: [WILDCARD]file.ts +type: TypeScript +dependencies: 0 unique +size: [WILDCARD] + +file://[WILDCARD]/member/sub/file.ts ([WILDCARD]) diff --git a/tests/specs/info/workspace_member/info_workspace_member_sub.out b/tests/specs/info/workspace_member/info_workspace_member_sub.out new file mode 100644 index 0000000000..e0dc0b6753 --- /dev/null +++ b/tests/specs/info/workspace_member/info_workspace_member_sub.out @@ -0,0 +1,6 @@ +local: [WILDCARD]file.ts +type: TypeScript +dependencies: 0 unique +size: [WILDCARD] + +file://[WILDCARD]/member/sub/file.ts ([WILDCARD]) diff --git a/tests/specs/info/workspace_member/member/deno.json b/tests/specs/info/workspace_member/member/deno.json new file mode 100644 index 0000000000..66aac29046 --- /dev/null +++ b/tests/specs/info/workspace_member/member/deno.json @@ -0,0 +1,5 @@ +{ + "imports": { + "foo": "./sub/file.ts" + } +} diff --git a/tests/specs/info/workspace_member/member/sub/file.ts b/tests/specs/info/workspace_member/member/sub/file.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/tests/specs/info/workspace_member/member/sub/file.ts @@ -0,0 +1 @@ +export {};