Skip to content

Commit 3946956

Browse files
authored
fix(lockfile): include dependencies listed in external import map in lockfile (#27337)
1 parent 32b57f7 commit 3946956

File tree

9 files changed

+105
-4
lines changed

9 files changed

+105
-4
lines changed

cli/args/deno_json.rs

+9
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,15 @@ impl<'a> deno_config::fs::DenoConfigFs for DenoConfigFsAdapter<'a> {
6464
}
6565
}
6666

67+
pub fn import_map_deps(
68+
import_map: &serde_json::Value,
69+
) -> HashSet<JsrDepPackageReq> {
70+
let values = imports_values(import_map.get("imports"))
71+
.into_iter()
72+
.chain(scope_values(import_map.get("scopes")));
73+
values_to_set(values)
74+
}
75+
6776
pub fn deno_json_deps(
6877
config: &deno_config::deno_json::ConfigFile,
6978
) -> HashSet<JsrDepPackageReq> {

cli/args/lockfile.rs

+8-1
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,13 @@ use deno_core::anyhow::Context;
99
use deno_core::error::AnyError;
1010
use deno_core::parking_lot::Mutex;
1111
use deno_core::parking_lot::MutexGuard;
12+
use deno_core::serde_json;
1213
use deno_lockfile::WorkspaceMemberConfig;
1314
use deno_package_json::PackageJsonDepValue;
1415
use deno_runtime::deno_node::PackageJson;
1516
use deno_semver::jsr::JsrDepPackageReq;
1617

18+
use crate::args::deno_json::import_map_deps;
1719
use crate::cache;
1820
use crate::util::fs::atomic_write_file_with_retries;
1921
use crate::Flags;
@@ -101,6 +103,7 @@ impl CliLockfile {
101103
pub fn discover(
102104
flags: &Flags,
103105
workspace: &Workspace,
106+
maybe_external_import_map: Option<&serde_json::Value>,
104107
) -> Result<Option<CliLockfile>, AnyError> {
105108
fn pkg_json_deps(
106109
maybe_pkg_json: Option<&PackageJson>,
@@ -171,7 +174,11 @@ impl CliLockfile {
171174
let config = deno_lockfile::WorkspaceConfig {
172175
root: WorkspaceMemberConfig {
173176
package_json_deps: pkg_json_deps(root_folder.pkg_json.as_deref()),
174-
dependencies: deno_json_deps(root_folder.deno_json.as_deref()),
177+
dependencies: if let Some(map) = maybe_external_import_map {
178+
import_map_deps(map)
179+
} else {
180+
deno_json_deps(root_folder.deno_json.as_deref())
181+
},
175182
},
176183
members: workspace
177184
.config_folders()

cli/args/mod.rs

+45-3
Original file line numberDiff line numberDiff line change
@@ -808,6 +808,7 @@ pub struct CliOptions {
808808
maybe_node_modules_folder: Option<PathBuf>,
809809
npmrc: Arc<ResolvedNpmRc>,
810810
maybe_lockfile: Option<Arc<CliLockfile>>,
811+
maybe_external_import_map: Option<(PathBuf, serde_json::Value)>,
811812
overrides: CliOptionOverrides,
812813
pub start_dir: Arc<WorkspaceDirectory>,
813814
pub deno_dir_provider: Arc<DenoDirProvider>,
@@ -821,6 +822,7 @@ impl CliOptions {
821822
npmrc: Arc<ResolvedNpmRc>,
822823
start_dir: Arc<WorkspaceDirectory>,
823824
force_global_cache: bool,
825+
maybe_external_import_map: Option<(PathBuf, serde_json::Value)>,
824826
) -> Result<Self, AnyError> {
825827
if let Some(insecure_allowlist) =
826828
flags.unsafely_ignore_certificate_errors.as_ref()
@@ -858,6 +860,7 @@ impl CliOptions {
858860
maybe_node_modules_folder,
859861
overrides: Default::default(),
860862
main_module_cell: std::sync::OnceLock::new(),
863+
maybe_external_import_map,
861864
start_dir,
862865
deno_dir_provider,
863866
})
@@ -933,7 +936,33 @@ impl CliOptions {
933936

934937
let (npmrc, _) = discover_npmrc_from_workspace(&start_dir.workspace)?;
935938

936-
let maybe_lock_file = CliLockfile::discover(&flags, &start_dir.workspace)?;
939+
fn load_external_import_map(
940+
deno_json: &ConfigFile,
941+
) -> Result<Option<(PathBuf, serde_json::Value)>, AnyError> {
942+
if !deno_json.is_an_import_map() {
943+
if let Some(path) = deno_json.to_import_map_path()? {
944+
let contents = std::fs::read_to_string(&path).with_context(|| {
945+
format!("Unable to read import map at '{}'", path.display())
946+
})?;
947+
let map = serde_json::from_str(&contents)?;
948+
return Ok(Some((path, map)));
949+
}
950+
}
951+
Ok(None)
952+
}
953+
954+
let external_import_map =
955+
if let Some(deno_json) = start_dir.workspace.root_deno_json() {
956+
load_external_import_map(deno_json)?
957+
} else {
958+
None
959+
};
960+
961+
let maybe_lock_file = CliLockfile::discover(
962+
&flags,
963+
&start_dir.workspace,
964+
external_import_map.as_ref().map(|(_, v)| v),
965+
)?;
937966

938967
log::debug!("Finished config loading.");
939968

@@ -944,6 +973,7 @@ impl CliOptions {
944973
npmrc,
945974
Arc::new(start_dir),
946975
false,
976+
external_import_map,
947977
)
948978
}
949979

@@ -1064,7 +1094,7 @@ impl CliOptions {
10641094
file_fetcher: &FileFetcher,
10651095
pkg_json_dep_resolution: PackageJsonDepResolution,
10661096
) -> Result<WorkspaceResolver, AnyError> {
1067-
let overrode_no_import_map = self
1097+
let overrode_no_import_map: bool = self
10681098
.overrides
10691099
.import_map_specifier
10701100
.as_ref()
@@ -1092,7 +1122,19 @@ impl CliOptions {
10921122
value,
10931123
})
10941124
}
1095-
None => None,
1125+
None => {
1126+
if let Some((path, import_map)) =
1127+
self.maybe_external_import_map.as_ref()
1128+
{
1129+
let path_url = deno_path_util::url_from_file_path(path)?;
1130+
Some(deno_config::workspace::SpecifiedImportMap {
1131+
base_url: path_url,
1132+
value: import_map.clone(),
1133+
})
1134+
} else {
1135+
None
1136+
}
1137+
}
10961138
}
10971139
};
10981140
Ok(self.workspace().create_resolver(

cli/lsp/language_server.rs

+1
Original file line numberDiff line numberDiff line change
@@ -3676,6 +3676,7 @@ impl Inner {
36763676
.unwrap_or_else(create_default_npmrc),
36773677
workspace,
36783678
force_global_cache,
3679+
None,
36793680
)?;
36803681

36813682
let open_docs = self.documents.documents(DocumentsFilter::OpenDiagnosable);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"tempDir": true,
3+
"steps": [{
4+
"args": "run -A main.ts",
5+
"output": "[WILDCARD]"
6+
}, {
7+
"args": ["eval", "console.log(Deno.readTextFileSync('deno.lock').trim())"],
8+
"output": "deno.lock.out"
9+
}]
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"importMap": "import_map.json"
3+
}

tests/specs/lockfile/external_import_map/deno.lock.out

+17
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"imports": {
3+
"@denotest/add": "jsr:@denotest/[email protected]"
4+
},
5+
"scopes": {
6+
"/foo/": {
7+
"@denotest/esm-basic": "npm:@denotest/[email protected]"
8+
}
9+
}
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
import { add } from "@denotest/add";
2+
console.log(add(1, 2));

0 commit comments

Comments
 (0)