@develia/commons 0.4.16 → 0.4.19

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.
Files changed (287) hide show
  1. package/dist/cjs/array.js +22 -2
  2. package/dist/cjs/array.js.map +1 -1
  3. package/dist/cjs/async-pool-executor.js +26 -11
  4. package/dist/cjs/async-pool-executor.js.map +1 -1
  5. package/dist/cjs/browser/form-utilities.js +35 -34
  6. package/dist/cjs/browser/form-utilities.js.map +1 -1
  7. package/dist/cjs/browser/geo-location.js +1 -1
  8. package/dist/cjs/browser/geo-location.js.map +1 -1
  9. package/dist/cjs/browser/index.js +0 -0
  10. package/dist/cjs/browser/index.js.map +0 -0
  11. package/dist/cjs/browser/native-bridge.js +3 -1
  12. package/dist/cjs/browser/native-bridge.js.map +1 -1
  13. package/dist/cjs/cancellable-promise.js +34 -13
  14. package/dist/cjs/cancellable-promise.js.map +1 -1
  15. package/dist/cjs/clean-url-search-params.js +26 -3
  16. package/dist/cjs/clean-url-search-params.js.map +1 -1
  17. package/dist/cjs/collections/cache-dictionary.js +3 -3
  18. package/dist/cjs/collections/cache-dictionary.js.map +1 -1
  19. package/dist/cjs/collections/default-map.js +0 -0
  20. package/dist/cjs/collections/default-map.js.map +1 -1
  21. package/dist/cjs/collections/default-weak-map.js +0 -0
  22. package/dist/cjs/collections/default-weak-map.js.map +1 -1
  23. package/dist/cjs/collections/from.js +3 -3
  24. package/dist/cjs/collections/from.js.map +1 -1
  25. package/dist/cjs/collections/index.js +0 -0
  26. package/dist/cjs/collections/index.js.map +1 -1
  27. package/dist/cjs/draft.js +46 -11
  28. package/dist/cjs/draft.js.map +1 -1
  29. package/dist/cjs/event-bus.js +1 -1
  30. package/dist/cjs/event-bus.js.map +1 -1
  31. package/dist/cjs/functions.js +348 -0
  32. package/dist/cjs/functions.js.map +1 -0
  33. package/dist/cjs/index.js +1 -0
  34. package/dist/cjs/index.js.map +1 -1
  35. package/dist/cjs/key-value-pair.js +0 -0
  36. package/dist/cjs/key-value-pair.js.map +1 -1
  37. package/dist/cjs/lazy.js +0 -0
  38. package/dist/cjs/lazy.js.map +1 -1
  39. package/dist/cjs/math.js +3 -0
  40. package/dist/cjs/math.js.map +1 -1
  41. package/dist/cjs/order.js +0 -0
  42. package/dist/cjs/order.js.map +1 -1
  43. package/dist/cjs/parse.js +10 -1
  44. package/dist/cjs/parse.js.map +1 -1
  45. package/dist/cjs/patch.js +0 -0
  46. package/dist/cjs/patch.js.map +1 -1
  47. package/dist/cjs/range.js +0 -0
  48. package/dist/cjs/range.js.map +0 -0
  49. package/dist/cjs/stopwatch.js +0 -0
  50. package/dist/cjs/stopwatch.js.map +1 -1
  51. package/dist/cjs/string.js +8 -5
  52. package/dist/cjs/string.js.map +1 -1
  53. package/dist/cjs/timer.js +1 -1
  54. package/dist/cjs/timer.js.map +1 -1
  55. package/dist/cjs/timespan.js +21 -8
  56. package/dist/cjs/timespan.js.map +1 -1
  57. package/dist/cjs/type-code.js +0 -0
  58. package/dist/cjs/type-code.js.map +1 -1
  59. package/dist/cjs/type.js +20 -19
  60. package/dist/cjs/type.js.map +1 -1
  61. package/dist/cjs/types.js +0 -0
  62. package/dist/cjs/types.js.map +1 -1
  63. package/dist/cjs/utilities.js +175 -39
  64. package/dist/cjs/utilities.js.map +1 -1
  65. package/dist/esm/array.js +21 -2
  66. package/dist/esm/array.js.map +1 -1
  67. package/dist/esm/async-pool-executor.js +26 -11
  68. package/dist/esm/async-pool-executor.js.map +1 -1
  69. package/dist/esm/browser/form-utilities.js +35 -34
  70. package/dist/esm/browser/form-utilities.js.map +1 -1
  71. package/dist/esm/browser/geo-location.js +1 -1
  72. package/dist/esm/browser/geo-location.js.map +1 -1
  73. package/dist/esm/browser/index.js +0 -0
  74. package/dist/esm/browser/index.js.map +0 -0
  75. package/dist/esm/browser/native-bridge.js +3 -1
  76. package/dist/esm/browser/native-bridge.js.map +1 -1
  77. package/dist/esm/cancellable-promise.js +34 -13
  78. package/dist/esm/cancellable-promise.js.map +1 -1
  79. package/dist/esm/clean-url-search-params.js +26 -3
  80. package/dist/esm/clean-url-search-params.js.map +1 -1
  81. package/dist/esm/collections/cache-dictionary.js +3 -3
  82. package/dist/esm/collections/cache-dictionary.js.map +1 -1
  83. package/dist/esm/collections/default-map.js +0 -0
  84. package/dist/esm/collections/default-map.js.map +1 -1
  85. package/dist/esm/collections/default-weak-map.js +0 -0
  86. package/dist/esm/collections/default-weak-map.js.map +1 -1
  87. package/dist/esm/collections/from.js +3 -3
  88. package/dist/esm/collections/from.js.map +1 -1
  89. package/dist/esm/collections/index.js +0 -0
  90. package/dist/esm/collections/index.js.map +1 -1
  91. package/dist/esm/draft.js +46 -11
  92. package/dist/esm/draft.js.map +1 -1
  93. package/dist/esm/event-bus.js +1 -1
  94. package/dist/esm/event-bus.js.map +1 -1
  95. package/dist/esm/functions.js +336 -0
  96. package/dist/esm/functions.js.map +1 -0
  97. package/dist/esm/index.js +1 -0
  98. package/dist/esm/index.js.map +1 -1
  99. package/dist/esm/key-value-pair.js +0 -0
  100. package/dist/esm/key-value-pair.js.map +1 -1
  101. package/dist/esm/lazy.js +0 -0
  102. package/dist/esm/lazy.js.map +1 -1
  103. package/dist/esm/math.js +3 -0
  104. package/dist/esm/math.js.map +1 -1
  105. package/dist/esm/order.js +0 -0
  106. package/dist/esm/order.js.map +1 -1
  107. package/dist/esm/parse.js +10 -1
  108. package/dist/esm/parse.js.map +1 -1
  109. package/dist/esm/patch.js +0 -0
  110. package/dist/esm/patch.js.map +1 -1
  111. package/dist/esm/range.js +0 -0
  112. package/dist/esm/range.js.map +0 -0
  113. package/dist/esm/stopwatch.js +0 -0
  114. package/dist/esm/stopwatch.js.map +1 -1
  115. package/dist/esm/string.js +8 -5
  116. package/dist/esm/string.js.map +1 -1
  117. package/dist/esm/timer.js +1 -1
  118. package/dist/esm/timer.js.map +1 -1
  119. package/dist/esm/timespan.js +21 -8
  120. package/dist/esm/timespan.js.map +1 -1
  121. package/dist/esm/type-code.js +0 -0
  122. package/dist/esm/type-code.js.map +1 -1
  123. package/dist/esm/type.js +20 -19
  124. package/dist/esm/type.js.map +1 -1
  125. package/dist/esm/types.js +0 -0
  126. package/dist/esm/types.js.map +1 -1
  127. package/dist/esm/utilities.js +174 -39
  128. package/dist/esm/utilities.js.map +1 -1
  129. package/dist/types/array.d.ts +20 -0
  130. package/dist/types/array.d.ts.map +1 -1
  131. package/dist/types/async-pool-executor.d.ts +2 -2
  132. package/dist/types/async-pool-executor.d.ts.map +1 -1
  133. package/dist/types/browser/form-utilities.d.ts +0 -0
  134. package/dist/types/browser/form-utilities.d.ts.map +1 -1
  135. package/dist/types/browser/geo-location.d.ts +0 -0
  136. package/dist/types/browser/geo-location.d.ts.map +0 -0
  137. package/dist/types/browser/index.d.ts +0 -0
  138. package/dist/types/browser/index.d.ts.map +0 -0
  139. package/dist/types/browser/native-bridge.d.ts +0 -0
  140. package/dist/types/browser/native-bridge.d.ts.map +1 -1
  141. package/dist/types/cancellable-promise.d.ts +0 -0
  142. package/dist/types/cancellable-promise.d.ts.map +1 -1
  143. package/dist/types/clean-url-search-params.d.ts +3 -1
  144. package/dist/types/clean-url-search-params.d.ts.map +1 -1
  145. package/dist/types/collections/cache-dictionary.d.ts +0 -0
  146. package/dist/types/collections/cache-dictionary.d.ts.map +0 -0
  147. package/dist/types/collections/default-map.d.ts +0 -0
  148. package/dist/types/collections/default-map.d.ts.map +0 -0
  149. package/dist/types/collections/default-weak-map.d.ts +0 -0
  150. package/dist/types/collections/default-weak-map.d.ts.map +0 -0
  151. package/dist/types/collections/from.d.ts +1 -1
  152. package/dist/types/collections/from.d.ts.map +0 -0
  153. package/dist/types/collections/index.d.ts +0 -0
  154. package/dist/types/collections/index.d.ts.map +0 -0
  155. package/dist/types/draft.d.ts +0 -0
  156. package/dist/types/draft.d.ts.map +1 -1
  157. package/dist/types/event-bus.d.ts +0 -0
  158. package/dist/types/event-bus.d.ts.map +0 -0
  159. package/dist/types/functions.d.ts +231 -0
  160. package/dist/types/functions.d.ts.map +1 -0
  161. package/dist/types/index.d.ts +1 -0
  162. package/dist/types/index.d.ts.map +1 -1
  163. package/dist/types/key-value-pair.d.ts +0 -0
  164. package/dist/types/key-value-pair.d.ts.map +0 -0
  165. package/dist/types/lazy.d.ts +0 -0
  166. package/dist/types/lazy.d.ts.map +0 -0
  167. package/dist/types/math.d.ts +0 -0
  168. package/dist/types/math.d.ts.map +1 -1
  169. package/dist/types/order.d.ts +0 -0
  170. package/dist/types/order.d.ts.map +0 -0
  171. package/dist/types/parse.d.ts +0 -0
  172. package/dist/types/parse.d.ts.map +1 -1
  173. package/dist/types/patch.d.ts +0 -0
  174. package/dist/types/patch.d.ts.map +0 -0
  175. package/dist/types/range.d.ts +0 -0
  176. package/dist/types/range.d.ts.map +0 -0
  177. package/dist/types/stopwatch.d.ts +0 -0
  178. package/dist/types/stopwatch.d.ts.map +0 -0
  179. package/dist/types/string.d.ts +0 -0
  180. package/dist/types/string.d.ts.map +1 -1
  181. package/dist/types/timer.d.ts +1 -1
  182. package/dist/types/timer.d.ts.map +0 -0
  183. package/dist/types/timespan.d.ts +0 -0
  184. package/dist/types/timespan.d.ts.map +1 -1
  185. package/dist/types/type-code.d.ts +0 -0
  186. package/dist/types/type-code.d.ts.map +0 -0
  187. package/dist/types/type.d.ts +2 -0
  188. package/dist/types/type.d.ts.map +1 -1
  189. package/dist/types/types.d.ts +1 -1
  190. package/dist/types/types.d.ts.map +1 -1
  191. package/dist/types/utilities.d.ts +21 -3
  192. package/dist/types/utilities.d.ts.map +1 -1
  193. package/dist/web/array.js +21 -2
  194. package/dist/web/array.js.map +1 -1
  195. package/dist/web/async-pool-executor.js +26 -11
  196. package/dist/web/async-pool-executor.js.map +1 -1
  197. package/dist/web/browser/form-utilities.js +35 -34
  198. package/dist/web/browser/form-utilities.js.map +1 -1
  199. package/dist/web/browser/geo-location.js +1 -1
  200. package/dist/web/browser/geo-location.js.map +1 -1
  201. package/dist/web/browser/index.js +0 -0
  202. package/dist/web/browser/index.js.map +0 -0
  203. package/dist/web/browser/native-bridge.js +3 -1
  204. package/dist/web/browser/native-bridge.js.map +1 -1
  205. package/dist/web/cancellable-promise.js +34 -13
  206. package/dist/web/cancellable-promise.js.map +1 -1
  207. package/dist/web/clean-url-search-params.js +26 -3
  208. package/dist/web/clean-url-search-params.js.map +1 -1
  209. package/dist/web/collections/cache-dictionary.js +3 -3
  210. package/dist/web/collections/cache-dictionary.js.map +1 -1
  211. package/dist/web/collections/default-map.js +0 -0
  212. package/dist/web/collections/default-map.js.map +1 -1
  213. package/dist/web/collections/default-weak-map.js +0 -0
  214. package/dist/web/collections/default-weak-map.js.map +1 -1
  215. package/dist/web/collections/from.js +3 -3
  216. package/dist/web/collections/from.js.map +1 -1
  217. package/dist/web/collections/index.js +0 -0
  218. package/dist/web/collections/index.js.map +1 -1
  219. package/dist/web/draft.js +46 -11
  220. package/dist/web/draft.js.map +1 -1
  221. package/dist/web/event-bus.js +1 -1
  222. package/dist/web/event-bus.js.map +1 -1
  223. package/dist/web/functions.js +336 -0
  224. package/dist/web/functions.js.map +1 -0
  225. package/dist/web/index.js +1 -0
  226. package/dist/web/index.js.map +1 -1
  227. package/dist/web/key-value-pair.js +0 -0
  228. package/dist/web/key-value-pair.js.map +1 -1
  229. package/dist/web/lazy.js +0 -0
  230. package/dist/web/lazy.js.map +1 -1
  231. package/dist/web/math.js +3 -0
  232. package/dist/web/math.js.map +1 -1
  233. package/dist/web/order.js +0 -0
  234. package/dist/web/order.js.map +1 -1
  235. package/dist/web/parse.js +10 -1
  236. package/dist/web/parse.js.map +1 -1
  237. package/dist/web/patch.js +0 -0
  238. package/dist/web/patch.js.map +1 -1
  239. package/dist/web/range.js +0 -0
  240. package/dist/web/range.js.map +0 -0
  241. package/dist/web/stopwatch.js +0 -0
  242. package/dist/web/stopwatch.js.map +1 -1
  243. package/dist/web/string.js +8 -5
  244. package/dist/web/string.js.map +1 -1
  245. package/dist/web/timer.js +1 -1
  246. package/dist/web/timer.js.map +1 -1
  247. package/dist/web/timespan.js +21 -8
  248. package/dist/web/timespan.js.map +1 -1
  249. package/dist/web/type-code.js +0 -0
  250. package/dist/web/type-code.js.map +1 -1
  251. package/dist/web/type.js +20 -19
  252. package/dist/web/type.js.map +1 -1
  253. package/dist/web/types.js +0 -0
  254. package/dist/web/types.js.map +1 -1
  255. package/dist/web/utilities.js +174 -39
  256. package/dist/web/utilities.js.map +1 -1
  257. package/package.json +84 -60
  258. package/src/array.ts +116 -84
  259. package/src/async-pool-executor.ts +107 -85
  260. package/src/browser/form-utilities.ts +32 -31
  261. package/src/browser/geo-location.ts +113 -113
  262. package/src/browser/native-bridge.ts +118 -116
  263. package/src/cancellable-promise.ts +102 -76
  264. package/src/clean-url-search-params.ts +36 -11
  265. package/src/collections/cache-dictionary.ts +115 -115
  266. package/src/collections/default-map.ts +48 -48
  267. package/src/collections/default-weak-map.ts +51 -51
  268. package/src/collections/from.ts +859 -859
  269. package/src/collections/index.ts +3 -3
  270. package/src/draft.ts +55 -16
  271. package/src/event-bus.ts +83 -83
  272. package/src/functions.ts +496 -0
  273. package/src/index.ts +1 -0
  274. package/src/key-value-pair.ts +24 -24
  275. package/src/lazy.ts +32 -32
  276. package/src/math.ts +33 -30
  277. package/src/order.ts +5 -5
  278. package/src/parse.ts +251 -240
  279. package/src/patch.ts +79 -79
  280. package/src/stopwatch.ts +43 -43
  281. package/src/string.ts +8 -5
  282. package/src/timer.ts +67 -67
  283. package/src/timespan.ts +412 -398
  284. package/src/type-code.ts +15 -15
  285. package/src/type.ts +372 -371
  286. package/src/types.ts +34 -30
  287. package/src/utilities.ts +653 -480
@@ -29,6 +29,7 @@ exports.pick = pick;
29
29
  exports.promisify = promisify;
30
30
  exports.deepClone = deepClone;
31
31
  exports.getType = getType;
32
+ exports.monkeyPatch = monkeyPatch;
32
33
  const key_value_pair_js_1 = __importDefault(require("./key-value-pair.js"));
33
34
  const type_js_1 = __importDefault(require("./type.js"));
34
35
  function lazy(factory) {
@@ -70,7 +71,7 @@ function lazy(factory) {
70
71
  * @return {boolean} - Returns true if the object is iterable, otherwise false.
71
72
  */
72
73
  function isIterable(obj) {
73
- return obj[Symbol.iterator] === 'function';
74
+ return obj != null && typeof obj[Symbol.iterator] === 'function';
74
75
  }
75
76
  /**
76
77
  * Checks if a given value is a string.
@@ -135,18 +136,20 @@ function isFunction(value) {
135
136
  *
136
137
  * @param a - First value.
137
138
  * @param b - Second value.
139
+ * @param includeInherited - Whether inherited enumerable properties are compared. Defaults to `true`.
138
140
  * @returns `true` if `a` and `b` are structurally equal.
139
141
  */
140
- function deepEqual(a, b) {
141
- return _deepEqual(a, b);
142
+ function deepEqual(a, b, includeInherited = true) {
143
+ return _deepEqual(a, b, includeInherited);
142
144
  }
143
145
  /**
144
146
  * Internal implementation of deep equality check.
145
147
  * @param a - First value.
146
148
  * @param b - Second value.
149
+ * @param includeInherited - Whether inherited enumerable properties are compared.
147
150
  * @param seen - Internal map used to handle circular references.
148
151
  */
149
- function _deepEqual(a, b, seen = new WeakMap()) {
152
+ function _deepEqual(a, b, includeInherited, seen = new Map()) {
150
153
  if (a === b)
151
154
  return true;
152
155
  if (a === null || b === null)
@@ -155,45 +158,128 @@ function _deepEqual(a, b, seen = new WeakMap()) {
155
158
  return false;
156
159
  if (typeof a !== "object")
157
160
  return false;
158
- const objA = a;
159
- if (seen.has(objA))
160
- return seen.get(objA) === b;
161
- seen.set(objA, b);
162
- if (a instanceof Date)
163
- return b instanceof Date && a.getTime() === b.getTime();
164
- if (a instanceof RegExp)
165
- return b instanceof RegExp && a.toString() === b.toString();
161
+ if (a instanceof Date || b instanceof Date) {
162
+ return a instanceof Date && b instanceof Date && a.getTime() === b.getTime();
163
+ }
164
+ if (a instanceof RegExp || b instanceof RegExp) {
165
+ return a instanceof RegExp && b instanceof RegExp && a.toString() === b.toString();
166
+ }
166
167
  if (Array.isArray(a) !== Array.isArray(b))
167
168
  return false;
168
- if (a instanceof Map) {
169
- if (!(b instanceof Map) || a.size !== b.size)
169
+ if (a instanceof Map || b instanceof Map) {
170
+ if (!(a instanceof Map) || !(b instanceof Map))
170
171
  return false;
171
- for (const [k, v] of a) {
172
- if (!b.has(k) || !_deepEqual(v, b.get(k), seen))
173
- return false;
174
- }
175
- return true;
176
172
  }
177
- if (a instanceof Set) {
178
- if (!(b instanceof Set) || a.size !== b.size)
173
+ if (a instanceof Set || b instanceof Set) {
174
+ if (!(a instanceof Set) || !(b instanceof Set))
179
175
  return false;
180
- for (const v of a)
181
- if (!b.has(v))
182
- return false;
183
- return true;
184
176
  }
185
- const keysA = Reflect.ownKeys(a);
186
- const keysB = Reflect.ownKeys(b);
177
+ const objA = a;
178
+ if (seen.has(objA))
179
+ return seen.get(objA) === b;
180
+ seen.set(objA, b);
181
+ if (a instanceof Map && b instanceof Map) {
182
+ return _deepEqualMap(a, b, includeInherited, seen);
183
+ }
184
+ if (a instanceof Set && b instanceof Set) {
185
+ return _deepEqualSet(a, b, includeInherited, seen);
186
+ }
187
+ const objB = b;
188
+ const keysA = _deepEqualKeys(objA, includeInherited);
189
+ const keysB = _deepEqualKeys(objB, includeInherited);
187
190
  if (keysA.length !== keysB.length)
188
191
  return false;
189
192
  for (const key of keysA) {
190
- if (!Object.prototype.hasOwnProperty.call(b, key))
193
+ if (!_deepEqualHasKey(objB, key, includeInherited))
194
+ return false;
195
+ if (!_deepEqual(a[key], b[key], includeInherited, seen))
191
196
  return false;
192
- if (!_deepEqual(a[key], b[key], seen))
197
+ }
198
+ return true;
199
+ }
200
+ function _deepEqualMap(a, b, includeInherited, seen) {
201
+ if (a.size !== b.size)
202
+ return false;
203
+ const entriesB = Array.from(b.entries());
204
+ const matched = new Set();
205
+ for (const [keyA, valueA] of a) {
206
+ let found = false;
207
+ for (let i = 0; i < entriesB.length; i++) {
208
+ if (matched.has(i))
209
+ continue;
210
+ const [keyB, valueB] = entriesB[i];
211
+ const candidateSeen = new Map(seen);
212
+ if (_deepEqual(keyA, keyB, includeInherited, candidateSeen) &&
213
+ _deepEqual(valueA, valueB, includeInherited, candidateSeen)) {
214
+ matched.add(i);
215
+ _mergeDeepEqualSeen(candidateSeen, seen);
216
+ found = true;
217
+ break;
218
+ }
219
+ }
220
+ if (!found)
193
221
  return false;
194
222
  }
195
223
  return true;
196
224
  }
225
+ function _deepEqualSet(a, b, includeInherited, seen) {
226
+ if (a.size !== b.size)
227
+ return false;
228
+ const valuesB = Array.from(b.values());
229
+ const matched = new Set();
230
+ for (const valueA of a) {
231
+ let found = false;
232
+ for (let i = 0; i < valuesB.length; i++) {
233
+ if (matched.has(i))
234
+ continue;
235
+ const candidateSeen = new Map(seen);
236
+ if (_deepEqual(valueA, valuesB[i], includeInherited, candidateSeen)) {
237
+ matched.add(i);
238
+ _mergeDeepEqualSeen(candidateSeen, seen);
239
+ found = true;
240
+ break;
241
+ }
242
+ }
243
+ if (!found)
244
+ return false;
245
+ }
246
+ return true;
247
+ }
248
+ function _deepEqualKeys(value, includeInherited) {
249
+ const keys = [];
250
+ const seen = new Set();
251
+ const addKey = (key) => {
252
+ if (seen.has(key))
253
+ return;
254
+ seen.add(key);
255
+ keys.push(key);
256
+ };
257
+ for (const key of Reflect.ownKeys(value)) {
258
+ addKey(key);
259
+ }
260
+ if (!includeInherited)
261
+ return keys;
262
+ let prototype = Object.getPrototypeOf(value);
263
+ while (prototype !== null) {
264
+ for (const key of Reflect.ownKeys(prototype)) {
265
+ const descriptor = Object.getOwnPropertyDescriptor(prototype, key);
266
+ if (descriptor?.enumerable)
267
+ addKey(key);
268
+ }
269
+ prototype = Object.getPrototypeOf(prototype);
270
+ }
271
+ return keys;
272
+ }
273
+ function _deepEqualHasKey(value, key, includeInherited) {
274
+ return includeInherited
275
+ ? key in value
276
+ : Object.prototype.hasOwnProperty.call(value, key);
277
+ }
278
+ function _mergeDeepEqualSeen(source, target) {
279
+ for (const [key, value] of source) {
280
+ target.set(key, value);
281
+ }
282
+ }
197
283
  /**
198
284
  * Submits an HTML form programmatically using the specified HTTP method (default is POST),
199
285
  * without using AJAX. Supports nested objects and arrays using bracket notation (e.g., `user[name]`, `tags[]`).
@@ -230,7 +316,7 @@ function shallowEqual(a, b) {
230
316
  if (keysA.length !== keysB.length) {
231
317
  return false;
232
318
  }
233
- return keysA.every(key => b.hasOwnProperty(key) && a[key] === b[key]);
319
+ return keysA.every(key => Object.prototype.hasOwnProperty.call(b, key) && a[key] === b[key]);
234
320
  }
235
321
  return false;
236
322
  }
@@ -296,7 +382,7 @@ function isSymbol(value) {
296
382
  * @deprecated
297
383
  */
298
384
  function isNullOrUndefined(value) {
299
- return value === null || typeof value === 'undefined';
385
+ return isNullish(value);
300
386
  }
301
387
  /**
302
388
  * Checks if a value is null or undefined.
@@ -315,9 +401,13 @@ function isNullish(value) {
315
401
  * @return {boolean} - Returns true if the value is empty, otherwise returns false.
316
402
  */
317
403
  function isEmpty(value) {
318
- return (Array.isArray(value) && value.length === 0) ||
319
- (typeof value === 'string' && value === '') ||
320
- value === null || typeof value === 'undefined';
404
+ if (isNullish(value))
405
+ return true;
406
+ if (Array.isArray(value))
407
+ return value.length === 0;
408
+ if (typeof value === 'string')
409
+ return value === '';
410
+ return false;
321
411
  }
322
412
  /**
323
413
  * Check if a value is empty or contains only whitespace characters.
@@ -326,9 +416,9 @@ function isEmpty(value) {
326
416
  * @return {boolean} Returns true if the value is empty or contains only whitespace characters, otherwise returns false.
327
417
  */
328
418
  function isEmptyOrWhitespace(value) {
329
- return (Array.isArray(value) && value.length === 0) ||
330
- (typeof value === 'string' && value.trim() === '') ||
331
- value === null || typeof value === 'undefined';
419
+ if (typeof value === 'string')
420
+ return value.trim() === '';
421
+ return isEmpty(value);
332
422
  }
333
423
  /**
334
424
  * Converts an object into an array of key-value pairs.
@@ -413,8 +503,11 @@ function _deepClone(value, seen = new WeakMap()) {
413
503
  return seen.get(obj);
414
504
  if (value instanceof Date)
415
505
  return new Date(value);
416
- if (value instanceof RegExp)
417
- return new RegExp(value);
506
+ if (value instanceof RegExp) {
507
+ const copy = new RegExp(value);
508
+ copy.lastIndex = value.lastIndex;
509
+ return copy;
510
+ }
418
511
  if (value instanceof Map) {
419
512
  const copy = new Map();
420
513
  seen.set(value, copy);
@@ -450,4 +543,47 @@ function _deepClone(value, seen = new WeakMap()) {
450
543
  function getType(value) {
451
544
  return type_js_1.default.of(value);
452
545
  }
546
+ /**
547
+ * Patches a method onto a class prototype.
548
+ *
549
+ * This function allows adding new methods to existing classes (monkey-patching).
550
+ * If the method name already exists on the prototype, a warning is issued
551
+ * and the method is not overwritten.
552
+ *
553
+ * If `method` is a function, its name is extracted (if not provided) and
554
+ * it is wrapped to pass the instance (`this`) as the first argument.
555
+ *
556
+ * @template T - The type of the class constructor.
557
+ * @param {T} target - The class constructor whose prototype will be patched.
558
+ * @param {any} method - The implementation or value to patch.
559
+ * @param {string | symbol} [name] - Optional name for the method. If not provided and method is a function, method.name is used.
560
+ * @returns {boolean} Returns `true` if the method was successfully added, or `false` if it already existed.
561
+ */
562
+ function monkeyPatch(target, method, name) {
563
+ let methodName;
564
+ let methodValue = method;
565
+ if (typeof method === 'function') {
566
+ methodName = name ?? method.name;
567
+ methodValue = function (...args) {
568
+ return method.apply(this, [this, ...args]);
569
+ };
570
+ }
571
+ else {
572
+ methodName = name;
573
+ }
574
+ if (!methodName) {
575
+ throw new Error("Monkey patch failed: No name provided and could not be extracted from function.");
576
+ }
577
+ if (methodName in target.prototype) {
578
+ console.warn(`Method '${String(methodName)}' already exists on ${target.name}`);
579
+ return false;
580
+ }
581
+ Object.defineProperty(target.prototype, methodName, {
582
+ value: methodValue,
583
+ writable: true,
584
+ configurable: true,
585
+ enumerable: false
586
+ });
587
+ return true;
588
+ }
453
589
  //# sourceMappingURL=utilities.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utilities.js","sourceRoot":"","sources":["../../src/utilities.ts"],"names":[],"mappings":"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","sourcesContent":["// noinspection JSUnusedGlobalSymbols\r\n\r\n\r\nimport KeyValuePair from \"./key-value-pair.js\";\r\nimport type {Resolvable} from \"./types.js\";\r\nimport Type from \"./type.js\";\r\n\r\nexport function lazy<T extends object>(factory: () => T): T {\r\n let instance: T | null = null;\r\n\r\n const getInstance = (): T => {\r\n if (!instance) {\r\n instance = factory();\r\n }\r\n return instance;\r\n };\r\n\r\n return new Proxy({} as T, {\r\n get(_, prop, receiver) {\r\n return Reflect.get(getInstance(), prop, receiver);\r\n },\r\n set(_, prop, value, receiver) {\r\n return Reflect.set(getInstance(), prop, value, receiver);\r\n },\r\n has(_, prop) {\r\n return Reflect.has(getInstance(), prop);\r\n },\r\n deleteProperty(_, prop) {\r\n return Reflect.deleteProperty(getInstance(), prop);\r\n },\r\n ownKeys() {\r\n return Reflect.ownKeys(getInstance());\r\n },\r\n getOwnPropertyDescriptor(_, prop) {\r\n return Reflect.getOwnPropertyDescriptor(getInstance(), prop);\r\n },\r\n getPrototypeOf() {\r\n return Reflect.getPrototypeOf(getInstance());\r\n },\r\n });\r\n}\r\n\r\n/**\r\n * Checks if an object is iterable.\r\n *\r\n * @param {any} obj - The object to check.\r\n * @return {boolean} - Returns true if the object is iterable, otherwise false.\r\n */\r\nexport function isIterable(obj: any): boolean {\r\n return obj[Symbol.iterator] === 'function';\r\n}\r\n\r\n/**\r\n * Checks if a given value is a string.\r\n *\r\n * @param {*} value - The value to check.\r\n * @return {boolean} - Returns true if the value is a string, otherwise returns false.\r\n */\r\nexport function isString(value: any): value is string {\r\n return typeof value === 'string';\r\n}\r\n\r\n/**\r\n * Checks if a value is a number.\r\n *\r\n * @param {any} value - The value to check.\r\n * @return {boolean} - Returns true if the value is a number, otherwise false.\r\n */\r\nexport function isNumber(value: any): value is number {\r\n return typeof value === 'number';\r\n}\r\n\r\n/**\r\n * Checks if a given value is a boolean.\r\n *\r\n * @param {any} value - The value to be checked.\r\n *\r\n * @return {boolean} - Returns true if the value is a boolean, otherwise false.\r\n */\r\nexport function isBoolean(value: any): value is boolean {\r\n return typeof value === 'boolean';\r\n}\r\n\r\n/**\r\n * Checks if a value is an object.\r\n * @param {any} value - The value to be checked.\r\n * @returns {boolean} - Returns true if the value is an object, otherwise returns false.\r\n */\r\nexport function isObject(value: any): value is object {\r\n return value != null && typeof value === 'object' && !Array.isArray(value);\r\n}\r\n\r\n/**\r\n * Determines if a value is an array.\r\n *\r\n * @param value - The value to be checked.\r\n *\r\n * @return Whether the value is an array.\r\n */\r\nexport function isArray(value: any): value is any[] {\r\n return Array.isArray(value);\r\n}\r\n\r\n/**\r\n * Checks if a value is a function.\r\n *\r\n * @param {any} value - The value to be checked.\r\n * @return {boolean} - Returns true if the value is a function, otherwise returns false.\r\n */\r\nexport function isFunction(value: any): value is Function {\r\n return typeof value === 'function';\r\n}\r\n\r\n\r\n/**\r\n * Structural deep equality check.\r\n *\r\n * Compares primitives by value, and objects/arrays/Maps/Sets/Dates/RegExps\r\n * by structure. Handles circular references.\r\n *\r\n * @param a - First value.\r\n * @param b - Second value.\r\n * @returns `true` if `a` and `b` are structurally equal.\r\n */\r\nexport function deepEqual(a: unknown, b: unknown): boolean {\r\n return _deepEqual(a, b);\r\n}\r\n\r\n/**\r\n * Internal implementation of deep equality check.\r\n * @param a - First value.\r\n * @param b - Second value.\r\n * @param seen - Internal map used to handle circular references.\r\n */\r\nfunction _deepEqual(\r\n a: unknown,\r\n b: unknown,\r\n seen: WeakMap<object, unknown> = new WeakMap()\r\n): boolean {\r\n if (a === b) return true;\r\n if (a === null || b === null) return false;\r\n if (typeof a !== typeof b) return false;\r\n if (typeof a !== \"object\") return false;\r\n\r\n const objA = a as object;\r\n if (seen.has(objA)) return seen.get(objA) === b;\r\n seen.set(objA, b);\r\n\r\n if (a instanceof Date) return b instanceof Date && a.getTime() === b.getTime();\r\n if (a instanceof RegExp) return b instanceof RegExp && a.toString() === b.toString();\r\n if (Array.isArray(a) !== Array.isArray(b)) return false;\r\n\r\n if (a instanceof Map) {\r\n if (!(b instanceof Map) || a.size !== b.size) return false;\r\n for (const [k, v] of a) {\r\n if (!b.has(k) || !_deepEqual(v, b.get(k), seen)) return false;\r\n }\r\n return true;\r\n }\r\n\r\n if (a instanceof Set) {\r\n if (!(b instanceof Set) || a.size !== b.size) return false;\r\n for (const v of a) if (!b.has(v)) return false;\r\n return true;\r\n }\r\n\r\n const keysA = Reflect.ownKeys(a as object);\r\n const keysB = Reflect.ownKeys(b as object);\r\n if (keysA.length !== keysB.length) return false;\r\n\r\n for (const key of keysA) {\r\n if (!Object.prototype.hasOwnProperty.call(b, key)) return false;\r\n if (!_deepEqual((a as any)[key], (b as any)[key], seen)) return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\n\r\n/**\r\n * Submits an HTML form programmatically using the specified HTTP method (default is POST),\r\n * without using AJAX. Supports nested objects and arrays using bracket notation (e.g., `user[name]`, `tags[]`).\r\n *\r\n * @param url - The destination URL where the form will be submitted.\r\n * @param data - An object containing key-value pairs. Supports nested structures and arrays.\r\n * @param method - HTTP method to use: 'POST' or 'GET' (default: 'POST').\r\n * @param target - Optional parameter specifying the target for the form submission (e.g., '_blank', '_self', '_parent', '_top').\r\n */\r\n\r\n\r\n/**\r\n * Compares two objects or arrays to check if they have the same immediate fields and values,\r\n * or the same immediate elements if they are arrays (shallow equality check).\r\n *\r\n * @param {any} a - The first object or array.\r\n * @param {any} b - The second object or array.\r\n * @return {boolean} - Returns true if the objects/arrays are shallowly equal, otherwise false.\r\n */\r\nexport function shallowEqual(a: any, b: any): boolean {\r\n if (a === b) {\r\n return true;\r\n }\r\n\r\n if (a === null || b === null || typeof a !== typeof b) {\r\n return false;\r\n }\r\n\r\n if (Array.isArray(a) && Array.isArray(b)) {\r\n if (a.length !== b.length) {\r\n return false;\r\n }\r\n return a.every((value, index) => value === b[index]);\r\n }\r\n\r\n if (typeof a === \"object\" && typeof b === \"object\") {\r\n const keysA = Object.keys(a);\r\n const keysB = Object.keys(b);\r\n\r\n if (keysA.length !== keysB.length) {\r\n return false;\r\n }\r\n return keysA.every(key => b.hasOwnProperty(key) && a[key] === b[key]);\r\n }\r\n\r\n return false;\r\n}\r\n\r\n\r\n/**\r\n * Pauses the execution of an asynchronous function for a specified duration.\r\n *\r\n * @param {number} ms - The delay duration in milliseconds.\r\n * @return {Promise<void>} A promise that resolves after the specified delay.\r\n */\r\nexport async function delay(ms: number): Promise<void> {\r\n await new Promise(resolve => setTimeout(resolve, ms));\r\n}\r\n\r\n/**\r\n * Checks if a value is undefined.\r\n *\r\n * @param {any} value - The value to check.\r\n * @returns {boolean} - True if the value is undefined, false otherwise.\r\n */\r\nexport function isUndefined(value: any): value is undefined {\r\n return typeof value === 'undefined';\r\n}\r\n\r\n/**\r\n * Checks if a value is defined or not.\r\n *\r\n * @param {any} value - The value to be checked.\r\n *\r\n * @return {boolean} - True if the value is defined, false otherwise.\r\n */\r\nexport function isDefined(value: any): value is undefined {\r\n return typeof value !== 'undefined';\r\n}\r\n\r\n/**\r\n * Checks if a given value is null.\r\n *\r\n * @param {any} value - The value to check for null.\r\n * @return {boolean} - Returns true if the value is null, otherwise returns false.\r\n */\r\nexport function isNull(value: any): value is null {\r\n return value === null;\r\n}\r\n\r\n\r\n/**\r\n * Determines whether the given value is of type bigint.\r\n * @param {any} value - The value to be checked.\r\n * @return {boolean} - Returns true if the value is of type bigint, false otherwise.\r\n */\r\nexport function isBigInt(value: any): value is bigint {\r\n return typeof value === 'bigint';\r\n}\r\n\r\n/**\r\n * Checks if a given value is a symbol.\r\n *\r\n * @param {any} value - The value to be checked.\r\n * @return {boolean} - Returns true if the value is a symbol, false otherwise.\r\n */\r\nexport function isSymbol(value: any): value is symbol {\r\n return typeof value === 'symbol';\r\n}\r\n\r\n/**\r\n * Checks if a value is null or undefined.\r\n *\r\n * @param {any} value - The value to check.\r\n * @return {boolean} - Returns true if the value is null or undefined, false otherwise.\r\n * @deprecated\r\n */\r\nexport function isNullOrUndefined(value: any): boolean {\r\n return value === null || typeof value === 'undefined';\r\n}\r\n\r\n/**\r\n * Checks if a value is null or undefined.\r\n *\r\n * @param {any} value - The value to check.\r\n * @return {boolean} - Returns true if the value is null or undefined, false otherwise.\r\n\r\n */\r\nexport function isNullish(value: any): boolean {\r\n return value === null || typeof value === 'undefined';\r\n}\r\n\r\n/**\r\n * Checks if a given value is empty.\r\n *\r\n * @param {any} value - The value to check.\r\n * @return {boolean} - Returns true if the value is empty, otherwise returns false.\r\n */\r\nexport function isEmpty(value: any): boolean {\r\n return (Array.isArray(value) && value.length === 0) ||\r\n (typeof value === 'string' && value === '') ||\r\n value === null || typeof value === 'undefined';\r\n}\r\n\r\n/**\r\n * Check if a value is empty or contains only whitespace characters.\r\n *\r\n * @param {any} value - The value to check.\r\n * @return {boolean} Returns true if the value is empty or contains only whitespace characters, otherwise returns false.\r\n */\r\nexport function isEmptyOrWhitespace(value: any): boolean {\r\n return (Array.isArray(value) && value.length === 0) ||\r\n (typeof value === 'string' && value.trim() === '') ||\r\n value === null || typeof value === 'undefined';\r\n}\r\n\r\n\r\n/**\r\n * Converts an object into an array of key-value pairs.\r\n *\r\n * @param {Record<string, any>} obj - The object to convert.\r\n * @return {KeyValuePair<string, any>[]} - The array of key-value pairs.\r\n */\r\nexport function toPairs(obj: Record<string, any>): KeyValuePair<string, any>[] {\r\n\r\n let output = [];\r\n for (const key in obj) {\r\n output.push(new KeyValuePair(key, obj[key]));\r\n }\r\n return output;\r\n\r\n}\r\n\r\n/**\r\n * Creates an object composed of the picked object properties.\r\n *\r\n * @template T - The type of the source object.\r\n * @template K - The type of the keys to pick.\r\n * @param obj - The source object.\r\n * @param props - The property names to pick.\r\n * @returns A new object with the picked properties.\r\n */\r\nexport function pick<T extends object, K extends keyof T>(obj: T, props: K[]): Pick<T, K> {\r\n const result = {} as Pick<T, K>;\r\n if (obj === null || typeof obj !== 'object') {\r\n return result;\r\n }\r\n\r\n for (const key of props) {\r\n if (key in obj) {\r\n result[key] = obj[key];\r\n }\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Converts a given thing into a Promise.\r\n * @template T\r\n * @param {any} thing - The thing to be converted into a Promise.\r\n * @returns {Promise<T>} - A Promise representing the given thing.\r\n */\r\nexport function promisify<T>(thing: Resolvable<T>): Promise<T> {\r\n\r\n if (thing instanceof Promise)\r\n return thing;\r\n\r\n\r\n if (isFunction(thing)) {\r\n return new Promise<T>((resolve, reject) => {\r\n try {\r\n const result = thing();\r\n resolve(result);\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n }\r\n\r\n return Promise.resolve(thing);\r\n}\r\n\r\n\r\n/**\r\n * Create a deep, independent copy of a value.\r\n *\r\n * Supports primitives, plain objects, arrays, `Date`, `RegExp`, `Map`, `Set`,\r\n * symbol-keyed properties and circular references. Functions are copied by\r\n * reference. Class instances preserve their prototype.\r\n *\r\n * @template T - The value's type.\r\n * @param value - The value to clone.\r\n * @returns A deep clone of `value`.\r\n */\r\nexport function deepClone<T>(value: T): T {\r\n return _deepClone(value);\r\n}\r\n\r\n/**\r\n * Internal implementation of deep clone.\r\n * @param value - The value to clone.\r\n * @param seen - Internal map used to handle circular references.\r\n */\r\nfunction _deepClone<T>(\r\n value: T,\r\n seen: WeakMap<object, unknown> = new WeakMap()\r\n): T {\r\n if (value === null || typeof value !== \"object\") return value;\r\n\r\n const obj = value as unknown as object;\r\n if (seen.has(obj)) return seen.get(obj) as T;\r\n\r\n if (value instanceof Date) return new Date(value) as T;\r\n if (value instanceof RegExp) return new RegExp(value) as T;\r\n\r\n if (value instanceof Map) {\r\n const copy = new Map();\r\n seen.set(value, copy);\r\n for (const [k, v] of value) {\r\n copy.set(_deepClone(k, seen), _deepClone(v, seen));\r\n }\r\n return copy as T;\r\n }\r\n\r\n if (value instanceof Set) {\r\n const copy = new Set();\r\n seen.set(value, copy);\r\n for (const v of value) {\r\n copy.add(_deepClone(v, seen));\r\n }\r\n return copy as T;\r\n }\r\n\r\n const copy: any = Array.isArray(value)\r\n ? []\r\n : Object.create(Object.getPrototypeOf(value));\r\n\r\n seen.set(obj, copy);\r\n\r\n for (const key of Reflect.ownKeys(obj)) {\r\n copy[key] = _deepClone((value as any)[key], seen);\r\n }\r\n\r\n return copy as T;\r\n}\r\n\r\n\r\n/**\r\n * Returns the type of the given value.\r\n *\r\n * @param {any} value - The value to determine the type of.\r\n * @return {Type} - The type of the given value.\r\n * @deprecated use Type.of(...)\r\n */\r\nexport function getType(value: any): Type {\r\n\r\n return Type.of(value);\r\n}\r\n\r\n\r\n\r\n"]}
1
+ {"version":3,"file":"utilities.js","sourceRoot":"","sources":["../../src/utilities.ts"],"names":[],"mappings":"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","sourcesContent":["// noinspection JSUnusedGlobalSymbols\n\n\nimport KeyValuePair from \"./key-value-pair.js\";\nimport type {Resolvable, Constructor} from \"./types.js\";\nimport Type from \"./type.js\";\n\nexport function lazy<T extends object>(factory: () => T): T {\n let instance: T | null = null;\n\n const getInstance = (): T => {\n if (!instance) {\n instance = factory();\n }\n return instance;\n };\n\n return new Proxy({} as T, {\n get(_, prop, receiver) {\n return Reflect.get(getInstance(), prop, receiver);\n },\n set(_, prop, value, receiver) {\n return Reflect.set(getInstance(), prop, value, receiver);\n },\n has(_, prop) {\n return Reflect.has(getInstance(), prop);\n },\n deleteProperty(_, prop) {\n return Reflect.deleteProperty(getInstance(), prop);\n },\n ownKeys() {\n return Reflect.ownKeys(getInstance());\n },\n getOwnPropertyDescriptor(_, prop) {\n return Reflect.getOwnPropertyDescriptor(getInstance(), prop);\n },\n getPrototypeOf() {\n return Reflect.getPrototypeOf(getInstance());\n },\n });\n}\n\n/**\n * Checks if an object is iterable.\n *\n * @param {any} obj - The object to check.\n * @return {boolean} - Returns true if the object is iterable, otherwise false.\n */\nexport function isIterable(obj: any): boolean {\n return obj != null && typeof obj[Symbol.iterator] === 'function';\n}\n\n/**\n * Checks if a given value is a string.\n *\n * @param {*} value - The value to check.\n * @return {boolean} - Returns true if the value is a string, otherwise returns false.\n */\nexport function isString(value: any): value is string {\n return typeof value === 'string';\n}\n\n/**\n * Checks if a value is a number.\n *\n * @param {any} value - The value to check.\n * @return {boolean} - Returns true if the value is a number, otherwise false.\n */\nexport function isNumber(value: any): value is number {\n return typeof value === 'number';\n}\n\n/**\n * Checks if a given value is a boolean.\n *\n * @param {any} value - The value to be checked.\n *\n * @return {boolean} - Returns true if the value is a boolean, otherwise false.\n */\nexport function isBoolean(value: any): value is boolean {\n return typeof value === 'boolean';\n}\n\n/**\n * Checks if a value is an object.\n * @param {any} value - The value to be checked.\n * @returns {boolean} - Returns true if the value is an object, otherwise returns false.\n */\nexport function isObject(value: any): value is object {\n return value != null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/**\n * Determines if a value is an array.\n *\n * @param value - The value to be checked.\n *\n * @return Whether the value is an array.\n */\nexport function isArray(value: any): value is any[] {\n return Array.isArray(value);\n}\n\n/**\n * Checks if a value is a function.\n *\n * @param {any} value - The value to be checked.\n * @return {boolean} - Returns true if the value is a function, otherwise returns false.\n */\nexport function isFunction(value: any): value is Function {\n return typeof value === 'function';\n}\n\n\n/**\n * Structural deep equality check.\n *\n * Compares primitives by value, and objects/arrays/Maps/Sets/Dates/RegExps\n * by structure. Handles circular references.\n *\n * @param a - First value.\n * @param b - Second value.\n * @param includeInherited - Whether inherited enumerable properties are compared. Defaults to `true`.\n * @returns `true` if `a` and `b` are structurally equal.\n */\nexport function deepEqual(a: unknown, b: unknown, includeInherited = true): boolean {\n return _deepEqual(a, b, includeInherited);\n}\n\n/**\n * Internal implementation of deep equality check.\n * @param a - First value.\n * @param b - Second value.\n * @param includeInherited - Whether inherited enumerable properties are compared.\n * @param seen - Internal map used to handle circular references.\n */\nfunction _deepEqual(\n a: unknown,\n b: unknown,\n includeInherited: boolean,\n seen: Map<object, unknown> = new Map()\n): boolean {\n if (a === b) return true;\n if (a === null || b === null) return false;\n if (typeof a !== typeof b) return false;\n if (typeof a !== \"object\") return false;\n\n if (a instanceof Date || b instanceof Date) {\n return a instanceof Date && b instanceof Date && a.getTime() === b.getTime();\n }\n\n if (a instanceof RegExp || b instanceof RegExp) {\n return a instanceof RegExp && b instanceof RegExp && a.toString() === b.toString();\n }\n\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n\n if (a instanceof Map || b instanceof Map) {\n if (!(a instanceof Map) || !(b instanceof Map)) return false;\n }\n\n if (a instanceof Set || b instanceof Set) {\n if (!(a instanceof Set) || !(b instanceof Set)) return false;\n }\n\n const objA = a as object;\n if (seen.has(objA)) return seen.get(objA) === b;\n seen.set(objA, b);\n\n if (a instanceof Map && b instanceof Map) {\n return _deepEqualMap(a, b, includeInherited, seen);\n }\n\n if (a instanceof Set && b instanceof Set) {\n return _deepEqualSet(a, b, includeInherited, seen);\n }\n\n const objB = b as object;\n const keysA = _deepEqualKeys(objA, includeInherited);\n const keysB = _deepEqualKeys(objB, includeInherited);\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n if (!_deepEqualHasKey(objB, key, includeInherited)) return false;\n if (!_deepEqual((a as any)[key], (b as any)[key], includeInherited, seen)) return false;\n }\n\n return true;\n}\n\nfunction _deepEqualMap(\n a: Map<unknown, unknown>,\n b: Map<unknown, unknown>,\n includeInherited: boolean,\n seen: Map<object, unknown>\n): boolean {\n if (a.size !== b.size) return false;\n\n const entriesB = Array.from(b.entries());\n const matched = new Set<number>();\n\n for (const [keyA, valueA] of a) {\n let found = false;\n\n for (let i = 0; i < entriesB.length; i++) {\n if (matched.has(i)) continue;\n\n const [keyB, valueB] = entriesB[i];\n const candidateSeen = new Map(seen);\n if (\n _deepEqual(keyA, keyB, includeInherited, candidateSeen) &&\n _deepEqual(valueA, valueB, includeInherited, candidateSeen)\n ) {\n matched.add(i);\n _mergeDeepEqualSeen(candidateSeen, seen);\n found = true;\n break;\n }\n }\n\n if (!found) return false;\n }\n\n return true;\n}\n\nfunction _deepEqualSet(\n a: Set<unknown>,\n b: Set<unknown>,\n includeInherited: boolean,\n seen: Map<object, unknown>\n): boolean {\n if (a.size !== b.size) return false;\n\n const valuesB = Array.from(b.values());\n const matched = new Set<number>();\n\n for (const valueA of a) {\n let found = false;\n\n for (let i = 0; i < valuesB.length; i++) {\n if (matched.has(i)) continue;\n\n const candidateSeen = new Map(seen);\n if (_deepEqual(valueA, valuesB[i], includeInherited, candidateSeen)) {\n matched.add(i);\n _mergeDeepEqualSeen(candidateSeen, seen);\n found = true;\n break;\n }\n }\n\n if (!found) return false;\n }\n\n return true;\n}\n\nfunction _deepEqualKeys(value: object, includeInherited: boolean): PropertyKey[] {\n const keys: PropertyKey[] = [];\n const seen = new Set<PropertyKey>();\n const addKey = (key: PropertyKey) => {\n if (seen.has(key)) return;\n seen.add(key);\n keys.push(key);\n };\n\n for (const key of Reflect.ownKeys(value)) {\n addKey(key);\n }\n\n if (!includeInherited) return keys;\n\n let prototype = Object.getPrototypeOf(value);\n while (prototype !== null) {\n for (const key of Reflect.ownKeys(prototype)) {\n const descriptor = Object.getOwnPropertyDescriptor(prototype, key);\n if (descriptor?.enumerable) addKey(key);\n }\n prototype = Object.getPrototypeOf(prototype);\n }\n\n return keys;\n}\n\nfunction _deepEqualHasKey(value: object, key: PropertyKey, includeInherited: boolean): boolean {\n return includeInherited\n ? key in value\n : Object.prototype.hasOwnProperty.call(value, key);\n}\n\nfunction _mergeDeepEqualSeen(source: Map<object, unknown>, target: Map<object, unknown>): void {\n for (const [key, value] of source) {\n target.set(key, value);\n }\n}\n\n\n/**\n * Submits an HTML form programmatically using the specified HTTP method (default is POST),\n * without using AJAX. Supports nested objects and arrays using bracket notation (e.g., `user[name]`, `tags[]`).\n *\n * @param url - The destination URL where the form will be submitted.\n * @param data - An object containing key-value pairs. Supports nested structures and arrays.\n * @param method - HTTP method to use: 'POST' or 'GET' (default: 'POST').\n * @param target - Optional parameter specifying the target for the form submission (e.g., '_blank', '_self', '_parent', '_top').\n */\n\n\n/**\n * Compares two objects or arrays to check if they have the same immediate fields and values,\n * or the same immediate elements if they are arrays (shallow equality check).\n *\n * @param {any} a - The first object or array.\n * @param {any} b - The second object or array.\n * @return {boolean} - Returns true if the objects/arrays are shallowly equal, otherwise false.\n */\nexport function shallowEqual(a: any, b: any): boolean {\n if (a === b) {\n return true;\n }\n\n if (a === null || b === null || typeof a !== typeof b) {\n return false;\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) {\n return false;\n }\n return a.every((value, index) => value === b[index]);\n }\n\n if (typeof a === \"object\" && typeof b === \"object\") {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) {\n return false;\n }\n return keysA.every(key => Object.prototype.hasOwnProperty.call(b, key) && a[key] === b[key]);\n }\n\n return false;\n}\n\n\n/**\n * Pauses the execution of an asynchronous function for a specified duration.\n *\n * @param {number} ms - The delay duration in milliseconds.\n * @return {Promise<void>} A promise that resolves after the specified delay.\n */\nexport async function delay(ms: number): Promise<void> {\n await new Promise(resolve => setTimeout(resolve, ms));\n}\n\n/**\n * Checks if a value is undefined.\n *\n * @param {any} value - The value to check.\n * @returns {boolean} - True if the value is undefined, false otherwise.\n */\nexport function isUndefined(value: any): value is undefined {\n return typeof value === 'undefined';\n}\n\n/**\n * Checks if a value is defined or not.\n *\n * @param {any} value - The value to be checked.\n *\n * @return {boolean} - True if the value is defined, false otherwise.\n */\nexport function isDefined<T>(value: T): value is Exclude<T, undefined> {\n return typeof value !== 'undefined';\n}\n\n/**\n * Checks if a given value is null.\n *\n * @param {any} value - The value to check for null.\n * @return {boolean} - Returns true if the value is null, otherwise returns false.\n */\nexport function isNull(value: any): value is null {\n return value === null;\n}\n\n\n/**\n * Determines whether the given value is of type bigint.\n * @param {any} value - The value to be checked.\n * @return {boolean} - Returns true if the value is of type bigint, false otherwise.\n */\nexport function isBigInt(value: any): value is bigint {\n return typeof value === 'bigint';\n}\n\n/**\n * Checks if a given value is a symbol.\n *\n * @param {any} value - The value to be checked.\n * @return {boolean} - Returns true if the value is a symbol, false otherwise.\n */\nexport function isSymbol(value: any): value is symbol {\n return typeof value === 'symbol';\n}\n\n/**\n * Checks if a value is null or undefined.\n *\n * @param {any} value - The value to check.\n * @return {boolean} - Returns true if the value is null or undefined, false otherwise.\n * @deprecated\n */\nexport function isNullOrUndefined(value: any): boolean {\n return isNullish(value);\n}\n\n/**\n * Checks if a value is null or undefined.\n *\n * @param {any} value - The value to check.\n * @return {boolean} - Returns true if the value is null or undefined, false otherwise.\n\n */\nexport function isNullish(value: any): boolean {\n return value === null || typeof value === 'undefined';\n}\n\n/**\n * Checks if a given value is empty.\n *\n * @param {any} value - The value to check.\n * @return {boolean} - Returns true if the value is empty, otherwise returns false.\n */\nexport function isEmpty(value: any): boolean {\n if (isNullish(value)) return true;\n if (Array.isArray(value)) return value.length === 0;\n if (typeof value === 'string') return value === '';\n return false;\n}\n\n/**\n * Check if a value is empty or contains only whitespace characters.\n *\n * @param {any} value - The value to check.\n * @return {boolean} Returns true if the value is empty or contains only whitespace characters, otherwise returns false.\n */\nexport function isEmptyOrWhitespace(value: any): boolean {\n if (typeof value === 'string') return value.trim() === '';\n return isEmpty(value);\n}\n\n\n/**\n * Converts an object into an array of key-value pairs.\n *\n * @param {Record<string, any>} obj - The object to convert.\n * @return {KeyValuePair<string, any>[]} - The array of key-value pairs.\n */\nexport function toPairs(obj: Record<string, any>): KeyValuePair<string, any>[] {\n\n let output = [];\n for (const key in obj) {\n output.push(new KeyValuePair(key, obj[key]));\n }\n return output;\n\n}\n\n/**\n * Creates an object composed of the picked object properties.\n *\n * @template T - The type of the source object.\n * @template K - The type of the keys to pick.\n * @param obj - The source object.\n * @param props - The property names to pick.\n * @returns A new object with the picked properties.\n */\nexport function pick<T extends object, K extends keyof T>(obj: T, props: K[]): Pick<T, K> {\n const result = {} as Pick<T, K>;\n if (obj === null || typeof obj !== 'object') {\n return result;\n }\n\n for (const key of props) {\n if (key in obj) {\n result[key] = obj[key];\n }\n }\n return result;\n}\n\n/**\n * Converts a given thing into a Promise.\n * @template T\n * @param {any} thing - The thing to be converted into a Promise.\n * @returns {Promise<T>} - A Promise representing the given thing.\n */\nexport function promisify<T>(thing: Resolvable<T>): Promise<T> {\n\n if (thing instanceof Promise)\n return thing;\n\n\n if (isFunction(thing)) {\n return new Promise<T>((resolve, reject) => {\n try {\n const result = thing();\n resolve(result);\n } catch (error) {\n reject(error);\n }\n });\n }\n\n return Promise.resolve(thing);\n}\n\n\n/**\n * Create a deep, independent copy of a value.\n *\n * Supports primitives, plain objects, arrays, `Date`, `RegExp`, `Map`, `Set`,\n * symbol-keyed properties and circular references. Functions are copied by\n * reference. Class instances preserve their prototype.\n *\n * @template T - The value's type.\n * @param value - The value to clone.\n * @returns A deep clone of `value`.\n */\nexport function deepClone<T>(value: T): T {\n return _deepClone(value);\n}\n\n/**\n * Internal implementation of deep clone.\n * @param value - The value to clone.\n * @param seen - Internal map used to handle circular references.\n */\nfunction _deepClone<T>(\n value: T,\n seen: WeakMap<object, unknown> = new WeakMap()\n): T {\n if (value === null || typeof value !== \"object\") return value;\n\n const obj = value as unknown as object;\n if (seen.has(obj)) return seen.get(obj) as T;\n\n if (value instanceof Date) return new Date(value) as T;\n if (value instanceof RegExp) {\n const copy = new RegExp(value);\n copy.lastIndex = value.lastIndex;\n return copy as T;\n }\n\n if (value instanceof Map) {\n const copy = new Map();\n seen.set(value, copy);\n for (const [k, v] of value) {\n copy.set(_deepClone(k, seen), _deepClone(v, seen));\n }\n return copy as T;\n }\n\n if (value instanceof Set) {\n const copy = new Set();\n seen.set(value, copy);\n for (const v of value) {\n copy.add(_deepClone(v, seen));\n }\n return copy as T;\n }\n\n const copy: any = Array.isArray(value)\n ? []\n : Object.create(Object.getPrototypeOf(value));\n\n seen.set(obj, copy);\n\n for (const key of Reflect.ownKeys(obj)) {\n copy[key] = _deepClone((value as any)[key], seen);\n }\n\n return copy as T;\n}\n\n\n/**\n * Returns the type of the given value.\n *\n * @param {any} value - The value to determine the type of.\n * @return {Type} - The type of the given value.\n * @deprecated use Type.of(...)\n */\nexport function getType(value: any): Type {\n\n return Type.of(value);\n}\n\n/**\n * Patches a method onto a class prototype.\n *\n * This function allows adding new methods to existing classes (monkey-patching).\n * If the method name already exists on the prototype, a warning is issued\n * and the method is not overwritten.\n *\n * If `method` is a function, its name is extracted (if not provided) and\n * it is wrapped to pass the instance (`this`) as the first argument.\n *\n * @template T - The type of the class constructor.\n * @param {T} target - The class constructor whose prototype will be patched.\n * @param {any} method - The implementation or value to patch.\n * @param {string | symbol} [name] - Optional name for the method. If not provided and method is a function, method.name is used.\n * @returns {boolean} Returns `true` if the method was successfully added, or `false` if it already existed.\n */\nexport function monkeyPatch<T extends Constructor>(\n target: T,\n method: any,\n name?: string | symbol\n): boolean {\n\n let methodName;\n let methodValue = method;\n\n if (typeof method === 'function') {\n methodName = name ?? (method as Function).name;\n methodValue = function (this: any, ...args: any[]) {\n return method.apply(this, [this, ...args]);\n };\n } else {\n methodName = name;\n }\n\n if (!methodName) {\n throw new Error(\"Monkey patch failed: No name provided and could not be extracted from function.\");\n }\n\n if (methodName in target.prototype) {\n console.warn(`Method '${String(methodName)}' already exists on ${target.name}`);\n return false;\n }\n\n Object.defineProperty(target.prototype, methodName, {\n value: methodValue,\n writable: true,\n configurable: true,\n enumerable: false\n });\n\n return true;\n}"]}
package/dist/esm/array.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { monkeyPatch } from "./utilities.js";
1
2
  /**
2
3
  * Removes all given values from the provided array and returns the number of removed elements.
3
4
  * The operation mutates the original array.
@@ -9,8 +10,8 @@
9
10
  export function pull(array, ...items) {
10
11
  let output = 0;
11
12
  for (const item of items) {
12
- const index = array.indexOf(item);
13
- if (index !== -1) {
13
+ let index;
14
+ while ((index = array.findIndex(val => Object.is(val, item))) !== -1) {
14
15
  array.splice(index, 1);
15
16
  output++;
16
17
  }
@@ -76,4 +77,22 @@ export function pushIfAbsent(array, element) {
76
77
  }
77
78
  return false;
78
79
  }
80
+ /**
81
+ * Patches the Array prototype with the methods defined in this module:
82
+ * - pull
83
+ * - chunk
84
+ * - clear
85
+ * - remove
86
+ * - pushIfAbsent
87
+ *
88
+ * Each method is added only if it doesn't already exist on Array.prototype.
89
+ */
90
+ export function patchArray() {
91
+ const target = Array;
92
+ monkeyPatch(target, pull);
93
+ monkeyPatch(target, chunk);
94
+ monkeyPatch(target, clear);
95
+ monkeyPatch(target, remove);
96
+ monkeyPatch(target, pushIfAbsent);
97
+ }
79
98
  //# sourceMappingURL=array.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"array.js","sourceRoot":"","sources":["../../src/array.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,UAAU,IAAI,CAAI,KAAe,EAAE,GAAG,KAAe;IAEvD,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACf,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACvB,MAAM,EAAE,CAAC;QACb,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,KAAK,CAAI,KAAe,EAAE,IAAY;IAClD,IAAI,IAAI,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,KAAK,CAAI,KAAe;IACpC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AACrB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,MAAM,CAAI,KAAe,EAAC,SAAuB;IAC7D,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QACtB,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACvB,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,gBAAgB;QACxC,CAAC;aAAM,CAAC;YACJ,CAAC,EAAE,CAAC;QACR,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACnB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAI,KAAe,EAAE,OAAU;IACvD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpB,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC","sourcesContent":["import type {Predicate} from \"./types.js\";\r\n\r\n/**\r\n * Removes all given values from the provided array and returns the number of removed elements.\r\n * The operation mutates the original array.\r\n * @template T\r\n * @param {Array<T>} array - The array to modify by removing specified items.\r\n * @param {...T} items - The values to remove from the array.\r\n * @return {number} The number of elements removed from the array.\r\n */\r\nexport function pull<T>(array: Array<T>, ...items: Array<T>): number {\r\n\r\n let output = 0;\r\n for (const item of items) {\r\n const index = array.indexOf(item);\r\n if (index !== -1) {\r\n array.splice(index, 1);\r\n output++;\r\n }\r\n }\r\n return output;\r\n}\r\n\r\n/**\r\n * Splits an array into chunks of a given size.\r\n * @template T\r\n * @param {Array<T>} array - The array to split.\r\n * @param {number} size - The size of each chunk.\r\n * @return {Array<Array<T>>} The array of chunks.\r\n */\r\nexport function chunk<T>(array: Array<T>, size: number): Array<Array<T>> {\r\n if (size <= 0) throw new Error(\"Size must be greater than 0\");\r\n const result: Array<Array<T>> = [];\r\n for (let i = 0; i < array.length; i += size) {\r\n result.push(array.slice(i, i + size));\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Removes all elements from the array, mutating it.\r\n * @template T\r\n * @param {Array<T>} array - The array to clear.\r\n */\r\nexport function clear<T>(array: Array<T>): void {\r\n array.length = 0;\r\n}\r\n\r\n/**\r\n * Removes all elements from the array that satisfy the predicate.\r\n * The operation mutates the original array.\r\n * @template T\r\n * @return {Array<T>} An array of removed elements.\r\n */\r\nexport function remove<T>(array: Array<T>,predicate: Predicate<T>): Array<T> {\r\n const removed: Array<T> = [];\r\n let i = 0;\r\n\r\n while (i < array.length) {\r\n if (predicate(array[i])) {\r\n removed.push(array[i]);\r\n array.splice(i, 1); // muta el array\r\n } else {\r\n i++;\r\n }\r\n }\r\n\r\n return removed;\r\n}\r\n\r\n/**\r\n * Adds an element to the array if it's not already present.\r\n * The operation mutates the original array.\r\n * @template T\r\n * @param {Array<T>} array - The array to modify.\r\n * @param {T} element - The element to add if absent.\r\n * @return {boolean} True if the element was added, false otherwise.\r\n */\r\nexport function pushIfAbsent<T>(array: Array<T>, element: T): boolean {\r\n if (!array.includes(element)) {\r\n array.push(element);\r\n return true;\r\n }\r\n return false;\r\n}"]}
1
+ {"version":3,"file":"array.js","sourceRoot":"","sources":["../../src/array.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAa3C;;;;;;;GAOG;AACH,MAAM,UAAU,IAAI,CAAI,KAAe,EAAE,GAAG,KAAe;IAEvD,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,IAAI,KAAK,CAAC;QACV,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YACnE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACvB,MAAM,EAAE,CAAC;QACb,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,KAAK,CAAI,KAAe,EAAE,IAAY;IAClD,IAAI,IAAI,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,KAAK,CAAI,KAAe;IACpC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AACrB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,MAAM,CAAI,KAAe,EAAC,SAAuB;IAC7D,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QACtB,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACvB,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,gBAAgB;QACxC,CAAC;aAAM,CAAC;YACJ,CAAC,EAAE,CAAC;QACR,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACnB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAI,KAAe,EAAE,OAAU;IACvD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpB,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,UAAU;IACtB,MAAM,MAAM,GAAG,KAA2C,CAAC;IAE3D,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC1B,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC3B,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC3B,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AACtC,CAAC","sourcesContent":["import type {Constructor, Predicate} from \"./types.js\";\nimport {monkeyPatch} from \"./utilities.js\";\n\ndeclare global {\n interface Array<T> {\n pull(...items: Array<T>): number;\n chunk(size: number): Array<Array<T>>;\n clear(): void;\n remove(predicate: Predicate<T>): Array<T>;\n pushIfAbsent(element: T): boolean;\n }\n}\n\n\n/**\n * Removes all given values from the provided array and returns the number of removed elements.\n * The operation mutates the original array.\n * @template T\n * @param {Array<T>} array - The array to modify by removing specified items.\n * @param {...T} items - The values to remove from the array.\n * @return {number} The number of elements removed from the array.\n */\nexport function pull<T>(array: Array<T>, ...items: Array<T>): number {\n\n let output = 0;\n for (const item of items) {\n let index;\n while ((index = array.findIndex(val => Object.is(val, item))) !== -1) {\n array.splice(index, 1);\n output++;\n }\n }\n return output;\n}\n\n/**\n * Splits an array into chunks of a given size.\n * @template T\n * @param {Array<T>} array - The array to split.\n * @param {number} size - The size of each chunk.\n * @return {Array<Array<T>>} The array of chunks.\n */\nexport function chunk<T>(array: Array<T>, size: number): Array<Array<T>> {\n if (size <= 0) throw new Error(\"Size must be greater than 0\");\n const result: Array<Array<T>> = [];\n for (let i = 0; i < array.length; i += size) {\n result.push(array.slice(i, i + size));\n }\n return result;\n}\n\n/**\n * Removes all elements from the array, mutating it.\n * @template T\n * @param {Array<T>} array - The array to clear.\n */\nexport function clear<T>(array: Array<T>): void {\n array.length = 0;\n}\n\n/**\n * Removes all elements from the array that satisfy the predicate.\n * The operation mutates the original array.\n * @template T\n * @return {Array<T>} An array of removed elements.\n */\nexport function remove<T>(array: Array<T>,predicate: Predicate<T>): Array<T> {\n const removed: Array<T> = [];\n let i = 0;\n\n while (i < array.length) {\n if (predicate(array[i])) {\n removed.push(array[i]);\n array.splice(i, 1); // muta el array\n } else {\n i++;\n }\n }\n\n return removed;\n}\n\n/**\n * Adds an element to the array if it's not already present.\n * The operation mutates the original array.\n * @template T\n * @param {Array<T>} array - The array to modify.\n * @param {T} element - The element to add if absent.\n * @return {boolean} True if the element was added, false otherwise.\n */\nexport function pushIfAbsent<T>(array: Array<T>, element: T): boolean {\n if (!array.includes(element)) {\n array.push(element);\n return true;\n }\n return false;\n}\n\n/**\n * Patches the Array prototype with the methods defined in this module:\n * - pull\n * - chunk\n * - clear\n * - remove\n * - pushIfAbsent\n *\n * Each method is added only if it doesn't already exist on Array.prototype.\n */\nexport function patchArray(): void {\n const target = Array as unknown as Constructor<Array<any>>;\n\n monkeyPatch(target, pull);\n monkeyPatch(target, chunk);\n monkeyPatch(target, clear);\n monkeyPatch(target, remove);\n monkeyPatch(target, pushIfAbsent);\n}"]}
@@ -1,10 +1,19 @@
1
1
  import { delay } from "./utilities.js";
2
+ function normalizeMaxConcurrency(value) {
3
+ if (!Number.isInteger(value) || value < 1) {
4
+ throw new RangeError("maxConcurrency must be a positive integer");
5
+ }
6
+ return value;
7
+ }
8
+ function normalizeCheckInterval(value) {
9
+ return Number.isFinite(value) ? Math.max(0, value) : 0;
10
+ }
2
11
  export default class AsyncPoolExecutor {
3
12
  get maxConcurrency() {
4
13
  return this._maxConcurrency;
5
14
  }
6
15
  set maxConcurrency(value) {
7
- this._maxConcurrency = value;
16
+ this._maxConcurrency = normalizeMaxConcurrency(value);
8
17
  }
9
18
  /**
10
19
  * @param {number} maxConcurrency - The maximum number of concurrent tasks allowed.
@@ -12,8 +21,8 @@ export default class AsyncPoolExecutor {
12
21
  */
13
22
  constructor(maxConcurrency, checkInterval = 50) {
14
23
  this._taskQueue = [];
15
- this._maxConcurrency = maxConcurrency;
16
- this._checkIntervalMs = checkInterval;
24
+ this._maxConcurrency = normalizeMaxConcurrency(maxConcurrency);
25
+ this._checkIntervalMs = normalizeCheckInterval(checkInterval);
17
26
  this._activeTasks = 0;
18
27
  }
19
28
  /**
@@ -22,20 +31,25 @@ export default class AsyncPoolExecutor {
22
31
  * @param {Supplier<T>} task - The deferred task to be executed asynchronously.
23
32
  */
24
33
  submit(task) {
25
- this._taskQueue.push(task);
26
- if (this._proccess != null)
27
- return;
28
- this._proccess = setTimeout(async () => {
34
+ const promise = new Promise((resolve, reject) => {
35
+ this._taskQueue.push({ task, resolve, reject });
36
+ });
37
+ if (this._process != null)
38
+ return promise;
39
+ this._process = setTimeout(async () => {
29
40
  while (this._taskQueue.length > 0) {
30
41
  while (this._activeTasks >= this._maxConcurrency) {
31
42
  await delay(this._checkIntervalMs);
32
43
  }
33
- const task = this._taskQueue.shift();
34
- if (task) {
44
+ const queuedTask = this._taskQueue.shift();
45
+ if (queuedTask) {
35
46
  this._activeTasks++;
36
47
  setTimeout(async () => {
37
48
  try {
38
- await task();
49
+ queuedTask.resolve(await queuedTask.task());
50
+ }
51
+ catch (error) {
52
+ queuedTask.reject(error);
39
53
  }
40
54
  finally {
41
55
  this._activeTasks--;
@@ -43,8 +57,9 @@ export default class AsyncPoolExecutor {
43
57
  });
44
58
  }
45
59
  }
46
- this._proccess = null;
60
+ this._process = null;
47
61
  }, 0);
62
+ return promise;
48
63
  }
49
64
  /**
50
65
  * Waits until all tasks (both queued and active) are completed.
@@ -1 +1 @@
1
- {"version":3,"file":"async-pool-executor.js","sourceRoot":"","sources":["../../src/async-pool-executor.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,KAAK,EAAC,MAAM,gBAAgB,CAAC;AAErC,MAAM,CAAC,OAAO,OAAO,iBAAiB;IAGlC,IAAI,cAAc;QACd,OAAO,IAAI,CAAC,eAAe,CAAC;IAChC,CAAC;IAED,IAAI,cAAc,CAAC,KAAa;QAC5B,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;IAEjC,CAAC;IAQD;;;OAGG;IACH,YAAY,cAAsB,EAAE,gBAAwB,EAAE;QAPtD,eAAU,GAAyB,EAAE,CAAC;QAQ1C,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC;QACtC,IAAI,CAAC,gBAAgB,GAAG,aAAa,CAAC;QACtC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,IAAmB;QAE7B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE3B,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI;YACtB,OAAO;QAEX,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE;YAEnC,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAEhC,OAAO,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;oBAC/C,MAAM,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBACvC,CAAC;gBAED,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;gBACrC,IAAI,IAAI,EAAE,CAAC;oBACP,IAAI,CAAC,YAAY,EAAE,CAAC;oBACpB,UAAU,CAAC,KAAK,IAAI,EAAE;wBAClB,IAAI,CAAC;4BACD,MAAM,IAAI,EAAE,CAAC;wBACjB,CAAC;gCAAS,CAAC;4BACP,IAAI,CAAC,YAAY,EAAE,CAAC;wBACxB,CAAC;oBACL,CAAC,CAAC,CAAC;gBACP,CAAC;YAGL,CAAC;YAED,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAC1B,CAAC,EAAE,CAAC,CAAC,CAAC;IAGV,CAAC;IAGD;;;;;OAKG;IACI,KAAK,CAAC,QAAQ;QACjB,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;YACzD,MAAM,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACvC,CAAC;IACL,CAAC;CACJ","sourcesContent":["import type {Supplier} from \"./types.js\";\r\nimport {delay} from \"./utilities.js\";\r\n\r\nexport default class AsyncPoolExecutor {\r\n private _checkIntervalMs: number;\r\n\r\n get maxConcurrency(): number {\r\n return this._maxConcurrency;\r\n }\r\n\r\n set maxConcurrency(value: number) {\r\n this._maxConcurrency = value;\r\n\r\n }\r\n\r\n private _proccess: any;\r\n private _maxConcurrency: number;\r\n private _activeTasks: number;\r\n private _taskQueue: Array<Supplier<any>> = [];\r\n\r\n\r\n /**\r\n * @param {number} maxConcurrency - The maximum number of concurrent tasks allowed.\r\n * @param {number} [checkInterval=50] - The interval, in milliseconds, to check for capacity to run new tasks. Defaults to 50 ms.\r\n */\r\n constructor(maxConcurrency: number, checkInterval: number = 50) {\r\n this._maxConcurrency = maxConcurrency;\r\n this._checkIntervalMs = checkInterval;\r\n this._activeTasks = 0;\r\n }\r\n\r\n /**\r\n * Submits a deferred task to a queue for asynchronous execution and returns a Promise resolving to its result.\r\n * @template T\r\n * @param {Supplier<T>} task - The deferred task to be executed asynchronously.\r\n */\r\n public submit(task: Supplier<any>): void {\r\n\r\n this._taskQueue.push(task);\r\n\r\n if (this._proccess != null)\r\n return;\r\n\r\n this._proccess = setTimeout(async () => {\r\n\r\n while (this._taskQueue.length > 0) {\r\n\r\n while (this._activeTasks >= this._maxConcurrency) {\r\n await delay(this._checkIntervalMs);\r\n }\r\n\r\n const task = this._taskQueue.shift();\r\n if (task) {\r\n this._activeTasks++;\r\n setTimeout(async () => {\r\n try {\r\n await task();\r\n } finally {\r\n this._activeTasks--;\r\n }\r\n });\r\n }\r\n\r\n\r\n }\r\n\r\n this._proccess = null;\r\n }, 0);\r\n\r\n\r\n }\r\n\r\n\r\n /**\r\n * Waits until all tasks (both queued and active) are completed.\r\n * This method resolves only when there are no pending tasks.\r\n *\r\n * @return {Promise<void>} A promise that resolves when all tasks are complete.\r\n */\r\n public async shutdown(): Promise<void> {\r\n while (this._taskQueue.length > 0 || this._activeTasks > 0) {\r\n await delay(this._checkIntervalMs);\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"async-pool-executor.js","sourceRoot":"","sources":["../../src/async-pool-executor.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,KAAK,EAAC,MAAM,gBAAgB,CAAC;AAQrC,SAAS,uBAAuB,CAAC,KAAa;IAC1C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,UAAU,CAAC,2CAA2C,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAa;IACzC,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,CAAC,OAAO,OAAO,iBAAiB;IAGlC,IAAI,cAAc;QACd,OAAO,IAAI,CAAC,eAAe,CAAC;IAChC,CAAC;IAED,IAAI,cAAc,CAAC,KAAa;QAC5B,IAAI,CAAC,eAAe,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAE1D,CAAC;IAQD;;;OAGG;IACH,YAAY,cAAsB,EAAE,gBAAwB,EAAE;QAPtD,eAAU,GAA2B,EAAE,CAAC;QAQ5C,IAAI,CAAC,eAAe,GAAG,uBAAuB,CAAC,cAAc,CAAC,CAAC;QAC/D,IAAI,CAAC,gBAAgB,GAAG,sBAAsB,CAAC,aAAa,CAAC,CAAC;QAC9D,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAI,IAA8B;QAC3C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC/C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAC,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI;YACrB,OAAO,OAAO,CAAC;QAEnB,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE;YAElC,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAEhC,OAAO,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;oBAC/C,MAAM,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBACvC,CAAC;gBAED,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;gBAC3C,IAAI,UAAU,EAAE,CAAC;oBACb,IAAI,CAAC,YAAY,EAAE,CAAC;oBACpB,UAAU,CAAC,KAAK,IAAI,EAAE;wBAClB,IAAI,CAAC;4BACD,UAAU,CAAC,OAAO,CAAC,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;wBAChD,CAAC;wBAAC,OAAO,KAAK,EAAE,CAAC;4BACb,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;wBAC7B,CAAC;gCAAS,CAAC;4BACP,IAAI,CAAC,YAAY,EAAE,CAAC;wBACxB,CAAC;oBACL,CAAC,CAAC,CAAC;gBACP,CAAC;YAGL,CAAC;YAED,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACzB,CAAC,EAAE,CAAC,CAAC,CAAC;QAEN,OAAO,OAAO,CAAC;IAGnB,CAAC;IAGD;;;;;OAKG;IACI,KAAK,CAAC,QAAQ;QACjB,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;YACzD,MAAM,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACvC,CAAC;IACL,CAAC;CACJ","sourcesContent":["import type {Supplier} from \"./types.js\";\nimport {delay} from \"./utilities.js\";\n\ntype QueuedTask<T> = {\n task: Supplier<T | Promise<T>>;\n resolve: (value: T) => void;\n reject: (reason?: any) => void;\n};\n\nfunction normalizeMaxConcurrency(value: number): number {\n if (!Number.isInteger(value) || value < 1) {\n throw new RangeError(\"maxConcurrency must be a positive integer\");\n }\n return value;\n}\n\nfunction normalizeCheckInterval(value: number): number {\n return Number.isFinite(value) ? Math.max(0, value) : 0;\n}\n\nexport default class AsyncPoolExecutor {\n private _checkIntervalMs: number;\n\n get maxConcurrency(): number {\n return this._maxConcurrency;\n }\n\n set maxConcurrency(value: number) {\n this._maxConcurrency = normalizeMaxConcurrency(value);\n\n }\n\n private _process: any;\n private _maxConcurrency: number;\n private _activeTasks: number;\n private _taskQueue: Array<QueuedTask<any>> = [];\n\n\n /**\n * @param {number} maxConcurrency - The maximum number of concurrent tasks allowed.\n * @param {number} [checkInterval=50] - The interval, in milliseconds, to check for capacity to run new tasks. Defaults to 50 ms.\n */\n constructor(maxConcurrency: number, checkInterval: number = 50) {\n this._maxConcurrency = normalizeMaxConcurrency(maxConcurrency);\n this._checkIntervalMs = normalizeCheckInterval(checkInterval);\n this._activeTasks = 0;\n }\n\n /**\n * Submits a deferred task to a queue for asynchronous execution and returns a Promise resolving to its result.\n * @template T\n * @param {Supplier<T>} task - The deferred task to be executed asynchronously.\n */\n public submit<T>(task: Supplier<T | Promise<T>>): Promise<T> {\n const promise = new Promise<T>((resolve, reject) => {\n this._taskQueue.push({task, resolve, reject});\n });\n\n if (this._process != null)\n return promise;\n\n this._process = setTimeout(async () => {\n\n while (this._taskQueue.length > 0) {\n\n while (this._activeTasks >= this._maxConcurrency) {\n await delay(this._checkIntervalMs);\n }\n\n const queuedTask = this._taskQueue.shift();\n if (queuedTask) {\n this._activeTasks++;\n setTimeout(async () => {\n try {\n queuedTask.resolve(await queuedTask.task());\n } catch (error) {\n queuedTask.reject(error);\n } finally {\n this._activeTasks--;\n }\n });\n }\n\n\n }\n\n this._process = null;\n }, 0);\n\n return promise;\n\n\n }\n\n\n /**\n * Waits until all tasks (both queued and active) are completed.\n * This method resolves only when there are no pending tasks.\n *\n * @return {Promise<void>} A promise that resolves when all tasks are complete.\n */\n public async shutdown(): Promise<void> {\n while (this._taskQueue.length > 0 || this._activeTasks > 0) {\n await delay(this._checkIntervalMs);\n }\n }\n}\n"]}