UNPKG

4.36 kBJavaScriptView Raw
1(function (global, factory) {
2 if (typeof define === "function" && define.amd) {
3 define(["exports", "./components"], factory);
4 } else if (typeof exports !== "undefined") {
5 factory(exports, require("./components"));
6 } else {
7 var mod = {
8 exports: {}
9 };
10 factory(mod.exports, global.components);
11 global.watch = mod.exports;
12 }
13})(this, function (_exports, components) {
14 "use strict";
15
16 Object.defineProperty(_exports, "__esModule", {
17 value: true
18 });
19 _exports.default = _default;
20 components = _interopRequireWildcard(components);
21
22 function _interopRequireWildcard(obj) {
23 if (obj && obj.__esModule) {
24 return obj;
25 } else {
26 var newObj = {};
27
28 if (obj != null) {
29 for (var key in obj) {
30 if (Object.prototype.hasOwnProperty.call(obj, key)) {
31 var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {};
32
33 if (desc.get || desc.set) {
34 Object.defineProperty(newObj, key, desc);
35 } else {
36 newObj[key] = obj[key];
37 }
38 }
39 }
40 }
41
42 newObj.default = obj;
43 return newObj;
44 }
45 }
46 /**
47 * Copyright IBM Corp. 2016, 2018
48 *
49 * This source code is licensed under the Apache-2.0 license found in the
50 * LICENSE file in the root directory of this source tree.
51 */
52
53
54 var forEach = Array.prototype.forEach;
55
56 var createAndReleaseComponentsUponDOMMutation = function createAndReleaseComponentsUponDOMMutation(records, componentClasses, componentClassesForWatchInit, options) {
57 records.forEach(function (record) {
58 forEach.call(record.addedNodes, function (node) {
59 if (node.nodeType === Node.ELEMENT_NODE) {
60 componentClassesForWatchInit.forEach(function (Clz) {
61 Clz.init(node, options);
62 });
63 }
64 });
65 forEach.call(record.removedNodes, function (node) {
66 if (node.nodeType === Node.ELEMENT_NODE) {
67 componentClasses.forEach(function (Clz) {
68 if (node.matches(Clz.options.selectorInit)) {
69 var instance = Clz.components.get(node);
70
71 if (instance) {
72 instance.release();
73 }
74 } else {
75 forEach.call(node.querySelectorAll(Clz.options.selectorInit), function (element) {
76 var instance = Clz.components.get(element);
77
78 if (instance) {
79 instance.release();
80 }
81 });
82 }
83 });
84 }
85 });
86 });
87 };
88 /**
89 * Automatically instantiates/destroys components in the given element, by watching for DOM additions/removals.
90 * @param {Node} target The DOM node to instantiate components in. Should be a document or an element.
91 * @param {Object} [options] The component options.
92 * @returns {Handle} The handle to stop watching.
93 */
94
95
96 function _default() {
97 var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document;
98 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
99
100 if (target.nodeType !== Node.ELEMENT_NODE && target.nodeType !== Node.DOCUMENT_NODE) {
101 throw new TypeError('DOM document or DOM element should be given to watch for DOM node to create/release components.');
102 }
103
104 var componentClasses = Object.keys(components).map(function (key) {
105 return components[key];
106 }).filter(function (component) {
107 return typeof component.init === 'function';
108 });
109 var handles = componentClasses.map(function (Clz) {
110 return Clz.init(target, options);
111 }).filter(Boolean);
112 var componentClassesForWatchInit = componentClasses.filter(function (Clz) {
113 return !Clz.forLazyInit;
114 });
115 var observer = new MutationObserver(function (records) {
116 createAndReleaseComponentsUponDOMMutation(records, componentClasses, componentClassesForWatchInit, options);
117 });
118 observer.observe(target, {
119 childList: true,
120 subtree: true
121 });
122 return {
123 release: function release() {
124 for (var handle = handles.pop(); handle; handle = handles.pop()) {
125 handle.release();
126 }
127
128 if (observer) {
129 observer.disconnect();
130 observer = null;
131 }
132 }
133 };
134 }
135});
\No newline at end of file