lanka-kit 0.0.0-stage → 1.1.0

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.
package/lib/types.d.ts ADDED
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Types and interfaces for Sri Lankan Identity & Verification Toolkit (lanka-id)
3
+ */
4
+ export type NicFormat = 'OLD' | 'NEW';
5
+ export type Gender = 'Male' | 'Female';
6
+ export interface NicValidationSuccess {
7
+ isValid: true;
8
+ nic: string;
9
+ format: NicFormat;
10
+ year: number;
11
+ dayOfYear: number;
12
+ gender: Gender;
13
+ dateOfBirth: Date;
14
+ dateOfBirthFormatted: string;
15
+ age: number;
16
+ isVoter: boolean;
17
+ serialNumber: string;
18
+ checkDigit: string;
19
+ equivalentNic: string | null;
20
+ meta: {
21
+ isLeapYearRegistered: boolean;
22
+ dayOfYearRaw: number;
23
+ };
24
+ }
25
+ export interface NicValidationError {
26
+ isValid: false;
27
+ nic: string;
28
+ error: string;
29
+ code: 'EMPTY_INPUT' | 'INVALID_LENGTH' | 'INVALID_CHARACTERS' | 'INVALID_DAY_OF_YEAR' | 'FUTURE_BIRTH_DATE' | 'INVALID_FORMAT';
30
+ }
31
+ export type NicResult = NicValidationSuccess | NicValidationError;
32
+ export type TelcoCarrier = 'Dialog' | 'Mobitel' | 'Hutch' | 'Airtel' | 'SLT' | 'Unknown';
33
+ export type PhoneType = 'Mobile' | 'Fixed' | 'TollFree' | 'Unknown';
34
+ export interface PhoneValidationSuccess {
35
+ isValid: true;
36
+ raw: string;
37
+ clean: string;
38
+ e164: string;
39
+ national: string;
40
+ international: string;
41
+ prefix: string;
42
+ carrier: TelcoCarrier;
43
+ type: PhoneType;
44
+ }
45
+ export interface PhoneValidationError {
46
+ isValid: false;
47
+ raw: string;
48
+ error: string;
49
+ code: 'EMPTY_INPUT' | 'INVALID_CHARACTERS' | 'INVALID_LENGTH' | 'UNKNOWN_PREFIX';
50
+ }
51
+ export type PhoneResult = PhoneValidationSuccess | PhoneValidationError;
52
+ export interface DistrictInfo {
53
+ name: string;
54
+ code: string;
55
+ province: string;
56
+ postalCodeRange?: [number, number];
57
+ }
58
+ export interface PostalLocation {
59
+ postalCode: string;
60
+ city: string;
61
+ district: string;
62
+ province: string;
63
+ }
64
+ export interface LankaQrInfo {
65
+ isValid: boolean;
66
+ rawPayload: string;
67
+ formatIndicator?: string;
68
+ pointOfInitiation?: 'Static' | 'Dynamic';
69
+ merchantAccountInfo?: Record<string, string>;
70
+ merchantCategoryCode?: string;
71
+ transactionCurrency?: string;
72
+ transactionCurrencyCode?: string;
73
+ transactionAmount?: number;
74
+ countryCode?: string;
75
+ merchantName?: string;
76
+ merchantCity?: string;
77
+ postalCode?: string;
78
+ additionalData?: Record<string, string>;
79
+ crcValid?: boolean;
80
+ error?: string;
81
+ }
package/lib/types.js ADDED
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Types and interfaces for Sri Lankan Identity & Verification Toolkit (lanka-id)
3
+ */
4
+ export {};
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Unicode normalization and search sanitization for Sinhala and Tamil text.
3
+ */
4
+ /**
5
+ * Normalizes Sinhala Unicode text:
6
+ * - Fixes redundant/duplicate ZWJs (\u200D)
7
+ * - Removes phantom Zero Width Spaces (\u200B)
8
+ * - Standardizes multi-character vowel signs into their canonical unified Unicode representations
9
+ *
10
+ * Example: cleans text before saving to database to ensure consistency.
11
+ */
12
+ export declare function normalizeSinhala(text: string): string;
13
+ /**
14
+ * Strips all Zero Width Joiners (\u200D), ZWNJs (\u200C), and invisible characters.
15
+ * Use this to produce a stripped search index so that queries like 'ප්ර' match 'ප්‍ර'.
16
+ */
17
+ export declare function stripZwj(text: string): string;
18
+ /**
19
+ * Checks whether a given string contains Sinhala Unicode characters.
20
+ */
21
+ export declare function containsSinhala(text: string): boolean;
22
+ /**
23
+ * Checks whether a given string contains Tamil Unicode characters.
24
+ */
25
+ export declare function containsTamil(text: string): boolean;
26
+ /**
27
+ * Prepares search queries by normalizing whitespace and invisibles for reliable text lookup.
28
+ */
29
+ export declare function sanitizeSearchQuery(query: string): string;
package/lib/unicode.js ADDED
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Unicode normalization and search sanitization for Sinhala and Tamil text.
3
+ */
4
+ // Sinhala Unicode range: \u0D80 - \u0DFF
5
+ // Tamil Unicode range: \u0B80 - \u0BFF
6
+ const ZWJ = '\u200D'; // Zero Width Joiner
7
+ const ZWNJ = '\u200C'; // Zero Width Non-Joiner
8
+ const ZWS = '\u200B'; // Zero Width Space
9
+ /**
10
+ * Normalizes Sinhala Unicode text:
11
+ * - Fixes redundant/duplicate ZWJs (\u200D)
12
+ * - Removes phantom Zero Width Spaces (\u200B)
13
+ * - Standardizes multi-character vowel signs into their canonical unified Unicode representations
14
+ *
15
+ * Example: cleans text before saving to database to ensure consistency.
16
+ */
17
+ export function normalizeSinhala(text) {
18
+ if (!text || typeof text !== 'string')
19
+ return '';
20
+ let normalized = text;
21
+ // 1. Remove Zero-Width Spaces
22
+ normalized = normalized.replace(/\u200B/g, '');
23
+ // 2. Collapse multiple ZWJs into a single ZWJ
24
+ normalized = normalized.replace(/\u200D{2,}/g, ZWJ);
25
+ // 3. Remove orphan ZWJs at string boundary or around spaces
26
+ normalized = normalized.replace(/(^\u200D+|\u200D+$)/g, '');
27
+ normalized = normalized.replace(/\s\u200D+/g, ' ');
28
+ normalized = normalized.replace(/\u200D+\s/g, ' ');
29
+ // 4. Normalize composite vowels:
30
+ // කො: kombuva (\u0DD9) + aela-pilla (\u0DCF) -> \u0DDC (o vowel sign)
31
+ normalized = normalized.replace(/\u0DD9\u0DCF/g, '\u0DDC');
32
+ // කෝ: kombuva (\u0DD9) + diga aela-pilla (\u0DDF) -> \u0DDD (oo vowel sign)
33
+ normalized = normalized.replace(/\u0DD9\u0DDF/g, '\u0DDD');
34
+ // කෞ: kombuva (\u0DD9) + gayanukitta (\u0DDE) -> \u0DDE (au vowel sign)
35
+ normalized = normalized.replace(/\u0DD9\u0DDE/g, '\u0DDE');
36
+ return normalized.trim();
37
+ }
38
+ /**
39
+ * Strips all Zero Width Joiners (\u200D), ZWNJs (\u200C), and invisible characters.
40
+ * Use this to produce a stripped search index so that queries like 'ප්ර' match 'ප්‍ර'.
41
+ */
42
+ export function stripZwj(text) {
43
+ if (!text || typeof text !== 'string')
44
+ return '';
45
+ return text.replace(/[\u200B\u200C\u200D\uFEFF]/g, '');
46
+ }
47
+ /**
48
+ * Checks whether a given string contains Sinhala Unicode characters.
49
+ */
50
+ export function containsSinhala(text) {
51
+ if (!text || typeof text !== 'string')
52
+ return false;
53
+ return /[\u0D80-\u0DFF]/.test(text);
54
+ }
55
+ /**
56
+ * Checks whether a given string contains Tamil Unicode characters.
57
+ */
58
+ export function containsTamil(text) {
59
+ if (!text || typeof text !== 'string')
60
+ return false;
61
+ return /[\u0B80-\u0BFF]/.test(text);
62
+ }
63
+ /**
64
+ * Prepares search queries by normalizing whitespace and invisibles for reliable text lookup.
65
+ */
66
+ export function sanitizeSearchQuery(query) {
67
+ if (!query || typeof query !== 'string')
68
+ return '';
69
+ return stripZwj(normalizeSinhala(query)).toLowerCase().trim();
70
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Sri Lankan vehicle registration plate validation and parsing.
3
+ */
4
+ export interface VehiclePlateResult {
5
+ isValid: boolean;
6
+ clean: string;
7
+ format: 'MODERN' | 'TRANSITIONAL' | 'VINTAGE' | 'SRI' | 'UNKNOWN';
8
+ province?: {
9
+ code: string;
10
+ name: string;
11
+ };
12
+ category: 'Motor Car' | 'Motor Cycle' | 'Three Wheeler' | 'Dual Purpose / Van' | 'Lorry / Commercial' | 'Tractor' | 'General' | 'Unknown';
13
+ plateNumber: string;
14
+ error?: string;
15
+ }
16
+ export declare const PROVINCE_MAP: Record<string, string>;
17
+ /**
18
+ * Validates and analyzes a Sri Lankan vehicle registration plate number.
19
+ *
20
+ * Examples:
21
+ * - "WP CAB-1234" (Modern 3-letter Western Province Car)
22
+ * - "CP BAA-5678" (Modern Central Province Motor Cycle)
23
+ * - "SP AAX-9012" (Modern Southern Province Three Wheeler)
24
+ * - "WP 300-1234" (Transitional numeric prefix)
25
+ * - "64-1234" (Vintage 2-digit series)
26
+ * - "14 ශ්‍රී 1234" / "14 Sri 1234" (Vintage Sri series)
27
+ */
28
+ export declare function validateVehiclePlate(input: string): VehiclePlateResult;
package/lib/vehicle.js ADDED
@@ -0,0 +1,146 @@
1
+ /**
2
+ * Sri Lankan vehicle registration plate validation and parsing.
3
+ */
4
+ export const PROVINCE_MAP = {
5
+ WP: 'Western Province',
6
+ CP: 'Central Province',
7
+ SP: 'Southern Province',
8
+ NP: 'Northern Province',
9
+ EP: 'Eastern Province',
10
+ NW: 'North Western Province',
11
+ NC: 'North Central Province',
12
+ UP: 'Uva Province',
13
+ UVA: 'Uva Province',
14
+ SG: 'Sabaragamuwa Province',
15
+ };
16
+ function inferCategoryFromPrefix(prefix) {
17
+ if (!prefix)
18
+ return 'Unknown';
19
+ const firstChar = prefix.charAt(0).toUpperCase();
20
+ switch (firstChar) {
21
+ case 'A':
22
+ return 'Three Wheeler';
23
+ case 'B':
24
+ return 'Motor Cycle';
25
+ case 'C':
26
+ case 'K':
27
+ return 'Motor Car';
28
+ case 'D':
29
+ case 'P':
30
+ case 'H':
31
+ return 'Dual Purpose / Van';
32
+ case 'L':
33
+ case 'N':
34
+ return 'Lorry / Commercial';
35
+ case 'R':
36
+ case 'T':
37
+ return 'Tractor';
38
+ default:
39
+ return 'General';
40
+ }
41
+ }
42
+ /**
43
+ * Validates and analyzes a Sri Lankan vehicle registration plate number.
44
+ *
45
+ * Examples:
46
+ * - "WP CAB-1234" (Modern 3-letter Western Province Car)
47
+ * - "CP BAA-5678" (Modern Central Province Motor Cycle)
48
+ * - "SP AAX-9012" (Modern Southern Province Three Wheeler)
49
+ * - "WP 300-1234" (Transitional numeric prefix)
50
+ * - "64-1234" (Vintage 2-digit series)
51
+ * - "14 ශ්‍රී 1234" / "14 Sri 1234" (Vintage Sri series)
52
+ */
53
+ export function validateVehiclePlate(input) {
54
+ if (!input || typeof input !== 'string') {
55
+ return {
56
+ isValid: false,
57
+ clean: '',
58
+ format: 'UNKNOWN',
59
+ category: 'Unknown',
60
+ plateNumber: '',
61
+ error: 'Input must be a non-empty string',
62
+ };
63
+ }
64
+ const raw = input.trim();
65
+ // 1. Check Vintage "Sri" / "ශ්‍රී" format: e.g. "14 ශ්‍රී 1234" or "14 Sri 1234" or "14-Sri-1234"
66
+ const sriRegex = /^(\d{1,3})\s*(?:ශ්‍රී|Sri|SRI|-sri-|-SRI-)\s*(\d{4})$/i;
67
+ const sriMatch = raw.match(sriRegex);
68
+ if (sriMatch) {
69
+ const clean = `${sriMatch[1]} ශ්‍රී ${sriMatch[2]}`;
70
+ return {
71
+ isValid: true,
72
+ clean,
73
+ format: 'SRI',
74
+ category: 'General',
75
+ plateNumber: clean,
76
+ };
77
+ }
78
+ // Normalize separators: replace multiple spaces with single space, ensure standard dash
79
+ const cleanInput = raw.replace(/\s+/g, ' ').toUpperCase();
80
+ // 2. Check Modern Provincial with Letters: e.g. "WP CAB-1234", "CAB-1234", "WP GA-1234", "GA-1234"
81
+ // Province can be 2-3 letters, letters 2-3 chars, 4 digits
82
+ const modernRegex = /^(?:([A-Z]{2,3})\s+)?([A-Z]{2,3})[\s-]?(\d{4})$/;
83
+ const modernMatch = cleanInput.match(modernRegex);
84
+ if (modernMatch) {
85
+ const provCode = modernMatch[1];
86
+ const letterPrefix = modernMatch[2];
87
+ const numberPart = modernMatch[3];
88
+ let provinceInfo = undefined;
89
+ if (provCode) {
90
+ const provName = PROVINCE_MAP[provCode];
91
+ if (provName) {
92
+ provinceInfo = { code: provCode, name: provName };
93
+ }
94
+ }
95
+ const cleanPlate = provCode
96
+ ? `${provCode} ${letterPrefix}-${numberPart}`
97
+ : `${letterPrefix}-${numberPart}`;
98
+ return {
99
+ isValid: true,
100
+ clean: cleanPlate,
101
+ format: 'MODERN',
102
+ province: provinceInfo,
103
+ category: inferCategoryFromPrefix(letterPrefix),
104
+ plateNumber: `${letterPrefix}-${numberPart}`,
105
+ };
106
+ }
107
+ // 3. Check Transitional Numeric with Province: e.g. "WP 300-1234", "SP 19-1234"
108
+ const transProvRegex = /^([A-Z]{2,3})\s+(\d{1,3})[\s-]?(\d{4})$/;
109
+ const transProvMatch = cleanInput.match(transProvRegex);
110
+ if (transProvMatch) {
111
+ const provCode = transProvMatch[1];
112
+ const prefixNum = transProvMatch[2];
113
+ const numberPart = transProvMatch[3];
114
+ const provName = PROVINCE_MAP[provCode];
115
+ const cleanPlate = `${provCode} ${prefixNum}-${numberPart}`;
116
+ return {
117
+ isValid: true,
118
+ clean: cleanPlate,
119
+ format: 'TRANSITIONAL',
120
+ province: provName ? { code: provCode, name: provName } : undefined,
121
+ category: 'General',
122
+ plateNumber: `${prefixNum}-${numberPart}`,
123
+ };
124
+ }
125
+ // 4. Check Vintage Numeric: e.g. "64-1234", "300-1234", "19-1234"
126
+ const vintageRegex = /^(\d{1,3})[\s-]?(\d{4})$/;
127
+ const vintageMatch = cleanInput.match(vintageRegex);
128
+ if (vintageMatch) {
129
+ const cleanPlate = `${vintageMatch[1]}-${vintageMatch[2]}`;
130
+ return {
131
+ isValid: true,
132
+ clean: cleanPlate,
133
+ format: 'VINTAGE',
134
+ category: 'General',
135
+ plateNumber: cleanPlate,
136
+ };
137
+ }
138
+ return {
139
+ isValid: false,
140
+ clean: raw,
141
+ format: 'UNKNOWN',
142
+ category: 'Unknown',
143
+ plateNumber: '',
144
+ error: 'Invalid Sri Lankan vehicle plate format. Expected format like WP CAB-1234, GA-1234, 64-1234, or 14 Sri 1234',
145
+ };
146
+ }
package/lib/zod.d.ts ADDED
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Zod refinement helper for Sri Lankan NIC.
3
+ */
4
+ export declare const nicRefinement: {
5
+ validator: (val: string) => boolean;
6
+ message: string;
7
+ };
8
+ /**
9
+ * Zod refinement helper for Sri Lankan Phone numbers.
10
+ */
11
+ export declare const phoneRefinement: {
12
+ validator: (val: string) => boolean;
13
+ message: string;
14
+ };
15
+ /**
16
+ * Zod refinement helper for Sri Lankan Driving Licenses.
17
+ */
18
+ export declare const licenseRefinement: {
19
+ validator: (val: string) => boolean;
20
+ message: string;
21
+ };
22
+ /**
23
+ * Zod refinement helper for Sri Lankan Passports.
24
+ */
25
+ export declare const passportRefinement: {
26
+ validator: (val: string) => boolean;
27
+ message: string;
28
+ };
29
+ /**
30
+ * Zod refinement helper for Sri Lankan Tax Identification Number (TIN).
31
+ */
32
+ export declare const tinRefinement: {
33
+ validator: (val: string) => boolean;
34
+ message: string;
35
+ };
36
+ /**
37
+ * Zod refinement helper for Sri Lankan Business Registration Number (BRN / ROC).
38
+ */
39
+ export declare const brnRefinement: {
40
+ validator: (val: string) => boolean;
41
+ message: string;
42
+ };
43
+ /**
44
+ * Zod refinement helper for Sri Lankan Vehicle Registration Number Plate.
45
+ */
46
+ export declare const vehiclePlateRefinement: {
47
+ validator: (val: string) => boolean;
48
+ message: string;
49
+ };
50
+ /**
51
+ * Zod refinement helper for Sri Lankan Bank Code (CBSL 4-digit code).
52
+ */
53
+ export declare const bankCodeRefinement: {
54
+ validator: (val: string) => boolean;
55
+ message: string;
56
+ };
57
+ /**
58
+ * Pluggable schema validator functions (usable in Zod, Yup, Joi, or React Hook Form).
59
+ */
60
+ export declare const validators: {
61
+ nic: (value: string) => string | true;
62
+ phone: (value: string) => string | true;
63
+ license: (value: string) => string | true | undefined;
64
+ passport: (value: string) => string | true | undefined;
65
+ tin: (value: string) => string | true | undefined;
66
+ brn: (value: string) => string | true | undefined;
67
+ vehiclePlate: (value: string) => string | true | undefined;
68
+ bankCode: (value: string) => true | "Invalid Sri Lankan bank code";
69
+ };
package/lib/zod.js ADDED
@@ -0,0 +1,98 @@
1
+ import { isValidNic, validateNic } from './nic';
2
+ import { isValidPhone, validatePhone } from './phone';
3
+ import { validateDrivingLicense } from './license';
4
+ import { validatePassport, validateTin, validateBrn } from './identity-extra';
5
+ import { validateVehiclePlate } from './vehicle';
6
+ import { isValidBankCode } from './banks';
7
+ /**
8
+ * Zod refinement helper for Sri Lankan NIC.
9
+ */
10
+ export const nicRefinement = {
11
+ validator: (val) => isValidNic(val),
12
+ message: 'Invalid Sri Lankan National Identity Card (NIC) number',
13
+ };
14
+ /**
15
+ * Zod refinement helper for Sri Lankan Phone numbers.
16
+ */
17
+ export const phoneRefinement = {
18
+ validator: (val) => isValidPhone(val),
19
+ message: 'Invalid Sri Lankan phone number',
20
+ };
21
+ /**
22
+ * Zod refinement helper for Sri Lankan Driving Licenses.
23
+ */
24
+ export const licenseRefinement = {
25
+ validator: (val) => validateDrivingLicense(val).isValid,
26
+ message: 'Invalid Sri Lankan Driving License number',
27
+ };
28
+ /**
29
+ * Zod refinement helper for Sri Lankan Passports.
30
+ */
31
+ export const passportRefinement = {
32
+ validator: (val) => validatePassport(val).isValid,
33
+ message: 'Invalid Sri Lankan Passport number (e.g., N1234567)',
34
+ };
35
+ /**
36
+ * Zod refinement helper for Sri Lankan Tax Identification Number (TIN).
37
+ */
38
+ export const tinRefinement = {
39
+ validator: (val) => validateTin(val).isValid,
40
+ message: 'Invalid Sri Lankan Tax Identification Number (TIN: 9 or 10 digits)',
41
+ };
42
+ /**
43
+ * Zod refinement helper for Sri Lankan Business Registration Number (BRN / ROC).
44
+ */
45
+ export const brnRefinement = {
46
+ validator: (val) => validateBrn(val).isValid,
47
+ message: 'Invalid Sri Lankan Business Registration Number (e.g. PV 12345)',
48
+ };
49
+ /**
50
+ * Zod refinement helper for Sri Lankan Vehicle Registration Number Plate.
51
+ */
52
+ export const vehiclePlateRefinement = {
53
+ validator: (val) => validateVehiclePlate(val).isValid,
54
+ message: 'Invalid Sri Lankan vehicle plate number (e.g. WP CAB-1234 or 64-1234)',
55
+ };
56
+ /**
57
+ * Zod refinement helper for Sri Lankan Bank Code (CBSL 4-digit code).
58
+ */
59
+ export const bankCodeRefinement = {
60
+ validator: (val) => isValidBankCode(val),
61
+ message: 'Invalid Sri Lankan bank routing code (e.g. 7010 for Commercial Bank)',
62
+ };
63
+ /**
64
+ * Pluggable schema validator functions (usable in Zod, Yup, Joi, or React Hook Form).
65
+ */
66
+ export const validators = {
67
+ nic: (value) => {
68
+ const res = validateNic(value);
69
+ return res.isValid ? true : res.error;
70
+ },
71
+ phone: (value) => {
72
+ const res = validatePhone(value);
73
+ return res.isValid ? true : res.error;
74
+ },
75
+ license: (value) => {
76
+ const res = validateDrivingLicense(value);
77
+ return res.isValid ? true : res.error;
78
+ },
79
+ passport: (value) => {
80
+ const res = validatePassport(value);
81
+ return res.isValid ? true : res.error;
82
+ },
83
+ tin: (value) => {
84
+ const res = validateTin(value);
85
+ return res.isValid ? true : res.error;
86
+ },
87
+ brn: (value) => {
88
+ const res = validateBrn(value);
89
+ return res.isValid ? true : res.error;
90
+ },
91
+ vehiclePlate: (value) => {
92
+ const res = validateVehiclePlate(value);
93
+ return res.isValid ? true : res.error;
94
+ },
95
+ bankCode: (value) => {
96
+ return isValidBankCode(value) ? true : 'Invalid Sri Lankan bank code';
97
+ },
98
+ };
package/package.json CHANGED
@@ -1,6 +1,45 @@
1
1
  {
2
2
  "name": "lanka-kit",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "1.1.0",
4
+ "type": "module",
5
+ "description": "The Ultimate Sri Lankan Developer Toolkit: Identity (NIC, Driving License, Passport, TIN, BRN), Mobile Telco, Banking & Branch Codes, LKR Currency Words, Geo & LankaQR",
6
+ "main": "./lib/index.js",
7
+ "module": "./lib/index.js",
8
+ "types": "./lib/index.d.ts",
9
+ "files": [
10
+ "lib"
11
+ ],
12
+ "exports": {
13
+ ".": {
14
+ "import": "./lib/index.js",
15
+ "types": "./lib/index.d.ts"
16
+ }
17
+ },
18
+ "scripts": {
19
+ "dev": "vite",
20
+ "build:lib": "tsc",
21
+ "build": "tsc && vite build",
22
+ "preview": "vite preview",
23
+ "test": "tsc && node --test tests/*.test.mjs"
24
+ },
25
+ "keywords": [
26
+ "sri-lanka",
27
+ "nic",
28
+ "identity",
29
+ "verification",
30
+ "lanka",
31
+ "sinhala",
32
+ "tamil",
33
+ "phone-validator",
34
+ "dialog",
35
+ "mobitel",
36
+ "postal-codes",
37
+ "lankaqr"
38
+ ],
39
+ "author": "Lanka Developer Community",
40
+ "license": "MIT",
41
+ "devDependencies": {
42
+ "typescript": "^5.7.0",
43
+ "vite": "^6.0.0"
44
+ }
45
+ }