@dynamic-field-kit/angular 1.2.10 → 1.3.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 (47) hide show
  1. package/README.md +63 -1
  2. package/angular.json +27 -0
  3. package/dist/README.md +63 -1
  4. package/dist/components/BaseInput.d.ts +23 -5
  5. package/dist/components/DynamicInput.d.ts +13 -6
  6. package/dist/components/FieldInput.d.ts +10 -6
  7. package/dist/components/MultiFieldInput.d.ts +20 -3
  8. package/dist/esm2022/components/BaseInput.mjs +11 -3
  9. package/dist/esm2022/components/DynamicInput.mjs +112 -83
  10. package/dist/esm2022/components/FieldInput.mjs +25 -16
  11. package/dist/esm2022/components/MultiFieldInput.mjs +207 -28
  12. package/dist/esm2022/layout/defaultLayouts.mjs +70 -23
  13. package/dist/esm2022/layout/index.mjs +2 -1
  14. package/dist/esm2022/layout/layoutRegistry.mjs +14 -0
  15. package/dist/esm2022/public-api.mjs +1 -1
  16. package/dist/esm2022/types/layout.mjs +1 -1
  17. package/dist/fesm2022/dynamic-field-kit-angular.mjs +430 -146
  18. package/dist/fesm2022/dynamic-field-kit-angular.mjs.map +1 -1
  19. package/dist/layout/defaultLayouts.d.ts +21 -3
  20. package/dist/layout/index.d.ts +1 -0
  21. package/dist/layout/layoutRegistry.d.ts +12 -0
  22. package/dist/public-api.d.ts +1 -1
  23. package/dist/types/layout.d.ts +25 -1
  24. package/karma.conf.js +37 -0
  25. package/package.json +18 -5
  26. package/src/components/BaseInput.ts +34 -5
  27. package/src/components/DynamicInput.ts +142 -106
  28. package/src/components/FieldInput.ts +30 -12
  29. package/src/components/MultiFieldInput.ts +181 -18
  30. package/src/layout/defaultLayouts.ts +42 -10
  31. package/src/layout/index.ts +1 -0
  32. package/src/layout/layoutRegistry.ts +25 -0
  33. package/src/public-api.ts +1 -1
  34. package/src/types/layout.ts +36 -1
  35. package/test/DynamicInput.spec.ts +30 -0
  36. package/test/FieldInput.spec.ts +44 -0
  37. package/test/angular.spec.ts +102 -0
  38. package/test/integration.spec.ts +57 -0
  39. package/test/layouts.spec.ts +26 -0
  40. package/test.ts +12 -0
  41. package/tsconfig.spec.json +21 -0
  42. package/src/adapters/tailwind.ts +0 -13
  43. package/src/components/imports.ts +0 -3
  44. package/src/examples/index.ts +0 -4
  45. package/src/examples/registerExample.ts +0 -7
  46. package/src/examples/text-field.component.ts +0 -18
  47. package/src/types.ts +0 -1
package/README.md CHANGED
@@ -88,6 +88,67 @@ export class AppComponent {
88
88
  ></dfk-multi-field-input>
89
89
  ```
90
90
 
91
+ ## Layouts
92
+
93
+ `MultiFieldInput` supports `column`, `row`, `grid`, and `responsive` (mobile/desktop with a custom breakpoint), matching the React and Vue adapters:
94
+
95
+ ```html
96
+ <dfk-multi-field-input
97
+ [fieldDescriptions]="fields"
98
+ [layout]="{ type: 'grid', columns: 3, gap: 16 }"
99
+ ></dfk-multi-field-input>
100
+
101
+ <dfk-multi-field-input
102
+ [fieldDescriptions]="fields"
103
+ [layout]="{
104
+ type: 'responsive',
105
+ mobile: 'column',
106
+ desktop: { type: 'grid', columns: 2, gap: 12 }
107
+ }"
108
+ ></dfk-multi-field-input>
109
+ ```
110
+
111
+ ## Derived fields with `computeValue`
112
+
113
+ Give a field a `computeValue` to derive its value from the rest of the form data whenever any field changes:
114
+
115
+ ```ts
116
+ fields: FieldDescription[] = [
117
+ { name: 'firstName', type: 'text' },
118
+ { name: 'lastName', type: 'text' },
119
+ {
120
+ name: 'fullName',
121
+ type: 'text',
122
+ computeValue: (data) => `${data.firstName ?? ''} ${data.lastName ?? ''}`.trim(),
123
+ },
124
+ ];
125
+ ```
126
+
127
+ ## Repeatable field groups
128
+
129
+ A field with `fields` renders as a repeatable group: `data[name]` becomes an array of items, each shaped by the nested `fields`, with "Add"/"Remove" controls rendered automatically.
130
+
131
+ ```ts
132
+ fields: FieldDescription[] = [
133
+ {
134
+ name: 'contacts',
135
+ type: 'group',
136
+ label: 'Contacts',
137
+ fields: [
138
+ { name: 'email', type: 'text', label: 'Email' },
139
+ { name: 'phone', type: 'text', label: 'Phone' },
140
+ ],
141
+ defaultItem: { email: '', phone: '' },
142
+ minItems: 1,
143
+ maxItems: 5,
144
+ },
145
+ ];
146
+ ```
147
+
148
+ ```html
149
+ <dfk-multi-field-input [fieldDescriptions]="fields"></dfk-multi-field-input>
150
+ ```
151
+
91
152
  ## Legacy setup (Angular 14 and earlier with NgModule)
92
153
 
93
154
  ```ts
@@ -118,7 +179,8 @@ declare module '@dynamic-field-kit/core' {
118
179
 
119
180
  - Register Angular component classes in `fieldRegistry`.
120
181
  - Do not register React or Vue renderers in the Angular adapter.
121
- - `MultiFieldInput` supports `column`, `row`, and `grid` layouts.
182
+ - `MultiFieldInput` supports `column`, `row`, `grid`, and `responsive` layouts, and derives fields using `computeValue`.
183
+ - Fields with `fields` render as repeatable groups instead of going through `fieldRegistry`.
122
184
  - The shared schema and field types still come from `@dynamic-field-kit/core`.
123
185
 
124
186
  ## License
package/angular.json ADDED
@@ -0,0 +1,27 @@
1
+ {
2
+ "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
3
+ "version": 1,
4
+ "newProjectRoot": "projects",
5
+ "projects": {
6
+ "dynamic-field-kit-angular": {
7
+ "projectType": "library",
8
+ "root": "",
9
+ "sourceRoot": "src",
10
+ "prefix": "dfk",
11
+ "architect": {
12
+ "test": {
13
+ "builder": "@angular-devkit/build-angular:karma",
14
+ "options": {
15
+ "main": "test.ts",
16
+ "polyfills": ["zone.js"],
17
+ "tsConfig": "tsconfig.spec.json",
18
+ "karmaConfig": "karma.conf.js",
19
+ "assets": [],
20
+ "styles": [],
21
+ "scripts": []
22
+ }
23
+ }
24
+ }
25
+ }
26
+ }
27
+ }
package/dist/README.md CHANGED
@@ -88,6 +88,67 @@ export class AppComponent {
88
88
  ></dfk-multi-field-input>
89
89
  ```
90
90
 
91
+ ## Layouts
92
+
93
+ `MultiFieldInput` supports `column`, `row`, `grid`, and `responsive` (mobile/desktop with a custom breakpoint), matching the React and Vue adapters:
94
+
95
+ ```html
96
+ <dfk-multi-field-input
97
+ [fieldDescriptions]="fields"
98
+ [layout]="{ type: 'grid', columns: 3, gap: 16 }"
99
+ ></dfk-multi-field-input>
100
+
101
+ <dfk-multi-field-input
102
+ [fieldDescriptions]="fields"
103
+ [layout]="{
104
+ type: 'responsive',
105
+ mobile: 'column',
106
+ desktop: { type: 'grid', columns: 2, gap: 12 }
107
+ }"
108
+ ></dfk-multi-field-input>
109
+ ```
110
+
111
+ ## Derived fields with `computeValue`
112
+
113
+ Give a field a `computeValue` to derive its value from the rest of the form data whenever any field changes:
114
+
115
+ ```ts
116
+ fields: FieldDescription[] = [
117
+ { name: 'firstName', type: 'text' },
118
+ { name: 'lastName', type: 'text' },
119
+ {
120
+ name: 'fullName',
121
+ type: 'text',
122
+ computeValue: (data) => `${data.firstName ?? ''} ${data.lastName ?? ''}`.trim(),
123
+ },
124
+ ];
125
+ ```
126
+
127
+ ## Repeatable field groups
128
+
129
+ A field with `fields` renders as a repeatable group: `data[name]` becomes an array of items, each shaped by the nested `fields`, with "Add"/"Remove" controls rendered automatically.
130
+
131
+ ```ts
132
+ fields: FieldDescription[] = [
133
+ {
134
+ name: 'contacts',
135
+ type: 'group',
136
+ label: 'Contacts',
137
+ fields: [
138
+ { name: 'email', type: 'text', label: 'Email' },
139
+ { name: 'phone', type: 'text', label: 'Phone' },
140
+ ],
141
+ defaultItem: { email: '', phone: '' },
142
+ minItems: 1,
143
+ maxItems: 5,
144
+ },
145
+ ];
146
+ ```
147
+
148
+ ```html
149
+ <dfk-multi-field-input [fieldDescriptions]="fields"></dfk-multi-field-input>
150
+ ```
151
+
91
152
  ## Legacy setup (Angular 14 and earlier with NgModule)
92
153
 
93
154
  ```ts
@@ -118,7 +179,8 @@ declare module '@dynamic-field-kit/core' {
118
179
 
119
180
  - Register Angular component classes in `fieldRegistry`.
120
181
  - Do not register React or Vue renderers in the Angular adapter.
121
- - `MultiFieldInput` supports `column`, `row`, and `grid` layouts.
182
+ - `MultiFieldInput` supports `column`, `row`, `grid`, and `responsive` layouts, and derives fields using `computeValue`.
183
+ - Fields with `fields` render as repeatable groups instead of going through `fieldRegistry`.
122
184
  - The shared schema and field types still come from `@dynamic-field-kit/core`.
123
185
 
124
186
  ## License
@@ -1,13 +1,28 @@
1
- import { ChangeDetectorRef, EventEmitter } from '@angular/core';
1
+ import { ChangeDetectorRef, EventEmitter, OnChanges, SimpleChanges } from '@angular/core';
2
2
  import * as i0 from "@angular/core";
3
- export declare abstract class BaseInputComponent {
3
+ export interface FieldInputProps {
4
+ value?: unknown;
5
+ label?: string;
6
+ placeholder?: string;
7
+ required?: boolean;
8
+ disabled?: boolean;
9
+ options?: unknown[];
10
+ className?: string;
11
+ description?: string;
12
+ errorMessage?: string;
13
+ acceptFile?: string;
14
+ maxLength?: number;
15
+ minNumber?: number;
16
+ maxNumber?: number;
17
+ }
18
+ export declare abstract class BaseInputComponent implements OnChanges {
4
19
  protected cdr: ChangeDetectorRef;
5
- value?: any;
20
+ value?: unknown;
6
21
  label?: string;
7
22
  placeholder?: string;
8
23
  required?: boolean;
9
24
  disabled?: boolean;
10
- options?: any[];
25
+ options?: unknown[];
11
26
  className?: string;
12
27
  description?: string;
13
28
  errorMessage?: string;
@@ -15,8 +30,11 @@ export declare abstract class BaseInputComponent {
15
30
  maxLength?: number;
16
31
  minNumber?: number;
17
32
  maxNumber?: number;
18
- valueChange: EventEmitter<any>;
33
+ valueChange: EventEmitter<unknown>;
19
34
  constructor(cdr: ChangeDetectorRef);
35
+ ngOnChanges(_changes: SimpleChanges): void;
36
+ protected detectChanges(): void;
37
+ protected hasChanges(changes: SimpleChanges, prop: string): boolean;
20
38
  static ɵfac: i0.ɵɵFactoryDeclaration<BaseInputComponent, never>;
21
39
  static ɵcmp: i0.ɵɵComponentDeclaration<BaseInputComponent, "ng-component", never, { "value": { "alias": "value"; "required": false; }; "label": { "alias": "label"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "required": { "alias": "required"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "options": { "alias": "options"; "required": false; }; "className": { "alias": "className"; "required": false; }; "description": { "alias": "description"; "required": false; }; "errorMessage": { "alias": "errorMessage"; "required": false; }; "acceptFile": { "alias": "acceptFile"; "required": false; }; "maxLength": { "alias": "maxLength"; "required": false; }; "minNumber": { "alias": "minNumber"; "required": false; }; "maxNumber": { "alias": "maxNumber"; "required": false; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
22
40
  }
@@ -1,11 +1,11 @@
1
- import { EventEmitter, ViewContainerRef, OnChanges, AfterViewInit, OnDestroy, SimpleChanges } from '@angular/core';
1
+ import { AfterViewInit, EventEmitter, OnChanges, OnDestroy, SimpleChanges, ViewContainerRef } from '@angular/core';
2
2
  import { FieldTypeKey } from '@dynamic-field-kit/core';
3
3
  import { BaseInputComponent } from './BaseInput';
4
4
  import * as i0 from "@angular/core";
5
5
  export declare class DynamicInput extends BaseInputComponent implements OnChanges, AfterViewInit, OnDestroy {
6
6
  type: FieldTypeKey;
7
- valueChange: EventEmitter<any>;
8
- onChange: EventEmitter<any>;
7
+ valueChange: EventEmitter<unknown>;
8
+ onChange: EventEmitter<unknown>;
9
9
  host: ViewContainerRef;
10
10
  private compRef?;
11
11
  private inputInstance?;
@@ -13,12 +13,19 @@ export declare class DynamicInput extends BaseInputComponent implements OnChange
13
13
  ngOnChanges(changes: SimpleChanges): void;
14
14
  ngAfterViewInit(): void;
15
15
  ngOnDestroy(): void;
16
+ private syncPropsToInstance;
17
+ private cleanup;
16
18
  private cleanupSubscriptions;
19
+ private cleanupRenderedComponent;
17
20
  private render;
18
- private applyKnownProps;
19
- private bindOutput;
21
+ private isComponentType;
22
+ private renderComponent;
23
+ private renderFallback;
24
+ private getFallbackProps;
25
+ private applyProps;
26
+ private bindOutputs;
20
27
  private emitValue;
21
- private cleanupRenderedComponent;
28
+ private renderError;
22
29
  static ɵfac: i0.ɵɵFactoryDeclaration<DynamicInput, never>;
23
30
  static ɵcmp: i0.ɵɵComponentDeclaration<DynamicInput, "dfk-dynamic-input", never, { "type": { "alias": "type"; "required": false; }; }, { "valueChange": "valueChange"; "onChange": "onChange"; }, never, never, true, never>;
24
31
  }
@@ -1,14 +1,18 @@
1
- import { EventEmitter } from '@angular/core';
2
- import { FieldDescription, Properties } from '@dynamic-field-kit/core';
1
+ import { ChangeDetectorRef, EventEmitter, OnChanges, SimpleChanges } from '@angular/core';
2
+ import { FieldDescription } from '@dynamic-field-kit/core';
3
3
  import * as i0 from "@angular/core";
4
- export declare class FieldInput {
4
+ export declare class FieldInput implements OnChanges {
5
+ private cdr;
5
6
  fieldDescription?: FieldDescription;
6
- renderInfos?: Properties;
7
+ value?: unknown;
7
8
  onValueChangeField: EventEmitter<{
8
- value: any;
9
+ value: unknown;
9
10
  key: string;
10
11
  }>;
12
+ shouldRender: boolean;
13
+ constructor(cdr: ChangeDetectorRef);
14
+ ngOnChanges(_changes: SimpleChanges): void;
11
15
  getFieldValue(): unknown;
12
16
  static ɵfac: i0.ɵɵFactoryDeclaration<FieldInput, never>;
13
- static ɵcmp: i0.ɵɵComponentDeclaration<FieldInput, "dfk-field-input", never, { "fieldDescription": { "alias": "fieldDescription"; "required": false; }; "renderInfos": { "alias": "renderInfos"; "required": false; }; }, { "onValueChangeField": "onValueChangeField"; }, never, never, true, never>;
17
+ static ɵcmp: i0.ɵɵComponentDeclaration<FieldInput, "dfk-field-input", never, { "fieldDescription": { "alias": "fieldDescription"; "required": false; }; "value": { "alias": "value"; "required": false; }; }, { "onValueChangeField": "onValueChangeField"; }, never, never, true, never>;
14
18
  }
@@ -1,23 +1,40 @@
1
- import { EventEmitter, OnChanges, OnInit, SimpleChanges } from '@angular/core';
1
+ import { ChangeDetectorRef, EventEmitter, OnChanges, OnInit, SimpleChanges } from '@angular/core';
2
2
  import { FieldDescription, Properties } from '@dynamic-field-kit/core';
3
- import { LayoutConfig } from '../types/layout';
3
+ import { BaseLayoutConfig, LayoutConfig } from '../types/layout';
4
4
  import * as i0 from "@angular/core";
5
5
  export declare class MultiFieldInput implements OnInit, OnChanges {
6
+ private cdr;
6
7
  fieldDescriptions: FieldDescription[];
7
8
  properties?: Properties;
8
9
  onChange: EventEmitter<Properties>;
9
10
  layout: LayoutConfig;
10
11
  data: Properties;
11
12
  visibleFields: FieldDescription[];
13
+ private isMobile;
14
+ constructor(cdr: ChangeDetectorRef);
15
+ onWindowResize(): void;
16
+ get resolvedLayout(): BaseLayoutConfig;
17
+ get resolvedLayoutType(): string;
18
+ get gap(): number;
19
+ get columns(): number;
12
20
  trackByFn(index: number, field: FieldDescription): string | number;
21
+ trackByIndex(index: number): number;
13
22
  ngOnInit(): void;
14
23
  ngOnChanges(_changes: SimpleChanges): void;
24
+ private updateIsMobile;
15
25
  private init;
16
26
  private updateVisibleFields;
17
27
  onFieldChange(event: {
18
- value: any;
28
+ value: unknown;
19
29
  key: string;
20
30
  }): void;
31
+ getItems(field: FieldDescription): Properties[];
32
+ canAddItem(field: FieldDescription): boolean;
33
+ canRemoveItem(field: FieldDescription): boolean;
34
+ onGroupItemAdd(field: FieldDescription): void;
35
+ onGroupItemRemove(field: FieldDescription, index: number): void;
36
+ onGroupItemChange(field: FieldDescription, index: number, next: Properties): void;
37
+ private commitData;
21
38
  static ɵfac: i0.ɵɵFactoryDeclaration<MultiFieldInput, never>;
22
39
  static ɵcmp: i0.ɵɵComponentDeclaration<MultiFieldInput, "dfk-multi-field-input", never, { "fieldDescriptions": { "alias": "fieldDescriptions"; "required": false; }; "properties": { "alias": "properties"; "required": false; }; "layout": { "alias": "layout"; "required": false; }; }, { "onChange": "onChange"; }, never, never, true, never>;
23
40
  }
@@ -15,13 +15,21 @@ export class BaseInputComponent {
15
15
  maxLength;
16
16
  minNumber;
17
17
  maxNumber;
18
- // Add more from mplis as needed
19
18
  valueChange = new EventEmitter();
20
19
  constructor(cdr) {
21
20
  this.cdr = cdr;
22
21
  }
22
+ ngOnChanges(_changes) {
23
+ this.detectChanges();
24
+ }
25
+ detectChanges() {
26
+ this.cdr.markForCheck();
27
+ }
28
+ hasChanges(changes, prop) {
29
+ return changes[prop] !== undefined;
30
+ }
23
31
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: BaseInputComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
24
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: BaseInputComponent, isStandalone: true, selector: "ng-component", inputs: { value: "value", label: "label", placeholder: "placeholder", required: "required", disabled: "disabled", options: "options", className: "className", description: "description", errorMessage: "errorMessage", acceptFile: "acceptFile", maxLength: "maxLength", minNumber: "minNumber", maxNumber: "maxNumber" }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: '', isInline: true });
32
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: BaseInputComponent, isStandalone: true, selector: "ng-component", inputs: { value: "value", label: "label", placeholder: "placeholder", required: "required", disabled: "disabled", options: "options", className: "className", description: "description", errorMessage: "errorMessage", acceptFile: "acceptFile", maxLength: "maxLength", minNumber: "minNumber", maxNumber: "maxNumber" }, outputs: { valueChange: "valueChange" }, usesOnChanges: true, ngImport: i0, template: '', isInline: true });
25
33
  }
26
34
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: BaseInputComponent, decorators: [{
27
35
  type: Component,
@@ -57,4 +65,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
57
65
  }], valueChange: [{
58
66
  type: Output
59
67
  }] } });
60
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZUlucHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvQmFzZUlucHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7O0FBS3ZCLE1BQU0sT0FBZ0Isa0JBQWtCO0lBa0JoQjtJQWpCYixLQUFLLENBQU87SUFDWixLQUFLLENBQVU7SUFDZixXQUFXLENBQVU7SUFDckIsUUFBUSxDQUFXO0lBQ25CLFFBQVEsQ0FBVztJQUNuQixPQUFPLENBQVM7SUFDaEIsU0FBUyxDQUFVO0lBQ25CLFdBQVcsQ0FBVTtJQUNyQixZQUFZLENBQVU7SUFDdEIsVUFBVSxDQUFVO0lBQ3BCLFNBQVMsQ0FBVTtJQUNuQixTQUFTLENBQVU7SUFDbkIsU0FBUyxDQUFVO0lBQzVCLGdDQUFnQztJQUV0QixXQUFXLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztJQUVoRCxZQUFzQixHQUFzQjtRQUF0QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtJQUFHLENBQUM7d0dBbEI1QixrQkFBa0I7NEZBQWxCLGtCQUFrQiw2YUFGNUIsRUFBRTs7NEZBRVEsa0JBQWtCO2tCQUh2QyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxFQUFFO2lCQUNiO3NGQUVVLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBR0ksV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICB0ZW1wbGF0ZTogJycsXG59KVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VJbnB1dENvbXBvbmVudCB7XG4gIEBJbnB1dCgpIHZhbHVlPzogYW55O1xuICBASW5wdXQoKSBsYWJlbD86IHN0cmluZztcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHJlcXVpcmVkPzogYm9vbGVhbjtcbiAgQElucHV0KCkgZGlzYWJsZWQ/OiBib29sZWFuO1xuICBASW5wdXQoKSBvcHRpb25zPzogYW55W107XG4gIEBJbnB1dCgpIGNsYXNzTmFtZT86IHN0cmluZztcbiAgQElucHV0KCkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGVycm9yTWVzc2FnZT86IHN0cmluZztcbiAgQElucHV0KCkgYWNjZXB0RmlsZT86IHN0cmluZztcbiAgQElucHV0KCkgbWF4TGVuZ3RoPzogbnVtYmVyO1xuICBASW5wdXQoKSBtaW5OdW1iZXI/OiBudW1iZXI7XG4gIEBJbnB1dCgpIG1heE51bWJlcj86IG51bWJlcjtcbiAgLy8gQWRkIG1vcmUgZnJvbSBtcGxpcyBhcyBuZWVkZWRcblxuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge31cbn1cbiJdfQ==
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZUlucHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvQmFzZUlucHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7O0FBcUJ2QixNQUFNLE9BQWdCLGtCQUFrQjtJQWlCaEI7SUFoQmIsS0FBSyxDQUFXO0lBQ2hCLEtBQUssQ0FBVTtJQUNmLFdBQVcsQ0FBVTtJQUNyQixRQUFRLENBQVc7SUFDbkIsUUFBUSxDQUFXO0lBQ25CLE9BQU8sQ0FBYTtJQUNwQixTQUFTLENBQVU7SUFDbkIsV0FBVyxDQUFVO0lBQ3JCLFlBQVksQ0FBVTtJQUN0QixVQUFVLENBQVU7SUFDcEIsU0FBUyxDQUFVO0lBQ25CLFNBQVMsQ0FBVTtJQUNuQixTQUFTLENBQVU7SUFFbEIsV0FBVyxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7SUFFcEQsWUFBc0IsR0FBc0I7UUFBdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7SUFBRyxDQUFDO0lBRWhELFdBQVcsQ0FBQyxRQUF1QjtRQUNqQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVTLGFBQWE7UUFDckIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRVMsVUFBVSxDQUFDLE9BQXNCLEVBQUUsSUFBWTtRQUN2RCxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxTQUFTLENBQUM7SUFDckMsQ0FBQzt3R0E3Qm1CLGtCQUFrQjs0RkFBbEIsa0JBQWtCLGtjQUY1QixFQUFFOzs0RkFFUSxrQkFBa0I7a0JBSHZDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLEVBQUU7aUJBQ2I7c0ZBRVUsS0FBSztzQkFBYixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFFSSxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZpZWxkSW5wdXRQcm9wcyB7XG4gIHZhbHVlPzogdW5rbm93bjtcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICByZXF1aXJlZD86IGJvb2xlYW47XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgb3B0aW9ucz86IHVua25vd25bXTtcbiAgY2xhc3NOYW1lPzogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgZXJyb3JNZXNzYWdlPzogc3RyaW5nO1xuICBhY2NlcHRGaWxlPzogc3RyaW5nO1xuICBtYXhMZW5ndGg/OiBudW1iZXI7XG4gIG1pbk51bWJlcj86IG51bWJlcjtcbiAgbWF4TnVtYmVyPzogbnVtYmVyO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgdGVtcGxhdGU6ICcnLFxufSlcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlSW5wdXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBASW5wdXQoKSB2YWx1ZT86IHVua25vd247XG4gIEBJbnB1dCgpIGxhYmVsPzogc3RyaW5nO1xuICBASW5wdXQoKSBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgQElucHV0KCkgcmVxdWlyZWQ/OiBib29sZWFuO1xuICBASW5wdXQoKSBkaXNhYmxlZD86IGJvb2xlYW47XG4gIEBJbnB1dCgpIG9wdGlvbnM/OiB1bmtub3duW107XG4gIEBJbnB1dCgpIGNsYXNzTmFtZT86IHN0cmluZztcbiAgQElucHV0KCkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGVycm9yTWVzc2FnZT86IHN0cmluZztcbiAgQElucHV0KCkgYWNjZXB0RmlsZT86IHN0cmluZztcbiAgQElucHV0KCkgbWF4TGVuZ3RoPzogbnVtYmVyO1xuICBASW5wdXQoKSBtaW5OdW1iZXI/OiBudW1iZXI7XG4gIEBJbnB1dCgpIG1heE51bWJlcj86IG51bWJlcjtcblxuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHVua25vd24+KCk7XG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgbmdPbkNoYW5nZXMoX2NoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICB0aGlzLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZXRlY3RDaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhc0NoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcywgcHJvcDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGNoYW5nZXNbcHJvcF0gIT09IHVuZGVmaW5lZDtcbiAgfVxufVxuIl19