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

Commit 17df03f

Browse files
committed
feat: enhance ModuleMap
1 parent 4bd4cd3 commit 17df03f

5 files changed

Lines changed: 307 additions & 51 deletions

File tree

core/modules/map.rs

Lines changed: 104 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
use super::IntoModuleCodeString;
44
use super::IntoModuleName;
55
use super::ModuleConcreteError;
6-
use super::module_map_data::ModuleMapSnapshotData;
6+
use super::module_map_data::{ModuleMapSnapshotData, SymbolicModule};
77
use crate::FastStaticString;
88
use crate::JsRuntime;
99
use crate::ModuleCodeBytes;
@@ -49,10 +49,11 @@ use super::LazyEsmModuleLoader;
4949
use super::RequestedModuleType;
5050
use super::module_map_data::ModuleMapData;
5151
use deno_core::error::CoreError;
52-
use std::borrow::Cow;
52+
use std::borrow::{Borrow, Cow};
5353
use std::cell::Cell;
5454
use std::cell::RefCell;
5555
use std::collections::HashMap;
56+
use std::hash::Hash;
5657
use std::ops::DerefMut;
5758
use std::pin::Pin;
5859
use std::rc::Rc;
@@ -121,7 +122,7 @@ struct DynImportState {
121122
}
122123

123124
/// A collection of JS modules.
124-
pub(crate) struct ModuleMap {
125+
pub struct ModuleMap {
125126
// Handling of futures for loading module sources
126127
// TODO(mmastrac): we should not be swapping this loader out
127128
pub(crate) loader: RefCell<Rc<dyn ModuleLoader>>,
@@ -241,14 +242,93 @@ impl ModuleMap {
241242

242243
/// Get module id, following all aliases in case of module specifier
243244
/// that had been redirected.
244-
pub(crate) fn get_id(
245+
pub fn get_id<Q>(
245246
&self,
246-
name: &str,
247+
name: &Q,
247248
requested_module_type: impl AsRef<RequestedModuleType>,
248-
) -> Option<ModuleId> {
249+
) -> Option<ModuleId>
250+
where
251+
ModuleName: Borrow<Q>,
252+
Q: Eq + Hash + ?Sized,
253+
{
249254
self.data.borrow().get_id(name, requested_module_type)
250255
}
251256

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

260-
pub(crate) fn get_name_by_module(
340+
pub fn get_name_by_module(
261341
&self,
262342
global: &v8::Global<v8::Module>,
263343
) -> Option<String> {
264-
self.data.borrow().get_name_by_module(global)
344+
// todo(CyanChanges): do not clone here
345+
self
346+
.data
347+
.borrow()
348+
.get_name_by_module(global)
349+
.map(|name| name.as_str().to_owned())
265350
}
266351

267-
pub(crate) fn get_name_by_id(&self, id: ModuleId) -> Option<String> {
268-
self.data.borrow().get_name_by_id(id)
352+
pub fn get_name_by_id(&self, id: ModuleId) -> Option<String> {
353+
// todo(CyanChanges): do not clone here
354+
self
355+
.data
356+
.borrow()
357+
.get_name_by_id(id)
358+
.map(|name| name.as_str().to_owned())
269359
}
270360

271361
pub(crate) fn get_type_by_module(
@@ -304,7 +394,7 @@ impl ModuleMap {
304394
}
305395

306396
#[cfg(test)]
307-
pub fn assert_module_map(&self, modules: &Vec<super::ModuleInfo>) {
397+
pub(crate) fn assert_module_map(&self, modules: &Vec<super::ModuleInfo>) {
308398
self.data.borrow().assert_module_map(modules);
309399
}
310400

@@ -587,7 +677,7 @@ impl ModuleMap {
587677
if main {
588678
let data = self.data.borrow();
589679
if let Some(main_module) = data.main_module_id {
590-
let main_name = self.data.borrow().get_name_by_id(main_module).unwrap();
680+
let main_name = data.get_name_by_id(main_module).unwrap();
591681
return Err(ModuleError::Concrete(
592682
ModuleConcreteError::MainModuleAlreadyExists {
593683
main_module: main_name.to_string(),
@@ -866,6 +956,7 @@ impl ModuleMap {
866956
.data
867957
.borrow()
868958
.get_name_by_module(&referrer_global)
959+
.map(|name| name.as_str().to_string())
869960
.expect("ModuleInfo not found");
870961

871962
let specifier_str = specifier.to_rust_string_lossy(scope);
@@ -958,7 +1049,7 @@ impl ModuleMap {
9581049
None
9591050
}
9601051

961-
pub(crate) fn get_requested_modules(
1052+
pub fn get_requested_modules(
9621053
&self,
9631054
id: ModuleId,
9641055
) -> Option<Vec<ModuleRequest>> {

core/modules/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -613,7 +613,7 @@ impl std::fmt::Display for RequestedModuleType {
613613
/// import assertions explicitly constrains an import to JSON, in
614614
/// which case this will have a `RequestedModuleType::Json`.
615615
#[derive(Clone, Debug, Eq, Hash, PartialEq, Serialize, Deserialize)]
616-
pub(crate) struct ModuleRequest {
616+
pub struct ModuleRequest {
617617
pub specifier: ModuleSpecifier,
618618
pub requested_module_type: RequestedModuleType,
619619
}

0 commit comments

Comments
 (0)