Fix duplicate sx-cssx-live style tags
Some checks failed
Build and Deploy / build-and-deploy (push) Has been cancelled
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:
@@ -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])
|
||||
|
||||
Reference in New Issue
Block a user