@webalternatif/js-core 1.5.4 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,7 +1,59 @@
1
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
2
+ ![Tests](https://img.shields.io/github/actions/workflow/status/webalternatif/js-core/ci.yml?label=Tests)
3
+ [![codecov](https://codecov.io/github/webalternatif/js-core/branch/main/graph/badge.svg?token=MLPFU51XJH)](https://codecov.io/github/webalternatif/js-core)
4
+ ![npm](https://img.shields.io/npm/v/@webalternatif/js-core)
5
+
1
6
  # js-core
2
- A set of Javascript utility functions.
3
7
 
4
- ## Functions
8
+ Modular JavaScript utilities for modern applications.
9
+
10
+ Lightweight, framework-agnostic helpers for data manipulation, DOM handling, events and internationalization.
11
+
12
+ ---
13
+
14
+ ## Installation
15
+
16
+ ```bash
17
+ npm install @webalternatif/js-core
18
+ ```
19
+
20
+ ```bash
21
+ yarn add @webalternatif/js-core
22
+ ```
23
+
24
+ ## Basic Usage
25
+
26
+ The default export provides pure JavaScript utilities only.
27
+
28
+ ```js
29
+ import webf from '@webalternatif/js-core'
30
+
31
+ webf.unique([1, 2, 2]) // [1, 2]
32
+ webf.numberFormat(12345.6789, 2, true, '.', ',') // 12.345,68
33
+ webf.isTouchDevice() // true or false
34
+ ```
35
+
36
+ ## Documentation
37
+
38
+ ### Core modules
39
+ - [String utilities](docs/string.md)
40
+ - [Array utilities](docs/array.md)
41
+ - [Type checking](docs/is.md)
42
+ - [Random utilities](docs/random.md)
43
+ - [Traversal utilities](docs/traversal.md)
44
+ - [Math utilities](docs/math.md)
45
+ - [General utilities](docs/utils.md)
46
+
47
+ ### Additional modules
48
+ - [DOM utilities](docs/dom.md)
49
+ - [Event Dispatcher](docs/eventDispatcher.md)
50
+ - [Translator (i18n)](docs/translator.md)
51
+ - [Mouse utilities](docs/mouse.md)
5
52
 
6
53
  ## Tests
7
54
 
55
+ This project uses Jest for unit testing.
56
+
57
+ ```bash
58
+ yarn test
59
+ ```
package/dist/cjs/Mouse.js CHANGED
@@ -18,7 +18,13 @@ var Mouse = /*#__PURE__*/function () {
18
18
  }
19
19
  return _createClass(Mouse, null, [{
20
20
  key: "getPosition",
21
- value: function getPosition(ev, element) {
21
+ value:
22
+ /**
23
+ * @param {Event} ev
24
+ * @param {Element} element
25
+ * @returns {{x: number, y: number}}
26
+ */
27
+ function getPosition(ev, element) {
22
28
  ev = _assertClassBrand(Mouse, this, _getEvent).call(this, ev);
23
29
  var rect = {
24
30
  left: 0,
@@ -32,10 +38,15 @@ var Mouse = /*#__PURE__*/function () {
32
38
  };
33
39
  }
34
40
  return {
35
- x: ev.pageX !== undefined ? ev.pageX - rect.left : rect.left,
36
- y: ev.pageY !== undefined ? ev.pageY - rect.top : rect.top
41
+ x: ev.pageX - rect.left,
42
+ y: ev.pageY - rect.top
37
43
  };
38
44
  }
45
+
46
+ /**
47
+ * @param {Event} ev
48
+ * @returns {{x: number, y: number}}
49
+ */
39
50
  }, {
40
51
  key: "getViewportPosition",
41
52
  value: function getViewportPosition(ev) {
@@ -51,18 +62,24 @@ var Mouse = /*#__PURE__*/function () {
51
62
  ev = _assertClassBrand(Mouse, this, _getEvent).call(this, ev);
52
63
  return window.document.elementFromPoint(ev.clientX, ev.clientY);
53
64
  }
65
+
66
+ /**
67
+ * @param {Event|{originalEvent?: Event}} ev
68
+ * @returns {Event}
69
+ */
54
70
  }]);
55
71
  }();
56
72
  function _getEvent(ev) {
57
73
  var _ev$originalEvent;
74
+ ev = (_ev$originalEvent = ev.originalEvent) !== null && _ev$originalEvent !== void 0 ? _ev$originalEvent : ev;
58
75
  if ((0, _is.isTouchDevice)()) {
59
- var orgEvent = ev.originalEvent ? ev.originalEvent : ev;
60
- if (orgEvent.changedTouches && orgEvent.changedTouches.length) {
61
- ev = orgEvent.changedTouches[0];
62
- } else if (orgEvent.touches) {
63
- ev = orgEvent.touches[0];
64
- }
76
+ var _ev$changedTouches, _ev$touches;
77
+ var touch = ((_ev$changedTouches = ev.changedTouches) === null || _ev$changedTouches === void 0 ? void 0 : _ev$changedTouches[0]) || ((_ev$touches = ev.touches) === null || _ev$touches === void 0 ? void 0 : _ev$touches[0]);
78
+ ev.clientX = touch.clientX;
79
+ ev.clientY = touch.clientY;
80
+ ev.pageX = touch.pageX;
81
+ ev.pageY = touch.pageY;
65
82
  }
66
- return (_ev$originalEvent = ev.originalEvent) !== null && _ev$originalEvent !== void 0 ? _ev$originalEvent : ev;
83
+ return ev;
67
84
  }
68
85
  var _default = exports["default"] = Mouse;
@@ -19,13 +19,13 @@ function _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); }
19
19
  function _classPrivateFieldSet(s, a, r) { return s.set(_assertClassBrand(s, a), r), r; }
20
20
  function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); }
21
21
  /**
22
- * @typedef {string | (() => string)} TranslatorValue
22
+ * @typedef {string|(()=>string)} TranslatorValue
23
23
  */
24
24
  /**
25
- * @typedef {Record<string, Record<string, Record<string, TranslatorValue>>>} TranslatorNsMapping
25
+ * @typedef {Record<string,Record<string,Record<string,TranslatorValue>>>} TranslatorNsMapping
26
26
  */
27
27
  /**
28
- * @typedef {Record<string, Record<string, TranslatorValue>>} TranslatorCoreMapping
28
+ * @typedef {Record<string,Record<string,TranslatorValue>>} TranslatorCoreMapping
29
29
  */
30
30
  /**
31
31
  * @typedef {TranslatorNsMapping | TranslatorCoreMapping} TranslatorMapping
@@ -65,7 +65,7 @@ var Translator = exports["default"] = /*#__PURE__*/function () {
65
65
  var entry = _classPrivateFieldGet(_mapping, this)[namespace][lang][label];
66
66
  return _assertClassBrand(_Translator_brand, this, _resolve).call(this, entry);
67
67
  }
68
- return 'en' !== lang ? this.translate(label, namespace, 'en') : label;
68
+ return 'en' !== lang ? this.translate(label, 'en', namespace) : label;
69
69
  }
70
70
 
71
71
  /**
@@ -142,11 +142,7 @@ function _findKeyByValue(entries, label) {
142
142
  }
143
143
  function _resolve(entry) {
144
144
  if ((0, _is.isFunction)(entry)) {
145
- try {
146
- return entry();
147
- } catch (e) {
148
- return null;
149
- }
145
+ return entry();
150
146
  }
151
147
  return entry;
152
148
  }
package/dist/cjs/array.js CHANGED
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.range = exports.indexOf = exports.inArray = exports.compareArray = exports.array_unique = exports.array_diff = exports.arrayUnique = exports.arrayDiff = void 0;
6
+ exports.range = exports.lastIndexOf = exports.indexOf = exports.inArray = exports.compareArray = exports.array_unique = exports.array_diff = exports.arrayUnique = exports.arrayDiff = void 0;
7
7
  var _traversal = require("./traversal.js");
8
8
  var _is = require("./is.js");
9
9
  var _math = require("./math.js");
@@ -11,7 +11,7 @@ var _utils = require("./utils.js");
11
11
  /**
12
12
  * Checks if a value exists in an array or an object
13
13
  *
14
- * @param {*} value the searched value
14
+ * @param {any} value the searched value
15
15
  * @param {Object|Array} arr the array
16
16
  * @param {number} [index=0] if provided, search from this index
17
17
  * @param {boolean} [strict=false] if true, search is done with strict equality
@@ -26,8 +26,7 @@ var _utils = require("./utils.js");
26
26
  * // → true
27
27
  *
28
28
  * @example
29
- * inArray(5, [1, 2, 3])
30
- * // → false
29
+ * inArray(5, [1, 2, 3]) // → false
31
30
  */
32
31
  var inArray = exports.inArray = function inArray(value, arr) {
33
32
  var index = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
@@ -56,11 +55,47 @@ var inArray = exports.inArray = function inArray(value, arr) {
56
55
  });
57
56
  return ret;
58
57
  };
58
+
59
+ /**
60
+ * Returns the first index at which a given element can be found in an array or a string.
61
+ * or -1 if it is not present.
62
+ *
63
+ * @param {Array<any>|string} arr - The array to search in
64
+ * @param {any} elt - The element to search for
65
+ * @param {number} [from] - The index to start the search from. Can be negative.
66
+ * @returns {number} - The index of the element, or -1 if not found
67
+ */
59
68
  var indexOf = exports.indexOf = function indexOf(arr, elt) {
60
69
  var from = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
61
- from = from < 0 ? Math.ceil(from) + arr.length : Math.floor(from);
62
- for (; from < arr.length; from++) {
63
- if (from in arr && arr[from] === elt) {
70
+ var a = (0, _is.isString)(arr) ? (0, _traversal.map)(arr, function (_, a) {
71
+ return a;
72
+ }) : arr;
73
+ from = from < 0 ? Math.ceil(from) + a.length : Math.floor(from);
74
+ for (; from < a.length; from++) {
75
+ if (from in a && a[from] === elt) {
76
+ return from;
77
+ }
78
+ }
79
+ return -1;
80
+ };
81
+
82
+ /**
83
+ * Returns the last index at which a given element can be found in an array or a string.
84
+ * or -1 if it is not present.
85
+ *
86
+ * @param {Array<any>|string} arr - The array to search in
87
+ * @param {any} elt - The element to search for
88
+ * @param {number} [from] - The index to start the search from. Can be negative.
89
+ * @returns {number} - The index of the element, or -1 if not found
90
+ */
91
+ var lastIndexOf = exports.lastIndexOf = function lastIndexOf(arr, elt) {
92
+ var from = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : -1;
93
+ var a = (0, _is.isString)(arr) ? (0, _traversal.map)(arr, function (_, a) {
94
+ return a;
95
+ }) : arr;
96
+ from = from < 0 ? a.length + Math.ceil(from) : Math.floor(from);
97
+ for (; from >= 0; from--) {
98
+ if (from in a && a[from] === elt) {
64
99
  return from;
65
100
  }
66
101
  }
package/dist/cjs/dom.js CHANGED
@@ -8,12 +8,7 @@ var _is = require("./is.js");
8
8
  var _string = require("./string.js");
9
9
  var _traversal = require("./traversal.js");
10
10
  var _array = require("./array.js");
11
- var _Mouse = _interopRequireDefault(require("./Mouse.js"));
12
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
13
- function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
14
- function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
15
- function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
16
- function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
11
+ var _onOff = require("./onOff.js");
17
12
  function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
18
13
  function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
19
14
  function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
@@ -21,116 +16,6 @@ function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Sym
21
16
  function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
22
17
  function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
23
18
  var cssNumber = ['animationIterationCount', 'aspectRatio', 'borderImageSlice', 'columnCount', 'flexGrow', 'flexShrink', 'fontWeight', 'gridArea', 'gridColumn', 'gridColumnEnd', 'gridColumnStart', 'gridRow', 'gridRowEnd', 'gridRowStart', 'lineHeight', 'opacity', 'order', 'orphans', 'scale', 'widows', 'zIndex', 'zoom', 'fillOpacity', 'floodOpacity', 'stopOpacity', 'strokeMiterlimit', 'strokeOpacity'];
24
- var LISTENERS = new Map();
25
- var CUSTOM_EVENTS = ['longtap', 'dbltap'];
26
- var ENABLED_EVENTS = new Set();
27
- var _teardownLongTap = null;
28
- var _teardownDblTap = null;
29
- var supplyEvent = function supplyEvent(event) {
30
- if (ENABLED_EVENTS !== null && ENABLED_EVENTS !== void 0 && ENABLED_EVENTS.has(event)) return;
31
- if (event === 'longtap') enableLongTap();
32
- if (event === 'dbltap') enableDblTap();
33
- ENABLED_EVENTS.add(event);
34
- };
35
- var enableLongTap = function enableLongTap() {
36
- var LONGPRESS_DELAY = 800;
37
- var MOVE_TOLERANCE = 8;
38
- var timer = null;
39
- var startX = 0;
40
- var startY = 0;
41
- var target = null;
42
- var start = function start(ev) {
43
- target = ev.target;
44
- var pos = _Mouse["default"].getViewportPosition(ev);
45
- startX = pos.x;
46
- startY = pos.y;
47
- timer = setTimeout(function () {
48
- target.dispatchEvent(new CustomEvent('longtap', {
49
- bubbles: true,
50
- cancelable: true,
51
- detail: {
52
- originalEvent: ev
53
- }
54
- }));
55
- timer = null;
56
- }, LONGPRESS_DELAY);
57
- };
58
- var move = function move(ev) {
59
- if (!timer) return;
60
- var pos = _Mouse["default"].getViewportPosition(ev);
61
- if (Math.hypot(pos.x - startX, pos.y - startY) > MOVE_TOLERANCE) {
62
- clearTimeout(timer);
63
- timer = null;
64
- }
65
- };
66
- var end = function end() {
67
- if (timer) clearTimeout(timer);
68
- timer = null;
69
- };
70
- document.addEventListener('touchstart', start, {
71
- passive: true
72
- });
73
- document.addEventListener('touchmove', move, {
74
- passive: true
75
- });
76
- document.addEventListener('touchend', end);
77
- document.addEventListener('touchcancel', end);
78
- _teardownLongTap = function teardownLongTap() {
79
- document.removeEventListener('touchstart', start, {
80
- passive: true
81
- });
82
- document.removeEventListener('touchmove', move, {
83
- passive: true
84
- });
85
- document.removeEventListener('touchend', end);
86
- document.removeEventListener('touchcancel', end);
87
- _teardownLongTap = null;
88
- };
89
- };
90
- var enableDblTap = function enableDblTap() {
91
- var DBLTAP_DELAY = 300;
92
- var MOVE_TOLERANCE = 40;
93
- var lastTapTime = 0;
94
- var lastPos = null;
95
- if ((0, _is.isTouchDevice)()) {
96
- document.addEventListener('dblclick', function (ev) {
97
- ev.preventDefault();
98
- ev.stopPropagation();
99
- ev.stopImmediatePropagation();
100
- }, {
101
- capture: true
102
- });
103
- }
104
- var start = function start(ev) {
105
- var target = ev.target;
106
- if (Date.now() - lastTapTime > DBLTAP_DELAY) {
107
- lastTapTime = Date.now();
108
- lastPos = _Mouse["default"].getViewportPosition(ev);
109
- } else {
110
- var pos = _Mouse["default"].getViewportPosition(ev);
111
- if (Math.hypot(pos.x - lastPos.x, pos.y - lastPos.y) <= MOVE_TOLERANCE) {
112
- target.dispatchEvent(new CustomEvent('dbltap', {
113
- bubbles: true,
114
- cancelable: true,
115
- detail: {
116
- originalEvent: ev
117
- }
118
- }));
119
- }
120
- lastTapTime = Date.now();
121
- lastPos = pos;
122
- }
123
- };
124
- document.addEventListener('touchstart', start, {
125
- passive: true
126
- });
127
- _teardownDblTap = function teardownDblTap() {
128
- document.removeEventListener('touchstart', start, {
129
- passive: true
130
- });
131
- _teardownDblTap = null;
132
- };
133
- };
134
19
 
135
20
  /**
136
21
  * @param {any} o
@@ -379,9 +264,7 @@ var dom = {
379
264
  */
380
265
  closest: function closest(el, selector) {
381
266
  if (selector instanceof Element) {
382
- if (el === selector) {
383
- return el;
384
- }
267
+ if (el === selector) return el;
385
268
  var parentEl = el.parentElement;
386
269
  while (parentEl) {
387
270
  if (parentEl === selector) {
@@ -539,7 +422,7 @@ var dom = {
539
422
  /**
540
423
  * @param {Element} el
541
424
  * @param {string} [html]
542
- * @returns {Element|*}
425
+ * @returns {Element|string}
543
426
  */
544
427
  html: function html(el, _html) {
545
428
  if (undefined === _html) return el.innerHTML;
@@ -549,7 +432,7 @@ var dom = {
549
432
  /**
550
433
  * @param {Element} el
551
434
  * @param {string} [text]
552
- * @returns {Element|*}
435
+ * @returns {Element|string}
553
436
  */
554
437
  text: function text(el, _text) {
555
438
  if (undefined === _text) return el.innerText;
@@ -626,128 +509,6 @@ var dom = {
626
509
  delete el.dataset[key];
627
510
  return el;
628
511
  },
629
- /**
630
- * @param {Element|Document|Window} el
631
- * @param {string} events
632
- * @param {string|Element|function} selector
633
- * @param {function|AddEventListenerOptions|boolean} [handler]
634
- * @param {AddEventListenerOptions|boolean} [options]
635
- * @returns {Element}
636
- */
637
- on: function on(el, events, selector, handler, options) {
638
- var _this5 = this;
639
- if ((0, _is.isFunction)(selector)) {
640
- options = handler;
641
- handler = selector;
642
- selector = null;
643
- }
644
- (0, _traversal.foreach)(events.split(' '), function (rawEvent) {
645
- var _rawEvent$split = rawEvent.split('.'),
646
- _rawEvent$split2 = _slicedToArray(_rawEvent$split, 2),
647
- event = _rawEvent$split2[0],
648
- namespace = _rawEvent$split2[1];
649
- var listener = function listener(ev) {
650
- if (!selector) {
651
- handler.call(el, ev);
652
- return;
653
- }
654
- var currentTarget = ev.target;
655
- var _loop = function _loop() {
656
- if (_this5.matches(currentTarget, selector)) {
657
- var wrappedEv = {
658
- _immediateStopped: false,
659
- originalEvent: ev,
660
- type: ev.type,
661
- target: ev.target,
662
- currentTarget: currentTarget,
663
- relatedTarget: ev.relatedTarget,
664
- button: ev.button,
665
- pageX: ev.pageX,
666
- pageY: ev.pageY,
667
- preventDefault: function preventDefault() {
668
- return ev.preventDefault.apply(ev, arguments);
669
- },
670
- stopPropagation: function stopPropagation() {
671
- return ev.stopPropagation.apply(ev, arguments);
672
- },
673
- stopImmediatePropagation: function stopImmediatePropagation() {
674
- wrappedEv._immediateStopped = true;
675
- ev.stopImmediatePropagation.apply(ev, arguments);
676
- }
677
- };
678
- handler.call(currentTarget, wrappedEv);
679
- if (wrappedEv._immediateStopped) {
680
- return {
681
- v: void 0
682
- };
683
- }
684
- return 0; // break
685
- }
686
- currentTarget = currentTarget.parentElement;
687
- },
688
- _ret;
689
- while (currentTarget && currentTarget !== el) {
690
- _ret = _loop();
691
- if (_ret === 0) break;
692
- if (_ret) return _ret.v;
693
- }
694
- };
695
- var store = LISTENERS.get(el);
696
- if (!store) {
697
- store = [];
698
- LISTENERS.set(el, store);
699
- }
700
- store.push({
701
- event: event,
702
- handler: handler,
703
- selector: selector,
704
- listener: listener,
705
- namespace: namespace,
706
- options: options
707
- });
708
- if ((0, _array.inArray)(event, CUSTOM_EVENTS)) {
709
- supplyEvent(event);
710
- }
711
- el.addEventListener(event, listener, options);
712
- });
713
- return el;
714
- },
715
- /**
716
- * @param {Element|Document|Window} el
717
- * @param {string} [events]
718
- * @param {string|Element|function} [selector]
719
- * @param {function|AddEventListenerOptions|boolean} [handler]
720
- * @param {AddEventListenerOptions|boolean} [options]
721
- * @returns {Element}
722
- */
723
- off: function off(el, events, selector, handler, options) {
724
- if ((0, _is.isFunction)(selector)) {
725
- options = handler;
726
- handler = selector;
727
- selector = null;
728
- }
729
- var store = LISTENERS.get(el);
730
- if (!store) return el;
731
- var evts = events ? events.split(' ') : [undefined];
732
- (0, _traversal.foreach)(evts, function (rawEvent) {
733
- var _ref = undefined === rawEvent ? [undefined, undefined] : rawEvent.split('.'),
734
- _ref2 = _slicedToArray(_ref, 2),
735
- event = _ref2[0],
736
- namespace = _ref2[1];
737
- event = !event ? undefined : event;
738
- var hasEvent = undefined !== event;
739
- var hasNs = undefined !== namespace;
740
- (0, _traversal.foreach)(_toConsumableArray(store).reverse(), function (l) {
741
- var match = !hasEvent && !hasNs || hasEvent && !hasNs && l.event === event || !hasEvent && hasNs && l.namespace === namespace || hasEvent && hasNs && l.event === event && l.namespace === namespace;
742
- if (match && (undefined === event || l.event === event) && (undefined === handler || l.handler === handler) && (undefined === selector || l.selector === selector) && (undefined === namespace || l.namespace === namespace) && (undefined === options || l.options === options)) {
743
- el.removeEventListener(l.event, l.listener, l.options);
744
- var index = store.indexOf(l);
745
- index !== -1 && store.splice(index, 1);
746
- }
747
- });
748
- });
749
- return el;
750
- },
751
512
  /**
752
513
  * @param {HTMLElement} el
753
514
  * @param {Object<string, string>|string} style
@@ -755,7 +516,7 @@ var dom = {
755
516
  * @returns {Element}
756
517
  */
757
518
  css: function css(el, style, value) {
758
- var _this6 = this;
519
+ var _this5 = this;
759
520
  if ((0, _is.isString)(style)) {
760
521
  var prop = style.startsWith('--') ? style : (0, _string.camelCase)(style);
761
522
  if (undefined === value) {
@@ -769,7 +530,7 @@ var dom = {
769
530
  }
770
531
  } else {
771
532
  (0, _traversal.each)(style, function (name, v) {
772
- _this6.css(el, name, v);
533
+ _this5.css(el, name, v);
773
534
  });
774
535
  }
775
536
  return el;
@@ -824,7 +585,7 @@ var dom = {
824
585
  * @returns {Element|DocumentFragment|null}
825
586
  */
826
587
  create: function create(html) {
827
- html += '';
588
+ if (!(0, _is.isString)(html)) return null;
828
589
  var isTagName = function isTagName(s) {
829
590
  return /^[A-Za-z][A-Za-z0-9-]*$/.test(s);
830
591
  };
@@ -837,7 +598,6 @@ var dom = {
837
598
  if (frag.childElementCount === 1 && frag.children.length === 1) {
838
599
  return frag.firstElementChild;
839
600
  }
840
- if (!frag.firstChild) return null;
841
601
  return frag.cloneNode(true);
842
602
  },
843
603
  /**
@@ -846,14 +606,13 @@ var dom = {
846
606
  * @returns {Element|null}
847
607
  */
848
608
  eq: function eq(nodeList) {
849
- var _nodeList$index;
850
609
  var index = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
851
610
  nodeList = Array.from(nodeList);
852
611
  if (Math.abs(index) >= nodeList.length) return null;
853
612
  if (index < 0) {
854
613
  index = nodeList.length + index;
855
614
  }
856
- return (_nodeList$index = nodeList[index]) !== null && _nodeList$index !== void 0 ? _nodeList$index : null;
615
+ return nodeList[index];
857
616
  },
858
617
  /**
859
618
  * @param {Element} el
@@ -880,13 +639,10 @@ var dom = {
880
639
  return el.parentElement.insertBefore(newEl, el);
881
640
  },
882
641
  /**
883
- * @param {Element|string} el
642
+ * @param {Element} el
884
643
  * @returns {Element}
885
644
  */
886
645
  empty: function empty(el) {
887
- if ((0, _is.isString)(el)) {
888
- el = this.findOne(el);
889
- }
890
646
  while (el.firstChild) {
891
647
  el.removeChild(el.firstChild);
892
648
  }
@@ -901,7 +657,8 @@ var dom = {
901
657
  var elements = el instanceof Element ? [el] : Array.from(el);
902
658
  var selectorIsString = (0, _is.isString)(selector);
903
659
  return elements.filter(function (e) {
904
- if (!(e instanceof Element)) return false;
660
+ // if (!(e instanceof Element)) return false
661
+
905
662
  return selectorIsString ? !e.matches(selector) : e !== selector;
906
663
  });
907
664
  },
@@ -937,16 +694,16 @@ var dom = {
937
694
  * @returns {Element}
938
695
  */
939
696
  replaceChildren: function replaceChildren(el) {
940
- var _this7 = this;
697
+ var _this6 = this;
941
698
  var nodes = [];
942
699
  for (var _len4 = arguments.length, children = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {
943
700
  children[_key4 - 1] = arguments[_key4];
944
701
  }
945
702
  (0, _traversal.foreach)(children, function (child) {
946
703
  if ((0, _is.isString)(child)) {
947
- child = _this7.create(child);
704
+ child = _this6.create(child);
948
705
  }
949
- if (child) nodes.push(child);
706
+ nodes.push(child);
950
707
  });
951
708
  el.replaceChildren.apply(el, nodes);
952
709
  return el;
@@ -973,14 +730,36 @@ var dom = {
973
730
  top: rect.top + wOffset.top,
974
731
  left: rect.left + wOffset.left
975
732
  };
976
- }
733
+ },
734
+ /**
735
+ * @param {Node} el
736
+ * @returns {boolean}
737
+ */
738
+ isEditable: function isEditable(el) {
739
+ var _el;
740
+ if (((_el = el) === null || _el === void 0 ? void 0 : _el.nodeType) === 3) el = el.parentElement;
741
+ if (!(el instanceof HTMLElement)) return false;
742
+ return (0, _array.inArray)(el.tagName, ['INPUT', 'TEXTAREA', 'SELECT']) || el.isContentEditable || !!this.closest(el, '[contenteditable="true"]');
743
+ },
744
+ /**
745
+ * @param {Node} node
746
+ * @returns {boolean}
747
+ */
748
+ isInDOM: function isInDOM(node) {
749
+ if (!(node instanceof Node)) return false;
750
+ var root = node.getRootNode({
751
+ composed: true
752
+ });
753
+ return root === document;
754
+ },
755
+ on: _onOff.on,
756
+ off: _onOff.off
977
757
  };
758
+
759
+ /* istanbul ignore next */
978
760
  if ('test' === process.env.NODE_ENV) {
979
761
  dom.__resetCustomEventsForTests = function () {
980
- var _teardownLongTap2, _teardownDblTap2;
981
- ENABLED_EVENTS.clear();
982
- (_teardownLongTap2 = _teardownLongTap) === null || _teardownLongTap2 === void 0 || _teardownLongTap2();
983
- (_teardownDblTap2 = _teardownDblTap) === null || _teardownDblTap2 === void 0 || _teardownDblTap2();
762
+ (0, _onOff.__resetCustomEventsForTests)();
984
763
  };
985
764
  }
986
765
  var _default = exports["default"] = dom;