@signaltree/core 6.0.0 → 6.0.3

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 (78) hide show
  1. package/README.md +76 -76
  2. package/dist/constants.js +6 -0
  3. package/dist/deep-equal.js +41 -0
  4. package/dist/enhancers/batching/batching.js +189 -0
  5. package/dist/enhancers/devtools/devtools.js +306 -0
  6. package/dist/enhancers/effects/effects.js +66 -0
  7. package/dist/enhancers/entities/entities.js +51 -0
  8. package/dist/enhancers/index.js +72 -0
  9. package/dist/enhancers/memoization/memoization.js +420 -0
  10. package/dist/enhancers/presets/lib/presets.js +27 -0
  11. package/dist/enhancers/serialization/constants.js +15 -0
  12. package/dist/enhancers/serialization/serialization.js +656 -0
  13. package/dist/enhancers/time-travel/time-travel.js +231 -0
  14. package/dist/enhancers/time-travel/utils.js +11 -0
  15. package/dist/index.js +19 -0
  16. package/dist/is-built-in-object.js +23 -0
  17. package/dist/lib/async-helpers.js +77 -0
  18. package/dist/lib/constants.js +56 -0
  19. package/dist/lib/entity-signal.js +283 -0
  20. package/dist/lib/memory/memory-manager.js +164 -0
  21. package/dist/lib/path-notifier.js +106 -0
  22. package/dist/lib/presets.js +21 -0
  23. package/dist/lib/security/security-validator.js +121 -0
  24. package/dist/lib/signal-tree.js +277 -0
  25. package/dist/lib/types.js +9 -0
  26. package/dist/lib/utils.js +299 -0
  27. package/dist/lru-cache.js +64 -0
  28. package/dist/parse-path.js +13 -0
  29. package/package.json +1 -1
  30. package/src/enhancers/batching/batching.d.ts +11 -0
  31. package/src/enhancers/batching/batching.types.d.ts +1 -0
  32. package/src/enhancers/batching/index.d.ts +1 -0
  33. package/src/enhancers/batching/test-setup.d.ts +3 -0
  34. package/src/enhancers/devtools/devtools.d.ts +68 -0
  35. package/src/enhancers/devtools/devtools.types.d.ts +1 -0
  36. package/src/enhancers/devtools/index.d.ts +1 -0
  37. package/src/enhancers/devtools/test-setup.d.ts +3 -0
  38. package/src/enhancers/effects/effects.d.ts +9 -0
  39. package/src/enhancers/effects/effects.types.d.ts +1 -0
  40. package/src/enhancers/effects/index.d.ts +1 -0
  41. package/src/enhancers/entities/entities.d.ts +11 -0
  42. package/src/enhancers/entities/entities.types.d.ts +1 -0
  43. package/src/enhancers/entities/index.d.ts +1 -0
  44. package/src/enhancers/entities/test-setup.d.ts +3 -0
  45. package/src/enhancers/index.d.ts +3 -0
  46. package/src/enhancers/memoization/index.d.ts +1 -0
  47. package/src/enhancers/memoization/memoization.d.ts +54 -0
  48. package/src/enhancers/memoization/memoization.types.d.ts +1 -0
  49. package/src/enhancers/memoization/test-setup.d.ts +3 -0
  50. package/src/enhancers/presets/index.d.ts +1 -0
  51. package/src/enhancers/presets/lib/presets.d.ts +8 -0
  52. package/src/enhancers/serialization/constants.d.ts +14 -0
  53. package/src/enhancers/serialization/index.d.ts +2 -0
  54. package/src/enhancers/serialization/serialization.d.ts +68 -0
  55. package/src/enhancers/serialization/test-setup.d.ts +3 -0
  56. package/src/enhancers/test-helpers/types-equals.d.ts +2 -0
  57. package/src/enhancers/time-travel/index.d.ts +1 -0
  58. package/src/enhancers/time-travel/test-setup.d.ts +3 -0
  59. package/src/enhancers/time-travel/time-travel.d.ts +10 -0
  60. package/src/enhancers/time-travel/time-travel.types.d.ts +1 -0
  61. package/src/enhancers/time-travel/utils.d.ts +2 -0
  62. package/src/enhancers/types.d.ts +1 -0
  63. package/src/enhancers/typing/helpers-types.d.ts +2 -0
  64. package/src/index.d.ts +17 -0
  65. package/src/lib/async-helpers.d.ts +8 -0
  66. package/src/lib/constants.d.ts +41 -0
  67. package/src/lib/dev-proxy.d.ts +3 -0
  68. package/src/lib/entity-signal.d.ts +1 -0
  69. package/src/lib/memory/memory-manager.d.ts +30 -0
  70. package/src/lib/path-notifier.d.ts +4 -0
  71. package/src/lib/performance/diff-engine.d.ts +33 -0
  72. package/src/lib/performance/path-index.d.ts +25 -0
  73. package/src/lib/performance/update-engine.d.ts +32 -0
  74. package/src/lib/presets.d.ts +34 -0
  75. package/src/lib/security/security-validator.d.ts +33 -0
  76. package/src/lib/signal-tree.d.ts +3 -0
  77. package/src/lib/types.d.ts +301 -0
  78. package/src/lib/utils.d.ts +32 -0
@@ -0,0 +1,68 @@
1
+ import { ISignalTree } from '../../lib/types';
2
+ export interface SerializationConfig {
3
+ includeMetadata?: boolean;
4
+ replacer?: (key: string, value: unknown) => unknown;
5
+ reviver?: (key: string, value: unknown) => unknown;
6
+ preserveTypes?: boolean;
7
+ maxDepth?: number;
8
+ handleCircular?: boolean;
9
+ }
10
+ export interface SerializedState<T = unknown> {
11
+ data: T;
12
+ metadata?: {
13
+ timestamp: number;
14
+ version: string;
15
+ appVersion?: string;
16
+ types?: Record<string, string>;
17
+ circularRefs?: Array<{
18
+ path: string;
19
+ targetPath: string;
20
+ }>;
21
+ nodeMap?: Record<string, 'b' | 'r'>;
22
+ };
23
+ }
24
+ export interface SerializableSignalTree<T> extends ISignalTree<T> {
25
+ $: any;
26
+ serialize(config?: SerializationConfig): string;
27
+ deserialize(json: string, config?: SerializationConfig): void;
28
+ toJSON(): T;
29
+ fromJSON(data: T, metadata?: SerializedState<T>['metadata']): void;
30
+ snapshot(): SerializedState<T>;
31
+ restore(snapshot: SerializedState<T>): void;
32
+ }
33
+ export interface SerializationMethods {
34
+ serialize(config?: SerializationConfig): string;
35
+ deserialize(json: string, config?: SerializationConfig): void;
36
+ toJSON(): unknown;
37
+ fromJSON(data: unknown, metadata?: SerializedState<unknown>['metadata']): void;
38
+ snapshot(): SerializedState<unknown>;
39
+ restore(snapshot: SerializedState<unknown>): void;
40
+ }
41
+ export interface PersistenceMethods {
42
+ save(): Promise<void>;
43
+ load(): Promise<void>;
44
+ clear(): Promise<void>;
45
+ __flushAutoSave?: () => Promise<void>;
46
+ }
47
+ export declare function serialization(defaultConfig?: SerializationConfig): <Tree extends ISignalTree<any>>(tree: Tree) => Tree & SerializationMethods;
48
+ export declare const withSerialization: (defaultConfig?: SerializationConfig) => <Tree extends ISignalTree<any>>(tree: Tree) => Tree & SerializationMethods;
49
+ export declare function enableSerialization(): <Tree extends ISignalTree<any>>(tree: Tree) => Tree & SerializationMethods;
50
+ export interface StorageAdapter {
51
+ getItem(key: string): string | null | Promise<string | null>;
52
+ setItem(key: string, value: string): void | Promise<void>;
53
+ removeItem(key: string): void | Promise<void>;
54
+ }
55
+ export interface PersistenceConfig extends SerializationConfig {
56
+ key: string;
57
+ storage?: StorageAdapter;
58
+ autoSave?: boolean;
59
+ debounceMs?: number;
60
+ autoLoad?: boolean;
61
+ skipCache?: boolean;
62
+ }
63
+ export declare function persistence(config: PersistenceConfig): <Tree extends ISignalTree<any>>(tree: Tree) => Tree & SerializationMethods & PersistenceMethods;
64
+ export declare const withPersistence: (cfg: PersistenceConfig) => <Tree extends ISignalTree<any>>(tree: Tree) => Tree & SerializationMethods & PersistenceMethods;
65
+ export declare function createStorageAdapter(getItem: (key: string) => string | null | Promise<string | null>, setItem: (key: string, value: string) => void | Promise<void>, removeItem: (key: string) => void | Promise<void>): StorageAdapter;
66
+ export declare function createIndexedDBAdapter(dbName?: string, storeName?: string): StorageAdapter;
67
+ export declare function applySerialization<T extends Record<string, unknown>>(tree: ISignalTree<T>): ISignalTree<T> & SerializationMethods;
68
+ export declare function applyPersistence<T extends Record<string, unknown>>(tree: ISignalTree<T>, cfg: PersistenceConfig): ISignalTree<T> & SerializationMethods & PersistenceMethods;
@@ -0,0 +1,3 @@
1
+ import '@angular/compiler';
2
+ import 'zone.js';
3
+ import 'zone.js/testing';
@@ -0,0 +1,2 @@
1
+ export type Equals<A, B> = (<T>() => T extends A ? 1 : 2) extends (<T>() => T extends B ? 1 : 2) ? true : false;
2
+ export type Assert<T extends true> = T;
@@ -0,0 +1 @@
1
+ export * from './time-travel';
@@ -0,0 +1,3 @@
1
+ import '@angular/compiler';
2
+ import 'zone.js';
3
+ import 'zone.js/testing';
@@ -0,0 +1,10 @@
1
+ import type { ISignalTree, TimeTravelMethods, TimeTravelConfig, TimeTravelEntry } from '../../lib/types';
2
+ export type { TimeTravelConfig, TimeTravelEntry };
3
+ export declare function timeTravel(config?: TimeTravelConfig): <Tree extends ISignalTree<any>>(tree: Tree) => Tree & TimeTravelMethods;
4
+ export declare function enableTimeTravel(): <Tree extends ISignalTree<any>>(tree: Tree) => Tree & TimeTravelMethods;
5
+ export declare function timeTravelHistory(maxHistorySize: number): <Tree extends ISignalTree<any>>(tree: Tree) => Tree & TimeTravelMethods;
6
+ export declare const withTimeTravel: ((config?: TimeTravelConfig) => <Tree extends ISignalTree<any>>(tree: Tree) => Tree & TimeTravelMethods) & {
7
+ minimal: () => <Tree extends ISignalTree<any>>(tree: Tree) => Tree & TimeTravelMethods;
8
+ debug: () => <Tree extends ISignalTree<any>>(tree: Tree) => Tree & TimeTravelMethods;
9
+ history: typeof timeTravelHistory;
10
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ export declare function deepClone<T>(obj: T): T;
2
+ export declare function deepEqual(a: unknown, b: unknown): boolean;
@@ -0,0 +1 @@
1
+ export { BatchingMethods, BatchingConfig, MemoizationMethods, MemoizationConfig, TimeTravelMethods, TimeTravelConfig, EffectsMethods, DevToolsMethods, DevToolsConfig, EntitiesEnabled, Enhancer, EnhancerWithMeta, EnhancerMeta, } from '../lib/types';
@@ -0,0 +1,2 @@
1
+ export type Equals<A, B> = (<T>() => T extends A ? 1 : 2) extends <T>() => T extends B ? 1 : 2 ? true : false;
2
+ export type Assert<T extends true> = T;
package/src/index.d.ts ADDED
@@ -0,0 +1,17 @@
1
+ export { signalTree } from './lib/signal-tree';
2
+ export type { ISignalTree, SignalTree, SignalTreeBase, FullSignalTree, ProdSignalTree, TreeNode, CallableWritableSignal, AccessibleNode, NodeAccessor, Primitive, NotFn, TreeConfig, TreePreset, Enhancer, EnhancerMeta, EnhancerWithMeta, EntitySignal, EntityMapMarker, EntityConfig, MutationOptions, AddOptions, AddManyOptions, TimeTravelEntry, TimeTravelMethods, } from './lib/types';
3
+ export { entityMap } from './lib/types';
4
+ export { equal, deepEqual, isNodeAccessor, isAnySignal, toWritableSignal, parsePath, composeEnhancers, isBuiltInObject, createLazySignalTree, } from './lib/utils';
5
+ export { getPathNotifier } from './lib/path-notifier';
6
+ export { SecurityValidator, SecurityPresets, type SecurityEvent, type SecurityEventType, type SecurityValidatorConfig, } from './lib/security/security-validator';
7
+ export { createEnhancer, resolveEnhancerOrder } from './enhancers/index';
8
+ export { ENHANCER_META } from './lib/types';
9
+ export { batching, highPerformanceBatching, flushBatchedUpdates, hasPendingUpdates, getBatchQueueSize, } from './enhancers/batching/batching';
10
+ export { memoization, selectorMemoization, computedMemoization, deepStateMemoization, highFrequencyMemoization, highPerformanceMemoization, lightweightMemoization, shallowMemoization, memoize, memoizeShallow, memoizeReference, clearAllCaches, getGlobalCacheStats, } from './enhancers/memoization/memoization';
11
+ export { timeTravel, enableTimeTravel, } from './enhancers/time-travel/time-travel';
12
+ export { entities, enableEntities, highPerformanceEntities, } from './enhancers/entities/entities';
13
+ export { serialization, enableSerialization, persistence, createStorageAdapter, createIndexedDBAdapter, applySerialization, applyPersistence, } from './enhancers/serialization/serialization';
14
+ export { devTools, enableDevTools, fullDevTools, productionDevTools, } from './enhancers/devtools/devtools';
15
+ export { createAsyncOperation, trackAsync } from './lib/async-helpers';
16
+ export { TREE_PRESETS, createPresetConfig, validatePreset, getAvailablePresets, combinePresets, createDevTree, } from './enhancers/presets/lib/presets';
17
+ export { SIGNAL_TREE_CONSTANTS, SIGNAL_TREE_MESSAGES } from './lib/constants';
@@ -0,0 +1,8 @@
1
+ import type { ISignalTree } from './types';
2
+ export declare function createAsyncOperation<T, TResult>(name: string, operation: () => Promise<TResult>): (tree: ISignalTree<T>) => Promise<TResult>;
3
+ export declare function trackAsync<T>(operation: () => Promise<T>): {
4
+ pending: import("@angular/core").Signal<boolean>;
5
+ error: import("@angular/core").Signal<Error | null>;
6
+ result: import("@angular/core").Signal<T | null>;
7
+ execute: () => Promise<T>;
8
+ };
@@ -0,0 +1,41 @@
1
+ export declare const SIGNAL_TREE_CONSTANTS: {
2
+ readonly MAX_PATH_CACHE_SIZE: 1000;
3
+ readonly LAZY_THRESHOLD: 50;
4
+ readonly ESTIMATE_MAX_DEPTH: 3;
5
+ readonly ESTIMATE_SAMPLE_SIZE_ARRAY: 3;
6
+ readonly ESTIMATE_SAMPLE_SIZE_OBJECT: 5;
7
+ readonly DEFAULT_CACHE_SIZE: 100;
8
+ readonly DEFAULT_BATCH_SIZE: 10;
9
+ };
10
+ export declare const SIGNAL_TREE_MESSAGES: Readonly<{
11
+ readonly NULL_OR_UNDEFINED: "null/undefined";
12
+ readonly CIRCULAR_REF: "circular ref";
13
+ readonly UPDATER_INVALID: "updater invalid";
14
+ readonly LAZY_FALLBACK: "lazy fallback";
15
+ readonly SIGNAL_CREATION_FAILED: "signal creation failed";
16
+ readonly UPDATE_PATH_NOT_FOUND: "update path not found";
17
+ readonly UPDATE_FAILED: "update failed";
18
+ readonly ROLLBACK_FAILED: "rollback failed";
19
+ readonly CLEANUP_ERROR: "cleanup error";
20
+ readonly PRESET_UNKNOWN: "unknown preset";
21
+ readonly STRATEGY_SELECTION: "strategy select";
22
+ readonly TREE_DESTROYED: "destroyed";
23
+ readonly UPDATE_TRANSACTION: "update tx";
24
+ readonly BATCH_NOT_ENABLED: "batching disabled";
25
+ readonly MEMOIZE_NOT_ENABLED: "memoize disabled";
26
+ readonly MIDDLEWARE_NOT_AVAILABLE: "middleware missing";
27
+ readonly ENTITY_HELPERS_NOT_AVAILABLE: "entity helpers missing";
28
+ readonly TIME_TRAVEL_NOT_AVAILABLE: "time travel missing";
29
+ readonly OPTIMIZE_NOT_AVAILABLE: "optimize missing";
30
+ readonly UPDATE_OPTIMIZED_NOT_AVAILABLE: "update optimized missing";
31
+ readonly CACHE_NOT_AVAILABLE: "cache missing";
32
+ readonly PERFORMANCE_NOT_ENABLED: "performance disabled";
33
+ readonly ENHANCER_ORDER_FAILED: "enhancer order failed";
34
+ readonly ENHANCER_CYCLE_DETECTED: "enhancer cycle";
35
+ readonly ENHANCER_REQUIREMENT_MISSING: "enhancer req missing";
36
+ readonly ENHANCER_PROVIDES_MISSING: "enhancer provides missing";
37
+ readonly ENHANCER_FAILED: "enhancer failed";
38
+ readonly ENHANCER_NOT_FUNCTION: "enhancer not function";
39
+ readonly EFFECT_NO_CONTEXT: "no angular context";
40
+ readonly SUBSCRIBE_NO_CONTEXT: "no angular context";
41
+ }>;
@@ -0,0 +1,3 @@
1
+ import type { ISignalTree } from './types';
2
+ export declare function wrapWithDevProxy<T>(tree: ISignalTree<T>): ISignalTree<T>;
3
+ export declare function shouldUseDevProxy(): boolean;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,30 @@
1
+ import type { WritableSignal } from '@angular/core';
2
+ export interface MemoryStats {
3
+ cachedSignals: number;
4
+ cleanedUpSignals: number;
5
+ peakCachedSignals: number;
6
+ manualDisposes: number;
7
+ estimatedMemoryBytes: number;
8
+ }
9
+ export interface MemoryManagerConfig {
10
+ enableAutoCleanup?: boolean;
11
+ debugMode?: boolean;
12
+ onCleanup?: (path: string, stats: MemoryStats) => void;
13
+ }
14
+ export declare class SignalMemoryManager {
15
+ private cache;
16
+ private registry;
17
+ private config;
18
+ private stats;
19
+ constructor(config?: MemoryManagerConfig);
20
+ cacheSignal<T>(path: string, signal: WritableSignal<T>): void;
21
+ getSignal(path: string): WritableSignal<unknown> | undefined;
22
+ hasSignal(path: string): boolean;
23
+ removeSignal(path: string): boolean;
24
+ private handleCleanup;
25
+ getStats(): MemoryStats;
26
+ dispose(): void;
27
+ getCachedPaths(): string[];
28
+ clearStale(): number;
29
+ resetStats(): void;
30
+ }
@@ -0,0 +1,4 @@
1
+ export type PathNotifierInterceptor = (value: unknown, prev: unknown, path: string) => {
2
+ block?: boolean;
3
+ transform?: unknown;
4
+ };
@@ -0,0 +1,33 @@
1
+ import type { Path } from './path-index';
2
+ export declare enum ChangeType {
3
+ ADD = "add",
4
+ UPDATE = "update",
5
+ DELETE = "delete",
6
+ REPLACE = "replace"
7
+ }
8
+ export interface Change {
9
+ type: ChangeType;
10
+ path: Path;
11
+ value?: unknown;
12
+ oldValue?: unknown;
13
+ }
14
+ export interface Diff {
15
+ changes: Change[];
16
+ hasChanges: boolean;
17
+ }
18
+ export interface DiffOptions {
19
+ maxDepth?: number;
20
+ detectDeletions?: boolean;
21
+ ignoreArrayOrder?: boolean;
22
+ equalityFn?: (a: unknown, b: unknown) => boolean;
23
+ keyValidator?: (key: string) => boolean;
24
+ }
25
+ export declare class DiffEngine {
26
+ private defaultOptions;
27
+ diff(current: unknown, updates: unknown, options?: DiffOptions): Diff;
28
+ private traverse;
29
+ private diffArrays;
30
+ private diffArraysOrdered;
31
+ private diffArraysUnordered;
32
+ private stringify;
33
+ }
@@ -0,0 +1,25 @@
1
+ import type { WritableSignal } from '@angular/core';
2
+ export type PathSegment = string | number;
3
+ export type Path = PathSegment[];
4
+ export declare class PathIndex<T extends object = WritableSignal<any>> {
5
+ private root;
6
+ private pathCache;
7
+ private stats;
8
+ set(path: Path, signal: T): void;
9
+ get(path: Path): T | null;
10
+ has(path: Path): boolean;
11
+ getByPrefix(prefix: Path): Map<string, T>;
12
+ delete(path: Path): boolean;
13
+ clear(): void;
14
+ getStats(): {
15
+ hits: number;
16
+ misses: number;
17
+ sets: number;
18
+ cleanups: number;
19
+ hitRate: number;
20
+ cacheSize: number;
21
+ };
22
+ buildFromTree(tree: unknown, path?: Path): void;
23
+ private pathToString;
24
+ private collectDescendants;
25
+ }
@@ -0,0 +1,32 @@
1
+ import { PathIndex } from './path-index';
2
+ import type { DiffOptions } from './diff-engine';
3
+ export interface UpdateOptions extends DiffOptions {
4
+ batch?: boolean;
5
+ batchSize?: number;
6
+ }
7
+ export interface UpdateResult {
8
+ changed: boolean;
9
+ duration: number;
10
+ changedPaths: string[];
11
+ stats?: {
12
+ totalPaths: number;
13
+ optimizedPaths: number;
14
+ batchedUpdates: number;
15
+ };
16
+ }
17
+ export declare class OptimizedUpdateEngine {
18
+ private pathIndex;
19
+ private diffEngine;
20
+ constructor(tree: unknown);
21
+ update(tree: unknown, updates: unknown, options?: UpdateOptions): UpdateResult;
22
+ rebuildIndex(tree: unknown): void;
23
+ getIndexStats(): ReturnType<PathIndex['getStats']>;
24
+ private createPatches;
25
+ private createPatch;
26
+ private calculatePriority;
27
+ private sortPatches;
28
+ private applyPatches;
29
+ private batchApplyPatches;
30
+ private applyPatch;
31
+ private isEqual;
32
+ }
@@ -0,0 +1,34 @@
1
+ import type { ISignalTree, TreeConfig, BatchingConfig, MemoizationConfig, TimeTravelConfig, DevToolsConfig, BatchingMethods, MemoizationMethods, TimeTravelMethods, DevToolsMethods, EffectsMethods, EntitiesEnabled } from './types';
2
+ export interface DevTreeConfig extends TreeConfig {
3
+ effects?: Record<string, never>;
4
+ batching?: BatchingConfig;
5
+ memoization?: MemoizationConfig;
6
+ timeTravel?: TimeTravelConfig;
7
+ devTools?: DevToolsConfig;
8
+ entities?: Record<string, never>;
9
+ }
10
+ export interface ProdTreeConfig extends TreeConfig {
11
+ effects?: Record<string, never>;
12
+ batching?: BatchingConfig;
13
+ memoization?: MemoizationConfig;
14
+ entities?: Record<string, never>;
15
+ }
16
+ export interface MinimalTreeConfig extends TreeConfig {
17
+ effects?: Record<string, never>;
18
+ }
19
+ export type FullSignalTree<T> = ISignalTree<T> & EffectsMethods<T> & BatchingMethods & MemoizationMethods<T> & EntitiesEnabled & TimeTravelMethods & DevToolsMethods;
20
+ export type ProdSignalTree<T> = ISignalTree<T> & EffectsMethods<T> & BatchingMethods & MemoizationMethods<T> & EntitiesEnabled;
21
+ export type MinimalSignalTree<T> = ISignalTree<T> & EffectsMethods<T>;
22
+ export declare function createDevTree<T extends object>(initialState: T, config?: DevTreeConfig): FullSignalTree<T>;
23
+ export declare function createDevTree(): {
24
+ enhancer: <Tree extends ISignalTree<any>>(tree: Tree) => Tree & EffectsMethods<any> & BatchingMethods & MemoizationMethods<any> & EntitiesEnabled & TimeTravelMethods & DevToolsMethods;
25
+ };
26
+ export declare function createProdTree<T extends object>(initialState: T, config?: ProdTreeConfig): ProdSignalTree<T>;
27
+ export declare function createMinimalTree<T extends object>(initialState: T, config?: MinimalTreeConfig): MinimalSignalTree<T>;
28
+ export declare const devTree: typeof createDevTree;
29
+ export declare const prodTree: typeof createProdTree;
30
+ export declare const minimalTree: typeof createMinimalTree;
31
+ export declare function buildTree<T extends object>(initialState: T, config?: TreeConfig): {
32
+ add<R>(enhancer: (t: ISignalTree<T>) => R): any;
33
+ done(): ISignalTree<T>;
34
+ };
@@ -0,0 +1,33 @@
1
+ export type SecurityEventType = 'dangerous-key-blocked' | 'xss-attempt-blocked' | 'function-value-blocked' | 'validation-error';
2
+ export interface SecurityEvent {
3
+ type: SecurityEventType;
4
+ key?: string;
5
+ value?: unknown;
6
+ reason: string;
7
+ timestamp: number;
8
+ }
9
+ export interface SecurityValidatorConfig {
10
+ preventPrototypePollution?: boolean;
11
+ preventXSS?: boolean;
12
+ preventFunctions?: boolean;
13
+ customDangerousKeys?: string[];
14
+ onSecurityEvent?: (event: SecurityEvent) => void;
15
+ sanitizationMode?: 'strict' | 'permissive';
16
+ }
17
+ export declare class SecurityValidator {
18
+ private readonly config;
19
+ private readonly dangerousKeys;
20
+ constructor(config?: SecurityValidatorConfig);
21
+ validateKey(key: string): void;
22
+ validateValue<T>(value: T): T;
23
+ private sanitize;
24
+ validateKeyValue<T>(key: string, value: T): T;
25
+ isDangerousKey(key: string): boolean;
26
+ getConfig(): Readonly<Required<SecurityValidatorConfig>>;
27
+ }
28
+ export declare const SecurityPresets: {
29
+ strict: () => SecurityValidator;
30
+ standard: () => SecurityValidator;
31
+ permissive: () => SecurityValidator;
32
+ disabled: () => SecurityValidator;
33
+ };
@@ -0,0 +1,3 @@
1
+ import type { TreeConfig, NodeAccessor, ISignalTree } from './types';
2
+ export declare function isNodeAccessor(value: unknown): value is NodeAccessor<unknown>;
3
+ export declare function signalTree<T extends object>(initialState: T, config?: TreeConfig): ISignalTree<T>;