@webreflection/elements-utils
Version:
regular/wicked elements common utilities
179 lines (149 loc) • 5.07 kB
JavaScript
self.elementsUtils = (function (exports) {
'use strict';
var asCustomElement = (function (root, upgrade, query) {
var wm = new WeakMap();
var ao = new WeakMap();
var filter = [].filter;
var attributeChanged = function attributeChanged(records, mo) {
for (var i = 0, length = records.length; i < length; i++) {
var _records$i = records[i],
target = _records$i.target,
attributeName = _records$i.attributeName,
oldValue = _records$i.oldValue;
var newValue = target.getAttribute(attributeName);
ao.get(mo).call(target, attributeName, oldValue, newValue);
}
};
var elements = function elements(target) {
return 'querySelectorAll' in target;
};
var mainLoop = function mainLoop(records) {
if (query.length) {
for (var i = 0, length = records.length; i < length; i++) {
var _records$i2 = records[i],
addedNodes = _records$i2.addedNodes,
removedNodes = _records$i2.removedNodes;
parse(filter.call(addedNodes, elements), 'c', new Set());
parse(filter.call(removedNodes, elements), 'd', new Set());
}
}
};
var parse = function parse(nodes, key, parsed) {
for (var i = 0, length = nodes.length; i < length; i++) {
var target = nodes[i];
if (!parsed.has(target)) {
parsed.add(target);
if (wm.has(target)) wm.get(target)[key].forEach(call, target);else if (key === 'c') upgrade(target);
parse(target.querySelectorAll(query), key, parsed);
}
}
};
var set = function set(target) {
var sets = {
c: new Set(),
d: new Set()
};
wm.set(target, sets);
return sets;
};
var sdo = new MutationObserver(mainLoop);
sdo.observe(root, {
childList: true,
subtree: true
});
return function (target, _ref) {
var connectedCallback = _ref.connectedCallback,
disconnectedCallback = _ref.disconnectedCallback,
observedAttributes = _ref.observedAttributes,
attributeChangedCallback = _ref.attributeChangedCallback;
mainLoop(sdo.takeRecords());
var _ref2 = wm.get(target) || set(target),
c = _ref2.c,
d = _ref2.d;
if (observedAttributes) {
var mo = new MutationObserver(attributeChanged);
mo.observe(target, {
attributes: true,
attributeOldValue: true,
attributeFilter: observedAttributes.map(function (attributeName) {
if (target.hasAttribute(attributeName)) attributeChangedCallback.call(target, attributeName, null, target.getAttribute(attributeName));
return attributeName;
})
});
ao.set(mo, attributeChangedCallback);
}
if (disconnectedCallback) d.add(disconnectedCallback);
if (connectedCallback) {
c.add(connectedCallback);
if (!(target.ownerDocument.compareDocumentPosition(target) & target.DOCUMENT_POSITION_DISCONNECTED)) connectedCallback.call(target);
}
return target;
};
});
function call(back) {
back.call(this);
}
var Lie = typeof Promise === 'function' ? Promise : function (fn) {
var queue = [],
resolved = 0;
fn(function () {
resolved = 1;
queue.splice(0).forEach(then);
});
return {
then: then
};
function then(fn) {
return resolved ? setTimeout(fn) : queue.push(fn), this;
}
};
var index = (function (root, query, config, defined, setup) {
// exports
var get = function get(selector) {
var i = query.indexOf(selector);
return i < 0 ? void 0 : config[i].o;
};
var upgrade = function upgrade(node) {
upgradeNode(node, new Set());
};
var whenDefined = function whenDefined(selector) {
if (!(selector in defined)) {
var _,
$ = new Lie(function ($) {
_ = $;
});
defined[selector] = {
_: _,
$: $
};
}
return defined[selector].$;
}; // util
var setupList = function setupList(nodes, parsed) {
for (var i = 0, length = nodes.length; i < length; i++) {
if (!parsed.has(nodes[i])) {
parsed.add(nodes[i]);
upgradeNode(nodes[i], parsed);
}
}
};
var upgradeAll = function upgradeAll(node, parsed) {
if (query.length) setupList(node.querySelectorAll(query), parsed);
};
var upgradeNode = function upgradeNode(node, parsed) {
for (var i = 0, length = query.length; i < length; i++) {
if ((node.matches || node.webkitMatchesSelector || node.msMatchesSelector).call(node, query[i])) setup(node, config[i]);
}
if (parsed) upgradeAll(node, parsed);
};
return {
get: get,
upgrade: upgrade,
whenDefined: whenDefined,
$: setupList,
_: asCustomElement(root, upgradeNode, query)
};
});
exports.default = index;
return exports;
}({}).default);