@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,122 +1,165 @@
1
- import {
2
- matchesSome
3
- } from "../../../chunks/chunk-R3AWQXMY.js";
4
- import "../../../chunks/chunk-WSFCRVEQ.js";
5
-
6
- // src/node/files/subpaths/index.ts
7
- import { promises as fs } from "node:fs";
8
- import path from "node:path";
9
- var defaultListContext = {
10
- depth: 0,
11
- lstats: null,
12
- rootPath: null
1
+ /* eslint-disable @typescript-eslint/no-throw-literal */
2
+ import { promises as fs } from 'node:fs';
3
+ import path from 'node:path';
4
+ import { matchesSome as stringMatchesSome } from '../../../agnostic/strings/matches/index.js';
5
+ export const defaultListContext = {
6
+ depth: 0,
7
+ lstats: null,
8
+ rootPath: null
13
9
  };
14
- var fillListContext = (input) => {
15
- return {
16
- ...defaultListContext,
17
- ...input
18
- };
10
+ /**
11
+ * Fills missing properties in a list context with default values.
12
+ *
13
+ * @param {ListContext} input - The partial list context to fill.
14
+ * @returns {Required<ListContext>} A complete list context with all properties set.
15
+ */
16
+ export const fillListContext = (input) => {
17
+ return {
18
+ ...defaultListContext,
19
+ ...input
20
+ };
19
21
  };
20
- var defaultListOptions = {
21
- directories: true,
22
- files: true,
23
- symlinks: true,
24
- hidden: true,
25
- followSimlinks: false,
26
- dedupeSimlinksContents: false,
27
- maxDepth: Infinity,
28
- returnRelative: false,
29
- exclude: null,
30
- include: null,
31
- filter: () => true
22
+ export const defaultListOptions = {
23
+ directories: true,
24
+ files: true,
25
+ symlinks: true,
26
+ hidden: true,
27
+ followSimlinks: false,
28
+ dedupeSimlinksContents: false,
29
+ maxDepth: Infinity,
30
+ returnRelative: false,
31
+ exclude: null,
32
+ include: null,
33
+ filter: () => true
32
34
  };
33
- var fillOptions = (input) => {
34
- return {
35
- ...defaultListOptions,
36
- ...input
37
- };
35
+ /**
36
+ * Fills missing properties in list options with default values.
37
+ *
38
+ * @param {ListOptions} input - The partial list options to fill.
39
+ * @returns {Required<ListOptions>} A complete list options object with all properties set.
40
+ */
41
+ export const fillOptions = (input) => {
42
+ return {
43
+ ...defaultListOptions,
44
+ ...input
45
+ };
38
46
  };
39
- async function list(...args) {
40
- const [inputPath, _options] = args;
41
- const options = fillOptions(_options ?? {});
42
- const subpaths = await listAbsoluteSubpaths(...args);
43
- return options.returnRelative ? subpaths.map((subpath) => path.relative(inputPath, subpath)) : subpaths;
47
+ /**
48
+ * Lists all subpaths under a given directory path.
49
+ *
50
+ * The function recursively traverses the directory tree and returns all matching
51
+ * files, directories, and symlinks based on the provided options.
52
+ *
53
+ * @param inputPath - The root directory path to list subpaths from.
54
+ * @param [options] - Optional configuration for filtering and behavior. See `ListOptions` for details.
55
+ * @returns Array of subpaths (absolute or relative based on `returnRelative` option).
56
+ */
57
+ export async function list(...args) {
58
+ const [inputPath, _options] = args;
59
+ const options = fillOptions(_options ?? {});
60
+ const subpaths = await listAbsoluteSubpaths(...args);
61
+ return options.returnRelative
62
+ ? subpaths.map(subpath => path.relative(inputPath, subpath))
63
+ : subpaths;
44
64
  }
45
- async function listAbsoluteSubpaths(inputPath, _options = {}, __private_context = {}) {
46
- const options = fillOptions(_options);
47
- const _private_context = fillListContext(__private_context);
48
- if (_private_context.rootPath === null) {
49
- _private_context.rootPath = inputPath;
50
- }
51
- const subpaths = [];
52
- if (_private_context.depth > options.maxDepth) return subpaths;
53
- try {
54
- const pathStat = _private_context.lstats ?? await fs.lstat(inputPath);
55
- if (!pathStat.isDirectory()) return subpaths;
56
- } catch (err) {
57
- return subpaths;
58
- }
59
- const childrenRelPaths = await fs.readdir(inputPath);
60
- await Promise.all(childrenRelPaths.map(async (childRelPath) => {
61
- const childAbsPath = path.join(inputPath, childRelPath);
62
- const childRelFromRootPath = path.relative(_private_context.rootPath ?? inputPath, childAbsPath);
63
- const childLstats = await fs.lstat(childAbsPath);
65
+ /**
66
+ * Internal function that lists absolute subpaths recursively.
67
+ *
68
+ * @param {string} inputPath - The directory path to list.
69
+ * @param {ListOptions} [_options] - Optional configuration.
70
+ * @param {ListContext} [__private_context] - Internal recursion context.
71
+ * @returns {Promise<string[]>} Array of absolute subpaths.
72
+ */
73
+ async function listAbsoluteSubpaths(inputPath, _options = {},
74
+ // eslint-disable-next-line @typescript-eslint/naming-convention
75
+ __private_context = {}) {
76
+ const options = fillOptions(_options);
77
+ // eslint-disable-next-line @typescript-eslint/naming-convention
78
+ const _private_context = fillListContext(__private_context);
79
+ if (_private_context.rootPath === null) {
80
+ _private_context.rootPath = inputPath;
81
+ }
82
+ const subpaths = [];
83
+ if (_private_context.depth > options.maxDepth)
84
+ return subpaths;
64
85
  try {
65
- const isDirectory = childLstats.isDirectory();
66
- const isSymlink = childLstats.isSymbolicLink();
67
- const isFile = !isDirectory && !isSymlink;
68
- const isHidden = path.basename(childAbsPath).startsWith(".");
69
- const type = isDirectory ? "directory" : isSymlink ? "symlink" : "file";
70
- if (isDirectory && !options.directories) throw true;
71
- if (isSymlink && !options.symlinks) throw false;
72
- if (isFile && !options.files) throw false;
73
- if (isHidden && !options.hidden) throw false;
74
- const realPath = isSymlink ? await fs.realpath(childAbsPath) : childAbsPath;
75
- const childPathForFilters = options.returnRelative ? childRelFromRootPath : childAbsPath;
76
- const isInExclude = matchesSome(childPathForFilters, options.exclude ?? []);
77
- const isInInclude = matchesSome(childPathForFilters, options.include ?? []);
78
- if (isInExclude && !isInInclude) throw false;
79
- const isInFilter = await options.filter(childPathForFilters, { type, hidden: isHidden, realPath });
80
- if (!isInFilter) throw true;
81
- if (isSymlink) {
82
- if (!options.followSimlinks) subpaths.push(childAbsPath);
83
- else {
84
- const childSubpaths = await listAbsoluteSubpaths(realPath, options, {
85
- ..._private_context,
86
- depth: _private_context.depth + 1
87
- });
88
- subpaths.push(realPath, ...childSubpaths);
86
+ const pathStat = _private_context.lstats ?? await fs.lstat(inputPath);
87
+ if (!pathStat.isDirectory())
88
+ return subpaths;
89
+ }
90
+ catch (err) {
91
+ return subpaths;
92
+ }
93
+ const childrenRelPaths = await fs.readdir(inputPath);
94
+ await Promise.all(childrenRelPaths.map(async (childRelPath) => {
95
+ const childAbsPath = path.join(inputPath, childRelPath);
96
+ const childRelFromRootPath = path.relative(_private_context.rootPath ?? inputPath, childAbsPath);
97
+ const childLstats = await fs.lstat(childAbsPath);
98
+ try {
99
+ const isDirectory = childLstats.isDirectory();
100
+ const isSymlink = childLstats.isSymbolicLink();
101
+ const isFile = !isDirectory && !isSymlink;
102
+ const isHidden = path.basename(childAbsPath).startsWith('.');
103
+ const type = isDirectory ? 'directory' : (isSymlink ? 'symlink' : 'file');
104
+ if (isDirectory && !options.directories)
105
+ throw true;
106
+ if (isSymlink && !options.symlinks)
107
+ throw false;
108
+ if (isFile && !options.files)
109
+ throw false;
110
+ if (isHidden && !options.hidden)
111
+ throw false;
112
+ const realPath = isSymlink
113
+ ? await fs.realpath(childAbsPath)
114
+ : childAbsPath;
115
+ const childPathForFilters = options.returnRelative ? childRelFromRootPath : childAbsPath;
116
+ const isInExclude = stringMatchesSome(childPathForFilters, options.exclude ?? []);
117
+ const isInInclude = stringMatchesSome(childPathForFilters, options.include ?? []);
118
+ if (isInExclude && !isInInclude)
119
+ throw false;
120
+ const isInFilter = await options.filter(childPathForFilters, { type, hidden: isHidden, realPath });
121
+ if (!isInFilter)
122
+ throw true;
123
+ if (isSymlink) {
124
+ if (!options.followSimlinks)
125
+ subpaths.push(childAbsPath);
126
+ else {
127
+ const childSubpaths = await listAbsoluteSubpaths(realPath, options, {
128
+ ..._private_context,
129
+ depth: _private_context.depth + 1
130
+ });
131
+ subpaths.push(realPath, ...childSubpaths);
132
+ }
133
+ }
134
+ else {
135
+ if (isDirectory) {
136
+ const childSubpaths = await listAbsoluteSubpaths(childAbsPath, options, {
137
+ ..._private_context,
138
+ depth: _private_context.depth + 1,
139
+ lstats: childLstats
140
+ });
141
+ subpaths.push(childAbsPath, ...childSubpaths);
142
+ }
143
+ else {
144
+ subpaths.push(childAbsPath);
145
+ }
146
+ }
89
147
  }
90
- } else {
91
- if (isDirectory) {
92
- const childSubpaths = await listAbsoluteSubpaths(childAbsPath, options, {
93
- ..._private_context,
94
- depth: _private_context.depth + 1,
95
- lstats: childLstats
96
- });
97
- subpaths.push(childAbsPath, ...childSubpaths);
98
- } else {
99
- subpaths.push(childAbsPath);
148
+ catch (err) {
149
+ if (typeof err !== 'boolean')
150
+ throw new Error('This try/catch block should only throw booleans');
151
+ const shouldDiveDeeper = err;
152
+ if (!shouldDiveDeeper)
153
+ return [];
154
+ const childSubpaths = await listAbsoluteSubpaths(childAbsPath, options, {
155
+ ..._private_context,
156
+ depth: _private_context.depth + 1,
157
+ lstats: childLstats
158
+ });
159
+ subpaths.push(...childSubpaths);
100
160
  }
101
- }
102
- } catch (err) {
103
- if (typeof err !== "boolean") throw new Error("This try/catch block should only throw booleans");
104
- const shouldDiveDeeper = err;
105
- if (!shouldDiveDeeper) return [];
106
- const childSubpaths = await listAbsoluteSubpaths(childAbsPath, options, {
107
- ..._private_context,
108
- depth: _private_context.depth + 1,
109
- lstats: childLstats
110
- });
111
- subpaths.push(...childSubpaths);
112
- }
113
- }));
114
- return options.dedupeSimlinksContents ? Array.from(new Set(subpaths)) : subpaths;
161
+ }));
162
+ return options.dedupeSimlinksContents
163
+ ? Array.from(new Set(subpaths))
164
+ : subpaths;
115
165
  }
116
- export {
117
- defaultListContext,
118
- defaultListOptions,
119
- fillListContext,
120
- fillOptions,
121
- list
122
- };
@@ -1,9 +1,58 @@
1
- import {
2
- copyDir
3
- } from "../../../../chunks/chunk-4LTN4SCD.js";
4
- import "../../../../chunks/chunk-LUAYN7VJ.js";
5
- import "../../../../chunks/chunk-PUQUSA6S.js";
6
- import "../../../../chunks/chunk-WSFCRVEQ.js";
7
- export {
8
- copyDir
9
- };
1
+ import { PassThrough } from 'node:stream';
2
+ import * as Outcome from '../../../../agnostic/misc/outcome/index.js';
3
+ import { unknownToString } from '../../../../agnostic/errors/unknown-to-string/index.js';
4
+ /**
5
+ * Recursively copies every file under `sourceDir` to the same relative path
6
+ * beneath `targetDir` on an FTP server, streaming data to avoid buffering.
7
+ *
8
+ * @param {Client} ftpClient - The FTP client instance.
9
+ * @param {string} sourceDir - The source directory path to copy from.
10
+ * @param {string} targetDir - The target directory path to copy to.
11
+ * @param {CopyDirOptions} [options] - Optional parameters for the operation.
12
+ * @returns {Promise<Outcome.Either<true, string>>}
13
+ * - Success: `Outcome.makeSuccess(true)` if the copy succeeds.
14
+ * - Failure: `Outcome.makeFailure(errStr)` if an error occurs.
15
+ */
16
+ export async function copyDir(ftpClient, sourceDir, targetDir, options) {
17
+ const { overwrite = false, ensureDir = true } = options ?? {};
18
+ async function recurse(dir) {
19
+ const list = await ftpClient.list(dir);
20
+ for (const entry of list) {
21
+ const src = dir.endsWith('/') ? dir + entry.name : dir + '/' + entry.name;
22
+ const rel = src.substring(sourceDir.length + (sourceDir.endsWith('/') ? 0 : 1));
23
+ const dst = targetDir.endsWith('/') ? targetDir + rel : `${targetDir}/${rel}`;
24
+ if (entry.isDirectory) {
25
+ if (ensureDir)
26
+ await ftpClient.ensureDir(dst);
27
+ await recurse(src);
28
+ }
29
+ else if (entry.isFile) {
30
+ if (!overwrite) {
31
+ try {
32
+ await ftpClient.size(dst);
33
+ throw new Error(`File already exists at ${dst}.`);
34
+ }
35
+ catch { /* 550 “not found” – safe to proceed */ }
36
+ }
37
+ // Make sure parent directory exists if ensureDir is enabled
38
+ if (ensureDir) {
39
+ const dirPath = dst.substring(0, dst.lastIndexOf('/'));
40
+ await ftpClient.ensureDir(dirPath);
41
+ }
42
+ const pass = new PassThrough();
43
+ const upload = ftpClient.uploadFrom(pass, dst);
44
+ await ftpClient.downloadTo(pass, src);
45
+ await upload;
46
+ }
47
+ }
48
+ }
49
+ try {
50
+ if (ensureDir)
51
+ await ftpClient.ensureDir(targetDir);
52
+ await recurse(sourceDir);
53
+ return Outcome.makeSuccess(true);
54
+ }
55
+ catch (err) {
56
+ return Outcome.makeFailure(unknownToString(err));
57
+ }
58
+ }
@@ -1,4 +1,4 @@
1
- export * as list from './list/index.js'
2
1
  export * as copyDir from './copy-dir/index.js'
2
+ export * as list from './list/index.js'
3
3
  export * as moveDir from './move-dir/index.js'
4
4
  export * as removeDir from './remove-dir/index.js'
@@ -1,4 +1,4 @@
1
- export * as list from './list/index.js'
2
1
  export * as copyDir from './copy-dir/index.js'
2
+ export * as list from './list/index.js'
3
3
  export * as moveDir from './move-dir/index.js'
4
4
  export * as removeDir from './remove-dir/index.js'
@@ -1,9 +1,25 @@
1
- import {
2
- list
3
- } from "../../../../chunks/chunk-E7BBN5JC.js";
4
- import "../../../../chunks/chunk-LUAYN7VJ.js";
5
- import "../../../../chunks/chunk-PUQUSA6S.js";
6
- import "../../../../chunks/chunk-WSFCRVEQ.js";
7
- export {
8
- list
9
- };
1
+ import * as Outcome from '../../../../agnostic/misc/outcome/index.js';
2
+ import { unknownToString } from '../../../../agnostic/errors/unknown-to-string/index.js';
3
+ /**
4
+ * Lists all direct children files under a given directory on an FTP server.
5
+ *
6
+ * This function returns only the immediate files (not recursive) under the specified directory.
7
+ *
8
+ * @param {Client} ftpClient - The basic-ftp client instance used to interact with the FTP server.
9
+ * @param {string} directoryPath - The directory path to list files under.
10
+ * @returns {Promise<Outcome.Either<string[], string>>} Returns either a success with an array of file paths, or a failure with an error message.
11
+ */
12
+ export async function list(ftpClient, directoryPath) {
13
+ try {
14
+ const list = await ftpClient.list(directoryPath);
15
+ const files = list
16
+ .filter(entry => entry.isFile)
17
+ .map(entry => (directoryPath.endsWith('/')
18
+ ? `${directoryPath}${entry.name}`
19
+ : `${directoryPath}/${entry.name}`));
20
+ return Outcome.makeSuccess(files);
21
+ }
22
+ catch (err) {
23
+ return Outcome.makeFailure(unknownToString(err));
24
+ }
25
+ }
@@ -1,9 +1,41 @@
1
- import {
2
- moveDir
3
- } from "../../../../chunks/chunk-BCX4HPD7.js";
4
- import "../../../../chunks/chunk-LUAYN7VJ.js";
5
- import "../../../../chunks/chunk-PUQUSA6S.js";
6
- import "../../../../chunks/chunk-WSFCRVEQ.js";
7
- export {
8
- moveDir
9
- };
1
+ import * as Outcome from '../../../../agnostic/misc/outcome/index.js';
2
+ import { unknownToString } from '../../../../agnostic/errors/unknown-to-string/index.js';
3
+ /**
4
+ * Renames (moves) a directory on an FTP server.
5
+ * Most FTP servers allow `RNFR /path/old` + `RNTO /path/new` to move a tree
6
+ * atomically. Falling back to manual copy/delete would be expensive, so this
7
+ * util simply performs `rename`.
8
+ *
9
+ * If `ensureDir` is true (default), the parent directory of `targetDir` is
10
+ * created if it does not exist.
11
+ *
12
+ * @param {Client} ftpClient - The FTP client instance.
13
+ * @param {string} sourceDir - The source directory path to move from.
14
+ * @param {string} targetDir - The target directory path to move to.
15
+ * @param {MoveDirOptions} [options] - Optional parameters for the operation.
16
+ * @returns {Promise<Outcome.Either<true, string>>} A promise that resolves to an `Outcome.Either`:
17
+ * - On success: `Outcome.makeSuccess(true)` indicating the move was successful.
18
+ * - On failure: `Outcome.makeFailure(errStr)` with an error message if the move fails.
19
+ */
20
+ export async function moveDir(ftpClient, sourceDir, targetDir, options) {
21
+ const { overwrite = false, ensureDir = true } = options ?? {};
22
+ try {
23
+ if (ensureDir) {
24
+ // ensure parent directory of targetDir exists
25
+ const parentDir = targetDir.substring(0, targetDir.lastIndexOf('/'));
26
+ await ftpClient.ensureDir(parentDir);
27
+ }
28
+ if (!overwrite) {
29
+ try {
30
+ await ftpClient.size(targetDir); // will throw 550 for dirs or missing
31
+ return Outcome.makeFailure(`Target ${targetDir} already exists.`);
32
+ }
33
+ catch { /* not found – ok */ }
34
+ }
35
+ await ftpClient.rename(sourceDir, targetDir);
36
+ return Outcome.makeSuccess(true);
37
+ }
38
+ catch (err) {
39
+ return Outcome.makeFailure(unknownToString(err));
40
+ }
41
+ }
@@ -1,9 +1,42 @@
1
- import {
2
- removeDir
3
- } from "../../../../chunks/chunk-FSNNEPY5.js";
4
- import "../../../../chunks/chunk-LUAYN7VJ.js";
5
- import "../../../../chunks/chunk-PUQUSA6S.js";
6
- import "../../../../chunks/chunk-WSFCRVEQ.js";
7
- export {
8
- removeDir
9
- };
1
+ import * as Outcome from '../../../../agnostic/misc/outcome/index.js';
2
+ import { unknownToString } from '../../../../agnostic/errors/unknown-to-string/index.js';
3
+ /**
4
+ * Recursively deletes a directory (and all contents) on an FTP server.
5
+ *
6
+ * @param {Client} ftpClient - The FTP client instance.
7
+ * @param {string} directoryPath - The path of the directory to delete.
8
+ * @param {RemoveDirOptions} [options] - Optional configuration.
9
+ * @param {boolean} [options.ignoreMissing=true] - Whether to ignore a missing directory.
10
+ * @returns {Promise<Outcome.Either<true, string>>}
11
+ * - On success: `Outcome.makeSuccess(true)` – deletion succeeded, or directory
12
+ * was absent and `ignoreMissing` is true.
13
+ * - On failure: `Outcome.makeFailure(errStr)` if deletion fails, or directory
14
+ * absent and `ignoreMissing` is false.
15
+ */
16
+ export async function removeDir(ftpClient, directoryPath, options) {
17
+ const { ignoreMissing = true } = options ?? {};
18
+ async function recurse(dir) {
19
+ const list = await ftpClient.list(dir);
20
+ for (const entry of list) {
21
+ const full = dir.endsWith('/') ? dir + entry.name : `${dir}/${entry.name}`;
22
+ if (entry.isDirectory) {
23
+ await recurse(full);
24
+ }
25
+ else if (entry.isFile) {
26
+ await ftpClient.remove(full);
27
+ }
28
+ }
29
+ await ftpClient.removeDir(dir);
30
+ }
31
+ try {
32
+ await recurse(directoryPath);
33
+ return Outcome.makeSuccess(true);
34
+ }
35
+ catch (err) {
36
+ // 550 (“No such file or directory”) when the path is missing
37
+ if (ignoreMissing && err.code === 550) {
38
+ return Outcome.makeSuccess(true);
39
+ }
40
+ return Outcome.makeFailure(unknownToString(err));
41
+ }
42
+ }
@@ -1,9 +1,45 @@
1
- import {
2
- copy
3
- } from "../../../../chunks/chunk-ZAP3ELDE.js";
4
- import "../../../../chunks/chunk-LUAYN7VJ.js";
5
- import "../../../../chunks/chunk-PUQUSA6S.js";
6
- import "../../../../chunks/chunk-WSFCRVEQ.js";
7
- export {
8
- copy
9
- };
1
+ import { PassThrough } from 'node:stream';
2
+ import * as Outcome from '../../../../agnostic/misc/outcome/index.js';
3
+ import { unknownToString } from '../../../../agnostic/errors/unknown-to-string/index.js';
4
+ /**
5
+ * Copies a file from one path to another on the same FTP server, streaming the
6
+ * data instead of buffering it in memory.
7
+ *
8
+ * @param {Client} ftpClient - The basic‑ftp client instance.
9
+ * @param {string} sourcePath - The path of the source file.
10
+ * @param {string} targetPath - The destination path.
11
+ * @param {CopyOptions} [options] - Optional copy configuration.
12
+ * @returns {Promise<Outcome.Either<true, string>>}
13
+ * - On success: `Outcome.makeSuccess(true)`.
14
+ * - On failure: `Outcome.makeFailure(errStr)`.
15
+ */
16
+ export async function copy(ftpClient, sourcePath, targetPath, options) {
17
+ const { overwrite = false, ensureDir = true } = options ?? {};
18
+ try {
19
+ // Abort if destination exists and overwrite is disabled
20
+ if (!overwrite) {
21
+ try {
22
+ await ftpClient.size(targetPath);
23
+ return Outcome.makeFailure(`File already exists at ${targetPath}.`);
24
+ }
25
+ catch { /* 550 = not found – safe to proceed */ }
26
+ }
27
+ // Create missing target directories if requested
28
+ if (ensureDir) {
29
+ const dirPath = targetPath.substring(0, targetPath.lastIndexOf('/'));
30
+ await ftpClient.ensureDir(dirPath);
31
+ }
32
+ // Stream copy: download → PassThrough → upload
33
+ const pass = new PassThrough();
34
+ // Start the upload first so the server reads from `pass` as data arrives
35
+ const uploadPromise = ftpClient.uploadFrom(pass, targetPath);
36
+ // Pump data from source into `pass`
37
+ await ftpClient.downloadTo(pass, sourcePath);
38
+ // Wait until the upload completes
39
+ await uploadPromise;
40
+ return Outcome.makeSuccess(true);
41
+ }
42
+ catch (err) {
43
+ return Outcome.makeFailure(unknownToString(err));
44
+ }
45
+ }
@@ -1,9 +1,30 @@
1
- import {
2
- download
3
- } from "../../../../chunks/chunk-XQUMWHCH.js";
4
- import "../../../../chunks/chunk-LUAYN7VJ.js";
5
- import "../../../../chunks/chunk-PUQUSA6S.js";
6
- import "../../../../chunks/chunk-WSFCRVEQ.js";
7
- export {
8
- download
9
- };
1
+ import { PassThrough } from 'node:stream';
2
+ import { unknownToString } from '../../../../agnostic/errors/unknown-to-string/index.js';
3
+ import * as Outcome from '../../../../agnostic/misc/outcome/index.js';
4
+ /**
5
+ * Downloads a file from a specified FTP server.
6
+ *
7
+ * This function downloads a file from the given FTP server at the specified source path,
8
+ * returning the file content as a Readable stream. The download process can be customized
9
+ * using optional download options.
10
+ *
11
+ * @param {Client} ftpClient - The basic-ftp client instance used to interact with the FTP server.
12
+ * @param {string} sourcePath - The path of the file to be downloaded from the FTP server.
13
+ * @param {DownloadOptions} [options] - Optional settings for configuring the download process.
14
+ * @param {number} [options.startAt] - The byte offset at which to start downloading the file.
15
+ * @returns {Promise<Outcome.Either<Readable, string>>} A promise that resolves to an Outcome.Either.
16
+ * - On success: Outcome.makeSuccess(stream) containing the downloaded file's content as a Readable stream.
17
+ * - On failure: Outcome.makeFailure(errStr) with an error message if the download fails.
18
+ */
19
+ export async function download(ftpClient, sourcePath, options) {
20
+ const { startAt } = options ?? {};
21
+ const stream = new PassThrough();
22
+ try {
23
+ await ftpClient.downloadTo(stream, sourcePath, startAt);
24
+ return Outcome.makeSuccess(stream);
25
+ }
26
+ catch (err) {
27
+ const errStr = unknownToString(err);
28
+ return Outcome.makeFailure(errStr);
29
+ }
30
+ }
@@ -1,9 +1,39 @@
1
- import {
2
- exists
3
- } from "../../../../chunks/chunk-2FNCUXAX.js";
4
- import "../../../../chunks/chunk-LUAYN7VJ.js";
5
- import "../../../../chunks/chunk-PUQUSA6S.js";
6
- import "../../../../chunks/chunk-WSFCRVEQ.js";
7
- export {
8
- exists
9
- };
1
+ import { FileType } from 'basic-ftp';
2
+ import { unknownToString } from '../../../../agnostic/errors/unknown-to-string/index.js';
3
+ import * as Outcome from '../../../../agnostic/misc/outcome/index.js';
4
+ /**
5
+ * Checks if a *file* (not a directory) exists on a specified FTP server.
6
+ *
7
+ * `ftpClient.list(parentDir)` returns an array of `FileInfo` objects:
8
+ * • `type === FileType.File` → regular file
9
+ * • `type === FileType.Directory` → directory
10
+ * • `type === FileType.SymbolicLink` → symlink
11
+ *
12
+ * The function reports **true** only for `FileType.File` or
13
+ * `FileType.SymbolicLink`, mirroring the SFTP behaviour where `'-'` and `'l'`
14
+ * are considered files.
15
+ *
16
+ * @param {Client} ftpClient - The basic‑ftp client instance.
17
+ * @param {string} sourcePath - The full path to check on the FTP server.
18
+ * @returns {Promise<Outcome.Either<boolean, string>>}
19
+ * - Success: `Outcome.makeSuccess(true | false)` – true only if a file exists.
20
+ * - Failure: `Outcome.makeFailure(errStr)` if an error occurs.
21
+ */
22
+ export async function exists(ftpClient, sourcePath) {
23
+ try {
24
+ // Split path into parent dir and base name
25
+ const lastSlash = sourcePath.lastIndexOf('/');
26
+ // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
27
+ const parentDir = lastSlash === -1 ? '.' : sourcePath.slice(0, lastSlash) || '/';
28
+ const baseName = lastSlash === -1 ? sourcePath : sourcePath.slice(lastSlash + 1);
29
+ const list = await ftpClient.list(parentDir);
30
+ const entry = list.find(e => e.name === baseName);
31
+ const isFile = entry !== undefined
32
+ ? (entry.type === FileType.File || entry.type === FileType.SymbolicLink)
33
+ : false;
34
+ return Outcome.makeSuccess(isFile);
35
+ }
36
+ catch (err) {
37
+ return Outcome.makeFailure(unknownToString(err));
38
+ }
39
+ }