@studiometa/js-toolkit 3.1.0 → 3.2.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 (228) hide show
  1. package/Base/Base.d.ts +14 -12
  2. package/Base/Base.js +17 -16
  3. package/Base/Base.js.map +2 -2
  4. package/Base/managers/AbstractManager.d.ts +1 -1
  5. package/Base/managers/ChildrenManager.d.ts +2 -2
  6. package/Base/managers/ChildrenManager.js +4 -4
  7. package/Base/managers/ChildrenManager.js.map +2 -2
  8. package/Base/managers/EventsManager.d.ts +10 -10
  9. package/Base/managers/EventsManager.js +10 -10
  10. package/Base/managers/EventsManager.js.map +1 -1
  11. package/Base/managers/ResponsiveOptionsManager.d.ts +6 -6
  12. package/Base/managers/ResponsiveOptionsManager.js +6 -6
  13. package/Base/managers/ResponsiveOptionsManager.js.map +1 -1
  14. package/Base/managers/ServicesManager.d.ts +2 -2
  15. package/Base/managers/ServicesManager.js +2 -2
  16. package/Base/managers/ServicesManager.js.map +1 -1
  17. package/Base/utils.d.ts +3 -2
  18. package/Base/utils.js +7 -5
  19. package/Base/utils.js.map +2 -2
  20. package/decorators/index.d.ts +1 -0
  21. package/decorators/index.js +1 -0
  22. package/decorators/index.js.map +2 -2
  23. package/decorators/withBreakpointManager.d.ts +2 -1
  24. package/decorators/withBreakpointManager.js.map +2 -2
  25. package/decorators/withBreakpointObserver.d.ts +2 -1
  26. package/decorators/withBreakpointObserver.js.map +2 -2
  27. package/decorators/withDrag.d.ts +2 -1
  28. package/decorators/withDrag.js.map +2 -2
  29. package/decorators/withExtraConfig.d.ts +2 -1
  30. package/decorators/withExtraConfig.js.map +2 -2
  31. package/decorators/withFreezedOptions.d.ts +2 -1
  32. package/decorators/withFreezedOptions.js.map +2 -2
  33. package/decorators/withGroup.d.ts +16 -0
  34. package/decorators/withGroup.js +33 -0
  35. package/decorators/withGroup.js.map +7 -0
  36. package/decorators/withIntersectionObserver.d.ts +2 -1
  37. package/decorators/withIntersectionObserver.js.map +2 -2
  38. package/decorators/withMountOnMediaQuery.d.ts +2 -1
  39. package/decorators/withMountOnMediaQuery.js.map +2 -2
  40. package/decorators/withMountWhenInView.d.ts +2 -1
  41. package/decorators/withMountWhenInView.js.map +2 -2
  42. package/decorators/withMountWhenPrefersMotion.d.ts +3 -0
  43. package/decorators/withMountWhenPrefersMotion.js.map +2 -2
  44. package/decorators/withMutation.d.ts +2 -1
  45. package/decorators/withMutation.js.map +2 -2
  46. package/decorators/withRelativePointer.d.ts +2 -1
  47. package/decorators/withRelativePointer.js.map +2 -2
  48. package/decorators/withResponsiveOptions.d.ts +2 -1
  49. package/decorators/withResponsiveOptions.js.map +2 -2
  50. package/decorators/withScrolledInView/withScrolledInView.d.ts +2 -1
  51. package/decorators/withScrolledInView/withScrolledInView.js.map +2 -2
  52. package/helpers/createApp.d.ts +2 -1
  53. package/helpers/createApp.js.map +2 -2
  54. package/helpers/getClosestParent.d.ts +2 -1
  55. package/helpers/getClosestParent.js.map +2 -2
  56. package/helpers/getDirectChildren.d.ts +13 -11
  57. package/helpers/getDirectChildren.js.map +2 -2
  58. package/helpers/getInstanceFromElement.d.ts +2 -1
  59. package/helpers/getInstanceFromElement.js +2 -2
  60. package/helpers/getInstanceFromElement.js.map +2 -2
  61. package/helpers/importOnInteraction.d.ts +3 -2
  62. package/helpers/importOnInteraction.js.map +2 -2
  63. package/helpers/importOnMediaQuery.d.ts +3 -2
  64. package/helpers/importOnMediaQuery.js.map +2 -2
  65. package/helpers/importWhenIdle.d.ts +3 -2
  66. package/helpers/importWhenIdle.js.map +2 -2
  67. package/helpers/importWhenPrefersMotion.d.ts +3 -2
  68. package/helpers/importWhenPrefersMotion.js.map +2 -2
  69. package/helpers/importWhenVisible.d.ts +3 -2
  70. package/helpers/importWhenVisible.js.map +2 -2
  71. package/helpers/index.d.ts +1 -0
  72. package/helpers/index.js +1 -0
  73. package/helpers/index.js.map +2 -2
  74. package/helpers/registerComponent.d.ts +10 -0
  75. package/helpers/registerComponent.js +11 -0
  76. package/helpers/registerComponent.js.map +7 -0
  77. package/helpers/utils.d.ts +1 -1
  78. package/helpers/utils.js.map +1 -1
  79. package/index.d.ts +1 -0
  80. package/index.js +4 -0
  81. package/index.js.map +2 -2
  82. package/package.json +1 -1
  83. package/services/AbstractService.d.ts +1 -1
  84. package/services/AbstractService.js.map +1 -1
  85. package/services/DragService.d.ts +3 -2
  86. package/services/DragService.js +5 -1
  87. package/services/DragService.js.map +2 -2
  88. package/services/KeyService.d.ts +2 -1
  89. package/services/KeyService.js.map +2 -2
  90. package/services/LoadService.d.ts +2 -1
  91. package/services/LoadService.js.map +2 -2
  92. package/services/MutationService.d.ts +2 -1
  93. package/services/MutationService.js.map +2 -2
  94. package/services/PointerService.d.ts +2 -1
  95. package/services/PointerService.js.map +2 -2
  96. package/services/RafService.d.ts +2 -1
  97. package/services/RafService.js.map +2 -2
  98. package/services/ResizeService.d.ts +2 -1
  99. package/services/ResizeService.js.map +2 -2
  100. package/services/ScrollService.d.ts +2 -1
  101. package/services/ScrollService.js.map +2 -2
  102. package/tsconfig.build.tsbuildinfo +1 -1
  103. package/utils/SmartQueue.js.map +1 -1
  104. package/utils/cache.d.ts +2 -1
  105. package/utils/cache.js.map +2 -2
  106. package/utils/collide/boundingRectToCircle.d.ts +3 -2
  107. package/utils/collide/boundingRectToCircle.js.map +2 -2
  108. package/utils/collide/collideCircleCircle.d.ts +3 -2
  109. package/utils/collide/collideCircleCircle.js.map +2 -2
  110. package/utils/collide/collideCircleRect.d.ts +3 -2
  111. package/utils/collide/collideCircleRect.js.map +2 -2
  112. package/utils/collide/collidePointCircle.d.ts +3 -2
  113. package/utils/collide/collidePointCircle.js.map +2 -2
  114. package/utils/collide/collidePointRect.d.ts +3 -2
  115. package/utils/collide/collidePointRect.js.map +2 -2
  116. package/utils/collide/collideRectRect.d.ts +3 -2
  117. package/utils/collide/collideRectRect.js.map +2 -2
  118. package/utils/css/animate.d.ts +2 -1
  119. package/utils/css/animate.js.map +2 -2
  120. package/utils/css/classes.d.ts +6 -3
  121. package/utils/css/classes.js.map +2 -2
  122. package/utils/css/getOffsetSizes.d.ts +2 -1
  123. package/utils/css/getOffsetSizes.js.map +2 -2
  124. package/utils/css/matrix.d.ts +10 -9
  125. package/utils/css/matrix.js.map +2 -2
  126. package/utils/css/styles.d.ts +4 -2
  127. package/utils/css/styles.js.map +2 -2
  128. package/utils/css/transform.d.ts +2 -1
  129. package/utils/css/transform.js.map +2 -2
  130. package/utils/css/transition.d.ts +3 -2
  131. package/utils/css/transition.js +1 -1
  132. package/utils/css/transition.js.map +2 -2
  133. package/utils/debounce.d.ts +5 -4
  134. package/utils/debounce.js.map +2 -2
  135. package/utils/dom/createElement.d.ts +24 -1
  136. package/utils/dom/createElement.js +8 -2
  137. package/utils/dom/createElement.js.map +2 -2
  138. package/utils/getComponentResolver.d.ts +1 -1
  139. package/utils/getComponentResolver.js.map +1 -1
  140. package/utils/history.d.ts +17 -14
  141. package/utils/history.js.map +2 -2
  142. package/utils/is.d.ts +25 -9
  143. package/utils/is.js.map +2 -2
  144. package/utils/keyCodes.d.ts +3 -0
  145. package/utils/keyCodes.js.map +2 -2
  146. package/utils/loadElement.d.ts +10 -5
  147. package/utils/loadElement.js.map +2 -2
  148. package/utils/math/clamp.d.ts +2 -6
  149. package/utils/math/clamp.js.map +2 -2
  150. package/utils/math/clamp01.d.ts +2 -4
  151. package/utils/math/clamp01.js.map +2 -2
  152. package/utils/math/createEases.d.ts +13 -5
  153. package/utils/math/createEases.js.map +2 -2
  154. package/utils/math/createRange.d.ts +2 -1
  155. package/utils/math/createRange.js.map +2 -2
  156. package/utils/math/damp.d.ts +7 -6
  157. package/utils/math/damp.js.map +2 -2
  158. package/utils/math/ease.d.ts +23 -14
  159. package/utils/math/ease.js.map +2 -2
  160. package/utils/math/inertiaFinalValue.d.ts +6 -5
  161. package/utils/math/inertiaFinalValue.js.map +2 -2
  162. package/utils/math/lerp.d.ts +6 -5
  163. package/utils/math/lerp.js.map +2 -2
  164. package/utils/math/map.d.ts +3 -2
  165. package/utils/math/map.js.map +2 -2
  166. package/utils/math/mean.d.ts +3 -0
  167. package/utils/math/mean.js.map +2 -2
  168. package/utils/math/round.d.ts +5 -4
  169. package/utils/math/round.js.map +2 -2
  170. package/utils/math/smoothTo.d.ts +2 -1
  171. package/utils/math/smoothTo.js +3 -7
  172. package/utils/math/smoothTo.js.map +2 -2
  173. package/utils/math/spring.d.ts +9 -9
  174. package/utils/math/spring.js.map +1 -1
  175. package/utils/math/wrap.d.ts +2 -1
  176. package/utils/math/wrap.js.map +2 -2
  177. package/utils/memo.d.ts +2 -1
  178. package/utils/memo.js.map +2 -2
  179. package/utils/memoize.d.ts +2 -1
  180. package/utils/memoize.js.map +2 -2
  181. package/utils/nextFrame.d.ts +2 -1
  182. package/utils/nextFrame.js.map +2 -2
  183. package/utils/nextMicrotask.d.ts +2 -1
  184. package/utils/nextMicrotask.js.map +2 -2
  185. package/utils/nextTick.d.ts +2 -1
  186. package/utils/nextTick.js.map +2 -2
  187. package/utils/noop.d.ts +1 -1
  188. package/utils/noop.js.map +1 -1
  189. package/utils/object/getAllProperties.d.ts +1 -1
  190. package/utils/object/getAllProperties.js.map +1 -1
  191. package/utils/random.d.ts +11 -8
  192. package/utils/random.js.map +2 -2
  193. package/utils/scheduler.d.ts +6 -1
  194. package/utils/scheduler.js.map +2 -2
  195. package/utils/scrollTo.d.ts +3 -2
  196. package/utils/scrollTo.js.map +2 -2
  197. package/utils/string/changeCase.d.ts +12 -6
  198. package/utils/string/changeCase.js.map +2 -2
  199. package/utils/string/endsWith.d.ts +2 -1
  200. package/utils/string/endsWith.js.map +2 -2
  201. package/utils/string/startsWith.d.ts +2 -1
  202. package/utils/string/startsWith.js.map +2 -2
  203. package/utils/string/withLeadingCharacters.d.ts +5 -4
  204. package/utils/string/withLeadingCharacters.js.map +2 -2
  205. package/utils/string/withLeadingSlash.d.ts +3 -2
  206. package/utils/string/withLeadingSlash.js.map +2 -2
  207. package/utils/string/withTrailingCharacters.d.ts +5 -4
  208. package/utils/string/withTrailingCharacters.js.map +2 -2
  209. package/utils/string/withTrailingSlash.d.ts +3 -2
  210. package/utils/string/withTrailingSlash.js.map +2 -2
  211. package/utils/string/withoutLeadingCharacters.d.ts +5 -4
  212. package/utils/string/withoutLeadingCharacters.js.map +2 -2
  213. package/utils/string/withoutLeadingCharactersRecursive.d.ts +5 -4
  214. package/utils/string/withoutLeadingCharactersRecursive.js.map +2 -2
  215. package/utils/string/withoutLeadingSlash.d.ts +3 -2
  216. package/utils/string/withoutLeadingSlash.js.map +2 -2
  217. package/utils/string/withoutTrailingCharacters.d.ts +5 -4
  218. package/utils/string/withoutTrailingCharacters.js.map +2 -2
  219. package/utils/string/withoutTrailingCharactersRecursive.d.ts +5 -4
  220. package/utils/string/withoutTrailingCharactersRecursive.js.map +2 -2
  221. package/utils/string/withoutTrailingSlash.d.ts +3 -2
  222. package/utils/string/withoutTrailingSlash.js.map +2 -2
  223. package/utils/throttle.d.ts +3 -2
  224. package/utils/throttle.js.map +2 -2
  225. package/utils/trapFocus.d.ts +4 -2
  226. package/utils/trapFocus.js.map +2 -2
  227. package/utils/tween.d.ts +1 -1
  228. package/utils/tween.js.map +1 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/js-toolkit/utils/math/mean.ts"],
4
- "sourcesContent": ["export function mean(numbers: number[]) {\n if (numbers.length === 0) {\n return 0;\n }\n\n if (numbers.length === 1) {\n return numbers[0];\n }\n\n let sum = 0;\n for (const value of numbers) {\n sum += value;\n }\n\n return sum / numbers.length;\n}\n"],
5
- "mappings": "AAAO,SAAS,KAAK,SAAmB;AACtC,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO,QAAQ,CAAC;AAAA,EAClB;AAEA,MAAI,MAAM;AACV,aAAW,SAAS,SAAS;AAC3B,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,QAAQ;AACvB;",
4
+ "sourcesContent": ["/**\n * @link https://js-toolkit.studiometa.dev/utils/math/mean.html\n */\nexport function mean(numbers: number[]) {\n if (numbers.length === 0) {\n return 0;\n }\n\n if (numbers.length === 1) {\n return numbers[0];\n }\n\n let sum = 0;\n for (const value of numbers) {\n sum += value;\n }\n\n return sum / numbers.length;\n}\n"],
5
+ "mappings": "AAGO,SAAS,KAAK,SAAmB;AACtC,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO,QAAQ,CAAC;AAAA,EAClB;AAEA,MAAI,MAAM;AACV,aAAW,SAAS,SAAS;AAC3B,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,QAAQ;AACvB;",
6
6
  "names": []
7
7
  }
@@ -1,8 +1,9 @@
1
1
  /**
2
2
  * Round a value with a given number of decimals.
3
3
  *
4
- * @param {number} value The number to round.
5
- * @param {number} [decimals=0] The number of decimals to keep.
6
- * @returns {number} A rounded number to the given decimals length.
7
- */
4
+ * @param {number} value The number to round.
5
+ * @param {number} [decimals=0] The number of decimals to keep.
6
+ * @return {number} A rounded number to the given decimals length.
7
+ * @link https://js-toolkit.studiometa.dev/utils/math/round.html
8
+ */
8
9
  export declare function round(value: number, decimals?: number): number;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/js-toolkit/utils/math/round.ts"],
4
- "sourcesContent": ["/**\n * Round a value with a given number of decimals.\n *\n * @param {number} value The number to round.\n * @param {number} [decimals=0] The number of decimals to keep.\n * @returns {number} A rounded number to the given decimals length.\n */\nexport function round(value: number, decimals = 0) {\n return Number(value.toFixed(decimals));\n}\n"],
5
- "mappings": "AAOO,SAAS,MAAM,OAAe,WAAW,GAAG;AACjD,SAAO,OAAO,MAAM,QAAQ,QAAQ,CAAC;AACvC;",
4
+ "sourcesContent": ["/**\n * Round a value with a given number of decimals.\n *\n * @param {number} value The number to round.\n * @param {number} [decimals=0] The number of decimals to keep.\n * @return {number} A rounded number to the given decimals length.\n * @link https://js-toolkit.studiometa.dev/utils/math/round.html\n*/\nexport function round(value: number, decimals = 0) {\n return Number(value.toFixed(decimals));\n}\n"],
5
+ "mappings": "AAQO,SAAS,MAAM,OAAe,WAAW,GAAG;AACjD,SAAO,OAAO,MAAM,QAAQ,QAAQ,CAAC;AACvC;",
6
6
  "names": []
7
7
  }
@@ -24,7 +24,7 @@ export type SmoothToOptions = Partial<{
24
24
  * Create a smoothing function that will smoothly tween between two values.
25
25
  * @param {number} [start] The initial value.
26
26
  * @param {SmoothToOptions} [options] Options for the transition.
27
- * @see https://js-toolkit.studiometa.dev/utils/math/smoothTo.html
27
+ * @link https://js-toolkit.studiometa.dev/utils/math/smoothTo.html
28
28
  * @example
29
29
  * ```js
30
30
  * const x = smoothTo(0);
@@ -43,6 +43,7 @@ export declare function smoothTo(start?: number, options?: SmoothToOptions): {
43
43
  */
44
44
  unsubscribe: (fn: (value: number) => any) => boolean;
45
45
  raw(): number;
46
+ add(val: number): number;
46
47
  damping(val?: number): number;
47
48
  precision(val?: number): number;
48
49
  stiffness(val?: number): number;
@@ -1,10 +1,7 @@
1
- import { useRaf } from "../../services/RafService.js";
2
1
  import { damp } from "./damp.js";
3
2
  import { spring } from "./spring.js";
4
3
  import { isFunction, isDefined } from "../is.js";
5
4
  function smoothTo(start = 0, options = {}) {
6
- const { add, has, remove } = useRaf();
7
- const key = Symbol();
8
5
  const fns = /* @__PURE__ */ new Set();
9
6
  let damping = options.damping ?? 0.6;
10
7
  let precision = options.precision ?? 1 / 1e8;
@@ -23,7 +20,7 @@ function smoothTo(start = 0, options = {}) {
23
20
  for (const fn of fns) {
24
21
  fn(smoothed);
25
22
  }
26
- if (smoothed === value) remove(key);
23
+ if (smoothed !== value) requestAnimationFrame(tick);
27
24
  }
28
25
  function subscribe(fn) {
29
26
  if (isFunction(fn)) {
@@ -39,14 +36,13 @@ function smoothTo(start = 0, options = {}) {
39
36
  return smoothed;
40
37
  }
41
38
  value = newValue;
42
- if (!has(key)) {
43
- add(key, tick);
44
- }
39
+ tick();
45
40
  return smoothed;
46
41
  }
47
42
  update.subscribe = subscribe;
48
43
  update.unsubscribe = unsubscribe;
49
44
  update.raw = () => value;
45
+ update.add = (val) => update(value + val);
50
46
  update.damping = (val) => damping = val ?? damping;
51
47
  update.precision = (val) => precision = val ?? precision;
52
48
  update.stiffness = (val) => stiffness = val ?? stiffness;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/js-toolkit/utils/math/smoothTo.ts"],
4
- "sourcesContent": ["import { useRaf } from '../../services/RafService.js';\nimport { damp } from './damp.js';\nimport { spring } from './spring.js';\nimport { isFunction, isDefined } from '../is.js';\n\nexport type SmoothToOptions = Partial<{\n /**\n * Damping factor, the smaller the smoother, defaults to 0.6.\n */\n damping: number;\n /**\n * Precision used to decide when the smoothing should end, defaults to 1 / 1e8.\n */\n precision: number;\n /**\n * Enable spring physics, defaults to `true` if one of `stiffness` or `mass` is set, defaults to `false` otherwise.\n */\n spring: boolean;\n /**\n * Stiffness factor for spring physics, the higher the stiffer, defaults to 0.1.\n */\n stiffness: number;\n /**\n * Mass factor when spring is enabled, the higher the heavier, defaults to 1.\n */\n mass: number;\n}>;\n\n/**\n * Create a smoothing function that will smoothly tween between two values.\n * @param {number} [start] The initial value.\n * @param {SmoothToOptions} [options] Options for the transition.\n * @see https://js-toolkit.studiometa.dev/utils/math/smoothTo.html\n * @example\n * ```js\n * const x = smoothTo(0);\n * x.subscribe((value) => console.log(value));\n * x(100); // 0.1\n * ```\n */\nexport function smoothTo(start = 0, options: SmoothToOptions = {}) {\n const { add, has, remove } = useRaf();\n const key = Symbol();\n const fns = new Set<(value: number) => any>();\n\n let damping = options.damping ?? 0.6;\n let precision = options.precision ?? 1 / 1e8;\n let stiffness = options.stiffness ?? 0.1;\n let mass = options.mass ?? 1;\n let isSpring = options.spring === true || isDefined(options.stiffness) || isDefined(options.mass);\n\n let value = start;\n let smoothed = start;\n let velocity = 0;\n\n /**\n * Callback for the useRaf service.\n */\n function tick() {\n if (isSpring) {\n [smoothed, velocity] = spring(value, smoothed, velocity, stiffness, damping, mass, precision);\n } else {\n smoothed = damp(value, smoothed, damping, precision);\n }\n\n for (const fn of fns) {\n fn(smoothed);\n }\n\n if (smoothed === value) remove(key);\n }\n\n /**\n * Subscribe a callback to the value update.\n */\n function subscribe(fn: (value: number) => any) {\n if (isFunction(fn)) {\n fns.add(fn);\n }\n\n return () => unsubscribe(fn);\n }\n\n /**\n * Unsubscribe a callback to the value update.\n */\n function unsubscribe(fn: (value: number) => any) {\n return fns.delete(fn);\n }\n\n /**\n * Update the value if a parameter is given, get the value if no parameter is given.\n */\n function update(newValue?: number): number {\n if (!isDefined(newValue)) {\n return smoothed;\n }\n\n value = newValue;\n\n if (!has(key)) {\n add(key, tick);\n }\n\n return smoothed;\n }\n\n /**\n * Subscribe a callback to the value update.\n */\n update.subscribe = subscribe;\n\n /**\n * Unsubscribe a callback from the value update.\n */\n update.unsubscribe = unsubscribe;\n\n /**\n * Get the raw target value.\n */\n update.raw = () => value;\n /**\n * Get or set the damping factor.\n */\n update.damping = (val?: number) => (damping = val ?? damping);\n\n /**\n * Get or set the precision.\n */\n update.precision = (val?: number) => (precision = val ?? precision);\n\n /**\n * Get or set the stiffness factor.\n */\n update.stiffness = (val?: number) => (stiffness = val ?? stiffness);\n\n /**\n * Get or set the spring option.\n */\n update.spring = (val?: boolean) => (isSpring = val ?? isSpring);\n\n update(start);\n return update;\n}\n"],
5
- "mappings": "AAAA,SAAS,cAAc;AACvB,SAAS,YAAY;AACrB,SAAS,cAAc;AACvB,SAAS,YAAY,iBAAiB;AAqC/B,SAAS,SAAS,QAAQ,GAAG,UAA2B,CAAC,GAAG;AACjE,QAAM,EAAE,KAAK,KAAK,OAAO,IAAI,OAAO;AACpC,QAAM,MAAM,OAAO;AACnB,QAAM,MAAM,oBAAI,IAA4B;AAE5C,MAAI,UAAU,QAAQ,WAAW;AACjC,MAAI,YAAY,QAAQ,aAAa,IAAI;AACzC,MAAI,YAAY,QAAQ,aAAa;AACrC,MAAI,OAAO,QAAQ,QAAQ;AAC3B,MAAI,WAAW,QAAQ,WAAW,QAAQ,UAAU,QAAQ,SAAS,KAAK,UAAU,QAAQ,IAAI;AAEhG,MAAI,QAAQ;AACZ,MAAI,WAAW;AACf,MAAI,WAAW;AAKf,WAAS,OAAO;AACd,QAAI,UAAU;AACZ,OAAC,UAAU,QAAQ,IAAI,OAAO,OAAO,UAAU,UAAU,WAAW,SAAS,MAAM,SAAS;AAAA,IAC9F,OAAO;AACL,iBAAW,KAAK,OAAO,UAAU,SAAS,SAAS;AAAA,IACrD;AAEA,eAAW,MAAM,KAAK;AACpB,SAAG,QAAQ;AAAA,IACb;AAEA,QAAI,aAAa,MAAO,QAAO,GAAG;AAAA,EACpC;AAKA,WAAS,UAAU,IAA4B;AAC7C,QAAI,WAAW,EAAE,GAAG;AAClB,UAAI,IAAI,EAAE;AAAA,IACZ;AAEA,WAAO,MAAM,YAAY,EAAE;AAAA,EAC7B;AAKA,WAAS,YAAY,IAA4B;AAC/C,WAAO,IAAI,OAAO,EAAE;AAAA,EACtB;AAKA,WAAS,OAAO,UAA2B;AACzC,QAAI,CAAC,UAAU,QAAQ,GAAG;AACxB,aAAO;AAAA,IACT;AAEA,YAAQ;AAER,QAAI,CAAC,IAAI,GAAG,GAAG;AACb,UAAI,KAAK,IAAI;AAAA,IACf;AAEA,WAAO;AAAA,EACT;AAKA,SAAO,YAAY;AAKnB,SAAO,cAAc;AAKrB,SAAO,MAAM,MAAM;AAInB,SAAO,UAAU,CAAC,QAAkB,UAAU,OAAO;AAKrD,SAAO,YAAY,CAAC,QAAkB,YAAY,OAAO;AAKzD,SAAO,YAAY,CAAC,QAAkB,YAAY,OAAO;AAKzD,SAAO,SAAS,CAAC,QAAmB,WAAW,OAAO;AAEtD,SAAO,KAAK;AACZ,SAAO;AACT;",
4
+ "sourcesContent": ["import { damp } from './damp.js';\nimport { spring } from './spring.js';\nimport { isFunction, isDefined } from '../is.js';\n\nexport type SmoothToOptions = Partial<{\n /**\n * Damping factor, the smaller the smoother, defaults to 0.6.\n */\n damping: number;\n /**\n * Precision used to decide when the smoothing should end, defaults to 1 / 1e8.\n */\n precision: number;\n /**\n * Enable spring physics, defaults to `true` if one of `stiffness` or `mass` is set, defaults to `false` otherwise.\n */\n spring: boolean;\n /**\n * Stiffness factor for spring physics, the higher the stiffer, defaults to 0.1.\n */\n stiffness: number;\n /**\n * Mass factor when spring is enabled, the higher the heavier, defaults to 1.\n */\n mass: number;\n}>;\n\n/**\n * Create a smoothing function that will smoothly tween between two values.\n * @param {number} [start] The initial value.\n * @param {SmoothToOptions} [options] Options for the transition.\n * @link https://js-toolkit.studiometa.dev/utils/math/smoothTo.html\n * @example\n * ```js\n * const x = smoothTo(0);\n * x.subscribe((value) => console.log(value));\n * x(100); // 0.1\n * ```\n */\nexport function smoothTo(start = 0, options: SmoothToOptions = {}) {\n const fns = new Set<(value: number) => any>();\n\n let damping = options.damping ?? 0.6;\n let precision = options.precision ?? 1 / 1e8;\n let stiffness = options.stiffness ?? 0.1;\n let mass = options.mass ?? 1;\n let isSpring = options.spring === true || isDefined(options.stiffness) || isDefined(options.mass);\n\n let value = start;\n let smoothed = start;\n let velocity = 0;\n\n /**\n * Callback for the useRaf service.\n */\n function tick() {\n if (isSpring) {\n [smoothed, velocity] = spring(value, smoothed, velocity, stiffness, damping, mass, precision);\n } else {\n smoothed = damp(value, smoothed, damping, precision);\n }\n\n for (const fn of fns) {\n fn(smoothed);\n }\n\n if (smoothed !== value) requestAnimationFrame(tick);\n }\n\n /**\n * Subscribe a callback to the value update.\n */\n function subscribe(fn: (value: number) => any) {\n if (isFunction(fn)) {\n fns.add(fn);\n }\n\n return () => unsubscribe(fn);\n }\n\n /**\n * Unsubscribe a callback to the value update.\n */\n function unsubscribe(fn: (value: number) => any) {\n return fns.delete(fn);\n }\n\n /**\n * Update the value if a parameter is given, get the value if no parameter is given.\n */\n function update(newValue?: number): number {\n if (!isDefined(newValue)) {\n return smoothed;\n }\n\n value = newValue;\n\n tick();\n\n return smoothed;\n }\n\n /**\n * Subscribe a callback to the value update.\n */\n update.subscribe = subscribe;\n\n /**\n * Unsubscribe a callback from the value update.\n */\n update.unsubscribe = unsubscribe;\n\n /**\n * Get the raw target value.\n */\n update.raw = () => value;\n\n /**\n * Add the given value to the current raw value.\n */\n update.add = (val: number) => update(value + val);\n\n /**\n * Get or set the damping factor.\n */\n update.damping = (val?: number) => (damping = val ?? damping);\n\n /**\n * Get or set the precision.\n */\n update.precision = (val?: number) => (precision = val ?? precision);\n\n /**\n * Get or set the stiffness factor.\n */\n update.stiffness = (val?: number) => (stiffness = val ?? stiffness);\n\n /**\n * Get or set the spring option.\n */\n update.spring = (val?: boolean) => (isSpring = val ?? isSpring);\n\n update(start);\n return update;\n}\n"],
5
+ "mappings": "AAAA,SAAS,YAAY;AACrB,SAAS,cAAc;AACvB,SAAS,YAAY,iBAAiB;AAqC/B,SAAS,SAAS,QAAQ,GAAG,UAA2B,CAAC,GAAG;AACjE,QAAM,MAAM,oBAAI,IAA4B;AAE5C,MAAI,UAAU,QAAQ,WAAW;AACjC,MAAI,YAAY,QAAQ,aAAa,IAAI;AACzC,MAAI,YAAY,QAAQ,aAAa;AACrC,MAAI,OAAO,QAAQ,QAAQ;AAC3B,MAAI,WAAW,QAAQ,WAAW,QAAQ,UAAU,QAAQ,SAAS,KAAK,UAAU,QAAQ,IAAI;AAEhG,MAAI,QAAQ;AACZ,MAAI,WAAW;AACf,MAAI,WAAW;AAKf,WAAS,OAAO;AACd,QAAI,UAAU;AACZ,OAAC,UAAU,QAAQ,IAAI,OAAO,OAAO,UAAU,UAAU,WAAW,SAAS,MAAM,SAAS;AAAA,IAC9F,OAAO;AACL,iBAAW,KAAK,OAAO,UAAU,SAAS,SAAS;AAAA,IACrD;AAEA,eAAW,MAAM,KAAK;AACpB,SAAG,QAAQ;AAAA,IACb;AAEA,QAAI,aAAa,MAAO,uBAAsB,IAAI;AAAA,EACpD;AAKA,WAAS,UAAU,IAA4B;AAC7C,QAAI,WAAW,EAAE,GAAG;AAClB,UAAI,IAAI,EAAE;AAAA,IACZ;AAEA,WAAO,MAAM,YAAY,EAAE;AAAA,EAC7B;AAKA,WAAS,YAAY,IAA4B;AAC/C,WAAO,IAAI,OAAO,EAAE;AAAA,EACtB;AAKA,WAAS,OAAO,UAA2B;AACzC,QAAI,CAAC,UAAU,QAAQ,GAAG;AACxB,aAAO;AAAA,IACT;AAEA,YAAQ;AAER,SAAK;AAEL,WAAO;AAAA,EACT;AAKA,SAAO,YAAY;AAKnB,SAAO,cAAc;AAKrB,SAAO,MAAM,MAAM;AAKnB,SAAO,MAAM,CAAC,QAAgB,OAAO,QAAQ,GAAG;AAKhD,SAAO,UAAU,CAAC,QAAkB,UAAU,OAAO;AAKrD,SAAO,YAAY,CAAC,QAAkB,YAAY,OAAO;AAKzD,SAAO,YAAY,CAAC,QAAkB,YAAY,OAAO;AAKzD,SAAO,SAAS,CAAC,QAAmB,WAAW,OAAO;AAEtD,SAAO,KAAK;AACZ,SAAO;AACT;",
6
6
  "names": []
7
7
  }
@@ -1,13 +1,13 @@
1
1
  /**
2
2
  * Get the next spring value using velocity and spring physics.
3
- * @param {number} targetValue The final value.
4
- * @param {number} currentValue The current value.
5
- * @param {number} currentVelocity The current velocity.
6
- * @param {number} [stiffness=0.1] The spring stiffness (or tension) factor, defaults to 0.1.
7
- * @param {number} [damping=0.8] The damping factor (or friction) to reduce oscillation, defaults to 0.6.
8
- * @param {number} [mass=1] The mass factor affecting acceleration, defaults to 1.
9
- * @param {number} [precision=1/1e4] The precision used to calculate the latest value, defaults to 1/1e4.
10
- * @returns {[number, number]} The next value and velocity.
11
- * @see https://js-toolkit.studiometa.dev/utils/math/spring.html
3
+ * @param {number} targetValue The final value.
4
+ * @param {number} currentValue The current value.
5
+ * @param {number} currentVelocity The current velocity.
6
+ * @param {number} [stiffness=0.1] The spring stiffness (or tension) factor, defaults to 0.1.
7
+ * @param {number} [damping=0.8] The damping factor (or friction) to reduce oscillation, defaults to 0.6.
8
+ * @param {number} [mass=1] The mass factor affecting acceleration, defaults to 1.
9
+ * @param {number} [precision=1/1e4] The precision used to calculate the latest value, defaults to 1/1e4.
10
+ * @return {[number, number]} The next value and velocity.
11
+ * @link https://js-toolkit.studiometa.dev/utils/math/spring.html
12
12
  */
13
13
  export declare function spring(targetValue: number, currentValue: number, currentVelocity: number, stiffness?: number, damping?: number, mass?: number, precision?: number): [number, number];
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/js-toolkit/utils/math/spring.ts"],
4
- "sourcesContent": ["/**\n * Get the next spring value using velocity and spring physics.\n * @param {number} targetValue The final value.\n * @param {number} currentValue The current value.\n * @param {number} currentVelocity The current velocity.\n * @param {number} [stiffness=0.1] The spring stiffness (or tension) factor, defaults to 0.1.\n * @param {number} [damping=0.8] The damping factor (or friction) to reduce oscillation, defaults to 0.6.\n * @param {number} [mass=1] The mass factor affecting acceleration, defaults to 1.\n * @param {number} [precision=1/1e4] The precision used to calculate the latest value, defaults to 1/1e4.\n * @returns {[number, number]} The next value and velocity.\n * @see https://js-toolkit.studiometa.dev/utils/math/spring.html\n */\nexport function spring(\n targetValue: number,\n currentValue: number,\n currentVelocity: number,\n stiffness = 0.1,\n damping = 0.6,\n mass = 1,\n precision = 1 / 1e4,\n): [number, number] {\n const force = (targetValue - currentValue) * stiffness;\n const acceleration = force / mass;\n const velocity = currentVelocity * damping + acceleration;\n const value =\n Math.abs(targetValue - currentValue) < precision && Math.abs(velocity) < precision\n ? targetValue\n : currentValue + velocity;\n\n return [value, value === targetValue ? 0 : velocity];\n}\n"],
4
+ "sourcesContent": ["/**\n * Get the next spring value using velocity and spring physics.\n * @param {number} targetValue The final value.\n * @param {number} currentValue The current value.\n * @param {number} currentVelocity The current velocity.\n * @param {number} [stiffness=0.1] The spring stiffness (or tension) factor, defaults to 0.1.\n * @param {number} [damping=0.8] The damping factor (or friction) to reduce oscillation, defaults to 0.6.\n * @param {number} [mass=1] The mass factor affecting acceleration, defaults to 1.\n * @param {number} [precision=1/1e4] The precision used to calculate the latest value, defaults to 1/1e4.\n * @return {[number, number]} The next value and velocity.\n * @link https://js-toolkit.studiometa.dev/utils/math/spring.html\n */\nexport function spring(\n targetValue: number,\n currentValue: number,\n currentVelocity: number,\n stiffness = 0.1,\n damping = 0.6,\n mass = 1,\n precision = 1 / 1e4,\n): [number, number] {\n const force = (targetValue - currentValue) * stiffness;\n const acceleration = force / mass;\n const velocity = currentVelocity * damping + acceleration;\n const value =\n Math.abs(targetValue - currentValue) < precision && Math.abs(velocity) < precision\n ? targetValue\n : currentValue + velocity;\n\n return [value, value === targetValue ? 0 : velocity];\n}\n"],
5
5
  "mappings": "AAYO,SAAS,OACd,aACA,cACA,iBACA,YAAY,KACZ,UAAU,KACV,OAAO,GACP,YAAY,IAAI,KACE;AAClB,QAAM,SAAS,cAAc,gBAAgB;AAC7C,QAAM,eAAe,QAAQ;AAC7B,QAAM,WAAW,kBAAkB,UAAU;AAC7C,QAAM,QACJ,KAAK,IAAI,cAAc,YAAY,IAAI,aAAa,KAAK,IAAI,QAAQ,IAAI,YACrE,cACA,eAAe;AAErB,SAAO,CAAC,OAAO,UAAU,cAAc,IAAI,QAAQ;AACrD;",
6
6
  "names": []
7
7
  }
@@ -1,4 +1,5 @@
1
1
  /**
2
2
  * Wrap a value in the min and max range.
3
- */
3
+ * @link https://js-toolkit.studiometa.dev/utils/math/wrap.html
4
+ */
4
5
  export declare function wrap(value: number, min: number, max: number): number;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/js-toolkit/utils/math/wrap.ts"],
4
- "sourcesContent": ["/**\n * Wrap a value in the min and max range.\n */\nexport function wrap(value: number, min: number, max: number): number {\n const range = max - min;\n return min === max ? min : ((range + ((value - min) % range)) % range) + min;\n}\n"],
5
- "mappings": "AAGO,SAAS,KAAK,OAAe,KAAa,KAAqB;AACpE,QAAM,QAAQ,MAAM;AACpB,SAAO,QAAQ,MAAM,OAAQ,SAAU,QAAQ,OAAO,SAAU,QAAS;AAC3E;",
4
+ "sourcesContent": ["/**\n * Wrap a value in the min and max range.\n * @link https://js-toolkit.studiometa.dev/utils/math/wrap.html\n*/\nexport function wrap(value: number, min: number, max: number): number {\n const range = max - min;\n return min === max ? min : ((range + ((value - min) % range)) % range) + min;\n}\n"],
5
+ "mappings": "AAIO,SAAS,KAAK,OAAe,KAAa,KAAqB;AACpE,QAAM,QAAQ,MAAM;AACpB,SAAO,QAAQ,MAAM,OAAQ,SAAU,QAAQ,OAAO,SAAU,QAAS;AAC3E;",
6
6
  "names": []
7
7
  }
package/utils/memo.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  /**
2
2
  * Memoize the result of a function with a single argument indefinitely.
3
3
  * This is a simpler implementation of the `memoize` function.
4
- */
4
+ * @link https://js-toolkit.studiometa.dev/utils/memo.html
5
+ */
5
6
  export declare function memo<T extends (...args: unknown[]) => unknown>(fn: T): T;
package/utils/memo.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../packages/js-toolkit/utils/memo.ts"],
4
- "sourcesContent": ["/**\n * Memoize the result of a function with a single argument indefinitely.\n * This is a simpler implementation of the `memoize` function.\n */\nexport function memo<T extends (...args: unknown[]) => unknown>(fn: T): T {\n const cache = new Map<string, ReturnType<T>>();\n\n // @ts-ignore\n return function cached(...args) {\n const key = args.join('');\n if (!cache.has(key)) {\n cache.set(key, fn(...args) as ReturnType<T>);\n }\n return cache.get(key);\n };\n}\n"],
5
- "mappings": "AAIO,SAAS,KAAgD,IAAU;AACxE,QAAM,QAAQ,oBAAI,IAA2B;AAG7C,SAAO,SAAS,UAAU,MAAM;AAC9B,UAAM,MAAM,KAAK,KAAK,EAAE;AACxB,QAAI,CAAC,MAAM,IAAI,GAAG,GAAG;AACnB,YAAM,IAAI,KAAK,GAAG,GAAG,IAAI,CAAkB;AAAA,IAC7C;AACA,WAAO,MAAM,IAAI,GAAG;AAAA,EACtB;AACF;",
4
+ "sourcesContent": ["/**\n * Memoize the result of a function with a single argument indefinitely.\n * This is a simpler implementation of the `memoize` function.\n * @link https://js-toolkit.studiometa.dev/utils/memo.html\n*/\nexport function memo<T extends (...args: unknown[]) => unknown>(fn: T): T {\n const cache = new Map<string, ReturnType<T>>();\n\n // @ts-ignore\n return function cached(...args) {\n const key = args.join('');\n if (!cache.has(key)) {\n cache.set(key, fn(...args) as ReturnType<T>);\n }\n return cache.get(key);\n };\n}\n"],
5
+ "mappings": "AAKO,SAAS,KAAgD,IAAU;AACxE,QAAM,QAAQ,oBAAI,IAA2B;AAG7C,SAAO,SAAS,UAAU,MAAM;AAC9B,UAAM,MAAM,KAAK,KAAK,EAAE;AACxB,QAAI,CAAC,MAAM,IAAI,GAAG,GAAG;AACnB,YAAM,IAAI,KAAK,GAAG,GAAG,IAAI,CAAkB;AAAA,IAC7C;AACA,WAAO,MAAM,IAAI,GAAG;AAAA,EACtB;AACF;",
6
6
  "names": []
7
7
  }
@@ -16,5 +16,6 @@ export interface MemoizeOptions<T> {
16
16
  }
17
17
  /**
18
18
  * Memoize the output of a function.
19
- */
19
+ * @link https://js-toolkit.studiometa.dev/utils/memoize.html
20
+ */
20
21
  export declare function memoize<T extends (...args: unknown[]) => unknown>(fn: T, { maxAge, cacheKey, cache, }?: MemoizeOptions<ReturnType<T>>): (...args: Parameters<T>) => ReturnType<T>;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../packages/js-toolkit/utils/memoize.ts"],
4
- "sourcesContent": ["export interface MemoizeCache<T> {\n has: (key: unknown) => boolean;\n set: (key: unknown, value: { data: T; date: number }) => this;\n get: (key: unknown) => { data: T; date: number };\n}\n\nexport interface MemoizeOptions<T> {\n maxAge?: number;\n cacheKey?: (args: unknown[]) => string;\n cache?: MemoizeCache<T>;\n}\n\n/**\n * Memoize the output of a function.\n */\nexport function memoize<T extends (...args: unknown[]) => unknown>(\n fn: T,\n {\n maxAge = Number.POSITIVE_INFINITY,\n cacheKey = JSON.stringify,\n cache = new Map(),\n }: MemoizeOptions<ReturnType<T>> = {},\n): (...args: Parameters<T>) => ReturnType<T> {\n return function memoized(...args): ReturnType<T> {\n const key = cacheKey(args);\n const date = Date.now();\n\n if (cache.has(key)) {\n const cached = cache.get(key);\n\n if (date - cached.date < maxAge) {\n return cached.data;\n }\n }\n\n // @ts-ignore\n const data: ReturnType<T> = fn(...args);\n\n cache.set(key, {\n data,\n date: Date.now(),\n });\n\n return data;\n };\n}\n"],
5
- "mappings": "AAeO,SAAS,QACd,IACA;AAAA,EACE,SAAS,OAAO;AAAA,EAChB,WAAW,KAAK;AAAA,EAChB,QAAQ,oBAAI,IAAI;AAClB,IAAmC,CAAC,GACO;AAC3C,SAAO,SAAS,YAAY,MAAqB;AAC/C,UAAM,MAAM,SAAS,IAAI;AACzB,UAAM,OAAO,KAAK,IAAI;AAEtB,QAAI,MAAM,IAAI,GAAG,GAAG;AAClB,YAAM,SAAS,MAAM,IAAI,GAAG;AAE5B,UAAI,OAAO,OAAO,OAAO,QAAQ;AAC/B,eAAO,OAAO;AAAA,MAChB;AAAA,IACF;AAGA,UAAM,OAAsB,GAAG,GAAG,IAAI;AAEtC,UAAM,IAAI,KAAK;AAAA,MACb;AAAA,MACA,MAAM,KAAK,IAAI;AAAA,IACjB,CAAC;AAED,WAAO;AAAA,EACT;AACF;",
4
+ "sourcesContent": ["export interface MemoizeCache<T> {\n has: (key: unknown) => boolean;\n set: (key: unknown, value: { data: T; date: number }) => this;\n get: (key: unknown) => { data: T; date: number };\n}\n\nexport interface MemoizeOptions<T> {\n maxAge?: number;\n cacheKey?: (args: unknown[]) => string;\n cache?: MemoizeCache<T>;\n}\n\n/**\n * Memoize the output of a function.\n * @link https://js-toolkit.studiometa.dev/utils/memoize.html\n*/\nexport function memoize<T extends (...args: unknown[]) => unknown>(\n fn: T,\n {\n maxAge = Number.POSITIVE_INFINITY,\n cacheKey = JSON.stringify,\n cache = new Map(),\n }: MemoizeOptions<ReturnType<T>> = {},\n): (...args: Parameters<T>) => ReturnType<T> {\n return function memoized(...args): ReturnType<T> {\n const key = cacheKey(args);\n const date = Date.now();\n\n if (cache.has(key)) {\n const cached = cache.get(key);\n\n if (date - cached.date < maxAge) {\n return cached.data;\n }\n }\n\n // @ts-ignore\n const data: ReturnType<T> = fn(...args);\n\n cache.set(key, {\n data,\n date: Date.now(),\n });\n\n return data;\n };\n}\n"],
5
+ "mappings": "AAgBO,SAAS,QACd,IACA;AAAA,EACE,SAAS,OAAO;AAAA,EAChB,WAAW,KAAK;AAAA,EAChB,QAAQ,oBAAI,IAAI;AAClB,IAAmC,CAAC,GACO;AAC3C,SAAO,SAAS,YAAY,MAAqB;AAC/C,UAAM,MAAM,SAAS,IAAI;AACzB,UAAM,OAAO,KAAK,IAAI;AAEtB,QAAI,MAAM,IAAI,GAAG,GAAG;AAClB,YAAM,SAAS,MAAM,IAAI,GAAG;AAE5B,UAAI,OAAO,OAAO,OAAO,QAAQ;AAC/B,eAAO,OAAO;AAAA,MAChB;AAAA,IACF;AAGA,UAAM,OAAsB,GAAG,GAAG,IAAI;AAEtC,UAAM,IAAI,KAAK;AAAA,MACb;AAAA,MACA,MAAM,KAAK,IAAI;AAAA,IACjB,CAAC;AAED,WAAO;AAAA,EACT;AACF;",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,8 @@
1
1
  type Callback = (time?: DOMHighResTimeStamp) => any;
2
2
  /**
3
3
  * Wait for the next frame to execute a function.
4
- */
4
+ * @link https://js-toolkit.studiometa.dev/utils/nextFrame.html
5
+ */
5
6
  export declare function nextFrame(): Promise<DOMHighResTimeStamp>;
6
7
  export declare function nextFrame<T extends Callback>(callback?: T): Promise<ReturnType<T>>;
7
8
  export {};
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../packages/js-toolkit/utils/nextFrame.ts"],
4
- "sourcesContent": ["import { isFunction } from './is.js';\nimport { hasWindow } from './has.js';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Callback = (time?: DOMHighResTimeStamp) => any;\n\n/**\n * Wait for the next frame to execute a function.\n */\nexport function nextFrame(): Promise<DOMHighResTimeStamp>;\nexport function nextFrame<T extends Callback>(callback?: T): Promise<ReturnType<T>>;\nexport function nextFrame<T extends Callback>(callback?: T): Promise<ReturnType<T>> {\n const fn = hasWindow() ? (window?.requestAnimationFrame ?? setTimeout) : setTimeout;\n return new Promise((resolve) => {\n fn((time) => resolve(isFunction(callback) ? callback(time) : time));\n });\n}\n"],
5
- "mappings": "AAAA,SAAS,kBAAkB;AAC3B,SAAS,iBAAiB;AAUnB,SAAS,UAA8B,UAAsC;AAClF,QAAM,KAAK,UAAU,IAAK,QAAQ,yBAAyB,aAAc;AACzE,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,OAAG,CAAC,SAAS,QAAQ,WAAW,QAAQ,IAAI,SAAS,IAAI,IAAI,IAAI,CAAC;AAAA,EACpE,CAAC;AACH;",
4
+ "sourcesContent": ["import { isFunction } from './is.js';\nimport { hasWindow } from './has.js';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Callback = (time?: DOMHighResTimeStamp) => any;\n\n/**\n * Wait for the next frame to execute a function.\n * @link https://js-toolkit.studiometa.dev/utils/nextFrame.html\n*/\nexport function nextFrame(): Promise<DOMHighResTimeStamp>;\nexport function nextFrame<T extends Callback>(callback?: T): Promise<ReturnType<T>>;\nexport function nextFrame<T extends Callback>(callback?: T): Promise<ReturnType<T>> {\n const fn = hasWindow() ? (window?.requestAnimationFrame ?? setTimeout) : setTimeout;\n return new Promise((resolve) => {\n fn((time) => resolve(isFunction(callback) ? callback(time) : time));\n });\n}\n"],
5
+ "mappings": "AAAA,SAAS,kBAAkB;AAC3B,SAAS,iBAAiB;AAWnB,SAAS,UAA8B,UAAsC;AAClF,QAAM,KAAK,UAAU,IAAK,QAAQ,yBAAyB,aAAc;AACzE,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,OAAG,CAAC,SAAS,QAAQ,WAAW,QAAQ,IAAI,SAAS,IAAI,IAAI,IAAI,CAAC;AAAA,EACpE,CAAC;AACH;",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,8 @@
1
1
  type Callback = (...args: any[]) => any;
2
2
  /**
3
3
  * Wait for the next microtask.
4
- */
4
+ * @link https://js-toolkit.studiometa.dev/utils/nextMicrotask.html
5
+ */
5
6
  export declare function nextMicrotask(): Promise<void>;
6
7
  export declare function nextMicrotask<T extends Callback>(callback?: T): Promise<ReturnType<T>>;
7
8
  export {};
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../packages/js-toolkit/utils/nextMicrotask.ts"],
4
- "sourcesContent": ["import { isFunction } from './is.js';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Callback = (...args: any[]) => any;\n\n/**\n * Wait for the next microtask.\n */\nexport async function nextMicrotask(): Promise<void>;\nexport async function nextMicrotask<T extends Callback>(callback?: T): Promise<ReturnType<T>>;\nexport async function nextMicrotask<T extends Callback>(callback?: T): Promise<ReturnType<T>> {\n return Promise.resolve().then(() => isFunction(callback) && callback());\n}\n"],
5
- "mappings": "AAAA,SAAS,kBAAkB;AAU3B,eAAsB,cAAkC,UAAsC;AAC5F,SAAO,QAAQ,QAAQ,EAAE,KAAK,MAAM,WAAW,QAAQ,KAAK,SAAS,CAAC;AACxE;",
4
+ "sourcesContent": ["import { isFunction } from './is.js';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Callback = (...args: any[]) => any;\n\n/**\n * Wait for the next microtask.\n * @link https://js-toolkit.studiometa.dev/utils/nextMicrotask.html\n*/\nexport async function nextMicrotask(): Promise<void>;\nexport async function nextMicrotask<T extends Callback>(callback?: T): Promise<ReturnType<T>>;\nexport async function nextMicrotask<T extends Callback>(callback?: T): Promise<ReturnType<T>> {\n return Promise.resolve().then(() => isFunction(callback) && callback());\n}\n"],
5
+ "mappings": "AAAA,SAAS,kBAAkB;AAW3B,eAAsB,cAAkC,UAAsC;AAC5F,SAAO,QAAQ,QAAQ,EAAE,KAAK,MAAM,WAAW,QAAQ,KAAK,SAAS,CAAC;AACxE;",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,8 @@
1
1
  type Callback = (...args: any[]) => any;
2
2
  /**
3
3
  * Wait for the next tick.
4
- */
4
+ * @link https://js-toolkit.studiometa.dev/utils/nextTick.html
5
+ */
5
6
  export declare function nextTick(): Promise<void>;
6
7
  export declare function nextTick<T extends Callback>(callback?: T): Promise<ReturnType<T>>;
7
8
  export {};
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../packages/js-toolkit/utils/nextTick.ts"],
4
- "sourcesContent": ["import { isFunction } from './is.js';\nimport { wait } from './wait.js';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Callback = (...args: any[]) => any;\n\n/**\n * Wait for the next tick.\n */\nexport async function nextTick(): Promise<void>;\nexport async function nextTick<T extends Callback>(callback?: T): Promise<ReturnType<T>>;\nexport async function nextTick<T extends Callback>(callback?: T): Promise<ReturnType<T>> {\n return wait().then(isFunction(callback) && (callback as ReturnType<T>));\n}\n"],
5
- "mappings": "AAAA,SAAS,kBAAkB;AAC3B,SAAS,YAAY;AAUrB,eAAsB,SAA6B,UAAsC;AACvF,SAAO,KAAK,EAAE,KAAK,WAAW,QAAQ,KAAM,QAA0B;AACxE;",
4
+ "sourcesContent": ["import { isFunction } from './is.js';\nimport { wait } from './wait.js';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Callback = (...args: any[]) => any;\n\n/**\n * Wait for the next tick.\n * @link https://js-toolkit.studiometa.dev/utils/nextTick.html\n*/\nexport async function nextTick(): Promise<void>;\nexport async function nextTick<T extends Callback>(callback?: T): Promise<ReturnType<T>>;\nexport async function nextTick<T extends Callback>(callback?: T): Promise<ReturnType<T>> {\n return wait().then(isFunction(callback) && (callback as ReturnType<T>));\n}\n"],
5
+ "mappings": "AAAA,SAAS,kBAAkB;AAC3B,SAAS,YAAY;AAWrB,eAAsB,SAA6B,UAAsC;AACvF,SAAO,KAAK,EAAE,KAAK,WAAW,QAAQ,KAAM,QAA0B;AACxE;",
6
6
  "names": []
7
7
  }
package/utils/noop.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * No operation function.
3
3
  *
4
- * @returns {void}
4
+ * @return {void}
5
5
  */
6
6
  export declare function noop(): void;
7
7
  /**
package/utils/noop.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../packages/js-toolkit/utils/noop.ts"],
4
- "sourcesContent": ["/**\n * No operation function.\n *\n * @returns {void}\n */\nexport function noop() {}\n\n/**\n * No operation function which return the given value unaltered.\n */\nexport function noopValue<T>(value: T): T {\n return value;\n}\n"],
4
+ "sourcesContent": ["/**\n * No operation function.\n *\n * @return {void}\n */\nexport function noop() {}\n\n/**\n * No operation function which return the given value unaltered.\n */\nexport function noopValue<T>(value: T): T {\n return value;\n}\n"],
5
5
  "mappings": "AAKO,SAAS,OAAO;AAAC;AAKjB,SAAS,UAAa,OAAa;AACxC,SAAO;AACT;",
6
6
  "names": []
7
7
  }
@@ -6,6 +6,6 @@
6
6
  * @param {Array} [props=[]]
7
7
  * The already existing properties.
8
8
  * @param {(name:string, proto:any) => boolean} testFn
9
- * @returns {Array<[string, Object]>} An array of properties and the prototype they belong to.
9
+ * @return {Array<[string, Object]>} An array of properties and the prototype they belong to.
10
10
  */
11
11
  export declare function getAllProperties(object: unknown, props?: Array<[string, unknown]>, testFn?: (name: string, proto: unknown) => boolean): Array<[string, unknown]>;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/js-toolkit/utils/object/getAllProperties.ts"],
4
- "sourcesContent": ["import { isFunction } from '../is.js';\n\n/**\n * Gets all non-builtin properties up the prototype chain.\n *\n * @param {Object} object\n * The object to get the propeties from.\n * @param {Array} [props=[]]\n * The already existing properties.\n * @param {(name:string, proto:any) => boolean} testFn\n * @returns {Array<[string, Object]>} An array of properties and the prototype they belong to.\n */\nexport function getAllProperties(\n object: unknown,\n props: Array<[string, unknown]> = [],\n testFn: (name: string, proto: unknown) => boolean = null,\n): Array<[string, unknown]> {\n const proto = Object.getPrototypeOf(object);\n\n if (proto === Object.prototype || proto === null) {\n return props;\n }\n\n let foundProps = Object.getOwnPropertyNames(proto);\n\n if (isFunction(testFn)) {\n foundProps = foundProps.filter((name) => testFn(name, proto));\n }\n\n const formatedProps = foundProps\n .map<[string, unknown]>((name) => [name, proto])\n .reduce<Array<[string, unknown]>>((acc, val) => [...acc, val], props);\n\n return getAllProperties(proto, formatedProps, testFn);\n}\n"],
4
+ "sourcesContent": ["import { isFunction } from '../is.js';\n\n/**\n * Gets all non-builtin properties up the prototype chain.\n *\n * @param {Object} object\n * The object to get the propeties from.\n * @param {Array} [props=[]]\n * The already existing properties.\n * @param {(name:string, proto:any) => boolean} testFn\n * @return {Array<[string, Object]>} An array of properties and the prototype they belong to.\n */\nexport function getAllProperties(\n object: unknown,\n props: Array<[string, unknown]> = [],\n testFn: (name: string, proto: unknown) => boolean = null,\n): Array<[string, unknown]> {\n const proto = Object.getPrototypeOf(object);\n\n if (proto === Object.prototype || proto === null) {\n return props;\n }\n\n let foundProps = Object.getOwnPropertyNames(proto);\n\n if (isFunction(testFn)) {\n foundProps = foundProps.filter((name) => testFn(name, proto));\n }\n\n const formatedProps = foundProps\n .map<[string, unknown]>((name) => [name, proto])\n .reduce<Array<[string, unknown]>>((acc, val) => [...acc, val], props);\n\n return getAllProperties(proto, formatedProps, testFn);\n}\n"],
5
5
  "mappings": "AAAA,SAAS,kBAAkB;AAYpB,SAAS,iBACd,QACA,QAAkC,CAAC,GACnC,SAAoD,MAC1B;AAC1B,QAAM,QAAQ,OAAO,eAAe,MAAM;AAE1C,MAAI,UAAU,OAAO,aAAa,UAAU,MAAM;AAChD,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,OAAO,oBAAoB,KAAK;AAEjD,MAAI,WAAW,MAAM,GAAG;AACtB,iBAAa,WAAW,OAAO,CAAC,SAAS,OAAO,MAAM,KAAK,CAAC;AAAA,EAC9D;AAEA,QAAM,gBAAgB,WACnB,IAAuB,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAC9C,OAAiC,CAAC,KAAK,QAAQ,CAAC,GAAG,KAAK,GAAG,GAAG,KAAK;AAEtE,SAAO,iBAAiB,OAAO,eAAe,MAAM;AACtD;",
6
6
  "names": []
7
7
  }
package/utils/random.d.ts CHANGED
@@ -1,23 +1,26 @@
1
1
  /**
2
2
  * Get a random number between given bounds.
3
- * @param {number} a First bound.
4
- * @param {number} [b] Second bound, defaults to 0.
5
- * @returns {number} A number between `a` and `b`.
6
- */
3
+ * @param {number} a First bound.
4
+ * @param {number} [b] Second bound, defaults to 0.
5
+ * @return {number} A number between `a` and `b`.
6
+ * @link https://js-toolkit.studiometa.dev/utils/random.html
7
+ */
7
8
  export declare function random(a: number, b?: number): number;
8
9
  /**
9
10
  * Get a random integer between bounds
10
11
  *
11
12
  * @param {number} a First bound.
12
13
  * @param {number} b Second bound.
13
- * @returns {number} An integer between `a` and `b`;
14
- */
14
+ * @return {number} An integer between `a` and `b`;
15
+ * @link https://js-toolkit.studiometa.dev/utils/randomInt.html
16
+ */
15
17
  export declare function randomInt(a: number, b?: number): number;
16
18
  /**
17
19
  * Get a random item of an array or a random character of a string
18
20
  *
19
21
  * @param {T[] | string} items Array or string
20
- * @returns {T | undefined}
22
+ * @return {T | undefined}
21
23
  * @throws {Error} Throws an error if `items` is not an array or a string.
22
- */
24
+ * @link https://js-toolkit.studiometa.dev/utils/randomItem.html
25
+ */
23
26
  export declare function randomItem<T>(items: T[] | string): T | string | undefined;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../packages/js-toolkit/utils/random.ts"],
4
- "sourcesContent": ["import { isArray, isString } from './is.js';\n\n/**\n * Get a random number between given bounds.\n * @param {number} a First bound.\n * @param {number} [b] Second bound, defaults to 0.\n * @returns {number} A number between `a` and `b`.\n */\nexport function random(a: number, b = 0): number {\n return Math.random() * (b - a) + a;\n}\n\n/**\n * Get a random integer between bounds\n *\n * @param {number} a First bound.\n * @param {number} b Second bound.\n * @returns {number} An integer between `a` and `b`;\n */\nexport function randomInt(a: number, b = 0): number {\n return Math.round(random(a, b));\n}\n\n/**\n * Get a random item of an array or a random character of a string\n *\n * @param {T[] | string} items Array or string\n * @returns {T | undefined}\n * @throws {Error} Throws an error if `items` is not an array or a string.\n */\nexport function randomItem<T>(items: T[] | string): T | string | undefined {\n if (!isArray(items) && !isString(items)) {\n throw new Error('randomItem() expects an array or a string as argument.');\n }\n return items.length > 0 ? items[randomInt(items.length - 1)] : undefined;\n}\n"],
5
- "mappings": "AAAA,SAAS,SAAS,gBAAgB;AAQ3B,SAAS,OAAO,GAAW,IAAI,GAAW;AAC/C,SAAO,KAAK,OAAO,KAAK,IAAI,KAAK;AACnC;AASO,SAAS,UAAU,GAAW,IAAI,GAAW;AAClD,SAAO,KAAK,MAAM,OAAO,GAAG,CAAC,CAAC;AAChC;AASO,SAAS,WAAc,OAA6C;AACzE,MAAI,CAAC,QAAQ,KAAK,KAAK,CAAC,SAAS,KAAK,GAAG;AACvC,UAAM,IAAI,MAAM,wDAAwD;AAAA,EAC1E;AACA,SAAO,MAAM,SAAS,IAAI,MAAM,UAAU,MAAM,SAAS,CAAC,CAAC,IAAI;AACjE;",
4
+ "sourcesContent": ["import { isArray, isString } from './is.js';\n\n/**\n * Get a random number between given bounds.\n * @param {number} a First bound.\n * @param {number} [b] Second bound, defaults to 0.\n * @return {number} A number between `a` and `b`.\n * @link https://js-toolkit.studiometa.dev/utils/random.html\n*/\nexport function random(a: number, b = 0): number {\n return Math.random() * (b - a) + a;\n}\n\n/**\n * Get a random integer between bounds\n *\n * @param {number} a First bound.\n * @param {number} b Second bound.\n * @return {number} An integer between `a` and `b`;\n * @link https://js-toolkit.studiometa.dev/utils/randomInt.html\n*/\nexport function randomInt(a: number, b = 0): number {\n return Math.round(random(a, b));\n}\n\n/**\n * Get a random item of an array or a random character of a string\n *\n * @param {T[] | string} items Array or string\n * @return {T | undefined}\n * @throws {Error} Throws an error if `items` is not an array or a string.\n * @link https://js-toolkit.studiometa.dev/utils/randomItem.html\n*/\nexport function randomItem<T>(items: T[] | string): T | string | undefined {\n if (!isArray(items) && !isString(items)) {\n throw new Error('randomItem() expects an array or a string as argument.');\n }\n return items.length > 0 ? items[randomInt(items.length - 1)] : undefined;\n}\n"],
5
+ "mappings": "AAAA,SAAS,SAAS,gBAAgB;AAS3B,SAAS,OAAO,GAAW,IAAI,GAAW;AAC/C,SAAO,KAAK,OAAO,KAAK,IAAI,KAAK;AACnC;AAUO,SAAS,UAAU,GAAW,IAAI,GAAW;AAClD,SAAO,KAAK,MAAM,OAAO,GAAG,CAAC,CAAC;AAChC;AAUO,SAAS,WAAc,OAA6C;AACzE,MAAI,CAAC,QAAQ,KAAK,KAAK,CAAC,SAAS,KAAK,GAAG;AACvC,UAAM,IAAI,MAAM,wDAAwD;AAAA,EAC1E;AACA,SAAO,MAAM,SAAS,IAAI,MAAM,UAAU,MAAM,SAAS,CAAC,CAAC,IAAI;AACjE;",
6
6
  "names": []
7
7
  }
@@ -4,7 +4,12 @@
4
4
  declare function getScheduler<T extends string>(steps: T[]): Record<T, (fn: () => unknown) => void>;
5
5
  /**
6
6
  * Use a scheduler based on the given steps.
7
- */
7
+ * @link https://js-toolkit.studiometa.dev/utils/useScheduler.html
8
+ */
8
9
  export declare function useScheduler<T extends string>(steps?: T[]): ReturnType<typeof getScheduler<T>>;
10
+ /**
11
+ * DOM-oriented scheduler using read/write/afterWrite steps.
12
+ * @link https://js-toolkit.studiometa.dev/utils/domScheduler.html
13
+ */
9
14
  export declare const domScheduler: Record<"read" | "write" | "afterWrite", (fn: () => unknown) => void>;
10
15
  export {};
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../packages/js-toolkit/utils/scheduler.ts"],
4
- "sourcesContent": ["/**\n * Generate a scheduler.\n */\nfunction getScheduler<T extends string>(steps: T[]): Record<T, (fn: () => unknown) => void> {\n const stepsFns = {} as Record<T, Array<() => void>>;\n const api = {} as Record<T, (fn: () => void) => void>;\n\n let isScheduled = false;\n\n const resolvedPromise = Promise.resolve();\n\n /**\n * Execute the given list of tasks.\n */\n function run(tasks: Array<() => void>) {\n let task;\n // eslint-disable-next-line no-cond-assign\n while ((task = tasks.shift())) {\n task();\n }\n }\n\n /**\n * Flush registered tasks and schedule the next run if needed.\n */\n function flush() {\n for (const step of steps) {\n run(stepsFns[step]);\n }\n isScheduled = false;\n\n if (steps.reduce((length, step) => length + stepsFns[step].length, 0) > 0) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define, no-use-before-define\n scheduleFlush();\n }\n }\n\n /**\n * Schedule the next flush of tasks.\n */\n function scheduleFlush() {\n if (isScheduled) {\n return;\n }\n\n isScheduled = true;\n resolvedPromise.then(flush);\n }\n\n for (const step of steps) {\n stepsFns[step] = [];\n api[step] = function add(fn) {\n stepsFns[step].push(fn);\n scheduleFlush();\n };\n }\n\n return api;\n}\n\nconst instances = new Map();\n\nconst domSchedulerSteps = ['read', 'write', 'afterWrite'];\n\n/**\n * Use a scheduler based on the given steps.\n */\nexport function useScheduler<T extends string>(\n steps: T[] = domSchedulerSteps as T[],\n): ReturnType<typeof getScheduler<T>> {\n const key = steps.join('-');\n\n if (instances.has(key)) {\n return instances.get(key);\n }\n\n const scheduler = getScheduler(steps);\n instances.set(key, scheduler);\n\n return scheduler;\n}\n\nexport const domScheduler = useScheduler(domSchedulerSteps as ['read', 'write', 'afterWrite']);\n"],
5
- "mappings": "AAGA,SAAS,aAA+B,OAAoD;AAC1F,QAAM,WAAW,CAAC;AAClB,QAAM,MAAM,CAAC;AAEb,MAAI,cAAc;AAElB,QAAM,kBAAkB,QAAQ,QAAQ;AAKxC,WAAS,IAAI,OAA0B;AACrC,QAAI;AAEJ,WAAQ,OAAO,MAAM,MAAM,GAAI;AAC7B,WAAK;AAAA,IACP;AAAA,EACF;AAKA,WAAS,QAAQ;AACf,eAAW,QAAQ,OAAO;AACxB,UAAI,SAAS,IAAI,CAAC;AAAA,IACpB;AACA,kBAAc;AAEd,QAAI,MAAM,OAAO,CAAC,QAAQ,SAAS,SAAS,SAAS,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG;AAEzE,oBAAc;AAAA,IAChB;AAAA,EACF;AAKA,WAAS,gBAAgB;AACvB,QAAI,aAAa;AACf;AAAA,IACF;AAEA,kBAAc;AACd,oBAAgB,KAAK,KAAK;AAAA,EAC5B;AAEA,aAAW,QAAQ,OAAO;AACxB,aAAS,IAAI,IAAI,CAAC;AAClB,QAAI,IAAI,IAAI,SAAS,IAAI,IAAI;AAC3B,eAAS,IAAI,EAAE,KAAK,EAAE;AACtB,oBAAc;AAAA,IAChB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,MAAM,YAAY,oBAAI,IAAI;AAE1B,MAAM,oBAAoB,CAAC,QAAQ,SAAS,YAAY;AAKjD,SAAS,aACd,QAAa,mBACuB;AACpC,QAAM,MAAM,MAAM,KAAK,GAAG;AAE1B,MAAI,UAAU,IAAI,GAAG,GAAG;AACtB,WAAO,UAAU,IAAI,GAAG;AAAA,EAC1B;AAEA,QAAM,YAAY,aAAa,KAAK;AACpC,YAAU,IAAI,KAAK,SAAS;AAE5B,SAAO;AACT;AAEO,MAAM,eAAe,aAAa,iBAAoD;",
4
+ "sourcesContent": ["/**\n * Generate a scheduler.\n */\nfunction getScheduler<T extends string>(steps: T[]): Record<T, (fn: () => unknown) => void> {\n const stepsFns = {} as Record<T, Array<() => void>>;\n const api = {} as Record<T, (fn: () => void) => void>;\n\n let isScheduled = false;\n\n const resolvedPromise = Promise.resolve();\n\n /**\n * Execute the given list of tasks.\n */\n function run(tasks: Array<() => void>) {\n let task;\n // eslint-disable-next-line no-cond-assign\n while ((task = tasks.shift())) {\n task();\n }\n }\n\n /**\n * Flush registered tasks and schedule the next run if needed.\n */\n function flush() {\n for (const step of steps) {\n run(stepsFns[step]);\n }\n isScheduled = false;\n\n if (steps.reduce((length, step) => length + stepsFns[step].length, 0) > 0) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define, no-use-before-define\n scheduleFlush();\n }\n }\n\n /**\n * Schedule the next flush of tasks.\n */\n function scheduleFlush() {\n if (isScheduled) {\n return;\n }\n\n isScheduled = true;\n resolvedPromise.then(flush);\n }\n\n for (const step of steps) {\n stepsFns[step] = [];\n api[step] = function add(fn) {\n stepsFns[step].push(fn);\n scheduleFlush();\n };\n }\n\n return api;\n}\n\nconst instances = new Map();\n\nconst domSchedulerSteps = ['read', 'write', 'afterWrite'];\n\n/**\n * Use a scheduler based on the given steps.\n * @link https://js-toolkit.studiometa.dev/utils/useScheduler.html\n*/\nexport function useScheduler<T extends string>(\n steps: T[] = domSchedulerSteps as T[],\n): ReturnType<typeof getScheduler<T>> {\n const key = steps.join('-');\n\n if (instances.has(key)) {\n return instances.get(key);\n }\n\n const scheduler = getScheduler(steps);\n instances.set(key, scheduler);\n\n return scheduler;\n}\n\n/**\n * DOM-oriented scheduler using read/write/afterWrite steps.\n * @link https://js-toolkit.studiometa.dev/utils/domScheduler.html\n*/\nexport const domScheduler = useScheduler(domSchedulerSteps as ['read', 'write', 'afterWrite']);\n"],
5
+ "mappings": "AAGA,SAAS,aAA+B,OAAoD;AAC1F,QAAM,WAAW,CAAC;AAClB,QAAM,MAAM,CAAC;AAEb,MAAI,cAAc;AAElB,QAAM,kBAAkB,QAAQ,QAAQ;AAKxC,WAAS,IAAI,OAA0B;AACrC,QAAI;AAEJ,WAAQ,OAAO,MAAM,MAAM,GAAI;AAC7B,WAAK;AAAA,IACP;AAAA,EACF;AAKA,WAAS,QAAQ;AACf,eAAW,QAAQ,OAAO;AACxB,UAAI,SAAS,IAAI,CAAC;AAAA,IACpB;AACA,kBAAc;AAEd,QAAI,MAAM,OAAO,CAAC,QAAQ,SAAS,SAAS,SAAS,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG;AAEzE,oBAAc;AAAA,IAChB;AAAA,EACF;AAKA,WAAS,gBAAgB;AACvB,QAAI,aAAa;AACf;AAAA,IACF;AAEA,kBAAc;AACd,oBAAgB,KAAK,KAAK;AAAA,EAC5B;AAEA,aAAW,QAAQ,OAAO;AACxB,aAAS,IAAI,IAAI,CAAC;AAClB,QAAI,IAAI,IAAI,SAAS,IAAI,IAAI;AAC3B,eAAS,IAAI,EAAE,KAAK,EAAE;AACtB,oBAAc;AAAA,IAChB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,MAAM,YAAY,oBAAI,IAAI;AAE1B,MAAM,oBAAoB,CAAC,QAAQ,SAAS,YAAY;AAMjD,SAAS,aACd,QAAa,mBACuB;AACpC,QAAM,MAAM,MAAM,KAAK,GAAG;AAE1B,MAAI,UAAU,IAAI,GAAG,GAAG;AACtB,WAAO,UAAU,IAAI,GAAG;AAAA,EAC1B;AAEA,QAAM,YAAY,aAAa,KAAK;AACpC,YAAU,IAAI,KAAK,SAAS;AAE5B,SAAO;AACT;AAMO,MAAM,eAAe,aAAa,iBAAoD;",
6
6
  "names": []
7
7
  }
@@ -21,8 +21,9 @@ export interface ScrollToOptions extends TweenOptions {
21
21
  /**
22
22
  * Scroll to an element.
23
23
  *
24
- * @returns {Promise<ScrollPosition>} A promising resolving with the scroll position.
25
- */
24
+ * @return {Promise<ScrollPosition>} A promising resolving with the scroll position.
25
+ * @link https://js-toolkit.studiometa.dev/utils/scrollTo.html
26
+ */
26
27
  export declare function scrollTo(target: string | HTMLElement | number | Partial<ScrollPosition>, { rootElement, axis, offset, ...tweenOptions }?: ScrollToOptions): Promise<ScrollPosition>;
27
28
  export declare namespace scrollTo {
28
29
  var axis: {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../packages/js-toolkit/utils/scrollTo.ts"],
4
- "sourcesContent": ["import { tween } from './tween.js';\nimport type { TweenOptions } from './tween.js';\nimport { isString, isNumber, isFunction, isDefined } from './is.js';\nimport { lerp } from './math/index.js';\n\nexport interface ScrollPosition {\n left: number;\n top: number;\n}\n\nexport type ScrollTarget = string | HTMLElement | number | Partial<ScrollPosition>;\n\nexport interface ScrollToOptions extends TweenOptions {\n /**\n * Root element that will be scrolled.\n */\n rootElement?: HTMLElement | typeof window;\n /**\n * Scroll direction.\n */\n axis?: (typeof scrollTo.axis)[keyof typeof scrollTo.axis];\n /**\n * Distance from the target.\n */\n offset?: number;\n}\n\nconst xAxis = Symbol(0);\nconst yAxis = Symbol(1);\nconst bothAxis = Symbol(2);\n\nfunction isHtmlElement(rootElement: ScrollToOptions['rootElement']): rootElement is HTMLElement {\n return rootElement instanceof HTMLElement;\n}\n\n/**\n * Get the current root element or window scroll position.\n */\nfunction getCurrentScrollPosition(rootElement: ScrollToOptions['rootElement']): ScrollPosition {\n return {\n left: isHtmlElement(rootElement) ? rootElement.scrollTop : rootElement.scrollX,\n top: isHtmlElement(rootElement) ? rootElement.scrollLeft : rootElement.scrollY,\n };\n}\n\n/**\n * Get the maximum scroll position values.\n */\nfunction getMaxScrollPosition(rootElement?: ScrollToOptions['rootElement']): ScrollPosition {\n return {\n left: isHtmlElement(rootElement)\n ? rootElement.scrollWidth - rootElement.offsetWidth\n : document.documentElement.scrollWidth - window.innerWidth,\n top: isHtmlElement(rootElement)\n ? rootElement.scrollHeight - rootElement.offsetHeight\n : document.documentElement.scrollHeight - window.innerHeight,\n };\n}\n\n/**\n * Get the target scroll position.\n */\nfunction getTargetScrollPosition(\n initialScrollPosition: ScrollPosition,\n maxScrollPosition: ScrollPosition,\n target: ScrollTarget,\n axis: ScrollToOptions['axis'],\n offset: number,\n): ScrollPosition {\n let { top, left } = initialScrollPosition;\n\n if (target instanceof HTMLElement || isString(target)) {\n const targetElement = target instanceof HTMLElement ? target : document.querySelector(target);\n\n if (!targetElement) {\n return { top, left };\n }\n\n const sizes = targetElement.getBoundingClientRect();\n const styles = getComputedStyle(targetElement);\n const scrollMargin = {\n left: Number.parseInt(styles.scrollMarginLeft || '0', 10),\n top: Number.parseInt(styles.scrollMarginTop || '0', 10),\n };\n\n // Set the scroll position of the target element.\n left = sizes.left + initialScrollPosition.left - scrollMargin.left;\n top = sizes.top + initialScrollPosition.top - scrollMargin.top;\n } else if (isNumber(target)) {\n left = target;\n top = target;\n } else {\n left = target.left ?? left;\n top = target.top ?? top;\n }\n\n left -= offset;\n top -= offset;\n\n if (axis !== bothAxis) {\n if (axis !== xAxis && !isDefined((target as Partial<ScrollPosition>).left)) {\n left = initialScrollPosition.left;\n }\n\n if (axis !== yAxis) {\n top = initialScrollPosition.top;\n }\n }\n\n return {\n left: Math.min(left, maxScrollPosition.left),\n top: Math.min(top, maxScrollPosition.top),\n };\n}\n\n/**\n * Scroll to an element.\n *\n * @returns {Promise<ScrollPosition>} A promising resolving with the scroll position.\n */\nexport function scrollTo(\n target: string | HTMLElement | number | Partial<ScrollPosition>,\n { rootElement = window, axis = yAxis, offset = 0, ...tweenOptions }: ScrollToOptions = {},\n): Promise<ScrollPosition> {\n const initialScrollPosition = getCurrentScrollPosition(rootElement);\n const maxScrollPosition = getMaxScrollPosition(rootElement);\n const targetScrollPosition = getTargetScrollPosition(\n initialScrollPosition,\n maxScrollPosition,\n target,\n axis,\n offset,\n );\n\n return new Promise((resolve) => {\n function eventHandler() {\n /* eslint-disable @typescript-eslint/no-use-before-define */\n tw.pause();\n stop();\n /* eslint-enable @typescript-eslint/no-use-before-define */\n }\n\n function stop() {\n rootElement.removeEventListener('wheel', eventHandler);\n rootElement.removeEventListener('touchmove', eventHandler);\n\n // Resolve the promise on animation finish.\n resolve(getCurrentScrollPosition(rootElement));\n }\n\n // Setup tween.\n const tw = tween(\n (progress) => {\n rootElement.scrollTo({\n left: lerp(initialScrollPosition.left, targetScrollPosition.left, progress),\n top: lerp(initialScrollPosition.top, targetScrollPosition.top, progress),\n behavior: 'instant',\n });\n },\n {\n smooth: 0.2,\n ...tweenOptions,\n onFinish(progress) {\n if (isFunction(tweenOptions.onFinish)) {\n tweenOptions.onFinish(progress);\n }\n\n stop();\n },\n },\n );\n\n rootElement.addEventListener('wheel', eventHandler, { passive: true });\n rootElement.addEventListener('touchmove', eventHandler, { passive: true });\n tw.start();\n });\n}\n\nscrollTo.axis = {\n x: xAxis,\n y: yAxis,\n both: bothAxis,\n};\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { tween } from './tween.js';\nimport type { TweenOptions } from './tween.js';\nimport { isString, isNumber, isFunction, isDefined } from './is.js';\nimport { lerp } from './math/index.js';\n\nexport interface ScrollPosition {\n left: number;\n top: number;\n}\n\nexport type ScrollTarget = string | HTMLElement | number | Partial<ScrollPosition>;\n\nexport interface ScrollToOptions extends TweenOptions {\n /**\n * Root element that will be scrolled.\n */\n rootElement?: HTMLElement | typeof window;\n /**\n * Scroll direction.\n */\n axis?: (typeof scrollTo.axis)[keyof typeof scrollTo.axis];\n /**\n * Distance from the target.\n */\n offset?: number;\n}\n\nconst xAxis = Symbol(0);\nconst yAxis = Symbol(1);\nconst bothAxis = Symbol(2);\n\nfunction isHtmlElement(rootElement: ScrollToOptions['rootElement']): rootElement is HTMLElement {\n return rootElement instanceof HTMLElement;\n}\n\n/**\n * Get the current root element or window scroll position.\n */\nfunction getCurrentScrollPosition(rootElement: ScrollToOptions['rootElement']): ScrollPosition {\n return {\n left: isHtmlElement(rootElement) ? rootElement.scrollTop : rootElement.scrollX,\n top: isHtmlElement(rootElement) ? rootElement.scrollLeft : rootElement.scrollY,\n };\n}\n\n/**\n * Get the maximum scroll position values.\n */\nfunction getMaxScrollPosition(rootElement?: ScrollToOptions['rootElement']): ScrollPosition {\n return {\n left: isHtmlElement(rootElement)\n ? rootElement.scrollWidth - rootElement.offsetWidth\n : document.documentElement.scrollWidth - window.innerWidth,\n top: isHtmlElement(rootElement)\n ? rootElement.scrollHeight - rootElement.offsetHeight\n : document.documentElement.scrollHeight - window.innerHeight,\n };\n}\n\n/**\n * Get the target scroll position.\n */\nfunction getTargetScrollPosition(\n initialScrollPosition: ScrollPosition,\n maxScrollPosition: ScrollPosition,\n target: ScrollTarget,\n axis: ScrollToOptions['axis'],\n offset: number,\n): ScrollPosition {\n let { top, left } = initialScrollPosition;\n\n if (target instanceof HTMLElement || isString(target)) {\n const targetElement = target instanceof HTMLElement ? target : document.querySelector(target);\n\n if (!targetElement) {\n return { top, left };\n }\n\n const sizes = targetElement.getBoundingClientRect();\n const styles = getComputedStyle(targetElement);\n const scrollMargin = {\n left: Number.parseInt(styles.scrollMarginLeft || '0', 10),\n top: Number.parseInt(styles.scrollMarginTop || '0', 10),\n };\n\n // Set the scroll position of the target element.\n left = sizes.left + initialScrollPosition.left - scrollMargin.left;\n top = sizes.top + initialScrollPosition.top - scrollMargin.top;\n } else if (isNumber(target)) {\n left = target;\n top = target;\n } else {\n left = target.left ?? left;\n top = target.top ?? top;\n }\n\n left -= offset;\n top -= offset;\n\n if (axis !== bothAxis) {\n if (axis !== xAxis && !isDefined((target as Partial<ScrollPosition>).left)) {\n left = initialScrollPosition.left;\n }\n\n if (axis !== yAxis) {\n top = initialScrollPosition.top;\n }\n }\n\n return {\n left: Math.min(left, maxScrollPosition.left),\n top: Math.min(top, maxScrollPosition.top),\n };\n}\n\n/**\n * Scroll to an element.\n *\n * @return {Promise<ScrollPosition>} A promising resolving with the scroll position.\n * @link https://js-toolkit.studiometa.dev/utils/scrollTo.html\n*/\nexport function scrollTo(\n target: string | HTMLElement | number | Partial<ScrollPosition>,\n { rootElement = window, axis = yAxis, offset = 0, ...tweenOptions }: ScrollToOptions = {},\n): Promise<ScrollPosition> {\n const initialScrollPosition = getCurrentScrollPosition(rootElement);\n const maxScrollPosition = getMaxScrollPosition(rootElement);\n const targetScrollPosition = getTargetScrollPosition(\n initialScrollPosition,\n maxScrollPosition,\n target,\n axis,\n offset,\n );\n\n return new Promise((resolve) => {\n function eventHandler() {\n /* eslint-disable @typescript-eslint/no-use-before-define */\n tw.pause();\n stop();\n /* eslint-enable @typescript-eslint/no-use-before-define */\n }\n\n function stop() {\n rootElement.removeEventListener('wheel', eventHandler);\n rootElement.removeEventListener('touchmove', eventHandler);\n\n // Resolve the promise on animation finish.\n resolve(getCurrentScrollPosition(rootElement));\n }\n\n // Setup tween.\n const tw = tween(\n (progress) => {\n rootElement.scrollTo({\n left: lerp(initialScrollPosition.left, targetScrollPosition.left, progress),\n top: lerp(initialScrollPosition.top, targetScrollPosition.top, progress),\n behavior: 'instant',\n });\n },\n {\n smooth: 0.2,\n ...tweenOptions,\n onFinish(progress) {\n if (isFunction(tweenOptions.onFinish)) {\n tweenOptions.onFinish(progress);\n }\n\n stop();\n },\n },\n );\n\n rootElement.addEventListener('wheel', eventHandler, { passive: true });\n rootElement.addEventListener('touchmove', eventHandler, { passive: true });\n tw.start();\n });\n}\n\nscrollTo.axis = {\n x: xAxis,\n y: yAxis,\n both: bothAxis,\n};\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,24 +1,30 @@
1
1
  /**
2
2
  * Convert a string to lowercase.
3
- */
3
+ * @link https://js-toolkit.studiometa.dev/utils/string/lowerCase.html
4
+ */
4
5
  export declare function lowerCase(string: string): string;
5
6
  /**
6
7
  * Convert a string to UPPERCASE.
7
- */
8
+ * @link https://js-toolkit.studiometa.dev/utils/string/upperCase.html
9
+ */
8
10
  export declare function upperCase(string: string): string;
9
11
  /**
10
12
  * Convert a string to camelCase.
11
- */
13
+ * @link https://js-toolkit.studiometa.dev/utils/string/camelCase.html
14
+ */
12
15
  export declare const camelCase: (string: string) => string;
13
16
  /**
14
17
  * Convert a string to PascalCase.
15
- */
18
+ * @link https://js-toolkit.studiometa.dev/utils/string/pascalCase.html
19
+ */
16
20
  export declare const pascalCase: (string: string) => string;
17
21
  /**
18
22
  * Convert a string to snake_case.
19
- */
23
+ * @link https://js-toolkit.studiometa.dev/utils/string/snakeCase.html
24
+ */
20
25
  export declare const snakeCase: (string: string) => string;
21
26
  /**
22
27
  * Convert a string to dash-case.
23
- */
28
+ * @link https://js-toolkit.studiometa.dev/utils/string/dashCase.html
29
+ */
24
30
  export declare const dashCase: (string: string) => string;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/js-toolkit/utils/string/changeCase.ts"],
4
- "sourcesContent": ["import { memo } from '../memo.js';\n\nconst SPLIT_LOWER_UPPER_RE = /([\\p{Ll}\\d])(\\p{Lu})/gu;\nconst SPLIT_UPPER_UPPER_RE = /(\\p{Lu})([\\p{Lu}][\\p{Ll}])/gu;\nconst DEFAULT_STRIP_REGEXP = /[^\\p{L}\\d]+/giu;\nconst SPLIT_REPLACE_VALUE = '$1\\0$2';\n\n/**\n * Split function from the `change-case` package.\n * @see https://github.com/blakeembrey/change-case\n */\nfunction split(value: string) {\n let result = value.trim();\n\n result = result\n .replace(SPLIT_LOWER_UPPER_RE, SPLIT_REPLACE_VALUE)\n .replace(SPLIT_UPPER_UPPER_RE, SPLIT_REPLACE_VALUE);\n\n result = result.replace(DEFAULT_STRIP_REGEXP, '\\0');\n\n let start = 0;\n let end = result.length;\n\n // Trim the delimiter from around the output string.\n while (result.charAt(start) === '\\0') start++;\n if (start === end) return [];\n while (result.charAt(end - 1) === '\\0') end--;\n\n return result.slice(start, end).split(/\\0/g);\n}\n\n/**\n * Convert a string to lowercase and join each word with the given delimiter.\n */\nfunction delimitedCase(string: string, delimiter: string): string {\n return split(string)\n .map((word) => lowerCase(word))\n .join(delimiter);\n}\n/**\n * Convert a string to lowercase.\n */\nexport function lowerCase(string: string): string {\n return string.toLowerCase();\n}\n\n/**\n * Convert a string to UPPERCASE.\n */\nexport function upperCase(string: string): string {\n return string.toUpperCase();\n}\n\n/**\n * Convert a string to camelCase.\n */\nexport const camelCase = memo(function camelCase(string: string): string {\n const result = pascalCase(string);\n return lowerCase(result[0]) + result.slice(1);\n});\n\n/**\n * Convert a string to PascalCase.\n */\nexport const pascalCase = memo(function pascalCase(string: string): string {\n return split(string)\n .map((word) => upperCase(word[0]) + lowerCase(word.slice(1)))\n .join('');\n});\n\n/**\n * Convert a string to snake_case.\n */\nexport const snakeCase = memo(function snakeCase(string: string): string {\n return delimitedCase(string, '_');\n});\n\n/**\n * Convert a string to dash-case.\n */\nexport const dashCase = memo(function dashCase(string: string): string {\n return delimitedCase(string, '-');\n});\n"],
5
- "mappings": "AAAA,SAAS,YAAY;AAErB,MAAM,uBAAuB;AAC7B,MAAM,uBAAuB;AAC7B,MAAM,uBAAuB;AAC7B,MAAM,sBAAsB;AAM5B,SAAS,MAAM,OAAe;AAC5B,MAAI,SAAS,MAAM,KAAK;AAExB,WAAS,OACN,QAAQ,sBAAsB,mBAAmB,EACjD,QAAQ,sBAAsB,mBAAmB;AAEpD,WAAS,OAAO,QAAQ,sBAAsB,IAAI;AAElD,MAAI,QAAQ;AACZ,MAAI,MAAM,OAAO;AAGjB,SAAO,OAAO,OAAO,KAAK,MAAM,KAAM;AACtC,MAAI,UAAU,IAAK,QAAO,CAAC;AAC3B,SAAO,OAAO,OAAO,MAAM,CAAC,MAAM,KAAM;AAExC,SAAO,OAAO,MAAM,OAAO,GAAG,EAAE,MAAM,KAAK;AAC7C;AAKA,SAAS,cAAc,QAAgB,WAA2B;AAChE,SAAO,MAAM,MAAM,EAChB,IAAI,CAAC,SAAS,UAAU,IAAI,CAAC,EAC7B,KAAK,SAAS;AACnB;AAIO,SAAS,UAAU,QAAwB;AAChD,SAAO,OAAO,YAAY;AAC5B;AAKO,SAAS,UAAU,QAAwB;AAChD,SAAO,OAAO,YAAY;AAC5B;AAKO,MAAM,YAAY,KAAK,SAASA,WAAU,QAAwB;AACvE,QAAM,SAAS,WAAW,MAAM;AAChC,SAAO,UAAU,OAAO,CAAC,CAAC,IAAI,OAAO,MAAM,CAAC;AAC9C,CAAC;AAKM,MAAM,aAAa,KAAK,SAASC,YAAW,QAAwB;AACzE,SAAO,MAAM,MAAM,EAChB,IAAI,CAAC,SAAS,UAAU,KAAK,CAAC,CAAC,IAAI,UAAU,KAAK,MAAM,CAAC,CAAC,CAAC,EAC3D,KAAK,EAAE;AACZ,CAAC;AAKM,MAAM,YAAY,KAAK,SAASC,WAAU,QAAwB;AACvE,SAAO,cAAc,QAAQ,GAAG;AAClC,CAAC;AAKM,MAAM,WAAW,KAAK,SAASC,UAAS,QAAwB;AACrE,SAAO,cAAc,QAAQ,GAAG;AAClC,CAAC;",
4
+ "sourcesContent": ["import { memo } from '../memo.js';\n\nconst SPLIT_LOWER_UPPER_RE = /([\\p{Ll}\\d])(\\p{Lu})/gu;\nconst SPLIT_UPPER_UPPER_RE = /(\\p{Lu})([\\p{Lu}][\\p{Ll}])/gu;\nconst DEFAULT_STRIP_REGEXP = /[^\\p{L}\\d]+/giu;\nconst SPLIT_REPLACE_VALUE = '$1\\0$2';\n\n/**\n * Split function from the `change-case` package.\n * @link https://github.com/blakeembrey/change-case\n */\nfunction split(value: string) {\n let result = value.trim();\n\n result = result\n .replace(SPLIT_LOWER_UPPER_RE, SPLIT_REPLACE_VALUE)\n .replace(SPLIT_UPPER_UPPER_RE, SPLIT_REPLACE_VALUE);\n\n result = result.replace(DEFAULT_STRIP_REGEXP, '\\0');\n\n let start = 0;\n let end = result.length;\n\n // Trim the delimiter from around the output string.\n while (result.charAt(start) === '\\0') start++;\n if (start === end) return [];\n while (result.charAt(end - 1) === '\\0') end--;\n\n return result.slice(start, end).split(/\\0/g);\n}\n\n/**\n * Convert a string to lowercase and join each word with the given delimiter.\n */\nfunction delimitedCase(string: string, delimiter: string): string {\n return split(string)\n .map((word) => lowerCase(word))\n .join(delimiter);\n}\n/**\n * Convert a string to lowercase.\n * @link https://js-toolkit.studiometa.dev/utils/string/lowerCase.html\n*/\nexport function lowerCase(string: string): string {\n return string.toLowerCase();\n}\n\n/**\n * Convert a string to UPPERCASE.\n * @link https://js-toolkit.studiometa.dev/utils/string/upperCase.html\n*/\nexport function upperCase(string: string): string {\n return string.toUpperCase();\n}\n\n/**\n * Convert a string to camelCase.\n * @link https://js-toolkit.studiometa.dev/utils/string/camelCase.html\n*/\nexport const camelCase = memo(function camelCase(string: string): string {\n const result = pascalCase(string);\n return lowerCase(result[0]) + result.slice(1);\n});\n\n/**\n * Convert a string to PascalCase.\n * @link https://js-toolkit.studiometa.dev/utils/string/pascalCase.html\n*/\nexport const pascalCase = memo(function pascalCase(string: string): string {\n return split(string)\n .map((word) => upperCase(word[0]) + lowerCase(word.slice(1)))\n .join('');\n});\n\n/**\n * Convert a string to snake_case.\n * @link https://js-toolkit.studiometa.dev/utils/string/snakeCase.html\n*/\nexport const snakeCase = memo(function snakeCase(string: string): string {\n return delimitedCase(string, '_');\n});\n\n/**\n * Convert a string to dash-case.\n * @link https://js-toolkit.studiometa.dev/utils/string/dashCase.html\n*/\nexport const dashCase = memo(function dashCase(string: string): string {\n return delimitedCase(string, '-');\n});\n"],
5
+ "mappings": "AAAA,SAAS,YAAY;AAErB,MAAM,uBAAuB;AAC7B,MAAM,uBAAuB;AAC7B,MAAM,uBAAuB;AAC7B,MAAM,sBAAsB;AAM5B,SAAS,MAAM,OAAe;AAC5B,MAAI,SAAS,MAAM,KAAK;AAExB,WAAS,OACN,QAAQ,sBAAsB,mBAAmB,EACjD,QAAQ,sBAAsB,mBAAmB;AAEpD,WAAS,OAAO,QAAQ,sBAAsB,IAAI;AAElD,MAAI,QAAQ;AACZ,MAAI,MAAM,OAAO;AAGjB,SAAO,OAAO,OAAO,KAAK,MAAM,KAAM;AACtC,MAAI,UAAU,IAAK,QAAO,CAAC;AAC3B,SAAO,OAAO,OAAO,MAAM,CAAC,MAAM,KAAM;AAExC,SAAO,OAAO,MAAM,OAAO,GAAG,EAAE,MAAM,KAAK;AAC7C;AAKA,SAAS,cAAc,QAAgB,WAA2B;AAChE,SAAO,MAAM,MAAM,EAChB,IAAI,CAAC,SAAS,UAAU,IAAI,CAAC,EAC7B,KAAK,SAAS;AACnB;AAKO,SAAS,UAAU,QAAwB;AAChD,SAAO,OAAO,YAAY;AAC5B;AAMO,SAAS,UAAU,QAAwB;AAChD,SAAO,OAAO,YAAY;AAC5B;AAMO,MAAM,YAAY,KAAK,SAASA,WAAU,QAAwB;AACvE,QAAM,SAAS,WAAW,MAAM;AAChC,SAAO,UAAU,OAAO,CAAC,CAAC,IAAI,OAAO,MAAM,CAAC;AAC9C,CAAC;AAMM,MAAM,aAAa,KAAK,SAASC,YAAW,QAAwB;AACzE,SAAO,MAAM,MAAM,EAChB,IAAI,CAAC,SAAS,UAAU,KAAK,CAAC,CAAC,IAAI,UAAU,KAAK,MAAM,CAAC,CAAC,CAAC,EAC3D,KAAK,EAAE;AACZ,CAAC;AAMM,MAAM,YAAY,KAAK,SAASC,WAAU,QAAwB;AACvE,SAAO,cAAc,QAAQ,GAAG;AAClC,CAAC;AAMM,MAAM,WAAW,KAAK,SAASC,UAAS,QAAwB;AACrE,SAAO,cAAc,QAAQ,GAAG;AAClC,CAAC;",
6
6
  "names": ["camelCase", "pascalCase", "snakeCase", "dashCase"]
7
7
  }
@@ -3,6 +3,7 @@
3
3
  *
4
4
  * This is a more performant version of the `String.prototype.endsWith` method.
5
5
  *
6
- * @see https://jsbench.me/1hlkqqd0ff/2
6
+ * @link https://jsbench.me/1hlkqqd0ff/2
7
+ * @link https://js-toolkit.studiometa.dev/utils/string/endsWith.html
7
8
  */
8
9
  export declare function endsWith(string: string, search: string): boolean;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/js-toolkit/utils/string/endsWith.ts"],
4
- "sourcesContent": ["/**\n * Test if a string starts with another string.\n *\n * This is a more performant version of the `String.prototype.endsWith` method.\n *\n * @see https://jsbench.me/1hlkqqd0ff/2\n */\nexport function endsWith(string: string, search: string): boolean {\n if (search.length === 0) {\n return true;\n }\n\n if (search.length === 1) {\n // eslint-disable-next-line unicorn/prefer-at\n return string[string.length - 1] === search;\n }\n\n // eslint-disable-next-line unicorn/prefer-string-slice\n return string.substring(string.length - search.length) === search;\n}\n"],
5
- "mappings": "AAOO,SAAS,SAAS,QAAgB,QAAyB;AAChE,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,WAAW,GAAG;AAEvB,WAAO,OAAO,OAAO,SAAS,CAAC,MAAM;AAAA,EACvC;AAGA,SAAO,OAAO,UAAU,OAAO,SAAS,OAAO,MAAM,MAAM;AAC7D;",
4
+ "sourcesContent": ["/**\n * Test if a string starts with another string.\n *\n * This is a more performant version of the `String.prototype.endsWith` method.\n *\n * @link https://jsbench.me/1hlkqqd0ff/2\n * @link https://js-toolkit.studiometa.dev/utils/string/endsWith.html\n */\nexport function endsWith(string: string, search: string): boolean {\n if (search.length === 0) {\n return true;\n }\n\n if (search.length === 1) {\n // eslint-disable-next-line unicorn/prefer-at\n return string[string.length - 1] === search;\n }\n\n // eslint-disable-next-line unicorn/prefer-string-slice\n return string.substring(string.length - search.length) === search;\n}\n"],
5
+ "mappings": "AAQO,SAAS,SAAS,QAAgB,QAAyB;AAChE,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,WAAW,GAAG;AAEvB,WAAO,OAAO,OAAO,SAAS,CAAC,MAAM;AAAA,EACvC;AAGA,SAAO,OAAO,UAAU,OAAO,SAAS,OAAO,MAAM,MAAM;AAC7D;",
6
6
  "names": []
7
7
  }