@decaf-ts/for-angular 0.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.
Files changed (43) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +297 -0
  3. package/dist/for-angular/README.md +297 -0
  4. package/dist/for-angular/assets/i18n/en.json +21 -0
  5. package/dist/for-angular/components/decaf-crud-field/decaf-crud-field.component.d.ts +22 -0
  6. package/dist/for-angular/components/decaf-crud-form/constants.d.ts +5 -0
  7. package/dist/for-angular/components/decaf-crud-form/decaf-crud-form.component.d.ts +28 -0
  8. package/dist/for-angular/components/decaf-crud-form/types.d.ts +17 -0
  9. package/dist/for-angular/components/decaf-model-renderer/decaf-model-renderer.component.d.ts +20 -0
  10. package/dist/for-angular/directives/decaf-field.directive.d.ts +8 -0
  11. package/dist/for-angular/engine/DynamicModule.d.ts +2 -0
  12. package/dist/for-angular/engine/NgxCrudFormField.d.ts +115 -0
  13. package/dist/for-angular/engine/NgxFormService.d.ts +119 -0
  14. package/dist/for-angular/engine/NgxRenderingEngine.d.ts +17 -0
  15. package/dist/for-angular/engine/ValidatorFactory.d.ts +4 -0
  16. package/dist/for-angular/engine/constants.d.ts +10 -0
  17. package/dist/for-angular/engine/decorators.d.ts +1 -0
  18. package/dist/for-angular/engine/index.d.ts +5 -0
  19. package/dist/for-angular/engine/types.d.ts +32 -0
  20. package/dist/for-angular/esm2022/components/decaf-crud-field/decaf-crud-field.component.mjs +66 -0
  21. package/dist/for-angular/esm2022/components/decaf-crud-form/constants.mjs +14 -0
  22. package/dist/for-angular/esm2022/components/decaf-crud-form/decaf-crud-form.component.mjs +84 -0
  23. package/dist/for-angular/esm2022/components/decaf-crud-form/types.mjs +2 -0
  24. package/dist/for-angular/esm2022/components/decaf-model-renderer/decaf-model-renderer.component.mjs +46 -0
  25. package/dist/for-angular/esm2022/decaf-ts-for-angular.mjs +5 -0
  26. package/dist/for-angular/esm2022/directives/decaf-field.directive.mjs +23 -0
  27. package/dist/for-angular/esm2022/engine/DynamicModule.mjs +3 -0
  28. package/dist/for-angular/esm2022/engine/NgxCrudFormField.mjs +118 -0
  29. package/dist/for-angular/esm2022/engine/NgxFormService.mjs +232 -0
  30. package/dist/for-angular/esm2022/engine/NgxRenderingEngine.mjs +35 -0
  31. package/dist/for-angular/esm2022/engine/ValidatorFactory.mjs +48 -0
  32. package/dist/for-angular/esm2022/engine/constants.mjs +12 -0
  33. package/dist/for-angular/esm2022/engine/decorators.mjs +17 -0
  34. package/dist/for-angular/esm2022/engine/index.mjs +6 -0
  35. package/dist/for-angular/esm2022/engine/types.mjs +2 -0
  36. package/dist/for-angular/esm2022/interfaces.mjs +2 -0
  37. package/dist/for-angular/esm2022/public-apis.mjs +5 -0
  38. package/dist/for-angular/fesm2022/decaf-ts-for-angular.mjs +675 -0
  39. package/dist/for-angular/fesm2022/decaf-ts-for-angular.mjs.map +1 -0
  40. package/dist/for-angular/index.d.ts +5 -0
  41. package/dist/for-angular/interfaces.d.ts +8 -0
  42. package/dist/for-angular/public-apis.d.ts +4 -0
  43. package/package.json +81 -0
@@ -0,0 +1,84 @@
1
+ import { Component, ElementRef, ViewChild, Input, Output, EventEmitter, } from '@angular/core';
2
+ import { FormGroup, ReactiveFormsModule } from '@angular/forms';
3
+ import { NgxFormService } from '../../engine/NgxFormService';
4
+ import { IonicModule } from '@ionic/angular';
5
+ import { DefaultFormReactiveOptions } from './constants';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@ionic/angular";
8
+ import * as i2 from "@angular/forms";
9
+ export class DecafCrudFormComponent {
10
+ constructor() {
11
+ this.updateOn = 'change';
12
+ this.target = '_self';
13
+ this.method = 'event';
14
+ this.formGroup = new FormGroup({});
15
+ this.submitEvent = new EventEmitter();
16
+ }
17
+ ngAfterViewInit() {
18
+ NgxFormService.formAfterViewInit(this, this.formId);
19
+ }
20
+ ngOnInit() {
21
+ this.options = Object.assign({}, DefaultFormReactiveOptions, this.options || {});
22
+ if (!this.formId)
23
+ this.formId = Date.now().toString();
24
+ }
25
+ ngOnDestroy() {
26
+ NgxFormService.forOnDestroy(this, this.formId);
27
+ }
28
+ /**
29
+ * @param {Event} event
30
+ */
31
+ submit(event) {
32
+ event.preventDefault();
33
+ event.stopImmediatePropagation();
34
+ event.stopPropagation();
35
+ if (!this.formGroup.valid)
36
+ return NgxFormService.validateFields(this.formGroup);
37
+ console.log('onSubmit');
38
+ // fix para valores de campos radio e check
39
+ const data = NgxFormService.getFormData(this.formId);
40
+ const submitEvent = {
41
+ data: data,
42
+ };
43
+ if (this.action)
44
+ return this.component.nativeElement.dispatchEvent(new CustomEvent('submit', data));
45
+ this.submitEvent.emit(submitEvent);
46
+ // self.emitEvent({
47
+ // role: button?.role || FORM_BUTTON_ROLES.SUBMIT,
48
+ // data,
49
+ // reset: button?.reset,
50
+ // operation: self.operation,
51
+ // eventName: self.eventName,
52
+ // event,
53
+ // } as FormReactiveSubmitEvent);
54
+ }
55
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DecafCrudFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
56
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DecafCrudFormComponent, isStandalone: true, selector: "decaf-crud-form", inputs: { updateOn: "updateOn", target: "target", method: "method", options: "options", action: "action", operation: "operation", formGroup: "formGroup", formId: "formId" }, outputs: { submitEvent: "submitEvent" }, viewQueries: [{ propertyName: "component", first: true, predicate: ["reactiveForm"], descendants: true, read: ElementRef }], ngImport: i0, template: "<form #reactiveForm [id]=\"formId\" [formGroup]=\"formGroup\" (submit)=\"submit($event)\" [target]=\"target\">\n <ng-content #formContent></ng-content>\n <div class=\"buttons-container\">\n <ion-button\n type=\"submit\">\n<!-- [shape]=\"buttons?.submit?.shape || 'round'\"-->\n<!-- [color]=\"buttons?.submit?.color || 'primary'\"-->\n<!-- [size]=\"buttons?.submit?.size || 'default'\"-->\n<!-- [fill]=\"buttons?.submit?.fill || 'solid'\"-->\n<!-- [disabled]=\"buttons?.submit?.disabled || false\"-->\n<!-- expand=\"block\"-->\n<!-- [disabled]=\"disableSubmitButtonWhenInvalid ? !form.valid : false\"-->\n @if(options.buttons.submit.icon) {\n <ion-icon [slot]=\"options.buttons.submit.iconSlot\" [name]=\"options.buttons.submit.icon\"></ion-icon>\n }\n {{options.buttons.submit.text}}\n </ion-button>\n @if(options.buttons.clear) {\n <ion-button>\n<!-- type=\"clear\"-->\n<!-- (click)=\"clear($event)\"-->\n<!-- [shape]=\"buttons?.clear?.shape || 'round'\"-->\n<!-- [color]=\"buttons?.clear?.color || 'primary'\"-->\n<!-- [size]=\"buttons?.clear?.size || 'default'\"-->\n<!-- [fill]=\"buttons?.clear?.fill || 'clear'\"-->\n<!-- [disabled]=\"buttons?.clear?.disabled || false\"-->\n<!-- expand=\"block\"-->\n @if(options.buttons.clear?.icon) {\n <ion-icon [slot]=\"options.buttons.clear?.iconSlot\" [name]=\"options.buttons.clear?.icon\"></ion-icon>\n }\n {{options.buttons.clear?.text}}\n </ion-button>\n }\n </div>\n</form>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: IonicModule }, { kind: "component", type: i1.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }] }); }
57
+ }
58
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DecafCrudFormComponent, decorators: [{
59
+ type: Component,
60
+ args: [{ standalone: true, selector: 'decaf-crud-form', imports: [IonicModule, ReactiveFormsModule], template: "<form #reactiveForm [id]=\"formId\" [formGroup]=\"formGroup\" (submit)=\"submit($event)\" [target]=\"target\">\n <ng-content #formContent></ng-content>\n <div class=\"buttons-container\">\n <ion-button\n type=\"submit\">\n<!-- [shape]=\"buttons?.submit?.shape || 'round'\"-->\n<!-- [color]=\"buttons?.submit?.color || 'primary'\"-->\n<!-- [size]=\"buttons?.submit?.size || 'default'\"-->\n<!-- [fill]=\"buttons?.submit?.fill || 'solid'\"-->\n<!-- [disabled]=\"buttons?.submit?.disabled || false\"-->\n<!-- expand=\"block\"-->\n<!-- [disabled]=\"disableSubmitButtonWhenInvalid ? !form.valid : false\"-->\n @if(options.buttons.submit.icon) {\n <ion-icon [slot]=\"options.buttons.submit.iconSlot\" [name]=\"options.buttons.submit.icon\"></ion-icon>\n }\n {{options.buttons.submit.text}}\n </ion-button>\n @if(options.buttons.clear) {\n <ion-button>\n<!-- type=\"clear\"-->\n<!-- (click)=\"clear($event)\"-->\n<!-- [shape]=\"buttons?.clear?.shape || 'round'\"-->\n<!-- [color]=\"buttons?.clear?.color || 'primary'\"-->\n<!-- [size]=\"buttons?.clear?.size || 'default'\"-->\n<!-- [fill]=\"buttons?.clear?.fill || 'clear'\"-->\n<!-- [disabled]=\"buttons?.clear?.disabled || false\"-->\n<!-- expand=\"block\"-->\n @if(options.buttons.clear?.icon) {\n <ion-icon [slot]=\"options.buttons.clear?.iconSlot\" [name]=\"options.buttons.clear?.icon\"></ion-icon>\n }\n {{options.buttons.clear?.text}}\n </ion-button>\n }\n </div>\n</form>\n" }]
61
+ }], propDecorators: { updateOn: [{
62
+ type: Input
63
+ }], component: [{
64
+ type: ViewChild,
65
+ args: ['reactiveForm', { static: false, read: ElementRef }]
66
+ }], target: [{
67
+ type: Input
68
+ }], method: [{
69
+ type: Input
70
+ }], options: [{
71
+ type: Input
72
+ }], action: [{
73
+ type: Input
74
+ }], operation: [{
75
+ type: Input,
76
+ args: [{ required: true }]
77
+ }], formGroup: [{
78
+ type: Input
79
+ }], formId: [{
80
+ type: Input
81
+ }], submitEvent: [{
82
+ type: Output
83
+ }] } });
84
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjYWYtY3J1ZC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9kZWNhZi1jcnVkLWZvcm0vZGVjYWYtY3J1ZC1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9kZWNhZi1jcnVkLWZvcm0vZGVjYWYtY3J1ZC1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsVUFBVSxFQUVWLFNBQVMsRUFFVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksR0FFYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFaEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzdELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUk3QyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxhQUFhLENBQUM7Ozs7QUFVekQsTUFBTSxPQUFPLHNCQUFzQjtJQVJuQztRQVlFLGFBQVEsR0FBb0IsUUFBUSxDQUFDO1FBTXJDLFdBQU0sR0FBbUIsT0FBTyxDQUFDO1FBR2pDLFdBQU0sR0FBNkIsT0FBTyxDQUFDO1FBWTNDLGNBQVMsR0FBYyxJQUFJLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQU16QyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUEyQixDQUFDO0tBcUQzRDtJQW5EQyxlQUFlO1FBQ2IsY0FBYyxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQzFCLEVBQUUsRUFDRiwwQkFBMEIsRUFDMUIsSUFBSSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQ25CLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07WUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN4RCxDQUFDO0lBRUQsV0FBVztRQUNULGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsS0FBa0I7UUFDdkIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ2pDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUV4QixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLO1lBQ3ZCLE9BQU8sY0FBYyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdkQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUV4QiwyQ0FBMkM7UUFDM0MsTUFBTSxJQUFJLEdBQUcsY0FBYyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFckQsTUFBTSxXQUFXLEdBQTRCO1lBQzNDLElBQUksRUFBRSxJQUFJO1NBQ1gsQ0FBQztRQUVGLElBQUksSUFBSSxDQUFDLE1BQU07WUFDYixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FDL0MsSUFBSSxXQUFXLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUNoQyxDQUFDO1FBRUosSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbkMsbUJBQW1CO1FBQ25CLG9EQUFvRDtRQUNwRCxVQUFVO1FBQ1YsMEJBQTBCO1FBQzFCLCtCQUErQjtRQUMvQiwrQkFBK0I7UUFDL0IsV0FBVztRQUNYLGlDQUFpQztJQUNuQyxDQUFDOytHQW5GVSxzQkFBc0I7bUdBQXRCLHNCQUFzQix3WEFNaUIsVUFBVSw2QkNsQzlELDRsREFtQ0EseUREVFksV0FBVyxtY0FBRSxtQkFBbUI7OzRGQUUvQixzQkFBc0I7a0JBUmxDLFNBQVM7aUNBQ0ksSUFBSSxZQUVOLGlCQUFpQixXQUdsQixDQUFDLFdBQVcsRUFBRSxtQkFBbUIsQ0FBQzs4QkFNM0MsUUFBUTtzQkFEUCxLQUFLO2dCQUlOLFNBQVM7c0JBRFIsU0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBSTlELE1BQU07c0JBREwsS0FBSztnQkFJTixNQUFNO3NCQURMLEtBQUs7Z0JBSU4sT0FBTztzQkFETixLQUFLO2dCQUlOLE1BQU07c0JBREwsS0FBSztnQkFJTixTQUFTO3NCQURSLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQUl6QixTQUFTO3NCQURSLEtBQUs7Z0JBSU4sTUFBTTtzQkFETCxLQUFLO2dCQUlOLFdBQVc7c0JBRFYsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgT25Jbml0LFxuICBWaWV3Q2hpbGQsXG4gIEFmdGVyVmlld0luaXQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgT25EZXN0cm95LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEZvcm1FbGVtZW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBOZ3hGb3JtU2VydmljZSB9IGZyb20gJy4uLy4uL2VuZ2luZS9OZ3hGb3JtU2VydmljZSc7XG5pbXBvcnQgeyBJb25pY01vZHVsZSB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7IEZpZWxkVXBkYXRlTW9kZSwgSFRNTEZvcm1UYXJnZXQgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgQ3J1ZEZvcm1PcHRpb25zLCBGb3JtUmVhY3RpdmVTdWJtaXRFdmVudCB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgQ3J1ZE9wZXJhdGlvbnMgfSBmcm9tICdAZGVjYWYtdHMvZGItZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBEZWZhdWx0Rm9ybVJlYWN0aXZlT3B0aW9ucyB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnZGVjYWYtY3J1ZC1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RlY2FmLWNydWQtZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2RlY2FmLWNydWQtZm9ybS5jb21wb25lbnQuc2NzcyddLFxuICBpbXBvcnRzOiBbSW9uaWNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGVdLFxufSlcbmV4cG9ydCBjbGFzcyBEZWNhZkNydWRGb3JtQ29tcG9uZW50XG4gIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBGb3JtRWxlbWVudCwgT25EZXN0cm95XG57XG4gIEBJbnB1dCgpXG4gIHVwZGF0ZU9uOiBGaWVsZFVwZGF0ZU1vZGUgPSAnY2hhbmdlJztcblxuICBAVmlld0NoaWxkKCdyZWFjdGl2ZUZvcm0nLCB7IHN0YXRpYzogZmFsc2UsIHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgY29tcG9uZW50ITogRWxlbWVudFJlZjtcblxuICBASW5wdXQoKVxuICB0YXJnZXQ6IEhUTUxGb3JtVGFyZ2V0ID0gJ19zZWxmJztcblxuICBASW5wdXQoKVxuICBtZXRob2Q6ICdnZXQnIHwgJ3Bvc3QnIHwgJ2V2ZW50JyA9ICdldmVudCc7XG5cbiAgQElucHV0KClcbiAgb3B0aW9ucyE6IENydWRGb3JtT3B0aW9ucztcblxuICBASW5wdXQoKVxuICBhY3Rpb24/OiBzdHJpbmc7XG5cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgb3BlcmF0aW9uITogQ3J1ZE9wZXJhdGlvbnM7XG5cbiAgQElucHV0KClcbiAgZm9ybUdyb3VwOiBGb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKHt9KTtcblxuICBASW5wdXQoKVxuICBmb3JtSWQhOiBzdHJpbmc7XG5cbiAgQE91dHB1dCgpXG4gIHN1Ym1pdEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxGb3JtUmVhY3RpdmVTdWJtaXRFdmVudD4oKTtcblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgTmd4Rm9ybVNlcnZpY2UuZm9ybUFmdGVyVmlld0luaXQodGhpcywgdGhpcy5mb3JtSWQpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIHt9LFxuICAgICAgRGVmYXVsdEZvcm1SZWFjdGl2ZU9wdGlvbnMsXG4gICAgICB0aGlzLm9wdGlvbnMgfHwge30sXG4gICAgKTtcbiAgICBpZiAoIXRoaXMuZm9ybUlkKSB0aGlzLmZvcm1JZCA9IERhdGUubm93KCkudG9TdHJpbmcoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIE5neEZvcm1TZXJ2aWNlLmZvck9uRGVzdHJveSh0aGlzLCB0aGlzLmZvcm1JZCk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtICB7RXZlbnR9IGV2ZW50XG4gICAqL1xuICBzdWJtaXQoZXZlbnQ6IFN1Ym1pdEV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIGlmICghdGhpcy5mb3JtR3JvdXAudmFsaWQpXG4gICAgICByZXR1cm4gTmd4Rm9ybVNlcnZpY2UudmFsaWRhdGVGaWVsZHModGhpcy5mb3JtR3JvdXApO1xuICAgIGNvbnNvbGUubG9nKCdvblN1Ym1pdCcpO1xuXG4gICAgLy8gZml4IHBhcmEgdmFsb3JlcyBkZSBjYW1wb3MgcmFkaW8gZSBjaGVja1xuICAgIGNvbnN0IGRhdGEgPSBOZ3hGb3JtU2VydmljZS5nZXRGb3JtRGF0YSh0aGlzLmZvcm1JZCk7XG5cbiAgICBjb25zdCBzdWJtaXRFdmVudDogRm9ybVJlYWN0aXZlU3VibWl0RXZlbnQgPSB7XG4gICAgICBkYXRhOiBkYXRhLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5hY3Rpb24pXG4gICAgICByZXR1cm4gdGhpcy5jb21wb25lbnQubmF0aXZlRWxlbWVudC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3N1Ym1pdCcsIGRhdGEpLFxuICAgICAgKTtcblxuICAgIHRoaXMuc3VibWl0RXZlbnQuZW1pdChzdWJtaXRFdmVudCk7XG4gICAgLy8gc2VsZi5lbWl0RXZlbnQoe1xuICAgIC8vICAgcm9sZTogYnV0dG9uPy5yb2xlIHx8IEZPUk1fQlVUVE9OX1JPTEVTLlNVQk1JVCxcbiAgICAvLyAgIGRhdGEsXG4gICAgLy8gICByZXNldDogYnV0dG9uPy5yZXNldCxcbiAgICAvLyAgIG9wZXJhdGlvbjogc2VsZi5vcGVyYXRpb24sXG4gICAgLy8gICBldmVudE5hbWU6IHNlbGYuZXZlbnROYW1lLFxuICAgIC8vICAgZXZlbnQsXG4gICAgLy8gfSBhcyBGb3JtUmVhY3RpdmVTdWJtaXRFdmVudCk7XG4gIH1cbn1cbiIsIjxmb3JtICNyZWFjdGl2ZUZvcm0gW2lkXT1cImZvcm1JZFwiIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCIgKHN1Ym1pdCk9XCJzdWJtaXQoJGV2ZW50KVwiIFt0YXJnZXRdPVwidGFyZ2V0XCI+XG4gIDxuZy1jb250ZW50ICNmb3JtQ29udGVudD48L25nLWNvbnRlbnQ+XG4gIDxkaXYgY2xhc3M9XCJidXR0b25zLWNvbnRhaW5lclwiPlxuICAgIDxpb24tYnV0dG9uXG4gICAgICB0eXBlPVwic3VibWl0XCI+XG48IS0tICAgICAgW3NoYXBlXT1cImJ1dHRvbnM/LnN1Ym1pdD8uc2hhcGUgfHwgJ3JvdW5kJ1wiLS0+XG48IS0tICAgICAgW2NvbG9yXT1cImJ1dHRvbnM/LnN1Ym1pdD8uY29sb3IgfHwgJ3ByaW1hcnknXCItLT5cbjwhLS0gICAgICBbc2l6ZV09XCJidXR0b25zPy5zdWJtaXQ/LnNpemUgfHwgJ2RlZmF1bHQnXCItLT5cbjwhLS0gICAgICBbZmlsbF09XCJidXR0b25zPy5zdWJtaXQ/LmZpbGwgfHwgJ3NvbGlkJ1wiLS0+XG48IS0tICAgICAgW2Rpc2FibGVkXT1cImJ1dHRvbnM/LnN1Ym1pdD8uZGlzYWJsZWQgfHwgZmFsc2VcIi0tPlxuPCEtLSAgICAgIGV4cGFuZD1cImJsb2NrXCItLT5cbjwhLS0gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZVN1Ym1pdEJ1dHRvbldoZW5JbnZhbGlkID8gIWZvcm0udmFsaWQgOiBmYWxzZVwiLS0+XG4gICAgICBAaWYob3B0aW9ucy5idXR0b25zLnN1Ym1pdC5pY29uKSB7XG4gICAgICAgIDxpb24taWNvbiBbc2xvdF09XCJvcHRpb25zLmJ1dHRvbnMuc3VibWl0Lmljb25TbG90XCIgW25hbWVdPVwib3B0aW9ucy5idXR0b25zLnN1Ym1pdC5pY29uXCI+PC9pb24taWNvbj5cbiAgICAgIH1cbiAgICAgIHt7b3B0aW9ucy5idXR0b25zLnN1Ym1pdC50ZXh0fX1cbiAgICA8L2lvbi1idXR0b24+XG4gICAgQGlmKG9wdGlvbnMuYnV0dG9ucy5jbGVhcikge1xuICAgICAgPGlvbi1idXR0b24+XG48IS0tICAgICAgICB0eXBlPVwiY2xlYXJcIi0tPlxuPCEtLSAgICAgICAgICAgIChjbGljayk9XCJjbGVhcigkZXZlbnQpXCItLT5cbjwhLS0gICAgICAgICAgICBbc2hhcGVdPVwiYnV0dG9ucz8uY2xlYXI/LnNoYXBlIHx8ICdyb3VuZCdcIi0tPlxuPCEtLSAgICAgICAgICAgIFtjb2xvcl09XCJidXR0b25zPy5jbGVhcj8uY29sb3IgfHwgJ3ByaW1hcnknXCItLT5cbjwhLS0gICAgICAgICAgICBbc2l6ZV09XCJidXR0b25zPy5jbGVhcj8uc2l6ZSB8fCAnZGVmYXVsdCdcIi0tPlxuPCEtLSAgICAgICAgICAgIFtmaWxsXT1cImJ1dHRvbnM/LmNsZWFyPy5maWxsIHx8ICdjbGVhcidcIi0tPlxuPCEtLSAgICAgICAgICAgIFtkaXNhYmxlZF09XCJidXR0b25zPy5jbGVhcj8uZGlzYWJsZWQgfHwgZmFsc2VcIi0tPlxuPCEtLSAgICAgICAgICAgIGV4cGFuZD1cImJsb2NrXCItLT5cbiAgICAgICAgQGlmKG9wdGlvbnMuYnV0dG9ucy5jbGVhcj8uaWNvbikge1xuICAgICAgICAgIDxpb24taWNvbiBbc2xvdF09XCJvcHRpb25zLmJ1dHRvbnMuY2xlYXI/Lmljb25TbG90XCIgW25hbWVdPVwib3B0aW9ucy5idXR0b25zLmNsZWFyPy5pY29uXCI+PC9pb24taWNvbj5cbiAgICAgICAgfVxuICAgICAgICB7e29wdGlvbnMuYnV0dG9ucy5jbGVhcj8udGV4dH19XG4gICAgICA8L2lvbi1idXR0b24+XG4gICAgfVxuICA8L2Rpdj5cbjwvZm9ybT5cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvZGVjYWYtY3J1ZC1mb3JtL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIEZvcm1SZWFjdGl2ZVN1Ym1pdEV2ZW50IHtcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3J1ZEZvcm1PcHRpb25zIHtcbiAgYnV0dG9uczoge1xuICAgIHN1Ym1pdDoge1xuICAgICAgaWNvbj86IHN0cmluZztcbiAgICAgIGljb25TbG90PzogJ3N0YXJ0JyB8ICdlbmQnO1xuICAgICAgdGV4dD86IHN0cmluZztcbiAgICB9O1xuICAgIGNsZWFyPzoge1xuICAgICAgaWNvbj86IHN0cmluZztcbiAgICAgIGljb25TbG90PzogJ3N0YXJ0JyB8ICdlbmQnO1xuICAgICAgdGV4dD86IHN0cmluZztcbiAgICB9O1xuICB9O1xufVxuIl19
@@ -0,0 +1,46 @@
1
+ import { Component, Input, ViewContainerRef, } from '@angular/core';
2
+ import { Model } from '@decaf-ts/decorator-validation';
3
+ import { IonSkeletonText } from '@ionic/angular/standalone';
4
+ import { NgComponentOutlet } from '@angular/common';
5
+ import * as i0 from "@angular/core";
6
+ export class DecafModelRendererComponent {
7
+ //
8
+ // @ViewChild('componentElementContainer', {
9
+ // static: true,
10
+ // read: ViewContainerRef,
11
+ // })
12
+ // componentElementContainer!: ViewContainerRef;
13
+ constructor(vcr) {
14
+ this.vcr = vcr;
15
+ }
16
+ ngOnInit() {
17
+ this.model =
18
+ typeof this.model === 'string'
19
+ ? Model.build({}, JSON.parse(this.model))
20
+ : this.model;
21
+ // this.output = RenderingEngine.render(this.model as unknown as Model);
22
+ // this.component = NgxRenderingEngine.components(this.output.tag);
23
+ // this.props = this.output.props;
24
+ // this.content = this.output.children?.map((child) => {
25
+ // return this.vcr.createEmbeddedView();
26
+ // });
27
+ }
28
+ ngOnChanges(changes) {
29
+ if (changes['model']) {
30
+ const { currentValue, previousValue, firstChange } = changes['model'];
31
+ }
32
+ if (changes['details']) {
33
+ const { currentValue, previousValue, firstChange } = changes['details'];
34
+ }
35
+ }
36
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DecafModelRendererComponent, deps: [{ token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component }); }
37
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DecafModelRendererComponent, isStandalone: true, selector: "decaf-model-renderer", inputs: { model: "model" }, usesOnChanges: true, ngImport: i0, template: "<!--<div #loadingElement>-->\n<!-- <ion-skeleton-text [animated]=\"true\" style=\"width: 100%;\"></ion-skeleton-text>-->\n<!--</div>-->\n@if (output?.children?.length){\n @for (item of output.children; track item.props.name){\n <ng-template>{{item.props.name}}</ng-template>\n }\n}\n<ng-container *ngComponentOutlet=\"component;\n inputs: props;\n content: content;\">\n</ng-container>\n", styles: [""], dependencies: [{ kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }] }); }
38
+ }
39
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DecafModelRendererComponent, decorators: [{
40
+ type: Component,
41
+ args: [{ standalone: true, imports: [IonSkeletonText, NgComponentOutlet], selector: 'decaf-model-renderer', template: "<!--<div #loadingElement>-->\n<!-- <ion-skeleton-text [animated]=\"true\" style=\"width: 100%;\"></ion-skeleton-text>-->\n<!--</div>-->\n@if (output?.children?.length){\n @for (item of output.children; track item.props.name){\n <ng-template>{{item.props.name}}</ng-template>\n }\n}\n<ng-container *ngComponentOutlet=\"component;\n inputs: props;\n content: content;\">\n</ng-container>\n" }]
42
+ }], ctorParameters: () => [{ type: i0.ViewContainerRef }], propDecorators: { model: [{
43
+ type: Input,
44
+ args: [{ required: true }]
45
+ }] } });
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjYWYtbW9kZWwtcmVuZGVyZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2RlY2FmLW1vZGVsLXJlbmRlcmVyL2RlY2FmLW1vZGVsLXJlbmRlcmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9kZWNhZi1tb2RlbC1yZW5kZXJlci9kZWNhZi1tb2RlbC1yZW5kZXJlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFJTCxnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUU1RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7QUFVcEQsTUFBTSxPQUFPLDJCQUEyQjtJQWF0QyxFQUFFO0lBQ0YsNENBQTRDO0lBQzVDLGtCQUFrQjtJQUNsQiw0QkFBNEI7SUFDNUIsS0FBSztJQUNMLGdEQUFnRDtJQUVoRCxZQUFvQixHQUFxQjtRQUFyQixRQUFHLEdBQUgsR0FBRyxDQUFrQjtJQUFHLENBQUM7SUFFN0MsUUFBUTtRQUNOLElBQUksQ0FBQyxLQUFLO1lBQ1IsT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVE7Z0JBQzVCLENBQUMsQ0FBRSxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBTztnQkFDaEQsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDakIsd0VBQXdFO1FBQ3hFLG1FQUFtRTtRQUNuRSxrQ0FBa0M7UUFDbEMsd0RBQXdEO1FBQ3hELDBDQUEwQztRQUMxQyxNQUFNO0lBQ1IsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUN2QixNQUFNLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUUsQ0FBQztJQUNILENBQUM7K0dBMUNVLDJCQUEyQjttR0FBM0IsMkJBQTJCLGlJQ3RCeEMsNmNBWUEsMERESTZCLGlCQUFpQjs7NEZBTWpDLDJCQUEyQjtrQkFSdkMsU0FBUztpQ0FDSSxJQUFJLFdBQ1AsQ0FBQyxlQUFlLEVBQUUsaUJBQWlCLENBQUMsWUFFbkMsc0JBQXNCO3FGQVFoQyxLQUFLO3NCQURKLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDb250YWluZXJSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRmllbGREZWZpbml0aW9uIH0gZnJvbSAnQGRlY2FmLXRzL3VpLWRlY29yYXRvcnMnO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tICdAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb24nO1xuaW1wb3J0IHsgSW9uU2tlbGV0b25UZXh0IH0gZnJvbSAnQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZSc7XG5pbXBvcnQgeyBBbmd1bGFyRmllbGREZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IE5nQ29tcG9uZW50T3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtJb25Ta2VsZXRvblRleHQsIE5nQ29tcG9uZW50T3V0bGV0XSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdkZWNhZi1tb2RlbC1yZW5kZXJlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9kZWNhZi1tb2RlbC1yZW5kZXJlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9kZWNhZi1tb2RlbC1yZW5kZXJlci5jb21wb25lbnQuc2NzcycsXG59KVxuZXhwb3J0IGNsYXNzIERlY2FmTW9kZWxSZW5kZXJlckNvbXBvbmVudDxNIGV4dGVuZHMgTW9kZWw+XG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXNcbntcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgbW9kZWwhOiBNIHwgc3RyaW5nO1xuXG4gIGNvbXBvbmVudCE6IHVua25vd247XG5cbiAgcHJvcHMhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICBjb250ZW50ITogeyBpZDogc3RyaW5nIH1bXVtdO1xuXG4gIG91dHB1dCE6IEZpZWxkRGVmaW5pdGlvbjxBbmd1bGFyRmllbGREZWZpbml0aW9uPjtcbiAgLy9cbiAgLy8gQFZpZXdDaGlsZCgnY29tcG9uZW50RWxlbWVudENvbnRhaW5lcicsIHtcbiAgLy8gICBzdGF0aWM6IHRydWUsXG4gIC8vICAgcmVhZDogVmlld0NvbnRhaW5lclJlZixcbiAgLy8gfSlcbiAgLy8gY29tcG9uZW50RWxlbWVudENvbnRhaW5lciE6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSB2Y3I6IFZpZXdDb250YWluZXJSZWYpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5tb2RlbCA9XG4gICAgICB0eXBlb2YgdGhpcy5tb2RlbCA9PT0gJ3N0cmluZydcbiAgICAgICAgPyAoTW9kZWwuYnVpbGQoe30sIEpTT04ucGFyc2UodGhpcy5tb2RlbCkpIGFzIE0pXG4gICAgICAgIDogdGhpcy5tb2RlbDtcbiAgICAvLyB0aGlzLm91dHB1dCA9IFJlbmRlcmluZ0VuZ2luZS5yZW5kZXIodGhpcy5tb2RlbCBhcyB1bmtub3duIGFzIE1vZGVsKTtcbiAgICAvLyB0aGlzLmNvbXBvbmVudCA9IE5neFJlbmRlcmluZ0VuZ2luZS5jb21wb25lbnRzKHRoaXMub3V0cHV0LnRhZyk7XG4gICAgLy8gdGhpcy5wcm9wcyA9IHRoaXMub3V0cHV0LnByb3BzO1xuICAgIC8vIHRoaXMuY29udGVudCA9IHRoaXMub3V0cHV0LmNoaWxkcmVuPy5tYXAoKGNoaWxkKSA9PiB7XG4gICAgLy8gICByZXR1cm4gdGhpcy52Y3IuY3JlYXRlRW1iZWRkZWRWaWV3KCk7XG4gICAgLy8gfSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ21vZGVsJ10pIHtcbiAgICAgIGNvbnN0IHsgY3VycmVudFZhbHVlLCBwcmV2aW91c1ZhbHVlLCBmaXJzdENoYW5nZSB9ID0gY2hhbmdlc1snbW9kZWwnXTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2RldGFpbHMnXSkge1xuICAgICAgY29uc3QgeyBjdXJyZW50VmFsdWUsIHByZXZpb3VzVmFsdWUsIGZpcnN0Q2hhbmdlIH0gPSBjaGFuZ2VzWydkZXRhaWxzJ107XG4gICAgfVxuICB9XG4gIC8vIC8vXG4gIC8vIG5nT25EZXN0cm95KCk6IHZvaWQge31cbn1cbiIsIjwhLS08ZGl2ICNsb2FkaW5nRWxlbWVudD4tLT5cbjwhLS0gIDxpb24tc2tlbGV0b24tdGV4dCBbYW5pbWF0ZWRdPVwidHJ1ZVwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCI+PC9pb24tc2tlbGV0b24tdGV4dD4tLT5cbjwhLS08L2Rpdj4tLT5cbkBpZiAob3V0cHV0Py5jaGlsZHJlbj8ubGVuZ3RoKXtcbiAgQGZvciAoaXRlbSBvZiBvdXRwdXQuY2hpbGRyZW47IHRyYWNrIGl0ZW0ucHJvcHMubmFtZSl7XG4gICAgPG5nLXRlbXBsYXRlPnt7aXRlbS5wcm9wcy5uYW1lfX08L25nLXRlbXBsYXRlPlxuICB9XG59XG48bmctY29udGFpbmVyICpuZ0NvbXBvbmVudE91dGxldD1cImNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dHM6IHByb3BzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQ7XCI+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-apis';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjYWYtdHMtZm9yLWFuZ3VsYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2RlY2FmLXRzLWZvci1hbmd1bGFyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxlQUFlLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vcHVibGljLWFwaXMnO1xuIl19
@@ -0,0 +1,23 @@
1
+ import { Directive, HostBinding, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class DecafFieldDirective {
4
+ constructor() {
5
+ this.name = this.fieldName;
6
+ }
7
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DecafFieldDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
8
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: DecafFieldDirective, isStandalone: true, selector: "[appDecafField]", inputs: { fieldName: ["appDecafField", "fieldName"] }, host: { properties: { "#name": "this.name" } }, ngImport: i0 }); }
9
+ }
10
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DecafFieldDirective, decorators: [{
11
+ type: Directive,
12
+ args: [{
13
+ selector: '[appDecafField]',
14
+ standalone: true,
15
+ }]
16
+ }], ctorParameters: () => [], propDecorators: { fieldName: [{
17
+ type: Input,
18
+ args: [{ alias: 'appDecafField' }]
19
+ }], name: [{
20
+ type: HostBinding,
21
+ args: ['#name']
22
+ }] } });
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjYWYtZmllbGQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9kaXJlY3RpdmVzL2RlY2FmLWZpZWxkLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBTTlELE1BQU0sT0FBTyxtQkFBbUI7SUFLOUI7UUFDRSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDN0IsQ0FBQzsrR0FQVSxtQkFBbUI7bUdBQW5CLG1CQUFtQjs7NEZBQW5CLG1CQUFtQjtrQkFKL0IsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsaUJBQWlCO29CQUMzQixVQUFVLEVBQUUsSUFBSTtpQkFDakI7d0RBRW9DLFNBQVM7c0JBQTNDLEtBQUs7dUJBQUMsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFO2dCQUVYLElBQUk7c0JBQXpCLFdBQVc7dUJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgSG9zdEJpbmRpbmcsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1thcHBEZWNhZkZpZWxkXScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIERlY2FmRmllbGREaXJlY3RpdmUge1xuICBASW5wdXQoeyBhbGlhczogJ2FwcERlY2FmRmllbGQnIH0pIGZpZWxkTmFtZSE6IHN0cmluZztcblxuICBASG9zdEJpbmRpbmcoJyNuYW1lJykgbmFtZSE6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLm5hbWUgPSB0aGlzLmZpZWxkTmFtZTtcbiAgfVxufVxuIl19
@@ -0,0 +1,3 @@
1
+ export class DynamicModule {
2
+ }
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRHluYW1pY01vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZW5naW5lL0R5bmFtaWNNb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFnQixhQUFhO0NBQUciLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgYWJzdHJhY3QgY2xhc3MgRHluYW1pY01vZHVsZSB7fVxuIl19
@@ -0,0 +1,118 @@
1
+ import { InternalError, OperationKeys, } from '@decaf-ts/db-decorators';
2
+ import { NgxFormService } from './NgxFormService';
3
+ import { sf } from '@decaf-ts/decorator-validation';
4
+ /**
5
+ * @class NgxCrudFormField
6
+ * @implements {CrudFormField<AngularFieldDefinition>}
7
+ * @implements {ControlValueAccessor}
8
+ * @summary Abstract class representing a CRUD form field for Angular applications
9
+ * @description This class provides the base implementation for CRUD form fields in Angular,
10
+ * implementing both CrudFormField and ControlValueAccessor interfaces.
11
+ */
12
+ export class NgxCrudFormField {
13
+ constructor() {
14
+ /**
15
+ * @summary String formatting function
16
+ * @description Provides access to the sf function for error message formatting
17
+ */
18
+ this.sf = sf;
19
+ /**
20
+ * @summary Change callback function
21
+ * @description Function called when the field value changes
22
+ */
23
+ this.onChange = () => { };
24
+ /**
25
+ * @summary Touch callback function
26
+ * @description Function called when the field is touched
27
+ */
28
+ this.onTouch = () => { };
29
+ }
30
+ /**
31
+ * @summary Write value to the field
32
+ * @description Sets the value of the field
33
+ * @param {string} obj - The value to be set
34
+ */
35
+ writeValue(obj) {
36
+ this.value = obj;
37
+ }
38
+ /**
39
+ * @summary Register change callback
40
+ * @description Registers a function to be called when the field value changes
41
+ * @param {() => unknown} fn - The function to be called on change
42
+ */
43
+ registerOnChange(fn) {
44
+ this.onChange = fn;
45
+ }
46
+ /**
47
+ * @summary Register touch callback
48
+ * @description Registers a function to be called when the field is touched
49
+ * @param {() => unknown} fn - The function to be called on touch
50
+ */
51
+ registerOnTouched(fn) {
52
+ this.onTouch = fn;
53
+ }
54
+ /**
55
+ * @summary Set disabled state
56
+ * @description Sets the disabled state of the field
57
+ * @param {boolean} isDisabled - Whether the field should be disabled
58
+ */
59
+ setDisabledState(isDisabled) {
60
+ this.props.disabled = isDisabled;
61
+ }
62
+ /**
63
+ * @summary After view initialization logic
64
+ * @description Performs necessary setup after the view has been initialized
65
+ * @returns {HTMLElement} The parent element of the field
66
+ */
67
+ afterViewInit() {
68
+ let parent;
69
+ switch (this.operation) {
70
+ case OperationKeys.CREATE:
71
+ case OperationKeys.UPDATE:
72
+ case OperationKeys.DELETE:
73
+ try {
74
+ parent = NgxFormService.getParentEl(this.component.nativeElement, 'form');
75
+ }
76
+ catch (e) {
77
+ throw new Error(`Unable to retrieve parent form element for the ${this.operation}: ${e instanceof Error ? e.message : e}`);
78
+ }
79
+ NgxFormService.register(parent.id, this.formGroup, this.props);
80
+ return parent;
81
+ default:
82
+ throw new Error(`Invalid operation: ${this.operation}`);
83
+ }
84
+ }
85
+ /**
86
+ * @summary Cleanup on component destruction
87
+ * @description Unregisters the field when the component is destroyed
88
+ */
89
+ onDestroy() {
90
+ if (this.parent)
91
+ NgxFormService.unregister(this.parent.id, this.component.nativeElement);
92
+ }
93
+ /**
94
+ * @summary Initialize the field
95
+ * @description Sets up the form group and field name
96
+ * @param {FieldUpdateMode} updateOn - The update mode for the field
97
+ */
98
+ onInit(updateOn) {
99
+ if (!this.props || !this.operation)
100
+ throw new InternalError(`props and operation are required`);
101
+ this.formGroup = NgxFormService.fromProps(this.props, updateOn);
102
+ this.name = this.props.name;
103
+ }
104
+ /**
105
+ * @summary Get field errors
106
+ * @description Retrieves all errors associated with the field
107
+ * @returns {{key: string, message: string}[]} An array of error objects
108
+ */
109
+ getErrors() {
110
+ return Object.entries(this.formGroup.controls).reduce((accum, [prop, control]) => {
111
+ Object.entries(control.errors).forEach(([k, c]) => {
112
+ accum.push({ key: k, message: k });
113
+ });
114
+ return accum;
115
+ }, []);
116
+ }
117
+ }
118
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmd4Q3J1ZEZvcm1GaWVsZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZW5naW5lL05neENydWRGb3JtRmllbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUVMLGFBQWEsRUFDYixhQUFhLEdBQ2QsTUFBTSx5QkFBeUIsQ0FBQztBQUdqQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXBEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLE9BQWdCLGdCQUFnQjtJQUF0QztRQTZDRTs7O1dBR0c7UUFDSCxPQUFFLEdBQUcsRUFBRSxDQUFDO1FBRVI7OztXQUdHO1FBQ0gsYUFBUSxHQUFrQixHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFFbkM7OztXQUdHO1FBQ0gsWUFBTyxHQUFrQixHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7SUF5R3BDLENBQUM7SUF2R0M7Ozs7T0FJRztJQUNILFVBQVUsQ0FBQyxHQUFXO1FBQ3BCLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsZ0JBQWdCLENBQUMsRUFBaUI7UUFDaEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxpQkFBaUIsQ0FBQyxFQUFpQjtRQUNqQyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGdCQUFnQixDQUFFLFVBQW1CO1FBQ25DLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGFBQWE7UUFDWCxJQUFJLE1BQW1CLENBQUM7UUFDeEIsUUFBUSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDdkIsS0FBSyxhQUFhLENBQUMsTUFBTSxDQUFDO1lBQzFCLEtBQUssYUFBYSxDQUFDLE1BQU0sQ0FBQztZQUMxQixLQUFLLGFBQWEsQ0FBQyxNQUFNO2dCQUN2QixJQUFJLENBQUM7b0JBQ0gsTUFBTSxHQUFHLGNBQWMsQ0FBQyxXQUFXLENBQ2pDLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUM1QixNQUFNLENBQ1AsQ0FBQztnQkFDSixDQUFDO2dCQUFDLE9BQU8sQ0FBVSxFQUFFLENBQUM7b0JBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQ2Isa0RBQWtELElBQUksQ0FBQyxTQUFTLEtBQUssQ0FBQyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQzFHLENBQUM7Z0JBQ0osQ0FBQztnQkFDRCxjQUFjLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQy9ELE9BQU8sTUFBTSxDQUFDO1lBQ2hCO2dCQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQzVELENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsU0FBUztRQUNQLElBQUksSUFBSSxDQUFDLE1BQU07WUFDYixjQUFjLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsUUFBeUI7UUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUztZQUNoQyxNQUFNLElBQUksYUFBYSxDQUFDLGtDQUFrQyxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLFNBQVMsR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztJQUM5QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFNBQVM7UUFDUCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQ25ELENBQUMsS0FBeUMsRUFBRSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFO1lBQzdELE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQWlDLENBQUMsQ0FBQyxPQUFPLENBQy9ELENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDVCxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNyQyxDQUFDLENBQ0YsQ0FBQztZQUNGLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxFQUNELEVBQUUsQ0FDSCxDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ3J1ZEZvcm1GaWVsZCB9IGZyb20gJ0BkZWNhZi10cy91aS1kZWNvcmF0b3JzJztcbmltcG9ydCB7IEFuZ3VsYXJGaWVsZERlZmluaXRpb24sIEZpZWxkVXBkYXRlTW9kZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHtcbiAgQ3J1ZE9wZXJhdGlvbnMsXG4gIEludGVybmFsRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG59IGZyb20gJ0BkZWNhZi10cy9kYi1kZWNvcmF0b3JzJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ3hGb3JtU2VydmljZSB9IGZyb20gJy4vTmd4Rm9ybVNlcnZpY2UnO1xuaW1wb3J0IHsgc2YgfSBmcm9tICdAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb24nO1xuXG4vKipcbiAqIEBjbGFzcyBOZ3hDcnVkRm9ybUZpZWxkXG4gKiBAaW1wbGVtZW50cyB7Q3J1ZEZvcm1GaWVsZDxBbmd1bGFyRmllbGREZWZpbml0aW9uPn1cbiAqIEBpbXBsZW1lbnRzIHtDb250cm9sVmFsdWVBY2Nlc3Nvcn1cbiAqIEBzdW1tYXJ5IEFic3RyYWN0IGNsYXNzIHJlcHJlc2VudGluZyBhIENSVUQgZm9ybSBmaWVsZCBmb3IgQW5ndWxhciBhcHBsaWNhdGlvbnNcbiAqIEBkZXNjcmlwdGlvbiBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBiYXNlIGltcGxlbWVudGF0aW9uIGZvciBDUlVEIGZvcm0gZmllbGRzIGluIEFuZ3VsYXIsXG4gKiBpbXBsZW1lbnRpbmcgYm90aCBDcnVkRm9ybUZpZWxkIGFuZCBDb250cm9sVmFsdWVBY2Nlc3NvciBpbnRlcmZhY2VzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTmd4Q3J1ZEZvcm1GaWVsZFxuICBpbXBsZW1lbnRzIENydWRGb3JtRmllbGQ8QW5ndWxhckZpZWxkRGVmaW5pdGlvbj4sIENvbnRyb2xWYWx1ZUFjY2Vzc29yXG57XG4gIC8qKlxuICAgKiBAc3VtbWFyeSBSZWZlcmVuY2UgdG8gdGhlIGNvbXBvbmVudCdzIGVsZW1lbnRcbiAgICogQGRlc2NyaXB0aW9uIEVsZW1lbnRSZWYgcmVwcmVzZW50aW5nIHRoZSBjb21wb25lbnQncyBuYXRpdmUgZWxlbWVudFxuICAgKi9cbiAgY29tcG9uZW50ITogRWxlbWVudFJlZjtcblxuICAvKipcbiAgICogQHN1bW1hcnkgQ3VycmVudCBDUlVEIG9wZXJhdGlvblxuICAgKiBAZGVzY3JpcHRpb24gUmVwcmVzZW50cyB0aGUgY3VycmVudCBDUlVEIG9wZXJhdGlvbiBiZWluZyBwZXJmb3JtZWRcbiAgICovXG4gIG9wZXJhdGlvbiE6IENydWRPcGVyYXRpb25zO1xuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBGaWVsZCBwcm9wZXJ0aWVzXG4gICAqIEBkZXNjcmlwdGlvbiBBbmd1bGFyLXNwZWNpZmljIGZpZWxkIGRlZmluaXRpb24gcHJvcGVydGllc1xuICAgKi9cbiAgcHJvcHMhOiBBbmd1bGFyRmllbGREZWZpbml0aW9uO1xuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBGb3JtIGdyb3VwIGZvciB0aGUgZmllbGRcbiAgICogQGRlc2NyaXB0aW9uIEFuZ3VsYXIgRm9ybUdyb3VwIGluc3RhbmNlIGZvciB0aGUgZmllbGRcbiAgICovXG4gIGZvcm1Hcm91cCE6IEZvcm1Hcm91cDtcblxuICAvKipcbiAgICogQHN1bW1hcnkgRmllbGQgbmFtZVxuICAgKiBAZGVzY3JpcHRpb24gTmFtZSBvZiB0aGUgZm9ybSBmaWVsZFxuICAgKi9cbiAgbmFtZSE6IHN0cmluZztcblxuICAvKipcbiAgICogQHN1bW1hcnkgRmllbGQgdmFsdWVcbiAgICogQGRlc2NyaXB0aW9uIEN1cnJlbnQgdmFsdWUgb2YgdGhlIGZvcm0gZmllbGRcbiAgICovXG4gIHZhbHVlITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBQYXJlbnQgSFRNTCBlbGVtZW50XG4gICAqIEBkZXNjcmlwdGlvbiBSZWZlcmVuY2UgdG8gdGhlIHBhcmVudCBIVE1MIGVsZW1lbnQgb2YgdGhlIGZpZWxkXG4gICAqL1xuICBwcm90ZWN0ZWQgcGFyZW50PzogSFRNTEVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFN0cmluZyBmb3JtYXR0aW5nIGZ1bmN0aW9uXG4gICAqIEBkZXNjcmlwdGlvbiBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIHNmIGZ1bmN0aW9uIGZvciBlcnJvciBtZXNzYWdlIGZvcm1hdHRpbmdcbiAgICovXG4gIHNmID0gc2Y7XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IENoYW5nZSBjYWxsYmFjayBmdW5jdGlvblxuICAgKiBAZGVzY3JpcHRpb24gRnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIGZpZWxkIHZhbHVlIGNoYW5nZXNcbiAgICovXG4gIG9uQ2hhbmdlOiAoKSA9PiB1bmtub3duID0gKCkgPT4ge307XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFRvdWNoIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAqIEBkZXNjcmlwdGlvbiBGdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGUgZmllbGQgaXMgdG91Y2hlZFxuICAgKi9cbiAgb25Ub3VjaDogKCkgPT4gdW5rbm93biA9ICgpID0+IHt9O1xuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBXcml0ZSB2YWx1ZSB0byB0aGUgZmllbGRcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gb2JqIC0gVGhlIHZhbHVlIHRvIGJlIHNldFxuICAgKi9cbiAgd3JpdGVWYWx1ZShvYmo6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSBvYmo7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmVnaXN0ZXIgY2hhbmdlIGNhbGxiYWNrXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlcnMgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZmllbGQgdmFsdWUgY2hhbmdlc1xuICAgKiBAcGFyYW0geygpID0+IHVua25vd259IGZuIC0gVGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbiBjaGFuZ2VcbiAgICovXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICgpID0+IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmVnaXN0ZXIgdG91Y2ggY2FsbGJhY2tcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBmaWVsZCBpcyB0b3VjaGVkXG4gICAqIEBwYXJhbSB7KCkgPT4gdW5rbm93bn0gZm4gLSBUaGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIHRvdWNoXG4gICAqL1xuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaCA9IGZuO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFNldCBkaXNhYmxlZCBzdGF0ZVxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgZGlzYWJsZWQgc3RhdGUgb2YgdGhlIGZpZWxkXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNEaXNhYmxlZCAtIFdoZXRoZXIgdGhlIGZpZWxkIHNob3VsZCBiZSBkaXNhYmxlZFxuICAgKi9cbiAgc2V0RGlzYWJsZWRTdGF0ZT8oaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMucHJvcHMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IEFmdGVyIHZpZXcgaW5pdGlhbGl6YXRpb24gbG9naWNcbiAgICogQGRlc2NyaXB0aW9uIFBlcmZvcm1zIG5lY2Vzc2FyeSBzZXR1cCBhZnRlciB0aGUgdmlldyBoYXMgYmVlbiBpbml0aWFsaXplZFxuICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR9IFRoZSBwYXJlbnQgZWxlbWVudCBvZiB0aGUgZmllbGRcbiAgICovXG4gIGFmdGVyVmlld0luaXQoKTogSFRNTEVsZW1lbnQge1xuICAgIGxldCBwYXJlbnQ6IEhUTUxFbGVtZW50O1xuICAgIHN3aXRjaCAodGhpcy5vcGVyYXRpb24pIHtcbiAgICAgIGNhc2UgT3BlcmF0aW9uS2V5cy5DUkVBVEU6XG4gICAgICBjYXNlIE9wZXJhdGlvbktleXMuVVBEQVRFOlxuICAgICAgY2FzZSBPcGVyYXRpb25LZXlzLkRFTEVURTpcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwYXJlbnQgPSBOZ3hGb3JtU2VydmljZS5nZXRQYXJlbnRFbChcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50Lm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgICAnZm9ybScsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBVbmFibGUgdG8gcmV0cmlldmUgcGFyZW50IGZvcm0gZWxlbWVudCBmb3IgdGhlICR7dGhpcy5vcGVyYXRpb259OiAke2UgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IGV9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIE5neEZvcm1TZXJ2aWNlLnJlZ2lzdGVyKHBhcmVudC5pZCwgdGhpcy5mb3JtR3JvdXAsIHRoaXMucHJvcHMpO1xuICAgICAgICByZXR1cm4gcGFyZW50O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG9wZXJhdGlvbjogJHt0aGlzLm9wZXJhdGlvbn1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgQ2xlYW51cCBvbiBjb21wb25lbnQgZGVzdHJ1Y3Rpb25cbiAgICogQGRlc2NyaXB0aW9uIFVucmVnaXN0ZXJzIHRoZSBmaWVsZCB3aGVuIHRoZSBjb21wb25lbnQgaXMgZGVzdHJveWVkXG4gICAqL1xuICBvbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGFyZW50KVxuICAgICAgTmd4Rm9ybVNlcnZpY2UudW5yZWdpc3Rlcih0aGlzLnBhcmVudC5pZCwgdGhpcy5jb21wb25lbnQubmF0aXZlRWxlbWVudCk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZSB0aGUgZmllbGRcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdXAgdGhlIGZvcm0gZ3JvdXAgYW5kIGZpZWxkIG5hbWVcbiAgICogQHBhcmFtIHtGaWVsZFVwZGF0ZU1vZGV9IHVwZGF0ZU9uIC0gVGhlIHVwZGF0ZSBtb2RlIGZvciB0aGUgZmllbGRcbiAgICovXG4gIG9uSW5pdCh1cGRhdGVPbjogRmllbGRVcGRhdGVNb2RlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnByb3BzIHx8ICF0aGlzLm9wZXJhdGlvbilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBwcm9wcyBhbmQgb3BlcmF0aW9uIGFyZSByZXF1aXJlZGApO1xuICAgIHRoaXMuZm9ybUdyb3VwID0gTmd4Rm9ybVNlcnZpY2UuZnJvbVByb3BzKHRoaXMucHJvcHMsIHVwZGF0ZU9uKTtcbiAgICB0aGlzLm5hbWUgPSB0aGlzLnByb3BzLm5hbWU7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgR2V0IGZpZWxkIGVycm9yc1xuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGFsbCBlcnJvcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaWVsZFxuICAgKiBAcmV0dXJucyB7e2tleTogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmd9W119IEFuIGFycmF5IG9mIGVycm9yIG9iamVjdHNcbiAgICovXG4gIGdldEVycm9ycygpOiB7IGtleTogc3RyaW5nOyBtZXNzYWdlOiBzdHJpbmcgfVtdIHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy5mb3JtR3JvdXAuY29udHJvbHMpLnJlZHVjZShcbiAgICAgIChhY2N1bTogeyBrZXk6IHN0cmluZzsgbWVzc2FnZTogc3RyaW5nIH1bXSwgW3Byb3AsIGNvbnRyb2xdKSA9PiB7XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGNvbnRyb2wuZXJyb3JzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5mb3JFYWNoKFxuICAgICAgICAgIChbaywgY10pID0+IHtcbiAgICAgICAgICAgIGFjY3VtLnB1c2goeyBrZXk6IGssIG1lc3NhZ2U6IGsgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgfSxcbiAgICAgIFtdLFxuICAgICk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,232 @@
1
+ import { escapeHtml, HTML5CheckTypes, HTML5InputTypes, parseToNumber, } from '@decaf-ts/ui-decorators';
2
+ import { FormControl, FormGroup, Validators, } from '@angular/forms';
3
+ import { Validation } from '@decaf-ts/decorator-validation';
4
+ import { AngularEngineKeys } from './constants';
5
+ import { ValidatorFactory } from './ValidatorFactory';
6
+ /**
7
+ * @summary Service for managing Angular forms and form controls.
8
+ * @description
9
+ * The NgxFormService provides utility methods for handling form initialization,
10
+ * validation, data retrieval, and form control management in Angular applications.
11
+ * It offers a centralized way to manage form controls, perform validations, and
12
+ * handle form-related operations.
13
+ */
14
+ export class NgxFormService {
15
+ /**
16
+ * @summary Storage for form controls.
17
+ * @description
18
+ * A static object that stores form controls indexed by form ID and field name.
19
+ * @type {Record<string, Record<string, { control: FormGroup; props: AngularFieldDefinition }>>}
20
+ */
21
+ static { this.controls = {}; }
22
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
23
+ constructor() { }
24
+ /**
25
+ * Initializes the form after the view has been initialized.
26
+ * This method sets up the form controls and creates a FormGroup.
27
+ *
28
+ * @param el - The form element to initialize.
29
+ * @param formId - The unique identifier for the form.
30
+ * @param formUpdateMode - The update mode for the form. Defaults to 'blur'.
31
+ */
32
+ /**
33
+ * @summary Initializes the form after view initialization.
34
+ * @description
35
+ * Sets up form controls and creates a FormGroup for the given form element.
36
+ *
37
+ * @param {FormElement} el - The form element to initialize.
38
+ * @param {string} formId - The unique identifier for the form.
39
+ * @param {FieldUpdateMode} [formUpdateMode='blur'] - The update mode for the form.
40
+ */
41
+ static formAfterViewInit(el, formId, formUpdateMode = 'blur') {
42
+ const selector = `*[${AngularEngineKeys.NG_REFLECT}name]`;
43
+ const elements = Array.from(el.component.nativeElement.querySelectorAll(selector));
44
+ const controls = elements.map((f) => {
45
+ const fieldName = f
46
+ .attributes[`${AngularEngineKeys.NG_REFLECT}name`].value;
47
+ const control = NgxFormService.getFieldByName(formId, fieldName);
48
+ return control.control;
49
+ });
50
+ el.formGroup = new FormGroup(controls, {
51
+ updateOn: formUpdateMode,
52
+ });
53
+ }
54
+ /**
55
+ * @summary Handles form component destruction.
56
+ * @description
57
+ * Unregisters the form from the service when the component is destroyed.
58
+ *
59
+ * @param {FormElement} el - The form element being destroyed.
60
+ * @param {string} formId - The unique identifier of the form to unregister.
61
+ */
62
+ static forOnDestroy(el, formId) {
63
+ NgxFormService.unregister(formId, el.component.nativeElement);
64
+ }
65
+ /**
66
+ * @summary Retrieves form data for a given form ID.
67
+ * @description
68
+ * Processes form controls and returns their values as an object.
69
+ *
70
+ * @param {string} formId - The unique identifier of the form to retrieve data from.
71
+ * @returns {Record<string, unknown>} An object containing the form data.
72
+ * @throws {Error} If the form with the given ID is not found.
73
+ */
74
+ static getFormData(formId) {
75
+ if (!(formId in this.controls))
76
+ throw new Error(`form ${formId} not found`);
77
+ const form = this.controls[formId];
78
+ let control;
79
+ let val;
80
+ const data = {};
81
+ for (const key in form) {
82
+ control = form[key].control;
83
+ if (!HTML5CheckTypes.includes(form[key].props.type)) {
84
+ switch (form[key].props.type) {
85
+ case HTML5InputTypes.NUMBER:
86
+ val = parseToNumber(control.value);
87
+ break;
88
+ case HTML5InputTypes.DATE:
89
+ case HTML5InputTypes.DATETIME_LOCAL:
90
+ val = new Date(control.value[key]);
91
+ break;
92
+ default:
93
+ val = escapeHtml(control.value[key]);
94
+ }
95
+ }
96
+ else {
97
+ val = control.value;
98
+ }
99
+ data[key] = val;
100
+ }
101
+ return data;
102
+ }
103
+ /**
104
+ * @summary Validates form fields.
105
+ * @description
106
+ * Validates either a specific field or all fields in the form group.
107
+ *
108
+ * @param {FormGroup} formGroup - The FormGroup to validate.
109
+ * @param {string} [fieldName] - Optional name of a specific field to validate.
110
+ * @returns {boolean} Indicates whether the validation passed (true) or failed (false).
111
+ */
112
+ static validateFields(formGroup, fieldName) {
113
+ function isValid(formGroup, fieldName) {
114
+ const control = formGroup.get(fieldName);
115
+ if (control instanceof FormControl) {
116
+ control.markAsTouched();
117
+ control.markAsDirty();
118
+ return !control.invalid;
119
+ }
120
+ else {
121
+ throw new Error('This should be impossible');
122
+ }
123
+ }
124
+ if (fieldName)
125
+ return isValid(formGroup, fieldName);
126
+ let isValidForm = true;
127
+ for (const fg of formGroup.controls) {
128
+ for (const key in fg.controls) {
129
+ const validate = isValid(fg, key);
130
+ if (!validate)
131
+ isValidForm = false;
132
+ }
133
+ }
134
+ return isValidForm;
135
+ }
136
+ /**
137
+ * @summary Creates a FormGroup from field properties.
138
+ * @description
139
+ * Generates a new FormGroup instance based on the provided field definition and update mode.
140
+ *
141
+ * @param {AngularFieldDefinition} props - The Angular field definition properties.
142
+ * @param {FieldUpdateMode} updateMode - The update mode for the form group.
143
+ * @returns {FormGroup} A new FormGroup instance.
144
+ */
145
+ static fromProps(props, updateMode) {
146
+ const controls = {};
147
+ const validators = this.validatorsFromProps(props);
148
+ const composed = validators.length ? Validators.compose(validators) : null;
149
+ controls[props.name] = new FormControl({
150
+ value: props.value && props.type !== HTML5InputTypes.CHECKBOX
151
+ ? props.value
152
+ : undefined,
153
+ disabled: props.disabled,
154
+ }, composed);
155
+ return new FormGroup(controls, { updateOn: updateMode });
156
+ }
157
+ /**
158
+ * Retrieves a form by its ID from the stored controls.
159
+ *
160
+ * @param id - The unique identifier of the form to retrieve.
161
+ * @returns The form controls associated with the given ID.
162
+ * @throws Error if the form with the given ID is not found.
163
+ */
164
+ static getFormById(id) {
165
+ if (!(id in NgxFormService.controls))
166
+ throw new Error(`Could not find formId ${id}`);
167
+ return NgxFormService.controls[id];
168
+ }
169
+ /**
170
+ * Retrieves a specific field from a form by its name.
171
+ *
172
+ * @param formId - The unique identifier of the form.
173
+ * @param name - The name of the field to retrieve.
174
+ * @returns The field control and properties.
175
+ * @throws Error if the field is not found in the form.
176
+ */
177
+ static getFieldByName(formId, name) {
178
+ const form = NgxFormService.getFormById(formId);
179
+ if (!(name in form))
180
+ throw new Error(`Could not find field ${name} in form`);
181
+ return form[name];
182
+ }
183
+ /**
184
+ * Generates an array of validator functions from the provided field properties.
185
+ *
186
+ * @param props - The field properties containing validation rules.
187
+ * @returns An array of ValidatorFn instances.
188
+ */
189
+ static validatorsFromProps(props) {
190
+ const supportedValidationKeys = Validation.keys();
191
+ return Object.keys(props)
192
+ .filter((k) => supportedValidationKeys.includes(k))
193
+ .map((k) => ValidatorFactory.spawn(k, props[k]));
194
+ }
195
+ /**
196
+ *
197
+ * @param el
198
+ * @param tag
199
+ *
200
+ * @throws {Error} when no parent exists with the provided tag
201
+ */
202
+ static getParentEl(el, tag) {
203
+ let parent;
204
+ while ((parent = el.parentElement) !== null) {
205
+ if (parent.tagName.toLowerCase() === tag.toLowerCase()) {
206
+ return parent;
207
+ }
208
+ el = parent;
209
+ }
210
+ throw new Error(`No parent with the tag ${tag} was found for provided element`);
211
+ }
212
+ static register(formId, control, props) {
213
+ this.controls[formId] = this.controls[formId] || {};
214
+ this.controls[formId][props.name] = {
215
+ control: control,
216
+ props: props,
217
+ };
218
+ }
219
+ /**
220
+ * Unregisters a form or a specific field from the service.
221
+ *
222
+ * @param formId - The unique identifier of the form.
223
+ * @param field - Optional. The specific field to unregister. If not provided, the entire form is unregistered.
224
+ */
225
+ static unregister(formId, field) {
226
+ if (!field)
227
+ delete this.controls[formId];
228
+ else
229
+ delete this.controls[formId][field.name];
230
+ }
231
+ }
232
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmd4Rm9ybVNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9OZ3hGb3JtU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsVUFBVSxFQUVWLGVBQWUsRUFDZixlQUFlLEVBQ2YsYUFBYSxHQUNkLE1BQU0seUJBQXlCLENBQUM7QUFFakMsT0FBTyxFQUVMLFdBQVcsRUFDWCxTQUFTLEVBRVQsVUFBVSxHQUNYLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzVELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVoRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV0RDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFDekI7Ozs7O09BS0c7YUFDWSxhQUFRLEdBU25CLEVBQUUsQ0FBQztJQUVQLGdFQUFnRTtJQUNoRSxnQkFBdUIsQ0FBQztJQUV4Qjs7Ozs7OztPQU9HO0lBQ0g7Ozs7Ozs7O09BUUc7SUFDSCxNQUFNLENBQUMsaUJBQWlCLENBQ3RCLEVBQWUsRUFDZixNQUFjLEVBQ2QsaUJBQWtDLE1BQU07UUFFeEMsTUFBTSxRQUFRLEdBQUcsS0FBSyxpQkFBaUIsQ0FBQyxVQUFVLE9BQU8sQ0FBQztRQUMxRCxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUN6QixFQUFFLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FDdEQsQ0FBQztRQUNGLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFVLEVBQUUsRUFBRTtZQUMzQyxNQUFNLFNBQVMsR0FBSSxDQUF1RDtpQkFDdkUsVUFBVSxDQUFDLEdBQUcsaUJBQWlCLENBQUMsVUFBVSxNQUFNLENBQUMs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SUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxLQUFLLEdBQUcsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO2dCQUN2RCxPQUFPLE1BQU0sQ0FBQztZQUNoQixDQUFDO1lBQ0QsRUFBRSxHQUFHLE1BQU0sQ0FBQztRQUNkLENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUNiLDBCQUEwQixHQUFHLGlDQUFpQyxDQUMvRCxDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sQ0FBQyxRQUFRLENBQ2IsTUFBYyxFQUNkLE9BQWtCLEVBQ2xCLEtBQStDO1FBRS9DLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDcEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUc7WUFDbEMsT0FBTyxFQUFFLE9BQU87WUFDaEIsS0FBSyxFQUFFLEtBQUs7U0FDYixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFjLEVBQUUsS0FBbUI7UUFDbkQsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7O1lBRXZDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBRSxLQUFxQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBlc2NhcGVIdG1sLFxuICBGaWVsZFByb3BlcnRpZXMsXG4gIEhUTUw1Q2hlY2tUeXBlcyxcbiAgSFRNTDVJbnB1dFR5cGVzLFxuICBwYXJzZVRvTnVtYmVyLFxufSBmcm9tICdAZGVjYWYtdHMvdWktZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBBbmd1bGFyRmllbGREZWZpbml0aW9uLCBGaWVsZFVwZGF0ZU1vZGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgRm9ybUNvbnRyb2wsXG4gIEZvcm1Hcm91cCxcbiAgVmFsaWRhdG9yRm4sXG4gIFZhbGlkYXRvcnMsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFZhbGlkYXRpb24gfSBmcm9tICdAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb24nO1xuaW1wb3J0IHsgQW5ndWxhckVuZ2luZUtleXMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBGb3JtRWxlbWVudCB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgVmFsaWRhdG9yRmFjdG9yeSB9IGZyb20gJy4vVmFsaWRhdG9yRmFjdG9yeSc7XG5cbi8qKlxuICogQHN1bW1hcnkgU2VydmljZSBmb3IgbWFuYWdpbmcgQW5ndWxhciBmb3JtcyBhbmQgZm9ybSBjb250cm9scy5cbiAqIEBkZXNjcmlwdGlvblxuICogVGhlIE5neEZvcm1TZXJ2aWNlIHByb3ZpZGVzIHV0aWxpdHkgbWV0aG9kcyBmb3IgaGFuZGxpbmcgZm9ybSBpbml0aWFsaXphdGlvbixcbiAqIHZhbGlkYXRpb24sIGRhdGEgcmV0cmlldmFsLCBhbmQgZm9ybSBjb250cm9sIG1hbmFnZW1lbnQgaW4gQW5ndWxhciBhcHBsaWNhdGlvbnMuXG4gKiBJdCBvZmZlcnMgYSBjZW50cmFsaXplZCB3YXkgdG8gbWFuYWdlIGZvcm0gY29udHJvbHMsIHBlcmZvcm0gdmFsaWRhdGlvbnMsIGFuZFxuICogaGFuZGxlIGZvcm0tcmVsYXRlZCBvcGVyYXRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgTmd4Rm9ybVNlcnZpY2Uge1xuICAvKipcbiAgICogQHN1bW1hcnkgU3RvcmFnZSBmb3IgZm9ybSBjb250cm9scy5cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgc3RhdGljIG9iamVjdCB0aGF0IHN0b3JlcyBmb3JtIGNvbnRyb2xzIGluZGV4ZWQgYnkgZm9ybSBJRCBhbmQgZmllbGQgbmFtZS5cbiAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHsgY29udHJvbDogRm9ybUdyb3VwOyBwcm9wczogQW5ndWxhckZpZWxkRGVmaW5pdGlvbiB9Pj59XG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBjb250cm9sczogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBSZWNvcmQ8XG4gICAgICBzdHJpbmcsXG4gICAgICB7XG4gICAgICAgIGNvbnRyb2w6IEZvcm1Hcm91cDtcbiAgICAgICAgcHJvcHM6IEFuZ3VsYXJGaWVsZERlZmluaXRpb247XG4gICAgICB9XG4gICAgPlxuICA+ID0ge307XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIGZvcm0gYWZ0ZXIgdGhlIHZpZXcgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuXG4gICAqIFRoaXMgbWV0aG9kIHNldHMgdXAgdGhlIGZvcm0gY29udHJvbHMgYW5kIGNyZWF0ZXMgYSBGb3JtR3JvdXAuXG4gICAqXG4gICAqIEBwYXJhbSBlbCAtIFRoZSBmb3JtIGVsZW1lbnQgdG8gaW5pdGlhbGl6ZS5cbiAgICogQHBhcmFtIGZvcm1JZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGZvcm0uXG4gICAqIEBwYXJhbSBmb3JtVXBkYXRlTW9kZSAtIFRoZSB1cGRhdGUgbW9kZSBmb3IgdGhlIGZvcm0uIERlZmF1bHRzIHRvICdibHVyJy5cbiAgICovXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyB0aGUgZm9ybSBhZnRlciB2aWV3IGluaXRpYWxpemF0aW9uLlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2V0cyB1cCBmb3JtIGNvbnRyb2xzIGFuZCBjcmVhdGVzIGEgRm9ybUdyb3VwIGZvciB0aGUgZ2l2ZW4gZm9ybSBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge0Zvcm1FbGVtZW50fSBlbCAtIFRoZSBmb3JtIGVsZW1lbnQgdG8gaW5pdGlhbGl6ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZvcm1JZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGZvcm0uXG4gICAqIEBwYXJhbSB7RmllbGRVcGRhdGVNb2RlfSBbZm9ybVVwZGF0ZU1vZGU9J2JsdXInXSAtIFRoZSB1cGRhdGUgbW9kZSBmb3IgdGhlIGZvcm0uXG4gICAqL1xuICBzdGF0aWMgZm9ybUFmdGVyVmlld0luaXQoXG4gICAgZWw6IEZvcm1FbGVtZW50LFxuICAgIGZvcm1JZDogc3RyaW5nLFxuICAgIGZvcm1VcGRhdGVNb2RlOiBGaWVsZFVwZGF0ZU1vZGUgPSAnYmx1cicsXG4gICkge1xuICAgIGNvbnN0IHNlbGVjdG9yID0gYCpbJHtBbmd1bGFyRW5naW5lS2V5cy5OR19SRUZMRUNUfW5hbWVdYDtcbiAgICBjb25zdCBlbGVtZW50cyA9IEFycmF5LmZyb20oXG4gICAgICBlbC5jb21wb25lbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSxcbiAgICApO1xuICAgIGNvbnN0IGNvbnRyb2xzID0gZWxlbWVudHMubWFwKChmOiB1bmtub3duKSA9PiB7XG4gICAgICBjb25zdCBmaWVsZE5hbWUgPSAoZiBhcyB7IGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHN0cmluZyB9PiB9KVxuICAgICAgICAuYXR0cmlidXRlc1tgJHtBbmd1bGFyRW5naW5lS2V5cy5OR19SRUZMRUNUfW5hbWVgXS52YWx1ZTtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBOZ3hGb3JtU2VydmljZS5nZXRGaWVsZEJ5TmFtZShmb3JtSWQsIGZpZWxkTmFtZSk7XG4gICAgICByZXR1cm4gY29udHJvbC5jb250cm9sO1xuICAgIH0pO1xuICAgIGVsLmZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoY29udHJvbHMsIHtcbiAgICAgIHVwZGF0ZU9uOiBmb3JtVXBkYXRlTW9kZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBIYW5kbGVzIGZvcm0gY29tcG9uZW50IGRlc3RydWN0aW9uLlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVW5yZWdpc3RlcnMgdGhlIGZvcm0gZnJvbSB0aGUgc2VydmljZSB3aGVuIHRoZSBjb21wb25lbnQgaXMgZGVzdHJveWVkLlxuICAgKlxuICAgKiBAcGFyYW0ge0Zvcm1FbGVtZW50fSBlbCAtIFRoZSBmb3JtIGVsZW1lbnQgYmVpbmcgZGVzdHJveWVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm9ybUlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBmb3JtIHRvIHVucmVnaXN0ZXIuXG4gICAqL1xuICBzdGF0aWMgZm9yT25EZXN0cm95KGVsOiBGb3JtRWxlbWVudCwgZm9ybUlkOiBzdHJpbmcpIHtcbiAgICBOZ3hGb3JtU2VydmljZS51bnJlZ2lzdGVyKGZvcm1JZCwgZWwuY29tcG9uZW50Lm5hdGl2ZUVsZW1lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBmb3JtIGRhdGEgZm9yIGEgZ2l2ZW4gZm9ybSBJRC5cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFByb2Nlc3NlcyBmb3JtIGNvbnRyb2xzIGFuZCByZXR1cm5zIHRoZWlyIHZhbHVlcyBhcyBhbiBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtSWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGZvcm0gdG8gcmV0cmlldmUgZGF0YSBmcm9tLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBmb3JtIGRhdGEuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgZm9ybSB3aXRoIHRoZSBnaXZlbiBJRCBpcyBub3QgZm91bmQuXG4gICAqL1xuICBzdGF0aWMgZ2V0Rm9ybURhdGEoZm9ybUlkOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgaWYgKCEoZm9ybUlkIGluIHRoaXMuY29udHJvbHMpKSB0aHJvdyBuZXcgRXJyb3IoYGZvcm0gJHtmb3JtSWR9IG5vdCBmb3VuZGApO1xuICAgIGNvbnN0IGZvcm0gPSB0aGlzLmNvbnRyb2xzW2Zvcm1JZF07XG4gICAgbGV0IGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbDtcbiAgICBsZXQgdmFsOiB1bmtub3duO1xuICAgIGNvbnN0IGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgaW4gZm9ybSkge1xuICAgICAgY29udHJvbCA9IGZvcm1ba2V5XS5jb250cm9sO1xuICAgICAgaWYgKCFIVE1MNUNoZWNrVHlwZXMuaW5jbHVkZXMoZm9ybVtrZXldLnByb3BzLnR5cGUpKSB7XG4gICAgICAgIHN3aXRjaCAoZm9ybVtrZXldLnByb3BzLnR5cGUpIHtcbiAgICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5OVU1CRVI6XG4gICAgICAgICAgICB2YWwgPSBwYXJzZVRvTnVtYmVyKGNvbnRyb2wudmFsdWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuREFURTpcbiAgICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5EQVRFVElNRV9MT0NBTDpcbiAgICAgICAgICAgIHZhbCA9IG5ldyBEYXRlKGNvbnRyb2wudmFsdWVba2V5XSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdmFsID0gZXNjYXBlSHRtbChjb250cm9sLnZhbHVlW2tleV0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWwgPSBjb250cm9sLnZhbHVlO1xuICAgICAgfVxuICAgICAgZGF0YVtrZXldID0gdmFsO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgZm9ybSBmaWVsZHMuXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBWYWxpZGF0ZXMgZWl0aGVyIGEgc3BlY2lmaWMgZmllbGQgb3IgYWxsIGZpZWxkcyBpbiB0aGUgZm9ybSBncm91cC5cbiAgICpcbiAgICogQHBhcmFtIHtGb3JtR3JvdXB9IGZvcm1Hcm91cCAtIFRoZSBGb3JtR3JvdXAgdG8gdmFsaWRhdGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZmllbGROYW1lXSAtIE9wdGlvbmFsIG5hbWUgb2YgYSBzcGVjaWZpYyBmaWVsZCB0byB2YWxpZGF0ZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IEluZGljYXRlcyB3aGV0aGVyIHRoZSB2YWxpZGF0aW9uIHBhc3NlZCAodHJ1ZSkgb3IgZmFpbGVkIChmYWxzZSkuXG4gICAqL1xuICBzdGF0aWMgdmFsaWRhdGVGaWVsZHMoZm9ybUdyb3VwOiBGb3JtR3JvdXAsIGZpZWxkTmFtZT86IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGZ1bmN0aW9uIGlzVmFsaWQoZm9ybUdyb3VwOiBGb3JtR3JvdXAsIGZpZWxkTmFtZTogc3RyaW5nKSB7XG4gICAgICBjb25zdCBjb250cm9sID0gZm9ybUdyb3VwLmdldChmaWVsZE5hbWUpO1xuICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQ29udHJvbCkge1xuICAgICAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgICAgY29udHJvbC5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICByZXR1cm4gIWNvbnRyb2wuaW52YWxpZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBzaG91bGQgYmUgaW1wb3NzaWJsZScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmaWVsZE5hbWUpIHJldHVybiBpc1ZhbGlkKGZvcm1Hcm91cCwgZmllbGROYW1lKTtcblxuICAgIGxldCBpc1ZhbGlkRm9ybSA9IHRydWU7XG4gICAgZm9yIChjb25zdCBmZyBvZiBmb3JtR3JvdXAuY29udHJvbHMgYXMgdW5rbm93biBhcyBGb3JtR3JvdXBbXSkge1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gZmcuY29udHJvbHMpIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGUgPSBpc1ZhbGlkKGZnLCBrZXkpO1xuICAgICAgICBpZiAoIXZhbGlkYXRlKSBpc1ZhbGlkRm9ybSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpc1ZhbGlkRm9ybTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgRm9ybUdyb3VwIGZyb20gZmllbGQgcHJvcGVydGllcy5cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEdlbmVyYXRlcyBhIG5ldyBGb3JtR3JvdXAgaW5zdGFuY2UgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGZpZWxkIGRlZmluaXRpb24gYW5kIHVwZGF0ZSBtb2RlLlxuICAgKlxuICAgKiBAcGFyYW0ge0FuZ3VsYXJGaWVsZERlZmluaXRpb259IHByb3BzIC0gVGhlIEFuZ3VsYXIgZmllbGQgZGVmaW5pdGlvbiBwcm9wZXJ0aWVzLlxuICAgKiBAcGFyYW0ge0ZpZWxkVXBkYXRlTW9kZX0gdXBkYXRlTW9kZSAtIFRoZSB1cGRhdGUgbW9kZSBmb3IgdGhlIGZvcm0gZ3JvdXAuXG4gICAqIEByZXR1cm5zIHtGb3JtR3JvdXB9IEEgbmV3IEZvcm1Hcm91cCBpbnN0YW5jZS5cbiAgICovXG4gIHN0YXRpYyBmcm9tUHJvcHMoXG4gICAgcHJvcHM6IEFuZ3VsYXJGaWVsZERlZmluaXRpb24sXG4gICAgdXBkYXRlTW9kZTogRmllbGRVcGRhdGVNb2RlLFxuICApOiBGb3JtR3JvdXAge1xuICAgIGNvbnN0IGNvbnRyb2xzOiBSZWNvcmQ8c3RyaW5nLCBGb3JtQ29udHJvbD4gPSB7fTtcbiAgICBjb25zdCB2YWxpZGF0b3JzID0gdGhpcy52YWxpZGF0b3JzRnJvbVByb3BzKHByb3BzKTtcbiAgICBjb25zdCBjb21wb3NlZCA9IHZhbGlkYXRvcnMubGVuZ3RoID8gVmFsaWRhdG9ycy5jb21wb3NlKHZhbGlkYXRvcnMpIDogbnVsbDtcbiAgICBjb250cm9sc1twcm9wcy5uYW1lXSA9IG5ldyBGb3JtQ29udHJvbChcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6XG4gICAgICAgICAgcHJvcHMudmFsdWUgJiYgcHJvcHMudHlwZSAhPT0gSFRNTDVJbnB1dFR5cGVzLkNIRUNLQk9YXG4gICAgICAgICAgICA/IHByb3BzLnZhbHVlXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgZGlzYWJsZWQ6IHByb3BzLmRpc2FibGVkLFxuICAgICAgfSxcbiAgICAgIGNvbXBvc2VkLFxuICAgICk7XG5cbiAgICByZXR1cm4gbmV3IEZvcm1Hcm91cChjb250cm9scywgeyB1cGRhdGVPbjogdXBkYXRlTW9kZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYSBmb3JtIGJ5IGl0cyBJRCBmcm9tIHRoZSBzdG9yZWQgY29udHJvbHMuXG4gICAqXG4gICAqIEBwYXJhbSBpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgZm9ybSB0byByZXRyaWV2ZS5cbiAgICogQHJldHVybnMgVGhlIGZvcm0gY29udHJvbHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBJRC5cbiAgICogQHRocm93cyBFcnJvciBpZiB0aGUgZm9ybSB3aXRoIHRoZSBnaXZlbiBJRCBpcyBub3QgZm91bmQuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXRGb3JtQnlJZChpZDogc3RyaW5nKSB7XG4gICAgaWYgKCEoaWQgaW4gTmd4Rm9ybVNlcnZpY2UuY29udHJvbHMpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBmb3JtSWQgJHtpZH1gKTtcbiAgICByZXR1cm4gTmd4Rm9ybVNlcnZpY2UuY29udHJvbHNbaWRdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBhIHNwZWNpZmljIGZpZWxkIGZyb20gYSBmb3JtIGJ5IGl0cyBuYW1lLlxuICAgKlxuICAgKiBAcGFyYW0gZm9ybUlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBmb3JtLlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0byByZXRyaWV2ZS5cbiAgICogQHJldHVybnMgVGhlIGZpZWxkIGNvbnRyb2wgYW5kIHByb3BlcnRpZXMuXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGZpZWxkIGlzIG5vdCBmb3VuZCBpbiB0aGUgZm9ybS5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdldEZpZWxkQnlOYW1lKGZvcm1JZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBmb3JtID0gTmd4Rm9ybVNlcnZpY2UuZ2V0Rm9ybUJ5SWQoZm9ybUlkKTtcbiAgICBpZiAoIShuYW1lIGluIGZvcm0pKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBmaWVsZCAke25hbWV9IGluIGZvcm1gKTtcbiAgICByZXR1cm4gZm9ybVtuYW1lXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYW4gYXJyYXkgb2YgdmFsaWRhdG9yIGZ1bmN0aW9ucyBmcm9tIHRoZSBwcm92aWRlZCBmaWVsZCBwcm9wZXJ0aWVzLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvcHMgLSBUaGUgZmllbGQgcHJvcGVydGllcyBjb250YWluaW5nIHZhbGlkYXRpb24gcnVsZXMuXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIFZhbGlkYXRvckZuIGluc3RhbmNlcy5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHZhbGlkYXRvcnNGcm9tUHJvcHMoXG4gICAgcHJvcHM6IEZpZWxkUHJvcGVydGllcyAmIEFuZ3VsYXJGaWVsZERlZmluaXRpb24sXG4gICk6IFZhbGlkYXRvckZuW10ge1xuICAgIGNvbnN0IHN1cHBvcnRlZFZhbGlkYXRpb25LZXlzID0gVmFsaWRhdGlvbi5rZXlzKCk7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHByb3BzKVxuICAgICAgLmZpbHRlcigoazogc3RyaW5nKSA9PiBzdXBwb3J0ZWRWYWxpZGF0aW9uS2V5cy5pbmNsdWRlcyhrKSlcbiAgICAgIC5tYXAoKGs6IHN0cmluZykgPT4gVmFsaWRhdG9yRmFjdG9yeS5zcGF3bihrLCBwcm9wc1trXSkpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBlbFxuICAgKiBAcGFyYW0gdGFnXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSB3aGVuIG5vIHBhcmVudCBleGlzdHMgd2l0aCB0aGUgcHJvdmlkZWQgdGFnXG4gICAqL1xuICBzdGF0aWMgZ2V0UGFyZW50RWwoZWw6IEhUTUxFbGVtZW50LCB0YWc6IHN0cmluZykge1xuICAgIGxldCBwYXJlbnQ6IEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICB3aGlsZSAoKHBhcmVudCA9IGVsLnBhcmVudEVsZW1lbnQpICE9PSBudWxsKSB7XG4gICAgICBpZiAocGFyZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gdGFnLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICAgIH1cbiAgICAgIGVsID0gcGFyZW50O1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTm8gcGFyZW50IHdpdGggdGhlIHRhZyAke3RhZ30gd2FzIGZvdW5kIGZvciBwcm92aWRlZCBlbGVtZW50YCxcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIHJlZ2lzdGVyKFxuICAgIGZvcm1JZDogc3RyaW5nLFxuICAgIGNvbnRyb2w6IEZvcm1Hcm91cCxcbiAgICBwcm9wczogRmllbGRQcm9wZXJ0aWVzICYgQW5ndWxhckZpZWxkRGVmaW5pdGlvbixcbiAgKSB7XG4gICAgdGhpcy5jb250cm9sc1tmb3JtSWRdID0gdGhpcy5jb250cm9sc1tmb3JtSWRdIHx8IHt9O1xuICAgIHRoaXMuY29udHJvbHNbZm9ybUlkXVtwcm9wcy5uYW1lXSA9IHtcbiAgICAgIGNvbnRyb2w6IGNvbnRyb2wsXG4gICAgICBwcm9wczogcHJvcHMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGZvcm0gb3IgYSBzcGVjaWZpYyBmaWVsZCBmcm9tIHRoZSBzZXJ2aWNlLlxuICAgKlxuICAgKiBAcGFyYW0gZm9ybUlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBmb3JtLlxuICAgKiBAcGFyYW0gZmllbGQgLSBPcHRpb25hbC4gVGhlIHNwZWNpZmljIGZpZWxkIHRvIHVucmVnaXN0ZXIuIElmIG5vdCBwcm92aWRlZCwgdGhlIGVudGlyZSBmb3JtIGlzIHVucmVnaXN0ZXJlZC5cbiAgICovXG4gIHN0YXRpYyB1bnJlZ2lzdGVyKGZvcm1JZDogc3RyaW5nLCBmaWVsZD86IEhUTUxFbGVtZW50KSB7XG4gICAgaWYgKCFmaWVsZCkgZGVsZXRlIHRoaXMuY29udHJvbHNbZm9ybUlkXTtcbiAgICBlbHNlXG4gICAgICBkZWxldGUgdGhpcy5jb250cm9sc1tmb3JtSWRdWyhmaWVsZCBhcyB1bmtub3duIGFzIHsgbmFtZTogc3RyaW5nIH0pLm5hbWVdO1xuICB9XG59XG4iXX0=