UNPKG

marko

Version:

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

152 lines (133 loc) 3.78 kB
"use strict";var domData = require("../../../runtime/components/dom-data"); var componentsByDOMNode = domData._r_; var keysByDOMNode = domData._p_; var vElementsByDOMNode = domData._M_; var vPropsByDOMNode = domData._N_; var markoUID = window.$MUID || (window.$MUID = { i: 0 }); var runtimeId = markoUID.i++; var componentLookup = {}; var EMPTY_OBJECT = {}; function getComponentForEl(el, host) { var node = typeof el == "string" ? ((host ? host.ownerDocument : host) || document).getElementById(el) : el; var component; var vElement; while (node) { if (node.fragment) { if (node.fragment.endNode === node) { node = node.fragment.startNode; } else { node = node.fragment; component = componentsByDOMNode.get(node); } } else if (vElement = vElementsByDOMNode.get(node)) { component = vElement._O_; } if (component) { return component; } node = node.previousSibling || node.parentNode; } } function destroyComponentForNode(node) { var componentToDestroy = componentsByDOMNode.get(node.fragment || node); if (componentToDestroy) { componentToDestroy._P_(); delete componentLookup[componentToDestroy.id]; } } function destroyNodeRecursive(node, component) { destroyComponentForNode(node); if (node.nodeType === 1 || node.nodeType === 12) { var key; if (component && (key = keysByDOMNode.get(node))) { if (node === component.L_[key]) { if (componentsByDOMNode.get(node) && /\[\]$/.test(key)) { delete component.L_[key][ componentsByDOMNode.get(node).id]; } else { delete component.L_[key]; } } } var curChild = node.firstChild; while (curChild && curChild !== node.endNode) { destroyNodeRecursive(curChild, component); curChild = curChild.nextSibling; } } } function nextComponentId() { // Each component will get an ID that is unique across all loaded // marko runtimes. This allows multiple instances of marko to be // loaded in the same window and they should all place nice // together return "c" + markoUID.i++; } function nextComponentIdProvider() { return nextComponentId; } function attachBubblingEvent( componentDef, handlerMethodName, isOnce, extraArgs) { if (handlerMethodName) { var componentId = componentDef.id; if (extraArgs) { return [handlerMethodName, componentId, isOnce, extraArgs]; } else { return [handlerMethodName, componentId, isOnce]; } } } function getMarkoPropsFromEl(el) { var vElement = vElementsByDOMNode.get(el); var virtualProps; if (vElement) { virtualProps = vElement._Q_; } else { virtualProps = vPropsByDOMNode.get(el); if (!virtualProps) { virtualProps = el.getAttribute("data-marko"); vPropsByDOMNode.set( el, virtualProps = virtualProps ? JSON.parse(virtualProps) : EMPTY_OBJECT ); } } return virtualProps; } function normalizeComponentKey(key, parentId) { if (key[0] === "#") { key = key.replace("#" + parentId + "-", ""); } return key; } function addComponentRootToKeyedElements( keyedElements, key, rootNode, componentId) { if (/\[\]$/.test(key)) { var repeatedElementsForKey = keyedElements[key] = keyedElements[key] || {}; repeatedElementsForKey[componentId] = rootNode; } else { keyedElements[key] = rootNode; } } exports._R_ = runtimeId; exports._n_ = componentLookup; exports.U_ = getComponentForEl; exports._S_ = destroyComponentForNode; exports._T_ = destroyNodeRecursive; exports._U_ = nextComponentIdProvider; exports._V_ = attachBubblingEvent; exports._t_ = getMarkoPropsFromEl; exports._o_ = addComponentRootToKeyedElements; exports._W_ = normalizeComponentKey;