@@ -4,7 +4,7 @@ use super::IntoModuleCodeString;
44use super :: IntoModuleName ;
55use super :: ModuleConcreteError ;
66use super :: loaders:: ModuleLoadOptions ;
7- use super :: module_map_data:: ModuleMapSnapshotData ;
7+ use super :: module_map_data:: { ModuleMapSnapshotData , SymbolicModule } ;
88use super :: recursive_load:: SideModuleKind ;
99use crate :: FastStaticString ;
1010use crate :: JsRuntime ;
@@ -57,10 +57,11 @@ use super::LazyEsmModuleLoader;
5757use super :: RequestedModuleType ;
5858use super :: module_map_data:: ModuleMapData ;
5959use deno_core:: error:: CoreError ;
60- use std:: borrow:: Cow ;
60+ use std:: borrow:: { Borrow , Cow } ;
6161use std:: cell:: Cell ;
6262use std:: cell:: RefCell ;
6363use std:: collections:: HashMap ;
64+ use std:: hash:: Hash ;
6465use std:: ops:: DerefMut ;
6566use std:: pin:: Pin ;
6667use 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 > > {
0 commit comments