@signaltree/core 4.0.16 → 4.1.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.
- package/README.md +27 -0
- package/dist/constants.js +6 -0
- package/dist/deep-clone.js +80 -0
- package/dist/deep-equal.js +41 -0
- package/dist/enhancers/batching/lib/batching.js +161 -0
- package/dist/enhancers/computed/lib/computed.js +21 -0
- package/dist/enhancers/devtools/lib/devtools.js +321 -0
- package/dist/enhancers/entities/lib/entities.js +115 -0
- package/dist/enhancers/index.js +72 -0
- package/dist/enhancers/memoization/lib/memoization.js +379 -0
- package/dist/enhancers/middleware/lib/async-helpers.js +77 -0
- package/dist/enhancers/middleware/lib/middleware.js +136 -0
- package/dist/enhancers/presets/lib/presets.js +88 -0
- package/dist/enhancers/serialization/constants.js +15 -0
- package/dist/enhancers/serialization/lib/serialization.js +660 -0
- package/dist/enhancers/time-travel/lib/time-travel.js +193 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +19 -0
- package/dist/is-built-in-object.js +23 -0
- package/dist/lib/constants.js +57 -0
- package/dist/lib/memory/memory-manager.js +164 -0
- package/dist/lib/performance/diff-engine.js +156 -0
- package/dist/lib/performance/path-index.js +156 -0
- package/dist/lib/performance/update-engine.js +188 -0
- package/dist/lib/security/security-validator.js +121 -0
- package/dist/lib/signal-tree.js +631 -0
- package/dist/lib/types.js +3 -0
- package/dist/lib/utils.js +254 -0
- package/dist/lru-cache.js +64 -0
- package/dist/parse-path.js +13 -0
- package/package.json +30 -16
- package/src/enhancers/batching/index.d.ts +1 -0
- package/src/enhancers/batching/jest.config.d.ts +15 -0
- package/src/enhancers/batching/lib/batching.d.ts +16 -0
- package/src/enhancers/batching/test-setup.d.ts +1 -0
- package/src/enhancers/computed/index.d.ts +1 -0
- package/src/enhancers/computed/jest.config.d.ts +15 -0
- package/src/enhancers/computed/lib/computed.d.ts +12 -0
- package/src/enhancers/devtools/index.d.ts +1 -0
- package/src/enhancers/devtools/jest.config.d.ts +15 -0
- package/src/enhancers/devtools/lib/devtools.d.ts +77 -0
- package/src/enhancers/devtools/test-setup.d.ts +1 -0
- package/src/enhancers/entities/index.d.ts +1 -0
- package/src/enhancers/entities/jest.config.d.ts +15 -0
- package/src/enhancers/entities/lib/entities.d.ts +22 -0
- package/src/enhancers/entities/test-setup.d.ts +1 -0
- package/src/enhancers/index.d.ts +3 -0
- package/src/enhancers/memoization/index.d.ts +1 -0
- package/src/enhancers/memoization/jest.config.d.ts +15 -0
- package/src/enhancers/memoization/lib/memoization.d.ts +65 -0
- package/src/enhancers/memoization/test-setup.d.ts +1 -0
- package/src/enhancers/middleware/index.d.ts +2 -0
- package/src/enhancers/middleware/jest.config.d.ts +15 -0
- package/src/enhancers/middleware/lib/async-helpers.d.ts +8 -0
- package/src/enhancers/middleware/lib/middleware.d.ts +11 -0
- package/src/enhancers/middleware/test-setup.d.ts +1 -0
- package/src/enhancers/presets/index.d.ts +1 -0
- package/src/enhancers/presets/jest.config.d.ts +15 -0
- package/src/enhancers/presets/lib/presets.d.ts +11 -0
- package/src/enhancers/presets/test-setup.d.ts +1 -0
- package/src/enhancers/serialization/constants.d.ts +14 -0
- package/src/enhancers/serialization/index.d.ts +2 -0
- package/src/enhancers/serialization/jest.config.d.ts +15 -0
- package/src/enhancers/serialization/lib/serialization.d.ts +59 -0
- package/src/enhancers/serialization/test-setup.d.ts +1 -0
- package/src/enhancers/time-travel/index.d.ts +1 -0
- package/src/enhancers/time-travel/jest.config.d.ts +15 -0
- package/src/enhancers/time-travel/lib/time-travel.d.ts +36 -0
- package/src/enhancers/time-travel/lib/utils.d.ts +1 -0
- package/src/enhancers/time-travel/test-setup.d.ts +1 -0
- package/src/enhancers/types.d.ts +105 -0
- package/src/index.d.ts +17 -0
- package/src/lib/constants.d.ts +42 -0
- package/src/lib/memory/memory-manager.d.ts +30 -0
- package/src/lib/performance/diff-engine.d.ts +33 -0
- package/src/lib/performance/path-index.d.ts +25 -0
- package/src/lib/performance/update-engine.d.ts +32 -0
- package/src/lib/security/security-validator.d.ts +33 -0
- package/src/lib/signal-tree.d.ts +8 -0
- package/src/lib/types.d.ts +164 -0
- package/src/lib/utils.d.ts +28 -0
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { Signal, WritableSignal } from '@angular/core';
|
|
2
|
+
import type { SecurityValidatorConfig } from './security/security-validator';
|
|
3
|
+
export type NotFn<T> = T extends (...args: unknown[]) => unknown ? never : T;
|
|
4
|
+
declare module '@angular/core' {
|
|
5
|
+
interface WritableSignal<T> {
|
|
6
|
+
(value: NotFn<T>): void;
|
|
7
|
+
(updater: (current: T) => T): void;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export type Primitive = string | number | boolean | null | undefined | bigint | symbol;
|
|
11
|
+
export 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;
|
|
12
|
+
export type Unwrap<T> = T extends WritableSignal<infer U> ? U : T extends Signal<infer U> ? U : T extends BuiltInObject ? T : T extends readonly unknown[] ? T : T extends object ? {
|
|
13
|
+
[K in keyof T]: Unwrap<T[K]>;
|
|
14
|
+
} : T;
|
|
15
|
+
export interface NodeAccessor<T> {
|
|
16
|
+
(): T;
|
|
17
|
+
(value: T): void;
|
|
18
|
+
(updater: (current: T) => T): void;
|
|
19
|
+
}
|
|
20
|
+
export type AccessibleNode<T> = NodeAccessor<T> & TreeNode<T>;
|
|
21
|
+
export type CallableWritableSignal<T> = WritableSignal<T> & {
|
|
22
|
+
(value: NotFn<T>): void;
|
|
23
|
+
(updater: (current: T) => T): void;
|
|
24
|
+
};
|
|
25
|
+
export type TreeNode<T> = {
|
|
26
|
+
[K in keyof T]: T[K] extends readonly unknown[] ? CallableWritableSignal<T[K]> : T[K] extends object ? T[K] extends Signal<unknown> ? T[K] : T[K] extends BuiltInObject ? CallableWritableSignal<T[K]> : T[K] extends (...args: unknown[]) => unknown ? CallableWritableSignal<T[K]> : AccessibleNode<T[K]> : CallableWritableSignal<T[K]>;
|
|
27
|
+
};
|
|
28
|
+
export type RemoveSignalMethods<T> = T extends infer U ? U : never;
|
|
29
|
+
export interface EnhancerMeta {
|
|
30
|
+
name?: string;
|
|
31
|
+
requires?: string[];
|
|
32
|
+
provides?: string[];
|
|
33
|
+
}
|
|
34
|
+
export type Enhancer<Input = unknown, Output = unknown> = (input: Input) => Output;
|
|
35
|
+
export type EnhancerWithMeta<Input = unknown, Output = unknown> = Enhancer<Input, Output> & {
|
|
36
|
+
metadata?: EnhancerMeta;
|
|
37
|
+
};
|
|
38
|
+
export declare const ENHANCER_META: unique symbol;
|
|
39
|
+
export type ChainResult<Start, E extends Array<EnhancerWithMeta<unknown, unknown>>> = E extends [infer H, ...infer R] ? H extends EnhancerWithMeta<SignalTree<unknown>, 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 : unknown : unknown : Start;
|
|
40
|
+
export interface WithMethod<T> {
|
|
41
|
+
(): SignalTree<T>;
|
|
42
|
+
<O>(enhancer: (input: SignalTree<T>) => O): O;
|
|
43
|
+
<O1, O2>(e1: (input: SignalTree<T>) => O1, e2: (input: O1) => O2): O2;
|
|
44
|
+
<O1, O2, O3>(e1: (input: SignalTree<T>) => O1, e2: (input: O1) => O2, e3: (input: O2) => O3): O3;
|
|
45
|
+
<O>(enhancer: EnhancerWithMeta<SignalTree<T>, O>): O;
|
|
46
|
+
<O1, O2>(e1: EnhancerWithMeta<SignalTree<T>, O1>, e2: EnhancerWithMeta<O1, O2>): O2;
|
|
47
|
+
<O1, O2, O3>(e1: EnhancerWithMeta<SignalTree<T>, O1>, e2: EnhancerWithMeta<O1, O2>, e3: EnhancerWithMeta<O2, O3>): O3;
|
|
48
|
+
}
|
|
49
|
+
export type SignalTree<T> = NodeAccessor<T> & {
|
|
50
|
+
state: TreeNode<T>;
|
|
51
|
+
$: TreeNode<T>;
|
|
52
|
+
with: WithMethod<T>;
|
|
53
|
+
destroy(): void;
|
|
54
|
+
dispose?(): void;
|
|
55
|
+
effect(fn: (tree: T) => void): void;
|
|
56
|
+
subscribe(fn: (tree: T) => void): () => void;
|
|
57
|
+
batch(updater: (tree: T) => void): void;
|
|
58
|
+
batchUpdate(updater: (current: T) => Partial<T>): void;
|
|
59
|
+
memoize<R>(fn: (tree: T) => R, cacheKey?: string): Signal<R>;
|
|
60
|
+
memoizedUpdate(updater: (current: T) => Partial<T>, cacheKey?: string): void;
|
|
61
|
+
clearMemoCache(key?: string): void;
|
|
62
|
+
getCacheStats(): {
|
|
63
|
+
size: number;
|
|
64
|
+
hitRate: number;
|
|
65
|
+
totalHits: number;
|
|
66
|
+
totalMisses: number;
|
|
67
|
+
keys: string[];
|
|
68
|
+
};
|
|
69
|
+
optimize(): void;
|
|
70
|
+
clearCache(): void;
|
|
71
|
+
invalidatePattern(pattern: string): number;
|
|
72
|
+
updateOptimized?(updates: Partial<T>, options?: {
|
|
73
|
+
batch?: boolean;
|
|
74
|
+
batchSize?: number;
|
|
75
|
+
maxDepth?: number;
|
|
76
|
+
ignoreArrayOrder?: boolean;
|
|
77
|
+
equalityFn?: (a: unknown, b: unknown) => boolean;
|
|
78
|
+
}): {
|
|
79
|
+
changed: boolean;
|
|
80
|
+
duration: number;
|
|
81
|
+
changedPaths: string[];
|
|
82
|
+
stats?: {
|
|
83
|
+
totalPaths: number;
|
|
84
|
+
optimizedPaths: number;
|
|
85
|
+
batchedUpdates: number;
|
|
86
|
+
};
|
|
87
|
+
};
|
|
88
|
+
getMetrics(): PerformanceMetrics;
|
|
89
|
+
addTap(middleware: Middleware<T>): void;
|
|
90
|
+
removeTap(id: string): void;
|
|
91
|
+
entities<E extends {
|
|
92
|
+
id: string | number;
|
|
93
|
+
}>(entityKey?: keyof T): EntityHelpers<E>;
|
|
94
|
+
asyncAction<TInput, TResult>(operation: (input: TInput) => Promise<TResult>, config?: AsyncActionConfig<T, TResult>): AsyncAction<TInput, TResult>;
|
|
95
|
+
undo(): void;
|
|
96
|
+
redo(): void;
|
|
97
|
+
getHistory(): TimeTravelEntry<T>[];
|
|
98
|
+
resetHistory(): void;
|
|
99
|
+
jumpTo?: (index: number) => void;
|
|
100
|
+
canUndo?: () => boolean;
|
|
101
|
+
canRedo?: () => boolean;
|
|
102
|
+
getCurrentIndex?: () => number;
|
|
103
|
+
[key: string]: unknown;
|
|
104
|
+
};
|
|
105
|
+
export type TreePreset = 'basic' | 'performance' | 'development' | 'production';
|
|
106
|
+
export interface TreeConfig {
|
|
107
|
+
batchUpdates?: boolean;
|
|
108
|
+
useMemoization?: boolean;
|
|
109
|
+
enableTimeTravel?: boolean;
|
|
110
|
+
useLazySignals?: boolean;
|
|
111
|
+
useShallowComparison?: boolean;
|
|
112
|
+
maxCacheSize?: number;
|
|
113
|
+
trackPerformance?: boolean;
|
|
114
|
+
treeName?: string;
|
|
115
|
+
enableDevTools?: boolean;
|
|
116
|
+
debugMode?: boolean;
|
|
117
|
+
useStructuralSharing?: boolean;
|
|
118
|
+
security?: SecurityValidatorConfig;
|
|
119
|
+
}
|
|
120
|
+
export interface Middleware<T> {
|
|
121
|
+
id: string;
|
|
122
|
+
before?: (action: string, payload: unknown, state: T) => boolean;
|
|
123
|
+
after?: (action: string, payload: unknown, state: T, newState: T) => void;
|
|
124
|
+
}
|
|
125
|
+
export interface PerformanceMetrics {
|
|
126
|
+
updates: number;
|
|
127
|
+
computations: number;
|
|
128
|
+
cacheHits: number;
|
|
129
|
+
cacheMisses: number;
|
|
130
|
+
averageUpdateTime: number;
|
|
131
|
+
}
|
|
132
|
+
export interface EntityHelpers<E extends {
|
|
133
|
+
id: string | number;
|
|
134
|
+
}> {
|
|
135
|
+
add(entity: E): void;
|
|
136
|
+
update(id: E['id'], updates: Partial<E>): void;
|
|
137
|
+
remove(id: E['id']): void;
|
|
138
|
+
upsert(entity: E): void;
|
|
139
|
+
selectById(id: E['id']): Signal<E | undefined>;
|
|
140
|
+
selectBy(predicate: (entity: E) => boolean): Signal<E[]>;
|
|
141
|
+
selectIds(): Signal<Array<string | number>>;
|
|
142
|
+
selectAll(): Signal<E[]>;
|
|
143
|
+
selectTotal(): Signal<number>;
|
|
144
|
+
clear(): void;
|
|
145
|
+
}
|
|
146
|
+
export interface AsyncActionConfig<T, TResult> {
|
|
147
|
+
onStart?: (state: T) => Partial<T>;
|
|
148
|
+
onSuccess?: (result: TResult, state: T) => Partial<T>;
|
|
149
|
+
onError?: (error: Error, state: T) => Partial<T>;
|
|
150
|
+
onComplete?: (state: T) => Partial<T>;
|
|
151
|
+
}
|
|
152
|
+
export interface AsyncAction<TInput, TResult> {
|
|
153
|
+
execute(input: TInput): Promise<TResult>;
|
|
154
|
+
pending: Signal<boolean>;
|
|
155
|
+
error: Signal<Error | null>;
|
|
156
|
+
result: Signal<TResult | null>;
|
|
157
|
+
}
|
|
158
|
+
export interface TimeTravelEntry<T> {
|
|
159
|
+
action: string;
|
|
160
|
+
timestamp: number;
|
|
161
|
+
state: T;
|
|
162
|
+
payload?: unknown;
|
|
163
|
+
}
|
|
164
|
+
export declare function isSignalTree<T>(value: unknown): value is SignalTree<T>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Signal, WritableSignal } from '@angular/core';
|
|
2
|
+
import { deepEqual, isBuiltInObject, parsePath } from '@signaltree/shared';
|
|
3
|
+
export { deepEqual };
|
|
4
|
+
export { deepEqual as equal };
|
|
5
|
+
export { isBuiltInObject };
|
|
6
|
+
export { parsePath };
|
|
7
|
+
export interface MemoryManager {
|
|
8
|
+
getSignal(path: string): WritableSignal<unknown> | undefined;
|
|
9
|
+
cacheSignal(path: string, signal: WritableSignal<unknown>): void;
|
|
10
|
+
dispose(): void;
|
|
11
|
+
}
|
|
12
|
+
export interface NodeAccessor<T> {
|
|
13
|
+
(): T;
|
|
14
|
+
(value: T): void;
|
|
15
|
+
(updater: (current: T) => T): void;
|
|
16
|
+
}
|
|
17
|
+
export type TreeNode<T> = {
|
|
18
|
+
[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 (...args: unknown[]) => unknown ? WritableSignal<T[K]> : NodeAccessor<T[K]> : WritableSignal<T[K]>;
|
|
19
|
+
};
|
|
20
|
+
export declare function isNodeAccessor(value: unknown): value is NodeAccessor<unknown>;
|
|
21
|
+
export declare function isAnySignal(value: unknown): boolean;
|
|
22
|
+
export declare function toWritableSignal<T>(node: NodeAccessor<T>, injector?: unknown): WritableSignal<T>;
|
|
23
|
+
export declare function composeEnhancers<T>(...enhancers: Array<(tree: T) => T>): (tree: T) => T;
|
|
24
|
+
export declare function createLazySignalTree<T extends object>(obj: T, equalityFn: (a: unknown, b: unknown) => boolean, basePath?: string, memoryManager?: MemoryManager): TreeNode<T>;
|
|
25
|
+
export declare function unwrap<T>(node: TreeNode<T>): T;
|
|
26
|
+
export declare function unwrap<T>(node: NodeAccessor<T> & TreeNode<T>): T;
|
|
27
|
+
export declare function unwrap<T>(node: NodeAccessor<T>): T;
|
|
28
|
+
export declare function unwrap<T>(node: unknown): T;
|