Skip to content

Commit b3ff912

Browse files
authored
fix: recurse use of object error (#45)
1 parent 8003eb6 commit b3ff912

File tree

2 files changed

+109
-80
lines changed

2 files changed

+109
-80
lines changed

src/mod.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ export class Loader implements Disposable {
225225
* entrypoints up front so the loader can create the npm and jsr graph, and then after use
226226
* synchronous resolution to resolve jsr and npm specifiers.
227227
*/
228-
resolve(
228+
async resolve(
229229
specifier: string,
230230
referrer: string | undefined,
231231
resolutionMode: ResolutionMode,
@@ -237,7 +237,7 @@ export class Loader implements Disposable {
237237
})`,
238238
);
239239
}
240-
const value = this.#inner.resolve(
240+
const value = await this.#inner.resolve(
241241
specifier,
242242
referrer,
243243
resolutionMode,

src/rs_lib/lib.rs

Lines changed: 107 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
mod http_client;
22

33
use std::borrow::Cow;
4+
use std::cell::RefCell;
45
use std::path::Path;
56
use std::path::PathBuf;
67
use 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
865894
struct CapturingModuleAnalyzerRef<'a> {
866895
parser: &'a dyn EsParser,

0 commit comments

Comments
 (0)