Fix sx.js component kwarg evaluation: distinguish expressions from data
Three issues with the eager kwarg evaluation in renderComponentDOM and renderStrComponent: 1. Data arrays (e.g. tags list of dicts) were being passed to sxEval which tried to call a dict as a function — causing blank pages. Fix: only evaluate arrays with a Symbol head (actual expressions); pass data arrays through as-is. 2. Expression arrays like (get t "src") inside map lambdas lost their scope when deferred — causing "get,t,src" URLs. Fix: eagerly evaluate these Symbol-headed expressions in the caller's env. 3. Bare symbol `t` used as boolean in editor.sx threw "Undefined symbol". Fix: use `true` literal instead. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -827,15 +827,23 @@
|
||||
if (isKw(args[i]) && i + 1 < args.length) {
|
||||
// Evaluate kwarg values eagerly in the caller's env so expressions
|
||||
// like (get t "src") resolve while lambda params are still bound.
|
||||
// Render-only forms (HTML tags, <>, ~comp) go through renderDOM instead.
|
||||
var v = args[i + 1];
|
||||
if (typeof v === "string" || typeof v === "number" ||
|
||||
typeof v === "boolean" || isNil(v)) {
|
||||
typeof v === "boolean" || isNil(v) || isKw(v)) {
|
||||
kwargs[args[i].name] = v;
|
||||
} else if (_isRenderExpr(v)) {
|
||||
kwargs[args[i].name] = renderDOM(v, env);
|
||||
} else {
|
||||
} else if (isSym(v)) {
|
||||
kwargs[args[i].name] = sxEval(v, env);
|
||||
} else if (Array.isArray(v) && v.length && isSym(v[0])) {
|
||||
// Expression with Symbol head — evaluate in caller's env.
|
||||
// Render-only forms go through renderDOM; data exprs through sxEval.
|
||||
if (_isRenderExpr(v)) {
|
||||
kwargs[args[i].name] = renderDOM(v, env);
|
||||
} else {
|
||||
kwargs[args[i].name] = sxEval(v, env);
|
||||
}
|
||||
} else {
|
||||
// Data arrays, dicts, etc — pass through as-is
|
||||
kwargs[args[i].name] = v;
|
||||
}
|
||||
i += 2;
|
||||
} else {
|
||||
@@ -1115,15 +1123,23 @@
|
||||
if (isKw(args[i]) && i + 1 < args.length) {
|
||||
// Evaluate kwarg values eagerly in the caller's env so expressions
|
||||
// like (get t "src") resolve while lambda params are still bound.
|
||||
// Render-only forms (HTML tags, <>, ~comp) go through renderStr.
|
||||
var v = args[i + 1];
|
||||
if (typeof v === "string" || typeof v === "number" ||
|
||||
typeof v === "boolean" || isNil(v)) {
|
||||
typeof v === "boolean" || isNil(v) || isKw(v)) {
|
||||
kwargs[args[i].name] = v;
|
||||
} else if (_isRenderExpr(v)) {
|
||||
kwargs[args[i].name] = new RawHTML(renderStr(v, env));
|
||||
} else {
|
||||
} else if (isSym(v)) {
|
||||
kwargs[args[i].name] = sxEval(v, env);
|
||||
} else if (Array.isArray(v) && v.length && isSym(v[0])) {
|
||||
// Expression with Symbol head — evaluate in caller's env.
|
||||
// Render-only forms go through renderStr; data exprs through sxEval.
|
||||
if (_isRenderExpr(v)) {
|
||||
kwargs[args[i].name] = new RawHTML(renderStr(v, env));
|
||||
} else {
|
||||
kwargs[args[i].name] = sxEval(v, env);
|
||||
}
|
||||
} else {
|
||||
// Data arrays, dicts, etc — pass through as-is
|
||||
kwargs[args[i].name] = v;
|
||||
}
|
||||
i += 2;
|
||||
} else { children.push(args[i]); i++; }
|
||||
|
||||
Reference in New Issue
Block a user