@signaltree/core 4.0.15 → 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.
Files changed (109) hide show
  1. package/README.md +106 -38
  2. package/dist/constants.js +6 -0
  3. package/dist/deep-clone.js +80 -0
  4. package/dist/deep-equal.js +41 -0
  5. package/dist/enhancers/batching/lib/batching.js +141 -135
  6. package/dist/enhancers/computed/lib/computed.js +18 -16
  7. package/dist/enhancers/devtools/lib/devtools.js +303 -260
  8. package/dist/enhancers/entities/lib/entities.js +109 -104
  9. package/dist/enhancers/index.js +65 -77
  10. package/dist/enhancers/memoization/lib/memoization.js +339 -351
  11. package/dist/enhancers/middleware/lib/async-helpers.js +71 -79
  12. package/dist/enhancers/middleware/lib/middleware.js +126 -169
  13. package/dist/enhancers/presets/lib/presets.js +82 -71
  14. package/dist/enhancers/serialization/constants.js +14 -13
  15. package/dist/enhancers/serialization/lib/serialization.js +615 -623
  16. package/dist/enhancers/time-travel/lib/time-travel.js +178 -177
  17. package/dist/index.d.ts +1 -17
  18. package/dist/index.js +19 -16
  19. package/dist/is-built-in-object.js +23 -0
  20. package/dist/lib/constants.js +51 -55
  21. package/dist/lib/memory/memory-manager.js +152 -154
  22. package/dist/lib/performance/diff-engine.js +141 -141
  23. package/dist/lib/performance/path-index.js +139 -137
  24. package/dist/lib/performance/update-engine.js +171 -176
  25. package/dist/lib/security/security-validator.js +110 -128
  26. package/dist/lib/signal-tree.js +577 -611
  27. package/dist/lib/types.js +3 -9
  28. package/dist/lib/utils.js +236 -268
  29. package/dist/lru-cache.js +64 -0
  30. package/dist/parse-path.js +13 -0
  31. package/package.json +30 -16
  32. package/src/index.d.ts +17 -0
  33. package/{dist → src}/lib/utils.d.ts +1 -0
  34. package/dist/enhancers/batching/index.js +0 -1
  35. package/dist/enhancers/batching/jest.config.js +0 -21
  36. package/dist/enhancers/batching/test-setup.js +0 -5
  37. package/dist/enhancers/computed/index.js +0 -1
  38. package/dist/enhancers/computed/jest.config.js +0 -21
  39. package/dist/enhancers/devtools/index.js +0 -1
  40. package/dist/enhancers/devtools/jest.config.js +0 -21
  41. package/dist/enhancers/devtools/test-setup.js +0 -5
  42. package/dist/enhancers/entities/index.js +0 -1
  43. package/dist/enhancers/entities/jest.config.js +0 -21
  44. package/dist/enhancers/entities/test-setup.js +0 -5
  45. package/dist/enhancers/memoization/index.js +0 -1
  46. package/dist/enhancers/memoization/jest.config.js +0 -21
  47. package/dist/enhancers/memoization/test-setup.js +0 -5
  48. package/dist/enhancers/middleware/index.js +0 -2
  49. package/dist/enhancers/middleware/jest.config.js +0 -21
  50. package/dist/enhancers/middleware/test-setup.js +0 -5
  51. package/dist/enhancers/presets/index.js +0 -1
  52. package/dist/enhancers/presets/jest.config.js +0 -21
  53. package/dist/enhancers/presets/test-setup.js +0 -5
  54. package/dist/enhancers/serialization/index.js +0 -2
  55. package/dist/enhancers/serialization/jest.config.js +0 -21
  56. package/dist/enhancers/serialization/test-setup.js +0 -5
  57. package/dist/enhancers/time-travel/index.js +0 -1
  58. package/dist/enhancers/time-travel/jest.config.js +0 -21
  59. package/dist/enhancers/time-travel/lib/utils.js +0 -1
  60. package/dist/enhancers/time-travel/test-setup.js +0 -5
  61. package/dist/enhancers/types.js +0 -0
  62. /package/{dist → src}/enhancers/batching/index.d.ts +0 -0
  63. /package/{dist → src}/enhancers/batching/jest.config.d.ts +0 -0
  64. /package/{dist → src}/enhancers/batching/lib/batching.d.ts +0 -0
  65. /package/{dist → src}/enhancers/batching/test-setup.d.ts +0 -0
  66. /package/{dist → src}/enhancers/computed/index.d.ts +0 -0
  67. /package/{dist → src}/enhancers/computed/jest.config.d.ts +0 -0
  68. /package/{dist → src}/enhancers/computed/lib/computed.d.ts +0 -0
  69. /package/{dist → src}/enhancers/devtools/index.d.ts +0 -0
  70. /package/{dist → src}/enhancers/devtools/jest.config.d.ts +0 -0
  71. /package/{dist → src}/enhancers/devtools/lib/devtools.d.ts +0 -0
  72. /package/{dist → src}/enhancers/devtools/test-setup.d.ts +0 -0
  73. /package/{dist → src}/enhancers/entities/index.d.ts +0 -0
  74. /package/{dist → src}/enhancers/entities/jest.config.d.ts +0 -0
  75. /package/{dist → src}/enhancers/entities/lib/entities.d.ts +0 -0
  76. /package/{dist → src}/enhancers/entities/test-setup.d.ts +0 -0
  77. /package/{dist → src}/enhancers/index.d.ts +0 -0
  78. /package/{dist → src}/enhancers/memoization/index.d.ts +0 -0
  79. /package/{dist → src}/enhancers/memoization/jest.config.d.ts +0 -0
  80. /package/{dist → src}/enhancers/memoization/lib/memoization.d.ts +0 -0
  81. /package/{dist → src}/enhancers/memoization/test-setup.d.ts +0 -0
  82. /package/{dist → src}/enhancers/middleware/index.d.ts +0 -0
  83. /package/{dist → src}/enhancers/middleware/jest.config.d.ts +0 -0
  84. /package/{dist → src}/enhancers/middleware/lib/async-helpers.d.ts +0 -0
  85. /package/{dist → src}/enhancers/middleware/lib/middleware.d.ts +0 -0
  86. /package/{dist → src}/enhancers/middleware/test-setup.d.ts +0 -0
  87. /package/{dist → src}/enhancers/presets/index.d.ts +0 -0
  88. /package/{dist → src}/enhancers/presets/jest.config.d.ts +0 -0
  89. /package/{dist → src}/enhancers/presets/lib/presets.d.ts +0 -0
  90. /package/{dist → src}/enhancers/presets/test-setup.d.ts +0 -0
  91. /package/{dist → src}/enhancers/serialization/constants.d.ts +0 -0
  92. /package/{dist → src}/enhancers/serialization/index.d.ts +0 -0
  93. /package/{dist → src}/enhancers/serialization/jest.config.d.ts +0 -0
  94. /package/{dist → src}/enhancers/serialization/lib/serialization.d.ts +0 -0
  95. /package/{dist → src}/enhancers/serialization/test-setup.d.ts +0 -0
  96. /package/{dist → src}/enhancers/time-travel/index.d.ts +0 -0
  97. /package/{dist → src}/enhancers/time-travel/jest.config.d.ts +0 -0
  98. /package/{dist → src}/enhancers/time-travel/lib/time-travel.d.ts +0 -0
  99. /package/{dist → src}/enhancers/time-travel/lib/utils.d.ts +0 -0
  100. /package/{dist → src}/enhancers/time-travel/test-setup.d.ts +0 -0
  101. /package/{dist → src}/enhancers/types.d.ts +0 -0
  102. /package/{dist → src}/lib/constants.d.ts +0 -0
  103. /package/{dist → src}/lib/memory/memory-manager.d.ts +0 -0
  104. /package/{dist → src}/lib/performance/diff-engine.d.ts +0 -0
  105. /package/{dist → src}/lib/performance/path-index.d.ts +0 -0
  106. /package/{dist → src}/lib/performance/update-engine.d.ts +0 -0
  107. /package/{dist → src}/lib/security/security-validator.d.ts +0 -0
  108. /package/{dist → src}/lib/signal-tree.d.ts +0 -0
  109. /package/{dist → src}/lib/types.d.ts +0 -0
@@ -1,85 +1,77 @@
1
1
  import { signal } from '@angular/core';
2
- export function createAsyncOperation(name, operation) {
3
- return async (tree) => {
4
- if (typeof tree.batchUpdate === 'function') {
5
- const pendingPatch = {
6
- [`${name}_PENDING`]: true,
7
- };
8
- tree.batchUpdate(() => pendingPatch);
9
- }
10
- else if ('$' in tree) {
11
- try {
12
- tree['$'][`${name}_PENDING`]?.set?.(true);
13
- }
14
- catch (e) {
15
- void e;
16
- }
17
- }
2
+
3
+ function createAsyncOperation(name, operation) {
4
+ return async tree => {
5
+ if (typeof tree.batchUpdate === 'function') {
6
+ const pendingPatch = {
7
+ [`${name}_PENDING`]: true
8
+ };
9
+ tree.batchUpdate(() => pendingPatch);
10
+ } else if ('$' in tree) {
11
+ try {
12
+ tree['$'][`${name}_PENDING`]?.set?.(true);
13
+ } catch (e) {
14
+ }
15
+ }
16
+ try {
17
+ const result = await operation();
18
+ if (typeof tree.batchUpdate === 'function') {
19
+ const resultPatch = {
20
+ [`${name}_RESULT`]: result,
21
+ [`${name}_PENDING`]: false
22
+ };
23
+ tree.batchUpdate(() => resultPatch);
24
+ } else if ('$' in tree) {
18
25
  try {
19
- const result = await operation();
20
- if (typeof tree.batchUpdate === 'function') {
21
- const resultPatch = {
22
- [`${name}_RESULT`]: result,
23
- [`${name}_PENDING`]: false,
24
- };
25
- tree.batchUpdate(() => resultPatch);
26
- }
27
- else if ('$' in tree) {
28
- try {
29
- tree['$'][`${name}_RESULT`]?.set?.(result);
30
- tree['$'][`${name}_PENDING`]?.set?.(false);
31
- }
32
- catch (e) {
33
- void e;
34
- }
35
- }
36
- return result;
26
+ tree['$'][`${name}_RESULT`]?.set?.(result);
27
+ tree['$'][`${name}_PENDING`]?.set?.(false);
28
+ } catch (e) {
29
+ void e;
37
30
  }
38
- catch (error) {
39
- if (typeof tree.batchUpdate === 'function') {
40
- const errorPatch = {
41
- [`${name}_ERROR`]: error,
42
- [`${name}_PENDING`]: false,
43
- };
44
- tree.batchUpdate(() => errorPatch);
45
- }
46
- else if ('$' in tree) {
47
- try {
48
- tree['$'][`${name}_ERROR`]?.set?.(error);
49
- tree['$'][`${name}_PENDING`]?.set?.(false);
50
- }
51
- catch (e) {
52
- void e;
53
- }
54
- }
55
- throw error;
31
+ }
32
+ return result;
33
+ } catch (error) {
34
+ if (typeof tree.batchUpdate === 'function') {
35
+ const errorPatch = {
36
+ [`${name}_ERROR`]: error,
37
+ [`${name}_PENDING`]: false
38
+ };
39
+ tree.batchUpdate(() => errorPatch);
40
+ } else if ('$' in tree) {
41
+ try {
42
+ tree['$'][`${name}_ERROR`]?.set?.(error);
43
+ tree['$'][`${name}_PENDING`]?.set?.(false);
44
+ } catch (e) {
56
45
  }
57
- };
46
+ }
47
+ throw error;
48
+ }
49
+ };
58
50
  }
59
- export function trackAsync(operation) {
60
- const pending = signal(false);
61
- const error = signal(null);
62
- const result = signal(null);
63
- return {
64
- pending: pending.asReadonly(),
65
- error: error.asReadonly(),
66
- result: result.asReadonly(),
67
- execute: async () => {
68
- pending.set(true);
69
- error.set(null);
70
- try {
71
- const res = await operation();
72
- result.set(res);
73
- return res;
74
- }
75
- catch (e) {
76
- const err = e instanceof Error ? e : new Error(String(e));
77
- error.set(err);
78
- throw err;
79
- }
80
- finally {
81
- pending.set(false);
82
- }
83
- },
84
- };
51
+ function trackAsync(operation) {
52
+ const pending = signal(false);
53
+ const error = signal(null);
54
+ const result = signal(null);
55
+ return {
56
+ pending: pending.asReadonly(),
57
+ error: error.asReadonly(),
58
+ result: result.asReadonly(),
59
+ execute: async () => {
60
+ pending.set(true);
61
+ error.set(null);
62
+ try {
63
+ const res = await operation();
64
+ result.set(res);
65
+ return res;
66
+ } catch (e) {
67
+ const err = e instanceof Error ? e : new Error(String(e));
68
+ error.set(err);
69
+ throw err;
70
+ } finally {
71
+ pending.set(false);
72
+ }
73
+ }
74
+ };
85
75
  }
76
+
77
+ export { createAsyncOperation, trackAsync };
@@ -1,179 +1,136 @@
1
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
- });
2
+ 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
+ } else {
10
+ const action = 'UPDATE';
11
+ const currentState = originalTreeCall();
12
+ const treeMiddlewares = middlewareMap.get(tree) || [];
13
+ let updateResult;
14
+ if (args.length === 1) {
15
+ const arg = args[0];
16
+ if (typeof arg === 'function') {
17
+ updateResult = arg(currentState);
18
+ } else {
19
+ updateResult = arg;
20
+ }
21
+ } else {
22
+ return;
59
23
  }
60
- if ('$' in tree) {
61
- Object.defineProperty(enhancedTree, '$', {
62
- value: tree['$'],
63
- enumerable: false,
64
- configurable: true,
65
- });
24
+ for (const middleware of treeMiddlewares) {
25
+ if (middleware.before && !middleware.before(action, updateResult, currentState)) {
26
+ return;
27
+ }
66
28
  }
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
- };
29
+ const previousState = currentState;
30
+ if (args.length === 1) {
31
+ const arg = args[0];
32
+ if (typeof arg === 'function') {
33
+ originalTreeCall(arg);
34
+ } else {
35
+ originalTreeCall(arg);
36
+ }
105
37
  }
106
- const originalDestroy = tree.destroy;
107
- enhancedTree.destroy = () => {
108
- middlewareMap.delete(tree);
109
- if (originalDestroy) {
110
- originalDestroy.call(tree);
111
- }
112
- };
113
- return enhancedTree;
38
+ const newState = originalTreeCall();
39
+ for (const middleware of treeMiddlewares) {
40
+ if (middleware.after) {
41
+ middleware.after(action, updateResult, previousState, newState);
42
+ }
43
+ }
44
+ }
114
45
  };
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
- },
46
+ Object.setPrototypeOf(enhancedTree, Object.getPrototypeOf(tree));
47
+ Object.assign(enhancedTree, tree);
48
+ if ('state' in tree) {
49
+ Object.defineProperty(enhancedTree, 'state', {
50
+ value: tree.state,
51
+ enumerable: false,
52
+ configurable: true
53
+ });
54
+ }
55
+ if ('$' in tree) {
56
+ Object.defineProperty(enhancedTree, '$', {
57
+ value: tree['$'],
58
+ enumerable: false,
59
+ configurable: true
60
+ });
61
+ }
62
+ enhancedTree.addTap = middleware => {
63
+ const treeMiddlewares = middlewareMap.get(tree) || [];
64
+ const existingIndex = treeMiddlewares.findIndex(m => m.id === middleware.id);
65
+ if (existingIndex >= 0) {
66
+ treeMiddlewares[existingIndex] = middleware;
67
+ } else {
68
+ treeMiddlewares.push(middleware);
69
+ }
70
+ middlewareMap.set(tree, treeMiddlewares);
129
71
  };
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
- },
72
+ enhancedTree.removeTap = id => {
73
+ const treeMiddlewares = middlewareMap.get(tree) || [];
74
+ const filtered = treeMiddlewares.filter(m => m.id !== id);
75
+ middlewareMap.set(tree, filtered);
152
76
  };
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);
77
+ const originalBatchUpdate = tree.batchUpdate;
78
+ if (originalBatchUpdate) {
79
+ enhancedTree.batchUpdate = updater => {
80
+ const action = 'BATCH_UPDATE';
81
+ const currentState = originalTreeCall();
82
+ const updateResult = updater(currentState);
83
+ const treeMiddlewares = middlewareMap.get(tree) || [];
84
+ for (const middleware of treeMiddlewares) {
85
+ if (middleware.before && !middleware.before(action, updateResult, currentState)) {
86
+ return;
87
+ }
160
88
  }
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
- },
89
+ const previousState = currentState;
90
+ originalBatchUpdate.call(tree, updater);
91
+ const newState = originalTreeCall();
92
+ for (const middleware of treeMiddlewares) {
93
+ if (middleware.after) {
94
+ middleware.after(action, updateResult, previousState, newState);
95
+ }
96
+ }
97
+ };
98
+ }
99
+ const originalDestroy = tree.destroy;
100
+ enhancedTree.destroy = () => {
101
+ middlewareMap.delete(tree);
102
+ if (originalDestroy) {
103
+ originalDestroy.call(tree);
104
+ }
178
105
  };
106
+ return enhancedTree;
107
+ };
108
+ }
109
+ function createLoggingMiddleware(treeName) {
110
+ return {
111
+ id: 'logging',
112
+ before: (action, payload, state) => {
113
+ console.group(`🏪 ${treeName}: ${action}`);
114
+ console.log('Previous state:', state);
115
+ console.log('Payload:', typeof payload === 'function' ? 'Function' : payload);
116
+ return true;
117
+ },
118
+ after: (action, payload, state, newState) => {
119
+ console.log('New state:', newState);
120
+ console.groupEnd();
121
+ }
122
+ };
123
+ }
124
+ function createValidationMiddleware(validator) {
125
+ return {
126
+ id: 'validation',
127
+ after: (action, payload, state, newState) => {
128
+ const error = validator(newState);
129
+ if (error) {
130
+ console.error(`Validation failed after ${action}:`, error);
131
+ }
132
+ }
133
+ };
179
134
  }
135
+
136
+ export { createLoggingMiddleware, createValidationMiddleware, withMiddleware };
@@ -1,77 +1,88 @@
1
- import { composeEnhancers } from '../../../lib/utils';
2
- import { withBatching, withHighPerformanceBatching } from '../../batching/lib/batching';
3
- import { withDevTools } from '../../devtools/lib/devtools';
4
- import { withHighPerformanceMemoization, withMemoization } from '../../memoization/lib/memoization';
5
- import { withMiddleware } from '../../middleware/lib/middleware';
6
- import { withTimeTravel } from '../../time-travel/lib/time-travel';
7
- export const TREE_PRESETS = {
8
- basic: {
9
- batchUpdates: false,
10
- useMemoization: false,
11
- trackPerformance: false,
12
- enableTimeTravel: false,
13
- enableDevTools: false,
14
- debugMode: false,
15
- },
16
- performance: {
17
- batchUpdates: true,
18
- useMemoization: true,
19
- trackPerformance: false,
20
- enableTimeTravel: false,
21
- enableDevTools: false,
22
- debugMode: false,
23
- useShallowComparison: true,
24
- maxCacheSize: 200,
25
- },
26
- development: {
27
- batchUpdates: true,
28
- useMemoization: true,
29
- trackPerformance: true,
30
- enableTimeTravel: true,
31
- enableDevTools: true,
32
- debugMode: true,
33
- maxCacheSize: 100,
34
- },
35
- production: {
36
- batchUpdates: true,
37
- useMemoization: true,
38
- trackPerformance: false,
39
- enableTimeTravel: false,
40
- enableDevTools: false,
41
- debugMode: false,
42
- useShallowComparison: true,
43
- maxCacheSize: 200,
44
- },
1
+ import { composeEnhancers } from '../../../lib/utils.js';
2
+ import { withHighPerformanceBatching, withBatching } from '../../batching/lib/batching.js';
3
+ import { withDevTools } from '../../devtools/lib/devtools.js';
4
+ import { withHighPerformanceMemoization, withMemoization } from '../../memoization/lib/memoization.js';
5
+ import { withMiddleware } from '../../middleware/lib/middleware.js';
6
+ import { withTimeTravel } from '../../time-travel/lib/time-travel.js';
7
+
8
+ const TREE_PRESETS = {
9
+ basic: {
10
+ batchUpdates: false,
11
+ useMemoization: false,
12
+ trackPerformance: false,
13
+ enableTimeTravel: false,
14
+ enableDevTools: false,
15
+ debugMode: false
16
+ },
17
+ performance: {
18
+ batchUpdates: true,
19
+ useMemoization: true,
20
+ trackPerformance: false,
21
+ enableTimeTravel: false,
22
+ enableDevTools: false,
23
+ debugMode: false,
24
+ useShallowComparison: true,
25
+ maxCacheSize: 200
26
+ },
27
+ development: {
28
+ batchUpdates: true,
29
+ useMemoization: true,
30
+ trackPerformance: true,
31
+ enableTimeTravel: true,
32
+ enableDevTools: true,
33
+ debugMode: true,
34
+ maxCacheSize: 100
35
+ },
36
+ production: {
37
+ batchUpdates: true,
38
+ useMemoization: true,
39
+ trackPerformance: false,
40
+ enableTimeTravel: false,
41
+ enableDevTools: false,
42
+ debugMode: false,
43
+ useShallowComparison: true,
44
+ maxCacheSize: 200
45
+ }
45
46
  };
46
- export function createPresetConfig(preset, overrides = {}) {
47
- const baseConfig = TREE_PRESETS[preset];
48
- return {
49
- ...baseConfig,
50
- ...overrides,
51
- };
52
- }
53
- export function validatePreset(preset) {
54
- if (!TREE_PRESETS[preset]) {
55
- throw new Error(`Invalid preset: ${preset}. Valid presets are: ${Object.keys(TREE_PRESETS).join(', ')}`);
56
- }
57
- return true;
47
+ function createPresetConfig(preset, overrides = {}) {
48
+ const baseConfig = TREE_PRESETS[preset];
49
+ return {
50
+ ...baseConfig,
51
+ ...overrides
52
+ };
58
53
  }
59
- export function getAvailablePresets() {
60
- return Object.keys(TREE_PRESETS);
54
+ function validatePreset(preset) {
55
+ if (!TREE_PRESETS[preset]) {
56
+ throw new Error(`Invalid preset: ${preset}. Valid presets are: ${Object.keys(TREE_PRESETS).join(', ')}`);
57
+ }
58
+ return true;
61
59
  }
62
- export function combinePresets(presets, overrides = {}) {
63
- let combined = {};
64
- for (const preset of presets) {
65
- validatePreset(preset);
66
- combined = { ...combined, ...TREE_PRESETS[preset] };
67
- }
68
- return { ...combined, ...overrides };
60
+ function getAvailablePresets() {
61
+ return Object.keys(TREE_PRESETS);
69
62
  }
70
- export function createDevTree(overrides = {}) {
71
- const config = createPresetConfig('development', overrides);
72
- const composed = composeEnhancers(withBatching(), withHighPerformanceBatching(), withMemoization(), withHighPerformanceMemoization(), withMiddleware(), withTimeTravel(), withDevTools({ treeName: config.treeName ?? 'SignalTree Dev' }));
73
- return {
74
- config,
75
- enhancer: composed,
63
+ function combinePresets(presets, overrides = {}) {
64
+ let combined = {};
65
+ for (const preset of presets) {
66
+ validatePreset(preset);
67
+ combined = {
68
+ ...combined,
69
+ ...TREE_PRESETS[preset]
76
70
  };
71
+ }
72
+ return {
73
+ ...combined,
74
+ ...overrides
75
+ };
76
+ }
77
+ function createDevTree(overrides = {}) {
78
+ const config = createPresetConfig('development', overrides);
79
+ const composed = composeEnhancers(withBatching(), withHighPerformanceBatching(), withMemoization(), withHighPerformanceMemoization(), withMiddleware(), withTimeTravel(), withDevTools({
80
+ treeName: config.treeName ?? 'SignalTree Dev'
81
+ }));
82
+ return {
83
+ config,
84
+ enhancer: composed
85
+ };
77
86
  }
87
+
88
+ export { TREE_PRESETS, combinePresets, createDevTree, createPresetConfig, getAvailablePresets, validatePreset };
@@ -1,14 +1,15 @@
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',
1
+ 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
+ CIRCULAR: '§c'
14
13
  };
14
+
15
+ export { TYPE_MARKERS };