@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
package/agnostic/html/index.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
export * as getNodeAncestors from './get-node-ancestors/index.js'
|
|
2
2
|
export * as getPositionInsideParent from './get-position-inside-parent/index.js'
|
|
3
|
+
export * as hyperJson from './hyper-json/index.js'
|
|
3
4
|
export * as insertNode from './insert-node/index.js'
|
|
4
5
|
export * as placeholders from './placeholders/index.js'
|
|
5
|
-
export * as hyperJson from './hyper-json/index.js'
|
|
6
6
|
export * as replaceInElement from './replace-in-element/index.js'
|
|
7
|
-
export * as selectorToElement from './selector-to-element/index.js'
|
|
8
7
|
export * as stringToNodes from './string-to-nodes/index.js'
|
|
8
|
+
export * as selectorToElement from './selector-to-element/index.js'
|
package/agnostic/html/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
export * as getNodeAncestors from './get-node-ancestors/index.js'
|
|
2
2
|
export * as getPositionInsideParent from './get-position-inside-parent/index.js'
|
|
3
|
+
export * as hyperJson from './hyper-json/index.js'
|
|
3
4
|
export * as insertNode from './insert-node/index.js'
|
|
4
5
|
export * as placeholders from './placeholders/index.js'
|
|
5
|
-
export * as hyperJson from './hyper-json/index.js'
|
|
6
6
|
export * as replaceInElement from './replace-in-element/index.js'
|
|
7
|
-
export * as selectorToElement from './selector-to-element/index.js'
|
|
8
7
|
export * as stringToNodes from './string-to-nodes/index.js'
|
|
8
|
+
export * as selectorToElement from './selector-to-element/index.js'
|
|
@@ -1,17 +1,28 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Inserts a DOM node at a specific position relative to a reference node.
|
|
3
|
+
*
|
|
4
|
+
* @param {Node} node - The node to insert.
|
|
5
|
+
* @param {InsertNodePosition} position - The insertion position relative to the reference node.
|
|
6
|
+
* @param {Node} reference - The reference node used to determine the insertion point.
|
|
7
|
+
* @returns {void}
|
|
8
|
+
*/
|
|
9
|
+
export function insertNode(node, position, reference) {
|
|
10
|
+
if (position === 'after') {
|
|
11
|
+
if (reference.nextSibling !== null)
|
|
12
|
+
reference.parentNode?.insertBefore(node, reference.nextSibling);
|
|
13
|
+
else
|
|
14
|
+
reference.parentNode?.appendChild(node);
|
|
15
|
+
}
|
|
16
|
+
else if (position === 'before') {
|
|
17
|
+
reference.parentNode?.insertBefore(node, reference);
|
|
18
|
+
}
|
|
19
|
+
else if (position === 'startof') {
|
|
20
|
+
if (reference.firstChild !== null)
|
|
21
|
+
reference.insertBefore(node, reference.firstChild);
|
|
22
|
+
else
|
|
23
|
+
reference.appendChild(node);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
reference.appendChild(node);
|
|
27
|
+
}
|
|
14
28
|
}
|
|
15
|
-
export {
|
|
16
|
-
insertNode
|
|
17
|
-
};
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { insertNode } from './index.js';
|
|
3
|
+
import { JSDOM } from 'jsdom';
|
|
4
|
+
import * as Window from '../../misc/crossenv/window/index.js';
|
|
5
|
+
describe('insertNode', () => {
|
|
6
|
+
beforeEach(() => Window.set(new JSDOM().window));
|
|
7
|
+
afterEach(() => Window.unset());
|
|
8
|
+
it('inserts node before reference node', () => {
|
|
9
|
+
const { document } = Window.get();
|
|
10
|
+
const parent = document.createElement('div');
|
|
11
|
+
const reference = document.createElement('span');
|
|
12
|
+
const node = document.createElement('p');
|
|
13
|
+
parent.appendChild(reference);
|
|
14
|
+
insertNode(node, 'before', reference);
|
|
15
|
+
expect(parent.childNodes[0]).toBe(node);
|
|
16
|
+
expect(parent.childNodes[1]).toBe(reference);
|
|
17
|
+
});
|
|
18
|
+
it('inserts node after reference node', () => {
|
|
19
|
+
const { document } = Window.get();
|
|
20
|
+
const parent = document.createElement('div');
|
|
21
|
+
const reference = document.createElement('span');
|
|
22
|
+
const node = document.createElement('p');
|
|
23
|
+
parent.appendChild(reference);
|
|
24
|
+
insertNode(node, 'after', reference);
|
|
25
|
+
expect(parent.childNodes[0]).toBe(reference);
|
|
26
|
+
expect(parent.childNodes[1]).toBe(node);
|
|
27
|
+
});
|
|
28
|
+
it('inserts node at end when inserting after last child', () => {
|
|
29
|
+
const { document } = Window.get();
|
|
30
|
+
const parent = document.createElement('div');
|
|
31
|
+
const reference = document.createElement('span');
|
|
32
|
+
const node = document.createElement('p');
|
|
33
|
+
parent.appendChild(reference);
|
|
34
|
+
insertNode(node, 'after', reference);
|
|
35
|
+
expect(parent.lastChild).toBe(node);
|
|
36
|
+
});
|
|
37
|
+
it('inserts node as first child with startof', () => {
|
|
38
|
+
const { document } = Window.get();
|
|
39
|
+
const parent = document.createElement('div');
|
|
40
|
+
const existing = document.createElement('span');
|
|
41
|
+
const node = document.createElement('p');
|
|
42
|
+
parent.appendChild(existing);
|
|
43
|
+
insertNode(node, 'startof', parent);
|
|
44
|
+
expect(parent.firstChild).toBe(node);
|
|
45
|
+
expect(parent.childNodes[1]).toBe(existing);
|
|
46
|
+
});
|
|
47
|
+
it('inserts node as last child with endof', () => {
|
|
48
|
+
const { document } = Window.get();
|
|
49
|
+
const parent = document.createElement('div');
|
|
50
|
+
const existing = document.createElement('span');
|
|
51
|
+
const node = document.createElement('p');
|
|
52
|
+
parent.appendChild(existing);
|
|
53
|
+
insertNode(node, 'endof', parent);
|
|
54
|
+
expect(parent.lastChild).toBe(node);
|
|
55
|
+
expect(parent.firstChild).toBe(existing);
|
|
56
|
+
});
|
|
57
|
+
it('inserts node in empty parent with startof', () => {
|
|
58
|
+
const { document } = Window.get();
|
|
59
|
+
const parent = document.createElement('div');
|
|
60
|
+
const node = document.createElement('p');
|
|
61
|
+
insertNode(node, 'startof', parent);
|
|
62
|
+
expect(parent.firstChild).toBe(node);
|
|
63
|
+
expect(parent.lastChild).toBe(node);
|
|
64
|
+
});
|
|
65
|
+
it('inserts node in empty parent with endof', () => {
|
|
66
|
+
const { document } = Window.get();
|
|
67
|
+
const parent = document.createElement('div');
|
|
68
|
+
const node = document.createElement('p');
|
|
69
|
+
insertNode(node, 'endof', parent);
|
|
70
|
+
expect(parent.firstChild).toBe(node);
|
|
71
|
+
expect(parent.lastChild).toBe(node);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
@@ -1,37 +1,34 @@
|
|
|
1
|
-
//
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
// [WIP] maybe this util is not that useful
|
|
2
|
+
// [WIP] should return Nodes, not strings
|
|
3
|
+
export const EightKiloByteOfLoremIpsumSentences = 'Etiam consequat interdum elit eu interdum. Nunc eu nulla vel arcu mattis venenatis sit amet gravida sem. Mauris pretium aliquam augue vitae tempor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nam mollis in ipsum nec efficitur. Nullam imperdiet et urna vitae suscipit. In hac habitasse platea dictumst. Nullam lacinia commodo enim non iaculis. Nam elementum tellus ac lectus aliquam porta. Mauris ut lorem nec magna porttitor efficitur sed sed odio. Ut in dapibus nulla, non eleifend elit. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Maecenas posuere leo neque, a luctus quam feugiat in. Phasellus lobortis egestas cursus. In sit amet massa et sem scelerisque facilisis quis fringilla felis. Praesent purus velit, vehicula id orci ac, placerat congue quam. Cras vulputate nisi eu justo accumsan malesuada. Vestibulum ex urna, volutpat non quam in, vulputate pellentesque est. Pellentesque interdum orci in quam finibus faucibus. In eget lectus augue. Vestibulum lobortis vulputate odio. Nam vitae felis in lorem dignissim venenatis. Curabitur bibendum, est quis tempor efficitur, magna orci facilisis erat, id rhoncus massa ante non tellus. Etiam id gravida elit. Mauris ut semper risus. Nulla sed interdum lorem. Nullam eu consectetur purus. Praesent ut enim diam. Nulla hendrerit dapibus eros, sit amet rhoncus eros consequat aliquam. Duis viverra erat vel commodo facilisis. Quisque hendrerit posuere sapien, id cursus ligula rhoncus vitae. Ut et turpis augue. Aliquam augue lorem, fringilla at magna eu, egestas sagittis ex. Vestibulum elementum diam facilisis elit ultrices, eget viverra massa venenatis. Nullam finibus ligula est. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nam condimentum, justo pulvinar posuere tincidunt, mi libero convallis sapien, id consectetur nunc tellus eget nisi. Fusce tincidunt sit amet enim vitae feugiat. Etiam in nulla vitae orci consequat vulputate. Vestibulum sodales urna sit amet velit elementum, vel fringilla eros iaculis. Vestibulum gravida tempus nulla, at vulputate nunc aliquam vitae. Phasellus ac augue et augue finibus congue ut nec nunc. Ut in dictum lectus, eget efficitur dui. Suspendisse bibendum congue arcu, sit amet maximus felis dictum sit amet. Morbi scelerisque feugiat risus, id pellentesque elit cursus nec. Vivamus at erat id magna sagittis cursus vitae eu magna. Integer pretium nec lorem at consectetur. Integer id justo vitae nunc gravida posuere eu vel magna. Donec ex nunc, condimentum id laoreet et, scelerisque nec enim. Sed venenatis, augue vel posuere ullamcorper, lorem velit auctor erat, a auctor mi odio id velit. Donec justo erat, tempor ut diam sed, scelerisque aliquam dolor. Donec erat dui, dictum a tortor sit amet, pellentesque blandit risus. Donec tincidunt ligula ex, vel tincidunt leo posuere sit amet. Curabitur lacinia blandit pellentesque. Donec fringilla aliquam purus ac porta. Fusce faucibus convallis leo, ut aliquet libero maximus nec. Morbi ac magna lorem. Quisque suscipit quis nisi interdum condimentum. Pellentesque imperdiet lorem diam, eu molestie ipsum scelerisque vel. Vivamus hendrerit, ipsum id sollicitudin pharetra, justo justo laoreet lorem, ac scelerisque turpis justo vitae augue. Nullam lacinia magna nec neque auctor scelerisque. Nunc sit amet lacus condimentum, interdum nisl eu, pharetra lorem. Morbi consectetur eros ac nisi facilisis, facilisis placerat magna aliquet. Donec bibendum leo ac est aliquam dictum. Quisque commodo magna risus, ut rhoncus ex feugiat nec. Sed vel tellus porta, feugiat sem quis, facilisis enim. Quisque accumsan imperdiet felis id laoreet. Etiam condimentum at ligula nec vehicula. Phasellus eget placerat quam. Cras efficitur mauris id ex tempus porttitor. Quisque pulvinar tellus id tempus ultricies. Lorem ipsum dolor sit amet, consectetur adipiscing elit. In non erat justo. Nulla blandit placerat hendrerit. Sed blandit mattis magna eget sodales. Morbi eget accumsan sapien. Sed ornare interdum tortor iaculis volutpat. Maecenas vel tortor quis urna placerat mollis. Mauris ultrices, magna sit amet molestie sagittis, libero mi tincidunt diam, eu scelerisque nulla est vel dolor. Aenean congue congue eros bibendum elementum. Phasellus lobortis faucibus eros, et cursus lectus ultricies et. Vivamus augue metus, iaculis eget egestas in, tincidunt et lectus. Mauris varius arcu at cursus auctor. Curabitur eget nunc tellus. In eget tempor odio, vitae dictum massa. Proin in cursus est. Curabitur lobortis, velit eu accumsan sollicitudin, orci orci aliquam velit, ac iaculis massa justo sit amet massa. Duis a mauris iaculis, aliquam ipsum vel, vulputate mauris. Sed ex augue, cursus a dapibus sed, iaculis lacinia quam. Vivamus sit amet justo tellus. Nunc ac neque mattis, euismod velit id, feugiat massa. Etiam vitae auctor orci. Pellentesque sollicitudin est nibh, vitae scelerisque lacus sagittis eu. Morbi convallis metus eu enim gravida, non finibus enim accumsan. In quis pharetra justo, et tempor nibh. Duis non interdum diam. Vestibulum nec felis rhoncus, pharetra ipsum eu, rutrum magna. Integer dignissim odio eu mi finibus sollicitudin. Sed ut magna a nulla porttitor lobortis in id nibh. Pellentesque in lobortis ligula, vel malesuada neque. Aenean commodo arcu nunc, et posuere eros vulputate et. Mauris vestibulum euismod molestie. Vestibulum luctus sapien sollicitudin, cursus ante vel, varius massa. Mauris non magna pharetra, luctus felis sed, dapibus massa. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec posuere sapien diam, vitae porttitor nisi dictum sed. Maecenas sit amet eleifend odio. In luctus, neque eget eleifend ultricies, neque ante vestibulum leo, non ullamcorper enim orci vestibulum erat. Phasellus bibendum urna at aliquet elementum. Nulla facilisi. Sed porttitor lacus id hendrerit iaculis. Vivamus facilisis ex eget odio malesuada bibendum. Vestibulum fermentum at sem nec dignissim. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nunc faucibus augue id odio ornare, et maximus quam placerat. Nullam rutrum enim justo, id hendrerit felis faucibus sed. Aenean id nulla arcu. Nulla vitae eleifend ante. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Quisque ipsum risus, cursus at ligula convallis, interdum fringilla quam. Curabitur libero sapien, mollis in consectetur sit amet, accumsan vel justo. Nulla a eros sit amet nibh pharetra ultricies. Proin et dapibus mauris. Maecenas at lacinia felis. Vestibulum consectetur vestibulum ante. Interdum et malesuada fames ac ante ipsum primis in faucibus. In imperdiet ipsum ac facilisis interdum. Nullam vestibulum dictum vestibulum. Cras pharetra vehicula neque.'.split('.').map(e => e.trim());
|
|
4
|
+
export const generateSentence = () => {
|
|
5
|
+
const pos = Math.floor(Math.random() * EightKiloByteOfLoremIpsumSentences.length);
|
|
6
|
+
return EightKiloByteOfLoremIpsumSentences[pos];
|
|
6
7
|
};
|
|
7
|
-
|
|
8
|
-
|
|
8
|
+
export const generateSentences = (amount = 1) => {
|
|
9
|
+
return new Array(amount)
|
|
10
|
+
.fill(null)
|
|
11
|
+
.map(generateSentence);
|
|
9
12
|
};
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
export const generateTitle = () => `<h1 class="title">${generateSentence()}</h1>`;
|
|
14
|
+
export const generateIntertitle = () => `<h2 class="intertitle">${generateSentence()}</h2>`;
|
|
15
|
+
export const generateParagraph = () => {
|
|
16
|
+
const length = Math.floor(Math.random() * 5) + 3;
|
|
17
|
+
const sentencesArr = new Array(length)
|
|
18
|
+
.fill(null)
|
|
19
|
+
.map(generateSentence);
|
|
20
|
+
return `<p class="paragraph">${sentencesArr.join('. ')}</p>`;
|
|
16
21
|
};
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
export const generateContentPage = (len = 1) => {
|
|
23
|
+
const length = (Math.floor(Math.random() * 3) + 3) * Math.round(len);
|
|
24
|
+
const pageBody = new Array(length).fill(null).map(() => {
|
|
25
|
+
if (Math.random() < 0.2)
|
|
26
|
+
return generateIntertitle();
|
|
27
|
+
return generateParagraph();
|
|
28
|
+
}).join('');
|
|
29
|
+
return `<div class="content-page">
|
|
24
30
|
${generateTitle()}
|
|
25
31
|
${pageBody}
|
|
26
32
|
${generateParagraph()}
|
|
27
33
|
</div>`;
|
|
28
34
|
};
|
|
29
|
-
export {
|
|
30
|
-
EightKiloByteOfLoremIpsumSentences,
|
|
31
|
-
generateContentPage,
|
|
32
|
-
generateIntertitle,
|
|
33
|
-
generateParagraph,
|
|
34
|
-
generateSentence,
|
|
35
|
-
generateSentences,
|
|
36
|
-
generateTitle
|
|
37
|
-
};
|
|
@@ -1,49 +1,32 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { getNodeAncestors } from '../get-node-ancestors/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Replaces specific descendant nodes of a given element according to a
|
|
4
|
+
* replacement map.
|
|
5
|
+
*
|
|
6
|
+
* Only entries whose target nodes are descendants of `inputElement`
|
|
7
|
+
* are applied. Each target node is removed after its replacement node(s)
|
|
8
|
+
* are inserted in its place.
|
|
9
|
+
*
|
|
10
|
+
* @param {Element} inputElement - The root element within which replacements are applied.
|
|
11
|
+
* @param {Map<Node, Node | NodeListOf<Node>>} replaceMap
|
|
12
|
+
* - A map associating nodes to be replaced with either a single replacement
|
|
13
|
+
* node or a list of replacement nodes.
|
|
14
|
+
* @returns {Element} The original `inputElement`, after replacements have been applied.
|
|
15
|
+
*/
|
|
16
|
+
export function replaceInElement(inputElement, replaceMap) {
|
|
17
|
+
const actualReplaceMap = new Map(Array.from(replaceMap).filter(([toReplace]) => {
|
|
18
|
+
const toReplaceAncestors = getNodeAncestors(toReplace);
|
|
19
|
+
return toReplaceAncestors.includes(inputElement);
|
|
20
|
+
}));
|
|
21
|
+
actualReplaceMap.forEach((replacer, toReplace) => {
|
|
22
|
+
if ('nodeType' in replacer) {
|
|
23
|
+
toReplace.parentNode?.insertBefore(replacer, toReplace);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
const replacerNodes = Array.from(replacer);
|
|
27
|
+
replacerNodes.forEach(rpl => toReplace.parentNode?.insertBefore(rpl, toReplace));
|
|
28
|
+
}
|
|
29
|
+
toReplace.parentNode?.removeChild(toReplace);
|
|
30
|
+
});
|
|
31
|
+
return inputElement;
|
|
4
32
|
}
|
|
5
|
-
var _window = exists() ? globalThis.window ?? null : null;
|
|
6
|
-
function get() {
|
|
7
|
-
if (_window !== null) return _window;
|
|
8
|
-
const message = "window is undefined. Please call Window.setWindow(windowObj) before using Window.get.";
|
|
9
|
-
throw new Error(message);
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
// src/agnostic/html/get-node-ancestors/index.ts
|
|
13
|
-
function getNodeAncestors(node, traverseShadowRoots) {
|
|
14
|
-
const returned = [];
|
|
15
|
-
let currentNode = node;
|
|
16
|
-
const { ShadowRoot } = get();
|
|
17
|
-
while (currentNode !== null) {
|
|
18
|
-
returned.push(currentNode);
|
|
19
|
-
const parentNode = currentNode.parentNode;
|
|
20
|
-
if (parentNode instanceof ShadowRoot) {
|
|
21
|
-
returned.push(parentNode);
|
|
22
|
-
currentNode = traverseShadowRoots === true ? parentNode.host : null;
|
|
23
|
-
continue;
|
|
24
|
-
}
|
|
25
|
-
currentNode = currentNode.parentElement;
|
|
26
|
-
}
|
|
27
|
-
return returned;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
// src/agnostic/html/replace-in-element/index.ts
|
|
31
|
-
function replaceInElement(inputElement, replaceMap) {
|
|
32
|
-
const actualReplaceMap = new Map(Array.from(replaceMap).filter(([toReplace]) => {
|
|
33
|
-
const toReplaceAncestors = getNodeAncestors(toReplace);
|
|
34
|
-
return toReplaceAncestors.includes(inputElement);
|
|
35
|
-
}));
|
|
36
|
-
actualReplaceMap.forEach((replacer, toReplace) => {
|
|
37
|
-
if ("nodeType" in replacer) {
|
|
38
|
-
toReplace.parentNode?.insertBefore(replacer, toReplace);
|
|
39
|
-
} else {
|
|
40
|
-
const replacerNodes = Array.from(replacer);
|
|
41
|
-
replacerNodes.forEach((rpl) => toReplace.parentNode?.insertBefore(rpl, toReplace));
|
|
42
|
-
}
|
|
43
|
-
toReplace.parentNode?.removeChild(toReplace);
|
|
44
|
-
});
|
|
45
|
-
return inputElement;
|
|
46
|
-
}
|
|
47
|
-
export {
|
|
48
|
-
replaceInElement
|
|
49
|
-
};
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { JSDOM } from 'jsdom';
|
|
3
|
+
import { replaceInElement } from './index.js';
|
|
4
|
+
import * as Window from '../../misc/crossenv/window/index.js';
|
|
5
|
+
describe('replaceInElement', () => {
|
|
6
|
+
beforeEach(() => Window.set(new JSDOM().window));
|
|
7
|
+
afterEach(() => Window.unset());
|
|
8
|
+
it('replaces a single node with another node', () => {
|
|
9
|
+
const { document } = Window.get();
|
|
10
|
+
const parent = document.createElement('div');
|
|
11
|
+
const toReplace = document.createElement('span');
|
|
12
|
+
const replacement = document.createElement('p');
|
|
13
|
+
parent.appendChild(toReplace);
|
|
14
|
+
const replaceMap = new Map([[toReplace, replacement]]);
|
|
15
|
+
replaceInElement(parent, replaceMap);
|
|
16
|
+
expect(parent.childNodes.length).toBe(1);
|
|
17
|
+
expect(parent.firstChild).toBe(replacement);
|
|
18
|
+
expect(parent.contains(toReplace)).toBe(false);
|
|
19
|
+
});
|
|
20
|
+
it('replaces multiple nodes', () => {
|
|
21
|
+
const { document } = Window.get();
|
|
22
|
+
const parent = document.createElement('div');
|
|
23
|
+
const node1 = document.createElement('span');
|
|
24
|
+
const node2 = document.createElement('span');
|
|
25
|
+
const replacement1 = document.createElement('p');
|
|
26
|
+
const replacement2 = document.createElement('div');
|
|
27
|
+
parent.appendChild(node1);
|
|
28
|
+
parent.appendChild(node2);
|
|
29
|
+
const replaceMap = new Map([
|
|
30
|
+
[node1, replacement1],
|
|
31
|
+
[node2, replacement2]
|
|
32
|
+
]);
|
|
33
|
+
replaceInElement(parent, replaceMap);
|
|
34
|
+
expect(parent.childNodes.length).toBe(2);
|
|
35
|
+
expect(parent.childNodes[0]).toBe(replacement1);
|
|
36
|
+
expect(parent.childNodes[1]).toBe(replacement2);
|
|
37
|
+
});
|
|
38
|
+
it('replaces node with multiple nodes', () => {
|
|
39
|
+
const { document } = Window.get();
|
|
40
|
+
const parent = document.createElement('div');
|
|
41
|
+
const toReplace = document.createElement('span');
|
|
42
|
+
const replacement1 = document.createElement('p');
|
|
43
|
+
const replacement2 = document.createElement('div');
|
|
44
|
+
parent.appendChild(toReplace);
|
|
45
|
+
const fragment = document.createDocumentFragment();
|
|
46
|
+
fragment.appendChild(replacement1);
|
|
47
|
+
fragment.appendChild(replacement2);
|
|
48
|
+
const nodeList = fragment.childNodes;
|
|
49
|
+
const replaceMap = new Map([[toReplace, nodeList]]);
|
|
50
|
+
replaceInElement(parent, replaceMap);
|
|
51
|
+
expect(parent.childNodes.length).toBe(2);
|
|
52
|
+
expect(parent.childNodes[0]).toBe(replacement1);
|
|
53
|
+
expect(parent.childNodes[1]).toBe(replacement2);
|
|
54
|
+
});
|
|
55
|
+
it('only replaces nodes that are descendants', () => {
|
|
56
|
+
const { document } = Window.get();
|
|
57
|
+
const parent = document.createElement('div');
|
|
58
|
+
const child = document.createElement('span');
|
|
59
|
+
const orphan = document.createElement('span');
|
|
60
|
+
const replacement = document.createElement('p');
|
|
61
|
+
parent.appendChild(child);
|
|
62
|
+
const replaceMap = new Map([
|
|
63
|
+
[child, replacement],
|
|
64
|
+
[orphan, document.createElement('div')]
|
|
65
|
+
]);
|
|
66
|
+
replaceInElement(parent, replaceMap);
|
|
67
|
+
expect(parent.contains(replacement)).toBe(true);
|
|
68
|
+
expect(parent.contains(orphan)).toBe(false);
|
|
69
|
+
});
|
|
70
|
+
it('returns the input element', () => {
|
|
71
|
+
const { document } = Window.get();
|
|
72
|
+
const parent = document.createElement('div');
|
|
73
|
+
const child = document.createElement('span');
|
|
74
|
+
const replacement = document.createElement('p');
|
|
75
|
+
parent.appendChild(child);
|
|
76
|
+
const replaceMap = new Map([[child, replacement]]);
|
|
77
|
+
const result = replaceInElement(parent, replaceMap);
|
|
78
|
+
expect(result).toBe(parent);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
@@ -1,40 +1,54 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
/* eslint-disable no-useless-escape */
|
|
2
|
+
import * as Window from '../../misc/crossenv/window/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Creates a DOM element from a CSS-like selector string.
|
|
5
|
+
* Tag name defaults to div.
|
|
6
|
+
*
|
|
7
|
+
* Supports simple tag, ID, class, and attribute syntax:
|
|
8
|
+
* - Tag name (e.g., `"div"`)
|
|
9
|
+
* - ID (e.g., `"#myId"`)
|
|
10
|
+
* - Classes (e.g., `".class1.class2"`)
|
|
11
|
+
* - Attributes (e.g., `"[attr=value]"`)
|
|
12
|
+
*
|
|
13
|
+
* @param {string} selector - The selector string used to construct the element.
|
|
14
|
+
* @returns {Element} A newly created DOM element corresponding to the selector.
|
|
15
|
+
*
|
|
16
|
+
* @throws Will throw an error if no document object is available for element creation.
|
|
17
|
+
*/
|
|
18
|
+
export function selectorToElement(selector) {
|
|
19
|
+
// RegExps
|
|
20
|
+
const tagRegexp = /^[A-Za-z]+/;
|
|
21
|
+
// The dot is apparently a valid character but is prevented here
|
|
22
|
+
// in order to be able to match class elements
|
|
23
|
+
const idRegexp = /#[A-Za-z]+[\w\-\:]*/;
|
|
24
|
+
const classRegexp = /\.[A-Za-z]+[\w\-]*/g;
|
|
25
|
+
const attributeRegexp = /\[[A-Za-z]+[\w\-]*(="[\w\-]+")?\]/g;
|
|
26
|
+
// Matched
|
|
27
|
+
const matchedTags = selector.match(tagRegexp) ?? [];
|
|
28
|
+
const matchedIds = selector.match(idRegexp) ?? [];
|
|
29
|
+
const matchedClasses = selector.match(classRegexp) ?? [];
|
|
30
|
+
const matchedAttrs = selector.match(attributeRegexp) ?? [];
|
|
31
|
+
// Extracted
|
|
32
|
+
const tag = matchedTags[matchedTags.length - 1] ?? 'div';
|
|
33
|
+
const id = matchedIds.length > 0
|
|
34
|
+
? matchedIds[matchedIds.length - 1]?.replace(/^#/, '') ?? null
|
|
35
|
+
: null;
|
|
36
|
+
const classes = matchedClasses.map(matchedClass => matchedClass.replace(/^\./, ''));
|
|
37
|
+
const attributes = matchedAttrs.map(matchedAttr => matchedAttr
|
|
38
|
+
.replace(/^\[/, '')
|
|
39
|
+
.replace(/\]$/, '')
|
|
40
|
+
.split('='));
|
|
41
|
+
// Returning
|
|
42
|
+
const element = Window.get().document.createElement(tag);
|
|
43
|
+
if (id !== null) {
|
|
44
|
+
element.id = id;
|
|
45
|
+
}
|
|
46
|
+
element.classList.add(...classes);
|
|
47
|
+
attributes.forEach(([name, value = '']) => {
|
|
48
|
+
if (name === undefined)
|
|
49
|
+
return;
|
|
50
|
+
const cleanValue = value.replace(/^"(.*)"$/, '$1');
|
|
51
|
+
element.setAttribute(name, cleanValue);
|
|
52
|
+
});
|
|
53
|
+
return element;
|
|
4
54
|
}
|
|
5
|
-
var _window = exists() ? globalThis.window ?? null : null;
|
|
6
|
-
function get() {
|
|
7
|
-
if (_window !== null) return _window;
|
|
8
|
-
const message = "window is undefined. Please call Window.setWindow(windowObj) before using Window.get.";
|
|
9
|
-
throw new Error(message);
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
// src/agnostic/html/selector-to-element/index.ts
|
|
13
|
-
function selectorToElement(selector) {
|
|
14
|
-
const tagRegexp = /^[A-Za-z]+/;
|
|
15
|
-
const idRegexp = /#[A-Za-z]+[\w\-\:]*/;
|
|
16
|
-
const classRegexp = /\.[A-Za-z]+[\w\-]*/g;
|
|
17
|
-
const attributeRegexp = /\[[A-Za-z]+[\w\-]*(="[\w\-]+")?\]/g;
|
|
18
|
-
const matchedTags = selector.match(tagRegexp) ?? [];
|
|
19
|
-
const matchedIds = selector.match(idRegexp) ?? [];
|
|
20
|
-
const matchedClasses = selector.match(classRegexp) ?? [];
|
|
21
|
-
const matchedAttrs = selector.match(attributeRegexp) ?? [];
|
|
22
|
-
const tag = matchedTags[matchedTags.length - 1] ?? "div";
|
|
23
|
-
const id = matchedIds.length > 0 ? matchedIds[matchedIds.length - 1]?.replace(/^#/, "") ?? null : null;
|
|
24
|
-
const classes = matchedClasses.map((matchedClass) => matchedClass.replace(/^\./, ""));
|
|
25
|
-
const attributes = matchedAttrs.map((matchedAttr) => matchedAttr.replace(/^\[/, "").replace(/\]$/, "").split("="));
|
|
26
|
-
const element = get().document.createElement(tag);
|
|
27
|
-
if (id !== null) {
|
|
28
|
-
element.id = id;
|
|
29
|
-
}
|
|
30
|
-
element.classList.add(...classes);
|
|
31
|
-
attributes.forEach(([name, value = ""]) => {
|
|
32
|
-
if (name === void 0) return;
|
|
33
|
-
const cleanValue = value.replace(/^"(.*)"$/, "$1");
|
|
34
|
-
element.setAttribute(name, cleanValue);
|
|
35
|
-
});
|
|
36
|
-
return element;
|
|
37
|
-
}
|
|
38
|
-
export {
|
|
39
|
-
selectorToElement
|
|
40
|
-
};
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { JSDOM } from 'jsdom';
|
|
3
|
+
import { selectorToElement } from './index.js';
|
|
4
|
+
import * as Window from '../../misc/crossenv/window/index.js';
|
|
5
|
+
describe('selectorToElement', () => {
|
|
6
|
+
beforeEach(() => Window.set(new JSDOM().window));
|
|
7
|
+
afterEach(() => Window.unset());
|
|
8
|
+
it('creates element with tag name', () => {
|
|
9
|
+
const element = selectorToElement('div');
|
|
10
|
+
expect(element.tagName).toBe('DIV');
|
|
11
|
+
});
|
|
12
|
+
it('defaults to div when no tag specified', () => {
|
|
13
|
+
const element = selectorToElement('#myId');
|
|
14
|
+
expect(element.tagName).toBe('DIV');
|
|
15
|
+
});
|
|
16
|
+
it('creates element with ID', () => {
|
|
17
|
+
const element = selectorToElement('#myId');
|
|
18
|
+
expect(element.id).toBe('myId');
|
|
19
|
+
});
|
|
20
|
+
it('creates element with single class', () => {
|
|
21
|
+
const element = selectorToElement('.myClass');
|
|
22
|
+
expect(element.classList.contains('myClass')).toBe(true);
|
|
23
|
+
});
|
|
24
|
+
it('creates element with multiple classes', () => {
|
|
25
|
+
const element = selectorToElement('.class1.class2.class3');
|
|
26
|
+
expect(element.classList.contains('class1')).toBe(true);
|
|
27
|
+
expect(element.classList.contains('class2')).toBe(true);
|
|
28
|
+
expect(element.classList.contains('class3')).toBe(true);
|
|
29
|
+
});
|
|
30
|
+
it('creates element with attribute', () => {
|
|
31
|
+
const element = selectorToElement('[data-test]');
|
|
32
|
+
expect(element.hasAttribute('data-test')).toBe(true);
|
|
33
|
+
});
|
|
34
|
+
it('creates element with attribute and value', () => {
|
|
35
|
+
const element = selectorToElement('[data-test="value"]');
|
|
36
|
+
expect(element.getAttribute('data-test')).toBe('value');
|
|
37
|
+
});
|
|
38
|
+
it('combines tag, ID, classes, and attributes', () => {
|
|
39
|
+
const element = selectorToElement('span#myId.class1.class2[data-test="value"]');
|
|
40
|
+
expect(element.tagName).toBe('SPAN');
|
|
41
|
+
expect(element.id).toBe('myId');
|
|
42
|
+
expect(element.classList.contains('class1')).toBe(true);
|
|
43
|
+
expect(element.classList.contains('class2')).toBe(true);
|
|
44
|
+
expect(element.getAttribute('data-test')).toBe('value');
|
|
45
|
+
});
|
|
46
|
+
it('handles different tag names', () => {
|
|
47
|
+
expect(selectorToElement('span').tagName).toBe('SPAN');
|
|
48
|
+
expect(selectorToElement('p').tagName).toBe('P');
|
|
49
|
+
expect(selectorToElement('button').tagName).toBe('BUTTON');
|
|
50
|
+
});
|
|
51
|
+
it('handles ID with hyphens', () => {
|
|
52
|
+
const element = selectorToElement('#my-id');
|
|
53
|
+
expect(element.id).toBe('my-id');
|
|
54
|
+
});
|
|
55
|
+
it('handles classes with hyphens', () => {
|
|
56
|
+
const element = selectorToElement('.my-class');
|
|
57
|
+
expect(element.classList.contains('my-class')).toBe(true);
|
|
58
|
+
});
|
|
59
|
+
it('handles multiple attributes', () => {
|
|
60
|
+
const element = selectorToElement('[attr1="value1"][attr2="value2"]');
|
|
61
|
+
expect(element.getAttribute('attr1')).toBe('value1');
|
|
62
|
+
expect(element.getAttribute('attr2')).toBe('value2');
|
|
63
|
+
});
|
|
64
|
+
it('handles attribute without value', () => {
|
|
65
|
+
const element = selectorToElement('[disabled]');
|
|
66
|
+
expect(element.hasAttribute('disabled')).toBe(true);
|
|
67
|
+
expect(element.getAttribute('disabled')).toBe('');
|
|
68
|
+
});
|
|
69
|
+
});
|
|
@@ -1,26 +1,25 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import * as Window from '../../misc/crossenv/window/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Converts a string into an array of DOM nodes.
|
|
4
|
+
*
|
|
5
|
+
* If sanitization options are provided, the string is first sanitized
|
|
6
|
+
* using `Sanitize.sanitize`.
|
|
7
|
+
*
|
|
8
|
+
* Only element and text nodes are included in the returned array; comment
|
|
9
|
+
* and other node types are ignored.
|
|
10
|
+
*
|
|
11
|
+
* @param {string} inputStr - The input string to convert into nodes.
|
|
12
|
+
* @param {SanitizeHtmlOptions} [options.sanitize] - Sanitization options for the input string.
|
|
13
|
+
* @returns {Node[]} An array of DOM nodes created from the string.
|
|
14
|
+
*/
|
|
15
|
+
export function stringToNodes(inputStr) {
|
|
16
|
+
const window = Window.get();
|
|
17
|
+
const { document, Node } = window;
|
|
18
|
+
const wrapperDiv = document.createElement('div');
|
|
19
|
+
wrapperDiv.innerHTML = inputStr;
|
|
20
|
+
const nodes = Array.from(wrapperDiv.childNodes).filter(node => {
|
|
21
|
+
const allowedNodeTypes = [Node.ELEMENT_NODE, Node.TEXT_NODE];
|
|
22
|
+
return allowedNodeTypes.includes(node.nodeType);
|
|
23
|
+
});
|
|
24
|
+
return nodes;
|
|
4
25
|
}
|
|
5
|
-
var _window = exists() ? globalThis.window ?? null : null;
|
|
6
|
-
function get() {
|
|
7
|
-
if (_window !== null) return _window;
|
|
8
|
-
const message = "window is undefined. Please call Window.setWindow(windowObj) before using Window.get.";
|
|
9
|
-
throw new Error(message);
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
// src/agnostic/html/string-to-nodes/index.ts
|
|
13
|
-
function stringToNodes(inputStr) {
|
|
14
|
-
const window = get();
|
|
15
|
-
const { document, Node } = window;
|
|
16
|
-
const wrapperDiv = document.createElement("div");
|
|
17
|
-
wrapperDiv.innerHTML = inputStr;
|
|
18
|
-
const nodes = Array.from(wrapperDiv.childNodes).filter((node) => {
|
|
19
|
-
const allowedNodeTypes = [Node.ELEMENT_NODE, Node.TEXT_NODE];
|
|
20
|
-
return allowedNodeTypes.includes(node.nodeType);
|
|
21
|
-
});
|
|
22
|
-
return nodes;
|
|
23
|
-
}
|
|
24
|
-
export {
|
|
25
|
-
stringToNodes
|
|
26
|
-
};
|