var bel = require('bel') // turns template tag into DOM elements var morphdom = require('@arve.knudsen/morphdom') // efficiently diffs + morphs two DOM elements var defaultEvents = require('./update-events.js') // default events to be copied when dom elements update module.exports = bel // TODO move this + defaultEvents to a new module once we receive more feedback module.exports.update = function (fromNode, toNode, opts) { if (!opts) opts = {} if (opts.events !== false) { if (!opts.onBeforeElUpdated) opts.onBeforeElUpdated = copier } return morphdom(fromNode, toNode, opts) // morphdom only copies attributes. we decided we also wanted to copy events // that can be set via attributes function copier (f, t) { // copy events: var events = opts.events || defaultEvents for (var i = 0; i < events.length; i++) { var ev = events[i] if (t[ev]) { // if new element has a whitelisted attribute f[ev] = t[ev] // update existing element } else if (f[ev]) { // if existing element has it and new one doesnt f[ev] = undefined // remove it from existing element } } // copy values for form elements if (f.nodeName === 'INPUT') { if (f.type !== 'file') { // Keep value if not set on mutating element if (t.getAttribute('value') === null) t.value = f.value } } else if (f.nodeName === 'TEXTAREA') { if (t.getAttribute('value') === null) f.value = t.value } } }