solid-tiny-utils 0.9.0 → 0.11.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 (45) hide show
  1. package/dist/dom/animation.d.mts +4 -0
  2. package/dist/dom/animation.mjs +8 -0
  3. package/dist/{jsx → dom}/attrs.d.mts +1 -1
  4. package/dist/{jsx → dom}/attrs.mjs +1 -1
  5. package/dist/index.d.mts +19 -17
  6. package/dist/index.mjs +18 -16
  7. package/dist/{event → solidjs}/create-click-outside.d.mts +1 -1
  8. package/dist/{event → solidjs}/create-click-outside.mjs +2 -2
  9. package/dist/{reactive → solidjs}/create-debounce-watch.d.mts +1 -1
  10. package/dist/{reactive → solidjs}/create-debounce-watch.mjs +2 -2
  11. package/dist/{fn → solidjs}/create-debounce.d.mts +1 -1
  12. package/dist/{fn → solidjs}/create-debounce.mjs +2 -2
  13. package/dist/{event → solidjs}/create-event-listener.d.mts +1 -1
  14. package/dist/{event → solidjs}/create-event-listener.mjs +4 -5
  15. package/dist/{event → solidjs}/create-intersection-observer.d.mts +1 -1
  16. package/dist/{event → solidjs}/create-intersection-observer.mjs +4 -4
  17. package/dist/solidjs/create-list.d.mts +14 -0
  18. package/dist/solidjs/create-list.mjs +77 -0
  19. package/dist/{fn → solidjs}/create-loop-exec.d.mts +1 -1
  20. package/dist/{fn → solidjs}/create-loop-exec.mjs +3 -3
  21. package/dist/solidjs/create-presence.d.mts +11 -0
  22. package/dist/solidjs/create-presence.mjs +29 -0
  23. package/dist/{fn → solidjs}/create-throttle.d.mts +1 -1
  24. package/dist/{fn → solidjs}/create-throttle.mjs +2 -2
  25. package/dist/{event → solidjs}/create-visibility-observer.d.mts +1 -1
  26. package/dist/{event → solidjs}/create-visibility-observer.mjs +3 -3
  27. package/dist/{reactive → solidjs}/create-watch.d.mts +1 -1
  28. package/dist/{reactive → solidjs}/create-watch.mjs +1 -1
  29. package/dist/solidjs/index.d.mts +13 -0
  30. package/dist/{event → solidjs}/make-event-listener.d.mts +1 -1
  31. package/dist/{event → solidjs}/make-event-listener.mjs +2 -2
  32. package/dist/solidjs/utils.d.mts +10 -0
  33. package/dist/solidjs/utils.mjs +16 -0
  34. package/dist/utils/constant.d.mts +4 -0
  35. package/dist/utils/constant.mjs +5 -0
  36. package/dist/utils/is.d.mts +3 -1
  37. package/dist/utils/is.mjs +8 -2
  38. package/package.json +8 -7
  39. package/dist/event/index.d.mts +0 -11
  40. package/dist/event/index.mjs +0 -14
  41. package/dist/fn/index.d.mts +0 -8
  42. package/dist/fn/index.mjs +0 -9
  43. package/dist/reactive/access.d.mts +0 -6
  44. package/dist/reactive/access.mjs +0 -9
  45. package/dist/reactive/index.d.mts +0 -3
@@ -0,0 +1,4 @@
1
+ //#region src/dom/animation.d.ts
2
+ declare function hasAnimation(element: HTMLElement): boolean;
3
+ //#endregion
4
+ export { hasAnimation };
@@ -0,0 +1,8 @@
1
+ //#region src/dom/animation.ts
2
+ function hasAnimation(element) {
3
+ const styles = getComputedStyle(element);
4
+ return Number.parseFloat(styles.animationDuration || "0") > 0;
5
+ }
6
+
7
+ //#endregion
8
+ export { hasAnimation };
@@ -1,4 +1,4 @@
1
- //#region src/jsx/attrs.d.ts
1
+ //#region src/dom/attrs.d.ts
2
2
  /**
3
3
  * return '' if show is true
4
4
  *
@@ -1,4 +1,4 @@
1
- //#region src/jsx/attrs.ts
1
+ //#region src/dom/attrs.ts
2
2
  /**
3
3
  * return '' if show is true
4
4
  *
package/dist/index.d.mts CHANGED
@@ -1,29 +1,31 @@
1
1
  import { OKLCH, RGB, oklchToRgb, rgbToOklch } from "./color/oklch-rgb.mjs";
2
2
  import { hexToRgb, rgbToHex } from "./color/hex-rgb.mjs";
3
3
  import { isValidHex, isValidOKLCH, isValidRGB } from "./color/validation.mjs";
4
+ import { hasAnimation } from "./dom/animation.mjs";
5
+ import { dataIf } from "./dom/attrs.mjs";
4
6
  import { combineClass, combineStyle, mountStyle, stringStyleToObject } from "./dom/css.mjs";
5
7
  import { AnyFn, Fn } from "./types/fn.mjs";
6
8
  import { MaybeAccessor, MaybeArray, MaybeNullableAccessor, MaybePromise } from "./types/maybe.mjs";
7
9
  import "./types/index.mjs";
8
- import { createClickOutside } from "./event/create-click-outside.mjs";
9
- import { DocumentEventName, GeneralEventListener, WindowEventName, makeEventListener } from "./event/make-event-listener.mjs";
10
- import { createEventListener } from "./event/create-event-listener.mjs";
11
- import { createIntersectionObserver } from "./event/create-intersection-observer.mjs";
12
- import { CreateVisibilityObserverOption, EntryCallback, UseVisibilityObserverFn, createVisibilityObserver } from "./event/create-visibility-observer.mjs";
13
- import { runSolidEventHandler } from "./event/index.mjs";
14
- import { createDebounce } from "./fn/create-debounce.mjs";
15
- import { createLoopExec } from "./fn/create-loop-exec.mjs";
16
- import { createThrottle } from "./fn/create-throttle.mjs";
17
- import { noop } from "./fn/index.mjs";
18
- import { dataIf } from "./jsx/attrs.mjs";
19
- import { access } from "./reactive/access.mjs";
20
- import { createDebouncedWatch } from "./reactive/create-debounce-watch.mjs";
21
- import { createWatch } from "./reactive/create-watch.mjs";
22
- import "./reactive/index.mjs";
10
+ import { createClickOutside } from "./solidjs/create-click-outside.mjs";
11
+ import { createDebounce } from "./solidjs/create-debounce.mjs";
12
+ import { createDebouncedWatch } from "./solidjs/create-debounce-watch.mjs";
13
+ import { DocumentEventName, GeneralEventListener, WindowEventName, makeEventListener } from "./solidjs/make-event-listener.mjs";
14
+ import { createEventListener } from "./solidjs/create-event-listener.mjs";
15
+ import { createIntersectionObserver } from "./solidjs/create-intersection-observer.mjs";
16
+ import { createList } from "./solidjs/create-list.mjs";
17
+ import { createLoopExec } from "./solidjs/create-loop-exec.mjs";
18
+ import { PresenceState, createPresence } from "./solidjs/create-presence.mjs";
19
+ import { createThrottle } from "./solidjs/create-throttle.mjs";
20
+ import { CreateVisibilityObserverOption, EntryCallback, UseVisibilityObserverFn, createVisibilityObserver } from "./solidjs/create-visibility-observer.mjs";
21
+ import { createWatch } from "./solidjs/create-watch.mjs";
22
+ import { MaybeCallableChild, access, callMaybeCallableChild, runSolidEventHandler } from "./solidjs/utils.mjs";
23
+ import "./solidjs/index.mjs";
23
24
  import { clearArray, iterate, list, range } from "./utils/array.mjs";
24
25
  import { runAtNextAnimationFrame, sleep } from "./utils/async.mjs";
25
- import { isArray, isClient, isDate, isEmpty, isFloat, isFn, isInt, isNumber, isObject, isPrimitive, isPromise, isString, isSymbol } from "./utils/is.mjs";
26
+ import { noop } from "./utils/constant.mjs";
27
+ import { isArray, isClient, isDate, isDefined, isEmpty, isFloat, isFn, isInt, isNumber, isObject, isPrimitive, isPromise, isString, isSymbol, isUndefined } from "./utils/is.mjs";
26
28
  import { clamp, inRange, max, min, toHex } from "./utils/number.mjs";
27
29
  import { draw, random, shuffle, uid } from "./utils/random.mjs";
28
30
  import { camel, capitalize, dash, pascal, snake, template, title, trim } from "./utils/str.mjs";
29
- export { AnyFn, CreateVisibilityObserverOption, DocumentEventName, EntryCallback, Fn, GeneralEventListener, MaybeAccessor, MaybeArray, MaybeNullableAccessor, MaybePromise, OKLCH, RGB, UseVisibilityObserverFn, WindowEventName, access, camel, capitalize, clamp, clearArray, combineClass, combineStyle, createClickOutside, createDebounce, createDebouncedWatch, createEventListener, createIntersectionObserver, createLoopExec, createThrottle, createVisibilityObserver, createWatch, dash, dataIf, draw, hexToRgb, inRange, isArray, isClient, isDate, isEmpty, isFloat, isFn, isInt, isNumber, isObject, isPrimitive, isPromise, isString, isSymbol, isValidHex, isValidOKLCH, isValidRGB, iterate, list, makeEventListener, max, min, mountStyle, noop, oklchToRgb, pascal, random, range, rgbToHex, rgbToOklch, runAtNextAnimationFrame, runSolidEventHandler, shuffle, sleep, snake, stringStyleToObject, template, title, toHex, trim, uid };
31
+ export { AnyFn, CreateVisibilityObserverOption, DocumentEventName, EntryCallback, Fn, GeneralEventListener, MaybeAccessor, MaybeArray, MaybeCallableChild, MaybeNullableAccessor, MaybePromise, OKLCH, PresenceState, RGB, UseVisibilityObserverFn, WindowEventName, access, callMaybeCallableChild, camel, capitalize, clamp, clearArray, combineClass, combineStyle, createClickOutside, createDebounce, createDebouncedWatch, createEventListener, createIntersectionObserver, createList, createLoopExec, createPresence, createThrottle, createVisibilityObserver, createWatch, dash, dataIf, draw, hasAnimation, hexToRgb, inRange, isArray, isClient, isDate, isDefined, isEmpty, isFloat, isFn, isInt, isNumber, isObject, isPrimitive, isPromise, isString, isSymbol, isUndefined, isValidHex, isValidOKLCH, isValidRGB, iterate, list, makeEventListener, max, min, mountStyle, noop, oklchToRgb, pascal, random, range, rgbToHex, rgbToOklch, runAtNextAnimationFrame, runSolidEventHandler, shuffle, sleep, snake, stringStyleToObject, template, title, toHex, trim, uid };
package/dist/index.mjs CHANGED
@@ -1,26 +1,28 @@
1
- import { isArray, isClient, isDate, isEmpty, isFloat, isFn, isInt, isNumber, isObject, isPrimitive, isPromise, isString, isSymbol } from "./utils/is.mjs";
1
+ import { isArray, isClient, isDate, isDefined, isEmpty, isFloat, isFn, isInt, isNumber, isObject, isPrimitive, isPromise, isString, isSymbol, isUndefined } from "./utils/is.mjs";
2
2
  import { clearArray, iterate, list, range } from "./utils/array.mjs";
3
3
  import { runAtNextAnimationFrame, sleep } from "./utils/async.mjs";
4
+ import { noop } from "./utils/constant.mjs";
4
5
  import { clamp, inRange, max, min, toHex } from "./utils/number.mjs";
5
6
  import { draw, random, shuffle, uid } from "./utils/random.mjs";
6
7
  import { camel, capitalize, dash, pascal, snake, template, title, trim } from "./utils/str.mjs";
7
8
  import { hexToRgb, rgbToHex } from "./color/hex-rgb.mjs";
8
9
  import { oklchToRgb, rgbToOklch } from "./color/oklch-rgb.mjs";
9
10
  import { isValidHex, isValidOKLCH, isValidRGB } from "./color/validation.mjs";
11
+ import { hasAnimation } from "./dom/animation.mjs";
12
+ import { dataIf } from "./dom/attrs.mjs";
10
13
  import { combineClass, combineStyle, mountStyle, stringStyleToObject } from "./dom/css.mjs";
11
- import { access } from "./reactive/access.mjs";
12
- import { createDebounce } from "./fn/create-debounce.mjs";
13
- import { createLoopExec } from "./fn/create-loop-exec.mjs";
14
- import { createThrottle } from "./fn/create-throttle.mjs";
15
- import { noop } from "./fn/index.mjs";
16
- import { createWatch } from "./reactive/create-watch.mjs";
17
- import { createDebouncedWatch } from "./reactive/create-debounce-watch.mjs";
18
- import { makeEventListener } from "./event/make-event-listener.mjs";
19
- import { createClickOutside } from "./event/create-click-outside.mjs";
20
- import { createEventListener } from "./event/create-event-listener.mjs";
21
- import { createIntersectionObserver } from "./event/create-intersection-observer.mjs";
22
- import { createVisibilityObserver } from "./event/create-visibility-observer.mjs";
23
- import { runSolidEventHandler } from "./event/index.mjs";
24
- import { dataIf } from "./jsx/attrs.mjs";
14
+ import { makeEventListener } from "./solidjs/make-event-listener.mjs";
15
+ import { access, callMaybeCallableChild, runSolidEventHandler } from "./solidjs/utils.mjs";
16
+ import { createClickOutside } from "./solidjs/create-click-outside.mjs";
17
+ import { createDebounce } from "./solidjs/create-debounce.mjs";
18
+ import { createWatch } from "./solidjs/create-watch.mjs";
19
+ import { createDebouncedWatch } from "./solidjs/create-debounce-watch.mjs";
20
+ import { createEventListener } from "./solidjs/create-event-listener.mjs";
21
+ import { createIntersectionObserver } from "./solidjs/create-intersection-observer.mjs";
22
+ import { createList } from "./solidjs/create-list.mjs";
23
+ import { createLoopExec } from "./solidjs/create-loop-exec.mjs";
24
+ import { createPresence } from "./solidjs/create-presence.mjs";
25
+ import { createThrottle } from "./solidjs/create-throttle.mjs";
26
+ import { createVisibilityObserver } from "./solidjs/create-visibility-observer.mjs";
25
27
 
26
- export { access, camel, capitalize, clamp, clearArray, combineClass, combineStyle, createClickOutside, createDebounce, createDebouncedWatch, createEventListener, createIntersectionObserver, createLoopExec, createThrottle, createVisibilityObserver, createWatch, dash, dataIf, draw, hexToRgb, inRange, isArray, isClient, isDate, isEmpty, isFloat, isFn, isInt, isNumber, isObject, isPrimitive, isPromise, isString, isSymbol, isValidHex, isValidOKLCH, isValidRGB, iterate, list, makeEventListener, max, min, mountStyle, noop, oklchToRgb, pascal, random, range, rgbToHex, rgbToOklch, runAtNextAnimationFrame, runSolidEventHandler, shuffle, sleep, snake, stringStyleToObject, template, title, toHex, trim, uid };
28
+ export { access, callMaybeCallableChild, camel, capitalize, clamp, clearArray, combineClass, combineStyle, createClickOutside, createDebounce, createDebouncedWatch, createEventListener, createIntersectionObserver, createList, createLoopExec, createPresence, createThrottle, createVisibilityObserver, createWatch, dash, dataIf, draw, hasAnimation, hexToRgb, inRange, isArray, isClient, isDate, isDefined, isEmpty, isFloat, isFn, isInt, isNumber, isObject, isPrimitive, isPromise, isString, isSymbol, isUndefined, isValidHex, isValidOKLCH, isValidRGB, iterate, list, makeEventListener, max, min, mountStyle, noop, oklchToRgb, pascal, random, range, rgbToHex, rgbToOklch, runAtNextAnimationFrame, runSolidEventHandler, shuffle, sleep, snake, stringStyleToObject, template, title, toHex, trim, uid };
@@ -1,7 +1,7 @@
1
1
  import { MaybeAccessor } from "../types/maybe.mjs";
2
2
  import "../types/index.mjs";
3
3
 
4
- //#region src/event/create-click-outside.d.ts
4
+ //#region src/solidjs/create-click-outside.d.ts
5
5
  declare function createClickOutside(target: MaybeAccessor<HTMLElement | null | undefined>, handler: (event: PointerEvent) => void, options?: {
6
6
  ignore?: MaybeAccessor<HTMLElement | null | undefined>[];
7
7
  }): () => void;
@@ -1,7 +1,7 @@
1
- import { access } from "../reactive/access.mjs";
2
1
  import { makeEventListener } from "./make-event-listener.mjs";
2
+ import { access } from "./utils.mjs";
3
3
 
4
- //#region src/event/create-click-outside.ts
4
+ //#region src/solidjs/create-click-outside.ts
5
5
  function createClickOutside(target, handler, options) {
6
6
  let shouldListen = false;
7
7
  const shouldIgnore = (event) => {
@@ -1,6 +1,6 @@
1
1
  import { Accessor, AccessorArray, OnOptions } from "solid-js";
2
2
 
3
- //#region src/reactive/create-debounce-watch.d.ts
3
+ //#region src/solidjs/create-debounce-watch.d.ts
4
4
 
5
5
  /**
6
6
  * Creates a debounced watch effect.
@@ -1,7 +1,7 @@
1
- import { createDebounce } from "../fn/create-debounce.mjs";
1
+ import { createDebounce } from "./create-debounce.mjs";
2
2
  import { createWatch } from "./create-watch.mjs";
3
3
 
4
- //#region src/reactive/create-debounce-watch.ts
4
+ //#region src/solidjs/create-debounce-watch.ts
5
5
  /**
6
6
  * Creates a debounced watch effect.
7
7
  *
@@ -1,7 +1,7 @@
1
1
  import { MaybeAccessor } from "../types/maybe.mjs";
2
2
  import "../types/index.mjs";
3
3
 
4
- //#region src/fn/create-debounce.d.ts
4
+ //#region src/solidjs/create-debounce.d.ts
5
5
  declare function createDebounce<Args extends unknown[]>(callback: (...args: Args) => void, delay: MaybeAccessor<number>): (...args: Args) => void;
6
6
  //#endregion
7
7
  export { createDebounce };
@@ -1,7 +1,7 @@
1
- import { access } from "../reactive/access.mjs";
1
+ import { access } from "./utils.mjs";
2
2
  import { onCleanup } from "solid-js";
3
3
 
4
- //#region src/fn/create-debounce.ts
4
+ //#region src/solidjs/create-debounce.ts
5
5
  function createDebounce(callback, delay) {
6
6
  let timeoutId;
7
7
  onCleanup(() => {
@@ -3,7 +3,7 @@ import { MaybeAccessor, MaybeArray } from "../types/maybe.mjs";
3
3
  import "../types/index.mjs";
4
4
  import { DocumentEventName, GeneralEventListener, WindowEventName } from "./make-event-listener.mjs";
5
5
 
6
- //#region src/event/create-event-listener.d.ts
6
+ //#region src/solidjs/create-event-listener.d.ts
7
7
  /**
8
8
  * Overload 2: Explicitly Window target
9
9
  */
@@ -1,12 +1,11 @@
1
1
  import { isArray } from "../utils/is.mjs";
2
2
  import { clearArray } from "../utils/array.mjs";
3
- import { access } from "../reactive/access.mjs";
4
- import { noop } from "../fn/index.mjs";
5
- import { createWatch } from "../reactive/create-watch.mjs";
3
+ import { noop } from "../utils/constant.mjs";
6
4
  import { makeEventListener } from "./make-event-listener.mjs";
5
+ import { access } from "./utils.mjs";
6
+ import { createWatch } from "./create-watch.mjs";
7
7
 
8
- //#region src/event/create-event-listener.ts
9
- /** biome-ignore-all lint/suspicious/noExplicitAny: I need any */
8
+ //#region src/solidjs/create-event-listener.ts
10
9
  function createEventListener(...args) {
11
10
  const target = args[0];
12
11
  const events = args[1];
@@ -1,7 +1,7 @@
1
1
  import { MaybeAccessor } from "../types/maybe.mjs";
2
2
  import "../types/index.mjs";
3
3
 
4
- //#region src/event/create-intersection-observer.d.ts
4
+ //#region src/solidjs/create-intersection-observer.d.ts
5
5
  declare function createIntersectionObserver(targets: MaybeAccessor<HTMLElement | null | undefined>[], callback: IntersectionObserverCallback, options?: IntersectionObserverInit): () => void;
6
6
  //#endregion
7
7
  export { createIntersectionObserver };
@@ -1,11 +1,11 @@
1
1
  import { clearArray } from "../utils/array.mjs";
2
- import { access } from "../reactive/access.mjs";
3
- import { noop } from "../fn/index.mjs";
4
- import { createWatch } from "../reactive/create-watch.mjs";
2
+ import { noop } from "../utils/constant.mjs";
3
+ import { access } from "./utils.mjs";
4
+ import { createWatch } from "./create-watch.mjs";
5
5
  import { isServer } from "solid-js/web";
6
6
  import { onCleanup } from "solid-js";
7
7
 
8
- //#region src/event/create-intersection-observer.ts
8
+ //#region src/solidjs/create-intersection-observer.ts
9
9
  function createIntersectionObserver(targets, callback, options = {}) {
10
10
  if (isServer) return noop;
11
11
  const io = new IntersectionObserver(callback, options);
@@ -0,0 +1,14 @@
1
+ import { SetStoreFunction } from "solid-js/store";
2
+
3
+ //#region src/solidjs/create-list.d.ts
4
+ declare function createList<T>(initialValue?: T[]): readonly [T[], {
5
+ readonly setList: SetStoreFunction<T[]>;
6
+ readonly insert: (item: T, at?: number) => void;
7
+ readonly remove: (at?: number) => void;
8
+ readonly swap: (indexA: number, indexB: number) => void;
9
+ readonly move: (from: number, to: number) => void;
10
+ readonly sort: (compareFn: (a: T, b: T) => number) => void;
11
+ readonly isSortedBy: (compareFn: (a: T, b: T) => number) => boolean;
12
+ }];
13
+ //#endregion
14
+ export { createList };
@@ -0,0 +1,77 @@
1
+ import { inRange } from "../utils/number.mjs";
2
+ import { createStore, unwrap } from "solid-js/store";
3
+
4
+ //#region src/solidjs/create-list.ts
5
+ function createInsertHelper(setList) {
6
+ return (item, at) => {
7
+ setList((list) => {
8
+ let atIdx = at ?? list.length;
9
+ if (atIdx < 0 || atIdx > list.length) atIdx = list.length;
10
+ const newList = [...list];
11
+ newList.splice(atIdx, 0, item);
12
+ return newList;
13
+ });
14
+ };
15
+ }
16
+ function createRemoveHelper(setList) {
17
+ return (at) => {
18
+ setList((list) => {
19
+ const atIdx = at ?? list.length - 1;
20
+ if (atIdx < 0 || atIdx >= list.length) return list;
21
+ const newList = [...list];
22
+ newList.splice(atIdx, 1);
23
+ return newList;
24
+ });
25
+ };
26
+ }
27
+ function createSwapHelper(setList) {
28
+ return (indexA, indexB) => {
29
+ setList((list) => {
30
+ if (indexA === indexB || !inRange(indexA, 0, list.length - 1) || !inRange(indexB, 0, list.length - 1)) return list;
31
+ const newList = [...list];
32
+ [newList[indexA], newList[indexB]] = [newList[indexB], newList[indexA]];
33
+ return newList;
34
+ });
35
+ };
36
+ }
37
+ function createMoveHelper(setList) {
38
+ return (from, to) => {
39
+ setList((list) => {
40
+ if (from === to || !inRange(from, 0, list.length - 1) || !inRange(to, 0, list.length - 1)) return list;
41
+ const newList = [...list];
42
+ const [item] = newList.splice(from, 1);
43
+ newList.splice(to, 0, item);
44
+ return newList;
45
+ });
46
+ };
47
+ }
48
+ function createSortHelper(setList) {
49
+ return (compareFn) => {
50
+ setList((list) => {
51
+ const newList = [...list];
52
+ newList.sort(compareFn);
53
+ return newList;
54
+ });
55
+ };
56
+ }
57
+ function createIsSortedHelper(list, compareFn) {
58
+ for (let i = 1; i < list.length; i++) if (compareFn(list[i - 1], list[i]) > 0) return false;
59
+ return true;
60
+ }
61
+ function createList(initialValue) {
62
+ const [list, setList] = createStore(unwrap(initialValue) || []);
63
+ return [list, {
64
+ setList,
65
+ insert: createInsertHelper(setList),
66
+ remove: createRemoveHelper(setList),
67
+ swap: createSwapHelper(setList),
68
+ move: createMoveHelper(setList),
69
+ sort: createSortHelper(setList),
70
+ isSortedBy: (compareFn) => {
71
+ return createIsSortedHelper(list, compareFn);
72
+ }
73
+ }];
74
+ }
75
+
76
+ //#endregion
77
+ export { createList };
@@ -1,6 +1,6 @@
1
1
  import { MaybeAccessor, MaybePromise } from "../types/maybe.mjs";
2
2
 
3
- //#region src/fn/create-loop-exec.d.ts
3
+ //#region src/solidjs/create-loop-exec.d.ts
4
4
 
5
5
  /**
6
6
  * Repeatedly executes an asynchronous function with a specified delay between each execution.
@@ -1,9 +1,9 @@
1
1
  import { isNumber } from "../utils/is.mjs";
2
- import { access } from "../reactive/access.mjs";
3
- import { createWatch } from "../reactive/create-watch.mjs";
2
+ import { access } from "./utils.mjs";
3
+ import { createWatch } from "./create-watch.mjs";
4
4
  import { onCleanup } from "solid-js";
5
5
 
6
- //#region src/fn/create-loop-exec.ts
6
+ //#region src/solidjs/create-loop-exec.ts
7
7
  /**
8
8
  * Repeatedly executes an asynchronous function with a specified delay between each execution.
9
9
  * The loop continues until the surrounding SolidJS effect is cleaned up.
@@ -0,0 +1,11 @@
1
+ import { MaybeAccessor } from "../types/maybe.mjs";
2
+ import { Accessor } from "solid-js";
3
+
4
+ //#region src/solidjs/create-presence.d.ts
5
+ type PresenceState = "opening" | "opened" | "closing" | "closed";
6
+ declare function createPresence(params: {
7
+ show: Accessor<boolean>;
8
+ element: MaybeAccessor<HTMLElement | undefined>;
9
+ }): readonly [Accessor<boolean>, Accessor<PresenceState>];
10
+ //#endregion
11
+ export { PresenceState, createPresence };
@@ -0,0 +1,29 @@
1
+ import { noop } from "../utils/constant.mjs";
2
+ import { hasAnimation } from "../dom/animation.mjs";
3
+ import { makeEventListener } from "./make-event-listener.mjs";
4
+ import { access } from "./utils.mjs";
5
+ import { createWatch } from "./create-watch.mjs";
6
+ import { createMemo, createSignal } from "solid-js";
7
+
8
+ //#region src/solidjs/create-presence.ts
9
+ function createPresence(params) {
10
+ const [state, setState] = createSignal(access(params.show) ? "opened" : "closed");
11
+ createWatch(createMemo(() => access(params.show)), (show) => {
12
+ if (show) setState("opening");
13
+ else setState("closing");
14
+ }, { defer: true });
15
+ let clear = noop;
16
+ createWatch(state, (current) => {
17
+ clear();
18
+ const el = access(params.element);
19
+ if (!el) return;
20
+ if (current.endsWith("ing")) if (hasAnimation(el)) clear = makeEventListener(el, "animationend", () => {
21
+ setState(current === "opening" ? "opened" : "closed");
22
+ });
23
+ else setState(current === "opening" ? "opened" : "closed");
24
+ });
25
+ return [createMemo(() => state() !== "closed"), state];
26
+ }
27
+
28
+ //#endregion
29
+ export { createPresence };
@@ -1,7 +1,7 @@
1
1
  import { MaybeAccessor } from "../types/maybe.mjs";
2
2
  import "../types/index.mjs";
3
3
 
4
- //#region src/fn/create-throttle.d.ts
4
+ //#region src/solidjs/create-throttle.d.ts
5
5
  declare function createThrottle<Args extends unknown[]>(callback: (...args: Args) => void, delay: MaybeAccessor<number>): (...args: Args) => void;
6
6
  //#endregion
7
7
  export { createThrottle };
@@ -1,7 +1,7 @@
1
- import { access } from "../reactive/access.mjs";
1
+ import { access } from "./utils.mjs";
2
2
  import { onCleanup } from "solid-js";
3
3
 
4
- //#region src/fn/create-throttle.ts
4
+ //#region src/solidjs/create-throttle.ts
5
5
  function createThrottle(callback, delay) {
6
6
  let timeoutId;
7
7
  onCleanup(() => {
@@ -2,7 +2,7 @@ import { MaybeNullableAccessor } from "../types/maybe.mjs";
2
2
  import "../types/index.mjs";
3
3
  import { Accessor } from "solid-js";
4
4
 
5
- //#region src/event/create-visibility-observer.d.ts
5
+ //#region src/solidjs/create-visibility-observer.d.ts
6
6
  type UseVisibilityObserverFn = (target: MaybeNullableAccessor<HTMLElement>) => Accessor<boolean>;
7
7
  type CreateVisibilityObserverOption = IntersectionObserverInit & {
8
8
  initialValue?: boolean;
@@ -1,9 +1,9 @@
1
1
  import { isObject } from "../utils/is.mjs";
2
- import { access } from "../reactive/access.mjs";
3
- import { createWatch } from "../reactive/create-watch.mjs";
2
+ import { access } from "./utils.mjs";
3
+ import { createWatch } from "./create-watch.mjs";
4
4
  import { createSignal, onCleanup } from "solid-js";
5
5
 
6
- //#region src/event/create-visibility-observer.ts
6
+ //#region src/solidjs/create-visibility-observer.ts
7
7
  function createVisibilityObserver(arg1, arg2) {
8
8
  let target;
9
9
  let options;
@@ -1,6 +1,6 @@
1
1
  import { Accessor, AccessorArray, OnEffectFunction, OnOptions } from "solid-js";
2
2
 
3
- //#region src/reactive/create-watch.d.ts
3
+ //#region src/solidjs/create-watch.d.ts
4
4
  declare function createWatch<S, Next extends Prev, Prev = Next>(targets: AccessorArray<S> | Accessor<S>, fn: OnEffectFunction<S, undefined | NoInfer<Prev>, Next>, opt?: OnOptions): void;
5
5
  //#endregion
6
6
  export { createWatch };
@@ -1,6 +1,6 @@
1
1
  import { createEffect, on } from "solid-js";
2
2
 
3
- //#region src/reactive/create-watch.ts
3
+ //#region src/solidjs/create-watch.ts
4
4
  function createWatch(targets, fn, opt) {
5
5
  createEffect(on(targets, fn, opt));
6
6
  }
@@ -0,0 +1,13 @@
1
+ import { createClickOutside } from "./create-click-outside.mjs";
2
+ import { createDebounce } from "./create-debounce.mjs";
3
+ import { createDebouncedWatch } from "./create-debounce-watch.mjs";
4
+ import { DocumentEventName, GeneralEventListener, WindowEventName, makeEventListener } from "./make-event-listener.mjs";
5
+ import { createEventListener } from "./create-event-listener.mjs";
6
+ import { createIntersectionObserver } from "./create-intersection-observer.mjs";
7
+ import { createList } from "./create-list.mjs";
8
+ import { createLoopExec } from "./create-loop-exec.mjs";
9
+ import { PresenceState, createPresence } from "./create-presence.mjs";
10
+ import { createThrottle } from "./create-throttle.mjs";
11
+ import { CreateVisibilityObserverOption, EntryCallback, UseVisibilityObserverFn, createVisibilityObserver } from "./create-visibility-observer.mjs";
12
+ import { createWatch } from "./create-watch.mjs";
13
+ import { MaybeCallableChild, access, callMaybeCallableChild, runSolidEventHandler } from "./utils.mjs";
@@ -2,7 +2,7 @@ import { Fn } from "../types/fn.mjs";
2
2
  import { MaybeArray } from "../types/maybe.mjs";
3
3
  import "../types/index.mjs";
4
4
 
5
- //#region src/event/make-event-listener.d.ts
5
+ //#region src/solidjs/make-event-listener.d.ts
6
6
  interface InferEventTarget<Events> {
7
7
  addEventListener: (event: Events, fn?: any, options?: any) => any;
8
8
  removeEventListener: (event: Events, fn?: any, options?: any) => any;
@@ -1,9 +1,9 @@
1
1
  import { isArray } from "../utils/is.mjs";
2
2
  import { clearArray } from "../utils/array.mjs";
3
- import { noop } from "../fn/index.mjs";
3
+ import { noop } from "../utils/constant.mjs";
4
4
  import { onCleanup } from "solid-js";
5
5
 
6
- //#region src/event/make-event-listener.ts
6
+ //#region src/solidjs/make-event-listener.ts
7
7
  /** biome-ignore-all lint/suspicious/noExplicitAny: I need any */
8
8
  function makeEventListener(...args) {
9
9
  let target;
@@ -0,0 +1,10 @@
1
+ import { MaybeAccessor } from "../types/maybe.mjs";
2
+ import { JSX } from "solid-js";
3
+
4
+ //#region src/solidjs/utils.d.ts
5
+ declare function access<T>(value: MaybeAccessor<T>): T;
6
+ declare function runSolidEventHandler<T, E extends Event, EHandler extends JSX.EventHandler<T, any> = JSX.EventHandler<T, E>>(event: E, handler?: EHandler | JSX.BoundEventHandler<T, E, EHandler>): void;
7
+ type MaybeCallableChild<T extends unknown[] = []> = JSX.Element | ((...args: T) => JSX.Element);
8
+ declare function callMaybeCallableChild<T extends unknown[] = []>(children: MaybeCallableChild<T>, ...args: T): JSX.Element;
9
+ //#endregion
10
+ export { MaybeCallableChild, access, callMaybeCallableChild, runSolidEventHandler };
@@ -0,0 +1,16 @@
1
+ import { isFn } from "../utils/is.mjs";
2
+
3
+ //#region src/solidjs/utils.ts
4
+ function access(value) {
5
+ return isFn(value) ? value() : value;
6
+ }
7
+ function runSolidEventHandler(event, handler) {
8
+ if (typeof handler === "function") handler(event);
9
+ if (Array.isArray(handler)) handler[0](handler[1], event);
10
+ }
11
+ function callMaybeCallableChild(children, ...args) {
12
+ return isFn(children) ? children(...args) : children;
13
+ }
14
+
15
+ //#endregion
16
+ export { access, callMaybeCallableChild, runSolidEventHandler };
@@ -0,0 +1,4 @@
1
+ //#region src/utils/constant.d.ts
2
+ declare const noop: () => void;
3
+ //#endregion
4
+ export { noop };
@@ -0,0 +1,5 @@
1
+ //#region src/utils/constant.ts
2
+ const noop = () => {};
3
+
4
+ //#endregion
5
+ export { noop };
@@ -25,5 +25,7 @@ declare const isDate: (value: any) => value is Date;
25
25
  declare const isPromise: (value: any) => value is Promise<any>;
26
26
  declare const isEmpty: (value: any) => boolean;
27
27
  declare const isClient: boolean;
28
+ declare function isUndefined(value: any): value is undefined;
29
+ declare function isDefined<T>(value: T | undefined): value is T;
28
30
  //#endregion
29
- export { isArray, isClient, isDate, isEmpty, isFloat, isFn, isInt, isNumber, isObject, isPrimitive, isPromise, isString, isSymbol };
31
+ export { isArray, isClient, isDate, isDefined, isEmpty, isFloat, isFn, isInt, isNumber, isObject, isPrimitive, isPromise, isString, isSymbol, isUndefined };
package/dist/utils/is.mjs CHANGED
@@ -21,7 +21,7 @@ const isPrimitive = (value) => {
21
21
  return value === void 0 || value === null || typeof value !== "object" && typeof value !== "function";
22
22
  };
23
23
  const isFn = (value) => {
24
- return !!(value && value.constructor && value.call && value.apply);
24
+ return typeof value === "function";
25
25
  };
26
26
  const isString = (value) => {
27
27
  return typeof value === "string" || value instanceof String;
@@ -67,6 +67,12 @@ const isEmpty = (value) => {
67
67
  return Object.keys(value).length === 0;
68
68
  };
69
69
  const isClient = !isServer;
70
+ function isUndefined(value) {
71
+ return typeof value === "undefined";
72
+ }
73
+ function isDefined(value) {
74
+ return !isUndefined(value);
75
+ }
70
76
 
71
77
  //#endregion
72
- export { isArray, isClient, isDate, isEmpty, isFloat, isFn, isInt, isNumber, isObject, isPrimitive, isPromise, isString, isSymbol };
78
+ export { isArray, isClient, isDate, isDefined, isEmpty, isFloat, isFn, isInt, isNumber, isObject, isPrimitive, isPromise, isString, isSymbol, isUndefined };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "solid-tiny-utils",
3
- "version": "0.9.0",
3
+ "version": "0.11.0",
4
4
  "description": "A collection of tiny utilities for SolidJS applications",
5
5
  "main": "./dist/index.mjs",
6
6
  "type": "module",
@@ -13,23 +13,24 @@
13
13
  },
14
14
  "devDependencies": {
15
15
  "@biomejs/biome": "2.3.10",
16
+ "@formkit/auto-animate": "^0.9.0",
16
17
  "@solidjs/router": "^0.15.4",
17
18
  "@solidjs/testing-library": "^0.8.10",
18
19
  "@testing-library/jest-dom": "^6.9.1",
19
20
  "@testing-library/user-event": "^14.6.1",
20
21
  "@types/culori": "^4.0.0",
21
22
  "@types/node": "^25.0.3",
22
- "@typescript/native-preview": "7.0.0-dev.20251226.1",
23
+ "@typescript/native-preview": "7.0.0-dev.20260102.1",
23
24
  "@vitest/ui": "^4.0.16",
24
- "bumpp": "^10.2.3",
25
+ "bumpp": "^10.3.2",
25
26
  "culori": "^4.0.2",
26
27
  "jsdom": "^27.3.0",
27
28
  "solid-tiny-context": "0.2.3",
28
- "tsdown": "^0.18.3",
29
- "ultracite": "6.5.0",
29
+ "tsdown": "^0.18.4",
30
+ "ultracite": "7.0.5",
30
31
  "unocss": "^66.3.3",
31
32
  "vite": "^7.3.0",
32
- "vite-plugin-solid": "^2.11.0",
33
+ "vite-plugin-solid": "^2.11.10",
33
34
  "vite-plugin-solid-pages": "^0.3.5",
34
35
  "vitest": "^4.0.16"
35
36
  },
@@ -58,7 +59,7 @@
58
59
  "lint:error": "pnpm dlx ultracite@latest check --diagnostic-level error",
59
60
  "lint:fix": "pnpm dlx ultracite@latest fix",
60
61
  "type-check": "tsgo --noEmit --skipLibCheck",
61
- "bump": "pnpm type-check && pnpm lint:fix && pnpm test && pnpm bumpp --no-push",
62
+ "bump": "pnpm type-check && pnpm test && pnpm bumpp --no-push",
62
63
  "prepublish": "pnpm build"
63
64
  }
64
65
  }
@@ -1,11 +0,0 @@
1
- import { createClickOutside } from "./create-click-outside.mjs";
2
- import { DocumentEventName, GeneralEventListener, WindowEventName, makeEventListener } from "./make-event-listener.mjs";
3
- import { createEventListener } from "./create-event-listener.mjs";
4
- import { createIntersectionObserver } from "./create-intersection-observer.mjs";
5
- import { CreateVisibilityObserverOption, EntryCallback, UseVisibilityObserverFn, createVisibilityObserver } from "./create-visibility-observer.mjs";
6
- import { JSX } from "solid-js/jsx-runtime";
7
-
8
- //#region src/event/index.d.ts
9
- declare function runSolidEventHandler<T, E extends Event, EHandler extends JSX.EventHandler<T, any> = JSX.EventHandler<T, E>>(event: E, handler?: EHandler | JSX.BoundEventHandler<T, E, EHandler>): void;
10
- //#endregion
11
- export { runSolidEventHandler };
@@ -1,14 +0,0 @@
1
- import { makeEventListener } from "./make-event-listener.mjs";
2
- import { createClickOutside } from "./create-click-outside.mjs";
3
- import { createEventListener } from "./create-event-listener.mjs";
4
- import { createIntersectionObserver } from "./create-intersection-observer.mjs";
5
- import { createVisibilityObserver } from "./create-visibility-observer.mjs";
6
-
7
- //#region src/event/index.ts
8
- function runSolidEventHandler(event, handler) {
9
- if (typeof handler === "function") handler(event);
10
- if (Array.isArray(handler)) handler[0](handler[1], event);
11
- }
12
-
13
- //#endregion
14
- export { runSolidEventHandler };
@@ -1,8 +0,0 @@
1
- import { createDebounce } from "./create-debounce.mjs";
2
- import { createLoopExec } from "./create-loop-exec.mjs";
3
- import { createThrottle } from "./create-throttle.mjs";
4
-
5
- //#region src/fn/index.d.ts
6
- declare const noop: () => void;
7
- //#endregion
8
- export { noop };
package/dist/fn/index.mjs DELETED
@@ -1,9 +0,0 @@
1
- import { createDebounce } from "./create-debounce.mjs";
2
- import { createLoopExec } from "./create-loop-exec.mjs";
3
- import { createThrottle } from "./create-throttle.mjs";
4
-
5
- //#region src/fn/index.ts
6
- const noop = () => {};
7
-
8
- //#endregion
9
- export { noop };
@@ -1,6 +0,0 @@
1
- import { MaybeAccessor } from "../types/maybe.mjs";
2
-
3
- //#region src/reactive/access.d.ts
4
- declare function access<T>(value: MaybeAccessor<T>): T;
5
- //#endregion
6
- export { access };
@@ -1,9 +0,0 @@
1
- import { isFn } from "../utils/is.mjs";
2
-
3
- //#region src/reactive/access.ts
4
- function access(value) {
5
- return isFn(value) ? value() : value;
6
- }
7
-
8
- //#endregion
9
- export { access };
@@ -1,3 +0,0 @@
1
- import { access } from "./access.mjs";
2
- import { createDebouncedWatch } from "./create-debounce-watch.mjs";
3
- import { createWatch } from "./create-watch.mjs";