@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,74 +1,33 @@
|
|
|
1
|
-
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import { Buffer } from 'node:buffer';
|
|
2
|
+
import * as Outcome from '../../../../agnostic/misc/outcome/index.js';
|
|
3
|
+
import { encryptUint8Array, decryptUint8Array } from '../uint8-array/index.js';
|
|
4
|
+
/**
|
|
5
|
+
* Encrypts a `Buffer` by converting it to a `Uint8Array`, performing encryption, and then returning the result as a `Buffer`.
|
|
6
|
+
*
|
|
7
|
+
* @param {Buffer} inputBuffer - The input data to encrypt.
|
|
8
|
+
* @param {string} encryptionKey - The encryption key to use.
|
|
9
|
+
*
|
|
10
|
+
* @returns {Outcome.Either<Buffer, string>} The result of the encryption. Success returns the encrypted data as a `Buffer` (with IV prepended), or failure returns an error message.
|
|
11
|
+
*/
|
|
12
|
+
export function encrypt(inputBuffer, encryptionKey) {
|
|
13
|
+
const fileArray = new Uint8Array(inputBuffer);
|
|
14
|
+
const encryptionOutcome = encryptUint8Array(fileArray, encryptionKey);
|
|
15
|
+
if (!encryptionOutcome.success)
|
|
16
|
+
return encryptionOutcome;
|
|
17
|
+
return Outcome.makeSuccess(Buffer.from(encryptionOutcome.payload));
|
|
7
18
|
}
|
|
8
|
-
|
|
9
|
-
|
|
19
|
+
/**
|
|
20
|
+
* Decrypts an encrypted `Buffer` by converting it to a `Uint8Array`, performing decryption, and then returning the result as a `Buffer`.
|
|
21
|
+
*
|
|
22
|
+
* @param {Buffer} encryptedBuffer - The encrypted data to decrypt.
|
|
23
|
+
* @param {string} encryptionKey - The encryption key to use.
|
|
24
|
+
*
|
|
25
|
+
* @returns {Outcome.Either<Buffer, string>} The result of the decryption. Success returns the decrypted data as a `Buffer`, or failure returns an error message.
|
|
26
|
+
*/
|
|
27
|
+
export function decrypt(encryptedBuffer, encryptionKey) {
|
|
28
|
+
const encryptedArray = new Uint8Array(encryptedBuffer);
|
|
29
|
+
const decryptionOutcome = decryptUint8Array(encryptedArray, encryptionKey);
|
|
30
|
+
if (!decryptionOutcome.success)
|
|
31
|
+
return decryptionOutcome;
|
|
32
|
+
return Outcome.makeSuccess(Buffer.from(decryptionOutcome.payload));
|
|
10
33
|
}
|
|
11
|
-
|
|
12
|
-
// src/node/encryption/@aes-256-gcm/uint8-array/index.ts
|
|
13
|
-
import { Buffer as Buffer2 } from "node:buffer";
|
|
14
|
-
import { createCipheriv, createDecipheriv, randomBytes } from "node:crypto";
|
|
15
|
-
|
|
16
|
-
// src/agnostic/errors/unknown-to-string/index.ts
|
|
17
|
-
function unknownToString(unk, encoding) {
|
|
18
|
-
if (unk instanceof Error) return unk.message;
|
|
19
|
-
if (unk instanceof Buffer) return unk.toString(encoding ?? "utf-8");
|
|
20
|
-
if (typeof unk === "string") return unk;
|
|
21
|
-
if (typeof unk === "object" && unk !== null) return JSON.stringify(unk);
|
|
22
|
-
return `${unk}`;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
// src/node/encryption/@aes-256-gcm/uint8-array/index.ts
|
|
26
|
-
function encryptUint8Array(fileArray, encryptionKey) {
|
|
27
|
-
const ivLength = 12;
|
|
28
|
-
const keyBuffer = Buffer2.from(encryptionKey, "utf-8");
|
|
29
|
-
if (keyBuffer.length !== 32) return makeFailure("Encryption key must be 32 bytes for AES-256-GCM.");
|
|
30
|
-
try {
|
|
31
|
-
const iv = randomBytes(ivLength);
|
|
32
|
-
const cipher = createCipheriv("aes-256-gcm", keyBuffer, iv);
|
|
33
|
-
let encrypted = cipher.update(fileArray);
|
|
34
|
-
encrypted = Buffer2.concat([encrypted, cipher.final()]);
|
|
35
|
-
return makeSuccess(new Uint8Array(Buffer2.concat([iv, encrypted])));
|
|
36
|
-
} catch (err) {
|
|
37
|
-
const errStr = unknownToString(err);
|
|
38
|
-
return makeFailure(errStr);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
function decryptUint8Array(encryptedFile, encryptionKey) {
|
|
42
|
-
const ivLength = 12;
|
|
43
|
-
const iv = encryptedFile.subarray(0, ivLength);
|
|
44
|
-
const keyBuffer = Buffer2.from(encryptionKey, "utf-8");
|
|
45
|
-
if (keyBuffer.length !== 32) return makeFailure("Encryption key must be 32 bytes for AES-256-GCM.");
|
|
46
|
-
try {
|
|
47
|
-
const encryptedData = encryptedFile.subarray(ivLength);
|
|
48
|
-
const decipher = createDecipheriv("aes-256-gcm", keyBuffer, iv);
|
|
49
|
-
let decrypted = decipher.update(encryptedData);
|
|
50
|
-
decrypted = Buffer2.concat([decrypted, decipher.final()]);
|
|
51
|
-
return makeSuccess(new Uint8Array(decrypted));
|
|
52
|
-
} catch (err) {
|
|
53
|
-
const errStr = unknownToString(err);
|
|
54
|
-
return makeFailure(errStr);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// src/node/encryption/@aes-256-gcm/buffer/index.ts
|
|
59
|
-
function encrypt(inputBuffer, encryptionKey) {
|
|
60
|
-
const fileArray = new Uint8Array(inputBuffer);
|
|
61
|
-
const encryptionOutcome = encryptUint8Array(fileArray, encryptionKey);
|
|
62
|
-
if (!encryptionOutcome.success) return encryptionOutcome;
|
|
63
|
-
return makeSuccess(Buffer3.from(encryptionOutcome.payload));
|
|
64
|
-
}
|
|
65
|
-
function decrypt(encryptedBuffer, encryptionKey) {
|
|
66
|
-
const encryptedArray = new Uint8Array(encryptedBuffer);
|
|
67
|
-
const decryptionOutcome = decryptUint8Array(encryptedArray, encryptionKey);
|
|
68
|
-
if (!decryptionOutcome.success) return decryptionOutcome;
|
|
69
|
-
return makeSuccess(Buffer3.from(decryptionOutcome.payload));
|
|
70
|
-
}
|
|
71
|
-
export {
|
|
72
|
-
decrypt,
|
|
73
|
-
encrypt
|
|
74
|
-
};
|
|
@@ -1,57 +1,57 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
import { Buffer } from 'node:buffer';
|
|
2
|
+
import { createCipheriv, createDecipheriv, randomBytes } from 'node:crypto';
|
|
3
|
+
import { unknownToString } from '../../../../agnostic/errors/unknown-to-string/index.js';
|
|
4
|
+
import * as Outcome from '../../../../agnostic/misc/outcome/index.js';
|
|
5
|
+
/**
|
|
6
|
+
* Encrypts a `Uint8Array` using AES-256-GCM encryption and the specified encryption key.
|
|
7
|
+
*
|
|
8
|
+
* @param {Uint8Array} fileArray - The input data to encrypt.
|
|
9
|
+
* @param {string} encryptionKey - The encryption key to use.
|
|
10
|
+
* @param {number} [options.ivLength=16] - The length of the initialization vector (IV). Defaults to 16 bytes.
|
|
11
|
+
*
|
|
12
|
+
* @returns {Outcome.Either<Uint8Array, string>} The result of the encryption. Success returns the encrypted data as a `Uint8Array` (with IV prepended), or failure returns an error message.
|
|
13
|
+
*/
|
|
14
|
+
export function encryptUint8Array(fileArray, encryptionKey) {
|
|
15
|
+
const ivLength = 12;
|
|
16
|
+
const keyBuffer = Buffer.from(encryptionKey, 'utf-8');
|
|
17
|
+
if (keyBuffer.length !== 32)
|
|
18
|
+
return Outcome.makeFailure('Encryption key must be 32 bytes for AES-256-GCM.');
|
|
19
|
+
try {
|
|
20
|
+
const iv = randomBytes(ivLength);
|
|
21
|
+
const cipher = createCipheriv('aes-256-gcm', keyBuffer, iv);
|
|
22
|
+
let encrypted = cipher.update(fileArray);
|
|
23
|
+
encrypted = Buffer.concat([encrypted, cipher.final()]);
|
|
24
|
+
return Outcome.makeSuccess(new Uint8Array(Buffer.concat([iv, encrypted])));
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
const errStr = unknownToString(err);
|
|
28
|
+
return Outcome.makeFailure(errStr);
|
|
29
|
+
}
|
|
12
30
|
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Decrypts an encrypted `Uint8Array` using AES-256-GCM encryption and the specified encryption key.
|
|
33
|
+
*
|
|
34
|
+
* @param {Uint8Array} encryptedFile - The encrypted data to decrypt.
|
|
35
|
+
* @param {string} encryptionKey - The encryption key to use.
|
|
36
|
+
* @param {number} [options.ivLength=16] - The length of the initialization vector (IV). Defaults to 16 bytes.
|
|
37
|
+
*
|
|
38
|
+
* @returns {Outcome.Either<Uint8Array, string>} The result of the decryption. Success returns the decrypted data as a `Uint8Array`, or failure returns an error message.
|
|
39
|
+
*/
|
|
40
|
+
export function decryptUint8Array(encryptedFile, encryptionKey) {
|
|
41
|
+
const ivLength = 12;
|
|
42
|
+
const iv = encryptedFile.subarray(0, ivLength);
|
|
43
|
+
const keyBuffer = Buffer.from(encryptionKey, 'utf-8');
|
|
44
|
+
if (keyBuffer.length !== 32)
|
|
45
|
+
return Outcome.makeFailure('Encryption key must be 32 bytes for AES-256-GCM.');
|
|
46
|
+
try {
|
|
47
|
+
const encryptedData = encryptedFile.subarray(ivLength);
|
|
48
|
+
const decipher = createDecipheriv('aes-256-gcm', keyBuffer, iv);
|
|
49
|
+
let decrypted = decipher.update(encryptedData);
|
|
50
|
+
decrypted = Buffer.concat([decrypted, decipher.final()]);
|
|
51
|
+
return Outcome.makeSuccess(new Uint8Array(decrypted));
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
const errStr = unknownToString(err);
|
|
55
|
+
return Outcome.makeFailure(errStr);
|
|
56
|
+
}
|
|
17
57
|
}
|
|
18
|
-
function makeFailure(error) {
|
|
19
|
-
return { success: false, error };
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
// src/node/encryption/@aes-256-gcm/uint8-array/index.ts
|
|
23
|
-
function encryptUint8Array(fileArray, encryptionKey) {
|
|
24
|
-
const ivLength = 12;
|
|
25
|
-
const keyBuffer = Buffer2.from(encryptionKey, "utf-8");
|
|
26
|
-
if (keyBuffer.length !== 32) return makeFailure("Encryption key must be 32 bytes for AES-256-GCM.");
|
|
27
|
-
try {
|
|
28
|
-
const iv = randomBytes(ivLength);
|
|
29
|
-
const cipher = createCipheriv("aes-256-gcm", keyBuffer, iv);
|
|
30
|
-
let encrypted = cipher.update(fileArray);
|
|
31
|
-
encrypted = Buffer2.concat([encrypted, cipher.final()]);
|
|
32
|
-
return makeSuccess(new Uint8Array(Buffer2.concat([iv, encrypted])));
|
|
33
|
-
} catch (err) {
|
|
34
|
-
const errStr = unknownToString(err);
|
|
35
|
-
return makeFailure(errStr);
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
function decryptUint8Array(encryptedFile, encryptionKey) {
|
|
39
|
-
const ivLength = 12;
|
|
40
|
-
const iv = encryptedFile.subarray(0, ivLength);
|
|
41
|
-
const keyBuffer = Buffer2.from(encryptionKey, "utf-8");
|
|
42
|
-
if (keyBuffer.length !== 32) return makeFailure("Encryption key must be 32 bytes for AES-256-GCM.");
|
|
43
|
-
try {
|
|
44
|
-
const encryptedData = encryptedFile.subarray(ivLength);
|
|
45
|
-
const decipher = createDecipheriv("aes-256-gcm", keyBuffer, iv);
|
|
46
|
-
let decrypted = decipher.update(encryptedData);
|
|
47
|
-
decrypted = Buffer2.concat([decrypted, decipher.final()]);
|
|
48
|
-
return makeSuccess(new Uint8Array(decrypted));
|
|
49
|
-
} catch (err) {
|
|
50
|
-
const errStr = unknownToString(err);
|
|
51
|
-
return makeFailure(errStr);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
export {
|
|
55
|
-
decryptUint8Array,
|
|
56
|
-
encryptUint8Array
|
|
57
|
-
};
|
|
@@ -1,13 +1,20 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
import { pbkdf2Sync, randomBytes } from 'node:crypto';
|
|
2
|
+
/**
|
|
3
|
+
* Generates an encryption key from a passphrase using PBKDF2.
|
|
4
|
+
*
|
|
5
|
+
* @param {string} passphrase - The passphrase to derive the key from.
|
|
6
|
+
* @param {number} outputByteLength - The length of the output encryption key in bytes.
|
|
7
|
+
* @param {GenerateOptions} [options] - Optional options.
|
|
8
|
+
* @param {number} [options.saltLength=16] - The length of the salt in bytes. Defaults to 16 bytes.
|
|
9
|
+
* @param {number} [options.iterations=100000] - The number of PBKDF2 iterations. Defaults to 100,000 iterations.
|
|
10
|
+
*
|
|
11
|
+
* @returns {string} The derived encryption key and salt, concatenated as a string in the format `salt:encryptionKey`.
|
|
12
|
+
*/
|
|
13
|
+
export function generate(passphrase, outputByteLength, options) {
|
|
14
|
+
const { saltLength = 16, iterations = 100000 } = options ?? {};
|
|
15
|
+
const salt = randomBytes(saltLength);
|
|
16
|
+
const key = pbkdf2Sync(passphrase, salt, iterations, outputByteLength, 'sha256');
|
|
17
|
+
const saltString = salt.toString('hex');
|
|
18
|
+
const keyString = key.toString('hex');
|
|
19
|
+
return `${saltString}:${keyString}`;
|
|
10
20
|
}
|
|
11
|
-
export {
|
|
12
|
-
generate
|
|
13
|
-
};
|
package/node/files/index.d.ts
CHANGED
package/node/files/index.js
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
/**
|
|
3
|
+
* Checks whether a child path is contained within a parent directory.
|
|
4
|
+
*
|
|
5
|
+
* @param childPath - The path to check if it's within the parent.
|
|
6
|
+
* @param parentPath - The parent directory path.
|
|
7
|
+
* @returns `true` if `childPath` is within `parentPath`, `false` otherwise.
|
|
8
|
+
*/
|
|
9
|
+
export function isInDirectory(childPath, parentPath) {
|
|
10
|
+
const rel = path.relative(parentPath, childPath);
|
|
11
|
+
return rel !== '' && !rel.startsWith('..');
|
|
6
12
|
}
|
|
7
|
-
export {
|
|
8
|
-
isInDirectory
|
|
9
|
-
};
|
|
@@ -1,16 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
return edited;
|
|
1
|
+
import { promises as fs } from 'node:fs';
|
|
2
|
+
export async function readWrite(path, editor, opts = {}) {
|
|
3
|
+
const readData = await fs.readFile(path, opts.readOptions);
|
|
4
|
+
const edited = typeof editor === 'function'
|
|
5
|
+
? editor(readData)
|
|
6
|
+
: Object.entries(editor).reduce((acc, [from, to]) => acc.replaceAll(from, to), readData.toString());
|
|
7
|
+
const actualWriteOptions = opts.writeOptions ?? opts.readOptions;
|
|
8
|
+
const targetOutput = opts.output ?? path;
|
|
9
|
+
if (opts.dryRun !== true)
|
|
10
|
+
await fs.writeFile(targetOutput, edited, actualWriteOptions);
|
|
11
|
+
return edited;
|
|
13
12
|
}
|
|
14
|
-
export {
|
|
15
|
-
readWrite
|
|
16
|
-
};
|
|
@@ -1,130 +1,165 @@
|
|
|
1
|
-
|
|
2
|
-
import { promises as fs } from
|
|
3
|
-
import path from
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
return input.match(matcher) !== null;
|
|
10
|
-
}
|
|
11
|
-
function matchesSome(input, matchers) {
|
|
12
|
-
if (!Array.isArray(matchers)) return matches(input, matchers);
|
|
13
|
-
return matchers.some((matcher) => matches(input, matcher));
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
// src/node/files/subpaths/index.ts
|
|
17
|
-
var defaultListContext = {
|
|
18
|
-
depth: 0,
|
|
19
|
-
lstats: null,
|
|
20
|
-
rootPath: null
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-throw-literal */
|
|
2
|
+
import { promises as fs } from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { matchesSome as stringMatchesSome } from '../../../agnostic/strings/matches/index.js';
|
|
5
|
+
export const defaultListContext = {
|
|
6
|
+
depth: 0,
|
|
7
|
+
lstats: null,
|
|
8
|
+
rootPath: null
|
|
21
9
|
};
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
10
|
+
/**
|
|
11
|
+
* Fills missing properties in a list context with default values.
|
|
12
|
+
*
|
|
13
|
+
* @param {ListContext} input - The partial list context to fill.
|
|
14
|
+
* @returns {Required<ListContext>} A complete list context with all properties set.
|
|
15
|
+
*/
|
|
16
|
+
export const fillListContext = (input) => {
|
|
17
|
+
return {
|
|
18
|
+
...defaultListContext,
|
|
19
|
+
...input
|
|
20
|
+
};
|
|
27
21
|
};
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
22
|
+
export const defaultListOptions = {
|
|
23
|
+
directories: true,
|
|
24
|
+
files: true,
|
|
25
|
+
symlinks: true,
|
|
26
|
+
hidden: true,
|
|
27
|
+
followSimlinks: false,
|
|
28
|
+
dedupeSimlinksContents: false,
|
|
29
|
+
maxDepth: Infinity,
|
|
30
|
+
returnRelative: false,
|
|
31
|
+
exclude: null,
|
|
32
|
+
include: null,
|
|
33
|
+
filter: () => true
|
|
40
34
|
};
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
35
|
+
/**
|
|
36
|
+
* Fills missing properties in list options with default values.
|
|
37
|
+
*
|
|
38
|
+
* @param {ListOptions} input - The partial list options to fill.
|
|
39
|
+
* @returns {Required<ListOptions>} A complete list options object with all properties set.
|
|
40
|
+
*/
|
|
41
|
+
export const fillOptions = (input) => {
|
|
42
|
+
return {
|
|
43
|
+
...defaultListOptions,
|
|
44
|
+
...input
|
|
45
|
+
};
|
|
46
46
|
};
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
47
|
+
/**
|
|
48
|
+
* Lists all subpaths under a given directory path.
|
|
49
|
+
*
|
|
50
|
+
* The function recursively traverses the directory tree and returns all matching
|
|
51
|
+
* files, directories, and symlinks based on the provided options.
|
|
52
|
+
*
|
|
53
|
+
* @param inputPath - The root directory path to list subpaths from.
|
|
54
|
+
* @param [options] - Optional configuration for filtering and behavior. See `ListOptions` for details.
|
|
55
|
+
* @returns Array of subpaths (absolute or relative based on `returnRelative` option).
|
|
56
|
+
*/
|
|
57
|
+
export async function list(...args) {
|
|
58
|
+
const [inputPath, _options] = args;
|
|
59
|
+
const options = fillOptions(_options ?? {});
|
|
60
|
+
const subpaths = await listAbsoluteSubpaths(...args);
|
|
61
|
+
return options.returnRelative
|
|
62
|
+
? subpaths.map(subpath => path.relative(inputPath, subpath))
|
|
63
|
+
: subpaths;
|
|
52
64
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
const
|
|
71
|
-
|
|
65
|
+
/**
|
|
66
|
+
* Internal function that lists absolute subpaths recursively.
|
|
67
|
+
*
|
|
68
|
+
* @param {string} inputPath - The directory path to list.
|
|
69
|
+
* @param {ListOptions} [_options] - Optional configuration.
|
|
70
|
+
* @param {ListContext} [__private_context] - Internal recursion context.
|
|
71
|
+
* @returns {Promise<string[]>} Array of absolute subpaths.
|
|
72
|
+
*/
|
|
73
|
+
async function listAbsoluteSubpaths(inputPath, _options = {},
|
|
74
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
75
|
+
__private_context = {}) {
|
|
76
|
+
const options = fillOptions(_options);
|
|
77
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
78
|
+
const _private_context = fillListContext(__private_context);
|
|
79
|
+
if (_private_context.rootPath === null) {
|
|
80
|
+
_private_context.rootPath = inputPath;
|
|
81
|
+
}
|
|
82
|
+
const subpaths = [];
|
|
83
|
+
if (_private_context.depth > options.maxDepth)
|
|
84
|
+
return subpaths;
|
|
72
85
|
try {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
86
|
+
const pathStat = _private_context.lstats ?? await fs.lstat(inputPath);
|
|
87
|
+
if (!pathStat.isDirectory())
|
|
88
|
+
return subpaths;
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
return subpaths;
|
|
92
|
+
}
|
|
93
|
+
const childrenRelPaths = await fs.readdir(inputPath);
|
|
94
|
+
await Promise.all(childrenRelPaths.map(async (childRelPath) => {
|
|
95
|
+
const childAbsPath = path.join(inputPath, childRelPath);
|
|
96
|
+
const childRelFromRootPath = path.relative(_private_context.rootPath ?? inputPath, childAbsPath);
|
|
97
|
+
const childLstats = await fs.lstat(childAbsPath);
|
|
98
|
+
try {
|
|
99
|
+
const isDirectory = childLstats.isDirectory();
|
|
100
|
+
const isSymlink = childLstats.isSymbolicLink();
|
|
101
|
+
const isFile = !isDirectory && !isSymlink;
|
|
102
|
+
const isHidden = path.basename(childAbsPath).startsWith('.');
|
|
103
|
+
const type = isDirectory ? 'directory' : (isSymlink ? 'symlink' : 'file');
|
|
104
|
+
if (isDirectory && !options.directories)
|
|
105
|
+
throw true;
|
|
106
|
+
if (isSymlink && !options.symlinks)
|
|
107
|
+
throw false;
|
|
108
|
+
if (isFile && !options.files)
|
|
109
|
+
throw false;
|
|
110
|
+
if (isHidden && !options.hidden)
|
|
111
|
+
throw false;
|
|
112
|
+
const realPath = isSymlink
|
|
113
|
+
? await fs.realpath(childAbsPath)
|
|
114
|
+
: childAbsPath;
|
|
115
|
+
const childPathForFilters = options.returnRelative ? childRelFromRootPath : childAbsPath;
|
|
116
|
+
const isInExclude = stringMatchesSome(childPathForFilters, options.exclude ?? []);
|
|
117
|
+
const isInInclude = stringMatchesSome(childPathForFilters, options.include ?? []);
|
|
118
|
+
if (isInExclude && !isInInclude)
|
|
119
|
+
throw false;
|
|
120
|
+
const isInFilter = await options.filter(childPathForFilters, { type, hidden: isHidden, realPath });
|
|
121
|
+
if (!isInFilter)
|
|
122
|
+
throw true;
|
|
123
|
+
if (isSymlink) {
|
|
124
|
+
if (!options.followSimlinks)
|
|
125
|
+
subpaths.push(childAbsPath);
|
|
126
|
+
else {
|
|
127
|
+
const childSubpaths = await listAbsoluteSubpaths(realPath, options, {
|
|
128
|
+
..._private_context,
|
|
129
|
+
depth: _private_context.depth + 1
|
|
130
|
+
});
|
|
131
|
+
subpaths.push(realPath, ...childSubpaths);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
if (isDirectory) {
|
|
136
|
+
const childSubpaths = await listAbsoluteSubpaths(childAbsPath, options, {
|
|
137
|
+
..._private_context,
|
|
138
|
+
depth: _private_context.depth + 1,
|
|
139
|
+
lstats: childLstats
|
|
140
|
+
});
|
|
141
|
+
subpaths.push(childAbsPath, ...childSubpaths);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
subpaths.push(childAbsPath);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
97
147
|
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
148
|
+
catch (err) {
|
|
149
|
+
if (typeof err !== 'boolean')
|
|
150
|
+
throw new Error('This try/catch block should only throw booleans');
|
|
151
|
+
const shouldDiveDeeper = err;
|
|
152
|
+
if (!shouldDiveDeeper)
|
|
153
|
+
return [];
|
|
154
|
+
const childSubpaths = await listAbsoluteSubpaths(childAbsPath, options, {
|
|
155
|
+
..._private_context,
|
|
156
|
+
depth: _private_context.depth + 1,
|
|
157
|
+
lstats: childLstats
|
|
158
|
+
});
|
|
159
|
+
subpaths.push(...childSubpaths);
|
|
108
160
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
if (!shouldDiveDeeper) return [];
|
|
114
|
-
const childSubpaths = await listAbsoluteSubpaths(childAbsPath, options, {
|
|
115
|
-
..._private_context,
|
|
116
|
-
depth: _private_context.depth + 1,
|
|
117
|
-
lstats: childLstats
|
|
118
|
-
});
|
|
119
|
-
subpaths.push(...childSubpaths);
|
|
120
|
-
}
|
|
121
|
-
}));
|
|
122
|
-
return options.dedupeSimlinksContents ? Array.from(new Set(subpaths)) : subpaths;
|
|
161
|
+
}));
|
|
162
|
+
return options.dedupeSimlinksContents
|
|
163
|
+
? Array.from(new Set(subpaths))
|
|
164
|
+
: subpaths;
|
|
123
165
|
}
|
|
124
|
-
export {
|
|
125
|
-
defaultListContext,
|
|
126
|
-
defaultListOptions,
|
|
127
|
-
fillListContext,
|
|
128
|
-
fillOptions,
|
|
129
|
-
list
|
|
130
|
-
};
|