@signaltree/core 1.1.9 → 2.0.1
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 +138 -106
- package/fesm2022/signaltree-core.mjs +688 -326
- package/fesm2022/signaltree-core.mjs.map +1 -1
- package/index.d.ts +102 -46
- package/package.json +1 -1
package/index.d.ts
CHANGED
|
@@ -1,54 +1,57 @@
|
|
|
1
1
|
import { WritableSignal, Signal } from '@angular/core';
|
|
2
2
|
|
|
3
3
|
type Primitive = string | number | boolean | null | undefined | bigint | symbol;
|
|
4
|
-
type BuiltInObject = Date | RegExp | ((...args: unknown[]) => unknown) | Map<unknown, unknown> | Set<unknown> | WeakMap<object, unknown> | WeakSet<object> | ArrayBuffer | DataView | Error | Promise<unknown> | URL | URLSearchParams | FormData | Blob | File;
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
type BuiltInObject = Date | RegExp | ((...args: unknown[]) => unknown) | Map<unknown, unknown> | Set<unknown> | WeakMap<object, unknown> | WeakSet<object> | ArrayBuffer | DataView | Error | Promise<unknown> | Uint16Array | Int32Array | Uint32Array | Float32Array | Float64Array | BigInt64Array | BigUint64Array | URL | URLSearchParams | FormData | Blob | File | Headers | Request | Response | AbortController | AbortSignal;
|
|
5
|
+
interface NodeAccessor<T> {
|
|
6
|
+
(): T;
|
|
7
|
+
(value: T): void;
|
|
8
|
+
(updater: (current: T) => T): void;
|
|
9
|
+
}
|
|
10
|
+
type SignalifiedNode<T> = NodeAccessor<T> & DeepSignalify<T>;
|
|
9
11
|
type DeepSignalify<T> = {
|
|
10
|
-
[K in keyof T]: T[K] extends
|
|
11
|
-
} & (() => T) & {
|
|
12
|
-
update(updaterOrPartial: ((current: T) => Partial<T>) | Partial<T>): void;
|
|
13
|
-
set(partial: Partial<T>): void;
|
|
14
|
-
batchUpdate(updater: (current: T) => Partial<T>): void;
|
|
15
|
-
memoizedUpdate: (updater: (current: T) => Partial<T>, cacheKey?: string) => void;
|
|
16
|
-
clearMemoCache: (key?: string) => void;
|
|
17
|
-
getCacheStats: () => {
|
|
18
|
-
size?: number;
|
|
19
|
-
hitRate?: number;
|
|
20
|
-
totalHits?: number;
|
|
21
|
-
totalMisses?: number;
|
|
22
|
-
keys?: string[];
|
|
23
|
-
};
|
|
24
|
-
asyncAction: <TInput = void, TResult = void>(operation: (input: TInput) => Promise<TResult>, config?: AsyncActionConfig<T, TResult>) => AsyncAction<TInput, TResult>;
|
|
25
|
-
loadData: <TResult = void>(loader: () => Promise<TResult>, config?: AsyncActionConfig<T, TResult>) => AsyncAction<void, TResult>;
|
|
26
|
-
submitForm: <TInput = void, TResult = void>(submitter: (input: TInput) => Promise<TResult>, config?: AsyncActionConfig<T, TResult>) => AsyncAction<TInput, TResult>;
|
|
27
|
-
asCrud: <E extends {
|
|
28
|
-
id: string | number;
|
|
29
|
-
} = {
|
|
30
|
-
id: string | number;
|
|
31
|
-
}>(entityKey?: keyof T) => EntityHelpers<E>;
|
|
32
|
-
undo: () => boolean;
|
|
33
|
-
redo: () => boolean;
|
|
34
|
-
getHistory: () => TimeTravelEntry<T>[];
|
|
35
|
-
resetHistory: () => void;
|
|
36
|
-
jumpTo: (index: number) => boolean;
|
|
37
|
-
getCurrentIndex: () => number;
|
|
38
|
-
canUndo: () => boolean;
|
|
39
|
-
canRedo: () => boolean;
|
|
40
|
-
__devTools: unknown;
|
|
12
|
+
[K in keyof T]: T[K] extends readonly unknown[] ? WritableSignal<T[K]> : T[K] extends object ? T[K] extends Signal<unknown> ? T[K] : T[K] extends BuiltInObject ? WritableSignal<T[K]> : T[K] extends (...args: unknown[]) => unknown ? WritableSignal<T[K]> : SignalifiedNode<T[K]> : WritableSignal<T[K]>;
|
|
41
13
|
};
|
|
42
|
-
type
|
|
14
|
+
type RemoveSignalMethods<T> = T extends infer U ? U : never;
|
|
15
|
+
interface EnhancerMeta {
|
|
16
|
+
name?: string;
|
|
17
|
+
requires?: string[];
|
|
18
|
+
provides?: string[];
|
|
19
|
+
}
|
|
20
|
+
type Enhancer<Input = unknown, Output = unknown> = (input: Input) => Output;
|
|
21
|
+
type EnhancerWithMeta<Input = unknown, Output = unknown> = Enhancer<Input, Output> & {
|
|
22
|
+
metadata?: EnhancerMeta;
|
|
23
|
+
};
|
|
24
|
+
declare const ENHANCER_META: unique symbol;
|
|
25
|
+
type ChainResult<Start, E extends Array<EnhancerWithMeta<unknown, unknown>>> = E extends [infer H, ...infer R] ? H extends EnhancerWithMeta<SignalTree<any>, infer O> ? R extends Array<EnhancerWithMeta<unknown, unknown>> ? ChainResult<O, R> : O : H extends EnhancerWithMeta<infer I, infer O> ? Start extends I ? R extends Array<EnhancerWithMeta<unknown, unknown>> ? ChainResult<O, R> : O : any : unknown : Start;
|
|
26
|
+
interface WithMethod<T> {
|
|
27
|
+
(): SignalTree<T>;
|
|
28
|
+
<O1>(e1: (input: SignalTree<T>) => O1): O1;
|
|
29
|
+
<O1, O2>(e1: (input: SignalTree<T>) => O1, e2: (input: O1) => O2): O2;
|
|
30
|
+
<O1, O2, O3>(e1: (input: SignalTree<T>) => O1, e2: (input: O1) => O2, e3: (input: O2) => O3): O3;
|
|
31
|
+
<O1, O2, O3, O4>(e1: (input: SignalTree<T>) => O1, e2: (input: O1) => O2, e3: (input: O2) => O3, e4: (input: O3) => O4): O4;
|
|
32
|
+
<O1>(e1: EnhancerWithMeta<SignalTree<T>, O1>): O1;
|
|
33
|
+
<O1>(e1: EnhancerWithMeta<SignalTree<any>, O1>): O1;
|
|
34
|
+
<O1>(e1: EnhancerWithMeta<SignalTree<T>, O1>): O1;
|
|
35
|
+
<O1>(e1: EnhancerWithMeta<SignalTree<any>, O1>, e2: EnhancerWithMeta<O1, unknown>): unknown;
|
|
36
|
+
<O1, O2>(e1: EnhancerWithMeta<SignalTree<T>, O1>, e2: EnhancerWithMeta<O1, O2>): O2;
|
|
37
|
+
<O1, O2>(e1: EnhancerWithMeta<SignalTree<any>, O1>, e2: EnhancerWithMeta<O1, O2>): O2;
|
|
38
|
+
<O1, O2, O3>(e1: EnhancerWithMeta<SignalTree<T>, O1>, e2: EnhancerWithMeta<O1, O2>, e3: EnhancerWithMeta<O2, O3>): O3;
|
|
39
|
+
<O1, O2, O3>(e1: EnhancerWithMeta<SignalTree<any>, O1>, e2: EnhancerWithMeta<O1, O2>, e3: EnhancerWithMeta<O2, O3>): O3;
|
|
40
|
+
<O1, O2, O3, O4>(e1: EnhancerWithMeta<SignalTree<T>, O1>, e2: EnhancerWithMeta<O1, O2>, e3: EnhancerWithMeta<O2, O3>, e4: EnhancerWithMeta<O3, O4>): O4;
|
|
41
|
+
<O1, O2, O3, O4>(e1: EnhancerWithMeta<SignalTree<any>, O1>, e2: EnhancerWithMeta<O1, O2>, e3: EnhancerWithMeta<O2, O3>, e4: EnhancerWithMeta<O3, O4>): O4;
|
|
42
|
+
<O1, O2>(e1: EnhancerWithMeta<SignalTree<T>, O1>, e2: EnhancerWithMeta<O1, O2>): O2;
|
|
43
|
+
<O1, O2, O3>(e1: EnhancerWithMeta<SignalTree<T>, O1>, e2: EnhancerWithMeta<O1, O2>, e3: EnhancerWithMeta<O2, O3>): O3;
|
|
44
|
+
<O1, O2, O3, O4>(e1: EnhancerWithMeta<SignalTree<T>, O1>, e2: EnhancerWithMeta<O1, O2>, e3: EnhancerWithMeta<O2, O3>, e4: EnhancerWithMeta<O3, O4>): O4;
|
|
45
|
+
}
|
|
46
|
+
type SignalTree<T> = NodeAccessor<T> & {
|
|
43
47
|
state: DeepSignalify<T>;
|
|
44
48
|
$: DeepSignalify<T>;
|
|
49
|
+
with: WithMethod<T>;
|
|
50
|
+
destroy(): void;
|
|
45
51
|
effect(fn: (tree: T) => void): void;
|
|
46
52
|
subscribe(fn: (tree: T) => void): () => void;
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
pipe<R1>(fn1: (tree: SignalTree<T>) => R1): R1;
|
|
50
|
-
pipe<R1, R2>(fn1: (tree: SignalTree<T>) => R1, fn2: (arg: R1) => R2): R2;
|
|
51
|
-
pipe<R1, R2, R3>(fn1: (tree: SignalTree<T>) => R1, fn2: (arg: R1) => R2, fn3: (arg: R2) => R3): R3;
|
|
53
|
+
batch(updater: (tree: T) => void): void;
|
|
54
|
+
batchUpdate(updater: (current: T) => Partial<T>): void;
|
|
52
55
|
memoize<R>(fn: (tree: T) => R, cacheKey?: string): Signal<R>;
|
|
53
56
|
optimize(): void;
|
|
54
57
|
clearCache(): void;
|
|
@@ -64,6 +67,7 @@ type SignalTree<T> = {
|
|
|
64
67
|
redo(): void;
|
|
65
68
|
getHistory(): TimeTravelEntry<T>[];
|
|
66
69
|
resetHistory(): void;
|
|
70
|
+
[key: string]: unknown;
|
|
67
71
|
};
|
|
68
72
|
type TreePreset = 'basic' | 'performance' | 'development' | 'production';
|
|
69
73
|
interface TreeConfig {
|
|
@@ -132,11 +136,63 @@ declare function signalTree<T extends Record<string, unknown>>(obj: Required<T>,
|
|
|
132
136
|
declare function signalTree<T>(obj: T, configOrPreset?: TreeConfig | TreePreset): SignalTree<T>;
|
|
133
137
|
|
|
134
138
|
declare function equal<T>(a: T, b: T): boolean;
|
|
139
|
+
declare const deepEqual: typeof equal;
|
|
135
140
|
declare function terminalSignal<T>(value: T, customEqual?: (a: T, b: T) => boolean): WritableSignal<T>;
|
|
141
|
+
declare function isBuiltInObject(v: unknown): boolean;
|
|
142
|
+
declare function isNodeAccessor(value: unknown): value is NodeAccessor<unknown>;
|
|
143
|
+
declare function isAnySignal(value: unknown): boolean;
|
|
136
144
|
declare function parsePath(path: string): string[];
|
|
145
|
+
declare function composeEnhancers<T>(...enhancers: Array<(tree: T) => T>): (tree: T) => T;
|
|
137
146
|
declare function createLazySignalTree<T extends object>(obj: T, equalityFn: (a: unknown, b: unknown) => boolean, basePath?: string): DeepSignalify<T>;
|
|
138
|
-
declare
|
|
139
|
-
declare function
|
|
147
|
+
declare function unwrap<T>(node: DeepSignalify<T>): T;
|
|
148
|
+
declare function unwrap<T>(node: NodeAccessor<T> & DeepSignalify<T>): T;
|
|
149
|
+
declare function unwrap<T>(node: NodeAccessor<T>): T;
|
|
150
|
+
declare function unwrap<T>(node: unknown): T;
|
|
151
|
+
|
|
152
|
+
declare function createEnhancer<I = unknown, O = unknown>(meta: EnhancerMeta, enhancerFn: (input: I) => O): EnhancerWithMeta<I, O>;
|
|
153
|
+
declare function resolveEnhancerOrder(enhancers: EnhancerWithMeta<unknown, unknown>[], availableCapabilities?: Set<string>, debugMode?: boolean): EnhancerWithMeta<unknown, unknown>[];
|
|
154
|
+
|
|
155
|
+
declare const SIGNAL_TREE_CONSTANTS: {
|
|
156
|
+
readonly MAX_PATH_CACHE_SIZE: 1000;
|
|
157
|
+
readonly LAZY_THRESHOLD: 50;
|
|
158
|
+
readonly ESTIMATE_MAX_DEPTH: 3;
|
|
159
|
+
readonly ESTIMATE_SAMPLE_SIZE_ARRAY: 3;
|
|
160
|
+
readonly ESTIMATE_SAMPLE_SIZE_OBJECT: 5;
|
|
161
|
+
readonly DEFAULT_CACHE_SIZE: 100;
|
|
162
|
+
readonly DEFAULT_BATCH_SIZE: 10;
|
|
163
|
+
};
|
|
164
|
+
declare const SIGNAL_TREE_MESSAGES: Readonly<{
|
|
165
|
+
readonly NULL_OR_UNDEFINED: "null/undefined";
|
|
166
|
+
readonly CIRCULAR_REF: "circular ref";
|
|
167
|
+
readonly UPDATER_INVALID: "updater invalid";
|
|
168
|
+
readonly LAZY_FALLBACK: "lazy fallback";
|
|
169
|
+
readonly SIGNAL_CREATION_FAILED: "signal creation failed";
|
|
170
|
+
readonly UPDATE_PATH_NOT_FOUND: "update path not found";
|
|
171
|
+
readonly UPDATE_FAILED: "update failed";
|
|
172
|
+
readonly ROLLBACK_FAILED: "rollback failed";
|
|
173
|
+
readonly CLEANUP_ERROR: "cleanup error";
|
|
174
|
+
readonly PRESET_UNKNOWN: "unknown preset";
|
|
175
|
+
readonly STRATEGY_SELECTION: "strategy select";
|
|
176
|
+
readonly TREE_DESTROYED: "destroyed";
|
|
177
|
+
readonly UPDATE_TRANSACTION: "update tx";
|
|
178
|
+
readonly BATCH_NOT_ENABLED: "batching disabled";
|
|
179
|
+
readonly MEMOIZE_NOT_ENABLED: "memoize disabled";
|
|
180
|
+
readonly MIDDLEWARE_NOT_AVAILABLE: "middleware missing";
|
|
181
|
+
readonly ENTITY_HELPERS_NOT_AVAILABLE: "entity helpers missing";
|
|
182
|
+
readonly ASYNC_ACTIONS_NOT_AVAILABLE: "async actions missing";
|
|
183
|
+
readonly TIME_TRAVEL_NOT_AVAILABLE: "time travel missing";
|
|
184
|
+
readonly OPTIMIZE_NOT_AVAILABLE: "optimize missing";
|
|
185
|
+
readonly CACHE_NOT_AVAILABLE: "cache missing";
|
|
186
|
+
readonly PERFORMANCE_NOT_ENABLED: "performance disabled";
|
|
187
|
+
readonly ENHANCER_ORDER_FAILED: "enhancer order failed";
|
|
188
|
+
readonly ENHANCER_CYCLE_DETECTED: "enhancer cycle";
|
|
189
|
+
readonly ENHANCER_REQUIREMENT_MISSING: "enhancer req missing";
|
|
190
|
+
readonly ENHANCER_PROVIDES_MISSING: "enhancer provides missing";
|
|
191
|
+
readonly ENHANCER_FAILED: "enhancer failed";
|
|
192
|
+
readonly ENHANCER_NOT_FUNCTION: "enhancer not function";
|
|
193
|
+
readonly EFFECT_NO_CONTEXT: "no angular context";
|
|
194
|
+
readonly SUBSCRIBE_NO_CONTEXT: "no angular context";
|
|
195
|
+
}>;
|
|
140
196
|
|
|
141
|
-
export { createLazySignalTree, deepEqual, equal, parsePath,
|
|
142
|
-
export type { AsyncAction, AsyncActionConfig, BuiltInObject,
|
|
197
|
+
export { ENHANCER_META, SIGNAL_TREE_CONSTANTS, SIGNAL_TREE_MESSAGES, composeEnhancers, createEnhancer, createLazySignalTree, deepEqual, equal, isAnySignal, isBuiltInObject, isNodeAccessor, parsePath, resolveEnhancerOrder, signalTree, terminalSignal, unwrap };
|
|
198
|
+
export type { AsyncAction, AsyncActionConfig, BuiltInObject, ChainResult, DeepSignalify, Enhancer, EnhancerMeta, EnhancerWithMeta, EntityHelpers, Middleware, PerformanceMetrics, Primitive, RemoveSignalMethods, SignalTree, TimeTravelEntry, TreeConfig, TreePreset, WithMethod };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@signaltree/core",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.1",
|
|
4
4
|
"description": "Lightweight, type-safe signal-based state management for Angular. Core package providing hierarchical signal trees, basic entity management, and async actions.",
|
|
5
5
|
"peerDependencies": {
|
|
6
6
|
"@angular/core": "^20.1.0"
|