@design-edito/tools 0.4.4 → 0.4.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/TODO.md +269 -0
- package/agnostic/arrays/dedupe/index.js +9 -9
- package/agnostic/arrays/dedupe/index.test.js +24 -0
- package/agnostic/arrays/find-duplicates/index.js +34 -24
- package/agnostic/arrays/find-duplicates/index.test.js +31 -0
- package/agnostic/arrays/index.d.ts +1 -1
- package/agnostic/arrays/index.js +1 -1
- 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.js +11 -8
- package/agnostic/arrays/make/index.test.js +10 -0
- package/agnostic/arrays/random-pick/index.js +40 -9
- package/agnostic/arrays/random-pick/index.test.js +23 -0
- package/agnostic/arrays/shuffle/index.js +15 -13
- package/agnostic/arrays/shuffle/index.test.js +14 -0
- package/agnostic/booleans/is-falsy/index.js +26 -12
- package/agnostic/booleans/is-falsy/index.test.js +26 -0
- package/agnostic/colors/channels/index.js +145 -19
- package/agnostic/colors/channels/index.test.js +64 -0
- package/agnostic/colors/contrast/index.js +23 -30
- package/agnostic/colors/contrast/index.test.js +21 -0
- package/agnostic/colors/convert/index.js +839 -46
- package/agnostic/colors/convert/index.test.js +98 -0
- package/agnostic/colors/cssColorsMap.js +153 -0
- package/agnostic/colors/distance/index.js +65 -53
- package/agnostic/colors/distance/index.test.js +21 -0
- package/agnostic/colors/grayscale/index.js +96 -137
- package/agnostic/colors/grayscale/index.test.js +34 -0
- package/agnostic/colors/invert/index.js +33 -44
- package/agnostic/colors/invert/index.test.js +31 -0
- package/agnostic/colors/lerp/index.js +74 -88
- package/agnostic/colors/lerp/index.test.js +55 -0
- package/agnostic/colors/luminance/index.js +19 -13
- package/agnostic/colors/luminance/index.test.js +30 -0
- package/agnostic/colors/palette/index.js +80 -87
- package/agnostic/colors/palette/index.test.js +35 -0
- package/agnostic/colors/rotate/index.js +41 -14
- package/agnostic/colors/rotate/index.test.js +45 -0
- package/agnostic/colors/tidy/index.js +80 -12
- package/agnostic/colors/tidy/index.test.js +45 -0
- package/agnostic/colors/typechecks/index.js +196 -25
- package/agnostic/colors/typechecks/index.test.js +113 -0
- package/agnostic/colors/types.js +1 -0
- package/agnostic/css/bem/index.js +135 -160
- package/agnostic/css/clss/index.js +66 -7
- package/agnostic/css/clss/index.test.js +60 -0
- package/agnostic/css/generate-nice-color/index.js +26 -73
- package/agnostic/css/generate-nice-color/index.test.js +8 -0
- package/agnostic/css/index.d.ts +1 -1
- package/agnostic/css/index.js +1 -1
- package/agnostic/css/is-valid-css-class-name/index.js +15 -9
- package/agnostic/css/is-valid-css-class-name/index.test.js +36 -0
- package/agnostic/css/scale/index.js +37 -37
- package/agnostic/css/scale/index.test.js +71 -0
- package/agnostic/css/styles-set/index.js +151 -169
- package/agnostic/errors/register/index.js +45 -51
- package/agnostic/errors/unknown-to-string/index.js +18 -7
- package/agnostic/errors/unknown-to-string/index.test.js +35 -0
- package/agnostic/html/get-node-ancestors/index.js +31 -8
- package/agnostic/html/get-node-ancestors/index.test.js +58 -0
- package/agnostic/html/get-position-inside-parent/index.js +13 -10
- package/agnostic/html/get-position-inside-parent/index.test.js +56 -0
- package/agnostic/html/hyper-json/cast/index.js +137 -24
- package/agnostic/html/hyper-json/index.js +23 -50
- package/agnostic/html/hyper-json/method/index.js +10 -7
- package/agnostic/html/hyper-json/serialize/index.js +91 -11
- package/agnostic/html/hyper-json/smart-tags/coalesced/add/index.js +16 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/addclass/index.js +30 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/and/index.js +15 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/append/index.js +36 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/at/index.js +47 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/call/index.js +50 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/clone/index.js +11 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/deleteproperties/index.js +49 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/equals/index.js +24 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/getattribute/index.js +28 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/getproperties/index.js +21 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/getproperty/index.js +73 -26
- package/agnostic/html/hyper-json/smart-tags/coalesced/hjparse/index.js +24 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/hjstringify/index.js +93 -28
- package/agnostic/html/hyper-json/smart-tags/coalesced/if/index.js +22 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/index.d.ts +14 -14
- package/agnostic/html/hyper-json/smart-tags/coalesced/index.js +14 -14
- package/agnostic/html/hyper-json/smart-tags/coalesced/initialize/index.js +39 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/join/index.js +18 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/length/index.js +23 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/map/index.js +33 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/negate/index.js +11 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/notrailing/index.js +35 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/or/index.js +15 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/pickrandom/index.js +19 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/populate/index.js +61 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/print/index.js +25 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/push/index.js +11 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/pusheach/index.js +28 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/recordtoarray/index.js +11 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/removeattribute/index.js +58 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/removeclass/index.js +30 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/renameproperty/index.js +34 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/replace/index.js +56 -26
- package/agnostic/html/hyper-json/smart-tags/coalesced/select/index.js +34 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/set/index.js +31 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/setattribute/index.js +58 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/setproperty/index.js +237 -26
- package/agnostic/html/hyper-json/smart-tags/coalesced/sorton/index.js +93 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/split/index.js +22 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/spread/index.js +24 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/toarray/index.js +12 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/toboolean/index.js +12 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/toelement/index.js +19 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/toggleclass/index.js +30 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/tonodelist/index.js +12 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/tonull/index.js +11 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/tonumber/index.js +12 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/torecord/index.js +12 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/toref/index.js +12 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/tostring/index.js +12 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/totext/index.js +12 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/transformselected/index.js +86 -24
- package/agnostic/html/hyper-json/smart-tags/coalesced/trim/index.js +16 -24
- package/agnostic/html/hyper-json/smart-tags/index.js +31 -10
- package/agnostic/html/hyper-json/smart-tags/isolated/any/index.js +14 -11
- package/agnostic/html/hyper-json/smart-tags/isolated/array/index.js +14 -11
- package/agnostic/html/hyper-json/smart-tags/isolated/boolean/index.js +13 -24
- package/agnostic/html/hyper-json/smart-tags/isolated/element/index.js +26 -24
- package/agnostic/html/hyper-json/smart-tags/isolated/get/index.js +20 -24
- package/agnostic/html/hyper-json/smart-tags/isolated/guess/index.js +59 -24
- package/agnostic/html/hyper-json/smart-tags/isolated/index.d.ts +1 -1
- package/agnostic/html/hyper-json/smart-tags/isolated/index.js +1 -1
- package/agnostic/html/hyper-json/smart-tags/isolated/nodelist/index.js +20 -24
- package/agnostic/html/hyper-json/smart-tags/isolated/null/index.js +10 -11
- package/agnostic/html/hyper-json/smart-tags/isolated/number/index.js +18 -24
- package/agnostic/html/hyper-json/smart-tags/isolated/record/index.js +14 -24
- package/agnostic/html/hyper-json/smart-tags/isolated/ref/index.js +45 -25
- package/agnostic/html/hyper-json/smart-tags/isolated/string/index.js +18 -24
- package/agnostic/html/hyper-json/smart-tags/isolated/text/index.js +20 -24
- package/agnostic/html/hyper-json/transformer/index.js +113 -9
- package/agnostic/html/hyper-json/tree/index.js +423 -24
- package/agnostic/html/hyper-json/types/index.js +28 -7
- package/agnostic/html/hyper-json/utils/index.js +516 -24
- package/agnostic/html/index.d.ts +2 -2
- package/agnostic/html/index.js +2 -2
- package/agnostic/html/insert-node/index.js +28 -7
- package/agnostic/html/insert-node/index.test.js +73 -0
- package/agnostic/html/placeholders/index.js +26 -31
- package/agnostic/html/replace-in-element/index.js +31 -25
- package/agnostic/html/replace-in-element/index.test.js +80 -0
- package/agnostic/html/selector-to-element/index.js +53 -33
- package/agnostic/html/selector-to-element/index.test.js +69 -0
- package/agnostic/html/string-to-nodes/index.js +24 -19
- package/agnostic/html/string-to-nodes/index.test.js +54 -0
- package/agnostic/index.d.ts +1 -1
- package/agnostic/index.js +1 -1
- package/agnostic/misc/assert/index.js +60 -58
- package/agnostic/misc/cast/index.js +132 -23
- package/agnostic/misc/cast/index.test.js +134 -0
- package/agnostic/misc/connection/index.js +55 -30
- package/agnostic/misc/connection/index.test.js +143 -0
- package/agnostic/misc/crawler/index.js +68 -44
- package/agnostic/misc/crawler/index.test.js +56 -0
- package/agnostic/misc/crossenv/detect-runtime/index.js +41 -16
- package/agnostic/misc/crossenv/detect-runtime/index.test.js +24 -0
- package/agnostic/misc/crossenv/types.js +21 -7
- package/agnostic/misc/crossenv/window/index.js +49 -13
- package/agnostic/misc/crossenv/window/index.test.js +24 -0
- package/agnostic/misc/data-size/index.js +182 -296
- 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 +1 -1
- package/agnostic/misc/index.js +1 -1
- package/agnostic/misc/is-constructor-function/index.js +13 -7
- package/agnostic/misc/is-constructor-function/index.test.js +36 -0
- package/agnostic/misc/is-nullish/index.js +26 -11
- package/agnostic/misc/is-nullish/index.test.js +44 -0
- package/agnostic/misc/logs/logger/index.js +115 -142
- package/agnostic/misc/logs/make-text-block/index.js +14 -7
- package/agnostic/misc/logs/styles/index.js +30 -7
- package/agnostic/misc/lorem-ipsum/index.js +51 -186
- package/agnostic/misc/lorem-ipsum/index.test.js +49 -0
- package/agnostic/misc/normalize-extension/index.js +99 -90
- package/agnostic/misc/normalize-extension/index.test.js +40 -0
- package/agnostic/misc/outcome/index.js +21 -11
- package/agnostic/misc/outcome/index.test.js +40 -0
- package/agnostic/numbers/absolute-modulo/index.js +10 -7
- package/agnostic/numbers/absolute-modulo/index.test.js +23 -0
- package/agnostic/numbers/approximate-rational/index.js +86 -71
- package/agnostic/numbers/approximate-rational/index.test.js +90 -0
- package/agnostic/numbers/clamp/index.js +13 -7
- package/agnostic/numbers/clamp/index.test.js +24 -0
- package/agnostic/numbers/geometric-progressions/index.js +26 -7
- package/agnostic/numbers/geometric-progressions/index.test.js +45 -0
- package/agnostic/numbers/index.d.ts +1 -1
- package/agnostic/numbers/index.js +1 -1
- package/agnostic/numbers/interpolate/index.js +25 -12
- package/agnostic/numbers/interpolate/index.test.js +40 -0
- package/agnostic/numbers/round/index.js +33 -11
- package/agnostic/numbers/round/index.test.js +56 -0
- package/agnostic/objects/deep-get-property/index.js +30 -26
- package/agnostic/objects/deep-get-property/index.test.js +59 -0
- package/agnostic/objects/enums/is-in-enum/index.js +18 -7
- package/agnostic/objects/enums/is-in-enum/index.test.js +100 -0
- package/agnostic/objects/flatten-getters/index.js +15 -16
- package/agnostic/objects/flatten-getters/index.test.js +78 -0
- package/agnostic/objects/index.d.ts +3 -3
- package/agnostic/objects/index.js +3 -3
- package/agnostic/objects/is-object/index.js +18 -9
- package/agnostic/objects/is-object/index.test.js +60 -0
- package/agnostic/objects/is-record/index.js +13 -7
- package/agnostic/objects/is-record/index.test.js +48 -0
- package/agnostic/objects/record-format/index.js +18 -14
- package/agnostic/objects/record-format/index.test.js +92 -0
- package/agnostic/objects/record-map/index.js +18 -7
- package/agnostic/objects/record-map/index.test.js +56 -0
- package/agnostic/objects/sort-keys/index.js +15 -13
- package/agnostic/objects/sort-keys/index.test.js +37 -0
- package/agnostic/objects/validation/index.js +21 -10
- package/agnostic/objects/validation/index.test.js +72 -0
- package/agnostic/optim/index.d.ts +1 -1
- package/agnostic/optim/index.js +1 -1
- package/agnostic/optim/memoize/index.js +24 -18
- package/agnostic/optim/memoize/index.test.js +30 -0
- package/agnostic/optim/throttle-debounce/index.js +120 -104
- 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 +9 -9
- 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 +19 -9
- package/agnostic/random/random/index.test.js +73 -0
- package/agnostic/random/uuid/index.js +31 -12
- package/agnostic/random/uuid/index.test.js +45 -0
- package/agnostic/regexps/index.js +126 -86
- package/agnostic/regexps/index.test.js +108 -0
- package/agnostic/sanitization/file-name/index.js +25 -7
- package/agnostic/sanitization/file-name/index.test.js +23 -0
- package/agnostic/sanitization/html/index.js +172 -116
- package/agnostic/sanitization/path/index.js +23 -13
- package/agnostic/sanitization/path/index.test.js +18 -0
- package/agnostic/sanitization/types.js +1 -0
- package/agnostic/sanitization/user-input/index.js +36 -26
- package/agnostic/sanitization/user-input/index.test.js +31 -0
- package/agnostic/strings/char-codes/index.js +123 -57
- package/agnostic/strings/matches/index.js +38 -11
- package/agnostic/strings/normalize-indent/index.js +34 -18
- package/agnostic/strings/parse-table/index.js +153 -84
- package/agnostic/strings/replace-all/index.js +36 -17
- package/agnostic/strings/to-alphanum/index.js +23 -10
- package/agnostic/strings/trim/index.js +24 -9
- package/agnostic/time/dates/format-date/index.js +140 -74
- package/agnostic/time/duration/index.js +106 -142
- package/agnostic/time/timeout/index.js +24 -18
- package/agnostic/time/transitions/index.js +200 -156
- package/agnostic/time/wait/index.js +11 -7
- package/agnostic/typescript/types.js +1 -0
- package/components/BeforeAfter/index.controlled.js +95 -0
- package/components/BeforeAfter/index.js +54 -152
- package/components/BeforeAfter/utils.js +9 -0
- package/components/Disclaimer/index.js +50 -9
- package/components/Drawer/index.js +82 -88
- package/components/EventListener/index.js +29 -47
- package/components/Gallery/index.js +146 -190
- package/components/Gallery/utils.js +12 -0
- package/components/Image/index.js +67 -106
- package/components/IntersectionObserver/index.js +62 -9
- package/components/Overlayer/index.js +59 -66
- package/components/Paginator/index.js +125 -9
- package/components/ResizeObserver/index.js +68 -9
- package/components/ResizeObserver/style.module.css +0 -0
- package/components/Scrllgngn/index.js +176 -183
- package/components/ScrollListener/index.js +97 -171
- package/components/ScrollListener/utils.js +51 -0
- package/components/Sequencer/index.controlled.js +67 -0
- package/components/Sequencer/index.js +105 -160
- package/components/ShadowRoot/index.js +42 -63
- package/components/Subtitles/index.js +107 -13
- package/components/Subtitles/types.js +1 -0
- package/components/Subtitles/utils.js +102 -0
- package/components/Theatre/index.js +89 -9
- package/components/UIModule/index.js +156 -146
- package/components/Video/index.d.ts +10 -0
- package/components/Video/index.js +292 -503
- 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 +2 -2
- package/components/index.js +2 -2
- package/components/public-classnames.js +18 -0
- package/components/utils/index.js +12 -7
- package/components/utils/types.js +1 -0
- package/index.d.ts +1 -2
- package/index.js +1 -2
- package/node/@aws-s3/index.test.js +6 -0
- package/node/@aws-s3/storage/directory/copy-dir/index.js +68 -9
- 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 +33 -9
- package/node/@aws-s3/storage/directory/move-dir/index.js +69 -9
- package/node/@aws-s3/storage/directory/remove-dir/index.js +59 -9
- package/node/@aws-s3/storage/file/copy/index.js +43 -9
- package/node/@aws-s3/storage/file/download/index.js +30 -9
- package/node/@aws-s3/storage/file/exists/index.js +37 -9
- 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 +60 -9
- package/node/@aws-s3/storage/file/remove/index.js +38 -9
- package/node/@aws-s3/storage/file/stat/index.js +34 -9
- package/node/@aws-s3/storage/file/upload/index.js +55 -9
- package/node/@design-edito/index.js +1 -0
- package/node/@express/@multer/index.js +61 -45
- package/node/@google-cloud/storage/bucket/get-metadata/index.js +25 -21
- package/node/@google-cloud/storage/directory/copy-dir/index.js +38 -9
- package/node/@google-cloud/storage/directory/list/index.js +29 -9
- package/node/@google-cloud/storage/directory/move-dir/index.js +45 -9
- package/node/@google-cloud/storage/directory/remove-dir/index.js +36 -9
- package/node/@google-cloud/storage/file/copy/index.js +37 -9
- package/node/@google-cloud/storage/file/download/index.js +28 -9
- package/node/@google-cloud/storage/file/exists/index.js +26 -9
- package/node/@google-cloud/storage/file/generate-signed-url/index.js +33 -27
- package/node/@google-cloud/storage/file/get-metadata/index.js +28 -23
- package/node/@google-cloud/storage/file/get-permissions/index.js +25 -23
- package/node/@google-cloud/storage/file/index.d.ts +1 -1
- package/node/@google-cloud/storage/file/index.js +1 -1
- package/node/@google-cloud/storage/file/move/index.js +40 -9
- package/node/@google-cloud/storage/file/remove/index.js +36 -9
- package/node/@google-cloud/storage/file/revoke-signed-urls/index.js +32 -29
- package/node/@google-cloud/storage/file/stat/index.js +35 -9
- package/node/@google-cloud/storage/file/update-metadata/index.js +30 -23
- package/node/@google-cloud/storage/file/upload/index.js +47 -9
- package/node/cloud-storage/clients/index.js +35 -13
- package/node/cloud-storage/operations/copy-dir/index.js +30 -34
- package/node/cloud-storage/operations/copy-file/index.js +30 -34
- package/node/cloud-storage/operations/download-file/index.js +30 -34
- package/node/cloud-storage/operations/exists-file/index.js +30 -34
- package/node/cloud-storage/operations/list-dir/index.js +29 -34
- package/node/cloud-storage/operations/move-dir/index.js +30 -34
- package/node/cloud-storage/operations/move-file/index.js +30 -34
- package/node/cloud-storage/operations/remove-dir/index.js +29 -34
- package/node/cloud-storage/operations/remove-file/index.js +29 -34
- package/node/cloud-storage/operations/stat-file/index.js +29 -34
- package/node/cloud-storage/operations/upload-file/index.js +30 -34
- package/node/encryption/@aes-256-gcm/buffer/index.js +31 -26
- package/node/encryption/@aes-256-gcm/index.d.ts +1 -1
- package/node/encryption/@aes-256-gcm/index.js +1 -1
- package/node/encryption/@aes-256-gcm/uint8-array/index.js +57 -11
- package/node/encryption/key/index.js +19 -14
- package/node/files/is-in-directory/index.js +11 -10
- package/node/files/read-write/index.js +11 -17
- package/node/files/subpaths/index.js +156 -113
- package/node/ftps/directory/copy-dir/index.js +58 -9
- package/node/ftps/directory/index.d.ts +1 -1
- package/node/ftps/directory/index.js +1 -1
- package/node/ftps/directory/list/index.js +25 -9
- package/node/ftps/directory/move-dir/index.js +41 -9
- package/node/ftps/directory/remove-dir/index.js +42 -9
- package/node/ftps/file/copy/index.js +45 -9
- package/node/ftps/file/download/index.js +30 -9
- package/node/ftps/file/exists/index.js +39 -9
- package/node/ftps/file/index.d.ts +1 -1
- package/node/ftps/file/index.js +1 -1
- package/node/ftps/file/move/index.js +49 -9
- package/node/ftps/file/remove/index.js +40 -9
- package/node/ftps/file/stat/index.js +31 -9
- package/node/ftps/file/upload/index.js +44 -9
- package/node/images/create/index.js +10 -18
- package/node/images/format/index.js +264 -251
- package/node/images/index.d.ts +1 -1
- package/node/images/index.js +1 -1
- package/node/images/metadata/index.js +10 -18
- package/node/images/transform/index.js +168 -203
- package/node/images/transform/operations/blur/index.js +12 -10
- package/node/images/transform/operations/brighten/index.js +12 -10
- package/node/images/transform/operations/extend/index.js +26 -17
- package/node/images/transform/operations/extract/index.js +17 -10
- package/node/images/transform/operations/flatten/index.js +21 -17
- package/node/images/transform/operations/flip/index.js +3 -7
- package/node/images/transform/operations/flop/index.js +3 -7
- package/node/images/transform/operations/hue/index.js +14 -10
- package/node/images/transform/operations/index.d.ts +2 -2
- package/node/images/transform/operations/index.js +2 -2
- package/node/images/transform/operations/level/index.js +15 -10
- package/node/images/transform/operations/lighten/index.js +14 -10
- package/node/images/transform/operations/normalize/index.js +15 -10
- package/node/images/transform/operations/overlay/index.js +90 -17
- package/node/images/transform/operations/resize/index.js +47 -17
- package/node/images/transform/operations/rotate/index.js +21 -17
- package/node/images/transform/operations/saturate/index.js +16 -10
- package/node/images/types.js +34 -9
- package/node/images/utils/index.js +85 -19
- package/node/index.d.ts +3 -3
- package/node/index.js +3 -3
- package/node/process/on-exit/index.js +45 -28
- package/node/process/prompt-continue/index.js +29 -16
- package/node/process/spawner/index.js +104 -80
- package/node/sftp/directory/copy-dir/index.js +55 -9
- package/node/sftp/directory/list/index.js +23 -9
- package/node/sftp/directory/move-dir/index.js +38 -9
- package/node/sftp/directory/remove-dir/index.js +42 -9
- package/node/sftp/file/copy/index.js +40 -9
- package/node/sftp/file/download/index.js +27 -9
- package/node/sftp/file/exists/index.js +30 -9
- package/node/sftp/file/index.d.ts +2 -2
- package/node/sftp/file/index.js +2 -2
- package/node/sftp/file/move/index.js +42 -9
- package/node/sftp/file/remove/index.js +33 -9
- package/node/sftp/file/stat/index.js +28 -9
- package/node/sftp/file/upload/index.js +36 -9
- package/package.json +1 -8
- package/chunks/chunk-2FNCUXAX.js +0 -27
- package/chunks/chunk-2GJSPEO4.js +0 -31
- package/chunks/chunk-2IGP6V77.js +0 -22
- package/chunks/chunk-3QI2MSDK.js +0 -34
- package/chunks/chunk-3RNLPW7B.js +0 -101
- package/chunks/chunk-3RZMW72G.js +0 -33
- package/chunks/chunk-4KLCJX2T.js +0 -36
- package/chunks/chunk-4LTN4SCD.js +0 -55
- package/chunks/chunk-4Q4T7QQO.js +0 -27
- package/chunks/chunk-4Q5TKOIG.js +0 -53
- package/chunks/chunk-57YKZBJR.js +0 -29
- package/chunks/chunk-5H3IRSOB.js +0 -8
- package/chunks/chunk-5NTPCRFH.js +0 -32
- package/chunks/chunk-5TM235Z3.js +0 -40
- package/chunks/chunk-5WVGUZL5.js +0 -35
- package/chunks/chunk-6XL25OZX.js +0 -12
- package/chunks/chunk-75BICI4L.js +0 -20
- package/chunks/chunk-77SWZUHV.js +0 -31
- package/chunks/chunk-AC4UMIWM.js +0 -124
- package/chunks/chunk-AG4VERYN.js +0 -25
- package/chunks/chunk-AP3VYSVF.js +0 -36
- package/chunks/chunk-ASXK7XCC.js +0 -18
- package/chunks/chunk-AVIMGMTP.js +0 -17
- package/chunks/chunk-B4HGXMP3.js +0 -20
- package/chunks/chunk-B5V7D2ZL.js +0 -77
- package/chunks/chunk-B6653QJD.js +0 -37
- package/chunks/chunk-BCX4HPD7.js +0 -33
- package/chunks/chunk-CVMYA5XK.js +0 -632
- package/chunks/chunk-DMWGHBIL.js +0 -25
- package/chunks/chunk-DNIOWD7K.js +0 -8
- package/chunks/chunk-E2ZY3SEW.js +0 -26
- package/chunks/chunk-E6MSDKON.js +0 -13
- package/chunks/chunk-E7BBN5JC.js +0 -22
- package/chunks/chunk-EX2QKFY5.js +0 -41
- package/chunks/chunk-EYYNCLVR.js +0 -33
- package/chunks/chunk-F2YJXIT7.js +0 -78
- package/chunks/chunk-FSNNEPY5.js +0 -37
- package/chunks/chunk-GG4EFNMU.js +0 -89
- package/chunks/chunk-GQBFMP6N.js +0 -32
- package/chunks/chunk-H3HRQ52T.js +0 -32
- package/chunks/chunk-H4PP6AHP.js +0 -15
- package/chunks/chunk-HC6ZOHCS.js +0 -14
- package/chunks/chunk-HMMPT3UM.js +0 -47
- package/chunks/chunk-HQLRJ7XW.js +0 -12
- package/chunks/chunk-HYGUIF2O.js +0 -23
- package/chunks/chunk-HYPEWMYZ.js +0 -10
- package/chunks/chunk-I5MRXMHR.js +0 -32
- package/chunks/chunk-I6ZP5T5V.js +0 -10
- package/chunks/chunk-IEZ3O5OF.js +0 -40
- package/chunks/chunk-IPRWXI27.js +0 -31
- package/chunks/chunk-IRKZUMWZ.js +0 -38
- package/chunks/chunk-ISJONMNA.js +0 -16
- package/chunks/chunk-JB27MAKY.js +0 -22
- package/chunks/chunk-JZ6GM444.js +0 -43
- package/chunks/chunk-K5UF634H.js +0 -25
- package/chunks/chunk-LEBGVBYD.js +0 -138
- package/chunks/chunk-LJ5MGLLU.js +0 -56
- package/chunks/chunk-LUAYN7VJ.js +0 -27
- package/chunks/chunk-MDVGDZU6.js +0 -25
- package/chunks/chunk-ML22TIBW.js +0 -37
- package/chunks/chunk-MO4TRYNI.js +0 -29
- package/chunks/chunk-MSU7JU63.js +0 -49
- package/chunks/chunk-NIBRPZJD.js +0 -58
- package/chunks/chunk-O32IRXDX.js +0 -78
- package/chunks/chunk-OAX7GS7C.js +0 -36
- package/chunks/chunk-OBSTP7YR.js +0 -257
- package/chunks/chunk-OFCSIK6J.js +0 -13
- package/chunks/chunk-OFYGPRWE.js +0 -21
- package/chunks/chunk-OGBUSUE6.js +0 -12
- package/chunks/chunk-OSAXBA7G.js +0 -10
- package/chunks/chunk-OT7QXCH6.js +0 -23
- package/chunks/chunk-P4J6S2WQ.js +0 -64
- package/chunks/chunk-PUQUSA6S.js +0 -12
- package/chunks/chunk-PYJKFOMV.js +0 -193
- package/chunks/chunk-QHEWBOQI.js +0 -19
- package/chunks/chunk-QXAJXTXV.js +0 -19
- package/chunks/chunk-R3AWQXMY.js +0 -20
- package/chunks/chunk-R66GH2MQ.js +0 -38
- package/chunks/chunk-RART44AF.js +0 -21
- package/chunks/chunk-REXSJULD.js +0 -28
- package/chunks/chunk-RJRNYRPM.js +0 -23
- package/chunks/chunk-RKX6KLPQ.js +0 -47
- package/chunks/chunk-RW7VAKJW.js +0 -15
- package/chunks/chunk-RZOR7ZC3.js +0 -35
- package/chunks/chunk-S2UZ3HZR.js +0 -31
- package/chunks/chunk-SYH5LYQC.js +0 -28
- package/chunks/chunk-TAXFCVFE.js +0 -30
- package/chunks/chunk-TNZGRXKJ.js +0 -24
- package/chunks/chunk-TRFZSKNB.js +0 -32
- package/chunks/chunk-U664BT44.js +0 -45
- package/chunks/chunk-U6SGKHHA.js +0 -32
- package/chunks/chunk-UTQNGKGQ.js +0 -60
- package/chunks/chunk-VPBZS3S4.js +0 -27
- package/chunks/chunk-W5A2TON3.js +0 -10
- package/chunks/chunk-W7PJ5NQQ.js +0 -23
- package/chunks/chunk-WGRQXVBK.js +0 -207
- package/chunks/chunk-WIFHP4X7.js +0 -56
- package/chunks/chunk-WL4WNJ2Y.js +0 -39
- package/chunks/chunk-WNDMYNDU.js +0 -8
- package/chunks/chunk-WSFCRVEQ.js +0 -9
- package/chunks/chunk-WZS4Q3G3.js +0 -36
- package/chunks/chunk-X4YSGOKG.js +0 -2673
- package/chunks/chunk-XA4HVHJ4.js +0 -18
- package/chunks/chunk-XEQ2PBT2.js +0 -20
- package/chunks/chunk-XFB4PUXO.js +0 -78
- package/chunks/chunk-XIIJYVJZ.js +0 -15
- package/chunks/chunk-XNF5MLCQ.js +0 -14
- package/chunks/chunk-XQUMWHCH.js +0 -25
- package/chunks/chunk-YA2YCZUF.js +0 -8
- package/chunks/chunk-YDIBNEGA.js +0 -9
- package/chunks/chunk-YHMR7IBA.js +0 -24
- package/chunks/chunk-YWSXCFYY.js +0 -61
- package/chunks/chunk-YY3TSU22.js +0 -48
- package/chunks/chunk-ZAP3ELDE.js +0 -40
- package/chunks/chunk-ZJNQRKEJ.js +0 -105
- package/chunks/chunk-ZJR5ASR3.js +0 -26
- package/chunks/index.d.ts +0 -1
- package/chunks/index.js +0 -1
|
@@ -1,9 +1,37 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
} from
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
}
|
|
1
|
+
import { HeadObjectCommand } from '@aws-sdk/client-s3';
|
|
2
|
+
import * as Outcome from '../../../../../agnostic/misc/outcome/index.js';
|
|
3
|
+
import { unknownToString } from '../../../../../agnostic/errors/unknown-to-string/index.js';
|
|
4
|
+
/**
|
|
5
|
+
* Checks whether an object exists in a specified S3 bucket (AWS SDK v3).
|
|
6
|
+
*
|
|
7
|
+
* @param {S3Client} client - The v3 S3 client instance.
|
|
8
|
+
* @param {string} bucketName - The name of the S3 bucket.
|
|
9
|
+
* @param {string} sourcePath - The key of the object to test.
|
|
10
|
+
* @param {ExistsOptions} [options] - Optional configuration.
|
|
11
|
+
* @param {Omit<HeadObjectCommandInput,'Bucket'|'Key'>} [options.headObjectOptions] - Extra `HeadObject` params.
|
|
12
|
+
* @returns {Promise<Outcome.Either<boolean, string>>}
|
|
13
|
+
* - Success: `Outcome.makeSuccess(true)` if the object exists,
|
|
14
|
+
* `Outcome.makeSuccess(false)` if it does not.
|
|
15
|
+
* - Failure: `Outcome.makeFailure(errStr)` for unexpected errors.
|
|
16
|
+
*/
|
|
17
|
+
export async function exists(client, bucketName, sourcePath, options) {
|
|
18
|
+
const { headObjectOptions } = options ?? {};
|
|
19
|
+
try {
|
|
20
|
+
await client.send(new HeadObjectCommand({
|
|
21
|
+
Bucket: bucketName,
|
|
22
|
+
Key: sourcePath,
|
|
23
|
+
...headObjectOptions
|
|
24
|
+
}));
|
|
25
|
+
return Outcome.makeSuccess(true);
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
const notFound = err.$metadata?.httpStatusCode === 404
|
|
29
|
+
|| err.name === 'NotFound'
|
|
30
|
+
|| err.Code === 'NotFound' // some SDKs emit Code
|
|
31
|
+
|| err.Code === 'NoSuchKey';
|
|
32
|
+
if (notFound) {
|
|
33
|
+
return Outcome.makeSuccess(false);
|
|
34
|
+
}
|
|
35
|
+
return Outcome.makeFailure(unknownToString(err));
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export * as copy from './copy/index.js'
|
|
2
1
|
export * as download from './download/index.js'
|
|
3
2
|
export * as exists from './exists/index.js'
|
|
3
|
+
export * as copy from './copy/index.js'
|
|
4
4
|
export * as move from './move/index.js'
|
|
5
5
|
export * as remove from './remove/index.js'
|
|
6
6
|
export * as stat from './stat/index.js'
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export * as copy from './copy/index.js'
|
|
2
1
|
export * as download from './download/index.js'
|
|
3
2
|
export * as exists from './exists/index.js'
|
|
3
|
+
export * as copy from './copy/index.js'
|
|
4
4
|
export * as move from './move/index.js'
|
|
5
5
|
export * as remove from './remove/index.js'
|
|
6
6
|
export * as stat from './stat/index.js'
|
|
@@ -1,9 +1,60 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
} from
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
import { HeadObjectCommand, CopyObjectCommand, DeleteObjectCommand } from '@aws-sdk/client-s3';
|
|
2
|
+
import * as Outcome from '../../../../../agnostic/misc/outcome/index.js';
|
|
3
|
+
import { unknownToString } from '../../../../../agnostic/errors/unknown-to-string/index.js';
|
|
4
|
+
/**
|
|
5
|
+
* Moves an object from one key to another within the same S3 bucket (AWS SDK v3).
|
|
6
|
+
*
|
|
7
|
+
* The function copies the object from `sourcePath` to `targetPath` and, upon
|
|
8
|
+
* successful copy, deletes the original object.
|
|
9
|
+
*
|
|
10
|
+
* @param {S3Client} client - The S3 client instance.
|
|
11
|
+
* @param {string} bucketName - The name of the bucket.
|
|
12
|
+
* @param {string} sourcePath - The source object's key.
|
|
13
|
+
* @param {string} targetPath - The destination object's key.
|
|
14
|
+
* @param {MoveOptions} [options] - Optional copy/delete behaviour.
|
|
15
|
+
* @param {Omit<CopyObjectCommandInput,'Bucket'|'Key'|'CopySource'>} [options.copyOptions] - Extra copy params.
|
|
16
|
+
* @param {Omit<DeleteObjectCommandInput,'Bucket'|'Key'>} [options.deleteOptions] - Extra delete params.
|
|
17
|
+
* @param {boolean} [options.overwrite=false] - Whether to overwrite an existing `targetPath`.
|
|
18
|
+
* @returns {Promise<Outcome.Either<true, string>>}
|
|
19
|
+
* - Success: `Outcome.makeSuccess(true)`
|
|
20
|
+
* - Failure: `Outcome.makeFailure(errStr)`
|
|
21
|
+
*/
|
|
22
|
+
export async function move(client, bucketName, sourcePath, targetPath, options) {
|
|
23
|
+
const { copyOptions, deleteOptions, overwrite = false } = options ?? {};
|
|
24
|
+
try {
|
|
25
|
+
// Abort early if destination exists and overwrite is disabled
|
|
26
|
+
if (!overwrite) {
|
|
27
|
+
try {
|
|
28
|
+
await client.send(new HeadObjectCommand({ Bucket: bucketName, Key: targetPath }));
|
|
29
|
+
return Outcome.makeFailure(`Object already exists at ${targetPath}.`);
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
const notFound = err.$metadata?.httpStatusCode === 404
|
|
33
|
+
|| err.name === 'NotFound'
|
|
34
|
+
|| err.Code === 'NotFound'
|
|
35
|
+
|| err.Code === 'NoSuchKey';
|
|
36
|
+
if (!notFound) {
|
|
37
|
+
return Outcome.makeFailure(unknownToString(err));
|
|
38
|
+
}
|
|
39
|
+
// If not found, proceed with copy
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// Copy to the new key
|
|
43
|
+
await client.send(new CopyObjectCommand({
|
|
44
|
+
Bucket: bucketName,
|
|
45
|
+
Key: targetPath,
|
|
46
|
+
CopySource: `${bucketName}/${sourcePath}`,
|
|
47
|
+
...copyOptions
|
|
48
|
+
}));
|
|
49
|
+
// Delete the original key
|
|
50
|
+
await client.send(new DeleteObjectCommand({
|
|
51
|
+
Bucket: bucketName,
|
|
52
|
+
Key: sourcePath,
|
|
53
|
+
...deleteOptions
|
|
54
|
+
}));
|
|
55
|
+
return Outcome.makeSuccess(true);
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
return Outcome.makeFailure(unknownToString(err));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -1,9 +1,38 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
} from
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
}
|
|
1
|
+
import { HeadObjectCommand, DeleteObjectCommand } from '@aws-sdk/client-s3';
|
|
2
|
+
import * as Outcome from '../../../../../agnostic/misc/outcome/index.js';
|
|
3
|
+
import { unknownToString } from '../../../../../agnostic/errors/unknown-to-string/index.js';
|
|
4
|
+
/**
|
|
5
|
+
* Removes a file from a specified Amazon S3 bucket (AWS SDK v3).
|
|
6
|
+
*
|
|
7
|
+
* If `ignoreMissing` is true (default), a missing object is considered success.
|
|
8
|
+
*
|
|
9
|
+
* @param {S3Client} s3 - The AWS S3 client instance.
|
|
10
|
+
* @param {string} bucketName - The name of the bucket.
|
|
11
|
+
* @param {string} targetPath - The key of the object to delete.
|
|
12
|
+
* @param {RemoveOptions} [options] - Optional settings.
|
|
13
|
+
* @returns {Promise<Outcome.Either<true, string>>}
|
|
14
|
+
*/
|
|
15
|
+
export async function remove(s3, bucketName, targetPath, options) {
|
|
16
|
+
const { ignoreMissing = true } = options ?? {};
|
|
17
|
+
try {
|
|
18
|
+
// Check if object exists, respecting ignoreMissing
|
|
19
|
+
try {
|
|
20
|
+
await s3.send(new HeadObjectCommand({ Bucket: bucketName, Key: targetPath }));
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
const code = err?.name ?? err?.Code ?? err?.code;
|
|
24
|
+
if (code === 'NotFound' || code === 'NoSuchKey' || code === 'NotFoundException') {
|
|
25
|
+
if (ignoreMissing)
|
|
26
|
+
return Outcome.makeSuccess(true);
|
|
27
|
+
return Outcome.makeFailure(`File not found at ${targetPath}.`);
|
|
28
|
+
}
|
|
29
|
+
return Outcome.makeFailure(unknownToString(err));
|
|
30
|
+
}
|
|
31
|
+
// Delete the object
|
|
32
|
+
await s3.send(new DeleteObjectCommand({ Bucket: bucketName, Key: targetPath }));
|
|
33
|
+
return Outcome.makeSuccess(true);
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
return Outcome.makeFailure(unknownToString(err));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -1,9 +1,34 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
} from
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
}
|
|
1
|
+
import { HeadObjectCommand } from '@aws-sdk/client-s3';
|
|
2
|
+
import * as Outcome from '../../../../../agnostic/misc/outcome/index.js';
|
|
3
|
+
import { unknownToString } from '../../../../../agnostic/errors/unknown-to-string/index.js';
|
|
4
|
+
/**
|
|
5
|
+
* Retrieves metadata for a single S3 object.
|
|
6
|
+
*
|
|
7
|
+
* @param {S3Client} client – v3 S3 client.
|
|
8
|
+
* @param {string} bucket – Bucket name.
|
|
9
|
+
* @param {string} key – Object key.
|
|
10
|
+
* @param {StatOptions} [options] – Extra HeadObject params.
|
|
11
|
+
* @returns {Promise<Outcome.Either<Stat, string>>}
|
|
12
|
+
*/
|
|
13
|
+
export async function stat(client, bucket, key, options) {
|
|
14
|
+
const { headObjectOptions } = options ?? {};
|
|
15
|
+
try {
|
|
16
|
+
const res = await client.send(new HeadObjectCommand({ Bucket: bucket, Key: key, ...headObjectOptions }));
|
|
17
|
+
const stat = {
|
|
18
|
+
size: res.ContentLength,
|
|
19
|
+
modifiedAt: res.LastModified,
|
|
20
|
+
checksum: res.ETag?.replace(/"/g, ''),
|
|
21
|
+
contentType: res.ContentType,
|
|
22
|
+
metadata: res.Metadata,
|
|
23
|
+
storageClass: res.StorageClass,
|
|
24
|
+
raw: res
|
|
25
|
+
};
|
|
26
|
+
return Outcome.makeSuccess(stat);
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
const notFound = err.$metadata?.httpStatusCode === 404 || err.name === 'NotFound';
|
|
30
|
+
if (notFound)
|
|
31
|
+
return Outcome.makeFailure(`Object not found: ${key}`);
|
|
32
|
+
return Outcome.makeFailure(unknownToString(err));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -1,9 +1,55 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
import { HeadObjectCommand } from '@aws-sdk/client-s3';
|
|
2
|
+
import { Upload } from '@aws-sdk/lib-storage';
|
|
3
|
+
import * as Outcome from '../../../../../agnostic/misc/outcome/index.js';
|
|
4
|
+
import { unknownToString } from '../../../../../agnostic/errors/unknown-to-string/index.js';
|
|
5
|
+
/**
|
|
6
|
+
* Uploads a file stream to a specified Amazon S3 bucket using AWS SDK v3.
|
|
7
|
+
*
|
|
8
|
+
* If `overwrite` is false and the target file exists, upload is aborted.
|
|
9
|
+
*
|
|
10
|
+
* @param {S3Client} s3 - The AWS S3 v3 client instance.
|
|
11
|
+
* @param {string} bucketName - The S3 bucket name.
|
|
12
|
+
* @param {string} targetPath - The key to upload the file to.
|
|
13
|
+
* @param {Readable} fileStream - The file content as a stream.
|
|
14
|
+
* @param {UploadOptions} [options] - Optional configuration.
|
|
15
|
+
* @returns {Promise<Outcome.Either<true, string>>}
|
|
16
|
+
*/
|
|
17
|
+
export async function upload(s3, bucketName, targetPath, fileStream, options) {
|
|
18
|
+
const { uploadSettings, fileMetadata, overwrite = false } = options ?? {};
|
|
19
|
+
if (!overwrite) {
|
|
20
|
+
try {
|
|
21
|
+
const headCommand = new HeadObjectCommand({
|
|
22
|
+
Bucket: bucketName,
|
|
23
|
+
Key: targetPath
|
|
24
|
+
});
|
|
25
|
+
await s3.send(headCommand);
|
|
26
|
+
// If no error, object exists
|
|
27
|
+
return Outcome.makeFailure(`File already exists at ${targetPath}.`);
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
const code = err?.name ?? err?.$metadata?.httpStatusCode;
|
|
31
|
+
if (code !== 'NotFound' && code !== 404) {
|
|
32
|
+
return Outcome.makeFailure(unknownToString(err));
|
|
33
|
+
}
|
|
34
|
+
// Object not found, proceed with upload
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const params = {
|
|
38
|
+
...fileMetadata,
|
|
39
|
+
Bucket: bucketName,
|
|
40
|
+
Key: targetPath,
|
|
41
|
+
Body: fileStream
|
|
42
|
+
};
|
|
43
|
+
try {
|
|
44
|
+
const upload = new Upload({
|
|
45
|
+
client: s3,
|
|
46
|
+
params,
|
|
47
|
+
...uploadSettings
|
|
48
|
+
});
|
|
49
|
+
await upload.done();
|
|
50
|
+
return Outcome.makeSuccess(true);
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
return Outcome.makeFailure(unknownToString(err));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,47 +1,63 @@
|
|
|
1
|
-
import
|
|
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
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
1
|
+
import multer from 'multer';
|
|
2
|
+
import * as Outcome from '../../../agnostic/misc/outcome/index.js';
|
|
3
|
+
import { unknownToString } from '../../../agnostic/errors/unknown-to-string/index.js';
|
|
4
|
+
/**
|
|
5
|
+
* Applies multer middleware to an Express request/response pair.
|
|
6
|
+
*
|
|
7
|
+
* The function creates a multer instance based on the provided options and
|
|
8
|
+
* applies the appropriate middleware based on the upload mode. Errors are
|
|
9
|
+
* captured and returned as a structured `WithMulterError` object.
|
|
10
|
+
*
|
|
11
|
+
* @param {Request} req - The Express request object.
|
|
12
|
+
* @param {Response} res - The Express response object.
|
|
13
|
+
* @param {WithMulterOptions} options - Multer configuration and upload mode.
|
|
14
|
+
* @param {multer.StorageEngine} [options.storage] - Storage engine (defaults to memory).
|
|
15
|
+
* @param {multer.Options['limits']} [options.limits] - File size and count limits.
|
|
16
|
+
* @param {multer.Options['fileFilter']} [options.fileFilter] - File filter function.
|
|
17
|
+
* @param {'none'|'any'|'single'|'array'|'fields'} options.mode - Upload mode.
|
|
18
|
+
* @param {string} [options.fieldName] - Field name (required for 'single' and 'array' modes).
|
|
19
|
+
* @param {number} [options.maxCount] - Max file count (for 'array' mode).
|
|
20
|
+
* @param {multer.Field[]} [options.fields] - Field configurations (for 'fields' mode).
|
|
21
|
+
* @returns {Promise<Outcome.Either<true, WithMulterError>>}
|
|
22
|
+
* - On success: `Outcome.makeSuccess(true)`.
|
|
23
|
+
* - On failure: `Outcome.makeFailure(error)` with structured error details.
|
|
24
|
+
*/
|
|
25
|
+
export async function useMulterMiddleware(req, res, options) {
|
|
26
|
+
// eslint-disable-next-line @typescript-eslint/unbound-method
|
|
27
|
+
const { storage, limits, fileFilter } = options;
|
|
28
|
+
const uploader = multer({
|
|
29
|
+
storage: storage ?? multer.memoryStorage(),
|
|
30
|
+
limits,
|
|
31
|
+
fileFilter
|
|
32
|
+
});
|
|
33
|
+
let middleware;
|
|
34
|
+
if (options.mode === 'none') {
|
|
35
|
+
middleware = uploader.none();
|
|
36
|
+
}
|
|
37
|
+
else if (options.mode === 'single') {
|
|
38
|
+
middleware = uploader.single(options.fieldName);
|
|
39
|
+
}
|
|
40
|
+
else if (options.mode === 'array') {
|
|
41
|
+
middleware = uploader.array(options.fieldName, options.maxCount);
|
|
42
|
+
}
|
|
43
|
+
else if (options.mode === 'fields') {
|
|
44
|
+
middleware = uploader.fields(options.fields);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
middleware = uploader.any();
|
|
48
|
+
}
|
|
49
|
+
return await new Promise(resolve => middleware(req, res, (err) => {
|
|
50
|
+
if (err instanceof multer.MulterError)
|
|
51
|
+
return resolve(Outcome.makeFailure({
|
|
52
|
+
code: err.code,
|
|
53
|
+
message: err.message,
|
|
54
|
+
field: err.field
|
|
55
|
+
}));
|
|
56
|
+
return resolve(err !== undefined
|
|
57
|
+
? Outcome.makeFailure({
|
|
58
|
+
code: 'UNKNOWN',
|
|
59
|
+
message: unknownToString(err)
|
|
60
|
+
})
|
|
61
|
+
: Outcome.makeSuccess(true));
|
|
36
62
|
}));
|
|
37
|
-
return resolve(
|
|
38
|
-
err !== void 0 ? makeFailure({
|
|
39
|
-
code: "UNKNOWN",
|
|
40
|
-
message: unknownToString(err)
|
|
41
|
-
}) : makeSuccess(true)
|
|
42
|
-
);
|
|
43
|
-
}));
|
|
44
63
|
}
|
|
45
|
-
export {
|
|
46
|
-
useMulterMiddleware
|
|
47
|
-
};
|
|
@@ -1,22 +1,26 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
1
|
+
import { unknownToString } from '../../../../../agnostic/errors/unknown-to-string/index.js';
|
|
2
|
+
import * as Outcome from '../../../../../agnostic/misc/outcome/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Retrieves metadata for a Google Cloud Storage bucket.
|
|
5
|
+
*
|
|
6
|
+
* This function calls the Google Cloud Storage API to get information about the bucket,
|
|
7
|
+
* such as its location, storage class, and other configuration details.
|
|
8
|
+
*
|
|
9
|
+
* @param {Bucket} bucket - The Google Cloud Storage bucket object.
|
|
10
|
+
* @param {GetBucketMetadataOptions} [options] - Optional configuration options to pass to the `getMetadata` method.
|
|
11
|
+
* @returns {Promise<Outcome.Either<BucketMetadata, string>>} A promise that resolves to an `Outcome.Either`.
|
|
12
|
+
* - On success: `Outcome.makeSuccess(metadata)` with the bucket metadata.
|
|
13
|
+
* - On failure: `Outcome.makeFailure(errStr)` with an error message.
|
|
14
|
+
*
|
|
15
|
+
* @throws {Error} Throws an error if the metadata retrieval fails (e.g., network issues, incorrect permissions).
|
|
16
|
+
*/
|
|
17
|
+
export async function getMetadata(bucket, options) {
|
|
18
|
+
try {
|
|
19
|
+
const [metadata] = await bucket.getMetadata(options);
|
|
20
|
+
return Outcome.makeSuccess(metadata);
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
const errStr = unknownToString(err);
|
|
24
|
+
return Outcome.makeFailure(errStr);
|
|
25
|
+
}
|
|
19
26
|
}
|
|
20
|
-
export {
|
|
21
|
-
getMetadata
|
|
22
|
-
};
|
|
@@ -1,9 +1,38 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
}
|
|
1
|
+
import * as Outcome from '../../../../../agnostic/misc/outcome/index.js';
|
|
2
|
+
import { unknownToString } from '../../../../../agnostic/errors/unknown-to-string/index.js';
|
|
3
|
+
/** Recursively copies every object under `sourceDir` to the same relative path
|
|
4
|
+
* beneath `targetDir` within a single GCS bucket.
|
|
5
|
+
* @param {Bucket} bucket - The GCS bucket instance.
|
|
6
|
+
* @param {string} sourceDir - The source directory path (prefix) to copy from.
|
|
7
|
+
* @param {string} targetDir - The target directory path (prefix) to copy to.
|
|
8
|
+
* @param {CopyDirOptions} [options] - Optional parameters for the operation.
|
|
9
|
+
* @param {boolean} [options.overwrite=false] - Whether to overwrite existing files at target.
|
|
10
|
+
* @returns {Promise<Outcome.Either<true, string>>} A promise that resolves to an `Outcome.Either`:
|
|
11
|
+
* - On success: `Outcome.makeSuccess(true)` indicating the copy was successful.
|
|
12
|
+
* - On failure: `Outcome.makeFailure(errStr)` with an error message if the copy fails.
|
|
13
|
+
* */
|
|
14
|
+
export async function copyDir(bucket, sourceDir, targetDir, options) {
|
|
15
|
+
const { getFileOptions, copyOptions, overwrite = false } = options ?? {};
|
|
16
|
+
const from = sourceDir.endsWith('/') ? sourceDir : `${sourceDir}/`;
|
|
17
|
+
const to = targetDir.endsWith('/') ? targetDir : `${targetDir}/`;
|
|
18
|
+
try {
|
|
19
|
+
const [files] = await bucket.getFiles({ ...getFileOptions, prefix: from });
|
|
20
|
+
for (const f of files) {
|
|
21
|
+
const rel = f.name.substring(from.length);
|
|
22
|
+
const dest = `${to}${rel}`;
|
|
23
|
+
if (!overwrite) {
|
|
24
|
+
const destFile = bucket.file(dest);
|
|
25
|
+
const [exists] = await destFile.exists();
|
|
26
|
+
if (exists) {
|
|
27
|
+
// Skip copy if target exists and overwrite is false
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
await f.copy(dest, copyOptions);
|
|
32
|
+
}
|
|
33
|
+
return Outcome.makeSuccess(true);
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
return Outcome.makeFailure(unknownToString(err));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -1,9 +1,29 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
}
|
|
1
|
+
import * as Outcome from '../../../../../agnostic/misc/outcome/index.js';
|
|
2
|
+
import { unknownToString } from '../../../../../agnostic/errors/unknown-to-string/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Lists all direct children file paths under a given directory prefix in a GCS bucket.
|
|
5
|
+
*
|
|
6
|
+
* This function returns only the immediate files (not recursive) under the specified directory prefix.
|
|
7
|
+
*
|
|
8
|
+
* @param {Bucket} bucket - The GCS bucket to list files from.
|
|
9
|
+
* @param {string} directoryPath - The directory prefix to list files under.
|
|
10
|
+
* @param {ListOptions} [options] - Optional configuration for the listing.
|
|
11
|
+
* @param {FileOptions} [options.fileOptions] - Additional options for file retrieval.
|
|
12
|
+
* @returns {Promise<Outcome.Either<string[], string>>} Returns either a success with an array of file paths, or a failure with an error message.
|
|
13
|
+
*/
|
|
14
|
+
export async function list(bucket, directoryPath, options) {
|
|
15
|
+
const { fileOptions } = options ?? {};
|
|
16
|
+
try {
|
|
17
|
+
const prefix = directoryPath.endsWith('/') ? directoryPath : `${directoryPath}/`;
|
|
18
|
+
const [files] = await bucket.getFiles({
|
|
19
|
+
prefix,
|
|
20
|
+
delimiter: '/',
|
|
21
|
+
...fileOptions
|
|
22
|
+
});
|
|
23
|
+
const paths = files.map(file => file.name);
|
|
24
|
+
return Outcome.makeSuccess(paths);
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
return Outcome.makeFailure(unknownToString(err));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -1,9 +1,45 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
import * as Outcome from '../../../../../agnostic/misc/outcome/index.js';
|
|
2
|
+
import { unknownToString } from '../../../../../agnostic/errors/unknown-to-string/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Recursively moves every object under `sourceDir` to the corresponding path
|
|
5
|
+
* under `targetDir` within the same bucket.
|
|
6
|
+
*
|
|
7
|
+
* Example: moving `a/b/` to `x/y/` copies
|
|
8
|
+
* `a/b/file.txt` → `x/y/file.txt` and then deletes the original.
|
|
9
|
+
*
|
|
10
|
+
* If `overwrite` is false (default), the operation aborts if any destination file
|
|
11
|
+
* already exists.
|
|
12
|
+
*
|
|
13
|
+
* @param {Bucket} bucket - The GCS bucket instance.
|
|
14
|
+
* @param {string} sourceDir - The source directory prefix to move from.
|
|
15
|
+
* @param {string} targetDir - The target directory prefix to move to.
|
|
16
|
+
* @param {MoveDirOptions} [options] - Optional parameters for the operation.
|
|
17
|
+
* @returns {Promise<Outcome.Either<true, string>>}
|
|
18
|
+
* - On success: `Outcome.makeSuccess(true)`.
|
|
19
|
+
* - On failure: `Outcome.makeFailure(errStr)`.
|
|
20
|
+
*/
|
|
21
|
+
export async function moveDir(bucket, sourceDir, targetDir, options) {
|
|
22
|
+
const { fileOptions, copyOptions, deleteOptions, overwrite = false } = options ?? {};
|
|
23
|
+
const from = sourceDir.endsWith('/') ? sourceDir : `${sourceDir}/`;
|
|
24
|
+
const to = targetDir.endsWith('/') ? targetDir : `${targetDir}/`;
|
|
25
|
+
try {
|
|
26
|
+
const [files] = await bucket.getFiles({ prefix: from });
|
|
27
|
+
for (const f of files) {
|
|
28
|
+
const rel = f.name.substring(from.length);
|
|
29
|
+
const dest = `${to}${rel}`;
|
|
30
|
+
const srcFile = bucket.file(f.name, fileOptions);
|
|
31
|
+
const destFile = bucket.file(dest, fileOptions);
|
|
32
|
+
if (!overwrite) {
|
|
33
|
+
const [exists] = await destFile.exists();
|
|
34
|
+
if (exists)
|
|
35
|
+
throw new Error(`File already exists at ${dest}.`);
|
|
36
|
+
}
|
|
37
|
+
await srcFile.copy(dest, copyOptions);
|
|
38
|
+
await srcFile.delete(deleteOptions);
|
|
39
|
+
}
|
|
40
|
+
return Outcome.makeSuccess(true);
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
return Outcome.makeFailure(unknownToString(err));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -1,9 +1,36 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
}
|
|
1
|
+
import * as Outcome from '../../../../../agnostic/misc/outcome/index.js';
|
|
2
|
+
import { unknownToString } from '../../../../../agnostic/errors/unknown-to-string/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Recursively deletes all objects under a directory prefix in a GCS bucket
|
|
5
|
+
* (including the directory placeholder itself, if present).
|
|
6
|
+
*
|
|
7
|
+
* @param {Bucket} bucket - The GCS bucket instance.
|
|
8
|
+
* @param {string} directoryPath - The “directory” prefix to delete.
|
|
9
|
+
* @param {RemoveDirOptions} [options] - Optional configuration.
|
|
10
|
+
* @param {GCSDeleteFileOptions & {force?: boolean}} [options.deleteOptions] - Extra delete parameters.
|
|
11
|
+
* @param {boolean} [options.ignoreMissing=true] - Whether to ignore an empty/missing prefix.
|
|
12
|
+
* @returns {Promise<Outcome.Either<true, string>>}
|
|
13
|
+
* - On success: `Outcome.makeSuccess(true)` if deletion succeeds
|
|
14
|
+
* (or prefix absent and `ignoreMissing` is true).
|
|
15
|
+
* - On failure: `Outcome.makeFailure(errStr)` if deletion fails
|
|
16
|
+
* or prefix absent and `ignoreMissing` is false.
|
|
17
|
+
*/
|
|
18
|
+
export async function removeDir(bucket, directoryPath, options) {
|
|
19
|
+
const { deleteOptions, ignoreMissing = true } = options ?? {};
|
|
20
|
+
const prefix = directoryPath.endsWith('/') ? directoryPath : `${directoryPath}/`;
|
|
21
|
+
try {
|
|
22
|
+
// First check if anything exists when ignoreMissing is disabled.
|
|
23
|
+
if (!ignoreMissing) {
|
|
24
|
+
const [some] = await bucket.getFiles({ prefix, maxResults: 1 });
|
|
25
|
+
if (some.length === 0) {
|
|
26
|
+
return Outcome.makeFailure(`No objects found for prefix "${prefix}".`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
// deleteFiles removes all matching objects in a single call.
|
|
30
|
+
await bucket.deleteFiles({ prefix, ...deleteOptions });
|
|
31
|
+
return Outcome.makeSuccess(true);
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
return Outcome.makeFailure(unknownToString(err));
|
|
35
|
+
}
|
|
36
|
+
}
|