@design-edito/tools 0.4.5 → 0.4.11
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.
- package/TODO.md +269 -0
- package/agnostic/arrays/dedupe/index.js +9 -7
- package/agnostic/arrays/dedupe/index.test.js +24 -0
- package/agnostic/arrays/find-duplicates/index.js +34 -22
- package/agnostic/arrays/find-duplicates/index.test.js +31 -0
- package/agnostic/arrays/index.d.ts +2 -2
- package/agnostic/arrays/index.js +2 -2
- package/agnostic/arrays/is-array-of/index.js +28 -26
- package/agnostic/arrays/is-array-of/index.test.js +56 -0
- package/agnostic/arrays/make/index.d.ts +1 -1
- package/agnostic/arrays/make/index.js +11 -6
- package/agnostic/arrays/make/index.test.js +10 -0
- package/agnostic/arrays/random-pick/index.js +38 -22
- package/agnostic/arrays/random-pick/index.test.js +23 -0
- package/agnostic/arrays/shuffle/index.js +15 -11
- package/agnostic/arrays/shuffle/index.test.js +14 -0
- package/agnostic/booleans/is-falsy/index.js +24 -15
- package/agnostic/booleans/is-falsy/index.test.js +26 -0
- package/agnostic/colors/channels/index.js +139 -936
- package/agnostic/colors/channels/index.test.js +64 -0
- package/agnostic/colors/contrast/index.js +24 -643
- package/agnostic/colors/contrast/index.test.js +21 -0
- package/agnostic/colors/convert/index.js +811 -837
- package/agnostic/colors/convert/index.test.js +98 -0
- package/agnostic/colors/cssColorsMap.js +153 -0
- package/agnostic/colors/distance/index.js +66 -538
- package/agnostic/colors/distance/index.test.js +21 -0
- package/agnostic/colors/grayscale/index.js +95 -872
- package/agnostic/colors/grayscale/index.test.js +34 -0
- package/agnostic/colors/index.d.ts +4 -4
- package/agnostic/colors/index.js +4 -4
- package/agnostic/colors/invert/index.js +34 -719
- package/agnostic/colors/invert/index.test.js +31 -0
- package/agnostic/colors/lerp/index.js +75 -804
- package/agnostic/colors/lerp/index.test.js +55 -0
- package/agnostic/colors/luminance/index.js +17 -625
- package/agnostic/colors/luminance/index.test.js +30 -0
- package/agnostic/colors/palette/index.js +83 -917
- package/agnostic/colors/palette/index.test.js +35 -0
- package/agnostic/colors/rotate/index.js +35 -835
- package/agnostic/colors/rotate/index.test.js +45 -0
- package/agnostic/colors/tidy/index.js +79 -530
- package/agnostic/colors/tidy/index.test.js +45 -0
- package/agnostic/colors/typechecks/index.js +188 -250
- package/agnostic/colors/typechecks/index.test.js +113 -0
- package/agnostic/colors/types.js +1 -0
- package/agnostic/css/bem/index.js +134 -171
- package/agnostic/css/clss/index.js +64 -29
- package/agnostic/css/clss/index.test.js +60 -0
- package/agnostic/css/generate-nice-color/index.js +26 -71
- package/agnostic/css/generate-nice-color/index.test.js +8 -0
- package/agnostic/css/index.d.ts +2 -2
- package/agnostic/css/index.js +2 -2
- package/agnostic/css/is-valid-css-class-name/index.js +14 -8
- package/agnostic/css/is-valid-css-class-name/index.test.js +36 -0
- package/agnostic/css/scale/index.d.ts +46 -16
- package/agnostic/css/scale/index.js +70 -54
- package/agnostic/css/scale/index.test.js +88 -0
- package/agnostic/css/styles-set/index.js +151 -178
- package/agnostic/errors/index.d.ts +1 -1
- package/agnostic/errors/index.js +1 -1
- package/agnostic/errors/register/index.js +45 -49
- package/agnostic/errors/unknown-to-string/index.js +17 -10
- package/agnostic/errors/unknown-to-string/index.test.js +35 -0
- package/agnostic/html/get-node-ancestors/index.js +29 -29
- package/agnostic/html/get-node-ancestors/index.test.js +58 -0
- package/agnostic/html/get-position-inside-parent/index.js +13 -8
- package/agnostic/html/get-position-inside-parent/index.test.js +56 -0
- package/agnostic/html/hyper-json/cast/index.js +128 -2931
- package/agnostic/html/hyper-json/index.js +23 -2954
- package/agnostic/html/hyper-json/method/index.js +10 -14
- package/agnostic/html/hyper-json/serialize/index.js +88 -222
- package/agnostic/html/hyper-json/smart-tags/coalesced/add/index.js +14 -2938
- package/agnostic/html/hyper-json/smart-tags/coalesced/addclass/index.js +27 -2937
- package/agnostic/html/hyper-json/smart-tags/coalesced/and/index.js +13 -2938
- package/agnostic/html/hyper-json/smart-tags/coalesced/append/index.js +34 -2938
- package/agnostic/html/hyper-json/smart-tags/coalesced/at/index.js +42 -2935
- package/agnostic/html/hyper-json/smart-tags/coalesced/call/index.js +47 -2937
- package/agnostic/html/hyper-json/smart-tags/coalesced/clone/index.js +10 -2939
- package/agnostic/html/hyper-json/smart-tags/coalesced/deleteproperties/index.js +45 -2936
- package/agnostic/html/hyper-json/smart-tags/coalesced/equals/index.js +22 -2938
- package/agnostic/html/hyper-json/smart-tags/coalesced/getattribute/index.js +26 -2938
- package/agnostic/html/hyper-json/smart-tags/coalesced/getproperties/index.js +19 -2938
- package/agnostic/html/hyper-json/smart-tags/coalesced/getproperty/index.js +67 -2935
- package/agnostic/html/hyper-json/smart-tags/coalesced/hjparse/index.js +21 -2937
- package/agnostic/html/hyper-json/smart-tags/coalesced/hjstringify/index.js +89 -2938
- package/agnostic/html/hyper-json/smart-tags/coalesced/if/index.js +20 -2938
- package/agnostic/html/hyper-json/smart-tags/coalesced/index.d.ts +11 -11
- package/agnostic/html/hyper-json/smart-tags/coalesced/index.js +11 -11
- package/agnostic/html/hyper-json/smart-tags/coalesced/initialize/index.js +37 -2938
- package/agnostic/html/hyper-json/smart-tags/coalesced/join/index.js +16 -2938
- package/agnostic/html/hyper-json/smart-tags/coalesced/length/index.js +21 -2938
- package/agnostic/html/hyper-json/smart-tags/coalesced/map/index.js +31 -2938
- package/agnostic/html/hyper-json/smart-tags/coalesced/negate/index.js +10 -2939
- package/agnostic/html/hyper-json/smart-tags/coalesced/notrailing/index.js +33 -2938
- package/agnostic/html/hyper-json/smart-tags/coalesced/or/index.js +13 -2938
- package/agnostic/html/hyper-json/smart-tags/coalesced/pickrandom/index.js +17 -2938
- package/agnostic/html/hyper-json/smart-tags/coalesced/populate/index.js +59 -2938
- package/agnostic/html/hyper-json/smart-tags/coalesced/print/index.js +23 -2938
- package/agnostic/html/hyper-json/smart-tags/coalesced/push/index.js +10 -2939
- package/agnostic/html/hyper-json/smart-tags/coalesced/pusheach/index.js +26 -2938
- package/agnostic/html/hyper-json/smart-tags/coalesced/recordtoarray/index.js +10 -2939
- package/agnostic/html/hyper-json/smart-tags/coalesced/removeattribute/index.js +53 -2935
- package/agnostic/html/hyper-json/smart-tags/coalesced/removeclass/index.js +27 -2937
- package/agnostic/html/hyper-json/smart-tags/coalesced/renameproperty/index.js +31 -2937
- package/agnostic/html/hyper-json/smart-tags/coalesced/replace/index.js +55 -2940
- package/agnostic/html/hyper-json/smart-tags/coalesced/select/index.js +29 -2935
- package/agnostic/html/hyper-json/smart-tags/coalesced/set/index.js +29 -2938
- package/agnostic/html/hyper-json/smart-tags/coalesced/setattribute/index.js +53 -2935
- package/agnostic/html/hyper-json/smart-tags/coalesced/setproperty/index.js +232 -2936
- package/agnostic/html/hyper-json/smart-tags/coalesced/sorton/index.js +89 -2936
- package/agnostic/html/hyper-json/smart-tags/coalesced/split/index.js +20 -2938
- package/agnostic/html/hyper-json/smart-tags/coalesced/spread/index.js +23 -2939
- package/agnostic/html/hyper-json/smart-tags/coalesced/toarray/index.js +11 -2939
- package/agnostic/html/hyper-json/smart-tags/coalesced/toboolean/index.js +11 -2939
- package/agnostic/html/hyper-json/smart-tags/coalesced/toelement/index.js +17 -2938
- package/agnostic/html/hyper-json/smart-tags/coalesced/toggleclass/index.js +27 -2937
- package/agnostic/html/hyper-json/smart-tags/coalesced/tonodelist/index.js +11 -2939
- package/agnostic/html/hyper-json/smart-tags/coalesced/tonull/index.js +10 -2939
- package/agnostic/html/hyper-json/smart-tags/coalesced/tonumber/index.js +11 -2939
- package/agnostic/html/hyper-json/smart-tags/coalesced/torecord/index.js +11 -2939
- package/agnostic/html/hyper-json/smart-tags/coalesced/toref/index.js +11 -2939
- package/agnostic/html/hyper-json/smart-tags/coalesced/tostring/index.js +11 -2939
- package/agnostic/html/hyper-json/smart-tags/coalesced/totext/index.js +11 -2939
- package/agnostic/html/hyper-json/smart-tags/coalesced/transformselected/index.js +84 -2938
- package/agnostic/html/hyper-json/smart-tags/coalesced/trim/index.js +14 -2938
- package/agnostic/html/hyper-json/smart-tags/index.js +28 -181
- package/agnostic/html/hyper-json/smart-tags/isolated/any/index.js +12 -195
- package/agnostic/html/hyper-json/smart-tags/isolated/array/index.js +12 -195
- package/agnostic/html/hyper-json/smart-tags/isolated/boolean/index.js +12 -2939
- package/agnostic/html/hyper-json/smart-tags/isolated/element/index.js +24 -2938
- package/agnostic/html/hyper-json/smart-tags/isolated/get/index.js +18 -2938
- package/agnostic/html/hyper-json/smart-tags/isolated/guess/index.js +56 -2937
- package/agnostic/html/hyper-json/smart-tags/isolated/index.d.ts +2 -2
- package/agnostic/html/hyper-json/smart-tags/isolated/index.js +2 -2
- package/agnostic/html/hyper-json/smart-tags/isolated/nodelist/index.js +18 -2938
- package/agnostic/html/hyper-json/smart-tags/isolated/null/index.js +9 -193
- package/agnostic/html/hyper-json/smart-tags/isolated/number/index.js +16 -2938
- package/agnostic/html/hyper-json/smart-tags/isolated/record/index.js +12 -2938
- package/agnostic/html/hyper-json/smart-tags/isolated/ref/index.js +40 -2935
- package/agnostic/html/hyper-json/smart-tags/isolated/string/index.js +16 -2938
- package/agnostic/html/hyper-json/smart-tags/isolated/text/index.js +18 -2938
- package/agnostic/html/hyper-json/transformer/index.js +112 -148
- package/agnostic/html/hyper-json/tree/index.js +411 -2928
- package/agnostic/html/hyper-json/types/index.js +27 -18
- package/agnostic/html/hyper-json/utils/index.js +497 -2921
- package/agnostic/html/index.d.ts +2 -2
- package/agnostic/html/index.js +2 -2
- package/agnostic/html/insert-node/index.js +27 -16
- package/agnostic/html/insert-node/index.test.js +73 -0
- package/agnostic/html/placeholders/index.js +26 -29
- package/agnostic/html/replace-in-element/index.js +31 -48
- package/agnostic/html/replace-in-element/index.test.js +80 -0
- package/agnostic/html/selector-to-element/index.js +53 -39
- package/agnostic/html/selector-to-element/index.test.js +69 -0
- package/agnostic/html/string-to-nodes/index.js +24 -25
- package/agnostic/html/string-to-nodes/index.test.js +54 -0
- package/agnostic/index.d.ts +4 -4
- package/agnostic/index.js +4 -4
- package/agnostic/misc/assert/index.js +60 -66
- package/agnostic/misc/cast/index.js +123 -57
- package/agnostic/misc/cast/index.test.js +134 -0
- package/agnostic/misc/connection/index.js +55 -36
- package/agnostic/misc/connection/index.test.js +143 -0
- package/agnostic/misc/crawler/index.js +68 -46
- package/agnostic/misc/crawler/index.test.js +56 -0
- package/agnostic/misc/crossenv/detect-runtime/index.js +41 -13
- package/agnostic/misc/crossenv/detect-runtime/index.test.js +24 -0
- package/agnostic/misc/crossenv/types.js +21 -14
- package/agnostic/misc/crossenv/window/index.js +45 -24
- package/agnostic/misc/crossenv/window/index.test.js +24 -0
- package/agnostic/misc/data-size/index.js +182 -294
- package/agnostic/misc/data-size/index.test.js +100 -0
- package/agnostic/misc/data-size/types.js +1 -0
- package/agnostic/misc/index.d.ts +5 -5
- package/agnostic/misc/index.js +5 -5
- package/agnostic/misc/is-constructor-function/index.js +12 -6
- package/agnostic/misc/is-constructor-function/index.test.js +36 -0
- package/agnostic/misc/is-nullish/index.js +24 -11
- package/agnostic/misc/is-nullish/index.test.js +44 -0
- package/agnostic/misc/logs/index.d.ts +1 -1
- package/agnostic/misc/logs/index.js +1 -1
- package/agnostic/misc/logs/logger/index.js +115 -140
- package/agnostic/misc/logs/make-text-block/index.js +13 -13
- package/agnostic/misc/logs/styles/index.js +29 -48
- package/agnostic/misc/lorem-ipsum/index.js +51 -201
- package/agnostic/misc/lorem-ipsum/index.test.js +49 -0
- package/agnostic/misc/normalize-extension/index.js +99 -88
- package/agnostic/misc/normalize-extension/index.test.js +40 -0
- package/agnostic/misc/outcome/index.js +20 -14
- package/agnostic/misc/outcome/index.test.js +40 -0
- package/agnostic/numbers/absolute-modulo/index.js +9 -6
- package/agnostic/numbers/absolute-modulo/index.test.js +23 -0
- package/agnostic/numbers/approximate-rational/index.js +86 -69
- package/agnostic/numbers/approximate-rational/index.test.js +90 -0
- package/agnostic/numbers/clamp/index.js +12 -8
- package/agnostic/numbers/clamp/index.test.js +24 -0
- package/agnostic/numbers/geometric-progressions/index.js +25 -16
- package/agnostic/numbers/geometric-progressions/index.test.js +45 -0
- package/agnostic/numbers/index.d.ts +2 -2
- package/agnostic/numbers/index.js +2 -2
- package/agnostic/numbers/interpolate/index.js +25 -10
- package/agnostic/numbers/interpolate/index.test.js +40 -0
- package/agnostic/numbers/round/index.js +30 -15
- package/agnostic/numbers/round/index.test.js +56 -0
- package/agnostic/objects/deep-get-property/index.js +30 -27
- package/agnostic/objects/deep-get-property/index.test.js +59 -0
- package/agnostic/objects/enums/is-in-enum/index.js +17 -11
- package/agnostic/objects/enums/is-in-enum/index.test.js +100 -0
- package/agnostic/objects/flatten-getters/index.js +15 -14
- package/agnostic/objects/flatten-getters/index.test.js +78 -0
- package/agnostic/objects/index.d.ts +4 -4
- package/agnostic/objects/index.js +4 -4
- package/agnostic/objects/is-object/index.js +16 -9
- package/agnostic/objects/is-object/index.test.js +60 -0
- package/agnostic/objects/is-record/index.js +12 -7
- package/agnostic/objects/is-record/index.test.js +48 -0
- package/agnostic/objects/record-format/index.js +18 -12
- package/agnostic/objects/record-format/index.test.js +92 -0
- package/agnostic/objects/record-map/index.js +16 -11
- package/agnostic/objects/record-map/index.test.js +56 -0
- package/agnostic/objects/sort-keys/index.js +15 -11
- package/agnostic/objects/sort-keys/index.test.js +37 -0
- package/agnostic/objects/validation/index.js +21 -8
- package/agnostic/objects/validation/index.test.js +72 -0
- package/agnostic/optim/memoize/index.js +24 -16
- package/agnostic/optim/memoize/index.test.js +30 -0
- package/agnostic/optim/throttle-debounce/index.js +120 -102
- package/agnostic/optim/throttle-debounce/index.test.js +44 -0
- package/agnostic/optim/throttle-debounce/types.js +1 -0
- package/agnostic/random/hex-char/index.js +8 -10
- package/agnostic/random/hex-char/index.test.js +20 -0
- package/agnostic/random/index.d.ts +1 -1
- package/agnostic/random/index.js +1 -1
- package/agnostic/random/random/index.js +17 -14
- package/agnostic/random/random/index.test.js +73 -0
- package/agnostic/random/uuid/index.js +28 -20
- package/agnostic/random/uuid/index.test.js +45 -0
- package/agnostic/regexps/index.js +126 -84
- package/agnostic/regexps/index.test.js +108 -0
- package/agnostic/sanitization/file-name/index.js +24 -8
- package/agnostic/sanitization/file-name/index.test.js +23 -0
- package/agnostic/sanitization/html/index.js +172 -122
- package/agnostic/sanitization/index.d.ts +1 -1
- package/agnostic/sanitization/index.js +1 -1
- package/agnostic/sanitization/path/index.js +23 -15
- package/agnostic/sanitization/path/index.test.js +18 -0
- package/agnostic/sanitization/types.js +1 -0
- package/agnostic/sanitization/user-input/index.js +36 -24
- package/agnostic/sanitization/user-input/index.test.js +31 -0
- package/agnostic/strings/char-codes/index.js +123 -55
- package/agnostic/strings/index.d.ts +1 -1
- package/agnostic/strings/index.js +1 -1
- package/agnostic/strings/matches/index.js +35 -16
- package/agnostic/strings/normalize-indent/index.js +34 -16
- package/agnostic/strings/parse-table/index.js +153 -86
- package/agnostic/strings/replace-all/index.js +36 -15
- package/agnostic/strings/to-alphanum/index.js +23 -8
- package/agnostic/strings/trim/index.js +22 -9
- package/agnostic/time/dates/format-date/index.js +140 -72
- package/agnostic/time/duration/index.js +106 -140
- package/agnostic/time/timeout/index.js +24 -16
- package/agnostic/time/transitions/index.js +200 -158
- package/agnostic/time/wait/index.js +10 -8
- package/agnostic/typescript/types.js +1 -0
- package/components/BeforeAfter/index.controlled.js +95 -0
- package/components/BeforeAfter/index.js +54 -189
- package/components/BeforeAfter/utils.js +9 -0
- package/components/Disclaimer/index.js +50 -110
- package/components/Drawer/index.js +81 -196
- package/components/EventListener/index.js +29 -80
- package/components/Gallery/index.js +146 -221
- package/components/Gallery/utils.js +12 -0
- package/components/Image/index.js +66 -293
- package/components/IntersectionObserver/index.js +62 -110
- package/components/Overlayer/index.js +59 -103
- package/components/Paginator/index.js +124 -155
- package/components/ResizeObserver/index.js +66 -119
- package/components/ResizeObserver/style.module.css +0 -0
- package/components/Scrllgngn/index.js +171 -468
- package/components/ScrollListener/index.js +97 -276
- package/components/ScrollListener/utils.js +51 -0
- package/components/Sequencer/index.controlled.js +67 -0
- package/components/Sequencer/index.js +105 -262
- package/components/ShadowRoot/index.js +42 -96
- package/components/Subtitles/index.js +107 -244
- package/components/Subtitles/types.js +1 -0
- package/components/Subtitles/utils.js +102 -0
- package/components/Theatre/index.js +88 -136
- package/components/UIModule/index.js +156 -199
- package/components/Video/index.js +292 -857
- package/components/Video/utils.js +137 -0
- package/components/_WIP_AudioQuote/index.js +1 -0
- package/components/_WIP_Icon/index.js +1 -0
- package/components/index.d.ts +4 -4
- package/components/index.js +4 -4
- package/components/public-classnames.js +18 -0
- package/components/utils/index.js +11 -11
- package/components/utils/types.js +1 -0
- package/index.d.ts +1 -1
- package/index.js +1 -1
- package/node/@aws-s3/index.test.js +6 -0
- package/node/@aws-s3/storage/directory/copy-dir/index.js +66 -72
- package/node/@aws-s3/storage/directory/index.d.ts +1 -1
- package/node/@aws-s3/storage/directory/index.js +1 -1
- package/node/@aws-s3/storage/directory/list/index.js +32 -42
- package/node/@aws-s3/storage/directory/move-dir/index.js +68 -86
- package/node/@aws-s3/storage/directory/remove-dir/index.js +56 -67
- package/node/@aws-s3/storage/file/copy/index.js +41 -53
- package/node/@aws-s3/storage/file/download/index.js +29 -40
- package/node/@aws-s3/storage/file/exists/index.js +35 -43
- package/node/@aws-s3/storage/file/index.d.ts +1 -1
- package/node/@aws-s3/storage/file/index.js +1 -1
- package/node/@aws-s3/storage/file/move/index.js +57 -63
- package/node/@aws-s3/storage/file/remove/index.js +35 -43
- package/node/@aws-s3/storage/file/stat/index.js +33 -47
- package/node/@aws-s3/storage/file/upload/index.js +52 -63
- package/node/@design-edito/index.js +1 -0
- package/node/@express/@multer/index.js +61 -55
- package/node/@google-cloud/storage/bucket/get-metadata/index.js +25 -29
- package/node/@google-cloud/storage/directory/copy-dir/index.js +35 -41
- package/node/@google-cloud/storage/directory/index.d.ts +1 -1
- package/node/@google-cloud/storage/directory/index.js +1 -1
- package/node/@google-cloud/storage/directory/list/index.js +28 -35
- package/node/@google-cloud/storage/directory/move-dir/index.js +43 -42
- package/node/@google-cloud/storage/directory/remove-dir/index.js +34 -38
- package/node/@google-cloud/storage/file/copy/index.js +35 -40
- package/node/@google-cloud/storage/file/download/index.js +27 -34
- package/node/@google-cloud/storage/file/exists/index.js +25 -31
- package/node/@google-cloud/storage/file/generate-signed-url/index.js +33 -35
- package/node/@google-cloud/storage/file/get-metadata/index.js +28 -31
- package/node/@google-cloud/storage/file/get-permissions/index.js +25 -31
- package/node/@google-cloud/storage/file/index.d.ts +3 -3
- package/node/@google-cloud/storage/file/index.js +3 -3
- package/node/@google-cloud/storage/file/move/index.js +38 -42
- package/node/@google-cloud/storage/file/remove/index.js +34 -35
- package/node/@google-cloud/storage/file/revoke-signed-urls/index.js +32 -95
- package/node/@google-cloud/storage/file/stat/index.js +34 -38
- package/node/@google-cloud/storage/file/update-metadata/index.js +30 -31
- package/node/@google-cloud/storage/file/upload/index.js +44 -46
- package/node/@google-cloud/storage/index.d.ts +1 -1
- package/node/@google-cloud/storage/index.js +1 -1
- package/node/cloud-storage/clients/index.js +35 -15
- package/node/cloud-storage/operations/copy-dir/index.js +30 -203
- package/node/cloud-storage/operations/copy-file/index.js +30 -152
- package/node/cloud-storage/operations/download-file/index.js +30 -103
- package/node/cloud-storage/operations/exists-file/index.js +30 -103
- package/node/cloud-storage/operations/index.d.ts +2 -2
- package/node/cloud-storage/operations/index.js +2 -2
- package/node/cloud-storage/operations/list-dir/index.js +29 -98
- package/node/cloud-storage/operations/move-dir/index.js +30 -169
- package/node/cloud-storage/operations/move-file/index.js +30 -157
- package/node/cloud-storage/operations/remove-dir/index.js +29 -159
- package/node/cloud-storage/operations/remove-file/index.js +29 -121
- package/node/cloud-storage/operations/stat-file/index.js +29 -124
- package/node/cloud-storage/operations/upload-file/index.js +30 -162
- package/node/encryption/@aes-256-gcm/buffer/index.js +31 -72
- package/node/encryption/@aes-256-gcm/uint8-array/index.js +55 -55
- package/node/encryption/key/index.js +19 -12
- package/node/files/index.d.ts +1 -1
- package/node/files/index.js +1 -1
- package/node/files/is-in-directory/index.js +11 -8
- package/node/files/read-write/index.js +11 -15
- package/node/files/subpaths/index.js +156 -121
- package/node/ftps/directory/copy-dir/index.js +55 -62
- package/node/ftps/directory/list/index.js +24 -29
- package/node/ftps/directory/move-dir/index.js +38 -38
- package/node/ftps/directory/remove-dir/index.js +39 -42
- package/node/ftps/file/copy/index.js +42 -47
- package/node/ftps/file/download/index.js +29 -34
- package/node/ftps/file/exists/index.js +38 -36
- package/node/ftps/file/index.d.ts +2 -2
- package/node/ftps/file/index.js +2 -2
- package/node/ftps/file/move/index.js +46 -44
- package/node/ftps/file/remove/index.js +36 -39
- package/node/ftps/file/stat/index.js +30 -38
- package/node/ftps/file/upload/index.js +40 -44
- package/node/images/create/index.js +10 -562
- package/node/images/format/index.js +264 -815
- package/node/images/metadata/index.js +10 -571
- package/node/images/transform/index.js +169 -1022
- package/node/images/transform/operations/blur/index.js +11 -24
- package/node/images/transform/operations/brighten/index.js +11 -24
- package/node/images/transform/operations/extend/index.js +25 -589
- package/node/images/transform/operations/extract/index.js +15 -28
- package/node/images/transform/operations/flatten/index.js +20 -584
- package/node/images/transform/operations/flip/index.js +2 -6
- package/node/images/transform/operations/flop/index.js +2 -6
- package/node/images/transform/operations/hue/index.js +13 -26
- package/node/images/transform/operations/index.d.ts +3 -3
- package/node/images/transform/operations/index.js +3 -3
- package/node/images/transform/operations/level/index.js +14 -30
- package/node/images/transform/operations/lighten/index.js +13 -26
- package/node/images/transform/operations/normalize/index.js +14 -27
- package/node/images/transform/operations/overlay/index.js +89 -673
- package/node/images/transform/operations/resize/index.js +46 -610
- package/node/images/transform/operations/rotate/index.js +20 -584
- package/node/images/transform/operations/saturate/index.js +14 -27
- package/node/images/types.js +34 -31
- package/node/images/utils/index.js +84 -568
- package/node/index.d.ts +2 -2
- package/node/index.js +2 -2
- package/node/process/on-exit/index.js +45 -26
- package/node/process/prompt-continue/index.js +29 -14
- package/node/process/spawner/index.js +104 -134
- package/node/sftp/directory/copy-dir/index.js +52 -60
- package/node/sftp/directory/index.d.ts +1 -1
- package/node/sftp/directory/index.js +1 -1
- package/node/sftp/directory/list/index.js +22 -29
- package/node/sftp/directory/move-dir/index.js +35 -35
- package/node/sftp/directory/remove-dir/index.js +39 -42
- package/node/sftp/file/copy/index.js +37 -45
- package/node/sftp/file/download/index.js +26 -32
- package/node/sftp/file/exists/index.js +29 -29
- package/node/sftp/file/index.d.ts +2 -2
- package/node/sftp/file/index.js +2 -2
- package/node/sftp/file/move/index.js +39 -38
- package/node/sftp/file/remove/index.js +31 -34
- package/node/sftp/file/stat/index.js +26 -37
- package/node/sftp/file/upload/index.js +34 -38
- package/package.json +1 -1
|
@@ -1,65 +1,58 @@
|
|
|
1
|
-
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
+
}
|
|
43
47
|
}
|
|
44
|
-
if (ensureDir) {
|
|
45
|
-
const dirPath = dst.substring(0, dst.lastIndexOf("/"));
|
|
46
|
-
await ftpClient.ensureDir(dirPath);
|
|
47
|
-
}
|
|
48
|
-
const pass = new PassThrough();
|
|
49
|
-
const upload = ftpClient.uploadFrom(pass, dst);
|
|
50
|
-
await ftpClient.downloadTo(pass, src);
|
|
51
|
-
await upload;
|
|
52
|
-
}
|
|
53
48
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
+
}
|
|
62
58
|
}
|
|
63
|
-
export {
|
|
64
|
-
copyDir
|
|
65
|
-
};
|
|
@@ -1,30 +1,25 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
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
|
+
}
|
|
4
25
|
}
|
|
5
|
-
function makeFailure(error) {
|
|
6
|
-
return { success: false, error };
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
// src/agnostic/errors/unknown-to-string/index.ts
|
|
10
|
-
function unknownToString(unk, encoding) {
|
|
11
|
-
if (unk instanceof Error) return unk.message;
|
|
12
|
-
if (unk instanceof Buffer) return unk.toString(encoding ?? "utf-8");
|
|
13
|
-
if (typeof unk === "string") return unk;
|
|
14
|
-
if (typeof unk === "object" && unk !== null) return JSON.stringify(unk);
|
|
15
|
-
return `${unk}`;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
// src/node/ftps/directory/list/index.ts
|
|
19
|
-
async function list(ftpClient, directoryPath) {
|
|
20
|
-
try {
|
|
21
|
-
const list2 = await ftpClient.list(directoryPath);
|
|
22
|
-
const files = list2.filter((entry) => entry.isFile).map((entry) => directoryPath.endsWith("/") ? `${directoryPath}${entry.name}` : `${directoryPath}/${entry.name}`);
|
|
23
|
-
return makeSuccess(files);
|
|
24
|
-
} catch (err) {
|
|
25
|
-
return makeFailure(unknownToString(err));
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
export {
|
|
29
|
-
list
|
|
30
|
-
};
|
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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);
|
|
25
37
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
await ftpClient.size(targetDir);
|
|
29
|
-
return makeFailure(`Target ${targetDir} already exists.`);
|
|
30
|
-
} catch {
|
|
31
|
-
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
return Outcome.makeFailure(unknownToString(err));
|
|
32
40
|
}
|
|
33
|
-
await ftpClient.rename(sourceDir, targetDir);
|
|
34
|
-
return makeSuccess(true);
|
|
35
|
-
} catch (err) {
|
|
36
|
-
return makeFailure(unknownToString(err));
|
|
37
|
-
}
|
|
38
41
|
}
|
|
39
|
-
export {
|
|
40
|
-
moveDir
|
|
41
|
-
};
|
|
@@ -1,45 +1,42 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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);
|
|
30
34
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
if (ignoreMissing && err.code === 550) {
|
|
38
|
-
return makeSuccess(true);
|
|
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));
|
|
39
41
|
}
|
|
40
|
-
return makeFailure(unknownToString(err));
|
|
41
|
-
}
|
|
42
42
|
}
|
|
43
|
-
export {
|
|
44
|
-
removeDir
|
|
45
|
-
};
|
|
@@ -1,50 +1,45 @@
|
|
|
1
|
-
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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);
|
|
34
41
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
await ftpClient.ensureDir(dirPath);
|
|
42
|
+
catch (err) {
|
|
43
|
+
return Outcome.makeFailure(unknownToString(err));
|
|
38
44
|
}
|
|
39
|
-
const pass = new PassThrough();
|
|
40
|
-
const uploadPromise = ftpClient.uploadFrom(pass, targetPath);
|
|
41
|
-
await ftpClient.downloadTo(pass, sourcePath);
|
|
42
|
-
await uploadPromise;
|
|
43
|
-
return makeSuccess(true);
|
|
44
|
-
} catch (err) {
|
|
45
|
-
return makeFailure(unknownToString(err));
|
|
46
|
-
}
|
|
47
45
|
}
|
|
48
|
-
export {
|
|
49
|
-
copy
|
|
50
|
-
};
|
|
@@ -1,35 +1,30 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
+
}
|
|
11
30
|
}
|
|
12
|
-
|
|
13
|
-
// src/agnostic/misc/outcome/index.ts
|
|
14
|
-
function makeSuccess(payload) {
|
|
15
|
-
return { success: true, payload };
|
|
16
|
-
}
|
|
17
|
-
function makeFailure(error) {
|
|
18
|
-
return { success: false, error };
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
// src/node/ftps/file/download/index.ts
|
|
22
|
-
async function download(ftpClient, sourcePath, options) {
|
|
23
|
-
const { startAt } = options ?? {};
|
|
24
|
-
const stream = new PassThrough();
|
|
25
|
-
try {
|
|
26
|
-
await ftpClient.downloadTo(stream, sourcePath, startAt);
|
|
27
|
-
return makeSuccess(stream);
|
|
28
|
-
} catch (err) {
|
|
29
|
-
const errStr = unknownToString(err);
|
|
30
|
-
return makeFailure(errStr);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
export {
|
|
34
|
-
download
|
|
35
|
-
};
|
|
@@ -1,37 +1,39 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
+
}
|
|
11
39
|
}
|
|
12
|
-
|
|
13
|
-
// src/agnostic/misc/outcome/index.ts
|
|
14
|
-
function makeSuccess(payload) {
|
|
15
|
-
return { success: true, payload };
|
|
16
|
-
}
|
|
17
|
-
function makeFailure(error) {
|
|
18
|
-
return { success: false, error };
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
// src/node/ftps/file/exists/index.ts
|
|
22
|
-
async function exists(ftpClient, sourcePath) {
|
|
23
|
-
try {
|
|
24
|
-
const lastSlash = sourcePath.lastIndexOf("/");
|
|
25
|
-
const parentDir = lastSlash === -1 ? "." : sourcePath.slice(0, lastSlash) || "/";
|
|
26
|
-
const baseName = lastSlash === -1 ? sourcePath : sourcePath.slice(lastSlash + 1);
|
|
27
|
-
const list = await ftpClient.list(parentDir);
|
|
28
|
-
const entry = list.find((e) => e.name === baseName);
|
|
29
|
-
const isFile = entry !== void 0 ? entry.type === FileType.File || entry.type === FileType.SymbolicLink : false;
|
|
30
|
-
return makeSuccess(isFile);
|
|
31
|
-
} catch (err) {
|
|
32
|
-
return makeFailure(unknownToString(err));
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
export {
|
|
36
|
-
exists
|
|
37
|
-
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export * as copy from './copy/index.js'
|
|
2
|
-
export * as exists from './exists/index.js'
|
|
3
2
|
export * as download from './download/index.js'
|
|
4
|
-
export * as move from './move/index.js'
|
|
5
3
|
export * as remove from './remove/index.js'
|
|
4
|
+
export * as move from './move/index.js'
|
|
5
|
+
export * as exists from './exists/index.js'
|
|
6
6
|
export * as stat from './stat/index.js'
|
|
7
7
|
export * as upload from './upload/index.js'
|
package/node/ftps/file/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export * as copy from './copy/index.js'
|
|
2
|
-
export * as exists from './exists/index.js'
|
|
3
2
|
export * as download from './download/index.js'
|
|
4
|
-
export * as move from './move/index.js'
|
|
5
3
|
export * as remove from './remove/index.js'
|
|
4
|
+
export * as move from './move/index.js'
|
|
5
|
+
export * as exists from './exists/index.js'
|
|
6
6
|
export * as stat from './stat/index.js'
|
|
7
7
|
export * as upload from './upload/index.js'
|