33use super :: IntoModuleCodeString ;
44use super :: IntoModuleName ;
55use super :: ModuleConcreteError ;
6- use super :: module_map_data:: ModuleMapSnapshotData ;
6+ use super :: module_map_data:: { ModuleMapSnapshotData , SymbolicModule } ;
77use crate :: FastStaticString ;
88use crate :: JsRuntime ;
99use crate :: ModuleCodeBytes ;
@@ -49,10 +49,11 @@ use super::LazyEsmModuleLoader;
4949use super :: RequestedModuleType ;
5050use super :: module_map_data:: ModuleMapData ;
5151use deno_core:: error:: CoreError ;
52- use std:: borrow:: Cow ;
52+ use std:: borrow:: { Borrow , Cow } ;
5353use std:: cell:: Cell ;
5454use std:: cell:: RefCell ;
5555use std:: collections:: HashMap ;
56+ use std:: hash:: Hash ;
5657use std:: ops:: DerefMut ;
5758use std:: pin:: Pin ;
5859use 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 > > {
0 commit comments