diff --git a/shared/static/scripts/sx-browser.js b/shared/static/scripts/sx-browser.js index b29982b..dab0e5b 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-07T00:52:37Z"; + var SX_VERSION = "2026-03-07T01:03:44Z"; function isNil(x) { return x === NIL || x === null || x === undefined; } function isSxTruthy(x) { return x !== false && !isNil(x); } @@ -2059,9 +2059,10 @@ return domAppendToHead(link); }, domQueryAll(container, "link[rel=\"stylesheet\" var pageName = get(match, "name"); return (isSxTruthy(sxOr(isNil(contentSrc), isEmpty(contentSrc))) ? (logWarn((String("sx:route no content for ") + String(pathname))), false) : (function() { var target = resolveRouteTarget(targetSel); - return (isSxTruthy(isNil(target)) ? (logWarn((String("sx:route target not found: ") + String(targetSel))), false) : (isSxTruthy(get(match, "has-data")) ? (function() { + return (isSxTruthy(isNil(target)) ? (logWarn((String("sx:route target not found: ") + String(targetSel))), false) : (logInfo((String("sx:route has-data=") + String(get(match, "has-data")) + String(" type=") + String(typeOf(get(match, "has-data"))) + String(" page=") + String(pageName))), (isSxTruthy(get(match, "has-data")) ? (function() { var cacheKey = pageDataCacheKey(pageName, params); var cached = pageDataCacheGet(cacheKey); + logInfo((String("sx:route cache-key=") + String(cacheKey) + String(" cached=") + String(!isSxTruthy(isNil(cached))))); return (isSxTruthy(cached) ? (function() { var env = merge(closure, params, cached); var rendered = tryEvalContent(contentSrc, env); @@ -2076,7 +2077,7 @@ return (function() { var env = merge(closure, params); var rendered = tryEvalContent(contentSrc, env); return (isSxTruthy(isNil(rendered)) ? (logInfo((String("sx:route server (eval failed) ") + String(pathname))), false) : (swapRenderedContent(target, rendered, pathname), true)); -})())); +})()))); })()); })()); })(); }; diff --git a/shared/sx/ref/orchestration.sx b/shared/sx/ref/orchestration.sx index 3906556..183e099 100644 --- a/shared/sx/ref/orchestration.sx +++ b/shared/sx/ref/orchestration.sx @@ -636,40 +636,45 @@ (let ((target (resolve-route-target target-sel))) (if (nil? target) (do (log-warn (str "sx:route target not found: " target-sel)) false) - (if (get match "has-data") - ;; Data page: check cache, else resolve asynchronously - (let ((cache-key (page-data-cache-key page-name params)) - (cached (page-data-cache-get cache-key))) - (if cached - ;; Cache hit — render immediately - (let ((env (merge closure params cached)) - (rendered (try-eval-content content-src env))) - (if (nil? rendered) - (do (log-warn (str "sx:route cached eval failed for " pathname)) false) - (do - (log-info (str "sx:route client+cache " pathname)) - (swap-rendered-content target rendered pathname) - true))) - ;; Cache miss — fetch, cache, render - (do - (log-info (str "sx:route client+data " pathname)) - (resolve-page-data page-name params - (fn (data) - (page-data-cache-set cache-key data) - (let ((env (merge closure params data)) - (rendered (try-eval-content content-src env))) - (if (nil? rendered) - (log-warn (str "sx:route data eval failed for " pathname)) - (swap-rendered-content target rendered pathname))))) - true))) - ;; Pure page: render immediately - (let ((env (merge closure params)) - (rendered (try-eval-content content-src env))) - (if (nil? rendered) - (do (log-info (str "sx:route server (eval failed) " pathname)) false) - (do - (swap-rendered-content target rendered pathname) - true)))))))))))) + (do + (log-info (str "sx:route has-data=" (get match "has-data") + " type=" (type-of (get match "has-data")) + " page=" page-name)) + (if (get match "has-data") + ;; Data page: check cache, else resolve asynchronously + (let ((cache-key (page-data-cache-key page-name params)) + (cached (page-data-cache-get cache-key))) + (log-info (str "sx:route cache-key=" cache-key " cached=" (not (nil? cached)))) + (if cached + ;; Cache hit: render immediately + (let ((env (merge closure params cached)) + (rendered (try-eval-content content-src env))) + (if (nil? rendered) + (do (log-warn (str "sx:route cached eval failed for " pathname)) false) + (do + (log-info (str "sx:route client+cache " pathname)) + (swap-rendered-content target rendered pathname) + true))) + ;; Cache miss: fetch, cache, render + (do + (log-info (str "sx:route client+data " pathname)) + (resolve-page-data page-name params + (fn (data) + (page-data-cache-set cache-key data) + (let ((env (merge closure params data)) + (rendered (try-eval-content content-src env))) + (if (nil? rendered) + (log-warn (str "sx:route data eval failed for " pathname)) + (swap-rendered-content target rendered pathname))))) + true))) + ;; Pure page: render immediately + (let ((env (merge closure params)) + (rendered (try-eval-content content-src env))) + (if (nil? rendered) + (do (log-info (str "sx:route server (eval failed) " pathname)) false) + (do + (swap-rendered-content target rendered pathname) + true))))))))))))) (define bind-client-route-link