@signaltree/core 1.0.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 +7 -0
- package/fesm2022/signaltree-core.mjs +465 -0
- package/fesm2022/signaltree-core.mjs.map +1 -0
- package/index.d.ts +269 -0
- package/package.json +23 -0
package/README.md
ADDED
|
@@ -0,0 +1,465 @@
|
|
|
1
|
+
import { signal, isSignal, computed, effect, inject, DestroyRef } from '@angular/core';
|
|
2
|
+
|
|
3
|
+
// Path parsing cache for performance optimization
|
|
4
|
+
const pathCache = new Map();
|
|
5
|
+
/**
|
|
6
|
+
* Enhanced equality function inspired by the monolithic implementation.
|
|
7
|
+
* Uses deep equality for arrays and objects, === for primitives.
|
|
8
|
+
* More efficient than lodash while maintaining compatibility.
|
|
9
|
+
*/
|
|
10
|
+
function equal(a, b) {
|
|
11
|
+
// Fast path for reference equality
|
|
12
|
+
if (a === b)
|
|
13
|
+
return true;
|
|
14
|
+
// Handle null/undefined cases
|
|
15
|
+
if (a == null || b == null)
|
|
16
|
+
return a === b;
|
|
17
|
+
// Handle arrays with deep comparison
|
|
18
|
+
if (Array.isArray(a) && Array.isArray(b)) {
|
|
19
|
+
if (a.length !== b.length)
|
|
20
|
+
return false;
|
|
21
|
+
return a.every((item, index) => equal(item, b[index]));
|
|
22
|
+
}
|
|
23
|
+
// Handle objects with deep comparison
|
|
24
|
+
if (typeof a === 'object' && typeof b === 'object') {
|
|
25
|
+
const keysA = Object.keys(a);
|
|
26
|
+
const keysB = Object.keys(b);
|
|
27
|
+
if (keysA.length !== keysB.length)
|
|
28
|
+
return false;
|
|
29
|
+
return keysA.every((key) => keysB.includes(key) &&
|
|
30
|
+
equal(a[key], b[key]));
|
|
31
|
+
}
|
|
32
|
+
// Fallback to strict equality
|
|
33
|
+
return a === b;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Creates a terminal signal with the enhanced equality function.
|
|
37
|
+
* This should be used instead of Angular's signal() when you want
|
|
38
|
+
* the same deep equality behavior as signalTree.
|
|
39
|
+
*
|
|
40
|
+
* Inspired by the monolithic implementation's terminal signal creation.
|
|
41
|
+
*/
|
|
42
|
+
function terminalSignal(value, customEqual) {
|
|
43
|
+
return signal(value, {
|
|
44
|
+
equal: customEqual || equal,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Parses a dot-notation path into an array of keys with memoization.
|
|
49
|
+
* Critical for performance when accessing nested properties frequently.
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```typescript
|
|
53
|
+
* const keys1 = parsePath('user.name'); // Splits and caches
|
|
54
|
+
* const keys2 = parsePath('user.name'); // Returns cached result
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
function parsePath(path) {
|
|
58
|
+
if (!pathCache.has(path)) {
|
|
59
|
+
pathCache.set(path, path.split('.'));
|
|
60
|
+
}
|
|
61
|
+
const cached = pathCache.get(path);
|
|
62
|
+
return cached ?? path.split('.');
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Creates a lazy signal tree using Proxy for on-demand signal creation.
|
|
66
|
+
* Only creates signals when properties are first accessed, providing
|
|
67
|
+
* massive memory savings for large state objects.
|
|
68
|
+
*
|
|
69
|
+
* @param obj - Source object to lazily signalify
|
|
70
|
+
* @param equalityFn - Equality function for signal comparison
|
|
71
|
+
* @param basePath - Base path for nested objects (internal use)
|
|
72
|
+
* @returns Proxied object that creates signals on first access
|
|
73
|
+
*/
|
|
74
|
+
function createLazySignalTree(obj, equalityFn, basePath = '') {
|
|
75
|
+
const signalCache = new Map();
|
|
76
|
+
const nestedProxies = new Map();
|
|
77
|
+
return new Proxy(obj, {
|
|
78
|
+
get(target, prop) {
|
|
79
|
+
// Handle symbol properties (like Symbol.iterator) normally
|
|
80
|
+
if (typeof prop === 'symbol') {
|
|
81
|
+
return target[prop];
|
|
82
|
+
}
|
|
83
|
+
const key = prop;
|
|
84
|
+
const path = basePath ? `${basePath}.${key}` : key;
|
|
85
|
+
const value = target[key];
|
|
86
|
+
// If it's already a signal, return it
|
|
87
|
+
if (isSignal(value)) {
|
|
88
|
+
return value;
|
|
89
|
+
}
|
|
90
|
+
// Check if we already have a signal for this path
|
|
91
|
+
if (signalCache.has(path)) {
|
|
92
|
+
return signalCache.get(path);
|
|
93
|
+
}
|
|
94
|
+
// Check if we have a nested proxy cached
|
|
95
|
+
if (nestedProxies.has(path)) {
|
|
96
|
+
return nestedProxies.get(path);
|
|
97
|
+
}
|
|
98
|
+
// Handle nested objects - create lazy proxy
|
|
99
|
+
if (value &&
|
|
100
|
+
typeof value === 'object' &&
|
|
101
|
+
!Array.isArray(value) &&
|
|
102
|
+
!isSignal(value)) {
|
|
103
|
+
const nestedProxy = createLazySignalTree(value, equalityFn, path);
|
|
104
|
+
nestedProxies.set(path, nestedProxy);
|
|
105
|
+
return nestedProxy;
|
|
106
|
+
}
|
|
107
|
+
// Create signal for primitive values and arrays
|
|
108
|
+
const newSignal = signal(value, ...(ngDevMode ? [{ debugName: "newSignal", equal: equalityFn }] : [{ equal: equalityFn }]));
|
|
109
|
+
signalCache.set(path, newSignal);
|
|
110
|
+
return newSignal;
|
|
111
|
+
},
|
|
112
|
+
set(target, prop, value) {
|
|
113
|
+
if (typeof prop === 'symbol') {
|
|
114
|
+
target[prop] = value;
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
const key = prop;
|
|
118
|
+
const path = basePath ? `${basePath}.${key}` : key;
|
|
119
|
+
// Update the original object
|
|
120
|
+
target[key] = value;
|
|
121
|
+
// If we have a cached signal, update it
|
|
122
|
+
const cachedSignal = signalCache.get(path);
|
|
123
|
+
if (cachedSignal) {
|
|
124
|
+
cachedSignal.set(value);
|
|
125
|
+
}
|
|
126
|
+
// Clear nested proxy cache if the value type changed
|
|
127
|
+
if (nestedProxies.has(path)) {
|
|
128
|
+
nestedProxies.delete(path);
|
|
129
|
+
}
|
|
130
|
+
return true;
|
|
131
|
+
},
|
|
132
|
+
has(target, prop) {
|
|
133
|
+
return prop in target;
|
|
134
|
+
},
|
|
135
|
+
ownKeys(target) {
|
|
136
|
+
return Reflect.ownKeys(target);
|
|
137
|
+
},
|
|
138
|
+
getOwnPropertyDescriptor(target, prop) {
|
|
139
|
+
return Reflect.getOwnPropertyDescriptor(target, prop);
|
|
140
|
+
},
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Native deep equality check for arrays and objects.
|
|
145
|
+
* Handles all common cases that lodash.isEqual handles for our use cases.
|
|
146
|
+
*/
|
|
147
|
+
function deepEqual(a, b) {
|
|
148
|
+
// Same reference or primitives
|
|
149
|
+
if (a === b)
|
|
150
|
+
return true;
|
|
151
|
+
// Handle null/undefined
|
|
152
|
+
if (a == null || b == null)
|
|
153
|
+
return false;
|
|
154
|
+
// Different types
|
|
155
|
+
if (typeof a !== typeof b)
|
|
156
|
+
return false;
|
|
157
|
+
// Handle dates
|
|
158
|
+
if (a instanceof Date && b instanceof Date) {
|
|
159
|
+
return a.getTime() === b.getTime();
|
|
160
|
+
}
|
|
161
|
+
// Handle arrays
|
|
162
|
+
if (Array.isArray(a) && Array.isArray(b)) {
|
|
163
|
+
if (a.length !== b.length)
|
|
164
|
+
return false;
|
|
165
|
+
for (let i = 0; i < a.length; i++) {
|
|
166
|
+
if (!deepEqual(a[i], b[i]))
|
|
167
|
+
return false;
|
|
168
|
+
}
|
|
169
|
+
return true;
|
|
170
|
+
}
|
|
171
|
+
// Handle objects (but not arrays, dates, or other special objects)
|
|
172
|
+
if (typeof a === 'object' &&
|
|
173
|
+
typeof b === 'object' &&
|
|
174
|
+
!Array.isArray(a) &&
|
|
175
|
+
!Array.isArray(b) &&
|
|
176
|
+
!(a instanceof Date) &&
|
|
177
|
+
!(b instanceof Date)) {
|
|
178
|
+
const objA = a;
|
|
179
|
+
const objB = b;
|
|
180
|
+
const keysA = Object.keys(objA);
|
|
181
|
+
const keysB = Object.keys(objB);
|
|
182
|
+
if (keysA.length !== keysB.length)
|
|
183
|
+
return false;
|
|
184
|
+
for (const key of keysA) {
|
|
185
|
+
if (!(key in objB))
|
|
186
|
+
return false;
|
|
187
|
+
if (!deepEqual(objA[key], objB[key]))
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
return true;
|
|
191
|
+
}
|
|
192
|
+
// For all other cases (primitives that aren't equal)
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Shallow equality check for objects and arrays.
|
|
197
|
+
*/
|
|
198
|
+
function shallowEqual(a, b) {
|
|
199
|
+
if (a === b)
|
|
200
|
+
return true;
|
|
201
|
+
if (a == null || b == null)
|
|
202
|
+
return false;
|
|
203
|
+
if (Array.isArray(a) && Array.isArray(b)) {
|
|
204
|
+
if (a.length !== b.length)
|
|
205
|
+
return false;
|
|
206
|
+
for (let i = 0; i < a.length; i++) {
|
|
207
|
+
if (a[i] !== b[i])
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
return true;
|
|
211
|
+
}
|
|
212
|
+
if (typeof a === 'object' && typeof b === 'object') {
|
|
213
|
+
const keysA = Object.keys(a);
|
|
214
|
+
const keysB = Object.keys(b);
|
|
215
|
+
if (keysA.length !== keysB.length)
|
|
216
|
+
return false;
|
|
217
|
+
for (const key of keysA) {
|
|
218
|
+
if (a[key] !==
|
|
219
|
+
b[key])
|
|
220
|
+
return false;
|
|
221
|
+
}
|
|
222
|
+
return true;
|
|
223
|
+
}
|
|
224
|
+
return false;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Creates an equality function based on configuration.
|
|
229
|
+
*/
|
|
230
|
+
function createEqualityFn(useShallowComparison) {
|
|
231
|
+
return useShallowComparison ? Object.is : equal;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Core function to create a basic SignalTree.
|
|
235
|
+
* This provides the minimal functionality without advanced features.
|
|
236
|
+
*/
|
|
237
|
+
function create(obj, config = {}) {
|
|
238
|
+
const equalityFn = createEqualityFn(config.useShallowComparison ?? false);
|
|
239
|
+
const useLazy = config.useLazySignals ?? true; // Default to lazy loading
|
|
240
|
+
// Choose between lazy and eager signal creation
|
|
241
|
+
const signalState = useLazy
|
|
242
|
+
? createLazySignalTree(obj, equalityFn)
|
|
243
|
+
: createEagerSignalsFromObject(obj, equalityFn);
|
|
244
|
+
const resultTree = {
|
|
245
|
+
state: signalState,
|
|
246
|
+
$: signalState, // $ points to the same state object
|
|
247
|
+
};
|
|
248
|
+
enhanceTreeBasic(resultTree);
|
|
249
|
+
return resultTree;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Creates eager signals from an object (non-lazy approach).
|
|
253
|
+
*/
|
|
254
|
+
function createEagerSignalsFromObject(obj, equalityFn) {
|
|
255
|
+
const result = {};
|
|
256
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
257
|
+
const isObj = (v) => typeof v === 'object' && v !== null;
|
|
258
|
+
if (isObj(value) && !Array.isArray(value) && !isSignal(value)) {
|
|
259
|
+
// For nested objects, create nested signal structure directly
|
|
260
|
+
result[key] = createEagerSignalsFromObject(value, equalityFn);
|
|
261
|
+
}
|
|
262
|
+
else if (isSignal(value)) {
|
|
263
|
+
result[key] = value;
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
result[key] = signal(value, {
|
|
267
|
+
equal: equalityFn,
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
return result;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Enhances a tree with basic functionality (unwrap, update, pipe).
|
|
275
|
+
*/
|
|
276
|
+
function enhanceTreeBasic(tree) {
|
|
277
|
+
tree.unwrap = () => {
|
|
278
|
+
// Recursively unwrap with proper typing
|
|
279
|
+
const unwrapObject = (obj) => {
|
|
280
|
+
const result = {};
|
|
281
|
+
for (const key in obj) {
|
|
282
|
+
const value = obj[key];
|
|
283
|
+
if (isSignal(value)) {
|
|
284
|
+
result[key] = value();
|
|
285
|
+
}
|
|
286
|
+
else if (typeof value === 'object' &&
|
|
287
|
+
value !== null &&
|
|
288
|
+
!Array.isArray(value)) {
|
|
289
|
+
// Nested signal state
|
|
290
|
+
result[key] = unwrapObject(value);
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
result[key] = value;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
return result;
|
|
297
|
+
};
|
|
298
|
+
return unwrapObject(tree.state);
|
|
299
|
+
};
|
|
300
|
+
tree.update = (updater) => {
|
|
301
|
+
const currentValue = tree.unwrap();
|
|
302
|
+
const partialObj = updater(currentValue);
|
|
303
|
+
// Recursively update with better typing
|
|
304
|
+
const updateObject = (target, updates) => {
|
|
305
|
+
for (const key in updates) {
|
|
306
|
+
if (!Object.prototype.hasOwnProperty.call(updates, key))
|
|
307
|
+
continue;
|
|
308
|
+
const updateValue = updates[key];
|
|
309
|
+
const currentSignalOrState = target[key];
|
|
310
|
+
if (isSignal(currentSignalOrState)) {
|
|
311
|
+
// Direct signal update
|
|
312
|
+
currentSignalOrState.set(updateValue);
|
|
313
|
+
}
|
|
314
|
+
else if (typeof updateValue === 'object' &&
|
|
315
|
+
updateValue !== null &&
|
|
316
|
+
!Array.isArray(updateValue) &&
|
|
317
|
+
typeof currentSignalOrState === 'object' &&
|
|
318
|
+
currentSignalOrState !== null) {
|
|
319
|
+
// Nested object - recurse
|
|
320
|
+
updateObject(currentSignalOrState, updateValue);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
};
|
|
324
|
+
updateObject(tree.state, partialObj);
|
|
325
|
+
};
|
|
326
|
+
// Pipe implementation for function composition with improved type safety
|
|
327
|
+
tree.pipe = ((...fns // eslint-disable-line @typescript-eslint/no-explicit-any
|
|
328
|
+
) => {
|
|
329
|
+
// eslint-disable-line @typescript-eslint/no-explicit-any
|
|
330
|
+
if (fns.length === 0) {
|
|
331
|
+
return tree;
|
|
332
|
+
}
|
|
333
|
+
// Type-safe reduce - the return type is determined by the overload signature
|
|
334
|
+
return fns.reduce((acc, fn) => fn(acc), tree);
|
|
335
|
+
});
|
|
336
|
+
// Stub implementations for advanced features (will log warnings)
|
|
337
|
+
tree.batchUpdate = (updater) => {
|
|
338
|
+
console.warn('⚠️ batchUpdate() called but batching is not enabled.', '\nTo enable batch updates, install @signaltree/batching');
|
|
339
|
+
// Fallback: Just call update directly
|
|
340
|
+
tree.update(updater);
|
|
341
|
+
};
|
|
342
|
+
tree.memoize = (fn, cacheKey) => {
|
|
343
|
+
console.warn('⚠️ memoize() called but memoization is not enabled.', '\nTo enable memoized computations, install @signaltree/memoization');
|
|
344
|
+
// Fallback: Use simple Angular computed without memoization
|
|
345
|
+
void cacheKey; // Mark as intentionally unused
|
|
346
|
+
return computed(() => fn(tree.unwrap()));
|
|
347
|
+
};
|
|
348
|
+
tree.effect = (fn) => {
|
|
349
|
+
try {
|
|
350
|
+
effect(() => fn(tree.unwrap()));
|
|
351
|
+
}
|
|
352
|
+
catch (error) {
|
|
353
|
+
// Fallback for test environments without injection context
|
|
354
|
+
console.warn('Effect requires Angular injection context', error);
|
|
355
|
+
}
|
|
356
|
+
};
|
|
357
|
+
tree.subscribe = (fn) => {
|
|
358
|
+
try {
|
|
359
|
+
const destroyRef = inject(DestroyRef);
|
|
360
|
+
let isDestroyed = false;
|
|
361
|
+
const effectRef = effect(() => {
|
|
362
|
+
if (!isDestroyed) {
|
|
363
|
+
fn(tree.unwrap());
|
|
364
|
+
}
|
|
365
|
+
}, ...(ngDevMode ? [{ debugName: "effectRef" }] : []));
|
|
366
|
+
const unsubscribe = () => {
|
|
367
|
+
isDestroyed = true;
|
|
368
|
+
effectRef.destroy();
|
|
369
|
+
};
|
|
370
|
+
destroyRef.onDestroy(unsubscribe);
|
|
371
|
+
return unsubscribe;
|
|
372
|
+
}
|
|
373
|
+
catch (error) {
|
|
374
|
+
// Fallback for test environment - call once immediately
|
|
375
|
+
console.warn('Subscribe requires Angular injection context', error);
|
|
376
|
+
fn(tree.unwrap());
|
|
377
|
+
return () => {
|
|
378
|
+
// No-op unsubscribe
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
};
|
|
382
|
+
// Stub implementations for performance features
|
|
383
|
+
tree.optimize = () => {
|
|
384
|
+
console.warn('⚠️ optimize() called but tree optimization is not available.', '\nTo enable optimization, install @signaltree/memoization');
|
|
385
|
+
};
|
|
386
|
+
tree.clearCache = () => {
|
|
387
|
+
console.warn('⚠️ clearCache() called but caching is not available.', '\nTo enable caching, install @signaltree/memoization');
|
|
388
|
+
};
|
|
389
|
+
tree.invalidatePattern = () => {
|
|
390
|
+
console.warn('⚠️ invalidatePattern() called but performance optimization is not enabled.', '\nTo enable pattern invalidation, install @signaltree/memoization');
|
|
391
|
+
return 0;
|
|
392
|
+
};
|
|
393
|
+
tree.destroy = () => {
|
|
394
|
+
// Basic cleanup for non-enhanced trees
|
|
395
|
+
console.log('[MEMORY-CLEANUP] Basic tree destroyed');
|
|
396
|
+
};
|
|
397
|
+
tree.getMetrics = () => {
|
|
398
|
+
console.warn('⚠️ getMetrics() called but performance tracking is not enabled.', '\nTo enable performance tracking, install @signaltree/middleware');
|
|
399
|
+
// Return minimal metrics when tracking not enabled
|
|
400
|
+
return {
|
|
401
|
+
updates: 0,
|
|
402
|
+
computations: 0,
|
|
403
|
+
cacheHits: 0,
|
|
404
|
+
cacheMisses: 0,
|
|
405
|
+
averageUpdateTime: 0,
|
|
406
|
+
};
|
|
407
|
+
};
|
|
408
|
+
// Stub implementations for middleware
|
|
409
|
+
tree.addTap = (middleware) => {
|
|
410
|
+
console.warn('⚠️ addTap() called but middleware support is not available.', '\nTo enable middleware, install @signaltree/middleware');
|
|
411
|
+
void middleware; // Mark as intentionally unused
|
|
412
|
+
};
|
|
413
|
+
tree.removeTap = (id) => {
|
|
414
|
+
console.warn('⚠️ removeTap() called but middleware support is not available.', '\nTo enable middleware, install @signaltree/middleware');
|
|
415
|
+
void id; // Mark as intentionally unused
|
|
416
|
+
};
|
|
417
|
+
// Stub implementations for entity helpers
|
|
418
|
+
tree.asCrud = () => {
|
|
419
|
+
console.warn('⚠️ asCrud() called but entity helpers are not available.', '\nTo enable entity helpers, install @signaltree/entities');
|
|
420
|
+
return {};
|
|
421
|
+
};
|
|
422
|
+
// Stub implementations for async actions
|
|
423
|
+
tree.asyncAction = (operation, config = {}) => {
|
|
424
|
+
console.warn('⚠️ asyncAction() called but async actions are not available.', '\nTo enable async actions, install @signaltree/async');
|
|
425
|
+
void operation;
|
|
426
|
+
void config;
|
|
427
|
+
return {};
|
|
428
|
+
};
|
|
429
|
+
// Stub implementations for time travel
|
|
430
|
+
tree.undo = () => {
|
|
431
|
+
console.warn('⚠️ undo() called but time travel is not available.', '\nTo enable time travel, install @signaltree/time-travel');
|
|
432
|
+
};
|
|
433
|
+
tree.redo = () => {
|
|
434
|
+
console.warn('⚠️ redo() called but time travel is not available.', '\nTo enable time travel, install @signaltree/time-travel');
|
|
435
|
+
};
|
|
436
|
+
tree.getHistory = () => {
|
|
437
|
+
console.warn('⚠️ getHistory() called but time travel is not available.', '\nTo enable time travel, install @signaltree/time-travel');
|
|
438
|
+
return [];
|
|
439
|
+
};
|
|
440
|
+
tree.resetHistory = () => {
|
|
441
|
+
console.warn('⚠️ resetHistory() called but time travel is not available.', '\nTo enable time travel, install @signaltree/time-travel');
|
|
442
|
+
};
|
|
443
|
+
return tree;
|
|
444
|
+
}
|
|
445
|
+
/**
|
|
446
|
+
* Implementation of the signalTree factory function.
|
|
447
|
+
*/
|
|
448
|
+
function signalTree(obj, configOrPreset) {
|
|
449
|
+
// Handle preset strings
|
|
450
|
+
if (typeof configOrPreset === 'string') {
|
|
451
|
+
console.warn('⚠️ Preset configurations are not available in @signaltree/core.', '\nTo use presets, install @signaltree/presets');
|
|
452
|
+
// Fallback to basic configuration
|
|
453
|
+
return create(obj, {});
|
|
454
|
+
}
|
|
455
|
+
// Handle configuration objects or default (smart enhancement)
|
|
456
|
+
const config = configOrPreset || {};
|
|
457
|
+
return create(obj, config);
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
/**
|
|
461
|
+
* Generated bundle index. Do not edit.
|
|
462
|
+
*/
|
|
463
|
+
|
|
464
|
+
export { createLazySignalTree, deepEqual, equal, parsePath, shallowEqual, signalTree, terminalSignal };
|
|
465
|
+
//# sourceMappingURL=signaltree-core.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signaltree-core.mjs","sources":["../tmp-esm2022/lib/utils.js","../tmp-esm2022/lib/signal-tree.js","../tmp-esm2022/signaltree-core.js"],"sourcesContent":["import { signal, isSignal } from '@angular/core';\n// Path parsing cache for performance optimization\nconst pathCache = new Map();\n/**\n * Enhanced equality function inspired by the monolithic implementation.\n * Uses deep equality for arrays and objects, === for primitives.\n * More efficient than lodash while maintaining compatibility.\n */\nexport function equal(a, b) {\n // Fast path for reference equality\n if (a === b)\n return true;\n // Handle null/undefined cases\n if (a == null || b == null)\n return a === b;\n // Handle arrays with deep comparison\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length)\n return false;\n return a.every((item, index) => equal(item, b[index]));\n }\n // Handle objects with deep comparison\n if (typeof a === 'object' && typeof b === 'object') {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length)\n return false;\n return keysA.every((key) => keysB.includes(key) &&\n equal(a[key], b[key]));\n }\n // Fallback to strict equality\n return a === b;\n}\n/**\n * Creates a terminal signal with the enhanced equality function.\n * This should be used instead of Angular's signal() when you want\n * the same deep equality behavior as signalTree.\n *\n * Inspired by the monolithic implementation's terminal signal creation.\n */\nexport function terminalSignal(value, customEqual) {\n return signal(value, {\n equal: customEqual || equal,\n });\n}\n/**\n * Parses a dot-notation path into an array of keys with memoization.\n * Critical for performance when accessing nested properties frequently.\n *\n * @example\n * ```typescript\n * const keys1 = parsePath('user.name'); // Splits and caches\n * const keys2 = parsePath('user.name'); // Returns cached result\n * ```\n */\nexport function parsePath(path) {\n if (!pathCache.has(path)) {\n pathCache.set(path, path.split('.'));\n }\n const cached = pathCache.get(path);\n return cached ?? path.split('.');\n}\n/**\n * Creates a lazy signal tree using Proxy for on-demand signal creation.\n * Only creates signals when properties are first accessed, providing\n * massive memory savings for large state objects.\n *\n * @param obj - Source object to lazily signalify\n * @param equalityFn - Equality function for signal comparison\n * @param basePath - Base path for nested objects (internal use)\n * @returns Proxied object that creates signals on first access\n */\nexport function createLazySignalTree(obj, equalityFn, basePath = '') {\n const signalCache = new Map();\n const nestedProxies = new Map();\n return new Proxy(obj, {\n get(target, prop) {\n // Handle symbol properties (like Symbol.iterator) normally\n if (typeof prop === 'symbol') {\n return target[prop];\n }\n const key = prop;\n const path = basePath ? `${basePath}.${key}` : key;\n const value = target[key];\n // If it's already a signal, return it\n if (isSignal(value)) {\n return value;\n }\n // Check if we already have a signal for this path\n if (signalCache.has(path)) {\n return signalCache.get(path);\n }\n // Check if we have a nested proxy cached\n if (nestedProxies.has(path)) {\n return nestedProxies.get(path);\n }\n // Handle nested objects - create lazy proxy\n if (value &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n !isSignal(value)) {\n const nestedProxy = createLazySignalTree(value, equalityFn, path);\n nestedProxies.set(path, nestedProxy);\n return nestedProxy;\n }\n // Create signal for primitive values and arrays\n const newSignal = signal(value, ...(ngDevMode ? [{ debugName: \"newSignal\", equal: equalityFn }] : [{ equal: equalityFn }]));\n signalCache.set(path, newSignal);\n return newSignal;\n },\n set(target, prop, value) {\n if (typeof prop === 'symbol') {\n target[prop] = value;\n return true;\n }\n const key = prop;\n const path = basePath ? `${basePath}.${key}` : key;\n // Update the original object\n target[key] = value;\n // If we have a cached signal, update it\n const cachedSignal = signalCache.get(path);\n if (cachedSignal) {\n cachedSignal.set(value);\n }\n // Clear nested proxy cache if the value type changed\n if (nestedProxies.has(path)) {\n nestedProxies.delete(path);\n }\n return true;\n },\n has(target, prop) {\n return prop in target;\n },\n ownKeys(target) {\n return Reflect.ownKeys(target);\n },\n getOwnPropertyDescriptor(target, prop) {\n return Reflect.getOwnPropertyDescriptor(target, prop);\n },\n });\n}\n/**\n * Native deep equality check for arrays and objects.\n * Handles all common cases that lodash.isEqual handles for our use cases.\n */\nexport function deepEqual(a, b) {\n // Same reference or primitives\n if (a === b)\n return true;\n // Handle null/undefined\n if (a == null || b == null)\n return false;\n // Different types\n if (typeof a !== typeof b)\n return false;\n // Handle dates\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n // Handle arrays\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length)\n return false;\n for (let i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], b[i]))\n return false;\n }\n return true;\n }\n // Handle objects (but not arrays, dates, or other special objects)\n if (typeof a === 'object' &&\n typeof b === 'object' &&\n !Array.isArray(a) &&\n !Array.isArray(b) &&\n !(a instanceof Date) &&\n !(b instanceof Date)) {\n const objA = a;\n const objB = b;\n const keysA = Object.keys(objA);\n const keysB = Object.keys(objB);\n if (keysA.length !== keysB.length)\n return false;\n for (const key of keysA) {\n if (!(key in objB))\n return false;\n if (!deepEqual(objA[key], objB[key]))\n return false;\n }\n return true;\n }\n // For all other cases (primitives that aren't equal)\n return false;\n}\n/**\n * Shallow equality check for objects and arrays.\n */\nexport function shallowEqual(a, b) {\n if (a === b)\n return true;\n if (a == null || b == null)\n return false;\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length)\n return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i])\n return false;\n }\n return true;\n }\n if (typeof a === 'object' && typeof b === 'object') {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length)\n return false;\n for (const key of keysA) {\n if (a[key] !==\n b[key])\n return false;\n }\n return true;\n }\n return false;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9saWIvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBa0IsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR2pFLGtEQUFrRDtBQUNsRCxNQUFNLFNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBb0IsQ0FBQztBQUU5Qzs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLEtBQUssQ0FBSSxDQUFJLEVBQUUsQ0FBSTtJQUNqQyxtQ0FBbUM7SUFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRXpCLDhCQUE4QjtJQUM5QixJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUk7UUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFM0MscUNBQXFDO0lBQ3JDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxNQUFNO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDeEMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxzQ0FBc0M7SUFDdEMsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDbkQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUE0QixDQUFDLENBQUM7UUFDeEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFD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QUFDLEdBQUcsQ0FBQztnQkFFbkMsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNpZ25hbCwgV3JpdGFibGVTaWduYWwsIGlzU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSB7IERlZXBTaWduYWxpZnkgfSBmcm9tICcuL3R5cGVzJztcblxuLy8gUGF0aCBwYXJzaW5nIGNhY2hlIGZvciBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25cbmNvbnN0IHBhdGhDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcblxuLyoqXG4gKiBFbmhhbmNlZCBlcXVhbGl0eSBmdW5jdGlvbiBpbnNwaXJlZCBieSB0aGUgbW9ub2xpdGhpYyBpbXBsZW1lbnRhdGlvbi5cbiAqIFVzZXMgZGVlcCBlcXVhbGl0eSBmb3IgYXJyYXlzIGFuZCBvYmplY3RzLCA9PT0gZm9yIHByaW1pdGl2ZXMuXG4gKiBNb3JlIGVmZmljaWVudCB0aGFuIGxvZGFzaCB3aGlsZSBtYWludGFpbmluZyBjb21wYXRpYmlsaXR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXF1YWw8VD4oYTogVCwgYjogVCk6IGJvb2xlYW4ge1xuICAvLyBGYXN0IHBhdGggZm9yIHJlZmVyZW5jZSBlcXVhbGl0eVxuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XG5cbiAgLy8gSGFuZGxlIG51bGwvdW5kZWZpbmVkIGNhc2VzXG4gIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSByZXR1cm4gYSA9PT0gYjtcblxuICAvLyBIYW5kbGUgYXJyYXlzIHdpdGggZGVlcCBjb21wYXJpc29uXG4gIGlmIChBcnJheS5pc0FycmF5KGEpICYmIEFycmF5LmlzQXJyYXkoYikpIHtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGEuZXZlcnkoKGl0ZW0sIGluZGV4KSA9PiBlcXVhbChpdGVtLCBiW2luZGV4XSkpO1xuICB9XG5cbiAgLy8gSGFuZGxlIG9iamVjdHMgd2l0aCBkZWVwIGNvbXBhcmlzb25cbiAgaWYgKHR5cGVvZiBhID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgYiA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBrZXlzQSA9IE9iamVjdC5rZXlzKGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIGNvbnN0IGtleXNCID0gT2JqZWN0LmtleXMoYiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG5cbiAgICBpZiAoa2V5c0EubGVuZ3RoICE9PSBrZXlzQi5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiBrZXlzQS5ldmVyeShcbiAgICAgIChrZXkpID0+XG4gICAgICAgIGtleXNCLmluY2x1ZGVzKGtleSkgJiZcbiAgICAgICAgZXF1YWwoXG4gICAgICAgICAgKGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0sXG4gICAgICAgICAgKGIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV1cbiAgICAgICAgKVxuICAgICk7XG4gIH1cblxuICAvLyBGYWxsYmFjayB0byBzdHJpY3QgZXF1YWxpdHlcbiAgcmV0dXJuIGEgPT09IGI7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHRlcm1pbmFsIHNpZ25hbCB3aXRoIHRoZSBlbmhhbmNlZCBlcXVhbGl0eSBmdW5jdGlvbi5cbiAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZiBBbmd1bGFyJ3Mgc2lnbmFsKCkgd2hlbiB5b3Ugd2FudFxuICogdGhlIHNhbWUgZGVlcCBlcXVhbGl0eSBiZWhhdmlvciBhcyBzaWduYWxUcmVlLlxuICpcbiAqIEluc3BpcmVkIGJ5IHRoZSBtb25vbGl0aGljIGltcGxlbWVudGF0aW9uJ3MgdGVybWluYWwgc2lnbmFsIGNyZWF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdGVybWluYWxTaWduYWw8VD4oXG4gIHZhbHVlOiBULFxuICBjdXN0b21FcXVhbD86IChhOiBULCBiOiBUKSA9PiBib29sZWFuXG4pOiBXcml0YWJsZVNpZ25hbDxUPiB7XG4gIHJldHVybiBzaWduYWwodmFsdWUsIHtcbiAgICBlcXVhbDogY3VzdG9tRXF1YWwgfHwgZXF1YWwsXG4gIH0pO1xufVxuXG4vKipcbiAqIFBhcnNlcyBhIGRvdC1ub3RhdGlvbiBwYXRoIGludG8gYW4gYXJyYXkgb2Yga2V5cyB3aXRoIG1lbW9pemF0aW9uLlxuICogQ3JpdGljYWwgZm9yIHBlcmZvcm1hbmNlIHdoZW4gYWNjZXNzaW5nIG5lc3RlZCBwcm9wZXJ0aWVzIGZyZXF1ZW50bHkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGtleXMxID0gcGFyc2VQYXRoKCd1c2VyLm5hbWUnKTsgLy8gU3BsaXRzIGFuZCBjYWNoZXNcbiAqIGNvbnN0IGtleXMyID0gcGFyc2VQYXRoKCd1c2VyLm5hbWUnKTsgLy8gUmV0dXJucyBjYWNoZWQgcmVzdWx0XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUGF0aChwYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGlmICghcGF0aENhY2hlLmhhcyhwYXRoKSkge1xuICAgIHBhdGhDYWNoZS5zZXQocGF0aCwgcGF0aC5zcGxpdCgnLicpKTtcbiAgfVxuICBjb25zdCBjYWNoZWQgPSBwYXRoQ2FjaGUuZ2V0KHBhdGgpO1xuICByZXR1cm4gY2FjaGVkID8/IHBhdGguc3BsaXQoJy4nKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbGF6eSBzaWduYWwgdHJlZSB1c2luZyBQcm94eSBmb3Igb24tZGVtYW5kIHNpZ25hbCBjcmVhdGlvbi5cbiAqIE9ubHkgY3JlYXRlcyBzaWduYWxzIHdoZW4gcHJvcGVydGllcyBhcmUgZmlyc3QgYWNjZXNzZWQsIHByb3ZpZGluZ1xuICogbWFzc2l2ZSBtZW1vcnkgc2F2aW5ncyBmb3IgbGFyZ2Ugc3RhdGUgb2JqZWN0cy5cbiAqXG4gKiBAcGFyYW0gb2JqIC0gU291cmNlIG9iamVjdCB0byBsYXppbHkgc2lnbmFsaWZ5XG4gKiBAcGFyYW0gZXF1YWxpdHlGbiAtIEVxdWFsaXR5IGZ1bmN0aW9uIGZvciBzaWduYWwgY29tcGFyaXNvblxuICogQHBhcmFtIGJhc2VQYXRoIC0gQmFzZSBwYXRoIGZvciBuZXN0ZWQgb2JqZWN0cyAoaW50ZXJuYWwgdXNlKVxuICogQHJldHVybnMgUHJveGllZCBvYmplY3QgdGhhdCBjcmVhdGVzIHNpZ25hbHMgb24gZmlyc3QgYWNjZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMYXp5U2lnbmFsVHJlZTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICBvYmo6IFQsXG4gIGVxdWFsaXR5Rm46IChhOiB1bmtub3duLCBiOiB1bmtub3duKSA9PiBib29sZWFuLFxuICBiYXNlUGF0aCA9ICcnXG4pOiBEZWVwU2lnbmFsaWZ5PFQ+IHtcbiAgY29uc3Qgc2lnbmFsQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgV3JpdGFibGVTaWduYWw8dW5rbm93bj4+KCk7XG4gIGNvbnN0IG5lc3RlZFByb3hpZXMgPSBuZXcgTWFwPHN0cmluZywgdW5rbm93bj4oKTtcblxuICByZXR1cm4gbmV3IFByb3h5KG9iaiwge1xuICAgIGdldCh0YXJnZXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wpIHtcbiAgICAgIC8vIEhhbmRsZSBzeW1ib2wgcHJvcGVydGllcyAobGlrZSBTeW1ib2wuaXRlcmF0b3IpIG5vcm1hbGx5XG4gICAgICBpZiAodHlwZW9mIHByb3AgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgIHJldHVybiAodGFyZ2V0IGFzIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIHVua25vd24+KVtwcm9wXTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qga2V5ID0gcHJvcCBhcyBzdHJpbmc7XG4gICAgICBjb25zdCBwYXRoID0gYmFzZVBhdGggPyBgJHtiYXNlUGF0aH0uJHtrZXl9YCA6IGtleTtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGFyZ2V0W2tleV07XG5cbiAgICAgIC8vIElmIGl0J3MgYWxyZWFkeSBhIHNpZ25hbCwgcmV0dXJuIGl0XG4gICAgICBpZiAoaXNTaWduYWwodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIGEgc2lnbmFsIGZvciB0aGlzIHBhdGhcbiAgICAgIGlmIChzaWduYWxDYWNoZS5oYXMocGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIHNpZ25hbENhY2hlLmdldChwYXRoKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhIG5lc3RlZCBwcm94eSBjYWNoZWRcbiAgICAgIGlmIChuZXN0ZWRQcm94aWVzLmhhcyhwYXRoKSkge1xuICAgICAgICByZXR1cm4gbmVzdGVkUHJveGllcy5nZXQocGF0aCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBuZXN0ZWQgb2JqZWN0cyAtIGNyZWF0ZSBsYXp5IHByb3h5XG4gICAgICBpZiAoXG4gICAgICAgIHZhbHVlICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICAgICAgICFpc1NpZ25hbCh2YWx1ZSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBuZXN0ZWRQcm94eSA9IGNyZWF0ZUxhenlTaWduYWxUcmVlKFxuICAgICAgICAgIHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgIGVxdWFsaXR5Rm4sXG4gICAgICAgICAgcGF0aFxuICAgICAgICApO1xuICAgICAgICBuZXN0ZWRQcm94aWVzLnNldChwYXRoLCBuZXN0ZWRQcm94eSk7XG4gICAgICAgIHJldHVybiBuZXN0ZWRQcm94eTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIHNpZ25hbCBmb3IgcHJpbWl0aXZlIHZhbHVlcyBhbmQgYXJyYXlzXG4gICAgICBjb25zdCBuZXdTaWduYWwgPSBzaWduYWwodmFsdWUsIHsgZXF1YWw6IGVxdWFsaXR5Rm4gfSk7XG4gICAgICBzaWduYWxDYWNoZS5zZXQocGF0aCwgbmV3U2lnbmFsKTtcbiAgICAgIHJldHVybiBuZXdTaWduYWw7XG4gICAgfSxcblxuICAgIHNldChcbiAgICAgIHRhcmdldDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICBwcm9wOiBzdHJpbmcgfCBzeW1ib2wsXG4gICAgICB2YWx1ZTogdW5rbm93blxuICAgICkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3ltYm9sJykge1xuICAgICAgICAodGFyZ2V0IGFzIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIHVua25vd24+KVtwcm9wXSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qga2V5ID0gcHJvcCBhcyBzdHJpbmc7XG4gICAgICBjb25zdCBwYXRoID0gYmFzZVBhdGggPyBgJHtiYXNlUGF0aH0uJHtrZXl9YCA6IGtleTtcblxuICAgICAgLy8gVXBkYXRlIHRoZSBvcmlnaW5hbCBvYmplY3RcbiAgICAgIHRhcmdldFtrZXldID0gdmFsdWU7XG5cbiAgICAgIC8vIElmIHdlIGhhdmUgYSBjYWNoZWQgc2lnbmFsLCB1cGRhdGUgaXRcbiAgICAgIGNvbnN0IGNhY2hlZFNpZ25hbCA9IHNpZ25hbENhY2hlLmdldChwYXRoKTtcbiAgICAgIGlmIChjYWNoZWRTaWduYWwpIHtcbiAgICAgICAgY2FjaGVkU2lnbmFsLnNldCh2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIENsZWFyIG5lc3RlZCBwcm94eSBjYWNoZSBpZiB0aGUgdmFsdWUgdHlwZSBjaGFuZ2VkXG4gICAgICBpZiAobmVzdGVkUHJveGllcy5oYXMocGF0aCkpIHtcbiAgICAgICAgbmVzdGVkUHJveGllcy5kZWxldGUocGF0aCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG5cbiAgICBoYXModGFyZ2V0LCBwcm9wKSB7XG4gICAgICByZXR1cm4gcHJvcCBpbiB0YXJnZXQ7XG4gICAgfSxcblxuICAgIG93bktleXModGFyZ2V0KSB7XG4gICAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKHRhcmdldCk7XG4gICAgfSxcblxuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHByb3ApIHtcbiAgICAgIHJldHVybiBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHByb3ApO1xuICAgIH0sXG4gIH0pIGFzIERlZXBTaWduYWxpZnk8VD47XG59XG5cbi8qKlxuICogTmF0aXZlIGRlZXAgZXF1YWxpdHkgY2hlY2sgZm9yIGFycmF5cyBhbmQgb2JqZWN0cy5cbiAqIEhhbmRsZXMgYWxsIGNvbW1vbiBjYXNlcyB0aGF0IGxvZGFzaC5pc0VxdWFsIGhhbmRsZXMgZm9yIG91ciB1c2UgY2FzZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWVwRXF1YWw8VD4oYTogVCwgYjogVCk6IGJvb2xlYW4ge1xuICAvLyBTYW1lIHJlZmVyZW5jZSBvciBwcmltaXRpdmVzXG4gIGlmIChhID09PSBiKSByZXR1cm4gdHJ1ZTtcblxuICAvLyBIYW5kbGUgbnVsbC91bmRlZmluZWRcbiAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICAvLyBEaWZmZXJlbnQgdHlwZXNcbiAgaWYgKHR5cGVvZiBhICE9PSB0eXBlb2YgYikgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIEhhbmRsZSBkYXRlc1xuICBpZiAoYSBpbnN0YW5jZW9mIERhdGUgJiYgYiBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gYS5nZXRUaW1lKCkgPT09IGIuZ2V0VGltZSgpO1xuICB9XG5cbiAgLy8gSGFuZGxlIGFycmF5c1xuICBpZiAoQXJyYXkuaXNBcnJheShhKSAmJiBBcnJheS5pc0FycmF5KGIpKSB7XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFkZWVwRXF1YWwoYVtpXSwgYltpXSkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBIYW5kbGUgb2JqZWN0cyAoYnV0IG5vdCBhcnJheXMsIGRhdGVzLCBvciBvdGhlciBzcGVjaWFsIG9iamVjdHMpXG4gIGlmIChcbiAgICB0eXBlb2YgYSA9PT0gJ29iamVjdCcgJiZcbiAgICB0eXBlb2YgYiA9PT0gJ29iamVjdCcgJiZcbiAgICAhQXJyYXkuaXNBcnJheShhKSAmJlxuICAgICFBcnJheS5pc0FycmF5KGIpICYmXG4gICAgIShhIGluc3RhbmNlb2YgRGF0ZSkgJiZcbiAgICAhKGIgaW5zdGFuY2VvZiBEYXRlKVxuICApIHtcbiAgICBjb25zdCBvYmpBID0gYSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBvYmpCID0gYiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBrZXlzQSA9IE9iamVjdC5rZXlzKG9iakEpO1xuICAgIGNvbnN0IGtleXNCID0gT2JqZWN0LmtleXMob2JqQik7XG5cbiAgICBpZiAoa2V5c0EubGVuZ3RoICE9PSBrZXlzQi5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXNBKSB7XG4gICAgICBpZiAoIShrZXkgaW4gb2JqQikpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICghZGVlcEVxdWFsKG9iakFba2V5XSwgb2JqQltrZXldKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIEZvciBhbGwgb3RoZXIgY2FzZXMgKHByaW1pdGl2ZXMgdGhhdCBhcmVuJ3QgZXF1YWwpXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBTaGFsbG93IGVxdWFsaXR5IGNoZWNrIGZvciBvYmplY3RzIGFuZCBhcnJheXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaGFsbG93RXF1YWw8VD4oYTogVCwgYjogVCk6IGJvb2xlYW4ge1xuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XG4gIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoYSkgJiYgQXJyYXkuaXNBcnJheShiKSkge1xuICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhW2ldICE9PSBiW2ldKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBhID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgYiA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBrZXlzQSA9IE9iamVjdC5rZXlzKGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIGNvbnN0IGtleXNCID0gT2JqZWN0LmtleXMoYiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG5cbiAgICBpZiAoa2V5c0EubGVuZ3RoICE9PSBrZXlzQi5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXNBKSB7XG4gICAgICBpZiAoXG4gICAgICAgIChhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldICE9PVxuICAgICAgICAoYiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XVxuICAgICAgKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuIl19","import { signal, computed, effect, inject, DestroyRef, isSignal, } from '@angular/core';\nimport { createLazySignalTree, equal } from './utils';\n/**\n * Creates an equality function based on configuration.\n */\nfunction createEqualityFn(useShallowComparison) {\n return useShallowComparison ? Object.is : equal;\n}\n/**\n * Core function to create a basic SignalTree.\n * This provides the minimal functionality without advanced features.\n */\nfunction create(obj, config = {}) {\n const equalityFn = createEqualityFn(config.useShallowComparison ?? false);\n const useLazy = config.useLazySignals ?? true; // Default to lazy loading\n // Choose between lazy and eager signal creation\n const signalState = useLazy\n ? createLazySignalTree(obj, equalityFn)\n : createEagerSignalsFromObject(obj, equalityFn);\n const resultTree = {\n state: signalState,\n $: signalState, // $ points to the same state object\n };\n enhanceTreeBasic(resultTree);\n return resultTree;\n}\n/**\n * Creates eager signals from an object (non-lazy approach).\n */\nfunction createEagerSignalsFromObject(obj, equalityFn) {\n const result = {};\n for (const [key, value] of Object.entries(obj)) {\n const isObj = (v) => typeof v === 'object' && v !== null;\n if (isObj(value) && !Array.isArray(value) && !isSignal(value)) {\n // For nested objects, create nested signal structure directly\n result[key] = createEagerSignalsFromObject(value, equalityFn);\n }\n else if (isSignal(value)) {\n result[key] = value;\n }\n else {\n result[key] = signal(value, {\n equal: equalityFn,\n });\n }\n }\n return result;\n}\n/**\n * Enhances a tree with basic functionality (unwrap, update, pipe).\n */\nfunction enhanceTreeBasic(tree) {\n tree.unwrap = () => {\n // Recursively unwrap with proper typing\n const unwrapObject = (obj) => {\n const result = {};\n for (const key in obj) {\n const value = obj[key];\n if (isSignal(value)) {\n result[key] = value();\n }\n else if (typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value)) {\n // Nested signal state\n result[key] = unwrapObject(value);\n }\n else {\n result[key] = value;\n }\n }\n return result;\n };\n return unwrapObject(tree.state);\n };\n tree.update = (updater) => {\n const currentValue = tree.unwrap();\n const partialObj = updater(currentValue);\n // Recursively update with better typing\n const updateObject = (target, updates) => {\n for (const key in updates) {\n if (!Object.prototype.hasOwnProperty.call(updates, key))\n continue;\n const updateValue = updates[key];\n const currentSignalOrState = target[key];\n if (isSignal(currentSignalOrState)) {\n // Direct signal update\n currentSignalOrState.set(updateValue);\n }\n else if (typeof updateValue === 'object' &&\n updateValue !== null &&\n !Array.isArray(updateValue) &&\n typeof currentSignalOrState === 'object' &&\n currentSignalOrState !== null) {\n // Nested object - recurse\n updateObject(currentSignalOrState, updateValue);\n }\n }\n };\n updateObject(tree.state, partialObj);\n };\n // Pipe implementation for function composition with improved type safety\n tree.pipe = ((...fns // eslint-disable-line @typescript-eslint/no-explicit-any\n ) => {\n // eslint-disable-line @typescript-eslint/no-explicit-any\n if (fns.length === 0) {\n return tree;\n }\n // Type-safe reduce - the return type is determined by the overload signature\n return fns.reduce((acc, fn) => fn(acc), tree);\n });\n // Stub implementations for advanced features (will log warnings)\n tree.batchUpdate = (updater) => {\n console.warn('⚠️ batchUpdate() called but batching is not enabled.', '\\nTo enable batch updates, install @signaltree/batching');\n // Fallback: Just call update directly\n tree.update(updater);\n };\n tree.memoize = (fn, cacheKey) => {\n console.warn('⚠️ memoize() called but memoization is not enabled.', '\\nTo enable memoized computations, install @signaltree/memoization');\n // Fallback: Use simple Angular computed without memoization\n void cacheKey; // Mark as intentionally unused\n return computed(() => fn(tree.unwrap()));\n };\n tree.effect = (fn) => {\n try {\n effect(() => fn(tree.unwrap()));\n }\n catch (error) {\n // Fallback for test environments without injection context\n console.warn('Effect requires Angular injection context', error);\n }\n };\n tree.subscribe = (fn) => {\n try {\n const destroyRef = inject(DestroyRef);\n let isDestroyed = false;\n const effectRef = effect(() => {\n if (!isDestroyed) {\n fn(tree.unwrap());\n }\n }, ...(ngDevMode ? [{ debugName: \"effectRef\" }] : []));\n const unsubscribe = () => {\n isDestroyed = true;\n effectRef.destroy();\n };\n destroyRef.onDestroy(unsubscribe);\n return unsubscribe;\n }\n catch (error) {\n // Fallback for test environment - call once immediately\n console.warn('Subscribe requires Angular injection context', error);\n fn(tree.unwrap());\n return () => {\n // No-op unsubscribe\n };\n }\n };\n // Stub implementations for performance features\n tree.optimize = () => {\n console.warn('⚠️ optimize() called but tree optimization is not available.', '\\nTo enable optimization, install @signaltree/memoization');\n };\n tree.clearCache = () => {\n console.warn('⚠️ clearCache() called but caching is not available.', '\\nTo enable caching, install @signaltree/memoization');\n };\n tree.invalidatePattern = () => {\n console.warn('⚠️ invalidatePattern() called but performance optimization is not enabled.', '\\nTo enable pattern invalidation, install @signaltree/memoization');\n return 0;\n };\n tree.destroy = () => {\n // Basic cleanup for non-enhanced trees\n console.log('[MEMORY-CLEANUP] Basic tree destroyed');\n };\n tree.getMetrics = () => {\n console.warn('⚠️ getMetrics() called but performance tracking is not enabled.', '\\nTo enable performance tracking, install @signaltree/middleware');\n // Return minimal metrics when tracking not enabled\n return {\n updates: 0,\n computations: 0,\n cacheHits: 0,\n cacheMisses: 0,\n averageUpdateTime: 0,\n };\n };\n // Stub implementations for middleware\n tree.addTap = (middleware) => {\n console.warn('⚠️ addTap() called but middleware support is not available.', '\\nTo enable middleware, install @signaltree/middleware');\n void middleware; // Mark as intentionally unused\n };\n tree.removeTap = (id) => {\n console.warn('⚠️ removeTap() called but middleware support is not available.', '\\nTo enable middleware, install @signaltree/middleware');\n void id; // Mark as intentionally unused\n };\n // Stub implementations for entity helpers\n tree.asCrud = () => {\n console.warn('⚠️ asCrud() called but entity helpers are not available.', '\\nTo enable entity helpers, install @signaltree/entities');\n return {};\n };\n // Stub implementations for async actions\n tree.asyncAction = (operation, config = {}) => {\n console.warn('⚠️ asyncAction() called but async actions are not available.', '\\nTo enable async actions, install @signaltree/async');\n void operation;\n void config;\n return {};\n };\n // Stub implementations for time travel\n tree.undo = () => {\n console.warn('⚠️ undo() called but time travel is not available.', '\\nTo enable time travel, install @signaltree/time-travel');\n };\n tree.redo = () => {\n console.warn('⚠️ redo() called but time travel is not available.', '\\nTo enable time travel, install @signaltree/time-travel');\n };\n tree.getHistory = () => {\n console.warn('⚠️ getHistory() called but time travel is not available.', '\\nTo enable time travel, install @signaltree/time-travel');\n return [];\n };\n tree.resetHistory = () => {\n console.warn('⚠️ resetHistory() called but time travel is not available.', '\\nTo enable time travel, install @signaltree/time-travel');\n };\n return tree;\n}\n/**\n * Implementation of the signalTree factory function.\n */\nexport function signalTree(obj, configOrPreset) {\n // Handle preset strings\n if (typeof configOrPreset === 'string') {\n console.warn('⚠️ Preset configurations are not available in @signaltree/core.', '\\nTo use presets, install @signaltree/presets');\n // Fallback to basic configuration\n return create(obj, {});\n }\n // Handle configuration objects or default (smart enhancement)\n const config = configOrPreset || {};\n return create(obj, config);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsLXRyZWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9saWIvc2lnbmFsLXRyZWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLE1BQU0sRUFHTixRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sRUFDTixVQUFVLEVBQ1YsUUFBUSxHQUNULE1BQU0sZUFBZSxDQUFDO0FBY3ZCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFdEQ7O0dBRUc7QUFDSCxTQUFTLGdCQUFnQixDQUFDLG9CQUE2QjtJQUNyRCxPQUFPLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDbEQsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsTUFBTSxDQUNiLEdBQU0sRUFDTixTQUFxQixFQUFFO0lBRXZCLE1BQU0sVUFBVSxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsSUFBSSxLQUFLLENBQUMsQ0FBQztJQUMxRSxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxDQUFDLDBCQUEwQjtJQUV6RSxnREFBZ0Q7SUFDaEQsTUFBTSxXQUFXLEdBQUcsT0FBTztRQUN6QixDQUFDLENBQUMsb0JBQW9CLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQztRQUN2QyxDQUFDLENBQUMsNEJBQTRCLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBRWxELE1BQU0sVUFBVSxHQUFHO1FBQ2pCLEtBQUssRUFBRSxXQUFXO1FBQ2xCLENBQUMsRUFBRSxXQUFXLEVBQUUsb0NBQW9DO0tBQ3BDLENBQUM7SUFFbkIsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDN0IsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQztBQUVEOztHQUVHO0FB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ZixPQUFPLENBQUMsSUFBSSxDQUNWLG9EQUFvRCxFQUNwRCwwREFBMEQsQ0FDM0QsQ0FBQztJQUNKLENBQUMsQ0FBQztJQUVGLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxFQUFFO1FBQ2YsT0FBTyxDQUFDLElBQUksQ0FDVixvREFBb0QsRUFDcEQsMERBQTBELENBQzNELENBQUM7SUFDSixDQUFDLENBQUM7SUFFRixJQUFJLENBQUMsVUFBVSxHQUFHLEdBQXlCLEVBQUU7UUFDM0MsT0FBTyxDQUFDLElBQUksQ0FDViwwREFBMEQsRUFDMUQsMERBQTBELENBQzNELENBQUM7UUFDRixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUMsQ0FBQztJQUVGLElBQUksQ0FBQyxZQUFZLEdBQUcsR0FBRyxFQUFFO1FBQ3ZCLE9BQU8sQ0FBQyxJQUFJLENBQ1YsNERBQTRELEVBQzVELDBEQUEwRCxDQUMzRCxDQUFDO0lBQ0osQ0FBQyxDQUFDO0lBRUYsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBMEZEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FDeEIsR0FBTSxFQUNOLGNBQXdDO0lBRXhDLHdCQUF3QjtJQUN4QixJQUFJLE9BQU8sY0FBYyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3ZDLE9BQU8sQ0FBQyxJQUFJLENBQ1YsaUVBQWlFLEVBQ2pFLCtDQUErQyxDQUNoRCxDQUFDO1FBQ0Ysa0NBQWtDO1FBQ2xDLE9BQU8sTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQsOERBQThEO0lBQzlELE1BQU0sTUFBTSxHQUFHLGNBQWMsSUFBSSxFQUFFLENBQUM7SUFDcEMsT0FBTyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBzaWduYWwsXG4gIFdyaXRhYmxlU2lnbmFsLFxuICBTaWduYWwsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIGluamVjdCxcbiAgRGVzdHJveVJlZixcbiAgaXNTaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHR5cGUge1xuICBTaWduYWxUcmVlLFxuICBEZWVwU2lnbmFsaWZ5LFxuICBUcmVlQ29uZmlnLFxuICBUcmVlUHJlc2V0LFxuICBNaWRkbGV3YXJlLFxuICBQZXJmb3JtYW5jZU1ldHJpY3MsXG4gIEVudGl0eUhlbHBlcnMsXG4gIEFzeW5jQWN0aW9uQ29uZmlnLFxuICBBc3luY0FjdGlvbixcbiAgVGltZVRyYXZlbEVudHJ5LFxuICBTdGF0ZU9iamVjdCxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVMYXp5U2lnbmFsVHJlZSwgZXF1YWwgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGVxdWFsaXR5IGZ1bmN0aW9uIGJhc2VkIG9uIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUVxdWFsaXR5Rm4odXNlU2hhbGxvd0NvbXBhcmlzb246IGJvb2xlYW4pIHtcbiAgcmV0dXJuIHVzZVNoYWxsb3dDb21wYXJpc29uID8gT2JqZWN0LmlzIDogZXF1YWw7XG59XG5cbi8qKlxuICogQ29yZSBmdW5jdGlvbiB0byBjcmVhdGUgYSBiYXNpYyBTaWduYWxUcmVlLlxuICogVGhpcyBwcm92aWRlcyB0aGUgbWluaW1hbCBmdW5jdGlvbmFsaXR5IHdpdGhvdXQgYWR2YW5jZWQgZmVhdHVyZXMuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZTxUIGV4dGVuZHMgU3RhdGVPYmplY3Q+KFxuICBvYmo6IFQsXG4gIGNvbmZpZzogVHJlZUNvbmZpZyA9IHt9XG4pOiBTaWduYWxUcmVlPFQ+IHtcbiAgY29uc3QgZXF1YWxpdHlGbiA9IGNyZWF0ZUVxdWFsaXR5Rm4oY29uZmlnLnVzZVNoYWxsb3dDb21wYXJpc29uID8/IGZhbHNlKTtcbiAgY29uc3QgdXNlTGF6eSA9IGNvbmZpZy51c2VMYXp5U2lnbmFscyA/PyB0cnVlOyAvLyBEZWZhdWx0IHRvIGxhenkgbG9hZGluZ1xuXG4gIC8vIENob29zZSBiZXR3ZWVuIGxhenkgYW5kIGVhZ2VyIHNpZ25hbCBjcmVhdGlvblxuICBjb25zdCBzaWduYWxTdGF0ZSA9IHVzZUxhenlcbiAgICA/IGNyZWF0ZUxhenlTaWduYWxUcmVlKG9iaiwgZXF1YWxpdHlGbilcbiAgICA6IGNyZWF0ZUVhZ2VyU2lnbmFsc0Zyb21PYmplY3Qob2JqLCBlcXVhbGl0eUZuKTtcblxuICBjb25zdCByZXN1bHRUcmVlID0ge1xuICAgIHN0YXRlOiBzaWduYWxTdGF0ZSxcbiAgICAkOiBzaWduYWxTdGF0ZSwgLy8gJCBwb2ludHMgdG8gdGhlIHNhbWUgc3RhdGUgb2JqZWN0XG4gIH0gYXMgU2lnbmFsVHJlZTxUPjtcblxuICBlbmhhbmNlVHJlZUJhc2ljKHJlc3VsdFRyZWUpO1xuICByZXR1cm4gcmVzdWx0VHJlZTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGVhZ2VyIHNpZ25hbHMgZnJvbSBhbiBvYmplY3QgKG5vbi1sYXp5IGFwcHJvYWNoKS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRWFnZXJTaWduYWxzRnJvbU9iamVjdDxPIGV4dGVuZHMgU3RhdGVPYmplY3Q+KFxuICBvYmo6IE8sXG4gIGVxdWFsaXR5Rm46IChhOiB1bmtub3duLCBiOiB1bmtub3duKSA9PiBib29sZWFuXG4pOiBEZWVwU2lnbmFsaWZ5PE8+IHtcbiAgY29uc3QgcmVzdWx0ID0ge30gYXMgRGVlcFNpZ25hbGlmeTxPPjtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgY29uc3QgaXNPYmogPSAodjogdW5rbm93bik6IHYgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT5cbiAgICAgIHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsO1xuXG4gICAgaWYgKGlzT2JqKHZhbHVlKSAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgIWlzU2lnbmFsKHZhbHVlKSkge1xuICAgICAgLy8gRm9yIG5lc3RlZCBvYmplY3RzLCBjcmVhdGUgbmVzdGVkIHNpZ25hbCBzdHJ1Y3R1cmUgZGlyZWN0bHlcbiAgICAgIChyZXN1bHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gPSBjcmVhdGVFYWdlclNpZ25hbHNGcm9tT2JqZWN0KFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgZXF1YWxpdHlGblxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGlzU2lnbmFsKHZhbHVlKSkge1xuICAgICAgKHJlc3VsdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAocmVzdWx0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gc2lnbmFsKHZhbHVlLCB7XG4gICAgICAgIGVxdWFsOiBlcXVhbGl0eUZuLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBFbmhhbmNlcyBhIHRyZWUgd2l0aCBiYXNpYyBmdW5jdGlvbmFsaXR5ICh1bndyYXAsIHVwZGF0ZSwgcGlwZSkuXG4gKi9cbmZ1bmN0aW9uIGVuaGFuY2VUcmVlQmFzaWM8VCBleHRlbmRzIFN0YXRlT2JqZWN0PihcbiAgdHJlZTogU2lnbmFsVHJlZTxUPlxuKTogU2lnbmFsVHJlZTxUPiB7XG4gIHRyZWUudW53cmFwID0gKCk6IFQgPT4ge1xuICAgIC8vIFJlY3Vyc2l2ZWx5IHVud3JhcCB3aXRoIHByb3BlciB0eXBpbmdcbiAgICBjb25zdCB1bndyYXBPYmplY3QgPSA8TyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcbiAgICAgIG9iajogRGVlcFNpZ25hbGlmeTxPPlxuICAgICk6IE8gPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuXG4gICAgICAgIGlmIChpc1NpZ25hbCh2YWx1ZSkpIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9ICh2YWx1ZSBhcyBTaWduYWw8dW5rbm93bj4pKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgICAgICAgIUFycmF5LmlzQXJyYXkodmFsdWUpXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIE5lc3RlZCBzaWduYWwgc3RhdGVcbiAgICAgICAgICByZXN1bHRba2V5XSA9IHVud3JhcE9iamVjdChcbiAgICAgICAgICAgIHZhbHVlIGFzIERlZXBTaWduYWxpZnk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQgYXMgTztcbiAgICB9O1xuXG4gICAgcmV0dXJuIHVud3JhcE9iamVjdCh0cmVlLnN0YXRlIGFzIERlZXBTaWduYWxpZnk8VD4pO1xuICB9O1xuXG4gIHRyZWUudXBkYXRlID0gKHVwZGF0ZXI6IChjdXJyZW50OiBUKSA9PiBQYXJ0aWFsPFQ+KSA9PiB7XG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gdHJlZS51bndyYXAoKTtcbiAgICBjb25zdCBwYXJ0aWFsT2JqID0gdXBkYXRlcihjdXJyZW50VmFsdWUpO1xuXG4gICAgLy8gUmVjdXJzaXZlbHkgdXBkYXRlIHdpdGggYmV0dGVyIHR5cGluZ1xuICAgIGNvbnN0IHVwZGF0ZU9iamVjdCA9IDxPIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICAgICAgdGFyZ2V0OiBEZWVwU2lnbmFsaWZ5PE8+LFxuICAgICAgdXBkYXRlczogUGFydGlhbDxPPlxuICAgICk6IHZvaWQgPT4ge1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gdXBkYXRlcykge1xuICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh1cGRhdGVzLCBrZXkpKSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCB1cGRhdGVWYWx1ZSA9IHVwZGF0ZXNba2V5XTtcbiAgICAgICAgY29uc3QgY3VycmVudFNpZ25hbE9yU3RhdGUgPSAodGFyZ2V0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldO1xuXG4gICAgICAgIGlmIChpc1NpZ25hbChjdXJyZW50U2lnbmFsT3JTdGF0ZSkpIHtcbiAgICAgICAgICAvLyBEaXJlY3Qgc2lnbmFsIHVwZGF0ZVxuICAgICAgICAgIChjdXJyZW50U2lnbmFsT3JTdGF0ZSBhcyBXcml0YWJsZVNpZ25hbDx1bmtub3duPikuc2V0KHVwZGF0ZVZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICB0eXBlb2YgdXBkYXRlVmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgdXBkYXRlVmFsdWUgIT09IG51bGwgJiZcbiAgICAgICAgICAhQXJyYXkuaXNBcnJheSh1cGRhdGVWYWx1ZSkgJiZcbiAgICAgICAgICB0eXBlb2YgY3VycmVudFNpZ25hbE9yU3RhdGUgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgY3VycmVudFNpZ25hbE9yU3RhdGUgIT09IG51bGxcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gTmVzdGVkIG9iamVjdCAtIHJlY3Vyc2VcbiAgICAgICAgICB1cGRhdGVPYmplY3QoXG4gICAgICAgICAgICBjdXJyZW50U2lnbmFsT3JTdGF0ZSBhcyBEZWVwU2lnbmFsaWZ5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PixcbiAgICAgICAgICAgIHVwZGF0ZVZhbHVlIGFzIFBhcnRpYWw8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICB1cGRhdGVPYmplY3QodHJlZS5zdGF0ZSBhcyBEZWVwU2lnbmFsaWZ5PFQ+LCBwYXJ0aWFsT2JqKTtcbiAgfTtcblxuICAvLyBQaXBlIGltcGxlbWVudGF0aW9uIGZvciBmdW5jdGlvbiBjb21wb3NpdGlvbiB3aXRoIGltcHJvdmVkIHR5cGUgc2FmZXR5XG4gIHRyZWUucGlwZSA9ICgoXG4gICAgLi4uZm5zOiBBcnJheTwoaW5wdXQ6IGFueSkgPT4gYW55PiAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgKTogYW55ID0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBpZiAoZm5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRyZWU7XG4gICAgfVxuXG4gICAgLy8gVHlwZS1zYWZlIHJlZHVjZSAtIHRoZSByZXR1cm4gdHlwZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBvdmVybG9hZCBzaWduYXR1cmVcbiAgICByZXR1cm4gZm5zLnJlZHVjZSgoYWNjLCBmbikgPT4gZm4oYWNjKSwgdHJlZSk7XG4gIH0pIGFzIFNpZ25hbFRyZWU8VD5bJ3BpcGUnXTtcblxuICAvLyBTdHViIGltcGxlbWVudGF0aW9ucyBmb3IgYWR2YW5jZWQgZmVhdHVyZXMgKHdpbGwgbG9nIHdhcm5pbmdzKVxuICB0cmVlLmJhdGNoVXBkYXRlID0gKHVwZGF0ZXI6IChjdXJyZW50OiBUKSA9PiBQYXJ0aWFsPFQ+KSA9PiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ+KaoO+4jyBiYXRjaFVwZGF0ZSgpIGNhbGxlZCBidXQgYmF0Y2hpbmcgaXMgbm90IGVuYWJsZWQuJyxcbiAgICAgICdcXG5UbyBlbmFibGUgYmF0Y2ggdXBkYXRlcywgaW5zdGFsbCBAc2lnbmFsdHJlZS9iYXRjaGluZydcbiAgICApO1xuICAgIC8vIEZhbGxiYWNrOiBKdXN0IGNhbGwgdXBkYXRlIGRpcmVjdGx5XG4gICAgdHJlZS51cGRhdGUodXBkYXRlcik7XG4gIH07XG5cbiAgdHJlZS5tZW1vaXplID0gPFI+KGZuOiAodHJlZTogVCkgPT4gUiwgY2FjaGVLZXk/OiBzdHJpbmcpOiBTaWduYWw8Uj4gPT4ge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICfimqDvuI8gbWVtb2l6ZSgpIGNhbGxlZCBidXQgbWVtb2l6YXRpb24gaXMgbm90IGVuYWJsZWQuJyxcbiAgICAgICdcXG5UbyBlbmFibGUgbWVtb2l6ZWQgY29tcHV0YXRpb25zLCBpbnN0YWxsIEBzaWduYWx0cmVlL21lbW9pemF0aW9uJ1xuICAgICk7XG4gICAgLy8gRmFsbGJhY2s6IFVzZSBzaW1wbGUgQW5ndWxhciBjb21wdXRlZCB3aXRob3V0IG1lbW9pemF0aW9uXG4gICAgdm9pZCBjYWNoZUtleTsgLy8gTWFyayBhcyBpbnRlbnRpb25hbGx5IHVudXNlZFxuICAgIHJldHVybiBjb21wdXRlZCgoKSA9PiBmbih0cmVlLnVud3JhcCgpKSk7XG4gIH07XG5cbiAgdHJlZS5lZmZlY3QgPSAoZm46ICh0cmVlOiBUKSA9PiB2b2lkKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGVmZmVjdCgoKSA9PiBmbih0cmVlLnVud3JhcCgpKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEZhbGxiYWNrIGZvciB0ZXN0IGVudmlyb25tZW50cyB3aXRob3V0IGluamVjdGlvbiBjb250ZXh0XG4gICAgICBjb25zb2xlLndhcm4oJ0VmZmVjdCByZXF1aXJlcyBBbmd1bGFyIGluamVjdGlvbiBjb250ZXh0JywgZXJyb3IpO1xuICAgIH1cbiAgfTtcblxuICB0cmVlLnN1YnNjcmliZSA9IChmbjogKHRyZWU6IFQpID0+IHZvaWQpOiAoKCkgPT4gdm9pZCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICAgICAgbGV0IGlzRGVzdHJveWVkID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IGVmZmVjdFJlZiA9IGVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmICghaXNEZXN0cm95ZWQpIHtcbiAgICAgICAgICBmbih0cmVlLnVud3JhcCgpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gKCkgPT4ge1xuICAgICAgICBpc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgICAgIGVmZmVjdFJlZi5kZXN0cm95KCk7XG4gICAgICB9O1xuXG4gICAgICBkZXN0cm95UmVmLm9uRGVzdHJveSh1bnN1YnNjcmliZSk7XG4gICAgICByZXR1cm4gdW5zdWJzY3JpYmU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEZhbGxiYWNrIGZvciB0ZXN0IGVudmlyb25tZW50IC0gY2FsbCBvbmNlIGltbWVkaWF0ZWx5XG4gICAgICBjb25zb2xlLndhcm4oJ1N1YnNjcmliZSByZXF1aXJlcyBBbmd1bGFyIGluamVjdGlvbiBjb250ZXh0JywgZXJyb3IpO1xuICAgICAgZm4odHJlZS51bndyYXAoKSk7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAvLyBOby1vcCB1bnN1YnNjcmliZVxuICAgICAgfTtcbiAgICB9XG4gIH07XG5cbiAgLy8gU3R1YiBpbXBsZW1lbnRhdGlvbnMgZm9yIHBlcmZvcm1hbmNlIGZlYXR1cmVzXG4gIHRyZWUub3B0aW1pemUgPSAoKSA9PiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ+KaoO+4jyBvcHRpbWl6ZSgpIGNhbGxlZCBidXQgdHJlZSBvcHRpbWl6YXRpb24gaXMgbm90IGF2YWlsYWJsZS4nLFxuICAgICAgJ1xcblRvIGVuYWJsZSBvcHRpbWl6YXRpb24sIGluc3RhbGwgQHNpZ25hbHRyZWUvbWVtb2l6YXRpb24nXG4gICAgKTtcbiAgfTtcblxuICB0cmVlLmNsZWFyQ2FjaGUgPSAoKSA9PiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ+KaoO+4jyBjbGVhckNhY2hlKCkgY2FsbGVkIGJ1dCBjYWNoaW5nIGlzIG5vdCBhdmFpbGFibGUuJyxcbiAgICAgICdcXG5UbyBlbmFibGUgY2FjaGluZywgaW5zdGFsbCBAc2lnbmFsdHJlZS9tZW1vaXphdGlvbidcbiAgICApO1xuICB9O1xuXG4gIHRyZWUuaW52YWxpZGF0ZVBhdHRlcm4gPSAoKTogbnVtYmVyID0+IHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAn4pqg77iPIGludmFsaWRhdGVQYXR0ZXJuKCkgY2FsbGVkIGJ1dCBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gaXMgbm90IGVuYWJsZWQuJyxcbiAgICAgICdcXG5UbyBlbmFibGUgcGF0dGVybiBpbnZhbGlkYXRpb24sIGluc3RhbGwgQHNpZ25hbHRyZWUvbWVtb2l6YXRpb24nXG4gICAgKTtcbiAgICByZXR1cm4gMDtcbiAgfTtcblxuICB0cmVlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgLy8gQmFzaWMgY2xlYW51cCBmb3Igbm9uLWVuaGFuY2VkIHRyZWVzXG4gICAgY29uc29sZS5sb2coJ1tNRU1PUlktQ0xFQU5VUF0gQmFzaWMgdHJlZSBkZXN0cm95ZWQnKTtcbiAgfTtcblxuICB0cmVlLmdldE1ldHJpY3MgPSAoKTogUGVyZm9ybWFuY2VNZXRyaWNzID0+IHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAn4pqg77iPIGdldE1ldHJpY3MoKSBjYWxsZWQgYnV0IHBlcmZvcm1hbmNlIHRyYWNraW5nIGlzIG5vdCBlbmFibGVkLicsXG4gICAgICAnXFxuVG8gZW5hYmxlIHBlcmZvcm1hbmNlIHRyYWNraW5nLCBpbnN0YWxsIEBzaWduYWx0cmVlL21pZGRsZXdhcmUnXG4gICAgKTtcbiAgICAvLyBSZXR1cm4gbWluaW1hbCBtZXRyaWNzIHdoZW4gdHJhY2tpbmcgbm90IGVuYWJsZWRcbiAgICByZXR1cm4ge1xuICAgICAgdXBkYXRlczogMCxcbiAgICAgIGNvbXB1dGF0aW9uczogMCxcbiAgICAgIGNhY2hlSGl0czogMCxcbiAgICAgIGNhY2hlTWlzc2VzOiAwLFxuICAgICAgYXZlcmFnZVVwZGF0ZVRpbWU6IDAsXG4gICAgfTtcbiAgfTtcblxuICAvLyBTdHViIGltcGxlbWVudGF0aW9ucyBmb3IgbWlkZGxld2FyZVxuICB0cmVlLmFkZFRhcCA9IChtaWRkbGV3YXJlOiBNaWRkbGV3YXJlPFQ+KSA9PiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ+KaoO+4jyBhZGRUYXAoKSBjYWxsZWQgYnV0IG1pZGRsZXdhcmUgc3VwcG9ydCBpcyBub3QgYXZhaWxhYmxlLicsXG4gICAgICAnXFxuVG8gZW5hYmxlIG1pZGRsZXdhcmUsIGluc3RhbGwgQHNpZ25hbHRyZWUvbWlkZGxld2FyZSdcbiAgICApO1xuICAgIHZvaWQgbWlkZGxld2FyZTsgLy8gTWFyayBhcyBpbnRlbnRpb25hbGx5IHVudXNlZFxuICB9O1xuXG4gIHRyZWUucmVtb3ZlVGFwID0gKGlkOiBzdHJpbmcpID0+IHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAn4pqg77iPIHJlbW92ZVRhcCgpIGNhbGxlZCBidXQgbWlkZGxld2FyZSBzdXBwb3J0IGlzIG5vdCBhdmFpbGFibGUuJyxcbiAgICAgICdcXG5UbyBlbmFibGUgbWlkZGxld2FyZSwgaW5zdGFsbCBAc2lnbmFsdHJlZS9taWRkbGV3YXJlJ1xuICAgICk7XG4gICAgdm9pZCBpZDsgLy8gTWFyayBhcyBpbnRlbnRpb25hbGx5IHVudXNlZFxuICB9O1xuXG4gIC8vIFN0dWIgaW1wbGVtZW50YXRpb25zIGZvciBlbnRpdHkgaGVscGVyc1xuICB0cmVlLmFzQ3J1ZCA9IDxFIGV4dGVuZHMgeyBpZDogc3RyaW5nIHwgbnVtYmVyIH0+KCk6IEVudGl0eUhlbHBlcnM8RT4gPT4ge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICfimqDvuI8gYXNDcnVkKCkgY2FsbGVkIGJ1dCBlbnRpdHkgaGVscGVycyBhcmUgbm90IGF2YWlsYWJsZS4nLFxuICAgICAgJ1xcblRvIGVuYWJsZSBlbnRpdHkgaGVscGVycywgaW5zdGFsbCBAc2lnbmFsdHJlZS9lbnRpdGllcydcbiAgICApO1xuICAgIHJldHVybiB7fSBhcyBFbnRpdHlIZWxwZXJzPEU+O1xuICB9O1xuXG4gIC8vIFN0dWIgaW1wbGVtZW50YXRpb25zIGZvciBhc3luYyBhY3Rpb25zXG4gIHRyZWUuYXN5bmNBY3Rpb24gPSA8VElucHV0LCBUUmVzdWx0PihcbiAgICBvcGVyYXRpb246IChpbnB1dDogVElucHV0KSA9PiBQcm9taXNlPFRSZXN1bHQ+LFxuICAgIGNvbmZpZzogQXN5bmNBY3Rpb25Db25maWc8VCwgVFJlc3VsdD4gPSB7fVxuICApOiBBc3luY0FjdGlvbjxUSW5wdXQsIFRSZXN1bHQ+ID0+IHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAn4pqg77iPIGFzeW5jQWN0aW9uKCkgY2FsbGVkIGJ1dCBhc3luYyBhY3Rpb25zIGFyZSBub3QgYXZhaWxhYmxlLicsXG4gICAgICAnXFxuVG8gZW5hYmxlIGFzeW5jIGFjdGlvbnMsIGluc3RhbGwgQHNpZ25hbHRyZWUvYXN5bmMnXG4gICAgKTtcbiAgICB2b2lkIG9wZXJhdGlvbjtcbiAgICB2b2lkIGNvbmZpZztcbiAgICByZXR1cm4ge30gYXMgQXN5bmNBY3Rpb248VElucHV0LCBUUmVzdWx0PjtcbiAgfTtcblxuICAvLyBTdHViIGltcGxlbWVudGF0aW9ucyBmb3IgdGltZSB0cmF2ZWxcbiAgdHJlZS51bmRvID0gKCkgPT4ge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICfimqDvuI8gdW5kbygpIGNhbGxlZCBidXQgdGltZSB0cmF2ZWwgaXMgbm90IGF2YWlsYWJsZS4nLFxuICAgICAgJ1xcblRvIGVuYWJsZSB0aW1lIHRyYXZlbCwgaW5zdGFsbCBAc2lnbmFsdHJlZS90aW1lLXRyYXZlbCdcbiAgICApO1xuICB9O1xuXG4gIHRyZWUucmVkbyA9ICgpID0+IHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAn4pqg77iPIHJlZG8oKSBjYWxsZWQgYnV0IHRpbWUgdHJhdmVsIGlzIG5vdCBhdmFpbGFibGUuJyxcbiAgICAgICdcXG5UbyBlbmFibGUgdGltZSB0cmF2ZWwsIGluc3RhbGwgQHNpZ25hbHRyZWUvdGltZS10cmF2ZWwnXG4gICAgKTtcbiAgfTtcblxuICB0cmVlLmdldEhpc3RvcnkgPSAoKTogVGltZVRyYXZlbEVudHJ5PFQ+W10gPT4ge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICfimqDvuI8gZ2V0SGlzdG9yeSgpIGNhbGxlZCBidXQgdGltZSB0cmF2ZWwgaXMgbm90IGF2YWlsYWJsZS4nLFxuICAgICAgJ1xcblRvIGVuYWJsZSB0aW1lIHRyYXZlbCwgaW5zdGFsbCBAc2lnbmFsdHJlZS90aW1lLXRyYXZlbCdcbiAgICApO1xuICAgIHJldHVybiBbXTtcbiAgfTtcblxuICB0cmVlLnJlc2V0SGlzdG9yeSA9ICgpID0+IHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAn4pqg77iPIHJlc2V0SGlzdG9yeSgpIGNhbGxlZCBidXQgdGltZSB0cmF2ZWwgaXMgbm90IGF2YWlsYWJsZS4nLFxuICAgICAgJ1xcblRvIGVuYWJsZSB0aW1lIHRyYXZlbCwgaW5zdGFsbCBAc2lnbmFsdHJlZS90aW1lLXRyYXZlbCdcbiAgICApO1xuICB9O1xuXG4gIHJldHVybiB0cmVlO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUFVCTElDIEFQSVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBDcmVhdGVzIGEgcmVhY3RpdmUgc2lnbmFsIHRyZWUgd2l0aCBzbWFydCBwcm9ncmVzc2l2ZSBlbmhhbmNlbWVudC5cbiAqXG4gKiBGZWF0dXJlcyBhdXRvLWVuYWJsZSBvbiBmaXJzdCB1c2UuIFVzZXMgaW50ZWxsaWdlbnQgZGVmYXVsdHMgYmFzZWQgb25cbiAqIGVudmlyb25tZW50IChkZXZlbG9wbWVudCB2cyBwcm9kdWN0aW9uKS4gTm8gY29uZnVzaW5nIHdhcm5pbmdzIG9yXG4gKiBmYWtlIGltcGxlbWVudGF0aW9ucyAtIGV2ZXJ5dGhpbmcganVzdCB3b3JrcyFcbiAqXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSBzdGF0ZSBvYmplY3QgdHlwZSwgbXVzdCBleHRlbmQgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAqIEBwYXJhbSBvYmogLSBUaGUgaW5pdGlhbCBzdGF0ZSBvYmplY3QgdG8gY29udmVydCBpbnRvIGEgcmVhY3RpdmUgdHJlZVxuICogQHJldHVybnMgQSBTaWduYWxUcmVlIHdpdGggYXV0by1lbmFibGluZyBmZWF0dXJlc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCB0cmVlID0gc2lnbmFsVHJlZSh7IGNvdW50OiAwLCB1c2VyczogW10gfSk7XG4gKlxuICogLy8gQ29yZSBmdW5jdGlvbmFsaXR5IGFsd2F5cyB3b3Jrc1xuICogdHJlZS5zdGF0ZS5jb3VudC5zZXQoNSk7XG4gKiB0cmVlLnVwZGF0ZShzdGF0ZSA9PiAoeyBjb3VudDogc3RhdGUuY291bnQgKyAxIH0pKTtcbiAqXG4gKiAvLyBDb21wb3NpdGlvbiB3aXRoIHBpcGVcbiAqIHRyZWUucGlwZShcbiAqICAgd2l0aEJhdGNoaW5nKCksXG4gKiAgIHdpdGhNZW1vaXphdGlvbigpLFxuICogICB3aXRoVGltZVRyYXZlbCgpXG4gKiApO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaWduYWxUcmVlPFQgZXh0ZW5kcyBTdGF0ZU9iamVjdD4ob2JqOiBUKTogU2lnbmFsVHJlZTxUPjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgcmVhY3RpdmUgc2lnbmFsIHRyZWUgd2l0aCBwcmVzZXQgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBVc2VzIHByZWRlZmluZWQgY29uZmlndXJhdGlvbnMgZm9yIGNvbW1vbiBzY2VuYXJpb3Mgd2hpbGUgc3RpbGxcbiAqIGFsbG93aW5nIGZlYXR1cmVzIHRvIGF1dG8tZW5hYmxlIGFzIG5lZWRlZC5cbiAqXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSBzdGF0ZSBvYmplY3QgdHlwZSwgbXVzdCBleHRlbmQgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAqIEBwYXJhbSBvYmogLSBUaGUgaW5pdGlhbCBzdGF0ZSBvYmplY3QgdG8gY29udmVydCBpbnRvIGEgcmVhY3RpdmUgdHJlZVxuICogQHBhcmFtIHByZXNldCAtIFByZXNldCBjb25maWd1cmF0aW9uICgnYmFzaWMnLCAncGVyZm9ybWFuY2UnLCAnZGV2ZWxvcG1lbnQnLCAncHJvZHVjdGlvbicpXG4gKiBAcmV0dXJucyBBIFNpZ25hbFRyZWUgY29uZmlndXJlZCB3aXRoIHRoZSBzcGVjaWZpZWQgcHJlc2V0XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIE9wdGltaXplZCBmb3IgcHJvZHVjdGlvblxuICogY29uc3QgcHJvZFRyZWUgPSBzaWduYWxUcmVlKHN0YXRlLCAncHJvZHVjdGlvbicpO1xuICpcbiAqIC8vIEZ1bGwgZGVidWdnaW5nIGNhcGFiaWxpdGllc1xuICogY29uc3QgZGV2VHJlZSA9IHNpZ25hbFRyZWUoc3RhdGUsICdkZXZlbG9wbWVudCcpO1xuICpcbiAqIC8vIE1heGltdW0gcGVyZm9ybWFuY2VcbiAqIGNvbnN0IHBlcmZUcmVlID0gc2lnbmFsVHJlZShzdGF0ZSwgJ3BlcmZvcm1hbmNlJyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25hbFRyZWU8VCBleHRlbmRzIFN0YXRlT2JqZWN0PihcbiAgb2JqOiBULFxuICBwcmVzZXQ6IFRyZWVQcmVzZXRcbik6IFNpZ25hbFRyZWU8VD47XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJlYWN0aXZlIHNpZ25hbCB0cmVlIHdpdGggY3VzdG9tIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogUHJvdmlkZXMgZnVsbCBjb250cm9sIG92ZXIgZmVhdHVyZSBlbmFibGVtZW50IHdoaWxlIG1haW50YWluaW5nXG4gKiBhdXRvLWVuYWJsaW5nIGJlaGF2aW9yIGZvciB1bnNwZWNpZmllZCBmZWF0dXJlcy5cbiAqXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSBzdGF0ZSBvYmplY3QgdHlwZSwgbXVzdCBleHRlbmQgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAqIEBwYXJhbSBvYmogLSBUaGUgaW5pdGlhbCBzdGF0ZSBvYmplY3QgdG8gY29udmVydCBpbnRvIGEgcmVhY3RpdmUgdHJlZVxuICogQHBhcmFtIGNvbmZpZyAtIEN1c3RvbSBjb25maWd1cmF0aW9uIG9iamVjdFxuICogQHJldHVybnMgQSBTaWduYWxUcmVlIGNvbmZpZ3VyZWQgd2l0aCBjdXN0b20gb3B0aW9uc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDdXN0b20gY29uZmlndXJhdGlvblxuICogY29uc3QgY3VzdG9tVHJlZSA9IHNpZ25hbFRyZWUoc3RhdGUsIHtcbiAqICAgYmF0Y2hVcGRhdGVzOiB0cnVlLFxuICogICB1c2VNZW1vaXphdGlvbjogdHJ1ZSxcbiAqICAgbWF4Q2FjaGVTaXplOiA1MDAsXG4gKiAgIHRyZWVOYW1lOiAnTXlBcHAnXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2lnbmFsVHJlZTxUIGV4dGVuZHMgU3RhdGVPYmplY3Q+KFxuICBvYmo6IFQsXG4gIGNvbmZpZzogVHJlZUNvbmZpZ1xuKTogU2lnbmFsVHJlZTxUPjtcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2lnbmFsVHJlZSBmYWN0b3J5IGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2lnbmFsVHJlZTxUIGV4dGVuZHMgU3RhdGVPYmplY3Q+KFxuICBvYmo6IFQsXG4gIGNvbmZpZ09yUHJlc2V0PzogVHJlZUNvbmZpZyB8IFRyZWVQcmVzZXRcbik6IFNpZ25hbFRyZWU8VD4ge1xuICAvLyBIYW5kbGUgcHJlc2V0IHN0cmluZ3NcbiAgaWYgKHR5cGVvZiBjb25maWdPclByZXNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAn4pqg77iPIFByZXNldCBjb25maWd1cmF0aW9ucyBhcmUgbm90IGF2YWlsYWJsZSBpbiBAc2lnbmFsdHJlZS9jb3JlLicsXG4gICAgICAnXFxuVG8gdXNlIHByZXNldHMsIGluc3RhbGwgQHNpZ25hbHRyZWUvcHJlc2V0cydcbiAgICApO1xuICAgIC8vIEZhbGxiYWNrIHRvIGJhc2ljIGNvbmZpZ3VyYXRpb25cbiAgICByZXR1cm4gY3JlYXRlKG9iaiwge30pO1xuICB9XG5cbiAgLy8gSGFuZGxlIGNvbmZpZ3VyYXRpb24gb2JqZWN0cyBvciBkZWZhdWx0IChzbWFydCBlbmhhbmNlbWVudClcbiAgY29uc3QgY29uZmlnID0gY29uZmlnT3JQcmVzZXQgfHwge307XG4gIHJldHVybiBjcmVhdGUob2JqLCBjb25maWcpO1xufVxuIl19","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsdHJlZS1jb3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvc2lnbmFsdHJlZS1jb3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19"],"names":[],"mappings":"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"}
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
import { WritableSignal, Signal } from '@angular/core';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview Core types for SignalTree modular architecture
|
|
5
|
+
*
|
|
6
|
+
* Contains only the essential types needed for the basic signalTree functionality.
|
|
7
|
+
* This keeps the core package minimal (~5KB) while other features are added via composition.
|
|
8
|
+
*/
|
|
9
|
+
declare const __treeId: unique symbol;
|
|
10
|
+
type TreeId = string & {
|
|
11
|
+
readonly [__treeId]: never;
|
|
12
|
+
};
|
|
13
|
+
type Primitive = string | number | boolean | null | undefined | bigint | symbol;
|
|
14
|
+
type SerializableValue = unknown;
|
|
15
|
+
type StateObject = Record<string | number | symbol, unknown>;
|
|
16
|
+
type IsPrimitive<T> = T extends Primitive ? true : false;
|
|
17
|
+
type DeepSignalify<T> = IsPrimitive<T> extends true ? WritableSignal<T> : T extends (infer U)[] ? WritableSignal<U[]> : T extends Record<string, unknown> ? T extends Signal<infer TSignal> ? WritableSignal<TSignal> : {
|
|
18
|
+
[K in keyof T]: DeepSignalify<T[K]>;
|
|
19
|
+
} : WritableSignal<T>;
|
|
20
|
+
type UnwrapSignalState<T> = T extends WritableSignal<infer U> ? U : T extends Record<string, unknown> ? {
|
|
21
|
+
[K in keyof T]: UnwrapSignalState<T[K]>;
|
|
22
|
+
} : T;
|
|
23
|
+
/**
|
|
24
|
+
* Main signal tree type that preserves hierarchical structure
|
|
25
|
+
*/
|
|
26
|
+
type SignalState<T extends StateObject> = DeepSignalify<T>;
|
|
27
|
+
/**
|
|
28
|
+
* Core SignalTree interface with only essential functionality.
|
|
29
|
+
* Additional features are added via composition using the .pipe() method.
|
|
30
|
+
*/
|
|
31
|
+
interface SignalTree<T extends StateObject> {
|
|
32
|
+
/**
|
|
33
|
+
* The reactive state object with deep signal conversion.
|
|
34
|
+
*/
|
|
35
|
+
state: SignalState<T>;
|
|
36
|
+
/**
|
|
37
|
+
* Shorthand alias for `state`.
|
|
38
|
+
*/
|
|
39
|
+
$: SignalState<T>;
|
|
40
|
+
/**
|
|
41
|
+
* Extracts the current plain object value from the signal tree.
|
|
42
|
+
*/
|
|
43
|
+
unwrap(): T;
|
|
44
|
+
/**
|
|
45
|
+
* Updates the tree state using a partial update function.
|
|
46
|
+
*/
|
|
47
|
+
update(updater: (current: T) => Partial<T>): void;
|
|
48
|
+
/**
|
|
49
|
+
* Creates a side effect that runs when the tree state changes.
|
|
50
|
+
*/
|
|
51
|
+
effect(fn: (tree: T) => void): void;
|
|
52
|
+
/**
|
|
53
|
+
* Subscribes to tree state changes with manual unsubscribe control.
|
|
54
|
+
*/
|
|
55
|
+
subscribe(fn: (tree: T) => void): () => void;
|
|
56
|
+
/**
|
|
57
|
+
* Completely destroys the tree and cleans up all resources.
|
|
58
|
+
*/
|
|
59
|
+
destroy(): void;
|
|
60
|
+
/**
|
|
61
|
+
* Fluent API for composing features using function composition with strong typing
|
|
62
|
+
*/
|
|
63
|
+
pipe(): SignalTree<T>;
|
|
64
|
+
pipe<R1>(fn1: (tree: SignalTree<T>) => R1): R1;
|
|
65
|
+
pipe<R1, R2>(fn1: (tree: SignalTree<T>) => R1, fn2: (arg: R1) => R2): R2;
|
|
66
|
+
pipe<R1, R2, R3>(fn1: (tree: SignalTree<T>) => R1, fn2: (arg: R1) => R2, fn3: (arg: R2) => R3): R3;
|
|
67
|
+
pipe<R1, R2, R3, R4>(fn1: (tree: SignalTree<T>) => R1, fn2: (arg: R1) => R2, fn3: (arg: R2) => R3, fn4: (arg: R3) => R4): R4;
|
|
68
|
+
pipe<R1, R2, R3, R4, R5>(fn1: (tree: SignalTree<T>) => R1, fn2: (arg: R1) => R2, fn3: (arg: R2) => R3, fn4: (arg: R3) => R4, fn5: (arg: R4) => R5): R5;
|
|
69
|
+
batchUpdate(updater: (current: T) => Partial<T>): void;
|
|
70
|
+
memoize<R>(fn: (tree: T) => R, cacheKey?: string): Signal<R>;
|
|
71
|
+
optimize(): void;
|
|
72
|
+
clearCache(): void;
|
|
73
|
+
invalidatePattern(pattern: string): number;
|
|
74
|
+
getMetrics(): PerformanceMetrics;
|
|
75
|
+
addTap(middleware: Middleware<T>): void;
|
|
76
|
+
removeTap(id: string): void;
|
|
77
|
+
asCrud<E extends {
|
|
78
|
+
id: string | number;
|
|
79
|
+
}>(entityKey?: keyof T): EntityHelpers<E>;
|
|
80
|
+
asyncAction<TInput, TResult>(operation: (input: TInput) => Promise<TResult>, config?: AsyncActionConfig<T, TResult>): AsyncAction<TInput, TResult>;
|
|
81
|
+
undo(): void;
|
|
82
|
+
redo(): void;
|
|
83
|
+
getHistory(): TimeTravelEntry<T>[];
|
|
84
|
+
resetHistory(): void;
|
|
85
|
+
}
|
|
86
|
+
type TreePreset = 'basic' | 'performance' | 'development' | 'production';
|
|
87
|
+
interface TreeConfig {
|
|
88
|
+
batchUpdates?: boolean;
|
|
89
|
+
useMemoization?: boolean;
|
|
90
|
+
enableTimeTravel?: boolean;
|
|
91
|
+
useLazySignals?: boolean;
|
|
92
|
+
useShallowComparison?: boolean;
|
|
93
|
+
maxCacheSize?: number;
|
|
94
|
+
trackPerformance?: boolean;
|
|
95
|
+
treeName?: string;
|
|
96
|
+
enableDevTools?: boolean;
|
|
97
|
+
debugMode?: boolean;
|
|
98
|
+
useStructuralSharing?: boolean;
|
|
99
|
+
}
|
|
100
|
+
interface Middleware<T> {
|
|
101
|
+
id: string;
|
|
102
|
+
before?: (action: string, payload: unknown, state: T) => boolean;
|
|
103
|
+
after?: (action: string, payload: unknown, state: T, newState: T) => void;
|
|
104
|
+
}
|
|
105
|
+
interface PerformanceMetrics {
|
|
106
|
+
updates: number;
|
|
107
|
+
computations: number;
|
|
108
|
+
cacheHits: number;
|
|
109
|
+
cacheMisses: number;
|
|
110
|
+
averageUpdateTime: number;
|
|
111
|
+
}
|
|
112
|
+
interface EntityHelpers<E extends {
|
|
113
|
+
id: string | number;
|
|
114
|
+
}> {
|
|
115
|
+
add(entity: E): void;
|
|
116
|
+
update(id: E['id'], updates: Partial<E>): void;
|
|
117
|
+
remove(id: E['id']): void;
|
|
118
|
+
upsert(entity: E): void;
|
|
119
|
+
findById(id: E['id']): Signal<E | undefined>;
|
|
120
|
+
findBy(predicate: (entity: E) => boolean): Signal<E[]>;
|
|
121
|
+
selectIds(): Signal<Array<string | number>>;
|
|
122
|
+
selectAll(): Signal<E[]>;
|
|
123
|
+
selectTotal(): Signal<number>;
|
|
124
|
+
findAll(): Signal<E[]>;
|
|
125
|
+
clear(): void;
|
|
126
|
+
}
|
|
127
|
+
interface AsyncActionConfig<T, TResult> {
|
|
128
|
+
onStart?: (state: T) => Partial<T>;
|
|
129
|
+
onSuccess?: (result: TResult, state: T) => Partial<T>;
|
|
130
|
+
onError?: (error: Error, state: T) => Partial<T>;
|
|
131
|
+
onComplete?: (state: T) => Partial<T>;
|
|
132
|
+
}
|
|
133
|
+
interface AsyncAction<TInput, TResult> {
|
|
134
|
+
execute(input: TInput): Promise<TResult>;
|
|
135
|
+
pending: Signal<boolean>;
|
|
136
|
+
error: Signal<Error | null>;
|
|
137
|
+
result: Signal<TResult | null>;
|
|
138
|
+
}
|
|
139
|
+
interface TimeTravelEntry<T> {
|
|
140
|
+
action: string;
|
|
141
|
+
timestamp: number;
|
|
142
|
+
state: T;
|
|
143
|
+
payload: unknown;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Creates a reactive signal tree with smart progressive enhancement.
|
|
148
|
+
*
|
|
149
|
+
* Features auto-enable on first use. Uses intelligent defaults based on
|
|
150
|
+
* environment (development vs production). No confusing warnings or
|
|
151
|
+
* fake implementations - everything just works!
|
|
152
|
+
*
|
|
153
|
+
* @template T - The state object type, must extend Record<string, unknown>
|
|
154
|
+
* @param obj - The initial state object to convert into a reactive tree
|
|
155
|
+
* @returns A SignalTree with auto-enabling features
|
|
156
|
+
*
|
|
157
|
+
* @example
|
|
158
|
+
* ```typescript
|
|
159
|
+
* const tree = signalTree({ count: 0, users: [] });
|
|
160
|
+
*
|
|
161
|
+
* // Core functionality always works
|
|
162
|
+
* tree.state.count.set(5);
|
|
163
|
+
* tree.update(state => ({ count: state.count + 1 }));
|
|
164
|
+
*
|
|
165
|
+
* // Composition with pipe
|
|
166
|
+
* tree.pipe(
|
|
167
|
+
* withBatching(),
|
|
168
|
+
* withMemoization(),
|
|
169
|
+
* withTimeTravel()
|
|
170
|
+
* );
|
|
171
|
+
* ```
|
|
172
|
+
*/
|
|
173
|
+
declare function signalTree<T extends StateObject>(obj: T): SignalTree<T>;
|
|
174
|
+
/**
|
|
175
|
+
* Creates a reactive signal tree with preset configuration.
|
|
176
|
+
*
|
|
177
|
+
* Uses predefined configurations for common scenarios while still
|
|
178
|
+
* allowing features to auto-enable as needed.
|
|
179
|
+
*
|
|
180
|
+
* @template T - The state object type, must extend Record<string, unknown>
|
|
181
|
+
* @param obj - The initial state object to convert into a reactive tree
|
|
182
|
+
* @param preset - Preset configuration ('basic', 'performance', 'development', 'production')
|
|
183
|
+
* @returns A SignalTree configured with the specified preset
|
|
184
|
+
*
|
|
185
|
+
* @example
|
|
186
|
+
* ```typescript
|
|
187
|
+
* // Optimized for production
|
|
188
|
+
* const prodTree = signalTree(state, 'production');
|
|
189
|
+
*
|
|
190
|
+
* // Full debugging capabilities
|
|
191
|
+
* const devTree = signalTree(state, 'development');
|
|
192
|
+
*
|
|
193
|
+
* // Maximum performance
|
|
194
|
+
* const perfTree = signalTree(state, 'performance');
|
|
195
|
+
* ```
|
|
196
|
+
*/
|
|
197
|
+
declare function signalTree<T extends StateObject>(obj: T, preset: TreePreset): SignalTree<T>;
|
|
198
|
+
/**
|
|
199
|
+
* Creates a reactive signal tree with custom configuration.
|
|
200
|
+
*
|
|
201
|
+
* Provides full control over feature enablement while maintaining
|
|
202
|
+
* auto-enabling behavior for unspecified features.
|
|
203
|
+
*
|
|
204
|
+
* @template T - The state object type, must extend Record<string, unknown>
|
|
205
|
+
* @param obj - The initial state object to convert into a reactive tree
|
|
206
|
+
* @param config - Custom configuration object
|
|
207
|
+
* @returns A SignalTree configured with custom options
|
|
208
|
+
*
|
|
209
|
+
* @example
|
|
210
|
+
* ```typescript
|
|
211
|
+
* // Custom configuration
|
|
212
|
+
* const customTree = signalTree(state, {
|
|
213
|
+
* batchUpdates: true,
|
|
214
|
+
* useMemoization: true,
|
|
215
|
+
* maxCacheSize: 500,
|
|
216
|
+
* treeName: 'MyApp'
|
|
217
|
+
* });
|
|
218
|
+
* ```
|
|
219
|
+
*/
|
|
220
|
+
declare function signalTree<T extends StateObject>(obj: T, config: TreeConfig): SignalTree<T>;
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Enhanced equality function inspired by the monolithic implementation.
|
|
224
|
+
* Uses deep equality for arrays and objects, === for primitives.
|
|
225
|
+
* More efficient than lodash while maintaining compatibility.
|
|
226
|
+
*/
|
|
227
|
+
declare function equal<T>(a: T, b: T): boolean;
|
|
228
|
+
/**
|
|
229
|
+
* Creates a terminal signal with the enhanced equality function.
|
|
230
|
+
* This should be used instead of Angular's signal() when you want
|
|
231
|
+
* the same deep equality behavior as signalTree.
|
|
232
|
+
*
|
|
233
|
+
* Inspired by the monolithic implementation's terminal signal creation.
|
|
234
|
+
*/
|
|
235
|
+
declare function terminalSignal<T>(value: T, customEqual?: (a: T, b: T) => boolean): WritableSignal<T>;
|
|
236
|
+
/**
|
|
237
|
+
* Parses a dot-notation path into an array of keys with memoization.
|
|
238
|
+
* Critical for performance when accessing nested properties frequently.
|
|
239
|
+
*
|
|
240
|
+
* @example
|
|
241
|
+
* ```typescript
|
|
242
|
+
* const keys1 = parsePath('user.name'); // Splits and caches
|
|
243
|
+
* const keys2 = parsePath('user.name'); // Returns cached result
|
|
244
|
+
* ```
|
|
245
|
+
*/
|
|
246
|
+
declare function parsePath(path: string): string[];
|
|
247
|
+
/**
|
|
248
|
+
* Creates a lazy signal tree using Proxy for on-demand signal creation.
|
|
249
|
+
* Only creates signals when properties are first accessed, providing
|
|
250
|
+
* massive memory savings for large state objects.
|
|
251
|
+
*
|
|
252
|
+
* @param obj - Source object to lazily signalify
|
|
253
|
+
* @param equalityFn - Equality function for signal comparison
|
|
254
|
+
* @param basePath - Base path for nested objects (internal use)
|
|
255
|
+
* @returns Proxied object that creates signals on first access
|
|
256
|
+
*/
|
|
257
|
+
declare function createLazySignalTree<T extends Record<string, unknown>>(obj: T, equalityFn: (a: unknown, b: unknown) => boolean, basePath?: string): DeepSignalify<T>;
|
|
258
|
+
/**
|
|
259
|
+
* Native deep equality check for arrays and objects.
|
|
260
|
+
* Handles all common cases that lodash.isEqual handles for our use cases.
|
|
261
|
+
*/
|
|
262
|
+
declare function deepEqual<T>(a: T, b: T): boolean;
|
|
263
|
+
/**
|
|
264
|
+
* Shallow equality check for objects and arrays.
|
|
265
|
+
*/
|
|
266
|
+
declare function shallowEqual<T>(a: T, b: T): boolean;
|
|
267
|
+
|
|
268
|
+
export { createLazySignalTree, deepEqual, equal, parsePath, shallowEqual, signalTree, terminalSignal };
|
|
269
|
+
export type { AsyncAction, AsyncActionConfig, DeepSignalify, EntityHelpers, Middleware, PerformanceMetrics, SerializableValue, SignalState, SignalTree, StateObject, TimeTravelEntry, TreeConfig, TreeId, TreePreset, UnwrapSignalState };
|
package/package.json
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@signaltree/core",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"peerDependencies": {
|
|
5
|
+
"@angular/common": "^20.1.0",
|
|
6
|
+
"@angular/core": "^20.1.0"
|
|
7
|
+
},
|
|
8
|
+
"sideEffects": false,
|
|
9
|
+
"module": "fesm2022/signaltree-core.mjs",
|
|
10
|
+
"typings": "index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
"./package.json": {
|
|
13
|
+
"default": "./package.json"
|
|
14
|
+
},
|
|
15
|
+
".": {
|
|
16
|
+
"types": "./index.d.ts",
|
|
17
|
+
"default": "./fesm2022/signaltree-core.mjs"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"tslib": "^2.3.0"
|
|
22
|
+
}
|
|
23
|
+
}
|