use crate::js::module::es_module::*;
use crate::js::module::{ModulePath, ModuleStatus};
use crate::prelude::*;
use std::cell::RefCell;
use std::collections::LinkedList;
#[derive(Debug, Clone)]
pub enum ImportKind {
Static,
Dynamic(v8::Global<v8::PromiseResolver>),
}
#[derive(Debug)]
pub struct ModuleGraph {
kind: ImportKind,
root_rc: EsModuleRc,
same_origin: LinkedList<v8::Global<v8::PromiseResolver>>,
}
rc_refcell_ptr!(ModuleGraph);
impl ModuleGraph {
pub fn kind(&self) -> &ImportKind {
&self.kind
}
pub fn root_rc(&self) -> EsModuleRc {
self.root_rc.clone()
}
pub fn same_origin(&self) -> &LinkedList<v8::Global<v8::PromiseResolver>> {
&self.same_origin
}
}
impl ModuleGraph {
pub fn static_import(path: &str) -> ModuleGraph {
let module = EsModule::to_rc(EsModule::new(
path.into(),
ModuleStatus::Fetching,
vec![],
None,
false,
));
Self {
kind: ImportKind::Static,
root_rc: module,
same_origin: LinkedList::new(),
}
}
pub fn dynamic_import(
path: &str,
promise: v8::Global<v8::PromiseResolver>,
) -> ModuleGraph {
let module = EsModule::to_rc(EsModule::new(
path.into(),
ModuleStatus::Fetching,
vec![],
None,
true,
));
Self {
kind: ImportKind::Dynamic(promise),
root_rc: module,
same_origin: LinkedList::new(),
}
}
}
pub struct ModuleMap {
main: Option<ModulePath>,
index: HashMap<ModulePath, v8::Global<v8::Module>>,
seen: RefCell<HashMap<ModulePath, ModuleStatus>>,
pending: RefCell<Vec<ModuleGraphRc>>,
}
impl ModuleMap {
pub fn main(&self) -> &Option<ModulePath> {
&self.main
}
pub fn index(&self) -> &HashMap<ModulePath, v8::Global<v8::Module>> {
&self.index
}
pub fn seen(&self) -> &RefCell<HashMap<ModulePath, ModuleStatus>> {
&self.seen
}
pub fn pending(&self) -> &RefCell<Vec<ModuleGraphRc>> {
&self.pending
}
}
impl ModuleMap {
pub fn new() -> ModuleMap {
Self {
main: None,
index: HashMap::new(),
seen: RefCell::new(HashMap::new()),
pending: RefCell::new(vec![]),
}
}
pub fn insert(&mut self, path: &str, module: v8::Global<v8::Module>) {
if self.main.is_none() && std::fs::metadata(path).is_ok() {
self.main = Some(path.into());
}
self.index.insert(path.into(), module);
}
pub fn get(&self, key: &str) -> Option<v8::Global<v8::Module>> {
self.index.get(key).cloned()
}
pub fn get_path(&self, module: v8::Global<v8::Module>) -> Option<ModulePath> {
self
.index
.iter()
.find(|(_, m)| **m == module)
.map(|(p, _)| p.clone())
}
}
impl Default for ModuleMap {
fn default() -> Self {
ModuleMap::new()
}
}