@skyux/phone-field 5.7.2 → 6.0.0-beta.2

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 (53) hide show
  1. package/esm2020/index.mjs +8 -0
  2. package/esm2020/lib/modules/phone-field/phone-field-adapter.service.mjs +64 -0
  3. package/esm2020/lib/modules/phone-field/phone-field-input.directive.mjs +280 -0
  4. package/esm2020/lib/modules/phone-field/phone-field.component.mjs +332 -0
  5. package/esm2020/lib/modules/phone-field/phone-field.module.mjs +50 -0
  6. package/esm2020/lib/modules/phone-field/types/country.mjs +2 -0
  7. package/esm2020/lib/modules/phone-field/types/number-return-format.mjs +2 -0
  8. package/esm2020/lib/modules/shared/sky-phone-field-resources.module.mjs +60 -0
  9. package/esm2020/skyux-phone-field.mjs +5 -0
  10. package/esm2020/testing/phonefield/phone-field-fixture.mjs +160 -0
  11. package/esm2020/testing/phonefield/phone-field-testing.module.mjs +27 -0
  12. package/esm2020/testing/public-api.mjs +3 -0
  13. package/esm2020/testing/skyux-phone-field-testing.mjs +5 -0
  14. package/fesm2015/{skyux-phone-field-testing.js → skyux-phone-field-testing.mjs} +5 -5
  15. package/fesm2015/skyux-phone-field-testing.mjs.map +1 -0
  16. package/fesm2015/skyux-phone-field.mjs +771 -0
  17. package/fesm2015/skyux-phone-field.mjs.map +1 -0
  18. package/fesm2020/skyux-phone-field-testing.mjs +194 -0
  19. package/fesm2020/skyux-phone-field-testing.mjs.map +1 -0
  20. package/{fesm2015/skyux-phone-field.js → fesm2020/skyux-phone-field.mjs} +22 -30
  21. package/fesm2020/skyux-phone-field.mjs.map +1 -0
  22. package/package.json +42 -18
  23. package/testing/package.json +5 -5
  24. package/bundles/skyux-phone-field-testing.umd.js +0 -658
  25. package/bundles/skyux-phone-field.umd.js +0 -1162
  26. package/esm2015/index.js +0 -8
  27. package/esm2015/index.js.map +0 -1
  28. package/esm2015/lib/modules/phone-field/phone-field-adapter.service.js +0 -64
  29. package/esm2015/lib/modules/phone-field/phone-field-adapter.service.js.map +0 -1
  30. package/esm2015/lib/modules/phone-field/phone-field-input.directive.js +0 -280
  31. package/esm2015/lib/modules/phone-field/phone-field-input.directive.js.map +0 -1
  32. package/esm2015/lib/modules/phone-field/phone-field.component.js +0 -340
  33. package/esm2015/lib/modules/phone-field/phone-field.component.js.map +0 -1
  34. package/esm2015/lib/modules/phone-field/phone-field.module.js +0 -50
  35. package/esm2015/lib/modules/phone-field/phone-field.module.js.map +0 -1
  36. package/esm2015/lib/modules/phone-field/types/country.js +0 -2
  37. package/esm2015/lib/modules/phone-field/types/country.js.map +0 -1
  38. package/esm2015/lib/modules/phone-field/types/number-return-format.js +0 -2
  39. package/esm2015/lib/modules/phone-field/types/number-return-format.js.map +0 -1
  40. package/esm2015/lib/modules/shared/sky-phone-field-resources.module.js +0 -60
  41. package/esm2015/lib/modules/shared/sky-phone-field-resources.module.js.map +0 -1
  42. package/esm2015/skyux-phone-field.js +0 -5
  43. package/esm2015/skyux-phone-field.js.map +0 -1
  44. package/esm2015/testing/phonefield/phone-field-fixture.js +0 -185
  45. package/esm2015/testing/phonefield/phone-field-fixture.js.map +0 -1
  46. package/esm2015/testing/phonefield/phone-field-testing.module.js +0 -27
  47. package/esm2015/testing/phonefield/phone-field-testing.module.js.map +0 -1
  48. package/esm2015/testing/public-api.js +0 -3
  49. package/esm2015/testing/public-api.js.map +0 -1
  50. package/esm2015/testing/skyux-phone-field-testing.js +0 -5
  51. package/esm2015/testing/skyux-phone-field-testing.js.map +0 -1
  52. package/fesm2015/skyux-phone-field-testing.js.map +0 -1
  53. package/fesm2015/skyux-phone-field.js.map +0 -1
@@ -0,0 +1,8 @@
1
+ export * from './lib/modules/phone-field/phone-field.module';
2
+ export * from './lib/modules/phone-field/types/country';
3
+ export * from './lib/modules/phone-field/types/number-return-format';
4
+ // Components and directives must be exported to support Angular's "partial" Ivy compiler.
5
+ // Obscure names are used to indicate types are not part of the public API.
6
+ export { SkyPhoneFieldComponent as λ1 } from './lib/modules/phone-field/phone-field.component';
7
+ export { SkyPhoneFieldInputDirective as λ2 } from './lib/modules/phone-field/phone-field-input.directive';
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvcGhvbmUtZmllbGQvc3JjL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsOENBQThDLENBQUM7QUFDN0QsY0FBYyx5Q0FBeUMsQ0FBQztBQUN4RCxjQUFjLHNEQUFzRCxDQUFDO0FBRXJFLDBGQUEwRjtBQUMxRiwyRUFBMkU7QUFDM0UsT0FBTyxFQUFFLHNCQUFzQixJQUFJLEVBQUUsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQy9GLE9BQU8sRUFBRSwyQkFBMkIsSUFBSSxFQUFFLEVBQUUsTUFBTSx1REFBdUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbGliL21vZHVsZXMvcGhvbmUtZmllbGQvcGhvbmUtZmllbGQubW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL21vZHVsZXMvcGhvbmUtZmllbGQvdHlwZXMvY291bnRyeSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9tb2R1bGVzL3Bob25lLWZpZWxkL3R5cGVzL251bWJlci1yZXR1cm4tZm9ybWF0JztcblxuLy8gQ29tcG9uZW50cyBhbmQgZGlyZWN0aXZlcyBtdXN0IGJlIGV4cG9ydGVkIHRvIHN1cHBvcnQgQW5ndWxhcidzIFwicGFydGlhbFwiIEl2eSBjb21waWxlci5cbi8vIE9ic2N1cmUgbmFtZXMgYXJlIHVzZWQgdG8gaW5kaWNhdGUgdHlwZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJLlxuZXhwb3J0IHsgU2t5UGhvbmVGaWVsZENvbXBvbmVudCBhcyDOuzEgfSBmcm9tICcuL2xpYi9tb2R1bGVzL3Bob25lLWZpZWxkL3Bob25lLWZpZWxkLmNvbXBvbmVudCc7XG5leHBvcnQgeyBTa3lQaG9uZUZpZWxkSW5wdXREaXJlY3RpdmUgYXMgzrsyIH0gZnJvbSAnLi9saWIvbW9kdWxlcy9waG9uZS1maWVsZC9waG9uZS1maWVsZC1pbnB1dC5kaXJlY3RpdmUnO1xuIl19
@@ -0,0 +1,64 @@
1
+ import { Injectable, Renderer2 } from '@angular/core';
2
+ import { SkyLibResourcesService } from '@skyux/i18n';
3
+ import { Subject } from 'rxjs';
4
+ import { takeUntil } from 'rxjs/operators';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@skyux/i18n";
7
+ /**
8
+ * Service for interacting with the DOM elements of the phone field.
9
+ * @internal
10
+ */
11
+ export class SkyPhoneFieldAdapterService {
12
+ constructor(renderer, resourcesService) {
13
+ this.renderer = renderer;
14
+ this.resourcesService = resourcesService;
15
+ this.ngUnsubscribe = new Subject();
16
+ }
17
+ ngOnDestroy() {
18
+ this.ngUnsubscribe.next();
19
+ this.ngUnsubscribe.complete();
20
+ }
21
+ addElementClass(elementRef, className) {
22
+ this.renderer.addClass(elementRef.nativeElement, className);
23
+ }
24
+ setElementDisabledState(elementRef, disabled) {
25
+ this.renderer.setProperty(elementRef.nativeElement, 'disabled', disabled);
26
+ }
27
+ setElementPlaceholder(elementRef, placeholder) {
28
+ this.renderer.setAttribute(elementRef.nativeElement, 'placeholder', placeholder);
29
+ }
30
+ setElementType(elementRef) {
31
+ this.renderer.setAttribute(elementRef.nativeElement, 'type', 'tel');
32
+ }
33
+ setElementValue(elementRef, value) {
34
+ if (value) {
35
+ this.renderer.setProperty(elementRef.nativeElement, 'value', value);
36
+ }
37
+ }
38
+ setAriaLabel(element) {
39
+ /* Sanity check */
40
+ /* istanbul ignore else */
41
+ if (!element.nativeElement.getAttribute('aria-label')) {
42
+ this.resourcesService
43
+ .getString('skyux_phone_field_default_label')
44
+ .pipe(takeUntil(this.ngUnsubscribe))
45
+ .subscribe((value) => {
46
+ this.renderer.setAttribute(element.nativeElement, 'aria-label', value);
47
+ });
48
+ }
49
+ }
50
+ focusCountrySearchElement(el) {
51
+ const input = el.querySelector('textarea');
52
+ input.focus();
53
+ }
54
+ focusPhoneInput(el) {
55
+ const input = el.querySelector('.sky-phone-field-container input');
56
+ input.focus();
57
+ }
58
+ }
59
+ SkyPhoneFieldAdapterService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPhoneFieldAdapterService, deps: [{ token: i0.Renderer2 }, { token: i1.SkyLibResourcesService }], target: i0.ɵɵFactoryTarget.Injectable });
60
+ SkyPhoneFieldAdapterService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPhoneFieldAdapterService });
61
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPhoneFieldAdapterService, decorators: [{
62
+ type: Injectable
63
+ }], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i1.SkyLibResourcesService }]; } });
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhvbmUtZmllbGQtYWRhcHRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL3Bob25lLWZpZWxkL3NyYy9saWIvbW9kdWxlcy9waG9uZS1maWVsZC9waG9uZS1maWVsZC1hZGFwdGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLFVBQVUsRUFBYSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXJELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUFFM0M7OztHQUdHO0FBRUgsTUFBTSxPQUFPLDJCQUEyQjtJQUd0QyxZQUNVLFFBQW1CLEVBQ25CLGdCQUF3QztRQUR4QyxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBd0I7UUFKMUMsa0JBQWEsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBS25DLENBQUM7SUFFRyxXQUFXO1FBQ2hCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRU0sZUFBZSxDQUFDLFVBQXNCLEVBQUUsU0FBaUI7UUFDOUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRU0sdUJBQXVCLENBQzVCLFVBQXNCLEVBQ3RCLFFBQWlCO1FBRWpCLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFTSxxQkFBcUIsQ0FDMUIsVUFBc0IsRUFDdEIsV0FBbUI7UUFFbkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQ3hCLFVBQVUsQ0FBQyxhQUFhLEVBQ3hCLGFBQWEsRUFDYixXQUFXLENBQ1osQ0FBQztJQUNKLENBQUM7SUFFTSxjQUFjLENBQUMsVUFBc0I7UUFDMUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVNLGVBQWUsQ0FBQyxVQUFzQixFQUFFLEtBQWE7UUFDMUQsSUFBSSxLQUFLLEVBQUU7WUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztTQUNyRTtJQUNILENBQUM7SUFFTSxZQUFZLENBQUMsT0FBbUI7UUFDckMsa0JBQWtCO1FBQ2xCLDBCQUEwQjtRQUMxQixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLEVBQUU7WUFDckQsSUFBSSxDQUFDLGdCQUFnQjtpQkFDbEIsU0FBUyxDQUFDLGlDQUFpQyxDQUFDO2lCQUM1QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztpQkFDbkMsU0FBUyxDQUFDLENBQUMsS0FBYSxFQUFFLEVBQUU7Z0JBQzNCLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUN4QixPQUFPLENBQUMsYUFBYSxFQUNyQixZQUFZLEVBQ1osS0FBSyxDQUNOLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztTQUNOO0lBQ0gsQ0FBQztJQUVNLHlCQUF5QixDQUFDLEVBQVc7UUFDMUMsTUFBTSxLQUFLLEdBQWdCLEVBQUUsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDeEQsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxlQUFlLENBQUMsRUFBVztRQUNoQyxNQUFNLEtBQUssR0FBZ0IsRUFBRSxDQUFDLGFBQWEsQ0FDekMsa0NBQWtDLENBQ25DLENBQUM7UUFDRixLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDaEIsQ0FBQzs7d0hBeEVVLDJCQUEyQjs0SEFBM0IsMkJBQTJCOzJGQUEzQiwyQkFBMkI7a0JBRHZDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbGVtZW50UmVmLCBJbmplY3RhYmxlLCBPbkRlc3Ryb3ksIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU2t5TGliUmVzb3VyY2VzU2VydmljZSB9IGZyb20gJ0Bza3l1eC9pMThuJztcblxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG4vKipcbiAqIFNlcnZpY2UgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIERPTSBlbGVtZW50cyBvZiB0aGUgcGhvbmUgZmllbGQuXG4gKiBAaW50ZXJuYWxcbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFNreVBob25lRmllbGRBZGFwdGVyU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgbmdVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgcmVzb3VyY2VzU2VydmljZTogU2t5TGliUmVzb3VyY2VzU2VydmljZVxuICApIHt9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMubmdVbnN1YnNjcmliZS5uZXh0KCk7XG4gICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwdWJsaWMgYWRkRWxlbWVudENsYXNzKGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIGNsYXNzTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIGNsYXNzTmFtZSk7XG4gIH1cblxuICBwdWJsaWMgc2V0RWxlbWVudERpc2FibGVkU3RhdGUoXG4gICAgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBkaXNhYmxlZDogYm9vbGVhblxuICApOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2Rpc2FibGVkJywgZGlzYWJsZWQpO1xuICB9XG5cbiAgcHVibGljIHNldEVsZW1lbnRQbGFjZWhvbGRlcihcbiAgICBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHBsYWNlaG9sZGVyOiBzdHJpbmdcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoXG4gICAgICBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAncGxhY2Vob2xkZXInLFxuICAgICAgcGxhY2Vob2xkZXJcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHNldEVsZW1lbnRUeXBlKGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICd0eXBlJywgJ3RlbCcpO1xuICB9XG5cbiAgcHVibGljIHNldEVsZW1lbnRWYWx1ZShlbGVtZW50UmVmOiBFbGVtZW50UmVmLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3ZhbHVlJywgdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRBcmlhTGFiZWwoZWxlbWVudDogRWxlbWVudFJlZik6IHZvaWQge1xuICAgIC8qIFNhbml0eSBjaGVjayAqL1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKCFlbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJykpIHtcbiAgICAgIHRoaXMucmVzb3VyY2VzU2VydmljZVxuICAgICAgICAuZ2V0U3RyaW5nKCdza3l1eF9waG9uZV9maWVsZF9kZWZhdWx0X2xhYmVsJylcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAgIC5zdWJzY3JpYmUoKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShcbiAgICAgICAgICAgIGVsZW1lbnQubmF0aXZlRWxlbWVudCxcbiAgICAgICAgICAgICdhcmlhLWxhYmVsJyxcbiAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZvY3VzQ291bnRyeVNlYXJjaEVsZW1lbnQoZWw6IEVsZW1lbnQpOiB2b2lkIHtcbiAgICBjb25zdCBpbnB1dDogSFRNTEVsZW1lbnQgPSBlbC5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpO1xuICAgIGlucHV0LmZvY3VzKCk7XG4gIH1cblxuICBwdWJsaWMgZm9jdXNQaG9uZUlucHV0KGVsOiBFbGVtZW50KTogdm9pZCB7XG4gICAgY29uc3QgaW5wdXQ6IEhUTUxFbGVtZW50ID0gZWwucXVlcnlTZWxlY3RvcihcbiAgICAgICcuc2t5LXBob25lLWZpZWxkLWNvbnRhaW5lciBpbnB1dCdcbiAgICApO1xuICAgIGlucHV0LmZvY3VzKCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,280 @@
1
+ import { ChangeDetectorRef, Directive, ElementRef, HostListener, Input, Optional, forwardRef, } from '@angular/core';
2
+ import { NG_VALIDATORS, NG_VALUE_ACCESSOR, } from '@angular/forms';
3
+ import { PhoneNumberFormat, PhoneNumberUtil } from 'google-libphonenumber';
4
+ import { BehaviorSubject, Subject } from 'rxjs';
5
+ import { debounceTime, takeUntil } from 'rxjs/operators';
6
+ import { SkyPhoneFieldAdapterService } from './phone-field-adapter.service';
7
+ import { SkyPhoneFieldComponent } from './phone-field.component';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "./phone-field-adapter.service";
10
+ import * as i2 from "./phone-field.component";
11
+ // tslint:disable:no-forward-ref no-use-before-declare
12
+ const SKY_PHONE_FIELD_VALUE_ACCESSOR = {
13
+ provide: NG_VALUE_ACCESSOR,
14
+ useExisting: forwardRef(() => SkyPhoneFieldInputDirective),
15
+ multi: true,
16
+ };
17
+ const SKY_PHONE_FIELD_VALIDATOR = {
18
+ provide: NG_VALIDATORS,
19
+ useExisting: forwardRef(() => SkyPhoneFieldInputDirective),
20
+ multi: true,
21
+ };
22
+ // tslint:enable
23
+ /**
24
+ * Creates a button, search input, and text input for entering and validating
25
+ * international phone numbers. Place this attribute on an `input` element, and wrap
26
+ * that element in a `sky-phone-field` component. By default, the country selector
27
+ * button displays a flag icon for the default country, and the phone number input
28
+ * displays a sample of the correct phone number format. When users select the country
29
+ * selector button, they expose the country search input, which is
30
+ * [an autocomplete input](https://developer.blackbaud.com/skyux/components/autocomplete)
31
+ * that allows them to select different countries. When users enter `+` followed by an
32
+ * international dial code in the phone number input, the country automatically switches
33
+ * to the country associated with the dial code.
34
+ * @required
35
+ */
36
+ export class SkyPhoneFieldInputDirective {
37
+ constructor(changeDetector, elRef, adapterService, phoneFieldComponent) {
38
+ this.changeDetector = changeDetector;
39
+ this.elRef = elRef;
40
+ this.adapterService = adapterService;
41
+ this.phoneFieldComponent = phoneFieldComponent;
42
+ /**
43
+ * Indicates whether to prevent validation on the phone number input. For validation,
44
+ * phone numbers are driven through the `ngModel` attribute that you specify on an
45
+ * `input` element or on a `FormControl` in a reactive form. To prevent validation,
46
+ * set this property to `true`.
47
+ * @default false
48
+ */
49
+ this.skyPhoneFieldNoValidate = false;
50
+ this.ngUnsubscribe = new Subject();
51
+ this.phoneUtils = PhoneNumberUtil.getInstance();
52
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
53
+ this.onChange = (_) => { };
54
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
55
+ this.onTouched = () => { };
56
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
57
+ this.validatorChange = () => { };
58
+ }
59
+ /**
60
+ * Indicates whether to disable the phone field.
61
+ * @default false
62
+ */
63
+ set disabled(value) {
64
+ this.phoneFieldComponent.countrySelectDisabled = value;
65
+ this.adapterService.setElementDisabledState(this.elRef, value);
66
+ this._disabled = value;
67
+ }
68
+ get disabled() {
69
+ return this._disabled || false;
70
+ }
71
+ set modelValue(value) {
72
+ this._modelValue = value;
73
+ this.adapterService.setElementValue(this.elRef, value);
74
+ if (value) {
75
+ const formattedValue = this.formatNumber(value.toString());
76
+ this.onChange(formattedValue);
77
+ }
78
+ else {
79
+ this.onChange(value);
80
+ }
81
+ this.validatorChange();
82
+ }
83
+ get modelValue() {
84
+ return this._modelValue;
85
+ }
86
+ ngOnInit() {
87
+ if (!this.phoneFieldComponent) {
88
+ throw new Error('You must wrap the `skyPhoneFieldInput` directive within a ' +
89
+ '`<sky-phone-field>` component!');
90
+ }
91
+ this.adapterService.setElementType(this.elRef);
92
+ this.adapterService.addElementClass(this.elRef, 'sky-form-control');
93
+ if (this.phoneFieldComponent.selectedCountry) {
94
+ this.adapterService.setElementPlaceholder(this.elRef, this.phoneFieldComponent.selectedCountry.exampleNumber);
95
+ }
96
+ this.adapterService.setAriaLabel(this.elRef);
97
+ }
98
+ ngAfterViewInit() {
99
+ this.phoneFieldComponent.selectedCountryChange
100
+ .pipe(takeUntil(this.ngUnsubscribe))
101
+ .subscribe((country) => {
102
+ this.modelValue = this.elRef.nativeElement.value;
103
+ this.adapterService.setElementPlaceholder(this.elRef, country.exampleNumber);
104
+ });
105
+ // This is needed to address a bug in Angular 4, where the value is not changed on the view.
106
+ // See: https://github.com/angular/angular/issues/13792
107
+ /* istanbul ignore else */
108
+ if (this.control && this.modelValue) {
109
+ this.control.setValue(this.modelValue, { emitEvent: false });
110
+ this.changeDetector.detectChanges();
111
+ }
112
+ }
113
+ ngOnDestroy() {
114
+ this.ngUnsubscribe.next();
115
+ this.ngUnsubscribe.complete();
116
+ }
117
+ /**
118
+ * Writes the new value for reactive forms on change events on the input element
119
+ * @param event The change event that was received
120
+ */
121
+ onInputChange(event) {
122
+ if (!this.textChanges) {
123
+ this.setupTextChangeSubscription(event.target.value);
124
+ }
125
+ else {
126
+ this.textChanges.next(event.target.value);
127
+ }
128
+ }
129
+ /**
130
+ * Marks reactive form controls as touched on input blur events
131
+ */
132
+ onInputBlur() {
133
+ this.onTouched();
134
+ }
135
+ onInputTyping(event) {
136
+ if (!this.textChanges) {
137
+ this.setupTextChangeSubscription(event.target.value);
138
+ }
139
+ else {
140
+ this.textChanges.next(event.target.value);
141
+ }
142
+ }
143
+ /**
144
+ * Writes the new value for reactive forms
145
+ * @param value The new value for the input
146
+ */
147
+ writeValue(value) {
148
+ this.phoneFieldComponent.setCountryByDialCode(value);
149
+ this.modelValue = value;
150
+ }
151
+ registerOnChange(fn) {
152
+ this.onChange = fn;
153
+ }
154
+ registerOnTouched(fn) {
155
+ this.onTouched = fn;
156
+ }
157
+ registerOnValidatorChange(fn) {
158
+ this.validatorChange = fn;
159
+ }
160
+ /**
161
+ * Sets the disabled state on the input
162
+ * @param isDisabled the new value of the input's disabled state
163
+ */
164
+ setDisabledState(isDisabled) {
165
+ this.disabled = isDisabled;
166
+ }
167
+ /**
168
+ * Validate's the form control's current value
169
+ * @param control the form control for the input
170
+ */
171
+ validate(control) {
172
+ if (!this.control) {
173
+ this.control = control;
174
+ }
175
+ if (this.skyPhoneFieldNoValidate) {
176
+ return;
177
+ }
178
+ const value = control.value;
179
+ if (!value) {
180
+ return;
181
+ }
182
+ if (this.phoneFieldComponent.selectedCountry &&
183
+ !this.validateNumber(value)) {
184
+ if (!this.textChanges) {
185
+ // Mark the invalid control as touched so that the input's invalid CSS styles appear.
186
+ // (This is only required when the invalid value is set by the FormControl constructor.)
187
+ // We don't do this if the input is the active element so that we don't show validation
188
+ // errors unless it is invalid on initialization or the input has been blurred.
189
+ control.markAsTouched();
190
+ }
191
+ return {
192
+ skyPhoneField: {
193
+ invalid: value,
194
+ },
195
+ };
196
+ }
197
+ }
198
+ setupTextChangeSubscription(text) {
199
+ this.textChanges = new BehaviorSubject(text);
200
+ this.textChanges
201
+ .pipe(debounceTime(500), takeUntil(this.ngUnsubscribe))
202
+ .subscribe((newValue) => {
203
+ this.writeValue(newValue);
204
+ });
205
+ }
206
+ validateNumber(phoneNumber) {
207
+ try {
208
+ const numberObj = this.phoneUtils.parseAndKeepRawInput(phoneNumber, this.phoneFieldComponent.selectedCountry.iso2);
209
+ if (!this.phoneFieldComponent.allowExtensions &&
210
+ numberObj.getExtension()) {
211
+ return false;
212
+ }
213
+ return this.phoneUtils.isValidNumber(numberObj);
214
+ }
215
+ catch (e) {
216
+ return false;
217
+ }
218
+ }
219
+ /**
220
+ * Format's the given phone number based on the currently selected country.
221
+ * @param phoneNumber The number to format
222
+ */
223
+ formatNumber(phoneNumber) {
224
+ try {
225
+ const numberObj = this.phoneUtils.parseAndKeepRawInput(phoneNumber, this.phoneFieldComponent.selectedCountry.iso2);
226
+ if (this.phoneUtils.isPossibleNumber(numberObj)) {
227
+ switch (this.phoneFieldComponent.returnFormat) {
228
+ case 'international':
229
+ return this.phoneUtils.format(numberObj, PhoneNumberFormat.INTERNATIONAL);
230
+ case 'national':
231
+ return this.phoneUtils.format(numberObj, PhoneNumberFormat.NATIONAL);
232
+ case 'default':
233
+ default:
234
+ if (this.phoneFieldComponent.selectedCountry.iso2 !==
235
+ this.phoneFieldComponent.defaultCountry) {
236
+ return this.phoneUtils.format(numberObj, PhoneNumberFormat.INTERNATIONAL);
237
+ }
238
+ else {
239
+ return this.phoneUtils.format(numberObj, PhoneNumberFormat.NATIONAL);
240
+ }
241
+ }
242
+ }
243
+ else {
244
+ return phoneNumber;
245
+ }
246
+ }
247
+ catch (e) {
248
+ /* sanity check */
249
+ /* istanbul ignore next */
250
+ return phoneNumber;
251
+ }
252
+ }
253
+ }
254
+ SkyPhoneFieldInputDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPhoneFieldInputDirective, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i1.SkyPhoneFieldAdapterService, optional: true }, { token: i2.SkyPhoneFieldComponent, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
255
+ SkyPhoneFieldInputDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.2.7", type: SkyPhoneFieldInputDirective, selector: "[skyPhoneFieldInput]", inputs: { disabled: "disabled", skyPhoneFieldNoValidate: "skyPhoneFieldNoValidate" }, host: { listeners: { "change": "onInputChange($event)", "blur": "onInputBlur()", "input": "onInputTyping($event)" } }, providers: [SKY_PHONE_FIELD_VALUE_ACCESSOR, SKY_PHONE_FIELD_VALIDATOR], ngImport: i0 });
256
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPhoneFieldInputDirective, decorators: [{
257
+ type: Directive,
258
+ args: [{
259
+ selector: '[skyPhoneFieldInput]',
260
+ providers: [SKY_PHONE_FIELD_VALUE_ACCESSOR, SKY_PHONE_FIELD_VALIDATOR],
261
+ }]
262
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i1.SkyPhoneFieldAdapterService, decorators: [{
263
+ type: Optional
264
+ }] }, { type: i2.SkyPhoneFieldComponent, decorators: [{
265
+ type: Optional
266
+ }] }]; }, propDecorators: { disabled: [{
267
+ type: Input
268
+ }], skyPhoneFieldNoValidate: [{
269
+ type: Input
270
+ }], onInputChange: [{
271
+ type: HostListener,
272
+ args: ['change', ['$event']]
273
+ }], onInputBlur: [{
274
+ type: HostListener,
275
+ args: ['blur']
276
+ }], onInputTyping: [{
277
+ type: HostListener,
278
+ args: ['input', ['$event']]
279
+ }] } });
280
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhvbmUtZmllbGQtaW5wdXQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL3Bob25lLWZpZWxkL3NyYy9saWIvbW9kdWxlcy9waG9uZS1maWVsZC9waG9uZS1maWVsZC1pbnB1dC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBR0wsUUFBUSxFQUNSLFVBQVUsR0FDWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBR0wsYUFBYSxFQUNiLGlCQUFpQixHQUdsQixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRCxPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDOzs7O0FBR2pFLHNEQUFzRDtBQUN0RCxNQUFNLDhCQUE4QixHQUFHO0lBQ3JDLE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQztJQUMxRCxLQUFLLEVBQUUsSUFBSTtDQUNaLENBQUM7QUFFRixNQUFNLHlCQUF5QixHQUFHO0lBQ2hDLE9BQU8sRUFBRSxhQUFhO0lBQ3RCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsMkJBQTJCLENBQUM7SUFDMUQsS0FBSyxFQUFFLElBQUk7Q0FDWixDQUFDO0FB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QyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxzQkFBc0I7b0JBQ2hDLFNBQVMsRUFBRSxDQUFDLDhCQUE4QixFQUFFLHlCQUF5QixDQUFDO2lCQUN2RTs7MEJBK0RJLFFBQVE7OzBCQUNSLFFBQVE7NENBdkRBLFFBQVE7c0JBRGxCLEtBQUs7Z0JBbUJDLHVCQUF1QjtzQkFEN0IsS0FBSztnQkEyRkMsYUFBYTtzQkFEbkIsWUFBWTt1QkFBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBYTNCLFdBQVc7c0JBRGpCLFlBQVk7dUJBQUMsTUFBTTtnQkFNYixhQUFhO3NCQURuQixZQUFZO3VCQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgZm9yd2FyZFJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBOR19WQUxJREFUT1JTLFxuICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgVmFsaWRhdGlvbkVycm9ycyxcbiAgVmFsaWRhdG9yLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IFBob25lTnVtYmVyRm9ybWF0LCBQaG9uZU51bWJlclV0aWwgfSBmcm9tICdnb29nbGUtbGlicGhvbmVudW1iZXInO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgU2t5UGhvbmVGaWVsZEFkYXB0ZXJTZXJ2aWNlIH0gZnJvbSAnLi9waG9uZS1maWVsZC1hZGFwdGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2t5UGhvbmVGaWVsZENvbXBvbmVudCB9IGZyb20gJy4vcGhvbmUtZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IFNreVBob25lRmllbGRDb3VudHJ5IH0gZnJvbSAnLi90eXBlcy9jb3VudHJ5JztcblxuLy8gdHNsaW50OmRpc2FibGU6bm8tZm9yd2FyZC1yZWYgbm8tdXNlLWJlZm9yZS1kZWNsYXJlXG5jb25zdCBTS1lfUEhPTkVfRklFTERfVkFMVUVfQUNDRVNTT1IgPSB7XG4gIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBTa3lQaG9uZUZpZWxkSW5wdXREaXJlY3RpdmUpLFxuICBtdWx0aTogdHJ1ZSxcbn07XG5cbmNvbnN0IFNLWV9QSE9ORV9GSUVMRF9WQUxJREFUT1IgPSB7XG4gIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFNreVBob25lRmllbGRJbnB1dERpcmVjdGl2ZSksXG4gIG11bHRpOiB0cnVlLFxufTtcbi8vIHRzbGludDplbmFibGVcblxuLyoqXG4gKiBDcmVhdGVzIGEgYnV0dG9uLCBzZWFyY2ggaW5wdXQsIGFuZCB0ZXh0IGlucHV0IGZvciBlbnRlcmluZyBhbmQgdmFsaWRhdGluZ1xuICogaW50ZXJuYXRpb25hbCBwaG9uZSBudW1iZXJzLiBQbGFjZSB0aGlzIGF0dHJpYnV0ZSBvbiBhbiBgaW5wdXRgIGVsZW1lbnQsIGFuZCB3cmFwXG4gKiB0aGF0IGVsZW1lbnQgaW4gYSBgc2t5LXBob25lLWZpZWxkYCBjb21wb25lbnQuIEJ5IGRlZmF1bHQsIHRoZSBjb3VudHJ5IHNlbGVjdG9yXG4gKiBidXR0b24gZGlzcGxheXMgYSBmbGFnIGljb24gZm9yIHRoZSBkZWZhdWx0IGNvdW50cnksIGFuZCB0aGUgcGhvbmUgbnVtYmVyIGlucHV0XG4gKiBkaXNwbGF5cyBhIHNhbXBsZSBvZiB0aGUgY29ycmVjdCBwaG9uZSBudW1iZXIgZm9ybWF0LiBXaGVuIHVzZXJzIHNlbGVjdCB0aGUgY291bnRyeVxuICogc2VsZWN0b3IgYnV0dG9uLCB0aGV5IGV4cG9zZSB0aGUgY291bnRyeSBzZWFyY2ggaW5wdXQsIHdoaWNoIGlzXG4gKiBbYW4gYXV0b2NvbXBsZXRlIGlucHV0XShodHRwczovL2RldmVsb3Blci5ibGFja2JhdWQuY29tL3NreXV4L2NvbXBvbmVudHMvYXV0b2NvbXBsZXRlKVxuICogdGhhdCBhbGxvd3MgdGhlbSB0byBzZWxlY3QgZGlmZmVyZW50IGNvdW50cmllcy4gV2hlbiB1c2VycyBlbnRlciBgK2AgZm9sbG93ZWQgYnkgYW5cbiAqIGludGVybmF0aW9uYWwgZGlhbCBjb2RlIGluIHRoZSBwaG9uZSBudW1iZXIgaW5wdXQsIHRoZSBjb3VudHJ5IGF1dG9tYXRpY2FsbHkgc3dpdGNoZXNcbiAqIHRvIHRoZSBjb3VudHJ5IGFzc29jaWF0ZWQgd2l0aCB0aGUgZGlhbCBjb2RlLlxuICogQHJlcXVpcmVkXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tza3lQaG9uZUZpZWxkSW5wdXRdJyxcbiAgcHJvdmlkZXJzOiBbU0tZX1BIT05FX0ZJRUxEX1ZBTFVFX0FDQ0VTU09SLCBTS1lfUEhPTkVfRklFTERfVkFMSURBVE9SXSxcbn0pXG5leHBvcnQgY2xhc3MgU2t5UGhvbmVGaWVsZElucHV0RGlyZWN0aXZlXG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBWYWxpZGF0b3JcbntcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRvIGRpc2FibGUgdGhlIHBob25lIGZpZWxkLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMucGhvbmVGaWVsZENvbXBvbmVudC5jb3VudHJ5U2VsZWN0RGlzYWJsZWQgPSB2YWx1ZTtcbiAgICB0aGlzLmFkYXB0ZXJTZXJ2aWNlLnNldEVsZW1lbnREaXNhYmxlZFN0YXRlKHRoaXMuZWxSZWYsIHZhbHVlKTtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQgfHwgZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdG8gcHJldmVudCB2YWxpZGF0aW9uIG9uIHRoZSBwaG9uZSBudW1iZXIgaW5wdXQuIEZvciB2YWxpZGF0aW9uLFxuICAgKiBwaG9uZSBudW1iZXJzIGFyZSBkcml2ZW4gdGhyb3VnaCB0aGUgYG5nTW9kZWxgIGF0dHJpYnV0ZSB0aGF0IHlvdSBzcGVjaWZ5IG9uIGFuXG4gICAqIGBpbnB1dGAgZWxlbWVudCBvciBvbiBhIGBGb3JtQ29udHJvbGAgaW4gYSByZWFjdGl2ZSBmb3JtLiBUbyBwcmV2ZW50IHZhbGlkYXRpb24sXG4gICAqIHNldCB0aGlzIHByb3BlcnR5IHRvIGB0cnVlYC5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBza3lQaG9uZUZpZWxkTm9WYWxpZGF0ZSA9IGZhbHNlO1xuXG4gIHByaXZhdGUgc2V0IG1vZGVsVmFsdWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX21vZGVsVmFsdWUgPSB2YWx1ZTtcblxuICAgIHRoaXMuYWRhcHRlclNlcnZpY2Uuc2V0RWxlbWVudFZhbHVlKHRoaXMuZWxSZWYsIHZhbHVlKTtcblxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSB0aGlzLmZvcm1hdE51bWJlcih2YWx1ZS50b1N0cmluZygpKTtcblxuICAgICAgdGhpcy5vbkNoYW5nZShmb3JtYXR0ZWRWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25DaGFuZ2UodmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLnZhbGlkYXRvckNoYW5nZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgbW9kZWxWYWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9tb2RlbFZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBjb250cm9sOiBBYnN0cmFjdENvbnRyb2w7XG5cbiAgcHJpdmF0ZSB0ZXh0Q2hhbmdlczogQmVoYXZpb3JTdWJqZWN0PHN0cmluZz47XG5cbiAgcHJpdmF0ZSBuZ1Vuc3Vic2NyaWJlID0gbmV3IFN1YmplY3QoKTtcblxuICBwcml2YXRlIHBob25lVXRpbHMgPSBQaG9uZU51bWJlclV0aWwuZ2V0SW5zdGFuY2UoKTtcblxuICBwcml2YXRlIF9kaXNhYmxlZDogYm9vbGVhbjtcblxuICBwcml2YXRlIF9tb2RlbFZhbHVlOiBzdHJpbmc7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgZWxSZWY6IEVsZW1lbnRSZWYsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBhZGFwdGVyU2VydmljZTogU2t5UGhvbmVGaWVsZEFkYXB0ZXJTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgcGhvbmVGaWVsZENvbXBvbmVudDogU2t5UGhvbmVGaWVsZENvbXBvbmVudFxuICApIHt9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5waG9uZUZpZWxkQ29tcG9uZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdZb3UgbXVzdCB3cmFwIHRoZSBgc2t5UGhvbmVGaWVsZElucHV0YCBkaXJlY3RpdmUgd2l0aGluIGEgJyArXG4gICAgICAgICAgJ2A8c2t5LXBob25lLWZpZWxkPmAgY29tcG9uZW50ISdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5hZGFwdGVyU2VydmljZS5zZXRFbGVtZW50VHlwZSh0aGlzLmVsUmVmKTtcbiAgICB0aGlzLmFkYXB0ZXJTZXJ2aWNlLmFkZEVsZW1lbnRDbGFzcyh0aGlzLmVsUmVmLCAnc2t5LWZvcm0tY29udHJvbCcpO1xuICAgIGlmICh0aGlzLnBob25lRmllbGRDb21wb25lbnQuc2VsZWN0ZWRDb3VudHJ5KSB7XG4gICAgICB0aGlzLmFkYXB0ZXJTZXJ2aWNlLnNldEVsZW1lbnRQbGFjZWhvbGRlcihcbiAgICAgICAgdGhpcy5lbFJlZixcbiAgICAgICAgdGhpcy5waG9uZUZpZWxkQ29tcG9uZW50LnNlbGVjdGVkQ291bnRyeS5leGFtcGxlTnVtYmVyXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuYWRhcHRlclNlcnZpY2Uuc2V0QXJpYUxhYmVsKHRoaXMuZWxSZWYpO1xuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnBob25lRmllbGRDb21wb25lbnQuc2VsZWN0ZWRDb3VudHJ5Q2hhbmdlXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgIC5zdWJzY3JpYmUoKGNvdW50cnk6IFNreVBob25lRmllbGRDb3VudHJ5KSA9PiB7XG4gICAgICAgIHRoaXMubW9kZWxWYWx1ZSA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC52YWx1ZTtcbiAgICAgICAgdGhpcy5hZGFwdGVyU2VydmljZS5zZXRFbGVtZW50UGxhY2Vob2xkZXIoXG4gICAgICAgICAgdGhpcy5lbFJlZixcbiAgICAgICAgICBjb3VudHJ5LmV4YW1wbGVOdW1iZXJcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gYWRkcmVzcyBhIGJ1ZyBpbiBBbmd1bGFyIDQsIHdoZXJlIHRoZSB2YWx1ZSBpcyBub3QgY2hhbmdlZCBvbiB0aGUgdmlldy5cbiAgICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzEzNzkyXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodGhpcy5jb250cm9sICYmIHRoaXMubW9kZWxWYWx1ZSkge1xuICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKHRoaXMubW9kZWxWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMubmdVbnN1YnNjcmliZS5uZXh0KCk7XG4gICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIHRoZSBuZXcgdmFsdWUgZm9yIHJlYWN0aXZlIGZvcm1zIG9uIGNoYW5nZSBldmVudHMgb24gdGhlIGlucHV0IGVsZW1lbnRcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBjaGFuZ2UgZXZlbnQgdGhhdCB3YXMgcmVjZWl2ZWRcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ2NoYW5nZScsIFsnJGV2ZW50J10pXG4gIHB1YmxpYyBvbklucHV0Q2hhbmdlKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudGV4dENoYW5nZXMpIHtcbiAgICAgIHRoaXMuc2V0dXBUZXh0Q2hhbmdlU3Vic2NyaXB0aW9uKGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGV4dENoYW5nZXMubmV4dChldmVudC50YXJnZXQudmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNYXJrcyByZWFjdGl2ZSBmb3JtIGNvbnRyb2xzIGFzIHRvdWNoZWQgb24gaW5wdXQgYmx1ciBldmVudHNcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ2JsdXInKVxuICBwdWJsaWMgb25JbnB1dEJsdXIoKTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2lucHV0JywgWyckZXZlbnQnXSlcbiAgcHVibGljIG9uSW5wdXRUeXBpbmcoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGlmICghdGhpcy50ZXh0Q2hhbmdlcykge1xuICAgICAgdGhpcy5zZXR1cFRleHRDaGFuZ2VTdWJzY3JpcHRpb24oZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50ZXh0Q2hhbmdlcy5uZXh0KGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyB0aGUgbmV3IHZhbHVlIGZvciByZWFjdGl2ZSBmb3Jtc1xuICAgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIGlucHV0XG4gICAqL1xuICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5waG9uZUZpZWxkQ29tcG9uZW50LnNldENvdW50cnlCeURpYWxDb2RlKHZhbHVlKTtcblxuICAgIHRoaXMubW9kZWxWYWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogYW55KSA9PiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZShmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMudmFsaWRhdG9yQ2hhbmdlID0gZm47XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZGlzYWJsZWQgc3RhdGUgb24gdGhlIGlucHV0XG4gICAqIEBwYXJhbSBpc0Rpc2FibGVkIHRoZSBuZXcgdmFsdWUgb2YgdGhlIGlucHV0J3MgZGlzYWJsZWQgc3RhdGVcbiAgICovXG4gIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSdzIHRoZSBmb3JtIGNvbnRyb2wncyBjdXJyZW50IHZhbHVlXG4gICAqIEBwYXJhbSBjb250cm9sIHRoZSBmb3JtIGNvbnRyb2wgZm9yIHRoZSBpbnB1dFxuICAgKi9cbiAgcHVibGljIHZhbGlkYXRlKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMge1xuICAgIGlmICghdGhpcy5jb250cm9sKSB7XG4gICAgICB0aGlzLmNvbnRyb2wgPSBjb250cm9sO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNreVBob25lRmllbGROb1ZhbGlkYXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBjb250cm9sLnZhbHVlO1xuXG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHRoaXMucGhvbmVGaWVsZENvbXBvbmVudC5zZWxlY3RlZENvdW50cnkgJiZcbiAgICAgICF0aGlzLnZhbGlkYXRlTnVtYmVyKHZhbHVlKVxuICAgICkge1xuICAgICAgaWYgKCF0aGlzLnRleHRDaGFuZ2VzKSB7XG4gICAgICAgIC8vIE1hcmsgdGhlIGludmFsaWQgY29udHJvbCBhcyB0b3VjaGVkIHNvIHRoYXQgdGhlIGlucHV0J3MgaW52YWxpZCBDU1Mgc3R5bGVzIGFwcGVhci5cbiAgICAgICAgLy8gKFRoaXMgaXMgb25seSByZXF1aXJlZCB3aGVuIHRoZSBpbnZhbGlkIHZhbHVlIGlzIHNldCBieSB0aGUgRm9ybUNvbnRyb2wgY29uc3RydWN0b3IuKVxuICAgICAgICAvLyBXZSBkb24ndCBkbyB0aGlzIGlmIHRoZSBpbnB1dCBpcyB0aGUgYWN0aXZlIGVsZW1lbnQgc28gdGhhdCB3ZSBkb24ndCBzaG93IHZhbGlkYXRpb25cbiAgICAgICAgLy8gZXJyb3JzIHVubGVzcyBpdCBpcyBpbnZhbGlkIG9uIGluaXRpYWxpemF0aW9uIG9yIHRoZSBpbnB1dCBoYXMgYmVlbiBibHVycmVkLlxuICAgICAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2t5UGhvbmVGaWVsZDoge1xuICAgICAgICAgIGludmFsaWQ6IHZhbHVlLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldHVwVGV4dENoYW5nZVN1YnNjcmlwdGlvbih0ZXh0OiBzdHJpbmcpIHtcbiAgICB0aGlzLnRleHRDaGFuZ2VzID0gbmV3IEJlaGF2aW9yU3ViamVjdCh0ZXh0KTtcblxuICAgIHRoaXMudGV4dENoYW5nZXNcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSg1MDApLCB0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgIC5zdWJzY3JpYmUoKG5ld1ZhbHVlKSA9PiB7XG4gICAgICAgIHRoaXMud3JpdGVWYWx1ZShuZXdWYWx1ZSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVOdW1iZXIocGhvbmVOdW1iZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBudW1iZXJPYmogPSB0aGlzLnBob25lVXRpbHMucGFyc2VBbmRLZWVwUmF3SW5wdXQoXG4gICAgICAgIHBob25lTnVtYmVyLFxuICAgICAgICB0aGlzLnBob25lRmllbGRDb21wb25lbnQuc2VsZWN0ZWRDb3VudHJ5LmlzbzJcbiAgICAgICk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgIXRoaXMucGhvbmVGaWVsZENvbXBvbmVudC5hbGxvd0V4dGVuc2lvbnMgJiZcbiAgICAgICAgbnVtYmVyT2JqLmdldEV4dGVuc2lvbigpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5waG9uZVV0aWxzLmlzVmFsaWROdW1iZXIobnVtYmVyT2JqKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCdzIHRoZSBnaXZlbiBwaG9uZSBudW1iZXIgYmFzZWQgb24gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBjb3VudHJ5LlxuICAgKiBAcGFyYW0gcGhvbmVOdW1iZXIgVGhlIG51bWJlciB0byBmb3JtYXRcbiAgICovXG4gIHByaXZhdGUgZm9ybWF0TnVtYmVyKHBob25lTnVtYmVyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBudW1iZXJPYmogPSB0aGlzLnBob25lVXRpbHMucGFyc2VBbmRLZWVwUmF3SW5wdXQoXG4gICAgICAgIHBob25lTnVtYmVyLFxuICAgICAgICB0aGlzLnBob25lRmllbGRDb21wb25lbnQuc2VsZWN0ZWRDb3VudHJ5LmlzbzJcbiAgICAgICk7XG4gICAgICBpZiAodGhpcy5waG9uZVV0aWxzLmlzUG9zc2libGVOdW1iZXIobnVtYmVyT2JqKSkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMucGhvbmVGaWVsZENvbXBvbmVudC5yZXR1cm5Gb3JtYXQpIHtcbiAgICAgICAgICBjYXNlICdpbnRlcm5hdGlvbmFsJzpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBob25lVXRpbHMuZm9ybWF0KFxuICAgICAgICAgICAgICBudW1iZXJPYmosXG4gICAgICAgICAgICAgIFBob25lTnVtYmVyRm9ybWF0LklOVEVSTkFUSU9OQUxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgY2FzZSAnbmF0aW9uYWwnOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGhvbmVVdGlscy5mb3JtYXQoXG4gICAgICAgICAgICAgIG51bWJlck9iaixcbiAgICAgICAgICAgICAgUGhvbmVOdW1iZXJGb3JtYXQuTkFUSU9OQUxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgY2FzZSAnZGVmYXVsdCc6XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgdGhpcy5waG9uZUZpZWxkQ29tcG9uZW50LnNlbGVjdGVkQ291bnRyeS5pc28yICE9PVxuICAgICAgICAgICAgICB0aGlzLnBob25lRmllbGRDb21wb25lbnQuZGVmYXVsdENvdW50cnlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5waG9uZVV0aWxzLmZvcm1hdChcbiAgICAgICAgICAgICAgICBudW1iZXJPYmosXG4gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJGb3JtYXQuSU5URVJOQVRJT05BTFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGhvbmVVdGlscy5mb3JtYXQoXG4gICAgICAgICAgICAgICAgbnVtYmVyT2JqLFxuICAgICAgICAgICAgICAgIFBob25lTnVtYmVyRm9ybWF0Lk5BVElPTkFMXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBwaG9uZU51bWJlcjtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvKiBzYW5pdHkgY2hlY2sgKi9cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICByZXR1cm4gcGhvbmVOdW1iZXI7XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICBwcml2YXRlIG9uQ2hhbmdlID0gKF86IGFueSkgPT4ge307XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICBwcml2YXRlIG9uVG91Y2hlZCA9ICgpID0+IHt9O1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgcHJpdmF0ZSB2YWxpZGF0b3JDaGFuZ2UgPSAoKSA9PiB7fTtcbn1cbiJdfQ==