Try-first routing: attempt eval, fall back on failure

Remove strict deps check — for case expressions like essay pages,
deps includes ALL branches but only one is taken. Instead, just
try to eval the content. If a component is missing, tryEvalContent
catches the error and we transparently fall back to server fetch.
deps field remains in registry for future prefetching use.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-06 22:10:35 +00:00
parent 14c5316d17
commit b98a8f8c41
2 changed files with 12 additions and 39 deletions

View File

@@ -543,42 +543,26 @@
;; Client-side routing
;; --------------------------------------------------------------------------
(define has-all-deps?
(fn (deps)
;; Check if all component deps are loaded in the client env.
;; deps is a list of component name strings (e.g. "~essay-foo").
(let ((loaded (loaded-component-names))
(missing false))
(for-each
(fn (dep)
(when (not (contains? loaded dep))
(set! missing dep)))
deps)
(if missing
(do (log-info (str "sx:route missing component " missing)) false)
true))))
(define try-client-route
(fn (pathname)
;; Try to render a page client-side. Returns true if successful, false otherwise.
;; Only works for pages without :data dependencies and with all deps loaded.
;; Only works for pages without :data dependencies.
;; Uses try-eval-content which catches errors — if a component is missing,
;; eval fails and we fall back to server fetch transparently.
(let ((match (find-matching-route pathname _page-routes)))
(if (nil? match)
(do (log-info (str "sx:route no match (" (len _page-routes) " routes) " pathname)) false)
(if (get match "has-data")
(do (log-info (str "sx:route server (has data) " pathname)) false)
(let ((content-src (get match "content"))
(deps (or (get match "deps") (list)))
(closure (or (get match "closure") {}))
(params (get match "params")))
(if (or (nil? content-src) (empty? content-src))
(do (log-warn (str "sx:route no content for " pathname)) false)
(if (not (has-all-deps? deps))
(do (log-info (str "sx:route server (missing deps) " pathname)) false)
(let ((env (merge closure params))
(rendered (try-eval-content content-src env)))
(if (nil? rendered)
(do (log-warn (str "sx:route eval failed for " pathname)) false)
(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)
(let ((target (dom-query-by-id "main-panel")))
(if (nil? target)
(do (log-warn "sx:route #main-panel not found") false)
@@ -589,7 +573,7 @@
(process-elements target)
(sx-hydrate-elements target)
(log-info (str "sx:route client " pathname))
true)))))))))))))
true))))))))))))
(define bind-client-route-link