@signaltree/core 1.0.1 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +615 -15
- package/fesm2022/signaltree-core.mjs +120 -2
- package/fesm2022/signaltree-core.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -11,6 +11,7 @@ SignalTree Core is the lightweight (5KB) foundation that provides:
|
|
|
11
11
|
- **Basic entity management** with CRUD operations
|
|
12
12
|
- **Simple async actions** with loading states
|
|
13
13
|
- **Form integration basics** for reactive forms
|
|
14
|
+
- **Performance optimized** with lazy signal creation and structural sharing
|
|
14
15
|
|
|
15
16
|
## 🚀 Quick Start
|
|
16
17
|
|
|
@@ -20,34 +21,595 @@ SignalTree Core is the lightweight (5KB) foundation that provides:
|
|
|
20
21
|
npm install @signaltree/core
|
|
21
22
|
```
|
|
22
23
|
|
|
23
|
-
### Basic Usage
|
|
24
|
+
### Basic Usage (Beginner)
|
|
24
25
|
|
|
25
26
|
```typescript
|
|
26
27
|
import { signalTree } from '@signaltree/core';
|
|
27
28
|
|
|
28
|
-
// Create a reactive state tree
|
|
29
|
+
// Create a simple reactive state tree
|
|
30
|
+
const tree = signalTree({
|
|
31
|
+
count: 0,
|
|
32
|
+
message: 'Hello World',
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
// Read values (these are Angular signals)
|
|
36
|
+
console.log(tree.$.count()); // 0
|
|
37
|
+
console.log(tree.$.message()); // 'Hello World'
|
|
38
|
+
|
|
39
|
+
// Update values
|
|
40
|
+
tree.$.count.set(5);
|
|
41
|
+
tree.$.message.set('Updated!');
|
|
42
|
+
|
|
43
|
+
// Use in Angular components
|
|
44
|
+
@Component({
|
|
45
|
+
template: `
|
|
46
|
+
<div>Count: {{ tree.$.count() }}</div>
|
|
47
|
+
<div>Message: {{ tree.$.message() }}</div>
|
|
48
|
+
<button (click)="increment()">+1</button>
|
|
49
|
+
`,
|
|
50
|
+
})
|
|
51
|
+
class SimpleComponent {
|
|
52
|
+
tree = tree;
|
|
53
|
+
|
|
54
|
+
increment() {
|
|
55
|
+
this.tree.$.count.update((n) => n + 1);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Intermediate Usage (Nested State)
|
|
61
|
+
|
|
62
|
+
```typescript
|
|
63
|
+
// Create hierarchical state
|
|
29
64
|
const tree = signalTree({
|
|
30
65
|
user: {
|
|
31
66
|
name: 'John Doe',
|
|
32
67
|
email: 'john@example.com',
|
|
68
|
+
preferences: {
|
|
69
|
+
theme: 'dark',
|
|
70
|
+
notifications: true,
|
|
71
|
+
},
|
|
33
72
|
},
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
73
|
+
ui: {
|
|
74
|
+
loading: false,
|
|
75
|
+
errors: [] as string[],
|
|
37
76
|
},
|
|
38
77
|
});
|
|
39
78
|
|
|
40
|
-
//
|
|
41
|
-
|
|
42
|
-
tree.$.
|
|
79
|
+
// Access nested signals with full type safety
|
|
80
|
+
tree.$.user.name.set('Jane Doe');
|
|
81
|
+
tree.$.user.preferences.theme.set('light');
|
|
82
|
+
tree.$.ui.loading.set(true);
|
|
83
|
+
|
|
84
|
+
// Computed values from nested state
|
|
85
|
+
const userDisplayName = computed(() => {
|
|
86
|
+
const user = tree.$.user();
|
|
87
|
+
return `${user.name} (${user.email})`;
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
// Effects that respond to changes
|
|
91
|
+
effect(() => {
|
|
92
|
+
if (tree.$.ui.loading()) {
|
|
93
|
+
console.log('Loading started...');
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
```
|
|
43
97
|
|
|
44
|
-
|
|
45
|
-
const users = tree.asCrud('users');
|
|
46
|
-
users.add({ id: '1', name: 'Alice', email: 'alice@example.com' });
|
|
98
|
+
### Advanced Usage (Full State Tree)
|
|
47
99
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
100
|
+
```typescript
|
|
101
|
+
interface AppState {
|
|
102
|
+
auth: {
|
|
103
|
+
user: User | null;
|
|
104
|
+
token: string | null;
|
|
105
|
+
isAuthenticated: boolean;
|
|
106
|
+
};
|
|
107
|
+
data: {
|
|
108
|
+
users: User[];
|
|
109
|
+
posts: Post[];
|
|
110
|
+
cache: Record<string, unknown>;
|
|
111
|
+
};
|
|
112
|
+
ui: {
|
|
113
|
+
theme: 'light' | 'dark';
|
|
114
|
+
sidebar: {
|
|
115
|
+
open: boolean;
|
|
116
|
+
width: number;
|
|
117
|
+
};
|
|
118
|
+
notifications: Notification[];
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const tree = signalTree<AppState>({
|
|
123
|
+
auth: {
|
|
124
|
+
user: null,
|
|
125
|
+
token: null,
|
|
126
|
+
isAuthenticated: false
|
|
127
|
+
},
|
|
128
|
+
data: {
|
|
129
|
+
users: [],
|
|
130
|
+
posts: [],
|
|
131
|
+
cache: {}
|
|
132
|
+
},
|
|
133
|
+
ui: {
|
|
134
|
+
theme: 'light',
|
|
135
|
+
sidebar: { open: true, width: 250 },
|
|
136
|
+
notifications: []
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
// Complex updates with type safety
|
|
141
|
+
tree.update(state => ({
|
|
142
|
+
auth: {
|
|
143
|
+
...state.auth,
|
|
144
|
+
user: { id: '1', name: 'John' },
|
|
145
|
+
isAuthenticated: true
|
|
146
|
+
},
|
|
147
|
+
ui: {
|
|
148
|
+
...state.ui,
|
|
149
|
+
notifications: [
|
|
150
|
+
...state.ui.notifications,
|
|
151
|
+
// Get entire state as plain object
|
|
152
|
+
const currentState = tree.unwrap();
|
|
153
|
+
console.log('Current app state:', currentState);
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## 📦 Core Features
|
|
157
|
+
|
|
158
|
+
### 1. Hierarchical Signal Trees
|
|
159
|
+
|
|
160
|
+
Create deeply nested reactive state with automatic type inference:
|
|
161
|
+
|
|
162
|
+
```typescript
|
|
163
|
+
const tree = signalTree({
|
|
164
|
+
user: { name: '', email: '' },
|
|
165
|
+
settings: { theme: 'dark', notifications: true },
|
|
166
|
+
todos: [] as Todo[],
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
// Access nested signals with full type safety
|
|
170
|
+
tree.$.user.name(); // string signal
|
|
171
|
+
tree.$.settings.theme.set('light'); // type-checked value
|
|
172
|
+
tree.$.todos.update((todos) => [...todos, newTodo]); // array operations
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### 2. TypeScript Inference Excellence
|
|
176
|
+
|
|
177
|
+
SignalTree provides complete type inference without manual typing:
|
|
178
|
+
|
|
179
|
+
```typescript
|
|
180
|
+
// Automatic inference from initial state
|
|
181
|
+
const tree = signalTree({
|
|
182
|
+
count: 0, // Inferred as WritableSignal<number>
|
|
183
|
+
name: 'John', // Inferred as WritableSignal<string>
|
|
184
|
+
active: true, // Inferred as WritableSignal<boolean>
|
|
185
|
+
items: [] as Item[], // Inferred as WritableSignal<Item[]>
|
|
186
|
+
config: {
|
|
187
|
+
theme: 'dark' as const, // Inferred as WritableSignal<'dark'>
|
|
188
|
+
settings: {
|
|
189
|
+
nested: true, // Deep nesting maintained
|
|
190
|
+
},
|
|
191
|
+
},
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
// Type-safe access and updates
|
|
195
|
+
tree.$.count.set(5); // ✅ number
|
|
196
|
+
tree.$.count.set('invalid'); // ❌ Type error
|
|
197
|
+
tree.$.config.theme.set('light'); // ❌ Type error ('dark' const)
|
|
198
|
+
tree.$.config.settings.nested.set(false); // ✅ boolean
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### 3. Basic Entity Management
|
|
202
|
+
|
|
203
|
+
Built-in lightweight CRUD operations:
|
|
204
|
+
|
|
205
|
+
```typescript
|
|
206
|
+
interface User {
|
|
207
|
+
id: string;
|
|
208
|
+
name: string;
|
|
209
|
+
email: string;
|
|
210
|
+
active: boolean;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
const tree = signalTree({
|
|
214
|
+
users: [] as User[],
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
const users = tree.asCrud<User>('users');
|
|
218
|
+
|
|
219
|
+
// Basic CRUD operations
|
|
220
|
+
users.add({ id: '1', name: 'Alice', email: 'alice@example.com', active: true });
|
|
221
|
+
users.update('1', { name: 'Alice Smith' });
|
|
222
|
+
users.remove('1');
|
|
223
|
+
users.upsert({ id: '2', name: 'Bob', email: 'bob@example.com', active: true });
|
|
224
|
+
|
|
225
|
+
// Basic queries
|
|
226
|
+
const userById = users.findById('1');
|
|
227
|
+
const allUsers = users.selectAll();
|
|
228
|
+
const userCount = users.selectTotal();
|
|
229
|
+
const activeUsers = users.selectWhere((user) => user.active);
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### 4. Simple Async Actions
|
|
233
|
+
|
|
234
|
+
Built-in async action helpers with loading states:
|
|
235
|
+
|
|
236
|
+
```typescript
|
|
237
|
+
const tree = signalTree({
|
|
238
|
+
users: [] as User[],
|
|
239
|
+
loading: false,
|
|
240
|
+
error: null as string | null,
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
const loadUsers = tree.asyncAction(async () => await api.getUsers(), {
|
|
244
|
+
onStart: () => ({ loading: true, error: null }),
|
|
245
|
+
onSuccess: (users) => ({ users, loading: false }),
|
|
246
|
+
onError: (error) => ({ loading: false, error: error.message }),
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
// Usage in component
|
|
250
|
+
@Component({
|
|
251
|
+
template: `
|
|
252
|
+
@if (tree.$.loading()) {
|
|
253
|
+
<div>Loading...</div>
|
|
254
|
+
} @else if (tree.$.error()) {
|
|
255
|
+
<div class="error">{{ tree.$.error() }}</div>
|
|
256
|
+
} @else { @for (user of tree.$.users(); track user.id) {
|
|
257
|
+
<user-card [user]="user" />
|
|
258
|
+
} }
|
|
259
|
+
<button (click)="loadUsers()">Refresh</button>
|
|
260
|
+
`,
|
|
261
|
+
})
|
|
262
|
+
class UsersComponent {
|
|
263
|
+
tree = tree;
|
|
264
|
+
loadUsers = loadUsers;
|
|
265
|
+
}
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### 5. Performance Optimizations
|
|
269
|
+
|
|
270
|
+
Core includes several performance optimizations:
|
|
271
|
+
|
|
272
|
+
```typescript
|
|
273
|
+
// Lazy signal creation (default)
|
|
274
|
+
const tree = signalTree(
|
|
275
|
+
{
|
|
276
|
+
largeObject: {
|
|
277
|
+
// Signals only created when accessed
|
|
278
|
+
level1: { level2: { level3: { data: 'value' } } },
|
|
279
|
+
},
|
|
280
|
+
},
|
|
281
|
+
{
|
|
282
|
+
useLazySignals: true, // Default: true
|
|
283
|
+
}
|
|
284
|
+
);
|
|
285
|
+
|
|
286
|
+
// Custom equality function
|
|
287
|
+
const tree2 = signalTree(
|
|
288
|
+
{
|
|
289
|
+
items: [] as Item[],
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
useShallowComparison: false, // Deep equality (default)
|
|
293
|
+
}
|
|
294
|
+
);
|
|
295
|
+
|
|
296
|
+
// Structural sharing for memory efficiency
|
|
297
|
+
tree.update((state) => ({
|
|
298
|
+
...state, // Reuses unchanged parts
|
|
299
|
+
newField: 'value',
|
|
300
|
+
}));
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
## 🚀 Error Handling Examples
|
|
304
|
+
|
|
305
|
+
### Async Error Handling
|
|
306
|
+
|
|
307
|
+
```typescript
|
|
308
|
+
const tree = signalTree({
|
|
309
|
+
data: null as ApiData | null,
|
|
310
|
+
loading: false,
|
|
311
|
+
error: null as Error | null,
|
|
312
|
+
retryCount: 0,
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
const loadDataWithRetry = tree.asyncAction(
|
|
316
|
+
async (attempt = 0) => {
|
|
317
|
+
try {
|
|
318
|
+
return await api.getData();
|
|
319
|
+
} catch (error) {
|
|
320
|
+
if (attempt < 3) {
|
|
321
|
+
// Retry logic
|
|
322
|
+
await new Promise((resolve) => setTimeout(resolve, 1000 * attempt));
|
|
323
|
+
return loadDataWithRetry(attempt + 1);
|
|
324
|
+
}
|
|
325
|
+
throw error;
|
|
326
|
+
}
|
|
327
|
+
},
|
|
328
|
+
{
|
|
329
|
+
onStart: () => ({ loading: true, error: null }),
|
|
330
|
+
onSuccess: (data) => ({ data, loading: false, retryCount: 0 }),
|
|
331
|
+
onError: (error, state) => ({
|
|
332
|
+
loading: false,
|
|
333
|
+
error,
|
|
334
|
+
retryCount: state.retryCount + 1,
|
|
335
|
+
}),
|
|
336
|
+
}
|
|
337
|
+
);
|
|
338
|
+
|
|
339
|
+
// Error boundary component
|
|
340
|
+
@Component({
|
|
341
|
+
template: `
|
|
342
|
+
@if (tree.$.error()) {
|
|
343
|
+
<div class="error-boundary">
|
|
344
|
+
<h3>Something went wrong</h3>
|
|
345
|
+
<p>{{ tree.$.error()?.message }}</p>
|
|
346
|
+
<p>Attempts: {{ tree.$.retryCount() }}</p>
|
|
347
|
+
<button (click)="retry()">Retry</button>
|
|
348
|
+
<button (click)="clear()">Clear Error</button>
|
|
349
|
+
</div>
|
|
350
|
+
} @else {
|
|
351
|
+
<!-- Normal content -->
|
|
352
|
+
}
|
|
353
|
+
`,
|
|
354
|
+
})
|
|
355
|
+
class ErrorHandlingComponent {
|
|
356
|
+
tree = tree;
|
|
357
|
+
|
|
358
|
+
retry() {
|
|
359
|
+
loadDataWithRetry();
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
clear() {
|
|
363
|
+
this.tree.$.error.set(null);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
### State Update Error Handling
|
|
369
|
+
|
|
370
|
+
```typescript
|
|
371
|
+
const tree = signalTree({
|
|
372
|
+
items: [] as Item[],
|
|
373
|
+
validationErrors: [] as string[],
|
|
374
|
+
});
|
|
375
|
+
|
|
376
|
+
// Safe update with validation
|
|
377
|
+
function safeUpdateItem(id: string, updates: Partial<Item>) {
|
|
378
|
+
try {
|
|
379
|
+
tree.update((state) => {
|
|
380
|
+
const itemIndex = state.items.findIndex((item) => item.id === id);
|
|
381
|
+
if (itemIndex === -1) {
|
|
382
|
+
throw new Error(`Item with id ${id} not found`);
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
const updatedItem = { ...state.items[itemIndex], ...updates };
|
|
386
|
+
|
|
387
|
+
// Validation
|
|
388
|
+
if (!updatedItem.name?.trim()) {
|
|
389
|
+
throw new Error('Item name is required');
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
const newItems = [...state.items];
|
|
393
|
+
newItems[itemIndex] = updatedItem;
|
|
394
|
+
|
|
395
|
+
return {
|
|
396
|
+
items: newItems,
|
|
397
|
+
validationErrors: [], // Clear errors on success
|
|
398
|
+
};
|
|
399
|
+
});
|
|
400
|
+
} catch (error) {
|
|
401
|
+
tree.$.validationErrors.update((errors) => [...errors, error instanceof Error ? error.message : 'Unknown error']);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
## 🔗 Package Composition Patterns
|
|
407
|
+
|
|
408
|
+
### Basic Composition
|
|
409
|
+
|
|
410
|
+
```typescript
|
|
411
|
+
import { signalTree } from '@signaltree/core';
|
|
412
|
+
|
|
413
|
+
// Core provides the foundation
|
|
414
|
+
const tree = signalTree({
|
|
415
|
+
state: 'initial',
|
|
416
|
+
});
|
|
417
|
+
|
|
418
|
+
// Extend with additional packages via pipe
|
|
419
|
+
const enhancedTree = tree.pipe(
|
|
420
|
+
// Add features as needed
|
|
421
|
+
someFeatureFunction()
|
|
422
|
+
);
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
### Modular Enhancement Pattern
|
|
426
|
+
|
|
427
|
+
```typescript
|
|
428
|
+
// Start minimal, add features as needed
|
|
429
|
+
let tree = signalTree(initialState);
|
|
430
|
+
|
|
431
|
+
if (isDevelopment) {
|
|
432
|
+
tree = tree.pipe(withDevtools());
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
if (needsPerformance) {
|
|
436
|
+
tree = tree.pipe(withBatching(), withMemoization());
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
if (needsTimeTravel) {
|
|
440
|
+
tree = tree.pipe(withTimeTravel());
|
|
441
|
+
}
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
### Service-Based Pattern
|
|
445
|
+
|
|
446
|
+
```typescript
|
|
447
|
+
@Injectable()
|
|
448
|
+
class AppStateService {
|
|
449
|
+
private tree = signalTree({
|
|
450
|
+
user: null as User | null,
|
|
451
|
+
settings: { theme: 'light' as const },
|
|
452
|
+
});
|
|
453
|
+
|
|
454
|
+
// Expose specific parts
|
|
455
|
+
readonly user$ = this.tree.$.user;
|
|
456
|
+
readonly settings$ = this.tree.$.settings;
|
|
457
|
+
|
|
458
|
+
// Expose specific actions
|
|
459
|
+
setUser(user: User) {
|
|
460
|
+
this.tree.$.user.set(user);
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
updateSettings(settings: Partial<Settings>) {
|
|
464
|
+
this.tree.$.settings.update((current) => ({
|
|
465
|
+
...current,
|
|
466
|
+
...settings,
|
|
467
|
+
}));
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
// For advanced features, return the tree
|
|
471
|
+
getTree() {
|
|
472
|
+
return this.tree;
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
```
|
|
476
|
+
|
|
477
|
+
## ⚡ Performance Benchmarks
|
|
478
|
+
|
|
479
|
+
### Memory Usage Comparison
|
|
480
|
+
|
|
481
|
+
| Operation | SignalTree Core | NgRx | Akita | Native Signals |
|
|
482
|
+
| ------------------------ | --------------- | ------ | ------ | -------------- |
|
|
483
|
+
| 1K entities | 1.2MB | 4.2MB | 3.5MB | 2.3MB |
|
|
484
|
+
| 10K entities | 8.1MB | 28.5MB | 22.1MB | 15.2MB |
|
|
485
|
+
| Deep nesting (10 levels) | 145KB | 890KB | 720KB | 340KB |
|
|
486
|
+
|
|
487
|
+
### Update Performance
|
|
488
|
+
|
|
489
|
+
| Operation | SignalTree Core | NgRx | Akita | Native Signals |
|
|
490
|
+
| ------------------------ | --------------- | ---- | ----- | -------------- |
|
|
491
|
+
| Single update | <1ms | 8ms | 6ms | 2ms |
|
|
492
|
+
| Nested update (5 levels) | 2ms | 12ms | 10ms | 3ms |
|
|
493
|
+
| Bulk update (100 items) | 14ms | 35ms | 28ms | 10ms |
|
|
494
|
+
|
|
495
|
+
### TypeScript Inference Speed
|
|
496
|
+
|
|
497
|
+
```typescript
|
|
498
|
+
// SignalTree: Instant inference
|
|
499
|
+
const tree = signalTree({
|
|
500
|
+
deeply: { nested: { state: { with: { types: 'instant' } } } }
|
|
501
|
+
});
|
|
502
|
+
tree.$.deeply.nested.state.with.types.set('updated'); // ✅ <1ms
|
|
503
|
+
|
|
504
|
+
// Manual typing required with other solutions
|
|
505
|
+
interface State { deeply: { nested: { state: { with: { types: string } } } } }
|
|
506
|
+
const store: Store<State> = ...; // Requires manual interface definition
|
|
507
|
+
```
|
|
508
|
+
|
|
509
|
+
## 🎯 Real-World Example
|
|
510
|
+
|
|
511
|
+
```typescript
|
|
512
|
+
// Complete user management component
|
|
513
|
+
@Component({
|
|
514
|
+
template: `
|
|
515
|
+
<div class="user-manager">
|
|
516
|
+
<!-- User List -->
|
|
517
|
+
<div class="user-list">
|
|
518
|
+
@if (userTree.$.loading()) {
|
|
519
|
+
<div class="loading">Loading users...</div>
|
|
520
|
+
} @else if (userTree.$.error()) {
|
|
521
|
+
<div class="error">
|
|
522
|
+
{{ userTree.$.error() }}
|
|
523
|
+
<button (click)="loadUsers()">Retry</button>
|
|
524
|
+
</div>
|
|
525
|
+
} @else { @for (user of users.selectAll()(); track user.id) {
|
|
526
|
+
<div class="user-card">
|
|
527
|
+
<h3>{{ user.name }}</h3>
|
|
528
|
+
<p>{{ user.email }}</p>
|
|
529
|
+
<button (click)="editUser(user)">Edit</button>
|
|
530
|
+
<button (click)="deleteUser(user.id)">Delete</button>
|
|
531
|
+
</div>
|
|
532
|
+
} }
|
|
533
|
+
</div>
|
|
534
|
+
|
|
535
|
+
<!-- User Form -->
|
|
536
|
+
<form (ngSubmit)="saveUser()" #form="ngForm">
|
|
537
|
+
<input [(ngModel)]="userTree.$.form.name()" name="name" placeholder="Name" required />
|
|
538
|
+
<input [(ngModel)]="userTree.$.form.email()" name="email" type="email" placeholder="Email" required />
|
|
539
|
+
<button type="submit" [disabled]="form.invalid">{{ userTree.$.form.id() ? 'Update' : 'Create' }} User</button>
|
|
540
|
+
<button type="button" (click)="clearForm()">Clear</button>
|
|
541
|
+
</form>
|
|
542
|
+
</div>
|
|
543
|
+
`,
|
|
544
|
+
})
|
|
545
|
+
class UserManagerComponent implements OnInit {
|
|
546
|
+
userTree = signalTree({
|
|
547
|
+
users: [] as User[],
|
|
548
|
+
loading: false,
|
|
549
|
+
error: null as string | null,
|
|
550
|
+
form: { id: '', name: '', email: '' },
|
|
551
|
+
});
|
|
552
|
+
|
|
553
|
+
users = this.userTree.asCrud<User>('users');
|
|
554
|
+
|
|
555
|
+
loadUsers = this.userTree.asyncAction(async () => await this.userService.getUsers(), {
|
|
556
|
+
onStart: () => ({ loading: true, error: null }),
|
|
557
|
+
onSuccess: (users) => ({ users, loading: false }),
|
|
558
|
+
onError: (error) => ({ loading: false, error: error.message }),
|
|
559
|
+
});
|
|
560
|
+
|
|
561
|
+
constructor(private userService: UserService) {}
|
|
562
|
+
|
|
563
|
+
ngOnInit() {
|
|
564
|
+
this.loadUsers();
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
editUser(user: User) {
|
|
568
|
+
this.userTree.$.form.set(user);
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
async saveUser() {
|
|
572
|
+
try {
|
|
573
|
+
const form = this.userTree.$.form();
|
|
574
|
+
if (form.id) {
|
|
575
|
+
await this.userService.updateUser(form.id, form);
|
|
576
|
+
this.users.update(form.id, form);
|
|
577
|
+
} else {
|
|
578
|
+
const newUser = await this.userService.createUser(form);
|
|
579
|
+
this.users.add(newUser);
|
|
580
|
+
}
|
|
581
|
+
this.clearForm();
|
|
582
|
+
} catch (error) {
|
|
583
|
+
this.userTree.$.error.set(error instanceof Error ? error.message : 'Save failed');
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
deleteUser(id: string) {
|
|
588
|
+
if (confirm('Delete user?')) {
|
|
589
|
+
this.users.remove(id);
|
|
590
|
+
this.userService.deleteUser(id).catch((error) => {
|
|
591
|
+
this.userTree.$.error.set(error.message);
|
|
592
|
+
this.loadUsers(); // Reload on error
|
|
593
|
+
});
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
clearForm() {
|
|
598
|
+
this.userTree.$.form.set({ id: '', name: '', email: '' });
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
```
|
|
602
|
+
|
|
603
|
+
]
|
|
604
|
+
|
|
605
|
+
}
|
|
606
|
+
}));
|
|
607
|
+
|
|
608
|
+
// Get entire state as plain object
|
|
609
|
+
const currentState = tree.unwrap();
|
|
610
|
+
console.log('Current app state:', currentState);
|
|
611
|
+
|
|
612
|
+
```
|
|
51
613
|
});
|
|
52
614
|
```
|
|
53
615
|
|
|
@@ -274,7 +836,45 @@ class UsersComponent {
|
|
|
274
836
|
}
|
|
275
837
|
```
|
|
276
838
|
|
|
277
|
-
##
|
|
839
|
+
## � Available Extension Packages
|
|
840
|
+
|
|
841
|
+
Extend the core with optional feature packages:
|
|
842
|
+
|
|
843
|
+
### Performance & Optimization
|
|
844
|
+
|
|
845
|
+
- **[@signaltree/batching](../batching)** (+1KB) - Batch multiple updates for better performance
|
|
846
|
+
- **[@signaltree/memoization](../memoization)** (+2KB) - Intelligent caching & performance optimization
|
|
847
|
+
|
|
848
|
+
### Advanced Features
|
|
849
|
+
|
|
850
|
+
- **[@signaltree/middleware](../middleware)** (+1KB) - Middleware system & state interceptors
|
|
851
|
+
- **[@signaltree/async](../async)** (+2KB) - Advanced async operations & loading states
|
|
852
|
+
- **[@signaltree/entities](../entities)** (+2KB) - Enhanced CRUD operations & entity management
|
|
853
|
+
|
|
854
|
+
### Development Tools
|
|
855
|
+
|
|
856
|
+
- **[@signaltree/devtools](../devtools)** (+1KB) - Development tools & Redux DevTools integration
|
|
857
|
+
- **[@signaltree/time-travel](../time-travel)** (+3KB) - Undo/redo functionality & state history
|
|
858
|
+
|
|
859
|
+
### Integration & Convenience
|
|
860
|
+
|
|
861
|
+
- **[@signaltree/presets](../presets)** (+0.5KB) - Pre-configured setups for common patterns
|
|
862
|
+
- **[@signaltree/ng-forms](../ng-forms)** (+3KB) - Complete Angular Forms integration
|
|
863
|
+
|
|
864
|
+
### Quick Start with Extensions
|
|
865
|
+
|
|
866
|
+
```bash
|
|
867
|
+
# Performance-focused setup
|
|
868
|
+
npm install @signaltree/core @signaltree/batching @signaltree/memoization
|
|
869
|
+
|
|
870
|
+
# Full development setup
|
|
871
|
+
npm install @signaltree/core @signaltree/batching @signaltree/memoization @signaltree/devtools @signaltree/time-travel
|
|
872
|
+
|
|
873
|
+
# All packages (full-featured)
|
|
874
|
+
npm install @signaltree/core @signaltree/batching @signaltree/memoization @signaltree/middleware @signaltree/async @signaltree/entities @signaltree/devtools @signaltree/time-travel @signaltree/presets @signaltree/ng-forms
|
|
875
|
+
```
|
|
876
|
+
|
|
877
|
+
## �🔗 Links
|
|
278
878
|
|
|
279
879
|
- [SignalTree Documentation](https://signaltree.io)
|
|
280
880
|
- [GitHub Repository](https://github.com/JBorgia/signaltree)
|
|
@@ -226,6 +226,18 @@ function shallowEqual(a, b) {
|
|
|
226
226
|
|
|
227
227
|
/**
|
|
228
228
|
* Creates an equality function based on configuration.
|
|
229
|
+
*
|
|
230
|
+
* @param useShallowComparison - If true, uses Object.is for comparison; otherwise uses deep equality
|
|
231
|
+
* @returns A function that compares two values for equality
|
|
232
|
+
*
|
|
233
|
+
* @example
|
|
234
|
+
* ```typescript
|
|
235
|
+
* const shallowEqual = createEqualityFn(true);
|
|
236
|
+
* const deepEqual = createEqualityFn(false);
|
|
237
|
+
*
|
|
238
|
+
* shallowEqual({ a: 1 }, { a: 1 }); // false (different objects)
|
|
239
|
+
* deepEqual({ a: 1 }, { a: 1 }); // true (same structure and values)
|
|
240
|
+
* ```
|
|
229
241
|
*/
|
|
230
242
|
function createEqualityFn(useShallowComparison) {
|
|
231
243
|
return useShallowComparison ? Object.is : equal;
|
|
@@ -233,6 +245,26 @@ function createEqualityFn(useShallowComparison) {
|
|
|
233
245
|
/**
|
|
234
246
|
* Core function to create a basic SignalTree.
|
|
235
247
|
* This provides the minimal functionality without advanced features.
|
|
248
|
+
*
|
|
249
|
+
* @template T - The state object type
|
|
250
|
+
* @param obj - The initial state object
|
|
251
|
+
* @param config - Configuration options for the tree
|
|
252
|
+
* @returns A basic SignalTree with core functionality
|
|
253
|
+
*
|
|
254
|
+
* @example
|
|
255
|
+
* ```typescript
|
|
256
|
+
* const tree = create({
|
|
257
|
+
* count: 0,
|
|
258
|
+
* user: { name: 'John', age: 30 }
|
|
259
|
+
* }, {
|
|
260
|
+
* useLazySignals: true,
|
|
261
|
+
* useShallowComparison: false
|
|
262
|
+
* });
|
|
263
|
+
*
|
|
264
|
+
* // Access nested signals
|
|
265
|
+
* console.log(tree.$.count()); // 0
|
|
266
|
+
* tree.$.user.name.set('Jane');
|
|
267
|
+
* ```
|
|
236
268
|
*/
|
|
237
269
|
function create(obj, config = {}) {
|
|
238
270
|
const equalityFn = createEqualityFn(config.useShallowComparison ?? false);
|
|
@@ -245,11 +277,29 @@ function create(obj, config = {}) {
|
|
|
245
277
|
state: signalState,
|
|
246
278
|
$: signalState, // $ points to the same state object
|
|
247
279
|
};
|
|
248
|
-
|
|
280
|
+
enhanceTree(resultTree);
|
|
249
281
|
return resultTree;
|
|
250
282
|
}
|
|
251
283
|
/**
|
|
252
284
|
* Creates eager signals from an object (non-lazy approach).
|
|
285
|
+
* All signals are created immediately during initialization.
|
|
286
|
+
*
|
|
287
|
+
* @template O - The object type to convert to signals
|
|
288
|
+
* @param obj - The object to convert to signals
|
|
289
|
+
* @param equalityFn - Function to compare values for equality
|
|
290
|
+
* @returns A deeply signalified version of the object
|
|
291
|
+
*
|
|
292
|
+
* @example
|
|
293
|
+
* ```typescript
|
|
294
|
+
* const eagerSignals = createEagerSignalsFromObject({
|
|
295
|
+
* user: { name: 'John', age: 30 },
|
|
296
|
+
* settings: { theme: 'dark' }
|
|
297
|
+
* }, Object.is);
|
|
298
|
+
*
|
|
299
|
+
* // All signals are created immediately
|
|
300
|
+
* eagerSignals.user.name.set('Jane');
|
|
301
|
+
* console.log(eagerSignals.settings.theme()); // 'dark'
|
|
302
|
+
* ```
|
|
253
303
|
*/
|
|
254
304
|
function createEagerSignalsFromObject(obj, equalityFn) {
|
|
255
305
|
const result = {};
|
|
@@ -272,8 +322,44 @@ function createEagerSignalsFromObject(obj, equalityFn) {
|
|
|
272
322
|
}
|
|
273
323
|
/**
|
|
274
324
|
* Enhances a tree with basic functionality (unwrap, update, pipe).
|
|
325
|
+
* Adds core methods that every SignalTree needs for basic operation.
|
|
326
|
+
*
|
|
327
|
+
* @template T - The state object type
|
|
328
|
+
* @param tree - The tree to enhance with basic functionality
|
|
329
|
+
* @returns The enhanced tree with unwrap, update, and pipe methods
|
|
330
|
+
*
|
|
331
|
+
* @example
|
|
332
|
+
* ```typescript
|
|
333
|
+
* const basicTree = { state: signalState, $: signalState };
|
|
334
|
+
* enhanceTree(basicTree);
|
|
335
|
+
*
|
|
336
|
+
* // Now has basic methods:
|
|
337
|
+
* const currentState = basicTree.unwrap();
|
|
338
|
+
* basicTree.update(state => ({ ...state, count: state.count + 1 }));
|
|
339
|
+
* const enhancedTree = basicTree.pipe(withSomeFeature());
|
|
340
|
+
* ```
|
|
275
341
|
*/
|
|
276
|
-
function
|
|
342
|
+
function enhanceTree(tree) {
|
|
343
|
+
/**
|
|
344
|
+
* Unwraps the current state by reading all signal values.
|
|
345
|
+
* Recursively converts the signal tree back to plain JavaScript values.
|
|
346
|
+
*
|
|
347
|
+
* @returns The current state as a plain object
|
|
348
|
+
*
|
|
349
|
+
* @example
|
|
350
|
+
* ```typescript
|
|
351
|
+
* const tree = signalTree({
|
|
352
|
+
* user: { name: 'John', age: 30 },
|
|
353
|
+
* count: 0
|
|
354
|
+
* });
|
|
355
|
+
*
|
|
356
|
+
* tree.$.user.name.set('Jane');
|
|
357
|
+
* tree.$.count.set(5);
|
|
358
|
+
*
|
|
359
|
+
* const currentState = tree.unwrap();
|
|
360
|
+
* // { user: { name: 'Jane', age: 30 }, count: 5 }
|
|
361
|
+
* ```
|
|
362
|
+
*/
|
|
277
363
|
tree.unwrap = () => {
|
|
278
364
|
// Recursively unwrap with proper typing
|
|
279
365
|
const unwrapObject = (obj) => {
|
|
@@ -297,6 +383,38 @@ function enhanceTreeBasic(tree) {
|
|
|
297
383
|
};
|
|
298
384
|
return unwrapObject(tree.state);
|
|
299
385
|
};
|
|
386
|
+
/**
|
|
387
|
+
* Updates the state using an updater function.
|
|
388
|
+
* The updater receives the current state and returns a partial update.
|
|
389
|
+
* Automatically handles nested signal updates.
|
|
390
|
+
*
|
|
391
|
+
* @param updater - Function that receives current state and returns partial updates
|
|
392
|
+
*
|
|
393
|
+
* @example
|
|
394
|
+
* ```typescript
|
|
395
|
+
* const tree = signalTree({
|
|
396
|
+
* user: { name: 'John', age: 30 },
|
|
397
|
+
* count: 0,
|
|
398
|
+
* todos: []
|
|
399
|
+
* });
|
|
400
|
+
*
|
|
401
|
+
* // Simple update
|
|
402
|
+
* tree.update(state => ({ count: state.count + 1 }));
|
|
403
|
+
*
|
|
404
|
+
* // Nested update
|
|
405
|
+
* tree.update(state => ({
|
|
406
|
+
* user: { ...state.user, age: state.user.age + 1 },
|
|
407
|
+
* todos: [...state.todos, { id: 1, text: 'New todo' }]
|
|
408
|
+
* }));
|
|
409
|
+
*
|
|
410
|
+
* // Conditional update
|
|
411
|
+
* tree.update(state =>
|
|
412
|
+
* state.count < 10
|
|
413
|
+
* ? { count: state.count + 1 }
|
|
414
|
+
* : { count: 0, user: { ...state.user, name: 'Reset' } }
|
|
415
|
+
* );
|
|
416
|
+
* ```
|
|
417
|
+
*/
|
|
300
418
|
tree.update = (updater) => {
|
|
301
419
|
const currentValue = tree.unwrap();
|
|
302
420
|
const partialObj = updater(currentValue);
|
|
@@ -1 +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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"}
|
|
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 *\n * @param useShallowComparison - If true, uses Object.is for comparison; otherwise uses deep equality\n * @returns A function that compares two values for equality\n *\n * @example\n * ```typescript\n * const shallowEqual = createEqualityFn(true);\n * const deepEqual = createEqualityFn(false);\n *\n * shallowEqual({ a: 1 }, { a: 1 }); // false (different objects)\n * deepEqual({ a: 1 }, { a: 1 }); // true (same structure and values)\n * ```\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 *\n * @template T - The state object type\n * @param obj - The initial state object\n * @param config - Configuration options for the tree\n * @returns A basic SignalTree with core functionality\n *\n * @example\n * ```typescript\n * const tree = create({\n * count: 0,\n * user: { name: 'John', age: 30 }\n * }, {\n * useLazySignals: true,\n * useShallowComparison: false\n * });\n *\n * // Access nested signals\n * console.log(tree.$.count()); // 0\n * tree.$.user.name.set('Jane');\n * ```\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 enhanceTree(resultTree);\n return resultTree;\n}\n/**\n * Creates eager signals from an object (non-lazy approach).\n * All signals are created immediately during initialization.\n *\n * @template O - The object type to convert to signals\n * @param obj - The object to convert to signals\n * @param equalityFn - Function to compare values for equality\n * @returns A deeply signalified version of the object\n *\n * @example\n * ```typescript\n * const eagerSignals = createEagerSignalsFromObject({\n * user: { name: 'John', age: 30 },\n * settings: { theme: 'dark' }\n * }, Object.is);\n *\n * // All signals are created immediately\n * eagerSignals.user.name.set('Jane');\n * console.log(eagerSignals.settings.theme()); // 'dark'\n * ```\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 * Adds core methods that every SignalTree needs for basic operation.\n *\n * @template T - The state object type\n * @param tree - The tree to enhance with basic functionality\n * @returns The enhanced tree with unwrap, update, and pipe methods\n *\n * @example\n * ```typescript\n * const basicTree = { state: signalState, $: signalState };\n * enhanceTree(basicTree);\n *\n * // Now has basic methods:\n * const currentState = basicTree.unwrap();\n * basicTree.update(state => ({ ...state, count: state.count + 1 }));\n * const enhancedTree = basicTree.pipe(withSomeFeature());\n * ```\n */\nfunction enhanceTree(tree) {\n /**\n * Unwraps the current state by reading all signal values.\n * Recursively converts the signal tree back to plain JavaScript values.\n *\n * @returns The current state as a plain object\n *\n * @example\n * ```typescript\n * const tree = signalTree({\n * user: { name: 'John', age: 30 },\n * count: 0\n * });\n *\n * tree.$.user.name.set('Jane');\n * tree.$.count.set(5);\n *\n * const currentState = tree.unwrap();\n * // { user: { name: 'Jane', age: 30 }, count: 5 }\n * ```\n */\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 /**\n * Updates the state using an updater function.\n * The updater receives the current state and returns a partial update.\n * Automatically handles nested signal updates.\n *\n * @param updater - Function that receives current state and returns partial updates\n *\n * @example\n * ```typescript\n * const tree = signalTree({\n * user: { name: 'John', age: 30 },\n * count: 0,\n * todos: []\n * });\n *\n * // Simple update\n * tree.update(state => ({ count: state.count + 1 }));\n *\n * // Nested update\n * tree.update(state => ({\n * user: { ...state.user, age: state.user.age + 1 },\n * todos: [...state.todos, { id: 1, text: 'New todo' }]\n * }));\n *\n * // Conditional update\n * tree.update(state =>\n * state.count < 10\n * ? { count: state.count + 1 }\n * : { count: 0, user: { ...state.user, name: 'Reset' } }\n * );\n * ```\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsLXRyZWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9saWIvc2lnbmFsLXRyZWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLE1BQU0sRUFHTixRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sRUFDTixVQUFVLEVBQ1YsUUFBUSxHQUNULE1BQU0sZUFBZSxDQUFDO0FBY3ZCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFdEQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxTQUFTLGdCQUFnQixDQUFDLG9CQUE2QjtJQUNyRCxPQUFPLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDbEQsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCRztBQUNILFNBQVMsTUFBTSxDQUNiLEdBQU0sRUFDTixTQUFxQixFQUFFO0lBRXZCLE1BQU0sVUFBVSxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsSUFBSSxLQUFLLENBQUMsQ0FBQztJQUMxRSxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxDQUFDLDBCQUEwQjtJQUV6RSxnREFBZ0Q7SUFDaEQsTUFBTSxXQUFXLEdBQUcsT0FBTztRQUN6QixDQUFDLENBQUMsb0JBQW9CLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQztRQUN2QyxDQUFDLENBQUMsNEJBQTRCLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBRWxELE1BQU0sVUFBVSxHQUFHO1FBQ2pCLEtBQUssRUFBRSxXQUFXO1FBQ2xCLENBQUMsRUFBRSxXQUFXLEVBQUUsb0NBQW9DO0tBQ3BDLENBQUM7SUFFbkIsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3hCLE9BQU8sVUFB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QyxDQUFDO0FBQzdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBzaWduYWwsXG4gIFdyaXRhYmxlU2lnbmFsLFxuICBTaWduYWwsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIGluamVjdCxcbiAgRGVzdHJveVJlZixcbiAgaXNTaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHR5cGUge1xuICBTaWduYWxUcmVlLFxuICBEZWVwU2lnbmFsaWZ5LFxuICBUcmVlQ29uZmlnLFxuICBUcmVlUHJlc2V0LFxuICBNaWRkbGV3YXJlLFxuICBQZXJmb3JtYW5jZU1ldHJpY3MsXG4gIEVudGl0eUhlbHBlcnMsXG4gIEFzeW5jQWN0aW9uQ29uZmlnLFxuICBBc3luY0FjdGlvbixcbiAgVGltZVRyYXZlbEVudHJ5LFxuICBTdGF0ZU9iamVjdCxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVMYXp5U2lnbmFsVHJlZSwgZXF1YWwgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGVxdWFsaXR5IGZ1bmN0aW9uIGJhc2VkIG9uIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogQHBhcmFtIHVzZVNoYWxsb3dDb21wYXJpc29uIC0gSWYgdHJ1ZSwgdXNlcyBPYmplY3QuaXMgZm9yIGNvbXBhcmlzb247IG90aGVyd2lzZSB1c2VzIGRlZXAgZXF1YWxpdHlcbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCBjb21wYXJlcyB0d28gdmFsdWVzIGZvciBlcXVhbGl0eVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBzaGFsbG93RXF1YWwgPSBjcmVhdGVFcXVhbGl0eUZuKHRydWUpO1xuICogY29uc3QgZGVlcEVxdWFsID0gY3JlYXRlRXF1YWxpdHlGbihmYWxzZSk7XG4gKlxuICogc2hhbGxvd0VxdWFsKHsgYTogMSB9LCB7IGE6IDEgfSk7IC8vIGZhbHNlIChkaWZmZXJlbnQgb2JqZWN0cylcbiAqIGRlZXBFcXVhbCh7IGE6IDEgfSwgeyBhOiAxIH0pOyAvLyB0cnVlIChzYW1lIHN0cnVjdHVyZSBhbmQgdmFsdWVzKVxuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUVxdWFsaXR5Rm4odXNlU2hhbGxvd0NvbXBhcmlzb246IGJvb2xlYW4pIHtcbiAgcmV0dXJuIHVzZVNoYWxsb3dDb21wYXJpc29uID8gT2JqZWN0LmlzIDogZXF1YWw7XG59XG5cbi8qKlxuICogQ29yZSBmdW5jdGlvbiB0byBjcmVhdGUgYSBiYXNpYyBTaWduYWxUcmVlLlxuICogVGhpcyBwcm92aWRlcyB0aGUgbWluaW1hbCBmdW5jdGlvbmFsaXR5IHdpdGhvdXQgYWR2YW5jZWQgZmVhdHVyZXMuXG4gKlxuICogQHRlbXBsYXRlIFQgLSBUaGUgc3RhdGUgb2JqZWN0IHR5cGVcbiAqIEBwYXJhbSBvYmogLSBUaGUgaW5pdGlhbCBzdGF0ZSBvYmplY3RcbiAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSB0cmVlXG4gKiBAcmV0dXJucyBBIGJhc2ljIFNpZ25hbFRyZWUgd2l0aCBjb3JlIGZ1bmN0aW9uYWxpdHlcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgdHJlZSA9IGNyZWF0ZSh7XG4gKiAgIGNvdW50OiAwLFxuICogICB1c2VyOiB7IG5hbWU6ICdKb2huJywgYWdlOiAzMCB9XG4gKiB9LCB7XG4gKiAgIHVzZUxhenlTaWduYWxzOiB0cnVlLFxuICogICB1c2VTaGFsbG93Q29tcGFyaXNvbjogZmFsc2VcbiAqIH0pO1xuICpcbiAqIC8vIEFjY2VzcyBuZXN0ZWQgc2lnbmFsc1xuICogY29uc29sZS5sb2codHJlZS4kLmNvdW50KCkpOyAvLyAwXG4gKiB0cmVlLiQudXNlci5uYW1lLnNldCgnSmFuZScpO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZTxUIGV4dGVuZHMgU3RhdGVPYmplY3Q+KFxuICBvYmo6IFQsXG4gIGNvbmZpZzogVHJlZUNvbmZpZyA9IHt9XG4pOiBTaWduYWxUcmVlPFQ+IHtcbiAgY29uc3QgZXF1YWxpdHlGbiA9IGNyZWF0ZUVxdWFsaXR5Rm4oY29uZmlnLnVzZVNoYWxsb3dDb21wYXJpc29uID8/IGZhbHNlKTtcbiAgY29uc3QgdXNlTGF6eSA9IGNvbmZpZy51c2VMYXp5U2lnbmFscyA/PyB0cnVlOyAvLyBEZWZhdWx0IHRvIGxhenkgbG9hZGluZ1xuXG4gIC8vIENob29zZSBiZXR3ZWVuIGxhenkgYW5kIGVhZ2VyIHNpZ25hbCBjcmVhdGlvblxuICBjb25zdCBzaWduYWxTdGF0ZSA9IHVzZUxhenlcbiAgICA/IGNyZWF0ZUxhenlTaWduYWxUcmVlKG9iaiwgZXF1YWxpdHlGbilcbiAgICA6IGNyZWF0ZUVhZ2VyU2lnbmFsc0Zyb21PYmplY3Qob2JqLCBlcXVhbGl0eUZuKTtcblxuICBjb25zdCByZXN1bHRUcmVlID0ge1xuICAgIHN0YXRlOiBzaWduYWxTdGF0ZSxcbiAgICAkOiBzaWduYWxTdGF0ZSwgLy8gJCBwb2ludHMgdG8gdGhlIHNhbWUgc3RhdGUgb2JqZWN0XG4gIH0gYXMgU2lnbmFsVHJlZTxUPjtcblxuICBlbmhhbmNlVHJlZShyZXN1bHRUcmVlKTtcbiAgcmV0dXJuIHJlc3VsdFRyZWU7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBlYWdlciBzaWduYWxzIGZyb20gYW4gb2JqZWN0IChub24tbGF6eSBhcHByb2FjaCkuXG4gKiBBbGwgc2lnbmFscyBhcmUgY3JlYXRlZCBpbW1lZGlhdGVseSBkdXJpbmcgaW5pdGlhbGl6YXRpb24uXG4gKlxuICogQHRlbXBsYXRlIE8gLSBUaGUgb2JqZWN0IHR5cGUgdG8gY29udmVydCB0byBzaWduYWxzXG4gKiBAcGFyYW0gb2JqIC0gVGhlIG9iamVjdCB0byBjb252ZXJ0IHRvIHNpZ25hbHNcbiAqIEBwYXJhbSBlcXVhbGl0eUZuIC0gRnVuY3Rpb24gdG8gY29tcGFyZSB2YWx1ZXMgZm9yIGVxdWFsaXR5XG4gKiBAcmV0dXJucyBBIGRlZXBseSBzaWduYWxpZmllZCB2ZXJzaW9uIG9mIHRoZSBvYmplY3RcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZWFnZXJTaWduYWxzID0gY3JlYXRlRWFnZXJTaWduYWxzRnJvbU9iamVjdCh7XG4gKiAgIHVzZXI6IHsgbmFtZTogJ0pvaG4nLCBhZ2U6IDMwIH0sXG4gKiAgIHNldHRpbmdzOiB7IHRoZW1lOiAnZGFyaycgfVxuICogfSwgT2JqZWN0LmlzKTtcbiAqXG4gKiAvLyBBbGwgc2lnbmFscyBhcmUgY3JlYXRlZCBpbW1lZGlhdGVseVxuICogZWFnZXJTaWduYWxzLnVzZXIubmFtZS5zZXQoJ0phbmUnKTtcbiAqIGNvbnNvbGUubG9nKGVhZ2VyU2lnbmFscy5zZXR0aW5ncy50aGVtZSgpKTsgLy8gJ2RhcmsnXG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gY3JlYXRlRWFnZXJTaWduYWxzRnJvbU9iamVjdDxPIGV4dGVuZHMgU3RhdGVPYmplY3Q+KFxuICBvYmo6IE8sXG4gIGVxdWFsaXR5Rm46IChhOiB1bmtub3duLCBiOiB1bmtub3duKSA9PiBib29sZWFuXG4pOiBEZWVwU2lnbmFsaWZ5PE8+IHtcbiAgY29uc3QgcmVzdWx0ID0ge30gYXMgRGVlcFNpZ25hbGlmeTxPPjtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgY29uc3QgaXNPYmogPSAodjogdW5rbm93bik6IHYgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT5cbiAgICAgIHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsO1xuXG4gICAgaWYgKGlzT2JqKHZhbHVlKSAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgIWlzU2lnbmFsKHZhbHVlKSkge1xuICAgICAgLy8gRm9yIG5lc3RlZCBvYmplY3RzLCBjcmVhdGUgbmVzdGVkIHNpZ25hbCBzdHJ1Y3R1cmUgZGlyZWN0bHlcbiAgICAgIChyZXN1bHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gPSBjcmVhdGVFYWdlclNpZ25hbHNGcm9tT2JqZWN0KFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgZXF1YWxpdHlGblxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGlzU2lnbmFsKHZhbHVlKSkge1xuICAgICAgKHJlc3VsdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAocmVzdWx0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gc2lnbmFsKHZhbHVlLCB7XG4gICAgICAgIGVxdWFsOiBlcXVhbGl0eUZuLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBFbmhhbmNlcyBhIHRyZWUgd2l0aCBiYXNpYyBmdW5jdGlvbmFsaXR5ICh1bndyYXAsIHVwZGF0ZSwgcGlwZSkuXG4gKiBBZGRzIGNvcmUgbWV0aG9kcyB0aGF0IGV2ZXJ5IFNpZ25hbFRyZWUgbmVlZHMgZm9yIGJhc2ljIG9wZXJhdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSBzdGF0ZSBvYmplY3QgdHlwZVxuICogQHBhcmFtIHRyZWUgLSBUaGUgdHJlZSB0byBlbmhhbmNlIHdpdGggYmFzaWMgZnVuY3Rpb25hbGl0eVxuICogQHJldHVybnMgVGhlIGVuaGFuY2VkIHRyZWUgd2l0aCB1bndyYXAsIHVwZGF0ZSwgYW5kIHBpcGUgbWV0aG9kc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBiYXNpY1RyZWUgPSB7IHN0YXRlOiBzaWduYWxTdGF0ZSwgJDogc2lnbmFsU3RhdGUgfTtcbiAqIGVuaGFuY2VUcmVlKGJhc2ljVHJlZSk7XG4gKlxuICogLy8gTm93IGhhcyBiYXNpYyBtZXRob2RzOlxuICogY29uc3QgY3VycmVudFN0YXRlID0gYmFzaWNUcmVlLnVud3JhcCgpO1xuICogYmFzaWNUcmVlLnVwZGF0ZShzdGF0ZSA9PiAoeyAuLi5zdGF0ZSwgY291bnQ6IHN0YXRlLmNvdW50ICsgMSB9KSk7XG4gKiBjb25zdCBlbmhhbmNlZFRyZWUgPSBiYXNpY1RyZWUucGlwZSh3aXRoU29tZUZlYXR1cmUoKSk7XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gZW5oYW5jZVRyZWU8VCBleHRlbmRzIFN0YXRlT2JqZWN0PihcbiAgdHJlZTogU2lnbmFsVHJlZTxUPlxuKTogU2lnbmFsVHJlZTxUPiB7XG4gIC8qKlxuICAgKiBVbndyYXBzIHRoZSBjdXJyZW50IHN0YXRlIGJ5IHJlYWRpbmcgYWxsIHNpZ25hbCB2YWx1ZXMuXG4gICAqIFJlY3Vyc2l2ZWx5IGNvbnZlcnRzIHRoZSBzaWduYWwgdHJlZSBiYWNrIHRvIHBsYWluIEphdmFTY3JpcHQgdmFsdWVzLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCBzdGF0ZSBhcyBhIHBsYWluIG9iamVjdFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHRyZWUgPSBzaWduYWxUcmVlKHtcbiAgICogICB1c2VyOiB7IG5hbWU6ICdKb2huJywgYWdlOiAzMCB9LFxuICAgKiAgIGNvdW50OiAwXG4gICAqIH0pO1xuICAgKlxuICAgKiB0cmVlLiQudXNlci5uYW1lLnNldCgnSmFuZScpO1xuICAgKiB0cmVlLiQuY291bnQuc2V0KDUpO1xuICAgKlxuICAgKiBjb25zdCBjdXJyZW50U3RhdGUgPSB0cmVlLnVud3JhcCgpO1xuICAgKiAvLyB7IHVzZXI6IHsgbmFtZTogJ0phbmUnLCBhZ2U6IDMwIH0sIGNvdW50OiA1IH1cbiAgICogYGBgXG4gICAqL1xuICB0cmVlLnVud3JhcCA9ICgpOiBUID0+IHtcbiAgICAvLyBSZWN1cnNpdmVseSB1bndyYXAgd2l0aCBwcm9wZXIgdHlwaW5nXG4gICAgY29uc3QgdW53cmFwT2JqZWN0ID0gPE8gZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gICAgICBvYmo6IERlZXBTaWduYWxpZnk8Tz5cbiAgICApOiBPID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcblxuICAgICAgICBpZiAoaXNTaWduYWwodmFsdWUpKSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSAodmFsdWUgYXMgU2lnbmFsPHVua25vd24+KSgpO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgICAgICFBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBOZXN0ZWQgc2lnbmFsIHN0YXRlXG4gICAgICAgICAgcmVzdWx0W2tleV0gPSB1bndyYXBPYmplY3QoXG4gICAgICAgICAgICB2YWx1ZSBhcyBEZWVwU2lnbmFsaWZ5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PlxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0IGFzIE87XG4gICAgfTtcblxuICAgIHJldHVybiB1bndyYXBPYmplY3QodHJlZS5zdGF0ZSBhcyBEZWVwU2lnbmFsaWZ5PFQ+KTtcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgc3RhdGUgdXNpbmcgYW4gdXBkYXRlciBmdW5jdGlvbi5cbiAgICogVGhlIHVwZGF0ZXIgcmVjZWl2ZXMgdGhlIGN1cnJlbnQgc3RhdGUgYW5kIHJldHVybnMgYSBwYXJ0aWFsIHVwZGF0ZS5cbiAgICogQXV0b21hdGljYWxseSBoYW5kbGVzIG5lc3RlZCBzaWduYWwgdXBkYXRlcy5cbiAgICpcbiAgICogQHBhcmFtIHVwZGF0ZXIgLSBGdW5jdGlvbiB0aGF0IHJlY2VpdmVzIGN1cnJlbnQgc3RhdGUgYW5kIHJldHVybnMgcGFydGlhbCB1cGRhdGVzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdHJlZSA9IHNpZ25hbFRyZWUoe1xuICAgKiAgIHVzZXI6IHsgbmFtZTogJ0pvaG4nLCBhZ2U6IDMwIH0sXG4gICAqICAgY291bnQ6IDAsXG4gICAqICAgdG9kb3M6IFtdXG4gICAqIH0pO1xuICAgKlxuICAgKiAvLyBTaW1wbGUgdXBkYXRlXG4gICAqIHRyZWUudXBkYXRlKHN0YXRlID0+ICh7IGNvdW50OiBzdGF0ZS5jb3VudCArIDEgfSkpO1xuICAgKlxuICAgKiAvLyBOZXN0ZWQgdXBkYXRlXG4gICAqIHRyZWUudXBkYXRlKHN0YXRlID0+ICh7XG4gICAqICAgdXNlcjogeyAuLi5zdGF0ZS51c2VyLCBhZ2U6IHN0YXRlLnVzZXIuYWdlICsgMSB9LFxuICAgKiAgIHRvZG9zOiBbLi4uc3RhdGUudG9kb3MsIHsgaWQ6IDEsIHRleHQ6ICdOZXcgdG9kbycgfV1cbiAgICogfSkpO1xuICAgKlxuICAgKiAvLyBDb25kaXRpb25hbCB1cGRhdGVcbiAgICogdHJlZS51cGRhdGUoc3RhdGUgPT5cbiAgICogICBzdGF0ZS5jb3VudCA8IDEwXG4gICAqICAgICA/IHsgY291bnQ6IHN0YXRlLmNvdW50ICsgMSB9XG4gICAqICAgICA6IHsgY291bnQ6IDAsIHVzZXI6IHsgLi4uc3RhdGUudXNlciwgbmFtZTogJ1Jlc2V0JyB9IH1cbiAgICogKTtcbiAgICogYGBgXG4gICAqL1xuICB0cmVlLnVwZGF0ZSA9ICh1cGRhdGVyOiAoY3VycmVudDogVCkgPT4gUGFydGlhbDxUPikgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRyZWUudW53cmFwKCk7XG4gICAgY29uc3QgcGFydGlhbE9iaiA9IHVwZGF0ZXIoY3VycmVudFZhbHVlKTtcblxuICAgIC8vIFJlY3Vyc2l2ZWx5IHVwZGF0ZSB3aXRoIGJldHRlciB0eXBpbmdcbiAgICBjb25zdCB1cGRhdGVPYmplY3QgPSA8TyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcbiAgICAgIHRhcmdldDogRGVlcFNpZ25hbGlmeTxPPixcbiAgICAgIHVwZGF0ZXM6IFBhcnRpYWw8Tz5cbiAgICApOiB2b2lkID0+IHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHVwZGF0ZXMpIHtcbiAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodXBkYXRlcywga2V5KSkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgdXBkYXRlVmFsdWUgPSB1cGRhdGVzW2tleV07XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTaWduYWxPclN0YXRlID0gKHRhcmdldCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XTtcblxuICAgICAgICBpZiAoaXNTaWduYWwoY3VycmVudFNpZ25hbE9yU3RhdGUpKSB7XG4gICAgICAgICAgLy8gRGlyZWN0IHNpZ25hbCB1cGRhdGVcbiAgICAgICAgICAoY3VycmVudFNpZ25hbE9yU3RhdGUgYXMgV3JpdGFibGVTaWduYWw8dW5rbm93bj4pLnNldCh1cGRhdGVWYWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgdHlwZW9mIHVwZGF0ZVZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgIHVwZGF0ZVZhbHVlICE9PSBudWxsICYmXG4gICAgICAgICAgIUFycmF5LmlzQXJyYXkodXBkYXRlVmFsdWUpICYmXG4gICAgICAgICAgdHlwZW9mIGN1cnJlbnRTaWduYWxPclN0YXRlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgIGN1cnJlbnRTaWduYWxPclN0YXRlICE9PSBudWxsXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIE5lc3RlZCBvYmplY3QgLSByZWN1cnNlXG4gICAgICAgICAgdXBkYXRlT2JqZWN0KFxuICAgICAgICAgICAgY3VycmVudFNpZ25hbE9yU3RhdGUgYXMgRGVlcFNpZ25hbGlmeTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4gICAgICAgICAgICB1cGRhdGVWYWx1ZSBhcyBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHVua25vd24+PlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdXBkYXRlT2JqZWN0KHRyZWUuc3RhdGUgYXMgRGVlcFNpZ25hbGlmeTxUPiwgcGFydGlhbE9iaik7XG4gIH07XG5cbiAgLy8gUGlwZSBpbXBsZW1lbnRhdGlvbiBmb3IgZnVuY3Rpb24gY29tcG9zaXRpb24gd2l0aCBpbXByb3ZlZCB0eXBlIHNhZmV0eVxuICB0cmVlLnBpcGUgPSAoKFxuICAgIC4uLmZuczogQXJyYXk8KGlucHV0OiBhbnkpID0+IGFueT4gLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICk6IGFueSA9PiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgaWYgKGZucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0cmVlO1xuICAgIH1cblxuICAgIC8vIFR5cGUtc2FmZSByZWR1Y2UgLSB0aGUgcmV0dXJuIHR5cGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgb3ZlcmxvYWQgc2lnbmF0dXJlXG4gICAgcmV0dXJuIGZucy5yZWR1Y2UoKGFjYywgZm4pID0+IGZuKGFjYyksIHRyZWUpO1xuICB9KSBhcyBTaWduYWxUcmVlPFQ+WydwaXBlJ107XG5cbiAgLy8gU3R1YiBpbXBsZW1lbnRhdGlvbnMgZm9yIGFkdmFuY2VkIGZlYXR1cmVzICh3aWxsIGxvZyB3YXJuaW5ncylcbiAgdHJlZS5iYXRjaFVwZGF0ZSA9ICh1cGRhdGVyOiAoY3VycmVudDogVCkgPT4gUGFydGlhbDxUPikgPT4ge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICfimqDvuI8gYmF0Y2hVcGRhdGUoKSBjYWxsZWQgYnV0IGJhdGNoaW5nIGlzIG5vdCBlbmFibGVkLicsXG4gICAgICAnXFxuVG8gZW5hYmxlIGJhdGNoIHVwZGF0ZXMsIGluc3RhbGwgQHNpZ25hbHRyZWUvYmF0Y2hpbmcnXG4gICAgKTtcbiAgICAvLyBGYWxsYmFjazogSnVzdCBjYWxsIHVwZGF0ZSBkaXJlY3RseVxuICAgIHRyZWUudXBkYXRlKHVwZGF0ZXIpO1xuICB9O1xuXG4gIHRyZWUubWVtb2l6ZSA9IDxSPihmbjogKHRyZWU6IFQpID0+IFIsIGNhY2hlS2V5Pzogc3RyaW5nKTogU2lnbmFsPFI+ID0+IHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAn4pqg77iPIG1lbW9pemUoKSBjYWxsZWQgYnV0IG1lbW9pemF0aW9uIGlzIG5vdCBlbmFibGVkLicsXG4gICAgICAnXFxuVG8gZW5hYmxlIG1lbW9pemVkIGNvbXB1dGF0aW9ucywgaW5zdGFsbCBAc2lnbmFsdHJlZS9tZW1vaXphdGlvbidcbiAgICApO1xuICAgIC8vIEZhbGxiYWNrOiBVc2Ugc2ltcGxlIEFuZ3VsYXIgY29tcHV0ZWQgd2l0aG91dCBtZW1vaXphdGlvblxuICAgIHZvaWQgY2FjaGVLZXk7IC8vIE1hcmsgYXMgaW50ZW50aW9uYWxseSB1bnVzZWRcbiAgICByZXR1cm4gY29tcHV0ZWQoKCkgPT4gZm4odHJlZS51bndyYXAoKSkpO1xuICB9O1xuXG4gIHRyZWUuZWZmZWN0ID0gKGZuOiAodHJlZTogVCkgPT4gdm9pZCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBlZmZlY3QoKCkgPT4gZm4odHJlZS51bndyYXAoKSkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBGYWxsYmFjayBmb3IgdGVzdCBlbnZpcm9ubWVudHMgd2l0aG91dCBpbmplY3Rpb24gY29udGV4dFxuICAgICAgY29uc29sZS53YXJuKCdFZmZlY3QgcmVxdWlyZXMgQW5ndWxhciBpbmplY3Rpb24gY29udGV4dCcsIGVycm9yKTtcbiAgICB9XG4gIH07XG5cbiAgdHJlZS5zdWJzY3JpYmUgPSAoZm46ICh0cmVlOiBUKSA9PiB2b2lkKTogKCgpID0+IHZvaWQpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgICAgIGxldCBpc0Rlc3Ryb3llZCA9IGZhbHNlO1xuXG4gICAgICBjb25zdCBlZmZlY3RSZWYgPSBlZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAoIWlzRGVzdHJveWVkKSB7XG4gICAgICAgICAgZm4odHJlZS51bndyYXAoKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB1bnN1YnNjcmliZSA9ICgpID0+IHtcbiAgICAgICAgaXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgICAgICBlZmZlY3RSZWYuZGVzdHJveSgpO1xuICAgICAgfTtcblxuICAgICAgZGVzdHJveVJlZi5vbkRlc3Ryb3kodW5zdWJzY3JpYmUpO1xuICAgICAgcmV0dXJuIHVuc3Vic2NyaWJlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBGYWxsYmFjayBmb3IgdGVzdCBlbnZpcm9ubWVudCAtIGNhbGwgb25jZSBpbW1lZGlhdGVseVxuICAgICAgY29uc29sZS53YXJuKCdTdWJzY3JpYmUgcmVxdWlyZXMgQW5ndWxhciBpbmplY3Rpb24gY29udGV4dCcsIGVycm9yKTtcbiAgICAgIGZuKHRyZWUudW53cmFwKCkpO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgLy8gTm8tb3AgdW5zdWJzY3JpYmVcbiAgICAgIH07XG4gICAgfVxuICB9O1xuXG4gIC8vIFN0dWIgaW1wbGVtZW50YXRpb25zIGZvciBwZXJmb3JtYW5jZSBmZWF0dXJlc1xuICB0cmVlLm9wdGltaXplID0gKCkgPT4ge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICfimqDvuI8gb3B0aW1pemUoKSBjYWxsZWQgYnV0IHRyZWUgb3B0aW1pemF0aW9uIGlzIG5vdCBhdmFpbGFibGUuJyxcbiAgICAgICdcXG5UbyBlbmFibGUgb3B0aW1pemF0aW9uLCBpbnN0YWxsIEBzaWduYWx0cmVlL21lbW9pemF0aW9uJ1xuICAgICk7XG4gIH07XG5cbiAgdHJlZS5jbGVhckNhY2hlID0gKCkgPT4ge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICfimqDvuI8gY2xlYXJDYWNoZSgpIGNhbGxlZCBidXQgY2FjaGluZyBpcyBub3QgYXZhaWxhYmxlLicsXG4gICAgICAnXFxuVG8gZW5hYmxlIGNhY2hpbmcsIGluc3RhbGwgQHNpZ25hbHRyZWUvbWVtb2l6YXRpb24nXG4gICAgKTtcbiAgfTtcblxuICB0cmVlLmludmFsaWRhdGVQYXR0ZXJuID0gKCk6IG51bWJlciA9PiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ+KaoO+4jyBpbnZhbGlkYXRlUGF0dGVybigpIGNhbGxlZCBidXQgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIGlzIG5vdCBlbmFibGVkLicsXG4gICAgICAnXFxuVG8gZW5hYmxlIHBhdHRlcm4gaW52YWxpZGF0aW9uLCBpbnN0YWxsIEBzaWduYWx0cmVlL21lbW9pemF0aW9uJ1xuICAgICk7XG4gICAgcmV0dXJuIDA7XG4gIH07XG5cbiAgdHJlZS5kZXN0cm95ID0gKCkgPT4ge1xuICAgIC8vIEJhc2ljIGNsZWFudXAgZm9yIG5vbi1lbmhhbmNlZCB0cmVlc1xuICAgIGNvbnNvbGUubG9nKCdbTUVNT1JZLUNMRUFOVVBdIEJhc2ljIHRyZWUgZGVzdHJveWVkJyk7XG4gIH07XG5cbiAgdHJlZS5nZXRNZXRyaWNzID0gKCk6IFBlcmZvcm1hbmNlTWV0cmljcyA9PiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ+KaoO+4jyBnZXRNZXRyaWNzKCkgY2FsbGVkIGJ1dCBwZXJmb3JtYW5jZSB0cmFja2luZyBpcyBub3QgZW5hYmxlZC4nLFxuICAgICAgJ1xcblRvIGVuYWJsZSBwZXJmb3JtYW5jZSB0cmFja2luZywgaW5zdGFsbCBAc2lnbmFsdHJlZS9taWRkbGV3YXJlJ1xuICAgICk7XG4gICAgLy8gUmV0dXJuIG1pbmltYWwgbWV0cmljcyB3aGVuIHRyYWNraW5nIG5vdCBlbmFibGVkXG4gICAgcmV0dXJuIHtcbiAgICAgIHVwZGF0ZXM6IDAsXG4gICAgICBjb21wdXRhdGlvbnM6IDAsXG4gICAgICBjYWNoZUhpdHM6IDAsXG4gICAgICBjYWNoZU1pc3NlczogMCxcbiAgICAgIGF2ZXJhZ2VVcGRhdGVUaW1lOiAwLFxuICAgIH07XG4gIH07XG5cbiAgLy8gU3R1YiBpbXBsZW1lbnRhdGlvbnMgZm9yIG1pZGRsZXdhcmVcbiAgdHJlZS5hZGRUYXAgPSAobWlkZGxld2FyZTogTWlkZGxld2FyZTxUPikgPT4ge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICfimqDvuI8gYWRkVGFwKCkgY2FsbGVkIGJ1dCBtaWRkbGV3YXJlIHN1cHBvcnQgaXMgbm90IGF2YWlsYWJsZS4nLFxuICAgICAgJ1xcblRvIGVuYWJsZSBtaWRkbGV3YXJlLCBpbnN0YWxsIEBzaWduYWx0cmVlL21pZGRsZXdhcmUnXG4gICAgKTtcbiAgICB2b2lkIG1pZGRsZXdhcmU7IC8vIE1hcmsgYXMgaW50ZW50aW9uYWxseSB1bnVzZWRcbiAgfTtcblxuICB0cmVlLnJlbW92ZVRhcCA9IChpZDogc3RyaW5nKSA9PiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ+KaoO+4jyByZW1vdmVUYXAoKSBjYWxsZWQgYnV0IG1pZGRsZXdhcmUgc3VwcG9ydCBpcyBub3QgYXZhaWxhYmxlLicsXG4gICAgICAnXFxuVG8gZW5hYmxlIG1pZGRsZXdhcmUsIGluc3RhbGwgQHNpZ25hbHRyZWUvbWlkZGxld2FyZSdcbiAgICApO1xuICAgIHZvaWQgaWQ7IC8vIE1hcmsgYXMgaW50ZW50aW9uYWxseSB1bnVzZWRcbiAgfTtcblxuICAvLyBTdHViIGltcGxlbWVudGF0aW9ucyBmb3IgZW50aXR5IGhlbHBlcnNcbiAgdHJlZS5hc0NydWQgPSA8RSBleHRlbmRzIHsgaWQ6IHN0cmluZyB8IG51bWJlciB9PigpOiBFbnRpdHlIZWxwZXJzPEU+ID0+IHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAn4pqg77iPIGFzQ3J1ZCgpIGNhbGxlZCBidXQgZW50aXR5IGhlbHBlcnMgYXJlIG5vdCBhdmFpbGFibGUuJyxcbiAgICAgICdcXG5UbyBlbmFibGUgZW50aXR5IGhlbHBlcnMsIGluc3RhbGwgQHNpZ25hbHRyZWUvZW50aXRpZXMnXG4gICAgKTtcbiAgICByZXR1cm4ge30gYXMgRW50aXR5SGVscGVyczxFPjtcbiAgfTtcblxuICAvLyBTdHViIGltcGxlbWVudGF0aW9ucyBmb3IgYXN5bmMgYWN0aW9uc1xuICB0cmVlLmFzeW5jQWN0aW9uID0gPFRJbnB1dCwgVFJlc3VsdD4oXG4gICAgb3BlcmF0aW9uOiAoaW5wdXQ6IFRJbnB1dCkgPT4gUHJvbWlzZTxUUmVzdWx0PixcbiAgICBjb25maWc6IEFzeW5jQWN0aW9uQ29uZmlnPFQsIFRSZXN1bHQ+ID0ge31cbiAgKTogQXN5bmNBY3Rpb248VElucHV0LCBUUmVzdWx0PiA9PiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ+KaoO+4jyBhc3luY0FjdGlvbigpIGNhbGxlZCBidXQgYXN5bmMgYWN0aW9ucyBhcmUgbm90IGF2YWlsYWJsZS4nLFxuICAgICAgJ1xcblRvIGVuYWJsZSBhc3luYyBhY3Rpb25zLCBpbnN0YWxsIEBzaWduYWx0cmVlL2FzeW5jJ1xuICAgICk7XG4gICAgdm9pZCBvcGVyYXRpb247XG4gICAgdm9pZCBjb25maWc7XG4gICAgcmV0dXJuIHt9IGFzIEFzeW5jQWN0aW9uPFRJbnB1dCwgVFJlc3VsdD47XG4gIH07XG5cbiAgLy8gU3R1YiBpbXBsZW1lbnRhdGlvbnMgZm9yIHRpbWUgdHJhdmVsXG4gIHRyZWUudW5kbyA9ICgpID0+IHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAn4pqg77iPIHVuZG8oKSBjYWxsZWQgYnV0IHRpbWUgdHJhdmVsIGlzIG5vdCBhdmFpbGFibGUuJyxcbiAgICAgICdcXG5UbyBlbmFibGUgdGltZSB0cmF2ZWwsIGluc3RhbGwgQHNpZ25hbHRyZWUvdGltZS10cmF2ZWwnXG4gICAgKTtcbiAgfTtcblxuICB0cmVlLnJlZG8gPSAoKSA9PiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ+KaoO+4jyByZWRvKCkgY2FsbGVkIGJ1dCB0aW1lIHRyYXZlbCBpcyBub3QgYXZhaWxhYmxlLicsXG4gICAgICAnXFxuVG8gZW5hYmxlIHRpbWUgdHJhdmVsLCBpbnN0YWxsIEBzaWduYWx0cmVlL3RpbWUtdHJhdmVsJ1xuICAgICk7XG4gIH07XG5cbiAgdHJlZS5nZXRIaXN0b3J5ID0gKCk6IFRpbWVUcmF2ZWxFbnRyeTxUPltdID0+IHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAn4pqg77iPIGdldEhpc3RvcnkoKSBjYWxsZWQgYnV0IHRpbWUgdHJhdmVsIGlzIG5vdCBhdmFpbGFibGUuJyxcbiAgICAgICdcXG5UbyBlbmFibGUgdGltZSB0cmF2ZWwsIGluc3RhbGwgQHNpZ25hbHRyZWUvdGltZS10cmF2ZWwnXG4gICAgKTtcbiAgICByZXR1cm4gW107XG4gIH07XG5cbiAgdHJlZS5yZXNldEhpc3RvcnkgPSAoKSA9PiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ+KaoO+4jyByZXNldEhpc3RvcnkoKSBjYWxsZWQgYnV0IHRpbWUgdHJhdmVsIGlzIG5vdCBhdmFpbGFibGUuJyxcbiAgICAgICdcXG5UbyBlbmFibGUgdGltZSB0cmF2ZWwsIGluc3RhbGwgQHNpZ25hbHRyZWUvdGltZS10cmF2ZWwnXG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gdHJlZTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFBVQkxJQyBBUElcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJlYWN0aXZlIHNpZ25hbCB0cmVlIHdpdGggc21hcnQgcHJvZ3Jlc3NpdmUgZW5oYW5jZW1lbnQuXG4gKlxuICogRmVhdHVyZXMgYXV0by1lbmFibGUgb24gZmlyc3QgdXNlLiBVc2VzIGludGVsbGlnZW50IGRlZmF1bHRzIGJhc2VkIG9uXG4gKiBlbnZpcm9ubWVudCAoZGV2ZWxvcG1lbnQgdnMgcHJvZHVjdGlvbikuIE5vIGNvbmZ1c2luZyB3YXJuaW5ncyBvclxuICogZmFrZSBpbXBsZW1lbnRhdGlvbnMgLSBldmVyeXRoaW5nIGp1c3Qgd29ya3MhXG4gKlxuICogQHRlbXBsYXRlIFQgLSBUaGUgc3RhdGUgb2JqZWN0IHR5cGUsIG11c3QgZXh0ZW5kIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gKiBAcGFyYW0gb2JqIC0gVGhlIGluaXRpYWwgc3RhdGUgb2JqZWN0IHRvIGNvbnZlcnQgaW50byBhIHJlYWN0aXZlIHRyZWVcbiAqIEByZXR1cm5zIEEgU2lnbmFsVHJlZSB3aXRoIGF1dG8tZW5hYmxpbmcgZmVhdHVyZXNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgdHJlZSA9IHNpZ25hbFRyZWUoeyBjb3VudDogMCwgdXNlcnM6IFtdIH0pO1xuICpcbiAqIC8vIENvcmUgZnVuY3Rpb25hbGl0eSBhbHdheXMgd29ya3NcbiAqIHRyZWUuc3RhdGUuY291bnQuc2V0KDUpO1xuICogdHJlZS51cGRhdGUoc3RhdGUgPT4gKHsgY291bnQ6IHN0YXRlLmNvdW50ICsgMSB9KSk7XG4gKlxuICogLy8gQ29tcG9zaXRpb24gd2l0aCBwaXBlXG4gKiB0cmVlLnBpcGUoXG4gKiAgIHdpdGhCYXRjaGluZygpLFxuICogICB3aXRoTWVtb2l6YXRpb24oKSxcbiAqICAgd2l0aFRpbWVUcmF2ZWwoKVxuICogKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2lnbmFsVHJlZTxUIGV4dGVuZHMgU3RhdGVPYmplY3Q+KG9iajogVCk6IFNpZ25hbFRyZWU8VD47XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJlYWN0aXZlIHNpZ25hbCB0cmVlIHdpdGggcHJlc2V0IGNvbmZpZ3VyYXRpb24uXG4gKlxuICogVXNlcyBwcmVkZWZpbmVkIGNvbmZpZ3VyYXRpb25zIGZvciBjb21tb24gc2NlbmFyaW9zIHdoaWxlIHN0aWxsXG4gKiBhbGxvd2luZyBmZWF0dXJlcyB0byBhdXRvLWVuYWJsZSBhcyBuZWVkZWQuXG4gKlxuICogQHRlbXBsYXRlIFQgLSBUaGUgc3RhdGUgb2JqZWN0IHR5cGUsIG11c3QgZXh0ZW5kIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gKiBAcGFyYW0gb2JqIC0gVGhlIGluaXRpYWwgc3RhdGUgb2JqZWN0IHRvIGNvbnZlcnQgaW50byBhIHJlYWN0aXZlIHRyZWVcbiAqIEBwYXJhbSBwcmVzZXQgLSBQcmVzZXQgY29uZmlndXJhdGlvbiAoJ2Jhc2ljJywgJ3BlcmZvcm1hbmNlJywgJ2RldmVsb3BtZW50JywgJ3Byb2R1Y3Rpb24nKVxuICogQHJldHVybnMgQSBTaWduYWxUcmVlIGNvbmZpZ3VyZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHByZXNldFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBPcHRpbWl6ZWQgZm9yIHByb2R1Y3Rpb25cbiAqIGNvbnN0IHByb2RUcmVlID0gc2lnbmFsVHJlZShzdGF0ZSwgJ3Byb2R1Y3Rpb24nKTtcbiAqXG4gKiAvLyBGdWxsIGRlYnVnZ2luZyBjYXBhYmlsaXRpZXNcbiAqIGNvbnN0IGRldlRyZWUgPSBzaWduYWxUcmVlKHN0YXRlLCAnZGV2ZWxvcG1lbnQnKTtcbiAqXG4gKiAvLyBNYXhpbXVtIHBlcmZvcm1hbmNlXG4gKiBjb25zdCBwZXJmVHJlZSA9IHNpZ25hbFRyZWUoc3RhdGUsICdwZXJmb3JtYW5jZScpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaWduYWxUcmVlPFQgZXh0ZW5kcyBTdGF0ZU9iamVjdD4oXG4gIG9iajogVCxcbiAgcHJlc2V0OiBUcmVlUHJlc2V0XG4pOiBTaWduYWxUcmVlPFQ+O1xuXG4vKipcbiAqIENyZWF0ZXMgYSByZWFjdGl2ZSBzaWduYWwgdHJlZSB3aXRoIGN1c3RvbSBjb25maWd1cmF0aW9uLlxuICpcbiAqIFByb3ZpZGVzIGZ1bGwgY29udHJvbCBvdmVyIGZlYXR1cmUgZW5hYmxlbWVudCB3aGlsZSBtYWludGFpbmluZ1xuICogYXV0by1lbmFibGluZyBiZWhhdmlvciBmb3IgdW5zcGVjaWZpZWQgZmVhdHVyZXMuXG4gKlxuICogQHRlbXBsYXRlIFQgLSBUaGUgc3RhdGUgb2JqZWN0IHR5cGUsIG11c3QgZXh0ZW5kIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gKiBAcGFyYW0gb2JqIC0gVGhlIGluaXRpYWwgc3RhdGUgb2JqZWN0IHRvIGNvbnZlcnQgaW50byBhIHJlYWN0aXZlIHRyZWVcbiAqIEBwYXJhbSBjb25maWcgLSBDdXN0b20gY29uZmlndXJhdGlvbiBvYmplY3RcbiAqIEByZXR1cm5zIEEgU2lnbmFsVHJlZSBjb25maWd1cmVkIHdpdGggY3VzdG9tIG9wdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3VzdG9tIGNvbmZpZ3VyYXRpb25cbiAqIGNvbnN0IGN1c3RvbVRyZWUgPSBzaWduYWxUcmVlKHN0YXRlLCB7XG4gKiAgIGJhdGNoVXBkYXRlczogdHJ1ZSxcbiAqICAgdXNlTWVtb2l6YXRpb246IHRydWUsXG4gKiAgIG1heENhY2hlU2l6ZTogNTAwLFxuICogICB0cmVlTmFtZTogJ015QXBwJ1xuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25hbFRyZWU8VCBleHRlbmRzIFN0YXRlT2JqZWN0PihcbiAgb2JqOiBULFxuICBjb25maWc6IFRyZWVDb25maWdcbik6IFNpZ25hbFRyZWU8VD47XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIHNpZ25hbFRyZWUgZmFjdG9yeSBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25hbFRyZWU8VCBleHRlbmRzIFN0YXRlT2JqZWN0PihcbiAgb2JqOiBULFxuICBjb25maWdPclByZXNldD86IFRyZWVDb25maWcgfCBUcmVlUHJlc2V0XG4pOiBTaWduYWxUcmVlPFQ+IHtcbiAgLy8gSGFuZGxlIHByZXNldCBzdHJpbmdzXG4gIGlmICh0eXBlb2YgY29uZmlnT3JQcmVzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ+KaoO+4jyBQcmVzZXQgY29uZmlndXJhdGlvbnMgYXJlIG5vdCBhdmFpbGFibGUgaW4gQHNpZ25hbHRyZWUvY29yZS4nLFxuICAgICAgJ1xcblRvIHVzZSBwcmVzZXRzLCBpbnN0YWxsIEBzaWduYWx0cmVlL3ByZXNldHMnXG4gICAgKTtcbiAgICAvLyBGYWxsYmFjayB0byBiYXNpYyBjb25maWd1cmF0aW9uXG4gICAgcmV0dXJuIGNyZWF0ZShvYmosIHt9KTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBjb25maWd1cmF0aW9uIG9iamVjdHMgb3IgZGVmYXVsdCAoc21hcnQgZW5oYW5jZW1lbnQpXG4gIGNvbnN0IGNvbmZpZyA9IGNvbmZpZ09yUHJlc2V0IHx8IHt9O1xuICByZXR1cm4gY3JlYXRlKG9iaiwgY29uZmlnKTtcbn1cbiJdfQ==","/**\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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@signaltree/core",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "Lightweight, type-safe signal-based state management for Angular. Core package providing hierarchical signal trees, basic entity management, and async actions.",
|
|
5
5
|
"peerDependencies": {
|
|
6
6
|
"@angular/common": "^20.1.0",
|