From 050bcee2b7d55357f13bbb72311453e905378558 Mon Sep 17 00:00:00 2001 From: Joey Guerra Date: Sat, 16 May 2026 23:21:14 -0500 Subject: [PATCH 1/2] feat: remove the html attribute facility. Always autoBinding. BREAKING CHANGE: autoBind set to true re-bound event handlers when the html attribute was used and set. This change always rebinds and removes the html attribute from the API to encourage writing the HTML in the template simplifying the design to reduce foot guns. --- src/rdbl.js | 84 ++++++++++++++------------------------------------ test/page.png | Bin 18080 -> 52615 bytes 2 files changed, 23 insertions(+), 61 deletions(-) diff --git a/src/rdbl.js b/src/rdbl.js index 56e3b0e..962a134 100644 --- a/src/rdbl.js +++ b/src/rdbl.js @@ -299,8 +299,6 @@ export function createScope(parent, patch) { // ───────────────────────────────────────────────────────────── const DEFAULTS = { dev: true, - autoBind: false, // MutationObserver auto-bind - observeRoot: false, // if true, observes root itself too (rarely needed) ignoreSelector: '[data-no-bind]', // subtree opt-out marker } @@ -315,14 +313,6 @@ function isManagedByEach(el) { return !!(eachHost && !el.hasAttribute('each')) } -function collectRootsForAutoBind(node, ignoreSelector) { - const roots = [] - if (!(node instanceof Element)) return roots - if (!shouldIgnore(node, ignoreSelector)) roots.push(node) - node.querySelectorAll?.(':scope *')?.forEach?.(() => {}) // noop; avoid older engines? (safe) - return roots -} - // Return list of "binding elements" under root, including root function allElements(root) { const els = [] @@ -346,7 +336,7 @@ function parseAttrSpec(spec) { .map(s => s.trim()) .filter(Boolean) .map(pair => pair.split(':').map(x => x.trim())) - .filter(([a,b]) => a && b) + .filter(([a, b]) => a && b) } function isDialogElement(el) { @@ -393,7 +383,6 @@ export function bind(root, scope, options = {}) { // - bindEach first so it renders children, then bind the rest for that root disposers.push(bindEach(r, scope, opt, { getCtx, bindSubtree })) disposers.push(bindText(r, scope, opt)) - disposers.push(bindHtml(r, scope, opt)) disposers.push(bindShow(r, scope, opt)) disposers.push(bindClass(r, scope, opt)) disposers.push(bindAttr(r, scope, opt)) @@ -403,38 +392,32 @@ export function bind(root, scope, options = {}) { function bindSubtree(subRoot, subScope = scope) { // Scoped sub-bind: same binder but with different scope - // Note: not wired into autoBind automatically unless you call it - return bind(subRoot, subScope, { ...opt, autoBind: false }) + return bind(subRoot, subScope, opt) } // Initial bind bindRootOnce(root) - // MutationObserver auto-bind (opt-in) - let observerDispose = null - if (opt.autoBind) { - const obsRoot = opt.observeRoot ? root : root - const mo = new MutationObserver((mutations) => { - for (const m of mutations) { - for (const n of m.addedNodes) { - if (!(n instanceof Element)) continue - if (shouldIgnore(n, opt.ignoreSelector)) continue - // Bind the added subtree root once (binder scans its descendants) - bindRootOnce(n) - } + const mo = new MutationObserver((mutations) => { + for (const m of mutations) { + for (const n of m.addedNodes) { + if (!(n instanceof Element)) continue + if (shouldIgnore(n, opt.ignoreSelector)) continue + if (root.hasAttribute('island') && n.closest('[island]') !== root) continue + if (isManagedByEach(n)) continue + bindRootOnce(n) } - }) - mo.observe(obsRoot, { childList: true, subtree: true }) - observerDispose = () => mo.disconnect() - } + } + }) + mo.observe(root, { childList: true, subtree: true }) return { bindSubtree, dispose() { - if (observerDispose) observerDispose() + mo.disconnect() // dispose in reverse (best-effort) for (let i = disposers.length - 1; i >= 0; i--) { - try { disposers[i]?.dispose?.() } catch {} + try { disposers[i]?.dispose?.() } catch { } } } } @@ -453,7 +436,6 @@ function bindText(root, scope, opt) { let skipFirst = isSSRPreserved(el) || el.textContent.trim() !== '' const stop = effect(() => { - const v = readValue(scope, path) const value = readBoundValue(scope, path, el) if (value === undefined) warn(opt.dev, `text="${path}" resolved to undefined${bindingDebugContext(el)}`) if (skipFirst) { skipFirst = false; return } @@ -464,25 +446,6 @@ function bindText(root, scope, opt) { return { dispose: () => stops.forEach(s => s()) } } -function bindHtml(root, scope, opt) { - const stops = [] - for (const el of allElements(root)) { - if (shouldIgnore(el, opt.ignoreSelector)) continue - if (isManagedByEach(el)) continue - if (!el.hasAttribute('html')) continue - const path = el.getAttribute('html') - let skipFirst = isSSRPreserved(el) || el.innerHTML.trim() !== '' - - const stop = effect(() => { - const v = readBoundValue(scope, path, el) - if (skipFirst) { skipFirst = false; return } - el.innerHTML = v ?? '' - }) - stops.push(stop) - } - return { dispose: () => stops.forEach(s => s()) } -} - function bindShow(root, scope, opt) { const stops = [] for (const el of allElements(root)) { @@ -579,8 +542,8 @@ function bindModel(root, scope, opt) { // UI -> state const evt = (el instanceof HTMLSelectElement) ? 'change' - : (el instanceof HTMLInputElement && el.type === 'checkbox') ? 'change' - : 'input' + : (el instanceof HTMLInputElement && el.type === 'checkbox') ? 'change' + : 'input' const handler = () => sig.set(getModelValue(el)) el.addEventListener(evt, handler) @@ -619,7 +582,7 @@ function bindEvents(root, scope, opt, { getCtx }) { const actionPath = attr.value.trim() // Disable native inline handler evaluation - try { el[attr.name] = null } catch {} + try { el[attr.name] = null } catch { } el.removeAttribute(attr.name) const handler = (event) => { @@ -746,7 +709,6 @@ function clearNodeForTemplate(el) { if (!(el instanceof Element)) return el.removeAttribute('data-key') if (el.hasAttribute('text')) el.textContent = '' - if (el.hasAttribute('html')) el.innerHTML = '' if (el.hasAttribute('attr')) { for (const [name] of parseAttrSpec(el.getAttribute('attr'))) el.removeAttribute(name) } @@ -970,7 +932,7 @@ export function bindEach(root, scope, opt, { getCtx, bindSubtree }) { // If keyed item identity changed, recreate subtree bindings so // non-reactive plain item fields are read from the new object. if (entry.item !== item) { - try { entry.binding?.dispose?.() } catch {} + try { entry.binding?.dispose?.() } catch { } for (const n of entry.nodes) n.remove() entry = createEntry(item, i) } else { @@ -994,7 +956,7 @@ export function bindEach(root, scope, opt, { getCtx, bindSubtree }) { // Dispose removed for (const [k, entry] of live.entries()) { if (!next.has(k)) { - try { entry.binding?.dispose?.() } catch {} + try { entry.binding?.dispose?.() } catch { } for (const n of entry.nodes) n.remove() } } @@ -1006,7 +968,7 @@ export function bindEach(root, scope, opt, { getCtx, bindSubtree }) { listDisposers.push(() => { stop() for (const entry of live.values()) { - try { entry.binding?.dispose?.() } catch {} + try { entry.binding?.dispose?.() } catch { } for (const n of entry.nodes) n.remove() } live.clear() @@ -1025,7 +987,7 @@ export async function init(window, roots) { if (!roots) { roots = [...document.querySelectorAll('[island]')] } - + const instances = {} let i = 0 @@ -1077,7 +1039,7 @@ const state = { state.double = computed(() => state.count() * 2) -const app = bind(root, state, { dev: true, autoBind: true }) +const app = bind(root, state, { dev: true }) // later: app.dispose() ──────────────────────────────────────────────────────────── */ diff --git a/test/page.png b/test/page.png index 235331e053bbbb4a83b984b1a1532a085d82f3d1..9cb2287eac67735661bf5b7d3201cc396770b478 100644 GIT binary patch literal 52615 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 From 475544b5772196385aab495b5cf2584da72467d2 Mon Sep 17 00:00:00 2001 From: Joey Guerra Date: Sat, 16 May 2026 23:28:21 -0500 Subject: [PATCH 2/2] chore: cleanup --- test/rdbl.browser.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/rdbl.browser.test.js b/test/rdbl.browser.test.js index ef766bc..a505f48 100644 --- a/test/rdbl.browser.test.js +++ b/test/rdbl.browser.test.js @@ -71,7 +71,7 @@ const ROUTES = { const scope = { hubs } try { bindEach(root, scope, {dev: true}, { getCtx: (el) => Context.read(el), bindSubtree: (subRoot, subScope = scope) => { - return bind(subRoot, subScope, { dev: true, autoBind: false }) + return bind(subRoot, subScope, { dev: true }) }}) } catch(e) { console.log('error', e.message)