@zeix/cause-effect 0.15.1 → 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/README.md +39 -1
- package/index.dev.js +517 -392
- package/index.js +1 -1
- package/index.ts +15 -4
- package/package.json +1 -1
- package/src/computed.ts +2 -2
- package/src/diff.ts +57 -44
- package/src/effect.ts +2 -6
- package/src/errors.ts +56 -0
- package/src/match.ts +2 -2
- package/src/resolve.ts +2 -2
- package/src/signal.ts +21 -43
- package/src/state.ts +3 -2
- package/src/store.ts +402 -179
- package/src/util.ts +50 -6
- package/test/computed.test.ts +1 -1
- package/test/diff.test.ts +321 -4
- package/test/effect.test.ts +1 -1
- package/test/match.test.ts +13 -3
- package/test/signal.test.ts +12 -140
- package/test/store.test.ts +963 -20
- package/types/index.d.ts +5 -4
- package/types/src/diff.d.ts +5 -3
- package/types/src/errors.d.ts +19 -0
- package/types/src/match.d.ts +1 -1
- package/types/src/resolve.d.ts +1 -1
- package/types/src/signal.d.ts +12 -19
- package/types/src/store.d.ts +48 -30
- package/types/src/util.d.ts +8 -5
- package/index.d.ts +0 -36
- package/types/test-new-effect.d.ts +0 -1
package/types/index.d.ts
CHANGED
|
@@ -4,12 +4,13 @@
|
|
|
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, type UnknownRecordOrArray, } 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 {
|
|
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 {
|
|
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';
|
package/types/src/diff.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
type UnknownRecord = Record<string, unknown & {}>;
|
|
2
|
-
type
|
|
3
|
-
|
|
2
|
+
type UnknownArray = ReadonlyArray<unknown & {}>;
|
|
3
|
+
type ArrayToRecord<T extends UnknownArray> = {
|
|
4
|
+
[key: string]: T extends Array<infer U extends {}> ? U : never;
|
|
4
5
|
};
|
|
6
|
+
type UnknownRecordOrArray = UnknownRecord | ArrayToRecord<UnknownArray>;
|
|
5
7
|
type DiffResult<T extends UnknownRecordOrArray = UnknownRecord> = {
|
|
6
8
|
changed: boolean;
|
|
7
9
|
add: Partial<T>;
|
|
@@ -27,4 +29,4 @@ declare const isEqual: <T>(a: T, b: T, visited?: WeakSet<object>) => boolean;
|
|
|
27
29
|
* @returns {DiffResult<T>} The result of the comparison
|
|
28
30
|
*/
|
|
29
31
|
declare const diff: <T extends UnknownRecordOrArray>(oldObj: T, newObj: T) => DiffResult<T>;
|
|
30
|
-
export { type DiffResult, diff, isEqual, type UnknownRecord, type UnknownRecordOrArray, };
|
|
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, };
|
package/types/src/match.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { ResolveResult } from './resolve';
|
|
2
2
|
import type { SignalValues, UnknownSignalRecord } from './signal';
|
|
3
3
|
type MatchHandlers<S extends UnknownSignalRecord> = {
|
|
4
|
-
ok
|
|
4
|
+
ok: (values: SignalValues<S>) => void;
|
|
5
5
|
err?: (errors: readonly Error[]) => void;
|
|
6
6
|
nil?: () => void;
|
|
7
7
|
};
|
package/types/src/resolve.d.ts
CHANGED
package/types/src/signal.d.ts
CHANGED
|
@@ -4,14 +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
7
|
type UnknownSignalRecord = Record<string, Signal<unknown & {}>>;
|
|
9
8
|
type SignalValues<S extends UnknownSignalRecord> = {
|
|
10
9
|
[K in keyof S]: S[K] extends Signal<infer T> ? T : never;
|
|
11
10
|
};
|
|
12
|
-
declare const UNSET: any;
|
|
13
11
|
/**
|
|
14
|
-
* Check whether a value is a Signal
|
|
12
|
+
* Check whether a value is a Signal
|
|
15
13
|
*
|
|
16
14
|
* @since 0.9.0
|
|
17
15
|
* @param {unknown} value - value to check
|
|
@@ -19,26 +17,21 @@ declare const UNSET: any;
|
|
|
19
17
|
*/
|
|
20
18
|
declare const isSignal: <T extends {}>(value: unknown) => value is Signal<T>;
|
|
21
19
|
/**
|
|
22
|
-
*
|
|
20
|
+
* Check whether a value is a State or Store
|
|
23
21
|
*
|
|
24
|
-
* @since 0.
|
|
25
|
-
* @param {
|
|
26
|
-
* @returns {
|
|
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
|
|
27
25
|
*/
|
|
28
|
-
declare
|
|
29
|
-
declare function toSignal<T extends {}>(value: (() => T) | ((abort: AbortSignal) => Promise<T>)): Computed<T>;
|
|
30
|
-
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 Record<string, unknown & {}> ? Store<{
|
|
31
|
-
[K in keyof T]: T[K];
|
|
32
|
-
}> : State<T>;
|
|
26
|
+
declare const isMutableSignal: <T extends {}>(value: unknown) => value is State<T> | Store<T>;
|
|
33
27
|
/**
|
|
34
|
-
* Convert a value to a
|
|
28
|
+
* Convert a value to a Signal if it's not already a Signal
|
|
35
29
|
*
|
|
36
|
-
* @since 0.
|
|
30
|
+
* @since 0.9.6
|
|
37
31
|
* @param {T} value - value to convert
|
|
38
|
-
* @returns {
|
|
32
|
+
* @returns {Signal<T>} - Signal instance
|
|
39
33
|
*/
|
|
40
|
-
declare function
|
|
41
|
-
declare function toMutableSignal<T extends {}>(value: T): T extends Store<infer U> ? Store<U> : T extends State<infer U> ? State<U> : T extends Record<string, unknown & {}> ? Store<{
|
|
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<{
|
|
42
35
|
[K in keyof T]: T[K];
|
|
43
|
-
}> : State<T>;
|
|
44
|
-
export { type Signal, type
|
|
36
|
+
}> : T extends ComputedCallback<infer U extends {}> ? Computed<U> : State<T>;
|
|
37
|
+
export { type Signal, type UnknownSignalRecord, type SignalValues, isSignal, isMutableSignal, toSignal, };
|
package/types/src/store.d.ts
CHANGED
|
@@ -1,43 +1,61 @@
|
|
|
1
|
-
import { type UnknownRecord, type UnknownRecordOrArray } 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
|
-
|
|
5
|
-
|
|
6
|
-
type: 'store-add';
|
|
7
|
-
detail: Partial<T>;
|
|
8
|
-
}
|
|
9
|
-
interface StoreChangeEvent<T extends UnknownRecordOrArray> extends CustomEvent {
|
|
10
|
-
type: 'store-change';
|
|
11
|
-
detail: Partial<T>;
|
|
12
|
-
}
|
|
13
|
-
interface StoreRemoveEvent<T extends UnknownRecordOrArray> extends CustomEvent {
|
|
14
|
-
type: 'store-remove';
|
|
15
|
-
detail: Partial<T>;
|
|
16
|
-
}
|
|
17
|
-
type StoreEventMap<T extends UnknownRecordOrArray> = {
|
|
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
|
|
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
|
-
|
|
30
|
-
[
|
|
31
|
-
} & StoreEventTarget<T> & {
|
|
32
|
-
[Symbol.toStringTag]: 'Store';
|
|
33
|
-
[Symbol.iterator](): IterableIterator<[keyof T, Signal<T[keyof T]>]>;
|
|
34
|
-
add<K extends keyof T>(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>(key: K): void;
|
|
37
18
|
set(value: T): void;
|
|
38
|
-
update(
|
|
39
|
-
|
|
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
|
*
|
|
@@ -50,7 +68,7 @@ type Store<T extends UnknownRecordOrArray = UnknownRecord> = {
|
|
|
50
68
|
* @param {T} initialValue - initial object or array value of the store
|
|
51
69
|
* @returns {Store<T>} - new store with reactive properties that preserves the original type T
|
|
52
70
|
*/
|
|
53
|
-
declare const store: <T extends
|
|
71
|
+
declare const store: <T extends UnknownRecord | UnknownArray>(initialValue: T) => Store<T>;
|
|
54
72
|
/**
|
|
55
73
|
* Check if the provided value is a Store instance
|
|
56
74
|
*
|
|
@@ -59,4 +77,4 @@ declare const store: <T extends UnknownRecordOrArray>(initialValue: T) => Store<
|
|
|
59
77
|
* @returns {boolean} - true if the value is a Store instance, false otherwise
|
|
60
78
|
*/
|
|
61
79
|
declare const isStore: <T extends UnknownRecordOrArray>(value: unknown) => value is Store<T>;
|
|
62
|
-
export { TYPE_STORE, isStore, store, type Store, type StoreAddEvent, type StoreChangeEvent, type StoreRemoveEvent, type StoreEventMap, };
|
|
80
|
+
export { TYPE_STORE, isStore, store, type Store, type StoreAddEvent, type StoreChangeEvent, type StoreRemoveEvent, type StoreSortEvent, type StoreEventMap, };
|
package/types/src/util.d.ts
CHANGED
|
@@ -1,14 +1,17 @@
|
|
|
1
|
+
declare const UNSET: any;
|
|
1
2
|
declare const isString: (value: unknown) => value is string;
|
|
2
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
|
|
10
|
+
declare const isRecordOrArray: <T extends Record<string | number, unknown> | ReadonlyArray<unknown>>(value: unknown) => value is T;
|
|
8
11
|
declare const hasMethod: <T extends object & Record<string, (...args: unknown[]) => unknown>>(obj: T, methodName: string) => obj is T & Record<string, (...args: unknown[]) => unknown>;
|
|
9
12
|
declare const isAbortError: (error: unknown) => boolean;
|
|
10
13
|
declare const toError: (reason: unknown) => Error;
|
|
11
|
-
declare
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
export { isString, isNumber, isFunction, isAsyncFunction, isObjectOfType, isRecord,
|
|
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 {};
|