UNPKG

mostly-dom

Version:
432 lines (431 loc) 12.9 kB
<!doctype html> <html lang="en"> <head> <title>Code coverage report for src/updateChildren.ts</title> <meta charset="utf-8" /> <link rel="stylesheet" href="../prettify.css" /> <link rel="stylesheet" href="../base.css" /> <meta name="viewport" content="width=device-width, initial-scale=1"> <style type='text/css'> .coverage-summary .sorter { background-image: url(../sort-arrow-sprite.png); } </style> </head> <body> <div class='wrapper'> <div class='pad1'> <h1> <a href="../index.html">all files</a> / <a href="index.html">src/</a> updateChildren.ts </h1> <div class='clearfix'> <div class='fl pad1y space-right2'> <span class="strong">100% </span> <span class="quiet">Statements</span> <span class='fraction'>64/64</span> </div> <div class='fl pad1y space-right2'> <span class="strong">96.15% </span> <span class="quiet">Branches</span> <span class='fraction'>25/26</span> </div> <div class='fl pad1y space-right2'> <span class="strong">100% </span> <span class="quiet">Functions</span> <span class='fraction'>2/2</span> </div> <div class='fl pad1y space-right2'> <span class="strong">100% </span> <span class="quiet">Lines</span> <span class='fraction'>63/63</span> </div> </div> </div> <div class='status-line high'></div> <pre><table class="coverage"> <tr><td class="line-count quiet">1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123</td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">191×</span> <span class="cline-any cline-yes">191×</span> <span class="cline-any cline-yes">191×</span> <span class="cline-any cline-yes">191×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">191×</span> <span class="cline-any cline-yes">191×</span> <span class="cline-any cline-yes">191×</span> <span class="cline-any cline-yes">191×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">191×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">191×</span> <span class="cline-any cline-yes">325×</span> <span class="cline-any cline-yes">28×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">297×</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">291×</span> <span class="cline-any cline-yes">204×</span> <span class="cline-any cline-yes">204×</span> <span class="cline-any cline-yes">204×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">87×</span> <span class="cline-any cline-yes">14×</span> <span class="cline-any cline-yes">14×</span> <span class="cline-any cline-yes">14×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">73×</span> <span class="cline-any cline-yes">20×</span> <span class="cline-any cline-yes">20×</span> <span class="cline-any cline-yes">20×</span> <span class="cline-any cline-yes">20×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">53×</span> <span class="cline-any cline-yes">13×</span> <span class="cline-any cline-yes">13×</span> <span class="cline-any cline-yes">13×</span> <span class="cline-any cline-yes">13×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">40×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">40×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">40×</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">35×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">35×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">35×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">35×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">35×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">191×</span> <span class="cline-any cline-yes">181×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">181×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">10×</span> <span class="cline-any cline-yes">10×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">10×</span> <span class="cline-any cline-yes">10×</span> <span class="cline-any cline-yes">10×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">10×</span> <span class="cline-any cline-yes">85×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">85×</span> <span class="cline-any cline-yes">79×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">10×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { ElementVNode } from './types' import { ModuleCallbacks } from './modules/ModuleCallbacks' import { addVNodes } from './addVNodes' import { createElement } from './createElement' import { patchVNode } from './patchVNode' import { removeVNodes } from './removeVNodes' import { vNodesAreEqual } from './helpers' &nbsp; export function updateChildren( parentElement: Element, formerChildren: Array&lt;ElementVNode&gt;, children: Array&lt;ElementVNode&gt;, moduleCallbacks: ModuleCallbacks, insertedVNodeQueue: Array&lt;ElementVNode&gt;) { // indexes let formerStartIndex = 0 let startIndex = 0 let formerEndIndex = formerChildren.length - 1 let endIndex = children.length - 1 &nbsp; // VNodes let formerStartVNode = formerChildren[formerStartIndex] let startVNode = children[startIndex] let formerEndVNode = formerChildren[formerEndIndex] let endVNode = children[endIndex] &nbsp; // an object mapping keys to indexes in formerChildren array let mappedKeyToFormerIndex: any &nbsp; while (formerStartIndex &lt;= formerEndIndex &amp;&amp; startIndex &lt;= endIndex) { if (!formerStartVNode) formerStartVNode = formerChildren[++formerStartIndex] &nbsp; else if (!formerEndVNode) formerEndVNode = formerChildren[--formerEndIndex] &nbsp; else if (vNodesAreEqual(formerStartVNode, startVNode)) { patchVNode(formerStartVNode, startVNode, moduleCallbacks, insertedVNodeQueue) formerStartVNode = formerChildren[++formerStartIndex] startVNode = children[++startIndex] } &nbsp; else if (vNodesAreEqual(formerEndVNode, endVNode)) { patchVNode(formerEndVNode, endVNode, moduleCallbacks, insertedVNodeQueue) formerEndVNode = formerChildren[--formerEndIndex] endVNode = children[--endIndex] } &nbsp; else if (vNodesAreEqual(formerStartVNode, endVNode)) { patchVNode(formerStartVNode, endVNode, moduleCallbacks, insertedVNodeQueue) parentElement.insertBefore(formerStartVNode.element, formerEndVNode.element.nextSibling) formerStartVNode = formerChildren[++formerStartIndex] endVNode = children[--endIndex] } &nbsp; else if (vNodesAreEqual(formerEndVNode, startVNode)) { patchVNode(formerEndVNode, startVNode, moduleCallbacks, insertedVNodeQueue) parentElement.insertBefore(formerEndVNode.element, formerStartVNode.element) formerEndVNode = formerChildren[--formerEndIndex] startVNode = children[++startIndex] } &nbsp; else { if (!mappedKeyToFormerIndex) mappedKeyToFormerIndex = mapKeyToFormerIndex(formerChildren, formerStartIndex, formerEndIndex) &nbsp; const formerIndexKey = mappedKeyToFormerIndex[startVNode.key as string | number] &nbsp; if (!formerIndexKey) { // new element const element = createElement(startVNode, moduleCallbacks, insertedVNodeQueue).element parentElement.insertBefore(element, formerStartVNode.element) startVNode = children[++startIndex] } &nbsp; else { const reorderableVNode = formerChildren[formerIndexKey] &nbsp; patchVNode(reorderableVNode, startVNode, moduleCallbacks, insertedVNodeQueue) &nbsp; // WARNING: hack for performance optimization formerChildren[formerIndexKey] = void 0 as any &nbsp; parentElement.insertBefore(reorderableVNode.element, formerStartVNode.element) &nbsp; startVNode = children[++startIndex] } &nbsp; } } &nbsp; if (formerStartIndex &gt; formerEndIndex) { const referenceNode = children[endIndex + 1] ? children[endIndex + 1].element : null &nbsp; addVNodes( parentElement, referenceNode, children, startIndex, endIndex, moduleCallbacks, insertedVNodeQueue, ) } else <span class="missing-if-branch" title="else path not taken" >E</span>if (startIndex &gt; endIndex) removeVNodes(parentElement, formerChildren, formerStartIndex, formerEndIndex, moduleCallbacks) } &nbsp; function mapKeyToFormerIndex( children: Array&lt;ElementVNode&gt;, startIndex: number, endIndex: number): any { let index: number = startIndex const map: any = {} let key: any &nbsp; for (; index &lt;= endIndex; ++index) { key = children[index].key &nbsp; if (key) map[key] = index } &nbsp; return map } &nbsp;</pre></td></tr> </table></pre> <div class='push'></div><!-- for sticky footer --> </div><!-- /wrapper --> <div class='footer quiet pad2 space-top1 center small'> Code coverage generated by <a href="http://istanbul-js.org/" target="_blank">istanbul</a> at Mon Mar 12 2018 09:45:23 GMT-0400 (EDT) </div> </div> <script src="../prettify.js"></script> <script> window.onload = function () { if (typeof prettyPrint === 'function') { prettyPrint(); } }; </script> <script src="../sorter.js"></script> </body> </html>