@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
@@ -1,23 +1,132 @@
1
- import {
2
- toArray,
3
- toBoolean,
4
- toError,
5
- toNull,
6
- toNumber,
7
- toNumberArr,
8
- toRecord,
9
- toString
10
- } from "../../../chunks/chunk-YWSXCFYY.js";
11
- import "../../../chunks/chunk-QXAJXTXV.js";
12
- import "../../../chunks/chunk-HC6ZOHCS.js";
13
- import "../../../chunks/chunk-WSFCRVEQ.js";
14
- export {
15
- toArray,
16
- toBoolean,
17
- toError,
18
- toNull,
19
- toNumber,
20
- toNumberArr,
21
- toRecord,
22
- toString
23
- };
1
+ import { isFalsy } from '../../booleans/is-falsy/index.js';
2
+ /**
3
+ * Converts a value to a boolean.
4
+ *
5
+ * - Booleans are returned as-is.
6
+ * - Strings equal to `"true"` (case-insensitive, trimmed) are `true`, others `false`.
7
+ * - Other values are coerced using `!isFalsy`.
8
+ *
9
+ * @param {unknown} value - The value to convert.
10
+ * @returns {boolean} The boolean representation of the input.
11
+ */
12
+ export function toBoolean(value) {
13
+ if (typeof value === 'boolean')
14
+ return value;
15
+ if (typeof value === 'string') {
16
+ if (value.toLowerCase().trim() === 'true')
17
+ return true;
18
+ return false;
19
+ }
20
+ return !isFalsy(value);
21
+ }
22
+ /**
23
+ * Converts a value to a number.
24
+ *
25
+ * - Numbers are returned as-is.
26
+ * - Strings are parsed as floats.
27
+ * - Other values return 0.
28
+ *
29
+ * @param {unknown} value - The value to convert.
30
+ * @returns {number} The numeric representation of the input.
31
+ */
32
+ export function toNumber(value) {
33
+ if (typeof value === 'number')
34
+ return value;
35
+ if (typeof value === 'string')
36
+ return parseFloat(value);
37
+ return 0;
38
+ }
39
+ /**
40
+ * Converts a value to a string.
41
+ *
42
+ * - Strings are returned as-is.
43
+ * - Other values are converted using `String()`.
44
+ *
45
+ * @param {unknown} value - The value to convert.
46
+ * @returns {string} The string representation of the input.
47
+ */
48
+ export function toString(value) {
49
+ if (typeof value === 'string')
50
+ return value;
51
+ return String(value);
52
+ }
53
+ /**
54
+ * Converts any value to `null`.
55
+ *
56
+ * @param {unknown} _value - The input value (ignored).
57
+ * @returns {null} Always returns `null`.
58
+ */
59
+ export function toNull(_value) {
60
+ return null;
61
+ }
62
+ /**
63
+ * Converts a value to an array.
64
+ *
65
+ * - Arrays are returned as-is.
66
+ * - Objects are converted to an array of `[key, value]` pairs.
67
+ * - Other values are wrapped in a single-element array.
68
+ *
69
+ * @param {unknown} value - The value to convert.
70
+ * @returns {Array<unknown>} The array representation of the input.
71
+ */
72
+ export function toArray(value) {
73
+ if (Array.isArray(value))
74
+ return value;
75
+ if (typeof value === 'object' && value !== null)
76
+ return Object.entries(value);
77
+ return [value];
78
+ }
79
+ // [WIP] not so sure about this one
80
+ /**
81
+ * Converts a value to an array of numbers.
82
+ *
83
+ * - Uses `toArray` to ensure an array.
84
+ * - Each element is converted to a number using `toNumber`.
85
+ *
86
+ * @param {unknown} value - The value to convert.
87
+ * @returns {number[]} Array of numeric values.
88
+ */
89
+ export function toNumberArr(value) {
90
+ const arrValue = toArray(value);
91
+ return arrValue.map(val => toNumber(val));
92
+ }
93
+ /**
94
+ * Converts a value to a plain object (record).
95
+ *
96
+ * - Keys and values of objects are copied.
97
+ * - Non-object values return an empty object.
98
+ *
99
+ * @param {unknown} value - The value to convert.
100
+ * @returns {Record<string, unknown>} The object representation of the input.
101
+ */
102
+ export function toRecord(value) {
103
+ const record = {};
104
+ try {
105
+ Object
106
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
107
+ .keys(value)
108
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
109
+ .forEach(key => { record[key] = value[key]; });
110
+ }
111
+ catch (err) {
112
+ return record;
113
+ }
114
+ return record;
115
+ }
116
+ /**
117
+ * Converts a value to an `Error` object.
118
+ *
119
+ * - Returns the value if it is already an `Error`.
120
+ * - Strings are used as the error message.
121
+ * - Other values are converted to string and used as the error message.
122
+ *
123
+ * @param {unknown} value - The value to convert.
124
+ * @returns {Error} An `Error` instance representing the input.
125
+ */
126
+ export function toError(value) {
127
+ if (value instanceof Error)
128
+ return value;
129
+ if (typeof value === 'string')
130
+ return new Error(value);
131
+ return new Error(toString(value));
132
+ }
@@ -0,0 +1,134 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { toBoolean, toNumber, toString, toNull, toArray, toNumberArr, toRecord, toError } from './index.js';
3
+ describe('toBoolean', () => {
4
+ it('returns boolean values as-is', () => {
5
+ expect(toBoolean(true)).toBe(true);
6
+ expect(toBoolean(false)).toBe(false);
7
+ });
8
+ it('returns true for string "true" (case-insensitive, trimmed)', () => {
9
+ expect(toBoolean('true')).toBe(true);
10
+ expect(toBoolean('TRUE')).toBe(true);
11
+ expect(toBoolean(' true ')).toBe(true);
12
+ });
13
+ it('returns false for other strings', () => {
14
+ expect(toBoolean('false')).toBe(false);
15
+ expect(toBoolean('yes')).toBe(false);
16
+ expect(toBoolean('')).toBe(false);
17
+ });
18
+ it('returns true for truthy values', () => {
19
+ expect(toBoolean(1)).toBe(true);
20
+ expect(toBoolean({})).toBe(true);
21
+ expect(toBoolean([])).toBe(true);
22
+ });
23
+ it('returns false for falsy values', () => {
24
+ expect(toBoolean(0)).toBe(false);
25
+ expect(toBoolean(null)).toBe(false);
26
+ expect(toBoolean(undefined)).toBe(false);
27
+ });
28
+ });
29
+ describe('toNumber', () => {
30
+ it('returns numbers as-is', () => {
31
+ expect(toNumber(42)).toBe(42);
32
+ expect(toNumber(0)).toBe(0);
33
+ expect(toNumber(-123)).toBe(-123);
34
+ });
35
+ it('parses string numbers', () => {
36
+ expect(toNumber('42')).toBe(42);
37
+ expect(toNumber('3.14')).toBe(3.14);
38
+ expect(toNumber('-123')).toBe(-123);
39
+ });
40
+ it('returns 0 for non-numeric strings', () => {
41
+ expect(toNumber('abc')).toBeNaN();
42
+ expect(toNumber('')).toBeNaN();
43
+ });
44
+ it('returns 0 for non-string, non-number values', () => {
45
+ expect(toNumber(null)).toBe(0);
46
+ expect(toNumber(undefined)).toBe(0);
47
+ expect(toNumber({})).toBe(0);
48
+ });
49
+ });
50
+ describe('toString', () => {
51
+ it('returns strings as-is', () => {
52
+ expect(toString('test')).toBe('test');
53
+ expect(toString('')).toBe('');
54
+ });
55
+ it('converts numbers to strings', () => {
56
+ expect(toString(42)).toBe('42');
57
+ expect(toString(0)).toBe('0');
58
+ });
59
+ it('converts other values using String()', () => {
60
+ expect(toString(null)).toBe('null');
61
+ expect(toString(undefined)).toBe('undefined');
62
+ expect(toString(true)).toBe('true');
63
+ });
64
+ });
65
+ describe('toNull', () => {
66
+ it('always returns null', () => {
67
+ expect(toNull(42)).toBe(null);
68
+ expect(toNull('test')).toBe(null);
69
+ expect(toNull(null)).toBe(null);
70
+ expect(toNull(undefined)).toBe(null);
71
+ });
72
+ });
73
+ describe('toArray', () => {
74
+ it('returns arrays as-is', () => {
75
+ const arr = [1, 2, 3];
76
+ expect(toArray(arr)).toBe(arr);
77
+ });
78
+ it('converts objects to key-value pairs', () => {
79
+ const result = toArray({ a: 1, b: 2 });
80
+ expect(result).toHaveLength(2);
81
+ expect(result[0]).toEqual(['a', 1]);
82
+ expect(result[1]).toEqual(['b', 2]);
83
+ });
84
+ it('wraps other values in array', () => {
85
+ expect(toArray(42)).toEqual([42]);
86
+ expect(toArray('test')).toEqual(['test']);
87
+ expect(toArray(null)).toEqual([null]);
88
+ });
89
+ });
90
+ describe('toNumberArr', () => {
91
+ it('converts array to number array', () => {
92
+ expect(toNumberArr([1, 2, 3])).toEqual([1, 2, 3]);
93
+ expect(toNumberArr(['1', '2', '3'])).toEqual([1, 2, 3]);
94
+ });
95
+ it('converts object to number array', () => {
96
+ const result = toNumberArr({ a: '1', b: '2' });
97
+ expect(result).toHaveLength(2);
98
+ expect(result[0]).toBe(0);
99
+ expect(result[1]).toBe(0);
100
+ });
101
+ it('wraps single value and converts to number', () => {
102
+ expect(toNumberArr(42)).toEqual([42]);
103
+ expect(toNumberArr('123')).toEqual([123]);
104
+ });
105
+ });
106
+ describe('toRecord', () => {
107
+ it('copies object keys and values', () => {
108
+ const obj = { a: 1, b: 'test' };
109
+ const result = toRecord(obj);
110
+ expect(result).toEqual({ a: 1, b: 'test' });
111
+ expect(result).not.toBe(obj);
112
+ });
113
+ it('returns empty object for non-objects', () => {
114
+ expect(toRecord(42)).toEqual({});
115
+ expect(toRecord('test')).toEqual({ '0': 't', '1': 'e', '2': 's', '3': 't' });
116
+ expect(toRecord(null)).toEqual({});
117
+ });
118
+ });
119
+ describe('toError', () => {
120
+ it('returns Error instances as-is', () => {
121
+ const error = new Error('test');
122
+ expect(toError(error)).toBe(error);
123
+ });
124
+ it('creates Error from string', () => {
125
+ const error = toError('test message');
126
+ expect(error).toBeInstanceOf(Error);
127
+ expect(error.message).toBe('test message');
128
+ });
129
+ it('creates Error from other values', () => {
130
+ const error = toError(42);
131
+ expect(error).toBeInstanceOf(Error);
132
+ expect(error.message).toBe('42');
133
+ });
134
+ });
@@ -1,38 +1,63 @@
1
- import {
2
- get
3
- } from "../../../chunks/chunk-57YKZBJR.js";
4
- import "../../../chunks/chunk-WSFCRVEQ.js";
5
-
6
- // src/agnostic/misc/connection/index.ts
1
+ import * as Window from '../crossenv/window/index.js';
7
2
  function isType(unk) {
8
- return unk === "bluetooth" || unk === "cellular" || unk === "ethernet" || unk === "none" || unk === "wifi" || unk === "wimax" || unk === "other" || unk === "unknown";
3
+ return unk === 'bluetooth'
4
+ || unk === 'cellular'
5
+ || unk === 'ethernet'
6
+ || unk === 'none'
7
+ || unk === 'wifi'
8
+ || unk === 'wimax'
9
+ || unk === 'other'
10
+ || unk === 'unknown';
9
11
  }
10
12
  function isEffectiveType(unk) {
11
- return unk === "slow-2g" || unk === "2g" || unk === "3g" || unk === "4g";
13
+ return unk === 'slow-2g'
14
+ || unk === '2g'
15
+ || unk === '3g'
16
+ || unk === '4g';
12
17
  }
13
18
  function isConnection(unk) {
14
- if (typeof unk !== "object") return false;
15
- if (unk === null) return false;
16
- if (!("downlink" in unk)) return false;
17
- if (typeof unk.downlink !== "number") return false;
18
- if (!("type" in unk)) return false;
19
- if (!isType(unk.type)) return false;
20
- if (!("effectiveType" in unk)) return false;
21
- if (!isEffectiveType(unk.effectiveType)) return false;
22
- return true;
19
+ if (typeof unk !== 'object')
20
+ return false;
21
+ if (unk === null)
22
+ return false;
23
+ if (!('downlink' in unk))
24
+ return false;
25
+ if (typeof unk.downlink !== 'number')
26
+ return false;
27
+ if (!('type' in unk))
28
+ return false;
29
+ if (!isType(unk.type))
30
+ return false;
31
+ if (!('effectiveType' in unk))
32
+ return false;
33
+ if (!isEffectiveType(unk.effectiveType))
34
+ return false;
35
+ return true;
23
36
  }
24
- function getConnection() {
25
- const window = get();
26
- const navigator = window.navigator;
27
- if (typeof navigator !== "object" || navigator === null) return void 0;
28
- const connection = navigator.connection ?? navigator.mozConnection ?? navigator.webkitConnection;
29
- if (!isConnection(connection)) return void 0;
30
- return connection;
37
+ /**
38
+ * Retrieves the current network connection information from the environment.
39
+ *
40
+ * Uses the `navigator.connection` API or vendor-prefixed alternatives.
41
+ *
42
+ * @returns {MinimalConnection | undefined} A minimal connection object if available, otherwise `undefined`.
43
+ */
44
+ export function getConnection() {
45
+ const window = Window.get();
46
+ const navigator = window.navigator;
47
+ if (typeof navigator !== 'object' || navigator === null)
48
+ return undefined;
49
+ const connection = navigator.connection
50
+ ?? navigator.mozConnection
51
+ ?? navigator.webkitConnection;
52
+ if (!isConnection(connection))
53
+ return undefined;
54
+ return connection;
31
55
  }
32
- function getCurrentDownlink() {
33
- return getConnection()?.downlink;
56
+ /**
57
+ * Retrieves the estimated downlink speed of the current network connection.
58
+ *
59
+ * @returns {number | undefined} Downlink speed in Mbps, or `undefined` if not available.
60
+ */
61
+ export function getCurrentDownlink() {
62
+ return getConnection()?.downlink;
34
63
  }
35
- export {
36
- getConnection,
37
- getCurrentDownlink
38
- };
@@ -0,0 +1,143 @@
1
+ /* eslint-disable @typescript-eslint/no-unsafe-argument */
2
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
3
+ import { getConnection, getCurrentDownlink } from './index.js';
4
+ import * as Window from '../crossenv/window/index.js';
5
+ import { JSDOM } from 'jsdom';
6
+ describe('getConnection', () => {
7
+ beforeEach(() => Window.set(new JSDOM().window));
8
+ afterEach(() => Window.unset());
9
+ it('returns undefined when navigator is not available', () => {
10
+ const dom = new JSDOM();
11
+ const window = dom.window;
12
+ Object.defineProperty(window, 'navigator', {
13
+ value: null,
14
+ writable: true,
15
+ configurable: true
16
+ });
17
+ Window.set(window);
18
+ expect(getConnection()).toBeUndefined();
19
+ });
20
+ it('returns undefined when navigator exists but has no connection', () => {
21
+ const dom = new JSDOM();
22
+ const window = dom.window;
23
+ const navigator = {};
24
+ Object.defineProperty(window, 'navigator', {
25
+ value: navigator,
26
+ writable: true,
27
+ configurable: true
28
+ });
29
+ Window.set(window);
30
+ expect(getConnection()).toBeUndefined();
31
+ });
32
+ it('returns connection when available', () => {
33
+ const dom = new JSDOM();
34
+ const window = dom.window;
35
+ const connection = {
36
+ downlink: 10,
37
+ type: 'wifi',
38
+ effectiveType: '4g'
39
+ };
40
+ const navigator = {};
41
+ Object.defineProperty(navigator, 'connection', {
42
+ value: connection,
43
+ writable: true,
44
+ configurable: true
45
+ });
46
+ Object.defineProperty(window, 'navigator', {
47
+ value: navigator,
48
+ writable: true,
49
+ configurable: true
50
+ });
51
+ Window.set(window);
52
+ const result = getConnection();
53
+ expect(result).toEqual({
54
+ downlink: 10,
55
+ type: 'wifi',
56
+ effectiveType: '4g'
57
+ });
58
+ });
59
+ it('uses mozConnection as fallback', () => {
60
+ const dom = new JSDOM();
61
+ const window = dom.window;
62
+ const mozConnection = {
63
+ downlink: 5,
64
+ type: 'cellular',
65
+ effectiveType: '3g'
66
+ };
67
+ const navigator = {};
68
+ Object.defineProperty(navigator, 'mozConnection', {
69
+ value: mozConnection,
70
+ writable: true,
71
+ configurable: true
72
+ });
73
+ Object.defineProperty(window, 'navigator', {
74
+ value: navigator,
75
+ writable: true,
76
+ configurable: true
77
+ });
78
+ Window.set(window);
79
+ const result = getConnection();
80
+ expect(result?.type).toBe('cellular');
81
+ });
82
+ it('uses webkitConnection as fallback', () => {
83
+ const dom = new JSDOM();
84
+ const window = dom.window;
85
+ const webkitConnection = {
86
+ downlink: 7.5,
87
+ type: 'ethernet',
88
+ effectiveType: '4g'
89
+ };
90
+ const navigator = {};
91
+ Object.defineProperty(navigator, 'webkitConnection', {
92
+ value: webkitConnection,
93
+ writable: true,
94
+ configurable: true
95
+ });
96
+ Object.defineProperty(window, 'navigator', {
97
+ value: navigator,
98
+ writable: true,
99
+ configurable: true
100
+ });
101
+ Window.set(window);
102
+ const result = getConnection();
103
+ expect(result?.type).toBe('ethernet');
104
+ });
105
+ });
106
+ describe('getCurrentDownlink', () => {
107
+ beforeEach(() => Window.set(new JSDOM().window));
108
+ afterEach(() => Window.unset());
109
+ it('returns downlink when connection is available', () => {
110
+ const dom = new JSDOM();
111
+ const window = dom.window;
112
+ const connection = {
113
+ downlink: 10,
114
+ type: 'wifi',
115
+ effectiveType: '4g'
116
+ };
117
+ const navigator = {};
118
+ Object.defineProperty(navigator, 'connection', {
119
+ value: connection,
120
+ writable: true,
121
+ configurable: true
122
+ });
123
+ Object.defineProperty(window, 'navigator', {
124
+ value: navigator,
125
+ writable: true,
126
+ configurable: true
127
+ });
128
+ Window.set(window);
129
+ expect(getCurrentDownlink()).toBe(10);
130
+ });
131
+ it('returns undefined when connection is not available', () => {
132
+ const dom = new JSDOM();
133
+ const window = dom.window;
134
+ const navigator = {};
135
+ Object.defineProperty(window, 'navigator', {
136
+ value: navigator,
137
+ writable: true,
138
+ configurable: true
139
+ });
140
+ Window.set(window);
141
+ expect(getCurrentDownlink()).toBeUndefined();
142
+ });
143
+ });
@@ -1,45 +1,69 @@
1
- import {
2
- wait
3
- } from "../../../chunks/chunk-I6ZP5T5V.js";
4
- import "../../../chunks/chunk-WSFCRVEQ.js";
5
-
6
- // src/agnostic/misc/crawler/index.ts
7
- function create(options) {
8
- let ops = 0;
9
- const waitlist = [];
10
- const push = (...urls) => waitlist.push(...urls);
11
- const flush = () => {
12
- waitlist.length = 0;
13
- };
14
- const processed = /* @__PURE__ */ new Set();
15
- const crawl = async (startUrl) => {
16
- push(startUrl);
17
- while (waitlist.length > 0 && ops < options.limit) {
18
- ops++;
19
- const currentUrl = waitlist[0];
20
- if (!processed.has(currentUrl) || options.allowDuplicates === true) {
21
- const content = await options.fetcher(currentUrl);
22
- await options.processor(currentUrl, content, {
23
- push,
24
- flush,
25
- processed: new Set(processed),
26
- waitlist: [...waitlist]
27
- });
28
- }
29
- waitlist.shift();
30
- processed.add(currentUrl);
31
- const delayMs = typeof options.delayMs === "function" ? options.delayMs() : typeof options.delayMs === "number" ? options.delayMs : 0;
32
- if (delayMs !== 0) await wait(delayMs);
33
- }
34
- };
35
- return {
36
- crawl,
37
- push,
38
- flush,
39
- processed,
40
- waitlist
41
- };
1
+ import { wait } from '../../time/wait/index.js';
2
+ /**
3
+ * Creates a sequential crawler with optional delay.
4
+ *
5
+ * @template T - The type of content returned by the fetcher.
6
+ * @param {Options<T>} options - Crawler configuration options.
7
+ * @param {number} options.limit - Maximum number of URLs to process.
8
+ * @param {number | (() => number)} [options.delayMs] - Optional delay between processing URLs, in milliseconds, or a function returning the delay.
9
+ * @param {boolean} [options.allowDuplicates] - Optional, allows fetching and processing a URL that has already been seen.
10
+ * @param {Fetcher<T>} options.fetcher - Function that fetches content for each URL.
11
+ * @param {Processor<T>} options.processor - Function that processes fetched content.
12
+ * @returns {Crawler} An object with methods to start crawling, enqueue URLs, flush the waitlist, and access crawler state.
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * const crawler = create({
17
+ * limit: 100,
18
+ * delayMs: 1000,
19
+ * fetcher: async (url) => fetch(url).then(r => r.text()),
20
+ * processor: (url, content, { push, processed, waitlist }) => {
21
+ * console.log(`Processed ${url}`);
22
+ * console.log(`Remaining: ${waitlist.length}, Done: ${processed.size}`);
23
+ * // Optionally push more URLs
24
+ * }
25
+ * });
26
+ *
27
+ * await crawler.crawl('https://example.com');
28
+ * console.log('Total processed:', crawler.processed.size);
29
+ * ```
30
+ */
31
+ export function create(options) {
32
+ let ops = 0;
33
+ const waitlist = [];
34
+ const push = (...urls) => waitlist.push(...urls);
35
+ const flush = () => { waitlist.length = 0; };
36
+ const processed = new Set();
37
+ const crawl = async (startUrl) => {
38
+ push(startUrl);
39
+ while (waitlist.length > 0 && ops < options.limit) {
40
+ ops++;
41
+ const currentUrl = waitlist[0];
42
+ if (!processed.has(currentUrl) || options.allowDuplicates === true) {
43
+ const content = await options.fetcher(currentUrl);
44
+ await options.processor(currentUrl, content, {
45
+ push,
46
+ flush,
47
+ processed: new Set(processed),
48
+ waitlist: [...waitlist]
49
+ });
50
+ }
51
+ waitlist.shift();
52
+ processed.add(currentUrl);
53
+ const delayMs = typeof options.delayMs === 'function'
54
+ ? options.delayMs()
55
+ : typeof options.delayMs === 'number'
56
+ ? options.delayMs
57
+ : 0;
58
+ if (delayMs !== 0)
59
+ await wait(delayMs);
60
+ }
61
+ };
62
+ return {
63
+ crawl,
64
+ push,
65
+ flush,
66
+ processed,
67
+ waitlist
68
+ };
42
69
  }
43
- export {
44
- create
45
- };