mirror of
https://github.com/denoland/deno.git
synced 2024-12-22 15:24:46 -05:00
feat(core): Add FsModuleLoader that supports loading from filesystem (#8523)
This commit adds `FsModuleLoader` to `deno_core`, which implements `ModuleLoader` trait. It is used when creating a runtime that supports module loading from filesystem. Co-authored-by: Bartek Iwańczuk <biwanczuk@gmail.com>
This commit is contained in:
parent
a16adca06b
commit
b8d3caa5d5
2 changed files with 46 additions and 0 deletions
|
@ -37,6 +37,7 @@ pub use crate::async_cell::RcRef;
|
|||
pub use crate::flags::v8_set_flags;
|
||||
pub use crate::module_specifier::ModuleResolutionError;
|
||||
pub use crate::module_specifier::ModuleSpecifier;
|
||||
pub use crate::modules::FsModuleLoader;
|
||||
pub use crate::modules::ModuleId;
|
||||
pub use crate::modules::ModuleLoadId;
|
||||
pub use crate::modules::ModuleLoader;
|
||||
|
|
|
@ -130,6 +130,51 @@ impl ModuleLoader for NoopModuleLoader {
|
|||
}
|
||||
}
|
||||
|
||||
/// Basic file system module loader.
|
||||
///
|
||||
/// Note that this loader will **block** event loop
|
||||
/// when loading file as it uses synchronous FS API
|
||||
/// from standard library.
|
||||
pub struct FsModuleLoader;
|
||||
|
||||
impl ModuleLoader for FsModuleLoader {
|
||||
fn resolve(
|
||||
&self,
|
||||
_op_state: Rc<RefCell<OpState>>,
|
||||
specifier: &str,
|
||||
referrer: &str,
|
||||
_is_main: bool,
|
||||
) -> Result<ModuleSpecifier, AnyError> {
|
||||
Ok(ModuleSpecifier::resolve_import(specifier, referrer)?)
|
||||
}
|
||||
|
||||
fn load(
|
||||
&self,
|
||||
_op_state: Rc<RefCell<OpState>>,
|
||||
module_specifier: &ModuleSpecifier,
|
||||
_maybe_referrer: Option<ModuleSpecifier>,
|
||||
_is_dynamic: bool,
|
||||
) -> Pin<Box<ModuleSourceFuture>> {
|
||||
let module_specifier = module_specifier.clone();
|
||||
async move {
|
||||
let path = module_specifier.as_url().to_file_path().map_err(|_| {
|
||||
generic_error(format!(
|
||||
"Provided module specifier \"{}\" is not a file URL.",
|
||||
module_specifier
|
||||
))
|
||||
})?;
|
||||
let code = std::fs::read_to_string(path)?;
|
||||
let module = ModuleSource {
|
||||
code,
|
||||
module_url_specified: module_specifier.to_string(),
|
||||
module_url_found: module_specifier.to_string(),
|
||||
};
|
||||
Ok(module)
|
||||
}
|
||||
.boxed_local()
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Eq, PartialEq)]
|
||||
enum Kind {
|
||||
Main,
|
||||
|
|
Loading…
Reference in a new issue