char/avril

(wip) why'd you have to go and make things so complicaaaaated?

git clone https://git.t4t.associates/char/avril

Charlotte Somcore: share prepared module source with loader9712108

main
2.1 KiB57 linesraw
1use avril_core::{Error, Extension, ModuleLoader, ModuleSource, Runtime, RuntimeOptions};
2use std::rc::Rc;
3
4struct Loader;
5impl ModuleLoader for Loader {
6    fn resolve(&self, specifier: &str, referrer: &str) -> Result<String, Error> {
7        Ok(if specifier == "private-alias" {
8            "ext:core/ops".into()
9        } else {
10            format!("{referrer}/{specifier}")
11        })
12    }
13    fn module_url(&self, name: &str) -> Option<String> {
14        Some(format!("test:{name}"))
15    }
16    fn load(&self, name: &str) -> Result<ModuleSource, Error> {
17        assert_eq!(name, "entry");
18        Ok(r#"
19            globalThis.resolved = import.meta.resolve('missing');
20            try {import.meta.resolve('private-alias'); throw Error('Exposed extension');}
21            catch (error) {if (!(error instanceof TypeError)) throw error;}
22            if ('filename' in import.meta || 'dirname' in import.meta) throw Error('Non-file paths');
23        "#.into())
24    }
25}
26
27#[test]
28fn embedding_resolvers_use_the_loader_without_loading_the_target() {
29    let mut runtime = Runtime::new(RuntimeOptions {
30        module_loader: Some(Rc::new(Loader)),
31        ..Default::default()
32    })
33    .unwrap();
34    runtime.execute_module("entry").unwrap();
35    assert_eq!(
36        runtime
37            .execute_script::<String>("check", "resolved")
38            .unwrap(),
39        "test:entry/missing"
40    );
41}
42
43#[test]
44fn extension_metadata_resolves_embedded_specifiers_without_a_guest_loader() {
45    let mut runtime = Runtime::new(RuntimeOptions {
46        extensions: vec![Extension { dependencies: &[],name:"ext:metadata", ops:vec![], modules:&[("ext:metadata/main.js",r#"
47            globalThis.resolved = [import.meta.resolve('./sub/../missing.js'),import.meta.resolve('ext:core/ops')];
48            if ('filename' in import.meta || 'dirname' in import.meta) throw Error('Extension paths');
49        "#)],entry_point:Some("ext:metadata/main.js")}], ..Default::default()
50    }).unwrap();
51    assert_eq!(
52        runtime
53            .execute_script::<Vec<String>>("check", "resolved")
54            .unwrap(),
55        ["ext:metadata/missing.js", "ext:core/ops"]
56    );
57}