UNPKG

marko

Version:

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

179 lines (134 loc) 3.86 kB
"use strict";var domData = require("../../../runtime/components/dom-data"); var componentsByDOMNode = domData._o_; var keysByDOMNode = domData._m_; var vElementsByDOMNode = domData._J_; var vPropsByDOMNode = domData._K_; 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._L_; } if (component) { return component; } node = node.previousSibling || node.parentNode; } } function destroyComponentForNode(node) { var componentToDestroy = componentsByDOMNode.get(node.fragment || node); if (componentToDestroy) { componentToDestroy._M_(); 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.K_[key]) { if (componentsByDOMNode.get(node) && /\[\]$/.test(key)) { delete component.K_[key][ componentsByDOMNode.get(node).id]; } else { delete component.K_[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._N_; } 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; } } // eslint-disable-next-line no-constant-condition exports._O_ = runtimeId; exports._k_ = componentLookup; exports.T_ = getComponentForEl; exports._P_ = destroyComponentForNode; exports._Q_ = destroyNodeRecursive; exports._R_ = nextComponentIdProvider; exports._S_ = attachBubblingEvent; exports._q_ = getMarkoPropsFromEl; exports._l_ = addComponentRootToKeyedElements; exports._T_ = normalizeComponentKey;