@develia/commons 0.4.23 → 0.4.25

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 (354) hide show
  1. package/dist/array.d.ts.map +1 -0
  2. package/dist/array.js.map +1 -0
  3. package/dist/async-pool-executor.d.ts.map +1 -0
  4. package/dist/async-pool-executor.js.map +1 -0
  5. package/dist/browser/form-utilities.d.ts.map +1 -0
  6. package/dist/browser/form-utilities.js.map +1 -0
  7. package/dist/browser/geo-location.d.ts.map +1 -0
  8. package/dist/browser/geo-location.js.map +1 -0
  9. package/dist/browser/index.d.ts.map +1 -0
  10. package/dist/browser/index.js.map +1 -0
  11. package/dist/browser/native-bridge.d.ts.map +1 -0
  12. package/dist/browser/native-bridge.js.map +1 -0
  13. package/dist/cancellable-promise.d.ts.map +1 -0
  14. package/dist/cancellable-promise.js.map +1 -0
  15. package/dist/clean-url-search-params.d.ts.map +1 -0
  16. package/dist/clean-url-search-params.js.map +1 -0
  17. package/dist/collections/cache-dictionary.d.ts.map +1 -0
  18. package/dist/collections/cache-dictionary.js.map +1 -0
  19. package/dist/collections/default-map.d.ts.map +1 -0
  20. package/dist/collections/default-map.js.map +1 -0
  21. package/dist/collections/default-weak-map.d.ts.map +1 -0
  22. package/dist/collections/default-weak-map.js.map +1 -0
  23. package/dist/collections/from.d.ts.map +1 -0
  24. package/dist/collections/from.js.map +1 -0
  25. package/dist/collections/index.d.ts.map +1 -0
  26. package/dist/collections/index.js.map +1 -0
  27. package/dist/debouncer.d.ts +60 -0
  28. package/dist/debouncer.d.ts.map +1 -0
  29. package/dist/debouncer.js +118 -0
  30. package/dist/debouncer.js.map +1 -0
  31. package/dist/draft.d.ts.map +1 -0
  32. package/dist/draft.js.map +1 -0
  33. package/dist/event-bus.d.ts.map +1 -0
  34. package/dist/event-bus.js.map +1 -0
  35. package/dist/{types/functions.d.ts → functions.d.ts} +5 -35
  36. package/dist/functions.d.ts.map +1 -0
  37. package/dist/{esm/functions.js → functions.js} +0 -85
  38. package/dist/functions.js.map +1 -0
  39. package/dist/{types/index.d.ts → index.d.ts} +4 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/{web/index.js → index.js} +2 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/key-value-pair.d.ts.map +1 -0
  44. package/dist/key-value-pair.js.map +1 -0
  45. package/dist/keyed-debouncer.d.ts +56 -0
  46. package/dist/keyed-debouncer.d.ts.map +1 -0
  47. package/dist/keyed-debouncer.js +109 -0
  48. package/dist/keyed-debouncer.js.map +1 -0
  49. package/dist/lazy.d.ts.map +1 -0
  50. package/dist/lazy.js.map +1 -0
  51. package/dist/math.d.ts.map +1 -0
  52. package/dist/math.js.map +1 -0
  53. package/dist/order.d.ts.map +1 -0
  54. package/dist/order.js.map +1 -0
  55. package/dist/parse.d.ts.map +1 -0
  56. package/dist/parse.js.map +1 -0
  57. package/dist/patch.d.ts.map +1 -0
  58. package/dist/patch.js.map +1 -0
  59. package/dist/range.d.ts.map +1 -0
  60. package/dist/range.js.map +1 -0
  61. package/dist/result.d.ts.map +1 -0
  62. package/dist/result.js.map +1 -0
  63. package/dist/stopwatch.d.ts.map +1 -0
  64. package/dist/stopwatch.js.map +1 -0
  65. package/dist/string.d.ts.map +1 -0
  66. package/dist/string.js.map +1 -0
  67. package/dist/timer.d.ts.map +1 -0
  68. package/dist/timer.js.map +1 -0
  69. package/dist/timespan.d.ts.map +1 -0
  70. package/dist/timespan.js.map +1 -0
  71. package/dist/triggers.d.ts.map +1 -0
  72. package/dist/triggers.js.map +1 -0
  73. package/dist/type-code.d.ts.map +1 -0
  74. package/dist/type-code.js.map +1 -0
  75. package/dist/type.d.ts.map +1 -0
  76. package/dist/type.js.map +1 -0
  77. package/dist/types.d.ts.map +1 -0
  78. package/dist/types.js.map +1 -0
  79. package/dist/{types/utilities.d.ts → utilities.d.ts} +8 -3
  80. package/dist/utilities.d.ts.map +1 -0
  81. package/dist/{web/utilities.js → utilities.js} +27 -4
  82. package/dist/utilities.js.map +1 -0
  83. package/package.json +13 -62
  84. package/src/debouncer.ts +135 -0
  85. package/src/functions.ts +5 -114
  86. package/src/index.ts +4 -0
  87. package/src/keyed-debouncer.ts +121 -0
  88. package/src/utilities.ts +30 -4
  89. package/dist/cjs/array.js +0 -106
  90. package/dist/cjs/array.js.map +0 -1
  91. package/dist/cjs/async-pool-executor.js +0 -79
  92. package/dist/cjs/async-pool-executor.js.map +0 -1
  93. package/dist/cjs/browser/form-utilities.js +0 -162
  94. package/dist/cjs/browser/form-utilities.js.map +0 -1
  95. package/dist/cjs/browser/geo-location.js +0 -78
  96. package/dist/cjs/browser/geo-location.js.map +0 -1
  97. package/dist/cjs/browser/index.js +0 -99
  98. package/dist/cjs/browser/index.js.map +0 -1
  99. package/dist/cjs/browser/native-bridge.js +0 -81
  100. package/dist/cjs/browser/native-bridge.js.map +0 -1
  101. package/dist/cjs/cancellable-promise.js +0 -81
  102. package/dist/cjs/cancellable-promise.js.map +0 -1
  103. package/dist/cjs/clean-url-search-params.js +0 -34
  104. package/dist/cjs/clean-url-search-params.js.map +0 -1
  105. package/dist/cjs/collections/cache-dictionary.js +0 -102
  106. package/dist/cjs/collections/cache-dictionary.js.map +0 -1
  107. package/dist/cjs/collections/default-map.js +0 -45
  108. package/dist/cjs/collections/default-map.js.map +0 -1
  109. package/dist/cjs/collections/default-weak-map.js +0 -46
  110. package/dist/cjs/collections/default-weak-map.js.map +0 -1
  111. package/dist/cjs/collections/from.js +0 -778
  112. package/dist/cjs/collections/from.js.map +0 -1
  113. package/dist/cjs/collections/index.js +0 -15
  114. package/dist/cjs/collections/index.js.map +0 -1
  115. package/dist/cjs/draft.js +0 -225
  116. package/dist/cjs/draft.js.map +0 -1
  117. package/dist/cjs/event-bus.js +0 -71
  118. package/dist/cjs/event-bus.js.map +0 -1
  119. package/dist/cjs/functions.js +0 -348
  120. package/dist/cjs/functions.js.map +0 -1
  121. package/dist/cjs/index.js +0 -80
  122. package/dist/cjs/index.js.map +0 -1
  123. package/dist/cjs/key-value-pair.js +0 -22
  124. package/dist/cjs/key-value-pair.js.map +0 -1
  125. package/dist/cjs/lazy.js +0 -29
  126. package/dist/cjs/lazy.js.map +0 -1
  127. package/dist/cjs/math.js +0 -37
  128. package/dist/cjs/math.js.map +0 -1
  129. package/dist/cjs/order.js +0 -9
  130. package/dist/cjs/order.js.map +0 -1
  131. package/dist/cjs/parse.js +0 -174
  132. package/dist/cjs/parse.js.map +0 -1
  133. package/dist/cjs/patch.js +0 -52
  134. package/dist/cjs/patch.js.map +0 -1
  135. package/dist/cjs/range.js +0 -154
  136. package/dist/cjs/range.js.map +0 -1
  137. package/dist/cjs/result.js +0 -3
  138. package/dist/cjs/result.js.map +0 -1
  139. package/dist/cjs/stopwatch.js +0 -46
  140. package/dist/cjs/stopwatch.js.map +0 -1
  141. package/dist/cjs/string.js +0 -154
  142. package/dist/cjs/string.js.map +0 -1
  143. package/dist/cjs/timer.js +0 -57
  144. package/dist/cjs/timer.js.map +0 -1
  145. package/dist/cjs/timespan.js +0 -367
  146. package/dist/cjs/timespan.js.map +0 -1
  147. package/dist/cjs/triggers.js +0 -103
  148. package/dist/cjs/triggers.js.map +0 -1
  149. package/dist/cjs/type-code.js +0 -18
  150. package/dist/cjs/type-code.js.map +0 -1
  151. package/dist/cjs/type.js +0 -296
  152. package/dist/cjs/type.js.map +0 -1
  153. package/dist/cjs/types.js +0 -3
  154. package/dist/cjs/types.js.map +0 -1
  155. package/dist/cjs/utilities.js +0 -598
  156. package/dist/cjs/utilities.js.map +0 -1
  157. package/dist/esm/array.js.map +0 -1
  158. package/dist/esm/async-pool-executor.js.map +0 -1
  159. package/dist/esm/browser/form-utilities.js.map +0 -1
  160. package/dist/esm/browser/geo-location.js.map +0 -1
  161. package/dist/esm/browser/index.js.map +0 -1
  162. package/dist/esm/browser/native-bridge.js.map +0 -1
  163. package/dist/esm/cancellable-promise.js.map +0 -1
  164. package/dist/esm/clean-url-search-params.js.map +0 -1
  165. package/dist/esm/collections/cache-dictionary.js.map +0 -1
  166. package/dist/esm/collections/default-map.js.map +0 -1
  167. package/dist/esm/collections/default-weak-map.js.map +0 -1
  168. package/dist/esm/collections/from.js.map +0 -1
  169. package/dist/esm/collections/index.js.map +0 -1
  170. package/dist/esm/draft.js.map +0 -1
  171. package/dist/esm/event-bus.js.map +0 -1
  172. package/dist/esm/functions.js.map +0 -1
  173. package/dist/esm/index.js +0 -38
  174. package/dist/esm/index.js.map +0 -1
  175. package/dist/esm/key-value-pair.js.map +0 -1
  176. package/dist/esm/lazy.js.map +0 -1
  177. package/dist/esm/math.js.map +0 -1
  178. package/dist/esm/order.js.map +0 -1
  179. package/dist/esm/parse.js.map +0 -1
  180. package/dist/esm/patch.js.map +0 -1
  181. package/dist/esm/range.js.map +0 -1
  182. package/dist/esm/result.js.map +0 -1
  183. package/dist/esm/stopwatch.js.map +0 -1
  184. package/dist/esm/string.js.map +0 -1
  185. package/dist/esm/timer.js.map +0 -1
  186. package/dist/esm/timespan.js.map +0 -1
  187. package/dist/esm/triggers.js.map +0 -1
  188. package/dist/esm/type-code.js.map +0 -1
  189. package/dist/esm/type.js.map +0 -1
  190. package/dist/esm/types.js.map +0 -1
  191. package/dist/esm/utilities.js +0 -567
  192. package/dist/esm/utilities.js.map +0 -1
  193. package/dist/types/array.d.ts.map +0 -1
  194. package/dist/types/async-pool-executor.d.ts.map +0 -1
  195. package/dist/types/browser/form-utilities.d.ts.map +0 -1
  196. package/dist/types/browser/geo-location.d.ts.map +0 -1
  197. package/dist/types/browser/index.d.ts.map +0 -1
  198. package/dist/types/browser/native-bridge.d.ts.map +0 -1
  199. package/dist/types/cancellable-promise.d.ts.map +0 -1
  200. package/dist/types/clean-url-search-params.d.ts.map +0 -1
  201. package/dist/types/collections/cache-dictionary.d.ts.map +0 -1
  202. package/dist/types/collections/default-map.d.ts.map +0 -1
  203. package/dist/types/collections/default-weak-map.d.ts.map +0 -1
  204. package/dist/types/collections/from.d.ts.map +0 -1
  205. package/dist/types/collections/index.d.ts.map +0 -1
  206. package/dist/types/draft.d.ts.map +0 -1
  207. package/dist/types/event-bus.d.ts.map +0 -1
  208. package/dist/types/functions.d.ts.map +0 -1
  209. package/dist/types/index.d.ts.map +0 -1
  210. package/dist/types/key-value-pair.d.ts.map +0 -1
  211. package/dist/types/lazy.d.ts.map +0 -1
  212. package/dist/types/math.d.ts.map +0 -1
  213. package/dist/types/order.d.ts.map +0 -1
  214. package/dist/types/parse.d.ts.map +0 -1
  215. package/dist/types/patch.d.ts.map +0 -1
  216. package/dist/types/range.d.ts.map +0 -1
  217. package/dist/types/result.d.ts.map +0 -1
  218. package/dist/types/stopwatch.d.ts.map +0 -1
  219. package/dist/types/string.d.ts.map +0 -1
  220. package/dist/types/timer.d.ts.map +0 -1
  221. package/dist/types/timespan.d.ts.map +0 -1
  222. package/dist/types/triggers.d.ts.map +0 -1
  223. package/dist/types/type-code.d.ts.map +0 -1
  224. package/dist/types/type.d.ts.map +0 -1
  225. package/dist/types/types.d.ts.map +0 -1
  226. package/dist/types/utilities.d.ts.map +0 -1
  227. package/dist/web/array.js +0 -98
  228. package/dist/web/array.js.map +0 -1
  229. package/dist/web/async-pool-executor.js +0 -76
  230. package/dist/web/async-pool-executor.js.map +0 -1
  231. package/dist/web/browser/form-utilities.js +0 -155
  232. package/dist/web/browser/form-utilities.js.map +0 -1
  233. package/dist/web/browser/geo-location.js +0 -75
  234. package/dist/web/browser/geo-location.js.map +0 -1
  235. package/dist/web/browser/index.js +0 -75
  236. package/dist/web/browser/index.js.map +0 -1
  237. package/dist/web/browser/native-bridge.js +0 -78
  238. package/dist/web/browser/native-bridge.js.map +0 -1
  239. package/dist/web/cancellable-promise.js +0 -78
  240. package/dist/web/cancellable-promise.js.map +0 -1
  241. package/dist/web/clean-url-search-params.js +0 -31
  242. package/dist/web/clean-url-search-params.js.map +0 -1
  243. package/dist/web/collections/cache-dictionary.js +0 -99
  244. package/dist/web/collections/cache-dictionary.js.map +0 -1
  245. package/dist/web/collections/default-map.js +0 -42
  246. package/dist/web/collections/default-map.js.map +0 -1
  247. package/dist/web/collections/default-weak-map.js +0 -43
  248. package/dist/web/collections/default-weak-map.js.map +0 -1
  249. package/dist/web/collections/from.js +0 -770
  250. package/dist/web/collections/from.js.map +0 -1
  251. package/dist/web/collections/index.js +0 -5
  252. package/dist/web/collections/index.js.map +0 -1
  253. package/dist/web/draft.js +0 -222
  254. package/dist/web/draft.js.map +0 -1
  255. package/dist/web/event-bus.js +0 -66
  256. package/dist/web/event-bus.js.map +0 -1
  257. package/dist/web/functions.js +0 -336
  258. package/dist/web/functions.js.map +0 -1
  259. package/dist/web/index.js.map +0 -1
  260. package/dist/web/key-value-pair.js +0 -19
  261. package/dist/web/key-value-pair.js.map +0 -1
  262. package/dist/web/lazy.js +0 -26
  263. package/dist/web/lazy.js.map +0 -1
  264. package/dist/web/math.js +0 -33
  265. package/dist/web/math.js.map +0 -1
  266. package/dist/web/order.js +0 -7
  267. package/dist/web/order.js.map +0 -1
  268. package/dist/web/parse.js +0 -169
  269. package/dist/web/parse.js.map +0 -1
  270. package/dist/web/patch.js +0 -48
  271. package/dist/web/patch.js.map +0 -1
  272. package/dist/web/range.js +0 -151
  273. package/dist/web/range.js.map +0 -1
  274. package/dist/web/result.js +0 -2
  275. package/dist/web/result.js.map +0 -1
  276. package/dist/web/stopwatch.js +0 -40
  277. package/dist/web/stopwatch.js.map +0 -1
  278. package/dist/web/string.js +0 -142
  279. package/dist/web/string.js.map +0 -1
  280. package/dist/web/timer.js +0 -54
  281. package/dist/web/timer.js.map +0 -1
  282. package/dist/web/timespan.js +0 -365
  283. package/dist/web/timespan.js.map +0 -1
  284. package/dist/web/triggers.js +0 -99
  285. package/dist/web/triggers.js.map +0 -1
  286. package/dist/web/type-code.js +0 -16
  287. package/dist/web/type-code.js.map +0 -1
  288. package/dist/web/type.js +0 -292
  289. package/dist/web/type.js.map +0 -1
  290. package/dist/web/types.js +0 -2
  291. package/dist/web/types.js.map +0 -1
  292. package/dist/web/utilities.js.map +0 -1
  293. /package/dist/{types/array.d.ts → array.d.ts} +0 -0
  294. /package/dist/{esm/array.js → array.js} +0 -0
  295. /package/dist/{types/async-pool-executor.d.ts → async-pool-executor.d.ts} +0 -0
  296. /package/dist/{esm/async-pool-executor.js → async-pool-executor.js} +0 -0
  297. /package/dist/{types/browser → browser}/form-utilities.d.ts +0 -0
  298. /package/dist/{esm/browser → browser}/form-utilities.js +0 -0
  299. /package/dist/{types/browser → browser}/geo-location.d.ts +0 -0
  300. /package/dist/{esm/browser → browser}/geo-location.js +0 -0
  301. /package/dist/{types/browser → browser}/index.d.ts +0 -0
  302. /package/dist/{esm/browser → browser}/index.js +0 -0
  303. /package/dist/{types/browser → browser}/native-bridge.d.ts +0 -0
  304. /package/dist/{esm/browser → browser}/native-bridge.js +0 -0
  305. /package/dist/{types/cancellable-promise.d.ts → cancellable-promise.d.ts} +0 -0
  306. /package/dist/{esm/cancellable-promise.js → cancellable-promise.js} +0 -0
  307. /package/dist/{types/clean-url-search-params.d.ts → clean-url-search-params.d.ts} +0 -0
  308. /package/dist/{esm/clean-url-search-params.js → clean-url-search-params.js} +0 -0
  309. /package/dist/{types/collections → collections}/cache-dictionary.d.ts +0 -0
  310. /package/dist/{esm/collections → collections}/cache-dictionary.js +0 -0
  311. /package/dist/{types/collections → collections}/default-map.d.ts +0 -0
  312. /package/dist/{esm/collections → collections}/default-map.js +0 -0
  313. /package/dist/{types/collections → collections}/default-weak-map.d.ts +0 -0
  314. /package/dist/{esm/collections → collections}/default-weak-map.js +0 -0
  315. /package/dist/{types/collections → collections}/from.d.ts +0 -0
  316. /package/dist/{esm/collections → collections}/from.js +0 -0
  317. /package/dist/{types/collections → collections}/index.d.ts +0 -0
  318. /package/dist/{esm/collections → collections}/index.js +0 -0
  319. /package/dist/{types/draft.d.ts → draft.d.ts} +0 -0
  320. /package/dist/{esm/draft.js → draft.js} +0 -0
  321. /package/dist/{types/event-bus.d.ts → event-bus.d.ts} +0 -0
  322. /package/dist/{esm/event-bus.js → event-bus.js} +0 -0
  323. /package/dist/{types/key-value-pair.d.ts → key-value-pair.d.ts} +0 -0
  324. /package/dist/{esm/key-value-pair.js → key-value-pair.js} +0 -0
  325. /package/dist/{types/lazy.d.ts → lazy.d.ts} +0 -0
  326. /package/dist/{esm/lazy.js → lazy.js} +0 -0
  327. /package/dist/{types/math.d.ts → math.d.ts} +0 -0
  328. /package/dist/{esm/math.js → math.js} +0 -0
  329. /package/dist/{types/order.d.ts → order.d.ts} +0 -0
  330. /package/dist/{esm/order.js → order.js} +0 -0
  331. /package/dist/{types/parse.d.ts → parse.d.ts} +0 -0
  332. /package/dist/{esm/parse.js → parse.js} +0 -0
  333. /package/dist/{types/patch.d.ts → patch.d.ts} +0 -0
  334. /package/dist/{esm/patch.js → patch.js} +0 -0
  335. /package/dist/{types/range.d.ts → range.d.ts} +0 -0
  336. /package/dist/{esm/range.js → range.js} +0 -0
  337. /package/dist/{types/result.d.ts → result.d.ts} +0 -0
  338. /package/dist/{esm/result.js → result.js} +0 -0
  339. /package/dist/{types/stopwatch.d.ts → stopwatch.d.ts} +0 -0
  340. /package/dist/{esm/stopwatch.js → stopwatch.js} +0 -0
  341. /package/dist/{types/string.d.ts → string.d.ts} +0 -0
  342. /package/dist/{esm/string.js → string.js} +0 -0
  343. /package/dist/{types/timer.d.ts → timer.d.ts} +0 -0
  344. /package/dist/{esm/timer.js → timer.js} +0 -0
  345. /package/dist/{types/timespan.d.ts → timespan.d.ts} +0 -0
  346. /package/dist/{esm/timespan.js → timespan.js} +0 -0
  347. /package/dist/{types/triggers.d.ts → triggers.d.ts} +0 -0
  348. /package/dist/{esm/triggers.js → triggers.js} +0 -0
  349. /package/dist/{types/type-code.d.ts → type-code.d.ts} +0 -0
  350. /package/dist/{esm/type-code.js → type-code.js} +0 -0
  351. /package/dist/{types/type.d.ts → type.d.ts} +0 -0
  352. /package/dist/{esm/type.js → type.js} +0 -0
  353. /package/dist/{types/types.d.ts → types.d.ts} +0 -0
  354. /package/dist/{esm/types.js → types.js} +0 -0
@@ -1,162 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ajaxSubmit = ajaxSubmit;
4
- exports.submitForm = submitForm;
5
- exports.formToObject = formToObject;
6
- exports.objectToFormData = objectToFormData;
7
- exports.ajaxSubmission = ajaxSubmission;
8
- /**
9
- * Submits a form via AJAX and returns a Promise that resolves to the Response object.
10
- *
11
- * @param {HTMLFormElement | string} selectorOrElement - The form element or selector.
12
- * @return {Promise<Response>} A Promise that resolves to the Response object.
13
- * @throws {Error} If the element is invalid.
14
- */
15
- async function ajaxSubmit(selectorOrElement) {
16
- const form = typeof selectorOrElement === 'string'
17
- ? document.querySelector(selectorOrElement)
18
- : selectorOrElement;
19
- if (!(form instanceof HTMLFormElement)) {
20
- throw new Error("Invalid element.");
21
- }
22
- const formData = new FormData(form);
23
- const method = form.getAttribute('method') ?? form.method;
24
- const action = form.getAttribute('action') ?? form.action;
25
- return await fetch(action, {
26
- method: method,
27
- body: formData,
28
- });
29
- }
30
- function submitForm(url, data, method = 'POST', target) {
31
- const form = document.createElement('form');
32
- form.method = method.toUpperCase();
33
- form.action = url;
34
- form.style.display = 'none';
35
- if (target) {
36
- form.target = target;
37
- }
38
- /**
39
- * Recursively appends inputs to the form, supporting nested keys and arrays.
40
- * @param keyPrefix - Key path, e.g., 'user[name]' or 'tags[]'
41
- * @param value - The value to append (can be nested)
42
- */
43
- const appendInput = (key, value) => {
44
- const input = document.createElement('input');
45
- input.type = 'hidden';
46
- input.name = key;
47
- input.value = String(value);
48
- form.appendChild(input);
49
- };
50
- const appendInputs = (keyPrefix, value) => {
51
- if (Array.isArray(value)) {
52
- for (const val of value) {
53
- appendInputs(`${keyPrefix}[]`, val);
54
- }
55
- }
56
- else if (value instanceof Date) {
57
- appendInput(keyPrefix, value.toISOString());
58
- }
59
- else if (typeof value === 'object' && value !== null) {
60
- for (const subKey in value) {
61
- if (Object.prototype.hasOwnProperty.call(value, subKey)) {
62
- appendInputs(`${keyPrefix}[${subKey}]`, value[subKey]);
63
- }
64
- }
65
- }
66
- else {
67
- appendInput(keyPrefix, value);
68
- }
69
- };
70
- for (const key in data) {
71
- if (Object.prototype.hasOwnProperty.call(data, key)) {
72
- appendInputs(key, data[key]);
73
- }
74
- }
75
- document.body.appendChild(form);
76
- form.submit();
77
- }
78
- function formToObject(form) {
79
- const fd = new FormData(form);
80
- const out = {};
81
- for (const [key, value] of fd.entries()) {
82
- if (Object.prototype.hasOwnProperty.call(out, key)) {
83
- const current = out[key];
84
- if (Array.isArray(current)) {
85
- current.push(value);
86
- }
87
- else {
88
- out[key] = [current, value];
89
- }
90
- }
91
- else {
92
- out[key] = value;
93
- }
94
- }
95
- return out;
96
- }
97
- /**
98
- * Converts an object to `FormData` format recursively.
99
- *
100
- * @param {Record<string, any>} data - The object data to convert.
101
- * @param {FormData} formData - The `FormData` instance to append data to.
102
- * @param {string} parentKey - The parent key to append to child keys in the `FormData`.
103
- * @returns {FormData} - The `FormData` instance with the converted data.
104
- */
105
- function _appendFormDataValue(formData, key, value) {
106
- if (value instanceof Date) {
107
- formData.append(key, value.toISOString());
108
- }
109
- else if (value instanceof File) {
110
- formData.append(key, value);
111
- }
112
- else if (Array.isArray(value)) {
113
- for (let index = 0; index < value.length; index++) {
114
- _appendFormDataValue(formData, `${key}[${index}]`, value[index]);
115
- }
116
- }
117
- else if (value !== null && typeof value === 'object') {
118
- _objectToFormData(value, formData, key);
119
- }
120
- else {
121
- formData.append(key, value);
122
- }
123
- }
124
- function _objectToFormData(data, formData, parentKey = '') {
125
- for (const key in data) {
126
- if (Object.prototype.hasOwnProperty.call(data, key)) {
127
- _appendFormDataValue(formData, parentKey ? `${parentKey}[${key}]` : key, data[key]);
128
- }
129
- }
130
- return formData;
131
- }
132
- /**
133
- * Converts an object into FormData.
134
- *
135
- * @param {Record<string, any>} data - The object to be converted into FormData.
136
- * @return {FormData} - The FormData object representing the converted data.
137
- */
138
- function objectToFormData(data) {
139
- let formData = new FormData();
140
- return _objectToFormData(data, formData);
141
- }
142
- function ajaxSubmission(selectorOrElement, onSuccess, onFailure) {
143
- const forms = typeof selectorOrElement === 'string'
144
- ? Array.from(document.querySelectorAll(selectorOrElement))
145
- .filter(el => el instanceof HTMLFormElement)
146
- : [selectorOrElement];
147
- for (const form of forms) {
148
- form.addEventListener('submit', async (event) => {
149
- event.preventDefault();
150
- try {
151
- let result = await ajaxSubmit(event.currentTarget);
152
- if (onSuccess)
153
- onSuccess(result);
154
- }
155
- catch (e) {
156
- if (onFailure)
157
- onFailure(e);
158
- }
159
- });
160
- }
161
- }
162
- //# sourceMappingURL=form-utilities.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"form-utilities.js","sourceRoot":"","sources":["../../../src/browser/form-utilities.ts"],"names":[],"mappings":"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","sourcesContent":["import type {Consumer} from \"../types.js\";\n\n\n/**\n * Submits a form via AJAX and returns a Promise that resolves to the Response object.\n *\n * @param {HTMLFormElement | string} selectorOrElement - The form element or selector.\n * @return {Promise<Response>} A Promise that resolves to the Response object.\n * @throws {Error} If the element is invalid.\n */\nexport async function ajaxSubmit(selectorOrElement: HTMLFormElement | string): Promise<Response> {\n\n const form = typeof selectorOrElement === 'string'\n ? document.querySelector(selectorOrElement)\n : selectorOrElement;\n\n if (!(form instanceof HTMLFormElement)) {\n throw new Error(\"Invalid element.\");\n }\n\n\n const formData = new FormData(form);\n const method = form.getAttribute('method') as string ?? form.method;\n const action = form.getAttribute('action') as string ?? form.action;\n\n return await fetch(action, {\n method: method,\n body: formData,\n });\n}\n\n\nexport function submitForm(\n url: string,\n data: Record<string, any>,\n method: 'POST' | 'GET' = 'POST',\n target?: '_blank' | '_self' | '_parent' | '_top'\n): void {\n\n const form = document.createElement('form');\n form.method = method.toUpperCase();\n form.action = url;\n form.style.display = 'none';\n\n if (target) {\n form.target = target;\n }\n\n /**\n * Recursively appends inputs to the form, supporting nested keys and arrays.\n * @param keyPrefix - Key path, e.g., 'user[name]' or 'tags[]'\n * @param value - The value to append (can be nested)\n */\n const appendInput = (key: string, value: any) => {\n const input = document.createElement('input');\n input.type = 'hidden';\n input.name = key;\n input.value = String(value);\n form.appendChild(input);\n };\n\n const appendInputs = (keyPrefix: string, value: any) => {\n if (Array.isArray(value)) {\n for (const val of value) {\n appendInputs(`${keyPrefix}[]`, val);\n }\n } else if (value instanceof Date) {\n appendInput(keyPrefix, value.toISOString());\n } else if (typeof value === 'object' && value !== null) {\n for (const subKey in value) {\n if (Object.prototype.hasOwnProperty.call(value, subKey)) {\n appendInputs(`${keyPrefix}[${subKey}]`, value[subKey]);\n }\n }\n } else {\n appendInput(keyPrefix, value);\n }\n };\n\n for (const key in data) {\n if (Object.prototype.hasOwnProperty.call(data, key)) {\n appendInputs(key, data[key]);\n }\n }\n\n document.body.appendChild(form);\n form.submit();\n}\n\nexport function formToObject(form: HTMLFormElement): Record<string, FormDataEntryValue | FormDataEntryValue[]> {\n const fd = new FormData(form);\n const out: Record<string, FormDataEntryValue | FormDataEntryValue[]> = {};\n\n for (const [key, value] of fd.entries()) {\n if (Object.prototype.hasOwnProperty.call(out, key)) {\n const current = out[key];\n if (Array.isArray(current)) {\n current.push(value);\n } else {\n out[key] = [current, value];\n }\n } else {\n out[key] = value;\n }\n }\n\n return out;\n}\n\n/**\n * Converts an object to `FormData` format recursively.\n *\n * @param {Record<string, any>} data - The object data to convert.\n * @param {FormData} formData - The `FormData` instance to append data to.\n * @param {string} parentKey - The parent key to append to child keys in the `FormData`.\n * @returns {FormData} - The `FormData` instance with the converted data.\n */\nfunction _appendFormDataValue(formData: FormData, key: string, value: any): void {\n if (value instanceof Date) {\n formData.append(key, value.toISOString());\n } else if (value instanceof File) {\n formData.append(key, value);\n } else if (Array.isArray(value)) {\n for (let index = 0; index < value.length; index++) {\n _appendFormDataValue(formData, `${key}[${index}]`, value[index]);\n }\n } else if (value !== null && typeof value === 'object') {\n _objectToFormData(value, formData, key);\n } else {\n formData.append(key, value);\n }\n}\n\nfunction _objectToFormData(data: Record<string, any>, formData: FormData, parentKey: string = ''): FormData {\n for (const key in data) {\n if (Object.prototype.hasOwnProperty.call(data, key)) {\n _appendFormDataValue(formData, parentKey ? `${parentKey}[${key}]` : key, data[key]);\n }\n }\n\n return formData;\n}\n\n/**\n * Converts an object into FormData.\n *\n * @param {Record<string, any>} data - The object to be converted into FormData.\n * @return {FormData} - The FormData object representing the converted data.\n */\nexport function objectToFormData(data: Record<string, any>): FormData {\n let formData = new FormData();\n return _objectToFormData(data, formData);\n}\n\nexport function ajaxSubmission(\n selectorOrElement: HTMLFormElement | string,\n onSuccess?: Consumer<any>,\n onFailure?: Consumer<any>\n): void {\n\n const forms: HTMLFormElement[] = typeof selectorOrElement === 'string'\n ? Array.from(document.querySelectorAll(selectorOrElement))\n .filter(el => el instanceof HTMLFormElement) as HTMLFormElement[]\n : [selectorOrElement];\n\n for (const form of forms) {\n form.addEventListener('submit', async (event) => {\n event.preventDefault();\n\n try {\n let result = await ajaxSubmit(event.currentTarget as HTMLFormElement);\n if (onSuccess)\n onSuccess(result);\n } catch (e) {\n if (onFailure)\n onFailure(e);\n }\n\n\n });\n }\n}"]}
@@ -1,78 +0,0 @@
1
- "use strict";
2
- // ─── Tipos ───────────────────────────────────────────────
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.default = getGeoLocation;
5
- // ─── Helpers ─────────────────────────────────────────────
6
- function positionToGeoLocation(position) {
7
- const { coords, timestamp } = position;
8
- return {
9
- latitude: coords.latitude,
10
- longitude: coords.longitude,
11
- accuracy: coords.accuracy,
12
- altitude: coords.altitude,
13
- altitudeAccuracy: coords.altitudeAccuracy,
14
- heading: coords.heading,
15
- speed: coords.speed,
16
- timestamp,
17
- };
18
- }
19
- function geolocationError(error) {
20
- switch (error.code) {
21
- case error.PERMISSION_DENIED:
22
- return new Error('Has denegado el permiso de ubicación.');
23
- case error.POSITION_UNAVAILABLE:
24
- return new Error('No se pudo determinar tu ubicación.');
25
- case error.TIMEOUT:
26
- return new Error('Tiempo de espera agotado al obtener la ubicación.');
27
- default:
28
- return new Error('Error desconocido al obtener la ubicación.');
29
- }
30
- }
31
- function requestPosition(options) {
32
- return new Promise((resolve, reject) => {
33
- navigator.geolocation.getCurrentPosition((position) => resolve(positionToGeoLocation(position)), (error) => reject(geolocationError(error)), options);
34
- });
35
- }
36
- async function ensurePermission() {
37
- if (!navigator.permissions)
38
- return;
39
- const permission = await navigator.permissions.query({ name: 'geolocation' });
40
- if (permission.state === 'denied') {
41
- throw new Error('Permiso de ubicación denegado. Actívalo en la configuración del navegador.');
42
- }
43
- if (permission.state === 'prompt') {
44
- await new Promise((resolve, reject) => {
45
- // Escuchar cambio de estado del permiso
46
- permission.onchange = () => {
47
- permission.onchange = null;
48
- if (permission.state === 'granted') {
49
- resolve();
50
- }
51
- else {
52
- reject(new Error('Has denegado el permiso de ubicación.'));
53
- }
54
- };
55
- // Forzar el diálogo nativo del navegador
56
- navigator.geolocation.getCurrentPosition(() => {
57
- permission.onchange = null;
58
- resolve();
59
- }, (error) => {
60
- permission.onchange = null;
61
- reject(geolocationError(error));
62
- }, { timeout: 30000 });
63
- });
64
- }
65
- }
66
- // ─── Función principal ──────────────────────────────────
67
- async function getGeoLocation(options = {}) {
68
- if (typeof navigator === 'undefined' || !navigator.geolocation) {
69
- throw new Error('Tu navegador no soporta geolocalización.');
70
- }
71
- await ensurePermission();
72
- return requestPosition({
73
- enableHighAccuracy: options.enableHighAccuracy ?? true,
74
- timeout: options.timeout ?? 10000,
75
- maximumAge: options.maximumAge ?? 0,
76
- });
77
- }
78
- //# sourceMappingURL=geo-location.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"geo-location.js","sourceRoot":"","sources":["../../../src/browser/geo-location.ts"],"names":[],"mappings":"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","sourcesContent":["// ─── Tipos ───────────────────────────────────────────────\n\nexport interface GeoLocation {\n latitude: number;\n longitude: number;\n accuracy: number;\n altitude: number | null;\n altitudeAccuracy: number | null;\n heading: number | null;\n speed: number | null;\n timestamp: number;\n}\n\nexport interface GeoLocationOptions {\n enableHighAccuracy?: boolean;\n timeout?: number;\n maximumAge?: number;\n}\n\n// ─── Helpers ─────────────────────────────────────────────\n\nfunction positionToGeoLocation(position: GeolocationPosition): GeoLocation {\n const {coords, timestamp} = position;\n return {\n latitude: coords.latitude,\n longitude: coords.longitude,\n accuracy: coords.accuracy,\n altitude: coords.altitude,\n altitudeAccuracy: coords.altitudeAccuracy,\n heading: coords.heading,\n speed: coords.speed,\n timestamp,\n };\n}\n\nfunction geolocationError(error: GeolocationPositionError): Error {\n switch (error.code) {\n case error.PERMISSION_DENIED:\n return new Error('Has denegado el permiso de ubicación.');\n case error.POSITION_UNAVAILABLE:\n return new Error('No se pudo determinar tu ubicación.');\n case error.TIMEOUT:\n return new Error('Tiempo de espera agotado al obtener la ubicación.');\n default:\n return new Error('Error desconocido al obtener la ubicación.');\n }\n}\n\nfunction requestPosition(options: PositionOptions): Promise<GeoLocation> {\n return new Promise((resolve, reject) => {\n navigator.geolocation.getCurrentPosition(\n (position) => resolve(positionToGeoLocation(position)),\n (error) => reject(geolocationError(error)),\n options,\n );\n });\n}\n\nasync function ensurePermission(): Promise<void> {\n if (!navigator.permissions) return;\n\n const permission = await navigator.permissions.query({name: 'geolocation'});\n\n if (permission.state === 'denied') {\n throw new Error(\n 'Permiso de ubicación denegado. Actívalo en la configuración del navegador.',\n );\n }\n\n if (permission.state === 'prompt') {\n await new Promise<void>((resolve, reject) => {\n // Escuchar cambio de estado del permiso\n permission.onchange = () => {\n permission.onchange = null;\n if (permission.state === 'granted') {\n resolve();\n } else {\n reject(new Error('Has denegado el permiso de ubicación.'));\n }\n };\n\n // Forzar el diálogo nativo del navegador\n navigator.geolocation.getCurrentPosition(\n () => {\n permission.onchange = null;\n resolve();\n },\n (error) => {\n permission.onchange = null;\n reject(geolocationError(error));\n },\n {timeout: 30000},\n );\n });\n }\n}\n\n// ─── Función principal ──────────────────────────────────\n\nexport default async function getGeoLocation(\n options: GeoLocationOptions = {},\n): Promise<GeoLocation> {\n if (typeof navigator === 'undefined' || !navigator.geolocation) {\n throw new Error('Tu navegador no soporta geolocalización.');\n }\n\n await ensurePermission();\n\n return requestPosition({\n enableHighAccuracy: options.enableHighAccuracy ?? true,\n timeout: options.timeout ?? 10000,\n maximumAge: options.maximumAge ?? 0,\n });\n}"]}
@@ -1,99 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- var __importDefault = (this && this.__importDefault) || function (mod) {
17
- return (mod && mod.__esModule) ? mod : { "default": mod };
18
- };
19
- Object.defineProperty(exports, "__esModule", { value: true });
20
- exports.getGeoLocation = exports.NativeBridge = void 0;
21
- exports.waitFor = waitFor;
22
- exports.fetchInto = fetchInto;
23
- const utilities_js_1 = require("../utilities.js");
24
- async function waitFor(selector, options = {}) {
25
- const { timeout = 5000 } = options;
26
- const element = document.querySelector(selector);
27
- if (element) {
28
- return element;
29
- }
30
- let observer;
31
- const timeoutPromise = (0, utilities_js_1.delay)(timeout).then(() => {
32
- observer?.disconnect();
33
- return null;
34
- });
35
- const observerPromise = new Promise((resolve) => {
36
- observer = new MutationObserver(() => {
37
- const element = document.querySelector(selector);
38
- if (element) {
39
- observer?.disconnect();
40
- resolve(element);
41
- }
42
- });
43
- observer.observe(document.body, {
44
- childList: true,
45
- subtree: true,
46
- });
47
- });
48
- return Promise.race([observerPromise, timeoutPromise]);
49
- }
50
- async function fetchInto(selector, options = {}) {
51
- const { url = window.location.href, fetchOptions = {}, runScripts = false, transition = null, } = options;
52
- const response = await fetch(url, fetchOptions);
53
- if (!response.ok) {
54
- throw new Error(`HTTP ${response.status}: ${response.statusText}`);
55
- }
56
- const html = await response.text();
57
- const doc = new DOMParser().parseFromString(html, "text/html");
58
- const oldElements = document.querySelectorAll(selector);
59
- let replacedCount = 0;
60
- for (let i = 0; i < oldElements.length; i++) {
61
- const oldEl = oldElements[i];
62
- const newEl = doc.querySelector(selector);
63
- if (!newEl)
64
- continue;
65
- if (transition) {
66
- oldEl.classList.add(transition);
67
- await new Promise((r) => requestAnimationFrame(() => requestAnimationFrame(() => r())));
68
- }
69
- oldEl.replaceWith(newEl.cloneNode(true));
70
- if (runScripts) {
71
- const scripts = newEl.querySelectorAll("script");
72
- for (let j = 0; j < scripts.length; j++) {
73
- const script = scripts[j];
74
- const fresh = document.createElement("script");
75
- if (script.src) {
76
- fresh.src = script.src;
77
- }
78
- else {
79
- fresh.textContent = script.textContent;
80
- }
81
- const attrs = script.attributes;
82
- for (let k = 0; k < attrs.length; k++) {
83
- if (attrs[k].name !== "src") {
84
- fresh.setAttribute(attrs[k].name, attrs[k].value);
85
- }
86
- }
87
- script.replaceWith(fresh);
88
- }
89
- }
90
- replacedCount++;
91
- }
92
- return replacedCount;
93
- }
94
- __exportStar(require("./form-utilities.js"), exports);
95
- var native_bridge_js_1 = require("./native-bridge.js");
96
- Object.defineProperty(exports, "NativeBridge", { enumerable: true, get: function () { return __importDefault(native_bridge_js_1).default; } });
97
- var geo_location_js_1 = require("./geo-location.js");
98
- Object.defineProperty(exports, "getGeoLocation", { enumerable: true, get: function () { return __importDefault(geo_location_js_1).default; } });
99
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/browser/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {delay} from \"../utilities.js\";\n\ninterface FetchIntoOptions {\n url?: string;\n fetchOptions?: RequestInit;\n runScripts?: boolean;\n transition?: string;\n}\n\nexport async function waitFor(\n selector: string,\n options: { timeout?: number } = {}\n): Promise<HTMLElement | null> {\n const {timeout = 5000} = options;\n\n const element = document.querySelector(selector);\n if (element) {\n return element as HTMLElement;\n }\n\n let observer: MutationObserver | undefined;\n const timeoutPromise = delay(timeout).then(() => {\n observer?.disconnect();\n return null;\n });\n\n const observerPromise = new Promise<HTMLElement | null>((resolve) => {\n observer = new MutationObserver(() => {\n const element = document.querySelector(selector);\n if (element) {\n observer?.disconnect();\n resolve(element as HTMLElement);\n }\n });\n\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n });\n });\n\n return Promise.race([observerPromise, timeoutPromise]);\n}\n\nexport async function fetchInto(\n selector: string,\n options: FetchIntoOptions = {}\n): Promise<number> {\n const {\n url = window.location.href,\n fetchOptions = {},\n runScripts = false,\n transition = null,\n } = options;\n\n const response = await fetch(url, fetchOptions);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const html = await response.text();\n const doc = new DOMParser().parseFromString(html, \"text/html\");\n const oldElements = document.querySelectorAll(selector);\n let replacedCount = 0;\n\n for (let i = 0; i < oldElements.length; i++) {\n const oldEl = oldElements[i];\n const newEl = doc.querySelector(selector);\n\n if (!newEl) continue;\n\n if (transition) {\n oldEl.classList.add(transition);\n await new Promise<void>((r) =>\n requestAnimationFrame(() => requestAnimationFrame(() => r()))\n );\n }\n\n oldEl.replaceWith(newEl.cloneNode(true));\n\n if (runScripts) {\n const scripts = newEl.querySelectorAll(\"script\");\n\n for (let j = 0; j < scripts.length; j++) {\n const script = scripts[j];\n const fresh = document.createElement(\"script\");\n\n if (script.src) {\n fresh.src = script.src;\n } else {\n fresh.textContent = script.textContent;\n }\n\n const attrs = script.attributes;\n for (let k = 0; k < attrs.length; k++) {\n if (attrs[k].name !== \"src\") {\n fresh.setAttribute(attrs[k].name, attrs[k].value);\n }\n }\n\n script.replaceWith(fresh);\n }\n }\n\n replacedCount++;\n }\n\n return replacedCount;\n}\n\nexport * from './form-utilities.js';\n\nexport {default as NativeBridge} from \"./native-bridge.js\";\n\nexport {default as getGeoLocation} from './geo-location.js';"]}
@@ -1,81 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- // ─── Clase ──────────────────────────────────────────────
4
- class NativeBridge {
5
- constructor({ channel, timeout = 3000, callbackName = '__nativeResponseHandler' }) {
6
- this._pending = new Map();
7
- this._callId = 0;
8
- this._defaultTimeout = timeout;
9
- this._channel = channel;
10
- if (!this._channel) {
11
- throw new Error('Channel not found');
12
- }
13
- window[callbackName] = (id, error, result) => {
14
- this._callback(id, error, result);
15
- };
16
- // Proxy: cualquier propiedad no existente se convierte en call()
17
- return new Proxy(this, {
18
- get(target, prop) {
19
- if (prop in target) {
20
- return target[prop];
21
- }
22
- return (data, timeout) => target.call(String(prop), data, timeout);
23
- },
24
- });
25
- }
26
- _callback(id, error, result) {
27
- const pending = this._pending.get(id);
28
- if (!pending) {
29
- return;
30
- }
31
- if (pending.timer !== null) {
32
- clearTimeout(pending.timer);
33
- }
34
- this._pending.delete(id);
35
- if (error) {
36
- pending.reject(error instanceof Error ? error : new Error(String(error)));
37
- }
38
- else {
39
- pending.resolve(result);
40
- }
41
- }
42
- call(method, data = null, timeout) {
43
- const effectiveTimeout = timeout !== undefined ? timeout : this._defaultTimeout;
44
- return new Promise((resolve, reject) => {
45
- const id = this._callId++;
46
- let timer = null;
47
- // Solo crear timer si hay timeout
48
- if (effectiveTimeout !== null && effectiveTimeout > 0) {
49
- timer = setTimeout(() => {
50
- this._pending.delete(id);
51
- reject(new Error(`Timeout (${effectiveTimeout}ms): ${method}`));
52
- }, effectiveTimeout);
53
- }
54
- this._pending.set(id, { resolve, reject, timer });
55
- this._channel.postMessage(JSON.stringify({ id, method, data }));
56
- });
57
- }
58
- send(method, data = null) {
59
- this._channel.postMessage(JSON.stringify({ method, data }));
60
- }
61
- /**
62
- * Número de llamadas pendientes
63
- */
64
- get pendingCount() {
65
- return this._pending.size;
66
- }
67
- /**
68
- * Cancela todas las llamadas pendientes
69
- */
70
- cancelAll() {
71
- for (const [, { reject, timer }] of this._pending) {
72
- if (timer !== null) {
73
- clearTimeout(timer);
74
- }
75
- reject(new Error('Cancelled'));
76
- }
77
- this._pending.clear();
78
- }
79
- }
80
- exports.default = NativeBridge;
81
- //# sourceMappingURL=native-bridge.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"native-bridge.js","sourceRoot":"","sources":["../../../src/browser/native-bridge.ts"],"names":[],"mappings":"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","sourcesContent":["// ─── Tipos ───────────────────────────────────────────────\ninterface BridgeOptions {\n channel: Channel;\n timeout?: number | null;\n callbackName?: string; // ← nuevo\n}\ninterface PendingCall {\n resolve: (value: unknown) => void;\n reject: (reason: Error) => void;\n timer: ReturnType<typeof setTimeout> | null;\n}\n\ninterface Channel {\n postMessage: (message: string) => void;\n}\n\n\n\n// ─── Clase ──────────────────────────────────────────────\n\nexport default class NativeBridge {\n private _pending = new Map<number, PendingCall>();\n private _callId = 0;\n private readonly _defaultTimeout: number | null;\n private readonly _channel: Channel;\n\n\n constructor({ channel, timeout = 3000, callbackName = '__nativeResponseHandler' }: BridgeOptions) {\n this._defaultTimeout = timeout;\n this._channel = channel;\n\n if (!this._channel) {\n throw new Error('Channel not found');\n }\n\n (window as any)[callbackName] = (id: number, error: any, result: any) => {\n this._callback(id, error, result);\n };\n\n // Proxy: cualquier propiedad no existente se convierte en call()\n return new Proxy(this, {\n get(target: NativeBridge, prop: string | symbol) {\n if (prop in target) {\n return (target as any)[prop];\n }\n return (data?: unknown, timeout?: number | null) => target.call(String(prop), data, timeout);\n },\n }) as unknown as NativeBridge;\n }\n\n\n private _callback(id: number, error: any, result: any) {\n\n const pending = this._pending.get(id);\n if (!pending) {\n return;\n }\n\n if (pending.timer !== null) {\n clearTimeout(pending.timer);\n }\n\n this._pending.delete(id);\n\n if (error) {\n pending.reject(error instanceof Error? error : new Error(String(error)));\n } else {\n pending.resolve(result);\n }\n }\n\n call(method: string, data: unknown = null, timeout?: number | null): Promise<unknown> {\n\n\n const effectiveTimeout = timeout !== undefined ? timeout : this._defaultTimeout;\n\n return new Promise<unknown>((resolve, reject) => {\n const id = this._callId++;\n\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n // Solo crear timer si hay timeout\n if (effectiveTimeout !== null && effectiveTimeout > 0) {\n timer = setTimeout(() => {\n this._pending.delete(id);\n reject(new Error(`Timeout (${effectiveTimeout}ms): ${method}`));\n }, effectiveTimeout);\n }\n\n this._pending.set(id, { resolve, reject, timer });\n this._channel!.postMessage(JSON.stringify({ id, method, data }));\n });\n }\n\n\n send(method: string, data: unknown = null): void {\n this._channel!.postMessage(JSON.stringify({ method, data }));\n }\n\n /**\n * Número de llamadas pendientes\n */\n get pendingCount(): number {\n return this._pending.size;\n }\n\n /**\n * Cancela todas las llamadas pendientes\n */\n cancelAll(): void {\n for (const [, { reject, timer }] of this._pending) {\n if (timer !== null) {\n clearTimeout(timer);\n }\n reject(new Error('Cancelled'));\n }\n this._pending.clear();\n }\n}"]}
@@ -1,81 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- class CancellablePromise extends Promise {
4
- static get [Symbol.species]() {
5
- return Promise;
6
- }
7
- constructor(executor) {
8
- const controller = new AbortController();
9
- super((resolve, reject) => {
10
- controller.signal.addEventListener("abort", () => {
11
- reject(controller.signal.reason);
12
- });
13
- executor(resolve, reject, controller.signal);
14
- });
15
- this._controller = controller;
16
- }
17
- get cancelled() {
18
- return this._controller.signal.aborted;
19
- }
20
- cancel(reason = new Error("Promesa cancelada")) {
21
- if (!this.cancelled) {
22
- this._controller.abort(reason);
23
- }
24
- }
25
- static async compete(promises) {
26
- if (promises.length === 0) {
27
- throw new Error("No promises to compete.");
28
- }
29
- const result = await Promise.race(promises.map((promise, index) => promise.then(value => ({ index, value, rejected: false }), reason => ({ index, reason, rejected: true }))));
30
- for (let i = 0; i < promises.length; i++) {
31
- if (i !== result.index) {
32
- promises[i].cancel();
33
- }
34
- }
35
- if (result.rejected) {
36
- throw result.reason;
37
- }
38
- return result.value;
39
- }
40
- static async cooperate(promises) {
41
- try {
42
- return await Promise.all(promises);
43
- }
44
- catch (error) {
45
- for (const p of promises) {
46
- p.cancel();
47
- }
48
- throw error;
49
- }
50
- }
51
- static withTimeout(executor, ms) {
52
- return new CancellablePromise((resolve, reject, signal) => {
53
- let settled = false;
54
- const timer = setTimeout(() => {
55
- safeReject(new Error(`Timeout: ${ms}ms`));
56
- }, ms);
57
- const cleanup = () => clearTimeout(timer);
58
- const safeResolve = (value) => {
59
- if (settled)
60
- return;
61
- settled = true;
62
- cleanup();
63
- resolve(value);
64
- };
65
- const safeReject = (reason) => {
66
- if (settled)
67
- return;
68
- settled = true;
69
- cleanup();
70
- reject(reason);
71
- };
72
- signal.addEventListener("abort", () => {
73
- settled = true;
74
- cleanup();
75
- }, { once: true });
76
- executor(safeResolve, safeReject, signal);
77
- });
78
- }
79
- }
80
- exports.default = CancellablePromise;
81
- //# sourceMappingURL=cancellable-promise.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cancellable-promise.js","sourceRoot":"","sources":["../../src/cancellable-promise.ts"],"names":[],"mappings":"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","sourcesContent":["type CancellablePromiseExecutor<T> = (\n resolve: (value: T | PromiseLike<T>) => void,\n reject: (reason?: unknown) => void,\n signal: AbortSignal\n) => void;\n\nexport default class CancellablePromise<T> extends Promise<T> {\n\n private _controller: AbortController;\n\n static get [Symbol.species]() {\n return Promise;\n }\n\n constructor(executor: CancellablePromiseExecutor<T>) {\n const controller = new AbortController();\n\n super((resolve, reject) => {\n controller.signal.addEventListener(\"abort\", () => {\n reject(controller.signal.reason);\n });\n\n executor(resolve, reject, controller.signal);\n });\n\n this._controller = controller;\n }\n\n get cancelled(): boolean {\n return this._controller.signal.aborted;\n }\n\n cancel(reason: unknown = new Error(\"Promesa cancelada\")): void {\n if (!this.cancelled) {\n this._controller.abort(reason);\n }\n }\n\n static async compete<T>(promises: CancellablePromise<T>[]): Promise<T> {\n if (promises.length === 0) {\n throw new Error(\"No promises to compete.\");\n }\n\n const result = await Promise.race(\n promises.map((promise, index) => promise.then(\n value => ({index, value, rejected: false as const}),\n reason => ({index, reason, rejected: true as const}),\n ))\n );\n\n for (let i = 0; i < promises.length; i++) {\n if (i !== result.index) {\n promises[i].cancel();\n }\n }\n\n if (result.rejected) {\n throw result.reason;\n }\n\n return result.value;\n }\n\n static async cooperate<T>(promises: CancellablePromise<T>[]): Promise<T[]> {\n try {\n return await Promise.all(promises);\n } catch (error) {\n for (const p of promises) {\n p.cancel();\n }\n throw error;\n }\n }\n\n static withTimeout<T>(executor: CancellablePromiseExecutor<T>, ms: number): CancellablePromise<T> {\n return new CancellablePromise<T>((resolve, reject, signal) => {\n let settled = false;\n const timer = setTimeout(() => {\n safeReject(new Error(`Timeout: ${ms}ms`));\n }, ms);\n\n const cleanup = () => clearTimeout(timer);\n const safeResolve = (value: T | PromiseLike<T>) => {\n if (settled) return;\n settled = true;\n cleanup();\n resolve(value);\n };\n const safeReject = (reason?: unknown) => {\n if (settled) return;\n settled = true;\n cleanup();\n reject(reason);\n };\n\n signal.addEventListener(\"abort\", () => {\n settled = true;\n cleanup();\n }, {once: true});\n executor(safeResolve, safeReject, signal);\n });\n }\n}"]}
@@ -1,34 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- function isRecordParams(params) {
4
- return params !== null &&
5
- typeof params === 'object' &&
6
- !(params instanceof URLSearchParams) &&
7
- typeof params[Symbol.iterator] !== 'function';
8
- }
9
- function appendCleanValue(params, key, value) {
10
- if (value === null || value === undefined)
11
- return;
12
- if (Array.isArray(value)) {
13
- for (const item of value) {
14
- appendCleanValue(params, key, item);
15
- }
16
- return;
17
- }
18
- params.append(key, String(value));
19
- }
20
- class CleanURLSearchParams extends URLSearchParams {
21
- constructor(params) {
22
- if (!isRecordParams(params)) {
23
- super(params);
24
- return;
25
- }
26
- super();
27
- // Filtrar `null` y `undefined` antes de añadirlos a URLSearchParams
28
- for (const [key, value] of Object.entries(params)) {
29
- appendCleanValue(this, key, value);
30
- }
31
- }
32
- }
33
- exports.default = CleanURLSearchParams;
34
- //# sourceMappingURL=clean-url-search-params.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"clean-url-search-params.js","sourceRoot":"","sources":["../../src/clean-url-search-params.ts"],"names":[],"mappings":";;AAEA,SAAS,cAAc,CAAC,MAAe;IACnC,OAAO,MAAM,KAAK,IAAI;QAClB,OAAO,MAAM,KAAK,QAAQ;QAC1B,CAAC,CAAC,MAAM,YAAY,eAAe,CAAC;QACpC,OAAQ,MAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,UAAU,CAAC;AAC/D,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAuB,EAAE,GAAW,EAAE,KAAU;IACtE,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO;IAElD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QACxC,CAAC;QACD,OAAO;IACX,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACtC,CAAC;AAED,MAAqB,oBAAqB,SAAQ,eAAe;IAC7D,YAAY,MAAkC;QAC1C,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,KAAK,CAAC,MAA2D,CAAC,CAAC;YACnE,OAAO;QACX,CAAC;QAED,KAAK,EAAE,CAAC;QAER,oEAAoE;QACpE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAChD,gBAAgB,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QACvC,CAAC;IACL,CAAC;CACJ;AAdD,uCAcC","sourcesContent":["type CleanURLSearchParamsInput = string | URLSearchParams | string[][] | Record<string, any>;\n\nfunction isRecordParams(params: unknown): params is Record<string, any> {\n return params !== null &&\n typeof params === 'object' &&\n !(params instanceof URLSearchParams) &&\n typeof (params as any)[Symbol.iterator] !== 'function';\n}\n\nfunction appendCleanValue(params: URLSearchParams, key: string, value: any): void {\n if (value === null || value === undefined) return;\n\n if (Array.isArray(value)) {\n for (const item of value) {\n appendCleanValue(params, key, item);\n }\n return;\n }\n\n params.append(key, String(value));\n}\n\nexport default class CleanURLSearchParams extends URLSearchParams {\n constructor(params?: CleanURLSearchParamsInput) {\n if (!isRecordParams(params)) {\n super(params as string | URLSearchParams | string[][] | undefined);\n return;\n }\n\n super();\n\n // Filtrar `null` y `undefined` antes de añadirlos a URLSearchParams\n for (const [key, value] of Object.entries(params)) {\n appendCleanValue(this, key, value);\n }\n }\n}"]}