@cycle/dom
Version:
The standard DOM Driver for Cycle.js, based on Snabbdom
102 lines • 4.05 kB
JavaScript
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
;