UNPKG

validator-pk

Version:

A lightweight library for validating and formatting Pakistani phone numbers and CNIC.

123 lines 12.3 kB
import { Component, EventEmitter, forwardRef, Input, Output } from '@angular/core'; import { formatCNIC, formatPhoneNumber, validateCNIC, validatePhoneNumber } from './validator-pk.service'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; export class ValidatorPKComponent { constructor() { this.validChange = new EventEmitter(); this.errorMessage = ''; this.class = ''; this.placeholder = 'Enter a phone number'; this.autoFormat = false; this.type = 'phone'; this.isValid = false; this.phoneNumber = ''; this.showError = false; this.onChange = () => { }; this.onTouched = () => { }; } get valid() { return this.isValid; } // Prevent external modification of `valid` set valid(value) { console.warn('valid is read-only and cannot be set externally.'); } onInputChange(event) { const inputElement = event.target; let value = inputElement?.value || ''; this.phoneNumber = value; if (this.type === 'phone') { const validation = validatePhoneNumber(this.phoneNumber); this.isValid = validation.isValid; if (this.isValid && this.autoFormat) { this.phoneNumber = formatPhoneNumber(this.phoneNumber); value = this.phoneNumber; } } else if (this.type === 'cnic') { const validation = validateCNIC(this.phoneNumber); this.isValid = validation.isValid; if (this.isValid && this.autoFormat) { this.phoneNumber = formatCNIC(this.phoneNumber); value = this.phoneNumber; } } this.onChange(value); this.validChange.emit(this.isValid); this.showError = !this.isValid; } writeValue(value) { this.phoneNumber = value || ''; } registerOnChange(fn) { this.onChange = fn; } registerOnTouched(fn) { this.onTouched = fn; } } ValidatorPKComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ValidatorPKComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); ValidatorPKComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ValidatorPKComponent, selector: "lib-validatorPK", inputs: { errorMessage: "errorMessage", class: "class", placeholder: "placeholder", autoFormat: "autoFormat", type: "type", valid: "valid" }, outputs: { validChange: "validChange" }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ValidatorPKComponent), multi: true, }, ], ngImport: i0, template: ` <ng-container> <input id="phone" type="text" [class]="class" [ngClass]="{ 'is-invalid': showError }" [value]="phoneNumber" (input)="onInputChange($event)" [placeholder]="placeholder" /> <p *ngIf="errorMessage && showError" style="color: red;">{{ errorMessage }}</p> </ng-container> `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ValidatorPKComponent, decorators: [{ type: Component, args: [{ selector: 'lib-validatorPK', template: ` <ng-container> <input id="phone" type="text" [class]="class" [ngClass]="{ 'is-invalid': showError }" [value]="phoneNumber" (input)="onInputChange($event)" [placeholder]="placeholder" /> <p *ngIf="errorMessage && showError" style="color: red;">{{ errorMessage }}</p> </ng-container> `, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ValidatorPKComponent), multi: true, }, ] }] }], propDecorators: { validChange: [{ type: Output }], errorMessage: [{ type: Input }], class: [{ type: Input }], placeholder: [{ type: Input }], autoFormat: [{ type: Input }], type: [{ type: Input }], valid: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9yLXBrLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbGlkYXRvci1way9zcmMvbGliL3ZhbGlkYXRvci1way5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkYsT0FBTyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBNkJuRCxNQUFNLE9BQU8sb0JBQW9CO0lBM0JqQztRQTRCWSxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFDM0MsaUJBQVksR0FBVyxFQUFFLENBQUM7UUFDMUIsVUFBSyxHQUFXLEVBQUUsQ0FBQztRQUNuQixnQkFBVyxHQUFXLHNCQUFzQixDQUFDO1FBQzdDLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFDNUIsU0FBSSxHQUFxQixPQUFPLENBQUM7UUFFbEMsWUFBTyxHQUFZLEtBQUssQ0FBQztRQVlqQyxnQkFBVyxHQUFXLEVBQUUsQ0FBQztRQUN6QixjQUFTLEdBQVksS0FBSyxDQUFDO1FBRW5CLGFBQVEsR0FBNEIsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO1FBQzdDLGNBQVMsR0FBZSxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7S0F5QzFDO0lBdkRDLElBQ0ksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQsMkNBQTJDO0lBQzNDLElBQUksS0FBSyxDQUFDLEtBQWM7UUFDdEIsT0FBTyxDQUFDLElBQUksQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFRRCxhQUFhLENBQUMsS0FBWTtRQUN4QixNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsTUFBMEIsQ0FBQztRQUN0RCxJQUFJLEtBQUssR0FBRyxZQUFZLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUV6QixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFO1lBQ3pCLE1BQU0sVUFBVSxHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN6RCxJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUM7WUFFbEMsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ25DLElBQUksQ0FBQyxXQUFXLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUN2RCxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQzthQUMxQjtTQUNGO2FBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRTtZQUMvQixNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2xELElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQztZQUNsQyxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDbkMsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNoRCxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQzthQUMxQjtTQUNGO1FBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDakMsQ0FBQztJQUVELFVBQVUsQ0FBQyxLQUFhO1FBQ3RCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsRUFBTztRQUN0QixJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsaUJBQWlCLENBQUMsRUFBTztRQUN2QixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUN0QixDQUFDOztrSEEvRFUsb0JBQW9CO3NHQUFwQixvQkFBb0IsaU9BUnBCO1FBQ1Q7WUFDRSxPQUFPLEVBQUUsaUJBQWlCO1lBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsb0JBQW9CLENBQUM7WUFDbkQsS0FBSyxFQUFFLElBQUk7U0FDWjtLQUNGLDBCQXZCUzs7Ozs7Ozs7Ozs7Ozs7O0dBZVQ7NEZBVVUsb0JBQW9CO2tCQTNCaEMsU0FBUzsrQkFDRSxpQkFBaUIsWUFDakI7Ozs7Ozs7Ozs7Ozs7OztHQWVULGFBRVU7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUscUJBQXFCLENBQUM7NEJBQ25ELEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUNGOzhCQUdTLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0UsWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFLRixLQUFLO3NCQURSLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgZm9yd2FyZFJlZiwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBmb3JtYXRDTklDLCBmb3JtYXRQaG9uZU51bWJlciwgdmFsaWRhdGVDTklDLCB2YWxpZGF0ZVBob25lTnVtYmVyIH0gZnJvbSAnLi92YWxpZGF0b3ItcGsuc2VydmljZSc7XHJcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItdmFsaWRhdG9yUEsnLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICA8aW5wdXRcclxuICAgICAgICBpZD1cInBob25lXCJcclxuICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgW2NsYXNzXT1cImNsYXNzXCJcclxuICAgICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAnaXMtaW52YWxpZCc6IHNob3dFcnJvclxyXG4gICAgICAgIH1cIlxyXG4gICAgICAgIFt2YWx1ZV09XCJwaG9uZU51bWJlclwiXHJcbiAgICAgICAgKGlucHV0KT1cIm9uSW5wdXRDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcclxuICAgICAgLz5cclxuICAgICAgPHAgKm5nSWY9XCJlcnJvck1lc3NhZ2UgJiYgc2hvd0Vycm9yXCIgc3R5bGU9XCJjb2xvcjogcmVkO1wiPnt7IGVycm9yTWVzc2FnZSB9fTwvcD5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIGAsXHJcbiAgc3R5bGVzOiBbXSxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFZhbGlkYXRvclBLQ29tcG9uZW50KSxcclxuICAgICAgbXVsdGk6IHRydWUsXHJcbiAgICB9LFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBWYWxpZGF0b3JQS0NvbXBvbmVudCB7XHJcbiAgQE91dHB1dCgpIHZhbGlkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xyXG4gIEBJbnB1dCgpIGVycm9yTWVzc2FnZTogc3RyaW5nID0gJyc7XHJcbiAgQElucHV0KCkgY2xhc3M6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnRW50ZXIgYSBwaG9uZSBudW1iZXInO1xyXG4gIEBJbnB1dCgpIGF1dG9Gb3JtYXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSB0eXBlOiAncGhvbmUnIHwgJ2NuaWMnID0gJ3Bob25lJztcclxuXHJcbiAgcHJpdmF0ZSBpc1ZhbGlkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgZ2V0IHZhbGlkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZDtcclxuICB9XHJcblxyXG4gIC8vIFByZXZlbnQgZXh0ZXJuYWwgbW9kaWZpY2F0aW9uIG9mIGB2YWxpZGBcclxuICBzZXQgdmFsaWQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIGNvbnNvbGUud2FybigndmFsaWQgaXMgcmVhZC1vbmx5IGFuZCBjYW5ub3QgYmUgc2V0IGV4dGVybmFsbHkuJyk7XHJcbiAgfVxyXG5cclxuICBwaG9uZU51bWJlcjogc3RyaW5nID0gJyc7XHJcbiAgc2hvd0Vycm9yOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgb25DaGFuZ2U6ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkID0gKCkgPT4ge307XHJcbiAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcclxuXHJcbiAgb25JbnB1dENoYW5nZShldmVudDogRXZlbnQpIHtcclxuICAgIGNvbnN0IGlucHV0RWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgbGV0IHZhbHVlID0gaW5wdXRFbGVtZW50Py52YWx1ZSB8fCAnJztcclxuICAgIHRoaXMucGhvbmVOdW1iZXIgPSB2YWx1ZTtcclxuXHJcbiAgICBpZiAodGhpcy50eXBlID09PSAncGhvbmUnKSB7XHJcbiAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSB2YWxpZGF0ZVBob25lTnVtYmVyKHRoaXMucGhvbmVOdW1iZXIpO1xyXG4gICAgICB0aGlzLmlzVmFsaWQgPSB2YWxpZGF0aW9uLmlzVmFsaWQ7XHJcblxyXG4gICAgICBpZiAodGhpcy5pc1ZhbGlkICYmIHRoaXMuYXV0b0Zvcm1hdCkge1xyXG4gICAgICAgIHRoaXMucGhvbmVOdW1iZXIgPSBmb3JtYXRQaG9uZU51bWJlcih0aGlzLnBob25lTnVtYmVyKTtcclxuICAgICAgICB2YWx1ZSA9IHRoaXMucGhvbmVOdW1iZXI7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAodGhpcy50eXBlID09PSAnY25pYycpIHtcclxuICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IHZhbGlkYXRlQ05JQyh0aGlzLnBob25lTnVtYmVyKTtcclxuICAgICAgdGhpcy5pc1ZhbGlkID0gdmFsaWRhdGlvbi5pc1ZhbGlkO1xyXG4gICAgICBpZiAodGhpcy5pc1ZhbGlkICYmIHRoaXMuYXV0b0Zvcm1hdCkge1xyXG4gICAgICAgIHRoaXMucGhvbmVOdW1iZXIgPSBmb3JtYXRDTklDKHRoaXMucGhvbmVOdW1iZXIpO1xyXG4gICAgICAgIHZhbHVlID0gdGhpcy5waG9uZU51bWJlcjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMub25DaGFuZ2UodmFsdWUpO1xyXG4gICAgdGhpcy52YWxpZENoYW5nZS5lbWl0KHRoaXMuaXNWYWxpZCk7XHJcbiAgICB0aGlzLnNob3dFcnJvciA9ICF0aGlzLmlzVmFsaWQ7XHJcbiAgfVxyXG5cclxuICB3cml0ZVZhbHVlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMucGhvbmVOdW1iZXIgPSB2YWx1ZSB8fCAnJztcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcclxuICB9XHJcblxyXG59XHJcbiJdfQ==