UNPKG

@mdfrough/cnic-validator

Version:

An Angular library to validate and format Pakistani CNIC numbers with masking and pipe support.

1 lines 8.78 kB
{"version":3,"file":"cnic-validator.mjs","sources":["../../../projects/cnic-validator/src/lib/cnic-validator.directive.ts","../../../projects/cnic-validator/src/lib/cnic-mask.directive.ts","../../../projects/cnic-validator/src/lib/cnic.pipe.ts","../../../projects/cnic-validator/src/lib/cnic-validator.module.ts","../../../projects/cnic-validator/src/lib/cnic.utils.ts","../../../projects/cnic-validator/src/lib/cnic-validator.function.ts","../../../projects/cnic-validator/src/cnic-validator.ts"],"sourcesContent":["import { Directive } from '@angular/core';\r\nimport { AbstractControl, NG_VALIDATORS, ValidationErrors, Validator } from '@angular/forms';\r\n\r\n@Directive({\r\n selector: '[cnicValidator]',\r\n standalone: true,\r\n providers: [{\r\n provide: NG_VALIDATORS,\r\n useExisting: CnicValidatorDirective,\r\n multi: true\r\n }]\r\n})\r\nexport class CnicValidatorDirective implements Validator {\r\n validate(control: AbstractControl): ValidationErrors | null {\r\n const value = control.value;\r\n if (!value || /^(\\d{5}-\\d{7}-\\d{1}|\\d{13})$/.test(value)) {\r\n return null;\r\n }\r\n return { invalidCnic: true };\r\n }\r\n}\r\n","import { Directive, HostListener, ElementRef } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[cnicMask]',\r\n standalone: true\r\n})\r\nexport class CnicMaskDirective {\r\n constructor(private el: ElementRef<HTMLInputElement>) { }\r\n\r\n @HostListener('input', ['$event']) onInput(event: Event): void {\r\n const input = this.el.nativeElement;\r\n let digits = input.value.replace(/\\D/g, '');\r\n\r\n if (digits.length > 13) digits = digits.slice(0, 13);\r\n\r\n let formatted = digits;\r\n if (digits.length >= 6 && digits.length <= 12)\r\n formatted = digits.replace(/^(\\d{5})(\\d+)/, '$1-$2');\r\n if (digits.length === 13)\r\n formatted = digits.replace(/^(\\d{5})(\\d{7})(\\d{1})$/, '$1-$2-$3');\r\n\r\n input.value = formatted;\r\n\r\n // Dispatch input event so Angular form updates\r\n input.dispatchEvent(new Event('input', { bubbles: true }));\r\n }\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'cnic',\r\n standalone: true\r\n})\r\nexport class CnicPipe implements PipeTransform {\r\n transform(value: string): string {\r\n if (!value) return '';\r\n\r\n // remove all non-digits\r\n const cleaned = value.replace(/\\D/g, '').slice(0, 13); // ✅ only keep first 13 digits\r\n\r\n if (cleaned.length < 13) return cleaned;\r\n\r\n return `${cleaned.slice(0, 5)}-${cleaned.slice(5, 12)}-${cleaned.slice(12)}`;\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { CnicValidatorDirective } from './cnic-validator.directive';\r\nimport { CnicMaskDirective } from './cnic-mask.directive';\r\nimport { CnicPipe } from './cnic.pipe';\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [\r\n CnicValidatorDirective,\r\n CnicMaskDirective,\r\n CnicPipe\r\n ],\r\n exports: [\r\n CnicValidatorDirective,\r\n CnicMaskDirective,\r\n CnicPipe\r\n ]\r\n})\r\nexport class CnicValidatorModule { }\r\n","export function isValidCnic(value: string): boolean {\r\n return /^(\\d{5}-\\d{7}-\\d{1}|\\d{13})$/.test(value);\r\n}\r\n\r\n\r\n\r\nexport interface ParsedCnic {\r\n regionCode: string;\r\n serial: string;\r\n gender: 'Male' | 'Female' | 'Unknown';\r\n}\r\n\r\nexport function parseCnic(cnic: string): ParsedCnic | null {\r\n const cleaned = cnic.replace(/\\D/g, '');\r\n if (cleaned.length !== 13) return null;\r\n const regionCode = cleaned.slice(0, 5);\r\n const serial = cleaned.slice(5, 12);\r\n const lastDigit = parseInt(cleaned.slice(12), 10);\r\n const gender = isNaN(lastDigit)\r\n ? 'Unknown'\r\n : lastDigit % 2 === 0\r\n ? 'Female'\r\n : 'Male';\r\n // ...gender+serial logic\r\n return { regionCode, serial, gender };\r\n}\r\n","// cnic-validator-function.ts\r\nimport { AbstractControl, ValidationErrors } from '@angular/forms';\r\n\r\nexport function cnicValidatorFn(control: AbstractControl): ValidationErrors | null {\r\n const value = control.value;\r\n const cnicRegex = /^(\\d{5}-\\d{7}-\\d{1}|\\d{13})$/;\r\n\r\n if (!value || cnicRegex.test(value)) {\r\n return null;\r\n }\r\n\r\n return { invalidCnic: true };\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}