UNPKG

@cycle/dom

Version:

The standard DOM Driver for Cycle.js, based on Snabbdom

102 lines 4.05 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var utils_1 = require("./utils"); var SymbolTree_1 = require("./SymbolTree"); var IsolateModule = /** @class */ (function () { function IsolateModule() { this.namespaceTree = new SymbolTree_1.default(function (x) { return x.scope; }); this.namespaceByElement = new Map(); this.vnodesBeingRemoved = []; } IsolateModule.prototype.setEventDelegator = function (del) { this.eventDelegator = del; }; IsolateModule.prototype.insertElement = function (namespace, el) { this.namespaceByElement.set(el, namespace); this.namespaceTree.set(namespace, el); }; IsolateModule.prototype.removeElement = function (elm) { this.namespaceByElement.delete(elm); var namespace = this.getNamespace(elm); if (namespace) { this.namespaceTree.delete(namespace); } }; IsolateModule.prototype.getElement = function (namespace, max) { return this.namespaceTree.get(namespace, undefined, max); }; IsolateModule.prototype.getRootElement = function (elm) { if (this.namespaceByElement.has(elm)) { return elm; } //TODO: Add quick-lru or similar as additional O(1) cache var curr = elm; while (!this.namespaceByElement.has(curr)) { curr = curr.parentNode; if (!curr) { return undefined; } else if (curr.tagName === 'HTML') { throw new Error('No root element found, this should not happen at all'); } } return curr; }; IsolateModule.prototype.getNamespace = function (elm) { var rootElement = this.getRootElement(elm); if (!rootElement) { return undefined; } return this.namespaceByElement.get(rootElement); }; IsolateModule.prototype.createModule = function () { var self = this; return { create: function (emptyVNode, vNode) { var elm = vNode.elm, _a = vNode.data, data = _a === void 0 ? {} : _a; var namespace = data.isolate; if (Array.isArray(namespace)) { self.insertElement(namespace, elm); } }, update: function (oldVNode, vNode) { var oldElm = oldVNode.elm, _a = oldVNode.data, oldData = _a === void 0 ? {} : _a; var elm = vNode.elm, _b = vNode.data, data = _b === void 0 ? {} : _b; var oldNamespace = oldData.isolate; var namespace = data.isolate; if (!utils_1.isEqualNamespace(oldNamespace, namespace)) { if (Array.isArray(oldNamespace)) { self.removeElement(oldElm); } } if (Array.isArray(namespace)) { self.insertElement(namespace, elm); } }, destroy: function (vNode) { self.vnodesBeingRemoved.push(vNode); }, remove: function (vNode, cb) { self.vnodesBeingRemoved.push(vNode); cb(); }, post: function () { var vnodesBeingRemoved = self.vnodesBeingRemoved; for (var i = vnodesBeingRemoved.length - 1; i >= 0; i--) { var vnode = vnodesBeingRemoved[i]; var namespace = vnode.data !== undefined ? vnode.data.isolation : undefined; if (namespace !== undefined) { self.removeElement(namespace); } self.eventDelegator.removeElement(vnode.elm, namespace); } self.vnodesBeingRemoved = []; }, }; }; return IsolateModule; }()); exports.IsolateModule = IsolateModule; //# sourceMappingURL=IsolateModule.js.map