From 3b00a7095a339fa12e5d6ad7fb825707cf026c4c Mon Sep 17 00:00:00 2001 From: giles Date: Fri, 6 Mar 2026 22:01:39 +0000 Subject: [PATCH] Fix (not) compilation: use isSxTruthy for NIL-safe negation NIL is a frozen sentinel object ({_nil:true}) which is truthy in JS. (not expr) compiled to !expr, so (not nil) returned false instead of true. Fixed to compile as !isSxTruthy(expr) which correctly handles NIL. This was preventing client-side routing from activating. Co-Authored-By: Claude Opus 4.6 --- shared/static/scripts/sx-browser.js | 143 ++++++++++++++-------------- shared/sx/ref/bootstrap_js.py | 2 +- shared/sx/ref/orchestration.sx | 6 -- 3 files changed, 72 insertions(+), 79 deletions(-) diff --git a/shared/static/scripts/sx-browser.js b/shared/static/scripts/sx-browser.js index b41a824..ab3cb56 100644 --- a/shared/static/scripts/sx-browser.js +++ b/shared/static/scripts/sx-browser.js @@ -14,7 +14,7 @@ // ========================================================================= var NIL = Object.freeze({ _nil: true, toString: function() { return "nil"; } }); - var SX_VERSION = "2026-03-06T21:59:54Z"; + var SX_VERSION = "2026-03-06T22:01:24Z"; function isNil(x) { return x === NIL || x === null || x === undefined; } function isSxTruthy(x) { return x !== false && !isNil(x); } @@ -550,7 +550,7 @@ var evalList = function(expr, env) { return (function() { var head = first(expr); var args = rest(expr); - return (isSxTruthy(!sxOr((typeOf(head) == "symbol"), (typeOf(head) == "lambda"), (typeOf(head) == "list"))) ? map(function(x) { return trampoline(evalExpr(x, env)); }, expr) : (isSxTruthy((typeOf(head) == "symbol")) ? (function() { + return (isSxTruthy(!isSxTruthy(sxOr((typeOf(head) == "symbol"), (typeOf(head) == "lambda"), (typeOf(head) == "list")))) ? map(function(x) { return trampoline(evalExpr(x, env)); }, expr) : (isSxTruthy((typeOf(head) == "symbol")) ? (function() { var name = symbolName(head); return (isSxTruthy((name == "if")) ? sfIf(args, env) : (isSxTruthy((name == "when")) ? sfWhen(args, env) : (isSxTruthy((name == "cond")) ? sfCond(args, env) : (isSxTruthy((name == "case")) ? sfCase(args, env) : (isSxTruthy((name == "and")) ? sfAnd(args, env) : (isSxTruthy((name == "or")) ? sfOr(args, env) : (isSxTruthy((name == "let")) ? sfLet(args, env) : (isSxTruthy((name == "let*")) ? sfLet(args, env) : (isSxTruthy((name == "letrec")) ? sfLetrec(args, env) : (isSxTruthy((name == "lambda")) ? sfLambda(args, env) : (isSxTruthy((name == "fn")) ? sfLambda(args, env) : (isSxTruthy((name == "define")) ? sfDefine(args, env) : (isSxTruthy((name == "defcomp")) ? sfDefcomp(args, env) : (isSxTruthy((name == "defmacro")) ? sfDefmacro(args, env) : (isSxTruthy((name == "defstyle")) ? sfDefstyle(args, env) : (isSxTruthy((name == "defkeyframes")) ? sfDefkeyframes(args, env) : (isSxTruthy((name == "defhandler")) ? sfDefhandler(args, env) : (isSxTruthy((name == "defpage")) ? sfDefpage(args, env) : (isSxTruthy((name == "defquery")) ? sfDefquery(args, env) : (isSxTruthy((name == "defaction")) ? sfDefaction(args, env) : (isSxTruthy((name == "begin")) ? sfBegin(args, env) : (isSxTruthy((name == "do")) ? sfBegin(args, env) : (isSxTruthy((name == "quote")) ? sfQuote(args, env) : (isSxTruthy((name == "quasiquote")) ? sfQuasiquote(args, env) : (isSxTruthy((name == "->")) ? sfThreadFirst(args, env) : (isSxTruthy((name == "set!")) ? sfSetBang(args, env) : (isSxTruthy((name == "reset")) ? sfReset(args, env) : (isSxTruthy((name == "shift")) ? sfShift(args, env) : (isSxTruthy((name == "dynamic-wind")) ? sfDynamicWind(args, env) : (isSxTruthy((name == "map")) ? hoMap(args, env) : (isSxTruthy((name == "map-indexed")) ? hoMapIndexed(args, env) : (isSxTruthy((name == "filter")) ? hoFilter(args, env) : (isSxTruthy((name == "reduce")) ? hoReduce(args, env) : (isSxTruthy((name == "some")) ? hoSome(args, env) : (isSxTruthy((name == "every?")) ? hoEvery(args, env) : (isSxTruthy((name == "for-each")) ? hoForEach(args, env) : (isSxTruthy((isSxTruthy(envHas(env, name)) && isMacro(envGet(env, name)))) ? (function() { var mac = envGet(env, name); @@ -563,7 +563,7 @@ var evalCall = function(head, args, env) { return (function() { var f = trampoline(evalExpr(head, env)); var evaluatedArgs = map(function(a) { return trampoline(evalExpr(a, env)); }, args); - return (isSxTruthy((isSxTruthy(isCallable(f)) && isSxTruthy(!isLambda(f)) && !isComponent(f))) ? apply(f, evaluatedArgs) : (isSxTruthy(isLambda(f)) ? callLambda(f, evaluatedArgs, env) : (isSxTruthy(isComponent(f)) ? callComponent(f, args, env) : error((String("Not callable: ") + String(inspect(f))))))); + return (isSxTruthy((isSxTruthy(isCallable(f)) && isSxTruthy(!isSxTruthy(isLambda(f))) && !isSxTruthy(isComponent(f)))) ? apply(f, evaluatedArgs) : (isSxTruthy(isLambda(f)) ? callLambda(f, evaluatedArgs, env) : (isSxTruthy(isComponent(f)) ? callComponent(f, args, env) : error((String("Not callable: ") + String(inspect(f))))))); })(); }; // call-lambda @@ -602,13 +602,13 @@ // sf-if var sfIf = function(args, env) { return (function() { var condition = trampoline(evalExpr(first(args), env)); - return (isSxTruthy((isSxTruthy(condition) && !isNil(condition))) ? makeThunk(nth(args, 1), env) : (isSxTruthy((len(args) > 2)) ? makeThunk(nth(args, 2), env) : NIL)); + return (isSxTruthy((isSxTruthy(condition) && !isSxTruthy(isNil(condition)))) ? makeThunk(nth(args, 1), env) : (isSxTruthy((len(args) > 2)) ? makeThunk(nth(args, 2), env) : NIL)); })(); }; // sf-when var sfWhen = function(args, env) { return (function() { var condition = trampoline(evalExpr(first(args), env)); - return (isSxTruthy((isSxTruthy(condition) && !isNil(condition))) ? (forEach(function(e) { return trampoline(evalExpr(e, env)); }, slice(args, 1, (len(args) - 1))), makeThunk(last(args), env)) : NIL); + return (isSxTruthy((isSxTruthy(condition) && !isSxTruthy(isNil(condition)))) ? (forEach(function(e) { return trampoline(evalExpr(e, env)); }, slice(args, 1, (len(args) - 1))), makeThunk(last(args), env)) : NIL); })(); }; // sf-cond @@ -646,7 +646,7 @@ // sf-and var sfAnd = function(args, env) { return (isSxTruthy(isEmpty(args)) ? true : (function() { var val = trampoline(evalExpr(first(args), env)); - return (isSxTruthy(!val) ? val : (isSxTruthy((len(args) == 1)) ? val : sfAnd(rest(args), env))); + return (isSxTruthy(!isSxTruthy(val)) ? val : (isSxTruthy((len(args) == 1)) ? val : sfAnd(rest(args), env))); })()); }; // sf-or @@ -793,7 +793,7 @@ return append_b(inits, nth(binding, 1)); }, bindings) : reduce(function(acc, pai var sfQuasiquote = function(args, env) { return qqExpand(first(args), env); }; // qq-expand - var qqExpand = function(template, env) { return (isSxTruthy(!(typeOf(template) == "list")) ? template : (isSxTruthy(isEmpty(template)) ? [] : (function() { + var qqExpand = function(template, env) { return (isSxTruthy(!isSxTruthy((typeOf(template) == "list"))) ? template : (isSxTruthy(isEmpty(template)) ? [] : (function() { var head = first(template); return (isSxTruthy((isSxTruthy((typeOf(head) == "symbol")) && (symbolName(head) == "unquote"))) ? trampoline(evalExpr(nth(template, 1), env)) : reduce(function(result, item) { return (isSxTruthy((isSxTruthy((typeOf(item) == "list")) && isSxTruthy((len(item) == 2)) && isSxTruthy((typeOf(first(item)) == "symbol")) && (symbolName(first(item)) == "splice-unquote"))) ? (function() { var spliced = trampoline(evalExpr(nth(item, 1), env)); @@ -808,10 +808,10 @@ return append_b(inits, nth(binding, 1)); }, bindings) : reduce(function(acc, pai var f = trampoline(evalExpr(first(form), env)); var restArgs = map(function(a) { return trampoline(evalExpr(a, env)); }, rest(form)); var allArgs = cons(result, restArgs); - return (isSxTruthy((isSxTruthy(isCallable(f)) && !isLambda(f))) ? apply(f, allArgs) : (isSxTruthy(isLambda(f)) ? trampoline(callLambda(f, allArgs, env)) : error((String("-> form not callable: ") + String(inspect(f)))))); + return (isSxTruthy((isSxTruthy(isCallable(f)) && !isSxTruthy(isLambda(f)))) ? apply(f, allArgs) : (isSxTruthy(isLambda(f)) ? trampoline(callLambda(f, allArgs, env)) : error((String("-> form not callable: ") + String(inspect(f)))))); })() : (function() { var f = trampoline(evalExpr(form, env)); - return (isSxTruthy((isSxTruthy(isCallable(f)) && !isLambda(f))) ? f(result) : (isSxTruthy(isLambda(f)) ? trampoline(callLambda(f, [result], env)) : error((String("-> form not callable: ") + String(inspect(f)))))); + return (isSxTruthy((isSxTruthy(isCallable(f)) && !isSxTruthy(isLambda(f)))) ? f(result) : (isSxTruthy(isLambda(f)) ? trampoline(callLambda(f, [result], env)) : error((String("-> form not callable: ") + String(inspect(f)))))); })()); }, val, rest(args)); })(); }; @@ -962,11 +962,11 @@ return append_b(inits, nth(binding, 1)); }, bindings) : reduce(function(acc, pai // render-attrs var renderAttrs = function(attrs) { return join("", map(function(key) { return (function() { var val = dictGet(attrs, key); - return (isSxTruthy((isSxTruthy(contains(BOOLEAN_ATTRS, key)) && val)) ? (String(" ") + String(key)) : (isSxTruthy((isSxTruthy(contains(BOOLEAN_ATTRS, key)) && !val)) ? "" : (isSxTruthy(isNil(val)) ? "" : (isSxTruthy((isSxTruthy((key == "style")) && isStyleValue(val))) ? (String(" class=\"") + String(styleValueClass(val)) + String("\"")) : (String(" ") + String(key) + String("=\"") + String(escapeAttr((String(val)))) + String("\"")))))); + return (isSxTruthy((isSxTruthy(contains(BOOLEAN_ATTRS, key)) && val)) ? (String(" ") + String(key)) : (isSxTruthy((isSxTruthy(contains(BOOLEAN_ATTRS, key)) && !isSxTruthy(val))) ? "" : (isSxTruthy(isNil(val)) ? "" : (isSxTruthy((isSxTruthy((key == "style")) && isStyleValue(val))) ? (String(" class=\"") + String(styleValueClass(val)) + String("\"")) : (String(" ") + String(key) + String("=\"") + String(escapeAttr((String(val)))) + String("\"")))))); })(); }, keys(attrs))); }; // eval-cond - var evalCond = function(clauses, env) { return (isSxTruthy((isSxTruthy(!isEmpty(clauses)) && isSxTruthy((typeOf(first(clauses)) == "list")) && (len(first(clauses)) == 2))) ? evalCondScheme(clauses, env) : evalCondClojure(clauses, env)); }; + var evalCond = function(clauses, env) { return (isSxTruthy((isSxTruthy(!isSxTruthy(isEmpty(clauses))) && isSxTruthy((typeOf(first(clauses)) == "list")) && (len(first(clauses)) == 2))) ? evalCondScheme(clauses, env) : evalCondClojure(clauses, env)); }; // eval-cond-scheme var evalCondScheme = function(clauses, env) { return (isSxTruthy(isEmpty(clauses)) ? NIL : (function() { @@ -1002,7 +1002,7 @@ return append_b(inits, nth(binding, 1)); }, bindings) : reduce(function(acc, pai var sxParse = function(source) { return (function() { var pos = 0; var lenSrc = len(source); - var skipComment = function() { while(true) { if (isSxTruthy((isSxTruthy((pos < lenSrc)) && !(nth(source, pos) == "\n")))) { pos = (pos + 1); + var skipComment = function() { while(true) { if (isSxTruthy((isSxTruthy((pos < lenSrc)) && !isSxTruthy((nth(source, pos) == "\n"))))) { pos = (pos + 1); continue; } else { return NIL; } } }; var skipWs = function() { while(true) { if (isSxTruthy((pos < lenSrc))) { { var ch = nth(source, pos); if (isSxTruthy(sxOr((ch == " "), (ch == "\t"), (ch == "\n"), (ch == "\\r")))) { pos = (pos + 1); @@ -1124,7 +1124,7 @@ continue; } else { return NIL; } } }; // render-list-to-html var renderListToHtml = function(expr, env) { return (isSxTruthy(isEmpty(expr)) ? "" : (function() { var head = first(expr); - return (isSxTruthy(!(typeOf(head) == "symbol")) ? join("", map(function(x) { return renderValueToHtml(x, env); }, expr)) : (function() { + return (isSxTruthy(!isSxTruthy((typeOf(head) == "symbol"))) ? join("", map(function(x) { return renderValueToHtml(x, env); }, expr)) : (function() { var name = symbolName(head); var args = rest(expr); return (isSxTruthy((name == "<>")) ? join("", map(function(x) { return renderToHtml(x, env); }, args)) : (isSxTruthy((name == "raw!")) ? join("", map(function(x) { return (String(trampoline(evalExpr(x, env)))); }, args)) : (isSxTruthy(contains(HTML_TAGS, name)) ? renderHtmlElement(name, args, env) : (isSxTruthy(startsWith(name, "~")) ? (function() { @@ -1138,7 +1138,7 @@ continue; } else { return NIL; } } }; var dispatchHtmlForm = function(name, expr, env) { return (isSxTruthy((name == "if")) ? (function() { var condVal = trampoline(evalExpr(nth(expr, 1), env)); return (isSxTruthy(condVal) ? renderToHtml(nth(expr, 2), env) : (isSxTruthy((len(expr) > 3)) ? renderToHtml(nth(expr, 3), env) : "")); -})() : (isSxTruthy((name == "when")) ? (isSxTruthy(!trampoline(evalExpr(nth(expr, 1), env))) ? "" : join("", map(function(i) { return renderToHtml(nth(expr, i), env); }, range(2, len(expr))))) : (isSxTruthy((name == "cond")) ? (function() { +})() : (isSxTruthy((name == "when")) ? (isSxTruthy(!isSxTruthy(trampoline(evalExpr(nth(expr, 1), env)))) ? "" : join("", map(function(i) { return renderToHtml(nth(expr, i), env); }, range(2, len(expr))))) : (isSxTruthy((name == "cond")) ? (function() { var branch = evalCond(rest(expr), env); return (isSxTruthy(branch) ? renderToHtml(branch, env) : ""); })() : (isSxTruthy((name == "case")) ? renderToHtml(trampoline(evalExpr(expr, env)), env) : (isSxTruthy(sxOr((name == "let"), (name == "let*"))) ? (function() { @@ -1215,19 +1215,19 @@ continue; } else { return NIL; } } }; var aserList = function(expr, env) { return (function() { var head = first(expr); var args = rest(expr); - return (isSxTruthy(!(typeOf(head) == "symbol")) ? map(function(x) { return aser(x, env); }, expr) : (function() { + return (isSxTruthy(!isSxTruthy((typeOf(head) == "symbol"))) ? map(function(x) { return aser(x, env); }, expr) : (function() { var name = symbolName(head); return (isSxTruthy((name == "<>")) ? aserFragment(args, env) : (isSxTruthy(startsWith(name, "~")) ? aserCall(name, args, env) : (isSxTruthy(contains(HTML_TAGS, name)) ? aserCall(name, args, env) : (isSxTruthy(sxOr(isSpecialForm(name), isHoForm(name))) ? aserSpecial(name, expr, env) : (isSxTruthy((isSxTruthy(envHas(env, name)) && isMacro(envGet(env, name)))) ? aser(expandMacro(envGet(env, name), args, env), env) : (function() { var f = trampoline(evalExpr(head, env)); var evaledArgs = map(function(a) { return trampoline(evalExpr(a, env)); }, args); - return (isSxTruthy((isSxTruthy(isCallable(f)) && isSxTruthy(!isLambda(f)) && !isComponent(f))) ? apply(f, evaledArgs) : (isSxTruthy(isLambda(f)) ? trampoline(callLambda(f, evaledArgs, env)) : (isSxTruthy(isComponent(f)) ? aserCall((String("~") + String(componentName(f))), args, env) : error((String("Not callable: ") + String(inspect(f))))))); + return (isSxTruthy((isSxTruthy(isCallable(f)) && isSxTruthy(!isSxTruthy(isLambda(f))) && !isSxTruthy(isComponent(f)))) ? apply(f, evaledArgs) : (isSxTruthy(isLambda(f)) ? trampoline(callLambda(f, evaledArgs, env)) : (isSxTruthy(isComponent(f)) ? aserCall((String("~") + String(componentName(f))), args, env) : error((String("Not callable: ") + String(inspect(f))))))); })()))))); })()); })(); }; // aser-fragment var aserFragment = function(children, env) { return (function() { - var parts = filter(function(x) { return !isNil(x); }, map(function(c) { return aser(c, env); }, children)); + var parts = filter(function(x) { return !isSxTruthy(isNil(x)); }, map(function(c) { return aser(c, env); }, children)); return (isSxTruthy(isEmpty(parts)) ? "" : (String("(<> ") + String(join(" ", map(serialize, parts))) + String(")"))); })(); }; @@ -1238,14 +1238,14 @@ continue; } else { return NIL; } } }; var skip = get(state, "skip"); return (isSxTruthy(skip) ? assoc(state, "skip", false, "i", (get(state, "i") + 1)) : (isSxTruthy((isSxTruthy((typeOf(arg) == "keyword")) && ((get(state, "i") + 1) < len(args)))) ? (function() { var val = aser(nth(args, (get(state, "i") + 1)), env); - if (isSxTruthy(!isNil(val))) { + if (isSxTruthy(!isSxTruthy(isNil(val)))) { parts.push((String(":") + String(keywordName(arg)))); parts.push(serialize(val)); } return assoc(state, "skip", true, "i", (get(state, "i") + 1)); })() : (function() { var val = aser(arg, env); - if (isSxTruthy(!isNil(val))) { + if (isSxTruthy(!isSxTruthy(isNil(val)))) { parts.push(serialize(val)); } return assoc(state, "i", (get(state, "i") + 1)); @@ -1295,7 +1295,7 @@ continue; } else { return NIL; } } }; var attrVal = trampoline(evalExpr(nth(args, (get(state, "i") + 1)), env)); (isSxTruthy(sxOr(isNil(attrVal), (attrVal == false))) ? NIL : (isSxTruthy((isSxTruthy((attrName == "style")) && isStyleValue(attrVal))) ? (extraClass = styleValueClass(attrVal)) : (isSxTruthy(contains(BOOLEAN_ATTRS, attrName)) ? (isSxTruthy(attrVal) ? domSetAttr(el, attrName, "") : NIL) : (isSxTruthy((attrVal == true)) ? domSetAttr(el, attrName, "") : domSetAttr(el, attrName, (String(attrVal))))))); return assoc(state, "skip", true, "i", (get(state, "i") + 1)); -})() : ((isSxTruthy(!contains(VOID_ELEMENTS, tag)) ? domAppend(el, renderToDom(arg, env, newNs)) : NIL), assoc(state, "i", (get(state, "i") + 1))))); +})() : ((isSxTruthy(!isSxTruthy(contains(VOID_ELEMENTS, tag))) ? domAppend(el, renderToDom(arg, env, newNs)) : NIL), assoc(state, "i", (get(state, "i") + 1))))); })(); }, {["i"]: 0, ["skip"]: false}, args); if (isSxTruthy(extraClass)) { (function() { @@ -1344,7 +1344,7 @@ continue; } else { return NIL; } } }; var frag = createFragment(); { var _c = args; for (var _i = 0; _i < _c.length; _i++) { var arg = _c[_i]; (function() { var val = trampoline(evalExpr(arg, env)); - return (isSxTruthy((typeOf(val) == "string")) ? domAppend(frag, domParseHtml(val)) : (isSxTruthy((typeOf(val) == "dom-node")) ? domAppend(frag, domClone(val)) : (isSxTruthy(!isNil(val)) ? domAppend(frag, createTextNode((String(val)))) : NIL))); + return (isSxTruthy((typeOf(val) == "string")) ? domAppend(frag, domParseHtml(val)) : (isSxTruthy((typeOf(val) == "dom-node")) ? domAppend(frag, domClone(val)) : (isSxTruthy(!isSxTruthy(isNil(val))) ? domAppend(frag, createTextNode((String(val)))) : NIL))); })(); } } return frag; })(); }; @@ -1367,7 +1367,7 @@ continue; } else { return NIL; } } }; var dispatchRenderForm = function(name, expr, env, ns) { return (isSxTruthy((name == "if")) ? (function() { var condVal = trampoline(evalExpr(nth(expr, 1), env)); return (isSxTruthy(condVal) ? renderToDom(nth(expr, 2), env, ns) : (isSxTruthy((len(expr) > 3)) ? renderToDom(nth(expr, 3), env, ns) : createFragment())); -})() : (isSxTruthy((name == "when")) ? (isSxTruthy(!trampoline(evalExpr(nth(expr, 1), env))) ? createFragment() : (function() { +})() : (isSxTruthy((name == "when")) ? (isSxTruthy(!isSxTruthy(trampoline(evalExpr(nth(expr, 1), env)))) ? createFragment() : (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), env, ns)); } } return frag; @@ -1434,7 +1434,7 @@ continue; } else { return NIL; } } }; // parse-trigger-spec var parseTriggerSpec = function(spec) { return (isSxTruthy(isNil(spec)) ? NIL : (function() { var rawParts = split(spec, ","); - return filter(function(x) { return !isNil(x); }, map(function(part) { return (function() { + return filter(function(x) { return !isSxTruthy(isNil(x)); }, map(function(part) { return (function() { var tokens = split(trim(part), " "); return (isSxTruthy(isEmpty(tokens)) ? NIL : (isSxTruthy((isSxTruthy((first(tokens) == "every")) && (len(tokens) >= 2))) ? {["event"]: "every", ["modifiers"]: {["interval"]: parseTime(nth(tokens, 1))}} : (function() { var mods = {}; @@ -1460,7 +1460,7 @@ continue; } else { return NIL; } } }; var targetSel = domGetAttr(el, "sx-target"); return (isSxTruthy(targetSel) ? dictSet(headers, "SX-Target", targetSel) : NIL); })(); - if (isSxTruthy(!isEmpty(loadedComponents))) { + if (isSxTruthy(!isSxTruthy(isEmpty(loadedComponents)))) { headers["SX-Components"] = join(",", loadedComponents); } if (isSxTruthy(cssHash)) { @@ -1500,7 +1500,7 @@ continue; } else { return NIL; } } }; // filter-params var filterParams = function(paramsSpec, allParams) { return (isSxTruthy(isNil(paramsSpec)) ? allParams : (isSxTruthy((paramsSpec == "none")) ? [] : (isSxTruthy((paramsSpec == "*")) ? allParams : (isSxTruthy(startsWith(paramsSpec, "not ")) ? (function() { var excluded = map(trim, split(slice(paramsSpec, 4), ",")); - return filter(function(p) { return !contains(excluded, first(p)); }, allParams); + return filter(function(p) { return !isSxTruthy(contains(excluded, first(p))); }, allParams); })() : (function() { var allowed = map(trim, split(paramsSpec, ",")); return filter(function(p) { return contains(allowed, first(p)); }, allParams); @@ -1550,15 +1550,15 @@ continue; } else { return NIL; } } }; })(); }; // morph-node - var morphNode = function(oldNode, newNode) { return (isSxTruthy(sxOr(domHasAttr(oldNode, "sx-preserve"), domHasAttr(oldNode, "sx-ignore"))) ? NIL : (isSxTruthy(sxOr(!(domNodeType(oldNode) == domNodeType(newNode)), !(domNodeName(oldNode) == domNodeName(newNode)))) ? domReplaceChild(domParent(oldNode), domClone(newNode), oldNode) : (isSxTruthy(sxOr((domNodeType(oldNode) == 3), (domNodeType(oldNode) == 8))) ? (isSxTruthy(!(domTextContent(oldNode) == domTextContent(newNode))) ? domSetTextContent(oldNode, domTextContent(newNode)) : NIL) : (isSxTruthy((domNodeType(oldNode) == 1)) ? (syncAttrs(oldNode, newNode), (isSxTruthy(!(isSxTruthy(domIsActiveElement(oldNode)) && domIsInputElement(oldNode))) ? morphChildren(oldNode, newNode) : NIL)) : NIL)))); }; + var morphNode = function(oldNode, newNode) { return (isSxTruthy(sxOr(domHasAttr(oldNode, "sx-preserve"), domHasAttr(oldNode, "sx-ignore"))) ? NIL : (isSxTruthy(sxOr(!isSxTruthy((domNodeType(oldNode) == domNodeType(newNode))), !isSxTruthy((domNodeName(oldNode) == domNodeName(newNode))))) ? domReplaceChild(domParent(oldNode), domClone(newNode), oldNode) : (isSxTruthy(sxOr((domNodeType(oldNode) == 3), (domNodeType(oldNode) == 8))) ? (isSxTruthy(!isSxTruthy((domTextContent(oldNode) == domTextContent(newNode)))) ? domSetTextContent(oldNode, domTextContent(newNode)) : NIL) : (isSxTruthy((domNodeType(oldNode) == 1)) ? (syncAttrs(oldNode, newNode), (isSxTruthy(!isSxTruthy((isSxTruthy(domIsActiveElement(oldNode)) && domIsInputElement(oldNode)))) ? morphChildren(oldNode, newNode) : NIL)) : NIL)))); }; // sync-attrs var syncAttrs = function(oldEl, newEl) { { var _c = domAttrList(newEl); for (var _i = 0; _i < _c.length; _i++) { var attr = _c[_i]; (function() { var name = first(attr); var val = nth(attr, 1); - return (isSxTruthy(!(domGetAttr(oldEl, name) == val)) ? domSetAttr(oldEl, name, val) : NIL); + return (isSxTruthy(!isSxTruthy((domGetAttr(oldEl, name) == val))) ? domSetAttr(oldEl, name, val) : NIL); })(); } } -return forEach(function(attr) { return (isSxTruthy(!domHasAttr(newEl, first(attr))) ? domRemoveAttr(oldEl, first(attr)) : NIL); }, domAttrList(oldEl)); }; +return forEach(function(attr) { return (isSxTruthy(!isSxTruthy(domHasAttr(newEl, first(attr)))) ? domRemoveAttr(oldEl, first(attr)) : NIL); }, domAttrList(oldEl)); }; // morph-children var morphChildren = function(oldParent, newParent) { return (function() { @@ -1572,14 +1572,14 @@ return forEach(function(attr) { return (isSxTruthy(!domHasAttr(newEl, first(attr { var _c = newKids; for (var _i = 0; _i < _c.length; _i++) { var newChild = _c[_i]; (function() { var matchId = domId(newChild); var matchById = (isSxTruthy(matchId) ? dictGet(oldById, matchId) : NIL); - return (isSxTruthy((isSxTruthy(matchById) && !isNil(matchById))) ? ((isSxTruthy((isSxTruthy((oi < len(oldKids))) && !(matchById == nth(oldKids, oi)))) ? domInsertBefore(oldParent, matchById, (isSxTruthy((oi < len(oldKids))) ? nth(oldKids, oi) : NIL)) : NIL), morphNode(matchById, newChild), (oi = (oi + 1))) : (isSxTruthy((oi < len(oldKids))) ? (function() { + return (isSxTruthy((isSxTruthy(matchById) && !isSxTruthy(isNil(matchById)))) ? ((isSxTruthy((isSxTruthy((oi < len(oldKids))) && !isSxTruthy((matchById == nth(oldKids, oi))))) ? domInsertBefore(oldParent, matchById, (isSxTruthy((oi < len(oldKids))) ? nth(oldKids, oi) : NIL)) : NIL), morphNode(matchById, newChild), (oi = (oi + 1))) : (isSxTruthy((oi < len(oldKids))) ? (function() { var oldChild = nth(oldKids, oi); - return (isSxTruthy((isSxTruthy(domId(oldChild)) && !matchId)) ? domInsertBefore(oldParent, domClone(newChild), oldChild) : (morphNode(oldChild, newChild), (oi = (oi + 1)))); + return (isSxTruthy((isSxTruthy(domId(oldChild)) && !isSxTruthy(matchId))) ? domInsertBefore(oldParent, domClone(newChild), oldChild) : (morphNode(oldChild, newChild), (oi = (oi + 1)))); })() : domAppend(oldParent, domClone(newChild)))); })(); } } return forEach(function(i) { return (isSxTruthy((i >= oi)) ? (function() { var leftover = nth(oldKids, i); - return (isSxTruthy((isSxTruthy(domIsChildOf(leftover, oldParent)) && isSxTruthy(!domHasAttr(leftover, "sx-preserve")) && !domHasAttr(leftover, "sx-ignore"))) ? domRemoveChild(oldParent, leftover) : NIL); + return (isSxTruthy((isSxTruthy(domIsChildOf(leftover, oldParent)) && isSxTruthy(!isSxTruthy(domHasAttr(leftover, "sx-preserve"))) && !isSxTruthy(domHasAttr(leftover, "sx-ignore")))) ? domRemoveChild(oldParent, leftover) : NIL); })() : NIL); }, range(oi, len(oldKids))); })(); }; @@ -1624,7 +1624,7 @@ return forEach(function(attr) { return (isSxTruthy(!domHasAttr(newEl, first(attr var pushUrl = domGetAttr(el, "sx-push-url"); var replaceUrl = domGetAttr(el, "sx-replace-url"); var hdrReplace = get(respHeaders, "replace-url"); - return (isSxTruthy(hdrReplace) ? browserReplaceState(hdrReplace) : (isSxTruthy((isSxTruthy(pushUrl) && !(pushUrl == "false"))) ? browserPushState((isSxTruthy((pushUrl == "true")) ? url : pushUrl)) : (isSxTruthy((isSxTruthy(replaceUrl) && !(replaceUrl == "false"))) ? browserReplaceState((isSxTruthy((replaceUrl == "true")) ? url : replaceUrl)) : NIL))); + return (isSxTruthy(hdrReplace) ? browserReplaceState(hdrReplace) : (isSxTruthy((isSxTruthy(pushUrl) && !isSxTruthy((pushUrl == "false")))) ? browserPushState((isSxTruthy((pushUrl == "true")) ? url : pushUrl)) : (isSxTruthy((isSxTruthy(replaceUrl) && !isSxTruthy((replaceUrl == "false")))) ? browserReplaceState((isSxTruthy((replaceUrl == "true")) ? url : replaceUrl)) : NIL))); })(); }; // PRELOAD_TTL @@ -1648,11 +1648,11 @@ return forEach(function(attr) { return (isSxTruthy(!domHasAttr(newEl, first(attr // should-boost-link? var shouldBoostLink = function(link) { return (function() { var href = domGetAttr(link, "href"); - return (isSxTruthy(href) && isSxTruthy(!startsWith(href, "#")) && isSxTruthy(!startsWith(href, "javascript:")) && isSxTruthy(!startsWith(href, "mailto:")) && isSxTruthy(browserSameOrigin(href)) && isSxTruthy(!domHasAttr(link, "sx-get")) && isSxTruthy(!domHasAttr(link, "sx-post")) && !domHasAttr(link, "sx-disable")); + return (isSxTruthy(href) && isSxTruthy(!isSxTruthy(startsWith(href, "#"))) && isSxTruthy(!isSxTruthy(startsWith(href, "javascript:"))) && isSxTruthy(!isSxTruthy(startsWith(href, "mailto:"))) && isSxTruthy(browserSameOrigin(href)) && isSxTruthy(!isSxTruthy(domHasAttr(link, "sx-get"))) && isSxTruthy(!isSxTruthy(domHasAttr(link, "sx-post"))) && !isSxTruthy(domHasAttr(link, "sx-disable"))); })(); }; // should-boost-form? - var shouldBoostForm = function(form) { return (isSxTruthy(!domHasAttr(form, "sx-get")) && isSxTruthy(!domHasAttr(form, "sx-post")) && !domHasAttr(form, "sx-disable")); }; + var shouldBoostForm = function(form) { return (isSxTruthy(!isSxTruthy(domHasAttr(form, "sx-get"))) && isSxTruthy(!isSxTruthy(domHasAttr(form, "sx-post"))) && !isSxTruthy(domHasAttr(form, "sx-disable"))); }; // parse-sse-swap var parseSseSwap = function(el) { return sxOr(domGetAttr(el, "sx-sse-swap"), "message"); }; @@ -1671,7 +1671,7 @@ return forEach(function(attr) { return (isSxTruthy(!domHasAttr(newEl, first(attr var parsed = tryParseJson(headerVal); return (isSxTruthy(parsed) ? forEach(function(key) { return domDispatch(el, key, get(parsed, key)); }, keys(parsed)) : forEach(function(name) { return (function() { var trimmed = trim(name); - return (isSxTruthy(!isEmpty(trimmed)) ? domDispatch(el, trimmed, {}) : NIL); + return (isSxTruthy(!isSxTruthy(isEmpty(trimmed))) ? domDispatch(el, trimmed, {}) : NIL); })(); }, split(headerVal, ","))); })() : NIL); }; @@ -1692,14 +1692,14 @@ return forEach(function(attr) { return (isSxTruthy(!domHasAttr(newEl, first(attr var url = get(info, "url"); return (isSxTruthy((function() { var media = domGetAttr(el, "sx-media"); - return (isSxTruthy(media) && !browserMediaMatches(media)); + return (isSxTruthy(media) && !isSxTruthy(browserMediaMatches(media))); })()) ? promiseResolve(NIL) : (isSxTruthy((function() { var confirmMsg = domGetAttr(el, "sx-confirm"); - return (isSxTruthy(confirmMsg) && !browserConfirm(confirmMsg)); + return (isSxTruthy(confirmMsg) && !isSxTruthy(browserConfirm(confirmMsg))); })()) ? promiseResolve(NIL) : (function() { var promptMsg = domGetAttr(el, "sx-prompt"); var promptVal = (isSxTruthy(promptMsg) ? browserPrompt(promptMsg) : NIL); - return (isSxTruthy((isSxTruthy(promptMsg) && isNil(promptVal))) ? promiseResolve(NIL) : (isSxTruthy(!validateForRequest(el)) ? promiseResolve(NIL) : doFetch(el, verb, verb, url, (isSxTruthy(promptVal) ? assoc(sxOr(extraParams, {}), "SX-Prompt", promptVal) : extraParams)))); + return (isSxTruthy((isSxTruthy(promptMsg) && isNil(promptVal))) ? promiseResolve(NIL) : (isSxTruthy(!isSxTruthy(validateForRequest(el))) ? promiseResolve(NIL) : doFetch(el, verb, verb, url, (isSxTruthy(promptVal) ? assoc(sxOr(extraParams, {}), "SX-Prompt", promptVal) : extraParams)))); })())); })()); })(); }; @@ -1737,7 +1737,7 @@ return forEach(function(attr) { return (isSxTruthy(!domHasAttr(newEl, first(attr domAddClass(el, "sx-request"); domSetAttr(el, "aria-busy", "true"); domDispatch(el, "sx:beforeRequest", {["url"]: finalUrl, ["method"]: method}); - return fetchRequest({["url"]: finalUrl, ["method"]: method, ["headers"]: headers, ["body"]: body, ["signal"]: controllerSignal(ctrl), ["cross-origin"]: isCrossOrigin(finalUrl), ["preloaded"]: cached}, function(respOk, status, getHeader, text) { return (clearLoadingState(el, indicator, disabledElts), revertOptimistic(optimisticState), (isSxTruthy(!respOk) ? (domDispatch(el, "sx:responseError", {["status"]: status, ["text"]: text}), handleRetry(el, verb, method, finalUrl, extraParams)) : (domDispatch(el, "sx:afterRequest", {["status"]: status}), handleFetchSuccess(el, finalUrl, verb, extraParams, getHeader, text)))); }, function(err) { return (clearLoadingState(el, indicator, disabledElts), revertOptimistic(optimisticState), (isSxTruthy(!isAbortError(err)) ? domDispatch(el, "sx:requestError", {["error"]: err}) : NIL)); }); + return fetchRequest({["url"]: finalUrl, ["method"]: method, ["headers"]: headers, ["body"]: body, ["signal"]: controllerSignal(ctrl), ["cross-origin"]: isCrossOrigin(finalUrl), ["preloaded"]: cached}, function(respOk, status, getHeader, text) { return (clearLoadingState(el, indicator, disabledElts), revertOptimistic(optimisticState), (isSxTruthy(!isSxTruthy(respOk)) ? (domDispatch(el, "sx:responseError", {["status"]: status, ["text"]: text}), handleRetry(el, verb, method, finalUrl, extraParams)) : (domDispatch(el, "sx:afterRequest", {["status"]: status}), handleFetchSuccess(el, finalUrl, verb, extraParams, getHeader, text)))); }, function(err) { return (clearLoadingState(el, indicator, disabledElts), revertOptimistic(optimisticState), (isSxTruthy(!isSxTruthy(isAbortError(err))) ? domDispatch(el, "sx:requestError", {["error"]: err}) : NIL)); }); })(); })(); })(); @@ -1774,7 +1774,7 @@ return forEach(function(attr) { return (isSxTruthy(!domHasAttr(newEl, first(attr var final = extractResponseCss(cleaned); return (function() { var trimmed = trim(final); - return (isSxTruthy(!isEmpty(trimmed)) ? (function() { + return (isSxTruthy(!isSxTruthy(isEmpty(trimmed))) ? (function() { var rendered = sxRender(trimmed); var container = domCreateElement("div", NIL); domAppend(container, rendered); @@ -1842,8 +1842,7 @@ return postSwap(target); }); var timer = NIL; var lastVal = NIL; var listenTarget = (isSxTruthy(get(mods, "from")) ? domQuery(get(mods, "from")) : el); - return (isSxTruthy(listenTarget) ? domAddListener(listenTarget, eventName, function(e) { logInfo((String("sx:click") + String(" c1=") + String((eventName == "click")) + String(" c2=") + String((get(verbInfo, "method") == "GET")) + String(" c3=") + String(domHasAttr(el, "href")) + String(" c4=") + String(!get(mods, "delay")) + String(" href=") + String(domGetAttr(el, "href")))); -return (function() { + return (isSxTruthy(listenTarget) ? domAddListener(listenTarget, eventName, function(e) { return (function() { var shouldFire = true; if (isSxTruthy(get(mods, "changed"))) { (function() { @@ -1852,7 +1851,7 @@ return (function() { })(); } return (isSxTruthy(shouldFire) ? ((isSxTruthy(sxOr((eventName == "submit"), (isSxTruthy((eventName == "click")) && domHasAttr(el, "href")))) ? preventDefault_(e) : NIL), (function() { - var isGetLink = (isSxTruthy((eventName == "click")) && isSxTruthy((get(verbInfo, "method") == "GET")) && isSxTruthy(domHasAttr(el, "href")) && !get(mods, "delay")); + var isGetLink = (isSxTruthy((eventName == "click")) && isSxTruthy((get(verbInfo, "method") == "GET")) && isSxTruthy(domHasAttr(el, "href")) && !isSxTruthy(get(mods, "delay"))); var clientRouted = false; if (isSxTruthy(isGetLink)) { logInfo((String("sx:route trying ") + String(get(verbInfo, "url")))); @@ -1872,7 +1871,7 @@ return processElements(root); }; // activate-scripts var activateScripts = function(root) { return (isSxTruthy(root) ? (function() { var scripts = domQueryAll(root, "script"); - return forEach(function(dead) { return (isSxTruthy((isSxTruthy(!domHasAttr(dead, "data-components")) && !domHasAttr(dead, "data-sx-activated"))) ? (function() { + return forEach(function(dead) { return (isSxTruthy((isSxTruthy(!isSxTruthy(domHasAttr(dead, "data-components"))) && !isSxTruthy(domHasAttr(dead, "data-sx-activated")))) ? (function() { var live = createScriptClone(dead); domSetAttr(live, "data-sx-activated", "true"); return domReplaceChild(domParent(dead), live, dead); @@ -1908,26 +1907,26 @@ return domAppendToHead(link); }, domQueryAll(container, "link[rel=\"stylesheet\" var processBoosted = function(root) { return forEach(function(container) { return boostDescendants(container); }, domQueryAll(sxOr(root, domBody()), "[sx-boost]")); }; // boost-descendants - var boostDescendants = function(container) { { var _c = domQueryAll(container, "a[href]"); for (var _i = 0; _i < _c.length; _i++) { var link = _c[_i]; if (isSxTruthy((isSxTruthy(!isProcessed(link, "boost")) && shouldBoostLink(link)))) { + var boostDescendants = function(container) { { var _c = domQueryAll(container, "a[href]"); for (var _i = 0; _i < _c.length; _i++) { var link = _c[_i]; if (isSxTruthy((isSxTruthy(!isSxTruthy(isProcessed(link, "boost"))) && shouldBoostLink(link)))) { markProcessed(link, "boost"); - if (isSxTruthy(!domHasAttr(link, "sx-target"))) { + if (isSxTruthy(!isSxTruthy(domHasAttr(link, "sx-target")))) { domSetAttr(link, "sx-target", "#main-panel"); } - if (isSxTruthy(!domHasAttr(link, "sx-swap"))) { + if (isSxTruthy(!isSxTruthy(domHasAttr(link, "sx-swap")))) { domSetAttr(link, "sx-swap", "innerHTML"); } - if (isSxTruthy(!domHasAttr(link, "sx-push-url"))) { + if (isSxTruthy(!isSxTruthy(domHasAttr(link, "sx-push-url")))) { domSetAttr(link, "sx-push-url", "true"); } bindClientRouteLink(link, domGetAttr(link, "href")); } } } -return forEach(function(form) { return (isSxTruthy((isSxTruthy(!isProcessed(form, "boost")) && shouldBoostForm(form))) ? (markProcessed(form, "boost"), (function() { +return forEach(function(form) { return (isSxTruthy((isSxTruthy(!isSxTruthy(isProcessed(form, "boost"))) && shouldBoostForm(form))) ? (markProcessed(form, "boost"), (function() { var method = upper(sxOr(domGetAttr(form, "method"), "GET")); var action = sxOr(domGetAttr(form, "action"), browserLocationHref()); - if (isSxTruthy(!domHasAttr(form, "sx-target"))) { + if (isSxTruthy(!isSxTruthy(domHasAttr(form, "sx-target")))) { domSetAttr(form, "sx-target", "#main-panel"); } - if (isSxTruthy(!domHasAttr(form, "sx-swap"))) { + if (isSxTruthy(!isSxTruthy(domHasAttr(form, "sx-swap")))) { domSetAttr(form, "sx-swap", "innerHTML"); } return bindBoostForm(form, method, action); @@ -1955,7 +1954,7 @@ return forEach(function(form) { return (isSxTruthy((isSxTruthy(!isProcessed(form var bindClientRouteLink = function(link, href) { return bindClientRouteClick(link, href, function() { return bindBoostLink(link, href); }); }; // process-sse - var processSse = function(root) { return forEach(function(el) { return (isSxTruthy(!isProcessed(el, "sse")) ? (markProcessed(el, "sse"), bindSse(el)) : NIL); }, domQueryAll(sxOr(root, domBody()), "[sx-sse]")); }; + var processSse = function(root) { return forEach(function(el) { return (isSxTruthy(!isSxTruthy(isProcessed(el, "sse"))) ? (markProcessed(el, "sse"), bindSse(el)) : NIL); }, domQueryAll(sxOr(root, domBody()), "[sx-sse]")); }; // bind-sse var bindSse = function(el) { return (function() { @@ -1974,7 +1973,7 @@ return forEach(function(form) { return (isSxTruthy((isSxTruthy(!isProcessed(form var swapStyle = get(swapSpec, "style"); var useTransition = get(swapSpec, "transition"); var trimmed = trim(data); - return (isSxTruthy(!isEmpty(trimmed)) ? (isSxTruthy(startsWith(trimmed, "(")) ? (function() { + return (isSxTruthy(!isSxTruthy(isEmpty(trimmed))) ? (isSxTruthy(startsWith(trimmed, "(")) ? (function() { var rendered = sxRender(trimmed); var container = domCreateElement("div", NIL); domAppend(container, rendered); @@ -1990,7 +1989,7 @@ return postSwap(target); })) : NIL); var body = nth(attr, 1); return (isSxTruthy(startsWith(name, "sx-on:")) ? (function() { var eventName = slice(name, 6); - return (isSxTruthy(!isProcessed(el, (String("on:") + String(eventName)))) ? (markProcessed(el, (String("on:") + String(eventName))), bindInlineHandler(el, eventName, body)) : NIL); + return (isSxTruthy(!isSxTruthy(isProcessed(el, (String("on:") + String(eventName))))) ? (markProcessed(el, (String("on:") + String(eventName))), bindInlineHandler(el, eventName, body)) : NIL); })() : NIL); })(); }, domAttrList(el)); }, domQueryAll(sxOr(root, domBody()), "[sx-on\\:beforeRequest],[sx-on\\:afterRequest],[sx-on\\:afterSwap],[sx-on\\:afterSettle],[sx-on\\:load]")); }; @@ -2018,7 +2017,7 @@ return postSwap(target); })) : NIL); // process-elements var processElements = function(root) { (function() { var els = domQueryAll(sxOr(root, domBody()), VERB_SELECTOR); - return forEach(function(el) { return (isSxTruthy(!isProcessed(el, "verb")) ? (markProcessed(el, "verb"), processOne(el)) : NIL); }, els); + return forEach(function(el) { return (isSxTruthy(!isSxTruthy(isProcessed(el, "verb"))) ? (markProcessed(el, "verb"), processOne(el)) : NIL); }, els); })(); processBoosted(root); processSse(root); @@ -2027,7 +2026,7 @@ return bindInlineHandlers(root); }; // process-one var processOne = function(el) { return (function() { var verbInfo = getVerbInfo(el); - return (isSxTruthy(verbInfo) ? (isSxTruthy(!domHasAttr(el, "sx-disable")) ? (bindTriggers(el, verbInfo), bindPreloadFor(el)) : NIL) : NIL); + return (isSxTruthy(verbInfo) ? (isSxTruthy(!isSxTruthy(domHasAttr(el, "sx-disable"))) ? (bindTriggers(el, verbInfo), bindPreloadFor(el)) : NIL) : NIL); })(); }; // handle-popstate @@ -2117,7 +2116,7 @@ return (_styleCache = {}); }; // resolve-atom var resolveAtom = function(atom) { return (function() { var decls = dictGet(_styleAtoms, atom); - return (isSxTruthy(!isNil(decls)) ? decls : (isSxTruthy(startsWith(atom, "animate-")) ? (function() { + return (isSxTruthy(!isSxTruthy(isNil(decls))) ? decls : (isSxTruthy(startsWith(atom, "animate-")) ? (function() { var kfName = slice(atom, 8); return (isSxTruthy(dictHas(_styleKeyframes, kfName)) ? (String("animation-name:") + String(kfName)) : NIL); })() : (function() { @@ -2143,7 +2142,7 @@ return (_styleCache = {}); }; var key = join("\\0", atoms); return (function() { var cached = dictGet(_styleCache, key); - return (isSxTruthy(!isNil(cached)) ? cached : (function() { + return (isSxTruthy(!isSxTruthy(isNil(cached))) ? cached : (function() { var baseDecls = []; var mediaRules = []; var pseudoRules = []; @@ -2258,7 +2257,7 @@ allKf = concat(allKf, styleValueKeyframes_(sv)); } } // sx-hydrate-elements var sxHydrateElements = function(root) { return (function() { var els = domQueryAll(sxOr(root, domBody()), "[data-sx]"); - return forEach(function(el) { return (isSxTruthy(!isProcessed(el, "hydrated")) ? (markProcessed(el, "hydrated"), sxUpdateElement(el, NIL)) : NIL); }, els); + return forEach(function(el) { return (isSxTruthy(!isSxTruthy(isProcessed(el, "hydrated"))) ? (markProcessed(el, "hydrated"), sxUpdateElement(el, NIL)) : NIL); }, els); })(); }; // sx-update-element @@ -2285,7 +2284,7 @@ allKf = concat(allKf, styleValueKeyframes_(sv)); } } return (function() { var env = getRenderEnv(extraEnv); var comp = envGet(env, fullName); - return (isSxTruthy(!isComponent(comp)) ? error((String("Unknown component: ") + String(fullName))) : (function() { + return (isSxTruthy(!isSxTruthy(isComponent(comp))) ? error((String("Unknown component: ") + String(fullName))) : (function() { var callExpr = [makeSymbol(fullName)]; { var _c = keys(kwargs); for (var _i = 0; _i < _c.length; _i++) { var k = _c[_i]; callExpr.push(makeKeyword(toKebab(k))); callExpr.push(dictGet(kwargs, k)); } } @@ -2297,7 +2296,7 @@ callExpr.push(dictGet(kwargs, k)); } } // process-sx-scripts var processSxScripts = function(root) { return (function() { var scripts = querySxScripts(root); - return forEach(function(s) { return (isSxTruthy(!isProcessed(s, "script")) ? (markProcessed(s, "script"), (function() { + return forEach(function(s) { return (isSxTruthy(!isSxTruthy(isProcessed(s, "script"))) ? (markProcessed(s, "script"), (function() { var text = domTextContent(s); return (isSxTruthy(domHasAttr(s, "data-components")) ? processComponentScript(s, text) : (isSxTruthy(sxOr(isNil(text), isEmpty(trim(text)))) ? NIL : (isSxTruthy(domHasAttr(s, "data-mount")) ? (function() { var mountSel = domGetAttr(s, "data-mount"); @@ -2310,8 +2309,8 @@ callExpr.push(dictGet(kwargs, k)); } } // process-component-script var processComponentScript = function(script, text) { return (function() { var hash = domGetAttr(script, "data-hash"); - return (isSxTruthy(isNil(hash)) ? (isSxTruthy((isSxTruthy(text) && !isEmpty(trim(text)))) ? sxLoadComponents(text) : NIL) : (function() { - var hasInline = (isSxTruthy(text) && !isEmpty(trim(text))); + return (isSxTruthy(isNil(hash)) ? (isSxTruthy((isSxTruthy(text) && !isSxTruthy(isEmpty(trim(text))))) ? sxLoadComponents(text) : NIL) : (function() { + var hasInline = (isSxTruthy(text) && !isSxTruthy(isEmpty(trim(text)))); (function() { var cachedHash = localStorageGet("sx-components-hash"); return (isSxTruthy((cachedHash == hash)) ? (isSxTruthy(hasInline) ? (localStorageSet("sx-components-hash", hash), localStorageSet("sx-components-src", text), sxLoadComponents(text), logInfo("components: downloaded (cookie stale)")) : (function() { @@ -2326,11 +2325,11 @@ callExpr.push(dictGet(kwargs, k)); } } // init-style-dict var initStyleDict = function() { return (function() { var scripts = queryStyleScripts(); - return forEach(function(s) { return (isSxTruthy(!isProcessed(s, "styles")) ? (markProcessed(s, "styles"), (function() { + return forEach(function(s) { return (isSxTruthy(!isSxTruthy(isProcessed(s, "styles"))) ? (markProcessed(s, "styles"), (function() { var text = domTextContent(s); var hash = domGetAttr(s, "data-hash"); - return (isSxTruthy(isNil(hash)) ? (isSxTruthy((isSxTruthy(text) && !isEmpty(trim(text)))) ? parseAndLoadStyleDict(text) : NIL) : (function() { - var hasInline = (isSxTruthy(text) && !isEmpty(trim(text))); + return (isSxTruthy(isNil(hash)) ? (isSxTruthy((isSxTruthy(text) && !isSxTruthy(isEmpty(trim(text))))) ? parseAndLoadStyleDict(text) : NIL) : (function() { + var hasInline = (isSxTruthy(text) && !isSxTruthy(isEmpty(trim(text)))); (function() { var cachedHash = localStorageGet("sx-styles-hash"); return (isSxTruthy((cachedHash == hash)) ? (isSxTruthy(hasInline) ? (localStorageSet("sx-styles-src", text), parseAndLoadStyleDict(text), logInfo("styles: downloaded (cookie stale)")) : (function() { @@ -2350,12 +2349,12 @@ callExpr.push(dictGet(kwargs, k)); } } var processPageScripts = function() { return (function() { var scripts = queryPageScripts(); logInfo((String("pages: found ") + String(len(scripts)) + String(" script tags"))); - { var _c = scripts; for (var _i = 0; _i < _c.length; _i++) { var s = _c[_i]; if (isSxTruthy(!isProcessed(s, "pages"))) { + { var _c = scripts; for (var _i = 0; _i < _c.length; _i++) { var s = _c[_i]; if (isSxTruthy(!isSxTruthy(isProcessed(s, "pages")))) { markProcessed(s, "pages"); (function() { var text = domTextContent(s); logInfo((String("pages: script text length=") + String((isSxTruthy(text) ? len(text) : 0)))); - return (isSxTruthy((isSxTruthy(text) && !isEmpty(trim(text)))) ? (function() { + return (isSxTruthy((isSxTruthy(text) && !isSxTruthy(isEmpty(trim(text))))) ? (function() { var pages = parse(text); logInfo((String("pages: parsed ") + String(len(pages)) + String(" entries"))); return forEach(function(page) { return append_b(_pageRoutes, merge(page, {"parsed": parseRoutePattern(get(page, "path"))})); }, pages); @@ -2375,7 +2374,7 @@ callExpr.push(dictGet(kwargs, k)); } } var splitPathSegments = function(path) { return (function() { var trimmed = (isSxTruthy(startsWith(path, "/")) ? slice(path, 1) : path); return (function() { - var trimmed2 = (isSxTruthy((isSxTruthy(!isEmpty(trimmed)) && endsWith(trimmed, "/"))) ? slice(trimmed, 0, (len(trimmed) - 1)) : trimmed); + var trimmed2 = (isSxTruthy((isSxTruthy(!isSxTruthy(isEmpty(trimmed))) && endsWith(trimmed, "/"))) ? slice(trimmed, 0, (len(trimmed) - 1)) : trimmed); return (isSxTruthy(isEmpty(trimmed2)) ? [] : split(trimmed2, "/")); })(); })(); }; @@ -2403,13 +2402,13 @@ callExpr.push(dictGet(kwargs, k)); } } })(); }; // match-route-segments - var matchRouteSegments = function(pathSegs, parsedSegs) { return (isSxTruthy(!(len(pathSegs) == len(parsedSegs))) ? NIL : (function() { + var matchRouteSegments = function(pathSegs, parsedSegs) { return (isSxTruthy(!isSxTruthy((len(pathSegs) == len(parsedSegs)))) ? NIL : (function() { var params = {}; var matched = true; forEachIndexed(function(i, parsedSeg) { return (isSxTruthy(matched) ? (function() { var pathSeg = nth(pathSegs, i); var segType = get(parsedSeg, "type"); - return (isSxTruthy((segType == "literal")) ? (isSxTruthy(!(pathSeg == get(parsedSeg, "value"))) ? (matched = false) : NIL) : (isSxTruthy((segType == "param")) ? dictSet(params, get(parsedSeg, "value"), pathSeg) : (matched = false))); + return (isSxTruthy((segType == "literal")) ? (isSxTruthy(!isSxTruthy((pathSeg == get(parsedSeg, "value")))) ? (matched = false) : NIL) : (isSxTruthy((segType == "param")) ? dictSet(params, get(parsedSeg, "value"), pathSeg) : (matched = false))); })() : NIL); }, parsedSegs); return (isSxTruthy(matched) ? params : NIL); })()); }; @@ -2428,7 +2427,7 @@ callExpr.push(dictGet(kwargs, k)); } } { var _c = routes; for (var _i = 0; _i < _c.length; _i++) { var route = _c[_i]; if (isSxTruthy(isNil(result))) { (function() { var params = matchRouteSegments(pathSegs, get(route, "parsed")); - return (isSxTruthy(!isNil(params)) ? (function() { + return (isSxTruthy(!isSxTruthy(isNil(params))) ? (function() { var matched = merge(route, {}); matched["params"] = params; return (result = matched); diff --git a/shared/sx/ref/bootstrap_js.py b/shared/sx/ref/bootstrap_js.py index c32b0ff..f004b77 100644 --- a/shared/sx/ref/bootstrap_js.py +++ b/shared/sx/ref/bootstrap_js.py @@ -581,7 +581,7 @@ class JSEmitter: if name == "or": return self._emit_or(expr) if name == "not": - return f"!{self.emit(expr[1])}" + return f"!isSxTruthy({self.emit(expr[1])})" if name == "do" or name == "begin": return self._emit_do(expr) if name == "list": diff --git a/shared/sx/ref/orchestration.sx b/shared/sx/ref/orchestration.sx index 542f625..695a4f5 100644 --- a/shared/sx/ref/orchestration.sx +++ b/shared/sx/ref/orchestration.sx @@ -373,12 +373,6 @@ (when listen-target (dom-add-listener listen-target event-name (fn (e) - (log-info (str "sx:click" - " c1=" (= event-name "click") - " c2=" (= (get verbInfo "method") "GET") - " c3=" (dom-has-attr? el "href") - " c4=" (not (get mods "delay")) - " href=" (dom-get-attr el "href"))) (let ((should-fire true)) ;; Changed modifier: skip if value unchanged (when (get mods "changed")