Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 21s
KERNEL: add a render-page primitive (sx_server.ml, persistent mode) that renders an UNEVALUATED SX expression with the server env via sx_render_to_html. render-to-html expands defcomp components and collects keyword attrs itself; SX handlers can't reach the server env, so the prim supplies it. Fixes the attr mangling — bare render-to-html on an EVALUATED component tree turns (form :id ..) into <form>idpost-new-form..; rendering the unevaluated expr keeps :id an attr. HOST: lib/host/page.sx — host/page (expr -> HTML response) + host/page-route (mount on a GET path). New page suite (8 tests) proves a generic attributed + nested component renders correctly through a host route; verified ~editor/form renders right too. This is the component-render step of the generic interactive-SX-page capability; shell + static assets + hydration (5.2-5.4) next. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
23 lines
1.3 KiB
Plaintext
23 lines
1.3 KiB
Plaintext
;; lib/host/page.sx — serve interactive SX component/island pages on the host
|
||
;; (Phase 5: the generic interactive-SX-page capability).
|
||
;;
|
||
;; The bare `render-to-html` path mangles an EVALUATED component tree's keyword
|
||
;; attributes ((form :id ..) -> "<form>idpost-new-form..."), because evaluating a
|
||
;; defcomp body turns `:id` into a child. The kernel `render-page` primitive
|
||
;; instead renders an UNEVALUATED expression with the server env: render-to-html
|
||
;; expands the components itself and collects keyword args as attributes. SX
|
||
;; handlers can't reach the server env, so render-page supplies it.
|
||
;;
|
||
;; host/page wraps a rendered expression as an HTML response; host/page-route
|
||
;; mounts it on a GET path. This is the component-render step (5.1); the full page
|
||
;; shell (inlined component defs + CSS + client runtime + hydration) and static
|
||
;; asset serving (5.2–5.4) build on top to make the page interactive.
|
||
;; Depends on the kernel `render-page` primitive + lib/dream/types.sx (dream-html).
|
||
|
||
;; Render an unevaluated SX page/component expression to an HTML response.
|
||
(define host/page (fn (expr) (dream-html (render-page expr))))
|
||
|
||
;; Mount a GET route that renders a fixed page expression.
|
||
(define host/page-route
|
||
(fn (path expr) (dream-get path (fn (req) (host/page expr)))))
|