@signaltree/core 3.0.2 → 3.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.
Files changed (104) hide show
  1. package/package.json +59 -12
  2. package/src/enhancers/batching/index.d.ts +1 -0
  3. package/src/enhancers/batching/index.js +1 -0
  4. package/src/enhancers/batching/jest.config.d.ts +15 -0
  5. package/src/enhancers/batching/jest.config.js +21 -0
  6. package/src/enhancers/batching/lib/batching.d.ts +16 -0
  7. package/src/enhancers/batching/lib/batching.js +155 -0
  8. package/src/enhancers/batching/test-setup.d.ts +1 -0
  9. package/src/enhancers/batching/test-setup.js +5 -0
  10. package/src/enhancers/computed/index.d.ts +1 -0
  11. package/src/enhancers/computed/index.js +1 -0
  12. package/src/enhancers/computed/jest.config.d.ts +15 -0
  13. package/src/enhancers/computed/jest.config.js +21 -0
  14. package/src/enhancers/computed/lib/computed.d.ts +12 -0
  15. package/src/enhancers/computed/lib/computed.js +18 -0
  16. package/src/enhancers/devtools/index.d.ts +1 -0
  17. package/src/enhancers/devtools/index.js +1 -0
  18. package/src/enhancers/devtools/jest.config.d.ts +15 -0
  19. package/src/enhancers/devtools/jest.config.js +21 -0
  20. package/src/enhancers/devtools/lib/devtools.d.ts +77 -0
  21. package/src/enhancers/devtools/lib/devtools.js +278 -0
  22. package/src/enhancers/devtools/test-setup.d.ts +1 -0
  23. package/src/enhancers/devtools/test-setup.js +5 -0
  24. package/src/enhancers/entities/index.d.ts +1 -0
  25. package/src/enhancers/entities/index.js +1 -0
  26. package/src/enhancers/entities/jest.config.d.ts +15 -0
  27. package/src/enhancers/entities/jest.config.js +21 -0
  28. package/src/enhancers/entities/lib/entities.d.ts +22 -0
  29. package/src/enhancers/entities/lib/entities.js +110 -0
  30. package/src/enhancers/entities/test-setup.d.ts +1 -0
  31. package/src/enhancers/entities/test-setup.js +5 -0
  32. package/src/enhancers/index.d.ts +3 -0
  33. package/src/enhancers/index.js +84 -0
  34. package/src/enhancers/memoization/index.d.ts +1 -0
  35. package/src/enhancers/memoization/index.js +1 -0
  36. package/src/enhancers/memoization/jest.config.d.ts +15 -0
  37. package/src/enhancers/memoization/jest.config.js +21 -0
  38. package/src/enhancers/memoization/lib/memoization.d.ts +65 -0
  39. package/src/enhancers/memoization/lib/memoization.js +391 -0
  40. package/src/enhancers/memoization/test-setup.d.ts +1 -0
  41. package/src/enhancers/memoization/test-setup.js +5 -0
  42. package/src/enhancers/middleware/index.d.ts +2 -0
  43. package/src/enhancers/middleware/index.js +2 -0
  44. package/src/enhancers/middleware/jest.config.d.ts +15 -0
  45. package/src/enhancers/middleware/jest.config.js +21 -0
  46. package/src/enhancers/middleware/lib/async-helpers.d.ts +8 -0
  47. package/src/enhancers/middleware/lib/async-helpers.js +85 -0
  48. package/src/enhancers/middleware/lib/middleware.d.ts +11 -0
  49. package/src/enhancers/middleware/lib/middleware.js +179 -0
  50. package/src/enhancers/middleware/test-setup.d.ts +1 -0
  51. package/src/enhancers/middleware/test-setup.js +5 -0
  52. package/src/enhancers/presets/index.d.ts +1 -0
  53. package/src/enhancers/presets/index.js +1 -0
  54. package/src/enhancers/presets/jest.config.d.ts +15 -0
  55. package/src/enhancers/presets/jest.config.js +21 -0
  56. package/src/enhancers/presets/lib/presets.d.ts +11 -0
  57. package/src/enhancers/presets/lib/presets.js +102 -0
  58. package/src/enhancers/presets/test-setup.d.ts +1 -0
  59. package/src/enhancers/presets/test-setup.js +5 -0
  60. package/src/enhancers/serialization/constants.d.ts +14 -0
  61. package/src/enhancers/serialization/constants.js +14 -0
  62. package/src/enhancers/serialization/index.d.ts +2 -0
  63. package/src/enhancers/serialization/index.js +2 -0
  64. package/src/enhancers/serialization/jest.config.d.ts +15 -0
  65. package/src/enhancers/serialization/jest.config.js +21 -0
  66. package/src/enhancers/serialization/lib/serialization.d.ts +59 -0
  67. package/src/enhancers/serialization/lib/serialization.js +668 -0
  68. package/src/enhancers/serialization/test-setup.d.ts +1 -0
  69. package/src/enhancers/serialization/test-setup.js +5 -0
  70. package/src/enhancers/time-travel/index.d.ts +1 -0
  71. package/src/enhancers/time-travel/index.js +1 -0
  72. package/src/enhancers/time-travel/jest.config.d.ts +15 -0
  73. package/src/enhancers/time-travel/jest.config.js +21 -0
  74. package/src/enhancers/time-travel/lib/time-travel.d.ts +36 -0
  75. package/src/enhancers/time-travel/lib/time-travel.js +192 -0
  76. package/src/enhancers/time-travel/lib/utils.d.ts +1 -0
  77. package/src/enhancers/time-travel/lib/utils.js +1 -0
  78. package/src/enhancers/time-travel/test-setup.d.ts +1 -0
  79. package/src/enhancers/time-travel/test-setup.js +5 -0
  80. package/src/enhancers/types.d.ts +105 -0
  81. package/src/enhancers/types.js +0 -0
  82. package/src/index.d.ts +16 -0
  83. package/src/index.js +15 -0
  84. package/src/lib/constants.d.ts +42 -0
  85. package/src/lib/constants.js +61 -0
  86. package/src/lib/memory/memory-manager.d.ts +30 -0
  87. package/src/lib/memory/memory-manager.js +166 -0
  88. package/src/lib/performance/diff-engine.d.ts +33 -0
  89. package/src/lib/performance/diff-engine.js +156 -0
  90. package/src/lib/performance/path-index.d.ts +25 -0
  91. package/src/lib/performance/path-index.js +154 -0
  92. package/src/lib/performance/update-engine.d.ts +32 -0
  93. package/src/lib/performance/update-engine.js +193 -0
  94. package/src/lib/security/security-validator.d.ts +33 -0
  95. package/src/lib/security/security-validator.js +139 -0
  96. package/src/lib/signal-tree.d.ts +8 -0
  97. package/{fesm2022/signaltree-core.mjs → src/lib/signal-tree.js} +100 -573
  98. package/src/lib/types.d.ts +164 -0
  99. package/src/lib/types.js +9 -0
  100. package/src/lib/utils.d.ts +27 -0
  101. package/src/lib/utils.js +286 -0
  102. package/README.md +0 -1455
  103. package/fesm2022/signaltree-core.mjs.map +0 -1
  104. package/index.d.ts +0 -216
@@ -0,0 +1,179 @@
1
+ const middlewareMap = new WeakMap();
2
+ export function withMiddleware(middlewares = []) {
3
+ return (tree) => {
4
+ middlewareMap.set(tree, [...middlewares]);
5
+ const originalTreeCall = tree.bind(tree);
6
+ const enhancedTree = function (...args) {
7
+ if (args.length === 0) {
8
+ return originalTreeCall();
9
+ }
10
+ else {
11
+ const action = 'UPDATE';
12
+ const currentState = originalTreeCall();
13
+ const treeMiddlewares = middlewareMap.get(tree) || [];
14
+ let updateResult;
15
+ if (args.length === 1) {
16
+ const arg = args[0];
17
+ if (typeof arg === 'function') {
18
+ updateResult = arg(currentState);
19
+ }
20
+ else {
21
+ updateResult = arg;
22
+ }
23
+ }
24
+ else {
25
+ return;
26
+ }
27
+ for (const middleware of treeMiddlewares) {
28
+ if (middleware.before &&
29
+ !middleware.before(action, updateResult, currentState)) {
30
+ return;
31
+ }
32
+ }
33
+ const previousState = currentState;
34
+ if (args.length === 1) {
35
+ const arg = args[0];
36
+ if (typeof arg === 'function') {
37
+ originalTreeCall(arg);
38
+ }
39
+ else {
40
+ originalTreeCall(arg);
41
+ }
42
+ }
43
+ const newState = originalTreeCall();
44
+ for (const middleware of treeMiddlewares) {
45
+ if (middleware.after) {
46
+ middleware.after(action, updateResult, previousState, newState);
47
+ }
48
+ }
49
+ }
50
+ };
51
+ Object.setPrototypeOf(enhancedTree, Object.getPrototypeOf(tree));
52
+ Object.assign(enhancedTree, tree);
53
+ if ('state' in tree) {
54
+ Object.defineProperty(enhancedTree, 'state', {
55
+ value: tree.state,
56
+ enumerable: false,
57
+ configurable: true,
58
+ });
59
+ }
60
+ if ('$' in tree) {
61
+ Object.defineProperty(enhancedTree, '$', {
62
+ value: tree['$'],
63
+ enumerable: false,
64
+ configurable: true,
65
+ });
66
+ }
67
+ enhancedTree.addTap = (middleware) => {
68
+ const treeMiddlewares = middlewareMap.get(tree) || [];
69
+ const existingIndex = treeMiddlewares.findIndex((m) => m.id === middleware.id);
70
+ if (existingIndex >= 0) {
71
+ treeMiddlewares[existingIndex] = middleware;
72
+ }
73
+ else {
74
+ treeMiddlewares.push(middleware);
75
+ }
76
+ middlewareMap.set(tree, treeMiddlewares);
77
+ };
78
+ enhancedTree.removeTap = (id) => {
79
+ const treeMiddlewares = middlewareMap.get(tree) || [];
80
+ const filtered = treeMiddlewares.filter((m) => m.id !== id);
81
+ middlewareMap.set(tree, filtered);
82
+ };
83
+ const originalBatchUpdate = tree.batchUpdate;
84
+ if (originalBatchUpdate) {
85
+ enhancedTree.batchUpdate = (updater) => {
86
+ const action = 'BATCH_UPDATE';
87
+ const currentState = originalTreeCall();
88
+ const updateResult = updater(currentState);
89
+ const treeMiddlewares = middlewareMap.get(tree) || [];
90
+ for (const middleware of treeMiddlewares) {
91
+ if (middleware.before &&
92
+ !middleware.before(action, updateResult, currentState)) {
93
+ return;
94
+ }
95
+ }
96
+ const previousState = currentState;
97
+ originalBatchUpdate.call(tree, updater);
98
+ const newState = originalTreeCall();
99
+ for (const middleware of treeMiddlewares) {
100
+ if (middleware.after) {
101
+ middleware.after(action, updateResult, previousState, newState);
102
+ }
103
+ }
104
+ };
105
+ }
106
+ const originalDestroy = tree.destroy;
107
+ enhancedTree.destroy = () => {
108
+ middlewareMap.delete(tree);
109
+ if (originalDestroy) {
110
+ originalDestroy.call(tree);
111
+ }
112
+ };
113
+ return enhancedTree;
114
+ };
115
+ }
116
+ export function createLoggingMiddleware(treeName) {
117
+ return {
118
+ id: 'logging',
119
+ before: (action, payload, state) => {
120
+ console.group(`🏪 ${treeName}: ${action}`);
121
+ console.log('Previous state:', state);
122
+ console.log('Payload:', typeof payload === 'function' ? 'Function' : payload);
123
+ return true;
124
+ },
125
+ after: (action, payload, state, newState) => {
126
+ console.log('New state:', newState);
127
+ console.groupEnd();
128
+ },
129
+ };
130
+ }
131
+ export function createPerformanceMiddleware() {
132
+ return {
133
+ id: 'performance',
134
+ before: (action) => {
135
+ console.time(`Tree update: ${action}`);
136
+ return true;
137
+ },
138
+ after: (action) => {
139
+ console.timeEnd(`Tree update: ${action}`);
140
+ },
141
+ };
142
+ }
143
+ export function createValidationMiddleware(validator) {
144
+ return {
145
+ id: 'validation',
146
+ after: (action, payload, state, newState) => {
147
+ const error = validator(newState);
148
+ if (error) {
149
+ console.error(`Validation failed after ${action}:`, error);
150
+ }
151
+ },
152
+ };
153
+ }
154
+ export function createPersistenceMiddleware(config) {
155
+ const { key, storage = localStorage, debounceMs = 1000, actions = ['UPDATE', 'BATCH_UPDATE'], } = config;
156
+ let timeoutId;
157
+ const debouncedSave = (state) => {
158
+ if (timeoutId) {
159
+ clearTimeout(timeoutId);
160
+ }
161
+ timeoutId = setTimeout(() => {
162
+ try {
163
+ storage.setItem(key, JSON.stringify(state));
164
+ console.log(`💾 State auto-saved to ${key}`);
165
+ }
166
+ catch (error) {
167
+ console.error('Failed to save state:', error);
168
+ }
169
+ }, debounceMs);
170
+ };
171
+ return {
172
+ id: 'persistence',
173
+ after: (action, payload, state, newState) => {
174
+ if (actions.includes(action)) {
175
+ debouncedSave(newState);
176
+ }
177
+ },
178
+ };
179
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,5 @@
1
+ import { setupZoneTestEnv } from 'jest-preset-angular/setup-env/zone';
2
+ setupZoneTestEnv({
3
+ errorOnUnknownElements: true,
4
+ errorOnUnknownProperties: true,
5
+ });
@@ -0,0 +1 @@
1
+ export * from './lib/presets';
@@ -0,0 +1 @@
1
+ export * from './lib/presets';
@@ -0,0 +1,15 @@
1
+ declare const _default: {
2
+ displayName: string;
3
+ preset: string;
4
+ setupFilesAfterEnv: string[];
5
+ coverageDirectory: string;
6
+ transform: {
7
+ '^.+\\.(ts|mjs|js|html)$': (string | {
8
+ tsconfig: string;
9
+ stringifyContentPathRegex: string;
10
+ })[];
11
+ };
12
+ transformIgnorePatterns: string[];
13
+ snapshotSerializers: string[];
14
+ };
15
+ export default _default;
@@ -0,0 +1,21 @@
1
+ export default {
2
+ displayName: 'presets',
3
+ preset: '../../../jest.preset.js',
4
+ setupFilesAfterEnv: ['<rootDir>/src/test-setup.ts'],
5
+ coverageDirectory: '../../../coverage/packages/core/enhancers/presets',
6
+ transform: {
7
+ '^.+\\.(ts|mjs|js|html)$': [
8
+ 'jest-preset-angular',
9
+ {
10
+ tsconfig: '<rootDir>/tsconfig.spec.json',
11
+ stringifyContentPathRegex: '\\.(html|svg)$',
12
+ },
13
+ ],
14
+ },
15
+ transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'],
16
+ snapshotSerializers: [
17
+ 'jest-preset-angular/build/serializers/no-ng-attributes',
18
+ 'jest-preset-angular/build/serializers/ng-snapshot',
19
+ 'jest-preset-angular/build/serializers/html-comment',
20
+ ],
21
+ };
@@ -0,0 +1,11 @@
1
+ import type { TreeConfig } from '../../../lib/types';
2
+ export type TreePreset = 'basic' | 'performance' | 'development' | 'production';
3
+ export declare const TREE_PRESETS: Record<TreePreset, Partial<TreeConfig>>;
4
+ export declare function createPresetConfig(preset: TreePreset, overrides?: Partial<TreeConfig>): TreeConfig;
5
+ export declare function validatePreset(preset: TreePreset): boolean;
6
+ export declare function getAvailablePresets(): TreePreset[];
7
+ export declare function combinePresets(presets: TreePreset[], overrides?: Partial<TreeConfig>): TreeConfig;
8
+ export declare function createDevTree(overrides?: Partial<TreeConfig>): {
9
+ readonly config: TreeConfig;
10
+ readonly enhancer: (tree: unknown) => unknown;
11
+ };
@@ -0,0 +1,102 @@
1
+ import { composeEnhancers } from '../../../lib/utils';
2
+ export const TREE_PRESETS = {
3
+ basic: {
4
+ batchUpdates: false,
5
+ useMemoization: false,
6
+ trackPerformance: false,
7
+ enableTimeTravel: false,
8
+ enableDevTools: false,
9
+ debugMode: false,
10
+ },
11
+ performance: {
12
+ batchUpdates: true,
13
+ useMemoization: true,
14
+ trackPerformance: false,
15
+ enableTimeTravel: false,
16
+ enableDevTools: false,
17
+ debugMode: false,
18
+ useShallowComparison: true,
19
+ maxCacheSize: 200,
20
+ },
21
+ development: {
22
+ batchUpdates: true,
23
+ useMemoization: true,
24
+ trackPerformance: true,
25
+ enableTimeTravel: true,
26
+ enableDevTools: true,
27
+ debugMode: true,
28
+ maxCacheSize: 100,
29
+ },
30
+ production: {
31
+ batchUpdates: true,
32
+ useMemoization: true,
33
+ trackPerformance: false,
34
+ enableTimeTravel: false,
35
+ enableDevTools: false,
36
+ debugMode: false,
37
+ useShallowComparison: true,
38
+ maxCacheSize: 200,
39
+ },
40
+ };
41
+ export function createPresetConfig(preset, overrides = {}) {
42
+ const baseConfig = TREE_PRESETS[preset];
43
+ return {
44
+ ...baseConfig,
45
+ ...overrides,
46
+ };
47
+ }
48
+ export function validatePreset(preset) {
49
+ if (!TREE_PRESETS[preset]) {
50
+ throw new Error(`Invalid preset: ${preset}. Valid presets are: ${Object.keys(TREE_PRESETS).join(', ')}`);
51
+ }
52
+ return true;
53
+ }
54
+ export function getAvailablePresets() {
55
+ return Object.keys(TREE_PRESETS);
56
+ }
57
+ export function combinePresets(presets, overrides = {}) {
58
+ let combined = {};
59
+ for (const preset of presets) {
60
+ validatePreset(preset);
61
+ combined = { ...combined, ...TREE_PRESETS[preset] };
62
+ }
63
+ return { ...combined, ...overrides };
64
+ }
65
+ export function createDevTree(overrides = {}) {
66
+ const config = createPresetConfig('development', overrides);
67
+ const enhancers = [];
68
+ function tryRequire(id) {
69
+ const maybeReq = globalThis.require;
70
+ if (typeof maybeReq !== 'function')
71
+ return undefined;
72
+ try {
73
+ return maybeReq(id);
74
+ }
75
+ catch {
76
+ return undefined;
77
+ }
78
+ }
79
+ try {
80
+ const mod = tryRequire('@signaltree/devtools');
81
+ const withDevtools = mod && (mod.withDevtools ?? mod.withDevTools ?? mod.default ?? mod);
82
+ if (typeof withDevtools === 'function')
83
+ enhancers.push(withDevtools);
84
+ }
85
+ catch (e) {
86
+ void e;
87
+ }
88
+ try {
89
+ const mod = tryRequire('@signaltree/time-travel');
90
+ const withTimeTravel = mod && (mod.withTimeTravel ?? mod.default ?? mod);
91
+ if (typeof withTimeTravel === 'function')
92
+ enhancers.push(withTimeTravel);
93
+ }
94
+ catch (e) {
95
+ void e;
96
+ }
97
+ const composed = composeEnhancers(...enhancers);
98
+ return {
99
+ config,
100
+ enhancer: composed,
101
+ };
102
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,5 @@
1
+ import { setupZoneTestEnv } from 'jest-preset-angular/setup-env/zone';
2
+ setupZoneTestEnv({
3
+ errorOnUnknownElements: true,
4
+ errorOnUnknownProperties: true,
5
+ });
@@ -0,0 +1,14 @@
1
+ export declare const TYPE_MARKERS: {
2
+ readonly DATE: "§d";
3
+ readonly REGEXP: "§r";
4
+ readonly MAP: "§m";
5
+ readonly SET: "§s";
6
+ readonly UNDEFINED: "§u";
7
+ readonly NAN: "§n";
8
+ readonly INFINITY: "§i";
9
+ readonly NEG_INFINITY: "§-i";
10
+ readonly BIGINT: "§b";
11
+ readonly SYMBOL: "§y";
12
+ readonly FUNCTION: "§f";
13
+ readonly CIRCULAR: "§c";
14
+ };
@@ -0,0 +1,14 @@
1
+ export const TYPE_MARKERS = {
2
+ DATE: '§d',
3
+ REGEXP: '§r',
4
+ MAP: '§m',
5
+ SET: '§s',
6
+ UNDEFINED: '§u',
7
+ NAN: '§n',
8
+ INFINITY: '§i',
9
+ NEG_INFINITY: '§-i',
10
+ BIGINT: '§b',
11
+ SYMBOL: '§y',
12
+ FUNCTION: '§f',
13
+ CIRCULAR: '§c',
14
+ };
@@ -0,0 +1,2 @@
1
+ export * from './lib/serialization';
2
+ export * from './constants';
@@ -0,0 +1,2 @@
1
+ export * from './lib/serialization';
2
+ export * from './constants';
@@ -0,0 +1,15 @@
1
+ declare const _default: {
2
+ displayName: string;
3
+ preset: string;
4
+ setupFilesAfterEnv: string[];
5
+ coverageDirectory: string;
6
+ transform: {
7
+ '^.+\\.(ts|mjs|js|html)$': (string | {
8
+ tsconfig: string;
9
+ stringifyContentPathRegex: string;
10
+ })[];
11
+ };
12
+ transformIgnorePatterns: string[];
13
+ snapshotSerializers: string[];
14
+ };
15
+ export default _default;
@@ -0,0 +1,21 @@
1
+ export default {
2
+ displayName: 'serialization',
3
+ preset: '../../../jest.preset.js',
4
+ setupFilesAfterEnv: ['<rootDir>/src/test-setup.ts'],
5
+ coverageDirectory: '../../../coverage/packages/core/enhancers/serialization',
6
+ transform: {
7
+ '^.+\\.(ts|mjs|js|html)$': [
8
+ 'jest-preset-angular',
9
+ {
10
+ tsconfig: '<rootDir>/tsconfig.spec.json',
11
+ stringifyContentPathRegex: '\\.(html|svg)$',
12
+ },
13
+ ],
14
+ },
15
+ transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'],
16
+ snapshotSerializers: [
17
+ 'jest-preset-angular/build/serializers/no-ng-attributes',
18
+ 'jest-preset-angular/build/serializers/ng-snapshot',
19
+ 'jest-preset-angular/build/serializers/html-comment',
20
+ ],
21
+ };
@@ -0,0 +1,59 @@
1
+ import type { SignalTree } from '../../../lib/types';
2
+ import type { EnhancerWithMeta } from '../../../lib/types';
3
+ export interface SerializationConfig {
4
+ includeMetadata?: boolean;
5
+ replacer?: (key: string, value: unknown) => unknown;
6
+ reviver?: (key: string, value: unknown) => unknown;
7
+ preserveTypes?: boolean;
8
+ maxDepth?: number;
9
+ handleCircular?: boolean;
10
+ }
11
+ export interface SerializedState<T = unknown> {
12
+ data: T;
13
+ metadata?: {
14
+ timestamp: number;
15
+ version: string;
16
+ appVersion?: string;
17
+ types?: Record<string, string>;
18
+ circularRefs?: Array<{
19
+ path: string;
20
+ targetPath: string;
21
+ }>;
22
+ nodeMap?: Record<string, 'b' | 'r'>;
23
+ };
24
+ }
25
+ export interface SerializableSignalTree<T> extends SignalTree<T> {
26
+ $: any;
27
+ serialize(config?: SerializationConfig): string;
28
+ deserialize(json: string, config?: SerializationConfig): void;
29
+ toJSON(): T;
30
+ fromJSON(data: T, metadata?: SerializedState<T>['metadata']): void;
31
+ snapshot(): SerializedState<T>;
32
+ restore(snapshot: SerializedState<T>): void;
33
+ }
34
+ export interface PersistenceMethods {
35
+ save(): Promise<void>;
36
+ load(): Promise<void>;
37
+ clear(): Promise<void>;
38
+ __flushAutoSave?: () => Promise<void>;
39
+ }
40
+ export declare function withSerialization<T extends Record<string, unknown> = Record<string, unknown>>(defaultConfig?: SerializationConfig): EnhancerWithMeta<SignalTree<T>, SerializableSignalTree<T>>;
41
+ export declare function enableSerialization<T extends Record<string, unknown> = Record<string, unknown>>(): EnhancerWithMeta<SignalTree<T>, SerializableSignalTree<T>>;
42
+ export interface StorageAdapter {
43
+ getItem(key: string): string | null | Promise<string | null>;
44
+ setItem(key: string, value: string): void | Promise<void>;
45
+ removeItem(key: string): void | Promise<void>;
46
+ }
47
+ export interface PersistenceConfig extends SerializationConfig {
48
+ key: string;
49
+ storage?: StorageAdapter;
50
+ autoSave?: boolean;
51
+ debounceMs?: number;
52
+ autoLoad?: boolean;
53
+ skipCache?: boolean;
54
+ }
55
+ export declare function withPersistence<T extends Record<string, unknown> = Record<string, unknown>>(config: PersistenceConfig): EnhancerWithMeta<SignalTree<T>, SerializableSignalTree<T> & PersistenceMethods>;
56
+ 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;
57
+ export declare function createIndexedDBAdapter(dbName?: string, storeName?: string): StorageAdapter;
58
+ export declare function applySerialization<T extends Record<string, unknown>>(tree: SignalTree<T>): SerializableSignalTree<T>;
59
+ export declare function applyPersistence<T extends Record<string, unknown>>(tree: SignalTree<T>, cfg: PersistenceConfig): SerializableSignalTree<T> & PersistenceMethods;