host: Phase 5.1 — interactive SX-page render from a handler, 181/181
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 21s
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>
This commit is contained in:
@@ -216,12 +216,18 @@ that pipeline, don't reinvent or patch per-component.
|
||||
serving path.
|
||||
|
||||
Sub-steps (each independently gated/verified):
|
||||
- [ ] **5.1 Page render from a host handler.** Expose the kernel's
|
||||
component-render + shell so an `http-listen` handler can return a full SX
|
||||
page (correct attributes, not the mangling `render-to-html` path). Likely a
|
||||
small `hosts/` addition: a `render-page`-style entry callable from the
|
||||
handler, or a `host/page` route the server renders via the page pipeline.
|
||||
Gate: `~editor/form` (or any attributed component) renders to correct HTML.
|
||||
- [x] **5.1 Page render from a host handler.** DONE. Kernel: a `render-page`
|
||||
primitive (sx_server.ml, persistent mode) renders an UNEVALUATED SX
|
||||
expression with the server env via `sx_render_to_html` — render-to-html
|
||||
expands defcomp components + collects keyword attrs itself; SX handlers
|
||||
can't reach the server env, so the prim supplies it. Host: `lib/host/page.sx`
|
||||
— `host/page` (expr → HTML response) + `host/page-route` (mount on a GET
|
||||
path). Gate MET: `~editor/form` renders correct HTML (`<form method="post"
|
||||
class=.. id="post-new-form">…`), and the `page` suite (8 tests) proves a
|
||||
generic attributed+nested component renders right (no `:class`-as-text
|
||||
mangling). Root cause confirmed: bare render-to-html on an *evaluated* tree
|
||||
mangles attrs; `render-page` renders the *unevaluated* expr so expansion +
|
||||
attr-collection happen in render-to-html.
|
||||
- [ ] **5.2 Shell statics in the host env.** Run `http_inject_shell_statics` for
|
||||
the host's loaded components so the shell can inline defs/CSS/asset-hashes.
|
||||
Gate: a full page shell emits with component defs inlined.
|
||||
|
||||
Reference in New Issue
Block a user