use avril_core::{Error, Extension, ModuleLoader, ModuleSource, Runtime, RuntimeOptions}; use std::rc::Rc; struct Loader; impl ModuleLoader for Loader { fn resolve(&self, specifier: &str, referrer: &str) -> Result { Ok(if specifier == "private-alias" { "ext:core/ops".into() } else { format!("{referrer}/{specifier}") }) } fn module_url(&self, name: &str) -> Option { Some(format!("test:{name}")) } fn load(&self, name: &str) -> Result { assert_eq!(name, "entry"); Ok(r#" globalThis.resolved = import.meta.resolve('missing'); try {import.meta.resolve('private-alias'); throw Error('Exposed extension');} catch (error) {if (!(error instanceof TypeError)) throw error;} if ('filename' in import.meta || 'dirname' in import.meta) throw Error('Non-file paths'); "#.into()) } } #[test] fn embedding_resolvers_use_the_loader_without_loading_the_target() { let mut runtime = Runtime::new(RuntimeOptions { module_loader: Some(Rc::new(Loader)), ..Default::default() }) .unwrap(); runtime.execute_module("entry").unwrap(); assert_eq!( runtime .execute_script::("check", "resolved") .unwrap(), "test:entry/missing" ); } #[test] fn extension_metadata_resolves_embedded_specifiers_without_a_guest_loader() { let mut runtime = Runtime::new(RuntimeOptions { extensions: vec![Extension { dependencies: &[],name:"ext:metadata", ops:vec![], modules:&[("ext:metadata/main.js",r#" globalThis.resolved = [import.meta.resolve('./sub/../missing.js'),import.meta.resolve('ext:core/ops')]; if ('filename' in import.meta || 'dirname' in import.meta) throw Error('Extension paths'); "#)],entry_point:Some("ext:metadata/main.js")}], ..Default::default() }).unwrap(); assert_eq!( runtime .execute_script::>("check", "resolved") .unwrap(), ["ext:metadata/missing.js", "ext:core/ops"] ); }