UNPKG

@webreflection/elements-utils

Version:
68 lines (58 loc) 1.59 kB
import asCustomElement from '@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; } }; export default (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) }; };