use dioxus::prelude::Element;
use wasm_bindgen::prelude::*;
#[wasm_bindgen(inline_js = r#"
export function __ev_register(tag, mount){
if (customElements.get(tag)) return;
customElements.define(tag, class extends HTMLElement {
connectedCallback(){ mount(this); }
});
}
export function __ev_origin(){ return new URL(import.meta.url).origin; }
"#)]
extern "C" {
#[wasm_bindgen(js_name = __ev_register)]
fn js_register(tag: &str, mount: &js_sys::Function);
#[wasm_bindgen(js_name = __ev_origin)]
fn js_origin() -> String;
}
pub fn bundle_origin() -> String {
js_origin()
}
pub fn register(tag: &str, mount: &Closure<dyn Fn(web_sys::Element)>) {
js_register(tag, mount.as_ref().unchecked_ref());
}
pub fn launch_into(el: web_sys::Element, root: fn() -> Element) {
dioxus::LaunchBuilder::new().with_cfg(dioxus::web::Config::new().rootelement(el)).launch(root);
}
#[macro_export]
macro_rules! mfe {
(service: $service:literal, name: $name:literal, kind: $kind:ident, root: $root:path, stylesheet: $stylesheet:literal $(,)?) => {
const __EV_TAG: &str = concat!("mfe-", $service, "-", $name);
pub const MFE_MANIFEST: &str = concat!(
"{\"name\":\"", $service, ".", $name,
"\",\"tag\":\"mfe-", $service, "-", $name,
"\",\"kind\":\"", stringify!($kind), "\"}"
);
fn __ev_root() -> ::dioxus::prelude::Element {
use ::dioxus::prelude::*;
use $root as EvMfeRoot;
rsx! {
document::Stylesheet { href: format!("{}/mfe/{}", $crate::mfe::bundle_origin(), $stylesheet) }
EvMfeRoot {}
}
}
fn __ev_mount(el: ::web_sys::Element) {
::dioxus::fullstack::set_server_url(::std::boxed::Box::leak($crate::mfe::bundle_origin().into_boxed_str()));
$crate::mfe::launch_into(el, __ev_root);
}
#[::wasm_bindgen::prelude::wasm_bindgen(start)]
pub fn __ev_start() {
let closure = ::wasm_bindgen::closure::Closure::<dyn Fn(::web_sys::Element)>::new(__ev_mount);
$crate::mfe::register(__EV_TAG, &closure);
closure.forget();
}
};
}