ngx-nz-formly 0.0.4 → 0.0.6

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 (67) hide show
  1. package/README.md +31 -20
  2. package/esm2022/lib/components/nz-formly-button/nz-formly-button.component.mjs +21 -0
  3. package/esm2022/lib/components/nz-formly-field-checkbox/nz-formly-field-checkbox.component.mjs +33 -0
  4. package/esm2022/lib/components/nz-formly-field-input/nz-formly-field-input.component.mjs +105 -0
  5. package/esm2022/lib/components/nz-formly-field-input/phone-mask.config.mjs +1463 -0
  6. package/esm2022/lib/components/nz-formly-field-radio/nz-formly-field-radio.component.mjs +39 -0
  7. package/esm2022/lib/components/nz-formly-field-select/nz-formly-field-select.component.mjs +34 -0
  8. package/esm2022/lib/components/nz-formly-field-switch/nz-formly-field-switch.component.mjs +38 -0
  9. package/esm2022/lib/ngx-nz-formly-props.model.mjs +6 -0
  10. package/esm2022/lib/ngx-nz-formly-type-safe.model.mjs +44 -0
  11. package/esm2022/lib/ngx-nz-formly-validators.mjs +52 -0
  12. package/esm2022/lib/ngx-nz-formly.module.mjs +263 -0
  13. package/esm2022/lib/wrappers/nz-formly-default-wrapper/nz-formly-default-wrapper.component.mjs +37 -0
  14. package/esm2022/lib/wrappers/nz-formly-label-wrapper/nz-formly-label-wrapper.component.mjs +13 -0
  15. package/esm2022/ngx-nz-formly.mjs +5 -0
  16. package/esm2022/public-api.mjs +5 -0
  17. package/fesm2022/ngx-nz-formly.mjs +2101 -0
  18. package/fesm2022/ngx-nz-formly.mjs.map +1 -0
  19. package/index.d.ts +5 -0
  20. package/lib/components/nz-formly-button/nz-formly-button.component.d.ts +8 -0
  21. package/lib/components/nz-formly-field-checkbox/nz-formly-field-checkbox.component.d.ts +13 -0
  22. package/lib/components/nz-formly-field-input/nz-formly-field-input.component.d.ts +24 -0
  23. package/lib/components/nz-formly-field-input/phone-mask.config.d.ts +11 -0
  24. package/lib/components/nz-formly-field-radio/nz-formly-field-radio.component.d.ts +14 -0
  25. package/lib/components/nz-formly-field-select/nz-formly-field-select.component.d.ts +13 -0
  26. package/lib/components/nz-formly-field-switch/nz-formly-field-switch.component.d.ts +14 -0
  27. package/lib/ngx-nz-formly-props.model.d.ts +145 -0
  28. package/lib/ngx-nz-formly-type-safe.model.d.ts +14 -0
  29. package/lib/ngx-nz-formly-validators.d.ts +16 -0
  30. package/lib/ngx-nz-formly.module.d.ts +2 -0
  31. package/lib/wrappers/nz-formly-default-wrapper/nz-formly-default-wrapper.component.d.ts +7 -0
  32. package/lib/wrappers/nz-formly-label-wrapper/nz-formly-label-wrapper.component.d.ts +7 -0
  33. package/package.json +48 -18
  34. package/ng-package.json +0 -7
  35. package/src/lib/components/nz-formly-button/nz-formly-button.component.html +0 -16
  36. package/src/lib/components/nz-formly-button/nz-formly-button.component.scss +0 -0
  37. package/src/lib/components/nz-formly-button/nz-formly-button.component.ts +0 -18
  38. package/src/lib/components/nz-formly-field-checkbox/nz-formly-field-checkbox.component.html +0 -9
  39. package/src/lib/components/nz-formly-field-checkbox/nz-formly-field-checkbox.component.scss +0 -8
  40. package/src/lib/components/nz-formly-field-checkbox/nz-formly-field-checkbox.component.ts +0 -38
  41. package/src/lib/components/nz-formly-field-input/nz-formly-field-input.component.html +0 -33
  42. package/src/lib/components/nz-formly-field-input/nz-formly-field-input.component.scss +0 -7
  43. package/src/lib/components/nz-formly-field-input/nz-formly-field-input.component.ts +0 -118
  44. package/src/lib/components/nz-formly-field-input/phone-mask.config.ts +0 -1469
  45. package/src/lib/components/nz-formly-field-radio/nz-formly-field-radio.component.html +0 -32
  46. package/src/lib/components/nz-formly-field-radio/nz-formly-field-radio.component.scss +0 -0
  47. package/src/lib/components/nz-formly-field-radio/nz-formly-field-radio.component.ts +0 -44
  48. package/src/lib/components/nz-formly-field-select/nz-formly-field-select.component.html +0 -54
  49. package/src/lib/components/nz-formly-field-select/nz-formly-field-select.component.scss +0 -3
  50. package/src/lib/components/nz-formly-field-select/nz-formly-field-select.component.ts +0 -38
  51. package/src/lib/components/nz-formly-field-switch/nz-formly-field-switch.component.html +0 -10
  52. package/src/lib/components/nz-formly-field-switch/nz-formly-field-switch.component.scss +0 -0
  53. package/src/lib/components/nz-formly-field-switch/nz-formly-field-switch.component.ts +0 -44
  54. package/src/lib/ngx-nz-formly-props.model.ts +0 -158
  55. package/src/lib/ngx-nz-formly-type-safe.model.ts +0 -81
  56. package/src/lib/ngx-nz-formly-validators.ts +0 -92
  57. package/src/lib/ngx-nz-formly.module.ts +0 -260
  58. package/src/lib/wrappers/nz-formly-default-wrapper/nz-formly-default-wrapper.component.html +0 -16
  59. package/src/lib/wrappers/nz-formly-default-wrapper/nz-formly-default-wrapper.component.scss +0 -12
  60. package/src/lib/wrappers/nz-formly-default-wrapper/nz-formly-default-wrapper.component.ts +0 -25
  61. package/src/lib/wrappers/nz-formly-label-wrapper/nz-formly-label-wrapper.component.html +0 -27
  62. package/src/lib/wrappers/nz-formly-label-wrapper/nz-formly-label-wrapper.component.scss +0 -55
  63. package/src/lib/wrappers/nz-formly-label-wrapper/nz-formly-label-wrapper.component.ts +0 -12
  64. package/tsconfig.lib.json +0 -14
  65. package/tsconfig.lib.prod.json +0 -10
  66. package/tsconfig.spec.json +0 -14
  67. /package/{src/public-api.ts → public-api.d.ts} +0 -0
package/README.md CHANGED
@@ -2,23 +2,34 @@
2
2
 
3
3
  This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 16.2.0.
4
4
 
5
- ## Code scaffolding
6
-
7
- Run `ng generate component component-name --project NgxNzFormly` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project NgxNzFormly`.
8
- > Note: Don't forget to add `--project NgxNzFormly` or else it will be added to the default project in your `angular.json` file.
9
-
10
- ## Build
11
-
12
- Run `ng build NgxNzFormly` to build the project. The build artifacts will be stored in the `dist/` directory.
13
-
14
- ## Publishing
15
-
16
- After building your library with `ng build NgxNzFormly`, go to the dist folder `cd dist/ngx-nz-formly` and run `npm publish`.
17
-
18
- ## Running unit tests
19
-
20
- Run `ng test NgxNzFormly` to execute the unit tests via [Karma](https://karma-runner.github.io).
21
-
22
- ## Further help
23
-
24
- To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
5
+ ## Installation
6
+
7
+ Angular version `16.x.x`
8
+ ```bash
9
+ $ npm install --save ngx-nz-formly
10
+ ```
11
+
12
+ ## Quick Start
13
+
14
+ Adding ``ngx-nz-formly`` to your application is super easy. All you need is to add the following modules to imports in ``app.module.ts``.
15
+ ```
16
+ @NgModule({
17
+ declarations: [...],
18
+ imports: [
19
+ ...,
20
+ OverlayModule,
21
+ HttpClientModule,
22
+ BrowserAnimationsModule,
23
+ NgxMaskModule.forRoot({}),
24
+ FormlyModule.forRoot(NzFormlyForRoot),
25
+ ],
26
+ providers: [
27
+ ...,
28
+ { provide: NZ_I18N, useValue: en_US }
29
+ ],
30
+ })
31
+ export class AppModule {}
32
+ ```
33
+ As an explanation, ``HttpClientModule`` and ``providers`` relates to Ant design setup.
34
+ In order to use special masks on inputs, you need to add ``NgxMaskModule``, too. At last, we have ``OverlayModule``, ``BrowserAnimationsModule`` and ``FormlyModule`` to complete the setup.
35
+ Finally, you need ``NzFormlyForRoot`` config to FormlyModule for root to be able to have your formly with Ant Design.
@@ -0,0 +1,21 @@
1
+ import { Component } from "@angular/core";
2
+ import { FieldType } from "@ngx-formly/core";
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/common";
5
+ import * as i2 from "ng-zorro-antd/button";
6
+ import * as i3 from "ng-zorro-antd/core/transition-patch";
7
+ import * as i4 from "ng-zorro-antd/core/wave";
8
+ export class NzFormlyButtonComponent extends FieldType {
9
+ onClick() {
10
+ if (typeof this.props?.click == "function") {
11
+ this.props.click();
12
+ }
13
+ }
14
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NzFormlyButtonComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
15
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: NzFormlyButtonComponent, selector: "app-nz-formly-button", usesInheritance: true, ngImport: i0, template: "<button\r\n nz-button\r\n type=\"button\"\r\n [disabled]=\"props.disabled\"\r\n [nzGhost]=\"props.nzGhost\"\r\n [nzLoading]=\"props.nzLoading\"\r\n [nzShape]=\"props.nzShape\"\r\n [nzSize]=\"props.nzSize\"\r\n [nzType]=\"props.nzType\"\r\n [nzBlock]=\"props.nzBlock\"\r\n [nzDanger]=\"props.nzDanger\"\r\n [ngClass]=\"props.classList\"\r\n (click)=\"onClick()\"\r\n>\r\n {{props.text}}\r\n</button>\r\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i2.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i3.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i4.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }] });
16
+ }
17
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NzFormlyButtonComponent, decorators: [{
18
+ type: Component,
19
+ args: [{ selector: "app-nz-formly-button", template: "<button\r\n nz-button\r\n type=\"button\"\r\n [disabled]=\"props.disabled\"\r\n [nzGhost]=\"props.nzGhost\"\r\n [nzLoading]=\"props.nzLoading\"\r\n [nzShape]=\"props.nzShape\"\r\n [nzSize]=\"props.nzSize\"\r\n [nzType]=\"props.nzType\"\r\n [nzBlock]=\"props.nzBlock\"\r\n [nzDanger]=\"props.nzDanger\"\r\n [ngClass]=\"props.classList\"\r\n (click)=\"onClick()\"\r\n>\r\n {{props.text}}\r\n</button>\r\n" }]
20
+ }] });
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnotZm9ybWx5LWJ1dHRvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbnotZm9ybWx5L3NyYy9saWIvY29tcG9uZW50cy9uei1mb3JtbHktYnV0dG9uL256LWZvcm1seS1idXR0b24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW56LWZvcm1seS9zcmMvbGliL2NvbXBvbmVudHMvbnotZm9ybWx5LWJ1dHRvbi9uei1mb3JtbHktYnV0dG9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUMsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxrQkFBa0IsQ0FBQzs7Ozs7O0FBUWhFLE1BQU0sT0FBTyx1QkFBd0IsU0FBUSxTQUU1QztJQUNDLE9BQU87UUFDTCxJQUFJLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLElBQUksVUFBVSxFQUFFO1lBQzFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDcEI7SUFDSCxDQUFDO3dHQVBVLHVCQUF1Qjs0RkFBdkIsdUJBQXVCLG1GQ1RwQyxpYUFnQkE7OzRGRFBhLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDRSxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBGaWVsZFR5cGUsIEZvcm1seUZpZWxkQ29uZmlnIH0gZnJvbSBcIkBuZ3gtZm9ybWx5L2NvcmVcIjtcclxuaW1wb3J0IHsgTnpGb3JtbHlCdXR0b25Qcm9wcyB9IGZyb20gXCIuLi8uLi9uZ3gtbnotZm9ybWx5LXByb3BzLm1vZGVsXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJhcHAtbnotZm9ybWx5LWJ1dHRvblwiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vbnotZm9ybWx5LWJ1dHRvbi5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsczogW1wiLi9uei1mb3JtbHktYnV0dG9uLmNvbXBvbmVudC5zY3NzXCJdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTnpGb3JtbHlCdXR0b25Db21wb25lbnQgZXh0ZW5kcyBGaWVsZFR5cGU8XHJcbiAgRm9ybWx5RmllbGRDb25maWc8TnpGb3JtbHlCdXR0b25Qcm9wcz5cclxuPiB7XHJcbiAgb25DbGljaygpIHtcclxuICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcz8uY2xpY2sgPT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgIHRoaXMucHJvcHMuY2xpY2soKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPGJ1dHRvblxyXG4gIG56LWJ1dHRvblxyXG4gIHR5cGU9XCJidXR0b25cIlxyXG4gIFtkaXNhYmxlZF09XCJwcm9wcy5kaXNhYmxlZFwiXHJcbiAgW256R2hvc3RdPVwicHJvcHMubnpHaG9zdFwiXHJcbiAgW256TG9hZGluZ109XCJwcm9wcy5uekxvYWRpbmdcIlxyXG4gIFtuelNoYXBlXT1cInByb3BzLm56U2hhcGVcIlxyXG4gIFtuelNpemVdPVwicHJvcHMubnpTaXplXCJcclxuICBbbnpUeXBlXT1cInByb3BzLm56VHlwZVwiXHJcbiAgW256QmxvY2tdPVwicHJvcHMubnpCbG9ja1wiXHJcbiAgW256RGFuZ2VyXT1cInByb3BzLm56RGFuZ2VyXCJcclxuICBbbmdDbGFzc109XCJwcm9wcy5jbGFzc0xpc3RcIlxyXG4gIChjbGljayk9XCJvbkNsaWNrKClcIlxyXG4+XHJcbiAge3twcm9wcy50ZXh0fX1cclxuPC9idXR0b24+XHJcbiJdfQ==
@@ -0,0 +1,33 @@
1
+ import { Component } from "@angular/core";
2
+ import { FieldType } from "@ngx-formly/core";
3
+ import { Subject, takeUntil, tap } from "rxjs";
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@ngx-formly/core";
6
+ import * as i2 from "@angular/forms";
7
+ import * as i3 from "ng-zorro-antd/checkbox";
8
+ export class NzFormlyFieldCheckboxComponent extends FieldType {
9
+ unSubscribeAll$ = new Subject();
10
+ ngOnInit() {
11
+ this.formControl.valueChanges
12
+ .pipe(takeUntil(this.unSubscribeAll$), tap((value) => {
13
+ if (typeof this.props?.change == "function") {
14
+ this.props.change(this.field, value);
15
+ }
16
+ }))
17
+ .subscribe();
18
+ }
19
+ get fieldID() {
20
+ return "control-" + this.field.key;
21
+ }
22
+ ngOnDestroy() {
23
+ this.unSubscribeAll$.next();
24
+ this.unSubscribeAll$.complete();
25
+ }
26
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NzFormlyFieldCheckboxComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
27
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: NzFormlyFieldCheckboxComponent, selector: "app-nz-formly-field-checkbox", usesInheritance: true, ngImport: i0, template: "<label\r\n nz-checkbox\r\n [nzId]=\"fieldID\"\r\n [formControl]=\"formControl\"\r\n [formlyAttributes]=\"field\"\r\n [nzDisabled]=\"props.disabled\"\r\n>\r\n {{props.label}}\r\n</label>\r\n", styles: ["label{display:flex;font-size:100%;font-weight:600;min-height:30px;width:-moz-fit-content;width:fit-content;align-items:center}\n"], dependencies: [{ kind: "directive", type: i1.ɵFormlyAttributes, selector: "[formlyAttributes]", inputs: ["formlyAttributes", "id"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i3.NzCheckboxComponent, selector: "[nz-checkbox]", inputs: ["nzValue", "nzAutoFocus", "nzDisabled", "nzIndeterminate", "nzChecked", "nzId"], outputs: ["nzCheckedChange"], exportAs: ["nzCheckbox"] }] });
28
+ }
29
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NzFormlyFieldCheckboxComponent, decorators: [{
30
+ type: Component,
31
+ args: [{ selector: "app-nz-formly-field-checkbox", template: "<label\r\n nz-checkbox\r\n [nzId]=\"fieldID\"\r\n [formControl]=\"formControl\"\r\n [formlyAttributes]=\"field\"\r\n [nzDisabled]=\"props.disabled\"\r\n>\r\n {{props.label}}\r\n</label>\r\n", styles: ["label{display:flex;font-size:100%;font-weight:600;min-height:30px;width:-moz-fit-content;width:fit-content;align-items:center}\n"] }]
32
+ }] });
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnotZm9ybWx5LWZpZWxkLWNoZWNrYm94LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1uei1mb3JtbHkvc3JjL2xpYi9jb21wb25lbnRzL256LWZvcm1seS1maWVsZC1jaGVja2JveC9uei1mb3JtbHktZmllbGQtY2hlY2tib3guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW56LWZvcm1seS9zcmMvbGliL2NvbXBvbmVudHMvbnotZm9ybWx5LWZpZWxkLWNoZWNrYm94L256LWZvcm1seS1maWVsZC1jaGVja2JveC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQUUsU0FBUyxFQUFtQixNQUFNLGtCQUFrQixDQUFDO0FBRTlELE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7QUFPL0MsTUFBTSxPQUFPLDhCQUNYLFNBQVEsU0FBaUQ7SUFHekQsZUFBZSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFFdEMsUUFBUTtRQUNOLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWTthQUMxQixJQUFJLENBQ0gsU0FBUyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsRUFDL0IsR0FBRyxDQUFDLENBQUMsS0FBYSxFQUFFLEVBQUU7WUFDcEIsSUFBSSxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxJQUFJLFVBQVUsRUFBRTtnQkFDM0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQzthQUN0QztRQUNILENBQUMsQ0FBQyxDQUNIO2FBQ0EsU0FBUyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUVELElBQUksT0FBTztRQUNULE9BQU8sVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xDLENBQUM7d0dBMUJVLDhCQUE4Qjs0RkFBOUIsOEJBQThCLDJGQ1YzQyxxTUFTQTs7NEZEQ2EsOEJBQThCO2tCQUwxQyxTQUFTOytCQUNFLDhCQUE4QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBGaWVsZFR5cGUsIEZpZWxkVHlwZUNvbmZpZyB9IGZyb20gXCJAbmd4LWZvcm1seS9jb3JlXCI7XHJcbmltcG9ydCB7IE56Rm9ybWx5Q2hlY2tib3hQcm9wcyB9IGZyb20gXCIuLi8uLi9uZ3gtbnotZm9ybWx5LXByb3BzLm1vZGVsXCI7XHJcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSBcInJ4anNcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImFwcC1uei1mb3JtbHktZmllbGQtY2hlY2tib3hcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL256LWZvcm1seS1maWVsZC1jaGVja2JveC5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsczogW1wiLi9uei1mb3JtbHktZmllbGQtY2hlY2tib3guY29tcG9uZW50LnNjc3NcIl0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOekZvcm1seUZpZWxkQ2hlY2tib3hDb21wb25lbnRcclxuICBleHRlbmRzIEZpZWxkVHlwZTxGaWVsZFR5cGVDb25maWc8TnpGb3JtbHlDaGVja2JveFByb3BzPj5cclxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95XHJcbntcclxuICB1blN1YnNjcmliZUFsbCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuZm9ybUNvbnRyb2wudmFsdWVDaGFuZ2VzXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLnVuU3Vic2NyaWJlQWxsJCksXHJcbiAgICAgICAgdGFwKCh2YWx1ZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJvcHM/LmNoYW5nZSA9PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5wcm9wcy5jaGFuZ2UodGhpcy5maWVsZCwgdmFsdWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIGdldCBmaWVsZElEKCkge1xyXG4gICAgcmV0dXJuIFwiY29udHJvbC1cIiArIHRoaXMuZmllbGQua2V5O1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLnVuU3Vic2NyaWJlQWxsJC5uZXh0KCk7XHJcbiAgICB0aGlzLnVuU3Vic2NyaWJlQWxsJC5jb21wbGV0ZSgpO1xyXG4gIH1cclxufVxyXG4iLCI8bGFiZWxcclxuICBuei1jaGVja2JveFxyXG4gIFtueklkXT1cImZpZWxkSURcIlxyXG4gIFtmb3JtQ29udHJvbF09XCJmb3JtQ29udHJvbFwiXHJcbiAgW2Zvcm1seUF0dHJpYnV0ZXNdPVwiZmllbGRcIlxyXG4gIFtuekRpc2FibGVkXT1cInByb3BzLmRpc2FibGVkXCJcclxuPlxyXG4gIHt7cHJvcHMubGFiZWx9fVxyXG48L2xhYmVsPlxyXG4iXX0=
@@ -0,0 +1,105 @@
1
+ import { Component } from "@angular/core";
2
+ import { FieldType } from "@ngx-formly/core";
3
+ import { debounceTime, Subject, takeUntil, tap } from "rxjs";
4
+ import { CountryMasks2 } from "./phone-mask.config";
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common";
7
+ import * as i2 from "@ngx-formly/core";
8
+ import * as i3 from "@angular/forms";
9
+ import * as i4 from "ngx-mask";
10
+ import * as i5 from "ng-zorro-antd/input";
11
+ import * as i6 from "ng-zorro-antd/core/transition-patch";
12
+ import * as i7 from "ng-zorro-antd/icon";
13
+ const DefaultPhoneMask = {
14
+ countryShortName: "IR",
15
+ prefix: "+98",
16
+ globalMask: "+00(000)000-0000",
17
+ };
18
+ export class NzFormlyFieldInputComponent extends FieldType {
19
+ mask;
20
+ unSubscribeAll$ = new Subject();
21
+ ngAfterViewInit() {
22
+ this.createInitState();
23
+ this.onValueChange();
24
+ }
25
+ createInitState() {
26
+ if (this.props.mask === "phone") {
27
+ this.mask = DefaultPhoneMask.globalMask;
28
+ this.handlePhoneMask();
29
+ }
30
+ else {
31
+ this.mask = this.props.mask;
32
+ }
33
+ }
34
+ handlePhoneMask() {
35
+ this.formControl.valueChanges
36
+ .pipe(takeUntil(this.unSubscribeAll$), tap((value) => {
37
+ if (value == "") {
38
+ // hint: without setTimeout we don't have Ctrl + A -> delete
39
+ setTimeout(() => {
40
+ this.mask = DefaultPhoneMask.globalMask;
41
+ });
42
+ }
43
+ else {
44
+ let mask = this.findAppropriateMask(value);
45
+ if (mask && this.mask !== mask.globalMask) {
46
+ this.mask = mask.globalMask?.replace(/#|[1-9]/g, "0");
47
+ }
48
+ }
49
+ }))
50
+ .subscribe();
51
+ }
52
+ onValueChange() {
53
+ this.formControl.valueChanges
54
+ .pipe(takeUntil(this.unSubscribeAll$), debounceTime(300), tap((value) => {
55
+ if (typeof this.props?.change == "function") {
56
+ this.props.change(this.field, value);
57
+ }
58
+ }))
59
+ .subscribe();
60
+ }
61
+ findAppropriateMask(value) {
62
+ let newMask = CountryMasks2.filter(item => this.exactEquality(value, item.prefix)).find(item => value.length <= item.globalMask.length);
63
+ if (newMask)
64
+ return newMask;
65
+ return null;
66
+ }
67
+ exactEquality(str, prefix) {
68
+ // hint: replace function removes all characters except numbers to return clean numeric string
69
+ // hint: index of convince us to match prefix on first index of input value
70
+ let new_str = str.replace(/[^0-9.]/g, "");
71
+ let new_prefix = prefix.replace(/[^0-9.]/g, "");
72
+ return new_str.indexOf(new_prefix) == 0;
73
+ }
74
+ changeShowPassword(input) {
75
+ if (input.type === "password") {
76
+ input.type = "text";
77
+ }
78
+ else {
79
+ input.type = "password";
80
+ }
81
+ }
82
+ showPassword(input) {
83
+ return input.type === "text";
84
+ }
85
+ get type() {
86
+ return this.props.type ?? "text";
87
+ }
88
+ get fieldID() {
89
+ return "control-" + this.field.key;
90
+ }
91
+ get status() {
92
+ return this.formControl.touched && this.formControl.invalid ? "error" : "";
93
+ }
94
+ ngOnDestroy() {
95
+ this.unSubscribeAll$.next();
96
+ this.unSubscribeAll$.complete();
97
+ }
98
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NzFormlyFieldInputComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
99
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: NzFormlyFieldInputComponent, selector: "app-nz-formly-field-input", usesInheritance: true, ngImport: i0, template: "<nz-input-group\r\n [nzAddOnAfter]=\"props.nzAddOnAfter\"\r\n [nzAddOnBefore]=\"props.nzAddOnBefore\"\r\n [nzAddOnAfterIcon]=\"props.nzAddOnAfterIcon\"\r\n [nzAddOnBeforeIcon]=\"props.nzAddOnBeforeIcon\"\r\n [nzPrefix]=\"props.nzPrefix\"\r\n [nzSuffix]=\"props.nzSuffix\"\r\n [nzSize]=\"props.nzSize || 'default'\"\r\n>\r\n <input\r\n #input\r\n nz-input\r\n [id]=\"fieldID\"\r\n [formControl]=\"formControl\"\r\n [formlyAttributes]=\"field\"\r\n [mask]=\"mask\"\r\n [thousandSeparator]=\"props.thousandSeparator\"\r\n [type]=\"type\"\r\n [nzStatus]=\"status\"\r\n [disabled]=\"props.disabled\"\r\n [readonly]=\"props.readonly\"\r\n [placeholder]=\"props.placeholder\"\r\n [nzBorderless]=\"props.nzBorderless\"\r\n />\r\n <div class=\"show-password\" *ngIf=\"props.type === 'password'\">\r\n <span\r\n nz-icon\r\n nzTheme=\"outline\"\r\n (click)=\"changeShowPassword(input)\"\r\n [nzType]=\"showPassword(input) ? 'eye-invisible' : 'eye'\"\r\n ></span>\r\n </div>\r\n</nz-input-group>\r\n", styles: [".show-password{z-index:5;opacity:.6;cursor:pointer;position:absolute;inset-inline-end:10px}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵFormlyAttributes, selector: "[formlyAttributes]", inputs: ["formlyAttributes", "id"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.NgxMaskDirective, selector: "input[mask], textarea[mask]", inputs: ["mask", "specialCharacters", "patterns", "prefix", "suffix", "thousandSeparator", "decimalMarker", "dropSpecialCharacters", "hiddenInput", "showMaskTyped", "placeHolderCharacter", "shownMaskExpression", "showTemplate", "clearIfNotMatch", "validation", "separatorLimit", "allowNegativeNumbers", "leadZeroDateTime", "leadZero", "triggerOnMaskChange", "apm", "inputTransformFn", "outputTransformFn", "keepCharacterPositions"], outputs: ["maskFilled"], exportAs: ["mask", "ngxMask"] }, { kind: "directive", type: i5.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "nzStepperless", "nzStatus", "disabled"], exportAs: ["nzInput"] }, { kind: "component", type: i5.NzInputGroupComponent, selector: "nz-input-group", inputs: ["nzAddOnBeforeIcon", "nzAddOnAfterIcon", "nzPrefixIcon", "nzSuffixIcon", "nzAddOnBefore", "nzAddOnAfter", "nzPrefix", "nzStatus", "nzSuffix", "nzSize", "nzSearch", "nzCompact"], exportAs: ["nzInputGroup"] }, { kind: "directive", type: i5.NzInputGroupWhitSuffixOrPrefixDirective, selector: "nz-input-group[nzSuffix], nz-input-group[nzPrefix]" }, { kind: "directive", type: i6.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i7.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }] });
100
+ }
101
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NzFormlyFieldInputComponent, decorators: [{
102
+ type: Component,
103
+ args: [{ selector: "app-nz-formly-field-input", template: "<nz-input-group\r\n [nzAddOnAfter]=\"props.nzAddOnAfter\"\r\n [nzAddOnBefore]=\"props.nzAddOnBefore\"\r\n [nzAddOnAfterIcon]=\"props.nzAddOnAfterIcon\"\r\n [nzAddOnBeforeIcon]=\"props.nzAddOnBeforeIcon\"\r\n [nzPrefix]=\"props.nzPrefix\"\r\n [nzSuffix]=\"props.nzSuffix\"\r\n [nzSize]=\"props.nzSize || 'default'\"\r\n>\r\n <input\r\n #input\r\n nz-input\r\n [id]=\"fieldID\"\r\n [formControl]=\"formControl\"\r\n [formlyAttributes]=\"field\"\r\n [mask]=\"mask\"\r\n [thousandSeparator]=\"props.thousandSeparator\"\r\n [type]=\"type\"\r\n [nzStatus]=\"status\"\r\n [disabled]=\"props.disabled\"\r\n [readonly]=\"props.readonly\"\r\n [placeholder]=\"props.placeholder\"\r\n [nzBorderless]=\"props.nzBorderless\"\r\n />\r\n <div class=\"show-password\" *ngIf=\"props.type === 'password'\">\r\n <span\r\n nz-icon\r\n nzTheme=\"outline\"\r\n (click)=\"changeShowPassword(input)\"\r\n [nzType]=\"showPassword(input) ? 'eye-invisible' : 'eye'\"\r\n ></span>\r\n </div>\r\n</nz-input-group>\r\n", styles: [".show-password{z-index:5;opacity:.6;cursor:pointer;position:absolute;inset-inline-end:10px}\n"] }]
104
+ }] });
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnotZm9ybWx5LWZpZWxkLWlucHV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1uei1mb3JtbHkvc3JjL2xpYi9jb21wb25lbnRzL256LWZvcm1seS1maWVsZC1pbnB1dC9uei1mb3JtbHktZmllbGQtaW5wdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW56LWZvcm1seS9zcmMvbGliL2NvbXBvbmVudHMvbnotZm9ybWx5LWZpZWxkLWlucHV0L256LWZvcm1seS1maWVsZC1pbnB1dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUNwRSxPQUFPLEVBQUUsU0FBUyxFQUFtQixNQUFNLGtCQUFrQixDQUFDO0FBRTlELE9BQU8sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0QsT0FBTyxFQUFtQixhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7Ozs7O0FBRXJFLE1BQU0sZ0JBQWdCLEdBQW9CO0lBQ3hDLGdCQUFnQixFQUFFLElBQUk7SUFDdEIsTUFBTSxFQUFFLEtBQUs7SUFDYixVQUFVLEVBQUUsa0JBQWtCO0NBQy9CLENBQUM7QUFPRixNQUFNLE9BQU8sMkJBQ1gsU0FBUSxTQUE4QztJQUd0RCxJQUFJLENBQXFCO0lBQ3pCLGVBQWUsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBRXRDLGVBQWU7UUFDYixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUU7WUFDL0IsSUFBSSxDQUFD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QUM7SUFFRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQztJQUNuQyxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7SUFDckMsQ0FBQztJQUVELElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzdFLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xDLENBQUM7d0dBbkdVLDJCQUEyQjs0RkFBM0IsMkJBQTJCLHdGQ2pCeEMsbWtDQWlDQTs7NEZEaEJhLDJCQUEyQjtrQkFMdkMsU0FBUzsrQkFDRSwyQkFBMkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIE9uRGVzdHJveSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IEZpZWxkVHlwZSwgRmllbGRUeXBlQ29uZmlnIH0gZnJvbSBcIkBuZ3gtZm9ybWx5L2NvcmVcIjtcclxuaW1wb3J0IHsgTnpGb3JtbHlJbnB1dFByb3BzIH0gZnJvbSBcIi4uLy4uL25neC1uei1mb3JtbHktcHJvcHMubW9kZWxcIjtcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBTdWJqZWN0LCB0YWtlVW50aWwsIHRhcCB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IENvdW50cnlDb2RlTWFzaywgQ291bnRyeU1hc2tzMiB9IGZyb20gXCIuL3Bob25lLW1hc2suY29uZmlnXCI7XHJcblxyXG5jb25zdCBEZWZhdWx0UGhvbmVNYXNrOiBDb3VudHJ5Q29kZU1hc2sgPSB7XHJcbiAgY291bnRyeVNob3J0TmFtZTogXCJJUlwiLFxyXG4gIHByZWZpeDogXCIrOThcIixcclxuICBnbG9iYWxNYXNrOiBcIiswMCgwMDApMDAwLTAwMDBcIixcclxufTtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImFwcC1uei1mb3JtbHktZmllbGQtaW5wdXRcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL256LWZvcm1seS1maWVsZC1pbnB1dC5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsczogW1wiLi9uei1mb3JtbHktZmllbGQtaW5wdXQuY29tcG9uZW50LnNjc3NcIl0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOekZvcm1seUZpZWxkSW5wdXRDb21wb25lbnRcclxuICBleHRlbmRzIEZpZWxkVHlwZTxGaWVsZFR5cGVDb25maWc8TnpGb3JtbHlJbnB1dFByb3BzPj5cclxuICBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveVxyXG57XHJcbiAgbWFzazogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIHVuU3Vic2NyaWJlQWxsJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIHRoaXMuY3JlYXRlSW5pdFN0YXRlKCk7XHJcbiAgICB0aGlzLm9uVmFsdWVDaGFuZ2UoKTtcclxuICB9XHJcblxyXG4gIGNyZWF0ZUluaXRTdGF0ZSgpIHtcclxuICAgIGlmICh0aGlzLnByb3BzLm1hc2sgPT09IFwicGhvbmVcIikge1xyXG4gICAgICB0aGlzLm1hc2sgPSBEZWZhdWx0UGhvbmVNYXNrLmdsb2JhbE1hc2s7XHJcbiAgICAgIHRoaXMuaGFuZGxlUGhvbmVNYXNrKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm1hc2sgPSB0aGlzLnByb3BzLm1hc2s7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVQaG9uZU1hc2soKSB7XHJcbiAgICB0aGlzLmZvcm1Db250cm9sLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YWtlVW50aWwodGhpcy51blN1YnNjcmliZUFsbCQpLFxyXG4gICAgICAgIHRhcCgodmFsdWU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgaWYgKHZhbHVlID09IFwiXCIpIHtcclxuICAgICAgICAgICAgLy8gaGludDogd2l0aG91dCBzZXRUaW1lb3V0IHdlIGRvbid0IGhhdmUgQ3RybCArIEEgLT4gZGVsZXRlXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMubWFzayA9IERlZmF1bHRQaG9uZU1hc2suZ2xvYmFsTWFzaztcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgbWFzayA9IHRoaXMuZmluZEFwcHJvcHJpYXRlTWFzayh2YWx1ZSk7XHJcbiAgICAgICAgICAgIGlmIChtYXNrICYmIHRoaXMubWFzayAhPT0gbWFzay5nbG9iYWxNYXNrKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5tYXNrID0gbWFzay5nbG9iYWxNYXNrPy5yZXBsYWNlKC8jfFsxLTldL2csIFwiMFwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIG9uVmFsdWVDaGFuZ2UoKSB7XHJcbiAgICB0aGlzLmZvcm1Db250cm9sLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YWtlVW50aWwodGhpcy51blN1YnNjcmliZUFsbCQpLFxyXG4gICAgICAgIGRlYm91bmNlVGltZSgzMDApLFxyXG4gICAgICAgIHRhcCgodmFsdWU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzPy5jaGFuZ2UgPT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJvcHMuY2hhbmdlKHRoaXMuZmllbGQsIHZhbHVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBmaW5kQXBwcm9wcmlhdGVNYXNrKHZhbHVlOiBzdHJpbmcpOiBDb3VudHJ5Q29kZU1hc2sgfCBudWxsIHtcclxuICAgIGxldCBuZXdNYXNrID0gQ291bnRyeU1hc2tzMi5maWx0ZXIoaXRlbSA9PlxyXG4gICAgICB0aGlzLmV4YWN0RXF1YWxpdHkodmFsdWUsIGl0ZW0ucHJlZml4KSxcclxuICAgICkuZmluZChpdGVtID0+IHZhbHVlLmxlbmd0aCA8PSBpdGVtLmdsb2JhbE1hc2subGVuZ3RoKTtcclxuICAgIGlmIChuZXdNYXNrKSByZXR1cm4gbmV3TWFzaztcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZXhhY3RFcXVhbGl0eShzdHI6IHN0cmluZywgcHJlZml4OiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIC8vIGhpbnQ6IHJlcGxhY2UgZnVuY3Rpb24gcmVtb3ZlcyBhbGwgY2hhcmFjdGVycyBleGNlcHQgbnVtYmVycyB0byByZXR1cm4gY2xlYW4gbnVtZXJpYyBzdHJpbmdcclxuICAgIC8vIGhpbnQ6IGluZGV4IG9mIGNvbnZpbmNlIHVzIHRvIG1hdGNoIHByZWZpeCBvbiBmaXJzdCBpbmRleCBvZiBpbnB1dCB2YWx1ZVxyXG4gICAgbGV0IG5ld19zdHIgPSBzdHIucmVwbGFjZSgvW14wLTkuXS9nLCBcIlwiKTtcclxuICAgIGxldCBuZXdfcHJlZml4ID0gcHJlZml4LnJlcGxhY2UoL1teMC05Ll0vZywgXCJcIik7XHJcbiAgICByZXR1cm4gbmV3X3N0ci5pbmRleE9mKG5ld19wcmVmaXgpID09IDA7XHJcbiAgfVxyXG5cclxuICBjaGFuZ2VTaG93UGFzc3dvcmQoaW5wdXQ6IGFueSkge1xyXG4gICAgaWYgKGlucHV0LnR5cGUgPT09IFwicGFzc3dvcmRcIikge1xyXG4gICAgICBpbnB1dC50eXBlID0gXCJ0ZXh0XCI7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpbnB1dC50eXBlID0gXCJwYXNzd29yZFwiO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2hvd1Bhc3N3b3JkKGlucHV0OiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBpbnB1dC50eXBlID09PSBcInRleHRcIjtcclxuICB9XHJcblxyXG4gIGdldCB0eXBlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMucHJvcHMudHlwZSA/PyBcInRleHRcIjtcclxuICB9XHJcblxyXG4gIGdldCBmaWVsZElEKCkge1xyXG4gICAgcmV0dXJuIFwiY29udHJvbC1cIiArIHRoaXMuZmllbGQua2V5O1xyXG4gIH1cclxuXHJcbiAgZ2V0IHN0YXR1cygpIHtcclxuICAgIHJldHVybiB0aGlzLmZvcm1Db250cm9sLnRvdWNoZWQgJiYgdGhpcy5mb3JtQ29udHJvbC5pbnZhbGlkID8gXCJlcnJvclwiIDogXCJcIjtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy51blN1YnNjcmliZUFsbCQubmV4dCgpO1xyXG4gICAgdGhpcy51blN1YnNjcmliZUFsbCQuY29tcGxldGUoKTtcclxuICB9XHJcbn1cclxuIiwiPG56LWlucHV0LWdyb3VwXHJcbiAgW256QWRkT25BZnRlcl09XCJwcm9wcy5uekFkZE9uQWZ0ZXJcIlxyXG4gIFtuekFkZE9uQmVmb3JlXT1cInByb3BzLm56QWRkT25CZWZvcmVcIlxyXG4gIFtuekFkZE9uQWZ0ZXJJY29uXT1cInByb3BzLm56QWRkT25BZnRlckljb25cIlxyXG4gIFtuekFkZE9uQmVmb3JlSWNvbl09XCJwcm9wcy5uekFkZE9uQmVmb3JlSWNvblwiXHJcbiAgW256UHJlZml4XT1cInByb3BzLm56UHJlZml4XCJcclxuICBbbnpTdWZmaXhdPVwicHJvcHMubnpTdWZmaXhcIlxyXG4gIFtuelNpemVdPVwicHJvcHMubnpTaXplIHx8ICdkZWZhdWx0J1wiXHJcbj5cclxuICA8aW5wdXRcclxuICAgICAgI2lucHV0XHJcbiAgICAgIG56LWlucHV0XHJcbiAgICAgIFtpZF09XCJmaWVsZElEXCJcclxuICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCJcclxuICAgICAgW2Zvcm1seUF0dHJpYnV0ZXNdPVwiZmllbGRcIlxyXG4gICAgICBbbWFza109XCJtYXNrXCJcclxuICAgICAgW3Rob3VzYW5kU2VwYXJhdG9yXT1cInByb3BzLnRob3VzYW5kU2VwYXJhdG9yXCJcclxuICAgICAgW3R5cGVdPVwidHlwZVwiXHJcbiAgICAgIFtuelN0YXR1c109XCJzdGF0dXNcIlxyXG4gICAgICBbZGlzYWJsZWRdPVwicHJvcHMuZGlzYWJsZWRcIlxyXG4gICAgICBbcmVhZG9ubHldPVwicHJvcHMucmVhZG9ubHlcIlxyXG4gICAgICBbcGxhY2Vob2xkZXJdPVwicHJvcHMucGxhY2Vob2xkZXJcIlxyXG4gICAgICBbbnpCb3JkZXJsZXNzXT1cInByb3BzLm56Qm9yZGVybGVzc1wiXHJcbiAgLz5cclxuICA8ZGl2IGNsYXNzPVwic2hvdy1wYXNzd29yZFwiICpuZ0lmPVwicHJvcHMudHlwZSA9PT0gJ3Bhc3N3b3JkJ1wiPlxyXG4gICAgPHNwYW5cclxuICAgICAgbnotaWNvblxyXG4gICAgICBuelRoZW1lPVwib3V0bGluZVwiXHJcbiAgICAgIChjbGljayk9XCJjaGFuZ2VTaG93UGFzc3dvcmQoaW5wdXQpXCJcclxuICAgICAgW256VHlwZV09XCJzaG93UGFzc3dvcmQoaW5wdXQpID8gJ2V5ZS1pbnZpc2libGUnIDogJ2V5ZSdcIlxyXG4gICAgPjwvc3Bhbj5cclxuICA8L2Rpdj5cclxuPC9uei1pbnB1dC1ncm91cD5cclxuIl19