in src/bindingHandlers/fastForeach.ts [279:309]
FastForEach.prototype.insertAllAfter = function (nodeOrNodeArrayToInsert, insertAfterNode) {
let frag, len, i;
const containerNode = this.element;
// poor man's node and array check, should be enough for this
if (nodeOrNodeArrayToInsert.nodeType === undefined && nodeOrNodeArrayToInsert.length === undefined) {
throw new Error("Expected a single node or a node array");
}
if (nodeOrNodeArrayToInsert.nodeType !== undefined) {
ko.virtualElements.insertAfter(containerNode, nodeOrNodeArrayToInsert, insertAfterNode);
return [nodeOrNodeArrayToInsert];
} else if (nodeOrNodeArrayToInsert.length === 1) {
ko.virtualElements.insertAfter(containerNode, nodeOrNodeArrayToInsert[0], insertAfterNode);
} else if (supportsDocumentFragment) {
frag = document.createDocumentFragment();
for (i = 0, len = nodeOrNodeArrayToInsert.length; i !== len; ++i) {
frag.appendChild(nodeOrNodeArrayToInsert[i]);
}
ko.virtualElements.insertAfter(containerNode, frag, insertAfterNode);
} else {
// Nodes are inserted in reverse order - pushed down immediately after
// the last node for the previous item or as the first node of element.
for (i = nodeOrNodeArrayToInsert.length - 1; i >= 0; --i) {
const child = nodeOrNodeArrayToInsert[i];
if (!child) { break; }
ko.virtualElements.insertAfter(containerNode, child, insertAfterNode);
}
}
return nodeOrNodeArrayToInsert;
};