diff --git a/hemx-js/runtime/hemx.js b/hemx-js/runtime/hemx.js index 7c31dbd..fcee9f0 100644 --- a/hemx-js/runtime/hemx.js +++ b/hemx-js/runtime/hemx.js @@ -791,11 +791,20 @@ function start() { roots().forEach((root) => { - bootstrapState(root); - bindRoot(root); - bindSse(root); + try { + bootstrapState(root); + bindRoot(root); + bindSse(root); + } catch (error) { + emit(root, "hemx:error", String(error)); + } }); - history.replaceState(history.state || { hemx: true }, "", location.href); + try { + history.replaceState(history.state || { hemx: true }, "", location.href); + } catch (error) { + const root = roots()[0]; + if (root) emit(root, "hemx:history-error", String(error)); + } } addEventListener("popstate", () => { @@ -803,8 +812,8 @@ if (root) navigateUrl(location.href, root, "none").catch((error) => emit(root, "hemx:error", String(error))); }); + window.hemx = Object.freeze({ runtimeAbiVersion, roots, rootOf, applyHtml, applyBatch, decodeBatch, atomValue, decodeAtomState }); + if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", start); else start(); - - window.hemx = Object.freeze({ runtimeAbiVersion, roots, rootOf, applyHtml, applyBatch, decodeBatch, atomValue, decodeAtomState }); })(); diff --git a/hemx-js/tests/runtime.rs b/hemx-js/tests/runtime.rs index 47dee5c..5ef2a9d 100644 --- a/hemx-js/tests/runtime.rs +++ b/hemx-js/tests/runtime.rs @@ -1,3 +1,19 @@ +#[test] +fn runtime_exposes_debug_api_before_startup_side_effects() { + // req: runtime/002 + let source = hemx_js::RUNTIME_JS; + + let api = source + .find("window.hemx = Object.freeze") + .expect("runtime exposes browser API"); + let start = source + .find("if (document.readyState === \"loading\") document.addEventListener(\"DOMContentLoaded\", start)") + .expect("runtime starts after declaration"); + assert!(api < start); + assert!(source.contains("try {\n bootstrapState(root);")); + assert!(source.contains("emit(root, \"hemx:error\", String(error));")); +} + #[test] fn runtime_posts_urlencoded_forms_by_default() { let source = hemx_js::RUNTIME_JS;