Fix duplicate sx-cssx-live style tags
Some checks failed
Build and Deploy / build-and-deploy (push) Has been cancelled

Cache the style element reference in _cssx-style-el so flush-cssx-to-dom
never creates more than one. Previous code called dom-query on every
flush, which could miss the element during rapid successive calls,
creating duplicates.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-14 17:16:13 +00:00
parent 41f4772ba7
commit 8b24b6b585
7 changed files with 515 additions and 100 deletions

View File

@@ -20,8 +20,21 @@ _PROJECT = os.path.abspath(os.path.join(_HERE, "..", "..", ".."))
if _PROJECT not in sys.path:
sys.path.insert(0, _PROJECT)
import re
from shared.sx.parser import parse_all
from shared.sx.types import Symbol
def _js_mangle(name: str) -> str:
"""Convert SX name to JS identifier (mirrors js-mangle in js.sx)."""
if name.endswith("?"):
name = name[:-1] + "_p"
elif name.endswith("!"):
name = name[:-1] + "_b"
parts = name.split("-")
result = parts[0] + "".join(p.capitalize() for p in parts[1:])
result = result.replace("*", "_")
return result
from shared.sx.ref.platform_js import (
extract_defines,
ADAPTER_FILES, ADAPTER_DEPS, SPEC_MODULES, SPEC_MODULE_ORDER, EXTENSION_NAMES,
@@ -195,6 +208,7 @@ def compile_ref_to_js(
parts.append(PLATFORM_CEK_JS)
# Translate each spec file using js.sx
all_spec_defines: list[str] = [] # collect all defined names for auto-registration
for filename, label in sx_files:
filepath = os.path.join(ref_dir, filename)
if not os.path.exists(filepath):
@@ -204,6 +218,7 @@ def compile_ref_to_js(
defines = extract_defines(src)
sx_defines = [[name, expr] for name, expr in defines]
all_spec_defines.extend(name for name, _ in defines)
parts.append(f"\n // === Transpiled from {label} ===\n")
env["_defines"] = sx_defines
@@ -222,6 +237,15 @@ def compile_ref_to_js(
if has_cek:
parts.append(CEK_FIXUPS_JS)
# Auto-register all spec defines as PRIMITIVES so evaluated SX code
# (islands, data-init scripts, runtime eval) can call any spec function.
reg_lines = ["\n // === Auto-registered spec defines ==="]
for sx_name in all_spec_defines:
js_name = _js_mangle(sx_name)
reg_lines.append(f' if (typeof {js_name} !== "undefined") PRIMITIVES["{sx_name}"] = {js_name};')
reg_lines.append("")
parts.append("\n".join(reg_lines))
for name in ("dom", "engine", "orchestration", "boot"):
if name in adapter_set and name in adapter_platform:
parts.append(adapter_platform[name])