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 |
|
48 |
|
49 |
|
50 |
|
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 |
|
90 |
|
91 |
|
92 |
|
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 |