Three bugs in aser-expand-component (adapter-sx.sx):
- Keyword values were eval'd (eval-expr can't handle <>, HTML tags);
now asered, matching the aser's rendering capabilities
- Missing default nil binding for unset &key params (caused
"Undefined symbol" errors for optional params like header-rows)
- aserCall string-quoted keyword values that were already serialized
SX — now inlines values starting with "(" directly
Server-affinity annotations for layout/nav shells:
- ~shared:layout/app-body, ~shared:layout/oob-sx — page structure
- ~layouts/nav-sibling-row, ~layouts/nav-children — server-side data
- ~layouts/doc already had :affinity :server
- ~cssx/flush marked :affinity :client (browser-only state)
Navigation fix: restore oob_page_sx wrapper for HTMX responses
so #main-panel section exists for sx-select/sx-swap targeting.
OCaml bridge: lazy page helper injection into kernel via IO proxy
(define name (fn (...) (helper "name" ...))) — enables aser_slot
to evaluate highlight/component-source etc. via coroutine bridge.
Playwright tests: added pageerror listener to test_no_console_errors,
new test_navigate_from_home_to_geography for HTMX nav regression.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
38 lines
1.7 KiB
Python
38 lines
1.7 KiB
Python
"""SX docs defpage setup — registers layouts, page helpers, and loads .sx pages."""
|
|
from __future__ import annotations
|
|
|
|
|
|
def setup_sx_pages() -> None:
|
|
"""Register sx-specific layouts, page helpers, and load page definitions."""
|
|
from .layouts import _register_sx_layouts
|
|
from .helpers import _register_sx_helpers
|
|
_register_sx_layouts()
|
|
_register_sx_helpers()
|
|
_load_sx_page_files()
|
|
|
|
|
|
def _load_sx_page_files() -> None:
|
|
"""Load defpage definitions from sx/sxc/pages/*.sx."""
|
|
import os
|
|
from shared.sx.pages import load_page_dir, get_page_helpers
|
|
from shared.sx.jinja_bridge import load_sx_dir, watch_sx_dir, load_service_components
|
|
_sxc_dir = os.path.dirname(os.path.dirname(__file__)) # sx/sxc/
|
|
service_root = os.path.dirname(_sxc_dir) # sx/
|
|
load_service_components(service_root, service_name="sx")
|
|
load_sx_dir(_sxc_dir)
|
|
watch_sx_dir(_sxc_dir)
|
|
# Register page helpers as primitives so the CEK machine can find them
|
|
# during nested async component expansion (e.g. highlight inside ~docs/code
|
|
# inside a plan component inside ~layouts/doc). Without this, the env_merge
|
|
# chain loses page helpers because component closures don't capture them.
|
|
from shared.sx.ref.sx_ref import PRIMITIVES
|
|
helpers = get_page_helpers("sx")
|
|
for name, fn in helpers.items():
|
|
PRIMITIVES[name] = fn
|
|
|
|
# helper is registered as an IO primitive in primitives_io.py,
|
|
# intercepted by async_eval before hitting the CEK machine.
|
|
import logging; logging.getLogger("sx.pages").info("Injected %d page helpers as primitives: %s", len(helpers), list(helpers.keys())[:5])
|
|
|
|
load_page_dir(os.path.dirname(__file__), "sx")
|