1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | var utils_1 = require("./utils");
|
4 | var SymbolTree_1 = require("./SymbolTree");
|
5 | var IsolateModule = (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 |
|
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 | }());
|
101 | exports.IsolateModule = IsolateModule;
|
102 |
|
\ | No newline at end of file |