diff --git a/shared/static/scripts/sx-browser.js b/shared/static/scripts/sx-browser.js index ed3eb02..37fe615 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-14T15:35:55Z"; + var SX_VERSION = "2026-03-14T18:39:27Z"; function isNil(x) { return x === NIL || x === null || x === undefined; } function isSxTruthy(x) { return x !== false && !isNil(x); } @@ -784,12 +784,14 @@ var result = val; return (isSxTruthy(isThunk(result)) ? trampoline(evalExpr(thunkExpr(result), thunkEnv(result))) : result); })(); }; +PRIMITIVES["trampoline"] = trampoline; // eval-expr var evalExpr = function(expr, env) { return (function() { var _m = typeOf(expr); if (_m == "number") return expr; if (_m == "string") return expr; if (_m == "boolean") return expr; if (_m == "nil") return NIL; if (_m == "symbol") return (function() { var name = symbolName(expr); return (isSxTruthy(envHas(env, name)) ? envGet(env, name) : (isSxTruthy(isPrimitive(name)) ? getPrimitive(name) : (isSxTruthy((name == "true")) ? true : (isSxTruthy((name == "false")) ? false : (isSxTruthy((name == "nil")) ? NIL : (debugLog("Undefined symbol:", name, "primitive?:", isPrimitive(name)), error((String("Undefined symbol: ") + String(name))))))))); })(); if (_m == "keyword") return keywordName(expr); if (_m == "dict") return mapDict(function(k, v) { return trampoline(evalExpr(v, env)); }, expr); if (_m == "list") return (isSxTruthy(isEmpty(expr)) ? [] : evalList(expr, env)); return expr; })(); }; +PRIMITIVES["eval-expr"] = evalExpr; // eval-list var evalList = function(expr, env) { return (function() { @@ -803,6 +805,7 @@ })() : (isSxTruthy((isSxTruthy(renderActiveP()) && isRenderExpr(expr))) ? renderExpr(expr, env) : evalCall(head, args, env))))))))))))))))))))))))))))))))))))))))))); })() : evalCall(head, args, env))); })(); }; +PRIMITIVES["eval-list"] = evalList; // eval-call var evalCall = function(head, args, env) { return (function() { @@ -810,6 +813,7 @@ var evaluatedArgs = map(function(a) { return trampoline(evalExpr(a, env)); }, args); return (isSxTruthy((isSxTruthy(isCallable(f)) && isSxTruthy(!isSxTruthy(isLambda(f))) && isSxTruthy(!isSxTruthy(isComponent(f))) && !isSxTruthy(isIsland(f)))) ? apply(f, evaluatedArgs) : (isSxTruthy(isLambda(f)) ? callLambda(f, evaluatedArgs, env) : (isSxTruthy(isComponent(f)) ? callComponent(f, args, env) : (isSxTruthy(isIsland(f)) ? callComponent(f, args, env) : error((String("Not callable: ") + String(inspect(f)))))))); })(); }; +PRIMITIVES["eval-call"] = evalCall; // call-lambda var callLambda = function(f, args, callerEnv) { return (function() { @@ -817,6 +821,7 @@ var local = envMerge(lambdaClosure(f), callerEnv); return (isSxTruthy((len(args) > len(params))) ? error((String(sxOr(lambdaName(f), "lambda")) + String(" expects ") + String(len(params)) + String(" args, got ") + String(len(args)))) : (forEach(function(pair) { return envSet(local, first(pair), nth(pair, 1)); }, zip(params, args)), forEach(function(p) { return envSet(local, p, NIL); }, slice(params, len(args))), makeThunk(lambdaBody(f), local))); })(); }; +PRIMITIVES["call-lambda"] = callLambda; // call-component var callComponent = function(comp, rawArgs, env) { return (function() { @@ -830,6 +835,7 @@ } return makeThunk(componentBody(comp), local); })(); }; +PRIMITIVES["call-component"] = callComponent; // parse-keyword-args var parseKeywordArgs = function(rawArgs, env) { return (function() { @@ -843,24 +849,29 @@ })(); }, {["i"]: 0, ["skip"]: false}, rawArgs); return [kwargs, children]; })(); }; +PRIMITIVES["parse-keyword-args"] = parseKeywordArgs; // sf-if var sfIf = function(args, env) { return (function() { var condition = trampoline(evalExpr(first(args), env)); return (isSxTruthy((isSxTruthy(condition) && !isSxTruthy(isNil(condition)))) ? makeThunk(nth(args, 1), env) : (isSxTruthy((len(args) > 2)) ? makeThunk(nth(args, 2), env) : NIL)); })(); }; +PRIMITIVES["sf-if"] = sfIf; // sf-when var sfWhen = function(args, env) { return (function() { var condition = trampoline(evalExpr(first(args), env)); 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); })(); }; +PRIMITIVES["sf-when"] = sfWhen; // cond-scheme? var condScheme_p = function(clauses) { return isEvery(function(c) { return (isSxTruthy((typeOf(c) == "list")) && (len(c) == 2)); }, clauses); }; +PRIMITIVES["cond-scheme?"] = condScheme_p; // sf-cond var sfCond = function(args, env) { return (isSxTruthy(condScheme_p(args)) ? sfCondScheme(args, env) : sfCondClojure(args, env)); }; +PRIMITIVES["sf-cond"] = sfCond; // sf-cond-scheme var sfCondScheme = function(clauses, env) { return (isSxTruthy(isEmpty(clauses)) ? NIL : (function() { @@ -869,6 +880,7 @@ var body = nth(clause, 1); return (isSxTruthy(sxOr((isSxTruthy((typeOf(test) == "symbol")) && sxOr((symbolName(test) == "else"), (symbolName(test) == ":else"))), (isSxTruthy((typeOf(test) == "keyword")) && (keywordName(test) == "else")))) ? makeThunk(body, env) : (isSxTruthy(trampoline(evalExpr(test, env))) ? makeThunk(body, env) : sfCondScheme(rest(clauses), env))); })()); }; +PRIMITIVES["sf-cond-scheme"] = sfCondScheme; // sf-cond-clojure var sfCondClojure = function(clauses, env) { return (isSxTruthy((len(clauses) < 2)) ? NIL : (function() { @@ -876,6 +888,7 @@ var body = nth(clauses, 1); return (isSxTruthy(sxOr((isSxTruthy((typeOf(test) == "keyword")) && (keywordName(test) == "else")), (isSxTruthy((typeOf(test) == "symbol")) && sxOr((symbolName(test) == "else"), (symbolName(test) == ":else"))))) ? makeThunk(body, env) : (isSxTruthy(trampoline(evalExpr(test, env))) ? makeThunk(body, env) : sfCondClojure(slice(clauses, 2), env))); })()); }; +PRIMITIVES["sf-cond-clojure"] = sfCondClojure; // sf-case var sfCase = function(args, env) { return (function() { @@ -883,6 +896,7 @@ var clauses = rest(args); return sfCaseLoop(matchVal, clauses, env); })(); }; +PRIMITIVES["sf-case"] = sfCase; // sf-case-loop var sfCaseLoop = function(matchVal, clauses, env) { return (isSxTruthy((len(clauses) < 2)) ? NIL : (function() { @@ -890,18 +904,21 @@ var body = nth(clauses, 1); return (isSxTruthy(sxOr((isSxTruthy((typeOf(test) == "keyword")) && (keywordName(test) == "else")), (isSxTruthy((typeOf(test) == "symbol")) && sxOr((symbolName(test) == "else"), (symbolName(test) == ":else"))))) ? makeThunk(body, env) : (isSxTruthy((matchVal == trampoline(evalExpr(test, env)))) ? makeThunk(body, env) : sfCaseLoop(matchVal, slice(clauses, 2), env))); })()); }; +PRIMITIVES["sf-case-loop"] = sfCaseLoop; // sf-and var sfAnd = function(args, env) { return (isSxTruthy(isEmpty(args)) ? true : (function() { var val = trampoline(evalExpr(first(args), env)); return (isSxTruthy(!isSxTruthy(val)) ? val : (isSxTruthy((len(args) == 1)) ? val : sfAnd(rest(args), env))); })()); }; +PRIMITIVES["sf-and"] = sfAnd; // sf-or var sfOr = function(args, env) { return (isSxTruthy(isEmpty(args)) ? false : (function() { var val = trampoline(evalExpr(first(args), env)); return (isSxTruthy(val) ? val : sfOr(rest(args), env)); })()); }; +PRIMITIVES["sf-or"] = sfOr; // sf-let var sfLet = function(args, env) { return (isSxTruthy((typeOf(first(args)) == "symbol")) ? sfNamedLet(args, env) : (function() { @@ -922,6 +939,7 @@ { var _c = slice(body, 0, (len(body) - 1)); for (var _i = 0; _i < _c.length; _i++) { var e = _c[_i]; trampoline(evalExpr(e, local)); } } return makeThunk(last(body), local); })()); }; +PRIMITIVES["sf-let"] = sfLet; // sf-named-let var sfNamedLet = function(args, env) { return (function() { @@ -943,6 +961,7 @@ return append_b(inits, nth(binding, 1)); }, bindings) : reduce(function(acc, pai })(); })(); })(); }; +PRIMITIVES["sf-named-let"] = sfNamedLet; // sf-lambda var sfLambda = function(args, env) { return (function() { @@ -952,6 +971,7 @@ return append_b(inits, nth(binding, 1)); }, bindings) : reduce(function(acc, pai var paramNames = map(function(p) { return (isSxTruthy((typeOf(p) == "symbol")) ? symbolName(p) : (isSxTruthy((isSxTruthy((typeOf(p) == "list")) && isSxTruthy((len(p) == 3)) && isSxTruthy((typeOf(nth(p, 1)) == "keyword")) && (keywordName(nth(p, 1)) == "as"))) ? symbolName(first(p)) : p)); }, paramsExpr); return makeLambda(paramNames, body, env); })(); }; +PRIMITIVES["sf-lambda"] = sfLambda; // sf-define var sfDefine = function(args, env) { return (function() { @@ -974,6 +994,7 @@ return append_b(inits, nth(binding, 1)); }, bindings) : reduce(function(acc, pai } return value; })(); }; +PRIMITIVES["sf-define"] = sfDefine; // sf-defcomp var sfDefcomp = function(args, env) { return (function() { @@ -1004,6 +1025,7 @@ return append_b(inits, nth(binding, 1)); }, bindings) : reduce(function(acc, pai return comp; })(); })(); }; +PRIMITIVES["sf-defcomp"] = sfDefcomp; // defcomp-kwarg var defcompKwarg = function(args, key, default_) { return (function() { @@ -1017,6 +1039,7 @@ return append_b(inits, nth(binding, 1)); }, bindings) : reduce(function(acc, pai } } } return result; })(); }; +PRIMITIVES["defcomp-kwarg"] = defcompKwarg; // parse-comp-params var parseCompParams = function(paramsExpr) { return (function() { @@ -1037,6 +1060,7 @@ return append_b(inits, nth(binding, 1)); }, bindings) : reduce(function(acc, pai })() : NIL)); } } return [params, hasChildren, paramTypes]; })(); }; +PRIMITIVES["parse-comp-params"] = parseCompParams; // sf-defisland var sfDefisland = function(args, env) { return (function() { @@ -1053,6 +1077,7 @@ return append_b(inits, nth(binding, 1)); }, bindings) : reduce(function(acc, pai return island; })(); })(); }; +PRIMITIVES["sf-defisland"] = sfDefisland; // sf-defmacro var sfDefmacro = function(args, env) { return (function() { @@ -1068,6 +1093,7 @@ return append_b(inits, nth(binding, 1)); }, bindings) : reduce(function(acc, pai return mac; })(); })(); }; +PRIMITIVES["sf-defmacro"] = sfDefmacro; // parse-macro-params var parseMacroParams = function(paramsExpr) { return (function() { @@ -1076,6 +1102,7 @@ return append_b(inits, nth(binding, 1)); }, bindings) : reduce(function(acc, pai reduce(function(state, p) { return (isSxTruthy((isSxTruthy((typeOf(p) == "symbol")) && (symbolName(p) == "&rest"))) ? assoc(state, "in-rest", true) : (isSxTruthy(get(state, "in-rest")) ? ((restParam = (isSxTruthy((typeOf(p) == "symbol")) ? symbolName(p) : p)), state) : (append_b(params, (isSxTruthy((typeOf(p) == "symbol")) ? symbolName(p) : p)), state))); }, {["in-rest"]: false}, paramsExpr); return [params, restParam]; })(); }; +PRIMITIVES["parse-macro-params"] = parseMacroParams; // sf-defstyle var sfDefstyle = function(args, env) { return (function() { @@ -1084,9 +1111,11 @@ return append_b(inits, nth(binding, 1)); }, bindings) : reduce(function(acc, pai envSet(env, symbolName(nameSym), value); return value; })(); }; +PRIMITIVES["sf-defstyle"] = sfDefstyle; // make-type-def var makeTypeDef = function(name, params, body) { return {"name": name, "params": params, "body": body}; }; +PRIMITIVES["make-type-def"] = makeTypeDef; // normalize-type-body var normalizeTypeBody = function(body) { return (isSxTruthy(isNil(body)) ? "nil" : (isSxTruthy((typeOf(body) == "symbol")) ? symbolName(body) : (isSxTruthy((typeOf(body) == "string")) ? body : (isSxTruthy((typeOf(body) == "keyword")) ? keywordName(body) : (isSxTruthy((typeOf(body) == "dict")) ? mapDict(function(k, v) { return normalizeTypeBody(v); }, body) : (isSxTruthy((typeOf(body) == "list")) ? (isSxTruthy(isEmpty(body)) ? "any" : (function() { @@ -1096,6 +1125,7 @@ return append_b(inits, nth(binding, 1)); }, bindings) : reduce(function(acc, pai return (isSxTruthy((headName == "union")) ? cons("or", map(normalizeTypeBody, rest(body))) : cons(headName, map(normalizeTypeBody, rest(body)))); })(); })()) : (String(body)))))))); }; +PRIMITIVES["normalize-type-body"] = normalizeTypeBody; // sf-deftype var sfDeftype = function(args, env) { return (function() { @@ -1112,6 +1142,7 @@ return append_b(inits, nth(binding, 1)); }, bindings) : reduce(function(acc, pai return NIL; })(); })(); }; +PRIMITIVES["sf-deftype"] = sfDeftype; // sf-defeffect var sfDefeffect = function(args, env) { return (function() { @@ -1123,15 +1154,19 @@ return append_b(inits, nth(binding, 1)); }, bindings) : reduce(function(acc, pai envSet(env, "*effect-registry*", registry); return NIL; })(); }; +PRIMITIVES["sf-defeffect"] = sfDefeffect; // sf-begin var sfBegin = function(args, env) { return (isSxTruthy(isEmpty(args)) ? NIL : (forEach(function(e) { return trampoline(evalExpr(e, env)); }, slice(args, 0, (len(args) - 1))), makeThunk(last(args), env))); }; +PRIMITIVES["sf-begin"] = sfBegin; // sf-quote var sfQuote = function(args, env) { return (isSxTruthy(isEmpty(args)) ? NIL : first(args)); }; +PRIMITIVES["sf-quote"] = sfQuote; // sf-quasiquote var sfQuasiquote = function(args, env) { return qqExpand(first(args), env); }; +PRIMITIVES["sf-quasiquote"] = sfQuasiquote; // qq-expand var qqExpand = function(template, env) { return (isSxTruthy(!isSxTruthy((typeOf(template) == "list"))) ? template : (isSxTruthy(isEmpty(template)) ? [] : (function() { @@ -1141,6 +1176,7 @@ return append_b(inits, nth(binding, 1)); }, bindings) : reduce(function(acc, pai return (isSxTruthy((typeOf(spliced) == "list")) ? concat(result, spliced) : (isSxTruthy(isNil(spliced)) ? result : concat(result, [spliced]))); })() : concat(result, [qqExpand(item, env)])); }, [], template)); })())); }; +PRIMITIVES["qq-expand"] = qqExpand; // sf-thread-first var sfThreadFirst = function(args, env) { return (function() { @@ -1155,6 +1191,7 @@ return append_b(inits, nth(binding, 1)); }, bindings) : reduce(function(acc, pai 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)); })(); }; +PRIMITIVES["sf-thread-first"] = sfThreadFirst; // sf-set! var sfSetBang = function(args, env) { return (function() { @@ -1163,6 +1200,7 @@ return append_b(inits, nth(binding, 1)); }, bindings) : reduce(function(acc, pai envSet(env, name, value); return value; })(); }; +PRIMITIVES["sf-set!"] = sfSetBang; // sf-letrec var sfLetrec = function(args, env) { return (function() { @@ -1191,6 +1229,7 @@ return append_b(inits, nth(binding, 1)); }, bindings) : reduce(function(acc, pai { var _c = slice(body, 0, (len(body) - 1)); for (var _i = 0; _i < _c.length; _i++) { var e = _c[_i]; trampoline(evalExpr(e, local)); } } return makeThunk(last(body), local); })(); }; +PRIMITIVES["sf-letrec"] = sfLetrec; // sf-dynamic-wind var sfDynamicWind = function(args, env) { return (function() { @@ -1199,6 +1238,7 @@ return append_b(inits, nth(binding, 1)); }, bindings) : reduce(function(acc, pai var after = trampoline(evalExpr(nth(args, 2), env)); return dynamicWindCall(before, body, after, env); })(); }; +PRIMITIVES["sf-dynamic-wind"] = sfDynamicWind; // sf-scope var sfScope = function(args, env) { return (function() { @@ -1215,6 +1255,7 @@ return append_b(inits, nth(binding, 1)); }, bindings) : reduce(function(acc, pai return result; })(); })(); }; +PRIMITIVES["sf-scope"] = sfScope; // sf-provide var sfProvide = function(args, env) { return (function() { @@ -1227,6 +1268,7 @@ return append_b(inits, nth(binding, 1)); }, bindings) : reduce(function(acc, pai scopePop(name); return result; })(); }; +PRIMITIVES["sf-provide"] = sfProvide; // expand-macro var expandMacro = function(mac, rawArgs, env) { return (function() { @@ -1237,9 +1279,11 @@ return append_b(inits, nth(binding, 1)); }, bindings) : reduce(function(acc, pai } return trampoline(evalExpr(macroBody(mac), local)); })(); }; +PRIMITIVES["expand-macro"] = expandMacro; // call-fn var callFn = function(f, args, env) { return (isSxTruthy(isLambda(f)) ? trampoline(callLambda(f, args, env)) : (isSxTruthy(isCallable(f)) ? apply(f, args) : error((String("Not callable in HO form: ") + String(inspect(f)))))); }; +PRIMITIVES["call-fn"] = callFn; // ho-map var hoMap = function(args, env) { return (function() { @@ -1247,6 +1291,7 @@ return append_b(inits, nth(binding, 1)); }, bindings) : reduce(function(acc, pai var coll = trampoline(evalExpr(nth(args, 1), env)); return map(function(item) { return callFn(f, [item], env); }, coll); })(); }; +PRIMITIVES["ho-map"] = hoMap; // ho-map-indexed var hoMapIndexed = function(args, env) { return (function() { @@ -1254,6 +1299,7 @@ return append_b(inits, nth(binding, 1)); }, bindings) : reduce(function(acc, pai var coll = trampoline(evalExpr(nth(args, 1), env)); return mapIndexed(function(i, item) { return callFn(f, [i, item], env); }, coll); })(); }; +PRIMITIVES["ho-map-indexed"] = hoMapIndexed; // ho-filter var hoFilter = function(args, env) { return (function() { @@ -1261,6 +1307,7 @@ return append_b(inits, nth(binding, 1)); }, bindings) : reduce(function(acc, pai var coll = trampoline(evalExpr(nth(args, 1), env)); return filter(function(item) { return callFn(f, [item], env); }, coll); })(); }; +PRIMITIVES["ho-filter"] = hoFilter; // ho-reduce var hoReduce = function(args, env) { return (function() { @@ -1269,6 +1316,7 @@ return append_b(inits, nth(binding, 1)); }, bindings) : reduce(function(acc, pai var coll = trampoline(evalExpr(nth(args, 2), env)); return reduce(function(acc, item) { return callFn(f, [acc, item], env); }, init, coll); })(); }; +PRIMITIVES["ho-reduce"] = hoReduce; // ho-some var hoSome = function(args, env) { return (function() { @@ -1276,6 +1324,7 @@ return append_b(inits, nth(binding, 1)); }, bindings) : reduce(function(acc, pai var coll = trampoline(evalExpr(nth(args, 1), env)); return some(function(item) { return callFn(f, [item], env); }, coll); })(); }; +PRIMITIVES["ho-some"] = hoSome; // ho-every var hoEvery = function(args, env) { return (function() { @@ -1283,6 +1332,7 @@ return append_b(inits, nth(binding, 1)); }, bindings) : reduce(function(acc, pai var coll = trampoline(evalExpr(nth(args, 1), env)); return isEvery(function(item) { return callFn(f, [item], env); }, coll); })(); }; +PRIMITIVES["ho-every"] = hoEvery; // ho-for-each var hoForEach = function(args, env) { return (function() { @@ -1290,21 +1340,26 @@ return append_b(inits, nth(binding, 1)); }, bindings) : reduce(function(acc, pai var coll = trampoline(evalExpr(nth(args, 1), env)); return forEach(function(item) { return callFn(f, [item], env); }, coll); })(); }; +PRIMITIVES["ho-for-each"] = hoForEach; // === Transpiled from render (core) === // HTML_TAGS var HTML_TAGS = ["html", "head", "body", "title", "meta", "link", "script", "style", "noscript", "header", "nav", "main", "section", "article", "aside", "footer", "h1", "h2", "h3", "h4", "h5", "h6", "hgroup", "div", "p", "blockquote", "pre", "figure", "figcaption", "address", "details", "summary", "a", "span", "em", "strong", "small", "b", "i", "u", "s", "mark", "sub", "sup", "abbr", "cite", "code", "time", "br", "wbr", "hr", "ul", "ol", "li", "dl", "dt", "dd", "table", "thead", "tbody", "tfoot", "tr", "th", "td", "caption", "colgroup", "col", "form", "input", "textarea", "select", "option", "optgroup", "button", "label", "fieldset", "legend", "output", "datalist", "img", "video", "audio", "source", "picture", "canvas", "iframe", "svg", "math", "path", "circle", "ellipse", "rect", "line", "polyline", "polygon", "text", "tspan", "g", "defs", "use", "clipPath", "mask", "pattern", "linearGradient", "radialGradient", "stop", "filter", "feGaussianBlur", "feOffset", "feBlend", "feColorMatrix", "feComposite", "feMerge", "feMergeNode", "feTurbulence", "feComponentTransfer", "feFuncR", "feFuncG", "feFuncB", "feFuncA", "feDisplacementMap", "feFlood", "feImage", "feMorphology", "feSpecularLighting", "feDiffuseLighting", "fePointLight", "feSpotLight", "feDistantLight", "animate", "animateTransform", "foreignObject", "template", "slot", "dialog", "menu"]; +PRIMITIVES["HTML_TAGS"] = HTML_TAGS; // VOID_ELEMENTS var VOID_ELEMENTS = ["area", "base", "br", "col", "embed", "hr", "img", "input", "link", "meta", "param", "source", "track", "wbr"]; +PRIMITIVES["VOID_ELEMENTS"] = VOID_ELEMENTS; // BOOLEAN_ATTRS var BOOLEAN_ATTRS = ["async", "autofocus", "autoplay", "checked", "controls", "default", "defer", "disabled", "formnovalidate", "hidden", "inert", "ismap", "loop", "multiple", "muted", "nomodule", "novalidate", "open", "playsinline", "readonly", "required", "reversed", "selected"]; +PRIMITIVES["BOOLEAN_ATTRS"] = BOOLEAN_ATTRS; // definition-form? var isDefinitionForm = function(name) { return sxOr((name == "define"), (name == "defcomp"), (name == "defisland"), (name == "defmacro"), (name == "defstyle"), (name == "defhandler"), (name == "deftype"), (name == "defeffect")); }; +PRIMITIVES["definition-form?"] = isDefinitionForm; // parse-element-args var parseElementArgs = function(args, env) { return (function() { @@ -1320,15 +1375,18 @@ return append_b(inits, nth(binding, 1)); }, bindings) : reduce(function(acc, pai })(); }, {["i"]: 0, ["skip"]: false}, args); return [attrs, children]; })(); }; +PRIMITIVES["parse-element-args"] = parseElementArgs; // 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)) && !isSxTruthy(val))) ? "" : (isSxTruthy(isNil(val)) ? "" : (String(" ") + String(key) + String("=\"") + String(escapeAttr((String(val)))) + String("\""))))); })(); }, keys(attrs))); }; +PRIMITIVES["render-attrs"] = renderAttrs; // eval-cond var evalCond = function(clauses, env) { return (isSxTruthy(condScheme_p(clauses)) ? evalCondScheme(clauses, env) : evalCondClojure(clauses, env)); }; +PRIMITIVES["eval-cond"] = evalCond; // eval-cond-scheme var evalCondScheme = function(clauses, env) { return (isSxTruthy(isEmpty(clauses)) ? NIL : (function() { @@ -1337,6 +1395,7 @@ return append_b(inits, nth(binding, 1)); }, bindings) : reduce(function(acc, pai var body = nth(clause, 1); return (isSxTruthy(sxOr((isSxTruthy((typeOf(test) == "symbol")) && sxOr((symbolName(test) == "else"), (symbolName(test) == ":else"))), (isSxTruthy((typeOf(test) == "keyword")) && (keywordName(test) == "else")))) ? body : (isSxTruthy(trampoline(evalExpr(test, env))) ? body : evalCondScheme(rest(clauses), env))); })()); }; +PRIMITIVES["eval-cond-scheme"] = evalCondScheme; // eval-cond-clojure var evalCondClojure = function(clauses, env) { return (isSxTruthy((len(clauses) < 2)) ? NIL : (function() { @@ -1344,6 +1403,7 @@ return append_b(inits, nth(binding, 1)); }, bindings) : reduce(function(acc, pai var body = nth(clauses, 1); return (isSxTruthy(sxOr((isSxTruthy((typeOf(test) == "keyword")) && (keywordName(test) == "else")), (isSxTruthy((typeOf(test) == "symbol")) && sxOr((symbolName(test) == "else"), (symbolName(test) == ":else"))))) ? body : (isSxTruthy(trampoline(evalExpr(test, env))) ? body : evalCondClojure(slice(clauses, 2), env))); })()); }; +PRIMITIVES["eval-cond-clojure"] = evalCondClojure; // process-bindings var processBindings = function(bindings, env) { return (function() { @@ -1356,6 +1416,7 @@ return append_b(inits, nth(binding, 1)); }, bindings) : reduce(function(acc, pai } } } return local; })(); }; +PRIMITIVES["process-bindings"] = processBindings; // is-render-expr? var isRenderExpr = function(expr) { return (isSxTruthy(sxOr(!isSxTruthy((typeOf(expr) == "list")), isEmpty(expr))) ? false : (function() { @@ -1365,6 +1426,7 @@ return append_b(inits, nth(binding, 1)); }, bindings) : reduce(function(acc, pai return sxOr((n == "<>"), (n == "raw!"), startsWith(n, "~"), startsWith(n, "html:"), contains(HTML_TAGS, n), (isSxTruthy((indexOf_(n, "-") > 0)) && isSxTruthy((len(expr) > 1)) && (typeOf(nth(expr, 1)) == "keyword"))); })()); })()); }; +PRIMITIVES["is-render-expr?"] = isRenderExpr; // merge-spread-attrs var mergeSpreadAttrs = function(target, spreadDict) { return forEach(function(key) { return (function() { @@ -1377,6 +1439,7 @@ return append_b(inits, nth(binding, 1)); }, bindings) : reduce(function(acc, pai return dictSet(target, "style", (isSxTruthy((isSxTruthy(existing) && !isSxTruthy((existing == "")))) ? (String(existing) + String(";") + String(val)) : val)); })() : dictSet(target, key, val))); })(); }, keys(spreadDict)); }; +PRIMITIVES["merge-spread-attrs"] = mergeSpreadAttrs; // === Transpiled from parser === @@ -1387,12 +1450,15 @@ return append_b(inits, nth(binding, 1)); }, bindings) : reduce(function(acc, pai var lenSrc = len(source); var skipComment = function() { while(true) { if (isSxTruthy((isSxTruthy((pos < lenSrc)) && !isSxTruthy((nth(source, pos) == "\n"))))) { pos = (pos + 1); continue; } else { return NIL; } } }; +PRIMITIVES["skip-comment"] = skipComment; 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); continue; } else if (isSxTruthy((ch == ";"))) { pos = (pos + 1); skipComment(); continue; } else { return NIL; } } } else { return NIL; } } }; +PRIMITIVES["skip-ws"] = skipWs; var hexDigitValue = function(ch) { return indexOf_("0123456789abcdef", lower(ch)); }; +PRIMITIVES["hex-digit-value"] = hexDigitValue; var readString = function() { pos = (pos + 1); return (function() { var buf = ""; @@ -1415,18 +1481,23 @@ pos = (pos + 1); continue; } } } else { buf = (String(buf) + String(ch)); pos = (pos + 1); continue; } } } } }; +PRIMITIVES["read-str-loop"] = readStrLoop; readStrLoop(); return buf; })(); }; +PRIMITIVES["read-string"] = readString; var readIdent = function() { return (function() { var start = pos; var readIdentLoop = function() { while(true) { if (isSxTruthy((isSxTruthy((pos < lenSrc)) && isIdentChar(nth(source, pos))))) { pos = (pos + 1); continue; } else { return NIL; } } }; +PRIMITIVES["read-ident-loop"] = readIdentLoop; readIdentLoop(); return slice(source, start, pos); })(); }; +PRIMITIVES["read-ident"] = readIdent; var readKeyword = function() { pos = (pos + 1); return makeKeyword(readIdent()); }; +PRIMITIVES["read-keyword"] = readKeyword; var readNumber = function() { return (function() { var start = pos; if (isSxTruthy((isSxTruthy((pos < lenSrc)) && (nth(source, pos) == "-")))) { @@ -1437,6 +1508,7 @@ return makeKeyword(readIdent()); }; return (isSxTruthy((c >= "0")) && (c <= "9")); })()))) { pos = (pos + 1); continue; } else { return NIL; } } }; +PRIMITIVES["read-digits"] = readDigits; readDigits(); if (isSxTruthy((isSxTruthy((pos < lenSrc)) && (nth(source, pos) == ".")))) { pos = (pos + 1); @@ -1451,19 +1523,23 @@ continue; } else { return NIL; } } }; } return parseNumber(slice(source, start, pos)); })(); }; +PRIMITIVES["read-number"] = readNumber; var readSymbol = function() { return (function() { var name = readIdent(); return (isSxTruthy((name == "true")) ? true : (isSxTruthy((name == "false")) ? false : (isSxTruthy((name == "nil")) ? NIL : makeSymbol(name)))); })(); }; +PRIMITIVES["read-symbol"] = readSymbol; var readList = function(closeCh) { return (function() { var items = []; var readListLoop = function() { while(true) { skipWs(); if (isSxTruthy((pos >= lenSrc))) { return error("Unterminated list"); } else { if (isSxTruthy((nth(source, pos) == closeCh))) { pos = (pos + 1); return NIL; } else { items.push(readExpr()); continue; } } } }; +PRIMITIVES["read-list-loop"] = readListLoop; readListLoop(); return items; })(); }; +PRIMITIVES["read-list"] = readList; var readMap = function() { return (function() { var result = {}; var readMapLoop = function() { while(true) { skipWs(); @@ -1473,9 +1549,11 @@ var keyStr = (isSxTruthy((typeOf(keyExpr) == "keyword")) ? keywordName(keyExpr) var valExpr = readExpr(); result[keyStr] = valExpr; continue; } } } } }; +PRIMITIVES["read-map-loop"] = readMapLoop; readMapLoop(); return result; })(); }; +PRIMITIVES["read-map"] = readMap; var readRawString = function() { return (function() { var buf = ""; var rawLoop = function() { while(true) { if (isSxTruthy((pos >= lenSrc))) { return error("Unterminated raw string"); } else { { var ch = nth(source, pos); @@ -1483,9 +1561,11 @@ if (isSxTruthy((ch == "|"))) { pos = (pos + 1); return NIL; } else { buf = (String(buf) + String(ch)); pos = (pos + 1); continue; } } } } }; +PRIMITIVES["raw-loop"] = rawLoop; rawLoop(); return buf; })(); }; +PRIMITIVES["read-raw-string"] = readRawString; var readExpr = function() { while(true) { skipWs(); if (isSxTruthy((pos >= lenSrc))) { return error("Unexpected end of input"); } else { { var ch = nth(source, pos); if (isSxTruthy((ch == "("))) { pos = (pos + 1); @@ -1508,24 +1588,30 @@ if (isSxTruthy(handler)) { return handler(readExpr()); } else { return error((St return (isSxTruthy((nextCh >= "0")) && (nextCh <= "9")); })())))) { return readNumber(); } else if (isSxTruthy((isSxTruthy((ch == ".")) && isSxTruthy(((pos + 2) < lenSrc)) && isSxTruthy((nth(source, (pos + 1)) == ".")) && (nth(source, (pos + 2)) == ".")))) { pos = (pos + 3); return makeSymbol("..."); } else if (isSxTruthy(isIdentStart(ch))) { return readSymbol(); } else { return error((String("Unexpected character: ") + String(ch))); } } } } }; +PRIMITIVES["read-expr"] = readExpr; return (function() { var exprs = []; var parseLoop = function() { while(true) { skipWs(); if (isSxTruthy((pos < lenSrc))) { exprs.push(readExpr()); continue; } else { return NIL; } } }; +PRIMITIVES["parse-loop"] = parseLoop; parseLoop(); return exprs; })(); })(); }; +PRIMITIVES["sx-parse"] = sxParse; // sx-serialize var sxSerialize = function(val) { return (function() { var _m = typeOf(val); if (_m == "nil") return "nil"; if (_m == "boolean") return (isSxTruthy(val) ? "true" : "false"); if (_m == "number") return (String(val)); if (_m == "string") return (String("\"") + String(escapeString(val)) + String("\"")); if (_m == "symbol") return symbolName(val); if (_m == "keyword") return (String(":") + String(keywordName(val))); if (_m == "list") return (String("(") + String(join(" ", map(sxSerialize, val))) + String(")")); if (_m == "dict") return sxSerializeDict(val); if (_m == "sx-expr") return sxExprSource(val); if (_m == "spread") return (String("(make-spread ") + String(sxSerializeDict(spreadAttrs(val))) + String(")")); return (String(val)); })(); }; +PRIMITIVES["sx-serialize"] = sxSerialize; // sx-serialize-dict var sxSerializeDict = function(d) { return (String("{") + String(join(" ", reduce(function(acc, key) { return concat(acc, [(String(":") + String(key)), sxSerialize(dictGet(d, key))]); }, [], keys(d)))) + String("}")); }; +PRIMITIVES["sx-serialize-dict"] = sxSerializeDict; // serialize var serialize = sxSerialize; +PRIMITIVES["serialize"] = serialize; // === Transpiled from adapter-html === @@ -1533,15 +1619,19 @@ continue; } else { return NIL; } } }; // render-to-html var renderToHtml = function(expr, env) { setRenderActiveB(true); return (function() { var _m = typeOf(expr); if (_m == "nil") return ""; if (_m == "string") return escapeHtml(expr); if (_m == "number") return (String(expr)); if (_m == "boolean") return (isSxTruthy(expr) ? "true" : "false"); if (_m == "list") return (isSxTruthy(isEmpty(expr)) ? "" : renderListToHtml(expr, env)); if (_m == "symbol") return renderValueToHtml(trampoline(evalExpr(expr, env)), env); if (_m == "keyword") return escapeHtml(keywordName(expr)); if (_m == "raw-html") return rawHtmlContent(expr); if (_m == "spread") return (sxEmit("element-attrs", spreadAttrs(expr)), ""); return renderValueToHtml(trampoline(evalExpr(expr, env)), env); })(); }; +PRIMITIVES["render-to-html"] = renderToHtml; // render-value-to-html var renderValueToHtml = function(val, env) { return (function() { var _m = typeOf(val); if (_m == "nil") return ""; if (_m == "string") return escapeHtml(val); if (_m == "number") return (String(val)); if (_m == "boolean") return (isSxTruthy(val) ? "true" : "false"); if (_m == "list") return renderListToHtml(val, env); if (_m == "raw-html") return rawHtmlContent(val); if (_m == "spread") return (sxEmit("element-attrs", spreadAttrs(val)), ""); return escapeHtml((String(val))); })(); }; +PRIMITIVES["render-value-to-html"] = renderValueToHtml; // RENDER_HTML_FORMS var RENDER_HTML_FORMS = ["if", "when", "cond", "case", "let", "let*", "begin", "do", "define", "defcomp", "defisland", "defmacro", "defstyle", "defhandler", "deftype", "defeffect", "map", "map-indexed", "filter", "for-each", "scope", "provide"]; +PRIMITIVES["RENDER_HTML_FORMS"] = RENDER_HTML_FORMS; // render-html-form? var isRenderHtmlForm = function(name) { return contains(RENDER_HTML_FORMS, name); }; +PRIMITIVES["render-html-form?"] = isRenderHtmlForm; // render-list-to-html var renderListToHtml = function(expr, env) { return (isSxTruthy(isEmpty(expr)) ? "" : (function() { @@ -1555,6 +1645,7 @@ return (function() { var _m = typeOf(expr); if (_m == "nil") return ""; if (_m = })() : (isSxTruthy(isRenderHtmlForm(name)) ? dispatchHtmlForm(name, expr, env) : (isSxTruthy((isSxTruthy(envHas(env, name)) && isMacro(envGet(env, name)))) ? renderToHtml(expandMacro(envGet(env, name), args, env), env) : renderValueToHtml(trampoline(evalExpr(expr, env)), env)))))))))); })()); })()); }; +PRIMITIVES["render-list-to-html"] = renderListToHtml; // dispatch-html-form var dispatchHtmlForm = function(name, expr, env) { return (isSxTruthy((name == "if")) ? (function() { @@ -1602,6 +1693,7 @@ return (function() { var _m = typeOf(expr); if (_m == "nil") return ""; if (_m = return result; })(); })() : renderValueToHtml(trampoline(evalExpr(expr, env)), env)))))))))))))); }; +PRIMITIVES["dispatch-html-form"] = dispatchHtmlForm; // render-lambda-html var renderLambdaHtml = function(f, args, env) { return (function() { @@ -1609,6 +1701,7 @@ return (function() { var _m = typeOf(expr); if (_m == "nil") return ""; if (_m = forEachIndexed(function(i, p) { return envSet(local, p, nth(args, i)); }, lambdaParams(f)); return renderToHtml(lambdaBody(f), local); })(); }; +PRIMITIVES["render-lambda-html"] = renderLambdaHtml; // render-html-component var renderHtmlComponent = function(comp, args, env) { return (function() { @@ -1631,6 +1724,7 @@ return (function() { var _m = typeOf(expr); if (_m == "nil") return ""; if (_m = return renderToHtml(componentBody(comp), local); })(); })(); }; +PRIMITIVES["render-html-component"] = renderHtmlComponent; // render-html-element var renderHtmlElement = function(tag, args, env) { return (function() { @@ -1645,6 +1739,7 @@ return (function() { var _m = typeOf(expr); if (_m == "nil") return ""; if (_m = return (String("<") + String(tag) + String(renderAttrs(attrs)) + String(">") + String(content) + String("")); })())); })(); }; +PRIMITIVES["render-html-element"] = renderHtmlElement; // render-html-lake var renderHtmlLake = function(args, env) { return (function() { @@ -1671,6 +1766,7 @@ return (function() { var _m = typeOf(expr); if (_m == "nil") return ""; if (_m = })(); })(); })(); }; +PRIMITIVES["render-html-lake"] = renderHtmlLake; // render-html-marsh var renderHtmlMarsh = function(args, env) { return (function() { @@ -1697,6 +1793,7 @@ return (function() { var _m = typeOf(expr); if (_m == "nil") return ""; if (_m = })(); })(); })(); }; +PRIMITIVES["render-html-marsh"] = renderHtmlMarsh; // render-html-island var renderHtmlIsland = function(island, args, env) { return (function() { @@ -1724,9 +1821,11 @@ return (function() { var _m = typeOf(expr); if (_m == "nil") return ""; if (_m = })(); })(); })(); }; +PRIMITIVES["render-html-island"] = renderHtmlIsland; // serialize-island-state var serializeIslandState = function(kwargs) { return (isSxTruthy(isEmptyDict(kwargs)) ? NIL : sxSerialize(kwargs)); }; +PRIMITIVES["serialize-island-state"] = serializeIslandState; // === Transpiled from adapter-sx === @@ -1736,6 +1835,7 @@ return (function() { var _m = typeOf(expr); if (_m == "nil") return ""; if (_m = var result = aser(expr, env); return (isSxTruthy((typeOf(result) == "string")) ? result : serialize(result)); })(); }; +PRIMITIVES["render-to-sx"] = renderToSx; // aser var aser = function(expr, env) { setRenderActiveB(true); @@ -1746,6 +1846,7 @@ return (function() { })(); if (_m == "keyword") return keywordName(expr); if (_m == "list") return (isSxTruthy(isEmpty(expr)) ? [] : aserList(expr, env)); if (_m == "spread") return (sxEmit("element-attrs", spreadAttrs(expr)), NIL); return expr; })(); return (isSxTruthy(isSpread(result)) ? (sxEmit("element-attrs", spreadAttrs(result)), NIL) : result); })(); }; +PRIMITIVES["aser"] = aser; // aser-list var aserList = function(expr, env) { return (function() { @@ -1760,6 +1861,7 @@ return (function() { })()))))))); })()); })(); }; +PRIMITIVES["aser-list"] = aserList; // aser-fragment var aserFragment = function(children, env) { return (function() { @@ -1770,6 +1872,7 @@ return (function() { })(); } } return (isSxTruthy(isEmpty(parts)) ? "" : (String("(<> ") + String(join(" ", parts)) + String(")"))); })(); }; +PRIMITIVES["aser-fragment"] = aserFragment; // aser-call var aserCall = function(name, args, env) { return (function() { @@ -1804,18 +1907,23 @@ return (function() { return (String("(") + String(join(" ", parts)) + String(")")); })(); })(); }; +PRIMITIVES["aser-call"] = aserCall; // SPECIAL_FORM_NAMES var SPECIAL_FORM_NAMES = ["if", "when", "cond", "case", "and", "or", "let", "let*", "lambda", "fn", "define", "defcomp", "defmacro", "defstyle", "defhandler", "defpage", "defquery", "defaction", "defrelation", "begin", "do", "quote", "quasiquote", "->", "set!", "letrec", "dynamic-wind", "defisland", "deftype", "defeffect", "scope", "provide"]; +PRIMITIVES["SPECIAL_FORM_NAMES"] = SPECIAL_FORM_NAMES; // HO_FORM_NAMES var HO_FORM_NAMES = ["map", "map-indexed", "filter", "reduce", "some", "every?", "for-each"]; +PRIMITIVES["HO_FORM_NAMES"] = HO_FORM_NAMES; // special-form? var isSpecialForm = function(name) { return contains(SPECIAL_FORM_NAMES, name); }; +PRIMITIVES["special-form?"] = isSpecialForm; // ho-form? var isHoForm = function(name) { return contains(HO_FORM_NAMES, name); }; +PRIMITIVES["ho-form?"] = isHoForm; // aser-special var aserSpecial = function(name, expr, env) { return (function() { @@ -1900,6 +2008,7 @@ return result; }, args); return result; })() : trampoline(evalExpr(expr, env))))))))))))))))); })(); }; +PRIMITIVES["aser-special"] = aserSpecial; // eval-case-aser var evalCaseAser = function(matchVal, clauses, env) { return (isSxTruthy((len(clauses) < 2)) ? NIL : (function() { @@ -1907,19 +2016,23 @@ return result; }, args); var body = nth(clauses, 1); return (isSxTruthy(sxOr((isSxTruthy((typeOf(test) == "keyword")) && (keywordName(test) == "else")), (isSxTruthy((typeOf(test) == "symbol")) && sxOr((symbolName(test) == ":else"), (symbolName(test) == "else"))))) ? aser(body, env) : (isSxTruthy((matchVal == trampoline(evalExpr(test, env)))) ? aser(body, env) : evalCaseAser(matchVal, slice(clauses, 2), env))); })()); }; +PRIMITIVES["eval-case-aser"] = evalCaseAser; // === Transpiled from adapter-dom === // SVG_NS var SVG_NS = "http://www.w3.org/2000/svg"; +PRIMITIVES["SVG_NS"] = SVG_NS; // MATH_NS var MATH_NS = "http://www.w3.org/1998/Math/MathML"; +PRIMITIVES["MATH_NS"] = MATH_NS; // render-to-dom var renderToDom = function(expr, env, ns) { setRenderActiveB(true); return (function() { var _m = typeOf(expr); if (_m == "nil") return createFragment(); if (_m == "boolean") return createFragment(); if (_m == "raw-html") return domParseHtml(rawHtmlContent(expr)); if (_m == "string") return createTextNode(expr); if (_m == "number") return createTextNode((String(expr))); if (_m == "symbol") return renderToDom(trampoline(evalExpr(expr, env)), env, ns); if (_m == "keyword") return createTextNode(keywordName(expr)); if (_m == "dom-node") return expr; if (_m == "spread") return (sxEmit("element-attrs", spreadAttrs(expr)), expr); if (_m == "dict") return createFragment(); if (_m == "list") return (isSxTruthy(isEmpty(expr)) ? createFragment() : renderDomList(expr, env, ns)); return (isSxTruthy(isSignal(expr)) ? (isSxTruthy(sxContext("sx-island-scope", NIL)) ? reactiveText(expr) : createTextNode((String(deref(expr))))) : createTextNode((String(expr)))); })(); }; +PRIMITIVES["render-to-dom"] = renderToDom; // render-dom-list var renderDomList = function(expr, env, ns) { return (function() { @@ -1943,6 +2056,7 @@ return (function() { var _m = typeOf(expr); if (_m == "nil") return createFragme return frag; })())); })(); }; +PRIMITIVES["render-dom-list"] = renderDomList; // render-dom-element var renderDomElement = function(tag, args, env, ns) { return (function() { @@ -1989,6 +2103,7 @@ return (function() { var _m = typeOf(expr); if (_m == "nil") return createFragme scopePop("element-attrs"); return el; })(); }; +PRIMITIVES["render-dom-element"] = renderDomElement; // render-dom-component var renderDomComponent = function(comp, args, env, ns) { return (function() { @@ -2018,6 +2133,7 @@ return (function() { var _m = typeOf(expr); if (_m == "nil") return createFragme return renderToDom(componentBody(comp), local, ns); })(); })(); }; +PRIMITIVES["render-dom-component"] = renderDomComponent; // render-dom-fragment var renderDomFragment = function(args, env, ns) { return (function() { @@ -2028,6 +2144,7 @@ return (function() { var _m = typeOf(expr); if (_m == "nil") return createFragme })(); } } return frag; })(); }; +PRIMITIVES["render-dom-fragment"] = renderDomFragment; // render-dom-raw var renderDomRaw = function(args, env) { return (function() { @@ -2038,15 +2155,19 @@ return (function() { var _m = typeOf(expr); if (_m == "nil") return createFragme })(); } } return frag; })(); }; +PRIMITIVES["render-dom-raw"] = renderDomRaw; // render-dom-unknown-component var renderDomUnknownComponent = function(name) { return error((String("Unknown component: ") + String(name))); }; +PRIMITIVES["render-dom-unknown-component"] = renderDomUnknownComponent; // RENDER_DOM_FORMS var RENDER_DOM_FORMS = ["if", "when", "cond", "case", "let", "let*", "begin", "do", "define", "defcomp", "defisland", "defmacro", "defstyle", "defhandler", "map", "map-indexed", "filter", "for-each", "portal", "error-boundary", "scope", "provide"]; +PRIMITIVES["RENDER_DOM_FORMS"] = RENDER_DOM_FORMS; // render-dom-form? var isRenderDomForm = function(name) { return contains(RENDER_DOM_FORMS, name); }; +PRIMITIVES["render-dom-form?"] = isRenderDomForm; // dispatch-render-form var dispatchRenderForm = function(name, expr, env, ns) { return (isSxTruthy((name == "if")) ? (isSxTruthy(sxContext("sx-island-scope", NIL)) ? (function() { @@ -2205,6 +2326,7 @@ return (function() { var _m = typeOf(expr); if (_m == "nil") return createFragme scopePop(provName); return frag; })() : renderToDom(trampoline(evalExpr(expr, env)), env, ns)))))))))))))))); }; +PRIMITIVES["dispatch-render-form"] = dispatchRenderForm; // render-lambda-dom var renderLambdaDom = function(f, args, env, ns) { return (function() { @@ -2212,6 +2334,7 @@ return (function() { var _m = typeOf(expr); if (_m == "nil") return createFragme forEachIndexed(function(i, p) { return envSet(local, p, nth(args, i)); }, lambdaParams(f)); return renderToDom(lambdaBody(f), local, ns); })(); }; +PRIMITIVES["render-lambda-dom"] = renderLambdaDom; // render-dom-island var renderDomIsland = function(island, args, env, ns) { return (function() { @@ -2250,6 +2373,7 @@ return (function() { var _m = typeOf(expr); if (_m == "nil") return createFragme })(); })(); })(); }; +PRIMITIVES["render-dom-island"] = renderDomIsland; // render-dom-lake var renderDomLake = function(args, env, ns) { return (function() { @@ -2272,6 +2396,7 @@ return (function() { var _m = typeOf(expr); if (_m == "nil") return createFragme return el; })(); })(); }; +PRIMITIVES["render-dom-lake"] = renderDomLake; // render-dom-marsh var renderDomMarsh = function(args, env, ns) { return (function() { @@ -2299,6 +2424,7 @@ return (function() { var _m = typeOf(expr); if (_m == "nil") return createFragme return el; })(); })(); }; +PRIMITIVES["render-dom-marsh"] = renderDomMarsh; // reactive-text var reactiveText = function(sig) { return (function() { @@ -2306,6 +2432,7 @@ return (function() { var _m = typeOf(expr); if (_m == "nil") return createFragme effect(function() { return domSetTextContent(node, (String(deref(sig)))); }); return node; })(); }; +PRIMITIVES["reactive-text"] = reactiveText; // reactive-attr var reactiveAttr = function(el, attrName, computeFn) { (function() { @@ -2320,6 +2447,7 @@ return effect(function() { return (function() { return (isSxTruthy(sxOr(isNil(val), (val == false))) ? domRemoveAttr(el, attrName) : (isSxTruthy((val == true)) ? domSetAttr(el, attrName, "") : domSetAttr(el, attrName, (String(val))))); })(); })(); }); }; +PRIMITIVES["reactive-attr"] = reactiveAttr; // reactive-spread var reactiveSpread = function(el, renderFn) { return (function() { @@ -2354,10 +2482,11 @@ return (function() { })(); } { var _c = extraKeys; for (var _i = 0; _i < _c.length; _i++) { var k = _c[_i]; domSetAttr(el, k, (String(dictGet(attrs, k)))); } } - return flushCssxToDom(); + return runPostRenderHooks(); })() : ((prevClasses = []), (prevExtraKeys = []))); })(); }); })(); }; +PRIMITIVES["reactive-spread"] = reactiveSpread; // reactive-fragment var reactiveFragment = function(testFn, renderFn, env, ns) { return (function() { @@ -2372,9 +2501,11 @@ return (isSxTruthy(testFn()) ? (function() { })() : NIL); }); return marker; })(); }; +PRIMITIVES["reactive-fragment"] = reactiveFragment; // render-list-item var renderListItem = function(mapFn, item, env, ns) { return (isSxTruthy(isLambda(mapFn)) ? renderLambdaDom(mapFn, [item], env, ns) : renderToDom(apply(mapFn, [item]), env, ns)); }; +PRIMITIVES["render-list-item"] = renderListItem; // extract-key var extractKey = function(node, index) { return (function() { @@ -2384,6 +2515,7 @@ return (isSxTruthy(testFn()) ? (function() { return (isSxTruthy(dk) ? (String(dk)) : (String("__idx_") + String(index))); })()); })(); }; +PRIMITIVES["extract-key"] = extractKey; // reactive-list var reactiveList = function(mapFn, itemsSig, env, ns) { return (function() { @@ -2434,6 +2566,7 @@ return (isSxTruthy(testFn()) ? (function() { })(); }); return container; })(); }; +PRIMITIVES["reactive-list"] = reactiveList; // bind-input var bindInput = function(el, sig) { return (function() { @@ -2446,12 +2579,15 @@ return (isSxTruthy(testFn()) ? (function() { })()); }); return domListen(el, (isSxTruthy(isCheckbox) ? "change" : "input"), function(e) { return (isSxTruthy(isCheckbox) ? reset_b(sig, domGetProp(el, "checked")) : reset_b(sig, domGetProp(el, "value"))); }); })(); }; +PRIMITIVES["bind-input"] = bindInput; // *use-cek-reactive* var _useCekReactive = true; +PRIMITIVES["*use-cek-reactive*"] = _useCekReactive; // enable-cek-reactive! var enableCekReactive = function() { return (_useCekReactive = true); }; +PRIMITIVES["enable-cek-reactive!"] = enableCekReactive; // cek-reactive-text var cekReactiveText = function(expr, env) { return (function() { @@ -2463,6 +2599,7 @@ return (isSxTruthy(testFn()) ? (function() { return node; })(); })(); }; +PRIMITIVES["cek-reactive-text"] = cekReactiveText; // cek-reactive-attr var cekReactiveAttr = function(el, attrName, expr, env) { return (function() { @@ -2477,6 +2614,7 @@ return (isSxTruthy(testFn()) ? (function() { return cekCall(updateFn, [initial]); })(); })(); }; +PRIMITIVES["cek-reactive-attr"] = cekReactiveAttr; // render-dom-portal var renderDomPortal = function(args, env, ns) { return (function() { @@ -2494,6 +2632,7 @@ return (isSxTruthy(testFn()) ? (function() { return marker; })()); })(); }; +PRIMITIVES["render-dom-portal"] = renderDomPortal; // render-dom-error-boundary var renderDomErrorBoundary = function(args, env, ns) { return (function() { @@ -2521,18 +2660,22 @@ return (function() { })(); }); }); return container; })(); }; +PRIMITIVES["render-dom-error-boundary"] = renderDomErrorBoundary; // === Transpiled from engine === // ENGINE_VERBS var ENGINE_VERBS = ["get", "post", "put", "delete", "patch"]; +PRIMITIVES["ENGINE_VERBS"] = ENGINE_VERBS; // DEFAULT_SWAP var DEFAULT_SWAP = "outerHTML"; +PRIMITIVES["DEFAULT_SWAP"] = DEFAULT_SWAP; // parse-time var parseTime = function(s) { return (isSxTruthy(isNil(s)) ? 0 : (isSxTruthy(endsWith(s, "ms")) ? parseInt_(s, 0) : (isSxTruthy(endsWith(s, "s")) ? (parseInt_(replace_(s, "s", ""), 0) * 1000) : parseInt_(s, 0)))); }; +PRIMITIVES["parse-time"] = parseTime; // parse-trigger-spec var parseTriggerSpec = function(spec) { return (isSxTruthy(isNil(spec)) ? NIL : (function() { @@ -2546,15 +2689,18 @@ return (function() { })())); })(); }, rawParts)); })()); }; +PRIMITIVES["parse-trigger-spec"] = parseTriggerSpec; // default-trigger var defaultTrigger = function(tagName) { return (isSxTruthy((tagName == "FORM")) ? [{["event"]: "submit", ["modifiers"]: {}}] : (isSxTruthy(sxOr((tagName == "INPUT"), (tagName == "SELECT"), (tagName == "TEXTAREA"))) ? [{["event"]: "change", ["modifiers"]: {}}] : [{["event"]: "click", ["modifiers"]: {}}])); }; +PRIMITIVES["default-trigger"] = defaultTrigger; // get-verb-info var getVerbInfo = function(el) { return some(function(verb) { return (function() { var url = domGetAttr(el, (String("sx-") + String(verb))); return (isSxTruthy(url) ? {["method"]: upper(verb), ["url"]: url} : NIL); })(); }, ENGINE_VERBS); }; +PRIMITIVES["get-verb-info"] = getVerbInfo; // build-request-headers var buildRequestHeaders = function(el, loadedComponents, cssHash) { return (function() { @@ -2578,9 +2724,11 @@ return (function() { })(); return headers; })(); }; +PRIMITIVES["build-request-headers"] = buildRequestHeaders; // process-response-headers var processResponseHeaders = function(getHeader) { return {["redirect"]: getHeader("SX-Redirect"), ["refresh"]: getHeader("SX-Refresh"), ["trigger"]: getHeader("SX-Trigger"), ["retarget"]: getHeader("SX-Retarget"), ["reswap"]: getHeader("SX-Reswap"), ["location"]: getHeader("SX-Location"), ["replace-url"]: getHeader("SX-Replace-Url"), ["css-hash"]: getHeader("SX-Css-Hash"), ["trigger-swap"]: getHeader("SX-Trigger-After-Swap"), ["trigger-settle"]: getHeader("SX-Trigger-After-Settle"), ["content-type"]: getHeader("Content-Type"), ["cache-invalidate"]: getHeader("SX-Cache-Invalidate"), ["cache-update"]: getHeader("SX-Cache-Update")}; }; +PRIMITIVES["process-response-headers"] = processResponseHeaders; // parse-swap-spec var parseSwapSpec = function(rawSwap, globalTransitions_p) { return (function() { @@ -2590,15 +2738,18 @@ return (function() { { var _c = rest(parts); for (var _i = 0; _i < _c.length; _i++) { var p = _c[_i]; (isSxTruthy((p == "transition:true")) ? (useTransition = true) : (isSxTruthy((p == "transition:false")) ? (useTransition = false) : NIL)); } } return {["style"]: style, ["transition"]: useTransition}; })(); }; +PRIMITIVES["parse-swap-spec"] = parseSwapSpec; // parse-retry-spec var parseRetrySpec = function(retryAttr) { return (isSxTruthy(isNil(retryAttr)) ? NIL : (function() { var parts = split(retryAttr, ":"); return {["strategy"]: first(parts), ["start-ms"]: parseInt_(nth(parts, 1), 1000), ["cap-ms"]: parseInt_(nth(parts, 2), 30000)}; })()); }; +PRIMITIVES["parse-retry-spec"] = parseRetrySpec; // next-retry-ms var nextRetryMs = function(currentMs, capMs) { return min((currentMs * 2), capMs); }; +PRIMITIVES["next-retry-ms"] = nextRetryMs; // filter-params var filterParams = function(paramsSpec, allParams) { return (isSxTruthy(isNil(paramsSpec)) ? allParams : (isSxTruthy((paramsSpec == "none")) ? [] : (isSxTruthy((paramsSpec == "*")) ? allParams : (isSxTruthy(startsWith(paramsSpec, "not ")) ? (function() { @@ -2608,12 +2759,14 @@ return (function() { var allowed = map(trim, split(paramsSpec, ",")); return filter(function(p) { return contains(allowed, first(p)); }, allParams); })())))); }; +PRIMITIVES["filter-params"] = filterParams; // resolve-target var resolveTarget = function(el) { return (function() { var sel = domGetAttr(el, "sx-target"); return (isSxTruthy(sxOr(isNil(sel), (sel == "this"))) ? el : (isSxTruthy((sel == "closest")) ? domParent(el) : domQuery(sel))); })(); }; +PRIMITIVES["resolve-target"] = resolveTarget; // apply-optimistic var applyOptimistic = function(el) { return (function() { @@ -2629,6 +2782,7 @@ return (function() { return state; })()); })(); }; +PRIMITIVES["apply-optimistic"] = applyOptimistic; // revert-optimistic var revertOptimistic = function(state) { return (isSxTruthy(state) ? (function() { @@ -2636,6 +2790,7 @@ return (function() { var directive = get(state, "directive"); return (isSxTruthy((directive == "remove")) ? (domSetStyle(target, "opacity", sxOr(get(state, "opacity"), "")), domSetStyle(target, "pointer-events", "")) : (isSxTruthy((directive == "disable")) ? domSetProp(target, "disabled", sxOr(get(state, "disabled"), false)) : (isSxTruthy(get(state, "add-class")) ? domRemoveClass(target, get(state, "add-class")) : NIL))); })() : NIL); }; +PRIMITIVES["revert-optimistic"] = revertOptimistic; // find-oob-swaps var findOobSwaps = function(container) { return (function() { @@ -2651,9 +2806,11 @@ return (function() { })(); } } return results; })(); }; +PRIMITIVES["find-oob-swaps"] = findOobSwaps; // morph-node var morphNode = function(oldNode, newNode) { return (isSxTruthy(sxOr(domHasAttr(oldNode, "sx-preserve"), domHasAttr(oldNode, "sx-ignore"))) ? NIL : (isSxTruthy((isSxTruthy(domHasAttr(oldNode, "data-sx-island")) && isSxTruthy(isProcessed(oldNode, "island-hydrated")) && isSxTruthy(domHasAttr(newNode, "data-sx-island")) && (domGetAttr(oldNode, "data-sx-island") == domGetAttr(newNode, "data-sx-island")))) ? morphIslandChildren(oldNode, newNode) : (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))))); }; +PRIMITIVES["morph-node"] = morphNode; // sync-attrs var syncAttrs = function(oldEl, newEl) { return (function() { @@ -2669,6 +2826,7 @@ return (function() { return (isSxTruthy((isSxTruthy(!isSxTruthy(domHasAttr(newEl, aname))) && isSxTruthy(!isSxTruthy(contains(reactiveAttrs, aname))) && !isSxTruthy((aname == "data-sx-reactive-attrs")))) ? domRemoveAttr(oldEl, aname) : NIL); })(); }, domAttrList(oldEl)); })(); }; +PRIMITIVES["sync-attrs"] = syncAttrs; // morph-children var morphChildren = function(oldParent, newParent) { return (function() { @@ -2692,6 +2850,7 @@ return (function() { 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))); })(); }; +PRIMITIVES["morph-children"] = morphChildren; // morph-island-children var morphIslandChildren = function(oldIsland, newIsland) { return (function() { @@ -2727,6 +2886,7 @@ return (function() { return processSignalUpdates(newIsland); })(); })(); }; +PRIMITIVES["morph-island-children"] = morphIslandChildren; // morph-marsh var morphMarsh = function(oldMarsh, newMarsh, islandEl) { return (function() { @@ -2746,6 +2906,7 @@ return (function() { })(); })() : (syncAttrs(oldMarsh, newMarsh), morphChildren(oldMarsh, newMarsh))); })(); }; +PRIMITIVES["morph-marsh"] = morphMarsh; // process-signal-updates var processSignalUpdates = function(root) { return (function() { @@ -2766,6 +2927,7 @@ return (function() { })() : NIL); })(); }, signalEls); })(); }; +PRIMITIVES["process-signal-updates"] = processSignalUpdates; // swap-dom-nodes var swapDomNodes = function(target, newNodes, strategy) { return (function() { var _m = strategy; if (_m == "innerHTML") return (isSxTruthy(domIsFragment(newNodes)) ? morphChildren(target, newNodes) : (function() { @@ -2787,6 +2949,7 @@ return (function() { domAppend(wrapper, newNodes); return morphChildren(target, wrapper); })()); })(); }; +PRIMITIVES["swap-dom-nodes"] = swapDomNodes; // insert-remaining-siblings var insertRemainingSiblings = function(parent, refNode, sib) { return (isSxTruthy(sib) ? (function() { @@ -2794,6 +2957,7 @@ return (function() { domInsertAfter(refNode, sib); return insertRemainingSiblings(parent, sib, next); })() : NIL); }; +PRIMITIVES["insert-remaining-siblings"] = insertRemainingSiblings; // swap-html-string var swapHtmlString = function(target, html, strategy) { return (function() { var _m = strategy; if (_m == "innerHTML") return domSetInnerHtml(target, html); if (_m == "outerHTML") return (function() { @@ -2802,6 +2966,7 @@ return (function() { domRemoveChild(parent, target); return parent; })(); if (_m == "afterend") return domInsertAdjacentHtml(target, "afterend", html); if (_m == "beforeend") return domInsertAdjacentHtml(target, "beforeend", html); if (_m == "afterbegin") return domInsertAdjacentHtml(target, "afterbegin", html); if (_m == "beforebegin") return domInsertAdjacentHtml(target, "beforebegin", html); if (_m == "delete") return domRemoveChild(domParent(target), target); if (_m == "none") return NIL; return domSetInnerHtml(target, html); })(); }; +PRIMITIVES["swap-html-string"] = swapHtmlString; // handle-history var handleHistory = function(el, url, respHeaders) { return (function() { @@ -2810,45 +2975,55 @@ return (function() { var hdrReplace = get(respHeaders, "replace-url"); 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))); })(); }; +PRIMITIVES["handle-history"] = handleHistory; // PRELOAD_TTL var PRELOAD_TTL = 30000; +PRIMITIVES["PRELOAD_TTL"] = PRELOAD_TTL; // preload-cache-get var preloadCacheGet = function(cache, url) { return (function() { var entry = dictGet(cache, url); return (isSxTruthy(isNil(entry)) ? NIL : (isSxTruthy(((nowMs() - get(entry, "timestamp")) > PRELOAD_TTL)) ? (dictDelete(cache, url), NIL) : (dictDelete(cache, url), entry))); })(); }; +PRIMITIVES["preload-cache-get"] = preloadCacheGet; // preload-cache-set var preloadCacheSet = function(cache, url, text, contentType) { return dictSet(cache, url, {["text"]: text, ["content-type"]: contentType, ["timestamp"]: nowMs()}); }; +PRIMITIVES["preload-cache-set"] = preloadCacheSet; // classify-trigger var classifyTrigger = function(trigger) { return (function() { var event = get(trigger, "event"); return (isSxTruthy((event == "every")) ? "poll" : (isSxTruthy((event == "intersect")) ? "intersect" : (isSxTruthy((event == "load")) ? "load" : (isSxTruthy((event == "revealed")) ? "revealed" : "event")))); })(); }; +PRIMITIVES["classify-trigger"] = classifyTrigger; // should-boost-link? var shouldBoostLink = function(link) { return (function() { var href = domGetAttr(link, "href"); 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"))); })(); }; +PRIMITIVES["should-boost-link?"] = shouldBoostLink; // should-boost-form? var shouldBoostForm = function(form) { return (isSxTruthy(!isSxTruthy(domHasAttr(form, "sx-get"))) && isSxTruthy(!isSxTruthy(domHasAttr(form, "sx-post"))) && !isSxTruthy(domHasAttr(form, "sx-disable"))); }; +PRIMITIVES["should-boost-form?"] = shouldBoostForm; // parse-sse-swap var parseSseSwap = function(el) { return sxOr(domGetAttr(el, "sx-sse-swap"), "message"); }; +PRIMITIVES["parse-sse-swap"] = parseSseSwap; // === Transpiled from orchestration === // _preload-cache var _preloadCache = {}; +PRIMITIVES["_preload-cache"] = _preloadCache; // _css-hash var _cssHash = ""; +PRIMITIVES["_css-hash"] = _cssHash; // dispatch-trigger-events var dispatchTriggerEvents = function(el, headerVal) { return (isSxTruthy(headerVal) ? (function() { @@ -2858,6 +3033,7 @@ return (function() { return (isSxTruthy(!isSxTruthy(isEmpty(trimmed))) ? domDispatch(el, trimmed, {}) : NIL); })(); }, split(headerVal, ","))); })() : NIL); }; +PRIMITIVES["dispatch-trigger-events"] = dispatchTriggerEvents; // init-css-tracking var initCssTracking = function() { return (function() { @@ -2867,6 +3043,7 @@ return (function() { return (isSxTruthy(content) ? (_cssHash = content) : NIL); })() : NIL); })(); }; +PRIMITIVES["init-css-tracking"] = initCssTracking; // execute-request var executeRequest = function(el, verbInfo, extraParams) { return (function() { @@ -2887,6 +3064,7 @@ return (function() { })())); })()); })(); }; +PRIMITIVES["execute-request"] = executeRequest; // do-fetch var doFetch = function(el, verb, method, url, extraParams) { return (function() { @@ -2934,6 +3112,7 @@ return (function() { })(); })(); })(); }; +PRIMITIVES["do-fetch"] = doFetch; // handle-fetch-success var handleFetchSuccess = function(el, url, verb, extraParams, getHeader, text) { return (function() { @@ -2960,6 +3139,7 @@ return processSettleHooks(el); }, 20); return domDispatch(el, "sx:afterSwap", {["target"]: targetEl, ["swap"]: swapStyle}); })()))); })(); }; +PRIMITIVES["handle-fetch-success"] = handleFetchSuccess; // handle-sx-response var handleSxResponse = function(el, target, text, swapStyle, useTransition) { return (function() { @@ -2987,6 +3167,7 @@ return postSwap(target); }); })(); })(); })(); }; +PRIMITIVES["handle-sx-response"] = handleSxResponse; // handle-html-response var handleHtmlResponse = function(el, target, text, swapStyle, useTransition) { return (function() { @@ -3010,6 +3191,7 @@ return postSwap(target); }); })()); })() : NIL); })(); }; +PRIMITIVES["handle-html-response"] = handleHtmlResponse; // handle-retry var handleRetry = function(el, verb, method, url, extraParams) { return (function() { @@ -3024,6 +3206,7 @@ return postSwap(target); }); })(); })() : NIL); })(); }; +PRIMITIVES["handle-retry"] = handleRetry; // bind-triggers var bindTriggers = function(el, verbInfo) { return (function() { @@ -3034,6 +3217,7 @@ return postSwap(target); }); return (isSxTruthy((kind == "poll")) ? setInterval_(function() { return executeRequest(el, NIL, NIL); }, get(mods, "interval")) : (isSxTruthy((kind == "intersect")) ? observeIntersection(el, function() { return executeRequest(el, NIL, NIL); }, false, get(mods, "delay")) : (isSxTruthy((kind == "load")) ? setTimeout_(function() { return executeRequest(el, NIL, NIL); }, sxOr(get(mods, "delay"), 0)) : (isSxTruthy((kind == "revealed")) ? observeIntersection(el, function() { return executeRequest(el, NIL, NIL); }, true, get(mods, "delay")) : (isSxTruthy((kind == "event")) ? bindEvent(el, get(trigger, "event"), mods, verbInfo) : NIL))))); })(); }, triggers); })(); }; +PRIMITIVES["bind-triggers"] = bindTriggers; // bind-event var bindEvent = function(el, eventName, mods, verbInfo) { return (function() { @@ -3059,14 +3243,16 @@ return postSwap(target); }); })()) : NIL); })(); }, (isSxTruthy(get(mods, "once")) ? {["once"]: true} : NIL)) : NIL); })(); }; +PRIMITIVES["bind-event"] = bindEvent; // post-swap var postSwap = function(root) { activateScripts(root); sxProcessScripts(root); sxHydrate(root); sxHydrateIslands(root); -flushCssxToDom(); +runPostRenderHooks(); return processElements(root); }; +PRIMITIVES["post-swap"] = postSwap; // process-settle-hooks var processSettleHooks = function(el) { return (function() { @@ -3076,6 +3262,7 @@ return processElements(root); }; return forEach(function(expr) { return evalExpr(expr, envExtend({})); }, exprs); })() : NIL); })(); }; +PRIMITIVES["process-settle-hooks"] = processSettleHooks; // activate-scripts var activateScripts = function(root) { return (isSxTruthy(root) ? (function() { @@ -3086,6 +3273,7 @@ return processElements(root); }; return domReplaceChild(domParent(dead), live, dead); })() : NIL); }, scripts); })() : NIL); }; +PRIMITIVES["activate-scripts"] = activateScripts; // process-oob-swaps var processOobSwaps = function(container, swapFn) { return (function() { @@ -3101,6 +3289,7 @@ return processElements(root); }; return (isSxTruthy(target) ? swapFn(target, oobEl, swapType) : NIL); })(); }, oobs); })(); }; +PRIMITIVES["process-oob-swaps"] = processOobSwaps; // hoist-head-elements var hoistHeadElements = function(container) { { var _c = domQueryAll(container, "style[data-sx-css]"); for (var _i = 0; _i < _c.length; _i++) { var style = _c[_i]; if (isSxTruthy(domParent(style))) { @@ -3111,9 +3300,11 @@ return forEach(function(link) { if (isSxTruthy(domParent(link))) { domRemoveChild(domParent(link), link); } return domAppendToHead(link); }, domQueryAll(container, "link[rel=\"stylesheet\"]")); }; +PRIMITIVES["hoist-head-elements"] = hoistHeadElements; // process-boosted var processBoosted = function(root) { return forEach(function(container) { return boostDescendants(container); }, domQueryAll(sxOr(root, domBody()), "[sx-boost]")); }; +PRIMITIVES["process-boosted"] = processBoosted; // boost-descendants var boostDescendants = function(container) { return (function() { @@ -3143,12 +3334,15 @@ return domAppendToHead(link); }, domQueryAll(container, "link[rel=\"stylesheet\" return bindBoostForm(form, method, action); })()) : NIL); }, domQueryAll(container, "form")); })(); }; +PRIMITIVES["boost-descendants"] = boostDescendants; // _page-data-cache var _pageDataCache = {}; +PRIMITIVES["_page-data-cache"] = _pageDataCache; // _page-data-cache-ttl var _pageDataCacheTtl = 30000; +PRIMITIVES["_page-data-cache-ttl"] = _pageDataCacheTtl; // page-data-cache-key var pageDataCacheKey = function(pageName, params) { return (function() { @@ -3159,15 +3353,18 @@ return domAppendToHead(link); }, domQueryAll(container, "link[rel=\"stylesheet\" return (String(base) + String(":") + String(join("&", parts))); })()); })(); }; +PRIMITIVES["page-data-cache-key"] = pageDataCacheKey; // page-data-cache-get var pageDataCacheGet = function(cacheKey) { return (function() { var entry = get(_pageDataCache, cacheKey); return (isSxTruthy(isNil(entry)) ? NIL : (isSxTruthy(((nowMs() - get(entry, "ts")) > _pageDataCacheTtl)) ? (dictSet(_pageDataCache, cacheKey, NIL), NIL) : get(entry, "data"))); })(); }; +PRIMITIVES["page-data-cache-get"] = pageDataCacheGet; // page-data-cache-set var pageDataCacheSet = function(cacheKey, data) { return dictSet(_pageDataCache, cacheKey, {"data": data, "ts": nowMs()}); }; +PRIMITIVES["page-data-cache-set"] = pageDataCacheSet; // invalidate-page-cache var invalidatePageCache = function(pageName) { { var _c = keys(_pageDataCache); for (var _i = 0; _i < _c.length; _i++) { var k = _c[_i]; if (isSxTruthy(sxOr((k == pageName), startsWith(k, (String(pageName) + String(":")))))) { @@ -3175,11 +3372,13 @@ return domAppendToHead(link); }, domQueryAll(container, "link[rel=\"stylesheet\" } } } swPostMessage({"type": "invalidate", "page": pageName}); return logInfo((String("sx:cache invalidate ") + String(pageName))); }; +PRIMITIVES["invalidate-page-cache"] = invalidatePageCache; // invalidate-all-page-cache var invalidateAllPageCache = function() { _pageDataCache = {}; swPostMessage({"type": "invalidate", "page": "*"}); return logInfo("sx:cache invalidate *"); }; +PRIMITIVES["invalidate-all-page-cache"] = invalidateAllPageCache; // update-page-cache var updatePageCache = function(pageName, data) { return (function() { @@ -3187,6 +3386,7 @@ return logInfo("sx:cache invalidate *"); }; pageDataCacheSet(cacheKey, data); return logInfo((String("sx:cache update ") + String(pageName))); })(); }; +PRIMITIVES["update-page-cache"] = updatePageCache; // process-cache-directives var processCacheDirectives = function(el, respHeaders, responseText) { (function() { @@ -3204,9 +3404,11 @@ return (function() { return (isSxTruthy(data) ? updatePageCache(hdrUpdate, data) : NIL); })() : NIL); })(); }; +PRIMITIVES["process-cache-directives"] = processCacheDirectives; // _optimistic-snapshots var _optimisticSnapshots = {}; +PRIMITIVES["_optimistic-snapshots"] = _optimisticSnapshots; // optimistic-cache-update var optimisticCacheUpdate = function(cacheKey, mutator) { return (function() { @@ -3218,15 +3420,18 @@ return (function() { return predicted; })() : NIL); })(); }; +PRIMITIVES["optimistic-cache-update"] = optimisticCacheUpdate; // optimistic-cache-revert var optimisticCacheRevert = function(cacheKey) { return (function() { var snapshot = get(_optimisticSnapshots, cacheKey); return (isSxTruthy(snapshot) ? (pageDataCacheSet(cacheKey, snapshot), dictDelete(_optimisticSnapshots, cacheKey), snapshot) : NIL); })(); }; +PRIMITIVES["optimistic-cache-revert"] = optimisticCacheRevert; // optimistic-cache-confirm var optimisticCacheConfirm = function(cacheKey) { return dictDelete(_optimisticSnapshots, cacheKey); }; +PRIMITIVES["optimistic-cache-confirm"] = optimisticCacheConfirm; // submit-mutation var submitMutation = function(pageName, params, actionName, payload, mutatorFn, onComplete) { return (function() { @@ -3252,18 +3457,23 @@ return (isSxTruthy(onComplete) ? onComplete("confirmed") : NIL); }, function(err return (isSxTruthy(onComplete) ? onComplete("reverted") : NIL); })(); }); })(); }; +PRIMITIVES["submit-mutation"] = submitMutation; // _is-online var _isOnline = true; +PRIMITIVES["_is-online"] = _isOnline; // _offline-queue var _offlineQueue = []; +PRIMITIVES["_offline-queue"] = _offlineQueue; // offline-is-online? var offlineIsOnline_p = function() { return _isOnline; }; +PRIMITIVES["offline-is-online?"] = offlineIsOnline_p; // offline-set-online! var offlineSetOnline_b = function(val) { return (_isOnline = val); }; +PRIMITIVES["offline-set-online!"] = offlineSetOnline_b; // offline-queue-mutation var offlineQueueMutation = function(actionName, payload, pageName, params, mutatorFn) { return (function() { @@ -3277,6 +3487,7 @@ return (isSxTruthy(onComplete) ? onComplete("confirmed") : NIL); }, function(err logInfo((String("sx:offline queued ") + String(actionName) + String(" (") + String(len(_offlineQueue)) + String(" pending)"))); return entry; })(); }; +PRIMITIVES["offline-queue-mutation"] = offlineQueueMutation; // offline-sync var offlineSync = function() { return (function() { @@ -3285,12 +3496,15 @@ return (isSxTruthy(onComplete) ? onComplete("confirmed") : NIL); }, function(err return logInfo((String("sx:offline synced ") + String(get(entry, "action")))); }, function(error) { entry["status"] = "failed"; return logWarn((String("sx:offline sync failed ") + String(get(entry, "action")) + String(": ") + String(error))); }); }, pending)) : NIL); })(); }; +PRIMITIVES["offline-sync"] = offlineSync; // offline-pending-count var offlinePendingCount = function() { return len(filter(function(e) { return (get(e, "status") == "pending"); }, _offlineQueue)); }; +PRIMITIVES["offline-pending-count"] = offlinePendingCount; // offline-aware-mutation var offlineAwareMutation = function(pageName, params, actionName, payload, mutatorFn, onComplete) { return (isSxTruthy(_isOnline) ? submitMutation(pageName, params, actionName, payload, mutatorFn, onComplete) : (offlineQueueMutation(actionName, payload, pageName, params, mutatorFn), (isSxTruthy(onComplete) ? onComplete("queued") : NIL))); }; +PRIMITIVES["offline-aware-mutation"] = offlineAwareMutation; // current-page-layout var currentPageLayout = function() { return (function() { @@ -3298,12 +3512,15 @@ return logWarn((String("sx:offline sync failed ") + String(get(entry, "action")) var match = findMatchingRoute(pathname, _pageRoutes); return (isSxTruthy(isNil(match)) ? "" : sxOr(get(match, "layout"), "")); })(); }; +PRIMITIVES["current-page-layout"] = currentPageLayout; // swap-rendered-content - var swapRenderedContent = function(target, rendered, pathname) { return (disposeIslandsIn(target), domSetTextContent(target, ""), domAppend(target, rendered), hoistHeadElementsFull(target), processElements(target), sxHydrateElements(target), flushCssxToDom(), domDispatch(target, "sx:clientRoute", {["pathname"]: pathname}), logInfo((String("sx:route client ") + String(pathname)))); }; + var swapRenderedContent = function(target, rendered, pathname) { return (disposeIslandsIn(target), domSetTextContent(target, ""), domAppend(target, rendered), hoistHeadElementsFull(target), processElements(target), sxHydrateElements(target), runPostRenderHooks(), domDispatch(target, "sx:clientRoute", {["pathname"]: pathname}), logInfo((String("sx:route client ") + String(pathname)))); }; +PRIMITIVES["swap-rendered-content"] = swapRenderedContent; // resolve-route-target var resolveRouteTarget = function(targetSel) { return (isSxTruthy((isSxTruthy(targetSel) && !isSxTruthy((targetSel == "true")))) ? domQuery(targetSel) : NIL); }; +PRIMITIVES["resolve-route-target"] = resolveRouteTarget; // deps-satisfied? var depsSatisfied_p = function(match) { return (function() { @@ -3311,6 +3528,7 @@ return logWarn((String("sx:offline sync failed ") + String(get(entry, "action")) var loaded = loadedComponentNames(); return (isSxTruthy(sxOr(isNil(deps), isEmpty(deps))) ? true : isEvery(function(dep) { return contains(loaded, dep); }, deps)); })(); }; +PRIMITIVES["deps-satisfied?"] = depsSatisfied_p; // try-client-route var tryClientRoute = function(pathname, targetSel) { return (function() { @@ -3366,12 +3584,15 @@ return (function() { })()); })()); })(); }; +PRIMITIVES["try-client-route"] = tryClientRoute; // bind-client-route-link var bindClientRouteLink = function(link, href) { return bindClientRouteClick(link, href, function() { return bindBoostLink(link, href); }); }; +PRIMITIVES["bind-client-route-link"] = bindClientRouteLink; // process-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]")); }; +PRIMITIVES["process-sse"] = processSse; // bind-sse var bindSse = function(el) { return (function() { @@ -3382,6 +3603,7 @@ return (function() { return eventSourceListen(source, eventName, function(data) { return bindSseSwap(el, data); }); })() : NIL); })(); }; +PRIMITIVES["bind-sse"] = bindSse; // bind-sse-swap var bindSseSwap = function(el, data) { return (function() { @@ -3399,6 +3621,7 @@ return postSwap(target); }); })() : withTransition(useTransition, function() { swapHtmlString(target, trimmed, swapStyle); return postSwap(target); }))) : NIL); })(); }; +PRIMITIVES["bind-sse-swap"] = bindSseSwap; // bind-inline-handlers var bindInlineHandlers = function(root) { return forEach(function(el) { return forEach(function(attr) { return (function() { @@ -3418,6 +3641,7 @@ return postSwap(target); }))) : NIL); })()) : NIL); })() : NIL); })(); }, domAttrList(el)); }, domQueryAll(sxOr(root, domBody()), "[sx-on\\:]")); }; +PRIMITIVES["bind-inline-handlers"] = bindInlineHandlers; // bind-preload-for var bindPreloadFor = function(el) { return (function() { @@ -3431,12 +3655,15 @@ return postSwap(target); }))) : NIL); })(); }); })() : NIL); })(); }; +PRIMITIVES["bind-preload-for"] = bindPreloadFor; // do-preload var doPreload = function(url, headers) { return (isSxTruthy(isNil(preloadCacheGet(_preloadCache, url))) ? fetchPreload(url, headers, _preloadCache) : NIL); }; +PRIMITIVES["do-preload"] = doPreload; // VERB_SELECTOR var VERB_SELECTOR = (String("[sx-get],[sx-post],[sx-put],[sx-delete],[sx-patch]")); +PRIMITIVES["VERB_SELECTOR"] = VERB_SELECTOR; // process-elements var processElements = function(root) { (function() { @@ -3447,12 +3674,14 @@ processBoosted(root); processSse(root); bindInlineHandlers(root); return processEmitElements(root); }; +PRIMITIVES["process-elements"] = processElements; // process-one var processOne = function(el) { return (function() { var verbInfo = getVerbInfo(el); return (isSxTruthy(verbInfo) ? (isSxTruthy(!isSxTruthy(domHasAttr(el, "sx-disable"))) ? (bindTriggers(el, verbInfo), bindPreloadFor(el)) : NIL) : NIL); })(); }; +PRIMITIVES["process-one"] = processOne; // process-emit-elements var processEmitElements = function(root) { return (function() { @@ -3466,6 +3695,7 @@ return processEmitElements(root); }; })(); }) : NIL); })()) : NIL); }, els); })(); }; +PRIMITIVES["process-emit-elements"] = processEmitElements; // handle-popstate var handlePopstate = function(scrollY) { return (function() { @@ -3483,15 +3713,18 @@ return processEmitElements(root); }; return fetchAndRestore(target, url, headers, scrollY); })()) : NIL); })(); }; +PRIMITIVES["handle-popstate"] = handlePopstate; // engine-init var engineInit = function() { return (initCssTracking(), sxProcessScripts(NIL), sxHydrate(NIL), processElements(NIL)); }; +PRIMITIVES["engine-init"] = engineInit; // === Transpiled from boot === // HEAD_HOIST_SELECTOR var HEAD_HOIST_SELECTOR = "meta, title, link[rel='canonical'], script[type='application/ld+json']"; +PRIMITIVES["HEAD_HOIST_SELECTOR"] = HEAD_HOIST_SELECTOR; // hoist-head-elements-full var hoistHeadElementsFull = function(root) { return (function() { @@ -3508,6 +3741,7 @@ return processEmitElements(root); }; })(), domRemoveChild(domParent(el), el), domAppendToHead(el)) : (isSxTruthy((isSxTruthy((tag == "link")) && (domGetAttr(el, "rel") == "canonical"))) ? (removeHeadElement("link[rel=\"canonical\"]"), domRemoveChild(domParent(el), el), domAppendToHead(el)) : (domRemoveChild(domParent(el), el), domAppendToHead(el))))); })(); }, els); })(); }; +PRIMITIVES["hoist-head-elements-full"] = hoistHeadElementsFull; // sx-mount var sxMount = function(target, source, extraEnv) { return (function() { @@ -3520,9 +3754,10 @@ return processEmitElements(root); }; processElements(el); sxHydrateElements(el); sxHydrateIslands(el); - return flushCssxToDom(); + return runPostRenderHooks(); })() : NIL); })(); }; +PRIMITIVES["sx-mount"] = sxMount; // resolve-suspense var resolveSuspense = function(id, sx) { processSxScripts(NIL); @@ -3536,16 +3771,18 @@ return (function() { processElements(el); sxHydrateElements(el); sxHydrateIslands(el); - flushCssxToDom(); + runPostRenderHooks(); return domDispatch(el, "sx:resolved", {"id": id}); })() : logWarn((String("resolveSuspense: no element for id=") + String(id)))); })(); }; +PRIMITIVES["resolve-suspense"] = resolveSuspense; // sx-hydrate-elements var sxHydrateElements = function(root) { return (function() { var els = domQueryAll(sxOr(root, domBody()), "[data-sx]"); return forEach(function(el) { return (isSxTruthy(!isSxTruthy(isProcessed(el, "hydrated"))) ? (markProcessed(el, "hydrated"), sxUpdateElement(el, NIL)) : NIL); }, els); })(); }; +PRIMITIVES["sx-hydrate-elements"] = sxHydrateElements; // sx-update-element var sxUpdateElement = function(el, newEnv) { return (function() { @@ -3564,6 +3801,7 @@ return (function() { })() : NIL); })() : NIL); })(); }; +PRIMITIVES["sx-update-element"] = sxUpdateElement; // sx-render-component var sxRenderComponent = function(name, kwargs, extraEnv) { return (function() { @@ -3579,6 +3817,7 @@ callExpr.push(dictGet(kwargs, k)); } } })()); })(); })(); }; +PRIMITIVES["sx-render-component"] = sxRenderComponent; // process-sx-scripts var processSxScripts = function(root) { return (function() { @@ -3595,6 +3834,7 @@ callExpr.push(dictGet(kwargs, k)); } } })() : sxLoadComponents(text))))); })()) : NIL); }, scripts); })(); }; +PRIMITIVES["process-sx-scripts"] = processSxScripts; // process-component-script var processComponentScript = function(script, text) { return (function() { @@ -3611,9 +3851,11 @@ callExpr.push(dictGet(kwargs, k)); } } return setSxCompCookie(hash); })()); })(); }; +PRIMITIVES["process-component-script"] = processComponentScript; // _page-routes var _pageRoutes = []; +PRIMITIVES["_page-routes"] = _pageRoutes; // process-page-scripts var processPageScripts = function() { return (function() { @@ -3633,12 +3875,14 @@ callExpr.push(dictGet(kwargs, k)); } } } } } return logInfo((String("pages: ") + String(len(_pageRoutes)) + String(" routes loaded"))); })(); }; +PRIMITIVES["process-page-scripts"] = processPageScripts; // sx-hydrate-islands var sxHydrateIslands = function(root) { return (function() { var els = domQueryAll(sxOr(root, domBody()), "[data-sx-island]"); return forEach(function(el) { return (isSxTruthy(!isSxTruthy(isProcessed(el, "island-hydrated"))) ? (markProcessed(el, "island-hydrated"), hydrateIsland(el)) : NIL); }, els); })(); }; +PRIMITIVES["sx-hydrate-islands"] = sxHydrateIslands; // hydrate-island var hydrateIsland = function(el) { return (function() { @@ -3666,12 +3910,14 @@ callExpr.push(dictGet(kwargs, k)); } } })(); })(); })(); }; +PRIMITIVES["hydrate-island"] = hydrateIsland; // dispose-island var disposeIsland = function(el) { return (function() { var disposers = domGetData(el, "sx-disposers"); return (isSxTruthy(disposers) ? (forEach(function(d) { return (isSxTruthy(isCallable(d)) ? d() : NIL); }, disposers), domSetData(el, "sx-disposers", NIL)) : NIL); })(); }; +PRIMITIVES["dispose-island"] = disposeIsland; // dispose-islands-in var disposeIslandsIn = function(root) { return (isSxTruthy(root) ? (function() { @@ -3681,24 +3927,37 @@ callExpr.push(dictGet(kwargs, k)); } } return (isSxTruthy(!isSxTruthy(isEmpty(toDispose))) ? (logInfo((String("disposing ") + String(len(toDispose)) + String(" island(s)"))), forEach(disposeIsland, toDispose)) : NIL); })() : NIL); })() : NIL); }; +PRIMITIVES["dispose-islands-in"] = disposeIslandsIn; - // flush-cssx-to-dom - var flushCssxToDom = function() { return (function() { - var rules = sxCollected("cssx"); - return (isSxTruthy(!isSxTruthy(isEmpty(rules))) ? ((function() { - var style = sxOr(domQuery("#sx-cssx-live"), (function() { - var s = domCreateElement("style", NIL); - domSetAttr(s, "id", "sx-cssx-live"); - domSetAttr(s, "data-cssx", ""); - domAppendToHead(s); - return s; -})()); - return domSetProp(style, "textContent", (String(sxOr(domGetProp(style, "textContent"), "")) + String(join("", rules)))); -})(), sxClearCollected("cssx")) : NIL); -})(); }; + // *pre-render-hooks* + var _preRenderHooks_ = []; +PRIMITIVES["*pre-render-hooks*"] = _preRenderHooks_; + + // *post-render-hooks* + var _postRenderHooks_ = []; +PRIMITIVES["*post-render-hooks*"] = _postRenderHooks_; + + // register-pre-render-hook + var registerPreRenderHook = function(hookFn) { return append_b(_preRenderHooks_, hookFn); }; +PRIMITIVES["register-pre-render-hook"] = registerPreRenderHook; + + // register-post-render-hook + var registerPostRenderHook = function(hookFn) { return append_b(_postRenderHooks_, hookFn); }; +PRIMITIVES["register-post-render-hook"] = registerPostRenderHook; + + // run-pre-render-hooks + var runPreRenderHooks = function() { return forEach(function(hook) { return cekCall(hook, NIL); }, _preRenderHooks_); }; +PRIMITIVES["run-pre-render-hooks"] = runPreRenderHooks; + + // run-post-render-hooks + var runPostRenderHooks = function() { logInfo("run-post-render-hooks:", len(_postRenderHooks_), "hooks"); +return forEach(function(hook) { logInfo(" hook type:", typeOf(hook), "callable:", isCallable(hook), "lambda:", isLambda(hook)); +return cekCall(hook, NIL); }, _postRenderHooks_); }; +PRIMITIVES["run-post-render-hooks"] = runPostRenderHooks; // boot-init - var bootInit = function() { return (logInfo((String("sx-browser ") + String(SX_VERSION))), initCssTracking(), processPageScripts(), processSxScripts(NIL), sxHydrateElements(NIL), sxHydrateIslands(NIL), flushCssxToDom(), processElements(NIL)); }; + var bootInit = function() { return (logInfo((String("sx-browser ") + String(SX_VERSION))), initCssTracking(), processPageScripts(), processSxScripts(NIL), sxHydrateElements(NIL), sxHydrateIslands(NIL), runPostRenderHooks(), processElements(NIL)); }; +PRIMITIVES["boot-init"] = bootInit; // === Transpiled from deps (component dependency analysis) === @@ -3709,18 +3968,21 @@ callExpr.push(dictGet(kwargs, k)); } } scanRefsWalk(node, refs); return refs; })(); }; +PRIMITIVES["scan-refs"] = scanRefs; // scan-refs-walk var scanRefsWalk = function(node, refs) { return (isSxTruthy((typeOf(node) == "symbol")) ? (function() { var name = symbolName(node); return (isSxTruthy(startsWith(name, "~")) ? (isSxTruthy(!isSxTruthy(contains(refs, name))) ? append_b(refs, name) : NIL) : NIL); })() : (isSxTruthy((typeOf(node) == "list")) ? forEach(function(item) { return scanRefsWalk(item, refs); }, node) : (isSxTruthy((typeOf(node) == "dict")) ? forEach(function(key) { return scanRefsWalk(dictGet(node, key), refs); }, keys(node)) : NIL))); }; +PRIMITIVES["scan-refs-walk"] = scanRefsWalk; // transitive-deps-walk var transitiveDepsWalk = function(n, seen, env) { return (isSxTruthy(!isSxTruthy(contains(seen, n))) ? (append_b(seen, n), (function() { var val = envGet(env, n); return (isSxTruthy(sxOr((typeOf(val) == "component"), (typeOf(val) == "island"))) ? forEach(function(ref) { return transitiveDepsWalk(ref, seen, env); }, scanRefs(componentBody(val))) : (isSxTruthy((typeOf(val) == "macro")) ? forEach(function(ref) { return transitiveDepsWalk(ref, seen, env); }, scanRefs(macroBody(val))) : NIL)); })()) : NIL); }; +PRIMITIVES["transitive-deps-walk"] = transitiveDepsWalk; // transitive-deps var transitiveDeps = function(name, env) { return (function() { @@ -3729,18 +3991,21 @@ callExpr.push(dictGet(kwargs, k)); } } transitiveDepsWalk(key, seen, env); return filter(function(x) { return !isSxTruthy((x == key)); }, seen); })(); }; +PRIMITIVES["transitive-deps"] = transitiveDeps; // compute-all-deps var computeAllDeps = function(env) { return forEach(function(name) { return (function() { var val = envGet(env, name); return (isSxTruthy(sxOr((typeOf(val) == "component"), (typeOf(val) == "island"))) ? componentSetDeps(val, transitiveDeps(name, env)) : NIL); })(); }, envComponents(env)); }; +PRIMITIVES["compute-all-deps"] = computeAllDeps; // scan-components-from-source var scanComponentsFromSource = function(source) { return (function() { var matches = regexFindAll("\\(~([a-zA-Z_][a-zA-Z0-9_\\-:/]*)", source); return map(function(m) { return (String("~") + String(m)); }, matches); })(); }; +PRIMITIVES["scan-components-from-source"] = scanComponentsFromSource; // components-needed var componentsNeeded = function(pageSource, env) { return (function() { @@ -3758,9 +4023,11 @@ callExpr.push(dictGet(kwargs, k)); } } })(); } } return allNeeded; })(); }; +PRIMITIVES["components-needed"] = componentsNeeded; // page-component-bundle var pageComponentBundle = function(pageSource, env) { return componentsNeeded(pageSource, env); }; +PRIMITIVES["page-component-bundle"] = pageComponentBundle; // page-css-classes var pageCssClasses = function(pageSource, env) { return (function() { @@ -3775,12 +4042,14 @@ callExpr.push(dictGet(kwargs, k)); } } } } } return classes; })(); }; +PRIMITIVES["page-css-classes"] = pageCssClasses; // scan-io-refs-walk var scanIoRefsWalk = function(node, ioNames, refs) { return (isSxTruthy((typeOf(node) == "symbol")) ? (function() { var name = symbolName(node); return (isSxTruthy(contains(ioNames, name)) ? (isSxTruthy(!isSxTruthy(contains(refs, name))) ? append_b(refs, name) : NIL) : NIL); })() : (isSxTruthy((typeOf(node) == "list")) ? forEach(function(item) { return scanIoRefsWalk(item, ioNames, refs); }, node) : (isSxTruthy((typeOf(node) == "dict")) ? forEach(function(key) { return scanIoRefsWalk(dictGet(node, key), ioNames, refs); }, keys(node)) : NIL))); }; +PRIMITIVES["scan-io-refs-walk"] = scanIoRefsWalk; // scan-io-refs var scanIoRefs = function(node, ioNames) { return (function() { @@ -3788,12 +4057,14 @@ callExpr.push(dictGet(kwargs, k)); } } scanIoRefsWalk(node, ioNames, refs); return refs; })(); }; +PRIMITIVES["scan-io-refs"] = scanIoRefs; // transitive-io-refs-walk var transitiveIoRefsWalk = function(n, seen, allRefs, env, ioNames) { return (isSxTruthy(!isSxTruthy(contains(seen, n))) ? (append_b(seen, n), (function() { var val = envGet(env, n); return (isSxTruthy((typeOf(val) == "component")) ? (forEach(function(ref) { return (isSxTruthy(!isSxTruthy(contains(allRefs, ref))) ? append_b(allRefs, ref) : NIL); }, scanIoRefs(componentBody(val), ioNames)), forEach(function(dep) { return transitiveIoRefsWalk(dep, seen, allRefs, env, ioNames); }, scanRefs(componentBody(val)))) : (isSxTruthy((typeOf(val) == "macro")) ? (forEach(function(ref) { return (isSxTruthy(!isSxTruthy(contains(allRefs, ref))) ? append_b(allRefs, ref) : NIL); }, scanIoRefs(macroBody(val), ioNames)), forEach(function(dep) { return transitiveIoRefsWalk(dep, seen, allRefs, env, ioNames); }, scanRefs(macroBody(val)))) : NIL)); })()) : NIL); }; +PRIMITIVES["transitive-io-refs-walk"] = transitiveIoRefsWalk; // transitive-io-refs var transitiveIoRefs = function(name, env, ioNames) { return (function() { @@ -3803,12 +4074,14 @@ callExpr.push(dictGet(kwargs, k)); } } transitiveIoRefsWalk(key, seen, allRefs, env, ioNames); return allRefs; })(); }; +PRIMITIVES["transitive-io-refs"] = transitiveIoRefs; // compute-all-io-refs var computeAllIoRefs = function(env, ioNames) { return forEach(function(name) { return (function() { var val = envGet(env, name); return (isSxTruthy((typeOf(val) == "component")) ? componentSetIoRefs(val, transitiveIoRefs(name, env, ioNames)) : NIL); })(); }, envComponents(env)); }; +PRIMITIVES["compute-all-io-refs"] = computeAllIoRefs; // component-io-refs-cached var componentIoRefsCached = function(name, env, ioNames) { return (function() { @@ -3818,6 +4091,7 @@ callExpr.push(dictGet(kwargs, k)); } } return (isSxTruthy((isSxTruthy((typeOf(val) == "component")) && isSxTruthy(!isSxTruthy(isNil(componentIoRefs(val)))) && !isSxTruthy(isEmpty(componentIoRefs(val))))) ? componentIoRefs(val) : transitiveIoRefs(name, env, ioNames)); })(); })(); }; +PRIMITIVES["component-io-refs-cached"] = componentIoRefsCached; // component-pure? var componentPure_p = function(name, env, ioNames) { return (function() { @@ -3827,6 +4101,7 @@ callExpr.push(dictGet(kwargs, k)); } } return (isSxTruthy((isSxTruthy((typeOf(val) == "component")) && !isSxTruthy(isNil(componentIoRefs(val))))) ? isEmpty(componentIoRefs(val)) : isEmpty(transitiveIoRefs(name, env, ioNames))); })(); })(); }; +PRIMITIVES["component-pure?"] = componentPure_p; // render-target var renderTarget = function(name, env, ioNames) { return (function() { @@ -3839,6 +4114,7 @@ callExpr.push(dictGet(kwargs, k)); } } })()); })(); })(); }; +PRIMITIVES["render-target"] = renderTarget; // page-render-plan var pageRenderPlan = function(pageSource, env, ioNames) { return (function() { @@ -3854,155 +4130,202 @@ callExpr.push(dictGet(kwargs, k)); } } })(); } } return {"components": compTargets, "server": serverList, "client": clientList, "io-deps": ioDeps}; })(); }; +PRIMITIVES["page-render-plan"] = pageRenderPlan; // env-components var envComponents = function(env) { return filter(function(k) { return (function() { var v = envGet(env, k); return sxOr(isComponent(v), isMacro(v)); })(); }, keys(env)); }; +PRIMITIVES["env-components"] = envComponents; // === Transpiled from frames (CEK continuation frames) === // make-cek-state var makeCekState = function(control, env, kont) { return {"control": control, "env": env, "kont": kont, "phase": "eval", "value": NIL}; }; +PRIMITIVES["make-cek-state"] = makeCekState; // make-cek-value var makeCekValue = function(value, env, kont) { return {"control": NIL, "env": env, "kont": kont, "phase": "continue", "value": value}; }; +PRIMITIVES["make-cek-value"] = makeCekValue; // cek-terminal? var cekTerminal_p = function(state) { return (isSxTruthy((get(state, "phase") == "continue")) && isEmpty(get(state, "kont"))); }; +PRIMITIVES["cek-terminal?"] = cekTerminal_p; // cek-control var cekControl = function(s) { return get(s, "control"); }; +PRIMITIVES["cek-control"] = cekControl; // cek-env var cekEnv = function(s) { return get(s, "env"); }; +PRIMITIVES["cek-env"] = cekEnv; // cek-kont var cekKont = function(s) { return get(s, "kont"); }; +PRIMITIVES["cek-kont"] = cekKont; // cek-phase var cekPhase = function(s) { return get(s, "phase"); }; +PRIMITIVES["cek-phase"] = cekPhase; // cek-value var cekValue = function(s) { return get(s, "value"); }; +PRIMITIVES["cek-value"] = cekValue; // make-if-frame var makeIfFrame = function(thenExpr, elseExpr, env) { return {"type": "if", "then": thenExpr, "else": elseExpr, "env": env}; }; +PRIMITIVES["make-if-frame"] = makeIfFrame; // make-when-frame var makeWhenFrame = function(bodyExprs, env) { return {"type": "when", "body": bodyExprs, "env": env}; }; +PRIMITIVES["make-when-frame"] = makeWhenFrame; // make-begin-frame var makeBeginFrame = function(remaining, env) { return {"type": "begin", "remaining": remaining, "env": env}; }; +PRIMITIVES["make-begin-frame"] = makeBeginFrame; // make-let-frame var makeLetFrame = function(name, remaining, body, local) { return {"type": "let", "name": name, "remaining": remaining, "body": body, "env": local}; }; +PRIMITIVES["make-let-frame"] = makeLetFrame; // make-define-frame var makeDefineFrame = function(name, env, hasEffects, effectList) { return {"type": "define", "name": name, "env": env, "has-effects": hasEffects, "effect-list": effectList}; }; +PRIMITIVES["make-define-frame"] = makeDefineFrame; // make-set-frame var makeSetFrame = function(name, env) { return {"type": "set", "name": name, "env": env}; }; +PRIMITIVES["make-set-frame"] = makeSetFrame; // make-arg-frame var makeArgFrame = function(f, evaled, remaining, env, rawArgs) { return {"type": "arg", "f": f, "evaled": evaled, "remaining": remaining, "env": env, "raw-args": rawArgs}; }; +PRIMITIVES["make-arg-frame"] = makeArgFrame; // make-call-frame var makeCallFrame = function(f, args, env) { return {"type": "call", "f": f, "args": args, "env": env}; }; +PRIMITIVES["make-call-frame"] = makeCallFrame; // make-cond-frame var makeCondFrame = function(remaining, env, scheme_p) { return {"type": "cond", "remaining": remaining, "env": env, "scheme": scheme_p}; }; +PRIMITIVES["make-cond-frame"] = makeCondFrame; // make-case-frame var makeCaseFrame = function(matchVal, remaining, env) { return {"type": "case", "match-val": matchVal, "remaining": remaining, "env": env}; }; +PRIMITIVES["make-case-frame"] = makeCaseFrame; // make-thread-frame var makeThreadFrame = function(remaining, env) { return {"type": "thread", "remaining": remaining, "env": env}; }; +PRIMITIVES["make-thread-frame"] = makeThreadFrame; // make-map-frame var makeMapFrame = function(f, remaining, results, env) { return {"type": "map", "f": f, "remaining": remaining, "results": results, "env": env, "indexed": false}; }; +PRIMITIVES["make-map-frame"] = makeMapFrame; // make-map-indexed-frame var makeMapIndexedFrame = function(f, remaining, results, env) { return {"type": "map", "f": f, "remaining": remaining, "results": results, "env": env, "indexed": true}; }; +PRIMITIVES["make-map-indexed-frame"] = makeMapIndexedFrame; // make-filter-frame var makeFilterFrame = function(f, remaining, results, currentItem, env) { return {"type": "filter", "f": f, "remaining": remaining, "results": results, "current-item": currentItem, "env": env}; }; +PRIMITIVES["make-filter-frame"] = makeFilterFrame; // make-reduce-frame var makeReduceFrame = function(f, remaining, env) { return {"type": "reduce", "f": f, "remaining": remaining, "env": env}; }; +PRIMITIVES["make-reduce-frame"] = makeReduceFrame; // make-for-each-frame var makeForEachFrame = function(f, remaining, env) { return {"type": "for-each", "f": f, "remaining": remaining, "env": env}; }; +PRIMITIVES["make-for-each-frame"] = makeForEachFrame; // make-some-frame var makeSomeFrame = function(f, remaining, env) { return {"type": "some", "f": f, "remaining": remaining, "env": env}; }; +PRIMITIVES["make-some-frame"] = makeSomeFrame; // make-every-frame var makeEveryFrame = function(f, remaining, env) { return {"type": "every", "f": f, "remaining": remaining, "env": env}; }; +PRIMITIVES["make-every-frame"] = makeEveryFrame; // make-scope-frame var makeScopeFrame = function(name, remaining, env) { return {"type": "scope", "name": name, "remaining": remaining, "env": env}; }; +PRIMITIVES["make-scope-frame"] = makeScopeFrame; // make-reset-frame var makeResetFrame = function(env) { return {"type": "reset", "env": env}; }; +PRIMITIVES["make-reset-frame"] = makeResetFrame; // make-dict-frame var makeDictFrame = function(remaining, results, env) { return {"type": "dict", "remaining": remaining, "results": results, "env": env}; }; +PRIMITIVES["make-dict-frame"] = makeDictFrame; // make-and-frame var makeAndFrame = function(remaining, env) { return {"type": "and", "remaining": remaining, "env": env}; }; +PRIMITIVES["make-and-frame"] = makeAndFrame; // make-or-frame var makeOrFrame = function(remaining, env) { return {"type": "or", "remaining": remaining, "env": env}; }; +PRIMITIVES["make-or-frame"] = makeOrFrame; // make-dynamic-wind-frame var makeDynamicWindFrame = function(phase, bodyThunk, afterThunk, env) { return {"type": "dynamic-wind", "phase": phase, "body-thunk": bodyThunk, "after-thunk": afterThunk, "env": env}; }; +PRIMITIVES["make-dynamic-wind-frame"] = makeDynamicWindFrame; // make-reactive-reset-frame var makeReactiveResetFrame = function(env, updateFn, firstRender_p) { return {"type": "reactive-reset", "env": env, "update-fn": updateFn, "first-render": firstRender_p}; }; +PRIMITIVES["make-reactive-reset-frame"] = makeReactiveResetFrame; // make-deref-frame var makeDerefFrame = function(env) { return {"type": "deref", "env": env}; }; +PRIMITIVES["make-deref-frame"] = makeDerefFrame; // frame-type var frameType = function(f) { return get(f, "type"); }; +PRIMITIVES["frame-type"] = frameType; // kont-push var kontPush = function(frame, kont) { return cons(frame, kont); }; +PRIMITIVES["kont-push"] = kontPush; // kont-top var kontTop = function(kont) { return first(kont); }; +PRIMITIVES["kont-top"] = kontTop; // kont-pop var kontPop = function(kont) { return rest(kont); }; +PRIMITIVES["kont-pop"] = kontPop; // kont-empty? var kontEmpty_p = function(kont) { return isEmpty(kont); }; +PRIMITIVES["kont-empty?"] = kontEmpty_p; // kont-capture-to-reset var kontCaptureToReset = function(kont) { var scan = function(k, captured) { return (isSxTruthy(isEmpty(k)) ? error("shift without enclosing reset") : (function() { var frame = first(k); return (isSxTruthy(sxOr((frameType(frame) == "reset"), (frameType(frame) == "reactive-reset"))) ? [captured, rest(k)] : scan(rest(k), append(captured, [frame]))); })()); }; +PRIMITIVES["scan"] = scan; return scan(kont, []); }; +PRIMITIVES["kont-capture-to-reset"] = kontCaptureToReset; // has-reactive-reset-frame? var hasReactiveResetFrame_p = function(kont) { return (isSxTruthy(isEmpty(kont)) ? false : (isSxTruthy((frameType(first(kont)) == "reactive-reset")) ? true : hasReactiveResetFrame_p(rest(kont)))); }; +PRIMITIVES["has-reactive-reset-frame?"] = hasReactiveResetFrame_p; // kont-capture-to-reactive-reset var kontCaptureToReactiveReset = function(kont) { var scan = function(k, captured) { return (isSxTruthy(isEmpty(k)) ? error("reactive deref without enclosing reactive-reset") : (function() { var frame = first(k); return (isSxTruthy((frameType(frame) == "reactive-reset")) ? [captured, frame, rest(k)] : scan(rest(k), append(captured, [frame]))); })()); }; +PRIMITIVES["scan"] = scan; return scan(kont, []); }; +PRIMITIVES["kont-capture-to-reactive-reset"] = kontCaptureToReactiveReset; // === Transpiled from page-helpers (pure data transformation helpers) === // special-form-category-map var specialFormCategoryMap = {"if": "Control Flow", "when": "Control Flow", "cond": "Control Flow", "case": "Control Flow", "and": "Control Flow", "or": "Control Flow", "let": "Binding", "let*": "Binding", "letrec": "Binding", "define": "Binding", "set!": "Binding", "lambda": "Functions & Components", "fn": "Functions & Components", "defcomp": "Functions & Components", "defmacro": "Functions & Components", "begin": "Sequencing & Threading", "do": "Sequencing & Threading", "->": "Sequencing & Threading", "quote": "Quoting", "quasiquote": "Quoting", "reset": "Continuations", "shift": "Continuations", "dynamic-wind": "Guards", "map": "Higher-Order Forms", "map-indexed": "Higher-Order Forms", "filter": "Higher-Order Forms", "reduce": "Higher-Order Forms", "some": "Higher-Order Forms", "every?": "Higher-Order Forms", "for-each": "Higher-Order Forms", "defstyle": "Domain Definitions", "defhandler": "Domain Definitions", "defpage": "Domain Definitions", "defquery": "Domain Definitions", "defaction": "Domain Definitions"}; +PRIMITIVES["special-form-category-map"] = specialFormCategoryMap; // extract-define-kwargs var extractDefineKwargs = function(expr) { return (function() { @@ -4018,6 +4341,7 @@ return scan(kont, []); }; } } } return result; })(); }; +PRIMITIVES["extract-define-kwargs"] = extractDefineKwargs; // categorize-special-forms var categorizeSpecialForms = function(parsedExprs) { return (function() { @@ -4035,6 +4359,7 @@ return scan(kont, []); }; } } } return categories; })(); }; +PRIMITIVES["categorize-special-forms"] = categorizeSpecialForms; // build-ref-items-with-href var buildRefItemsWithHref = function(items, basePath, detailKeys, nFields) { return map(function(item) { return (isSxTruthy((nFields == 3)) ? (function() { @@ -4047,18 +4372,23 @@ return scan(kont, []); }; var desc = nth(item, 1); return {"name": name, "desc": desc, "href": (isSxTruthy(some(function(k) { return (k == name); }, detailKeys)) ? (String(basePath) + String(name)) : NIL)}; })()); }, items); }; +PRIMITIVES["build-ref-items-with-href"] = buildRefItemsWithHref; // build-reference-data var buildReferenceData = function(slug, rawData, detailKeys) { return (function() { var _m = slug; if (_m == "attributes") return {"req-attrs": buildRefItemsWithHref(get(rawData, "req-attrs"), "/geography/hypermedia/reference/attributes/", detailKeys, 3), "beh-attrs": buildRefItemsWithHref(get(rawData, "beh-attrs"), "/geography/hypermedia/reference/attributes/", detailKeys, 3), "uniq-attrs": buildRefItemsWithHref(get(rawData, "uniq-attrs"), "/geography/hypermedia/reference/attributes/", detailKeys, 3)}; if (_m == "headers") return {"req-headers": buildRefItemsWithHref(get(rawData, "req-headers"), "/geography/hypermedia/reference/headers/", detailKeys, 3), "resp-headers": buildRefItemsWithHref(get(rawData, "resp-headers"), "/geography/hypermedia/reference/headers/", detailKeys, 3)}; if (_m == "events") return {"events-list": buildRefItemsWithHref(get(rawData, "events-list"), "/geography/hypermedia/reference/events/", detailKeys, 2)}; if (_m == "js-api") return {"js-api-list": map(function(item) { return {"name": nth(item, 0), "desc": nth(item, 1)}; }, get(rawData, "js-api-list"))}; return {"req-attrs": buildRefItemsWithHref(get(rawData, "req-attrs"), "/geography/hypermedia/reference/attributes/", detailKeys, 3), "beh-attrs": buildRefItemsWithHref(get(rawData, "beh-attrs"), "/geography/hypermedia/reference/attributes/", detailKeys, 3), "uniq-attrs": buildRefItemsWithHref(get(rawData, "uniq-attrs"), "/geography/hypermedia/reference/attributes/", detailKeys, 3)}; })(); }; +PRIMITIVES["build-reference-data"] = buildReferenceData; // build-attr-detail var buildAttrDetail = function(slug, detail) { return (isSxTruthy(isNil(detail)) ? {"attr-not-found": true} : {"attr-not-found": NIL, "attr-title": slug, "attr-description": get(detail, "description"), "attr-example": get(detail, "example"), "attr-handler": get(detail, "handler"), "attr-demo": get(detail, "demo"), "attr-wire-id": (isSxTruthy(dictHas(detail, "handler")) ? (String("ref-wire-") + String(replace_(replace_(slug, ":", "-"), "*", "star"))) : NIL)}); }; +PRIMITIVES["build-attr-detail"] = buildAttrDetail; // build-header-detail var buildHeaderDetail = function(slug, detail) { return (isSxTruthy(isNil(detail)) ? {"header-not-found": true} : {"header-not-found": NIL, "header-title": slug, "header-direction": get(detail, "direction"), "header-description": get(detail, "description"), "header-example": get(detail, "example"), "header-demo": get(detail, "demo")}); }; +PRIMITIVES["build-header-detail"] = buildHeaderDetail; // build-event-detail var buildEventDetail = function(slug, detail) { return (isSxTruthy(isNil(detail)) ? {"event-not-found": true} : {"event-not-found": NIL, "event-title": slug, "event-description": get(detail, "description"), "event-example": get(detail, "example"), "event-demo": get(detail, "demo")}); }; +PRIMITIVES["build-event-detail"] = buildEventDetail; // build-component-source var buildComponentSource = function(compData) { return (function() { @@ -4076,6 +4406,7 @@ return scan(kont, []); }; return (String("(") + String(formName) + String(" ") + String(name) + String(" ") + String(paramsSx) + String(affinityStr) + String("\n ") + String(bodySx) + String(")")); })()); })(); }; +PRIMITIVES["build-component-source"] = buildComponentSource; // build-bundle-analysis var buildBundleAnalysis = function(pagesRaw, componentsRaw, totalComponents, totalMacros, pureCount, ioCount) { return (function() { @@ -4097,6 +4428,7 @@ return scan(kont, []); }; })(); } } return {"pages": pagesData, "total-components": totalComponents, "total-macros": totalMacros, "pure-count": pureCount, "io-count": ioCount}; })(); }; +PRIMITIVES["build-bundle-analysis"] = buildBundleAnalysis; // build-routing-analysis var buildRoutingAnalysis = function(pagesRaw) { return (function() { @@ -4113,9 +4445,11 @@ return scan(kont, []); }; })(); } } return {"pages": pagesData, "total-pages": (clientCount + serverCount), "client-count": clientCount, "server-count": serverCount}; })(); }; +PRIMITIVES["build-routing-analysis"] = buildRoutingAnalysis; // build-affinity-analysis var buildAffinityAnalysis = function(demoComponents, pagePlans) { return {"components": demoComponents, "page-plans": pagePlans}; }; +PRIMITIVES["build-affinity-analysis"] = buildAffinityAnalysis; // === Transpiled from router (client-side route matching) === @@ -4128,6 +4462,7 @@ return scan(kont, []); }; return (isSxTruthy(isEmpty(trimmed2)) ? [] : split(trimmed2, "/")); })(); })(); }; +PRIMITIVES["split-path-segments"] = splitPathSegments; // make-route-segment var makeRouteSegment = function(seg) { return (isSxTruthy((isSxTruthy(startsWith(seg, "<")) && endsWith(seg, ">"))) ? (function() { @@ -4144,12 +4479,14 @@ return scan(kont, []); }; d["value"] = seg; return d; })()); }; +PRIMITIVES["make-route-segment"] = makeRouteSegment; // parse-route-pattern var parseRoutePattern = function(pattern) { return (function() { var segments = splitPathSegments(pattern); return map(makeRouteSegment, segments); })(); }; +PRIMITIVES["parse-route-pattern"] = parseRoutePattern; // match-route-segments var matchRouteSegments = function(pathSegs, parsedSegs) { return (isSxTruthy(!isSxTruthy((len(pathSegs) == len(parsedSegs)))) ? NIL : (function() { @@ -4162,6 +4499,7 @@ return scan(kont, []); }; })() : NIL); }, parsedSegs); return (isSxTruthy(matched) ? params : NIL); })()); }; +PRIMITIVES["match-route-segments"] = matchRouteSegments; // match-route var matchRoute = function(path, pattern) { return (function() { @@ -4169,6 +4507,7 @@ return scan(kont, []); }; var parsedSegs = parseRoutePattern(pattern); return matchRouteSegments(pathSegs, parsedSegs); })(); }; +PRIMITIVES["match-route"] = matchRoute; // find-matching-route var findMatchingRoute = function(path, routes) { return (function() { @@ -4189,9 +4528,11 @@ return scan(kont, []); }; return result; })(); })(); }; +PRIMITIVES["find-matching-route"] = findMatchingRoute; // _fn-to-segment var _fnToSegment = function(name) { return (function() { var _m = name; if (_m == "doc") return "docs"; if (_m == "spec") return "specs"; if (_m == "bootstrapper") return "bootstrappers"; if (_m == "test") return "testing"; if (_m == "example") return "examples"; if (_m == "protocol") return "protocols"; if (_m == "essay") return "essays"; if (_m == "plan") return "plans"; if (_m == "reference-detail") return "reference"; return name; })(); }; +PRIMITIVES["_fn-to-segment"] = _fnToSegment; // sx-url-to-path var sxUrlToPath = function(url) { return (isSxTruthy(!isSxTruthy((isSxTruthy(startsWith(url, "/(")) && endsWith(url, ")")))) ? NIL : (function() { @@ -4204,18 +4545,22 @@ return scan(kont, []); }; })(); })(); })()); }; +PRIMITIVES["sx-url-to-path"] = sxUrlToPath; // _count-leading-dots var _countLeadingDots = function(s) { return (isSxTruthy(isEmpty(s)) ? 0 : (isSxTruthy(startsWith(s, ".")) ? (1 + _countLeadingDots(slice(s, 1))) : 0)); }; +PRIMITIVES["_count-leading-dots"] = _countLeadingDots; // _strip-trailing-close var _stripTrailingClose = function(s) { return (isSxTruthy(endsWith(s, ")")) ? _stripTrailingClose(slice(s, 0, (len(s) - 1))) : s); }; +PRIMITIVES["_strip-trailing-close"] = _stripTrailingClose; // _index-of-safe var _indexOfSafe = function(s, needle) { return (function() { var idx = indexOf_(s, needle); return (isSxTruthy(sxOr(isNil(idx), (idx < 0))) ? NIL : idx); })(); }; +PRIMITIVES["_index-of-safe"] = _indexOfSafe; // _last-index-of var _lastIndexOf = function(s, needle) { return (function() { @@ -4225,6 +4570,7 @@ return scan(kont, []); }; return (isSxTruthy(isNil(restIdx)) ? idx : ((idx + 1) + restIdx)); })()); })(); }; +PRIMITIVES["_last-index-of"] = _lastIndexOf; // _pop-sx-url-level var _popSxUrlLevel = function(url) { return (function() { @@ -4235,9 +4581,11 @@ return scan(kont, []); }; return (isSxTruthy(isNil(lastDp)) ? "/" : (String(slice(stripped, 0, lastDp)) + String(slice(url, (len(url) - (closeCount - 1)))))); })()); })(); }; +PRIMITIVES["_pop-sx-url-level"] = _popSxUrlLevel; // _pop-sx-url-levels var _popSxUrlLevels = function(url, n) { return (isSxTruthy((n <= 0)) ? url : _popSxUrlLevels(_popSxUrlLevel(url), (n - 1))); }; +PRIMITIVES["_pop-sx-url-levels"] = _popSxUrlLevels; // _split-pos-kw var _splitPosKw = function(tokens, i, pos, kw) { return (isSxTruthy((i >= len(tokens))) ? {"positional": join(".", pos), "keywords": kw} : (function() { @@ -4247,9 +4595,11 @@ return scan(kont, []); }; return _splitPosKw(tokens, (i + 2), pos, append(kw, [[tok, val]])); })() : _splitPosKw(tokens, (i + 1), append(pos, [tok]), kw)); })()); }; +PRIMITIVES["_split-pos-kw"] = _splitPosKw; // _parse-relative-body var _parseRelativeBody = function(body) { return (isSxTruthy(isEmpty(body)) ? {"positional": "", "keywords": []} : _splitPosKw(split(body, "."), 0, [], [])); }; +PRIMITIVES["_parse-relative-body"] = _parseRelativeBody; // _extract-innermost var _extractInnermost = function(url) { return (function() { @@ -4260,24 +4610,30 @@ return scan(kont, []); }; return (isSxTruthy(isNil(lastDp)) ? {"before": "/(", "content": slice(stripped, 2), "suffix": suffix} : {"before": slice(stripped, 0, (lastDp + 2)), "content": slice(stripped, (lastDp + 2)), "suffix": suffix}); })(); })(); }; +PRIMITIVES["_extract-innermost"] = _extractInnermost; // _find-kw-in-tokens var _findKwInTokens = function(tokens, i, kw) { return (isSxTruthy((i >= len(tokens))) ? NIL : (isSxTruthy((isSxTruthy((nth(tokens, i) == kw)) && ((i + 1) < len(tokens)))) ? nth(tokens, (i + 1)) : _findKwInTokens(tokens, (i + 1), kw))); }; +PRIMITIVES["_find-kw-in-tokens"] = _findKwInTokens; // _find-keyword-value var _findKeywordValue = function(content, kw) { return _findKwInTokens(split(content, "."), 0, kw); }; +PRIMITIVES["_find-keyword-value"] = _findKeywordValue; // _replace-kw-in-tokens var _replaceKwInTokens = function(tokens, i, kw, value) { return (isSxTruthy((i >= len(tokens))) ? [] : (isSxTruthy((isSxTruthy((nth(tokens, i) == kw)) && ((i + 1) < len(tokens)))) ? append([kw, value], _replaceKwInTokens(tokens, (i + 2), kw, value)) : cons(nth(tokens, i), _replaceKwInTokens(tokens, (i + 1), kw, value)))); }; +PRIMITIVES["_replace-kw-in-tokens"] = _replaceKwInTokens; // _set-keyword-in-content var _setKeywordInContent = function(content, kw, value) { return (function() { var current = _findKeywordValue(content, kw); return (isSxTruthy(isNil(current)) ? (String(content) + String(".") + String(kw) + String(".") + String(value)) : join(".", _replaceKwInTokens(split(content, "."), 0, kw, value))); })(); }; +PRIMITIVES["_set-keyword-in-content"] = _setKeywordInContent; // _is-delta-value? var _isDeltaValue_p = function(s) { return (isSxTruthy(!isSxTruthy(isEmpty(s))) && isSxTruthy((len(s) > 1)) && sxOr(startsWith(s, "+"), startsWith(s, "-"))); }; +PRIMITIVES["_is-delta-value?"] = _isDeltaValue_p; // _apply-delta var _applyDelta = function(currentStr, deltaStr) { return (function() { @@ -4285,6 +4641,7 @@ return scan(kont, []); }; var delta = parseInt_(deltaStr, NIL); return (isSxTruthy(sxOr(isNil(cur), isNil(delta))) ? deltaStr : (String((cur + delta)))); })(); }; +PRIMITIVES["_apply-delta"] = _applyDelta; // _apply-kw-pairs var _applyKwPairs = function(content, kwPairs) { return (isSxTruthy(isEmpty(kwPairs)) ? content : (function() { @@ -4299,6 +4656,7 @@ return scan(kont, []); }; return _applyKwPairs(_setKeywordInContent(content, kw, actualVal), rest(kwPairs)); })(); })()); }; +PRIMITIVES["_apply-kw-pairs"] = _applyKwPairs; // _apply-keywords-to-url var _applyKeywordsToUrl = function(url, kwPairs) { return (isSxTruthy(isEmpty(kwPairs)) ? url : (function() { @@ -4308,9 +4666,11 @@ return scan(kont, []); }; return (String(get(parts, "before")) + String(newContent) + String(get(parts, "suffix"))); })(); })()); }; +PRIMITIVES["_apply-keywords-to-url"] = _applyKeywordsToUrl; // _normalize-relative var _normalizeRelative = function(url) { return (isSxTruthy(startsWith(url, "(")) ? url : (String("(") + String(url) + String(")"))); }; +PRIMITIVES["_normalize-relative"] = _normalizeRelative; // resolve-relative-url var resolveRelativeUrl = function(current, relative) { return (function() { @@ -4343,15 +4703,19 @@ return scan(kont, []); }; })(); })(); })(); }; +PRIMITIVES["resolve-relative-url"] = resolveRelativeUrl; // relative-sx-url? var relativeSxUrl_p = function(url) { return sxOr((isSxTruthy(startsWith(url, "(")) && !isSxTruthy(startsWith(url, "/("))), startsWith(url, ".")); }; +PRIMITIVES["relative-sx-url?"] = relativeSxUrl_p; // _url-special-forms var _urlSpecialForms = function() { return ["!source", "!inspect", "!diff", "!search", "!raw", "!json"]; }; +PRIMITIVES["_url-special-forms"] = _urlSpecialForms; // url-special-form? var urlSpecialForm_p = function(name) { return (isSxTruthy(startsWith(name, "!")) && contains(_urlSpecialForms(), name)); }; +PRIMITIVES["url-special-form?"] = urlSpecialForm_p; // parse-sx-url var parseSxUrl = function(url) { return (isSxTruthy((url == "/")) ? {"type": "home", "raw": url} : (isSxTruthy(relativeSxUrl_p(url)) ? {"type": "relative", "raw": url} : (isSxTruthy((isSxTruthy(startsWith(url, "/(!")) && endsWith(url, ")"))) ? (function() { @@ -4375,18 +4739,21 @@ return scan(kont, []); }; var name = slice(url, 2, (len(url) - 1)); return {"type": "direct-component", "name": name, "raw": url}; })() : (isSxTruthy((isSxTruthy(startsWith(url, "/(")) && endsWith(url, ")"))) ? {"type": "absolute", "raw": url} : {"type": "path", "raw": url}))))); }; +PRIMITIVES["parse-sx-url"] = parseSxUrl; // url-special-form-name var urlSpecialFormName = function(url) { return (function() { var parsed = parseSxUrl(url); return (isSxTruthy((get(parsed, "type") == "special-form")) ? get(parsed, "form") : NIL); })(); }; +PRIMITIVES["url-special-form-name"] = urlSpecialFormName; // url-special-form-inner var urlSpecialFormInner = function(url) { return (function() { var parsed = parseSxUrl(url); return (isSxTruthy((get(parsed, "type") == "special-form")) ? get(parsed, "inner") : NIL); })(); }; +PRIMITIVES["url-special-form-inner"] = urlSpecialFormInner; // url-to-expr var urlToExpr = function(urlPath) { return (isSxTruthy(sxOr((urlPath == "/"), isEmpty(urlPath))) ? [] : (function() { @@ -4399,27 +4766,32 @@ return scan(kont, []); }; })(); })(); })()); }; +PRIMITIVES["url-to-expr"] = urlToExpr; // auto-quote-unknowns var autoQuoteUnknowns = function(expr, env) { return (isSxTruthy(!isSxTruthy(isList(expr))) ? expr : (isSxTruthy(isEmpty(expr)) ? expr : cons(first(expr), map(function(child) { return (isSxTruthy(isList(child)) ? autoQuoteUnknowns(child, env) : (isSxTruthy((typeOf(child) == "symbol")) ? (function() { var name = symbolName(child); return (isSxTruthy(sxOr(envHas(env, name), startsWith(name, ":"), startsWith(name, "~"), startsWith(name, "!"))) ? child : name); })() : child)); }, rest(expr))))); }; +PRIMITIVES["auto-quote-unknowns"] = autoQuoteUnknowns; // prepare-url-expr var prepareUrlExpr = function(urlPath, env) { return (function() { var expr = urlToExpr(urlPath); return (isSxTruthy(isEmpty(expr)) ? expr : autoQuoteUnknowns(expr, env)); })(); }; +PRIMITIVES["prepare-url-expr"] = prepareUrlExpr; // === Transpiled from cek (explicit CEK machine evaluator) === // cek-run var cekRun = function(state) { return (isSxTruthy(cekTerminal_p(state)) ? cekValue(state) : cekRun(cekStep(state))); }; +PRIMITIVES["cek-run"] = cekRun; // cek-step var cekStep = function(state) { return (isSxTruthy((cekPhase(state) == "eval")) ? stepEval(state) : stepContinue(state)); }; +PRIMITIVES["cek-step"] = cekStep; // step-eval var stepEval = function(state) { return (function() { @@ -4442,6 +4814,7 @@ return scan(kont, []); }; })()); })(); if (_m == "list") return (isSxTruthy(isEmpty(expr)) ? makeCekValue([], env, kont) : stepEvalList(expr, env, kont)); return makeCekValue(expr, env, kont); })(); })(); }; +PRIMITIVES["step-eval"] = stepEval; // step-eval-list var stepEvalList = function(expr, env, kont) { return (function() { @@ -4455,15 +4828,19 @@ return scan(kont, []); }; })() : (isSxTruthy((isSxTruthy(renderActiveP()) && isRenderExpr(expr))) ? makeCekValue(renderExpr(expr, env), env, kont) : stepEvalCall(head, args, env, kont)))))))))))))))))))))))))))))))))))))))))))); })() : stepEvalCall(head, args, env, kont))); })(); }; +PRIMITIVES["step-eval-list"] = stepEvalList; // step-sf-if var stepSfIf = function(args, env, kont) { return makeCekState(first(args), env, kontPush(makeIfFrame(nth(args, 1), (isSxTruthy((len(args) > 2)) ? nth(args, 2) : NIL), env), kont)); }; +PRIMITIVES["step-sf-if"] = stepSfIf; // step-sf-when var stepSfWhen = function(args, env, kont) { return makeCekState(first(args), env, kontPush(makeWhenFrame(rest(args), env), kont)); }; +PRIMITIVES["step-sf-when"] = stepSfWhen; // step-sf-begin var stepSfBegin = function(args, env, kont) { return (isSxTruthy(isEmpty(args)) ? makeCekValue(NIL, env, kont) : (isSxTruthy((len(args) == 1)) ? makeCekState(first(args), env, kont) : makeCekState(first(args), env, kontPush(makeBeginFrame(rest(args), env), kont)))); }; +PRIMITIVES["step-sf-begin"] = stepSfBegin; // step-sf-let var stepSfLet = function(args, env, kont) { return (isSxTruthy((typeOf(first(args)) == "symbol")) ? makeCekValue(sfNamedLet(args, env), env, kont) : (function() { @@ -4483,6 +4860,7 @@ return scan(kont, []); }; })(); })()); })()); }; +PRIMITIVES["step-sf-let"] = stepSfLet; // step-sf-define var stepSfDefine = function(args, env, kont) { return (function() { @@ -4492,15 +4870,19 @@ return scan(kont, []); }; var effectList = (isSxTruthy((isSxTruthy((len(args) >= 4)) && isSxTruthy((typeOf(nth(args, 1)) == "keyword")) && (keywordName(nth(args, 1)) == "effects"))) ? nth(args, 2) : NIL); return makeCekState(nth(args, valIdx), env, kontPush(makeDefineFrame(symbolName(nameSym), env, hasEffects, effectList), kont)); })(); }; +PRIMITIVES["step-sf-define"] = stepSfDefine; // step-sf-set! var stepSfSet = function(args, env, kont) { return makeCekState(nth(args, 1), env, kontPush(makeSetFrame(symbolName(first(args)), env), kont)); }; +PRIMITIVES["step-sf-set!"] = stepSfSet; // step-sf-and var stepSfAnd = function(args, env, kont) { return (isSxTruthy(isEmpty(args)) ? makeCekValue(true, env, kont) : makeCekState(first(args), env, kontPush(makeAndFrame(rest(args), env), kont))); }; +PRIMITIVES["step-sf-and"] = stepSfAnd; // step-sf-or var stepSfOr = function(args, env, kont) { return (isSxTruthy(isEmpty(args)) ? makeCekValue(false, env, kont) : makeCekState(first(args), env, kontPush(makeOrFrame(rest(args), env), kont))); }; +PRIMITIVES["step-sf-or"] = stepSfOr; // step-sf-cond var stepSfCond = function(args, env, kont) { return (function() { @@ -4514,24 +4896,31 @@ return scan(kont, []); }; return (isSxTruthy(sxOr((isSxTruthy((typeOf(test) == "keyword")) && (keywordName(test) == "else")), (isSxTruthy((typeOf(test) == "symbol")) && sxOr((symbolName(test) == "else"), (symbolName(test) == ":else"))))) ? makeCekState(nth(args, 1), env, kont) : makeCekState(test, env, kontPush(makeCondFrame(args, env, false), kont))); })())); })(); }; +PRIMITIVES["step-sf-cond"] = stepSfCond; // step-sf-case var stepSfCase = function(args, env, kont) { return makeCekState(first(args), env, kontPush(makeCaseFrame(NIL, rest(args), env), kont)); }; +PRIMITIVES["step-sf-case"] = stepSfCase; // step-sf-thread-first var stepSfThreadFirst = function(args, env, kont) { return makeCekState(first(args), env, kontPush(makeThreadFrame(rest(args), env), kont)); }; +PRIMITIVES["step-sf-thread-first"] = stepSfThreadFirst; // step-sf-lambda var stepSfLambda = function(args, env, kont) { return makeCekValue(sfLambda(args, env), env, kont); }; +PRIMITIVES["step-sf-lambda"] = stepSfLambda; // step-sf-scope var stepSfScope = function(args, env, kont) { return makeCekValue(sfScope(args, env), env, kont); }; +PRIMITIVES["step-sf-scope"] = stepSfScope; // step-sf-provide var stepSfProvide = function(args, env, kont) { return makeCekValue(sfProvide(args, env), env, kont); }; +PRIMITIVES["step-sf-provide"] = stepSfProvide; // step-sf-reset var stepSfReset = function(args, env, kont) { return makeCekState(first(args), env, kontPush(makeResetFrame(env), kont)); }; +PRIMITIVES["step-sf-reset"] = stepSfReset; // step-sf-shift var stepSfShift = function(args, env, kont) { return (function() { @@ -4549,15 +4938,18 @@ return scan(kont, []); }; })(); })(); })(); }; +PRIMITIVES["step-sf-shift"] = stepSfShift; // step-sf-deref var stepSfDeref = function(args, env, kont) { return makeCekState(first(args), env, kontPush(makeDerefFrame(env), kont)); }; +PRIMITIVES["step-sf-deref"] = stepSfDeref; // cek-call var cekCall = function(f, args) { return (function() { var a = (isSxTruthy(isNil(args)) ? [] : args); return (isSxTruthy(isNil(f)) ? NIL : (isSxTruthy(isLambda(f)) ? cekRun(continueWithCall(f, a, {}, a, [])) : (isSxTruthy(isCallable(f)) ? apply(f, a) : NIL))); })(); }; +PRIMITIVES["cek-call"] = cekCall; // reactive-shift-deref var reactiveShiftDeref = function(sig, env, kont) { return (function() { @@ -4586,9 +4978,11 @@ return forEach(function(d) { return cekCall(d, NIL); }, subDisposers); }); })(); })(); })(); }; +PRIMITIVES["reactive-shift-deref"] = reactiveShiftDeref; // step-eval-call var stepEvalCall = function(head, args, env, kont) { return makeCekState(head, env, kontPush(makeArgFrame(NIL, [], args, env, args), kont)); }; +PRIMITIVES["step-eval-call"] = stepEvalCall; // step-ho-map var stepHoMap = function(args, env, kont) { return (function() { @@ -4596,6 +4990,7 @@ return forEach(function(d) { return cekCall(d, NIL); }, subDisposers); }); var coll = trampoline(evalExpr(nth(args, 1), env)); return (isSxTruthy(isEmpty(coll)) ? makeCekValue([], env, kont) : continueWithCall(f, [first(coll)], env, [], kontPush(makeMapFrame(f, rest(coll), [], env), kont))); })(); }; +PRIMITIVES["step-ho-map"] = stepHoMap; // step-ho-map-indexed var stepHoMapIndexed = function(args, env, kont) { return (function() { @@ -4603,6 +4998,7 @@ return forEach(function(d) { return cekCall(d, NIL); }, subDisposers); }); var coll = trampoline(evalExpr(nth(args, 1), env)); return (isSxTruthy(isEmpty(coll)) ? makeCekValue([], env, kont) : continueWithCall(f, [0, first(coll)], env, [], kontPush(makeMapIndexedFrame(f, rest(coll), [], env), kont))); })(); }; +PRIMITIVES["step-ho-map-indexed"] = stepHoMapIndexed; // step-ho-filter var stepHoFilter = function(args, env, kont) { return (function() { @@ -4610,6 +5006,7 @@ return forEach(function(d) { return cekCall(d, NIL); }, subDisposers); }); var coll = trampoline(evalExpr(nth(args, 1), env)); return (isSxTruthy(isEmpty(coll)) ? makeCekValue([], env, kont) : continueWithCall(f, [first(coll)], env, [], kontPush(makeFilterFrame(f, rest(coll), [], first(coll), env), kont))); })(); }; +PRIMITIVES["step-ho-filter"] = stepHoFilter; // step-ho-reduce var stepHoReduce = function(args, env, kont) { return (function() { @@ -4618,6 +5015,7 @@ return forEach(function(d) { return cekCall(d, NIL); }, subDisposers); }); var coll = trampoline(evalExpr(nth(args, 2), env)); return (isSxTruthy(isEmpty(coll)) ? makeCekValue(init, env, kont) : continueWithCall(f, [init, first(coll)], env, [], kontPush(makeReduceFrame(f, rest(coll), env), kont))); })(); }; +PRIMITIVES["step-ho-reduce"] = stepHoReduce; // step-ho-some var stepHoSome = function(args, env, kont) { return (function() { @@ -4625,6 +5023,7 @@ return forEach(function(d) { return cekCall(d, NIL); }, subDisposers); }); var coll = trampoline(evalExpr(nth(args, 1), env)); return (isSxTruthy(isEmpty(coll)) ? makeCekValue(false, env, kont) : continueWithCall(f, [first(coll)], env, [], kontPush(makeSomeFrame(f, rest(coll), env), kont))); })(); }; +PRIMITIVES["step-ho-some"] = stepHoSome; // step-ho-every var stepHoEvery = function(args, env, kont) { return (function() { @@ -4632,6 +5031,7 @@ return forEach(function(d) { return cekCall(d, NIL); }, subDisposers); }); var coll = trampoline(evalExpr(nth(args, 1), env)); return (isSxTruthy(isEmpty(coll)) ? makeCekValue(true, env, kont) : continueWithCall(f, [first(coll)], env, [], kontPush(makeEveryFrame(f, rest(coll), env), kont))); })(); }; +PRIMITIVES["step-ho-every"] = stepHoEvery; // step-ho-for-each var stepHoForEach = function(args, env, kont) { return (function() { @@ -4639,6 +5039,7 @@ return forEach(function(d) { return cekCall(d, NIL); }, subDisposers); }); var coll = trampoline(evalExpr(nth(args, 1), env)); return (isSxTruthy(isEmpty(coll)) ? makeCekValue(NIL, env, kont) : continueWithCall(f, [first(coll)], env, [], kontPush(makeForEachFrame(f, rest(coll), env), kont))); })(); }; +PRIMITIVES["step-ho-for-each"] = stepHoForEach; // step-continue var stepContinue = function(state) { return (function() { @@ -4835,6 +5236,7 @@ return forEach(function(d) { return cekCall(d, NIL); }, subDisposers); }); })() : error((String("Unknown frame type: ") + String(ft)))))))))))))))))))))))))); })()); })(); }; +PRIMITIVES["step-continue"] = stepContinue; // continue-with-call var continueWithCall = function(f, args, env, rawArgs, kont) { return (isSxTruthy(continuation_p(f)) ? (function() { @@ -4860,6 +5262,7 @@ return forEach(function(d) { return cekCall(d, NIL); }, subDisposers); }); } return makeCekState(componentBody(f), local, kont); })() : error((String("Not callable: ") + String(inspect(f)))))))); }; +PRIMITIVES["continue-with-call"] = continueWithCall; // sf-case-step-loop var sfCaseStepLoop = function(matchVal, clauses, env, kont) { return (isSxTruthy((len(clauses) < 2)) ? makeCekValue(NIL, env, kont) : (function() { @@ -4870,45 +5273,58 @@ return forEach(function(d) { return cekCall(d, NIL); }, subDisposers); }); return (isSxTruthy((matchVal == testVal)) ? makeCekState(body, env, kont) : sfCaseStepLoop(matchVal, slice(clauses, 2), env, kont)); })()); })()); }; +PRIMITIVES["sf-case-step-loop"] = sfCaseStepLoop; // eval-expr-cek var evalExprCek = function(expr, env) { return cekRun(makeCekState(expr, env, [])); }; +PRIMITIVES["eval-expr-cek"] = evalExprCek; // trampoline-cek var trampolineCek = function(val) { return (isSxTruthy(isThunk(val)) ? evalExprCek(thunkExpr(val), thunkEnv(val)) : val); }; +PRIMITIVES["trampoline-cek"] = trampolineCek; // === Transpiled from signals (reactive signal runtime) === // make-signal var makeSignal = function(value) { return {["__signal"]: true, ["value"]: value, ["subscribers"]: [], ["deps"]: []}; }; +PRIMITIVES["make-signal"] = makeSignal; // signal? var isSignal = function(x) { return (isSxTruthy(isDict(x)) && dictHas(x, "__signal")); }; +PRIMITIVES["signal?"] = isSignal; // signal-value var signalValue = function(s) { return get(s, "value"); }; +PRIMITIVES["signal-value"] = signalValue; // signal-set-value! var signalSetValue = function(s, v) { return dictSet(s, "value", v); }; +PRIMITIVES["signal-set-value!"] = signalSetValue; // signal-subscribers var signalSubscribers = function(s) { return get(s, "subscribers"); }; +PRIMITIVES["signal-subscribers"] = signalSubscribers; // signal-add-sub! var signalAddSub = function(s, f) { return (isSxTruthy(!isSxTruthy(contains(get(s, "subscribers"), f))) ? append_b(get(s, "subscribers"), f) : NIL); }; +PRIMITIVES["signal-add-sub!"] = signalAddSub; // signal-remove-sub! var signalRemoveSub = function(s, f) { return dictSet(s, "subscribers", filter(function(sub) { return !isSxTruthy(isIdentical(sub, f)); }, get(s, "subscribers"))); }; +PRIMITIVES["signal-remove-sub!"] = signalRemoveSub; // signal-deps var signalDeps = function(s) { return get(s, "deps"); }; +PRIMITIVES["signal-deps"] = signalDeps; // signal-set-deps! var signalSetDeps = function(s, deps) { return dictSet(s, "deps", deps); }; +PRIMITIVES["signal-set-deps!"] = signalSetDeps; // signal var signal = function(initialValue) { return makeSignal(initialValue); }; +PRIMITIVES["signal"] = signal; // deref var deref = function(s) { return (isSxTruthy(!isSxTruthy(isSignal(s))) ? s : (function() { @@ -4922,12 +5338,14 @@ return forEach(function(d) { return cekCall(d, NIL); }, subDisposers); }); } return signalValue(s); })()); }; +PRIMITIVES["deref"] = deref; // reset! var reset_b = function(s, value) { return (isSxTruthy(isSignal(s)) ? (function() { var old = signalValue(s); return (isSxTruthy(!isSxTruthy(isIdentical(old, value))) ? (signalSetValue(s, value), notifySubscribers(s)) : NIL); })() : NIL); }; +PRIMITIVES["reset!"] = reset_b; // swap! var swap_b = function(s, f) { var args = Array.prototype.slice.call(arguments, 2); return (isSxTruthy(isSignal(s)) ? (function() { @@ -4935,6 +5353,7 @@ return forEach(function(d) { return cekCall(d, NIL); }, subDisposers); }); var newVal = apply(f, cons(old, args)); return (isSxTruthy(!isSxTruthy(isIdentical(old, newVal))) ? (signalSetValue(s, newVal), notifySubscribers(s)) : NIL); })() : NIL); }; +PRIMITIVES["swap!"] = swap_b; // computed var computed = function(computeFn) { return (function() { @@ -4963,6 +5382,7 @@ return (function() { return s; })(); })(); }; +PRIMITIVES["computed"] = computed; // effect var effect = function(effectFn) { return (function() { @@ -4993,12 +5413,15 @@ return (deps = []); }; })(); })(); })(); }; +PRIMITIVES["effect"] = effect; // *batch-depth* var _batchDepth = 0; +PRIMITIVES["*batch-depth*"] = _batchDepth; // *batch-queue* var _batchQueue = []; +PRIMITIVES["*batch-queue*"] = _batchQueue; // batch var batch = function(thunk) { _batchDepth = (_batchDepth + 1); @@ -5017,15 +5440,19 @@ return (isSxTruthy((_batchDepth == 0)) ? (function() { return forEach(function(sub) { return sub(); }, pending); })(); })() : NIL); }; +PRIMITIVES["batch"] = batch; // notify-subscribers var notifySubscribers = function(s) { return (isSxTruthy((_batchDepth > 0)) ? (isSxTruthy(!isSxTruthy(contains(_batchQueue, s))) ? append_b(_batchQueue, s) : NIL) : flushSubscribers(s)); }; +PRIMITIVES["notify-subscribers"] = notifySubscribers; // flush-subscribers var flushSubscribers = function(s) { return forEach(function(sub) { return sub(); }, signalSubscribers(s)); }; +PRIMITIVES["flush-subscribers"] = flushSubscribers; // dispose-computed var disposeComputed = function(s) { return (isSxTruthy(isSignal(s)) ? (forEach(function(dep) { return signalRemoveSub(dep, NIL); }, signalDeps(s)), signalSetDeps(s, [])) : NIL); }; +PRIMITIVES["dispose-computed"] = disposeComputed; // with-island-scope var withIslandScope = function(scopeFn, bodyFn) { scopePush("sx-island-scope", scopeFn); @@ -5034,12 +5461,14 @@ return (function() { scopePop("sx-island-scope"); return result; })(); }; +PRIMITIVES["with-island-scope"] = withIslandScope; // register-in-scope var registerInScope = function(disposable) { return (function() { var collector = sxContext("sx-island-scope", NIL); return (isSxTruthy(collector) ? cekCall(collector, [disposable]) : NIL); })(); }; +PRIMITIVES["register-in-scope"] = registerInScope; // with-marsh-scope var withMarshScope = function(marshEl, bodyFn) { return (function() { @@ -5047,15 +5476,18 @@ return (function() { withIslandScope(function(d) { return append_b(disposers, d); }, bodyFn); return domSetData(marshEl, "sx-marsh-disposers", disposers); })(); }; +PRIMITIVES["with-marsh-scope"] = withMarshScope; // dispose-marsh-scope var disposeMarshScope = function(marshEl) { return (function() { var disposers = domGetData(marshEl, "sx-marsh-disposers"); return (isSxTruthy(disposers) ? (forEach(function(d) { return cekCall(d, NIL); }, disposers), domSetData(marshEl, "sx-marsh-disposers", NIL)) : NIL); })(); }; +PRIMITIVES["dispose-marsh-scope"] = disposeMarshScope; // *store-registry* var _storeRegistry = {}; +PRIMITIVES["*store-registry*"] = _storeRegistry; // def-store var defStore = function(name, initFn) { return (function() { @@ -5065,18 +5497,23 @@ return (function() { } return get(_storeRegistry, name); })(); }; +PRIMITIVES["def-store"] = defStore; // use-store var useStore = function(name) { return (isSxTruthy(dictHas(_storeRegistry, name)) ? get(_storeRegistry, name) : error((String("Store not found: ") + String(name) + String(". Call (def-store ...) before (use-store ...).")))); }; +PRIMITIVES["use-store"] = useStore; // clear-stores var clearStores = function() { return (_storeRegistry = {}); }; +PRIMITIVES["clear-stores"] = clearStores; // emit-event var emitEvent = function(el, eventName, detail) { return domDispatch(el, eventName, detail); }; +PRIMITIVES["emit-event"] = emitEvent; // on-event var onEvent = function(el, eventName, handler) { return domListen(el, eventName, handler); }; +PRIMITIVES["on-event"] = onEvent; // bridge-event var bridgeEvent = function(el, eventName, targetSignal, transformFn) { return effect(function() { return (function() { @@ -5087,6 +5524,7 @@ return (function() { })(); }); return remove; })(); }); }; +PRIMITIVES["bridge-event"] = bridgeEvent; // resource var resource = function(fetchFn) { return (function() { @@ -5094,6 +5532,7 @@ return (function() { promiseThen(cekCall(fetchFn, NIL), function(data) { return reset_b(state, {["loading"]: false, ["data"]: data, ["error"]: NIL}); }, function(err) { return reset_b(state, {["loading"]: false, ["data"]: NIL, ["error"]: err}); }); return state; })(); }; +PRIMITIVES["resource"] = resource; // ========================================================================= @@ -5174,6 +5613,7 @@ return (function() { if (typeof domTextContent === "function") PRIMITIVES["dom-text-content"] = domTextContent; if (typeof domCreateElement === "function") PRIMITIVES["dom-create-element"] = domCreateElement; if (typeof domAppend === "function") PRIMITIVES["dom-append"] = domAppend; + if (typeof domAppendToHead === "function") PRIMITIVES["dom-append-to-head"] = domAppendToHead; if (typeof jsonParse === "function") PRIMITIVES["json-parse"] = jsonParse; if (typeof nowMs === "function") PRIMITIVES["now-ms"] = nowMs; PRIMITIVES["sx-parse"] = sxParse; @@ -5227,8 +5667,8 @@ return (function() { return cekValue(state); }; - // Expose spec functions so evaluated SX code can use them. - // Type inspection (platform interface from boundary.sx) + // Platform functions — defined in platform_js.py, not in .sx spec files. + // Spec defines self-register via js-emit-define; these are the platform interface. PRIMITIVES["type-of"] = typeOf; PRIMITIVES["symbol-name"] = symbolName; PRIMITIVES["keyword-name"] = keywordName; @@ -5238,22 +5678,7 @@ return (function() { PRIMITIVES["component?"] = isComponent; PRIMITIVES["island?"] = isIsland; PRIMITIVES["make-symbol"] = function(n) { return new Symbol(n); }; - - // Parser (from parser.sx) - PRIMITIVES["sx-serialize"] = sxSerialize; - - // CEK machine (from cek.sx/frames.sx) - PRIMITIVES["make-cek-state"] = makeCekState; - PRIMITIVES["cek-step"] = cekStep; - PRIMITIVES["cek-run"] = cekRun; - PRIMITIVES["cek-terminal?"] = cekTerminal_p; - PRIMITIVES["cek-value"] = cekValue; - PRIMITIVES["eval-expr-cek"] = evalExprCek; - - // Render (from adapter-html.sx / render.sx) PRIMITIVES["is-html-tag?"] = function(n) { return HTML_TAGS.indexOf(n) >= 0; }; - - // Environment (for creating eval contexts) PRIMITIVES["make-env"] = function() { return merge(componentEnv, PRIMITIVES); }; diff --git a/shared/sx/ref/adapter-dom.sx b/shared/sx/ref/adapter-dom.sx index f8dd8e5..7feffd0 100644 --- a/shared/sx/ref/adapter-dom.sx +++ b/shared/sx/ref/adapter-dom.sx @@ -952,7 +952,7 @@ (dom-set-attr el k (str (dict-get attrs k)))) extra-keys) ;; Flush any newly collected CSS rules to live stylesheet - (flush-cssx-to-dom)) + (run-post-render-hooks)) ;; No longer a spread — clear tracked state (do (set! prev-classes (list)) diff --git a/shared/sx/ref/boot.sx b/shared/sx/ref/boot.sx index 19ab753..72d7c00 100644 --- a/shared/sx/ref/boot.sx +++ b/shared/sx/ref/boot.sx @@ -88,7 +88,7 @@ (process-elements el) (sx-hydrate-elements el) (sx-hydrate-islands el) - (flush-cssx-to-dom)))))) + (run-post-render-hooks)))))) ;; -------------------------------------------------------------------------- @@ -120,7 +120,7 @@ (process-elements el) (sx-hydrate-elements el) (sx-hydrate-islands el) - (flush-cssx-to-dom) + (run-post-render-hooks) (dom-dispatch el "sx:resolved" {:id id}))) (log-warn (str "resolveSuspense: no element for id=" id)))))) @@ -418,29 +418,34 @@ ;; -------------------------------------------------------------------------- -;; CSSX live flush — inject collected CSS rules into the DOM +;; Render hooks — generic pre/post callbacks for hydration, swap, mount. +;; The spec calls these at render boundaries; the app decides what to do. +;; Pre-render: setup before DOM changes (e.g. prepare state). +;; Post-render: cleanup after DOM changes (e.g. flush collected CSS). ;; -------------------------------------------------------------------------- -;; -;; ~cssx/tw collects CSS rules via collect!("cssx" ...) during rendering. -;; On the server, ~cssx/flush emits a batch