we-lib
Version:
wickedElements through customElements registry
492 lines (413 loc) • 13.7 kB
JavaScript
self.weLib = (function (exports) {
'use strict';
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
function _inherits(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function");
}
subClass.prototype = Object.create(superClass && superClass.prototype, {
constructor: {
value: subClass,
writable: true,
configurable: true
}
});
if (superClass) _setPrototypeOf(subClass, superClass);
}
function _getPrototypeOf(o) {
_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
return o.__proto__ || Object.getPrototypeOf(o);
};
return _getPrototypeOf(o);
}
function _setPrototypeOf(o, p) {
_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
o.__proto__ = p;
return o;
};
return _setPrototypeOf(o, p);
}
function _isNativeReflectConstruct() {
if (typeof Reflect === "undefined" || !Reflect.construct) return false;
if (Reflect.construct.sham) return false;
if (typeof Proxy === "function") return true;
try {
Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));
return true;
} catch (e) {
return false;
}
}
function _construct(Parent, args, Class) {
if (_isNativeReflectConstruct()) {
_construct = Reflect.construct;
} else {
_construct = function _construct(Parent, args, Class) {
var a = [null];
a.push.apply(a, args);
var Constructor = Function.bind.apply(Parent, a);
var instance = new Constructor();
if (Class) _setPrototypeOf(instance, Class.prototype);
return instance;
};
}
return _construct.apply(null, arguments);
}
function _isNativeFunction(fn) {
return Function.toString.call(fn).indexOf("[native code]") !== -1;
}
function _wrapNativeSuper(Class) {
var _cache = typeof Map === "function" ? new Map() : undefined;
_wrapNativeSuper = function _wrapNativeSuper(Class) {
if (Class === null || !_isNativeFunction(Class)) return Class;
if (typeof Class !== "function") {
throw new TypeError("Super expression must either be null or a function");
}
if (typeof _cache !== "undefined") {
if (_cache.has(Class)) return _cache.get(Class);
_cache.set(Class, Wrapper);
}
function Wrapper() {
return _construct(Class, arguments, _getPrototypeOf(this).constructor);
}
Wrapper.prototype = Object.create(Class.prototype, {
constructor: {
value: Wrapper,
enumerable: false,
writable: true,
configurable: true
}
});
return _setPrototypeOf(Wrapper, Class);
};
return _wrapNativeSuper(Class);
}
function _assertThisInitialized(self) {
if (self === void 0) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
return self;
}
function _possibleConstructorReturn(self, call) {
if (call && (typeof call === "object" || typeof call === "function")) {
return call;
}
return _assertThisInitialized(self);
}
function _createSuper(Derived) {
var hasNativeReflectConstruct = _isNativeReflectConstruct();
return function _createSuperInternal() {
var Super = _getPrototypeOf(Derived),
result;
if (hasNativeReflectConstruct) {
var NewTarget = _getPrototypeOf(this).constructor;
result = Reflect.construct(Super, arguments, NewTarget);
} else {
result = Super.apply(this, arguments);
}
return _possibleConstructorReturn(this, result);
};
}
var asCustomElement = (function (root, upgrade) {
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) {
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('*'), 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 utils = (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)
};
});
var create = Object.create,
keys = Object.keys;
var config = [];
var query = [];
var defined = {};
var lazy = new Set();
var wicked = new WeakMap();
var callbacks = new WeakMap();
var _utils = utils(document, query, config, defined, function (value, _ref) {
var m = _ref.m,
l = _ref.l,
o = _ref.o;
if (!m.has(value)) {
var handler = create(o, {
element: {
enumerable: true,
value: value
}
});
m.set(value, 0);
if (!wicked.has(value)) wicked.set(value, []);
wicked.get(value).push(handler);
for (var i = 0, length = l.length; i < length; i++) {
value.addEventListener(l[i].t, handler, l[i].o);
}
if (handler.init) handler.init();
asCustomElement$1(value, o);
}
}),
get = _utils.get,
upgrade = _utils.upgrade,
whenDefined = _utils.whenDefined,
setupList = _utils.$,
asCustomElement$1 = _utils._;
var delegate = function delegate(key, method, notAC) {
return function (name) {
for (var h = wicked.get(this), i = 0, length = h.length; i < length; i++) {
if (method === h[i][key] && (notAC || -1 < (h[i].observedAttributes || []).indexOf(name))) method.apply(h[i], arguments);
}
};
};
var define = function define(selector, definition) {
if (get(selector)) throw new Error('duplicated: ' + selector);
var listeners = [];
var retype = create(null);
for (var k = keys(definition), i = 0, length = k.length; i < length; i++) {
var key = k[i];
if (/^(?:connected|disconnected|attributeChanged)$/.test(key)) {
if (!callbacks.has(definition[key])) callbacks.set(definition[key], delegate(key, definition[key], key[0] !== 'a'));
definition[key + 'Callback'] = callbacks.get(definition[key]);
} else if (/^on/.test(key) && !/Options$/.test(key)) {
var options = definition[key + 'Options'] || false;
var lower = key.toLowerCase();
var type = lower.slice(2);
listeners.push({
t: type,
o: options
});
retype[type] = key;
if (lower !== key) {
type = key.slice(2, 3).toLowerCase() + key.slice(3);
retype[type] = key;
listeners.push({
t: type,
o: options
});
}
}
}
if (listeners.length) {
definition.handleEvent = function (event) {
this[retype[event.type]](event);
};
}
query.push(selector);
config.push({
m: new WeakMap(),
l: listeners,
o: definition
});
setupList(document.querySelectorAll(selector), new Set());
whenDefined(selector);
if (!lazy.has(selector)) defined[selector]._();
};
var defineAsync = function defineAsync(selector, callback, _) {
lazy.add(selector);
define(selector, {
init: function init() {
if (lazy.has(selector)) {
lazy["delete"](selector);
callback().then(function (_ref2) {
var definition = _ref2["default"];
var i = query.indexOf(selector);
query.splice(i, 1);
config.splice(i, 1);
(_ || define)(selector, definition);
});
}
}
});
};
customElements.define('we-lib', /*#__PURE__*/function (_HTMLElement) {
_inherits(_class, _HTMLElement);
var _super = _createSuper(_class);
function _class() {
_classCallCheck(this, _class);
return _super.apply(this, arguments);
}
_createClass(_class, null, [{
key: "define",
get: function get() {
return define;
}
}, {
key: "defineAsync",
get: function get() {
return defineAsync;
}
}, {
key: "get",
get: function get$1() {
return get;
}
}, {
key: "upgrade",
get: function get() {
return upgrade;
}
}, {
key: "whenDefined",
get: function get() {
return whenDefined;
}
}]);
return _class;
}( /*#__PURE__*/_wrapNativeSuper(HTMLElement)));
exports.define = define;
exports.defineAsync = defineAsync;
exports.get = get;
exports.upgrade = upgrade;
exports.whenDefined = whenDefined;
return exports;
}({}));