{"version":3,"sources":["../src/index.ts","../src/sortedNodes.ts","../src/html.ts"],"sourcesContent":["/// SPDX-License-Identifier: GPL-3.0-or-later\n/// SPDX-FileCopyrightText: Copyright © 2023-2025 Tony Garnock-Jones <tonyg@leastfixedpoint.com>\n\nimport { AnyValue, Turn, Facet, Dataflow, Dataspace, Ref } from \"@syndicate-lang/core\";\nimport { getSortKey, setSortKey, findInsertionPoint } from './sortedNodes';\nimport { HtmlTemplater, template } from \"./html\";\nexport { HtmlTemplater, template, HtmlFragment } from \"./html\";\nexport * as Html from './html';\nexport * as SortedNodes from './sortedNodes';\n\nexport assertion type LocationHash(hash: string);\nexport type LocationHash = ReturnType<typeof LocationHash>;\n\nexport function boot(ds = Dataspace.local) {\n    spawnLocationHashTracker(ds);\n}\n\ntype Wrapped = {\n    wrapped: EventListenerOrEventListenerObject,\n    options?: AddEventListenerOptions | boolean,\n};\n\nexport type NodeGenerator = (t: HtmlTemplater) => ReturnType<HtmlTemplater>;\n\nfunction isStringOrTemplate(x: any): x is string | HTMLTemplateElement {\n    return typeof x === 'string' || (typeof x === 'object' && x instanceof HTMLTemplateElement);\n}\n\nexport type WidgetOptions = {\n    eventSelector?: string | undefined;\n};\n\nexport class Widget implements EventTarget {\n    readonly facet: Facet;\n    readonly widgetOptions: WidgetOptions;\n    private _node: ChildNode | null = null;\n    private _eventNode: ChildNode | null = null;\n    callbacks = new Map<string, Map<EventListenerOrEventListenerObject, Wrapped>>();\n\n    get node(): ChildNode {\n        return this._node!;\n    }\n\n    get eventNode(): ChildNode {\n        return this._eventNode!;\n    }\n\n    constructor (node: ChildNode, options?: WidgetOptions);\n    constructor (nodeGenerator: NodeGenerator, options?: WidgetOptions);\n    constructor (template: string | HTMLTemplateElement, data: object, options?: WidgetOptions);\n    constructor (arg0: ChildNode | NodeGenerator | string | HTMLTemplateElement, arg1?: object | WidgetOptions, arg2?: WidgetOptions) {\n        let nodeGenerator: NodeGenerator;\n\n        let maybeOptions: WidgetOptions | undefined;\n        if (isStringOrTemplate(arg0)) {\n            nodeGenerator = templateGenerator(arg0, arg1 as object);\n            maybeOptions = arg2;\n        } else if (typeof arg0 === 'function') {\n            nodeGenerator = arg0 as NodeGenerator;\n            maybeOptions = arg1;\n        } else {\n            nodeGenerator = () => [arg0];\n            maybeOptions = arg1;\n        }\n        this.widgetOptions = Object.assign({\n            eventSelector: void 0,\n        }, maybeOptions ?? {});\n\n        this.facet = Turn.activeFacet;\n\n        const cancelAtExit = this.facet.actor.atExit(() => this.node.remove());\n        on stop {\n            this.node.remove();\n            cancelAtExit();\n        }\n\n        const thisTemplate = template();\n        dataflow {\n            const nodes = nodeGenerator(thisTemplate);\n            if (nodes.length !== 1) {\n                throw new Error(`@syndicate-lang/html2: Expected exactly one node from template`);\n            }\n            if (this._node === null) {\n                this._node = nodes[0];\n            } else if (this._node !== nodes[0]) {\n                throw new Error(`@syndicate-lang/html2: Node generator is not stable`);\n            }\n            this._eventNode = this.widgetOptions.eventSelector === void 0\n                ? this._node\n                : (this._nodeAsParent?.querySelector(this.widgetOptions.eventSelector) ?? null);\n            if (this._eventNode === null) {\n                throw new Error(`@syndicate-lang/html2: Missing event node`);\n            }\n        }\n    }\n\n    get _nodeAsParent(): ParentNode | null {\n        if (this._node && 'querySelector' in this._node) {\n            return this._node as unknown as ParentNode;\n        } else {\n            return null;\n        }\n    }\n\n    get parent(): ParentNode | null {\n        return this.node.parentNode;\n    }\n\n    set parent(p: string | ParentNode | null) {\n        this.setParent(p);\n    }\n\n    get sortKey(): AnyValue | null {\n        return getSortKey(this.node);\n    }\n\n    set sortKey(k: AnyValue | null) {\n        setSortKey(this.node, k);\n        const p = this.parent;\n        if (p !== null) {\n            this.setParent(null);\n            this.setParent(p);\n        }\n    }\n\n    setSortKey(k: AnyValue | null): this {\n        this.sortKey = k;\n        return this;\n    }\n\n    setParent(p: string | ParentNode | null, wrt: ParentNode = document): this {\n        if (typeof p === 'string') {\n            p = wrt.querySelector(p);\n        }\n\n        if (this.node.parentNode !== p) {\n            if (p === null) {\n                this.node.remove();\n            } else {\n                const k = this.sortKey;\n                if (k !== null) {\n                    const sib = findInsertionPoint(p, k);\n                    p.insertBefore(this.node, sib);\n                } else {\n                    p.appendChild(this.node);\n                }\n            }\n        }\n\n        return this;\n    }\n\n    querySelector(selector: string): Widget | null;\n    querySelector<T extends Widget>(selector: string, ctor: { new(e: Element): T }): T | null;\n    querySelector<T extends Widget>(selector: string, ctor?: { new(e: Element): T }): Widget | null {\n        const e = this._nodeAsParent?.querySelector(selector);\n        return e ? new (ctor ?? Widget)(e) : null;\n    }\n\n    querySelectorAll(selector: string): Widget[];\n    querySelectorAll<T extends Widget>(selector: string, ctor: { new(e: Element): T }): T[];\n    querySelectorAll<T extends Widget>(selector: string, ctor?: { new(e: Element): T }): Widget[] {\n        const es = this._nodeAsParent?.querySelectorAll(selector);\n        const ws: Widget[] = [];\n        if (es) es.forEach(e => ws.push(new (ctor ?? Widget)(e)));\n        return ws;\n    }\n\n    on(type: string, callback: EventListenerOrEventListenerObject): this {\n        this.addEventListener(type, callback);\n        return this;\n    }\n\n    once(type: string, callback: EventListenerOrEventListenerObject): this {\n        this.addEventListener(type, callback, { once: true });\n        return this;\n    }\n\n    off(type: string, callback: EventListenerOrEventListenerObject): this {\n        this.removeEventListener(type, callback);\n        return this;\n    }\n\n    addEventListener(\n        type: string,\n        callback: EventListenerOrEventListenerObject | null,\n        options?: AddEventListenerOptions | boolean,\n    ): void {\n        if (callback === null) return;\n\n        let cbs = this.callbacks.get(type);\n        if (cbs === void 0) {\n            cbs = new Map();\n            this.callbacks.set(type, cbs);\n        } else {\n            if (cbs.has(callback)) return;\n        }\n\n        const entry: Wrapped = {\n            wrapped: (typeof callback === 'function')\n                ? evt => this.facet.turn(() => callback(evt))\n                : evt => this.facet.turn(() => callback.handleEvent(evt)),\n            options,\n        };\n        cbs.set(callback, entry);\n\n        this.eventNode.addEventListener(type, entry.wrapped, options);\n    }\n\n    dispatchEvent(event: Event): boolean {\n        return this.eventNode.dispatchEvent(event);\n    }\n\n    removeEventListener(\n        type: string,\n        callback: EventListenerOrEventListenerObject | null,\n        options?: boolean | EventListenerOptions | undefined,\n    ): void {\n        if (callback === null) return;\n\n        const cbs = this.callbacks.get(type);\n        if (cbs === void 0) return;\n\n        const r = cbs.get(callback);\n        if (r === void 0) return;\n\n        this.eventNode.removeEventListener(type, r.wrapped, options);\n\n        cbs.delete(callback);\n        if (cbs.size === 0) this.callbacks.delete(type);\n    }\n}\n\nexport type ValueWidgetOptions = {\n    triggerEvent?: 'change' | 'input' | undefined,\n} & WidgetOptions;\n\nexport class ValueWidget extends Widget {\n    readonly valueWidgetOptions: ValueWidgetOptions;\n    _value: Dataflow.Field<string>;\n    _valueAsNumber: Dataflow.Field<number>;\n    _checked: Dataflow.Field<boolean>;\n\n    constructor (node: ChildNode, options?: ValueWidgetOptions);\n    constructor (nodeGenerator: NodeGenerator, options?: ValueWidgetOptions);\n    constructor (template: string | HTMLTemplateElement, data: object, options?: ValueWidgetOptions);\n    constructor (arg0: ChildNode | NodeGenerator | string | HTMLTemplateElement, arg1?: object | ValueWidgetOptions, arg2?: ValueWidgetOptions) {\n        super(arg0 as any, arg1 as any, arg2 as any);\n\n        this.valueWidgetOptions = Object.assign({\n            triggerEvent: void 0,\n        } as ValueWidgetOptions, this.widgetOptions);\n\n        field value: string = '';\n        this._value = value;\n\n        field valueAsNumber: number = NaN;\n        this._valueAsNumber = valueAsNumber;\n\n        field checked: boolean = false;\n        this._checked = checked;\n\n        const hasValue = 'value' in this.eventNode;\n        const hasChecked = 'checked' in this.eventNode;\n        if (hasValue || hasChecked) {\n            this.on(this.valueWidgetOptions.triggerEvent ?? 'change', () => this.readValues());\n            this.readValues();\n\n            if (hasValue) {\n                dataflow { this.valueAsNumber = this._valueAsNumber.value; }\n                dataflow { this.value = this._value.value; }\n            }\n            if (hasChecked) {\n                dataflow { this.checked = this._checked.value; }\n            }\n        }\n    }\n\n    readValues() {\n        const n = this.eventNode as any;\n        this.suppressCycleWarning();\n        this._value.value = n.value ?? '';\n        this._valueAsNumber.value = n.valueAsNumber ?? NaN;\n        this._checked.value = n.checked ?? false;\n    }\n\n    get value(): string {\n        return this._value.value;\n    }\n\n    set value(v: string) {\n        (this.eventNode as any).value = v;\n        this._value.value = v;\n    }\n\n    get valueAsNumber(): number {\n        return this._valueAsNumber.value;\n    }\n\n    set valueAsNumber(v: number) {\n        (this.eventNode as any).value = Number.isNaN(v) ? '' : '' + v;\n        this._valueAsNumber.value = v;\n    }\n\n    get checked(): boolean {\n        return this._checked.value;\n    }\n\n    set checked(v: boolean) {\n        (this.eventNode as any).checked = v;\n        this._checked.value = v;\n    }\n\n    suppressCycleWarning(): void {\n        this._value.suppressCycleWarning();\n        this._valueAsNumber.suppressCycleWarning();\n        this._checked.suppressCycleWarning();\n    }\n}\n\nfunction spawnLocationHashTracker(ds: Ref) {\n    spawn named 'LocationHashTracker' {\n        at ds {\n            field hashValue: string = '/';\n\n            const loadHash = () => {\n                var h = decodeURIComponent(window.location.hash);\n                if (h.length && h[0] === '#') {\n                    h = h.slice(1);\n                }\n                hashValue.value = h || '/';\n            };\n            const facet = Turn.activeFacet;\n            const handlerClosure = () => facet.turn(loadHash);\n\n            window.addEventListener('hashchange', handlerClosure);\n            on stop window.removeEventListener('hashchange', handlerClosure);\n\n            loadHash();\n            assert LocationHash(hashValue.value);\n\n            on message LocationHash($newHash: string) => {\n                window.location.hash = newHash;\n            }\n        }\n    }\n}\n\nexport function templateGenerator(\n    template0: string | HTMLTemplateElement,\n    data: object,\n): NodeGenerator {\n    const template = typeof template0 === 'string' ? document.querySelector(template0) : template0;\n    if (template === null) throw new Error('Cannot find template: ' + template0);\n    const body = `return t => t\\`${template.innerHTML.trim().split('`').join('\\\\`')}\\``;\n    const kvs = Object.entries(data);\n    const keys = kvs.map(e => e[0]);\n    const values = kvs.map(e => e[1]);\n    const factory = new Function(... keys, body);\n    return factory(... values);\n}\n","/// SPDX-License-Identifier: GPL-3.0-or-later\n/// SPDX-FileCopyrightText: Copyright © 2016-2025 Tony Garnock-Jones <tonyg@leastfixedpoint.com>\n\nimport { AnyValue, stringify, parse, is, compare } from '@syndicate-lang/core';\n\nexport const SYNDICATE_SORT_KEY = '__syndicate_sort_key';\n\nexport function setSortKey(n: HTMLOrSVGElement | Node, key: AnyValue | null) {\n    if (key === null) {\n        if ('dataset' in n) {\n            // html element nodes etc.\n            delete n.dataset[SYNDICATE_SORT_KEY];\n        } else {\n            // text nodes, svg nodes, etc etc.\n            delete (n as any)[SYNDICATE_SORT_KEY];\n        }\n    } else {\n        const v = stringify(key);\n        if ('dataset' in n) {\n            // html element nodes etc.\n            n.dataset[SYNDICATE_SORT_KEY] = v;\n        } else {\n            // text nodes, svg nodes, etc etc.\n            (n as any)[SYNDICATE_SORT_KEY] = v;\n        }\n    }\n}\n\nexport function getSortKey(n: HTMLOrSVGElement | Node): AnyValue | null {\n    if ('dataset' in n && n.dataset[SYNDICATE_SORT_KEY]) {\n        return parse(n.dataset[SYNDICATE_SORT_KEY]!);\n    }\n    if ((n as any)[SYNDICATE_SORT_KEY]) {\n        return parse((n as any)[SYNDICATE_SORT_KEY]);\n    }\n    return null;\n}\n\nexport function hasSortKey(n: HTMLOrSVGElement | Node, key: AnyValue): boolean {\n    let v = getSortKey(n);\n    return (v !== null) && is(v, key);\n}\n\nfunction firstChildNodeIndex_withSortKey(n: Node): number {\n    for (let i = 0; i < n.childNodes.length; i++) {\n        if (getSortKey(n.childNodes[i]) !== null) return i;\n    }\n    return n.childNodes.length;\n}\n\n// If *no* nodes have a sort key, returns a value that yields an empty\n// range in conjunction with firstChildNodeIndex_withSortKey.\nfunction lastChildNodeIndex_withSortKey(n: Node): number {\n    for (let i = n.childNodes.length - 1; i >= 0; i--) {\n        if (getSortKey(n.childNodes[i]) !== null) return i;\n    }\n    return n.childNodes.length - 1;\n}\n\nfunction isGreaterThan(a: AnyValue, b: AnyValue): boolean {\n    return compare(a, b) > 0;\n}\n\nexport function findInsertionPoint(n: Node, key: AnyValue): ChildNode | null {\n    let lo = firstChildNodeIndex_withSortKey(n);\n    let hi = lastChildNodeIndex_withSortKey(n) + 1;\n    // lo <= hi, and [lo, hi) have sort keys.\n\n    while (lo < hi) { // when lo === hi, there's nothing more to examine.\n        let probe = (lo + hi) >> 1;\n        let probeSortKey = getSortKey(n.childNodes[probe])!;\n\n        if (isGreaterThan(probeSortKey, key)) {\n            hi = probe;\n        } else {\n            lo = probe + 1;\n        }\n    }\n\n    // lo === hi now.\n    if (lo < n.childNodes.length) {\n        return n.childNodes[lo];\n    } else {\n        return null;\n    }\n}\n","/// SPDX-License-Identifier: GPL-3.0-or-later\n/// SPDX-FileCopyrightText: Copyright © 2016-2025 Tony Garnock-Jones <tonyg@leastfixedpoint.com>\n\nimport { randomId } from \"@syndicate-lang/core\";\n\nexport function escape(s: string): string {\n    return s\n        .replace(/&/g, \"&amp;\")\n        .replace(/</g, \"&lt;\")\n        .replace(/>/g, \"&gt;\")\n        .replace(/\"/g, \"&quot;\")\n        .replace(/'/g, \"&#39;\");\n}\n\nexport type HtmlFragment = string | number | Node | Array<HtmlFragment>;\n\nconst tag = randomId(8, true);\nconst onePlaceholderRe = new RegExp(`x-${tag}-(\\\\d+)-${tag}-x`);\nconst allPlaceholdersRe = new RegExp(`(<template id=\"x-${tag}-(\\\\d+)-${tag}-x\"></template>|x-${tag}-(\\\\d+)-${tag}-x)`, 'g');\nfunction placeholder(variableParts: Array<HtmlFragment>, n: number): string {\n    const all_stringy = (f: HtmlFragment): boolean => {\n        if (Array.isArray(f)) return f.every(all_stringy);\n        if (typeof f === 'object') return false;\n        return true;\n    };\n    if (all_stringy(variableParts[n])) {\n        return `x-${tag}-${n}-${tag}-x`;\n    } else {\n        return `<template id=\"x-${tag}-${n}-${tag}-x\"></template>`;\n    }\n}\n\nfunction splitByPlaceholders(s: string): { constantParts: string[], placeholders: number[] } {\n    let match: RegExpExecArray | null = null;\n    let lastConstantStart = 0;\n    const constantParts: string[] = [];\n    const placeholders: number[] = [];\n    while ((match = allPlaceholdersRe.exec(s)) !== null) {\n        constantParts.push(s.substring(lastConstantStart, match.index));\n        placeholders.push(parseInt(match[2] ?? match[3], 10));\n        lastConstantStart = allPlaceholdersRe.lastIndex;\n    }\n    constantParts.push(s.substring(lastConstantStart));\n    return { constantParts, placeholders };\n}\n\nfunction renderFragment(f: HtmlFragment, escapeStrings: boolean): string[] {\n    const result: string[] = [];\n    function walk(f: HtmlFragment) {\n        if (Array.isArray(f)) {\n            f.forEach(walk);\n        } else {\n            switch (typeof f) {\n                case 'string': result.push(escapeStrings ? escape(f) : f); break;\n                case 'number': result.push('' + f); break;\n                default: throw new Error(\"Cannot render Node in attribute context\");\n            }\n        }\n    }\n    walk(f);\n    return result;\n}\n\nfunction followPath(topNode: ParentNode, path: number[]): Node {\n    let n = topNode.childNodes[path[0]];\n    for (let j = 1; j < path.length; j++) n = n.childNodes[path[j]];\n    return n;\n}\n\ninterface VariableLocation {\n    update(variableParts: HtmlFragment[]): void;\n}\n\ninterface VariablePlaceholder {\n    install(placeholderNode: Node): VariableLocation;\n}\n\nclass NodeInserter implements VariablePlaceholder {\n    constructor(public variablePartIndex: number) {}\n\n    install(placeholderNode: Node): VariableLocation {\n        return new NodeInsertionLocation(this.variablePartIndex, placeholderNode);\n    }\n}\n\nclass NodeInsertionLocation implements VariableLocation {\n    insertedNodes: Node[];\n    referenceNode: ChildNode | null;\n    parentNode: ParentNode;\n\n    constructor(public variablePartIndex: number, placeholderNode: Node) {\n        this.insertedNodes = [placeholderNode];\n        this.referenceNode = placeholderNode.nextSibling;\n        this.parentNode = placeholderNode.parentNode!;\n    }\n\n    update(variableParts: HtmlFragment[]): void {\n        this.insertedNodes.forEach(n => {\n            if (n.parentNode === this.parentNode) this.parentNode.removeChild(n);\n        });\n        this.insertedNodes.length = 0;\n\n        const walk = (f: HtmlFragment) => {\n            if (Array.isArray(f)) {\n                f.forEach(walk);\n            } else {\n                switch (typeof f) {\n                    case 'string': this.insertedNodes.push(document.createTextNode(f)); break;\n                    case 'number': this.insertedNodes.push(document.createTextNode('' + f)); break;\n                    case 'object':\n                        if (f !== null && 'nodeType' in f) {\n                            this.insertedNodes.push(f);\n                            break;\n                        }\n                        /* fall through */\n                    default: {\n                        let info;\n                        try {\n                            info = '' + f;\n                        } catch (_e) {\n                            info = (f as any).toString();\n                        }\n                        this.insertedNodes.push(\n                            document.createTextNode(`<ERROR: invalid HtmlFragment: ${info}>`));\n                        break;\n                    }\n                }\n            }\n        }\n        walk(variableParts[this.variablePartIndex]);\n\n        this.insertedNodes.forEach(n => this.parentNode.insertBefore(n, this.referenceNode));\n    }\n}\n\nclass AttributesInserter implements VariablePlaceholder {\n    constructor(public variablePartIndex: number) {}\n\n    install(node: Node): VariableLocation {\n        if (!(node instanceof Element)) throw new Error(\"Cannot attach attributes to non-element\");\n        return new AttributesInsertionLocation(this.variablePartIndex, node);\n    }\n}\n\nclass AttributesInsertionLocation implements VariableLocation {\n    attrNames: string[] = [];\n\n    constructor(public variablePartIndex: number, public node: Element) {}\n\n    update(variableParts: HtmlFragment[]): void {\n        this.attrNames.forEach(n => {\n            this.node.removeAttribute(n);\n            if (n === 'checked' && 'checked' in this.node) this.node.checked = false;\n        });\n        this.attrNames.length = 0;\n\n        const e = document.createElement('template');\n        const v = variableParts[this.variablePartIndex];\n        e.innerHTML = `<x-dummy ${renderFragment(v, false).join('')}></x-dummy>`;\n        Array.from(e.content.firstElementChild!.attributes).forEach(a => {\n            this.attrNames.push(a.name);\n            this.node.setAttribute(a.name, a.value);\n            if (a.name === 'value' && 'value' in this.node) this.node.value = a.value;\n            if (a.name === 'checked' && 'checked' in this.node) this.node.checked = true;\n        });\n    }\n}\n\ntype TemplateAttributeValue = {\n    attrName: string,\n    constantParts: string[],\n    placeholders: number[],\n};\n\nclass AttributeValueInserter implements VariablePlaceholder {\n    constructor(public spec: TemplateAttributeValue) {}\n\n    install(node: Node): VariableLocation {\n        if (!(node instanceof Element)) {\n            throw new Error(`Cannot attach attribute ${this.spec.attrName} to non-element`);\n        }\n        return new AttributeValueInsertionLocation(this.spec, node);\n    }\n}\n\nclass AttributeValueInsertionLocation implements VariableLocation {\n    constructor(public spec: TemplateAttributeValue, public node: Element) {}\n\n    update(variableParts: HtmlFragment[]): void {\n        const pieces = [this.spec.constantParts[0]];\n        this.spec.placeholders.forEach((n, i) => {\n            pieces.push(...renderFragment(variableParts[n], false));\n            pieces.push(this.spec.constantParts[i + 1]);\n        });\n        this.node.setAttribute(this.spec.attrName, pieces.join(''));\n        if (this.spec.attrName === 'value' && 'value' in this.node) this.node.value = pieces.join('');\n    }\n}\n\nclass CompoundPlaceholder implements VariablePlaceholder {\n    constructor(public placeholders: VariablePlaceholder[]) {}\n\n    install(node: Node): VariableLocation {\n        return new CompoundLocation(this.placeholders.map(p => p.install(node)));\n    }\n}\n\nclass CompoundLocation implements VariableLocation {\n    constructor(public locations: VariableLocation[]) {}\n\n    update(variableParts: HtmlFragment[]): void {\n        this.locations.forEach(l => l.update(variableParts));\n    }\n}\n\nexport class HtmlFragmentInstance {\n    nodes: ChildNode[];\n    constructor(\n        public container: ParentNode,\n        public locations: VariableLocation[],\n    ) {\n        this.nodes = Array.from(this.container.childNodes);\n    }\n\n    reset(): Element[] {\n        const placeholders = this.nodes.map(_n => makePlaceholder());\n        placeholders.forEach((p, i) => {\n            const n = this.nodes[i];\n            if (n.parentNode === null) return;\n            if (n.parentNode === this.container) return;\n            n.parentNode.insertBefore(p, n);\n            n.parentNode.removeChild(n);\n        });\n        while (this.container.childNodes.length > 0) { this.container.removeChild(this.container.childNodes[0]); }\n        this.nodes.forEach(n => this.container.appendChild(n));\n        return placeholders;\n    }\n\n    extract(placeholders: Element[]): ChildNode[] {\n        const result = Array.from(this.container.childNodes);\n        placeholders.forEach((p, i) => {\n            const n = this.nodes[i];\n            if (p.parentNode === null) return;\n            p.parentNode.insertBefore(n, p);\n            p.parentNode.removeChild(p);\n        });\n        return result;\n    }\n\n    update(variableParts: HtmlFragment[]): ChildNode[] {\n        const placeholders = this.reset();\n        this.locations.forEach(l => l.update(variableParts));\n        return this.extract(placeholders);\n    }\n}\n\nfunction makePlaceholder(): Element {\n    return document.createElement('x-placeholder');\n}\n\nexport class HtmlFragmentBuilder {\n    template: HTMLTemplateElement = document.createElement('template');\n    placeholderActions: { path: number[], placeholder: VariablePlaceholder }[] = [];\n\n    constructor(constantParts: TemplateStringsArray, variableParts: Array<HtmlFragment>) {\n        // The variableParts are only needed to figure out what kind of placeholder to use: if\n        // ONLY stringy things are found at a given location, placeholder text is used; if any\n        // kind of node is found, a placeholder element is used.\n\n        const pieces: string[] = [];\n        constantParts.raw.forEach((r, i) => {\n            if (i > 0) pieces.push(placeholder(variableParts, i - 1));\n            pieces.push(r);\n        });\n        this.template.innerHTML = pieces.join('');\n        this.indexPlaceholders();\n    }\n\n    private indexTextNode(n: Text, path: number[]): ChildNode | null {\n        const { constantParts, placeholders } =\n            splitByPlaceholders(n.textContent ?? '');\n        constantParts.forEach((c, i) => {\n            if (i > 0) {\n                n.parentNode?.insertBefore(makePlaceholder(), n);\n            }\n            n.parentNode?.insertBefore(document.createTextNode(c), n);\n        });\n        const nextN = n.nextSibling;\n        n.parentNode?.removeChild(n);\n        placeholders.forEach((n, i) => {\n            const currentPath = path.slice();\n            currentPath[currentPath.length - 1] += i * 2 + 1;\n            this.placeholderActions.push({\n                path: currentPath,\n                placeholder: new NodeInserter(n),\n            });\n        });\n        path[path.length - 1] += constantParts.length + placeholders.length;\n        return nextN;\n    }\n\n    private indexElement(e: Element, path: number[]) {\n        const vars: VariablePlaceholder[] = [];\n        for (let i = 0; i < e.attributes.length; i++) {\n            const attr = e.attributes[i];\n            const attrName = attr.name;\n            const nameIsPlaceholder = attrName.match(onePlaceholderRe);\n            if (nameIsPlaceholder !== null) {\n                e.removeAttributeNode(attr);\n                i--;\n                const n = parseInt(nameIsPlaceholder[1], 10);\n                vars.push(new AttributesInserter(n));\n            } else {\n                const { constantParts, placeholders } =\n                    splitByPlaceholders(attr.value);\n                if (constantParts.length !== 1) {\n                    vars.push(new AttributeValueInserter({attrName, constantParts, placeholders}));\n                }\n            }\n        }\n        if (vars.length) {\n            this.placeholderActions.push({\n                path: path.slice(),\n                placeholder: vars.length === 1 ? vars[0] : new CompoundPlaceholder(vars),\n            });\n        }\n    }\n\n    private indexPlaceholders() {\n        const path: number[] = [];\n        const walk = (parentNode: ParentNode) => {\n            path.push(0);\n            let nextN = parentNode.firstChild;\n            while (nextN !== null) {\n                const n = nextN;\n                switch (n.nodeType) {\n                    case Node.TEXT_NODE:\n                        nextN = this.indexTextNode(n as Text, path);\n                        break;\n                    case Node.ELEMENT_NODE: {\n                        const e = n as Element;\n                        nextN = e.nextSibling;\n                        const idMatch = (e.tagName === 'TEMPLATE') ? e.id.match(onePlaceholderRe) : null;\n                        if (idMatch !== null) {\n                            // A specialized variant of indexTextNode.\n                            e.parentNode?.insertBefore(makePlaceholder(), e);\n                            e.parentNode?.removeChild(e);\n                            this.placeholderActions.push({\n                                path: path.slice(),\n                                placeholder: new NodeInserter(parseInt(idMatch[1], 10)),\n                            });\n                        } else {\n                            this.indexElement(e, path)\n                            walk(e);\n                        }\n                        path[path.length - 1]++;\n                        break;\n                    }\n                    default:\n                        nextN = n.nextSibling;\n                        path[path.length - 1]++;\n                        break;\n                }\n            }\n            path.pop();\n        };\n        walk(this.template.content);\n    }\n\n    clone(): HtmlFragmentInstance {\n        const container = this.template.content.cloneNode(true) as ParentNode;\n        const locations = this.placeholderActions.map(({ path, placeholder }) =>\n            placeholder.install(followPath(container, path)));\n        return new HtmlFragmentInstance(container, locations);\n    }\n}\n\n// Nifty trick: TemplateStringsArray instances are interned so it makes sense to key a cache\n// based on their object identity!\nconst templateCache = new WeakMap<TemplateStringsArray, HtmlFragmentBuilder>();\n\nexport type HtmlTemplater =\n    (constantParts: TemplateStringsArray, ... variableParts: Array<HtmlFragment>)\n    => ChildNode[];\n\nexport function template(): HtmlTemplater {\n    const instanceCache = new WeakMap<TemplateStringsArray, HtmlFragmentInstance>();\n    return (constantParts, ... variableParts) => {\n        let b = templateCache.get(constantParts);\n        if (b === void 0) {\n            b = new HtmlFragmentBuilder(constantParts, variableParts);\n            templateCache.set(constantParts, b);\n        }\n        let i = instanceCache.get(constantParts);\n        if (i === void 0) {\n            i = b.clone();\n            instanceCache.set(constantParts, i);\n        }\n        return i.update(variableParts);\n    };\n}\n"],"mappings":"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","names":["import_core","import_core","f","_a","_b","n","placeholder","template"]}