@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.
Files changed (421) hide show
  1. package/TODO.md +269 -0
  2. package/agnostic/arrays/dedupe/index.js +9 -7
  3. package/agnostic/arrays/dedupe/index.test.js +24 -0
  4. package/agnostic/arrays/find-duplicates/index.js +34 -22
  5. package/agnostic/arrays/find-duplicates/index.test.js +31 -0
  6. package/agnostic/arrays/index.d.ts +2 -2
  7. package/agnostic/arrays/index.js +2 -2
  8. package/agnostic/arrays/is-array-of/index.js +28 -26
  9. package/agnostic/arrays/is-array-of/index.test.js +56 -0
  10. package/agnostic/arrays/make/index.d.ts +1 -1
  11. package/agnostic/arrays/make/index.js +11 -6
  12. package/agnostic/arrays/make/index.test.js +10 -0
  13. package/agnostic/arrays/random-pick/index.js +38 -22
  14. package/agnostic/arrays/random-pick/index.test.js +23 -0
  15. package/agnostic/arrays/shuffle/index.js +15 -11
  16. package/agnostic/arrays/shuffle/index.test.js +14 -0
  17. package/agnostic/booleans/is-falsy/index.js +24 -15
  18. package/agnostic/booleans/is-falsy/index.test.js +26 -0
  19. package/agnostic/colors/channels/index.js +139 -936
  20. package/agnostic/colors/channels/index.test.js +64 -0
  21. package/agnostic/colors/contrast/index.js +24 -643
  22. package/agnostic/colors/contrast/index.test.js +21 -0
  23. package/agnostic/colors/convert/index.js +811 -837
  24. package/agnostic/colors/convert/index.test.js +98 -0
  25. package/agnostic/colors/cssColorsMap.js +153 -0
  26. package/agnostic/colors/distance/index.js +66 -538
  27. package/agnostic/colors/distance/index.test.js +21 -0
  28. package/agnostic/colors/grayscale/index.js +95 -872
  29. package/agnostic/colors/grayscale/index.test.js +34 -0
  30. package/agnostic/colors/index.d.ts +4 -4
  31. package/agnostic/colors/index.js +4 -4
  32. package/agnostic/colors/invert/index.js +34 -719
  33. package/agnostic/colors/invert/index.test.js +31 -0
  34. package/agnostic/colors/lerp/index.js +75 -804
  35. package/agnostic/colors/lerp/index.test.js +55 -0
  36. package/agnostic/colors/luminance/index.js +17 -625
  37. package/agnostic/colors/luminance/index.test.js +30 -0
  38. package/agnostic/colors/palette/index.js +83 -917
  39. package/agnostic/colors/palette/index.test.js +35 -0
  40. package/agnostic/colors/rotate/index.js +35 -835
  41. package/agnostic/colors/rotate/index.test.js +45 -0
  42. package/agnostic/colors/tidy/index.js +79 -530
  43. package/agnostic/colors/tidy/index.test.js +45 -0
  44. package/agnostic/colors/typechecks/index.js +188 -250
  45. package/agnostic/colors/typechecks/index.test.js +113 -0
  46. package/agnostic/colors/types.js +1 -0
  47. package/agnostic/css/bem/index.js +134 -171
  48. package/agnostic/css/clss/index.js +64 -29
  49. package/agnostic/css/clss/index.test.js +60 -0
  50. package/agnostic/css/generate-nice-color/index.js +26 -71
  51. package/agnostic/css/generate-nice-color/index.test.js +8 -0
  52. package/agnostic/css/index.d.ts +2 -2
  53. package/agnostic/css/index.js +2 -2
  54. package/agnostic/css/is-valid-css-class-name/index.js +14 -8
  55. package/agnostic/css/is-valid-css-class-name/index.test.js +36 -0
  56. package/agnostic/css/scale/index.d.ts +46 -16
  57. package/agnostic/css/scale/index.js +70 -54
  58. package/agnostic/css/scale/index.test.js +88 -0
  59. package/agnostic/css/styles-set/index.js +151 -178
  60. package/agnostic/errors/index.d.ts +1 -1
  61. package/agnostic/errors/index.js +1 -1
  62. package/agnostic/errors/register/index.js +45 -49
  63. package/agnostic/errors/unknown-to-string/index.js +17 -10
  64. package/agnostic/errors/unknown-to-string/index.test.js +35 -0
  65. package/agnostic/html/get-node-ancestors/index.js +29 -29
  66. package/agnostic/html/get-node-ancestors/index.test.js +58 -0
  67. package/agnostic/html/get-position-inside-parent/index.js +13 -8
  68. package/agnostic/html/get-position-inside-parent/index.test.js +56 -0
  69. package/agnostic/html/hyper-json/cast/index.js +128 -2931
  70. package/agnostic/html/hyper-json/index.js +23 -2954
  71. package/agnostic/html/hyper-json/method/index.js +10 -14
  72. package/agnostic/html/hyper-json/serialize/index.js +88 -222
  73. package/agnostic/html/hyper-json/smart-tags/coalesced/add/index.js +14 -2938
  74. package/agnostic/html/hyper-json/smart-tags/coalesced/addclass/index.js +27 -2937
  75. package/agnostic/html/hyper-json/smart-tags/coalesced/and/index.js +13 -2938
  76. package/agnostic/html/hyper-json/smart-tags/coalesced/append/index.js +34 -2938
  77. package/agnostic/html/hyper-json/smart-tags/coalesced/at/index.js +42 -2935
  78. package/agnostic/html/hyper-json/smart-tags/coalesced/call/index.js +47 -2937
  79. package/agnostic/html/hyper-json/smart-tags/coalesced/clone/index.js +10 -2939
  80. package/agnostic/html/hyper-json/smart-tags/coalesced/deleteproperties/index.js +45 -2936
  81. package/agnostic/html/hyper-json/smart-tags/coalesced/equals/index.js +22 -2938
  82. package/agnostic/html/hyper-json/smart-tags/coalesced/getattribute/index.js +26 -2938
  83. package/agnostic/html/hyper-json/smart-tags/coalesced/getproperties/index.js +19 -2938
  84. package/agnostic/html/hyper-json/smart-tags/coalesced/getproperty/index.js +67 -2935
  85. package/agnostic/html/hyper-json/smart-tags/coalesced/hjparse/index.js +21 -2937
  86. package/agnostic/html/hyper-json/smart-tags/coalesced/hjstringify/index.js +89 -2938
  87. package/agnostic/html/hyper-json/smart-tags/coalesced/if/index.js +20 -2938
  88. package/agnostic/html/hyper-json/smart-tags/coalesced/index.d.ts +11 -11
  89. package/agnostic/html/hyper-json/smart-tags/coalesced/index.js +11 -11
  90. package/agnostic/html/hyper-json/smart-tags/coalesced/initialize/index.js +37 -2938
  91. package/agnostic/html/hyper-json/smart-tags/coalesced/join/index.js +16 -2938
  92. package/agnostic/html/hyper-json/smart-tags/coalesced/length/index.js +21 -2938
  93. package/agnostic/html/hyper-json/smart-tags/coalesced/map/index.js +31 -2938
  94. package/agnostic/html/hyper-json/smart-tags/coalesced/negate/index.js +10 -2939
  95. package/agnostic/html/hyper-json/smart-tags/coalesced/notrailing/index.js +33 -2938
  96. package/agnostic/html/hyper-json/smart-tags/coalesced/or/index.js +13 -2938
  97. package/agnostic/html/hyper-json/smart-tags/coalesced/pickrandom/index.js +17 -2938
  98. package/agnostic/html/hyper-json/smart-tags/coalesced/populate/index.js +59 -2938
  99. package/agnostic/html/hyper-json/smart-tags/coalesced/print/index.js +23 -2938
  100. package/agnostic/html/hyper-json/smart-tags/coalesced/push/index.js +10 -2939
  101. package/agnostic/html/hyper-json/smart-tags/coalesced/pusheach/index.js +26 -2938
  102. package/agnostic/html/hyper-json/smart-tags/coalesced/recordtoarray/index.js +10 -2939
  103. package/agnostic/html/hyper-json/smart-tags/coalesced/removeattribute/index.js +53 -2935
  104. package/agnostic/html/hyper-json/smart-tags/coalesced/removeclass/index.js +27 -2937
  105. package/agnostic/html/hyper-json/smart-tags/coalesced/renameproperty/index.js +31 -2937
  106. package/agnostic/html/hyper-json/smart-tags/coalesced/replace/index.js +55 -2940
  107. package/agnostic/html/hyper-json/smart-tags/coalesced/select/index.js +29 -2935
  108. package/agnostic/html/hyper-json/smart-tags/coalesced/set/index.js +29 -2938
  109. package/agnostic/html/hyper-json/smart-tags/coalesced/setattribute/index.js +53 -2935
  110. package/agnostic/html/hyper-json/smart-tags/coalesced/setproperty/index.js +232 -2936
  111. package/agnostic/html/hyper-json/smart-tags/coalesced/sorton/index.js +89 -2936
  112. package/agnostic/html/hyper-json/smart-tags/coalesced/split/index.js +20 -2938
  113. package/agnostic/html/hyper-json/smart-tags/coalesced/spread/index.js +23 -2939
  114. package/agnostic/html/hyper-json/smart-tags/coalesced/toarray/index.js +11 -2939
  115. package/agnostic/html/hyper-json/smart-tags/coalesced/toboolean/index.js +11 -2939
  116. package/agnostic/html/hyper-json/smart-tags/coalesced/toelement/index.js +17 -2938
  117. package/agnostic/html/hyper-json/smart-tags/coalesced/toggleclass/index.js +27 -2937
  118. package/agnostic/html/hyper-json/smart-tags/coalesced/tonodelist/index.js +11 -2939
  119. package/agnostic/html/hyper-json/smart-tags/coalesced/tonull/index.js +10 -2939
  120. package/agnostic/html/hyper-json/smart-tags/coalesced/tonumber/index.js +11 -2939
  121. package/agnostic/html/hyper-json/smart-tags/coalesced/torecord/index.js +11 -2939
  122. package/agnostic/html/hyper-json/smart-tags/coalesced/toref/index.js +11 -2939
  123. package/agnostic/html/hyper-json/smart-tags/coalesced/tostring/index.js +11 -2939
  124. package/agnostic/html/hyper-json/smart-tags/coalesced/totext/index.js +11 -2939
  125. package/agnostic/html/hyper-json/smart-tags/coalesced/transformselected/index.js +84 -2938
  126. package/agnostic/html/hyper-json/smart-tags/coalesced/trim/index.js +14 -2938
  127. package/agnostic/html/hyper-json/smart-tags/index.js +28 -181
  128. package/agnostic/html/hyper-json/smart-tags/isolated/any/index.js +12 -195
  129. package/agnostic/html/hyper-json/smart-tags/isolated/array/index.js +12 -195
  130. package/agnostic/html/hyper-json/smart-tags/isolated/boolean/index.js +12 -2939
  131. package/agnostic/html/hyper-json/smart-tags/isolated/element/index.js +24 -2938
  132. package/agnostic/html/hyper-json/smart-tags/isolated/get/index.js +18 -2938
  133. package/agnostic/html/hyper-json/smart-tags/isolated/guess/index.js +56 -2937
  134. package/agnostic/html/hyper-json/smart-tags/isolated/index.d.ts +2 -2
  135. package/agnostic/html/hyper-json/smart-tags/isolated/index.js +2 -2
  136. package/agnostic/html/hyper-json/smart-tags/isolated/nodelist/index.js +18 -2938
  137. package/agnostic/html/hyper-json/smart-tags/isolated/null/index.js +9 -193
  138. package/agnostic/html/hyper-json/smart-tags/isolated/number/index.js +16 -2938
  139. package/agnostic/html/hyper-json/smart-tags/isolated/record/index.js +12 -2938
  140. package/agnostic/html/hyper-json/smart-tags/isolated/ref/index.js +40 -2935
  141. package/agnostic/html/hyper-json/smart-tags/isolated/string/index.js +16 -2938
  142. package/agnostic/html/hyper-json/smart-tags/isolated/text/index.js +18 -2938
  143. package/agnostic/html/hyper-json/transformer/index.js +112 -148
  144. package/agnostic/html/hyper-json/tree/index.js +411 -2928
  145. package/agnostic/html/hyper-json/types/index.js +27 -18
  146. package/agnostic/html/hyper-json/utils/index.js +497 -2921
  147. package/agnostic/html/index.d.ts +2 -2
  148. package/agnostic/html/index.js +2 -2
  149. package/agnostic/html/insert-node/index.js +27 -16
  150. package/agnostic/html/insert-node/index.test.js +73 -0
  151. package/agnostic/html/placeholders/index.js +26 -29
  152. package/agnostic/html/replace-in-element/index.js +31 -48
  153. package/agnostic/html/replace-in-element/index.test.js +80 -0
  154. package/agnostic/html/selector-to-element/index.js +53 -39
  155. package/agnostic/html/selector-to-element/index.test.js +69 -0
  156. package/agnostic/html/string-to-nodes/index.js +24 -25
  157. package/agnostic/html/string-to-nodes/index.test.js +54 -0
  158. package/agnostic/index.d.ts +4 -4
  159. package/agnostic/index.js +4 -4
  160. package/agnostic/misc/assert/index.js +60 -66
  161. package/agnostic/misc/cast/index.js +123 -57
  162. package/agnostic/misc/cast/index.test.js +134 -0
  163. package/agnostic/misc/connection/index.js +55 -36
  164. package/agnostic/misc/connection/index.test.js +143 -0
  165. package/agnostic/misc/crawler/index.js +68 -46
  166. package/agnostic/misc/crawler/index.test.js +56 -0
  167. package/agnostic/misc/crossenv/detect-runtime/index.js +41 -13
  168. package/agnostic/misc/crossenv/detect-runtime/index.test.js +24 -0
  169. package/agnostic/misc/crossenv/types.js +21 -14
  170. package/agnostic/misc/crossenv/window/index.js +45 -24
  171. package/agnostic/misc/crossenv/window/index.test.js +24 -0
  172. package/agnostic/misc/data-size/index.js +182 -294
  173. package/agnostic/misc/data-size/index.test.js +100 -0
  174. package/agnostic/misc/data-size/types.js +1 -0
  175. package/agnostic/misc/index.d.ts +5 -5
  176. package/agnostic/misc/index.js +5 -5
  177. package/agnostic/misc/is-constructor-function/index.js +12 -6
  178. package/agnostic/misc/is-constructor-function/index.test.js +36 -0
  179. package/agnostic/misc/is-nullish/index.js +24 -11
  180. package/agnostic/misc/is-nullish/index.test.js +44 -0
  181. package/agnostic/misc/logs/index.d.ts +1 -1
  182. package/agnostic/misc/logs/index.js +1 -1
  183. package/agnostic/misc/logs/logger/index.js +115 -140
  184. package/agnostic/misc/logs/make-text-block/index.js +13 -13
  185. package/agnostic/misc/logs/styles/index.js +29 -48
  186. package/agnostic/misc/lorem-ipsum/index.js +51 -201
  187. package/agnostic/misc/lorem-ipsum/index.test.js +49 -0
  188. package/agnostic/misc/normalize-extension/index.js +99 -88
  189. package/agnostic/misc/normalize-extension/index.test.js +40 -0
  190. package/agnostic/misc/outcome/index.js +20 -14
  191. package/agnostic/misc/outcome/index.test.js +40 -0
  192. package/agnostic/numbers/absolute-modulo/index.js +9 -6
  193. package/agnostic/numbers/absolute-modulo/index.test.js +23 -0
  194. package/agnostic/numbers/approximate-rational/index.js +86 -69
  195. package/agnostic/numbers/approximate-rational/index.test.js +90 -0
  196. package/agnostic/numbers/clamp/index.js +12 -8
  197. package/agnostic/numbers/clamp/index.test.js +24 -0
  198. package/agnostic/numbers/geometric-progressions/index.js +25 -16
  199. package/agnostic/numbers/geometric-progressions/index.test.js +45 -0
  200. package/agnostic/numbers/index.d.ts +2 -2
  201. package/agnostic/numbers/index.js +2 -2
  202. package/agnostic/numbers/interpolate/index.js +25 -10
  203. package/agnostic/numbers/interpolate/index.test.js +40 -0
  204. package/agnostic/numbers/round/index.js +30 -15
  205. package/agnostic/numbers/round/index.test.js +56 -0
  206. package/agnostic/objects/deep-get-property/index.js +30 -27
  207. package/agnostic/objects/deep-get-property/index.test.js +59 -0
  208. package/agnostic/objects/enums/is-in-enum/index.js +17 -11
  209. package/agnostic/objects/enums/is-in-enum/index.test.js +100 -0
  210. package/agnostic/objects/flatten-getters/index.js +15 -14
  211. package/agnostic/objects/flatten-getters/index.test.js +78 -0
  212. package/agnostic/objects/index.d.ts +4 -4
  213. package/agnostic/objects/index.js +4 -4
  214. package/agnostic/objects/is-object/index.js +16 -9
  215. package/agnostic/objects/is-object/index.test.js +60 -0
  216. package/agnostic/objects/is-record/index.js +12 -7
  217. package/agnostic/objects/is-record/index.test.js +48 -0
  218. package/agnostic/objects/record-format/index.js +18 -12
  219. package/agnostic/objects/record-format/index.test.js +92 -0
  220. package/agnostic/objects/record-map/index.js +16 -11
  221. package/agnostic/objects/record-map/index.test.js +56 -0
  222. package/agnostic/objects/sort-keys/index.js +15 -11
  223. package/agnostic/objects/sort-keys/index.test.js +37 -0
  224. package/agnostic/objects/validation/index.js +21 -8
  225. package/agnostic/objects/validation/index.test.js +72 -0
  226. package/agnostic/optim/memoize/index.js +24 -16
  227. package/agnostic/optim/memoize/index.test.js +30 -0
  228. package/agnostic/optim/throttle-debounce/index.js +120 -102
  229. package/agnostic/optim/throttle-debounce/index.test.js +44 -0
  230. package/agnostic/optim/throttle-debounce/types.js +1 -0
  231. package/agnostic/random/hex-char/index.js +8 -10
  232. package/agnostic/random/hex-char/index.test.js +20 -0
  233. package/agnostic/random/index.d.ts +1 -1
  234. package/agnostic/random/index.js +1 -1
  235. package/agnostic/random/random/index.js +17 -14
  236. package/agnostic/random/random/index.test.js +73 -0
  237. package/agnostic/random/uuid/index.js +28 -20
  238. package/agnostic/random/uuid/index.test.js +45 -0
  239. package/agnostic/regexps/index.js +126 -84
  240. package/agnostic/regexps/index.test.js +108 -0
  241. package/agnostic/sanitization/file-name/index.js +24 -8
  242. package/agnostic/sanitization/file-name/index.test.js +23 -0
  243. package/agnostic/sanitization/html/index.js +172 -122
  244. package/agnostic/sanitization/index.d.ts +1 -1
  245. package/agnostic/sanitization/index.js +1 -1
  246. package/agnostic/sanitization/path/index.js +23 -15
  247. package/agnostic/sanitization/path/index.test.js +18 -0
  248. package/agnostic/sanitization/types.js +1 -0
  249. package/agnostic/sanitization/user-input/index.js +36 -24
  250. package/agnostic/sanitization/user-input/index.test.js +31 -0
  251. package/agnostic/strings/char-codes/index.js +123 -55
  252. package/agnostic/strings/index.d.ts +1 -1
  253. package/agnostic/strings/index.js +1 -1
  254. package/agnostic/strings/matches/index.js +35 -16
  255. package/agnostic/strings/normalize-indent/index.js +34 -16
  256. package/agnostic/strings/parse-table/index.js +153 -86
  257. package/agnostic/strings/replace-all/index.js +36 -15
  258. package/agnostic/strings/to-alphanum/index.js +23 -8
  259. package/agnostic/strings/trim/index.js +22 -9
  260. package/agnostic/time/dates/format-date/index.js +140 -72
  261. package/agnostic/time/duration/index.js +106 -140
  262. package/agnostic/time/timeout/index.js +24 -16
  263. package/agnostic/time/transitions/index.js +200 -158
  264. package/agnostic/time/wait/index.js +10 -8
  265. package/agnostic/typescript/types.js +1 -0
  266. package/components/BeforeAfter/index.controlled.js +95 -0
  267. package/components/BeforeAfter/index.js +54 -189
  268. package/components/BeforeAfter/utils.js +9 -0
  269. package/components/Disclaimer/index.js +50 -110
  270. package/components/Drawer/index.js +81 -196
  271. package/components/EventListener/index.js +29 -80
  272. package/components/Gallery/index.js +146 -221
  273. package/components/Gallery/utils.js +12 -0
  274. package/components/Image/index.js +66 -293
  275. package/components/IntersectionObserver/index.js +62 -110
  276. package/components/Overlayer/index.js +59 -103
  277. package/components/Paginator/index.js +124 -155
  278. package/components/ResizeObserver/index.js +66 -119
  279. package/components/ResizeObserver/style.module.css +0 -0
  280. package/components/Scrllgngn/index.js +171 -468
  281. package/components/ScrollListener/index.js +97 -276
  282. package/components/ScrollListener/utils.js +51 -0
  283. package/components/Sequencer/index.controlled.js +67 -0
  284. package/components/Sequencer/index.js +105 -262
  285. package/components/ShadowRoot/index.js +42 -96
  286. package/components/Subtitles/index.js +107 -244
  287. package/components/Subtitles/types.js +1 -0
  288. package/components/Subtitles/utils.js +102 -0
  289. package/components/Theatre/index.js +88 -136
  290. package/components/UIModule/index.js +156 -199
  291. package/components/Video/index.js +292 -857
  292. package/components/Video/utils.js +137 -0
  293. package/components/_WIP_AudioQuote/index.js +1 -0
  294. package/components/_WIP_Icon/index.js +1 -0
  295. package/components/index.d.ts +4 -4
  296. package/components/index.js +4 -4
  297. package/components/public-classnames.js +18 -0
  298. package/components/utils/index.js +11 -11
  299. package/components/utils/types.js +1 -0
  300. package/index.d.ts +1 -1
  301. package/index.js +1 -1
  302. package/node/@aws-s3/index.test.js +6 -0
  303. package/node/@aws-s3/storage/directory/copy-dir/index.js +66 -72
  304. package/node/@aws-s3/storage/directory/index.d.ts +1 -1
  305. package/node/@aws-s3/storage/directory/index.js +1 -1
  306. package/node/@aws-s3/storage/directory/list/index.js +32 -42
  307. package/node/@aws-s3/storage/directory/move-dir/index.js +68 -86
  308. package/node/@aws-s3/storage/directory/remove-dir/index.js +56 -67
  309. package/node/@aws-s3/storage/file/copy/index.js +41 -53
  310. package/node/@aws-s3/storage/file/download/index.js +29 -40
  311. package/node/@aws-s3/storage/file/exists/index.js +35 -43
  312. package/node/@aws-s3/storage/file/index.d.ts +1 -1
  313. package/node/@aws-s3/storage/file/index.js +1 -1
  314. package/node/@aws-s3/storage/file/move/index.js +57 -63
  315. package/node/@aws-s3/storage/file/remove/index.js +35 -43
  316. package/node/@aws-s3/storage/file/stat/index.js +33 -47
  317. package/node/@aws-s3/storage/file/upload/index.js +52 -63
  318. package/node/@design-edito/index.js +1 -0
  319. package/node/@express/@multer/index.js +61 -55
  320. package/node/@google-cloud/storage/bucket/get-metadata/index.js +25 -29
  321. package/node/@google-cloud/storage/directory/copy-dir/index.js +35 -41
  322. package/node/@google-cloud/storage/directory/index.d.ts +1 -1
  323. package/node/@google-cloud/storage/directory/index.js +1 -1
  324. package/node/@google-cloud/storage/directory/list/index.js +28 -35
  325. package/node/@google-cloud/storage/directory/move-dir/index.js +43 -42
  326. package/node/@google-cloud/storage/directory/remove-dir/index.js +34 -38
  327. package/node/@google-cloud/storage/file/copy/index.js +35 -40
  328. package/node/@google-cloud/storage/file/download/index.js +27 -34
  329. package/node/@google-cloud/storage/file/exists/index.js +25 -31
  330. package/node/@google-cloud/storage/file/generate-signed-url/index.js +33 -35
  331. package/node/@google-cloud/storage/file/get-metadata/index.js +28 -31
  332. package/node/@google-cloud/storage/file/get-permissions/index.js +25 -31
  333. package/node/@google-cloud/storage/file/index.d.ts +3 -3
  334. package/node/@google-cloud/storage/file/index.js +3 -3
  335. package/node/@google-cloud/storage/file/move/index.js +38 -42
  336. package/node/@google-cloud/storage/file/remove/index.js +34 -35
  337. package/node/@google-cloud/storage/file/revoke-signed-urls/index.js +32 -95
  338. package/node/@google-cloud/storage/file/stat/index.js +34 -38
  339. package/node/@google-cloud/storage/file/update-metadata/index.js +30 -31
  340. package/node/@google-cloud/storage/file/upload/index.js +44 -46
  341. package/node/@google-cloud/storage/index.d.ts +1 -1
  342. package/node/@google-cloud/storage/index.js +1 -1
  343. package/node/cloud-storage/clients/index.js +35 -15
  344. package/node/cloud-storage/operations/copy-dir/index.js +30 -203
  345. package/node/cloud-storage/operations/copy-file/index.js +30 -152
  346. package/node/cloud-storage/operations/download-file/index.js +30 -103
  347. package/node/cloud-storage/operations/exists-file/index.js +30 -103
  348. package/node/cloud-storage/operations/index.d.ts +2 -2
  349. package/node/cloud-storage/operations/index.js +2 -2
  350. package/node/cloud-storage/operations/list-dir/index.js +29 -98
  351. package/node/cloud-storage/operations/move-dir/index.js +30 -169
  352. package/node/cloud-storage/operations/move-file/index.js +30 -157
  353. package/node/cloud-storage/operations/remove-dir/index.js +29 -159
  354. package/node/cloud-storage/operations/remove-file/index.js +29 -121
  355. package/node/cloud-storage/operations/stat-file/index.js +29 -124
  356. package/node/cloud-storage/operations/upload-file/index.js +30 -162
  357. package/node/encryption/@aes-256-gcm/buffer/index.js +31 -72
  358. package/node/encryption/@aes-256-gcm/uint8-array/index.js +55 -55
  359. package/node/encryption/key/index.js +19 -12
  360. package/node/files/index.d.ts +1 -1
  361. package/node/files/index.js +1 -1
  362. package/node/files/is-in-directory/index.js +11 -8
  363. package/node/files/read-write/index.js +11 -15
  364. package/node/files/subpaths/index.js +156 -121
  365. package/node/ftps/directory/copy-dir/index.js +55 -62
  366. package/node/ftps/directory/list/index.js +24 -29
  367. package/node/ftps/directory/move-dir/index.js +38 -38
  368. package/node/ftps/directory/remove-dir/index.js +39 -42
  369. package/node/ftps/file/copy/index.js +42 -47
  370. package/node/ftps/file/download/index.js +29 -34
  371. package/node/ftps/file/exists/index.js +38 -36
  372. package/node/ftps/file/index.d.ts +2 -2
  373. package/node/ftps/file/index.js +2 -2
  374. package/node/ftps/file/move/index.js +46 -44
  375. package/node/ftps/file/remove/index.js +36 -39
  376. package/node/ftps/file/stat/index.js +30 -38
  377. package/node/ftps/file/upload/index.js +40 -44
  378. package/node/images/create/index.js +10 -562
  379. package/node/images/format/index.js +264 -815
  380. package/node/images/metadata/index.js +10 -571
  381. package/node/images/transform/index.js +169 -1022
  382. package/node/images/transform/operations/blur/index.js +11 -24
  383. package/node/images/transform/operations/brighten/index.js +11 -24
  384. package/node/images/transform/operations/extend/index.js +25 -589
  385. package/node/images/transform/operations/extract/index.js +15 -28
  386. package/node/images/transform/operations/flatten/index.js +20 -584
  387. package/node/images/transform/operations/flip/index.js +2 -6
  388. package/node/images/transform/operations/flop/index.js +2 -6
  389. package/node/images/transform/operations/hue/index.js +13 -26
  390. package/node/images/transform/operations/index.d.ts +3 -3
  391. package/node/images/transform/operations/index.js +3 -3
  392. package/node/images/transform/operations/level/index.js +14 -30
  393. package/node/images/transform/operations/lighten/index.js +13 -26
  394. package/node/images/transform/operations/normalize/index.js +14 -27
  395. package/node/images/transform/operations/overlay/index.js +89 -673
  396. package/node/images/transform/operations/resize/index.js +46 -610
  397. package/node/images/transform/operations/rotate/index.js +20 -584
  398. package/node/images/transform/operations/saturate/index.js +14 -27
  399. package/node/images/types.js +34 -31
  400. package/node/images/utils/index.js +84 -568
  401. package/node/index.d.ts +2 -2
  402. package/node/index.js +2 -2
  403. package/node/process/on-exit/index.js +45 -26
  404. package/node/process/prompt-continue/index.js +29 -14
  405. package/node/process/spawner/index.js +104 -134
  406. package/node/sftp/directory/copy-dir/index.js +52 -60
  407. package/node/sftp/directory/index.d.ts +1 -1
  408. package/node/sftp/directory/index.js +1 -1
  409. package/node/sftp/directory/list/index.js +22 -29
  410. package/node/sftp/directory/move-dir/index.js +35 -35
  411. package/node/sftp/directory/remove-dir/index.js +39 -42
  412. package/node/sftp/file/copy/index.js +37 -45
  413. package/node/sftp/file/download/index.js +26 -32
  414. package/node/sftp/file/exists/index.js +29 -29
  415. package/node/sftp/file/index.d.ts +2 -2
  416. package/node/sftp/file/index.js +2 -2
  417. package/node/sftp/file/move/index.js +39 -38
  418. package/node/sftp/file/remove/index.js +31 -34
  419. package/node/sftp/file/stat/index.js +26 -37
  420. package/node/sftp/file/upload/index.js +34 -38
  421. package/package.json +1 -1
@@ -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,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
- // src/agnostic/html/insert-node/index.ts
2
- function insertNode(node, position, reference) {
3
- if (position === "after") {
4
- if (reference.nextSibling !== null) reference.parentNode?.insertBefore(node, reference.nextSibling);
5
- else reference.parentNode?.appendChild(node);
6
- } else if (position === "before") {
7
- reference.parentNode?.insertBefore(node, reference);
8
- } else if (position === "startof") {
9
- if (reference.firstChild !== null) reference.insertBefore(node, reference.firstChild);
10
- else reference.appendChild(node);
11
- } else {
12
- reference.appendChild(node);
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
- // src/agnostic/html/placeholders/index.ts
2
- var 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());
3
- var generateSentence = () => {
4
- const pos = Math.floor(Math.random() * EightKiloByteOfLoremIpsumSentences.length);
5
- return EightKiloByteOfLoremIpsumSentences[pos];
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
- var generateSentences = (amount = 1) => {
8
- return new Array(amount).fill(null).map(generateSentence);
8
+ export const generateSentences = (amount = 1) => {
9
+ return new Array(amount)
10
+ .fill(null)
11
+ .map(generateSentence);
9
12
  };
10
- var generateTitle = () => `<h1 class="title">${generateSentence()}</h1>`;
11
- var generateIntertitle = () => `<h2 class="intertitle">${generateSentence()}</h2>`;
12
- var generateParagraph = () => {
13
- const length = Math.floor(Math.random() * 5) + 3;
14
- const sentencesArr = new Array(length).fill(null).map(generateSentence);
15
- return `<p class="paragraph">${sentencesArr.join(". ")}</p>`;
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
- var generateContentPage = (len = 1) => {
18
- const length = (Math.floor(Math.random() * 3) + 3) * Math.round(len);
19
- const pageBody = new Array(length).fill(null).map(() => {
20
- if (Math.random() < 0.2) return generateIntertitle();
21
- return generateParagraph();
22
- }).join("");
23
- return `<div class="content-page">
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
- // src/agnostic/misc/crossenv/window/index.ts
2
- function exists() {
3
- return typeof globalThis !== "undefined" && "window" in globalThis;
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
- // src/agnostic/misc/crossenv/window/index.ts
2
- function exists() {
3
- return typeof globalThis !== "undefined" && "window" in globalThis;
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
- // src/agnostic/misc/crossenv/window/index.ts
2
- function exists() {
3
- return typeof globalThis !== "undefined" && "window" in globalThis;
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
- };