1 | import { isEqualNamespace } from './utils';
|
2 | import SymbolTree from './SymbolTree';
|
3 | var IsolateModule = (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 |
|
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 | }());
|
99 | export { IsolateModule };
|
100 |
|
\ | No newline at end of file |