UNPKG

4.05 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3var utils_1 = require("./utils");
4var SymbolTree_1 = require("./SymbolTree");
5var IsolateModule = /** @class */ (function () {
6 function IsolateModule() {
7 this.namespaceTree = new SymbolTree_1.default(function (x) { return x.scope; });
8 this.namespaceByElement = new Map();
9 this.vnodesBeingRemoved = [];
10 }
11 IsolateModule.prototype.setEventDelegator = function (del) {
12 this.eventDelegator = del;
13 };
14 IsolateModule.prototype.insertElement = function (namespace, el) {
15 this.namespaceByElement.set(el, namespace);
16 this.namespaceTree.set(namespace, el);
17 };
18 IsolateModule.prototype.removeElement = function (elm) {
19 this.namespaceByElement.delete(elm);
20 var namespace = this.getNamespace(elm);
21 if (namespace) {
22 this.namespaceTree.delete(namespace);
23 }
24 };
25 IsolateModule.prototype.getElement = function (namespace, max) {
26 return this.namespaceTree.get(namespace, undefined, max);
27 };
28 IsolateModule.prototype.getRootElement = function (elm) {
29 if (this.namespaceByElement.has(elm)) {
30 return elm;
31 }
32 //TODO: Add quick-lru or similar as additional O(1) cache
33 var curr = elm;
34 while (!this.namespaceByElement.has(curr)) {
35 curr = curr.parentNode;
36 if (!curr) {
37 return undefined;
38 }
39 else if (curr.tagName === 'HTML') {
40 throw new Error('No root element found, this should not happen at all');
41 }
42 }
43 return curr;
44 };
45 IsolateModule.prototype.getNamespace = function (elm) {
46 var rootElement = this.getRootElement(elm);
47 if (!rootElement) {
48 return undefined;
49 }
50 return this.namespaceByElement.get(rootElement);
51 };
52 IsolateModule.prototype.createModule = function () {
53 var self = this;
54 return {
55 create: function (emptyVNode, vNode) {
56 var elm = vNode.elm, _a = vNode.data, data = _a === void 0 ? {} : _a;
57 var namespace = data.isolate;
58 if (Array.isArray(namespace)) {
59 self.insertElement(namespace, elm);
60 }
61 },
62 update: function (oldVNode, vNode) {
63 var oldElm = oldVNode.elm, _a = oldVNode.data, oldData = _a === void 0 ? {} : _a;
64 var elm = vNode.elm, _b = vNode.data, data = _b === void 0 ? {} : _b;
65 var oldNamespace = oldData.isolate;
66 var namespace = data.isolate;
67 if (!utils_1.isEqualNamespace(oldNamespace, namespace)) {
68 if (Array.isArray(oldNamespace)) {
69 self.removeElement(oldElm);
70 }
71 }
72 if (Array.isArray(namespace)) {
73 self.insertElement(namespace, elm);
74 }
75 },
76 destroy: function (vNode) {
77 self.vnodesBeingRemoved.push(vNode);
78 },
79 remove: function (vNode, cb) {
80 self.vnodesBeingRemoved.push(vNode);
81 cb();
82 },
83 post: function () {
84 var vnodesBeingRemoved = self.vnodesBeingRemoved;
85 for (var i = vnodesBeingRemoved.length - 1; i >= 0; i--) {
86 var vnode = vnodesBeingRemoved[i];
87 var namespace = vnode.data !== undefined
88 ? vnode.data.isolation
89 : undefined;
90 if (namespace !== undefined) {
91 self.removeElement(namespace);
92 }
93 self.eventDelegator.removeElement(vnode.elm, namespace);
94 }
95 self.vnodesBeingRemoved = [];
96 },
97 };
98 };
99 return IsolateModule;
100}());
101exports.IsolateModule = IsolateModule;
102//# sourceMappingURL=IsolateModule.js.map
\No newline at end of file