Split make_server_env, eliminate all runtime sx_ref imports, fix auth-menu tests

make_server_env split into 7 focused setup functions:
- setup_browser_stubs (22 DOM no-ops)
- setup_scope_env (18 scope primitives from sx_scope.ml)
- setup_evaluator_bridge (CEK eval-expr, trampoline, expand-macro, etc.)
- setup_introspection (type predicates, component/lambda accessors)
- setup_type_operations (string/env/dict/equality/parser helpers)
- setup_html_tags (~100 HTML tag functions)
- setup_io_env (query, action, helper IO bridge)

Eliminate ALL runtime sx_ref.py imports:
- sx/sxc/pages/helpers.py: 24 imports → _ocaml_helpers.py bridge
- sx/sxc/pages/sx_router.py: remove SX_USE_REF fallback
- shared/sx/query_registry.py: use register_components instead of eval

Unify JIT compilation: pre-compile list derived from allowlist
(no manual duplication), only compiler internals pre-compiled.

Fix test_components auth-menu: ~auth-menu → ~shared:fragments/auth-menu

Tests: 1114 OCaml, 29/29 components, 35/35 regression, 6/6 Playwright

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-24 17:23:09 +00:00
parent 6ef9688bd2
commit 3df8c41ca1
6 changed files with 439 additions and 445 deletions

View File

@@ -78,19 +78,18 @@ def clear(service: str | None = None) -> None:
def load_query_file(filepath: str, service_name: str) -> list[QueryDef]:
"""Parse an .sx file and register any defquery definitions."""
from .parser import parse_all
from .ref.sx_ref import eval_expr as _raw_eval, trampoline as _trampoline
_eval = lambda expr, env: _trampoline(_raw_eval(expr, env))
from .jinja_bridge import get_component_env
with open(filepath, encoding="utf-8") as f:
source = f.read()
env = dict(get_component_env())
exprs = parse_all(source)
queries: list[QueryDef] = []
# Use the jinja_bridge register_components path which handles
# defquery/defaction via the OCaml kernel
from .jinja_bridge import register_components
register_components(source, _defer_postprocess=True)
for expr in exprs:
_eval(expr, env)
env = get_component_env()
queries: list[QueryDef] = []
for val in env.values():
if isinstance(val, QueryDef):
@@ -102,20 +101,15 @@ def load_query_file(filepath: str, service_name: str) -> list[QueryDef]:
def load_action_file(filepath: str, service_name: str) -> list[ActionDef]:
"""Parse an .sx file and register any defaction definitions."""
from .parser import parse_all
from .ref.sx_ref import eval_expr as _raw_eval, trampoline as _trampoline
_eval = lambda expr, env: _trampoline(_raw_eval(expr, env))
from .jinja_bridge import get_component_env
from .jinja_bridge import get_component_env, register_components
with open(filepath, encoding="utf-8") as f:
source = f.read()
env = dict(get_component_env())
exprs = parse_all(source)
actions: list[ActionDef] = []
register_components(source, _defer_postprocess=True)
for expr in exprs:
_eval(expr, env)
env = get_component_env()
actions: list[ActionDef] = []
for val in env.values():
if isinstance(val, ActionDef):

View File

@@ -59,7 +59,7 @@ class TestCartMini:
class TestAuthMenu:
def test_logged_in(self):
html = sx(
'(~auth-menu :user-email user-email :account-url account-url)',
'(~shared:fragments/auth-menu :user-email user-email :account-url account-url)',
**{"user-email": "alice@example.com", "account-url": "https://account.example.com/"},
)
assert 'id="auth-menu-desktop"' in html
@@ -70,7 +70,7 @@ class TestAuthMenu:
def test_logged_out(self):
html = sx(
'(~auth-menu :account-url account-url)',
'(~shared:fragments/auth-menu :account-url account-url)',
**{"account-url": "https://account.example.com/"},
)
assert "fa-solid fa-key" in html
@@ -78,7 +78,7 @@ class TestAuthMenu:
def test_desktop_has_data_close_details(self):
html = sx(
'(~auth-menu :user-email "x@y.com" :account-url "http://a")',
'(~shared:fragments/auth-menu :user-email "x@y.com" :account-url "http://a")',
)
assert "data-close-details" in html
@@ -86,7 +86,7 @@ class TestAuthMenu:
"""Both desktop and mobile spans are always rendered."""
for email in ["user@test.com", None]:
html = sx(
'(~auth-menu :user-email user-email :account-url account-url)',
'(~shared:fragments/auth-menu :user-email user-email :account-url account-url)',
**{"user-email": email, "account-url": "http://a"},
)
assert 'id="auth-menu-desktop"' in html