UNPKG

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