@zeix/cause-effect 0.15.0 → 0.15.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/types/index.d.ts CHANGED
@@ -1,15 +1,16 @@
1
1
  /**
2
2
  * @name Cause & Effect
3
- * @version 0.15.0
3
+ * @version 0.15.1
4
4
  * @author Esther Brunner
5
5
  */
6
6
  export { type Computed, type ComputedCallback, computed, isComputed, isComputedCallback, TYPE_COMPUTED, } from './src/computed';
7
- export { type DiffResult, diff, isEqual, type UnknownRecord } from './src/diff';
7
+ export { type DiffResult, diff, isEqual, type UnknownArray, type UnknownRecord, type UnknownRecordOrArray, } from './src/diff';
8
8
  export { type EffectCallback, effect, type MaybeCleanup } from './src/effect';
9
+ export { CircularDependencyError, InvalidSignalValueError, NullishSignalValueError, StoreKeyExistsError, StoreKeyRangeError, StoreKeyReadonlyError, } from './src/errors';
9
10
  export { type MatchHandlers, match } from './src/match';
10
11
  export { type ResolveResult, resolve } from './src/resolve';
11
12
  export { batch, type Cleanup, enqueue, flush, notify, observe, subscribe, type Updater, type Watcher, watch, } from './src/scheduler';
12
- export { isSignal, type MaybeSignal, type Signal, type SignalValues, toSignal, UNSET, } from './src/signal';
13
+ export { isMutableSignal, isSignal, type Signal, type SignalValues, toSignal, type UnknownSignalRecord, } from './src/signal';
13
14
  export { isState, type State, state, TYPE_STATE } from './src/state';
14
- export { isStore, type Store, type StoreAddEvent, type StoreChangeEvent, type StoreEventMap, type StoreRemoveEvent, store, TYPE_STORE, } from './src/store';
15
- export { CircularDependencyError, isAbortError, isAsyncFunction, isFunction, toError, } from './src/util';
15
+ export { isStore, type Store, type StoreAddEvent, type StoreChangeEvent, type StoreEventMap, type StoreRemoveEvent, type StoreSortEvent, store, TYPE_STORE, } from './src/store';
16
+ export { isAbortError, isAsyncFunction, isFunction, isNumber, isRecord, isRecordOrArray, isString, isSymbol, toError, UNSET, } from './src/util';
@@ -1,5 +1,10 @@
1
1
  type UnknownRecord = Record<string, unknown & {}>;
2
- type DiffResult<T extends UnknownRecord = UnknownRecord> = {
2
+ type UnknownArray = ReadonlyArray<unknown & {}>;
3
+ type ArrayToRecord<T extends UnknownArray> = {
4
+ [key: string]: T extends Array<infer U extends {}> ? U : never;
5
+ };
6
+ type UnknownRecordOrArray = UnknownRecord | ArrayToRecord<UnknownArray>;
7
+ type DiffResult<T extends UnknownRecordOrArray = UnknownRecord> = {
3
8
  changed: boolean;
4
9
  add: Partial<T>;
5
10
  change: Partial<T>;
@@ -23,5 +28,5 @@ declare const isEqual: <T>(a: T, b: T, visited?: WeakSet<object>) => boolean;
23
28
  * @param {T} newObj - The new record to compare
24
29
  * @returns {DiffResult<T>} The result of the comparison
25
30
  */
26
- declare const diff: <T extends UnknownRecord>(oldObj: T, newObj: T) => DiffResult<T>;
27
- export { type DiffResult, diff, isEqual, type UnknownRecord };
31
+ declare const diff: <T extends UnknownRecordOrArray>(oldObj: T, newObj: T) => DiffResult<T>;
32
+ export { type ArrayToRecord, type DiffResult, diff, isEqual, type UnknownRecord, type UnknownArray, type UnknownRecordOrArray, };
@@ -0,0 +1,19 @@
1
+ declare class CircularDependencyError extends Error {
2
+ constructor(where: string);
3
+ }
4
+ declare class InvalidSignalValueError extends TypeError {
5
+ constructor(where: string, value: string);
6
+ }
7
+ declare class NullishSignalValueError extends TypeError {
8
+ constructor(where: string);
9
+ }
10
+ declare class StoreKeyExistsError extends Error {
11
+ constructor(key: string, value: string);
12
+ }
13
+ declare class StoreKeyRangeError extends RangeError {
14
+ constructor(index: number);
15
+ }
16
+ declare class StoreKeyReadonlyError extends Error {
17
+ constructor(key: string, value: string);
18
+ }
19
+ export { CircularDependencyError, InvalidSignalValueError, NullishSignalValueError, StoreKeyExistsError, StoreKeyRangeError, StoreKeyReadonlyError, };
@@ -1,7 +1,7 @@
1
1
  import type { ResolveResult } from './resolve';
2
- import type { Signal, SignalValues } from './signal';
3
- type MatchHandlers<S extends Record<string, Signal<unknown & {}>>> = {
4
- ok?: (values: SignalValues<S>) => void;
2
+ import type { SignalValues, UnknownSignalRecord } from './signal';
3
+ type MatchHandlers<S extends UnknownSignalRecord> = {
4
+ ok: (values: SignalValues<S>) => void;
5
5
  err?: (errors: readonly Error[]) => void;
6
6
  nil?: () => void;
7
7
  };
@@ -17,5 +17,5 @@ type MatchHandlers<S extends Record<string, Signal<unknown & {}>>> = {
17
17
  * @param {MatchHandlers<S>} handlers - Handlers for different states (side effects only)
18
18
  * @returns {void} - Always returns void
19
19
  */
20
- declare function match<S extends Record<string, Signal<unknown & {}>>>(result: ResolveResult<S>, handlers: MatchHandlers<S>): void;
20
+ declare function match<S extends UnknownSignalRecord>(result: ResolveResult<S>, handlers: MatchHandlers<S>): void;
21
21
  export { match, type MatchHandlers };
@@ -1,5 +1,5 @@
1
- import { type Signal, type SignalValues } from './signal';
2
- type ResolveResult<S extends Record<string, Signal<unknown & {}>>> = {
1
+ import type { SignalValues, UnknownSignalRecord } from './signal';
2
+ type ResolveResult<S extends UnknownSignalRecord> = {
3
3
  ok: true;
4
4
  values: SignalValues<S>;
5
5
  errors?: never;
@@ -25,5 +25,5 @@ type ResolveResult<S extends Record<string, Signal<unknown & {}>>> = {
25
25
  * @param {S} signals - Signals to resolve
26
26
  * @returns {ResolveResult<S>} - Discriminated union result
27
27
  */
28
- declare function resolve<S extends Record<string, Signal<unknown & {}>>>(signals: S): ResolveResult<S>;
28
+ declare function resolve<S extends UnknownSignalRecord>(signals: S): ResolveResult<S>;
29
29
  export { resolve, type ResolveResult };
@@ -4,13 +4,12 @@ import { type Store } from './store';
4
4
  type Signal<T extends {}> = {
5
5
  get(): T;
6
6
  };
7
- type MaybeSignal<T extends {}> = T | Signal<T> | ComputedCallback<T>;
8
- type SignalValues<S extends Record<string, Signal<unknown & {}>>> = {
7
+ type UnknownSignalRecord = Record<string, Signal<unknown & {}>>;
8
+ type SignalValues<S extends UnknownSignalRecord> = {
9
9
  [K in keyof S]: S[K] extends Signal<infer T> ? T : never;
10
10
  };
11
- declare const UNSET: any;
12
11
  /**
13
- * Check whether a value is a Signal or not
12
+ * Check whether a value is a Signal
14
13
  *
15
14
  * @since 0.9.0
16
15
  * @param {unknown} value - value to check
@@ -18,23 +17,21 @@ declare const UNSET: any;
18
17
  */
19
18
  declare const isSignal: <T extends {}>(value: unknown) => value is Signal<T>;
20
19
  /**
21
- * Convert a value to a Signal if it's not already a Signal
20
+ * Check whether a value is a State or Store
22
21
  *
23
- * @since 0.9.6
22
+ * @since 0.15.2
23
+ * @param {unknown} value - value to check
24
+ * @returns {boolean} - true if value is a State or Store, false otherwise
24
25
  */
25
- declare function toSignal<T extends Array<unknown & {}>>(value: T[]): Store<Record<string, T>>;
26
- declare function toSignal<T extends Record<keyof T, T[keyof T]>>(value: T): Store<T>;
27
- declare function toSignal<T extends {}>(value: ComputedCallback<T>): Computed<T>;
28
- declare function toSignal<T extends {}>(value: Signal<T>): Signal<T>;
29
- declare function toSignal<T extends {}>(value: T): State<T>;
26
+ declare const isMutableSignal: <T extends {}>(value: unknown) => value is State<T> | Store<T>;
30
27
  /**
31
- * Convert a value to a mutable Signal if it's not already a Signal
28
+ * Convert a value to a Signal if it's not already a Signal
32
29
  *
33
30
  * @since 0.9.6
31
+ * @param {T} value - value to convert
32
+ * @returns {Signal<T>} - Signal instance
34
33
  */
35
- declare function toMutableSignal<T extends Array<unknown & {}>>(value: T[]): Store<Record<string, T>>;
36
- declare function toMutableSignal<T extends Record<keyof T, T[keyof T]>>(value: T): Store<T>;
37
- declare function toMutableSignal<T extends State<T>>(value: State<T>): State<T>;
38
- declare function toMutableSignal<T extends Store<T>>(value: Store<T>): Store<T>;
39
- declare function toMutableSignal<T extends {}>(value: T): State<T>;
40
- export { type Signal, type MaybeSignal, type SignalValues, UNSET, isSignal, toSignal, toMutableSignal, };
34
+ declare function toSignal<T extends {}>(value: T): T extends Store<infer U> ? Store<U> : T extends State<infer U> ? State<U> : T extends Computed<infer U> ? Computed<U> : T extends Signal<infer U> ? Signal<U> : T extends ReadonlyArray<infer U extends {}> ? Store<U[]> : T extends Record<string, unknown & {}> ? Store<{
35
+ [K in keyof T]: T[K];
36
+ }> : T extends ComputedCallback<infer U extends {}> ? Computed<U> : State<T>;
37
+ export { type Signal, type UnknownSignalRecord, type SignalValues, isSignal, isMutableSignal, toSignal, };
@@ -1,51 +1,74 @@
1
- import { type UnknownRecord } from './diff';
2
- import { type Signal } from './signal';
1
+ import { type UnknownArray, type UnknownRecord, type UnknownRecordOrArray } from './diff';
3
2
  import { type State } from './state';
4
- declare const TYPE_STORE = "Store";
5
- interface StoreAddEvent<T extends UnknownRecord> extends CustomEvent {
6
- type: 'store-add';
7
- detail: Partial<T>;
8
- }
9
- interface StoreChangeEvent<T extends UnknownRecord> extends CustomEvent {
10
- type: 'store-change';
11
- detail: Partial<T>;
12
- }
13
- interface StoreRemoveEvent<T extends UnknownRecord> extends CustomEvent {
14
- type: 'store-remove';
15
- detail: Partial<T>;
16
- }
17
- type StoreEventMap<T extends UnknownRecord> = {
3
+ type ArrayItem<T> = T extends readonly (infer U extends {})[] ? U : never;
4
+ type StoreEventMap<T extends UnknownRecord | UnknownArray> = {
18
5
  'store-add': StoreAddEvent<T>;
19
6
  'store-change': StoreChangeEvent<T>;
20
7
  'store-remove': StoreRemoveEvent<T>;
8
+ 'store-sort': StoreSortEvent;
21
9
  };
22
- interface StoreEventTarget<T extends UnknownRecord> extends EventTarget {
10
+ interface StoreEventTarget<T extends UnknownRecord | UnknownArray> extends EventTarget {
23
11
  addEventListener<K extends keyof StoreEventMap<T>>(type: K, listener: (event: StoreEventMap<T>[K]) => void, options?: boolean | AddEventListenerOptions): void;
24
- addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
25
12
  removeEventListener<K extends keyof StoreEventMap<T>>(type: K, listener: (event: StoreEventMap<T>[K]) => void, options?: boolean | EventListenerOptions): void;
26
- removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
27
13
  dispatchEvent(event: Event): boolean;
28
14
  }
29
- type Store<T extends UnknownRecord = UnknownRecord> = {
30
- [K in keyof T & string]: T[K] extends UnknownRecord ? Store<T[K]> : State<T[K]>;
31
- } & StoreEventTarget<T> & {
32
- [Symbol.toStringTag]: 'Store';
33
- [Symbol.iterator](): IterableIterator<[string, Signal<T[keyof T]>]>;
34
- add<K extends keyof T & string>(key: K, value: T[K]): void;
15
+ interface BaseStore<T extends UnknownRecord | UnknownArray> extends StoreEventTarget<T> {
16
+ readonly [Symbol.toStringTag]: 'Store';
35
17
  get(): T;
36
- remove<K extends keyof T & string>(key: K): void;
37
18
  set(value: T): void;
38
- update(updater: (value: T) => T): void;
39
- size: State<number>;
19
+ update(fn: (value: T) => T): void;
20
+ sort<U = T extends UnknownArray ? ArrayItem<T> : T[Extract<keyof T, string>]>(compareFn?: (a: U, b: U) => number): void;
21
+ readonly size: State<number>;
22
+ }
23
+ type RecordStore<T extends UnknownRecord> = BaseStore<T> & {
24
+ [K in keyof T]: T[K] extends readonly unknown[] | Record<string, unknown> ? Store<T[K]> : State<T[K]>;
25
+ } & {
26
+ add<K extends Extract<keyof T, string>>(key: K, value: T[K]): void;
27
+ remove<K extends Extract<keyof T, string>>(key: K): void;
28
+ [Symbol.iterator](): IterableIterator<[
29
+ Extract<keyof T, string>,
30
+ T[Extract<keyof T, string>] extends readonly unknown[] | Record<string, unknown> ? Store<T[Extract<keyof T, string>]> : State<T[Extract<keyof T, string>]>
31
+ ]>;
32
+ };
33
+ type ArrayStore<T extends UnknownArray> = BaseStore<T> & {
34
+ readonly length: number;
35
+ [n: number]: ArrayItem<T> extends readonly unknown[] | Record<string, unknown> ? Store<ArrayItem<T>> : State<ArrayItem<T>>;
36
+ add(value: ArrayItem<T>): void;
37
+ remove(index: number): void;
38
+ [Symbol.iterator](): IterableIterator<ArrayItem<T> extends readonly unknown[] | Record<string, unknown> ? Store<ArrayItem<T>> : State<ArrayItem<T>>>;
39
+ readonly [Symbol.isConcatSpreadable]: boolean;
40
40
  };
41
+ interface StoreAddEvent<T extends UnknownRecord | UnknownArray> extends CustomEvent {
42
+ type: 'store-add';
43
+ detail: Partial<T>;
44
+ }
45
+ interface StoreChangeEvent<T extends UnknownRecord | UnknownArray> extends CustomEvent {
46
+ type: 'store-change';
47
+ detail: Partial<T>;
48
+ }
49
+ interface StoreRemoveEvent<T extends UnknownRecord | UnknownArray> extends CustomEvent {
50
+ type: 'store-remove';
51
+ detail: Partial<T>;
52
+ }
53
+ interface StoreSortEvent extends CustomEvent {
54
+ type: 'store-sort';
55
+ detail: string[];
56
+ }
57
+ type Store<T> = T extends UnknownRecord ? RecordStore<T> : T extends UnknownArray ? ArrayStore<T> : never;
58
+ declare const TYPE_STORE = "Store";
41
59
  /**
42
60
  * Create a new store with deeply nested reactive properties
43
61
  *
62
+ * Supports both objects and arrays as initial values. Arrays are converted
63
+ * to records internally for storage but maintain their array type through
64
+ * the .get() method, which automatically converts objects with consecutive
65
+ * numeric keys back to arrays.
66
+ *
44
67
  * @since 0.15.0
45
- * @param {T} initialValue - initial object value of the store
46
- * @returns {Store<T>} - new store with reactive properties
68
+ * @param {T} initialValue - initial object or array value of the store
69
+ * @returns {Store<T>} - new store with reactive properties that preserves the original type T
47
70
  */
48
- declare const store: <T extends UnknownRecord>(initialValue: T) => Store<T>;
71
+ declare const store: <T extends UnknownRecord | UnknownArray>(initialValue: T) => Store<T>;
49
72
  /**
50
73
  * Check if the provided value is a Store instance
51
74
  *
@@ -53,5 +76,5 @@ declare const store: <T extends UnknownRecord>(initialValue: T) => Store<T>;
53
76
  * @param {unknown} value - value to check
54
77
  * @returns {boolean} - true if the value is a Store instance, false otherwise
55
78
  */
56
- declare const isStore: <T extends UnknownRecord>(value: unknown) => value is Store<T>;
57
- export { TYPE_STORE, isStore, store, type Store, type StoreAddEvent, type StoreChangeEvent, type StoreRemoveEvent, type StoreEventMap, };
79
+ declare const isStore: <T extends UnknownRecordOrArray>(value: unknown) => value is Store<T>;
80
+ export { TYPE_STORE, isStore, store, type Store, type StoreAddEvent, type StoreChangeEvent, type StoreRemoveEvent, type StoreSortEvent, type StoreEventMap, };
@@ -1,15 +1,17 @@
1
- declare const isNumber: (value: unknown) => value is number;
1
+ declare const UNSET: any;
2
2
  declare const isString: (value: unknown) => value is string;
3
+ declare const isNumber: (value: unknown) => value is number;
4
+ declare const isSymbol: (value: unknown) => value is symbol;
3
5
  declare const isFunction: <T>(fn: unknown) => fn is (...args: unknown[]) => T;
4
6
  declare const isAsyncFunction: <T>(fn: unknown) => fn is (...args: unknown[]) => Promise<T>;
7
+ declare const isDefinedObject: (value: unknown) => value is Record<string, unknown>;
5
8
  declare const isObjectOfType: <T>(value: unknown, type: string) => value is T;
6
9
  declare const isRecord: <T extends Record<string, unknown>>(value: unknown) => value is T;
7
- declare const isPrimitive: (value: unknown) => boolean;
8
- declare const arrayToRecord: <T extends unknown & {}>(array: T[]) => Record<string, T>;
10
+ declare const isRecordOrArray: <T extends Record<string | number, unknown> | ReadonlyArray<unknown>>(value: unknown) => value is T;
9
11
  declare const hasMethod: <T extends object & Record<string, (...args: unknown[]) => unknown>>(obj: T, methodName: string) => obj is T & Record<string, (...args: unknown[]) => unknown>;
10
12
  declare const isAbortError: (error: unknown) => boolean;
11
13
  declare const toError: (reason: unknown) => Error;
12
- declare class CircularDependencyError extends Error {
13
- constructor(where: string);
14
- }
15
- export { isNumber, isString, isFunction, isAsyncFunction, isObjectOfType, isRecord, isPrimitive, arrayToRecord, hasMethod, isAbortError, toError, CircularDependencyError, };
14
+ declare const arrayToRecord: <T>(array: T[]) => Record<string, T>;
15
+ declare const recordToArray: <T>(record: Record<string | number, T>) => Record<string, T> | T[];
16
+ declare const valueString: (value: unknown) => string;
17
+ export { UNSET, isString, isNumber, isSymbol, isFunction, isAsyncFunction, isDefinedObject, isObjectOfType, isRecord, isRecordOrArray, hasMethod, isAbortError, toError, arrayToRecord, recordToArray, valueString, };
package/index.d.ts DELETED
@@ -1,36 +0,0 @@
1
- /**
2
- * @name Cause & Effect
3
- * @version 0.14.2
4
- * @author Esther Brunner
5
- */
6
- export {
7
- type Computed,
8
- type ComputedCallback,
9
- computed,
10
- isComputed,
11
- TYPE_COMPUTED,
12
- } from './src/computed'
13
- export { type EffectMatcher, type MaybeCleanup, effect } from './src/effect'
14
- export {
15
- batch,
16
- type Cleanup,
17
- enqueue,
18
- flush,
19
- notify,
20
- observe,
21
- subscribe,
22
- type Updater,
23
- type Watcher,
24
- watch,
25
- } from './src/scheduler'
26
- export {
27
- isComputedCallback,
28
- isSignal,
29
- type MaybeSignal,
30
- type Signal,
31
- type SignalValues,
32
- toSignal,
33
- UNSET,
34
- } from './src/signal'
35
- export { isState, type State, state, TYPE_STATE } from './src/state'
36
- export { CircularDependencyError, isFunction } from './src/util'
@@ -1 +0,0 @@
1
- export {};