Fix DOM adapter: filter spread values from dom-append calls

Spread values returned by components like ~cssx/tw are not DOM nodes
and cannot be passed to appendChild. Filter them in fragment, let,
begin/do, component children, and data list rendering paths — matching
the HTML adapter's existing spread filtering.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-13 03:23:17 +00:00
parent 8100dc5fc9
commit c3430ade90
2 changed files with 62 additions and 26 deletions

View File

@@ -14,7 +14,7 @@
// =========================================================================
var NIL = Object.freeze({ _nil: true, toString: function() { return "nil"; } });
var SX_VERSION = "2026-03-13T02:54:01Z";
var SX_VERSION = "2026-03-13T03:23:01Z";
function isNil(x) { return x === NIL || x === null || x === undefined; }
function isSxTruthy(x) { return x !== false && !isNil(x); }
@@ -1898,7 +1898,10 @@ return (function() { var _m = typeOf(expr); if (_m == "nil") return createFragme
})() : renderToDom(trampoline(evalExpr(expr, env)), env, ns))))))))))))));
})() : (isSxTruthy(sxOr(isLambda(head), (typeOf(head) == "list"))) ? renderToDom(trampoline(evalExpr(expr, env)), env, ns) : (function() {
var frag = createFragment();
{ var _c = expr; for (var _i = 0; _i < _c.length; _i++) { var x = _c[_i]; domAppend(frag, renderToDom(x, env, ns)); } }
{ var _c = expr; for (var _i = 0; _i < _c.length; _i++) { var x = _c[_i]; (function() {
var result = renderToDom(x, env, ns);
return (isSxTruthy(!isSxTruthy(isSpread(result))) ? domAppend(frag, result) : NIL);
})(); } }
return frag;
})()));
})(); };
@@ -1964,7 +1967,10 @@ return (function() { var _m = typeOf(expr); if (_m == "nil") return createFragme
if (isSxTruthy(componentHasChildren(comp))) {
(function() {
var childFrag = createFragment();
{ var _c = children; for (var _i = 0; _i < _c.length; _i++) { var c = _c[_i]; domAppend(childFrag, renderToDom(c, env, ns)); } }
{ var _c = children; for (var _i = 0; _i < _c.length; _i++) { var c = _c[_i]; (function() {
var result = renderToDom(c, env, ns);
return (isSxTruthy(!isSxTruthy(isSpread(result))) ? domAppend(childFrag, result) : NIL);
})(); } }
return envSet(local, "children", childFrag);
})();
}
@@ -1975,7 +1981,10 @@ return (function() { var _m = typeOf(expr); if (_m == "nil") return createFragme
// render-dom-fragment
var renderDomFragment = function(args, env, ns) { return (function() {
var frag = createFragment();
{ var _c = args; for (var _i = 0; _i < _c.length; _i++) { var x = _c[_i]; domAppend(frag, renderToDom(x, env, ns)); } }
{ var _c = args; for (var _i = 0; _i < _c.length; _i++) { var x = _c[_i]; (function() {
var result = renderToDom(x, env, ns);
return (isSxTruthy(!isSxTruthy(isSpread(result))) ? domAppend(frag, result) : NIL);
})(); } }
return frag;
})(); };
@@ -2078,14 +2087,22 @@ return (function() { var _m = typeOf(expr); if (_m == "nil") return createFragme
return (isSxTruthy(branch) ? renderToDom(branch, env, ns) : createFragment());
})()) : (isSxTruthy((name == "case")) ? renderToDom(trampoline(evalExpr(expr, env)), env, ns) : (isSxTruthy(sxOr((name == "let"), (name == "let*"))) ? (function() {
var local = processBindings(nth(expr, 1), env);
return (isSxTruthy((len(expr) == 3)) ? renderToDom(nth(expr, 2), local, ns) : (function() {
var frag = createFragment();
{ var _c = range(2, len(expr)); for (var _i = 0; _i < _c.length; _i++) { var i = _c[_i]; domAppend(frag, renderToDom(nth(expr, i), local, ns)); } }
{ var _c = range(2, len(expr)); for (var _i = 0; _i < _c.length; _i++) { var i = _c[_i]; (function() {
var result = renderToDom(nth(expr, i), local, ns);
return (isSxTruthy(!isSxTruthy(isSpread(result))) ? domAppend(frag, result) : NIL);
})(); } }
return frag;
})() : (isSxTruthy(sxOr((name == "begin"), (name == "do"))) ? (function() {
})());
})() : (isSxTruthy(sxOr((name == "begin"), (name == "do"))) ? (isSxTruthy((len(expr) == 2)) ? renderToDom(nth(expr, 1), env, ns) : (function() {
var frag = createFragment();
{ var _c = range(1, len(expr)); for (var _i = 0; _i < _c.length; _i++) { var i = _c[_i]; domAppend(frag, renderToDom(nth(expr, i), env, ns)); } }
{ var _c = range(1, len(expr)); for (var _i = 0; _i < _c.length; _i++) { var i = _c[_i]; (function() {
var result = renderToDom(nth(expr, i), env, ns);
return (isSxTruthy(!isSxTruthy(isSpread(result))) ? domAppend(frag, result) : NIL);
})(); } }
return frag;
})() : (isSxTruthy(isDefinitionForm(name)) ? (trampoline(evalExpr(expr, env)), createFragment()) : (isSxTruthy((name == "map")) ? (function() {
})()) : (isSxTruthy(isDefinitionForm(name)) ? (trampoline(evalExpr(expr, env)), createFragment()) : (isSxTruthy((name == "map")) ? (function() {
var collExpr = nth(expr, 2);
return (isSxTruthy((isSxTruthy(_islandScope) && isSxTruthy((typeOf(collExpr) == "list")) && isSxTruthy((len(collExpr) > 1)) && isSxTruthy((typeOf(first(collExpr)) == "symbol")) && (symbolName(first(collExpr)) == "deref"))) ? (function() {
var f = trampoline(evalExpr(nth(expr, 1), env));