@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/dist/esm/is.js CHANGED
@@ -1,14 +1,34 @@
1
1
  function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
2
  import { inArray } from "./array.js";
3
+
4
+ /**
5
+ * @param {any} str
6
+ * @returns {boolean}
7
+ */
3
8
  export var isString = function isString(str) {
4
9
  return typeof str == 'string' || Object.prototype.toString.call(str) === '[object String]';
5
10
  };
11
+
12
+ /**
13
+ * @param {any} o
14
+ * @returns {boolean}
15
+ */
6
16
  export var isObject = function isObject(o) {
7
17
  return !!o && !isArray(o) && _typeof(o) === 'object';
8
18
  };
19
+
20
+ /**
21
+ * @param {any} f
22
+ * @returns {boolean}
23
+ */
9
24
  export var isFunction = function isFunction(f) {
10
25
  return !!f && typeof f === 'function';
11
26
  };
27
+
28
+ /**
29
+ * @param {any} o
30
+ * @returns {boolean}
31
+ */
12
32
  export var isPlainObject = function isPlainObject(o) {
13
33
  if (false === isObject(o)) return false;
14
34
  if (undefined === o.constructor) return true;
@@ -16,38 +36,88 @@ export var isPlainObject = function isPlainObject(o) {
16
36
  if (o.constructor.prototype.hasOwnProperty('isPrototypeOf') === false) return false;
17
37
  return true;
18
38
  };
39
+
40
+ /**
41
+ * @param {any} b
42
+ * @returns {boolean}
43
+ */
19
44
  export var isBoolean = function isBoolean(b) {
20
45
  return b === true || b === false;
21
46
  };
22
47
  export var isBool = isBoolean;
48
+
49
+ /**
50
+ * @param {any} v
51
+ * @returns {boolean}
52
+ */
23
53
  export var isUndefined = function isUndefined(v) {
24
54
  return typeof v === 'undefined';
25
55
  };
56
+
57
+ /**
58
+ * @param {any} o
59
+ * @returns {boolean}
60
+ */
26
61
  export var isArrayLike = function isArrayLike(o) {
27
62
  return !!o && !isString(o) && !isFunction(o) && isInt(o.length)
28
63
  // && o.length >= 0
29
64
  && Number.isFinite(o.length);
30
65
  };
66
+
67
+ /**
68
+ * @param {any} a
69
+ * @returns {boolean}
70
+ */
31
71
  export var isArray = function isArray(a) {
32
72
  return Array.isArray(a);
33
73
  };
74
+
75
+ /**
76
+ * @param {any} o
77
+ * @returns {boolean}
78
+ */
34
79
  export var isDate = function isDate(o) {
35
80
  return !!o && Object.prototype.toString.call(o) === '[object Date]';
36
81
  };
82
+
83
+ /**
84
+ * @param {any} o
85
+ * @returns {boolean}
86
+ */
37
87
  export var isEvent = function isEvent(o) {
38
88
  return isObject(o) && (!!o.preventDefault || /\[object Event\]/.test(o.constructor.toString()));
39
89
  };
90
+
91
+ /**
92
+ * @param {any} n
93
+ * @returns {boolean}
94
+ */
40
95
  export var isInteger = function isInteger(n) {
41
- return /^[\-]?\d+$/.test(n + '');
96
+ return /^[\-+]?\d+$/.test(n + '');
42
97
  };
43
98
  export var isInt = isInteger;
99
+
100
+ /**
101
+ * @param {any} n
102
+ * @returns {boolean}
103
+ */
44
104
  export var isFloat = function isFloat(n) {
45
- return /^[\-]?\d+(\.\d+)?$/.test(n + '');
105
+ return /^[\-+]?\d+(\.\d+)?$/.test(n + '');
46
106
  };
47
- export var isScalar = function isScalar(value) {
48
- var type = _typeof(value);
49
- return value === null || inArray(type, ['string', 'number', 'bigint', 'symbol', 'boolean']);
107
+
108
+ /**
109
+ * @param {any} v
110
+ * @returns {boolean}
111
+ */
112
+ export var isScalar = function isScalar(v) {
113
+ var type = _typeof(v);
114
+ return null === v || inArray(type, ['string', 'number', 'bigint', 'symbol', 'boolean']);
50
115
  };
116
+
117
+ /**
118
+ * @param {string} eventName
119
+ * @returns {boolean}
120
+ */
51
121
  export var isEventSupported = function () {
52
122
  var TAGNAMES = {
53
123
  select: 'input',
@@ -67,6 +137,10 @@ export var isEventSupported = function () {
67
137
  }
68
138
  return isEventSupported;
69
139
  }();
140
+
141
+ /**
142
+ * @returns {boolean}
143
+ */
70
144
  export var isTouchDevice = function isTouchDevice() {
71
145
  return isEventSupported('touchstart');
72
146
  };
@@ -0,0 +1,299 @@
1
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
2
+ function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
3
+ 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."); }
4
+ function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
5
+ function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
6
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
7
+ 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."); }
8
+ 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; } }
9
+ 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; }
10
+ 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; } }
11
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
12
+ import { isFunction, isTouchDevice } from "./is.js";
13
+ import { foreach, map } from "./traversal.js";
14
+ import { inArray } from "./array.js";
15
+ import Mouse from "./Mouse.js";
16
+ var LISTENERS = new Map();
17
+ var CUSTOM_EVENTS = ['longtap', 'dbltap'];
18
+ var ENABLED_EVENTS = new Set();
19
+ var _teardownLongTap = null;
20
+ var _teardownDblTap = null;
21
+ var supplyEvent = function supplyEvent(event) {
22
+ if (ENABLED_EVENTS !== null && ENABLED_EVENTS !== void 0 && ENABLED_EVENTS.has(event)) return;
23
+ if (event === 'longtap') enableLongTap();
24
+ if (event === 'dbltap') enableDblTap();
25
+ ENABLED_EVENTS.add(event);
26
+ };
27
+ var enableLongTap = function enableLongTap() {
28
+ var LONGPRESS_DELAY = 800;
29
+ var MOVE_TOLERANCE = 40;
30
+ var timer = null;
31
+ var startX = 0;
32
+ var startY = 0;
33
+ var target = null;
34
+ var start = function start(ev) {
35
+ target = ev.target;
36
+ var pos = Mouse.getViewportPosition(ev);
37
+ startX = pos.x;
38
+ startY = pos.y;
39
+ timer = setTimeout(function () {
40
+ target.dispatchEvent(new CustomEvent('longtap', {
41
+ bubbles: true,
42
+ cancelable: true,
43
+ detail: {
44
+ originalEvent: ev
45
+ }
46
+ }));
47
+ timer = null;
48
+ }, LONGPRESS_DELAY);
49
+ };
50
+ var move = function move(ev) {
51
+ // if (!timer) return;
52
+
53
+ var pos = Mouse.getViewportPosition(ev);
54
+ if (Math.hypot(pos.x - startX, pos.y - startY) > MOVE_TOLERANCE) {
55
+ clearTimeout(timer);
56
+ timer = null;
57
+ }
58
+ };
59
+ var end = function end() {
60
+ clearTimeout(timer);
61
+ timer = null;
62
+ };
63
+ document.addEventListener('touchstart', start, {
64
+ passive: true
65
+ });
66
+ document.addEventListener('touchmove', move, {
67
+ passive: true
68
+ });
69
+ document.addEventListener('touchend', end);
70
+ document.addEventListener('touchcancel', end);
71
+ _teardownLongTap = function teardownLongTap() {
72
+ document.removeEventListener('touchstart', start, {
73
+ passive: true
74
+ });
75
+ document.removeEventListener('touchmove', move, {
76
+ passive: true
77
+ });
78
+ document.removeEventListener('touchend', end);
79
+ document.removeEventListener('touchcancel', end);
80
+ _teardownLongTap = null;
81
+ };
82
+ };
83
+ var enableDblTap = function enableDblTap() {
84
+ var DBLTAP_DELAY = 300;
85
+ var MOVE_TOLERANCE = 40;
86
+ var lastTapTime = 0;
87
+ var lastPos = null;
88
+ if (isTouchDevice()) {
89
+ document.addEventListener('dblclick', function (ev) {
90
+ ev.preventDefault();
91
+ ev.stopPropagation();
92
+ ev.stopImmediatePropagation();
93
+ }, {
94
+ capture: true
95
+ });
96
+ }
97
+ var start = function start(ev) {
98
+ var target = ev.target;
99
+ if (Date.now() - lastTapTime > DBLTAP_DELAY) {
100
+ lastTapTime = Date.now();
101
+ lastPos = Mouse.getViewportPosition(ev);
102
+ } else {
103
+ var pos = Mouse.getViewportPosition(ev);
104
+ if (Math.hypot(pos.x - lastPos.x, pos.y - lastPos.y) <= MOVE_TOLERANCE) {
105
+ target.dispatchEvent(new CustomEvent('dbltap', {
106
+ bubbles: true,
107
+ cancelable: true,
108
+ detail: {
109
+ originalEvent: ev
110
+ }
111
+ }));
112
+ }
113
+ lastTapTime = Date.now();
114
+ lastPos = pos;
115
+ }
116
+ };
117
+ document.addEventListener('touchstart', start, {
118
+ passive: true
119
+ });
120
+ _teardownDblTap = function teardownDblTap() {
121
+ document.removeEventListener('touchstart', start, {
122
+ passive: true
123
+ });
124
+ _teardownDblTap = null;
125
+ };
126
+ };
127
+
128
+ /**
129
+ * @param {Element} target
130
+ * @param {Element} el
131
+ * @returns {Element[]}
132
+ */
133
+ function buildTree(target, el) {
134
+ var path = [];
135
+ var node = target.nodeType === 3 ? target.parentElement : target;
136
+ while (node) {
137
+ path.push(node);
138
+ if (node === el) break;
139
+ node = node.parentElement;
140
+ }
141
+ return path;
142
+ }
143
+ function createWrappedEvent(ev, currentTarget) {
144
+ var wrappedEv = {
145
+ _immediateStopped: false,
146
+ _propagationStopped: false,
147
+ originalEvent: ev,
148
+ currentTarget: currentTarget,
149
+ stopPropagation: function stopPropagation() {
150
+ wrappedEv._propagationStopped = true;
151
+ ev.stopPropagation.apply(ev, arguments);
152
+ },
153
+ stopImmediatePropagation: function stopImmediatePropagation() {
154
+ wrappedEv._immediateStopped = true;
155
+ wrappedEv._propagationStopped = true;
156
+ ev.stopImmediatePropagation.apply(ev, arguments);
157
+ }
158
+ };
159
+ return new Proxy(wrappedEv, {
160
+ get: function get(target, prop, receiver) {
161
+ if (prop in target) {
162
+ return Reflect.get(target, prop, receiver);
163
+ }
164
+ var value = ev[prop];
165
+ return isFunction(value) ? value.bind(ev) : value;
166
+ }
167
+ });
168
+ }
169
+
170
+ /**
171
+ * @param {Element|Document|Window} el
172
+ * @param {string} events
173
+ * @param {string|Element|function} selector
174
+ * @param {function|AddEventListenerOptions|boolean} [handler]
175
+ * @param {AddEventListenerOptions|boolean} [options]
176
+ * @returns {Element}
177
+ */
178
+ export function on(el, events, selector, handler, options) {
179
+ if (isFunction(selector)) {
180
+ options = handler;
181
+ handler = selector;
182
+ selector = null;
183
+ }
184
+ foreach(events.split(' '), function (rawEvent) {
185
+ var _rawEvent$split = rawEvent.split('.'),
186
+ _rawEvent$split2 = _slicedToArray(_rawEvent$split, 2),
187
+ event = _rawEvent$split2[0],
188
+ namespace = _rawEvent$split2[1];
189
+ var listener = function listener(ev) {
190
+ if (ev.cancelBubble) return;
191
+ var tree = buildTree(ev.target, el);
192
+ var binds = _toConsumableArray(LISTENERS.get(el));
193
+ var _iterator = _createForOfIteratorHelper(tree),
194
+ _step;
195
+ try {
196
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
197
+ var node = _step.value;
198
+ var propagationStoppedOnThisNode = false;
199
+ var _iterator2 = _createForOfIteratorHelper(binds),
200
+ _step2;
201
+ try {
202
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
203
+ var bind = _step2.value;
204
+ if (bind.event !== ev.type) continue;
205
+ if (bind.selector) {
206
+ if (!node.matches(bind.selector)) continue;
207
+ } else {
208
+ if (node !== el) continue;
209
+ }
210
+ var wrappedEv = createWrappedEvent(ev, node);
211
+ bind.handler.call(node, wrappedEv);
212
+ if (wrappedEv._immediateStopped) return;
213
+ if (wrappedEv._propagationStopped) {
214
+ propagationStoppedOnThisNode = true;
215
+ }
216
+ }
217
+ } catch (err) {
218
+ _iterator2.e(err);
219
+ } finally {
220
+ _iterator2.f();
221
+ }
222
+ if (propagationStoppedOnThisNode) return;
223
+ }
224
+ } catch (err) {
225
+ _iterator.e(err);
226
+ } finally {
227
+ _iterator.f();
228
+ }
229
+ };
230
+ var store = LISTENERS.get(el);
231
+ if (!store) {
232
+ store = [];
233
+ LISTENERS.set(el, store);
234
+ }
235
+ if (inArray(event, CUSTOM_EVENTS)) {
236
+ supplyEvent(event);
237
+ }
238
+ var events = map(store, function (_, entry) {
239
+ return entry.event;
240
+ });
241
+ if (!inArray(event, events)) {
242
+ el.addEventListener(event, listener, options);
243
+ }
244
+ store.push({
245
+ event: event,
246
+ handler: handler,
247
+ selector: selector,
248
+ listener: listener,
249
+ namespace: namespace,
250
+ options: options
251
+ });
252
+ });
253
+ return el;
254
+ }
255
+
256
+ /**
257
+ * @param {Element|Document|Window} el
258
+ * @param {string} [events]
259
+ * @param {string|Element|function} [selector]
260
+ * @param {function|AddEventListenerOptions|boolean} [handler]
261
+ * @param {AddEventListenerOptions|boolean} [options]
262
+ * @returns {Element}
263
+ */
264
+ export function off(el, events, selector, handler, options) {
265
+ if (isFunction(selector)) {
266
+ options = handler;
267
+ handler = selector;
268
+ selector = null;
269
+ }
270
+ var store = LISTENERS.get(el);
271
+ if (!store) return el;
272
+ var evts = events ? events.split(' ') : [undefined];
273
+ foreach(evts, function (rawEvent) {
274
+ var _ref = undefined === rawEvent ? [undefined, undefined] : rawEvent.split('.'),
275
+ _ref2 = _slicedToArray(_ref, 2),
276
+ event = _ref2[0],
277
+ namespace = _ref2[1];
278
+ event = !event ? undefined : event;
279
+ var hasEvent = undefined !== event;
280
+ var hasNs = undefined !== namespace;
281
+ foreach(_toConsumableArray(store).reverse(), function (l) {
282
+ var match = !hasEvent && !hasNs || hasEvent && !hasNs && l.event === event || !hasEvent && hasNs && l.namespace === namespace || hasEvent && hasNs && l.event === event && l.namespace === namespace;
283
+ 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)) {
284
+ var index = store.indexOf(l);
285
+ index !== -1 && store.splice(index, 1);
286
+ if (!map(store, function (_, entry) {
287
+ return entry.event === event ? entry : null;
288
+ })[0]) el.removeEventListener(l.event, l.listener, l.options);
289
+ }
290
+ });
291
+ });
292
+ return el;
293
+ }
294
+ export function __resetCustomEventsForTests() {
295
+ var _teardownLongTap2, _teardownDblTap2;
296
+ ENABLED_EVENTS.clear();
297
+ (_teardownLongTap2 = _teardownLongTap) === null || _teardownLongTap2 === void 0 || _teardownLongTap2();
298
+ (_teardownDblTap2 = _teardownDblTap) === null || _teardownDblTap2 === void 0 || _teardownDblTap2();
299
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webalternatif/js-core",
3
- "version": "1.5.4",
3
+ "version": "1.6.0",
4
4
  "type": "module",
5
5
  "types": "types/index.d.ts",
6
6
  "main": "dist/cjs/index.js",
@@ -9,8 +9,10 @@
9
9
  ".": {
10
10
  "types": "./types/index.d.ts",
11
11
  "import": "./dist/esm/index.js",
12
- "require": "./dist/cjs/index.js"
13
- }
12
+ "require": "./dist/cjs/index.js",
13
+ "default": "./dist/esm/index.js"
14
+ },
15
+ "./package.json": "./package.json"
14
16
  },
15
17
  "license": "MIT",
16
18
  "scripts": {
@@ -21,9 +23,10 @@
21
23
  "build:esm": "babel src --out-dir dist/esm --extensions .js",
22
24
  "build:cjs": "cross-env BABEL_ENV=cjs babel src --out-dir dist/cjs --extensions .js",
23
25
  "types": "tsc",
24
- "build": "rm -r dist && yarn build:esm && yarn build:cjs && yarn types",
25
- "readme": "documentation readme src/index.js --section=API --github",
26
- "prepublishOnly": "yarn build"
26
+ "build": "rm -rf dist && yarn build:esm && yarn build:cjs && yarn types",
27
+ "docs": "node scripts/docs.js",
28
+ "prepublishOnly": "yarn build",
29
+ "prepare": "husky install"
27
30
  },
28
31
  "devDependencies": {
29
32
  "@babel/cli": "^7.28.3",
@@ -40,7 +43,8 @@
40
43
  "jest": "^29.7.0",
41
44
  "jest-environment-jsdom": "^29.7.0",
42
45
  "nodemon": "^3.1.9",
43
- "typescript": "^5.7.2"
46
+ "typescript": "^5.7.2",
47
+ "husky": "^8.0.0"
44
48
  },
45
49
  "files": [
46
50
  "dist",
package/types/Mouse.d.ts CHANGED
@@ -1,13 +1,28 @@
1
1
  export default Mouse;
2
2
  declare class Mouse {
3
- static getPosition(ev: any, element: any): {
3
+ /**
4
+ * @param {Event} ev
5
+ * @param {Element} element
6
+ * @returns {{x: number, y: number}}
7
+ */
8
+ static getPosition(ev: Event, element: Element): {
4
9
  x: number;
5
10
  y: number;
6
11
  };
7
- static getViewportPosition(ev: any): {
8
- x: any;
9
- y: any;
12
+ /**
13
+ * @param {Event} ev
14
+ * @returns {{x: number, y: number}}
15
+ */
16
+ static getViewportPosition(ev: Event): {
17
+ x: number;
18
+ y: number;
10
19
  };
11
20
  static getElement(ev: any): Element | null;
12
- static "__#1@#getEvent"(ev: any): any;
21
+ /**
22
+ * @param {Event|{originalEvent?: Event}} ev
23
+ * @returns {Event}
24
+ */
25
+ static "__#1@#getEvent"(ev: Event | {
26
+ originalEvent?: Event;
27
+ }): Event;
13
28
  }
@@ -1,11 +1,11 @@
1
1
  /**
2
- * @typedef {string | (() => string)} TranslatorValue
2
+ * @typedef {string|(()=>string)} TranslatorValue
3
3
  */
4
4
  /**
5
- * @typedef {Record<string, Record<string, Record<string, TranslatorValue>>>} TranslatorNsMapping
5
+ * @typedef {Record<string,Record<string,Record<string,TranslatorValue>>>} TranslatorNsMapping
6
6
  */
7
7
  /**
8
- * @typedef {Record<string, Record<string, TranslatorValue>>} TranslatorCoreMapping
8
+ * @typedef {Record<string,Record<string,TranslatorValue>>} TranslatorCoreMapping
9
9
  */
10
10
  /**
11
11
  * @typedef {TranslatorNsMapping | TranslatorCoreMapping} TranslatorMapping
package/types/array.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export function inArray(value: any, arr: Object | any[], index?: number, strict?: boolean): boolean;
2
- export function indexOf(arr: any, elt: any, from?: number): number;
2
+ export function indexOf(arr: Array<any> | string, elt: any, from?: number): number;
3
+ export function lastIndexOf(arr: Array<any> | string, elt: any, from?: number): number;
3
4
  export function compareArray(a1: any, a2: any): any;
4
5
  export function arrayUnique(arr: any): any;
5
6
  export function array_unique(arr: any): any;