@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 ADDED
@@ -0,0 +1,7 @@
1
+ # core
2
+
3
+ This library was generated with [Nx](https://nx.dev).
4
+
5
+ ## Running unit tests
6
+
7
+ Run `nx test core` to execute the unit tests.
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9saWIvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBa0IsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR2pFLGtEQUFrRDtBQUNsRCxNQUFNLFNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBb0IsQ0FBQztBQUU5Qzs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLEtBQUssQ0FBSSxDQUFJLEVBQUUsQ0FBSTtJQUNqQyxtQ0FBbUM7SUFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRXpCLDhCQUE4QjtJQUM5QixJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUk7UUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFM0MscUNBQXFDO0lBQ3JDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxNQUFNO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDeEMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxzQ0FBc0M7SUFDdEMsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDbkQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUE0QixDQUFDLENBQUM7UUFDeEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUE0QixDQUFDLENBQUM7UUFFeEQsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxNQUFNO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFaEQsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUNoQixDQUFDLEdBQUcsRUFBRSxFQUFFLENBQ04sS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7WUFDbkIsS0FBSyxDQUNGLENBQTZCLENBQUMsR0FBRyxDQUFDLEVBQ2xDLENBQTZCLENBQUMsR0FBRyxDQUFDLENBQ3BDLENBQ0osQ0FBQztJQUNKLENBQUM7SUFFRCw4QkFBOEI7SUFDOUIsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2pCLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUM1QixLQUFRLEVBQ1IsV0FBcUM7SUFFckMsT0FBTyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ25CLEtBQUssRUFBRSxXQUFXLElBQUksS0FBSztLQUM1QixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxJQUFZO0lBQ3BDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDekIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLE9BQU8sTUFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsR0FBTSxFQUNOLFVBQStDLEVBQy9DLFFBQVEsR0FBRyxFQUFFO0lBRWIsTUFBTSxXQUFXLEdBQUcsSUFBSSxHQUFHLEVBQW1DLENBQUM7SUFDL0QsTUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQW1CLENBQUM7SUFFakQsT0FBTyxJQUFJLEtBQUssQ0FBQyxHQUFHLEVBQUU7UUFDcEIsR0FBRyxDQUFDLE1BQStCLEVBQUUsSUFBcUI7WUFDeEQsMkRBQTJEO1lBQzNELElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzdCLE9BQVEsTUFBMkMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1RCxDQUFDO1lBRUQsTUFBTSxHQUFHLEdBQUcsSUFBYyxDQUFDO1lBQzNCLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUNuRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFMUIsc0NBQXNDO1lBQ3RDLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3BCLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUVELGtEQUFrRDtZQUNsRCxJQUFJLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDMUIsT0FBTyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9CLENBQUM7WUFFRCx5Q0FBeUM7WUFDekMsSUFBSSxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQzVCLE9BQU8sYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQyxDQUFDO1lBRUQsNENBQTRDO1lBQzVDLElBQ0UsS0FBSztnQkFDTCxPQUFPLEtBQUssS0FBSyxRQUFRO2dCQUN6QixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO2dCQUNyQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFDaEIsQ0FBQztnQkFDRCxNQUFNLFdBQVcsR0FBRyxvQkFBb0IsQ0FDdEMsS0FBZ0MsRUFDaEMsVUFBVSxFQUNWLElBQUksQ0FDTCxDQUFDO2dCQUNGLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO2dCQUNyQyxPQUFPLFdBQVcsQ0FBQztZQUNyQixDQUFDO1lBRUQsZ0RBQWdEO1lBQ2hELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxLQUFLLDZDQUFJLEtBQUssRUFBRSxVQUFVLE9BQW5CLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxHQUFDLENBQUM7WUFDdkQsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDakMsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELEdBQUcsQ0FDRCxNQUErQixFQUMvQixJQUFxQixFQUNyQixLQUFjO1lBRWQsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDNUIsTUFBMkMsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7Z0JBQzNELE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUVELE1BQU0sR0FBRyxHQUFHLElBQWMsQ0FBQztZQUMzQixNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFFbkQsNkJBQTZCO1lBQzdCLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7WUFFcEIsd0NBQXdDO1lBQ3hDLE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDM0MsSUFBSSxZQUFZLEVBQUUsQ0FBQztnQkFDakIsWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxQixDQUFDO1lBRUQscURBQXFEO1lBQ3JELElBQUksYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUM1QixhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdCLENBQUM7WUFFRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUk7WUFDZCxPQUFPLElBQUksSUFBSSxNQUFNLENBQUM7UUFDeEIsQ0FBQztRQUVELE9BQU8sQ0FBQyxNQUFNO1lBQ1osT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFFRCx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsSUFBSTtZQUNuQyxPQUFPLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDeEQsQ0FBQztLQUNGLENBQXFCLENBQUM7QUFDekIsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUksQ0FBSSxFQUFFLENBQUk7SUFDckMsK0JBQStCO0lBQy9CLElBQUksQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUV6Qix3QkFBd0I7SUFDeEIsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFFekMsa0JBQWtCO0lBQ2xCLElBQUksT0FBTyxDQUFDLEtBQUssT0FBTyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFFeEMsZUFBZTtJQUNmLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUM7UUFDM0MsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLE1BQU07WUFBRSxPQUFPLEtBQUssQ0FBQztRQUN4QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFBRSxPQUFPLEtBQUssQ0FBQztRQUMzQyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsbUVBQW1FO0lBQ25FLElBQ0UsT0FBTyxDQUFDLEtBQUssUUFBUTtRQUNyQixPQUFPLENBQUMsS0FBSyxRQUFRO1FBQ3JCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDakIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNqQixDQUFDLENBQUMsQ0FBQyxZQUFZLElBQUksQ0FBQztRQUNwQixDQUFDLENBQUMsQ0FBQyxZQUFZLElBQUksQ0FBQyxFQUNwQixDQUFDO1FBQ0QsTUFBTSxJQUFJLEdBQUcsQ0FBNEIsQ0FBQztRQUMxQyxNQUFNLElBQUksR0FBRyxDQUE0QixDQUFDO1FBQzFDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVoQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLE1BQU07WUFBRSxPQUFPLEtBQUssQ0FBQztRQUVoRCxLQUFLLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUM7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDakMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3JELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxxREFBcUQ7SUFDckQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFJLENBQUksRUFBRSxDQUFJO0lBQ3hDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN6QixJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUk7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUV6QyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsTUFBTTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3hDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFBRSxPQUFPLEtBQUssQ0FBQztRQUNsQyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDbkQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUE0QixDQUFDLENBQUM7UUFDeEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUE0QixDQUFDLENBQUM7UUFFeEQsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxNQUFNO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFaEQsS0FBSyxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN4QixJQUNHLENBQTZCLENBQUMsR0FBRyxDQUFDO2dCQUNsQyxDQUE2QixDQUFDLEdBQUcsQ0FBQztnQkFFbkMsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNpZ25hbCwgV3JpdGFibGVTaWduYWwsIGlzU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSB7IERlZXBTaWduYWxpZnkgfSBmcm9tICcuL3R5cGVzJztcblxuLy8gUGF0aCBwYXJzaW5nIGNhY2hlIGZvciBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25cbmNvbnN0IHBhdGhDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcblxuLyoqXG4gKiBFbmhhbmNlZCBlcXVhbGl0eSBmdW5jdGlvbiBpbnNwaXJlZCBieSB0aGUgbW9ub2xpdGhpYyBpbXBsZW1lbnRhdGlvbi5cbiAqIFVzZXMgZGVlcCBlcXVhbGl0eSBmb3IgYXJyYXlzIGFuZCBvYmplY3RzLCA9PT0gZm9yIHByaW1pdGl2ZXMuXG4gKiBNb3JlIGVmZmljaWVudCB0aGFuIGxvZGFzaCB3aGlsZSBtYWludGFpbmluZyBjb21wYXRpYmlsaXR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXF1YWw8VD4oYTogVCwgYjogVCk6IGJvb2xlYW4ge1xuICAvLyBGYXN0IHBhdGggZm9yIHJlZmVyZW5jZSBlcXVhbGl0eVxuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XG5cbiAgLy8gSGFuZGxlIG51bGwvdW5kZWZpbmVkIGNhc2VzXG4gIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSByZXR1cm4gYSA9PT0gYjtcblxuICAvLyBIYW5kbGUgYXJyYXlzIHdpdGggZGVlcCBjb21wYXJpc29uXG4gIGlmIChBcnJheS5pc0FycmF5KGEpICYmIEFycmF5LmlzQXJyYXkoYikpIHtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGEuZXZlcnkoKGl0ZW0sIGluZGV4KSA9PiBlcXVhbChpdGVtLCBiW2luZGV4XSkpO1xuICB9XG5cbiAgLy8gSGFuZGxlIG9iamVjdHMgd2l0aCBkZWVwIGNvbXBhcmlzb25cbiAgaWYgKHR5cGVvZiBhID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgYiA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBrZXlzQSA9IE9iamVjdC5rZXlzKGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIGNvbnN0IGtleXNCID0gT2JqZWN0LmtleXMoYiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG5cbiAgICBpZiAoa2V5c0EubGVuZ3RoICE9PSBrZXlzQi5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiBrZXlzQS5ldmVyeShcbiAgICAgIChrZXkpID0+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
+ }