@splendidlabz/utils 1.5.1 → 1.7.0

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 (472) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/cjs/dom/accessibility.cjs +53 -0
  3. package/dist/cjs/dom/actions/index.cjs +407 -0
  4. package/dist/cjs/dom/actions/masonry.cjs +149 -0
  5. package/dist/cjs/dom/actions/prefer-horizontal-scroll.cjs +157 -0
  6. package/dist/cjs/dom/actions/sticky.cjs +211 -0
  7. package/dist/cjs/dom/bounding-box.cjs +70 -0
  8. package/dist/cjs/dom/clipboard.cjs +37 -0
  9. package/dist/cjs/dom/cookie.cjs +57 -0
  10. package/dist/cjs/dom/css-vars.cjs +57 -0
  11. package/dist/cjs/dom/events.cjs +95 -0
  12. package/dist/cjs/dom/focusable.cjs +143 -0
  13. package/dist/cjs/dom/font-size.cjs +74 -0
  14. package/dist/cjs/dom/get-element.cjs +98 -0
  15. package/dist/cjs/dom/hash.cjs +35 -0
  16. package/dist/cjs/dom/index.cjs +1197 -0
  17. package/dist/cjs/dom/keyboard.cjs +51 -0
  18. package/dist/cjs/dom/local-store.cjs +79 -0
  19. package/dist/cjs/dom/media.cjs +59 -0
  20. package/dist/cjs/dom/observers/index.cjs +156 -0
  21. package/dist/cjs/dom/observers/intersection-observer.cjs +91 -0
  22. package/dist/cjs/dom/observers/mutation-observer.cjs +95 -0
  23. package/dist/cjs/dom/observers/observer.cjs +48 -0
  24. package/dist/cjs/dom/observers/resize-observer.cjs +82 -0
  25. package/dist/cjs/dom/pkce.cjs +53 -0
  26. package/dist/cjs/dom/query-params.cjs +38 -0
  27. package/dist/cjs/dom/random-string.cjs +38 -0
  28. package/dist/cjs/dom/sanitize.cjs +65 -0
  29. package/dist/cjs/dom/session-store.cjs +49 -0
  30. package/dist/cjs/dom/spam-prevention.cjs +50 -0
  31. package/dist/cjs/dom/trap-focus.cjs +197 -0
  32. package/dist/cjs/dom/ui/aria-current.cjs +43 -0
  33. package/dist/cjs/dom/ui/inconsistent-button-fix.cjs +35 -0
  34. package/dist/cjs/dom/ui/index.cjs +105 -0
  35. package/dist/cjs/dom/ui/scroll-container.cjs +47 -0
  36. package/dist/cjs/dom/ui/traverse-and-scramble.cjs +50 -0
  37. package/dist/cjs/lib/arrays/index.cjs +139 -0
  38. package/dist/cjs/lib/arrays/item-position.cjs +42 -0
  39. package/dist/cjs/lib/arrays/join.cjs +43 -0
  40. package/dist/cjs/lib/arrays/shuffle.cjs +42 -0
  41. package/dist/cjs/lib/arrays/sort.cjs +67 -0
  42. package/dist/cjs/lib/arrays/split-array.cjs +41 -0
  43. package/dist/cjs/lib/arrays/unique.cjs +31 -0
  44. package/dist/cjs/lib/auth/index.cjs +53 -0
  45. package/dist/cjs/lib/auth/route-manager.cjs +51 -0
  46. package/dist/cjs/lib/checks.cjs +58 -0
  47. package/dist/cjs/lib/date/days.cjs +37 -0
  48. package/dist/cjs/lib/date/index.cjs +206 -0
  49. package/dist/cjs/lib/date/months.cjs +102 -0
  50. package/dist/cjs/lib/date/time.cjs +115 -0
  51. package/dist/cjs/lib/form/form-data.cjs +83 -0
  52. package/dist/cjs/lib/form/index.cjs +122 -0
  53. package/dist/cjs/lib/form/sanitize.cjs +61 -0
  54. package/dist/cjs/lib/functions/debounce.cjs +43 -0
  55. package/dist/cjs/lib/functions/env.cjs +32 -0
  56. package/dist/cjs/lib/functions/functional.cjs +62 -0
  57. package/dist/cjs/lib/functions/index.cjs +122 -0
  58. package/dist/cjs/lib/functions/throttle.cjs +38 -0
  59. package/dist/cjs/lib/functions/timeout.cjs +41 -0
  60. package/dist/cjs/lib/hash.cjs +43 -0
  61. package/dist/cjs/lib/index.cjs +1141 -0
  62. package/dist/cjs/lib/numbers/index.cjs +49 -0
  63. package/dist/cjs/lib/numbers/math.cjs +36 -0
  64. package/dist/cjs/lib/objects/camelcase-keys.cjs +80 -0
  65. package/dist/cjs/lib/objects/empty.cjs +39 -0
  66. package/dist/cjs/lib/objects/equal.cjs +47 -0
  67. package/dist/cjs/lib/objects/extend.cjs +146 -0
  68. package/dist/cjs/lib/objects/flatten.cjs +48 -0
  69. package/dist/cjs/lib/objects/index.cjs +375 -0
  70. package/dist/cjs/lib/objects/json.cjs +35 -0
  71. package/dist/cjs/lib/objects/loop.cjs +40 -0
  72. package/dist/cjs/lib/objects/mix/mix.cjs +112 -0
  73. package/dist/cjs/lib/objects/nested-property.cjs +45 -0
  74. package/dist/cjs/lib/objects/normalize-object.cjs +106 -0
  75. package/dist/cjs/lib/objects/omit-empty.cjs +40 -0
  76. package/dist/cjs/lib/objects/size.cjs +63 -0
  77. package/dist/cjs/lib/objects/split.cjs +39 -0
  78. package/dist/cjs/lib/promises/index.cjs +69 -0
  79. package/dist/cjs/lib/promises/reject.cjs +67 -0
  80. package/dist/cjs/lib/sse.cjs +99 -0
  81. package/dist/cjs/lib/strings/convert-case/convert-case.cjs +96 -0
  82. package/dist/cjs/lib/strings/index.cjs +190 -0
  83. package/dist/cjs/lib/strings/markdown.cjs +59 -0
  84. package/dist/cjs/lib/strings/name.cjs +46 -0
  85. package/dist/cjs/lib/strings/pluralize.cjs +40 -0
  86. package/dist/cjs/lib/strings/query-string.cjs +43 -0
  87. package/dist/cjs/lib/style/index.cjs +64 -0
  88. package/dist/cjs/lib/symbols/index.cjs +40 -0
  89. package/dist/cjs/lib/symbols/symbols.cjs +38 -0
  90. package/dist/cjs/node/common.cjs +42 -0
  91. package/dist/cjs/node/dirname.cjs +49 -0
  92. package/dist/cjs/node/file-cache.cjs +196 -0
  93. package/dist/cjs/node/file.cjs +50 -0
  94. package/dist/cjs/node/hash.cjs +42 -0
  95. package/dist/cjs/node/index.cjs +290 -0
  96. package/dist/cjs/node/pkce.cjs +62 -0
  97. package/dist/cjs/node/random-string.cjs +43 -0
  98. package/dist/cjs/node/sanitize.cjs +65 -0
  99. package/dist/esm/dom/accessibility.js +27 -0
  100. package/dist/esm/dom/actions/index.js +379 -0
  101. package/dist/esm/dom/actions/masonry.js +123 -0
  102. package/dist/esm/dom/actions/prefer-horizontal-scroll.js +131 -0
  103. package/dist/esm/dom/actions/sticky.js +185 -0
  104. package/dist/esm/dom/bounding-box.js +45 -0
  105. package/dist/esm/dom/clipboard.js +13 -0
  106. package/dist/esm/dom/cookie.js +32 -0
  107. package/dist/esm/dom/css-vars.js +28 -0
  108. package/dist/esm/dom/events.js +67 -0
  109. package/dist/esm/dom/focusable.js +118 -0
  110. package/dist/esm/dom/font-size.js +44 -0
  111. package/dist/esm/dom/get-element.js +67 -0
  112. package/dist/esm/dom/hash.js +11 -0
  113. package/dist/esm/dom/index.js +1100 -0
  114. package/dist/esm/dom/keyboard.js +23 -0
  115. package/dist/esm/dom/local-store.js +55 -0
  116. package/dist/esm/dom/media.js +33 -0
  117. package/dist/esm/dom/observers/index.js +128 -0
  118. package/dist/esm/dom/observers/intersection-observer.js +65 -0
  119. package/dist/esm/dom/observers/mutation-observer.js +69 -0
  120. package/dist/esm/dom/observers/observer.js +22 -0
  121. package/dist/esm/dom/observers/resize-observer.js +56 -0
  122. package/dist/esm/dom/pkce.js +27 -0
  123. package/dist/esm/dom/query-params.js +14 -0
  124. package/dist/esm/dom/random-string.js +13 -0
  125. package/dist/esm/dom/sanitize.js +31 -0
  126. package/dist/esm/dom/session-store.js +25 -0
  127. package/dist/esm/dom/spam-prevention.js +26 -0
  128. package/dist/esm/dom/trap-focus.js +170 -0
  129. package/dist/esm/dom/ui/aria-current.js +18 -0
  130. package/dist/esm/dom/ui/inconsistent-button-fix.js +11 -0
  131. package/dist/esm/dom/ui/index.js +75 -0
  132. package/dist/esm/dom/ui/scroll-container.js +23 -0
  133. package/dist/esm/dom/ui/traverse-and-scramble.js +26 -0
  134. package/dist/esm/lib/arrays/index.js +106 -0
  135. package/dist/esm/lib/arrays/item-position.js +16 -0
  136. package/dist/esm/lib/arrays/join.js +17 -0
  137. package/dist/esm/lib/arrays/shuffle.js +18 -0
  138. package/dist/esm/lib/arrays/sort.js +41 -0
  139. package/dist/esm/lib/arrays/split-array.js +17 -0
  140. package/dist/esm/lib/arrays/unique.js +7 -0
  141. package/dist/esm/lib/auth/index.js +26 -0
  142. package/dist/esm/lib/auth/route-manager.js +26 -0
  143. package/dist/esm/lib/checks.js +31 -0
  144. package/dist/esm/lib/date/days.js +13 -0
  145. package/dist/esm/lib/date/index.js +171 -0
  146. package/dist/esm/lib/date/months.js +78 -0
  147. package/dist/esm/lib/date/time.js +82 -0
  148. package/dist/esm/lib/form/form-data.js +58 -0
  149. package/dist/esm/lib/form/index.js +92 -0
  150. package/dist/esm/lib/form/sanitize.js +35 -0
  151. package/dist/esm/lib/functions/debounce.js +19 -0
  152. package/dist/esm/lib/functions/env.js +8 -0
  153. package/dist/esm/lib/functions/functional.js +35 -0
  154. package/dist/esm/lib/functions/index.js +87 -0
  155. package/dist/esm/lib/functions/throttle.js +14 -0
  156. package/dist/esm/lib/functions/timeout.js +15 -0
  157. package/dist/esm/lib/hash.js +19 -0
  158. package/dist/esm/lib/index.js +1023 -0
  159. package/dist/esm/lib/numbers/index.js +21 -0
  160. package/dist/esm/lib/numbers/math.js +11 -0
  161. package/dist/esm/lib/objects/camelcase-keys.js +54 -0
  162. package/dist/esm/lib/objects/empty.js +14 -0
  163. package/dist/esm/lib/objects/equal.js +12 -0
  164. package/dist/esm/lib/objects/extend.js +120 -0
  165. package/dist/esm/lib/objects/flatten.js +22 -0
  166. package/dist/esm/lib/objects/index.js +321 -0
  167. package/dist/esm/lib/objects/json.js +11 -0
  168. package/dist/esm/lib/objects/loop.js +15 -0
  169. package/dist/esm/lib/objects/mix/mix.js +87 -0
  170. package/dist/esm/lib/objects/nested-property.js +19 -0
  171. package/dist/esm/lib/objects/normalize-object.js +80 -0
  172. package/dist/esm/lib/objects/omit-empty.js +16 -0
  173. package/dist/esm/lib/objects/size.js +39 -0
  174. package/dist/esm/lib/objects/split.js +15 -0
  175. package/dist/esm/lib/promises/index.js +33 -0
  176. package/dist/esm/lib/promises/reject.js +33 -0
  177. package/dist/esm/lib/sse.js +72 -0
  178. package/dist/esm/lib/strings/convert-case/convert-case.js +65 -0
  179. package/dist/esm/lib/strings/index.js +140 -0
  180. package/dist/esm/lib/strings/markdown.js +34 -0
  181. package/dist/esm/lib/strings/name.js +22 -0
  182. package/dist/esm/lib/strings/pluralize.js +6 -0
  183. package/dist/esm/lib/strings/query-string.js +17 -0
  184. package/dist/esm/lib/style/index.js +38 -0
  185. package/dist/esm/lib/symbols/index.js +13 -0
  186. package/dist/esm/lib/symbols/symbols.js +13 -0
  187. package/dist/esm/node/common.js +8 -0
  188. package/dist/esm/node/dirname.js +14 -0
  189. package/dist/esm/node/file-cache.js +158 -0
  190. package/dist/esm/node/file.js +15 -0
  191. package/dist/esm/node/hash.js +8 -0
  192. package/dist/esm/node/index.js +243 -0
  193. package/dist/esm/node/pkce.js +28 -0
  194. package/dist/esm/node/random-string.js +9 -0
  195. package/dist/esm/node/sanitize.js +31 -0
  196. package/dist/{dom/accessibility.d.ts → types/dom/accessibility.d.cts} +5 -3
  197. package/dist/types/dom/actions/index.d.cts +3 -0
  198. package/dist/types/dom/actions/masonry.d.cts +5 -0
  199. package/dist/types/dom/actions/prefer-horizontal-scroll.d.cts +5 -0
  200. package/dist/types/dom/actions/sticky.d.cts +5 -0
  201. package/dist/{dom/bounding-box.d.ts → types/dom/bounding-box.d.cts} +4 -2
  202. package/dist/{dom/clipboard.d.ts → types/dom/clipboard.d.cts} +3 -1
  203. package/dist/types/dom/cookie.d.cts +7 -0
  204. package/dist/types/dom/css-vars.d.cts +6 -0
  205. package/dist/types/dom/events.d.cts +20 -0
  206. package/dist/{dom/focusable.d.ts → types/dom/focusable.d.cts} +5 -3
  207. package/dist/types/dom/font-size.d.cts +7 -0
  208. package/dist/{dom/get-element.d.ts → types/dom/get-element.d.cts} +10 -8
  209. package/dist/types/dom/hash.d.cts +3 -0
  210. package/dist/types/dom/index.d.cts +30 -0
  211. package/dist/{dom/keyboard.d.ts → types/dom/keyboard.d.cts} +7 -5
  212. package/dist/{dom/local-store.d.ts → types/dom/local-store.d.cts} +3 -1
  213. package/dist/types/dom/media.d.cts +5 -0
  214. package/dist/types/dom/observers/index.d.cts +3 -0
  215. package/dist/{dom/observers/intersection-observer.d.ts → types/dom/observers/intersection-observer.d.cts} +3 -1
  216. package/dist/{dom/observers/mutation-observer.d.ts → types/dom/observers/mutation-observer.d.cts} +3 -1
  217. package/dist/types/dom/observers/observer.d.cts +3 -0
  218. package/dist/{dom/observers/resize-observer.d.ts → types/dom/observers/resize-observer.d.cts} +3 -1
  219. package/dist/{node/pkce.d.ts → types/dom/pkce.d.cts} +3 -1
  220. package/dist/{dom/query-params.d.ts → types/dom/query-params.d.cts} +3 -1
  221. package/dist/{dom/random-string.d.ts → types/dom/random-string.d.cts} +4 -2
  222. package/dist/{dom/sanitize.d.ts → types/dom/sanitize.d.cts} +3 -1
  223. package/dist/{dom/session-store.d.ts → types/dom/session-store.d.cts} +3 -1
  224. package/dist/types/dom/spam-prevention.d.cts +14 -0
  225. package/dist/{dom/trap-focus.d.ts → types/dom/trap-focus.d.cts} +8 -4
  226. package/dist/types/dom/ui/aria-current.d.cts +7 -0
  227. package/dist/{dom/ui/inconsistent-button-fix.d.ts → types/dom/ui/inconsistent-button-fix.d.cts} +3 -1
  228. package/dist/types/dom/ui/index.d.cts +4 -0
  229. package/dist/types/dom/ui/scroll-container.d.cts +3 -0
  230. package/dist/{dom/ui/traverse-and-scramble.d.ts → types/dom/ui/traverse-and-scramble.d.cts} +3 -1
  231. package/dist/types/lib/arrays/index.d.cts +6 -0
  232. package/dist/{lib/arrays/item-position.d.ts → types/lib/arrays/item-position.d.cts} +5 -3
  233. package/dist/{lib/arrays/join.d.ts → types/lib/arrays/join.d.cts} +3 -1
  234. package/dist/types/lib/arrays/shuffle.d.cts +3 -0
  235. package/dist/{lib/arrays/sort.d.ts → types/lib/arrays/sort.d.cts} +3 -1
  236. package/dist/types/lib/arrays/split-array.d.cts +6 -0
  237. package/dist/types/lib/arrays/unique.d.cts +3 -0
  238. package/dist/types/lib/auth/index.d.cts +1 -0
  239. package/dist/{lib/auth/route-manager.d.ts → types/lib/auth/route-manager.d.cts} +5 -2
  240. package/{lib/checks.js → dist/types/lib/checks.d.cts} +6 -11
  241. package/dist/{lib/date/days.d.ts → types/lib/date/days.d.cts} +3 -1
  242. package/dist/types/lib/date/index.d.cts +3 -0
  243. package/dist/{lib/date/months.d.ts → types/lib/date/months.d.cts} +3 -1
  244. package/dist/types/lib/date/time.d.cts +21 -0
  245. package/dist/types/lib/form/form-data.d.cts +9 -0
  246. package/dist/types/lib/form/index.d.cts +2 -0
  247. package/dist/{lib/form/sanitize.d.ts → types/lib/form/sanitize.d.cts} +6 -4
  248. package/dist/types/lib/functions/debounce.d.cts +3 -0
  249. package/dist/types/lib/functions/env.d.cts +3 -0
  250. package/dist/types/lib/functions/functional.d.cts +6 -0
  251. package/dist/types/lib/functions/index.d.cts +5 -0
  252. package/dist/types/lib/functions/throttle.d.cts +3 -0
  253. package/dist/types/lib/functions/timeout.d.cts +5 -0
  254. package/dist/types/lib/hash.d.cts +3 -0
  255. package/dist/types/lib/index.d.cts +43 -0
  256. package/dist/types/lib/numbers/index.d.cts +5 -0
  257. package/dist/types/lib/numbers/math.d.cts +4 -0
  258. package/dist/types/lib/objects/camelcase-keys.d.cts +3 -0
  259. package/dist/types/lib/objects/empty.d.cts +4 -0
  260. package/dist/types/lib/objects/equal.d.cts +4 -0
  261. package/dist/types/lib/objects/extend.d.cts +6 -0
  262. package/dist/types/lib/objects/flatten.d.cts +6 -0
  263. package/dist/types/lib/objects/index.d.cts +13 -0
  264. package/dist/types/lib/objects/json.d.cts +3 -0
  265. package/dist/types/lib/objects/loop.d.cts +4 -0
  266. package/dist/types/lib/objects/mix/mix.d.cts +4 -0
  267. package/dist/{lib/objects/nested-property.d.ts → types/lib/objects/nested-property.d.cts} +5 -3
  268. package/dist/types/lib/objects/normalize-object.d.cts +3 -0
  269. package/dist/types/lib/objects/omit-empty.d.cts +3 -0
  270. package/dist/types/lib/objects/size.d.cts +3 -0
  271. package/dist/{lib/objects/split.d.ts → types/lib/objects/split.d.cts} +5 -1
  272. package/dist/types/lib/promises/index.d.cts +1 -0
  273. package/dist/types/lib/promises/reject.d.cts +5 -0
  274. package/dist/{lib/sse.d.ts → types/lib/sse.d.cts} +4 -2
  275. package/dist/types/lib/strings/convert-case/convert-case.d.cts +10 -0
  276. package/dist/types/lib/strings/index.d.cts +5 -0
  277. package/dist/{lib/strings/markdown.d.ts → types/lib/strings/markdown.d.cts} +4 -2
  278. package/dist/types/lib/strings/name.d.cts +7 -0
  279. package/dist/types/lib/strings/pluralize.d.cts +3 -0
  280. package/dist/types/lib/strings/query-string.d.cts +10 -0
  281. package/dist/types/lib/style/index.d.cts +3 -0
  282. package/dist/types/lib/symbols/index.d.cts +1 -0
  283. package/dist/types/lib/symbols/symbols.d.cts +4 -0
  284. package/dist/types/node/common.d.cts +3 -0
  285. package/dist/types/node/dirname.d.cts +9 -0
  286. package/dist/{node/file-cache.d.ts → types/node/file-cache.d.cts} +7 -5
  287. package/dist/types/node/file.d.cts +4 -0
  288. package/dist/types/node/hash.d.cts +3 -0
  289. package/dist/types/node/index.d.cts +7 -0
  290. package/dist/{dom/pkce.d.ts → types/node/pkce.d.cts} +3 -1
  291. package/dist/types/node/random-string.d.cts +3 -0
  292. package/dist/{node/sanitize.d.ts → types/node/sanitize.d.cts} +3 -1
  293. package/package.json +29 -16
  294. package/{dom → src/dom}/cookie.js +8 -7
  295. package/{dom → src/dom}/index.js +1 -0
  296. package/{dom → src/dom}/random-string.js +1 -1
  297. package/src/dom/random-string.test.js +13 -0
  298. package/src/dom/spam-prevention.js +39 -0
  299. package/{dom → src/dom}/ui/aria-current.js +1 -1
  300. package/{lib → src/lib}/arrays/index.js +1 -0
  301. package/{lib → src/lib}/arrays/sort.js +6 -6
  302. package/src/lib/arrays/split-array.js +15 -0
  303. package/{lib → src/lib}/auth/route-manager.js +1 -0
  304. package/src/lib/checks.js +53 -0
  305. package/{lib → src/lib}/date/time.js +36 -5
  306. package/src/lib/hash.js +18 -0
  307. package/src/lib/hash.spec.js +163 -0
  308. package/{lib → src/lib}/index.js +1 -0
  309. package/{lib → src/lib}/objects/mix/mix.js +30 -11
  310. package/{lib → src/lib}/objects/mix/mix.test.js +57 -1
  311. package/{lib → src/lib}/objects/split.js +1 -1
  312. package/{lib → src/lib}/strings/index.js +1 -0
  313. package/src/lib/strings/name.js +24 -0
  314. package/src/lib/strings/name.test.js +67 -0
  315. package/src/lib/strings/pluralize.js +2 -0
  316. package/{lib → src/lib}/style/index.js +2 -0
  317. package/src/node/random-string.js +10 -0
  318. package/src/node/random-string.test.js +15 -0
  319. package/tsconfig.json +6 -6
  320. package/tsup.config.js +38 -0
  321. package/tsup.config.mjs +43 -0
  322. package/dist/dom/actions/index.d.ts +0 -3
  323. package/dist/dom/actions/masonry.d.ts +0 -3
  324. package/dist/dom/actions/prefer-horizontal-scroll.d.ts +0 -3
  325. package/dist/dom/actions/sticky.d.ts +0 -3
  326. package/dist/dom/cookie.d.ts +0 -11
  327. package/dist/dom/css-vars.d.ts +0 -4
  328. package/dist/dom/events.d.ts +0 -18
  329. package/dist/dom/font-size.d.ts +0 -5
  330. package/dist/dom/hash.d.ts +0 -1
  331. package/dist/dom/index.d.ts +0 -22
  332. package/dist/dom/media.d.ts +0 -3
  333. package/dist/dom/observers/index.d.ts +0 -3
  334. package/dist/dom/observers/observer.d.ts +0 -1
  335. package/dist/dom/ui/aria-current.d.ts +0 -5
  336. package/dist/dom/ui/index.d.ts +0 -4
  337. package/dist/dom/ui/scroll-container.d.ts +0 -1
  338. package/dist/lib/arrays/index.d.ts +0 -5
  339. package/dist/lib/arrays/shuffle.d.ts +0 -1
  340. package/dist/lib/arrays/unique.d.ts +0 -1
  341. package/dist/lib/auth/index.d.ts +0 -1
  342. package/dist/lib/checks.d.ts +0 -29
  343. package/dist/lib/date/index.d.ts +0 -3
  344. package/dist/lib/date/time.d.ts +0 -8
  345. package/dist/lib/form/form-data.d.ts +0 -7
  346. package/dist/lib/form/index.d.ts +0 -2
  347. package/dist/lib/functions/debounce.d.ts +0 -1
  348. package/dist/lib/functions/env.d.ts +0 -1
  349. package/dist/lib/functions/functional.d.ts +0 -4
  350. package/dist/lib/functions/index.d.ts +0 -5
  351. package/dist/lib/functions/throttle.d.ts +0 -1
  352. package/dist/lib/functions/timeout.d.ts +0 -3
  353. package/dist/lib/index.d.ts +0 -13
  354. package/dist/lib/numbers/index.d.ts +0 -2
  355. package/dist/lib/numbers/math.d.ts +0 -2
  356. package/dist/lib/objects/camelcase-keys.d.ts +0 -1
  357. package/dist/lib/objects/empty.d.ts +0 -2
  358. package/dist/lib/objects/equal.d.ts +0 -2
  359. package/dist/lib/objects/extend.d.ts +0 -4
  360. package/dist/lib/objects/flatten.d.ts +0 -4
  361. package/dist/lib/objects/index.d.ts +0 -13
  362. package/dist/lib/objects/json.d.ts +0 -1
  363. package/dist/lib/objects/loop.d.ts +0 -2
  364. package/dist/lib/objects/mix/mix.d.ts +0 -1
  365. package/dist/lib/objects/normalize-object.d.ts +0 -1
  366. package/dist/lib/objects/omit-empty.d.ts +0 -1
  367. package/dist/lib/objects/size.d.ts +0 -1
  368. package/dist/lib/promises/index.d.ts +0 -1
  369. package/dist/lib/promises/reject.d.ts +0 -3
  370. package/dist/lib/strings/convert-case/convert-case.d.ts +0 -8
  371. package/dist/lib/strings/index.d.ts +0 -4
  372. package/dist/lib/strings/pluralize.d.ts +0 -1
  373. package/dist/lib/strings/query-string.d.ts +0 -8
  374. package/dist/lib/style/index.d.ts +0 -1
  375. package/dist/lib/symbols/index.d.ts +0 -1
  376. package/dist/lib/symbols/symbols.d.ts +0 -2
  377. package/dist/node/common.d.ts +0 -1
  378. package/dist/node/dirname.d.ts +0 -7
  379. package/dist/node/file.d.ts +0 -2
  380. package/dist/node/hash.d.ts +0 -1
  381. package/dist/node/index.d.ts +0 -7
  382. package/dist/node/random-string.d.ts +0 -2
  383. package/lib/strings/pluralize.js +0 -2
  384. package/node/random-string.js +0 -10
  385. /package/{dom → src/dom}/accessibility.js +0 -0
  386. /package/{dom → src/dom}/actions/index.js +0 -0
  387. /package/{dom → src/dom}/actions/masonry.js +0 -0
  388. /package/{dom → src/dom}/actions/prefer-horizontal-scroll.js +0 -0
  389. /package/{dom → src/dom}/actions/sticky.js +0 -0
  390. /package/{dom → src/dom}/bounding-box.js +0 -0
  391. /package/{dom → src/dom}/clipboard.js +0 -0
  392. /package/{dom → src/dom}/css-vars.js +0 -0
  393. /package/{dom → src/dom}/events.js +0 -0
  394. /package/{dom → src/dom}/events.test.js +0 -0
  395. /package/{dom → src/dom}/focusable.js +0 -0
  396. /package/{dom → src/dom}/font-size.js +0 -0
  397. /package/{dom → src/dom}/get-element.js +0 -0
  398. /package/{dom → src/dom}/hash.js +0 -0
  399. /package/{dom → src/dom}/keyboard.js +0 -0
  400. /package/{dom → src/dom}/local-store.js +0 -0
  401. /package/{dom → src/dom}/media.js +0 -0
  402. /package/{dom → src/dom}/observers/index.js +0 -0
  403. /package/{dom → src/dom}/observers/intersection-observer.js +0 -0
  404. /package/{dom → src/dom}/observers/mutation-observer.js +0 -0
  405. /package/{dom → src/dom}/observers/observer.js +0 -0
  406. /package/{dom → src/dom}/observers/resize-observer.js +0 -0
  407. /package/{dom → src/dom}/pkce.js +0 -0
  408. /package/{dom → src/dom}/query-params.js +0 -0
  409. /package/{dom → src/dom}/sanitize.js +0 -0
  410. /package/{dom → src/dom}/session-store.js +0 -0
  411. /package/{dom → src/dom}/trap-focus.js +0 -0
  412. /package/{dom → src/dom}/ui/inconsistent-button-fix.js +0 -0
  413. /package/{dom → src/dom}/ui/index.js +0 -0
  414. /package/{dom → src/dom}/ui/scroll-container.js +0 -0
  415. /package/{dom → src/dom}/ui/traverse-and-scramble.js +0 -0
  416. /package/{lib → src/lib}/arrays/item-position.js +0 -0
  417. /package/{lib → src/lib}/arrays/join.js +0 -0
  418. /package/{lib → src/lib}/arrays/shuffle.js +0 -0
  419. /package/{lib → src/lib}/arrays/sort.spec.js +0 -0
  420. /package/{lib → src/lib}/arrays/unique.js +0 -0
  421. /package/{lib → src/lib}/auth/index.js +0 -0
  422. /package/{lib → src/lib}/date/days.js +0 -0
  423. /package/{lib → src/lib}/date/index.js +0 -0
  424. /package/{lib → src/lib}/date/months.js +0 -0
  425. /package/{lib → src/lib}/form/form-data.js +0 -0
  426. /package/{lib → src/lib}/form/index.js +0 -0
  427. /package/{lib → src/lib}/form/sanitize.js +0 -0
  428. /package/{lib → src/lib}/form/sanitize.spec.js +0 -0
  429. /package/{lib → src/lib}/functions/debounce.js +0 -0
  430. /package/{lib → src/lib}/functions/env.js +0 -0
  431. /package/{lib → src/lib}/functions/functional.js +0 -0
  432. /package/{lib → src/lib}/functions/index.js +0 -0
  433. /package/{lib → src/lib}/functions/throttle.js +0 -0
  434. /package/{lib → src/lib}/functions/timeout.js +0 -0
  435. /package/{lib → src/lib}/numbers/index.js +0 -0
  436. /package/{lib → src/lib}/numbers/math.js +0 -0
  437. /package/{lib → src/lib}/objects/camelcase-keys.js +0 -0
  438. /package/{lib → src/lib}/objects/camelcase-keys.test.js +0 -0
  439. /package/{lib → src/lib}/objects/empty.js +0 -0
  440. /package/{lib → src/lib}/objects/equal.js +0 -0
  441. /package/{lib → src/lib}/objects/extend.js +0 -0
  442. /package/{lib → src/lib}/objects/extend.test.js +0 -0
  443. /package/{lib → src/lib}/objects/flatten.js +0 -0
  444. /package/{lib → src/lib}/objects/index.js +0 -0
  445. /package/{lib → src/lib}/objects/json.js +0 -0
  446. /package/{lib → src/lib}/objects/loop.js +0 -0
  447. /package/{lib → src/lib}/objects/loop.test.js +0 -0
  448. /package/{lib → src/lib}/objects/mix/mix.md +0 -0
  449. /package/{lib → src/lib}/objects/nested-property.js +0 -0
  450. /package/{lib → src/lib}/objects/normalize-object.js +0 -0
  451. /package/{lib → src/lib}/objects/omit-empty.js +0 -0
  452. /package/{lib → src/lib}/objects/omit-empty.test.js +0 -0
  453. /package/{lib → src/lib}/objects/size.js +0 -0
  454. /package/{lib → src/lib}/promises/index.js +0 -0
  455. /package/{lib → src/lib}/promises/reject.js +0 -0
  456. /package/{lib → src/lib}/sse.js +0 -0
  457. /package/{lib → src/lib}/strings/convert-case/convert-case.js +0 -0
  458. /package/{lib → src/lib}/strings/convert-case/convert-case.md +0 -0
  459. /package/{lib → src/lib}/strings/convert-case/convert-case.test.js +0 -0
  460. /package/{lib → src/lib}/strings/markdown.js +0 -0
  461. /package/{lib → src/lib}/strings/query-string.js +0 -0
  462. /package/{lib → src/lib}/symbols/index.js +0 -0
  463. /package/{lib → src/lib}/symbols/symbols.js +0 -0
  464. /package/{node → src/node}/common.js +0 -0
  465. /package/{node → src/node}/dirname.js +0 -0
  466. /package/{node → src/node}/file-cache.js +0 -0
  467. /package/{node → src/node}/file.js +0 -0
  468. /package/{node → src/node}/hash.js +0 -0
  469. /package/{node → src/node}/index.js +0 -0
  470. /package/{node → src/node}/pkce.js +0 -0
  471. /package/{node → src/node}/sanitize.js +0 -0
  472. /package/{node → src/node}/sanitize.spec.js +0 -0
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Checks if a value is a plain object (not an array or null)
3
+ * @param {unknown} x - The value to check
4
+ * @returns {boolean} True if the value is a plain object
5
+ * @example
6
+ * isObject({}) // true
7
+ * isObject([]) // false
8
+ * isObject(null) // false
9
+ */
10
+ export function isObject(x) {
11
+ return typeof x === 'object' && !Array.isArray(x) && x !== null
12
+ }
13
+
14
+ /**
15
+ * Checks if a value is an array
16
+ * @param {unknown} x - The value to check
17
+ * @returns {boolean} True if the value is an array
18
+ * @example
19
+ * isArray([]) // true
20
+ * isArray({}) // false
21
+ */
22
+ export function isArray(x) {
23
+ return Array.isArray(x)
24
+ }
25
+
26
+ /**
27
+ * Checks if a value is not a plain object
28
+ * @param {unknown} x - The value to check
29
+ * @returns {boolean} True if the value is not a plain object
30
+ * @example
31
+ * notObject([]) // true
32
+ * notObject(null) // true
33
+ * notObject({}) // false
34
+ */
35
+ export function notObject(x) {
36
+ return !isObject(x)
37
+ }
38
+
39
+ export function getType(x) {
40
+ if (typeof x === 'string') return 'string'
41
+ if (typeof x === 'number') {
42
+ if (Number.isInteger(x)) return 'integer'
43
+ return 'float'
44
+ }
45
+ if (typeof x === 'boolean') return 'boolean'
46
+ if (typeof x === 'function') return 'function'
47
+ if (typeof x === 'undefined') return 'undefined'
48
+ if (typeof x === 'symbol') return 'symbol'
49
+ if (typeof x === 'bigint') return 'bigint'
50
+ if (Array.isArray(x)) return 'array'
51
+ if (typeof x === 'object') return 'object'
52
+ return 'unknown'
53
+ }
@@ -27,11 +27,6 @@ export function ms(arg) {
27
27
  return value
28
28
  }
29
29
 
30
- export function seconds(arg) {
31
- const value = ms(arg)
32
- return value / 1000
33
- }
34
-
35
30
  export function getTimeInMs(value, unit = 'ms') {
36
31
  switch (unit) {
37
32
  case 'ms':
@@ -48,3 +43,39 @@ export function getTimeInMs(value, unit = 'ms') {
48
43
  return value * 1000 * 60 * 60 * 24 * 7
49
44
  }
50
45
  }
46
+
47
+ export function toWeeks(ms) {
48
+ return ms / 1000 / 60 / 60 / 24 / 7
49
+ }
50
+
51
+ export function toDays(ms) {
52
+ return ms / 1000 / 60 / 60 / 24
53
+ }
54
+
55
+ export function toHours(ms) {
56
+ return ms / 1000 / 60 / 60
57
+ }
58
+
59
+ export function toMinutes(ms) {
60
+ return ms / 1000 / 60
61
+ }
62
+
63
+ export function toSeconds(ms) {
64
+ return ms / 1000
65
+ }
66
+
67
+ // Get the total number of weeks, days, hours, minutes, and seconds
68
+ export function toReadableTime(ms) {
69
+ const weekMs = 1000 * 60 * 60 * 24 * 7
70
+ const dayMs = 1000 * 60 * 60 * 24
71
+ const hourMs = 1000 * 60 * 60
72
+ const minuteMs = 1000 * 60
73
+
74
+ const weeks = Math.floor(ms / weekMs)
75
+ const days = Math.floor((ms % weekMs) / dayMs)
76
+ const hours = Math.floor((ms % dayMs) / hourMs)
77
+ const minutes = Math.floor((ms % hourMs) / minuteMs)
78
+ const seconds = Math.floor((ms % minuteMs) / 1000)
79
+
80
+ return { weeks, days, hours, minutes, seconds }
81
+ }
@@ -0,0 +1,18 @@
1
+ export function isHashedValue(value, type = 'sha256') {
2
+ if (typeof value !== 'string') return null
3
+ value = value.trim()
4
+ type = type.toLowerCase()
5
+
6
+ if (type === 'sha256') {
7
+ return value.length === 64 && /^[a-fA-F0-9]{64}$/.test(value)
8
+ }
9
+
10
+ if (type === 'sha1') {
11
+ return value.length === 40 && /^[a-fA-F0-9]{40}$/.test(value)
12
+ }
13
+
14
+ if (type === 'md5') {
15
+ return value.length === 32 && /^[a-fA-F0-9]{32}$/.test(value)
16
+ }
17
+ return null
18
+ }
@@ -0,0 +1,163 @@
1
+ import { describe, expect, it } from 'vitest'
2
+ import { isHashedValue } from './hash.js'
3
+
4
+ describe('isHashedValue', () => {
5
+ describe('SHA256 hashes', () => {
6
+ it('returns true for valid SHA256 hash', () => {
7
+ const validSha256 =
8
+ 'a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3'
9
+ expect(isHashedValue(validSha256, 'sha256')).toBe(true)
10
+ expect(isHashedValue(validSha256)).toBe(true) // default type
11
+ })
12
+
13
+ it('returns true for valid SHA256 hash with uppercase letters', () => {
14
+ const validSha256 =
15
+ 'A665A45920422F9D417E4867EFDC4FB8A04A1F3FFF1FA07E998E86F7F7A27AE3'
16
+ expect(isHashedValue(validSha256, 'sha256')).toBe(true)
17
+ })
18
+
19
+ it('returns true for valid SHA256 hash with mixed case', () => {
20
+ const validSha256 =
21
+ 'A665a45920422F9d417E4867efdc4FB8a04a1F3fff1FA07e998E86f7f7A27ae3'
22
+ expect(isHashedValue(validSha256, 'sha256')).toBe(true)
23
+ })
24
+
25
+ it('returns false for SHA256 hash with wrong length', () => {
26
+ const shortHash =
27
+ 'a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae'
28
+ const longHash =
29
+ 'a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae33'
30
+ expect(isHashedValue(shortHash, 'sha256')).toBe(false)
31
+ expect(isHashedValue(longHash, 'sha256')).toBe(false)
32
+ })
33
+
34
+ it('returns false for SHA256 hash with invalid characters', () => {
35
+ const invalidHash =
36
+ 'g665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3'
37
+ expect(isHashedValue(invalidHash, 'sha256')).toBe(false)
38
+ })
39
+ })
40
+
41
+ describe('SHA1 hashes', () => {
42
+ it('returns true for valid SHA1 hash', () => {
43
+ const validSha1 = '356a192b7913b04c54574d18c28d46e6395428ab'
44
+ expect(isHashedValue(validSha1, 'sha1')).toBe(true)
45
+ })
46
+
47
+ it('returns true for valid SHA1 hash with uppercase letters', () => {
48
+ const validSha1 = '356A192B7913B04C54574D18C28D46E6395428AB'
49
+ expect(isHashedValue(validSha1, 'sha1')).toBe(true)
50
+ })
51
+
52
+ it('returns false for SHA1 hash with wrong length', () => {
53
+ const shortHash = '356a192b7913b04c54574d18c28d46e6395428a'
54
+ const longHash = '356a192b7913b04c54574d18c28d46e6395428abb'
55
+ expect(isHashedValue(shortHash, 'sha1')).toBe(false)
56
+ expect(isHashedValue(longHash, 'sha1')).toBe(false)
57
+ })
58
+
59
+ it('returns false for SHA1 hash with invalid characters', () => {
60
+ const invalidHash = '356g192b7913b04c54574d18c28d46e6395428ab'
61
+ expect(isHashedValue(invalidHash, 'sha1')).toBe(false)
62
+ })
63
+ })
64
+
65
+ describe('MD5 hashes', () => {
66
+ it('returns true for valid MD5 hash', () => {
67
+ const validMd5 = '5d41402abc4b2a76b9719d911017c592'
68
+ expect(isHashedValue(validMd5, 'md5')).toBe(true)
69
+ })
70
+
71
+ it('returns true for valid MD5 hash with uppercase letters', () => {
72
+ const validMd5 = '5D41402ABC4B2A76B9719D911017C592'
73
+ expect(isHashedValue(validMd5, 'md5')).toBe(true)
74
+ })
75
+
76
+ it('returns false for MD5 hash with wrong length', () => {
77
+ const shortHash = '5d41402abc4b2a76b9719d911017c59'
78
+ const longHash = '5d41402abc4b2a76b9719d911017c5922'
79
+ expect(isHashedValue(shortHash, 'md5')).toBe(false)
80
+ expect(isHashedValue(longHash, 'md5')).toBe(false)
81
+ })
82
+
83
+ it('returns false for MD5 hash with invalid characters', () => {
84
+ const invalidHash = '5g41402abc4b2a76b9719d911017c592'
85
+ expect(isHashedValue(invalidHash, 'md5')).toBe(false)
86
+ })
87
+ })
88
+
89
+ describe('Type parameter handling', () => {
90
+ it('handles case insensitive type parameter', () => {
91
+ const validSha256 =
92
+ 'a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3'
93
+ expect(isHashedValue(validSha256, 'SHA256')).toBe(true)
94
+ expect(isHashedValue(validSha256, 'Sha256')).toBe(true)
95
+ expect(isHashedValue(validSha256, 'sHa256')).toBe(true)
96
+ })
97
+
98
+ it('returns null for unsupported hash type', () => {
99
+ const validSha256 =
100
+ 'a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3'
101
+ expect(isHashedValue(validSha256, 'sha512')).toBe(null)
102
+ expect(isHashedValue(validSha256, 'blake2b')).toBe(null)
103
+ expect(isHashedValue(validSha256, 'unknown')).toBe(null)
104
+ })
105
+ })
106
+
107
+ describe('Input validation', () => {
108
+ it('returns null for non-string inputs', () => {
109
+ expect(isHashedValue(null)).toBe(null)
110
+ expect(isHashedValue(undefined)).toBe(null)
111
+ expect(isHashedValue(123)).toBe(null)
112
+ expect(isHashedValue([])).toBe(null)
113
+ expect(isHashedValue({})).toBe(null)
114
+ expect(isHashedValue(true)).toBe(null)
115
+ })
116
+
117
+ it('handles empty string', () => {
118
+ expect(isHashedValue('')).toBe(false)
119
+ expect(isHashedValue('', 'sha1')).toBe(false)
120
+ expect(isHashedValue('', 'md5')).toBe(false)
121
+ })
122
+
123
+ it('trims whitespace from input', () => {
124
+ const validSha256 =
125
+ ' a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3 '
126
+ expect(isHashedValue(validSha256, 'sha256')).toBe(true)
127
+ })
128
+
129
+ it('returns false for strings with only whitespace', () => {
130
+ expect(isHashedValue(' ')).toBe(false)
131
+ expect(isHashedValue('\t\n')).toBe(false)
132
+ })
133
+ })
134
+
135
+ describe('Edge cases', () => {
136
+ it('returns false for strings that are all zeros but correct length', () => {
137
+ const zeroSha256 =
138
+ '0000000000000000000000000000000000000000000000000000000000000000'
139
+ const zeroSha1 = '0000000000000000000000000000000000000000'
140
+ const zeroMd5 = '00000000000000000000000000000000'
141
+
142
+ expect(isHashedValue(zeroSha256, 'sha256')).toBe(true)
143
+ expect(isHashedValue(zeroSha1, 'sha1')).toBe(true)
144
+ expect(isHashedValue(zeroMd5, 'md5')).toBe(true)
145
+ })
146
+
147
+ it('returns false for correct length but non-hex characters', () => {
148
+ const nonHexSha256 =
149
+ 'g665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3'
150
+ const nonHexSha1 = '356g192b7913b04c54574d18c28d46e6395428ab'
151
+ const nonHexMd5 = '5g41402abc4b2a76b9719d911017c592'
152
+
153
+ expect(isHashedValue(nonHexSha256, 'sha256')).toBe(false)
154
+ expect(isHashedValue(nonHexSha1, 'sha1')).toBe(false)
155
+ expect(isHashedValue(nonHexMd5, 'md5')).toBe(false)
156
+ })
157
+
158
+ it('handles special characters correctly', () => {
159
+ const specialChars = '!@#$%^&*()_+-=[]{}|;:,.<>?/~`'
160
+ expect(isHashedValue(specialChars, 'sha256')).toBe(false)
161
+ })
162
+ })
163
+ })
@@ -4,6 +4,7 @@ export * from './checks.js'
4
4
  export * from './date/index.js'
5
5
  export * from './form/index.js'
6
6
  export * from './functions/index.js'
7
+ export * from './hash.js'
7
8
  export * from './numbers/index.js'
8
9
  export * from './objects/index.js'
9
10
  export * from './promises/index.js'
@@ -1,14 +1,24 @@
1
- export function mix(...sources) {
2
- const result = {}
3
- for (const source of sources) {
4
- // Skip null or undefined sources
5
- if (source == null) continue
6
- merge(result, source)
1
+ const DEFAULT_OPTIONS = { array: 'concat' }
2
+
3
+ export const mix = createMix()
4
+
5
+ export function createMix(userOptions = {}) {
6
+ const options = { ...DEFAULT_OPTIONS, ...userOptions }
7
+
8
+ function _mix(...sources) {
9
+ const result = {}
10
+ for (const source of sources) {
11
+ // Skip null or undefined sources
12
+ if (source == null) continue
13
+ merge(result, source, options)
14
+ }
15
+ return result
7
16
  }
8
- return result
17
+
18
+ return _mix
9
19
  }
10
20
 
11
- function merge(output, input) {
21
+ function merge(output, input, options) {
12
22
  const props = Object.keys(input)
13
23
 
14
24
  for (const prop of props) {
@@ -31,14 +41,23 @@ function merge(output, input) {
31
41
  continue
32
42
  }
33
43
 
34
- // If have prop, but type is Object => Concat the arrays together.
44
+ // Incoming non-object (primitive/null) => always overwrite
45
+ if (descriptor.value == null || typeof descriptor.value !== 'object') {
46
+ Object.defineProperty(output, prop, descriptor)
47
+ continue
48
+ }
49
+
50
+ // If have prop, and incoming is Array => concat or replace
35
51
  if (objectType(descriptor.value) === '[object Array]') {
36
- output[prop] = output[prop].concat(descriptor.value)
52
+ output[prop] =
53
+ options.array === 'replace'
54
+ ? descriptor.value.slice()
55
+ : output[prop].concat(descriptor.value)
37
56
  continue
38
57
  }
39
58
 
40
59
  // If have prop, but type is Object => Merge.
41
- merge(output[prop], descriptor.value)
60
+ merge(output[prop], descriptor.value, options)
42
61
 
43
62
  // Not sure if I have to deal with overwriting maps / dates. When it comes, I guess!
44
63
  }
@@ -1,6 +1,6 @@
1
1
  import { expect, it } from 'vitest'
2
2
 
3
- import { mix } from './mix.js'
3
+ import { createMix, mix } from './mix.js'
4
4
 
5
5
  it('Merge objects', () => {
6
6
  const one = { one: 'one', overwrite: 'nope' }
@@ -338,3 +338,59 @@ it('should skip null and undefined sources', () => {
338
338
 
339
339
  expect(mix(null, obj1, undefined, obj2, null)).toEqual(expected)
340
340
  })
341
+
342
+ it('should not skip null and false properties', () => {
343
+ const obj1 = { a: 1, b: 2, c: 3 }
344
+ const obj2 = { a: null, b: false, c: undefined }
345
+ const expected = { a: null, b: false, c: undefined }
346
+
347
+ expect(mix(obj1, obj2)).toEqual(expected)
348
+ })
349
+
350
+ it('Real Nested Example', () => {
351
+ const defaultOpts = {
352
+ transforms: {
353
+ extractFromFileName: { date: 'pubDate', slug: 'slug' },
354
+ setLatestDate: {
355
+ targetProperty: 'date',
356
+ sourceProperties: ['pubDate', 'updateDate'],
357
+ },
358
+ generateExcerpt: true,
359
+ stripFileNumbering: true,
360
+ stripMore: true,
361
+ },
362
+ sort: {
363
+ props: ['data.date', 'data.pubDate', 'data.title'],
364
+ reverse: true,
365
+ },
366
+ filter: 'published',
367
+ }
368
+
369
+ const newOptions = {
370
+ transforms: {
371
+ extractFromFileName: false,
372
+ generateExcerpt: false,
373
+ stripMore: false,
374
+ // stripFileNumbering: true,
375
+ },
376
+ sort: { props: ['filePath'], reverse: false },
377
+ filter: false,
378
+ }
379
+ const expected = {
380
+ transforms: {
381
+ setLatestDate: {
382
+ targetProperty: 'date',
383
+ sourceProperties: ['pubDate', 'updateDate'],
384
+ },
385
+ extractFromFileName: false,
386
+ generateExcerpt: false,
387
+ stripFileNumbering: true,
388
+ stripMore: false,
389
+ },
390
+ sort: { props: ['filePath'], reverse: false },
391
+ filter: false,
392
+ }
393
+
394
+ const mixReplace = createMix({ array: 'replace' })
395
+ expect(mixReplace(defaultOpts, newOptions)).toEqual(expected)
396
+ })
@@ -15,5 +15,5 @@ export function splitObject(obj, keys) {
15
15
  }
16
16
  })
17
17
 
18
- return { picked, omitted }
18
+ return { picked, omitted, p: picked, o: omitted }
19
19
  }
@@ -1,4 +1,5 @@
1
1
  export * from './convert-case/convert-case.js'
2
2
  export * from './markdown.js'
3
+ export * from './name.js'
3
4
  export * from './pluralize.js'
4
5
  export * from './query-string.js'
@@ -0,0 +1,24 @@
1
+ export function parseFullName(name) {
2
+ const parts = name.trim().split(/\s+/)
3
+
4
+ if (parts.length === 1) {
5
+ return { firstName: parts[0], middleName: '', lastName: '' }
6
+ }
7
+
8
+ if (parts.length === 2) {
9
+ return { firstName: parts[0], middleName: '', lastName: parts[1] }
10
+ }
11
+
12
+ if (parts.length === 3) {
13
+ const firstName = parts.slice(0, 2).join(' ')
14
+ const lastName = parts[2]
15
+ return { firstName, middleName: '', lastName }
16
+ }
17
+
18
+ // 4+ words: first 2 words = firstName, last word = lastName, middle = middleName
19
+ const firstName = parts.slice(0, 2).join(' ')
20
+ const lastName = parts[parts.length - 1]
21
+ const middleName = parts.slice(2, -1).join(' ')
22
+
23
+ return { firstName, middleName, lastName }
24
+ }
@@ -0,0 +1,67 @@
1
+ import { describe, expect, test } from 'vitest'
2
+ import { parseFullName } from './name.js'
3
+
4
+ describe('parseFullName', () => {
5
+ test('handles single name', () => {
6
+ const result = parseFullName('John')
7
+ expect(result).toEqual({
8
+ firstName: 'John',
9
+ middleName: '',
10
+ lastName: '',
11
+ })
12
+ })
13
+
14
+ test('handles two names', () => {
15
+ const result = parseFullName('John Doe')
16
+ expect(result).toEqual({
17
+ firstName: 'John',
18
+ middleName: '',
19
+ lastName: 'Doe',
20
+ })
21
+ })
22
+
23
+ test('handles three names (Chinese pattern)', () => {
24
+ const result = parseFullName('Wee Keat Liew')
25
+ expect(result).toEqual({
26
+ firstName: 'Wee Keat',
27
+ middleName: '',
28
+ lastName: 'Liew',
29
+ })
30
+ })
31
+
32
+ test('handles four names with middle name', () => {
33
+ const result = parseFullName('Mary Jane Michael Doe')
34
+ expect(result).toEqual({
35
+ firstName: 'Mary Jane',
36
+ middleName: 'Michael',
37
+ lastName: 'Doe',
38
+ })
39
+ })
40
+
41
+ test('handles five names with multiple middle names', () => {
42
+ const result = parseFullName('Mary Jane Catherine Elizabeth Doe')
43
+ expect(result).toEqual({
44
+ firstName: 'Mary Jane',
45
+ middleName: 'Catherine Elizabeth',
46
+ lastName: 'Doe',
47
+ })
48
+ })
49
+
50
+ test('handles extra whitespace', () => {
51
+ const result = parseFullName(' John Doe ')
52
+ expect(result).toEqual({
53
+ firstName: 'John',
54
+ middleName: '',
55
+ lastName: 'Doe',
56
+ })
57
+ })
58
+
59
+ test('handles multiple spaces between words', () => {
60
+ const result = parseFullName('Wee Keat Liew')
61
+ expect(result).toEqual({
62
+ firstName: 'Wee Keat',
63
+ middleName: '',
64
+ lastName: 'Liew',
65
+ })
66
+ })
67
+ })
@@ -0,0 +1,2 @@
1
+ import pluralizeLib from 'pluralize'
2
+ export const pluralize = pluralizeLib
@@ -1,6 +1,8 @@
1
1
  import { toKebab } from '../strings/convert-case/convert-case.js'
2
2
 
3
3
  export function toStyleString(style) {
4
+ if (!style) return null
5
+ if (typeof style === 'string') return style
4
6
  return Object.entries(style)
5
7
  .map(([k, v]) => {
6
8
  if (k.startsWith('--')) return `${k}:${v}`
@@ -0,0 +1,10 @@
1
+ import crypto from 'node:crypto'
2
+
3
+ export function randomString(length = 32) {
4
+ // Calculate bytes needed for desired character length
5
+ // Base64: 4 chars per 3 bytes, so we need ceil(length * 3 / 4) bytes
6
+ // Add extra bytes to ensure we have enough after encoding
7
+ const bytesNeeded = Math.ceil((length * 3) / 4) + 3
8
+
9
+ return crypto.randomBytes(bytesNeeded).toString('base64').slice(0, length)
10
+ }
@@ -0,0 +1,15 @@
1
+ import { describe, expect, it } from 'vitest'
2
+ import { randomString } from './random-string.js'
3
+
4
+ describe('randomString', () => {
5
+ it('should generate a random string', () => {
6
+ const str = randomString(32)
7
+ expect(str).toBeDefined()
8
+ expect(str.length).toBe(32)
9
+
10
+ const str2 = randomString(40)
11
+ expect(str2).toBeDefined()
12
+ expect(str2.length).toBe(40)
13
+ expect(str2).not.toBe(str)
14
+ })
15
+ })
package/tsconfig.json CHANGED
@@ -6,18 +6,18 @@
6
6
  "allowJs": true,
7
7
  "checkJs": true,
8
8
  "declaration": true,
9
- "emitDeclarationOnly": true,
10
- "outDir": "./dist",
9
+ "emitDeclarationOnly": false,
10
+ "outDir": "./dist/temp",
11
11
  "strict": false,
12
12
  "noImplicitAny": false,
13
13
  "skipLibCheck": true,
14
14
  "forceConsistentCasingInFileNames": true,
15
15
  "resolveJsonModule": true,
16
16
  "isolatedModules": true,
17
- "noEmit": false,
17
+ "noEmit": true,
18
18
  "esModuleInterop": true,
19
19
  "allowSyntheticDefaultImports": true
20
20
  },
21
- "include": ["lib/**/*", "dom/**/*", "node/**/*"],
22
- "exclude": ["node_modules", "**/*.test.js", "**/*.spec.js"]
23
- }
21
+ "include": ["src/**/*"],
22
+ "exclude": ["node_modules", "**/*.test.js", "**/*.spec.js", "dist/**/*"]
23
+ }
package/tsup.config.js ADDED
@@ -0,0 +1,38 @@
1
+ import { defineConfig } from 'tsup'
2
+
3
+ export default defineConfig([
4
+ // ESM build
5
+ {
6
+ entry: 'src/**/*.js',
7
+ format: ['esm'],
8
+ outDir: 'dist/esm',
9
+ clean: true,
10
+ splitting: false,
11
+ sourcemap: false,
12
+ dts: false,
13
+ ignoreWatch: ['**/*.test.js', '**/*.spec.js'],
14
+ },
15
+ // CJS build
16
+ {
17
+ entry: 'src/**/*.js',
18
+ format: ['cjs'],
19
+ outDir: 'dist/cjs',
20
+ outExtension: () => ({ js: '.cjs' }),
21
+ clean: false,
22
+ splitting: false,
23
+ sourcemap: false,
24
+ dts: false,
25
+ ignoreWatch: ['**/*.test.js', '**/*.spec.js'],
26
+ },
27
+ // Types build
28
+ {
29
+ entry: 'src/**/*.js',
30
+ dts: {
31
+ only: true,
32
+ },
33
+ outDir: 'dist/types',
34
+ outExtension: () => ({ dts: '.d.cts' }),
35
+ clean: false,
36
+ ignoreWatch: ['**/*.test.js', '**/*.spec.js'],
37
+ },
38
+ ])
@@ -0,0 +1,43 @@
1
+ import { glob } from 'glob'
2
+ import { defineConfig } from 'tsup'
3
+
4
+ function getEntryPoints() {
5
+ // Get all JS files except test files
6
+ return glob.sync('src/**/*.js', {
7
+ ignore: ['**/*.test.js', '**/*.spec.js'],
8
+ })
9
+ }
10
+
11
+ export default defineConfig([
12
+ // ESM build
13
+ {
14
+ entry: getEntryPoints(),
15
+ format: ['esm'],
16
+ outDir: 'dist/esm',
17
+ clean: true,
18
+ splitting: false,
19
+ sourcemap: false,
20
+ dts: false,
21
+ },
22
+ // CJS build
23
+ {
24
+ entry: getEntryPoints(),
25
+ format: ['cjs'],
26
+ outDir: 'dist/cjs',
27
+ outExtension: () => ({ js: '.cjs' }),
28
+ clean: false,
29
+ splitting: false,
30
+ sourcemap: false,
31
+ dts: false,
32
+ },
33
+ // Types build
34
+ {
35
+ entry: getEntryPoints(),
36
+ dts: {
37
+ only: true,
38
+ },
39
+ outDir: 'dist/types',
40
+ outExtension: () => ({ dts: '.d.cts' }),
41
+ clean: false,
42
+ },
43
+ ])