@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
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { palette } from './index.js';
|
|
3
|
+
describe('palette', () => {
|
|
4
|
+
it('generates complementary palette', () => {
|
|
5
|
+
const result = palette({ r: 255, g: 0, b: 0 }, 'complementary');
|
|
6
|
+
expect(result).toHaveLength(1);
|
|
7
|
+
});
|
|
8
|
+
it('generates split-complementary palette', () => {
|
|
9
|
+
const result = palette({ r: 255, g: 0, b: 0 }, 'split-complementary');
|
|
10
|
+
expect(result).toHaveLength(2);
|
|
11
|
+
});
|
|
12
|
+
it('generates triadic palette', () => {
|
|
13
|
+
const result = palette({ r: 255, g: 0, b: 0 }, 'triadic');
|
|
14
|
+
expect(result).toHaveLength(2);
|
|
15
|
+
});
|
|
16
|
+
it('generates tetradic palette', () => {
|
|
17
|
+
const result = palette({ r: 255, g: 0, b: 0 }, 'tetradic');
|
|
18
|
+
expect(result).toHaveLength(3);
|
|
19
|
+
});
|
|
20
|
+
it('preserves color format', () => {
|
|
21
|
+
const hslColor = { h: 180, s: 50, l: 75 };
|
|
22
|
+
const result = palette(hslColor, 'complementary');
|
|
23
|
+
expect(result[0]).toHaveProperty('h');
|
|
24
|
+
expect(result[0]).toHaveProperty('s');
|
|
25
|
+
expect(result[0]).toHaveProperty('l');
|
|
26
|
+
});
|
|
27
|
+
it('generates complementary-lab palette', () => {
|
|
28
|
+
const result = palette({ r: 255, g: 0, b: 0 }, 'complementary-lab');
|
|
29
|
+
expect(result).toHaveLength(1);
|
|
30
|
+
});
|
|
31
|
+
it('generates triadic-lch palette', () => {
|
|
32
|
+
const result = palette({ r: 255, g: 0, b: 0 }, 'triadic-lch');
|
|
33
|
+
expect(result).toHaveLength(2);
|
|
34
|
+
});
|
|
35
|
+
});
|
|
@@ -1,14 +1,41 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
} from
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
1
|
+
import { absoluteModulo } from '../../numbers/absolute-modulo/index.js';
|
|
2
|
+
import { addChannel } from '../channels/index.js';
|
|
3
|
+
import { viaLab, viaLch } from '../convert/index.js';
|
|
4
|
+
function rotateHsl(color, degrees) {
|
|
5
|
+
return addChannel(color, 'hue', degrees);
|
|
6
|
+
}
|
|
7
|
+
function rotateLab(color, degrees) {
|
|
8
|
+
return viaLab(color, lab => {
|
|
9
|
+
const hue = Math.atan2(lab.b, lab.a) * (180 / Math.PI);
|
|
10
|
+
const chroma = Math.sqrt(lab.a ** 2 + lab.b ** 2);
|
|
11
|
+
const newHue = absoluteModulo(hue + degrees, 360);
|
|
12
|
+
const rad = newHue * (Math.PI / 180);
|
|
13
|
+
return {
|
|
14
|
+
...lab,
|
|
15
|
+
a: chroma * Math.cos(rad),
|
|
16
|
+
b: chroma * Math.sin(rad)
|
|
17
|
+
};
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
function rotateLch(color, degrees) {
|
|
21
|
+
return viaLch(color, lch => ({
|
|
22
|
+
...lch,
|
|
23
|
+
h: absoluteModulo(lch.h + degrees, 360)
|
|
24
|
+
}));
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Rotates the hue of a color by a specified number of degrees.
|
|
28
|
+
*
|
|
29
|
+
* @template C - The input color type.
|
|
30
|
+
* @param {C} color - The color to rotate.
|
|
31
|
+
* @param {number} degrees - The number of degrees to rotate the hue (positive or negative).
|
|
32
|
+
* @param {RotateMethod} [method='hsl'] - The color space to use for rotation.
|
|
33
|
+
* @returns {TransformedColor<C>} The rotated color in the original format.
|
|
34
|
+
*/
|
|
35
|
+
export function rotate(color, degrees, method = 'hsl') {
|
|
36
|
+
switch (method) {
|
|
37
|
+
case 'hsl': return rotateHsl(color, degrees);
|
|
38
|
+
case 'lab': return rotateLab(color, degrees);
|
|
39
|
+
case 'lch': return rotateLch(color, degrees);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { rotate } from './index.js';
|
|
3
|
+
import { toHsl } from '../convert/index.js';
|
|
4
|
+
describe('rotate', () => {
|
|
5
|
+
it('rotates hue by specified degrees', () => {
|
|
6
|
+
const color = { h: 0, s: 100, l: 50 };
|
|
7
|
+
const result = rotate(color, 180);
|
|
8
|
+
const hsl = toHsl(result);
|
|
9
|
+
expect(hsl.h).toBe(180);
|
|
10
|
+
});
|
|
11
|
+
it('preserves color format', () => {
|
|
12
|
+
const rgbColor = { r: 255, g: 0, b: 0 };
|
|
13
|
+
const result = rotate(rgbColor, 180);
|
|
14
|
+
expect(result).toHaveProperty('r');
|
|
15
|
+
expect(result).toHaveProperty('g');
|
|
16
|
+
expect(result).toHaveProperty('b');
|
|
17
|
+
});
|
|
18
|
+
it('wraps hue when rotating beyond 360', () => {
|
|
19
|
+
const color = { h: 300, s: 100, l: 50 };
|
|
20
|
+
const result = rotate(color, 100);
|
|
21
|
+
const hsl = toHsl(result);
|
|
22
|
+
expect(hsl.h).toBeGreaterThanOrEqual(0);
|
|
23
|
+
expect(hsl.h).toBeLessThan(360);
|
|
24
|
+
});
|
|
25
|
+
it('uses hsl method by default', () => {
|
|
26
|
+
const color = { h: 0, s: 100, l: 50 };
|
|
27
|
+
const result1 = rotate(color, 180);
|
|
28
|
+
const result2 = rotate(color, 180, 'hsl');
|
|
29
|
+
expect(toHsl(result1).h).toBe(toHsl(result2).h);
|
|
30
|
+
});
|
|
31
|
+
it('rotates using lab method', () => {
|
|
32
|
+
const color = { r: 255, g: 0, b: 0 };
|
|
33
|
+
const result = rotate(color, 180, 'lab');
|
|
34
|
+
expect(result).toHaveProperty('r');
|
|
35
|
+
expect(result).toHaveProperty('g');
|
|
36
|
+
expect(result).toHaveProperty('b');
|
|
37
|
+
});
|
|
38
|
+
it('rotates using lch method', () => {
|
|
39
|
+
const color = { r: 255, g: 0, b: 0 };
|
|
40
|
+
const result = rotate(color, 180, 'lch');
|
|
41
|
+
expect(result).toHaveProperty('r');
|
|
42
|
+
expect(result).toHaveProperty('g');
|
|
43
|
+
expect(result).toHaveProperty('b');
|
|
44
|
+
});
|
|
45
|
+
});
|
|
@@ -1,12 +1,80 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
} from
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
}
|
|
1
|
+
import { isRgb, isHsl, isHsb, isCmyk, isXyz, isLab, isLch, isCssColor, isHex } from '../typechecks/index.js';
|
|
2
|
+
import { clamp } from '../../numbers/clamp/index.js';
|
|
3
|
+
import { absoluteModulo } from '../../numbers/absolute-modulo/index.js';
|
|
4
|
+
import { toRgb, toHex } from '../convert/index.js';
|
|
5
|
+
import { unknownToString } from '../../errors/unknown-to-string/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* Clamps and normalizes a color's channel values to their valid ranges.
|
|
8
|
+
*
|
|
9
|
+
* @template C - The input color type.
|
|
10
|
+
* @param {C} color - The color to tidy.
|
|
11
|
+
* @returns {TransformedColor<C>} The color with all channels clamped to valid ranges, in the original format.
|
|
12
|
+
* @throws {Error} If the color format is invalid or unsupported.
|
|
13
|
+
*/
|
|
14
|
+
export function tidy(color) {
|
|
15
|
+
const _color = color;
|
|
16
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
17
|
+
if (isRgb(_color))
|
|
18
|
+
return {
|
|
19
|
+
r: clamp(_color.r, 0, 255),
|
|
20
|
+
g: clamp(_color.g, 0, 255),
|
|
21
|
+
b: clamp(_color.b, 0, 255),
|
|
22
|
+
a: clamp(_color.a ?? 1, 0, 1)
|
|
23
|
+
};
|
|
24
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
25
|
+
if (isHsl(_color))
|
|
26
|
+
return {
|
|
27
|
+
h: absoluteModulo(_color.h, 360),
|
|
28
|
+
s: clamp(_color.s, 0, 100),
|
|
29
|
+
l: clamp(_color.l, 0, 100),
|
|
30
|
+
a: clamp(_color.a ?? 1, 0, 1)
|
|
31
|
+
};
|
|
32
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
33
|
+
if (isHsb(_color))
|
|
34
|
+
return {
|
|
35
|
+
h: absoluteModulo(_color.h, 360),
|
|
36
|
+
s: clamp(_color.s, 0, 100),
|
|
37
|
+
b: clamp(_color.b, 0, 100),
|
|
38
|
+
a: clamp(_color.a ?? 1, 0, 1)
|
|
39
|
+
};
|
|
40
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
41
|
+
if (isCmyk(_color))
|
|
42
|
+
return {
|
|
43
|
+
c: clamp(_color.c, 0, 100),
|
|
44
|
+
m: clamp(_color.m, 0, 100),
|
|
45
|
+
y: clamp(_color.y, 0, 100),
|
|
46
|
+
k: clamp(_color.k, 0, 100),
|
|
47
|
+
a: clamp(_color.a ?? 1, 0, 1)
|
|
48
|
+
};
|
|
49
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
50
|
+
if (isXyz(_color))
|
|
51
|
+
return {
|
|
52
|
+
x: _color.x,
|
|
53
|
+
y: _color.y,
|
|
54
|
+
z: _color.z,
|
|
55
|
+
a: clamp(_color.a ?? 1, 0, 1)
|
|
56
|
+
};
|
|
57
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
58
|
+
if (isLab(_color))
|
|
59
|
+
return {
|
|
60
|
+
l: clamp(_color.l, 0, 100),
|
|
61
|
+
a: _color.a,
|
|
62
|
+
b: _color.b,
|
|
63
|
+
al: clamp(_color.al ?? 1, 0, 1)
|
|
64
|
+
};
|
|
65
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
66
|
+
if (isLch(_color))
|
|
67
|
+
return {
|
|
68
|
+
l: clamp(_color.l, 0, 100),
|
|
69
|
+
c: Math.max(0, _color.c),
|
|
70
|
+
h: clamp(_color.h, 0, 360),
|
|
71
|
+
a: clamp(_color.a ?? 1, 0, 1)
|
|
72
|
+
};
|
|
73
|
+
if (isCssColor(_color))
|
|
74
|
+
return tidy(toRgb(_color));
|
|
75
|
+
if (isHex(_color))
|
|
76
|
+
return toHex(tidy(toRgb(_color)));
|
|
77
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
78
|
+
const _typecheck = true;
|
|
79
|
+
throw new Error(`Invalid color input: ${unknownToString(_color)}`);
|
|
80
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { tidy } from './index.js';
|
|
3
|
+
describe('tidy', () => {
|
|
4
|
+
it('clamps RGB values to valid range', () => {
|
|
5
|
+
const result = tidy({ r: 300, g: -10, b: 128 });
|
|
6
|
+
expect(result).toMatchObject({ r: 255, g: 0, b: 128 });
|
|
7
|
+
});
|
|
8
|
+
it('clamps alpha to 0-1 range', () => {
|
|
9
|
+
const result = tidy({ r: 128, g: 128, b: 128, a: 2 });
|
|
10
|
+
expect(result).toMatchObject({ a: 1 });
|
|
11
|
+
});
|
|
12
|
+
it('preserves valid RGB colors', () => {
|
|
13
|
+
const color = { r: 128, g: 128, b: 128, a: 0.5 };
|
|
14
|
+
const result = tidy(color);
|
|
15
|
+
expect(result).toEqual({ r: 128, g: 128, b: 128, a: 0.5 });
|
|
16
|
+
});
|
|
17
|
+
it('clamps HSL values to valid range', () => {
|
|
18
|
+
const result = tidy({ h: 450, s: 150, l: -10 });
|
|
19
|
+
expect(result).toMatchObject({ h: 90, s: 100, l: 0 });
|
|
20
|
+
});
|
|
21
|
+
it('wraps hue to 0-360 range', () => {
|
|
22
|
+
const result = tidy({ h: -30, s: 50, l: 50 });
|
|
23
|
+
expect(result).toMatchObject({ h: 330, s: 50, l: 50 });
|
|
24
|
+
});
|
|
25
|
+
it('clamps HSB values to valid range', () => {
|
|
26
|
+
const result = tidy({ h: 450, s: 150, b: -10 });
|
|
27
|
+
expect(result).toMatchObject({ h: 90, s: 100, b: 0 });
|
|
28
|
+
});
|
|
29
|
+
it('clamps CMYK values to valid range', () => {
|
|
30
|
+
const result = tidy({ c: 150, m: -10, y: 50, k: 50 });
|
|
31
|
+
expect(result).toMatchObject({ c: 100, m: 0, y: 50, k: 50 });
|
|
32
|
+
});
|
|
33
|
+
it('preserves color format', () => {
|
|
34
|
+
const hslColor = { h: 180, s: 50, l: 75 };
|
|
35
|
+
const result = tidy(hslColor);
|
|
36
|
+
expect(result).toHaveProperty('h');
|
|
37
|
+
expect(result).toHaveProperty('s');
|
|
38
|
+
expect(result).toHaveProperty('l');
|
|
39
|
+
});
|
|
40
|
+
it('tidies hex colors', () => {
|
|
41
|
+
const result = tidy('#ff0000');
|
|
42
|
+
expect(typeof result).toBe('string');
|
|
43
|
+
expect(result).toMatch(/^#/);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
@@ -1,26 +1,197 @@
|
|
|
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
|
-
|
|
1
|
+
import { isNonNullObject } from '../../objects/is-object/index.js';
|
|
2
|
+
import { cssColors } from '../cssColorsMap.js';
|
|
3
|
+
/**
|
|
4
|
+
* Type guard to check if a value is a valid hexadecimal color string.
|
|
5
|
+
*
|
|
6
|
+
* @param {unknown} color - The value to check.
|
|
7
|
+
* @returns {color is Hex} True if the value is a valid hex color, false otherwise.
|
|
8
|
+
*/
|
|
9
|
+
export const isHex = (color) => {
|
|
10
|
+
if (typeof color !== 'string')
|
|
11
|
+
return false;
|
|
12
|
+
if (!color.startsWith('#'))
|
|
13
|
+
return false;
|
|
14
|
+
const withoutHash = color.slice(1);
|
|
15
|
+
const withoutHashLength = withoutHash.length;
|
|
16
|
+
const allowedLengths = [3, 4, 6, 8];
|
|
17
|
+
if (!allowedLengths.includes(withoutHashLength))
|
|
18
|
+
return false;
|
|
19
|
+
return /^[0-9a-f]+$/igm.test(withoutHash);
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Type guard to check if a value is a valid RGBA color object.
|
|
23
|
+
*
|
|
24
|
+
* @param {unknown} color - The value to check.
|
|
25
|
+
* @returns {color is Rgba} True if the value is a valid RGBA color, false otherwise.
|
|
26
|
+
*/
|
|
27
|
+
export const isRgb = (color) => {
|
|
28
|
+
if (!isNonNullObject(color))
|
|
29
|
+
return false;
|
|
30
|
+
const { r, g, b, a } = color;
|
|
31
|
+
if (typeof r !== 'number')
|
|
32
|
+
return false;
|
|
33
|
+
if (typeof g !== 'number')
|
|
34
|
+
return false;
|
|
35
|
+
if (typeof b !== 'number')
|
|
36
|
+
return false;
|
|
37
|
+
if (a !== undefined && typeof a !== 'number')
|
|
38
|
+
return false;
|
|
39
|
+
return true;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Type guard to check if a value is a valid HSLA color object.
|
|
43
|
+
*
|
|
44
|
+
* @param {unknown} color - The value to check.
|
|
45
|
+
* @returns {color is Hsla} True if the value is a valid HSLA color, false otherwise.
|
|
46
|
+
*/
|
|
47
|
+
export const isHsl = (color) => {
|
|
48
|
+
if (!isNonNullObject(color))
|
|
49
|
+
return false;
|
|
50
|
+
const { h, s, l, a } = color;
|
|
51
|
+
if (typeof h !== 'number')
|
|
52
|
+
return false;
|
|
53
|
+
if (typeof s !== 'number')
|
|
54
|
+
return false;
|
|
55
|
+
if (typeof l !== 'number')
|
|
56
|
+
return false;
|
|
57
|
+
if (a !== undefined && typeof a !== 'number')
|
|
58
|
+
return false;
|
|
59
|
+
return true;
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Type guard to check if a value is a valid HSBA color object.
|
|
63
|
+
*
|
|
64
|
+
* @param {unknown} color - The value to check.
|
|
65
|
+
* @returns {color is Hsba} True if the value is a valid HSBA color, false otherwise.
|
|
66
|
+
*/
|
|
67
|
+
export const isHsb = (color) => {
|
|
68
|
+
if (!isNonNullObject(color))
|
|
69
|
+
return false;
|
|
70
|
+
const { h, s, b, a } = color;
|
|
71
|
+
if (typeof h !== 'number')
|
|
72
|
+
return false;
|
|
73
|
+
if (typeof s !== 'number')
|
|
74
|
+
return false;
|
|
75
|
+
if (typeof b !== 'number')
|
|
76
|
+
return false;
|
|
77
|
+
if (a !== undefined && typeof a !== 'number')
|
|
78
|
+
return false;
|
|
79
|
+
return true;
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* Type guard to check if a value is a valid CIELAB color object.
|
|
83
|
+
*
|
|
84
|
+
* @param {unknown} color - The value to check.
|
|
85
|
+
* @returns {color is Laba} True if the value is a valid CIELAB color, false otherwise.
|
|
86
|
+
*/
|
|
87
|
+
export const isLab = (color) => {
|
|
88
|
+
if (!isNonNullObject(color))
|
|
89
|
+
return false;
|
|
90
|
+
const { l, a, b, al } = color;
|
|
91
|
+
if (typeof l !== 'number')
|
|
92
|
+
return false;
|
|
93
|
+
if (typeof a !== 'number')
|
|
94
|
+
return false;
|
|
95
|
+
if (typeof b !== 'number')
|
|
96
|
+
return false;
|
|
97
|
+
if (al !== undefined && typeof al !== 'number')
|
|
98
|
+
return false;
|
|
99
|
+
return true;
|
|
100
|
+
};
|
|
101
|
+
/**
|
|
102
|
+
* Type guard to check if a value is a valid CIELCh color object.
|
|
103
|
+
*
|
|
104
|
+
* @param {unknown} color - The value to check.
|
|
105
|
+
* @returns {color is Lcha} True if the value is a valid CIELCh color, false otherwise.
|
|
106
|
+
*/
|
|
107
|
+
export const isLch = (color) => {
|
|
108
|
+
if (!isNonNullObject(color))
|
|
109
|
+
return false;
|
|
110
|
+
const { l, c, h, a } = color;
|
|
111
|
+
if (typeof l !== 'number')
|
|
112
|
+
return false;
|
|
113
|
+
if (typeof c !== 'number')
|
|
114
|
+
return false;
|
|
115
|
+
if (typeof h !== 'number')
|
|
116
|
+
return false;
|
|
117
|
+
if (a !== undefined && typeof a !== 'number')
|
|
118
|
+
return false;
|
|
119
|
+
return true;
|
|
120
|
+
};
|
|
121
|
+
/**
|
|
122
|
+
* Type guard to check if a value is a valid CMYK color object.
|
|
123
|
+
*
|
|
124
|
+
* @param {unknown} color - The value to check.
|
|
125
|
+
* @returns {color is Cmyka} True if the value is a valid CMYK color, false otherwise.
|
|
126
|
+
*/
|
|
127
|
+
export const isCmyk = (color) => {
|
|
128
|
+
if (!isNonNullObject(color))
|
|
129
|
+
return false;
|
|
130
|
+
const { c, m, y, k, a } = color;
|
|
131
|
+
if (typeof c !== 'number')
|
|
132
|
+
return false;
|
|
133
|
+
if (typeof m !== 'number')
|
|
134
|
+
return false;
|
|
135
|
+
if (typeof y !== 'number')
|
|
136
|
+
return false;
|
|
137
|
+
if (typeof k !== 'number')
|
|
138
|
+
return false;
|
|
139
|
+
if (a !== undefined && typeof a !== 'number')
|
|
140
|
+
return false;
|
|
141
|
+
return true;
|
|
142
|
+
};
|
|
143
|
+
/**
|
|
144
|
+
* Type guard to check if a value is a valid CIE XYZ color object.
|
|
145
|
+
*
|
|
146
|
+
* @param {unknown} color - The value to check.
|
|
147
|
+
* @returns {color is Xyza} True if the value is a valid CIE XYZ color, false otherwise.
|
|
148
|
+
*/
|
|
149
|
+
export const isXyz = (color) => {
|
|
150
|
+
if (!isNonNullObject(color))
|
|
151
|
+
return false;
|
|
152
|
+
const { x, y, z, a } = color;
|
|
153
|
+
if (typeof x !== 'number')
|
|
154
|
+
return false;
|
|
155
|
+
if (typeof y !== 'number')
|
|
156
|
+
return false;
|
|
157
|
+
if (typeof z !== 'number')
|
|
158
|
+
return false;
|
|
159
|
+
if (a !== undefined && typeof a !== 'number')
|
|
160
|
+
return false;
|
|
161
|
+
return true;
|
|
162
|
+
};
|
|
163
|
+
/**
|
|
164
|
+
* Type guard to check if a value is a valid CSS named color.
|
|
165
|
+
*
|
|
166
|
+
* @param {unknown} color - The value to check.
|
|
167
|
+
* @returns {color is CssColor} True if the value is a valid CSS named color, false otherwise.
|
|
168
|
+
*/
|
|
169
|
+
export const isCssColor = (color) => typeof color === 'string'
|
|
170
|
+
&& cssColors[color] !== undefined;
|
|
171
|
+
/**
|
|
172
|
+
* Type guard to check if a value is any valid color format.
|
|
173
|
+
*
|
|
174
|
+
* @param {unknown} color - The value to check.
|
|
175
|
+
* @returns {color is Color} True if the value is a valid color in any supported format, false otherwise.
|
|
176
|
+
*/
|
|
177
|
+
export const isColor = (color) => {
|
|
178
|
+
if (isHex(color))
|
|
179
|
+
return true;
|
|
180
|
+
if (isCssColor(color))
|
|
181
|
+
return true;
|
|
182
|
+
if (isRgb(color))
|
|
183
|
+
return true;
|
|
184
|
+
if (isHsl(color))
|
|
185
|
+
return true;
|
|
186
|
+
if (isHsb(color))
|
|
187
|
+
return true;
|
|
188
|
+
if (isCmyk(color))
|
|
189
|
+
return true;
|
|
190
|
+
if (isXyz(color))
|
|
191
|
+
return true;
|
|
192
|
+
if (isLab(color))
|
|
193
|
+
return true;
|
|
194
|
+
if (isLch(color))
|
|
195
|
+
return true;
|
|
196
|
+
return false;
|
|
26
197
|
};
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { isHex, isRgb, isHsl, isHsb, isCmyk, isXyz, isLab, isLch, isCssColor, isColor } from './index.js';
|
|
3
|
+
describe('isHex', () => {
|
|
4
|
+
it('returns true for valid hex colors', () => {
|
|
5
|
+
expect(isHex('#ff0000')).toBe(true);
|
|
6
|
+
expect(isHex('#f00')).toBe(true);
|
|
7
|
+
expect(isHex('#ff0000ff')).toBe(true);
|
|
8
|
+
expect(isHex('#f00f')).toBe(true);
|
|
9
|
+
});
|
|
10
|
+
it('returns false for invalid hex colors', () => {
|
|
11
|
+
expect(isHex('ff0000')).toBe(false);
|
|
12
|
+
expect(isHex('#gg0000')).toBe(false);
|
|
13
|
+
expect(isHex('#ff')).toBe(false);
|
|
14
|
+
expect(isHex(123)).toBe(false);
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
describe('isRgb', () => {
|
|
18
|
+
it('returns true for valid RGB colors', () => {
|
|
19
|
+
expect(isRgb({ r: 255, g: 128, b: 64 })).toBe(true);
|
|
20
|
+
expect(isRgb({ r: 255, g: 128, b: 64, a: 0.5 })).toBe(true);
|
|
21
|
+
});
|
|
22
|
+
it('returns false for invalid RGB colors', () => {
|
|
23
|
+
expect(isRgb({ r: 255, g: 128 })).toBe(false);
|
|
24
|
+
expect(isRgb({ r: '255', g: 128, b: 64 })).toBe(false);
|
|
25
|
+
expect(isRgb(null)).toBe(false);
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
describe('isHsl', () => {
|
|
29
|
+
it('returns true for valid HSL colors', () => {
|
|
30
|
+
expect(isHsl({ h: 180, s: 50, l: 75 })).toBe(true);
|
|
31
|
+
expect(isHsl({ h: 180, s: 50, l: 75, a: 0.5 })).toBe(true);
|
|
32
|
+
});
|
|
33
|
+
it('returns false for invalid HSL colors', () => {
|
|
34
|
+
expect(isHsl({ h: 180, s: 50 })).toBe(false);
|
|
35
|
+
expect(isHsl({ h: '180', s: 50, l: 75 })).toBe(false);
|
|
36
|
+
expect(isHsl(null)).toBe(false);
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
describe('isHsb', () => {
|
|
40
|
+
it('returns true for valid HSB colors', () => {
|
|
41
|
+
expect(isHsb({ h: 180, s: 50, b: 75 })).toBe(true);
|
|
42
|
+
expect(isHsb({ h: 180, s: 50, b: 75, a: 0.5 })).toBe(true);
|
|
43
|
+
});
|
|
44
|
+
it('returns false for invalid HSB colors', () => {
|
|
45
|
+
expect(isHsb({ h: 180, s: 50 })).toBe(false);
|
|
46
|
+
expect(isHsb({ h: '180', s: 50, b: 75 })).toBe(false);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
describe('isCmyk', () => {
|
|
50
|
+
it('returns true for valid CMYK colors', () => {
|
|
51
|
+
expect(isCmyk({ c: 50, m: 50, y: 50, k: 50 })).toBe(true);
|
|
52
|
+
expect(isCmyk({ c: 50, m: 50, y: 50, k: 50, a: 0.5 })).toBe(true);
|
|
53
|
+
});
|
|
54
|
+
it('returns false for invalid CMYK colors', () => {
|
|
55
|
+
expect(isCmyk({ c: 50, m: 50, y: 50 })).toBe(false);
|
|
56
|
+
expect(isCmyk({ c: '50', m: 50, y: 50, k: 50 })).toBe(false);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
describe('isXyz', () => {
|
|
60
|
+
it('returns true for valid XYZ colors', () => {
|
|
61
|
+
expect(isXyz({ x: 50, y: 50, z: 50 })).toBe(true);
|
|
62
|
+
expect(isXyz({ x: 50, y: 50, z: 50, a: 0.5 })).toBe(true);
|
|
63
|
+
});
|
|
64
|
+
it('returns false for invalid XYZ colors', () => {
|
|
65
|
+
expect(isXyz({ x: 50, y: 50 })).toBe(false);
|
|
66
|
+
expect(isXyz({ x: '50', y: 50, z: 50 })).toBe(false);
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
describe('isLab', () => {
|
|
70
|
+
it('returns true for valid Lab colors', () => {
|
|
71
|
+
expect(isLab({ l: 50, a: 0, b: 0 })).toBe(true);
|
|
72
|
+
expect(isLab({ l: 50, a: 0, b: 0, al: 0.5 })).toBe(true);
|
|
73
|
+
});
|
|
74
|
+
it('returns false for invalid Lab colors', () => {
|
|
75
|
+
expect(isLab({ l: 50, a: 0 })).toBe(false);
|
|
76
|
+
expect(isLab({ l: '50', a: 0, b: 0 })).toBe(false);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
describe('isLch', () => {
|
|
80
|
+
it('returns true for valid LCH colors', () => {
|
|
81
|
+
expect(isLch({ l: 50, c: 50, h: 180 })).toBe(true);
|
|
82
|
+
expect(isLch({ l: 50, c: 50, h: 180, a: 0.5 })).toBe(true);
|
|
83
|
+
});
|
|
84
|
+
it('returns false for invalid LCH colors', () => {
|
|
85
|
+
expect(isLch({ l: 50, c: 50 })).toBe(false);
|
|
86
|
+
expect(isLch({ l: '50', c: 50, h: 180 })).toBe(false);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
describe('isCssColor', () => {
|
|
90
|
+
it('returns true for valid CSS color names', () => {
|
|
91
|
+
expect(isCssColor('red')).toBe(true);
|
|
92
|
+
expect(isCssColor('blue')).toBe(true);
|
|
93
|
+
});
|
|
94
|
+
it('returns false for invalid CSS color names', () => {
|
|
95
|
+
expect(isCssColor('notacolor')).toBe(false);
|
|
96
|
+
expect(isCssColor('#ff0000')).toBe(false);
|
|
97
|
+
expect(isCssColor(123)).toBe(false);
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
describe('isColor', () => {
|
|
101
|
+
it('returns true for any valid color format', () => {
|
|
102
|
+
expect(isColor('#ff0000')).toBe(true);
|
|
103
|
+
expect(isColor({ r: 255, g: 0, b: 0 })).toBe(true);
|
|
104
|
+
expect(isColor({ h: 0, s: 100, l: 50 })).toBe(true);
|
|
105
|
+
expect(isColor('red')).toBe(true);
|
|
106
|
+
});
|
|
107
|
+
it('returns false for invalid colors', () => {
|
|
108
|
+
expect(isColor('notacolor')).toBe(false);
|
|
109
|
+
expect(isColor(123)).toBe(false);
|
|
110
|
+
expect(isColor(null)).toBe(false);
|
|
111
|
+
expect(isColor({ r: 255 })).toBe(false);
|
|
112
|
+
});
|
|
113
|
+
});
|
package/agnostic/colors/types.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|