@webreflection/elements-utils
Version:
regular/wicked elements common utilities
69 lines (59 loc) • 1.7 kB
JavaScript
;
const asCustomElement = (m => m.__esModule ? /* istanbul ignore next */ m.default : /* istanbul ignore next */ m)(require('@webreflection/as-custom-element'));
const Lie = typeof Promise === 'function' ? Promise : function (fn) {
let queue = [], resolved = 0;
fn(() => {
resolved = 1;
queue.splice(0).forEach(then);
});
return {then};
function then(fn) {
return (resolved ? setTimeout(fn) : queue.push(fn)), this;
}
};
module.exports = (root, query, config, defined, setup) => {
// exports
const get = selector => {
const i = query.indexOf(selector);
return i < 0 ? void 0 : config[i].o;
};
const upgrade = node => {
upgradeNode(node, new Set);
};
const whenDefined = selector => {
if (!(selector in defined)) {
let _, $ = new Lie($ => { _ = $; });
defined[selector] = {_, $};
}
return defined[selector].$;
};
// util
const setupList = (nodes, parsed) => {
for (let i = 0, {length} = nodes; i < length; i++) {
if (!parsed.has(nodes[i])) {
parsed.add(nodes[i]);
upgradeNode(nodes[i], parsed);
}
}
};
const upgradeAll = (node, parsed) => {
if (query.length)
setupList(node.querySelectorAll(query), parsed);
};
const upgradeNode = (node, parsed) => {
for (let i = 0, {length} = query; 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, upgrade, whenDefined,
$: setupList, _: asCustomElement(root, upgradeNode, query)
};
};