@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,160 +1,30 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import * as Outcome from '../../../../agnostic/misc/outcome/index.js';
|
|
2
|
+
import { isFtpClient, isGcsBucket, isS3ClientWithBucket, isSftpClient } from '../../clients/index.js';
|
|
3
|
+
import { removeDir as ftpRemoveDir } from '../../../ftps/directory/remove-dir/index.js';
|
|
4
|
+
import { removeDir as sftpRemoveDir } from '../../../sftp/directory/remove-dir/index.js';
|
|
5
|
+
import { removeDir as s3RemoveDir } from '../../../@aws-s3/storage/directory/remove-dir/index.js';
|
|
6
|
+
import { removeDir as gcsRemoveDir } from '../../../@google-cloud/storage/directory/remove-dir/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Removes a directory from cloud storage.
|
|
9
|
+
*
|
|
10
|
+
* The function automatically dispatches to the appropriate implementation based on
|
|
11
|
+
* the client type (Google Cloud Storage, S3, FTP, or SFTP).
|
|
12
|
+
*
|
|
13
|
+
* @param {AnyClient} client - The cloud storage client instance.
|
|
14
|
+
* @param {string} sourcePath - The directory path to remove.
|
|
15
|
+
* @param {GcsRemoveDirOptions | S3RemoveDirOptions | FtpsRemoveDirOptions | SftpRemoveDirOptions} [options] - Optional remove configuration.
|
|
16
|
+
* @returns {Promise<Outcome.Either<true, string>>}
|
|
17
|
+
* - On success: `Outcome.makeSuccess(true)`.
|
|
18
|
+
* - On failure: `Outcome.makeFailure(errStr)`.
|
|
19
|
+
*/
|
|
20
|
+
export async function removeDir(client, sourcePath, options) {
|
|
21
|
+
if (isGcsBucket(client))
|
|
22
|
+
return await gcsRemoveDir(client, sourcePath, options);
|
|
23
|
+
if (isS3ClientWithBucket(client))
|
|
24
|
+
return await s3RemoveDir(client.client, client.bucketName, sourcePath, options);
|
|
25
|
+
if (isFtpClient(client))
|
|
26
|
+
return await ftpRemoveDir(client, sourcePath, options);
|
|
27
|
+
if (isSftpClient(client))
|
|
28
|
+
return await sftpRemoveDir(client, sourcePath, options);
|
|
29
|
+
return Outcome.makeFailure('Invalid client type');
|
|
4
30
|
}
|
|
5
|
-
function makeFailure(error) {
|
|
6
|
-
return { success: false, error };
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
// src/node/cloud-storage/clients/index.ts
|
|
10
|
-
import { Bucket as GCSBucket } from "@google-cloud/storage";
|
|
11
|
-
import { S3Client } from "@aws-sdk/client-s3";
|
|
12
|
-
import { Client as FtpClient } from "basic-ftp";
|
|
13
|
-
import SftpClient from "ssh2-sftp-client";
|
|
14
|
-
var isGcsBucket = (client) => client instanceof GCSBucket;
|
|
15
|
-
var isS3ClientWithBucket = (client) => "bucketName" in client && typeof client.bucketName === "string" && "client" in client && client.client instanceof S3Client;
|
|
16
|
-
var isFtpClient = (client) => client instanceof FtpClient;
|
|
17
|
-
var isSftpClient = (client) => client instanceof SftpClient;
|
|
18
|
-
|
|
19
|
-
// src/agnostic/errors/unknown-to-string/index.ts
|
|
20
|
-
function unknownToString(unk, encoding) {
|
|
21
|
-
if (unk instanceof Error) return unk.message;
|
|
22
|
-
if (unk instanceof Buffer) return unk.toString(encoding ?? "utf-8");
|
|
23
|
-
if (typeof unk === "string") return unk;
|
|
24
|
-
if (typeof unk === "object" && unk !== null) return JSON.stringify(unk);
|
|
25
|
-
return `${unk}`;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
// src/node/ftps/directory/remove-dir/index.ts
|
|
29
|
-
async function removeDir(ftpClient, directoryPath, options) {
|
|
30
|
-
const { ignoreMissing = true } = options ?? {};
|
|
31
|
-
async function recurse(dir) {
|
|
32
|
-
const list = await ftpClient.list(dir);
|
|
33
|
-
for (const entry of list) {
|
|
34
|
-
const full = dir.endsWith("/") ? dir + entry.name : `${dir}/${entry.name}`;
|
|
35
|
-
if (entry.isDirectory) {
|
|
36
|
-
await recurse(full);
|
|
37
|
-
} else if (entry.isFile) {
|
|
38
|
-
await ftpClient.remove(full);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
await ftpClient.removeDir(dir);
|
|
42
|
-
}
|
|
43
|
-
try {
|
|
44
|
-
await recurse(directoryPath);
|
|
45
|
-
return makeSuccess(true);
|
|
46
|
-
} catch (err) {
|
|
47
|
-
if (ignoreMissing && err.code === 550) {
|
|
48
|
-
return makeSuccess(true);
|
|
49
|
-
}
|
|
50
|
-
return makeFailure(unknownToString(err));
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
// src/node/sftp/directory/remove-dir/index.ts
|
|
55
|
-
async function removeDir2(sftp, directoryPath, options) {
|
|
56
|
-
const { ignoreMissing = true } = options ?? {};
|
|
57
|
-
async function recurse(dir) {
|
|
58
|
-
const list = await sftp.list(dir);
|
|
59
|
-
for (const entry of list) {
|
|
60
|
-
const full = dir.endsWith("/") ? dir + entry.name : `${dir}/${entry.name}`;
|
|
61
|
-
if (entry.type === "d") {
|
|
62
|
-
await recurse(full);
|
|
63
|
-
} else if (entry.type === "-") {
|
|
64
|
-
await sftp.delete(full);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
await sftp.rmdir(dir);
|
|
68
|
-
}
|
|
69
|
-
try {
|
|
70
|
-
await recurse(directoryPath);
|
|
71
|
-
return makeSuccess(true);
|
|
72
|
-
} catch (err) {
|
|
73
|
-
if (ignoreMissing && (err.code === 2 || err.code === "ENOENT")) {
|
|
74
|
-
return makeSuccess(true);
|
|
75
|
-
}
|
|
76
|
-
return makeFailure(unknownToString(err));
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// src/node/@aws-s3/storage/directory/remove-dir/index.ts
|
|
81
|
-
import {
|
|
82
|
-
ListObjectsV2Command,
|
|
83
|
-
DeleteObjectsCommand
|
|
84
|
-
} from "@aws-sdk/client-s3";
|
|
85
|
-
async function removeDir3(client, bucketName, directoryPath, options) {
|
|
86
|
-
const {
|
|
87
|
-
listObjectsOptions,
|
|
88
|
-
deleteObjectsOptions,
|
|
89
|
-
ignoreMissing = true
|
|
90
|
-
} = options ?? {};
|
|
91
|
-
const prefix = directoryPath.endsWith("/") ? directoryPath : `${directoryPath}/`;
|
|
92
|
-
let continuationToken;
|
|
93
|
-
let anyFound = false;
|
|
94
|
-
try {
|
|
95
|
-
do {
|
|
96
|
-
const listResp = await client.send(
|
|
97
|
-
new ListObjectsV2Command({
|
|
98
|
-
Bucket: bucketName,
|
|
99
|
-
Prefix: prefix,
|
|
100
|
-
ContinuationToken: continuationToken,
|
|
101
|
-
...listObjectsOptions
|
|
102
|
-
})
|
|
103
|
-
);
|
|
104
|
-
const keys = (listResp.Contents ?? []).map((o) => o.Key).filter((e) => e !== void 0);
|
|
105
|
-
if (keys.length > 0) {
|
|
106
|
-
anyFound = true;
|
|
107
|
-
for (let i = 0; i < keys.length; i += 1e3) {
|
|
108
|
-
const chunk = keys.slice(i, i + 1e3);
|
|
109
|
-
await client.send(
|
|
110
|
-
new DeleteObjectsCommand({
|
|
111
|
-
Bucket: bucketName,
|
|
112
|
-
Delete: { Objects: chunk.map((Key) => ({ Key })) },
|
|
113
|
-
...deleteObjectsOptions
|
|
114
|
-
})
|
|
115
|
-
);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
continuationToken = listResp.IsTruncated === true ? listResp.NextContinuationToken : void 0;
|
|
119
|
-
} while (continuationToken !== void 0);
|
|
120
|
-
if (!anyFound && !ignoreMissing) {
|
|
121
|
-
return makeFailure(`No objects found for prefix "${prefix}".`);
|
|
122
|
-
}
|
|
123
|
-
return makeSuccess(true);
|
|
124
|
-
} catch (err) {
|
|
125
|
-
return makeFailure(unknownToString(err));
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
// src/node/@google-cloud/storage/directory/remove-dir/index.ts
|
|
130
|
-
async function removeDir4(bucket, directoryPath, options) {
|
|
131
|
-
const {
|
|
132
|
-
deleteOptions,
|
|
133
|
-
ignoreMissing = true
|
|
134
|
-
} = options ?? {};
|
|
135
|
-
const prefix = directoryPath.endsWith("/") ? directoryPath : `${directoryPath}/`;
|
|
136
|
-
try {
|
|
137
|
-
if (!ignoreMissing) {
|
|
138
|
-
const [some] = await bucket.getFiles({ prefix, maxResults: 1 });
|
|
139
|
-
if (some.length === 0) {
|
|
140
|
-
return makeFailure(`No objects found for prefix "${prefix}".`);
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
await bucket.deleteFiles({ prefix, ...deleteOptions });
|
|
144
|
-
return makeSuccess(true);
|
|
145
|
-
} catch (err) {
|
|
146
|
-
return makeFailure(unknownToString(err));
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
// src/node/cloud-storage/operations/remove-dir/index.ts
|
|
151
|
-
async function removeDir5(client, sourcePath, options) {
|
|
152
|
-
if (isGcsBucket(client)) return await removeDir4(client, sourcePath, options);
|
|
153
|
-
if (isS3ClientWithBucket(client)) return await removeDir3(client.client, client.bucketName, sourcePath, options);
|
|
154
|
-
if (isFtpClient(client)) return await removeDir(client, sourcePath, options);
|
|
155
|
-
if (isSftpClient(client)) return await removeDir2(client, sourcePath, options);
|
|
156
|
-
return makeFailure("Invalid client type");
|
|
157
|
-
}
|
|
158
|
-
export {
|
|
159
|
-
removeDir5 as removeDir
|
|
160
|
-
};
|
|
@@ -1,122 +1,30 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import * as Outcome from '../../../../agnostic/misc/outcome/index.js';
|
|
2
|
+
import { isFtpClient, isGcsBucket, isS3ClientWithBucket, isSftpClient } from '../../clients/index.js';
|
|
3
|
+
import { remove as ftpRemove } from '../../../ftps/file/remove/index.js';
|
|
4
|
+
import { remove as sftpRemove } from '../../../sftp/file/remove/index.js';
|
|
5
|
+
import { remove as s3Remove } from '../../../@aws-s3/storage/file/remove/index.js';
|
|
6
|
+
import { remove as gcsRemove } from '../../../@google-cloud/storage/file/remove/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Removes a file from cloud storage.
|
|
9
|
+
*
|
|
10
|
+
* The function automatically dispatches to the appropriate implementation based on
|
|
11
|
+
* the client type (Google Cloud Storage, S3, FTP, or SFTP).
|
|
12
|
+
*
|
|
13
|
+
* @param {AnyClient} client - The cloud storage client instance.
|
|
14
|
+
* @param {string} path - The file path to remove.
|
|
15
|
+
* @param {GcsRemoveOptions | S3RemoveOptions | FtpRemoveOptions | SftpRemoveOptions} [options] - Optional remove configuration.
|
|
16
|
+
* @returns {Promise<Outcome.Either<true, string>>}
|
|
17
|
+
* - On success: `Outcome.makeSuccess(true)`.
|
|
18
|
+
* - On failure: `Outcome.makeFailure(errStr)`.
|
|
19
|
+
*/
|
|
20
|
+
export async function removeFile(client, path, options) {
|
|
21
|
+
if (isGcsBucket(client))
|
|
22
|
+
return await gcsRemove(client, path, options);
|
|
23
|
+
if (isS3ClientWithBucket(client))
|
|
24
|
+
return await s3Remove(client.client, path, client.bucketName, options);
|
|
25
|
+
if (isFtpClient(client))
|
|
26
|
+
return await ftpRemove(client, path, options);
|
|
27
|
+
if (isSftpClient(client))
|
|
28
|
+
return await sftpRemove(client, path, options);
|
|
29
|
+
return Outcome.makeFailure('Invalid client type');
|
|
4
30
|
}
|
|
5
|
-
function makeFailure(error) {
|
|
6
|
-
return { success: false, error };
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
// src/node/cloud-storage/clients/index.ts
|
|
10
|
-
import { Bucket as GCSBucket } from "@google-cloud/storage";
|
|
11
|
-
import { S3Client } from "@aws-sdk/client-s3";
|
|
12
|
-
import { Client as FtpClient } from "basic-ftp";
|
|
13
|
-
import SftpClient from "ssh2-sftp-client";
|
|
14
|
-
var isGcsBucket = (client) => client instanceof GCSBucket;
|
|
15
|
-
var isS3ClientWithBucket = (client) => "bucketName" in client && typeof client.bucketName === "string" && "client" in client && client.client instanceof S3Client;
|
|
16
|
-
var isFtpClient = (client) => client instanceof FtpClient;
|
|
17
|
-
var isSftpClient = (client) => client instanceof SftpClient;
|
|
18
|
-
|
|
19
|
-
// src/agnostic/errors/unknown-to-string/index.ts
|
|
20
|
-
function unknownToString(unk, encoding) {
|
|
21
|
-
if (unk instanceof Error) return unk.message;
|
|
22
|
-
if (unk instanceof Buffer) return unk.toString(encoding ?? "utf-8");
|
|
23
|
-
if (typeof unk === "string") return unk;
|
|
24
|
-
if (typeof unk === "object" && unk !== null) return JSON.stringify(unk);
|
|
25
|
-
return `${unk}`;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
// src/node/ftps/file/remove/index.ts
|
|
29
|
-
async function remove(ftpClient, targetPath, options) {
|
|
30
|
-
const { ignoreMissing = true } = options ?? {};
|
|
31
|
-
try {
|
|
32
|
-
let fileExists = true;
|
|
33
|
-
try {
|
|
34
|
-
await ftpClient.size(targetPath);
|
|
35
|
-
} catch {
|
|
36
|
-
fileExists = false;
|
|
37
|
-
}
|
|
38
|
-
if (!fileExists) {
|
|
39
|
-
if (ignoreMissing) {
|
|
40
|
-
return makeSuccess(true);
|
|
41
|
-
}
|
|
42
|
-
return makeFailure(`File not found at ${targetPath}.`);
|
|
43
|
-
}
|
|
44
|
-
await ftpClient.remove(targetPath);
|
|
45
|
-
return makeSuccess(true);
|
|
46
|
-
} catch (err) {
|
|
47
|
-
const errStr = unknownToString(err);
|
|
48
|
-
return makeFailure(errStr);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
// src/node/sftp/file/remove/index.ts
|
|
53
|
-
async function remove2(sftp, targetPath, options) {
|
|
54
|
-
const { ignoreMissing = true } = options ?? {};
|
|
55
|
-
try {
|
|
56
|
-
const exists = await sftp.exists(targetPath) !== false;
|
|
57
|
-
if (!exists) {
|
|
58
|
-
if (ignoreMissing) return makeSuccess(true);
|
|
59
|
-
return makeFailure(`File not found at ${targetPath}.`);
|
|
60
|
-
}
|
|
61
|
-
await sftp.delete(targetPath);
|
|
62
|
-
return makeSuccess(true);
|
|
63
|
-
} catch (err) {
|
|
64
|
-
const errStr = unknownToString(err);
|
|
65
|
-
return makeFailure(errStr);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// src/node/@aws-s3/storage/file/remove/index.ts
|
|
70
|
-
import {
|
|
71
|
-
HeadObjectCommand,
|
|
72
|
-
DeleteObjectCommand
|
|
73
|
-
} from "@aws-sdk/client-s3";
|
|
74
|
-
async function remove3(s3, bucketName, targetPath, options) {
|
|
75
|
-
const { ignoreMissing = true } = options ?? {};
|
|
76
|
-
try {
|
|
77
|
-
try {
|
|
78
|
-
await s3.send(new HeadObjectCommand({ Bucket: bucketName, Key: targetPath }));
|
|
79
|
-
} catch (err) {
|
|
80
|
-
const code = err?.name ?? err?.Code ?? err?.code;
|
|
81
|
-
if (code === "NotFound" || code === "NoSuchKey" || code === "NotFoundException") {
|
|
82
|
-
if (ignoreMissing) return makeSuccess(true);
|
|
83
|
-
return makeFailure(`File not found at ${targetPath}.`);
|
|
84
|
-
}
|
|
85
|
-
return makeFailure(unknownToString(err));
|
|
86
|
-
}
|
|
87
|
-
await s3.send(new DeleteObjectCommand({ Bucket: bucketName, Key: targetPath }));
|
|
88
|
-
return makeSuccess(true);
|
|
89
|
-
} catch (err) {
|
|
90
|
-
return makeFailure(unknownToString(err));
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
// src/node/@google-cloud/storage/file/remove/index.ts
|
|
95
|
-
async function remove4(bucket, targetPath, options) {
|
|
96
|
-
const { fileOptions, deleteOptions, ignoreMissing = true } = options ?? {};
|
|
97
|
-
try {
|
|
98
|
-
const file = bucket.file(targetPath, fileOptions);
|
|
99
|
-
const [exists] = await file.exists();
|
|
100
|
-
if (!exists) {
|
|
101
|
-
if (ignoreMissing) return makeSuccess(true);
|
|
102
|
-
return makeFailure(`File not found at ${targetPath}.`);
|
|
103
|
-
}
|
|
104
|
-
await file.delete(deleteOptions);
|
|
105
|
-
return makeSuccess(true);
|
|
106
|
-
} catch (err) {
|
|
107
|
-
const errStr = unknownToString(err);
|
|
108
|
-
return makeFailure(errStr);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
// src/node/cloud-storage/operations/remove-file/index.ts
|
|
113
|
-
async function removeFile(client, path, options) {
|
|
114
|
-
if (isGcsBucket(client)) return await remove4(client, path, options);
|
|
115
|
-
if (isS3ClientWithBucket(client)) return await remove3(client.client, path, client.bucketName, options);
|
|
116
|
-
if (isFtpClient(client)) return await remove(client, path, options);
|
|
117
|
-
if (isSftpClient(client)) return await remove2(client, path, options);
|
|
118
|
-
return makeFailure("Invalid client type");
|
|
119
|
-
}
|
|
120
|
-
export {
|
|
121
|
-
removeFile
|
|
122
|
-
};
|
|
@@ -1,125 +1,30 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import * as Outcome from '../../../../agnostic/misc/outcome/index.js';
|
|
2
|
+
import { isFtpClient, isGcsBucket, isS3ClientWithBucket, isSftpClient } from '../../clients/index.js';
|
|
3
|
+
import { stat as ftpStat } from '../../../ftps/file/stat/index.js';
|
|
4
|
+
import { stat as sftpStat } from '../../../sftp/file/stat/index.js';
|
|
5
|
+
import { stat as s3Stat } from '../../../@aws-s3/storage/file/stat/index.js';
|
|
6
|
+
import { stat as gcsStat } from '../../../@google-cloud/storage/file/stat/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Retrieves metadata for a file in cloud storage.
|
|
9
|
+
*
|
|
10
|
+
* The function automatically dispatches to the appropriate implementation based on
|
|
11
|
+
* the client type (Google Cloud Storage, S3, FTP, or SFTP).
|
|
12
|
+
*
|
|
13
|
+
* @param {AnyClient} client - The cloud storage client instance.
|
|
14
|
+
* @param {string} path - The file path to stat.
|
|
15
|
+
* @param {GcsStatOptions | S3StatOptions} [options] - Optional stat configuration.
|
|
16
|
+
* @returns {Promise<Outcome.Either<GcsStat | S3Stat | FtpStat | SftpStat, string>>}
|
|
17
|
+
* - On success: `Outcome.makeSuccess(stat)` containing file metadata.
|
|
18
|
+
* - On failure: `Outcome.makeFailure(errStr)`.
|
|
19
|
+
*/
|
|
20
|
+
export async function statFile(client, path, options) {
|
|
21
|
+
if (isGcsBucket(client))
|
|
22
|
+
return await gcsStat(client, path, options);
|
|
23
|
+
if (isS3ClientWithBucket(client))
|
|
24
|
+
return await s3Stat(client.client, path, client.bucketName, options);
|
|
25
|
+
if (isFtpClient(client))
|
|
26
|
+
return await ftpStat(client, path);
|
|
27
|
+
if (isSftpClient(client))
|
|
28
|
+
return await sftpStat(client, path);
|
|
29
|
+
return Outcome.makeFailure('Invalid client type');
|
|
4
30
|
}
|
|
5
|
-
function makeFailure(error) {
|
|
6
|
-
return { success: false, error };
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
// src/node/cloud-storage/clients/index.ts
|
|
10
|
-
import { Bucket as GCSBucket } from "@google-cloud/storage";
|
|
11
|
-
import { S3Client } from "@aws-sdk/client-s3";
|
|
12
|
-
import { Client as FtpClient } from "basic-ftp";
|
|
13
|
-
import SftpClient from "ssh2-sftp-client";
|
|
14
|
-
var isGcsBucket = (client) => client instanceof GCSBucket;
|
|
15
|
-
var isS3ClientWithBucket = (client) => "bucketName" in client && typeof client.bucketName === "string" && "client" in client && client.client instanceof S3Client;
|
|
16
|
-
var isFtpClient = (client) => client instanceof FtpClient;
|
|
17
|
-
var isSftpClient = (client) => client instanceof SftpClient;
|
|
18
|
-
|
|
19
|
-
// src/agnostic/errors/unknown-to-string/index.ts
|
|
20
|
-
function unknownToString(unk, encoding) {
|
|
21
|
-
if (unk instanceof Error) return unk.message;
|
|
22
|
-
if (unk instanceof Buffer) return unk.toString(encoding ?? "utf-8");
|
|
23
|
-
if (typeof unk === "string") return unk;
|
|
24
|
-
if (typeof unk === "object" && unk !== null) return JSON.stringify(unk);
|
|
25
|
-
return `${unk}`;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
// src/node/ftps/file/stat/index.ts
|
|
29
|
-
async function stat(ftp, path) {
|
|
30
|
-
try {
|
|
31
|
-
const slash = path.lastIndexOf("/");
|
|
32
|
-
const dir = slash === -1 ? "." : path.slice(0, slash) || "/";
|
|
33
|
-
const name = slash === -1 ? path : path.slice(slash + 1);
|
|
34
|
-
const list = await ftp.list(dir);
|
|
35
|
-
const entry = list.find((e) => e.name === name && e.isFile);
|
|
36
|
-
if (entry === void 0) return makeFailure(`File not found: ${path}`);
|
|
37
|
-
return makeSuccess({
|
|
38
|
-
size: entry.size,
|
|
39
|
-
modifiedAt: entry.modifiedAt ?? void 0,
|
|
40
|
-
permissions: entry.rawModifiedAt.toString(),
|
|
41
|
-
raw: entry
|
|
42
|
-
});
|
|
43
|
-
} catch (err) {
|
|
44
|
-
return makeFailure(unknownToString(err));
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
// src/node/sftp/file/stat/index.ts
|
|
49
|
-
async function stat2(sftp, path) {
|
|
50
|
-
try {
|
|
51
|
-
const info = await sftp.stat(path);
|
|
52
|
-
return makeSuccess({
|
|
53
|
-
size: info.size,
|
|
54
|
-
modifiedAt: new Date(info.modifyTime * 1e3),
|
|
55
|
-
mode: info.mode,
|
|
56
|
-
uid: info.uid,
|
|
57
|
-
gid: info.gid,
|
|
58
|
-
raw: info
|
|
59
|
-
});
|
|
60
|
-
} catch (err) {
|
|
61
|
-
if (err.code === 2 || err.code === "ENOENT") {
|
|
62
|
-
return makeFailure(`File not found: ${path}`);
|
|
63
|
-
}
|
|
64
|
-
return makeFailure(unknownToString(err));
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// src/node/@aws-s3/storage/file/stat/index.ts
|
|
69
|
-
import {
|
|
70
|
-
HeadObjectCommand
|
|
71
|
-
} from "@aws-sdk/client-s3";
|
|
72
|
-
async function stat3(client, bucket, key, options) {
|
|
73
|
-
const { headObjectOptions } = options ?? {};
|
|
74
|
-
try {
|
|
75
|
-
const res = await client.send(
|
|
76
|
-
new HeadObjectCommand({ Bucket: bucket, Key: key, ...headObjectOptions })
|
|
77
|
-
);
|
|
78
|
-
const stat5 = {
|
|
79
|
-
size: res.ContentLength,
|
|
80
|
-
modifiedAt: res.LastModified,
|
|
81
|
-
checksum: res.ETag?.replace(/"/g, ""),
|
|
82
|
-
contentType: res.ContentType,
|
|
83
|
-
metadata: res.Metadata,
|
|
84
|
-
storageClass: res.StorageClass,
|
|
85
|
-
raw: res
|
|
86
|
-
};
|
|
87
|
-
return makeSuccess(stat5);
|
|
88
|
-
} catch (err) {
|
|
89
|
-
const notFound = err.$metadata?.httpStatusCode === 404 || err.name === "NotFound";
|
|
90
|
-
if (notFound) return makeFailure(`Object not found: ${key}`);
|
|
91
|
-
return makeFailure(unknownToString(err));
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
// src/node/@google-cloud/storage/file/stat/index.ts
|
|
96
|
-
async function stat4(bucket, path, options) {
|
|
97
|
-
const { fileOptions, getMetadataOptions } = options ?? {};
|
|
98
|
-
try {
|
|
99
|
-
const [meta] = await bucket.file(path, fileOptions).getMetadata(getMetadataOptions);
|
|
100
|
-
const res = {
|
|
101
|
-
size: meta.size !== void 0 ? Number(meta.size) : void 0,
|
|
102
|
-
modifiedAt: meta.updated !== void 0 ? new Date(meta.updated) : void 0,
|
|
103
|
-
checksum: meta.md5Hash ?? meta.crc32c,
|
|
104
|
-
contentType: meta.contentType,
|
|
105
|
-
metadata: meta.metadata,
|
|
106
|
-
storageClass: meta.storageClass,
|
|
107
|
-
raw: meta
|
|
108
|
-
};
|
|
109
|
-
return makeSuccess(res);
|
|
110
|
-
} catch (err) {
|
|
111
|
-
return makeFailure(unknownToString(err));
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
// src/node/cloud-storage/operations/stat-file/index.ts
|
|
116
|
-
async function statFile(client, path, options) {
|
|
117
|
-
if (isGcsBucket(client)) return await stat4(client, path, options);
|
|
118
|
-
if (isS3ClientWithBucket(client)) return await stat3(client.client, path, client.bucketName, options);
|
|
119
|
-
if (isFtpClient(client)) return await stat(client, path);
|
|
120
|
-
if (isSftpClient(client)) return await stat2(client, path);
|
|
121
|
-
return makeFailure("Invalid client type");
|
|
122
|
-
}
|
|
123
|
-
export {
|
|
124
|
-
statFile
|
|
125
|
-
};
|
|
@@ -1,163 +1,31 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import * as Outcome from '../../../../agnostic/misc/outcome/index.js';
|
|
2
|
+
import { isFtpClient, isGcsBucket, isS3ClientWithBucket, isSftpClient } from '../../clients/index.js';
|
|
3
|
+
import { upload as ftpUpload } from '../../../ftps/file/upload/index.js';
|
|
4
|
+
import { upload as sftpUpload } from '../../../sftp/file/upload/index.js';
|
|
5
|
+
import { upload as s3Upload } from '../../../@aws-s3/storage/file/upload/index.js';
|
|
6
|
+
import { upload as gcsUpload } from '../../../@google-cloud/storage/file/upload/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Uploads a file stream to cloud storage.
|
|
9
|
+
*
|
|
10
|
+
* The function automatically dispatches to the appropriate implementation based on
|
|
11
|
+
* the client type (Google Cloud Storage, S3, FTP, or SFTP).
|
|
12
|
+
*
|
|
13
|
+
* @param {Readable} fileStream - The file content as a stream.
|
|
14
|
+
* @param {string} path - The path to upload the file to.
|
|
15
|
+
* @param {AnyClient} client - The cloud storage client instance.
|
|
16
|
+
* @param {GcsUploadOptions | S3UploadOptions | FtpUploadOptions | SftpUploadOptions} [options] - Optional upload configuration.
|
|
17
|
+
* @returns {Promise<Outcome.Either<true, string>>}
|
|
18
|
+
* - On success: `Outcome.makeSuccess(true)`.
|
|
19
|
+
* - On failure: `Outcome.makeFailure(errStr)`.
|
|
20
|
+
*/
|
|
21
|
+
export async function uploadFile(fileStream, path, client, options) {
|
|
22
|
+
if (isGcsBucket(client))
|
|
23
|
+
return await gcsUpload(client, path, fileStream, options);
|
|
24
|
+
if (isS3ClientWithBucket(client))
|
|
25
|
+
return await s3Upload(client.client, client.bucketName, path, fileStream, options);
|
|
26
|
+
if (isFtpClient(client))
|
|
27
|
+
return await ftpUpload(client, path, fileStream, options);
|
|
28
|
+
if (isSftpClient(client))
|
|
29
|
+
return await sftpUpload(client, path, fileStream, options);
|
|
30
|
+
return Outcome.makeFailure('Invalid client type');
|
|
4
31
|
}
|
|
5
|
-
function makeFailure(error) {
|
|
6
|
-
return { success: false, error };
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
// src/node/cloud-storage/clients/index.ts
|
|
10
|
-
import { Bucket as GCSBucket } from "@google-cloud/storage";
|
|
11
|
-
import { S3Client } from "@aws-sdk/client-s3";
|
|
12
|
-
import { Client as FtpClient } from "basic-ftp";
|
|
13
|
-
import SftpClient from "ssh2-sftp-client";
|
|
14
|
-
var isGcsBucket = (client) => client instanceof GCSBucket;
|
|
15
|
-
var isS3ClientWithBucket = (client) => "bucketName" in client && typeof client.bucketName === "string" && "client" in client && client.client instanceof S3Client;
|
|
16
|
-
var isFtpClient = (client) => client instanceof FtpClient;
|
|
17
|
-
var isSftpClient = (client) => client instanceof SftpClient;
|
|
18
|
-
|
|
19
|
-
// src/agnostic/errors/unknown-to-string/index.ts
|
|
20
|
-
function unknownToString(unk, encoding) {
|
|
21
|
-
if (unk instanceof Error) return unk.message;
|
|
22
|
-
if (unk instanceof Buffer) return unk.toString(encoding ?? "utf-8");
|
|
23
|
-
if (typeof unk === "string") return unk;
|
|
24
|
-
if (typeof unk === "object" && unk !== null) return JSON.stringify(unk);
|
|
25
|
-
return `${unk}`;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
// src/node/ftps/file/upload/index.ts
|
|
29
|
-
async function upload(ftpClient, targetPath, fileStream, options) {
|
|
30
|
-
const {
|
|
31
|
-
ensureDir = true,
|
|
32
|
-
overwrite = false
|
|
33
|
-
} = options ?? {};
|
|
34
|
-
try {
|
|
35
|
-
if (ensureDir) {
|
|
36
|
-
const dirPath = targetPath.substring(0, targetPath.lastIndexOf("/"));
|
|
37
|
-
await ftpClient.ensureDir(dirPath);
|
|
38
|
-
}
|
|
39
|
-
let fileExists = false;
|
|
40
|
-
try {
|
|
41
|
-
await ftpClient.size(targetPath);
|
|
42
|
-
fileExists = true;
|
|
43
|
-
} catch {
|
|
44
|
-
fileExists = false;
|
|
45
|
-
}
|
|
46
|
-
if (fileExists && !overwrite) {
|
|
47
|
-
return makeFailure(`File already exists at ${targetPath}.`);
|
|
48
|
-
}
|
|
49
|
-
await ftpClient.uploadFrom(fileStream, targetPath, options);
|
|
50
|
-
return makeSuccess(true);
|
|
51
|
-
} catch (err) {
|
|
52
|
-
const errStr = unknownToString(err);
|
|
53
|
-
return makeFailure(errStr);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// src/node/sftp/file/upload/index.ts
|
|
58
|
-
async function upload2(sftp, targetPath, fileStream, options) {
|
|
59
|
-
const {
|
|
60
|
-
ensureDir = true,
|
|
61
|
-
overwrite = false
|
|
62
|
-
} = options ?? {};
|
|
63
|
-
try {
|
|
64
|
-
const exists = await sftp.exists(targetPath) !== false;
|
|
65
|
-
if (exists && !overwrite) return makeFailure(`File already exists at ${targetPath}.`);
|
|
66
|
-
if (ensureDir) {
|
|
67
|
-
const dirPath = targetPath.substring(0, targetPath.lastIndexOf("/"));
|
|
68
|
-
await sftp.mkdir(dirPath, true);
|
|
69
|
-
}
|
|
70
|
-
await sftp.put(fileStream, targetPath, options);
|
|
71
|
-
return makeSuccess(true);
|
|
72
|
-
} catch (err) {
|
|
73
|
-
const errStr = unknownToString(err);
|
|
74
|
-
return makeFailure(errStr);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
// src/node/@aws-s3/storage/file/upload/index.ts
|
|
79
|
-
import {
|
|
80
|
-
HeadObjectCommand
|
|
81
|
-
} from "@aws-sdk/client-s3";
|
|
82
|
-
import { Upload } from "@aws-sdk/lib-storage";
|
|
83
|
-
async function upload3(s3, bucketName, targetPath, fileStream, options) {
|
|
84
|
-
const {
|
|
85
|
-
uploadSettings,
|
|
86
|
-
fileMetadata,
|
|
87
|
-
overwrite = false
|
|
88
|
-
} = options ?? {};
|
|
89
|
-
if (!overwrite) {
|
|
90
|
-
try {
|
|
91
|
-
const headCommand = new HeadObjectCommand({
|
|
92
|
-
Bucket: bucketName,
|
|
93
|
-
Key: targetPath
|
|
94
|
-
});
|
|
95
|
-
await s3.send(headCommand);
|
|
96
|
-
return makeFailure(`File already exists at ${targetPath}.`);
|
|
97
|
-
} catch (err) {
|
|
98
|
-
const code = err?.name ?? err?.$metadata?.httpStatusCode;
|
|
99
|
-
if (code !== "NotFound" && code !== 404) {
|
|
100
|
-
return makeFailure(unknownToString(err));
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
const params = {
|
|
105
|
-
...fileMetadata,
|
|
106
|
-
Bucket: bucketName,
|
|
107
|
-
Key: targetPath,
|
|
108
|
-
Body: fileStream
|
|
109
|
-
};
|
|
110
|
-
try {
|
|
111
|
-
const upload5 = new Upload({
|
|
112
|
-
client: s3,
|
|
113
|
-
params,
|
|
114
|
-
...uploadSettings
|
|
115
|
-
});
|
|
116
|
-
await upload5.done();
|
|
117
|
-
return makeSuccess(true);
|
|
118
|
-
} catch (err) {
|
|
119
|
-
return makeFailure(unknownToString(err));
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
// src/node/@google-cloud/storage/file/upload/index.ts
|
|
124
|
-
async function upload4(bucket, targetPath, fileStream, options) {
|
|
125
|
-
const { fileOptions, saveOptions, overwrite = false } = options ?? {};
|
|
126
|
-
const file = bucket.file(targetPath, fileOptions);
|
|
127
|
-
if (!overwrite) {
|
|
128
|
-
try {
|
|
129
|
-
const [exists] = await file.exists();
|
|
130
|
-
if (exists) {
|
|
131
|
-
return makeFailure(`File already exists at ${targetPath}.`);
|
|
132
|
-
}
|
|
133
|
-
} catch (err) {
|
|
134
|
-
const errStr = unknownToString(err);
|
|
135
|
-
return makeFailure(errStr);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
try {
|
|
139
|
-
await new Promise((resolve, reject) => {
|
|
140
|
-
const writeStream = file.createWriteStream(saveOptions);
|
|
141
|
-
fileStream.pipe(writeStream);
|
|
142
|
-
fileStream.on("error", reject);
|
|
143
|
-
writeStream.on("finish", resolve);
|
|
144
|
-
writeStream.on("error", reject);
|
|
145
|
-
});
|
|
146
|
-
return makeSuccess(true);
|
|
147
|
-
} catch (err) {
|
|
148
|
-
const errStr = unknownToString(err);
|
|
149
|
-
return makeFailure(errStr);
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
// src/node/cloud-storage/operations/upload-file/index.ts
|
|
154
|
-
async function uploadFile(fileStream, path, client, options) {
|
|
155
|
-
if (isGcsBucket(client)) return await upload4(client, path, fileStream, options);
|
|
156
|
-
if (isS3ClientWithBucket(client)) return await upload3(client.client, client.bucketName, path, fileStream, options);
|
|
157
|
-
if (isFtpClient(client)) return await upload(client, path, fileStream, options);
|
|
158
|
-
if (isSftpClient(client)) return await upload2(client, path, fileStream, options);
|
|
159
|
-
return makeFailure("Invalid client type");
|
|
160
|
-
}
|
|
161
|
-
export {
|
|
162
|
-
uploadFile
|
|
163
|
-
};
|