@prashanttiw/pramana 1.0.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/dist/index.mjs ADDED
@@ -0,0 +1,356 @@
1
+ // src/utils/verhoeff.ts
2
+ var d = [
3
+ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
4
+ [1, 2, 3, 4, 0, 6, 7, 8, 9, 5],
5
+ [2, 3, 4, 0, 1, 7, 8, 9, 5, 6],
6
+ [3, 4, 0, 1, 2, 8, 9, 5, 6, 7],
7
+ [4, 0, 1, 2, 3, 9, 5, 6, 7, 8],
8
+ [5, 9, 8, 7, 6, 0, 4, 3, 2, 1],
9
+ [6, 5, 9, 8, 7, 1, 0, 4, 3, 2],
10
+ [7, 6, 5, 9, 8, 2, 1, 0, 4, 3],
11
+ [8, 7, 6, 5, 9, 3, 2, 1, 0, 4],
12
+ [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
13
+ ];
14
+ var p = [
15
+ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
16
+ [1, 5, 7, 6, 2, 8, 3, 0, 9, 4],
17
+ [5, 8, 0, 3, 7, 9, 6, 1, 4, 2],
18
+ [8, 9, 1, 6, 0, 4, 3, 5, 2, 7],
19
+ [9, 4, 5, 3, 1, 2, 6, 8, 7, 0],
20
+ [4, 2, 8, 6, 5, 7, 3, 9, 0, 1],
21
+ [2, 7, 9, 3, 8, 0, 6, 4, 1, 5],
22
+ [7, 0, 4, 6, 9, 1, 3, 2, 5, 8]
23
+ ];
24
+ var inv = [0, 4, 3, 2, 1, 5, 6, 7, 8, 9];
25
+ var validateVerhoeff = (numStr) => {
26
+ if (numStr == null || typeof numStr !== "string") return false;
27
+ if (!/^\d+$/.test(numStr)) return false;
28
+ let c = 0;
29
+ const myArray = numStr.split("").map(Number).reverse();
30
+ for (let i = 0; i < myArray.length; i++) {
31
+ c = d[c][p[i % 8][myArray[i]]];
32
+ }
33
+ return c === 0;
34
+ };
35
+ var generateVerhoeff = (numStr) => {
36
+ if (numStr == null || typeof numStr !== "string") {
37
+ throw new Error("Input must be a non-null string");
38
+ }
39
+ if (!/^\d+$/.test(numStr)) {
40
+ throw new Error("Input must be a numeric string");
41
+ }
42
+ let c = 0;
43
+ const myArray = numStr.split("").map(Number).reverse();
44
+ for (let i = 0; i < myArray.length; i++) {
45
+ c = d[c][p[(i + 1) % 8][myArray[i]]];
46
+ }
47
+ return inv[c];
48
+ };
49
+
50
+ // src/validators/aadhaar.ts
51
+ var isValidAadhaar = (aadhaar) => {
52
+ if (aadhaar == null) return false;
53
+ if (typeof aadhaar !== "string") return false;
54
+ if (!/^\d{12}$/.test(aadhaar)) return false;
55
+ if (/^[01]/.test(aadhaar)) return false;
56
+ return validateVerhoeff(aadhaar);
57
+ };
58
+
59
+ // src/validators/pan.ts
60
+ var isValidPAN = (pan) => {
61
+ if (pan == null) return false;
62
+ if (typeof pan !== "string") return false;
63
+ const regex = /^[A-Z]{5}[0-9]{4}[A-Z]{1}$/;
64
+ if (!regex.test(pan)) return false;
65
+ const fourthChar = pan.charAt(3);
66
+ const validEntityTypes = ["C", "P", "H", "F", "A", "T", "B", "L", "J", "G"];
67
+ if (!validEntityTypes.includes(fourthChar)) return false;
68
+ return true;
69
+ };
70
+ var PAN_CATEGORY_MAP = {
71
+ "C": "Company",
72
+ "P": "Person",
73
+ "H": "Hindu Undivided Family (HUF)",
74
+ "F": "Firm",
75
+ "A": "Association of Persons (AOP)",
76
+ "T": "AOP (Trust)",
77
+ "B": "Body of Individuals (BOI)",
78
+ "L": "Local Authority",
79
+ "J": "Artificial Juridical Person",
80
+ "G": "Government"
81
+ };
82
+ var getPANInfo = (pan) => {
83
+ if (!isValidPAN(pan)) {
84
+ return { valid: false };
85
+ }
86
+ const category = pan.charAt(3);
87
+ return {
88
+ valid: true,
89
+ category,
90
+ categoryDesc: PAN_CATEGORY_MAP[category] || "Unknown"
91
+ };
92
+ };
93
+
94
+ // src/utils/mod36.ts
95
+ var CHARSET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
96
+ var generateGSTCheckDigit = (gstinBase) => {
97
+ if (gstinBase == null || typeof gstinBase !== "string") return -1;
98
+ if (gstinBase.length !== 14) return -1;
99
+ const input = gstinBase.toUpperCase();
100
+ let sum = 0;
101
+ for (let i = 0; i < 14; i++) {
102
+ const charValue = CHARSET.indexOf(input[i]);
103
+ if (charValue < 0) return -1;
104
+ const weight = i % 2 + 1;
105
+ const product = charValue * weight;
106
+ sum += Math.floor(product / 36) + product % 36;
107
+ }
108
+ const checkDigitIndex = (36 - sum % 36) % 36;
109
+ return checkDigitIndex;
110
+ };
111
+ var validateGSTCheckDigit = (gstin) => {
112
+ if (gstin == null || typeof gstin !== "string") return false;
113
+ if (gstin.length !== 15) return false;
114
+ const input = gstin.toUpperCase();
115
+ const gstinBase = input.substring(0, 14);
116
+ const providedCheckDigit = input.charAt(14);
117
+ const expectedCheckDigitIndex = generateGSTCheckDigit(gstinBase);
118
+ if (expectedCheckDigitIndex < 0) return false;
119
+ const expectedCheckDigit = CHARSET[expectedCheckDigitIndex];
120
+ return providedCheckDigit === expectedCheckDigit;
121
+ };
122
+
123
+ // src/data/gst_states.ts
124
+ var GST_STATE_CODES = {
125
+ "01": "Jammu and Kashmir",
126
+ "02": "Himachal Pradesh",
127
+ "03": "Punjab",
128
+ "04": "Chandigarh",
129
+ "05": "Uttarakhand",
130
+ "06": "Haryana",
131
+ "07": "Delhi",
132
+ "08": "Rajasthan",
133
+ "09": "Uttar Pradesh",
134
+ "10": "Bihar",
135
+ "11": "Sikkim",
136
+ "12": "Arunachal Pradesh",
137
+ "13": "Nagaland",
138
+ "14": "Manipur",
139
+ "15": "Mizoram",
140
+ "16": "Tripura",
141
+ "17": "Meghalaya",
142
+ "18": "Assam",
143
+ "19": "West Bengal",
144
+ "20": "Jharkhand",
145
+ "21": "Odisha",
146
+ "22": "Chhattisgarh",
147
+ "23": "Madhya Pradesh",
148
+ "24": "Gujarat",
149
+ "25": "Daman and Diu",
150
+ // Merged but code persists for legacy/current
151
+ "26": "Dadra and Nagar Haveli",
152
+ "27": "Maharashtra",
153
+ "28": "Andhra Pradesh (Old)",
154
+ // Check current usage
155
+ "29": "Karnataka",
156
+ "30": "Goa",
157
+ "31": "Lakshadweep",
158
+ "32": "Kerala",
159
+ "33": "Tamil Nadu",
160
+ "34": "Puducherry",
161
+ "35": "Andaman and Nicobar Islands",
162
+ "36": "Telangana",
163
+ "37": "Andhra Pradesh",
164
+ "38": "Ladakh",
165
+ "97": "Other Territory",
166
+ "99": "Centre Jurisdiction"
167
+ };
168
+
169
+ // src/validators/gstin.ts
170
+ var isValidGSTIN = (gstin) => {
171
+ if (gstin == null) return false;
172
+ if (typeof gstin !== "string") return false;
173
+ const regex = /^\d{2}[A-Z]{5}\d{4}[A-Z]{1}[1-9A-Z]{1}Z[0-9A-Z]{1}$/;
174
+ if (!regex.test(gstin)) return false;
175
+ return validateGSTCheckDigit(gstin);
176
+ };
177
+ var getGSTINInfo = (gstin) => {
178
+ if (!isValidGSTIN(gstin)) {
179
+ return { valid: false };
180
+ }
181
+ const stateCode = gstin.substring(0, 2);
182
+ return {
183
+ valid: true,
184
+ stateCode,
185
+ state: GST_STATE_CODES[stateCode] || "Unknown State"
186
+ };
187
+ };
188
+
189
+ // src/data/banks.ts
190
+ var BANK_CODES = /* @__PURE__ */ new Set([
191
+ "SBIN",
192
+ // State Bank of India
193
+ "HDFC",
194
+ // HDFC Bank
195
+ "ICIC",
196
+ // ICICI Bank
197
+ "UTIB",
198
+ // Axis Bank
199
+ "PUNB",
200
+ // Punjab National Bank
201
+ "BKID",
202
+ // Bank of India
203
+ "BARB",
204
+ // Bank of Baroda
205
+ "CNRB",
206
+ // Canara Bank
207
+ "UBIN",
208
+ // Union Bank of India
209
+ "IOBA",
210
+ // Indian Overseas Bank
211
+ "IDIB",
212
+ // Indian Bank
213
+ "CBIN",
214
+ // Central Bank of India
215
+ "MAHB",
216
+ // Bank of Maharashtra
217
+ "ORBC",
218
+ // Oriental Bank of Commerce (Merged)
219
+ "ALLA",
220
+ // Allahabad Bank (Merged)
221
+ "ANDB",
222
+ // Andhra Bank (Merged)
223
+ "SYNB",
224
+ // Syndicate Bank (Merged)
225
+ "CORP",
226
+ // Corporation Bank (Merged)
227
+ "VYSA",
228
+ // ING Vysya (Merged)
229
+ "KKBK",
230
+ // Kotak Mahindra Bank
231
+ "YESB",
232
+ // Yes Bank
233
+ "INDB",
234
+ // IndusInd Bank
235
+ "FDRL"
236
+ // Federal Bank
237
+ ]);
238
+
239
+ // src/validators/ifsc.ts
240
+ var isValidIFSC = (ifsc) => {
241
+ if (ifsc == null) return false;
242
+ if (typeof ifsc !== "string") return false;
243
+ const regex = /^[A-Z]{4}0[A-Z0-9]{6}$/;
244
+ if (!regex.test(ifsc)) return false;
245
+ const bankCode = ifsc.substring(0, 4);
246
+ return BANK_CODES.has(bankCode);
247
+ };
248
+
249
+ // src/data/pincodes.ts
250
+ var PINCODE_REGIONS = {
251
+ "11": "Delhi",
252
+ "12": "Haryana",
253
+ "13": "Haryana",
254
+ "14": "Punjab",
255
+ "15": "Punjab",
256
+ "16": "Chandigarh",
257
+ "17": "Himachal Pradesh",
258
+ "18": "Jammu & Kashmir",
259
+ "19": "Jammu & Kashmir",
260
+ "20": "Uttar Pradesh",
261
+ "21": "Uttar Pradesh",
262
+ "22": "Uttar Pradesh",
263
+ "23": "Uttar Pradesh",
264
+ "24": "Uttar Pradesh",
265
+ "25": "Uttar Pradesh",
266
+ "26": "Uttar Pradesh",
267
+ "27": "Uttar Pradesh",
268
+ "28": "Uttar Pradesh",
269
+ "30": "Rajasthan",
270
+ "31": "Rajasthan",
271
+ "32": "Rajasthan",
272
+ "33": "Rajasthan",
273
+ "34": "Rajasthan",
274
+ "36": "Gujarat",
275
+ "37": "Gujarat",
276
+ "38": "Gujarat",
277
+ "39": "Gujarat",
278
+ "40": "Maharashtra",
279
+ "41": "Maharashtra",
280
+ "42": "Maharashtra",
281
+ "43": "Maharashtra",
282
+ "44": "Maharashtra",
283
+ // ... (Can expand list)
284
+ "50": "Telangana",
285
+ "51": "Andhra Pradesh",
286
+ "52": "Andhra Pradesh",
287
+ "53": "Andhra Pradesh",
288
+ "56": "Karnataka",
289
+ "57": "Karnataka",
290
+ "58": "Karnataka",
291
+ "59": "Karnataka",
292
+ "60": "Tamil Nadu",
293
+ "61": "Tamil Nadu",
294
+ "62": "Tamil Nadu",
295
+ "63": "Tamil Nadu",
296
+ "64": "Tamil Nadu",
297
+ "67": "Kerala",
298
+ "68": "Kerala",
299
+ "69": "Kerala",
300
+ "70": "West Bengal",
301
+ "71": "West Bengal",
302
+ "72": "West Bengal",
303
+ "73": "West Bengal",
304
+ "74": "West Bengal",
305
+ "78": "Assam",
306
+ "79": "North East",
307
+ "80": "Bihar",
308
+ "81": "Bihar",
309
+ "82": "Bihar",
310
+ "83": "Jharkhand",
311
+ "84": "Bihar",
312
+ "85": "Bihar",
313
+ "90": "Army Postal Service",
314
+ "99": "Army Postal Service"
315
+ };
316
+
317
+ // src/validators/pincode.ts
318
+ var isValidPincode = (pincode) => {
319
+ if (pincode == null) return false;
320
+ if (typeof pincode !== "string") return false;
321
+ const regex = /^[1-9][0-9]{5}$/;
322
+ if (!regex.test(pincode)) return false;
323
+ const regionKey = pincode.substring(0, 2);
324
+ return Object.prototype.hasOwnProperty.call(PINCODE_REGIONS, regionKey);
325
+ };
326
+ var getPincodeInfo = (pincode) => {
327
+ if (!isValidPincode(pincode)) {
328
+ return { valid: false };
329
+ }
330
+ const regionKey = pincode.substring(0, 2);
331
+ return {
332
+ valid: true,
333
+ region: PINCODE_REGIONS[regionKey] || "Unknown Region"
334
+ };
335
+ };
336
+
337
+ // src/utils/checksum.ts
338
+ var validateLuhn = (numStr) => {
339
+ if (numStr == null || typeof numStr !== "string") return false;
340
+ if (!/^\d+$/.test(numStr)) return false;
341
+ let sum = 0;
342
+ let shouldDouble = false;
343
+ for (let i = numStr.length - 1; i >= 0; i--) {
344
+ let digit = parseInt(numStr.charAt(i));
345
+ if (shouldDouble) {
346
+ if ((digit *= 2) > 9) digit -= 9;
347
+ }
348
+ sum += digit;
349
+ shouldDouble = !shouldDouble;
350
+ }
351
+ return sum % 10 === 0;
352
+ };
353
+
354
+ export { generateGSTCheckDigit, generateVerhoeff, getGSTINInfo, getPANInfo, getPincodeInfo, isValidAadhaar, isValidGSTIN, isValidIFSC, isValidPAN, isValidPincode, validateGSTCheckDigit, validateLuhn, validateVerhoeff };
355
+ //# sourceMappingURL=index.mjs.map
356
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/verhoeff.ts","../src/validators/aadhaar.ts","../src/validators/pan.ts","../src/utils/mod36.ts","../src/data/gst_states.ts","../src/validators/gstin.ts","../src/data/banks.ts","../src/validators/ifsc.ts","../src/data/pincodes.ts","../src/validators/pincode.ts","../src/utils/checksum.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\r\n * The multiplication table\r\n */\r\nconst d = [\r\n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],\r\n [1, 2, 3, 4, 0, 6, 7, 8, 9, 5],\r\n [2, 3, 4, 0, 1, 7, 8, 9, 5, 6],\r\n [3, 4, 0, 1, 2, 8, 9, 5, 6, 7],\r\n [4, 0, 1, 2, 3, 9, 5, 6, 7, 8],\r\n [5, 9, 8, 7, 6, 0, 4, 3, 2, 1],\r\n [6, 5, 9, 8, 7, 1, 0, 4, 3, 2],\r\n [7, 6, 5, 9, 8, 2, 1, 0, 4, 3],\r\n [8, 7, 6, 5, 9, 3, 2, 1, 0, 4],\r\n [9, 8, 7, 6, 5, 4, 3, 2, 1, 0],\r\n];\r\n\r\n/**\r\n * The permutation table\r\n */\r\nconst p = [\r\n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],\r\n [1, 5, 7, 6, 2, 8, 3, 0, 9, 4],\r\n [5, 8, 0, 3, 7, 9, 6, 1, 4, 2],\r\n [8, 9, 1, 6, 0, 4, 3, 5, 2, 7],\r\n [9, 4, 5, 3, 1, 2, 6, 8, 7, 0],\r\n [4, 2, 8, 6, 5, 7, 3, 9, 0, 1],\r\n [2, 7, 9, 3, 8, 0, 6, 4, 1, 5],\r\n [7, 0, 4, 6, 9, 1, 3, 2, 5, 8],\r\n];\r\n\r\n/**\r\n * The inverse table\r\n */\r\nconst inv = [0, 4, 3, 2, 1, 5, 6, 7, 8, 9];\r\n\r\n/**\r\n * Validates a number string using the Verhoeff algorithm.\r\n * @param numStr The number string to validate.\r\n * @returns True if valid, false otherwise.\r\n */\r\nexport const validateVerhoeff = (numStr: any): boolean => {\r\n // Defensive: Handle null/undefined/non-string\r\n if (numStr == null || typeof numStr !== 'string') return false;\r\n if (!/^\\d+$/.test(numStr)) return false;\r\n\r\n let c = 0;\r\n const myArray = numStr.split('').map(Number).reverse();\r\n\r\n for (let i = 0; i < myArray.length; i++) {\r\n c = d[c][p[i % 8][myArray[i]]];\r\n }\r\n\r\n return c === 0;\r\n};\r\n\r\n/**\r\n * Generates the Verhoeff checksum digit for a given number string.\r\n * @param numStr The number string (without the checksum).\r\n * @returns The checksum digit.\r\n */\r\nexport const generateVerhoeff = (numStr: any): number => {\r\n // Defensive: Handle null/undefined/non-string\r\n if (numStr == null || typeof numStr !== 'string') {\r\n throw new Error('Input must be a non-null string');\r\n }\r\n if (!/^\\d+$/.test(numStr)) {\r\n throw new Error('Input must be a numeric string');\r\n }\r\n\r\n let c = 0;\r\n const myArray = numStr.split('').map(Number).reverse();\r\n\r\n for (let i = 0; i < myArray.length; i++) {\r\n c = d[c][p[(i + 1) % 8][myArray[i]]];\r\n }\r\n\r\n return inv[c];\r\n};\r\n","import { validateVerhoeff } from '../utils/verhoeff';\r\n\r\n/**\r\n * Validates an Aadhaar number.\r\n * @param aadhaar The 12-digit Aadhaar number string.\r\n * @returns True if valid, false otherwise.\r\n */\r\nexport const isValidAadhaar = (aadhaar: any): boolean => {\r\n // 0. Null/undefined check\r\n if (aadhaar == null) return false;\r\n if (typeof aadhaar !== 'string') return false;\r\n \r\n // 1. Structure: 12 digits\r\n if (!/^\\d{12}$/.test(aadhaar)) return false;\r\n\r\n // 2. Logic: Should not start with 0 or 1\r\n if (/^[01]/.test(aadhaar)) return false;\r\n\r\n // 3. Algorithm: Verhoeff Checksum\r\n return validateVerhoeff(aadhaar);\r\n};\r\n","/**\r\n * Validates a Permanent Account Number (PAN).\r\n * @param pan The 10-character PAN string.\r\n * @returns True if valid, false otherwise.\r\n */\r\nexport const isValidPAN = (pan: any): boolean => {\r\n // 0. Null/undefined check\r\n if (pan == null) return false;\r\n if (typeof pan !== 'string') return false;\r\n \r\n // 1. Structure: 5 chars, 4 digits, 1 char using Regex\r\n const regex = /^[A-Z]{5}[0-9]{4}[A-Z]{1}$/;\r\n if (!regex.test(pan)) return false;\r\n\r\n // 2. Logic: 4th character must be one of the valid entity types\r\n const fourthChar = pan.charAt(3);\r\n const validEntityTypes = ['C', 'P', 'H', 'F', 'A', 'T', 'B', 'L', 'J', 'G'];\r\n\r\n if (!validEntityTypes.includes(fourthChar)) return false;\r\n\r\n return true;\r\n};\r\n\r\nexport interface PANInfo {\r\n valid: boolean;\r\n category?: string; // Code (P, C, etc.)\r\n categoryDesc?: string; // Description (Person, Company)\r\n}\r\n\r\nconst PAN_CATEGORY_MAP: Record<string, string> = {\r\n 'C': 'Company',\r\n 'P': 'Person',\r\n 'H': 'Hindu Undivided Family (HUF)',\r\n 'F': 'Firm',\r\n 'A': 'Association of Persons (AOP)',\r\n 'T': 'AOP (Trust)',\r\n 'B': 'Body of Individuals (BOI)',\r\n 'L': 'Local Authority',\r\n 'J': 'Artificial Juridical Person',\r\n 'G': 'Government',\r\n};\r\n\r\n/**\r\n * Extracts metadata from a PAN number.\r\n * @param pan The PAN string.\r\n * @returns Object containing validity and metadata.\r\n */\r\nexport const getPANInfo = (pan: string): PANInfo => {\r\n if (!isValidPAN(pan)) {\r\n return { valid: false };\r\n }\r\n\r\n const category = pan.charAt(3);\r\n return {\r\n valid: true,\r\n category,\r\n categoryDesc: PAN_CATEGORY_MAP[category] || 'Unknown',\r\n };\r\n};\r\n","/**\r\n * Character set for Mod-36 checksum: 0-9, A-Z\r\n * Used in GSTIN validation (GST Identification Number)\r\n */\r\nconst CHARSET = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';\r\n\r\n/**\r\n * Generates the Mod-36 check digit for a 14-character GSTIN base.\r\n * \r\n * Algorithm:\r\n * 1. For each of the 14 characters (left to right, 0-indexed):\r\n * - Convert character to numeric value (0-35)\r\n * - Multiply by weight: weight = (index % 2) + 1, alternating 1, 2, 1, 2...\r\n * - Calculate: quotient = product / 36, remainder = product % 36\r\n * - Add quotient + remainder to sum\r\n * 2. Calculate check digit index: (36 - (sum % 36)) % 36\r\n * 3. Map index back to character\r\n * \r\n * Reference: Official GSTIN format specification (Ministry of Finance, India)\r\n * \r\n * @param gstinBase The first 14 characters of GSTIN (excluding check digit)\r\n * @returns The check digit index (0-35), or -1 if input is invalid\r\n */\r\nexport const generateGSTCheckDigit = (gstinBase: any): number => {\r\n // Defensive: Handle null/undefined/non-string\r\n if (gstinBase == null || typeof gstinBase !== 'string') return -1;\r\n if (gstinBase.length !== 14) return -1;\r\n \r\n const input = gstinBase.toUpperCase();\r\n let sum = 0;\r\n\r\n for (let i = 0; i < 14; i++) {\r\n const charValue = CHARSET.indexOf(input[i]);\r\n if (charValue < 0) return -1; // Invalid character\r\n\r\n // Weight alternates: 1, 2, 1, 2, ... (for positions 0, 1, 2, 3, ...)\r\n const weight = (i % 2) + 1;\r\n const product = charValue * weight;\r\n \r\n // Add both quotient and remainder\r\n sum += Math.floor(product / 36) + (product % 36);\r\n }\r\n\r\n // Check digit index = (36 - (sum mod 36)) mod 36\r\n const checkDigitIndex = (36 - (sum % 36)) % 36;\r\n return checkDigitIndex;\r\n};\r\n\r\n/**\r\n * Validates a GSTIN using Mod-36 Checksum Algorithm.\r\n * \r\n * @param gstin The 15-character GSTIN string to validate\r\n * @returns True if the check digit is valid, false otherwise\r\n */\r\nexport const validateGSTCheckDigit = (gstin: any): boolean => {\r\n // Defensive: Handle null/undefined/non-string\r\n if (gstin == null || typeof gstin !== 'string') return false;\r\n if (gstin.length !== 15) return false;\r\n \r\n const input = gstin.toUpperCase();\r\n const gstinBase = input.substring(0, 14);\r\n const providedCheckDigit = input.charAt(14);\r\n \r\n // Generate expected check digit\r\n const expectedCheckDigitIndex = generateGSTCheckDigit(gstinBase);\r\n if (expectedCheckDigitIndex < 0) return false;\r\n \r\n const expectedCheckDigit = CHARSET[expectedCheckDigitIndex];\r\n return providedCheckDigit === expectedCheckDigit;\r\n};\r\n","/**\r\n * Mapping of GST State Codes (first 2 digits) to State Names.\r\n */\r\nexport const GST_STATE_CODES: Record<string, string> = {\r\n '01': 'Jammu and Kashmir',\r\n '02': 'Himachal Pradesh',\r\n '03': 'Punjab',\r\n '04': 'Chandigarh',\r\n '05': 'Uttarakhand',\r\n '06': 'Haryana',\r\n '07': 'Delhi',\r\n '08': 'Rajasthan',\r\n '09': 'Uttar Pradesh',\r\n '10': 'Bihar',\r\n '11': 'Sikkim',\r\n '12': 'Arunachal Pradesh',\r\n '13': 'Nagaland',\r\n '14': 'Manipur',\r\n '15': 'Mizoram',\r\n '16': 'Tripura',\r\n '17': 'Meghalaya',\r\n '18': 'Assam',\r\n '19': 'West Bengal',\r\n '20': 'Jharkhand',\r\n '21': 'Odisha',\r\n '22': 'Chhattisgarh',\r\n '23': 'Madhya Pradesh',\r\n '24': 'Gujarat',\r\n '25': 'Daman and Diu', // Merged but code persists for legacy/current\r\n '26': 'Dadra and Nagar Haveli',\r\n '27': 'Maharashtra',\r\n '28': 'Andhra Pradesh (Old)', // Check current usage\r\n '29': 'Karnataka',\r\n '30': 'Goa',\r\n '31': 'Lakshadweep',\r\n '32': 'Kerala',\r\n '33': 'Tamil Nadu',\r\n '34': 'Puducherry',\r\n '35': 'Andaman and Nicobar Islands',\r\n '36': 'Telangana',\r\n '37': 'Andhra Pradesh',\r\n '38': 'Ladakh',\r\n '97': 'Other Territory',\r\n '99': 'Centre Jurisdiction',\r\n};\r\n","import { validateGSTCheckDigit } from '../utils/mod36';\r\nimport { GST_STATE_CODES } from '../data/gst_states';\r\n\r\n/**\r\n * Validates a GSTIN.\r\n * @param gstin The 15-character GSTIN string.\r\n * @returns True if valid, false otherwise.\r\n */\r\nexport const isValidGSTIN = (gstin: any): boolean => {\r\n // 0. Null/undefined check\r\n if (gstin == null) return false;\r\n if (typeof gstin !== 'string') return false;\r\n \r\n // 1. Basic Regex Structure\r\n const regex = /^\\d{2}[A-Z]{5}\\d{4}[A-Z]{1}[1-9A-Z]{1}Z[0-9A-Z]{1}$/;\r\n\r\n if (!regex.test(gstin)) return false;\r\n\r\n // 2. Validate Mod-36 Check Digit\r\n return validateGSTCheckDigit(gstin);\r\n};\r\n\r\nexport interface GSTINInfo {\r\n valid: boolean;\r\n state?: string;\r\n stateCode?: string;\r\n}\r\n\r\n/**\r\n * Extracts metadata from a GSTIN.\r\n * @param gstin The GSTIN string.\r\n * @returns Object containing validity and metadata (State Name).\r\n */\r\nexport const getGSTINInfo = (gstin: string): GSTINInfo => {\r\n if (!isValidGSTIN(gstin)) {\r\n return { valid: false };\r\n }\r\n\r\n const stateCode = gstin.substring(0, 2);\r\n\r\n return {\r\n valid: true,\r\n stateCode,\r\n state: GST_STATE_CODES[stateCode] || 'Unknown State',\r\n };\r\n};\r\n","/**\r\n * A compressed set of popular/valid bank codes (First 4 chars of IFSC).\r\n * This is not exhaustive but covers major banks to demonstrate the pattern.\r\n * In a real scenario, this would be auto-generated from RBI master list.\r\n */\r\nexport const BANK_CODES = new Set([\r\n 'SBIN', // State Bank of India\r\n 'HDFC', // HDFC Bank\r\n 'ICIC', // ICICI Bank\r\n 'UTIB', // Axis Bank\r\n 'PUNB', // Punjab National Bank\r\n 'BKID', // Bank of India\r\n 'BARB', // Bank of Baroda\r\n 'CNRB', // Canara Bank\r\n 'UBIN', // Union Bank of India\r\n 'IOBA', // Indian Overseas Bank\r\n 'IDIB', // Indian Bank\r\n 'CBIN', // Central Bank of India\r\n 'MAHB', // Bank of Maharashtra\r\n 'ORBC', // Oriental Bank of Commerce (Merged)\r\n 'ALLA', // Allahabad Bank (Merged)\r\n 'ANDB', // Andhra Bank (Merged)\r\n 'SYNB', // Syndicate Bank (Merged)\r\n 'CORP', // Corporation Bank (Merged)\r\n 'VYSA', // ING Vysya (Merged)\r\n 'KKBK', // Kotak Mahindra Bank\r\n 'YESB', // Yes Bank\r\n 'INDB', // IndusInd Bank\r\n 'FDRL', // Federal Bank\r\n]);\r\n","import { BANK_CODES } from '../data/banks';\r\n\r\n/**\r\n * Validates an IFSC Code.\r\n * @param ifsc The 11-character IFSC string.\r\n * @returns True if valid, false otherwise.\r\n */\r\nexport const isValidIFSC = (ifsc: any): boolean => {\r\n // 0. Null/undefined check\r\n if (ifsc == null) return false;\r\n if (typeof ifsc !== 'string') return false;\r\n \r\n // 1. Structure: 4 chars, 0, 6 chars (alphanumeric)\r\n const regex = /^[A-Z]{4}0[A-Z0-9]{6}$/;\r\n if (!regex.test(ifsc)) return false;\r\n\r\n // 2. Knowledge: Check if the Bank Code (first 4 chars) is known\r\n const bankCode = ifsc.substring(0, 4);\r\n\r\n // In strict mode, we only allow known banks.\r\n // In permissive mode (if we hadn't hardcoded), we'd skip.\r\n // For this library, we want high performance validation, so checking the Set is fast.\r\n return BANK_CODES.has(bankCode);\r\n};\r\n","/**\r\n * Mapping of first 2 digits of Pincode to Region/Circle.\r\n */\r\nexport const PINCODE_REGIONS: Record<string, string> = {\r\n '11': 'Delhi',\r\n '12': 'Haryana',\r\n '13': 'Haryana',\r\n '14': 'Punjab',\r\n '15': 'Punjab',\r\n '16': 'Chandigarh',\r\n '17': 'Himachal Pradesh',\r\n '18': 'Jammu & Kashmir',\r\n '19': 'Jammu & Kashmir',\r\n '20': 'Uttar Pradesh',\r\n '21': 'Uttar Pradesh',\r\n '22': 'Uttar Pradesh',\r\n '23': 'Uttar Pradesh',\r\n '24': 'Uttar Pradesh',\r\n '25': 'Uttar Pradesh',\r\n '26': 'Uttar Pradesh',\r\n '27': 'Uttar Pradesh',\r\n '28': 'Uttar Pradesh',\r\n '30': 'Rajasthan',\r\n '31': 'Rajasthan',\r\n '32': 'Rajasthan',\r\n '33': 'Rajasthan',\r\n '34': 'Rajasthan',\r\n '36': 'Gujarat',\r\n '37': 'Gujarat',\r\n '38': 'Gujarat',\r\n '39': 'Gujarat',\r\n '40': 'Maharashtra',\r\n '41': 'Maharashtra',\r\n '42': 'Maharashtra',\r\n '43': 'Maharashtra',\r\n '44': 'Maharashtra',\r\n // ... (Can expand list)\r\n '50': 'Telangana',\r\n '51': 'Andhra Pradesh',\r\n '52': 'Andhra Pradesh',\r\n '53': 'Andhra Pradesh',\r\n '56': 'Karnataka',\r\n '57': 'Karnataka',\r\n '58': 'Karnataka',\r\n '59': 'Karnataka',\r\n '60': 'Tamil Nadu',\r\n '61': 'Tamil Nadu',\r\n '62': 'Tamil Nadu',\r\n '63': 'Tamil Nadu',\r\n '64': 'Tamil Nadu',\r\n '67': 'Kerala',\r\n '68': 'Kerala',\r\n '69': 'Kerala',\r\n '70': 'West Bengal',\r\n '71': 'West Bengal',\r\n '72': 'West Bengal',\r\n '73': 'West Bengal',\r\n '74': 'West Bengal',\r\n '78': 'Assam',\r\n '79': 'North East',\r\n '80': 'Bihar',\r\n '81': 'Bihar',\r\n '82': 'Bihar',\r\n '83': 'Jharkhand',\r\n '84': 'Bihar',\r\n '85': 'Bihar',\r\n '90': 'Army Postal Service',\r\n '99': 'Army Postal Service',\r\n};\r\n","import { PINCODE_REGIONS } from '../data/pincodes';\r\n\r\n/**\r\n * Validates an Indian Pincode.\r\n * @param pincode The 6-digit Pincode string.\r\n * @returns True if valid, false otherwise.\r\n */\r\nexport const isValidPincode = (pincode: any): boolean => {\r\n // 0. Null/undefined check\r\n if (pincode == null) return false;\r\n if (typeof pincode !== 'string') return false;\r\n \r\n // 1. Structure: 6 digits, first digit 1-9\r\n const regex = /^[1-9][0-9]{5}$/;\r\n if (!regex.test(pincode)) return false;\r\n\r\n // 2. Knowledge: Check if the Region (first 2 digits) exists in our map\r\n const regionKey = pincode.substring(0, 2);\r\n return Object.prototype.hasOwnProperty.call(PINCODE_REGIONS, regionKey);\r\n};\r\n\r\nexport interface PincodeInfo {\r\n valid: boolean;\r\n region?: string;\r\n}\r\n\r\n/**\r\n * Extracts metadata from a Pincode.\r\n * @param pincode The Pincode string.\r\n * @returns Object containing validity and region info.\r\n */\r\nexport const getPincodeInfo = (pincode: string): PincodeInfo => {\r\n if (!isValidPincode(pincode)) {\r\n return { valid: false };\r\n }\r\n\r\n const regionKey = pincode.substring(0, 2);\r\n return {\r\n valid: true,\r\n region: PINCODE_REGIONS[regionKey] || 'Unknown Region',\r\n };\r\n};\r\n","/**\r\n * Validates a number string using the Luhn algorithm (Mod 10).\r\n * Used for credit cards, IMEI, etc.\r\n * @param numStr The number string to validate.\r\n * @returns True if valid, false otherwise.\r\n */\r\nexport const validateLuhn = (numStr: any): boolean => {\r\n // Defensive: Handle null/undefined/non-string\r\n if (numStr == null || typeof numStr !== 'string') return false;\r\n if (!/^\\d+$/.test(numStr)) return false;\r\n\r\n let sum = 0;\r\n let shouldDouble = false;\r\n\r\n // Loop through values starting from the rightmost digit\r\n for (let i = numStr.length - 1; i >= 0; i--) {\r\n let digit = parseInt(numStr.charAt(i));\r\n\r\n if (shouldDouble) {\r\n if ((digit *= 2) > 9) digit -= 9;\r\n }\r\n\r\n sum += digit;\r\n shouldDouble = !shouldDouble;\r\n }\r\n\r\n return sum % 10 === 0;\r\n};\r\n\r\n/**\r\n * Validates using Mod 11 algorithm with specified weights.\r\n * @param numStr The number string to validate.\r\n * @param weights The weights array (aligned from right to left).\r\n * @returns True if remainder is 0 (or matches specific check digit logic).\r\n * Note: This is a base implementation, specific IDs often have variations.\r\n */\r\n// export const validateMod11 = ... // Saving for specific implementation needs (PAN/TAN have alpha-numeric logic)\r\n"]}
@@ -0,0 +1,9 @@
1
+ import { z } from 'zod';
2
+
3
+ declare const aadhaarSchema: z.ZodString;
4
+ declare const panSchema: z.ZodString;
5
+ declare const gstinSchema: z.ZodString;
6
+ declare const ifscSchema: z.ZodString;
7
+ declare const pincodeSchema: z.ZodString;
8
+
9
+ export { aadhaarSchema, gstinSchema, ifscSchema, panSchema, pincodeSchema };