Skip to content
This repository was archived by the owner on Apr 2, 2026. It is now read-only.

Commit 9ccb765

Browse files
committed
feat: enhance ModuleMap
1 parent df7767a commit 9ccb765

5 files changed

Lines changed: 329 additions & 52 deletions

File tree

core/modules/map.rs

Lines changed: 104 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use super::IntoModuleCodeString;
44
use super::IntoModuleName;
55
use super::ModuleConcreteError;
66
use super::loaders::ModuleLoadOptions;
7-
use super::module_map_data::ModuleMapSnapshotData;
7+
use super::module_map_data::{ModuleMapSnapshotData, SymbolicModule};
88
use super::recursive_load::SideModuleKind;
99
use crate::FastStaticString;
1010
use crate::JsRuntime;
@@ -57,10 +57,11 @@ use super::LazyEsmModuleLoader;
5757
use super::RequestedModuleType;
5858
use super::module_map_data::ModuleMapData;
5959
use deno_core::error::CoreError;
60-
use std::borrow::Cow;
60+
use std::borrow::{Borrow, Cow};
6161
use std::cell::Cell;
6262
use std::cell::RefCell;
6363
use std::collections::HashMap;
64+
use std::hash::Hash;
6465
use std::ops::DerefMut;
6566
use std::pin::Pin;
6667
use std::rc::Rc;
@@ -129,7 +130,7 @@ struct DynImportState {
129130
}
130131

131132
/// A collection of JS modules.
132-
pub(crate) struct ModuleMap {
133+
pub struct ModuleMap {
133134
// Handling of futures for loading module sources
134135
// TODO(mmastrac): we should not be swapping this loader out
135136
pub(crate) loader: RefCell<Rc<dyn ModuleLoader>>,
@@ -252,14 +253,93 @@ impl ModuleMap {
252253

253254
/// Get module id, following all aliases in case of module specifier
254255
/// that had been redirected.
255-
pub(crate) fn get_id(
256+
pub fn get_id<Q>(
256257
&self,
257-
name: &str,
258+
name: &Q,
258259
requested_module_type: impl AsRef<RequestedModuleType>,
259-
) -> Option<ModuleId> {
260+
) -> Option<ModuleId>
261+
where
262+
ModuleName: Borrow<Q>,
263+
Q: Eq + Hash + ?Sized,
264+
{
260265
self.data.borrow().get_id(name, requested_module_type)
261266
}
262267

268+
pub fn get<Q>(
269+
&self,
270+
name: &Q,
271+
requested_module_type: impl AsRef<RequestedModuleType>,
272+
) -> Option<SymbolicModule>
273+
where
274+
ModuleName: Borrow<Q>,
275+
Q: Eq + Hash + ?Sized,
276+
{
277+
self.data.borrow().get(name, requested_module_type).cloned()
278+
}
279+
280+
pub fn set(
281+
&self,
282+
name: ModuleName,
283+
symbolic_module: SymbolicModule,
284+
requested_module_type: RequestedModuleType,
285+
) -> Option<SymbolicModule> {
286+
self
287+
.data
288+
.borrow_mut()
289+
.set(name, symbolic_module, requested_module_type)
290+
}
291+
292+
// set so import(`name`) will be the namespace of Module with `id`
293+
pub fn set_id(
294+
&self,
295+
name: ModuleName,
296+
id: ModuleId,
297+
requested_module_type: RequestedModuleType,
298+
) -> Option<SymbolicModule> {
299+
self
300+
.data
301+
.borrow_mut()
302+
.set_id(name, id, requested_module_type)
303+
}
304+
305+
// drop so now import(`name`) will evaluate the module again
306+
pub fn delete<Q>(
307+
&self,
308+
name: &Q,
309+
requested_module_type: impl AsRef<RequestedModuleType>,
310+
) -> Option<SymbolicModule>
311+
where
312+
ModuleName: Borrow<Q>,
313+
Q: Eq + Hash + ?Sized,
314+
{
315+
self
316+
.data
317+
.borrow_mut()
318+
.delete(name, requested_module_type.as_ref())
319+
}
320+
321+
// alias so now import(`name`) will have the same result of import(`alias`)
322+
pub fn alias_id(
323+
&self,
324+
name: ModuleName,
325+
alias: ModuleName,
326+
requested_module_type: impl AsRef<RequestedModuleType>,
327+
) -> Option<SymbolicModule> {
328+
self
329+
.data
330+
.borrow_mut()
331+
.alias(name, requested_module_type.as_ref(), alias)
332+
}
333+
pub fn with_map(
334+
&self,
335+
requested_module_type: impl AsRef<RequestedModuleType>,
336+
f: impl FnOnce(Option<&HashMap<ModuleName, SymbolicModule>>),
337+
) {
338+
let data = self.data.borrow();
339+
let map = data.get_map(requested_module_type.as_ref());
340+
f(map);
341+
}
342+
263343
pub(crate) fn is_main_module(&self, global: &v8::Global<v8::Module>) -> bool {
264344
self.data.borrow().is_main_module(global)
265345
}
@@ -268,15 +348,25 @@ impl ModuleMap {
268348
self.data.borrow().main_module_id == Some(id)
269349
}
270350

271-
pub(crate) fn get_name_by_module(
351+
pub fn get_name_by_module(
272352
&self,
273353
global: &v8::Global<v8::Module>,
274354
) -> Option<String> {
275-
self.data.borrow().get_name_by_module(global)
355+
// todo(CyanChanges): do not clone here
356+
self
357+
.data
358+
.borrow()
359+
.get_name_by_module(global)
360+
.map(|name| name.as_str().to_owned())
276361
}
277362

278-
pub(crate) fn get_name_by_id(&self, id: ModuleId) -> Option<String> {
279-
self.data.borrow().get_name_by_id(id)
363+
pub fn get_name_by_id(&self, id: ModuleId) -> Option<String> {
364+
// todo(CyanChanges): do not clone here
365+
self
366+
.data
367+
.borrow()
368+
.get_name_by_id(id)
369+
.map(|name| name.as_str().to_owned())
280370
}
281371

282372
pub(crate) fn get_type_by_module(
@@ -315,7 +405,7 @@ impl ModuleMap {
315405
}
316406

317407
#[cfg(test)]
318-
pub fn assert_module_map(&self, modules: &Vec<super::ModuleInfo>) {
408+
pub(crate) fn assert_module_map(&self, modules: &Vec<super::ModuleInfo>) {
319409
self.data.borrow().assert_module_map(modules);
320410
}
321411

@@ -612,7 +702,7 @@ impl ModuleMap {
612702
if main {
613703
let data = self.data.borrow();
614704
if let Some(main_module) = data.main_module_id {
615-
let main_name = self.data.borrow().get_name_by_id(main_module).unwrap();
705+
let main_name = data.get_name_by_id(main_module).unwrap();
616706
return Err(ModuleError::Concrete(
617707
ModuleConcreteError::MainModuleAlreadyExists {
618708
main_module: main_name.to_string(),
@@ -1001,6 +1091,7 @@ impl ModuleMap {
10011091
.data
10021092
.borrow()
10031093
.get_name_by_module(&referrer_global)
1094+
.map(|name| name.as_str().to_string())
10041095
.expect("ModuleInfo not found");
10051096

10061097
let specifier_str = specifier.to_rust_string_lossy(scope);
@@ -1114,7 +1205,7 @@ impl ModuleMap {
11141205
None
11151206
}
11161207

1117-
pub(crate) fn get_requested_modules(
1208+
pub fn get_requested_modules(
11181209
&self,
11191210
id: ModuleId,
11201211
) -> Option<Vec<ModuleRequest>> {

core/modules/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -676,7 +676,7 @@ impl std::fmt::Display for RequestedModuleType {
676676
/// import assertions explicitly constrains an import to JSON, in
677677
/// which case this will have a `RequestedModuleType::Json`.
678678
#[derive(Clone, Debug, Eq, Hash, PartialEq, Serialize, Deserialize)]
679-
pub(crate) struct ModuleReference {
679+
pub struct ModuleReference {
680680
pub specifier: ModuleSpecifier,
681681
pub requested_module_type: RequestedModuleType,
682682
}
@@ -686,7 +686,7 @@ pub(crate) struct ModuleReference {
686686
/// import assertions explicitly constrains an import to JSON, in
687687
/// which case this will have a `RequestedModuleType::Json`.
688688
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
689-
pub(crate) struct ModuleRequest {
689+
pub struct ModuleRequest {
690690
pub reference: ModuleReference,
691691
/// None if this is a root request.
692692
pub referrer_source_offset: Option<i32>,

0 commit comments

Comments
 (0)