use deno_core::{anyhow::anyhow, ModuleSpecifier};
use rustyscript::{module_loader::ImportProvider, Module, Runtime, RuntimeOptions};
use std::collections::HashMap;
#[derive(Default)]
struct MyImportProvider {
static_modules: HashMap<String, String>,
redirects: HashMap<String, ModuleSpecifier>,
}
impl MyImportProvider {
const STATIC_SCHEME: &'static str = "static";
const REDIRECT_SCHEME: &'static str = "redirect";
fn add_static_module(&mut self, specifier: &str, source: &str) {
self.static_modules
.insert(specifier.to_string(), source.to_string());
}
fn add_redirect(&mut self, from: &str, to: &str) -> Result<(), deno_core::error::AnyError> {
self.redirects
.insert(from.to_string(), ModuleSpecifier::parse(to)?);
Ok(())
}
}
impl ImportProvider for MyImportProvider {
fn resolve(
&mut self,
specifier: &ModuleSpecifier,
_referrer: &str,
_kind: deno_core::ResolutionKind,
) -> Option<Result<ModuleSpecifier, deno_core::anyhow::Error>> {
match specifier.scheme() {
Self::STATIC_SCHEME => {
if self.static_modules.contains_key(specifier.path()) {
Some(Ok(specifier.clone()))
} else {
Some(Err(anyhow!("Static module not found: {}", specifier)))
}
}
Self::REDIRECT_SCHEME => {
if let Some(redirected_specifier) = self.redirects.get(specifier.path()) {
Some(Ok(redirected_specifier.clone()))
} else {
Some(Err(anyhow!("Module redirect not found: {}", specifier)))
}
}
_ => None,
}
}
fn import(
&mut self,
specifier: &ModuleSpecifier,
_referrer: Option<&ModuleSpecifier>,
_is_dyn_import: bool,
_requested_module_type: deno_core::RequestedModuleType,
) -> Option<Result<String, deno_core::anyhow::Error>> {
match specifier.scheme() {
Self::STATIC_SCHEME => {
if let Some(source) = self.static_modules.get(specifier.path()) {
Some(Ok(source.clone()))
} else {
Some(Err(anyhow!("Static module not found: {}", specifier)))
}
}
_ => None,
}
}
}
fn main() -> Result<(), rustyscript::Error> {
let mut import_provider = MyImportProvider::default();
import_provider.add_redirect("mod_assert", "https://deno.land/std@0.224.0/assert/mod.ts")?;
import_provider.add_static_module("my-module", "export const foo = 1");
let mut runtime = Runtime::new(RuntimeOptions {
import_provider: Some(Box::new(import_provider)),
..Default::default()
})?;
let module = Module::new(
"custom_imports.js",
"
import { assertEquals } from 'redirect:mod_assert';
import { foo } from 'static:my-module';
assertEquals(1, foo)
",
);
runtime.load_module(&module)?;
Ok(())
}