@design-edito/tools 0.4.4 → 0.4.6

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 (526) hide show
  1. package/TODO.md +269 -0
  2. package/agnostic/arrays/dedupe/index.js +9 -9
  3. package/agnostic/arrays/dedupe/index.test.js +24 -0
  4. package/agnostic/arrays/find-duplicates/index.js +34 -24
  5. package/agnostic/arrays/find-duplicates/index.test.js +31 -0
  6. package/agnostic/arrays/index.d.ts +1 -1
  7. package/agnostic/arrays/index.js +1 -1
  8. package/agnostic/arrays/is-array-of/index.js +28 -26
  9. package/agnostic/arrays/is-array-of/index.test.js +56 -0
  10. package/agnostic/arrays/make/index.js +11 -8
  11. package/agnostic/arrays/make/index.test.js +10 -0
  12. package/agnostic/arrays/random-pick/index.js +40 -9
  13. package/agnostic/arrays/random-pick/index.test.js +23 -0
  14. package/agnostic/arrays/shuffle/index.js +15 -13
  15. package/agnostic/arrays/shuffle/index.test.js +14 -0
  16. package/agnostic/booleans/is-falsy/index.js +26 -12
  17. package/agnostic/booleans/is-falsy/index.test.js +26 -0
  18. package/agnostic/colors/channels/index.js +145 -19
  19. package/agnostic/colors/channels/index.test.js +64 -0
  20. package/agnostic/colors/contrast/index.js +23 -30
  21. package/agnostic/colors/contrast/index.test.js +21 -0
  22. package/agnostic/colors/convert/index.js +839 -46
  23. package/agnostic/colors/convert/index.test.js +98 -0
  24. package/agnostic/colors/cssColorsMap.js +153 -0
  25. package/agnostic/colors/distance/index.js +65 -53
  26. package/agnostic/colors/distance/index.test.js +21 -0
  27. package/agnostic/colors/grayscale/index.js +96 -137
  28. package/agnostic/colors/grayscale/index.test.js +34 -0
  29. package/agnostic/colors/invert/index.js +33 -44
  30. package/agnostic/colors/invert/index.test.js +31 -0
  31. package/agnostic/colors/lerp/index.js +74 -88
  32. package/agnostic/colors/lerp/index.test.js +55 -0
  33. package/agnostic/colors/luminance/index.js +19 -13
  34. package/agnostic/colors/luminance/index.test.js +30 -0
  35. package/agnostic/colors/palette/index.js +80 -87
  36. package/agnostic/colors/palette/index.test.js +35 -0
  37. package/agnostic/colors/rotate/index.js +41 -14
  38. package/agnostic/colors/rotate/index.test.js +45 -0
  39. package/agnostic/colors/tidy/index.js +80 -12
  40. package/agnostic/colors/tidy/index.test.js +45 -0
  41. package/agnostic/colors/typechecks/index.js +196 -25
  42. package/agnostic/colors/typechecks/index.test.js +113 -0
  43. package/agnostic/colors/types.js +1 -0
  44. package/agnostic/css/bem/index.js +135 -160
  45. package/agnostic/css/clss/index.js +66 -7
  46. package/agnostic/css/clss/index.test.js +60 -0
  47. package/agnostic/css/generate-nice-color/index.js +26 -73
  48. package/agnostic/css/generate-nice-color/index.test.js +8 -0
  49. package/agnostic/css/index.d.ts +1 -1
  50. package/agnostic/css/index.js +1 -1
  51. package/agnostic/css/is-valid-css-class-name/index.js +15 -9
  52. package/agnostic/css/is-valid-css-class-name/index.test.js +36 -0
  53. package/agnostic/css/scale/index.js +37 -37
  54. package/agnostic/css/scale/index.test.js +71 -0
  55. package/agnostic/css/styles-set/index.js +151 -169
  56. package/agnostic/errors/register/index.js +45 -51
  57. package/agnostic/errors/unknown-to-string/index.js +18 -7
  58. package/agnostic/errors/unknown-to-string/index.test.js +35 -0
  59. package/agnostic/html/get-node-ancestors/index.js +31 -8
  60. package/agnostic/html/get-node-ancestors/index.test.js +58 -0
  61. package/agnostic/html/get-position-inside-parent/index.js +13 -10
  62. package/agnostic/html/get-position-inside-parent/index.test.js +56 -0
  63. package/agnostic/html/hyper-json/cast/index.js +137 -24
  64. package/agnostic/html/hyper-json/index.js +23 -50
  65. package/agnostic/html/hyper-json/method/index.js +10 -7
  66. package/agnostic/html/hyper-json/serialize/index.js +91 -11
  67. package/agnostic/html/hyper-json/smart-tags/coalesced/add/index.js +16 -24
  68. package/agnostic/html/hyper-json/smart-tags/coalesced/addclass/index.js +30 -24
  69. package/agnostic/html/hyper-json/smart-tags/coalesced/and/index.js +15 -24
  70. package/agnostic/html/hyper-json/smart-tags/coalesced/append/index.js +36 -24
  71. package/agnostic/html/hyper-json/smart-tags/coalesced/at/index.js +47 -24
  72. package/agnostic/html/hyper-json/smart-tags/coalesced/call/index.js +50 -24
  73. package/agnostic/html/hyper-json/smart-tags/coalesced/clone/index.js +11 -24
  74. package/agnostic/html/hyper-json/smart-tags/coalesced/deleteproperties/index.js +49 -24
  75. package/agnostic/html/hyper-json/smart-tags/coalesced/equals/index.js +24 -24
  76. package/agnostic/html/hyper-json/smart-tags/coalesced/getattribute/index.js +28 -24
  77. package/agnostic/html/hyper-json/smart-tags/coalesced/getproperties/index.js +21 -24
  78. package/agnostic/html/hyper-json/smart-tags/coalesced/getproperty/index.js +73 -26
  79. package/agnostic/html/hyper-json/smart-tags/coalesced/hjparse/index.js +24 -24
  80. package/agnostic/html/hyper-json/smart-tags/coalesced/hjstringify/index.js +93 -28
  81. package/agnostic/html/hyper-json/smart-tags/coalesced/if/index.js +22 -24
  82. package/agnostic/html/hyper-json/smart-tags/coalesced/index.d.ts +14 -14
  83. package/agnostic/html/hyper-json/smart-tags/coalesced/index.js +14 -14
  84. package/agnostic/html/hyper-json/smart-tags/coalesced/initialize/index.js +39 -24
  85. package/agnostic/html/hyper-json/smart-tags/coalesced/join/index.js +18 -24
  86. package/agnostic/html/hyper-json/smart-tags/coalesced/length/index.js +23 -24
  87. package/agnostic/html/hyper-json/smart-tags/coalesced/map/index.js +33 -24
  88. package/agnostic/html/hyper-json/smart-tags/coalesced/negate/index.js +11 -24
  89. package/agnostic/html/hyper-json/smart-tags/coalesced/notrailing/index.js +35 -24
  90. package/agnostic/html/hyper-json/smart-tags/coalesced/or/index.js +15 -24
  91. package/agnostic/html/hyper-json/smart-tags/coalesced/pickrandom/index.js +19 -24
  92. package/agnostic/html/hyper-json/smart-tags/coalesced/populate/index.js +61 -24
  93. package/agnostic/html/hyper-json/smart-tags/coalesced/print/index.js +25 -24
  94. package/agnostic/html/hyper-json/smart-tags/coalesced/push/index.js +11 -24
  95. package/agnostic/html/hyper-json/smart-tags/coalesced/pusheach/index.js +28 -24
  96. package/agnostic/html/hyper-json/smart-tags/coalesced/recordtoarray/index.js +11 -24
  97. package/agnostic/html/hyper-json/smart-tags/coalesced/removeattribute/index.js +58 -24
  98. package/agnostic/html/hyper-json/smart-tags/coalesced/removeclass/index.js +30 -24
  99. package/agnostic/html/hyper-json/smart-tags/coalesced/renameproperty/index.js +34 -24
  100. package/agnostic/html/hyper-json/smart-tags/coalesced/replace/index.js +56 -26
  101. package/agnostic/html/hyper-json/smart-tags/coalesced/select/index.js +34 -24
  102. package/agnostic/html/hyper-json/smart-tags/coalesced/set/index.js +31 -24
  103. package/agnostic/html/hyper-json/smart-tags/coalesced/setattribute/index.js +58 -24
  104. package/agnostic/html/hyper-json/smart-tags/coalesced/setproperty/index.js +237 -26
  105. package/agnostic/html/hyper-json/smart-tags/coalesced/sorton/index.js +93 -24
  106. package/agnostic/html/hyper-json/smart-tags/coalesced/split/index.js +22 -24
  107. package/agnostic/html/hyper-json/smart-tags/coalesced/spread/index.js +24 -24
  108. package/agnostic/html/hyper-json/smart-tags/coalesced/toarray/index.js +12 -24
  109. package/agnostic/html/hyper-json/smart-tags/coalesced/toboolean/index.js +12 -24
  110. package/agnostic/html/hyper-json/smart-tags/coalesced/toelement/index.js +19 -24
  111. package/agnostic/html/hyper-json/smart-tags/coalesced/toggleclass/index.js +30 -24
  112. package/agnostic/html/hyper-json/smart-tags/coalesced/tonodelist/index.js +12 -24
  113. package/agnostic/html/hyper-json/smart-tags/coalesced/tonull/index.js +11 -24
  114. package/agnostic/html/hyper-json/smart-tags/coalesced/tonumber/index.js +12 -24
  115. package/agnostic/html/hyper-json/smart-tags/coalesced/torecord/index.js +12 -24
  116. package/agnostic/html/hyper-json/smart-tags/coalesced/toref/index.js +12 -24
  117. package/agnostic/html/hyper-json/smart-tags/coalesced/tostring/index.js +12 -24
  118. package/agnostic/html/hyper-json/smart-tags/coalesced/totext/index.js +12 -24
  119. package/agnostic/html/hyper-json/smart-tags/coalesced/transformselected/index.js +86 -24
  120. package/agnostic/html/hyper-json/smart-tags/coalesced/trim/index.js +16 -24
  121. package/agnostic/html/hyper-json/smart-tags/index.js +31 -10
  122. package/agnostic/html/hyper-json/smart-tags/isolated/any/index.js +14 -11
  123. package/agnostic/html/hyper-json/smart-tags/isolated/array/index.js +14 -11
  124. package/agnostic/html/hyper-json/smart-tags/isolated/boolean/index.js +13 -24
  125. package/agnostic/html/hyper-json/smart-tags/isolated/element/index.js +26 -24
  126. package/agnostic/html/hyper-json/smart-tags/isolated/get/index.js +20 -24
  127. package/agnostic/html/hyper-json/smart-tags/isolated/guess/index.js +59 -24
  128. package/agnostic/html/hyper-json/smart-tags/isolated/index.d.ts +1 -1
  129. package/agnostic/html/hyper-json/smart-tags/isolated/index.js +1 -1
  130. package/agnostic/html/hyper-json/smart-tags/isolated/nodelist/index.js +20 -24
  131. package/agnostic/html/hyper-json/smart-tags/isolated/null/index.js +10 -11
  132. package/agnostic/html/hyper-json/smart-tags/isolated/number/index.js +18 -24
  133. package/agnostic/html/hyper-json/smart-tags/isolated/record/index.js +14 -24
  134. package/agnostic/html/hyper-json/smart-tags/isolated/ref/index.js +45 -25
  135. package/agnostic/html/hyper-json/smart-tags/isolated/string/index.js +18 -24
  136. package/agnostic/html/hyper-json/smart-tags/isolated/text/index.js +20 -24
  137. package/agnostic/html/hyper-json/transformer/index.js +113 -9
  138. package/agnostic/html/hyper-json/tree/index.js +423 -24
  139. package/agnostic/html/hyper-json/types/index.js +28 -7
  140. package/agnostic/html/hyper-json/utils/index.js +516 -24
  141. package/agnostic/html/index.d.ts +2 -2
  142. package/agnostic/html/index.js +2 -2
  143. package/agnostic/html/insert-node/index.js +28 -7
  144. package/agnostic/html/insert-node/index.test.js +73 -0
  145. package/agnostic/html/placeholders/index.js +26 -31
  146. package/agnostic/html/replace-in-element/index.js +31 -25
  147. package/agnostic/html/replace-in-element/index.test.js +80 -0
  148. package/agnostic/html/selector-to-element/index.js +53 -33
  149. package/agnostic/html/selector-to-element/index.test.js +69 -0
  150. package/agnostic/html/string-to-nodes/index.js +24 -19
  151. package/agnostic/html/string-to-nodes/index.test.js +54 -0
  152. package/agnostic/index.d.ts +1 -1
  153. package/agnostic/index.js +1 -1
  154. package/agnostic/misc/assert/index.js +60 -58
  155. package/agnostic/misc/cast/index.js +132 -23
  156. package/agnostic/misc/cast/index.test.js +134 -0
  157. package/agnostic/misc/connection/index.js +55 -30
  158. package/agnostic/misc/connection/index.test.js +143 -0
  159. package/agnostic/misc/crawler/index.js +68 -44
  160. package/agnostic/misc/crawler/index.test.js +56 -0
  161. package/agnostic/misc/crossenv/detect-runtime/index.js +41 -16
  162. package/agnostic/misc/crossenv/detect-runtime/index.test.js +24 -0
  163. package/agnostic/misc/crossenv/types.js +21 -7
  164. package/agnostic/misc/crossenv/window/index.js +49 -13
  165. package/agnostic/misc/crossenv/window/index.test.js +24 -0
  166. package/agnostic/misc/data-size/index.js +182 -296
  167. package/agnostic/misc/data-size/index.test.js +100 -0
  168. package/agnostic/misc/data-size/types.js +1 -0
  169. package/agnostic/misc/index.d.ts +1 -1
  170. package/agnostic/misc/index.js +1 -1
  171. package/agnostic/misc/is-constructor-function/index.js +13 -7
  172. package/agnostic/misc/is-constructor-function/index.test.js +36 -0
  173. package/agnostic/misc/is-nullish/index.js +26 -11
  174. package/agnostic/misc/is-nullish/index.test.js +44 -0
  175. package/agnostic/misc/logs/logger/index.js +115 -142
  176. package/agnostic/misc/logs/make-text-block/index.js +14 -7
  177. package/agnostic/misc/logs/styles/index.js +30 -7
  178. package/agnostic/misc/lorem-ipsum/index.js +51 -186
  179. package/agnostic/misc/lorem-ipsum/index.test.js +49 -0
  180. package/agnostic/misc/normalize-extension/index.js +99 -90
  181. package/agnostic/misc/normalize-extension/index.test.js +40 -0
  182. package/agnostic/misc/outcome/index.js +21 -11
  183. package/agnostic/misc/outcome/index.test.js +40 -0
  184. package/agnostic/numbers/absolute-modulo/index.js +10 -7
  185. package/agnostic/numbers/absolute-modulo/index.test.js +23 -0
  186. package/agnostic/numbers/approximate-rational/index.js +86 -71
  187. package/agnostic/numbers/approximate-rational/index.test.js +90 -0
  188. package/agnostic/numbers/clamp/index.js +13 -7
  189. package/agnostic/numbers/clamp/index.test.js +24 -0
  190. package/agnostic/numbers/geometric-progressions/index.js +26 -7
  191. package/agnostic/numbers/geometric-progressions/index.test.js +45 -0
  192. package/agnostic/numbers/index.d.ts +1 -1
  193. package/agnostic/numbers/index.js +1 -1
  194. package/agnostic/numbers/interpolate/index.js +25 -12
  195. package/agnostic/numbers/interpolate/index.test.js +40 -0
  196. package/agnostic/numbers/round/index.js +33 -11
  197. package/agnostic/numbers/round/index.test.js +56 -0
  198. package/agnostic/objects/deep-get-property/index.js +30 -26
  199. package/agnostic/objects/deep-get-property/index.test.js +59 -0
  200. package/agnostic/objects/enums/is-in-enum/index.js +18 -7
  201. package/agnostic/objects/enums/is-in-enum/index.test.js +100 -0
  202. package/agnostic/objects/flatten-getters/index.js +15 -16
  203. package/agnostic/objects/flatten-getters/index.test.js +78 -0
  204. package/agnostic/objects/index.d.ts +3 -3
  205. package/agnostic/objects/index.js +3 -3
  206. package/agnostic/objects/is-object/index.js +18 -9
  207. package/agnostic/objects/is-object/index.test.js +60 -0
  208. package/agnostic/objects/is-record/index.js +13 -7
  209. package/agnostic/objects/is-record/index.test.js +48 -0
  210. package/agnostic/objects/record-format/index.js +18 -14
  211. package/agnostic/objects/record-format/index.test.js +92 -0
  212. package/agnostic/objects/record-map/index.js +18 -7
  213. package/agnostic/objects/record-map/index.test.js +56 -0
  214. package/agnostic/objects/sort-keys/index.js +15 -13
  215. package/agnostic/objects/sort-keys/index.test.js +37 -0
  216. package/agnostic/objects/validation/index.js +21 -10
  217. package/agnostic/objects/validation/index.test.js +72 -0
  218. package/agnostic/optim/index.d.ts +1 -1
  219. package/agnostic/optim/index.js +1 -1
  220. package/agnostic/optim/memoize/index.js +24 -18
  221. package/agnostic/optim/memoize/index.test.js +30 -0
  222. package/agnostic/optim/throttle-debounce/index.js +120 -104
  223. package/agnostic/optim/throttle-debounce/index.test.js +44 -0
  224. package/agnostic/optim/throttle-debounce/types.js +1 -0
  225. package/agnostic/random/hex-char/index.js +9 -9
  226. package/agnostic/random/hex-char/index.test.js +20 -0
  227. package/agnostic/random/index.d.ts +1 -1
  228. package/agnostic/random/index.js +1 -1
  229. package/agnostic/random/random/index.js +19 -9
  230. package/agnostic/random/random/index.test.js +73 -0
  231. package/agnostic/random/uuid/index.js +31 -12
  232. package/agnostic/random/uuid/index.test.js +45 -0
  233. package/agnostic/regexps/index.js +126 -86
  234. package/agnostic/regexps/index.test.js +108 -0
  235. package/agnostic/sanitization/file-name/index.js +25 -7
  236. package/agnostic/sanitization/file-name/index.test.js +23 -0
  237. package/agnostic/sanitization/html/index.js +172 -116
  238. package/agnostic/sanitization/path/index.js +23 -13
  239. package/agnostic/sanitization/path/index.test.js +18 -0
  240. package/agnostic/sanitization/types.js +1 -0
  241. package/agnostic/sanitization/user-input/index.js +36 -26
  242. package/agnostic/sanitization/user-input/index.test.js +31 -0
  243. package/agnostic/strings/char-codes/index.js +123 -57
  244. package/agnostic/strings/matches/index.js +38 -11
  245. package/agnostic/strings/normalize-indent/index.js +34 -18
  246. package/agnostic/strings/parse-table/index.js +153 -84
  247. package/agnostic/strings/replace-all/index.js +36 -17
  248. package/agnostic/strings/to-alphanum/index.js +23 -10
  249. package/agnostic/strings/trim/index.js +24 -9
  250. package/agnostic/time/dates/format-date/index.js +140 -74
  251. package/agnostic/time/duration/index.js +106 -142
  252. package/agnostic/time/timeout/index.js +24 -18
  253. package/agnostic/time/transitions/index.js +200 -156
  254. package/agnostic/time/wait/index.js +11 -7
  255. package/agnostic/typescript/types.js +1 -0
  256. package/components/BeforeAfter/index.controlled.js +95 -0
  257. package/components/BeforeAfter/index.js +54 -152
  258. package/components/BeforeAfter/utils.js +9 -0
  259. package/components/Disclaimer/index.js +50 -9
  260. package/components/Drawer/index.js +82 -88
  261. package/components/EventListener/index.js +29 -47
  262. package/components/Gallery/index.js +146 -190
  263. package/components/Gallery/utils.js +12 -0
  264. package/components/Image/index.js +67 -106
  265. package/components/IntersectionObserver/index.js +62 -9
  266. package/components/Overlayer/index.js +59 -66
  267. package/components/Paginator/index.js +125 -9
  268. package/components/ResizeObserver/index.js +68 -9
  269. package/components/ResizeObserver/style.module.css +0 -0
  270. package/components/Scrllgngn/index.js +176 -183
  271. package/components/ScrollListener/index.js +97 -171
  272. package/components/ScrollListener/utils.js +51 -0
  273. package/components/Sequencer/index.controlled.js +67 -0
  274. package/components/Sequencer/index.js +105 -160
  275. package/components/ShadowRoot/index.js +42 -63
  276. package/components/Subtitles/index.js +107 -13
  277. package/components/Subtitles/types.js +1 -0
  278. package/components/Subtitles/utils.js +102 -0
  279. package/components/Theatre/index.js +89 -9
  280. package/components/UIModule/index.js +156 -146
  281. package/components/Video/index.d.ts +10 -0
  282. package/components/Video/index.js +292 -503
  283. package/components/Video/utils.js +137 -0
  284. package/components/_WIP_AudioQuote/index.js +1 -0
  285. package/components/_WIP_Icon/index.js +1 -0
  286. package/components/index.d.ts +2 -2
  287. package/components/index.js +2 -2
  288. package/components/public-classnames.js +18 -0
  289. package/components/utils/index.js +12 -7
  290. package/components/utils/types.js +1 -0
  291. package/index.d.ts +1 -2
  292. package/index.js +1 -2
  293. package/node/@aws-s3/index.test.js +6 -0
  294. package/node/@aws-s3/storage/directory/copy-dir/index.js +68 -9
  295. package/node/@aws-s3/storage/directory/index.d.ts +1 -1
  296. package/node/@aws-s3/storage/directory/index.js +1 -1
  297. package/node/@aws-s3/storage/directory/list/index.js +33 -9
  298. package/node/@aws-s3/storage/directory/move-dir/index.js +69 -9
  299. package/node/@aws-s3/storage/directory/remove-dir/index.js +59 -9
  300. package/node/@aws-s3/storage/file/copy/index.js +43 -9
  301. package/node/@aws-s3/storage/file/download/index.js +30 -9
  302. package/node/@aws-s3/storage/file/exists/index.js +37 -9
  303. package/node/@aws-s3/storage/file/index.d.ts +1 -1
  304. package/node/@aws-s3/storage/file/index.js +1 -1
  305. package/node/@aws-s3/storage/file/move/index.js +60 -9
  306. package/node/@aws-s3/storage/file/remove/index.js +38 -9
  307. package/node/@aws-s3/storage/file/stat/index.js +34 -9
  308. package/node/@aws-s3/storage/file/upload/index.js +55 -9
  309. package/node/@design-edito/index.js +1 -0
  310. package/node/@express/@multer/index.js +61 -45
  311. package/node/@google-cloud/storage/bucket/get-metadata/index.js +25 -21
  312. package/node/@google-cloud/storage/directory/copy-dir/index.js +38 -9
  313. package/node/@google-cloud/storage/directory/list/index.js +29 -9
  314. package/node/@google-cloud/storage/directory/move-dir/index.js +45 -9
  315. package/node/@google-cloud/storage/directory/remove-dir/index.js +36 -9
  316. package/node/@google-cloud/storage/file/copy/index.js +37 -9
  317. package/node/@google-cloud/storage/file/download/index.js +28 -9
  318. package/node/@google-cloud/storage/file/exists/index.js +26 -9
  319. package/node/@google-cloud/storage/file/generate-signed-url/index.js +33 -27
  320. package/node/@google-cloud/storage/file/get-metadata/index.js +28 -23
  321. package/node/@google-cloud/storage/file/get-permissions/index.js +25 -23
  322. package/node/@google-cloud/storage/file/index.d.ts +1 -1
  323. package/node/@google-cloud/storage/file/index.js +1 -1
  324. package/node/@google-cloud/storage/file/move/index.js +40 -9
  325. package/node/@google-cloud/storage/file/remove/index.js +36 -9
  326. package/node/@google-cloud/storage/file/revoke-signed-urls/index.js +32 -29
  327. package/node/@google-cloud/storage/file/stat/index.js +35 -9
  328. package/node/@google-cloud/storage/file/update-metadata/index.js +30 -23
  329. package/node/@google-cloud/storage/file/upload/index.js +47 -9
  330. package/node/cloud-storage/clients/index.js +35 -13
  331. package/node/cloud-storage/operations/copy-dir/index.js +30 -34
  332. package/node/cloud-storage/operations/copy-file/index.js +30 -34
  333. package/node/cloud-storage/operations/download-file/index.js +30 -34
  334. package/node/cloud-storage/operations/exists-file/index.js +30 -34
  335. package/node/cloud-storage/operations/list-dir/index.js +29 -34
  336. package/node/cloud-storage/operations/move-dir/index.js +30 -34
  337. package/node/cloud-storage/operations/move-file/index.js +30 -34
  338. package/node/cloud-storage/operations/remove-dir/index.js +29 -34
  339. package/node/cloud-storage/operations/remove-file/index.js +29 -34
  340. package/node/cloud-storage/operations/stat-file/index.js +29 -34
  341. package/node/cloud-storage/operations/upload-file/index.js +30 -34
  342. package/node/encryption/@aes-256-gcm/buffer/index.js +31 -26
  343. package/node/encryption/@aes-256-gcm/index.d.ts +1 -1
  344. package/node/encryption/@aes-256-gcm/index.js +1 -1
  345. package/node/encryption/@aes-256-gcm/uint8-array/index.js +57 -11
  346. package/node/encryption/key/index.js +19 -14
  347. package/node/files/is-in-directory/index.js +11 -10
  348. package/node/files/read-write/index.js +11 -17
  349. package/node/files/subpaths/index.js +156 -113
  350. package/node/ftps/directory/copy-dir/index.js +58 -9
  351. package/node/ftps/directory/index.d.ts +1 -1
  352. package/node/ftps/directory/index.js +1 -1
  353. package/node/ftps/directory/list/index.js +25 -9
  354. package/node/ftps/directory/move-dir/index.js +41 -9
  355. package/node/ftps/directory/remove-dir/index.js +42 -9
  356. package/node/ftps/file/copy/index.js +45 -9
  357. package/node/ftps/file/download/index.js +30 -9
  358. package/node/ftps/file/exists/index.js +39 -9
  359. package/node/ftps/file/index.d.ts +1 -1
  360. package/node/ftps/file/index.js +1 -1
  361. package/node/ftps/file/move/index.js +49 -9
  362. package/node/ftps/file/remove/index.js +40 -9
  363. package/node/ftps/file/stat/index.js +31 -9
  364. package/node/ftps/file/upload/index.js +44 -9
  365. package/node/images/create/index.js +10 -18
  366. package/node/images/format/index.js +264 -251
  367. package/node/images/index.d.ts +1 -1
  368. package/node/images/index.js +1 -1
  369. package/node/images/metadata/index.js +10 -18
  370. package/node/images/transform/index.js +168 -203
  371. package/node/images/transform/operations/blur/index.js +12 -10
  372. package/node/images/transform/operations/brighten/index.js +12 -10
  373. package/node/images/transform/operations/extend/index.js +26 -17
  374. package/node/images/transform/operations/extract/index.js +17 -10
  375. package/node/images/transform/operations/flatten/index.js +21 -17
  376. package/node/images/transform/operations/flip/index.js +3 -7
  377. package/node/images/transform/operations/flop/index.js +3 -7
  378. package/node/images/transform/operations/hue/index.js +14 -10
  379. package/node/images/transform/operations/index.d.ts +2 -2
  380. package/node/images/transform/operations/index.js +2 -2
  381. package/node/images/transform/operations/level/index.js +15 -10
  382. package/node/images/transform/operations/lighten/index.js +14 -10
  383. package/node/images/transform/operations/normalize/index.js +15 -10
  384. package/node/images/transform/operations/overlay/index.js +90 -17
  385. package/node/images/transform/operations/resize/index.js +47 -17
  386. package/node/images/transform/operations/rotate/index.js +21 -17
  387. package/node/images/transform/operations/saturate/index.js +16 -10
  388. package/node/images/types.js +34 -9
  389. package/node/images/utils/index.js +85 -19
  390. package/node/index.d.ts +3 -3
  391. package/node/index.js +3 -3
  392. package/node/process/on-exit/index.js +45 -28
  393. package/node/process/prompt-continue/index.js +29 -16
  394. package/node/process/spawner/index.js +104 -80
  395. package/node/sftp/directory/copy-dir/index.js +55 -9
  396. package/node/sftp/directory/list/index.js +23 -9
  397. package/node/sftp/directory/move-dir/index.js +38 -9
  398. package/node/sftp/directory/remove-dir/index.js +42 -9
  399. package/node/sftp/file/copy/index.js +40 -9
  400. package/node/sftp/file/download/index.js +27 -9
  401. package/node/sftp/file/exists/index.js +30 -9
  402. package/node/sftp/file/index.d.ts +2 -2
  403. package/node/sftp/file/index.js +2 -2
  404. package/node/sftp/file/move/index.js +42 -9
  405. package/node/sftp/file/remove/index.js +33 -9
  406. package/node/sftp/file/stat/index.js +28 -9
  407. package/node/sftp/file/upload/index.js +36 -9
  408. package/package.json +1 -8
  409. package/chunks/chunk-2FNCUXAX.js +0 -27
  410. package/chunks/chunk-2GJSPEO4.js +0 -31
  411. package/chunks/chunk-2IGP6V77.js +0 -22
  412. package/chunks/chunk-3QI2MSDK.js +0 -34
  413. package/chunks/chunk-3RNLPW7B.js +0 -101
  414. package/chunks/chunk-3RZMW72G.js +0 -33
  415. package/chunks/chunk-4KLCJX2T.js +0 -36
  416. package/chunks/chunk-4LTN4SCD.js +0 -55
  417. package/chunks/chunk-4Q4T7QQO.js +0 -27
  418. package/chunks/chunk-4Q5TKOIG.js +0 -53
  419. package/chunks/chunk-57YKZBJR.js +0 -29
  420. package/chunks/chunk-5H3IRSOB.js +0 -8
  421. package/chunks/chunk-5NTPCRFH.js +0 -32
  422. package/chunks/chunk-5TM235Z3.js +0 -40
  423. package/chunks/chunk-5WVGUZL5.js +0 -35
  424. package/chunks/chunk-6XL25OZX.js +0 -12
  425. package/chunks/chunk-75BICI4L.js +0 -20
  426. package/chunks/chunk-77SWZUHV.js +0 -31
  427. package/chunks/chunk-AC4UMIWM.js +0 -124
  428. package/chunks/chunk-AG4VERYN.js +0 -25
  429. package/chunks/chunk-AP3VYSVF.js +0 -36
  430. package/chunks/chunk-ASXK7XCC.js +0 -18
  431. package/chunks/chunk-AVIMGMTP.js +0 -17
  432. package/chunks/chunk-B4HGXMP3.js +0 -20
  433. package/chunks/chunk-B5V7D2ZL.js +0 -77
  434. package/chunks/chunk-B6653QJD.js +0 -37
  435. package/chunks/chunk-BCX4HPD7.js +0 -33
  436. package/chunks/chunk-CVMYA5XK.js +0 -632
  437. package/chunks/chunk-DMWGHBIL.js +0 -25
  438. package/chunks/chunk-DNIOWD7K.js +0 -8
  439. package/chunks/chunk-E2ZY3SEW.js +0 -26
  440. package/chunks/chunk-E6MSDKON.js +0 -13
  441. package/chunks/chunk-E7BBN5JC.js +0 -22
  442. package/chunks/chunk-EX2QKFY5.js +0 -41
  443. package/chunks/chunk-EYYNCLVR.js +0 -33
  444. package/chunks/chunk-F2YJXIT7.js +0 -78
  445. package/chunks/chunk-FSNNEPY5.js +0 -37
  446. package/chunks/chunk-GG4EFNMU.js +0 -89
  447. package/chunks/chunk-GQBFMP6N.js +0 -32
  448. package/chunks/chunk-H3HRQ52T.js +0 -32
  449. package/chunks/chunk-H4PP6AHP.js +0 -15
  450. package/chunks/chunk-HC6ZOHCS.js +0 -14
  451. package/chunks/chunk-HMMPT3UM.js +0 -47
  452. package/chunks/chunk-HQLRJ7XW.js +0 -12
  453. package/chunks/chunk-HYGUIF2O.js +0 -23
  454. package/chunks/chunk-HYPEWMYZ.js +0 -10
  455. package/chunks/chunk-I5MRXMHR.js +0 -32
  456. package/chunks/chunk-I6ZP5T5V.js +0 -10
  457. package/chunks/chunk-IEZ3O5OF.js +0 -40
  458. package/chunks/chunk-IPRWXI27.js +0 -31
  459. package/chunks/chunk-IRKZUMWZ.js +0 -38
  460. package/chunks/chunk-ISJONMNA.js +0 -16
  461. package/chunks/chunk-JB27MAKY.js +0 -22
  462. package/chunks/chunk-JZ6GM444.js +0 -43
  463. package/chunks/chunk-K5UF634H.js +0 -25
  464. package/chunks/chunk-LEBGVBYD.js +0 -138
  465. package/chunks/chunk-LJ5MGLLU.js +0 -56
  466. package/chunks/chunk-LUAYN7VJ.js +0 -27
  467. package/chunks/chunk-MDVGDZU6.js +0 -25
  468. package/chunks/chunk-ML22TIBW.js +0 -37
  469. package/chunks/chunk-MO4TRYNI.js +0 -29
  470. package/chunks/chunk-MSU7JU63.js +0 -49
  471. package/chunks/chunk-NIBRPZJD.js +0 -58
  472. package/chunks/chunk-O32IRXDX.js +0 -78
  473. package/chunks/chunk-OAX7GS7C.js +0 -36
  474. package/chunks/chunk-OBSTP7YR.js +0 -257
  475. package/chunks/chunk-OFCSIK6J.js +0 -13
  476. package/chunks/chunk-OFYGPRWE.js +0 -21
  477. package/chunks/chunk-OGBUSUE6.js +0 -12
  478. package/chunks/chunk-OSAXBA7G.js +0 -10
  479. package/chunks/chunk-OT7QXCH6.js +0 -23
  480. package/chunks/chunk-P4J6S2WQ.js +0 -64
  481. package/chunks/chunk-PUQUSA6S.js +0 -12
  482. package/chunks/chunk-PYJKFOMV.js +0 -193
  483. package/chunks/chunk-QHEWBOQI.js +0 -19
  484. package/chunks/chunk-QXAJXTXV.js +0 -19
  485. package/chunks/chunk-R3AWQXMY.js +0 -20
  486. package/chunks/chunk-R66GH2MQ.js +0 -38
  487. package/chunks/chunk-RART44AF.js +0 -21
  488. package/chunks/chunk-REXSJULD.js +0 -28
  489. package/chunks/chunk-RJRNYRPM.js +0 -23
  490. package/chunks/chunk-RKX6KLPQ.js +0 -47
  491. package/chunks/chunk-RW7VAKJW.js +0 -15
  492. package/chunks/chunk-RZOR7ZC3.js +0 -35
  493. package/chunks/chunk-S2UZ3HZR.js +0 -31
  494. package/chunks/chunk-SYH5LYQC.js +0 -28
  495. package/chunks/chunk-TAXFCVFE.js +0 -30
  496. package/chunks/chunk-TNZGRXKJ.js +0 -24
  497. package/chunks/chunk-TRFZSKNB.js +0 -32
  498. package/chunks/chunk-U664BT44.js +0 -45
  499. package/chunks/chunk-U6SGKHHA.js +0 -32
  500. package/chunks/chunk-UTQNGKGQ.js +0 -60
  501. package/chunks/chunk-VPBZS3S4.js +0 -27
  502. package/chunks/chunk-W5A2TON3.js +0 -10
  503. package/chunks/chunk-W7PJ5NQQ.js +0 -23
  504. package/chunks/chunk-WGRQXVBK.js +0 -207
  505. package/chunks/chunk-WIFHP4X7.js +0 -56
  506. package/chunks/chunk-WL4WNJ2Y.js +0 -39
  507. package/chunks/chunk-WNDMYNDU.js +0 -8
  508. package/chunks/chunk-WSFCRVEQ.js +0 -9
  509. package/chunks/chunk-WZS4Q3G3.js +0 -36
  510. package/chunks/chunk-X4YSGOKG.js +0 -2673
  511. package/chunks/chunk-XA4HVHJ4.js +0 -18
  512. package/chunks/chunk-XEQ2PBT2.js +0 -20
  513. package/chunks/chunk-XFB4PUXO.js +0 -78
  514. package/chunks/chunk-XIIJYVJZ.js +0 -15
  515. package/chunks/chunk-XNF5MLCQ.js +0 -14
  516. package/chunks/chunk-XQUMWHCH.js +0 -25
  517. package/chunks/chunk-YA2YCZUF.js +0 -8
  518. package/chunks/chunk-YDIBNEGA.js +0 -9
  519. package/chunks/chunk-YHMR7IBA.js +0 -24
  520. package/chunks/chunk-YWSXCFYY.js +0 -61
  521. package/chunks/chunk-YY3TSU22.js +0 -48
  522. package/chunks/chunk-ZAP3ELDE.js +0 -40
  523. package/chunks/chunk-ZJNQRKEJ.js +0 -105
  524. package/chunks/chunk-ZJR5ASR3.js +0 -26
  525. package/chunks/index.d.ts +0 -1
  526. package/chunks/index.js +0 -1
@@ -0,0 +1,56 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { recordMap } from './index.js';
3
+ describe('recordMap', () => {
4
+ it('maps values using the mapper function', () => {
5
+ const record = { a: 1, b: 2, c: 3 };
6
+ const result = recordMap(record, val => val * 2);
7
+ expect(result).toEqual({ a: 2, b: 4, c: 6 });
8
+ });
9
+ it('preserves keys while transforming values', () => {
10
+ const record = { x: 'hello', y: 'world' };
11
+ const result = recordMap(record, val => val.toUpperCase());
12
+ expect(result).toEqual({ x: 'HELLO', y: 'WORLD' });
13
+ });
14
+ it('provides both value and key to mapper function', () => {
15
+ const record = { a: 1, b: 2 };
16
+ const result = recordMap(record, (val, key) => `${key}:${val}`);
17
+ expect(result).toEqual({ a: 'a:1', b: 'b:2' });
18
+ });
19
+ it('handles empty records', () => {
20
+ const record = {};
21
+ const result = recordMap(record, val => val);
22
+ expect(result).toEqual({});
23
+ });
24
+ it('handles records with different value types', () => {
25
+ const record = { num: 5, str: 'test', bool: true };
26
+ const result = recordMap(record, val => String(val));
27
+ expect(result).toEqual({ num: '5', str: 'test', bool: 'true' });
28
+ });
29
+ it('handles mapper that changes value type', () => {
30
+ const record = { a: 1, b: 2, c: 3 };
31
+ const result = recordMap(record, val => val > 2);
32
+ expect(result).toEqual({ a: false, b: false, c: true });
33
+ });
34
+ it('handles mapper that returns objects', () => {
35
+ const record = { a: 1, b: 2 };
36
+ const result = recordMap(record, val => ({ value: val }));
37
+ expect(result).toEqual({ a: { value: 1 }, b: { value: 2 } });
38
+ });
39
+ it('handles mapper that returns arrays', () => {
40
+ const record = { a: 1, b: 2 };
41
+ const result = recordMap(record, val => [val, val * 2]);
42
+ expect(result).toEqual({ a: [1, 2], b: [2, 4] });
43
+ });
44
+ it('only processes own properties', () => {
45
+ const parent = { inherited: 'value' };
46
+ const record = Object.create(parent);
47
+ record.own = 'ownValue';
48
+ const result = recordMap(record, val => val.toUpperCase());
49
+ expect(result).toEqual({ own: 'OWNVALUE' });
50
+ });
51
+ it('handles numeric string keys', () => {
52
+ const record = { '0': 'zero', '1': 'one', '2': 'two' };
53
+ const result = recordMap(record, val => val.toUpperCase());
54
+ expect(result).toEqual({ '0': 'ZERO', '1': 'ONE', '2': 'TWO' });
55
+ });
56
+ });
@@ -1,14 +1,16 @@
1
- import "../../../chunks/chunk-WSFCRVEQ.js";
2
-
3
- // src/agnostic/objects/sort-keys/index.ts
4
- function sortKeys(obj, sorter = (a, b) => String(a).localeCompare(String(b))) {
5
- const out = {};
6
- const keys = Object.keys(obj);
7
- for (const key of keys.sort(sorter)) {
8
- out[key] = obj[key];
9
- }
10
- return out;
1
+ /**
2
+ * Returns a new object with the keys sorted according to the provided sorter.
3
+ *
4
+ * @template T - The type of the input object.
5
+ * @param {T} obj - The object whose keys should be sorted.
6
+ * @param {(a: keyof T, b: keyof T) => number} [sorter] - Optional function used to compare keys for sorting. Defaults to alphabetical order.
7
+ * @returns {{ [K in keyof T]: T[K] }} A new object with the same keys and values as the input, but sorted by key.
8
+ */
9
+ export function sortKeys(obj, sorter = (a, b) => String(a).localeCompare(String(b))) {
10
+ const out = {};
11
+ const keys = Object.keys(obj);
12
+ for (const key of keys.sort(sorter)) {
13
+ out[key] = obj[key];
14
+ }
15
+ return out;
11
16
  }
12
- export {
13
- sortKeys
14
- };
@@ -0,0 +1,37 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { sortKeys } from './index.js';
3
+ describe('sortKeys', () => {
4
+ it('returns a new object with keys sorted alphabetically by default', () => {
5
+ const inp = { b: 2, a: 1, c: 3 };
6
+ const out = sortKeys(inp);
7
+ expect(Object.keys(out)).toEqual(['a', 'b', 'c']);
8
+ expect(out).toEqual({ a: 1, b: 2, c: 3 });
9
+ });
10
+ it('preserves the value types for each key', () => {
11
+ const inp = { b: 'str', a: 42 };
12
+ const out = sortKeys(inp, (a, b) => a.localeCompare(b));
13
+ expect(out.a).toBe(42);
14
+ expect(out.b).toBe('str');
15
+ });
16
+ it('does not modify the original object', () => {
17
+ const inp = { b: 2, a: 1 };
18
+ const copy = { ...inp };
19
+ sortKeys(inp, (a, b) => a.localeCompare(b));
20
+ expect(inp).toEqual(copy);
21
+ });
22
+ it('works with custom sorter', () => {
23
+ const inp = { a: 1, b: 2, c: 3 };
24
+ const out = sortKeys(inp, (a, b) => b.localeCompare(a)); // reverse
25
+ expect(Object.keys(out)).toEqual(['c', 'b', 'a']);
26
+ });
27
+ it('works with single-key objects', () => {
28
+ const inp = { only: 1 };
29
+ const out = sortKeys(inp, (a, b) => a.localeCompare(b));
30
+ expect(out).toEqual({ only: 1 });
31
+ });
32
+ it('works with empty objects', () => {
33
+ const inp = {};
34
+ const out = sortKeys(inp, (a, b) => a.localeCompare(b));
35
+ expect(out).toEqual({});
36
+ });
37
+ });
@@ -1,11 +1,22 @@
1
- import "../../../chunks/chunk-WSFCRVEQ.js";
2
-
3
- // src/agnostic/objects/validation/index.ts
4
- function fromPartial(obj, partial) {
5
- return Object.entries(partial).every(([key, val]) => {
6
- return obj[key] === val;
7
- });
1
+ // [WIP]
2
+ // Has all keys from
3
+ // Has extra keys from
4
+ // Has same keys from
5
+ // Has equal properties than (maybe option for not just shallow equivalence?)
6
+ // Has extra properties than
7
+ // Has same properties than
8
+ /**
9
+ * Checks if an object contains all the key-value pairs from a partial object.
10
+ *
11
+ * Performs a shallow equality check for each property in `partial`.
12
+ *
13
+ * @template T - The type of the full object.
14
+ * @param {T} obj - The object to validate.
15
+ * @param {Partial<T>} partial - The partial object with key-value pairs to check.
16
+ * @returns {boolean} `true` if all entries in `partial` match those in `obj`, otherwise `false`.
17
+ */
18
+ export function fromPartial(obj, partial) {
19
+ return Object.entries(partial).every(([key, val]) => {
20
+ return obj[key] === val;
21
+ });
8
22
  }
9
- export {
10
- fromPartial
11
- };
@@ -0,0 +1,72 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { fromPartial } from './index.js';
3
+ describe('fromPartial', () => {
4
+ it('returns true when all partial entries match', () => {
5
+ const obj = { a: 1, b: 2, c: 3 };
6
+ const partial = { a: 1, b: 2 };
7
+ expect(fromPartial(obj, partial)).toBe(true);
8
+ });
9
+ it('returns true when partial is empty', () => {
10
+ const obj = { a: 1, b: 2 };
11
+ const partial = {};
12
+ expect(fromPartial(obj, partial)).toBe(true);
13
+ });
14
+ it('returns false when any partial entry does not match', () => {
15
+ const obj = { a: 1, b: 2, c: 3 };
16
+ const partial = { a: 1, b: 3 };
17
+ expect(fromPartial(obj, partial)).toBe(false);
18
+ });
19
+ it('returns false when partial has key not in object', () => {
20
+ const obj = { a: 1, b: 2 };
21
+ const partial = { a: 1, c: 3 };
22
+ expect(fromPartial(obj, partial)).toBe(false);
23
+ });
24
+ it('handles string values', () => {
25
+ const obj = { name: 'John', age: 30 };
26
+ const partial = { name: 'John' };
27
+ expect(fromPartial(obj, partial)).toBe(true);
28
+ });
29
+ it('handles boolean values', () => {
30
+ const obj = { active: true, verified: false };
31
+ const partial = { active: true };
32
+ expect(fromPartial(obj, partial)).toBe(true);
33
+ });
34
+ it('handles null values', () => {
35
+ const obj = { a: null, b: 2 };
36
+ const partial = { a: null };
37
+ expect(fromPartial(obj, partial)).toBe(true);
38
+ });
39
+ it('handles undefined values', () => {
40
+ const obj = { a: undefined, b: 2 };
41
+ const partial = { a: undefined };
42
+ expect(fromPartial(obj, partial)).toBe(true);
43
+ });
44
+ it('performs shallow equality check', () => {
45
+ const obj = { nested: { a: 1 } };
46
+ const partial = { nested: { a: 1 } };
47
+ // Shallow check: objects are compared by reference
48
+ expect(fromPartial(obj, partial)).toBe(false);
49
+ });
50
+ it('handles arrays with shallow equality', () => {
51
+ const obj = { items: [1, 2, 3] };
52
+ const partial = { items: [1, 2, 3] };
53
+ // Shallow check: arrays are compared by reference
54
+ expect(fromPartial(obj, partial)).toBe(false);
55
+ });
56
+ it('handles arrays with same reference', () => {
57
+ const items = [1, 2, 3];
58
+ const obj = { items };
59
+ const partial = { items };
60
+ expect(fromPartial(obj, partial)).toBe(true);
61
+ });
62
+ it('handles multiple matching entries', () => {
63
+ const obj = { a: 1, b: 2, c: 3, d: 4, e: 5 };
64
+ const partial = { a: 1, c: 3, e: 5 };
65
+ expect(fromPartial(obj, partial)).toBe(true);
66
+ });
67
+ it('handles objects with no matching entries', () => {
68
+ const obj = { a: 1, b: 2 };
69
+ const partial = { a: 2, b: 1 };
70
+ expect(fromPartial(obj, partial)).toBe(false);
71
+ });
72
+ });
@@ -1,2 +1,2 @@
1
- export * as memoize from './memoize/index.js'
2
1
  export * as throttleDebounce from './throttle-debounce/index.js'
2
+ export * as memoize from './memoize/index.js'
@@ -1,2 +1,2 @@
1
- export * as memoize from './memoize/index.js'
2
1
  export * as throttleDebounce from './throttle-debounce/index.js'
2
+ export * as memoize from './memoize/index.js'
@@ -1,19 +1,25 @@
1
- import "../../../chunks/chunk-WSFCRVEQ.js";
2
-
3
- // src/agnostic/optim/memoize/index.ts
4
- function memoize(toMemoizeFunc) {
5
- let cachedArgs;
6
- let cachedResult;
7
- const memoizedFunc = (...args) => {
8
- const argsMatch = cachedArgs !== void 0 && args.length === cachedArgs.length && args.every((arg, i) => arg === cachedArgs?.[i]);
9
- if (argsMatch && cachedResult !== void 0) return cachedResult.value;
10
- const result = toMemoizeFunc(...args);
11
- cachedArgs = args;
12
- cachedResult = { value: result };
13
- return result;
14
- };
15
- return memoizedFunc;
1
+ /**
2
+ * Creates a memoized version of a function, caching the result for repeated calls with the same arguments.
3
+ *
4
+ * Only performs shallow equality checks on arguments (strict equality `===`).
5
+ *
6
+ * @template T - The type of the function to memoize.
7
+ * @param {T} toMemoizeFunc - The function to memoize.
8
+ * @returns {T} A memoized version of the input function.
9
+ */
10
+ export function memoize(toMemoizeFunc) {
11
+ let cachedArgs;
12
+ let cachedResult;
13
+ const memoizedFunc = (...args) => {
14
+ const argsMatch = cachedArgs !== undefined
15
+ && args.length === cachedArgs.length
16
+ && args.every((arg, i) => arg === cachedArgs?.[i]);
17
+ if (argsMatch && cachedResult !== undefined)
18
+ return cachedResult.value;
19
+ const result = toMemoizeFunc(...args);
20
+ cachedArgs = args;
21
+ cachedResult = { value: result };
22
+ return result;
23
+ };
24
+ return memoizedFunc;
16
25
  }
17
- export {
18
- memoize
19
- };
@@ -0,0 +1,30 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { memoize } from './index.js';
3
+ describe('memoize', () => {
4
+ it('returns the same result for identical arguments without re-calling the wrapped function', () => {
5
+ let callCount = 0;
6
+ const fn = (...args) => {
7
+ callCount += 1;
8
+ return args.reduce((sum, n) => sum + n, 0);
9
+ };
10
+ const mem = memoize(fn);
11
+ const r1 = mem(1, 2, 3);
12
+ const r2 = mem(1, 2, 3);
13
+ expect(r1).toBe(6);
14
+ expect(r2).toBe(6);
15
+ expect(callCount).toBe(1);
16
+ });
17
+ it('recomputes when arguments change (shallow equality)', () => {
18
+ let callCount = 0;
19
+ const fn = (obj) => {
20
+ callCount += 1;
21
+ return obj.v * 2;
22
+ };
23
+ const mem = memoize(fn);
24
+ const r1 = mem({ v: 2 });
25
+ const r2 = mem({ v: 2 });
26
+ expect(r1).toBe(4);
27
+ expect(r2).toBe(4);
28
+ expect(callCount).toBe(2);
29
+ });
30
+ });
@@ -1,114 +1,130 @@
1
- import "../../../chunks/chunk-WSFCRVEQ.js";
2
-
3
- // src/agnostic/optim/throttle-debounce/index.ts
4
- function throttle(toThrottleFunc, delayMs) {
5
- let currentDelayMs = delayMs;
6
- let lastArgs = [];
7
- let lastExecutedOn = 0;
8
- let lastReturnValue;
9
- let nextExecutionTimeout = null;
10
- function scheduleNextCall() {
11
- if (nextExecutionTimeout !== null) {
12
- clearTimeout(nextExecutionTimeout);
13
- nextExecutionTimeout = null;
1
+ /**
2
+ * Returns a throttled version of the function passed as an argument
3
+ * @param toThrottleFunc - The function that has to be throttled
4
+ * @param delayMs - The throttle delay in ms
5
+ */
6
+ export function throttle(toThrottleFunc, delayMs) {
7
+ let currentDelayMs = delayMs;
8
+ let lastArgs = [];
9
+ let lastExecutedOn = 0;
10
+ let lastReturnValue;
11
+ let nextExecutionTimeout = null;
12
+ /** Schedules a next call according to the delay */
13
+ function scheduleNextCall() {
14
+ if (nextExecutionTimeout !== null) {
15
+ clearTimeout(nextExecutionTimeout);
16
+ nextExecutionTimeout = null;
17
+ }
18
+ const now = Date.now();
19
+ const nextExecutionTimestamp = lastExecutedOn + currentDelayMs;
20
+ const msTillNextExecution = nextExecutionTimestamp - now;
21
+ nextExecutionTimeout = setTimeout(() => {
22
+ nextExecutionTimeout = null;
23
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
24
+ const returnValue = toThrottleFunc(...lastArgs);
25
+ lastReturnValue = returnValue;
26
+ lastExecutedOn = now;
27
+ }, msTillNextExecution) ?? null;
14
28
  }
15
- const now = Date.now();
16
- const nextExecutionTimestamp = lastExecutedOn + currentDelayMs;
17
- const msTillNextExecution = nextExecutionTimestamp - now;
18
- nextExecutionTimeout = setTimeout(() => {
19
- nextExecutionTimeout = null;
20
- const returnValue = toThrottleFunc(...lastArgs);
21
- lastReturnValue = returnValue;
22
- lastExecutedOn = now;
23
- }, msTillNextExecution) ?? null;
24
- }
25
- function throttled(...args) {
26
- const now = Date.now();
27
- lastArgs = args;
28
- if (now - lastExecutedOn >= delayMs) {
29
- const returnValue = toThrottleFunc(...lastArgs);
30
- lastReturnValue = returnValue;
31
- lastExecutedOn = now;
32
- return {
33
- returnValue: lastReturnValue,
34
- lastExecutedOn,
35
- delayMs: currentDelayMs,
36
- isCached: false
37
- };
29
+ /** The throttled function */
30
+ function throttled(...args) {
31
+ const now = Date.now();
32
+ lastArgs = args;
33
+ if (now - lastExecutedOn >= delayMs) {
34
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
35
+ const returnValue = toThrottleFunc(...lastArgs);
36
+ lastReturnValue = returnValue;
37
+ lastExecutedOn = now;
38
+ return {
39
+ returnValue: lastReturnValue,
40
+ lastExecutedOn,
41
+ delayMs: currentDelayMs,
42
+ isCached: false
43
+ };
44
+ }
45
+ if (nextExecutionTimeout === null)
46
+ scheduleNextCall();
47
+ return {
48
+ returnValue: lastReturnValue,
49
+ lastExecutedOn,
50
+ delayMs: currentDelayMs,
51
+ isCached: true
52
+ };
53
+ }
54
+ /** Changes the throttle delay */
55
+ function setDelay(delayMs) {
56
+ currentDelayMs = delayMs;
57
+ if (nextExecutionTimeout !== null)
58
+ scheduleNextCall();
38
59
  }
39
- if (nextExecutionTimeout === null) scheduleNextCall();
40
60
  return {
41
- returnValue: lastReturnValue,
42
- lastExecutedOn,
43
- delayMs: currentDelayMs,
44
- isCached: true
61
+ throttled,
62
+ setDelay
45
63
  };
46
- }
47
- function setDelay(delayMs2) {
48
- currentDelayMs = delayMs2;
49
- if (nextExecutionTimeout !== null) scheduleNextCall();
50
- }
51
- return {
52
- throttled,
53
- setDelay
54
- };
55
64
  }
56
- function debounce(toDebounceFunc, delayMs) {
57
- let currentDelayMs = delayMs;
58
- let lastArgs = [];
59
- let lastCalledOn = 0;
60
- let lastExecutedOn = 0;
61
- let lastReturnValue;
62
- let nextExecutionTimeout = null;
63
- function scheduleNextCall() {
64
- if (nextExecutionTimeout !== null) {
65
- clearTimeout(nextExecutionTimeout);
66
- nextExecutionTimeout = null;
65
+ /**
66
+ * Returns a debounced version of the function passed as an argument
67
+ * @param toDebounceFunc - The function that has to be debounced
68
+ * @param delayMs - The debounce delay in ms
69
+ */
70
+ export function debounce(toDebounceFunc, delayMs) {
71
+ let currentDelayMs = delayMs;
72
+ let lastArgs = [];
73
+ let lastCalledOn = 0;
74
+ let lastExecutedOn = 0;
75
+ let lastReturnValue;
76
+ let nextExecutionTimeout = null;
77
+ /** Schedules a next call according to the delay */
78
+ function scheduleNextCall() {
79
+ if (nextExecutionTimeout !== null) {
80
+ clearTimeout(nextExecutionTimeout);
81
+ nextExecutionTimeout = null;
82
+ }
83
+ const now = Date.now();
84
+ const nextExecutionTimestamp = lastCalledOn + currentDelayMs;
85
+ const msTillNextExecution = nextExecutionTimestamp - now;
86
+ nextExecutionTimeout = setTimeout(() => {
87
+ nextExecutionTimeout = null;
88
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
89
+ const returnValue = toDebounceFunc(...lastArgs);
90
+ lastReturnValue = returnValue;
91
+ lastExecutedOn = now;
92
+ }, msTillNextExecution) ?? null;
93
+ }
94
+ /** The debounced function */
95
+ function debounced(...args) {
96
+ const now = Date.now();
97
+ lastArgs = args;
98
+ if (now - lastCalledOn >= currentDelayMs) {
99
+ lastCalledOn = now;
100
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
101
+ const returnValue = toDebounceFunc(...lastArgs);
102
+ lastReturnValue = returnValue;
103
+ lastExecutedOn = now;
104
+ return {
105
+ returnValue: lastReturnValue,
106
+ lastExecutedOn,
107
+ delayMs: currentDelayMs,
108
+ isCached: false
109
+ };
110
+ }
111
+ lastCalledOn = now;
112
+ scheduleNextCall();
113
+ return {
114
+ returnValue: lastReturnValue,
115
+ lastExecutedOn,
116
+ delayMs: currentDelayMs,
117
+ isCached: true
118
+ };
67
119
  }
68
- const now = Date.now();
69
- const nextExecutionTimestamp = lastCalledOn + currentDelayMs;
70
- const msTillNextExecution = nextExecutionTimestamp - now;
71
- nextExecutionTimeout = setTimeout(() => {
72
- nextExecutionTimeout = null;
73
- const returnValue = toDebounceFunc(...lastArgs);
74
- lastReturnValue = returnValue;
75
- lastExecutedOn = now;
76
- }, msTillNextExecution) ?? null;
77
- }
78
- function debounced(...args) {
79
- const now = Date.now();
80
- lastArgs = args;
81
- if (now - lastCalledOn >= currentDelayMs) {
82
- lastCalledOn = now;
83
- const returnValue = toDebounceFunc(...lastArgs);
84
- lastReturnValue = returnValue;
85
- lastExecutedOn = now;
86
- return {
87
- returnValue: lastReturnValue,
88
- lastExecutedOn,
89
- delayMs: currentDelayMs,
90
- isCached: false
91
- };
120
+ /** Changes the debounce delay */
121
+ function setDelay(delayMs) {
122
+ currentDelayMs = delayMs;
123
+ if (nextExecutionTimeout !== null)
124
+ scheduleNextCall();
92
125
  }
93
- lastCalledOn = now;
94
- scheduleNextCall();
95
126
  return {
96
- returnValue: lastReturnValue,
97
- lastExecutedOn,
98
- delayMs: currentDelayMs,
99
- isCached: true
127
+ debounced,
128
+ setDelay
100
129
  };
101
- }
102
- function setDelay(delayMs2) {
103
- currentDelayMs = delayMs2;
104
- if (nextExecutionTimeout !== null) scheduleNextCall();
105
- }
106
- return {
107
- debounced,
108
- setDelay
109
- };
110
130
  }
111
- export {
112
- debounce,
113
- throttle
114
- };
@@ -0,0 +1,44 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import { throttle, debounce } from './index.js';
3
+ describe('throttle', () => {
4
+ it('calls the wrapped function immediately and then throttles subsequent calls', async () => {
5
+ vi.useFakeTimers();
6
+ const fn = vi.fn((x) => x * 2);
7
+ const { throttled } = throttle(fn, 100);
8
+ const first = throttled(1);
9
+ const second = throttled(2);
10
+ expect(first.isCached).toBe(false);
11
+ expect(first.returnValue).toBe(2);
12
+ expect(second.isCached).toBe(true);
13
+ expect(fn).toHaveBeenCalledTimes(1);
14
+ // Fast-forward past the throttle delay to trigger the scheduled call
15
+ vi.advanceTimersByTime(100);
16
+ expect(fn).toHaveBeenCalledTimes(2);
17
+ vi.useRealTimers();
18
+ });
19
+ });
20
+ describe('debounce', () => {
21
+ it('fires immediately on first call, then debounces subsequent calls and uses latest arguments', async () => {
22
+ vi.useFakeTimers();
23
+ const fn = vi.fn((x) => x * 3);
24
+ const { debounced } = debounce(fn, 100);
25
+ // First call executes immediately (leading edge)
26
+ debounced(1);
27
+ expect(fn).toHaveBeenCalledTimes(1);
28
+ expect(fn).toHaveBeenLastCalledWith(1);
29
+ // Subsequent rapid calls within the debounce window are deferred
30
+ debounced(2);
31
+ debounced(3);
32
+ expect(fn).toHaveBeenCalledTimes(1);
33
+ // After the delay, the deferred call should run once with the latest args
34
+ vi.advanceTimersByTime(100);
35
+ expect(fn).toHaveBeenCalledTimes(2);
36
+ expect(fn).toHaveBeenLastCalledWith(3);
37
+ // After an inactivity window, a new call should again execute immediately
38
+ vi.advanceTimersByTime(200);
39
+ debounced(4);
40
+ expect(fn).toHaveBeenCalledTimes(3);
41
+ expect(fn).toHaveBeenLastCalledWith(4);
42
+ vi.useRealTimers();
43
+ });
44
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -1,9 +1,9 @@
1
- import {
2
- hexChars,
3
- randomHexChar
4
- } from "../../../chunks/chunk-OGBUSUE6.js";
5
- import "../../../chunks/chunk-WSFCRVEQ.js";
6
- export {
7
- hexChars,
8
- randomHexChar
9
- };
1
+ /** List of hex chars (0-9a-f) */
2
+ export const hexChars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];
3
+ /** Generates a random hexadecimal char (0-9a-f) */
4
+ export function randomHexChar() {
5
+ const nbr = Math.floor(Math.random() * 16);
6
+ const char = hexChars[nbr];
7
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
8
+ return char;
9
+ }
@@ -0,0 +1,20 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { hexChars, randomHexChar } from './index.js';
3
+ describe('hexChars', () => {
4
+ it('contains 16 hexadecimal characters', () => {
5
+ expect(hexChars.length).toBe(16);
6
+ expect(hexChars[0]).toBe('0');
7
+ expect(hexChars[15]).toBe('f');
8
+ });
9
+ });
10
+ describe('randomHexChar', () => {
11
+ it('returns a single hexadecimal character from hexChars', () => {
12
+ const char = randomHexChar();
13
+ expect(char.length).toBe(1);
14
+ expect(hexChars.includes(char)).toBe(true);
15
+ });
16
+ it('always returns characters from the allowed set over multiple calls', () => {
17
+ const results = Array.from({ length: 32 }, () => randomHexChar());
18
+ expect(results.every(c => hexChars.includes(c))).toBe(true);
19
+ });
20
+ });
@@ -1,3 +1,3 @@
1
- export * as random from './random/index.js'
2
1
  export * as hexChar from './hex-char/index.js'
2
+ export * as random from './random/index.js'
3
3
  export * as uuid from './uuid/index.js'
@@ -1,3 +1,3 @@
1
- export * as random from './random/index.js'
2
1
  export * as hexChar from './hex-char/index.js'
2
+ export * as random from './random/index.js'
3
3
  export * as uuid from './uuid/index.js'