11mod http_client;
22
33use std:: borrow:: Cow ;
4+ use std:: cell:: RefCell ;
45use std:: path:: Path ;
56use std:: path:: PathBuf ;
67use std:: rc:: Rc ;
@@ -319,7 +320,9 @@ impl DenoWorkspace {
319320 parsed_source_cache : self . resolver_factory . parsed_source_cache ( ) . clone ( ) ,
320321 module_loader : self . resolver_factory . module_loader ( ) ?. clone ( ) ,
321322 task_queue : Default :: default ( ) ,
322- graph : deno_graph:: ModuleGraph :: new ( deno_graph:: GraphKind :: CodeOnly ) ,
323+ graph : ModuleGraphCell :: new ( deno_graph:: ModuleGraph :: new (
324+ deno_graph:: GraphKind :: CodeOnly ,
325+ ) ) ,
323326 } )
324327 }
325328}
@@ -338,7 +341,7 @@ pub struct DenoLoader {
338341 module_loader : Arc < ModuleLoader < RealSys > > ,
339342 resolver_factory : Arc < ResolverFactory < RealSys > > ,
340343 workspace_factory : Arc < WorkspaceFactory < RealSys > > ,
341- graph : ModuleGraph ,
344+ graph : ModuleGraphCell ,
342345 task_queue : Rc < deno_unsync:: TaskQueue > ,
343346}
344347
@@ -353,27 +356,21 @@ impl DenoLoader {
353356 pub fn get_graph ( & self ) -> JsValue {
354357 let serializer =
355358 serde_wasm_bindgen:: Serializer :: new ( ) . serialize_maps_as_objects ( true ) ;
356- self . graph . serialize ( & serializer) . unwrap ( )
359+ self . graph . get ( ) . serialize ( & serializer) . unwrap ( )
357360 }
358361
359362 pub async fn add_entrypoints (
360- & mut self ,
363+ & self ,
361364 entrypoints : Vec < String > ,
362365 ) -> Result < Vec < String > , JsValue > {
363- // only allow one async task to modify the graph at a time
364- let task_queue = self . task_queue . clone ( ) ;
365- task_queue
366- . run ( async {
367- self
368- . add_entrypoints_internal ( entrypoints)
369- . await
370- . map_err ( create_js_error)
371- } )
366+ self
367+ . add_entrypoints_internal ( entrypoints)
372368 . await
369+ . map_err ( create_js_error)
373370 }
374371
375372 async fn add_entrypoints_internal (
376- & mut self ,
373+ & self ,
377374 entrypoints : Vec < String > ,
378375 ) -> Result < Vec < String > , anyhow:: Error > {
379376 let urls = entrypoints
@@ -388,6 +385,7 @@ impl DenoLoader {
388385 self . add_entrypoint_urls ( urls. clone ( ) ) . await ?;
389386 let errors = self
390387 . graph
388+ . get ( )
391389 . walk (
392390 urls. iter ( ) ,
393391 WalkOptions {
@@ -404,67 +402,74 @@ impl DenoLoader {
404402 }
405403
406404 async fn add_entrypoint_urls (
407- & mut self ,
405+ & self ,
408406 entrypoints : Vec < Url > ,
409407 ) -> Result < ( ) , anyhow:: Error > {
410- let npm_package_info_provider = self
411- . npm_installer_factory
412- . lockfile_npm_package_info_provider ( ) ?;
413- let lockfile = self
414- . workspace_factory
415- . maybe_lockfile ( npm_package_info_provider)
416- . await ?;
417- let jsx_config =
418- JsxImportSourceConfigResolver :: from_compiler_options_resolver (
419- & self . compiler_options_resolver ,
420- ) ?;
421-
422- let graph_resolver = self
423- . resolver
424- . as_graph_resolver ( & self . cjs_tracker , & jsx_config) ;
425- let loader = DenoGraphLoader :: new (
426- self . file_fetcher . clone ( ) ,
427- self . workspace_factory . global_http_cache ( ) ?. clone ( ) ,
428- self . resolver_factory . in_npm_package_checker ( ) ?. clone ( ) ,
429- self . workspace_factory . sys ( ) . clone ( ) ,
430- DenoGraphLoaderOptions {
431- file_header_overrides : Default :: default ( ) ,
432- permissions : None ,
433- } ,
434- ) ;
435-
436- let mut locker = lockfile. as_ref ( ) . map ( |l| l. as_deno_graph_locker ( ) ) ;
437- let npm_resolver =
438- self . npm_installer_factory . npm_deno_graph_resolver ( ) . await ?;
439- let module_analyzer = CapturingModuleAnalyzerRef {
440- store : self . parsed_source_cache . as_ref ( ) ,
441- parser : & DefaultEsParser ,
442- } ;
443- self
444- . graph
445- . build (
446- entrypoints,
447- Vec :: new ( ) ,
448- & loader,
449- deno_graph:: BuildOptions {
450- is_dynamic : false ,
451- skip_dynamic_deps : false ,
452- module_info_cacher : Default :: default ( ) ,
453- executor : Default :: default ( ) ,
454- locker : locker. as_mut ( ) . map ( |l| l as _ ) ,
455- file_system : self . workspace_factory . sys ( ) ,
456- jsr_url_provider : Default :: default ( ) ,
457- passthrough_jsr_specifiers : false ,
458- module_analyzer : & module_analyzer,
459- npm_resolver : Some ( npm_resolver. as_ref ( ) ) ,
460- reporter : None ,
461- resolver : Some ( & graph_resolver) ,
462- unstable_bytes_imports : true ,
463- unstable_text_imports : true ,
464- } ,
465- )
466- . await ;
467- Ok ( ( ) )
408+ // only allow one async task to modify the graph at a time
409+ let task_queue = self . task_queue . clone ( ) ;
410+ task_queue
411+ . run ( async {
412+ let npm_package_info_provider = self
413+ . npm_installer_factory
414+ . lockfile_npm_package_info_provider ( ) ?;
415+ let lockfile = self
416+ . workspace_factory
417+ . maybe_lockfile ( npm_package_info_provider)
418+ . await ?;
419+ let jsx_config =
420+ JsxImportSourceConfigResolver :: from_compiler_options_resolver (
421+ & self . compiler_options_resolver ,
422+ ) ?;
423+
424+ let graph_resolver = self
425+ . resolver
426+ . as_graph_resolver ( & self . cjs_tracker , & jsx_config) ;
427+ let loader = DenoGraphLoader :: new (
428+ self . file_fetcher . clone ( ) ,
429+ self . workspace_factory . global_http_cache ( ) ?. clone ( ) ,
430+ self . resolver_factory . in_npm_package_checker ( ) ?. clone ( ) ,
431+ self . workspace_factory . sys ( ) . clone ( ) ,
432+ DenoGraphLoaderOptions {
433+ file_header_overrides : Default :: default ( ) ,
434+ permissions : None ,
435+ } ,
436+ ) ;
437+
438+ let mut locker = lockfile. as_ref ( ) . map ( |l| l. as_deno_graph_locker ( ) ) ;
439+ let npm_resolver =
440+ self . npm_installer_factory . npm_deno_graph_resolver ( ) . await ?;
441+ let module_analyzer = CapturingModuleAnalyzerRef {
442+ store : self . parsed_source_cache . as_ref ( ) ,
443+ parser : & DefaultEsParser ,
444+ } ;
445+ let mut graph = self . graph . deep_clone ( ) ;
446+ graph
447+ . build (
448+ entrypoints,
449+ Vec :: new ( ) ,
450+ & loader,
451+ deno_graph:: BuildOptions {
452+ is_dynamic : false ,
453+ skip_dynamic_deps : false ,
454+ module_info_cacher : Default :: default ( ) ,
455+ executor : Default :: default ( ) ,
456+ locker : locker. as_mut ( ) . map ( |l| l as _ ) ,
457+ file_system : self . workspace_factory . sys ( ) ,
458+ jsr_url_provider : Default :: default ( ) ,
459+ passthrough_jsr_specifiers : false ,
460+ module_analyzer : & module_analyzer,
461+ npm_resolver : Some ( npm_resolver. as_ref ( ) ) ,
462+ reporter : None ,
463+ resolver : Some ( & graph_resolver) ,
464+ unstable_bytes_imports : true ,
465+ unstable_text_imports : true ,
466+ } ,
467+ )
468+ . await ;
469+ self . graph . set ( Rc :: new ( graph) ) ;
470+ Ok ( ( ) )
471+ } )
472+ . await
468473 }
469474
470475 pub fn resolve_sync (
@@ -494,7 +499,7 @@ impl DenoLoader {
494499 resolution_mode,
495500 ) ?;
496501 let resolved = self . resolver . resolve_with_graph (
497- & self . graph ,
502+ & self . graph . get ( ) ,
498503 & specifier,
499504 & referrer,
500505 deno_graph:: Position :: zeroed ( ) ,
@@ -508,7 +513,7 @@ impl DenoLoader {
508513 }
509514
510515 pub async fn resolve (
511- & mut self ,
516+ & self ,
512517 specifier : String ,
513518 importer : Option < String > ,
514519 resolution_mode : u8 ,
@@ -524,7 +529,7 @@ impl DenoLoader {
524529 }
525530
526531 async fn resolve_inner (
527- & mut self ,
532+ & self ,
528533 specifier : & str ,
529534 importer : Option < String > ,
530535 resolution_mode : node_resolver:: ResolutionMode ,
@@ -535,7 +540,7 @@ impl DenoLoader {
535540 resolution_mode,
536541 ) ?;
537542 let resolved = self . resolver . resolve_with_graph (
538- & self . graph ,
543+ & self . graph . get ( ) ,
539544 & specifier,
540545 & referrer,
541546 deno_graph:: Position :: zeroed ( ) ,
@@ -633,7 +638,7 @@ impl DenoLoader {
633638
634639 match self
635640 . module_loader
636- . load ( & self . graph , & url, None , requested_module_type)
641+ . load ( & self . graph . get ( ) , & url, None , requested_module_type)
637642 . await
638643 {
639644 Ok ( LoadedModuleOrAsset :: Module ( m) ) => {
@@ -861,6 +866,30 @@ fn npm_system_info() -> Result<NpmSystemInfo, anyhow::Error> {
861866 } )
862867}
863868
869+ struct ModuleGraphCell {
870+ graph : RefCell < Rc < ModuleGraph > > ,
871+ }
872+
873+ impl ModuleGraphCell {
874+ pub fn new ( graph : ModuleGraph ) -> Self {
875+ Self {
876+ graph : RefCell :: new ( Rc :: new ( graph) ) ,
877+ }
878+ }
879+
880+ pub fn deep_clone ( & self ) -> ModuleGraph {
881+ self . graph . borrow ( ) . as_ref ( ) . clone ( )
882+ }
883+
884+ pub fn get ( & self ) -> Rc < ModuleGraph > {
885+ self . graph . borrow ( ) . clone ( )
886+ }
887+
888+ pub fn set ( & self , graph : Rc < ModuleGraph > ) {
889+ * self . graph . borrow_mut ( ) = graph;
890+ }
891+ }
892+
864893// todo(dsherret): shift this down into deno_graph
865894struct CapturingModuleAnalyzerRef < ' a > {
866895 parser : & ' a dyn EsParser ,
0 commit comments