@signaltree/ng-forms 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -0
- package/fesm2022/signaltree-ng-forms.mjs +463 -0
- package/fesm2022/signaltree-ng-forms.mjs.map +1 -0
- package/index.d.ts +98 -0
- package/package.json +25 -0
package/README.md
ADDED
|
@@ -0,0 +1,463 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { signal, isSignal, computed, EventEmitter, inject, ElementRef, Renderer2, effect, forwardRef, HostListener, Output, Input, Directive } from '@angular/core';
|
|
3
|
+
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
4
|
+
import { Observable } from 'rxjs';
|
|
5
|
+
import { signalTree } from '@signaltree/core';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @fileoverview Angular Forms Integration for SignalTree
|
|
9
|
+
*
|
|
10
|
+
* Provides comprehensive Angular form integration including FormTree,
|
|
11
|
+
* directives, validators, enhanced array operations, and RxJS bridge.
|
|
12
|
+
*/
|
|
13
|
+
// ============================================
|
|
14
|
+
// UTILITY FUNCTIONS
|
|
15
|
+
// ============================================
|
|
16
|
+
/**
|
|
17
|
+
* Simple path parsing for nested field access
|
|
18
|
+
*/
|
|
19
|
+
function parsePath(path) {
|
|
20
|
+
return path.split('.');
|
|
21
|
+
}
|
|
22
|
+
// ============================================
|
|
23
|
+
// FORM TREE IMPLEMENTATION
|
|
24
|
+
// ============================================
|
|
25
|
+
function createFormTree(initialValues, config = {}) {
|
|
26
|
+
const { validators = {}, asyncValidators = {}, ...treeConfig } = config;
|
|
27
|
+
// Create the underlying signal tree
|
|
28
|
+
const valuesTree = signalTree(initialValues, treeConfig);
|
|
29
|
+
// Ensure the state has the correct type - this is the key fix
|
|
30
|
+
const flattenedState = valuesTree.state;
|
|
31
|
+
// Create form-specific signals
|
|
32
|
+
const formSignals = {
|
|
33
|
+
errors: signal({}),
|
|
34
|
+
asyncErrors: signal({}),
|
|
35
|
+
touched: signal({}),
|
|
36
|
+
asyncValidating: signal({}),
|
|
37
|
+
dirty: signal(false),
|
|
38
|
+
valid: signal(true),
|
|
39
|
+
submitting: signal(false),
|
|
40
|
+
};
|
|
41
|
+
const markDirty = () => formSignals.dirty.set(true);
|
|
42
|
+
// Enhance arrays with natural operations
|
|
43
|
+
const enhanceArray = (arraySignal) => {
|
|
44
|
+
const enhanced = arraySignal;
|
|
45
|
+
enhanced.push = (item) => {
|
|
46
|
+
arraySignal.update((arr) => [...arr, item]);
|
|
47
|
+
markDirty();
|
|
48
|
+
};
|
|
49
|
+
enhanced.removeAt = (index) => {
|
|
50
|
+
arraySignal.update((arr) => arr.filter((_, i) => i !== index));
|
|
51
|
+
markDirty();
|
|
52
|
+
};
|
|
53
|
+
enhanced.setAt = (index, value) => {
|
|
54
|
+
arraySignal.update((arr) => arr.map((item, i) => (i === index ? value : item)));
|
|
55
|
+
markDirty();
|
|
56
|
+
};
|
|
57
|
+
enhanced.insertAt = (index, item) => {
|
|
58
|
+
arraySignal.update((arr) => [
|
|
59
|
+
...arr.slice(0, index),
|
|
60
|
+
item,
|
|
61
|
+
...arr.slice(index),
|
|
62
|
+
]);
|
|
63
|
+
markDirty();
|
|
64
|
+
};
|
|
65
|
+
enhanced.move = (from, to) => {
|
|
66
|
+
arraySignal.update((arr) => {
|
|
67
|
+
const newArr = [...arr];
|
|
68
|
+
const [item] = newArr.splice(from, 1);
|
|
69
|
+
if (item !== undefined) {
|
|
70
|
+
newArr.splice(to, 0, item);
|
|
71
|
+
}
|
|
72
|
+
return newArr;
|
|
73
|
+
});
|
|
74
|
+
markDirty();
|
|
75
|
+
};
|
|
76
|
+
enhanced.clear = () => {
|
|
77
|
+
arraySignal.set([]);
|
|
78
|
+
markDirty();
|
|
79
|
+
};
|
|
80
|
+
return enhanced;
|
|
81
|
+
};
|
|
82
|
+
// Recursively enhance all arrays in the state
|
|
83
|
+
const enhanceArraysRecursively = (obj) => {
|
|
84
|
+
for (const key in obj) {
|
|
85
|
+
const value = obj[key];
|
|
86
|
+
if (isSignal(value)) {
|
|
87
|
+
const signalValue = value();
|
|
88
|
+
if (Array.isArray(signalValue)) {
|
|
89
|
+
obj[key] = enhanceArray(value);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
else if (typeof value === 'object' &&
|
|
93
|
+
value !== null &&
|
|
94
|
+
!Array.isArray(value)) {
|
|
95
|
+
enhanceArraysRecursively(value);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
// Enhance arrays in the state
|
|
100
|
+
enhanceArraysRecursively(flattenedState);
|
|
101
|
+
// Helper functions for nested paths
|
|
102
|
+
const getNestedValue = (obj, path) => {
|
|
103
|
+
const keys = parsePath(path);
|
|
104
|
+
let current = obj;
|
|
105
|
+
for (const key of keys) {
|
|
106
|
+
if (current && typeof current === 'object') {
|
|
107
|
+
current = current[key];
|
|
108
|
+
if (isSignal(current)) {
|
|
109
|
+
current = current();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
return undefined;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return current;
|
|
117
|
+
};
|
|
118
|
+
const setNestedValue = (path, value) => {
|
|
119
|
+
const keys = parsePath(path);
|
|
120
|
+
let current = flattenedState;
|
|
121
|
+
for (let i = 0; i < keys.length - 1; i++) {
|
|
122
|
+
current = current[keys[i]];
|
|
123
|
+
if (!current)
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const lastKey = keys[keys.length - 1];
|
|
127
|
+
const target = current[lastKey];
|
|
128
|
+
if (isSignal(target) && 'set' in target) {
|
|
129
|
+
target.set(value);
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
const validate = async (field) => {
|
|
133
|
+
const errors = {};
|
|
134
|
+
const asyncErrors = {};
|
|
135
|
+
const fieldsToValidate = field ? [field] : Object.keys(validators);
|
|
136
|
+
// Sync validation
|
|
137
|
+
for (const fieldPath of fieldsToValidate) {
|
|
138
|
+
const validator = validators[fieldPath];
|
|
139
|
+
if (validator) {
|
|
140
|
+
const value = getNestedValue(flattenedState, fieldPath);
|
|
141
|
+
const error = validator(value);
|
|
142
|
+
if (error) {
|
|
143
|
+
errors[fieldPath] = error;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
formSignals.errors.set(errors);
|
|
148
|
+
// Async validation
|
|
149
|
+
const asyncFieldsToValidate = field
|
|
150
|
+
? [field]
|
|
151
|
+
: Object.keys(asyncValidators);
|
|
152
|
+
for (const fieldPath of asyncFieldsToValidate) {
|
|
153
|
+
const asyncValidator = asyncValidators[fieldPath];
|
|
154
|
+
if (asyncValidator && (!field || field === fieldPath)) {
|
|
155
|
+
formSignals.asyncValidating.update((v) => ({
|
|
156
|
+
...v,
|
|
157
|
+
[fieldPath]: true,
|
|
158
|
+
}));
|
|
159
|
+
try {
|
|
160
|
+
const value = getNestedValue(flattenedState, fieldPath);
|
|
161
|
+
const result = asyncValidator(value);
|
|
162
|
+
let error;
|
|
163
|
+
if (result instanceof Observable) {
|
|
164
|
+
// Handle Observable
|
|
165
|
+
error = await new Promise((resolve) => {
|
|
166
|
+
result.subscribe({
|
|
167
|
+
next: (val) => resolve(val),
|
|
168
|
+
error: () => resolve('Validation error'),
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
// Handle Promise
|
|
174
|
+
error = await result;
|
|
175
|
+
}
|
|
176
|
+
if (error) {
|
|
177
|
+
asyncErrors[fieldPath] = error;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
asyncErrors[fieldPath] = 'Validation error';
|
|
182
|
+
}
|
|
183
|
+
formSignals.asyncValidating.update((v) => ({
|
|
184
|
+
...v,
|
|
185
|
+
[fieldPath]: false,
|
|
186
|
+
}));
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
formSignals.asyncErrors.set(asyncErrors);
|
|
190
|
+
// Update validity
|
|
191
|
+
const hasErrors = Object.keys(errors).length > 0;
|
|
192
|
+
const hasAsyncErrors = Object.keys(asyncErrors).length > 0;
|
|
193
|
+
const isValidating = Object.values(formSignals.asyncValidating()).some((v) => v);
|
|
194
|
+
formSignals.valid.set(!hasErrors && !hasAsyncErrors && !isValidating);
|
|
195
|
+
};
|
|
196
|
+
// Create computed signals for field errors
|
|
197
|
+
const fieldErrors = {};
|
|
198
|
+
const fieldAsyncErrors = {};
|
|
199
|
+
// Create error signals for all defined validators
|
|
200
|
+
[...Object.keys(validators), ...Object.keys(asyncValidators)].forEach((fieldPath) => {
|
|
201
|
+
fieldErrors[fieldPath] = computed(() => {
|
|
202
|
+
const errors = formSignals.errors();
|
|
203
|
+
return errors[fieldPath];
|
|
204
|
+
});
|
|
205
|
+
fieldAsyncErrors[fieldPath] = computed(() => {
|
|
206
|
+
const errors = formSignals.asyncErrors();
|
|
207
|
+
return errors[fieldPath];
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
// Create the form tree object
|
|
211
|
+
const formTree = {
|
|
212
|
+
// Flattened state access
|
|
213
|
+
state: flattenedState,
|
|
214
|
+
$: flattenedState,
|
|
215
|
+
// Form signals
|
|
216
|
+
...formSignals,
|
|
217
|
+
// Core methods
|
|
218
|
+
unwrap: () => valuesTree.unwrap(),
|
|
219
|
+
setValue: (field, value) => {
|
|
220
|
+
setNestedValue(field, value);
|
|
221
|
+
formSignals.touched.update((t) => ({ ...t, [field]: true }));
|
|
222
|
+
markDirty();
|
|
223
|
+
void validate(field);
|
|
224
|
+
},
|
|
225
|
+
setValues: (values) => {
|
|
226
|
+
valuesTree.update((v) => ({ ...v, ...values }));
|
|
227
|
+
markDirty();
|
|
228
|
+
void validate();
|
|
229
|
+
},
|
|
230
|
+
reset: () => {
|
|
231
|
+
// Reset each field individually to maintain signal reactivity
|
|
232
|
+
const resetSignals = (current, initial) => {
|
|
233
|
+
for (const [key, initialValue] of Object.entries(initial)) {
|
|
234
|
+
const currentValue = current[key];
|
|
235
|
+
if (isSignal(currentValue) && 'set' in currentValue) {
|
|
236
|
+
currentValue.set(initialValue);
|
|
237
|
+
}
|
|
238
|
+
else if (typeof initialValue === 'object' &&
|
|
239
|
+
initialValue !== null &&
|
|
240
|
+
!Array.isArray(initialValue) &&
|
|
241
|
+
typeof currentValue === 'object' &&
|
|
242
|
+
currentValue !== null &&
|
|
243
|
+
!isSignal(currentValue)) {
|
|
244
|
+
resetSignals(currentValue, initialValue);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
};
|
|
248
|
+
resetSignals(flattenedState, initialValues);
|
|
249
|
+
formSignals.errors.set({});
|
|
250
|
+
formSignals.asyncErrors.set({});
|
|
251
|
+
formSignals.touched.set({});
|
|
252
|
+
formSignals.asyncValidating.set({});
|
|
253
|
+
formSignals.dirty.set(false);
|
|
254
|
+
formSignals.valid.set(true);
|
|
255
|
+
formSignals.submitting.set(false);
|
|
256
|
+
},
|
|
257
|
+
submit: async (submitFn) => {
|
|
258
|
+
formSignals.submitting.set(true);
|
|
259
|
+
try {
|
|
260
|
+
await validate();
|
|
261
|
+
if (!formSignals.valid()) {
|
|
262
|
+
throw new Error('Form is invalid');
|
|
263
|
+
}
|
|
264
|
+
const currentValues = valuesTree.unwrap();
|
|
265
|
+
const result = await submitFn(currentValues);
|
|
266
|
+
return result;
|
|
267
|
+
}
|
|
268
|
+
finally {
|
|
269
|
+
formSignals.submitting.set(false);
|
|
270
|
+
}
|
|
271
|
+
},
|
|
272
|
+
validate,
|
|
273
|
+
// Field helpers
|
|
274
|
+
getFieldError: (field) => fieldErrors[field] || computed(() => undefined),
|
|
275
|
+
getFieldAsyncError: (field) => fieldAsyncErrors[field] || computed(() => undefined),
|
|
276
|
+
getFieldTouched: (field) => computed(() => {
|
|
277
|
+
const touched = formSignals.touched();
|
|
278
|
+
return touched[field];
|
|
279
|
+
}),
|
|
280
|
+
isFieldValid: (field) => computed(() => {
|
|
281
|
+
const errors = formSignals.errors();
|
|
282
|
+
const asyncErrors = formSignals.asyncErrors();
|
|
283
|
+
const asyncValidating = formSignals.asyncValidating();
|
|
284
|
+
return !errors[field] && !asyncErrors[field] && !asyncValidating[field];
|
|
285
|
+
}),
|
|
286
|
+
isFieldAsyncValidating: (field) => computed(() => {
|
|
287
|
+
const asyncValidating = formSignals.asyncValidating();
|
|
288
|
+
return asyncValidating[field];
|
|
289
|
+
}),
|
|
290
|
+
// Direct access
|
|
291
|
+
fieldErrors,
|
|
292
|
+
fieldAsyncErrors,
|
|
293
|
+
// Keep values tree for backward compatibility
|
|
294
|
+
values: valuesTree,
|
|
295
|
+
};
|
|
296
|
+
return formTree;
|
|
297
|
+
}
|
|
298
|
+
// ============================================
|
|
299
|
+
// ANGULAR DIRECTIVE
|
|
300
|
+
// ============================================
|
|
301
|
+
/**
|
|
302
|
+
* Simple directive for two-way binding with signals
|
|
303
|
+
*/
|
|
304
|
+
class SignalValueDirective {
|
|
305
|
+
signalTreeSignalValue;
|
|
306
|
+
signalTreeSignalValueChange = new EventEmitter();
|
|
307
|
+
elementRef = inject(ElementRef);
|
|
308
|
+
renderer = inject(Renderer2);
|
|
309
|
+
onChange = () => {
|
|
310
|
+
// Empty implementation for ControlValueAccessor
|
|
311
|
+
};
|
|
312
|
+
onTouched = () => {
|
|
313
|
+
// Empty implementation for ControlValueAccessor
|
|
314
|
+
};
|
|
315
|
+
ngOnInit() {
|
|
316
|
+
effect(() => {
|
|
317
|
+
const value = this.signalTreeSignalValue();
|
|
318
|
+
this.renderer.setProperty(this.elementRef.nativeElement, 'value', value);
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
handleChange(event) {
|
|
322
|
+
const target = event.target;
|
|
323
|
+
const value = target?.value;
|
|
324
|
+
if (value !== undefined) {
|
|
325
|
+
this.signalTreeSignalValue.set(value);
|
|
326
|
+
this.signalTreeSignalValueChange.emit(value);
|
|
327
|
+
this.onChange(value);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
handleBlur() {
|
|
331
|
+
this.onTouched();
|
|
332
|
+
}
|
|
333
|
+
writeValue(value) {
|
|
334
|
+
if (value !== undefined) {
|
|
335
|
+
this.signalTreeSignalValue.set(value);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
registerOnChange(fn) {
|
|
339
|
+
this.onChange = fn;
|
|
340
|
+
}
|
|
341
|
+
registerOnTouched(fn) {
|
|
342
|
+
this.onTouched = fn;
|
|
343
|
+
}
|
|
344
|
+
setDisabledState(isDisabled) {
|
|
345
|
+
this.renderer.setProperty(this.elementRef.nativeElement, 'disabled', isDisabled);
|
|
346
|
+
}
|
|
347
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: SignalValueDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
348
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.1.4", type: SignalValueDirective, isStandalone: true, selector: "[signalTreeSignalValue]", inputs: { signalTreeSignalValue: "signalTreeSignalValue" }, outputs: { signalTreeSignalValueChange: "signalTreeSignalValueChange" }, host: { listeners: { "input": "handleChange($event)", "change": "handleChange($event)", "blur": "handleBlur()" } }, providers: [
|
|
349
|
+
{
|
|
350
|
+
provide: NG_VALUE_ACCESSOR,
|
|
351
|
+
useExisting: forwardRef(() => SignalValueDirective),
|
|
352
|
+
multi: true,
|
|
353
|
+
},
|
|
354
|
+
], ngImport: i0 });
|
|
355
|
+
}
|
|
356
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: SignalValueDirective, decorators: [{
|
|
357
|
+
type: Directive,
|
|
358
|
+
args: [{
|
|
359
|
+
selector: '[signalTreeSignalValue]',
|
|
360
|
+
providers: [
|
|
361
|
+
{
|
|
362
|
+
provide: NG_VALUE_ACCESSOR,
|
|
363
|
+
useExisting: forwardRef(() => SignalValueDirective),
|
|
364
|
+
multi: true,
|
|
365
|
+
},
|
|
366
|
+
],
|
|
367
|
+
standalone: true,
|
|
368
|
+
}]
|
|
369
|
+
}], propDecorators: { signalTreeSignalValue: [{
|
|
370
|
+
type: Input
|
|
371
|
+
}], signalTreeSignalValueChange: [{
|
|
372
|
+
type: Output
|
|
373
|
+
}], handleChange: [{
|
|
374
|
+
type: HostListener,
|
|
375
|
+
args: ['input', ['$event']]
|
|
376
|
+
}, {
|
|
377
|
+
type: HostListener,
|
|
378
|
+
args: ['change', ['$event']]
|
|
379
|
+
}], handleBlur: [{
|
|
380
|
+
type: HostListener,
|
|
381
|
+
args: ['blur']
|
|
382
|
+
}] } });
|
|
383
|
+
// ============================================
|
|
384
|
+
// VALIDATORS
|
|
385
|
+
// ============================================
|
|
386
|
+
const validators = {
|
|
387
|
+
required: (message = 'Required') => (value) => !value ? message : null,
|
|
388
|
+
email: (message = 'Invalid email') => (value) => {
|
|
389
|
+
const strValue = value;
|
|
390
|
+
return strValue && !strValue.includes('@') ? message : null;
|
|
391
|
+
},
|
|
392
|
+
minLength: (min) => (value) => {
|
|
393
|
+
const strValue = value;
|
|
394
|
+
return strValue && strValue.length < min ? `Min ${min} characters` : null;
|
|
395
|
+
},
|
|
396
|
+
pattern: (regex, message = 'Invalid format') => (value) => {
|
|
397
|
+
const strValue = value;
|
|
398
|
+
return strValue && !regex.test(strValue) ? message : null;
|
|
399
|
+
},
|
|
400
|
+
};
|
|
401
|
+
const asyncValidators = {
|
|
402
|
+
unique: (checkFn, message = 'Already exists') => async (value) => {
|
|
403
|
+
if (!value)
|
|
404
|
+
return null;
|
|
405
|
+
const exists = await checkFn(value);
|
|
406
|
+
return exists ? message : null;
|
|
407
|
+
},
|
|
408
|
+
};
|
|
409
|
+
// ============================================
|
|
410
|
+
// RXJS BRIDGE
|
|
411
|
+
// ============================================
|
|
412
|
+
function toObservable(signal) {
|
|
413
|
+
return new Observable((subscriber) => {
|
|
414
|
+
try {
|
|
415
|
+
const effectRef = effect(() => {
|
|
416
|
+
subscriber.next(signal());
|
|
417
|
+
}, ...(ngDevMode ? [{ debugName: "effectRef" }] : []));
|
|
418
|
+
return () => effectRef.destroy();
|
|
419
|
+
}
|
|
420
|
+
catch {
|
|
421
|
+
// Fallback for test environment without injection context
|
|
422
|
+
subscriber.next(signal());
|
|
423
|
+
return () => {
|
|
424
|
+
// No cleanup needed for single emission
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
});
|
|
428
|
+
}
|
|
429
|
+
function createAuditMiddleware(auditLog, getMetadata) {
|
|
430
|
+
return {
|
|
431
|
+
id: 'audit',
|
|
432
|
+
after: (action, payload, oldState, newState) => {
|
|
433
|
+
const changes = getChanges(oldState, newState);
|
|
434
|
+
if (Object.keys(changes).length > 0) {
|
|
435
|
+
auditLog.push({
|
|
436
|
+
timestamp: Date.now(),
|
|
437
|
+
changes,
|
|
438
|
+
metadata: getMetadata?.(),
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
},
|
|
442
|
+
};
|
|
443
|
+
}
|
|
444
|
+
function getChanges(oldState, newState) {
|
|
445
|
+
const changes = {};
|
|
446
|
+
for (const key in newState) {
|
|
447
|
+
if (oldState[key] !== newState[key]) {
|
|
448
|
+
changes[key] = newState[key];
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
return changes;
|
|
452
|
+
}
|
|
453
|
+
// ============================================
|
|
454
|
+
// EXPORTS
|
|
455
|
+
// ============================================
|
|
456
|
+
const SIGNAL_FORM_DIRECTIVES = [SignalValueDirective];
|
|
457
|
+
|
|
458
|
+
/**
|
|
459
|
+
* Generated bundle index. Do not edit.
|
|
460
|
+
*/
|
|
461
|
+
|
|
462
|
+
export { SIGNAL_FORM_DIRECTIVES, SignalValueDirective, asyncValidators, createAuditMiddleware, createFormTree, toObservable, validators };
|
|
463
|
+
//# sourceMappingURL=signaltree-ng-forms.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signaltree-ng-forms.mjs","sources":["../tmp-esm2022/lib/ng-forms.js","../tmp-esm2022/signaltree-ng-forms.js"],"sourcesContent":["/**\n * @fileoverview Angular Forms Integration for SignalTree\n *\n * Provides comprehensive Angular form integration including FormTree,\n * directives, validators, enhanced array operations, and RxJS bridge.\n */\nimport { isSignal, signal, computed, effect, inject, Directive, Input, Output, EventEmitter, forwardRef, ElementRef, Renderer2, HostListener, } from '@angular/core';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { Observable } from 'rxjs';\nimport { signalTree } from '@signaltree/core';\nimport * as i0 from \"@angular/core\";\n// ============================================\n// UTILITY FUNCTIONS\n// ============================================\n/**\n * Simple path parsing for nested field access\n */\nfunction parsePath(path) {\n return path.split('.');\n}\n// ============================================\n// FORM TREE IMPLEMENTATION\n// ============================================\nexport function createFormTree(initialValues, config = {}) {\n const { validators = {}, asyncValidators = {}, ...treeConfig } = config;\n // Create the underlying signal tree\n const valuesTree = signalTree(initialValues, treeConfig);\n // Ensure the state has the correct type - this is the key fix\n const flattenedState = valuesTree.state;\n // Create form-specific signals\n const formSignals = {\n errors: signal({}),\n asyncErrors: signal({}),\n touched: signal({}),\n asyncValidating: signal({}),\n dirty: signal(false),\n valid: signal(true),\n submitting: signal(false),\n };\n const markDirty = () => formSignals.dirty.set(true);\n // Enhance arrays with natural operations\n const enhanceArray = (arraySignal) => {\n const enhanced = arraySignal;\n enhanced.push = (item) => {\n arraySignal.update((arr) => [...arr, item]);\n markDirty();\n };\n enhanced.removeAt = (index) => {\n arraySignal.update((arr) => arr.filter((_, i) => i !== index));\n markDirty();\n };\n enhanced.setAt = (index, value) => {\n arraySignal.update((arr) => arr.map((item, i) => (i === index ? value : item)));\n markDirty();\n };\n enhanced.insertAt = (index, item) => {\n arraySignal.update((arr) => [\n ...arr.slice(0, index),\n item,\n ...arr.slice(index),\n ]);\n markDirty();\n };\n enhanced.move = (from, to) => {\n arraySignal.update((arr) => {\n const newArr = [...arr];\n const [item] = newArr.splice(from, 1);\n if (item !== undefined) {\n newArr.splice(to, 0, item);\n }\n return newArr;\n });\n markDirty();\n };\n enhanced.clear = () => {\n arraySignal.set([]);\n markDirty();\n };\n return enhanced;\n };\n // Recursively enhance all arrays in the state\n const enhanceArraysRecursively = (obj) => {\n for (const key in obj) {\n const value = obj[key];\n if (isSignal(value)) {\n const signalValue = value();\n if (Array.isArray(signalValue)) {\n obj[key] = enhanceArray(value);\n }\n }\n else if (typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value)) {\n enhanceArraysRecursively(value);\n }\n }\n };\n // Enhance arrays in the state\n enhanceArraysRecursively(flattenedState);\n // Helper functions for nested paths\n const getNestedValue = (obj, path) => {\n const keys = parsePath(path);\n let current = obj;\n for (const key of keys) {\n if (current && typeof current === 'object') {\n current = current[key];\n if (isSignal(current)) {\n current = current();\n }\n }\n else {\n return undefined;\n }\n }\n return current;\n };\n const setNestedValue = (path, value) => {\n const keys = parsePath(path);\n let current = flattenedState;\n for (let i = 0; i < keys.length - 1; i++) {\n current = current[keys[i]];\n if (!current)\n return;\n }\n const lastKey = keys[keys.length - 1];\n const target = current[lastKey];\n if (isSignal(target) && 'set' in target) {\n target.set(value);\n }\n };\n const validate = async (field) => {\n const errors = {};\n const asyncErrors = {};\n const fieldsToValidate = field ? [field] : Object.keys(validators);\n // Sync validation\n for (const fieldPath of fieldsToValidate) {\n const validator = validators[fieldPath];\n if (validator) {\n const value = getNestedValue(flattenedState, fieldPath);\n const error = validator(value);\n if (error) {\n errors[fieldPath] = error;\n }\n }\n }\n formSignals.errors.set(errors);\n // Async validation\n const asyncFieldsToValidate = field\n ? [field]\n : Object.keys(asyncValidators);\n for (const fieldPath of asyncFieldsToValidate) {\n const asyncValidator = asyncValidators[fieldPath];\n if (asyncValidator && (!field || field === fieldPath)) {\n formSignals.asyncValidating.update((v) => ({\n ...v,\n [fieldPath]: true,\n }));\n try {\n const value = getNestedValue(flattenedState, fieldPath);\n const result = asyncValidator(value);\n let error;\n if (result instanceof Observable) {\n // Handle Observable\n error = await new Promise((resolve) => {\n result.subscribe({\n next: (val) => resolve(val),\n error: () => resolve('Validation error'),\n });\n });\n }\n else {\n // Handle Promise\n error = await result;\n }\n if (error) {\n asyncErrors[fieldPath] = error;\n }\n }\n catch {\n asyncErrors[fieldPath] = 'Validation error';\n }\n formSignals.asyncValidating.update((v) => ({\n ...v,\n [fieldPath]: false,\n }));\n }\n }\n formSignals.asyncErrors.set(asyncErrors);\n // Update validity\n const hasErrors = Object.keys(errors).length > 0;\n const hasAsyncErrors = Object.keys(asyncErrors).length > 0;\n const isValidating = Object.values(formSignals.asyncValidating()).some((v) => v);\n formSignals.valid.set(!hasErrors && !hasAsyncErrors && !isValidating);\n };\n // Create computed signals for field errors\n const fieldErrors = {};\n const fieldAsyncErrors = {};\n // Create error signals for all defined validators\n [...Object.keys(validators), ...Object.keys(asyncValidators)].forEach((fieldPath) => {\n fieldErrors[fieldPath] = computed(() => {\n const errors = formSignals.errors();\n return errors[fieldPath];\n });\n fieldAsyncErrors[fieldPath] = computed(() => {\n const errors = formSignals.asyncErrors();\n return errors[fieldPath];\n });\n });\n // Create the form tree object\n const formTree = {\n // Flattened state access\n state: flattenedState,\n $: flattenedState,\n // Form signals\n ...formSignals,\n // Core methods\n unwrap: () => valuesTree.unwrap(),\n setValue: (field, value) => {\n setNestedValue(field, value);\n formSignals.touched.update((t) => ({ ...t, [field]: true }));\n markDirty();\n void validate(field);\n },\n setValues: (values) => {\n valuesTree.update((v) => ({ ...v, ...values }));\n markDirty();\n void validate();\n },\n reset: () => {\n // Reset each field individually to maintain signal reactivity\n const resetSignals = (current, initial) => {\n for (const [key, initialValue] of Object.entries(initial)) {\n const currentValue = current[key];\n if (isSignal(currentValue) && 'set' in currentValue) {\n currentValue.set(initialValue);\n }\n else if (typeof initialValue === 'object' &&\n initialValue !== null &&\n !Array.isArray(initialValue) &&\n typeof currentValue === 'object' &&\n currentValue !== null &&\n !isSignal(currentValue)) {\n resetSignals(currentValue, initialValue);\n }\n }\n };\n resetSignals(flattenedState, initialValues);\n formSignals.errors.set({});\n formSignals.asyncErrors.set({});\n formSignals.touched.set({});\n formSignals.asyncValidating.set({});\n formSignals.dirty.set(false);\n formSignals.valid.set(true);\n formSignals.submitting.set(false);\n },\n submit: async (submitFn) => {\n formSignals.submitting.set(true);\n try {\n await validate();\n if (!formSignals.valid()) {\n throw new Error('Form is invalid');\n }\n const currentValues = valuesTree.unwrap();\n const result = await submitFn(currentValues);\n return result;\n }\n finally {\n formSignals.submitting.set(false);\n }\n },\n validate,\n // Field helpers\n getFieldError: (field) => fieldErrors[field] || computed(() => undefined),\n getFieldAsyncError: (field) => fieldAsyncErrors[field] || computed(() => undefined),\n getFieldTouched: (field) => computed(() => {\n const touched = formSignals.touched();\n return touched[field];\n }),\n isFieldValid: (field) => computed(() => {\n const errors = formSignals.errors();\n const asyncErrors = formSignals.asyncErrors();\n const asyncValidating = formSignals.asyncValidating();\n return !errors[field] && !asyncErrors[field] && !asyncValidating[field];\n }),\n isFieldAsyncValidating: (field) => computed(() => {\n const asyncValidating = formSignals.asyncValidating();\n return asyncValidating[field];\n }),\n // Direct access\n fieldErrors,\n fieldAsyncErrors,\n // Keep values tree for backward compatibility\n values: valuesTree,\n };\n return formTree;\n}\n// ============================================\n// ANGULAR DIRECTIVE\n// ============================================\n/**\n * Simple directive for two-way binding with signals\n */\nexport class SignalValueDirective {\n signalTreeSignalValue;\n signalTreeSignalValueChange = new EventEmitter();\n elementRef = inject(ElementRef);\n renderer = inject(Renderer2);\n onChange = () => {\n // Empty implementation for ControlValueAccessor\n };\n onTouched = () => {\n // Empty implementation for ControlValueAccessor\n };\n ngOnInit() {\n effect(() => {\n const value = this.signalTreeSignalValue();\n this.renderer.setProperty(this.elementRef.nativeElement, 'value', value);\n });\n }\n handleChange(event) {\n const target = event.target;\n const value = target?.value;\n if (value !== undefined) {\n this.signalTreeSignalValue.set(value);\n this.signalTreeSignalValueChange.emit(value);\n this.onChange(value);\n }\n }\n handleBlur() {\n this.onTouched();\n }\n writeValue(value) {\n if (value !== undefined) {\n this.signalTreeSignalValue.set(value);\n }\n }\n registerOnChange(fn) {\n this.onChange = fn;\n }\n registerOnTouched(fn) {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled) {\n this.renderer.setProperty(this.elementRef.nativeElement, 'disabled', isDisabled);\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: SignalValueDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });\n static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"20.1.4\", type: SignalValueDirective, isStandalone: true, selector: \"[signalTreeSignalValue]\", inputs: { signalTreeSignalValue: \"signalTreeSignalValue\" }, outputs: { signalTreeSignalValueChange: \"signalTreeSignalValueChange\" }, host: { listeners: { \"input\": \"handleChange($event)\", \"change\": \"handleChange($event)\", \"blur\": \"handleBlur()\" } }, providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SignalValueDirective),\n multi: true,\n },\n ], ngImport: i0 });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: SignalValueDirective, decorators: [{\n type: Directive,\n args: [{\n selector: '[signalTreeSignalValue]',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SignalValueDirective),\n multi: true,\n },\n ],\n standalone: true,\n }]\n }], propDecorators: { signalTreeSignalValue: [{\n type: Input\n }], signalTreeSignalValueChange: [{\n type: Output\n }], handleChange: [{\n type: HostListener,\n args: ['input', ['$event']]\n }, {\n type: HostListener,\n args: ['change', ['$event']]\n }], handleBlur: [{\n type: HostListener,\n args: ['blur']\n }] } });\n// ============================================\n// VALIDATORS\n// ============================================\nexport const validators = {\n required: (message = 'Required') => (value) => !value ? message : null,\n email: (message = 'Invalid email') => (value) => {\n const strValue = value;\n return strValue && !strValue.includes('@') ? message : null;\n },\n minLength: (min) => (value) => {\n const strValue = value;\n return strValue && strValue.length < min ? `Min ${min} characters` : null;\n },\n pattern: (regex, message = 'Invalid format') => (value) => {\n const strValue = value;\n return strValue && !regex.test(strValue) ? message : null;\n },\n};\nexport const asyncValidators = {\n unique: (checkFn, message = 'Already exists') => async (value) => {\n if (!value)\n return null;\n const exists = await checkFn(value);\n return exists ? message : null;\n },\n};\n// ============================================\n// RXJS BRIDGE\n// ============================================\nexport function toObservable(signal) {\n return new Observable((subscriber) => {\n try {\n const effectRef = effect(() => {\n subscriber.next(signal());\n }, ...(ngDevMode ? [{ debugName: \"effectRef\" }] : []));\n return () => effectRef.destroy();\n }\n catch {\n // Fallback for test environment without injection context\n subscriber.next(signal());\n return () => {\n // No cleanup needed for single emission\n };\n }\n });\n}\nexport function createAuditMiddleware(auditLog, getMetadata) {\n return {\n id: 'audit',\n after: (action, payload, oldState, newState) => {\n const changes = getChanges(oldState, newState);\n if (Object.keys(changes).length > 0) {\n auditLog.push({\n timestamp: Date.now(),\n changes,\n metadata: getMetadata?.(),\n });\n }\n },\n };\n}\nfunction getChanges(oldState, newState) {\n const changes = {};\n for (const key in newState) {\n if (oldState[key] !== newState[key]) {\n changes[key] = newState[key];\n }\n }\n return changes;\n}\n// ============================================\n// EXPORTS\n// ============================================\nexport const SIGNAL_FORM_DIRECTIVES = [SignalValueDirective];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctZm9ybXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9uZy1mb3Jtcy9zcmMvbGliL25nLWZvcm1zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBRUgsT0FBTyxFQUdMLFFBQVEsRUFDUixNQUFNLEVBQ04sUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLFVBQVUsRUFDVixVQUFVLEVBQ1YsU0FBUyxFQUNULFlBQVksR0FFYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQVNsQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7O0FBMkQ5QywrQ0FBK0M7QUFDL0Msb0JBQW9CO0FBQ3BCLCtDQUErQztBQUUvQzs7R0FFRztBQUNILFNBQVMsU0FBUyxDQUFDLElBQVk7SUFDN0IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLENBQUM7QUFFRCwrQ0FBK0M7QUFDL0MsMkJBQTJCO0FBQzNCLCtDQUErQztBQUUvQyxNQUFNLFVBQVUsY0FBYyxDQUM1QixhQUFnQixFQUNoQixTQUdpQixFQUFFO0lBRW5CLE1BQU0sRUFBRSxVQUFVLEdBQUcsRUFBRSxFQUFFLGVBQWUsR0FBRyxFQUFFLEVBQUUsR0FBRyxVQUFVLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFFeEUsb0NBQW9DO0lBQ3BDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxhQUFhLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFFekQsOERBQThEO0lBQzlELE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxLQUF5QixDQUFDO0lBRTVELCtCQUErQjtJQUMvQixNQUFN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RUFBRSxDQUFDO1lBQ3BDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0IsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLE9BQXFCLENBQUM7QUFDL0IsQ0FBQztBQUVELCtDQUErQztBQUMvQyxVQUFVO0FBQ1YsK0NBQStDO0FBRS9DLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVvdmVydmlldyBBbmd1bGFyIEZvcm1zIEludGVncmF0aW9uIGZvciBTaWduYWxUcmVlXG4gKlxuICogUHJvdmlkZXMgY29tcHJlaGVuc2l2ZSBBbmd1bGFyIGZvcm0gaW50ZWdyYXRpb24gaW5jbHVkaW5nIEZvcm1UcmVlLFxuICogZGlyZWN0aXZlcywgdmFsaWRhdG9ycywgZW5oYW5jZWQgYXJyYXkgb3BlcmF0aW9ucywgYW5kIFJ4SlMgYnJpZGdlLlxuICovXG5cbmltcG9ydCB7XG4gIFNpZ25hbCxcbiAgV3JpdGFibGVTaWduYWwsXG4gIGlzU2lnbmFsLFxuICBzaWduYWwsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIGluamVjdCxcbiAgRGlyZWN0aXZlLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIEVsZW1lbnRSZWYsXG4gIFJlbmRlcmVyMixcbiAgSG9zdExpc3RlbmVyLFxuICBPbkluaXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG4vLyBSZS1leHBvcnQgY29yZSB0eXBlcyBuZWVkZWQgZm9yIGZvcm1zXG5pbXBvcnQgdHlwZSB7XG4gIFNpZ25hbFRyZWUsXG4gIFRyZWVDb25maWcsXG4gIERlZXBTaWduYWxpZnksXG4gIE1pZGRsZXdhcmUsXG59IGZyb20gJ0BzaWduYWx0cmVlL2NvcmUnO1xuaW1wb3J0IHsgc2lnbmFsVHJlZSB9IGZyb20gJ0BzaWduYWx0cmVlL2NvcmUnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRk9STSBUUkVFIFRZUEVTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgdHlwZSBBc3luY1ZhbGlkYXRvckZuPFQ+ID0gKFxuICB2YWx1ZTogVFxuKSA9PiBPYnNlcnZhYmxlPHN0cmluZyB8IG51bGw+IHwgUHJvbWlzZTxzdHJpbmcgfCBudWxsPjtcblxuZXhwb3J0IHR5cGUgRW5oYW5jZWRBcnJheVNpZ25hbDxUPiA9IFdyaXRhYmxlU2lnbmFsPFRbXT4gJiB7XG4gIHB1c2g6IChpdGVtOiBUKSA9PiB2b2lkO1xuICByZW1vdmVBdDogKGluZGV4OiBudW1iZXIpID0+IHZvaWQ7XG4gIHNldEF0OiAoaW5kZXg6IG51bWJlciwgdmFsdWU6IFQpID0+IHZvaWQ7XG4gIGluc2VydEF0OiAoaW5kZXg6IG51bWJlciwgaXRlbTogVCkgPT4gdm9pZDtcbiAgbW92ZTogKGZyb206IG51bWJlciwgdG86IG51bWJlcikgPT4gdm9pZDtcbiAgY2xlYXI6ICgpID0+IHZvaWQ7XG59O1xuXG4vKipcbiAqIEZvcm0gdHJlZSB0eXBlIHRoYXQgZmxhdHRlbnMgdGhlIHN0YXRlIGFjY2VzcyB3aGlsZSBtYWludGFpbmluZyBmb3JtLXNwZWNpZmljIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IHR5cGUgRm9ybVRyZWU8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9IHtcbiAgLy8gRmxhdHRlbmVkIHN0YXRlIGFjY2VzcyAtIGRpcmVjdCBhY2Nlc3MgdG8gZm9ybSB2YWx1ZXMgYXMgc2lnbmFsc1xuICBzdGF0ZTogRGVlcFNpZ25hbGlmeTxUPjtcbiAgJDogRGVlcFNpZ25hbGlmeTxUPjsgLy8gQWxpYXMgZm9yIHN0YXRlXG5cbiAgLy8gRm9ybS1zcGVjaWZpYyBzaWduYWxzXG4gIGVycm9yczogV3JpdGFibGVTaWduYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG4gIGFzeW5jRXJyb3JzOiBXcml0YWJsZVNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcbiAgdG91Y2hlZDogV3JpdGFibGVTaWduYWw8UmVjb3JkPHN0cmluZywgYm9vbGVhbj4+O1xuICBhc3luY1ZhbGlkYXRpbmc6IFdyaXRhYmxlU2lnbmFsPFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+PjtcbiAgZGlydHk6IFdyaXRhYmxlU2lnbmFsPGJvb2xlYW4+O1xuICB2YWxpZDogV3JpdGFibGVTaWduYWw8Ym9vbGVhbj47XG4gIHN1Ym1pdHRpbmc6IFdyaXRhYmxlU2lnbmFsPGJvb2xlYW4+O1xuXG4gIC8vIEZvcm0gbWV0aG9kc1xuICB1bndyYXAoKTogVDtcbiAgc2V0VmFsdWUoZmllbGQ6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkO1xuICBzZXRWYWx1ZXModmFsdWVzOiBQYXJ0aWFsPFQ+KTogdm9pZDtcbiAgcmVzZXQoKTogdm9pZDtcbiAgc3VibWl0PFRSZXN1bHQ+KHN1Ym1pdEZuOiAodmFsdWVzOiBUKSA9PiBQcm9taXNlPFRSZXN1bHQ+KTogUHJvbWlzZTxUUmVzdWx0PjtcbiAgdmFsaWRhdGUoZmllbGQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8vIEZpZWxkLWxldmVsIGhlbHBlcnNcbiAgZ2V0RmllbGRFcnJvcihmaWVsZDogc3RyaW5nKTogU2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD47XG4gIGdldEZpZWxkQXN5bmNFcnJvcihmaWVsZDogc3RyaW5nKTogU2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD47XG4gIGdldEZpZWxkVG91Y2hlZChmaWVsZDogc3RyaW5nKTogU2lnbmFsPGJvb2xlYW4gfCB1bmRlZmluZWQ+O1xuICBpc0ZpZWxkVmFsaWQoZmllbGQ6IHN0cmluZyk6IFNpZ25hbDxib29sZWFuPjtcbiAgaXNGaWVsZEFzeW5jVmFsaWRhdGluZyhmaWVsZDogc3RyaW5nKTogU2lnbmFsPGJvb2xlYW4gfCB1bmRlZmluZWQ+O1xuXG4gIC8vIERpcmVjdCBhY2Nlc3MgdG8gZmllbGQgZXJyb3JzXG4gIGZpZWxkRXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCBTaWduYWw8c3RyaW5nIHwgdW5kZWZpbmVkPj47XG4gIGZpZWxkQXN5bmNFcnJvcnM6IFJlY29yZDxzdHJpbmcsIFNpZ25hbDxzdHJpbmcgfCB1bmRlZmluZWQ+PjtcblxuICAvLyBLZWVwIHZhbHVlcyB0cmVlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gIHZhbHVlczogU2lnbmFsVHJlZTxUPjtcbn07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBVVElMSVRZIEZVTkNUSU9OU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBTaW1wbGUgcGF0aCBwYXJzaW5nIGZvciBuZXN0ZWQgZmllbGQgYWNjZXNzXG4gKi9cbmZ1bmN0aW9uIHBhcnNlUGF0aChwYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBwYXRoLnNwbGl0KCcuJyk7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBGT1JNIFRSRUUgSU1QTEVNRU5UQVRJT05cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGb3JtVHJlZTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICBpbml0aWFsVmFsdWVzOiBULFxuICBjb25maWc6IHtcbiAgICB2YWxpZGF0b3JzPzogUmVjb3JkPHN0cmluZywgKHZhbHVlOiB1bmtub3duKSA9PiBzdHJpbmcgfCBudWxsPjtcbiAgICBhc3luY1ZhbGlkYXRvcnM/OiBSZWNvcmQ8c3RyaW5nLCBBc3luY1ZhbGlkYXRvckZuPHVua25vd24+PjtcbiAgfSAmIFRyZWVDb25maWcgPSB7fVxuKTogRm9ybVRyZWU8VD4ge1xuICBjb25zdCB7IHZhbGlkYXRvcnMgPSB7fSwgYXN5bmNWYWxpZGF0b3JzID0ge30sIC4uLnRyZWVDb25maWcgfSA9IGNvbmZpZztcblxuICAvLyBDcmVhdGUgdGhlIHVuZGVybHlpbmcgc2lnbmFsIHRyZWVcbiAgY29uc3QgdmFsdWVzVHJlZSA9IHNpZ25hbFRyZWUoaW5pdGlhbFZhbHVlcywgdHJlZUNvbmZpZyk7XG5cbiAgLy8gRW5zdXJlIHRoZSBzdGF0ZSBoYXMgdGhlIGNvcnJlY3QgdHlwZSAtIHRoaXMgaXMgdGhlIGtleSBmaXhcbiAgY29uc3QgZmxhdHRlbmVkU3RhdGUgPSB2YWx1ZXNUcmVlLnN0YXRlIGFzIERlZXBTaWduYWxpZnk8VD47XG5cbiAgLy8gQ3JlYXRlIGZvcm0tc3BlY2lmaWMgc2lnbmFsc1xuICBjb25zdCBmb3JtU2lnbmFscyA9IHtcbiAgICBlcnJvcnM6IHNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pih7fSksXG4gICAgYXN5bmNFcnJvcnM6IHNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pih7fSksXG4gICAgdG91Y2hlZDogc2lnbmFsPFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+Pih7fSksXG4gICAgYXN5bmNWYWxpZGF0aW5nOiBzaWduYWw8UmVjb3JkPHN0cmluZywgYm9vbGVhbj4+KHt9KSxcbiAgICBkaXJ0eTogc2lnbmFsKGZhbHNlKSxcbiAgICB2YWxpZDogc2lnbmFsKHRydWUpLFxuICAgIHN1Ym1pdHRpbmc6IHNpZ25hbChmYWxzZSksXG4gIH07XG5cbiAgY29uc3QgbWFya0RpcnR5ID0gKCkgPT4gZm9ybVNpZ25hbHMuZGlydHkuc2V0KHRydWUpO1xuXG4gIC8vIEVuaGFuY2UgYXJyYXlzIHdpdGggbmF0dXJhbCBvcGVyYXRpb25zXG4gIGNvbnN0IGVuaGFuY2VBcnJheSA9IDxVPihcbiAgICBhcnJheVNpZ25hbDogV3JpdGFibGVTaWduYWw8VVtdPlxuICApOiBFbmhhbmNlZEFycmF5U2lnbmFsPFU+ID0+IHtcbiAgICBjb25zdCBlbmhhbmNlZCA9IGFycmF5U2lnbmFsIGFzIEVuaGFuY2VkQXJyYXlTaWduYWw8VT47XG5cbiAgICBlbmhhbmNlZC5wdXNoID0gKGl0ZW06IFUpID0+IHtcbiAgICAgIGFycmF5U2lnbmFsLnVwZGF0ZSgoYXJyKSA9PiBbLi4uYXJyLCBpdGVtXSk7XG4gICAgICBtYXJrRGlydHkoKTtcbiAgICB9O1xuXG4gICAgZW5oYW5jZWQucmVtb3ZlQXQgPSAoaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgYXJyYXlTaWduYWwudXBkYXRlKChhcnIpID0+IGFyci5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KSk7XG4gICAgICBtYXJrRGlydHkoKTtcbiAgICB9O1xuXG4gICAgZW5oYW5jZWQuc2V0QXQgPSAoaW5kZXg6IG51bWJlciwgdmFsdWU6IFUpID0+IHtcbiAgICAgIGFycmF5U2lnbmFsLnVwZGF0ZSgoYXJyKSA9PlxuICAgICAgICBhcnIubWFwKChpdGVtLCBpKSA9PiAoaSA9PT0gaW5kZXggPyB2YWx1ZSA6IGl0ZW0pKVxuICAgICAgKTtcbiAgICAgIG1hcmtEaXJ0eSgpO1xuICAgIH07XG5cbiAgICBlbmhhbmNlZC5pbnNlcnRBdCA9IChpbmRleDogbnVtYmVyLCBpdGVtOiBVKSA9PiB7XG4gICAgICBhcnJheVNpZ25hbC51cGRhdGUoKGFycikgPT4gW1xuICAgICAgICAuLi5hcnIuc2xpY2UoMCwgaW5kZXgpLFxuICAgICAgICBpdGVtLFxuICAgICAgICAuLi5hcnIuc2xpY2UoaW5kZXgpLFxuICAgICAgXSk7XG4gICAgICBtYXJrRGlydHkoKTtcbiAgICB9O1xuXG4gICAgZW5oYW5jZWQubW92ZSA9IChmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIpID0+IHtcbiAgICAgIGFycmF5U2lnbmFsLnVwZGF0ZSgoYXJyKSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld0FyciA9IFsuLi5hcnJdO1xuICAgICAgICBjb25zdCBbaXRlbV0gPSBuZXdBcnIuc3BsaWNlKGZyb20sIDEpO1xuICAgICAgICBpZiAoaXRlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbmV3QXJyLnNwbGljZSh0bywgMCwgaXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld0FycjtcbiAgICAgIH0pO1xuICAgICAgbWFya0RpcnR5KCk7XG4gICAgfTtcblxuICAgIGVuaGFuY2VkLmNsZWFyID0gKCkgPT4ge1xuICAgICAgYXJyYXlTaWduYWwuc2V0KFtdKTtcbiAgICAgIG1hcmtEaXJ0eSgpO1xuICAgIH07XG5cbiAgICByZXR1cm4gZW5oYW5jZWQ7XG4gIH07XG5cbiAgLy8gUmVjdXJzaXZlbHkgZW5oYW5jZSBhbGwgYXJyYXlzIGluIHRoZSBzdGF0ZVxuICBjb25zdCBlbmhhbmNlQXJyYXlzUmVjdXJzaXZlbHkgPSAob2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQgPT4ge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcbiAgICAgIGlmIChpc1NpZ25hbCh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3Qgc2lnbmFsVmFsdWUgPSAodmFsdWUgYXMgU2lnbmFsPHVua25vd24+KSgpO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzaWduYWxWYWx1ZSkpIHtcbiAgICAgICAgICBvYmpba2V5XSA9IGVuaGFuY2VBcnJheSh2YWx1ZSBhcyBXcml0YWJsZVNpZ25hbDx1bmtub3duW10+KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgICAhQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgICkge1xuICAgICAgICBlbmhhbmNlQXJyYXlzUmVjdXJzaXZlbHkodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyBFbmhhbmNlIGFycmF5cyBpbiB0aGUgc3RhdGVcbiAgZW5oYW5jZUFycmF5c1JlY3Vyc2l2ZWx5KGZsYXR0ZW5lZFN0YXRlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcblxuICAvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBuZXN0ZWQgcGF0aHNcbiAgY29uc3QgZ2V0TmVzdGVkVmFsdWUgPSAob2JqOiBEZWVwU2lnbmFsaWZ5PFQ+LCBwYXRoOiBzdHJpbmcpOiB1bmtub3duID0+IHtcbiAgICBjb25zdCBrZXlzID0gcGFyc2VQYXRoKHBhdGgpO1xuICAgIGxldCBjdXJyZW50OiB1bmtub3duID0gb2JqO1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKGN1cnJlbnQgJiYgdHlwZW9mIGN1cnJlbnQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGN1cnJlbnQgPSAoY3VycmVudCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XTtcbiAgICAgICAgaWYgKGlzU2lnbmFsKGN1cnJlbnQpKSB7XG4gICAgICAgICAgY3VycmVudCA9IChjdXJyZW50IGFzIFNpZ25hbDx1bmtub3duPikoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudDtcbiAgfTtcblxuICBjb25zdCBzZXROZXN0ZWRWYWx1ZSA9IChwYXRoOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCA9PiB7XG4gICAgY29uc3Qga2V5cyA9IHBhcnNlUGF0aChwYXRoKTtcbiAgICBsZXQgY3VycmVudDogdW5rbm93biA9IGZsYXR0ZW5lZFN0YXRlO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgY3VycmVudCA9IChjdXJyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXlzW2ldXTtcbiAgICAgIGlmICghY3VycmVudCkgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxhc3RLZXkgPSBrZXlzW2tleXMubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgdGFyZ2V0ID0gKGN1cnJlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2xhc3RLZXldO1xuXG4gICAgaWYgKGlzU2lnbmFsKHRhcmdldCkgJiYgJ3NldCcgaW4gdGFyZ2V0KSB7XG4gICAgICAodGFyZ2V0IGFzIFdyaXRhYmxlU2lnbmFsPHVua25vd24+KS5zZXQodmFsdWUpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCB2YWxpZGF0ZSA9IGFzeW5jIChmaWVsZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IGVycm9yczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIGNvbnN0IGFzeW5jRXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgICBjb25zdCBmaWVsZHNUb1ZhbGlkYXRlID0gZmllbGQgPyBbZmllbGRdIDogT2JqZWN0LmtleXModmFsaWRhdG9ycyk7XG5cbiAgICAvLyBTeW5jIHZhbGlkYXRpb25cbiAgICBmb3IgKGNvbnN0IGZpZWxkUGF0aCBvZiBmaWVsZHNUb1ZhbGlkYXRlKSB7XG4gICAgICBjb25zdCB2YWxpZGF0b3IgPSB2YWxpZGF0b3JzW2ZpZWxkUGF0aF07XG4gICAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0TmVzdGVkVmFsdWUoZmxhdHRlbmVkU3RhdGUsIGZpZWxkUGF0aCk7XG4gICAgICAgIGNvbnN0IGVycm9yID0gdmFsaWRhdG9yKHZhbHVlKTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgZXJyb3JzW2ZpZWxkUGF0aF0gPSBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvcm1TaWduYWxzLmVycm9ycy5zZXQoZXJyb3JzKTtcblxuICAgIC8vIEFzeW5jIHZhbGlkYXRpb25cbiAgICBjb25zdCBhc3luY0ZpZWxkc1RvVmFsaWRhdGUgPSBmaWVsZFxuICAgICAgPyBbZmllbGRdXG4gICAgICA6IE9iamVjdC5rZXlzKGFzeW5jVmFsaWRhdG9ycyk7XG5cbiAgICBmb3IgKGNvbnN0IGZpZWxkUGF0aCBvZiBhc3luY0ZpZWxkc1RvVmFsaWRhdGUpIHtcbiAgICAgIGNvbnN0IGFzeW5jVmFsaWRhdG9yID0gYXN5bmNWYWxpZGF0b3JzW2ZpZWxkUGF0aF07XG4gICAgICBpZiAoYXN5bmNWYWxpZGF0b3IgJiYgKCFmaWVsZCB8fCBmaWVsZCA9PT0gZmllbGRQYXRoKSkge1xuICAgICAgICBmb3JtU2lnbmFscy5hc3luY1ZhbGlkYXRpbmcudXBkYXRlKCh2KSA9PiAoe1xuICAgICAgICAgIC4uLnYsXG4gICAgICAgICAgW2ZpZWxkUGF0aF06IHRydWUsXG4gICAgICAgIH0pKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0TmVzdGVkVmFsdWUoZmxhdHRlbmVkU3RhdGUsIGZpZWxkUGF0aCk7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXN5bmNWYWxpZGF0b3IodmFsdWUpO1xuXG4gICAgICAgICAgbGV0IGVycm9yOiBzdHJpbmcgfCBudWxsO1xuICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgT2JzZXJ2YWJsZVxuICAgICAgICAgICAgZXJyb3IgPSBhd2FpdCBuZXcgUHJvbWlzZTxzdHJpbmcgfCBudWxsPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICByZXN1bHQuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICBuZXh0OiAodmFsKSA9PiByZXNvbHZlKHZhbCksXG4gICAgICAgICAgICAgICAgZXJyb3I6ICgpID0+IHJlc29sdmUoJ1ZhbGlkYXRpb24gZXJyb3InKSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSGFuZGxlIFByb21pc2VcbiAgICAgICAgICAgIGVycm9yID0gYXdhaXQgcmVzdWx0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgYXN5bmNFcnJvcnNbZmllbGRQYXRoXSA9IGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgYXN5bmNFcnJvcnNbZmllbGRQYXRoXSA9ICdWYWxpZGF0aW9uIGVycm9yJztcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcm1TaWduYWxzLmFzeW5jVmFsaWRhdGluZy51cGRhdGUoKHYpID0+ICh7XG4gICAgICAgICAgLi4udixcbiAgICAgICAgICBbZmllbGRQYXRoXTogZmFsc2UsXG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3JtU2lnbmFscy5hc3luY0Vycm9ycy5zZXQoYXN5bmNFcnJvcnMpO1xuXG4gICAgLy8gVXBkYXRlIHZhbGlkaXR5XG4gICAgY29uc3QgaGFzRXJyb3JzID0gT2JqZWN0LmtleXMoZXJyb3JzKS5sZW5ndGggPiAwO1xuICAgIGNvbnN0IGhhc0FzeW5jRXJyb3JzID0gT2JqZWN0LmtleXMoYXN5bmNFcnJvcnMpLmxlbmd0aCA+IDA7XG4gICAgY29uc3QgaXNWYWxpZGF0aW5nID0gT2JqZWN0LnZhbHVlcyhmb3JtU2lnbmFscy5hc3luY1ZhbGlkYXRpbmcoKSkuc29tZShcbiAgICAgICh2KSA9PiB2XG4gICAgKTtcblxuICAgIGZvcm1TaWduYWxzLnZhbGlkLnNldCghaGFzRXJyb3JzICYmICFoYXNBc3luY0Vycm9ycyAmJiAhaXNWYWxpZGF0aW5nKTtcbiAgfTtcblxuICAvLyBDcmVhdGUgY29tcHV0ZWQgc2lnbmFscyBmb3IgZmllbGQgZXJyb3JzXG4gIGNvbnN0IGZpZWxkRXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCBTaWduYWw8c3RyaW5nIHwgdW5kZWZpbmVkPj4gPSB7fTtcbiAgY29uc3QgZmllbGRBc3luY0Vycm9yczogUmVjb3JkPHN0cmluZywgU2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD4+ID0ge307XG5cbiAgLy8gQ3JlYXRlIGVycm9yIHNpZ25hbHMgZm9yIGFsbCBkZWZpbmVkIHZhbGlkYXRvcnNcbiAgWy4uLk9iamVjdC5rZXlzKHZhbGlkYXRvcnMpLCAuLi5PYmplY3Qua2V5cyhhc3luY1ZhbGlkYXRvcnMpXS5mb3JFYWNoKFxuICAgIChmaWVsZFBhdGgpID0+IHtcbiAgICAgIGZpZWxkRXJyb3JzW2ZpZWxkUGF0aF0gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGVycm9ycyA9IGZvcm1TaWduYWxzLmVycm9ycygpO1xuICAgICAgICByZXR1cm4gZXJyb3JzW2ZpZWxkUGF0aF07XG4gICAgICB9KTtcbiAgICAgIGZpZWxkQXN5bmNFcnJvcnNbZmllbGRQYXRoXSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgZXJyb3JzID0gZm9ybVNpZ25hbHMuYXN5bmNFcnJvcnMoKTtcbiAgICAgICAgcmV0dXJuIGVycm9yc1tmaWVsZFBhdGhdO1xuICAgICAgfSk7XG4gICAgfVxuICApO1xuXG4gIC8vIENyZWF0ZSB0aGUgZm9ybSB0cmVlIG9iamVjdFxuICBjb25zdCBmb3JtVHJlZTogRm9ybVRyZWU8VD4gPSB7XG4gICAgLy8gRmxhdHRlbmVkIHN0YXRlIGFjY2Vzc1xuICAgIHN0YXRlOiBmbGF0dGVuZWRTdGF0ZSxcbiAgICAkOiBmbGF0dGVuZWRTdGF0ZSxcblxuICAgIC8vIEZvcm0gc2lnbmFsc1xuICAgIC4uLmZvcm1TaWduYWxzLFxuXG4gICAgLy8gQ29yZSBtZXRob2RzXG4gICAgdW53cmFwOiAoKSA9PiB2YWx1ZXNUcmVlLnVud3JhcCgpLFxuXG4gICAgc2V0VmFsdWU6IChmaWVsZDogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgICAgc2V0TmVzdGVkVmFsdWUoZmllbGQsIHZhbHVlKTtcbiAgICAgIGZvcm1TaWduYWxzLnRvdWNoZWQudXBkYXRlKCh0KSA9PiAoeyAuLi50LCBbZmllbGRdOiB0cnVlIH0pKTtcbiAgICAgIG1hcmtEaXJ0eSgpO1xuICAgICAgdm9pZCB2YWxpZGF0ZShmaWVsZCk7XG4gICAgfSxcblxuICAgIHNldFZhbHVlczogKHZhbHVlczogUGFydGlhbDxUPikgPT4ge1xuICAgICAgdmFsdWVzVHJlZS51cGRhdGUoKHYpID0+ICh7IC4uLnYsIC4uLnZhbHVlcyB9KSk7XG4gICAgICBtYXJrRGlydHkoKTtcbiAgICAgIHZvaWQgdmFsaWRhdGUoKTtcbiAgICB9LFxuXG4gICAgcmVzZXQ6ICgpID0+IHtcbiAgICAgIC8vIFJlc2V0IGVhY2ggZmllbGQgaW5kaXZpZHVhbGx5IHRvIG1haW50YWluIHNpZ25hbCByZWFjdGl2aXR5XG4gICAgICBjb25zdCByZXNldFNpZ25hbHMgPSA8VFJlc2V0IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICAgICAgICBjdXJyZW50OiBEZWVwU2lnbmFsaWZ5PFRSZXNldD4sXG4gICAgICAgIGluaXRpYWw6IFRSZXNldFxuICAgICAgKTogdm9pZCA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgaW5pdGlhbFZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhpbml0aWFsKSkge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IChjdXJyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldO1xuXG4gICAgICAgICAgaWYgKGlzU2lnbmFsKGN1cnJlbnRWYWx1ZSkgJiYgJ3NldCcgaW4gY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICAoY3VycmVudFZhbHVlIGFzIFdyaXRhYmxlU2lnbmFsPHVua25vd24+KS5zZXQoaW5pdGlhbFZhbHVlKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIGluaXRpYWxWYWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgIGluaXRpYWxWYWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkoaW5pdGlhbFZhbHVlKSAmJlxuICAgICAgICAgICAgdHlwZW9mIGN1cnJlbnRWYWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgIWlzU2lnbmFsKGN1cnJlbnRWYWx1ZSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJlc2V0U2lnbmFscyhcbiAgICAgICAgICAgICAgY3VycmVudFZhbHVlIGFzIERlZXBTaWduYWxpZnk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuICAgICAgICAgICAgICBpbml0aWFsVmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICByZXNldFNpZ25hbHMoZmxhdHRlbmVkU3RhdGUsIGluaXRpYWxWYWx1ZXMpO1xuXG4gICAgICBmb3JtU2lnbmFscy5lcnJvcnMuc2V0KHt9KTtcbiAgICAgIGZvcm1TaWduYWxzLmFzeW5jRXJyb3JzLnNldCh7fSk7XG4gICAgICBmb3JtU2lnbmFscy50b3VjaGVkLnNldCh7fSk7XG4gICAgICBmb3JtU2lnbmFscy5hc3luY1ZhbGlkYXRpbmcuc2V0KHt9KTtcbiAgICAgIGZvcm1TaWduYWxzLmRpcnR5LnNldChmYWxzZSk7XG4gICAgICBmb3JtU2lnbmFscy52YWxpZC5zZXQodHJ1ZSk7XG4gICAgICBmb3JtU2lnbmFscy5zdWJtaXR0aW5nLnNldChmYWxzZSk7XG4gICAgfSxcblxuICAgIHN1Ym1pdDogYXN5bmMgPFRSZXN1bHQ+KFxuICAgICAgc3VibWl0Rm46ICh2YWx1ZXM6IFQpID0+IFByb21pc2U8VFJlc3VsdD5cbiAgICApOiBQcm9taXNlPFRSZXN1bHQ+ID0+IHtcbiAgICAgIGZvcm1TaWduYWxzLnN1Ym1pdHRpbmcuc2V0KHRydWUpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB2YWxpZGF0ZSgpO1xuXG4gICAgICAgIGlmICghZm9ybVNpZ25hbHMudmFsaWQoKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRm9ybSBpcyBpbnZhbGlkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjdXJyZW50VmFsdWVzID0gdmFsdWVzVHJlZS51bndyYXAoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3VibWl0Rm4oY3VycmVudFZhbHVlcyk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBmb3JtU2lnbmFscy5zdWJtaXR0aW5nLnNldChmYWxzZSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIHZhbGlkYXRlLFxuXG4gICAgLy8gRmllbGQgaGVscGVyc1xuICAgIGdldEZpZWxkRXJyb3I6IChmaWVsZDogc3RyaW5nKSA9PlxuICAgICAgZmllbGRFcnJvcnNbZmllbGRdIHx8IGNvbXB1dGVkKCgpID0+IHVuZGVmaW5lZCksXG5cbiAgICBnZXRGaWVsZEFzeW5jRXJyb3I6IChmaWVsZDogc3RyaW5nKSA9PlxuICAgICAgZmllbGRBc3luY0Vycm9yc1tmaWVsZF0gfHwgY29tcHV0ZWQoKCkgPT4gdW5kZWZpbmVkKSxcblxuICAgIGdldEZpZWxkVG91Y2hlZDogKGZpZWxkOiBzdHJpbmcpID0+XG4gICAgICBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRvdWNoZWQgPSBmb3JtU2lnbmFscy50b3VjaGVkKCk7XG4gICAgICAgIHJldHVybiB0b3VjaGVkW2ZpZWxkXTtcbiAgICAgIH0pLFxuXG4gICAgaXNGaWVsZFZhbGlkOiAoZmllbGQ6IHN0cmluZykgPT5cbiAgICAgIGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgZXJyb3JzID0gZm9ybVNpZ25hbHMuZXJyb3JzKCk7XG4gICAgICAgIGNvbnN0IGFzeW5jRXJyb3JzID0gZm9ybVNpZ25hbHMuYXN5bmNFcnJvcnMoKTtcbiAgICAgICAgY29uc3QgYXN5bmNWYWxpZGF0aW5nID0gZm9ybVNpZ25hbHMuYXN5bmNWYWxpZGF0aW5nKCk7XG4gICAgICAgIHJldHVybiAhZXJyb3JzW2ZpZWxkXSAmJiAhYXN5bmNFcnJvcnNbZmllbGRdICYmICFhc3luY1ZhbGlkYXRpbmdbZmllbGRdO1xuICAgICAgfSksXG5cbiAgICBpc0ZpZWxkQXN5bmNWYWxpZGF0aW5nOiAoZmllbGQ6IHN0cmluZykgPT5cbiAgICAgIGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgYXN5bmNWYWxpZGF0aW5nID0gZm9ybVNpZ25hbHMuYXN5bmNWYWxpZGF0aW5nKCk7XG4gICAgICAgIHJldHVybiBhc3luY1ZhbGlkYXRpbmdbZmllbGRdO1xuICAgICAgfSksXG5cbiAgICAvLyBEaXJlY3QgYWNjZXNzXG4gICAgZmllbGRFcnJvcnMsXG4gICAgZmllbGRBc3luY0Vycm9ycyxcblxuICAgIC8vIEtlZXAgdmFsdWVzIHRyZWUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICB2YWx1ZXM6IHZhbHVlc1RyZWUsXG4gIH07XG5cbiAgcmV0dXJuIGZvcm1UcmVlO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQU5HVUxBUiBESVJFQ1RJVkVcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogU2ltcGxlIGRpcmVjdGl2ZSBmb3IgdHdvLXdheSBiaW5kaW5nIHdpdGggc2lnbmFsc1xuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbc2lnbmFsVHJlZVNpZ25hbFZhbHVlXScsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2lnbmFsVmFsdWVEaXJlY3RpdmUpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgU2lnbmFsVmFsdWVEaXJlY3RpdmUgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0IHtcbiAgQElucHV0KCkgc2lnbmFsVHJlZVNpZ25hbFZhbHVlITogV3JpdGFibGVTaWduYWw8dW5rbm93bj47XG4gIEBPdXRwdXQoKSBzaWduYWxUcmVlU2lnbmFsVmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHVua25vd24+KCk7XG5cbiAgcHJpdmF0ZSBlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICBwcml2YXRlIHJlbmRlcmVyID0gaW5qZWN0KFJlbmRlcmVyMik7XG5cbiAgcHJpdmF0ZSBvbkNoYW5nZTogKHZhbHVlOiB1bmtub3duKSA9PiB2b2lkID0gKCkgPT4ge1xuICAgIC8vIEVtcHR5IGltcGxlbWVudGF0aW9uIGZvciBDb250cm9sVmFsdWVBY2Nlc3NvclxuICB9O1xuICBwcml2YXRlIG9uVG91Y2hlZDogKCkgPT4gdm9pZCA9ICgpID0+IHtcbiAgICAvLyBFbXB0eSBpbXBsZW1lbnRhdGlvbiBmb3IgQ29udHJvbFZhbHVlQWNjZXNzb3JcbiAgfTtcblxuICBuZ09uSW5pdCgpIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnNpZ25hbFRyZWVTaWduYWxWYWx1ZSgpO1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3ZhbHVlJywgdmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignaW5wdXQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdjaGFuZ2UnLCBbJyRldmVudCddKVxuICBoYW5kbGVDaGFuZ2UoZXZlbnQ6IEV2ZW50KSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgY29uc3QgdmFsdWUgPSB0YXJnZXQ/LnZhbHVlO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNpZ25hbFRyZWVTaWduYWxWYWx1ZS5zZXQodmFsdWUpO1xuICAgICAgdGhpcy5zaWduYWxUcmVlU2lnbmFsVmFsdWVDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgICB0aGlzLm9uQ2hhbmdlKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdibHVyJylcbiAgaGFuZGxlQmx1cigpIHtcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNpZ25hbFRyZWVTaWduYWxWYWx1ZS5zZXQodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogdW5rbm93bikgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGU/KGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KFxuICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAnZGlzYWJsZWQnLFxuICAgICAgaXNEaXNhYmxlZFxuICAgICk7XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFZBTElEQVRPUlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0b3JzID0ge1xuICByZXF1aXJlZDpcbiAgICAobWVzc2FnZSA9ICdSZXF1aXJlZCcpID0+XG4gICAgKHZhbHVlOiB1bmtub3duKSA9PlxuICAgICAgIXZhbHVlID8gbWVzc2FnZSA6IG51bGwsXG5cbiAgZW1haWw6XG4gICAgKG1lc3NhZ2UgPSAnSW52YWxpZCBlbWFpbCcpID0+XG4gICAgKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgICBjb25zdCBzdHJWYWx1ZSA9IHZhbHVlIGFzIHN0cmluZztcbiAgICAgIHJldHVybiBzdHJWYWx1ZSAmJiAhc3RyVmFsdWUuaW5jbHVkZXMoJ0AnKSA/IG1lc3NhZ2UgOiBudWxsO1xuICAgIH0sXG5cbiAgbWluTGVuZ3RoOiAobWluOiBudW1iZXIpID0+ICh2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgIGNvbnN0IHN0clZhbHVlID0gdmFsdWUgYXMgc3RyaW5nO1xuICAgIHJldHVybiBzdHJWYWx1ZSAmJiBzdHJWYWx1ZS5sZW5ndGggPCBtaW4gPyBgTWluICR7bWlufSBjaGFyYWN0ZXJzYCA6IG51bGw7XG4gIH0sXG5cbiAgcGF0dGVybjpcbiAgICAocmVnZXg6IFJlZ0V4cCwgbWVzc2FnZSA9ICdJbnZhbGlkIGZvcm1hdCcpID0+XG4gICAgKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgICBjb25zdCBzdHJWYWx1ZSA9IHZhbHVlIGFzIHN0cmluZztcbiAgICAgIHJldHVybiBzdHJWYWx1ZSAmJiAhcmVnZXgudGVzdChzdHJWYWx1ZSkgPyBtZXNzYWdlIDogbnVsbDtcbiAgICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IGFzeW5jVmFsaWRhdG9ycyA9IHtcbiAgdW5pcXVlOlxuICAgIChcbiAgICAgIGNoZWNrRm46ICh2YWx1ZTogdW5rbm93bikgPT4gUHJvbWlzZTxib29sZWFuPixcbiAgICAgIG1lc3NhZ2UgPSAnQWxyZWFkeSBleGlzdHMnXG4gICAgKSA9PlxuICAgIGFzeW5jICh2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuIG51bGw7XG4gICAgICBjb25zdCBleGlzdHMgPSBhd2FpdCBjaGVja0ZuKHZhbHVlKTtcbiAgICAgIHJldHVybiBleGlzdHMgPyBtZXNzYWdlIDogbnVsbDtcbiAgICB9LFxufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFJYSlMgQlJJREdFXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgZnVuY3Rpb24gdG9PYnNlcnZhYmxlPFQ+KHNpZ25hbDogU2lnbmFsPFQ+KTogT2JzZXJ2YWJsZTxUPiB7XG4gIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgoc3Vic2NyaWJlcikgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBlZmZlY3RSZWYgPSBlZmZlY3QoKCkgPT4ge1xuICAgICAgICBzdWJzY3JpYmVyLm5leHQoc2lnbmFsKCkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gKCkgPT4gZWZmZWN0UmVmLmRlc3Ryb3koKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEZhbGxiYWNrIGZvciB0ZXN0IGVudmlyb25tZW50IHdpdGhvdXQgaW5qZWN0aW9uIGNvbnRleHRcbiAgICAgIHN1YnNjcmliZXIubmV4dChzaWduYWwoKSk7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAvLyBObyBjbGVhbnVwIG5lZWRlZCBmb3Igc2luZ2xlIGVtaXNzaW9uXG4gICAgICB9O1xuICAgIH1cbiAgfSk7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBBVURJVCBNSURETEVXQVJFXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGl0RW50cnk8VCA9IHVua25vd24+IHtcbiAgdGltZXN0YW1wOiBudW1iZXI7XG4gIGNoYW5nZXM6IFBhcnRpYWw8VD47XG4gIG1ldGFkYXRhPzoge1xuICAgIHVzZXJJZD86IHN0cmluZztcbiAgICBzb3VyY2U/OiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBdWRpdE1pZGRsZXdhcmU8VD4oXG4gIGF1ZGl0TG9nOiBBdWRpdEVudHJ5PFQ+W10sXG4gIGdldE1ldGFkYXRhPzogKCkgPT4gQXVkaXRFbnRyeTxUPlsnbWV0YWRhdGEnXVxuKTogTWlkZGxld2FyZTxUPiB7XG4gIHJldHVybiB7XG4gICAgaWQ6ICdhdWRpdCcsXG4gICAgYWZ0ZXI6IChhY3Rpb246IHN0cmluZywgcGF5bG9hZDogdW5rbm93biwgb2xkU3RhdGU6IFQsIG5ld1N0YXRlOiBUKSA9PiB7XG4gICAgICBjb25zdCBjaGFuZ2VzID0gZ2V0Q2hhbmdlcyhvbGRTdGF0ZSwgbmV3U3RhdGUpO1xuICAgICAgaWYgKE9iamVjdC5rZXlzKGNoYW5nZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXVkaXRMb2cucHVzaCh7XG4gICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgIGNoYW5nZXMsXG4gICAgICAgICAgbWV0YWRhdGE6IGdldE1ldGFkYXRhPy4oKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2hhbmdlczxUPihvbGRTdGF0ZTogVCwgbmV3U3RhdGU6IFQpOiBQYXJ0aWFsPFQ+IHtcbiAgY29uc3QgY2hhbmdlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICBmb3IgKGNvbnN0IGtleSBpbiBuZXdTdGF0ZSkge1xuICAgIGlmIChvbGRTdGF0ZVtrZXldICE9PSBuZXdTdGF0ZVtrZXldKSB7XG4gICAgICBjaGFuZ2VzW2tleV0gPSBuZXdTdGF0ZVtrZXldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjaGFuZ2VzIGFzIFBhcnRpYWw8VD47XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFWFBPUlRTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgY29uc3QgU0lHTkFMX0ZPUk1fRElSRUNUSVZFUyA9IFtTaWduYWxWYWx1ZURpcmVjdGl2ZV07XG4iXX0=","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsdHJlZS1uZy1mb3Jtcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL25nLWZvcm1zL3NyYy9zaWduYWx0cmVlLW5nLWZvcm1zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19"],"names":[],"mappings":"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"}
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { WritableSignal, Signal, OnInit, EventEmitter } from '@angular/core';
|
|
3
|
+
import { ControlValueAccessor } from '@angular/forms';
|
|
4
|
+
import { Observable } from 'rxjs';
|
|
5
|
+
import { DeepSignalify, SignalTree, TreeConfig, Middleware } from '@signaltree/core';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @fileoverview Angular Forms Integration for SignalTree
|
|
9
|
+
*
|
|
10
|
+
* Provides comprehensive Angular form integration including FormTree,
|
|
11
|
+
* directives, validators, enhanced array operations, and RxJS bridge.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
type AsyncValidatorFn<T> = (value: T) => Observable<string | null> | Promise<string | null>;
|
|
15
|
+
type EnhancedArraySignal<T> = WritableSignal<T[]> & {
|
|
16
|
+
push: (item: T) => void;
|
|
17
|
+
removeAt: (index: number) => void;
|
|
18
|
+
setAt: (index: number, value: T) => void;
|
|
19
|
+
insertAt: (index: number, item: T) => void;
|
|
20
|
+
move: (from: number, to: number) => void;
|
|
21
|
+
clear: () => void;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Form tree type that flattens the state access while maintaining form-specific properties
|
|
25
|
+
*/
|
|
26
|
+
type FormTree<T extends Record<string, unknown>> = {
|
|
27
|
+
state: DeepSignalify<T>;
|
|
28
|
+
$: DeepSignalify<T>;
|
|
29
|
+
errors: WritableSignal<Record<string, string>>;
|
|
30
|
+
asyncErrors: WritableSignal<Record<string, string>>;
|
|
31
|
+
touched: WritableSignal<Record<string, boolean>>;
|
|
32
|
+
asyncValidating: WritableSignal<Record<string, boolean>>;
|
|
33
|
+
dirty: WritableSignal<boolean>;
|
|
34
|
+
valid: WritableSignal<boolean>;
|
|
35
|
+
submitting: WritableSignal<boolean>;
|
|
36
|
+
unwrap(): T;
|
|
37
|
+
setValue(field: string, value: unknown): void;
|
|
38
|
+
setValues(values: Partial<T>): void;
|
|
39
|
+
reset(): void;
|
|
40
|
+
submit<TResult>(submitFn: (values: T) => Promise<TResult>): Promise<TResult>;
|
|
41
|
+
validate(field?: string): Promise<void>;
|
|
42
|
+
getFieldError(field: string): Signal<string | undefined>;
|
|
43
|
+
getFieldAsyncError(field: string): Signal<string | undefined>;
|
|
44
|
+
getFieldTouched(field: string): Signal<boolean | undefined>;
|
|
45
|
+
isFieldValid(field: string): Signal<boolean>;
|
|
46
|
+
isFieldAsyncValidating(field: string): Signal<boolean | undefined>;
|
|
47
|
+
fieldErrors: Record<string, Signal<string | undefined>>;
|
|
48
|
+
fieldAsyncErrors: Record<string, Signal<string | undefined>>;
|
|
49
|
+
values: SignalTree<T>;
|
|
50
|
+
};
|
|
51
|
+
declare function createFormTree<T extends Record<string, unknown>>(initialValues: T, config?: {
|
|
52
|
+
validators?: Record<string, (value: unknown) => string | null>;
|
|
53
|
+
asyncValidators?: Record<string, AsyncValidatorFn<unknown>>;
|
|
54
|
+
} & TreeConfig): FormTree<T>;
|
|
55
|
+
/**
|
|
56
|
+
* Simple directive for two-way binding with signals
|
|
57
|
+
*/
|
|
58
|
+
declare class SignalValueDirective implements ControlValueAccessor, OnInit {
|
|
59
|
+
signalTreeSignalValue: WritableSignal<unknown>;
|
|
60
|
+
signalTreeSignalValueChange: EventEmitter<unknown>;
|
|
61
|
+
private elementRef;
|
|
62
|
+
private renderer;
|
|
63
|
+
private onChange;
|
|
64
|
+
private onTouched;
|
|
65
|
+
ngOnInit(): void;
|
|
66
|
+
handleChange(event: Event): void;
|
|
67
|
+
handleBlur(): void;
|
|
68
|
+
writeValue(value: unknown): void;
|
|
69
|
+
registerOnChange(fn: (value: unknown) => void): void;
|
|
70
|
+
registerOnTouched(fn: () => void): void;
|
|
71
|
+
setDisabledState?(isDisabled: boolean): void;
|
|
72
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SignalValueDirective, never>;
|
|
73
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<SignalValueDirective, "[signalTreeSignalValue]", never, { "signalTreeSignalValue": { "alias": "signalTreeSignalValue"; "required": false; }; }, { "signalTreeSignalValueChange": "signalTreeSignalValueChange"; }, never, never, true, never>;
|
|
74
|
+
}
|
|
75
|
+
declare const validators: {
|
|
76
|
+
required: (message?: string) => (value: unknown) => string | null;
|
|
77
|
+
email: (message?: string) => (value: unknown) => string | null;
|
|
78
|
+
minLength: (min: number) => (value: unknown) => string | null;
|
|
79
|
+
pattern: (regex: RegExp, message?: string) => (value: unknown) => string | null;
|
|
80
|
+
};
|
|
81
|
+
declare const asyncValidators: {
|
|
82
|
+
unique: (checkFn: (value: unknown) => Promise<boolean>, message?: string) => (value: unknown) => Promise<string | null>;
|
|
83
|
+
};
|
|
84
|
+
declare function toObservable<T>(signal: Signal<T>): Observable<T>;
|
|
85
|
+
interface AuditEntry<T = unknown> {
|
|
86
|
+
timestamp: number;
|
|
87
|
+
changes: Partial<T>;
|
|
88
|
+
metadata?: {
|
|
89
|
+
userId?: string;
|
|
90
|
+
source?: string;
|
|
91
|
+
description?: string;
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
declare function createAuditMiddleware<T>(auditLog: AuditEntry<T>[], getMetadata?: () => AuditEntry<T>['metadata']): Middleware<T>;
|
|
95
|
+
declare const SIGNAL_FORM_DIRECTIVES: (typeof SignalValueDirective)[];
|
|
96
|
+
|
|
97
|
+
export { SIGNAL_FORM_DIRECTIVES, SignalValueDirective, asyncValidators, createAuditMiddleware, createFormTree, toObservable, validators };
|
|
98
|
+
export type { AsyncValidatorFn, AuditEntry, EnhancedArraySignal, FormTree };
|
package/package.json
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@signaltree/ng-forms",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"peerDependencies": {
|
|
5
|
+
"@angular/core": "^20.1.0",
|
|
6
|
+
"@angular/forms": "^20.1.0",
|
|
7
|
+
"@signaltree/core": "^1.0.0",
|
|
8
|
+
"rxjs": "^7.0.0"
|
|
9
|
+
},
|
|
10
|
+
"sideEffects": false,
|
|
11
|
+
"module": "fesm2022/signaltree-ng-forms.mjs",
|
|
12
|
+
"typings": "index.d.ts",
|
|
13
|
+
"exports": {
|
|
14
|
+
"./package.json": {
|
|
15
|
+
"default": "./package.json"
|
|
16
|
+
},
|
|
17
|
+
".": {
|
|
18
|
+
"types": "./index.d.ts",
|
|
19
|
+
"default": "./fesm2022/signaltree-ng-forms.mjs"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"tslib": "^2.3.0"
|
|
24
|
+
}
|
|
25
|
+
}
|