UNPKG

uhtml

Version:
39 lines (37 loc) • 1.3 kB
'use strict'; const { PersistentFragment } = require('./persistent-fragment.js'); const { bc, detail } = require('./literals.js'); const { array, hole } = require('./handler.js'); const { empty, find } = require('./utils.js'); const { cache } = require('./literals.js'); /** @param {(template: TemplateStringsArray, values: any[]) => import("./parser.js").Resolved} parse */ module.exports = parse => ( /** * @param {TemplateStringsArray} template * @param {any[]} values * @returns {import("./literals.js").Cache} */ (template, values) => { const { a: fragment, b: entries, c: direct } = parse(template, values); const root = document.importNode(fragment, true); /** @type {import("./literals.js").Detail[]} */ let details = empty; if (entries !== empty) { details = []; for (let current, prev, i = 0; i < entries.length; i++) { const { a: path, b: update, c: name } = entries[i]; const node = path === prev ? current : (current = find(root, (prev = path))); details[i] = detail( update, node, name, update === array ? [] : (update === hole ? cache() : null) ); } } return bc( direct ? root.firstChild : new PersistentFragment(root), details, ); } );