tiny-dream
Version:
A tiny Incremental DOM implementation for modern browsers.
6 lines • 6.13 kB
JavaScript
/*!
* Tiny Dream v0.5.3
* (c) 2018 Yoshihide Shiono
* Released under the MIT License.
*/
;Object.defineProperty(exports,"__esModule",{value:!0});var _this=void 0;function EmptyObject(){}EmptyObject.prototype=Object.create(null);var createEmptyObject=function(){return new EmptyObject},cachedHasOwnProperty=Object.prototype.hasOwnProperty,hasOwnProperty=function(e,t){return cachedHasOwnProperty.call(e,t)},isDocumentRoot=function(e){return e===document},detectAncestors=function(e,t){for(var n=[],r=e;r!==t;)n.push(r),r=r.parentNode;return n},detectRootNode=function(){for(var e=_this,t=e;e;)t=e,e=e.parentNode;return t},detectActiveNode=function(e){var t=detectRootNode.call(e);return isDocumentRoot(t)?t.activeElement:null},detectFocusedAncestors=function(e,t){var n=detectActiveNode(e);return n&&e.contains(n)?detectAncestors(n,t):[]},moveBefore=function(e,t,n){for(var r=t.nextSibling,o=n;o!==t;){var a=o.nextSibling;e.insertBefore(o,r),o=a}},_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},classCallCheck=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},NodeData=function e(t,n,r){classCallCheck(this,e),this.attributes=[],this.attributesApplied=!1,this.key=n,this.keyMap=createEmptyObject(),this.focused=!1,this.nameOrCtor=t,this.text=null,this.typeId=r},initNodeData=function(e,t,n,r){var o=new NodeData(t,n,r);return e.__TinyDreamDOMData=o,o},isElementNode=function(e){try{return e instanceof HTMLElement}catch(t){return"object"===(void 0===e?"undefined":_typeof(e))&&1===e.nodeType&&"object"===_typeof(e.style)&&"object"===_typeof(e.ownerDocument)}},importNode=function e(t){if(!t.__TinyDreamDOMData){var n=isElementNode(t),r=n?t.localName:t.nodeName,o=n?t.getAttribute("key"):null,a=t.typeId,c=initNodeData(t,r,o,a);if(o&&(getNodeData(t.parentNode).keyMap[o]=t),n)for(var u=t.attributes,i=c.attributes,d=0;d<u.length;d+=1){var l=u[d],s=l.name,p=l.value;i.push(s),i.push(p)}for(var f=t.firstChild;f;f=f.nextSibling)e(f)}},getNodeData=function(e){return importNode(e),e.__TinyDreamDOMData},getNamespaceForTag=function(e,t){return"svg"===e?"http://www.w3.org/2000/svg":"foreignObject"===getNodeData(t).nameOrCtor?null:t.namespaceURI},createElement=function(e,t,n,r,o){var a=void 0;if("function"==typeof n)a=new n;else{var c=getNamespaceForTag(n,t);a=c?e.createElementNS(c,n):e.createElement(n)}return initNodeData(a,n,r,o),a},createTextNode=function(e){var t=e.createTextNode("");return initNodeData(t,"#text",null),t},doc=null,currentNode=null,currentParent=null,markFocused=function(e,t){for(var n=0;n<e.length;n+=1)getNodeData(e[n]).focused=t},matches=function(e,t,n,r){var o=getNodeData(e);return t===o.nameOrCtor&&r===o.typeId&&n==o.key},alignWithDOM=function(e,t,n){if(!currentNode||!matches(currentNode,e,t,n)){var r=getNodeData(currentParent),o=r&&r.keyMap,a=void 0;if(t){var c=o[t];c&&(matches(c,e,t,n)?a=c:getNodeData(c).key=null)}a||(a="#text"===e?createTextNode(doc):createElement(doc,currentParent,e,t,n),t&&(o[t]=a)),getNodeData(a).focused?moveBefore(currentParent,a,currentNode):currentParent.insertBefore(a,currentNode),currentNode=a}},clearUnvisitedDOM=function(e,t,n){for(var r=getNodeData(e).keyMap,o=t;o!==n;){var a=o.nextSibling,c=getNodeData(o).key;e.removeChild(o),c&&delete r[c],o=a}},enterNode=function(){currentParent=currentNode,currentNode=null},getNextNode=function(){return currentNode?currentNode.nextSibling:currentParent.firstChild},nextNode=function(){currentNode=getNextNode()},exitNode=function(){clearUnvisitedDOM(currentParent,getNextNode(),null),currentNode=currentParent,currentParent=currentParent.parentNode},open=function(e,t,n){return nextNode(),alignWithDOM(e,t,n),enterNode(),currentParent},close=function(){return exitNode(),currentNode},text=function(){return nextNode(),alignWithDOM("#text",null),currentNode},component=function(e,t){hasOwnProperty(e,"render")&&e.render.apply(null,[t])},patch=function(e,t,n){var r=doc,o=currentNode,a=currentParent;doc=e&&e.ownerDocument||document,currentParent=e&&e.parentNode;var c=detectFocusedAncestors(e,currentParent);return markFocused(c,!0),currentNode=e,enterNode(),t(n),exitNode(),markFocused(c,!1),doc=r,currentNode=o,currentParent=a,e},getNamespace=function(e){return 0===e.lastIndexOf("xml:",0)?"http://www.w3.org/XML/1998/namespace":0===e.lastIndexOf("xlink:",0)?"http://www.w3.org/1999/xlink":void 0},applyAttr=function(e,t,n){if(null!==n){var r=getNamespace(t);r?e.setAttributeNS(r,t,n):e.setAttribute(t,n)}else e.removeAttribute(t)},applyProp=function(e,t,n){e[t]=n},setStyleValue=function(e,t,n){-1<t.indexOf("-")?e.setProperty(t,n):e[t]=n},applyStyle=function(e,t,n){if("string"!=typeof n)for(var r in n)hasOwnProperty(n,r)&&setStyleValue(e.style,r,n[r]);else e.style.cssText=n},applyAttributeTyped=function(e,t,n){var r=void 0===n?"undefined":_typeof(n);"object"===r||"function"===r?applyProp(e,t,n):applyAttr(e,t,n)},attributes=createEmptyObject();attributes.__TinyDream__=applyAttributeTyped,attributes.style=applyStyle;var updateAttribute=function(e,t,n){(attributes[t]||attributes.__TinyDream__)(e,t,n)},tagOpen=function(e,t,n){var r=open(e,n);if(t){var o=getNodeData(r);if(!o.attributesApplied){for(var a=0;a<t.length;a+=2){var c=t[a],u=t[a+1];updateAttribute(r,c,u)}o.attributesApplied=!0}for(var i=o.attributes,d=!i.length,l=0;l<t.length;l+=2){var s=t[l];d&&(i[l]=s);var p=t[l+1];(d||i[l+1]!==p)&&(i[l+1]=p,updateAttribute(r,s,p))}return r}},tagClose=function(e){return close()},tagVoid=function(e,t,n){return tagOpen(e,t,n),tagClose(e)},text$1=function(e,t){var n=text(),r=getNodeData(n);return r.text!==e&&(r.text=e,n.data=e),n},baseElement=void 0,baseComponent=void 0,TinyDream=function(e,t){baseElement=document.getElementById(e),baseComponent=t},patch$1=function(e){patch(baseElement,baseComponent.render,e)};exports.TinyDream=TinyDream,exports.tagOpen=tagOpen,exports.tagClose=tagClose,exports.tagVoid=tagVoid,exports.text=text$1,exports.component=component,exports.patch=patch$1;