UNPKG

marko

Version:

UI Components + streaming, async, high performance, HTML templating for Node.js and the browser.

101 lines (83 loc) 2.58 kB
var hasTextContent = require("./is-text-only"); function VNode() {} VNode.prototype = { ___VNode: function (finalChildCount, ownerComponent) { this.___finalChildCount = finalChildCount; this.___childCount = 0; this.___firstChildInternal = null; this.___lastChild = null; this.___parentNode = null; this.___nextSiblingInternal = null; this.___ownerComponent = ownerComponent; }, get ___firstChild() { var firstChild = this.___firstChildInternal; if (firstChild && firstChild.___DocumentFragment) { var nestedFirstChild = firstChild.___firstChild; // The first child is a DocumentFragment node. // If the DocumentFragment node has a first child then we will return that. // Otherwise, the DocumentFragment node is not *really* the first child and // we need to skip to its next sibling return nestedFirstChild || firstChild.___nextSibling; } return firstChild; }, get ___nextSibling() { var nextSibling = this.___nextSiblingInternal; if (nextSibling) { if (nextSibling.___DocumentFragment) { var firstChild = nextSibling.___firstChild; return firstChild || nextSibling.___nextSibling; } } else { var parentNode = this.___parentNode; if (parentNode && parentNode.___DocumentFragment) { return parentNode.___nextSibling; } } return nextSibling; }, ___appendChild: function (child) { this.___childCount++; if (hasTextContent(this.___nodeName)) { if (child.___Text) { this.___textContent += child.___nodeValue; } else { throw TypeError(); } } else { var lastChild = this.___lastChild; child.___parentNode = this; if (lastChild) { lastChild.___nextSiblingInternal = child; } else { this.___firstChildInternal = child; } this.___lastChild = child; } return child; }, ___finishChild: function finishChild() { if (this.___childCount === this.___finalChildCount && this.___parentNode) { return this.___parentNode.___finishChild(); } else { return this; } }, // ,toJSON: function() { // var clone = Object.assign({ // nodeType: this.nodeType // }, this); // // for (var k in clone) { // if (k.startsWith('_')) { // delete clone[k]; // } // } // delete clone._nextSibling; // delete clone._lastChild; // delete clone.parentNode; // return clone; // } }; module.exports = VNode;