diff --git a/cmd/wasm/components.go b/cmd/wasm/components.go index 39f0685..a982d52 100644 --- a/cmd/wasm/components.go +++ b/cmd/wasm/components.go @@ -8,7 +8,8 @@ import ( var canonicalSlotOrder = []string{"H", "L", "C", "R", "F"} -// isValidCustomElementTag reports whether tag is a safe custom element name. +// cmd/wasm/components.go: isValidCustomElementTag reports whether tag is a safe +// custom element name. // It mirrors the codegen package validation without importing the heavier // template and logging dependencies into the WASM-linked path. func isValidCustomElementTag(tag string) bool { @@ -33,8 +34,9 @@ func isValidCustomElementTag(tag string) bool { return true } -// tagToClassName converts a kebab-case tag into a PascalCase class name. -// Example: nav-bar -> NavBar. +// cmd/wasm/components.go: tagToClassName converts a kebab-case tag into a +// PascalCase class name. +// Example: tagToClassName("nav-bar") returns NavBar. func tagToClassName(tag string) string { var b strings.Builder for part := range strings.SplitSeq(tag, "-") { @@ -47,20 +49,21 @@ func tagToClassName(tag string) string { return b.String() } -// jsStringLiteral returns a quoted JavaScript string literal. +// cmd/wasm/components.go: jsStringLiteral returns a quoted JavaScript string literal. func jsStringLiteral(s string) string { return strconv.Quote(s) } -// customElementClassSource returns a JavaScript class expression that mirrors -// the codegen bundle's closed-shadow custom element behaviour. +// cmd/wasm/components.go: customElementClassSource returns a JavaScript class +// expression that mirrors the codegen bundle's closed-shadow custom element +// behaviour. func customElementClassSource(tag, slot string) string { className := tagToClassName(tag) return "class " + className + " extends HTMLElement {" + - "constructor(){super();this._shadow=this.attachShadow({mode:\"closed\"});}" + - "connectedCallback(){this._shadow.textContent=\"\";const slot=this.getAttribute(\"data-slot\")||" + jsStringLiteral(slot) + ";" + + "constructor(){super();this.#shadow=this.attachShadow({mode:\"closed\"});}" + + "connectedCallback(){this.#shadow.textContent=\"\";const slot=this.getAttribute(\"data-slot\")||" + jsStringLiteral(slot) + ";" + "this.dispatchEvent(new CustomEvent(\"wc-ready\",{detail:{tag:" + jsStringLiteral(tag) + ",slot}}));}" + "render(html){const tpl=document.createElement(\"template\");tpl.insertAdjacentHTML(\"afterbegin\",html);" + - "this._shadow.textContent=\"\";this._shadow.appendChild(tpl.content.cloneNode(true));}" + + "this.#shadow.textContent=\"\";this.#shadow.appendChild(tpl.content.cloneNode(true));}" + "}" } diff --git a/cmd/wasm/register_test.go b/cmd/wasm/register_test.go index 40bcb71..0dfc025 100644 --- a/cmd/wasm/register_test.go +++ b/cmd/wasm/register_test.go @@ -64,6 +64,7 @@ func TestCustomElementClassSource(t *testing.T) { assert.Contains(t, src, `class NavBar extends HTMLElement`) assert.Contains(t, src, `mode:"closed"`) + assert.Contains(t, src, `#shadow`) assert.Contains(t, src, `data-slot`) assert.Contains(t, src, `wc-ready`) assert.Contains(t, src, `nav-bar`)