diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/bindings.rs | 4 | ||||
-rw-r--r-- | core/examples/ts_module_loader.rs | 3 | ||||
-rw-r--r-- | core/lib.rs | 1 | ||||
-rw-r--r-- | core/modules.rs | 98 | ||||
-rw-r--r-- | core/runtime.rs | 11 |
5 files changed, 83 insertions, 34 deletions
diff --git a/core/bindings.rs b/core/bindings.rs index b9285a402..6707f115c 100644 --- a/core/bindings.rs +++ b/core/bindings.rs @@ -13,6 +13,7 @@ use crate::modules::parse_import_assertions; use crate::modules::validate_import_assertions; use crate::modules::ImportAssertionsKind; use crate::modules::ModuleMap; +use crate::modules::ResolutionKind; use crate::ops::OpCtx; use crate::runtime::SnapshotOptions; use crate::JsRuntime; @@ -378,7 +379,8 @@ fn import_meta_resolve( return; } - match loader.resolve(&specifier_str, &referrer, false) { + match loader.resolve(&specifier_str, &referrer, ResolutionKind::DynamicImport) + { Ok(resolved) => { let resolved_val = serde_v8::to_v8(scope, resolved.as_str()).unwrap(); rv.set(resolved_val); diff --git a/core/examples/ts_module_loader.rs b/core/examples/ts_module_loader.rs index d9b32d5be..c78c1f868 100644 --- a/core/examples/ts_module_loader.rs +++ b/core/examples/ts_module_loader.rs @@ -21,6 +21,7 @@ use deno_core::ModuleSource; use deno_core::ModuleSourceFuture; use deno_core::ModuleSpecifier; use deno_core::ModuleType; +use deno_core::ResolutionKind; use deno_core::RuntimeOptions; use futures::FutureExt; @@ -31,7 +32,7 @@ impl ModuleLoader for TypescriptModuleLoader { &self, specifier: &str, referrer: &str, - _is_main: bool, + _kind: ResolutionKind, ) -> Result<ModuleSpecifier, Error> { Ok(resolve_import(specifier, referrer)?) } diff --git a/core/lib.rs b/core/lib.rs index d764718a2..308724fdd 100644 --- a/core/lib.rs +++ b/core/lib.rs @@ -77,6 +77,7 @@ pub use crate::modules::ModuleSource; pub use crate::modules::ModuleSourceFuture; pub use crate::modules::ModuleType; pub use crate::modules::NoopModuleLoader; +pub use crate::modules::ResolutionKind; pub use crate::normalize_path::normalize_path; pub use crate::ops::Op; pub use crate::ops::OpAsyncFuture; diff --git a/core/modules.rs b/core/modules.rs index 8abced200..917649c85 100644 --- a/core/modules.rs +++ b/core/modules.rs @@ -202,6 +202,20 @@ pub type ModuleSourceFuture = dyn Future<Output = Result<ModuleSource, Error>>; type ModuleLoadFuture = dyn Future<Output = Result<(ModuleRequest, ModuleSource), Error>>; +pub enum ResolutionKind { + /// This kind is used in only one situation: when a module is loaded via + /// `JsRuntime::load_main_module` and is the top-level module, ie. the one + /// passed as an argument to `JsRuntime::load_main_module`. + MainModule, + /// This kind is returned for all other modules during module load, that are + /// static imports. + Import, + /// This kind is returned for all modules that are loaded as a result of a + /// call to `import()` API (ie. top-level module as well as all its + /// dependencies, and any other `import()` calls from that load). + DynamicImport, +} + pub trait ModuleLoader { /// Returns an absolute URL. /// When implementing an spec-complaint VM, this should be exactly the @@ -210,11 +224,14 @@ pub trait ModuleLoader { /// /// `is_main` can be used to resolve from current working directory or /// apply import map for child imports. + /// + /// `is_dyn_import` can be used to check permissions or deny + /// dynamic imports altogether. fn resolve( &self, specifier: &str, referrer: &str, - _is_main: bool, + kind: ResolutionKind, ) -> Result<ModuleSpecifier, Error>; /// Given ModuleSpecifier, load its source code. @@ -256,7 +273,7 @@ impl ModuleLoader for NoopModuleLoader { &self, _specifier: &str, _referrer: &str, - _is_main: bool, + _kind: ResolutionKind, ) -> Result<ModuleSpecifier, Error> { Err(generic_error("Module loading is not supported")) } @@ -284,7 +301,7 @@ impl ModuleLoader for FsModuleLoader { &self, specifier: &str, referrer: &str, - _is_main: bool, + _kind: ResolutionKind, ) -> Result<ModuleSpecifier, Error> { Ok(resolve_import(specifier, referrer)?) } @@ -446,14 +463,16 @@ impl RecursiveModuleLoad { fn resolve_root(&self) -> Result<ModuleSpecifier, Error> { match self.init { LoadInit::Main(ref specifier) => { - self.loader.resolve(specifier, ".", true) + self + .loader + .resolve(specifier, ".", ResolutionKind::MainModule) } LoadInit::Side(ref specifier) => { - self.loader.resolve(specifier, ".", false) - } - LoadInit::DynamicImport(ref specifier, ref referrer, _) => { - self.loader.resolve(specifier, referrer, false) + self.loader.resolve(specifier, ".", ResolutionKind::Import) } + LoadInit::DynamicImport(ref specifier, ref referrer, _) => self + .loader + .resolve(specifier, referrer, ResolutionKind::DynamicImport), } } @@ -461,15 +480,25 @@ impl RecursiveModuleLoad { let op_state = self.op_state.clone(); let (module_specifier, maybe_referrer) = match self.init { LoadInit::Main(ref specifier) => { - let spec = self.loader.resolve(specifier, ".", true)?; + let spec = + self + .loader + .resolve(specifier, ".", ResolutionKind::MainModule)?; (spec, None) } LoadInit::Side(ref specifier) => { - let spec = self.loader.resolve(specifier, ".", false)?; + let spec = + self + .loader + .resolve(specifier, ".", ResolutionKind::Import)?; (spec, None) } LoadInit::DynamicImport(ref specifier, ref referrer, _) => { - let spec = self.loader.resolve(specifier, referrer, false)?; + let spec = self.loader.resolve( + specifier, + referrer, + ResolutionKind::DynamicImport, + )?; (spec, Some(referrer.to_string())) } }; @@ -537,6 +566,7 @@ impl RecursiveModuleLoad { self.is_currently_loading_main_module(), &module_source.module_url_found, &module_source.code, + self.is_dynamic_import(), )? } ModuleType::Json => self.module_map_rc.borrow_mut().new_json_module( @@ -868,6 +898,7 @@ impl ModuleMap { main: bool, name: &str, source: &[u8], + is_dynamic_import: bool, ) -> Result<ModuleId, ModuleError> { let name_str = v8::String::new(scope, name).unwrap(); let source_str = @@ -918,11 +949,18 @@ impl ModuleMap { return Err(ModuleError::Exception(exception)); } - let module_specifier = - match self.loader.resolve(&import_specifier, name, false) { - Ok(s) => s, - Err(e) => return Err(ModuleError::Other(e)), - }; + let module_specifier = match self.loader.resolve( + &import_specifier, + name, + if is_dynamic_import { + ResolutionKind::DynamicImport + } else { + ResolutionKind::Import + }, + ) { + Ok(s) => s, + Err(e) => return Err(ModuleError::Other(e)), + }; let asserted_module_type = get_asserted_module_type_from_assertions(&assertions); let request = ModuleRequest { @@ -1082,10 +1120,11 @@ impl ModuleMap { .borrow_mut() .dynamic_import_map .insert(load.id, resolver_handle); - let resolve_result = module_map_rc - .borrow() - .loader - .resolve(specifier, referrer, false); + let resolve_result = module_map_rc.borrow().loader.resolve( + specifier, + referrer, + ResolutionKind::DynamicImport, + ); let fut = match resolve_result { Ok(module_specifier) => { if module_map_rc @@ -1121,7 +1160,7 @@ impl ModuleMap { ) -> Option<v8::Local<'s, v8::Module>> { let resolved_specifier = self .loader - .resolve(specifier, referrer, false) + .resolve(specifier, referrer, ResolutionKind::Import) .expect("Module should have been already resolved"); let module_type = @@ -1332,7 +1371,7 @@ import "/a.js"; &self, specifier: &str, referrer: &str, - _is_root: bool, + _kind: ResolutionKind, ) -> Result<ModuleSpecifier, Error> { let referrer = if referrer == "." { "file:///" @@ -1448,7 +1487,7 @@ import "/a.js"; &self, specifier: &str, referrer: &str, - _is_main: bool, + _kind: ResolutionKind, ) -> Result<ModuleSpecifier, Error> { self.count.fetch_add(1, Ordering::Relaxed); assert_eq!(specifier, "./b.js"); @@ -1521,6 +1560,7 @@ import "/a.js"; let control = 42; Deno.core.ops.op_test(control); "#, + false, ) .unwrap(); @@ -1540,6 +1580,7 @@ import "/a.js"; false, "file:///b.js", b"export function b() { return 'b' }", + false, ) .unwrap(); let imports = module_map.get_requested_modules(mod_b).unwrap(); @@ -1570,7 +1611,7 @@ import "/a.js"; &self, specifier: &str, referrer: &str, - _is_main: bool, + _kind: ResolutionKind, ) -> Result<ModuleSpecifier, Error> { self.count.fetch_add(1, Ordering::Relaxed); assert_eq!(specifier, "./b.json"); @@ -1627,6 +1668,7 @@ import "/a.js"; assert(jsonData.a == "b"); assert(jsonData.c.d == 10); "#, + false, ) .unwrap(); @@ -1673,7 +1715,7 @@ import "/a.js"; &self, specifier: &str, referrer: &str, - _is_main: bool, + _kind: ResolutionKind, ) -> Result<ModuleSpecifier, Error> { self.count.fetch_add(1, Ordering::Relaxed); assert_eq!(specifier, "/foo.js"); @@ -1733,7 +1775,7 @@ import "/a.js"; &self, specifier: &str, referrer: &str, - _is_main: bool, + _kind: ResolutionKind, ) -> Result<ModuleSpecifier, Error> { let c = self.resolve_count.fetch_add(1, Ordering::Relaxed); assert!(c < 7); @@ -1866,7 +1908,7 @@ import "/a.js"; &self, specifier: &str, referrer: &str, - _is_main: bool, + _kind: ResolutionKind, ) -> Result<ModuleSpecifier, Error> { self.resolve_count.fetch_add(1, Ordering::Relaxed); let s = resolve_import(specifier, referrer).unwrap(); @@ -2242,7 +2284,7 @@ if (import.meta.url != 'file:///main_with_code.js') throw Error(); &self, specifier: &str, referrer: &str, - _is_main: bool, + _kind: ResolutionKind, ) -> Result<ModuleSpecifier, Error> { let s = resolve_import(specifier, referrer).unwrap(); Ok(s) diff --git a/core/runtime.rs b/core/runtime.rs index baa7de1a1..6a6bce329 100644 --- a/core/runtime.rs +++ b/core/runtime.rs @@ -2038,6 +2038,7 @@ impl JsRuntime { true, specifier.as_str(), code.as_bytes(), + false, ) .map_err(|e| match e { ModuleError::Exception(exception) => { @@ -2097,6 +2098,7 @@ impl JsRuntime { false, specifier.as_str(), code.as_bytes(), + false, ) .map_err(|e| match e { ModuleError::Exception(exception) => { @@ -2492,6 +2494,7 @@ pub mod tests { use crate::modules::ModuleSource; use crate::modules::ModuleSourceFuture; use crate::modules::ModuleType; + use crate::modules::ResolutionKind; use crate::ZeroCopyBuf; use deno_ops::op; use futures::future::lazy; @@ -3132,7 +3135,7 @@ pub mod tests { &self, specifier: &str, referrer: &str, - _is_main: bool, + _kind: ResolutionKind, ) -> Result<ModuleSpecifier, Error> { assert_eq!(specifier, "file:///main.js"); assert_eq!(referrer, "."); @@ -3302,7 +3305,7 @@ pub mod tests { &self, specifier: &str, referrer: &str, - _is_main: bool, + _kind: ResolutionKind, ) -> Result<ModuleSpecifier, Error> { assert_eq!(specifier, "file:///main.js"); assert_eq!(referrer, "."); @@ -3869,7 +3872,7 @@ Deno.core.ops.op_async_serialize_object_with_numbers_as_keys({ &self, specifier: &str, referrer: &str, - _is_main: bool, + _kind: ResolutionKind, ) -> Result<ModuleSpecifier, Error> { assert_eq!(specifier, "file:///main.js"); assert_eq!(referrer, "."); @@ -4001,7 +4004,7 @@ Deno.core.ops.op_async_serialize_object_with_numbers_as_keys({ &self, specifier: &str, referrer: &str, - _is_main: bool, + _kind: ResolutionKind, ) -> Result<ModuleSpecifier, Error> { assert_eq!(specifier, "file:///main.js"); assert_eq!(referrer, "."); |