india-pincode 2.5.0 → 2.5.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.
package/README.md CHANGED
@@ -1,18 +1,29 @@
1
1
  # india-pincode
2
2
 
3
- Ultra-fast npm package for **165,000+ Indian post offices** — lookup by pincode, state, district, area, coordinates. O(1) HashMap performance. Works **standalone** or as a **NestJS module**.
3
+ Ultra-fast npm package for **165,000+ Indian post offices** — lookup by pincode, state, district, area, coordinates. O(1) HashMap performance. Works everywhere: **React**, **Next.js**, **Node.js**, **NestJS**, and any JavaScript/TypeScript project.
4
+
5
+ ## Works With
6
+
7
+ | Environment | Import |
8
+ |---|---|
9
+ | **React / Vue / Angular / Browser** | `import { getIndiaPincode } from 'india-pincode/browser'` |
10
+ | **Node.js / Express / Fastify** | `import { getIndiaPincode } from 'india-pincode'` |
11
+ | **NestJS** | `import { PincodeModule, PincodeService } from 'india-pincode'` |
12
+ | **Next.js (Server)** | `import { getIndiaPincode } from 'india-pincode'` |
13
+ | **Next.js (Client)** | `import { getIndiaPincode } from 'india-pincode/browser'` |
4
14
 
5
15
  ## Features
6
16
 
17
+ - **Universal** — works in both frontend (React, Vue, Angular) and backend (Node.js, NestJS, Express)
7
18
  - **165,000+ post offices** across **36 states/UTs**, **750 districts**, **19,500+ unique pincodes**
8
19
  - **O(1) lookups** — pincode, state, district, area via pre-built HashMaps
20
+ - **Smart suggestions** — fuzzy "Did you mean?" for typos (`chnadigarh` → `CHANDIGARH`)
9
21
  - **Geo search** — find nearby post offices by lat/lng with bounding-box pruning + Haversine
10
22
  - **Pagination** built-in — `limit`, `page`, `officeType`, `deliveryOnly` filters
11
23
  - **Summary APIs** — get pincode/district/state summaries in one call
12
- - **Error handling** — all responses wrapped in `ApiResponse<T>` with typed error codes
24
+ - **Error handling** — all responses wrapped in `ApiResponse<T>` with typed error codes and suggestions
13
25
  - **Data validation** — sanitized, deduplicated, stripped office suffixes (B.O, S.O, H.O, etc.)
14
26
  - **NestJS module** — `@Global()` module with injectable `PincodeService`
15
- - **Standalone** — zero dependencies for non-NestJS projects
16
27
  - **TypeScript first** — full type definitions, ESM + CJS dual output
17
28
  - **Lazy indexes** — built on first use, cached forever (< 200ms cold start)
18
29
 
@@ -22,6 +33,50 @@ Ultra-fast npm package for **165,000+ Indian post offices** — lookup by pincod
22
33
  npm install india-pincode
23
34
  ```
24
35
 
36
+ ---
37
+
38
+ ## React / Browser Usage
39
+
40
+ ```tsx
41
+ import { useEffect, useState } from 'react';
42
+ import { getIndiaPincode } from 'india-pincode/browser';
43
+
44
+ function PincodeSearch() {
45
+ const [result, setResult] = useState(null);
46
+
47
+ useEffect(() => {
48
+ async function lookup() {
49
+ const pin = await getIndiaPincode(); // async — loads data via fetch
50
+ const res = pin.getByPincode('110001');
51
+ if (res.success) setResult(res.data);
52
+ }
53
+ lookup();
54
+ }, []);
55
+
56
+ return <pre>{JSON.stringify(result, null, 2)}</pre>;
57
+ }
58
+ ```
59
+
60
+ > **Note:** The browser version uses `fetch` + `pako` to decompress data — no Node.js APIs needed. The `getIndiaPincode()` call is **async** (returns a Promise). After initialization, all lookups are synchronous and instant.
61
+
62
+ ---
63
+
64
+ ## Node.js / Express Usage
65
+
66
+ ```typescript
67
+ import { getIndiaPincode } from 'india-pincode';
68
+
69
+ const pin = getIndiaPincode(); // sync — loads data from filesystem
70
+
71
+ // All the same methods work:
72
+ pin.getByPincode('110001');
73
+ pin.getByState('MAHARASHTRA');
74
+ pin.search('Koramangala');
75
+ pin.findNearby(28.6353, 77.225, 5);
76
+ ```
77
+
78
+ ---
79
+
25
80
  ## Quick Start (Standalone)
26
81
 
27
82
  ```typescript
@@ -247,9 +302,9 @@ All lookup methods return `ApiResponse<T>`:
247
302
  |--------|---------|
248
303
  | `getAllStates()` | `string[]` |
249
304
  | `getAllDistricts()` | `string[]` |
250
- | `getDistrictsByState(state)` | `string[]` |
251
- | `getPincodesByState(state)` | `string[]` |
252
- | `getPincodesByDistrict(district)` | `string[]` |
305
+ | `getDistrictsByState(state)` | `ApiResponse<string[]>` |
306
+ | `getPincodesByState(state)` | `ApiResponse<string[]>` |
307
+ | `getPincodesByDistrict(district)` | `ApiResponse<string[]>` |
253
308
 
254
309
  ### Search & Geo
255
310
 
@@ -339,6 +394,39 @@ All data is validated and sanitized at load time:
339
394
  | Subsequent calls | **< 0.05ms** | Everything cached |
340
395
  | Geo nearby (5km) | **~15ms** | Bounding-box pre-filter + Haversine |
341
396
 
397
+ ## Smart Suggestions
398
+
399
+ All error responses include helpful suggestions when possible:
400
+
401
+ ```typescript
402
+ // Typo in state name → fuzzy match
403
+ pin.getByState('chnadigarh');
404
+ // error.suggestions: ['CHANDIGARH']
405
+
406
+ // Area name used as district → cross-index lookup
407
+ pin.getByDistrict('motihari');
408
+ // error.suggestions: ['PURBI CHAMPARAN']
409
+
410
+ // Invalid pincode (too long) → extracts valid substrings
411
+ pin.getByPincode('8454013');
412
+ // error.suggestions: ['845401']
413
+
414
+ // Partial pincode → prefix match
415
+ pin.getByPincode('11000');
416
+ // error.suggestions: ['110001', '110002', '110003', '110007', '110009']
417
+ ```
418
+
419
+ ## Browser vs Node.js — Key Differences
420
+
421
+ | | Node.js | Browser (React, etc.) |
422
+ |---|---|---|
423
+ | **Import** | `from 'india-pincode'` | `from 'india-pincode/browser'` |
424
+ | **Init** | `getIndiaPincode()` (sync) | `await getIndiaPincode()` (async) |
425
+ | **Data loading** | Reads `.gz` file from disk | Fetches `.gz` via `fetch()` |
426
+ | **Decompression** | Node.js `zlib` | `pako` (browser-safe) |
427
+ | **API methods** | Identical | Identical |
428
+ | **Bundle size** | N/A (server) | ~12 KB + 3.3 MB data (loaded on demand) |
429
+
342
430
  ## License
343
431
 
344
432
  MIT
package/dist/browser.js CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var pako=require('pako');var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;var T=(c=>(c.INVALID_PINCODE="INVALID_PINCODE",c.PINCODE_NOT_FOUND="PINCODE_NOT_FOUND",c.STATE_NOT_FOUND="STATE_NOT_FOUND",c.DISTRICT_NOT_FOUND="DISTRICT_NOT_FOUND",c.INVALID_COORDINATES="INVALID_COORDINATES",c.INVALID_INPUT="INVALID_INPUT",c.NO_RESULTS="NO_RESULTS",c))(T||{});var S="INDIA",B=/^[1-9]\d{5}$/;function p(s){return {success:true,data:s}}function u(s,t,i){let n={code:s,message:t};return i&&i.length>0&&(n.suggestions=i,n.message+=` Did you mean: ${i.join(", ")}?`),{success:false,data:null,error:n}}function R(s,t){let i=s.length,n=t.length,r=Array.from({length:i+1},()=>Array(n+1).fill(0));for(let e=0;e<=i;e++)r[e][0]=e;for(let e=0;e<=n;e++)r[0][e]=e;for(let e=1;e<=i;e++)for(let o=1;o<=n;o++)r[e][o]=s[e-1]===t[o-1]?r[e-1][o-1]:1+Math.min(r[e-1][o],r[e][o-1],r[e-1][o-1]);return r[i][n]}function L(s,t,i,n=5){let r=t.toLowerCase(),e=r.split(/\s+/).filter(a=>a.length>=3),o=[],c=r.length<4?0:Math.min(3,Math.ceil(r.length/3));for(let[a,f]of s){if(!a)continue;let g=f[0]?f[0][i]:a,l=0;r.length>=3&&a.includes(r)&&(l+=10);for(let y of e)a.includes(y)&&(l+=3);if(r.length>=4&&r.includes(a)&&(l+=5),l===0){let y=a.split(/\s+/);for(let h of y){let m=R(r,h);if(m<=c){l+=10-m*2;break}}if(l===0&&y.length===1){let h=R(r,a);h<=c&&(l+=10-h*2);}}l>0&&o.push({name:g,score:l});}return o.sort((a,f)=>f.score-a.score).slice(0,n).map(a=>a.name)}function U(s,t,i,n=5){let r=t.toLowerCase();if(r.length<3)return [];let e=new Set,o=new Set;for(let[a,f]of s)if(a===r)for(let g of f)e.add(g[i]);else if(a.includes(r))for(let g of f)o.add(g[i]);let c=Array.from(e);for(let a of o)if(e.has(a)||c.push(a),c.length>=n)break;return c}function O(s,t,i,n,r=5){let e=U(t,i,n,r),o=L(s,i,n,r),c=new Set(e),a=[...e];for(let f of o)if(c.has(f)||(a.push(f),c.add(f)),a.length>=r)break;return a.slice(0,r)}function D(s,t,i=5){let n=t.replace(/\D/g,""),r=new Set;if(n.length>6)for(let e=0;e<=n.length-6;e++){let o=n.substring(e,e+6);if(s.has(o)&&r.add(o),r.size>=i)return Array.from(r)}if(n.length>=3&&n.length<=6){for(let e of s.keys())if(e.startsWith(n)&&r.add(e),r.size>=i)return Array.from(r)}return Array.from(r)}var N=class{constructor(t){this._byPincode=null;this._byState=null;this._byDistrict=null;this._byArea=null;this._data=t;}isValidPincode(t){return typeof t=="string"&&B.test(t.trim())}loadRuntimeData(){return this._data}indexByPincode(){return this._byPincode?this._byPincode:(this._byPincode=this.buildIndex(t=>t.pincode),this._byPincode)}indexByState(){return this._byState?this._byState:(this._byState=this.buildIndex(t=>t.state.toLowerCase()),this._byState)}indexByDistrict(){return this._byDistrict?this._byDistrict:(this._byDistrict=this.buildIndex(t=>t.district.toLowerCase()),this._byDistrict)}indexByArea(){return this._byArea?this._byArea:(this._byArea=this.buildIndex(t=>t.area.toLowerCase()),this._byArea)}buildIndex(t){let i=this.loadRuntimeData(),n=new Map;for(let r=0;r<i.length;r++){let e=t(i[r]);if(!e)continue;let o=n.get(e);o?o.push(i[r]):n.set(e,[i[r]]);}return n}paginate(t,i){let n=Math.max(1,i?.limit??100),r=Math.max(1,i?.page??1),e=t;i?.officeType&&(e=e.filter(g=>g.officeType===i.officeType)),i?.deliveryOnly&&(e=e.filter(g=>g.delivery));let o=e.length,c=Math.ceil(o/n),a=(r-1)*n;return {data:e.slice(a,a+n),total:o,page:r,limit:n,totalPages:c}}getByPincode(t,i){if(!t||typeof t!="string")return u("INVALID_INPUT","Pincode is required and must be a string.");let n=t.trim();if(!this.isValidPincode(n)){let e=D(this.indexByPincode(),n);return u("INVALID_PINCODE",`Invalid pincode "${n}". Indian pincodes must be exactly 6 digits starting with 1-9.`,e)}let r=this.indexByPincode().get(n);if(!r||r.length===0){let e=D(this.indexByPincode(),n);return u("PINCODE_NOT_FOUND",`No data found for pincode "${n}".`,e)}return p(this.paginate(r,i))}getPincodeSummary(t){if(!t||typeof t!="string")return u("INVALID_INPUT","Pincode is required and must be a string.");let i=t.trim();if(!this.isValidPincode(i)){let e=D(this.indexByPincode(),i);return u("INVALID_PINCODE",`Invalid pincode "${i}". Indian pincodes must be exactly 6 digits starting with 1-9.`,e)}let n=this.indexByPincode().get(i);if(!n||n.length===0){let e=D(this.indexByPincode(),i);return u("PINCODE_NOT_FOUND",`No data found for pincode "${i}".`,e)}let r=n[0];return p({pincode:i,district:r.district,state:r.state,country:S,areas:n.map(e=>({pincode:e.pincode,area:e.area,latitude:e.latitude,longitude:e.longitude})),deliveryAreas:n.filter(e=>e.delivery).length,hasCoordinates:n.some(e=>e.latitude!==null)})}getByState(t,i){if(!t||typeof t!="string"||!t.trim())return u("INVALID_INPUT","State name is required and must be a non-empty string.");let n=this.indexByState(),r=n.get(t.trim().toLowerCase());if(!r||r.length===0){let e=O(n,this.indexByArea(),t.trim(),"state");return u("STATE_NOT_FOUND",`No data found for state "${t.trim()}".`,e)}return p(this.paginate(r,i))}getStateSummary(t){if(!t||typeof t!="string"||!t.trim())return u("INVALID_INPUT","State name is required and must be a non-empty string.");let i=this.indexByState(),n=i.get(t.trim().toLowerCase());if(!n||n.length===0){let o=O(i,this.indexByArea(),t.trim(),"state");return u("STATE_NOT_FOUND",`No data found for state "${t.trim()}".`,o)}let r=new Set,e=new Set;for(let o of n)o.district&&r.add(o.district),e.add(o.pincode);return p({state:n[0].state,country:S,totalDistricts:r.size,totalAreas:n.length,totalPincodes:e.size,districts:Array.from(r).sort()})}getAllStates(){let t=this.indexByState();return Array.from(t.keys()).filter(i=>i.length>0).map(i=>{let n=t.get(i);return n?n[0].state:i}).sort()}getByDistrict(t,i){if(!t||typeof t!="string"||!t.trim())return u("INVALID_INPUT","District name is required and must be a non-empty string.");let n=this.indexByDistrict(),r=n.get(t.trim().toLowerCase());if(!r||r.length===0){let e=O(n,this.indexByArea(),t.trim(),"district");return u("DISTRICT_NOT_FOUND",`No data found for district "${t.trim()}".`,e)}return p(this.paginate(r,i))}getDistrictSummary(t){if(!t||typeof t!="string"||!t.trim())return u("INVALID_INPUT","District name is required and must be a non-empty string.");let i=this.indexByDistrict(),n=i.get(t.trim().toLowerCase());if(!n||n.length===0){let e=O(i,this.indexByArea(),t.trim(),"district");return u("DISTRICT_NOT_FOUND",`No data found for district "${t.trim()}".`,e)}let r=new Set;for(let e of n)r.add(e.pincode);return p({district:n[0].district,state:n[0].state,country:S,totalAreas:n.length,totalPincodes:r.size,pincodes:Array.from(r).sort()})}getDistrictsByState(t){if(!t||typeof t!="string"||!t.trim())return u("INVALID_INPUT","State name is required and must be a non-empty string.");let i=this.indexByState(),n=i.get(t.trim().toLowerCase());if(!n||n.length===0){let e=O(i,this.indexByArea(),t.trim(),"state");return u("STATE_NOT_FOUND",`No data found for state "${t.trim()}".`,e)}let r=new Set;for(let e of n)e.district&&r.add(e.district);return p(Array.from(r).sort())}getAllDistricts(){let t=this.indexByDistrict();return Array.from(t.keys()).filter(i=>i.length>0).map(i=>{let n=t.get(i);return n?n[0].district:i}).sort()}getByArea(t,i){if(!t||typeof t!="string"||!t.trim())return u("INVALID_INPUT","Area name is required and must be a non-empty string.");let n=this.indexByArea(),r=n.get(t.trim().toLowerCase());if(!r||r.length===0){let e=L(n,t.trim(),"area");return u("NO_RESULTS",`No data found for area "${t.trim()}".`,e)}return p(this.paginate(r,i))}getPincodesByState(t){if(!t||typeof t!="string"||!t.trim())return u("INVALID_INPUT","State name is required and must be a non-empty string.");let i=this.indexByState(),n=i.get(t.trim().toLowerCase());if(!n||n.length===0){let e=O(i,this.indexByArea(),t.trim(),"state");return u("STATE_NOT_FOUND",`No data found for state "${t.trim()}".`,e)}let r=new Set;for(let e of n)r.add(e.pincode);return p(Array.from(r).sort())}getPincodesByDistrict(t){if(!t||typeof t!="string"||!t.trim())return u("INVALID_INPUT","District name is required and must be a non-empty string.");let i=this.indexByDistrict(),n=i.get(t.trim().toLowerCase());if(!n||n.length===0){let e=O(i,this.indexByArea(),t.trim(),"district");return u("DISTRICT_NOT_FOUND",`No data found for district "${t.trim()}".`,e)}let r=new Set;for(let e of n)r.add(e.pincode);return p(Array.from(r).sort())}search(t,i){if(!t||typeof t!="string"||!t.trim())return u("INVALID_INPUT","Search query is required and must be a non-empty string.");let n=this.loadRuntimeData(),r=t.trim().toLowerCase(),e=Math.max(1,i?.limit??100),o=Math.max(1,i?.page??1),c=i?.officeType,a=i?.deliveryOnly,f=[],g=o*e+e;for(let m=0;m<n.length&&f.length<g;m++){let d=n[m];c&&d.officeType!==c||a&&!d.delivery||(d.pincode.includes(r)||d.area.toLowerCase().includes(r)||d.district.toLowerCase().includes(r)||d.state.toLowerCase().includes(r)||d.circle.toLowerCase().includes(r)||d.region.toLowerCase().includes(r))&&f.push(d);}if(f.length===0)return u("NO_RESULTS",`No results found for "${t.trim()}".`);let l=f.length,y=Math.ceil(l/e),h=(o-1)*e;return p({data:f.slice(h,h+e),total:l,page:o,limit:e,totalPages:y})}findNearby(t,i,n=10,r=20){if(typeof t!="number"||typeof i!="number"||!Number.isFinite(t)||!Number.isFinite(i))return u("INVALID_COORDINATES","Latitude and longitude must be valid numbers.");if(t<-90||t>90||i<-180||i>180)return u("INVALID_COORDINATES",`Invalid coordinates (${t}, ${i}). Latitude must be -90 to 90, longitude -180 to 180.`);let e=this.loadRuntimeData(),o=n/111,c=n/(111*Math.cos(I(t))),a=t-o,f=t+o,g=i-c,l=i+c,y=[];for(let m=0;m<e.length;m++){let d=e[m];if(d.latitude===null||d.longitude===null||d.latitude<a||d.latitude>f||d.longitude<g||d.longitude>l)continue;let x=M(t,i,d.latitude,d.longitude);x<=n&&y.push({...d,distanceKm:Math.round(x*100)/100});}y.sort((m,d)=>m.distanceKm-d.distanceKm);let h=y.slice(0,r);return h.length===0?u("NO_RESULTS",`No post offices found within ${n}km of (${t}, ${i}).`):p(h)}getTotalRecords(){return this.loadRuntimeData().length}getTotalPincodes(){return this.indexByPincode().size}clearCache(){this._byPincode=null,this._byState=null,this._byDistrict=null,this._byArea=null;}};function I(s){return s*(Math.PI/180)}function M(s,t,i,n){let e=I(i-s),o=I(n-t),c=Math.sin(e/2)**2+Math.cos(I(s))*Math.cos(I(i))*Math.sin(o/2)**2;return 6371*2*Math.atan2(Math.sqrt(c),Math.sqrt(1-c))}var E="INDIA",$=/^[1-9]\d{5}$/,V=/\s+\(?(?:B\.?O\.?|S\.?O\.?|H\.?O\.?|P\.?O\.?|G\.?P\.?O\.?|M\.?D\.?G\.?|R\.?M\.?S\.?)\)?\s*$/i,b=null;function F(s){return !s||typeof s!="string"?"":s.replace(V,"").replace(/\s{2,}/g," ").trim()}function P(s){if(s==null)return "";let t=String(s).trim();return t==="NA"?"":t.replace(/\s{2,}/g," ")}function w(s){if(s==null)return null;let t=Number(s);return !Number.isFinite(t)||t===0?null:t}function k(s){return s===null||s>=-90&&s<=90}function q(s){return s===null||s>=-180&&s<=180}function z(s){let t=String(s).replace(/\./g,"").toUpperCase().trim();return ["BO","SO","HO","PO","GPO"].includes(t)?t:"BO"}function Q(s){let t=P(s.p),i=F(P(s.o)),n=P(s.i),r=P(s.s);if(!t||!i||!n||!r||!$.test(t))return null;let e=w(s.a),o=w(s.n);return !k(e)||!q(o)?null:{pincode:t,area:i,officeType:z(s.t),delivery:s.d===1,district:n,state:r,country:E,circle:P(s.c),region:P(s.r),division:P(s.v),latitude:e,longitude:o}}function G(s){return `${s.pincode}|${s.area.toLowerCase()}|${s.district.toLowerCase()}|${s.officeType}`}function j(s){let t=new Set,i=[];for(let n=0;n<s.length;n++){let r=Q(s[n]);if(!r)continue;let e=G(r);t.has(e)||(t.add(e),i.push(r));}return i}async function _(){if(b)return b;let s=new URL("../data/pincodes.json.gz",(typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('browser.js', document.baseURI).href))),t=await fetch(s);if(!t.ok)throw new Error(`india-pincode: failed to load data (${t.status} ${t.statusText})`);let i=new Uint8Array(await t.arrayBuffer()),n=pako.inflate(i),r=new TextDecoder().decode(n),e=JSON.parse(r);return b=j(e),b}function C(){b=null;}var A=null;async function ct(){if(A)return A;let s=await _();return A=new N(s),A}async function ut(){let s=await _();return new N(s)}function dt(){A=null,C();}exports.ErrorCode=T;exports.IndiaPincode=N;exports.clearBrowserCache=dt;exports.createIndiaPincode=ut;exports.getIndiaPincode=ct;//# sourceMappingURL=browser.js.map
1
+ 'use strict';var pako=require('pako');var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;var T=(c=>(c.INVALID_PINCODE="INVALID_PINCODE",c.PINCODE_NOT_FOUND="PINCODE_NOT_FOUND",c.STATE_NOT_FOUND="STATE_NOT_FOUND",c.DISTRICT_NOT_FOUND="DISTRICT_NOT_FOUND",c.INVALID_COORDINATES="INVALID_COORDINATES",c.INVALID_INPUT="INVALID_INPUT",c.NO_RESULTS="NO_RESULTS",c))(T||{});var S="INDIA",B=/^[1-9]\d{5}$/;function p(s){return {success:true,data:s}}function u(s,t,i){let n={code:s,message:t};return i&&i.length>0&&(n.suggestions=i,n.message+=` Did you mean: ${i.join(", ")}?`),{success:false,data:null,error:n}}function R(s,t){let i=s.length,n=t.length,r=Array.from({length:i+1},()=>Array(n+1).fill(0));for(let e=0;e<=i;e++)r[e][0]=e;for(let e=0;e<=n;e++)r[0][e]=e;for(let e=1;e<=i;e++)for(let o=1;o<=n;o++)r[e][o]=s[e-1]===t[o-1]?r[e-1][o-1]:1+Math.min(r[e-1][o],r[e][o-1],r[e-1][o-1]);return r[i][n]}function L(s,t,i,n=5){let r=t.toLowerCase(),e=r.split(/\s+/).filter(a=>a.length>=3),o=[],c=r.length<4?0:Math.min(3,Math.ceil(r.length/3));for(let[a,f]of s){if(!a)continue;let g=f[0]?f[0][i]:a,l=0;r.length>=3&&a.includes(r)&&(l+=10);for(let y of e)a.includes(y)&&(l+=3);if(r.length>=4&&r.includes(a)&&(l+=5),l===0){let y=a.split(/\s+/);for(let h of y){let m=R(r,h);if(m<=c){l+=10-m*2;break}}if(l===0&&y.length===1){let h=R(r,a);h<=c&&(l+=10-h*2);}}l>0&&o.push({name:g,score:l});}return o.sort((a,f)=>f.score-a.score).slice(0,n).map(a=>a.name)}function U(s,t,i,n=5){let r=t.toLowerCase();if(r.length<3)return [];let e=new Set,o=new Set;for(let[a,f]of s)if(a===r)for(let g of f)e.add(g[i]);else if(a.includes(r))for(let g of f)o.add(g[i]);let c=Array.from(e);for(let a of o)if(e.has(a)||c.push(a),c.length>=n)break;return c}function O(s,t,i,n,r=5){let e=U(t,i,n,r),o=L(s,i,n,r),c=new Set(e),a=[...e];for(let f of o)if(c.has(f)||(a.push(f),c.add(f)),a.length>=r)break;return a.slice(0,r)}function D(s,t,i=5){let n=t.replace(/\D/g,""),r=new Set;if(n.length>6)for(let e=0;e<=n.length-6;e++){let o=n.substring(e,e+6);if(s.has(o)&&r.add(o),r.size>=i)return Array.from(r)}if(n.length>=3&&n.length<=6){for(let e of s.keys())if(e.startsWith(n)&&r.add(e),r.size>=i)return Array.from(r)}return Array.from(r)}var N=class{constructor(t){this._byPincode=null;this._byState=null;this._byDistrict=null;this._byArea=null;this._data=t;}isValidPincode(t){return typeof t=="string"&&B.test(t.trim())}loadRuntimeData(){return this._data}indexByPincode(){return this._byPincode?this._byPincode:(this._byPincode=this.buildIndex(t=>t.pincode),this._byPincode)}indexByState(){return this._byState?this._byState:(this._byState=this.buildIndex(t=>t.state.toLowerCase()),this._byState)}indexByDistrict(){return this._byDistrict?this._byDistrict:(this._byDistrict=this.buildIndex(t=>t.district.toLowerCase()),this._byDistrict)}indexByArea(){return this._byArea?this._byArea:(this._byArea=this.buildIndex(t=>t.area.toLowerCase()),this._byArea)}buildIndex(t){let i=this.loadRuntimeData(),n=new Map;for(let r=0;r<i.length;r++){let e=t(i[r]);if(!e)continue;let o=n.get(e);o?o.push(i[r]):n.set(e,[i[r]]);}return n}paginate(t,i){let n=Math.max(1,i?.limit??100),r=Math.max(1,i?.page??1),e=t;i?.officeType&&(e=e.filter(g=>g.officeType===i.officeType)),i?.deliveryOnly&&(e=e.filter(g=>g.delivery));let o=e.length,c=Math.ceil(o/n),a=(r-1)*n;return {data:e.slice(a,a+n),total:o,page:r,limit:n,totalPages:c}}getByPincode(t,i){if(!t||typeof t!="string")return u("INVALID_INPUT","Pincode is required and must be a string.");let n=t.trim();if(!this.isValidPincode(n)){let e=D(this.indexByPincode(),n);return u("INVALID_PINCODE",`Invalid pincode "${n}". Indian pincodes must be exactly 6 digits starting with 1-9.`,e)}let r=this.indexByPincode().get(n);if(!r||r.length===0){let e=D(this.indexByPincode(),n);return u("PINCODE_NOT_FOUND",`No data found for pincode "${n}".`,e)}return p(this.paginate(r,i))}getPincodeSummary(t){if(!t||typeof t!="string")return u("INVALID_INPUT","Pincode is required and must be a string.");let i=t.trim();if(!this.isValidPincode(i)){let e=D(this.indexByPincode(),i);return u("INVALID_PINCODE",`Invalid pincode "${i}". Indian pincodes must be exactly 6 digits starting with 1-9.`,e)}let n=this.indexByPincode().get(i);if(!n||n.length===0){let e=D(this.indexByPincode(),i);return u("PINCODE_NOT_FOUND",`No data found for pincode "${i}".`,e)}let r=n[0];return p({pincode:i,district:r.district,state:r.state,country:S,areas:n.map(e=>({pincode:e.pincode,area:e.area,latitude:e.latitude,longitude:e.longitude})),deliveryAreas:n.filter(e=>e.delivery).length,hasCoordinates:n.some(e=>e.latitude!==null)})}getByState(t,i){if(!t||typeof t!="string"||!t.trim())return u("INVALID_INPUT","State name is required and must be a non-empty string.");let n=this.indexByState(),r=n.get(t.trim().toLowerCase());if(!r||r.length===0){let e=O(n,this.indexByArea(),t.trim(),"state");return u("STATE_NOT_FOUND",`No data found for state "${t.trim()}".`,e)}return p(this.paginate(r,i))}getStateSummary(t){if(!t||typeof t!="string"||!t.trim())return u("INVALID_INPUT","State name is required and must be a non-empty string.");let i=this.indexByState(),n=i.get(t.trim().toLowerCase());if(!n||n.length===0){let o=O(i,this.indexByArea(),t.trim(),"state");return u("STATE_NOT_FOUND",`No data found for state "${t.trim()}".`,o)}let r=new Set,e=new Set;for(let o of n)o.district&&r.add(o.district),e.add(o.pincode);return p({state:n[0].state,country:S,totalDistricts:r.size,totalAreas:n.length,totalPincodes:e.size,districts:Array.from(r).sort()})}getAllStates(){let t=this.indexByState();return Array.from(t.keys()).filter(i=>i.length>0).map(i=>{let n=t.get(i);return n?n[0].state:i}).sort()}getByDistrict(t,i){if(!t||typeof t!="string"||!t.trim())return u("INVALID_INPUT","District name is required and must be a non-empty string.");let n=this.indexByDistrict(),r=n.get(t.trim().toLowerCase());if(!r||r.length===0){let e=O(n,this.indexByArea(),t.trim(),"district");return u("DISTRICT_NOT_FOUND",`No data found for district "${t.trim()}".`,e)}return p(this.paginate(r,i))}getDistrictSummary(t){if(!t||typeof t!="string"||!t.trim())return u("INVALID_INPUT","District name is required and must be a non-empty string.");let i=this.indexByDistrict(),n=i.get(t.trim().toLowerCase());if(!n||n.length===0){let e=O(i,this.indexByArea(),t.trim(),"district");return u("DISTRICT_NOT_FOUND",`No data found for district "${t.trim()}".`,e)}let r=new Set;for(let e of n)r.add(e.pincode);return p({district:n[0].district,state:n[0].state,country:S,totalAreas:n.length,totalPincodes:r.size,pincodes:Array.from(r).sort()})}getDistrictsByState(t){if(!t||typeof t!="string"||!t.trim())return u("INVALID_INPUT","State name is required and must be a non-empty string.");let i=this.indexByState(),n=i.get(t.trim().toLowerCase());if(!n||n.length===0){let e=O(i,this.indexByArea(),t.trim(),"state");return u("STATE_NOT_FOUND",`No data found for state "${t.trim()}".`,e)}let r=new Set;for(let e of n)e.district&&r.add(e.district);return p(Array.from(r).sort())}getAllDistricts(){let t=this.indexByDistrict();return Array.from(t.keys()).filter(i=>i.length>0).map(i=>{let n=t.get(i);return n?n[0].district:i}).sort()}getByArea(t,i){if(!t||typeof t!="string"||!t.trim())return u("INVALID_INPUT","Area name is required and must be a non-empty string.");let n=this.indexByArea(),r=n.get(t.trim().toLowerCase());if(!r||r.length===0){let e=L(n,t.trim(),"area");return u("NO_RESULTS",`No data found for area "${t.trim()}".`,e)}return p(this.paginate(r,i))}getPincodesByState(t){if(!t||typeof t!="string"||!t.trim())return u("INVALID_INPUT","State name is required and must be a non-empty string.");let i=this.indexByState(),n=i.get(t.trim().toLowerCase());if(!n||n.length===0){let e=O(i,this.indexByArea(),t.trim(),"state");return u("STATE_NOT_FOUND",`No data found for state "${t.trim()}".`,e)}let r=new Set;for(let e of n)r.add(e.pincode);return p(Array.from(r).sort())}getPincodesByDistrict(t){if(!t||typeof t!="string"||!t.trim())return u("INVALID_INPUT","District name is required and must be a non-empty string.");let i=this.indexByDistrict(),n=i.get(t.trim().toLowerCase());if(!n||n.length===0){let e=O(i,this.indexByArea(),t.trim(),"district");return u("DISTRICT_NOT_FOUND",`No data found for district "${t.trim()}".`,e)}let r=new Set;for(let e of n)r.add(e.pincode);return p(Array.from(r).sort())}search(t,i){if(!t||typeof t!="string"||!t.trim())return u("INVALID_INPUT","Search query is required and must be a non-empty string.");let n=this.loadRuntimeData(),r=t.trim().toLowerCase(),e=Math.max(1,i?.limit??100),o=Math.max(1,i?.page??1),c=i?.officeType,a=i?.deliveryOnly,f=[],g=o*e+e;for(let m=0;m<n.length&&f.length<g;m++){let d=n[m];c&&d.officeType!==c||a&&!d.delivery||(d.pincode.includes(r)||d.area.toLowerCase().includes(r)||d.district.toLowerCase().includes(r)||d.state.toLowerCase().includes(r)||d.circle.toLowerCase().includes(r)||d.region.toLowerCase().includes(r))&&f.push(d);}if(f.length===0)return u("NO_RESULTS",`No results found for "${t.trim()}".`);let l=f.length,y=Math.ceil(l/e),h=(o-1)*e;return p({data:f.slice(h,h+e),total:l,page:o,limit:e,totalPages:y})}findNearby(t,i,n=10,r=20){if(typeof t!="number"||typeof i!="number"||!Number.isFinite(t)||!Number.isFinite(i))return u("INVALID_COORDINATES","Latitude and longitude must be valid numbers.");if(t<-90||t>90||i<-180||i>180)return u("INVALID_COORDINATES",`Invalid coordinates (${t}, ${i}). Latitude must be -90 to 90, longitude -180 to 180.`);let e=this.loadRuntimeData(),o=n/111,c=n/(111*Math.cos(I(t))),a=t-o,f=t+o,g=i-c,l=i+c,y=[];for(let m=0;m<e.length;m++){let d=e[m];if(d.latitude===null||d.longitude===null||d.latitude<a||d.latitude>f||d.longitude<g||d.longitude>l)continue;let x=M(t,i,d.latitude,d.longitude);x<=n&&y.push({...d,distanceKm:Math.round(x*100)/100});}y.sort((m,d)=>m.distanceKm-d.distanceKm);let h=y.slice(0,r);return h.length===0?u("NO_RESULTS",`No post offices found within ${n}km of (${t}, ${i}).`):p(h)}getTotalRecords(){return this.loadRuntimeData().length}getTotalPincodes(){return this.indexByPincode().size}clearCache(){this._byPincode=null,this._byState=null,this._byDistrict=null,this._byArea=null;}};function I(s){return s*(Math.PI/180)}function M(s,t,i,n){let e=I(i-s),o=I(n-t),c=Math.sin(e/2)**2+Math.cos(I(s))*Math.cos(I(i))*Math.sin(o/2)**2;return 6371*2*Math.atan2(Math.sqrt(c),Math.sqrt(1-c))}var E="INDIA",$=/^[1-9]\d{5}$/,V=/\s+\(?(?:B\.?O\.?|S\.?O\.?|H\.?O\.?|P\.?O\.?|G\.?P\.?O\.?|M\.?D\.?G\.?|R\.?M\.?S\.?)\)?\s*$/i,b=null;function F(s){return !s||typeof s!="string"?"":s.replace(V,"").replace(/\s{2,}/g," ").trim()}function P(s){if(s==null)return "";let t=String(s).trim();return t==="NA"?"":t.replace(/\s{2,}/g," ")}function w(s){if(s==null)return null;let t=Number(s);return !Number.isFinite(t)||t===0?null:t}function k(s){return s===null||s>=-90&&s<=90}function q(s){return s===null||s>=-180&&s<=180}function z(s){let t=String(s).replace(/\./g,"").toUpperCase().trim();return ["BO","SO","HO","PO","GPO"].includes(t)?t:"BO"}function Q(s){let t=P(s.p),i=F(P(s.o)),n=P(s.i),r=P(s.s);if(!t||!i||!n||!r||!$.test(t))return null;let e=w(s.a),o=w(s.n);return !k(e)||!q(o)?null:{pincode:t,area:i,officeType:z(s.t),delivery:s.d===1,district:n,state:r,country:E,circle:P(s.c),region:P(s.r),division:P(s.v),latitude:e,longitude:o}}function G(s){return `${s.pincode}|${s.area.toLowerCase()}|${s.district.toLowerCase()}|${s.officeType}`}function j(s){let t=new Set,i=[];for(let n=0;n<s.length;n++){let r=Q(s[n]);if(!r)continue;let e=G(r);t.has(e)||(t.add(e),i.push(r));}return i}async function _(){if(b)return b;let s=new URL("../data/pincodes.json.gz",(typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('browser.js', document.baseURI).href))),t=await fetch(s);if(!t.ok)throw new Error(`india-pincode: failed to load data (${t.status} ${t.statusText})`);let i=new Uint8Array(await t.arrayBuffer()),n=pako.ungzip(i),r=new TextDecoder().decode(n),e=JSON.parse(r);return b=j(e),b}function C(){b=null;}var A=null;async function ct(){if(A)return A;let s=await _();return A=new N(s),A}async function ut(){let s=await _();return new N(s)}function dt(){A=null,C();}exports.ErrorCode=T;exports.IndiaPincode=N;exports.clearBrowserCache=dt;exports.createIndiaPincode=ut;exports.getIndiaPincode=ct;//# sourceMappingURL=browser.js.map
2
2
  //# sourceMappingURL=browser.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts","../src/pincode-lookup.ts","../src/data-loader.browser.ts","../src/browser.ts"],"names":["ErrorCode","COUNTRY","PINCODE_REGEX","ok","data","fail","code","message","suggestions","error","levenshtein","a","b","m","dp","i","j","findSimilar","index","query","field","max","q","words","w","scored","maxDist","key","records","originalName","score","word","keyWords","kw","dist","s","findFromAreas","areaIndex","exact","partial","r","results","p","mergeSuggestions","fromAreas","fromIndex","seen","merged","findSimilarPincodes","input","digits","candidate","IndiaPincode","pincode","o","keyFn","arr","options","limit","page","filtered","total","totalPages","start","trimmed","first","state","stateIndex","districtSet","pincodeSet","idx","district","districtIndex","set","d","name","officeType","deliveryOnly","matches","maxScan","lat","lng","radiusKm","dLat","dLng","toRad","minLat","maxLat","minLng","maxLng","haversine","sliced","deg","lat1","lon1","lat2","lon2","dLon","OFFICE_SUFFIX_REGEX","cachedData","sanitizeCityName","raw","trimStr","val","safeNum","n","isValidLatitude","isValidLongitude","normalizeOfficeType","upper","expand","rec","area","latitude","longitude","dedupKey","normalize","result","record","loadBrowserData","url","response","compressed","inflated","inflate","json","clearBrowserDataCache","_browserInstance","getIndiaPincode","createIndiaPincode","clearBrowserCache"],"mappings":"2HACO,IAAKA,OACVA,CAAAA,CAAA,eAAA,CAAkB,iBAAA,CAClBA,CAAAA,CAAA,kBAAoB,mBAAA,CACpBA,CAAAA,CAAA,eAAA,CAAkB,iBAAA,CAClBA,EAAA,kBAAA,CAAqB,oBAAA,CACrBA,EAAA,mBAAA,CAAsB,qBAAA,CACtBA,EAAA,aAAA,CAAgB,eAAA,CAChBA,CAAAA,CAAA,UAAA,CAAa,aAPHA,CAAAA,CAAAA,EAAAA,CAAAA,EAAA,EAAA,ECWZ,IAAMC,CAAAA,CAAU,QACVC,CAAAA,CAAgB,cAAA,CAItB,SAASC,CAAAA,CAAMC,EAAyB,CACtC,OAAO,CAAE,OAAA,CAAS,IAAA,CAAM,KAAAA,CAAK,CAC/B,CAEA,SAASC,EAAQC,CAAAA,CAAiBC,CAAAA,CAAiBC,CAAAA,CAAwC,CACzF,IAAMC,CAAAA,CAAsE,CAAE,IAAA,CAAAH,CAAAA,CAAM,QAAAC,CAAQ,CAAA,CAC5F,OAAIC,CAAAA,EAAeA,CAAAA,CAAY,OAAS,CAAA,GACtCC,CAAAA,CAAM,WAAA,CAAcD,CAAAA,CACpBC,EAAM,OAAA,EAAW,CAAA,eAAA,EAAkBD,CAAAA,CAAY,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAEpD,CAAE,OAAA,CAAS,MAAO,IAAA,CAAM,IAAA,CAAM,MAAAC,CAAM,CAC7C,CAGA,SAASC,CAAAA,CAAYC,CAAAA,CAAWC,CAAAA,CAAmB,CACjD,IAAMC,CAAAA,CAAIF,CAAAA,CAAE,MAAA,CAAQ,EAAIC,CAAAA,CAAE,MAAA,CACpBE,CAAAA,CAAiB,KAAA,CAAM,KAAK,CAAE,MAAA,CAAQD,EAAI,CAAE,CAAA,CAAG,IAAM,KAAA,CAAM,CAAA,CAAI,CAAC,CAAA,CAAE,KAAK,CAAC,CAAC,CAAA,CAC/E,IAAA,IAASE,EAAI,CAAA,CAAGA,CAAAA,EAAKF,CAAAA,CAAGE,CAAAA,EAAAA,CAAKD,EAAGC,CAAC,CAAA,CAAE,CAAC,CAAA,CAAIA,CAAAA,CACxC,QAASC,CAAAA,CAAI,CAAA,CAAGA,CAAAA,EAAK,CAAA,CAAGA,IAAKF,CAAAA,CAAG,CAAC,CAAA,CAAEE,CAAC,EAAIA,CAAAA,CACxC,IAAA,IAASD,CAAAA,CAAI,CAAA,CAAGA,GAAKF,CAAAA,CAAGE,CAAAA,EAAAA,CACtB,QAASC,CAAAA,CAAI,CAAA,CAAGA,GAAK,CAAA,CAAGA,CAAAA,EAAAA,CACtBF,CAAAA,CAAGC,CAAC,EAAEC,CAAC,CAAA,CAAIL,EAAEI,CAAAA,CAAI,CAAC,IAAMH,CAAAA,CAAEI,CAAAA,CAAI,CAAC,CAAA,CAC3BF,EAAGC,CAAAA,CAAI,CAAC,EAAEC,CAAAA,CAAI,CAAC,EACf,CAAA,CAAI,IAAA,CAAK,GAAA,CAAIF,CAAAA,CAAGC,EAAI,CAAC,CAAA,CAAEC,CAAC,CAAA,CAAGF,EAAGC,CAAC,CAAA,CAAEC,CAAAA,CAAI,CAAC,EAAGF,CAAAA,CAAGC,CAAAA,CAAI,CAAC,CAAA,CAAEC,CAAAA,CAAI,CAAC,CAAC,CAAA,CAGjE,OAAOF,CAAAA,CAAGD,CAAC,CAAA,CAAE,CAAC,CAChB,CAMA,SAASI,CAAAA,CACPC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAC,EAAM,CAAA,CACI,CACV,IAAMC,CAAAA,CAAIH,CAAAA,CAAM,aAAY,CACtBI,CAAAA,CAAQD,CAAAA,CAAE,KAAA,CAAM,KAAK,CAAA,CAAE,MAAA,CAAQE,CAAAA,EAAMA,CAAAA,CAAE,QAAU,CAAC,CAAA,CAClDC,CAAAA,CAA4C,GAE5CC,CAAAA,CAAUJ,CAAAA,CAAE,OAAS,CAAA,CAAI,CAAA,CAAI,KAAK,GAAA,CAAI,CAAA,CAAG,IAAA,CAAK,IAAA,CAAKA,EAAE,MAAA,CAAS,CAAC,CAAC,CAAA,CAEtE,OAAW,CAACK,CAAAA,CAAKC,CAAO,CAAA,GAAKV,EAAO,CAClC,GAAI,CAACS,CAAAA,CAAK,SACV,IAAME,CAAAA,CAAeD,CAAAA,CAAQ,CAAC,CAAA,CAAIA,EAAQ,CAAC,CAAA,CAAER,CAAK,CAAA,CAAIO,EAElDG,CAAAA,CAAQ,CAAA,CAGRR,CAAAA,CAAE,MAAA,EAAU,GAAKK,CAAAA,CAAI,QAAA,CAASL,CAAC,CAAA,GACjCQ,CAAAA,EAAS,IAIX,IAAA,IAAWC,CAAAA,IAAQR,CAAAA,CACbI,CAAAA,CAAI,SAASI,CAAI,CAAA,GAAGD,CAAAA,EAAS,CAAA,CAAA,CAOnC,GAHIR,CAAAA,CAAE,MAAA,EAAU,CAAA,EAAKA,CAAAA,CAAE,SAASK,CAAG,CAAA,GAAGG,GAAS,CAAA,CAAA,CAG3CA,CAAAA,GAAU,EAAG,CACf,IAAME,CAAAA,CAAWL,CAAAA,CAAI,MAAM,KAAK,CAAA,CAChC,IAAA,IAAWM,CAAAA,IAAMD,EAAU,CACzB,IAAME,CAAAA,CAAOxB,CAAAA,CAAYY,EAAGW,CAAE,CAAA,CAC9B,GAAIC,CAAAA,EAAQR,CAAAA,CAAS,CACnBI,CAAAA,EAAU,EAAA,CAAKI,CAAAA,CAAO,CAAA,CACtB,KACF,CACF,CAEA,GAAIJ,CAAAA,GAAU,CAAA,EAAKE,EAAS,MAAA,GAAW,CAAA,CAAG,CACxC,IAAME,EAAOxB,CAAAA,CAAYY,CAAAA,CAAGK,CAAG,CAAA,CAC3BO,CAAAA,EAAQR,IACVI,CAAAA,EAAU,EAAA,CAAKI,CAAAA,CAAO,CAAA,EAE1B,CACF,CAEIJ,CAAAA,CAAQ,CAAA,EACVL,CAAAA,CAAO,KAAK,CAAE,IAAA,CAAMI,CAAAA,CAAc,KAAA,CAAAC,CAAM,CAAC,EAE7C,CAEA,OAAOL,CAAAA,CACJ,KAAK,CAAC,CAAA,CAAGb,CAAAA,GAAMA,CAAAA,CAAE,MAAQ,CAAA,CAAE,KAAK,CAAA,CAChC,KAAA,CAAM,EAAGS,CAAG,CAAA,CACZ,GAAA,CAAKc,CAAAA,EAAMA,EAAE,IAAI,CACtB,CAOA,SAASC,CAAAA,CACPC,EACAlB,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CAAM,CAAA,CACI,CACV,IAAMC,CAAAA,CAAIH,CAAAA,CAAM,WAAA,GAChB,GAAIG,CAAAA,CAAE,MAAA,CAAS,CAAA,CAAG,OAAO,EAAC,CAC1B,IAAMgB,CAAAA,CAAQ,IAAI,IACZC,CAAAA,CAAU,IAAI,GAAA,CAEpB,IAAA,GAAW,CAACZ,CAAAA,CAAKC,CAAO,CAAA,GAAKS,CAAAA,CAC3B,GAAIV,CAAAA,GAAQL,CAAAA,CACV,IAAA,IAAWkB,CAAAA,IAAKZ,EAASU,CAAAA,CAAM,GAAA,CAAIE,EAAEpB,CAAK,CAAC,UAClCO,CAAAA,CAAI,QAAA,CAASL,CAAC,CAAA,CACvB,QAAWkB,CAAAA,IAAKZ,CAAAA,CAASW,CAAAA,CAAQ,GAAA,CAAIC,EAAEpB,CAAK,CAAC,CAAA,CAKjD,IAAMqB,EAAoB,KAAA,CAAM,IAAA,CAAKH,CAAK,CAAA,CAC1C,IAAA,IAAWI,KAAKH,CAAAA,CAEd,GADKD,CAAAA,CAAM,GAAA,CAAII,CAAC,CAAA,EAAGD,CAAAA,CAAQ,IAAA,CAAKC,CAAC,EAC7BD,CAAAA,CAAQ,MAAA,EAAUpB,CAAAA,CAAK,MAG7B,OAAOoB,CACT,CAMA,SAASE,CAAAA,CACPzB,CAAAA,CACAmB,EACAlB,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CAAM,CAAA,CACI,CACV,IAAMuB,CAAAA,CAAYR,CAAAA,CAAcC,CAAAA,CAAWlB,EAAOC,CAAAA,CAAOC,CAAG,CAAA,CACtDwB,CAAAA,CAAY5B,EAAYC,CAAAA,CAAOC,CAAAA,CAAOC,EAAOC,CAAG,CAAA,CAChDyB,EAAO,IAAI,GAAA,CAAIF,CAAS,CAAA,CACxBG,EAAS,CAAC,GAAGH,CAAS,CAAA,CAC5B,IAAA,IAAWT,KAAKU,CAAAA,CAKd,GAJKC,CAAAA,CAAK,GAAA,CAAIX,CAAC,CAAA,GACbY,CAAAA,CAAO,KAAKZ,CAAC,CAAA,CACbW,EAAK,GAAA,CAAIX,CAAC,CAAA,CAAA,CAERY,CAAAA,CAAO,QAAU1B,CAAAA,CAAK,MAE5B,OAAO0B,CAAAA,CAAO,MAAM,CAAA,CAAG1B,CAAG,CAC5B,CAQA,SAAS2B,CAAAA,CACP9B,CAAAA,CACA+B,EACA5B,CAAAA,CAAM,CAAA,CACI,CACV,IAAM6B,CAAAA,CAASD,CAAAA,CAAM,OAAA,CAAQ,MAAO,EAAE,CAAA,CAChCR,CAAAA,CAAU,IAAI,IAGpB,GAAIS,CAAAA,CAAO,MAAA,CAAS,CAAA,CAClB,QAASnC,CAAAA,CAAI,CAAA,CAAGA,GAAKmC,CAAAA,CAAO,MAAA,CAAS,EAAGnC,CAAAA,EAAAA,CAAK,CAC3C,IAAMoC,CAAAA,CAAYD,EAAO,SAAA,CAAUnC,CAAAA,CAAGA,CAAAA,CAAI,CAAC,EAE3C,GADIG,CAAAA,CAAM,GAAA,CAAIiC,CAAS,GAAGV,CAAAA,CAAQ,GAAA,CAAIU,CAAS,CAAA,CAC3CV,CAAAA,CAAQ,MAAQpB,CAAAA,CAAK,OAAO,KAAA,CAAM,IAAA,CAAKoB,CAAO,CACpD,CAIF,GAAIS,CAAAA,CAAO,MAAA,EAAU,GAAKA,CAAAA,CAAO,MAAA,EAAU,CAAA,CAAA,CACzC,IAAA,IAAWvB,KAAOT,CAAAA,CAAM,IAAA,GAEtB,GADIS,CAAAA,CAAI,WAAWuB,CAAM,CAAA,EAAGT,CAAAA,CAAQ,GAAA,CAAId,CAAG,CAAA,CACvCc,CAAAA,CAAQ,IAAA,EAAQpB,CAAAA,CAAK,OAAO,KAAA,CAAM,IAAA,CAAKoB,CAAO,CAAA,CAItD,OAAO,KAAA,CAAM,IAAA,CAAKA,CAAO,CAC3B,KAMaW,CAAAA,CAAN,KAAmB,CASxB,WAAA,CAAYhD,EAAoB,CALhC,IAAA,CAAQ,UAAA,CAA+C,IAAA,CACvD,KAAQ,QAAA,CAA6C,IAAA,CACrD,IAAA,CAAQ,WAAA,CAAgD,KACxD,IAAA,CAAQ,OAAA,CAA4C,KAGlD,IAAA,CAAK,KAAA,CAAQA,EACf,CAEQ,cAAA,CAAeiD,CAAAA,CAA0B,CAC/C,OAAO,OAAOA,CAAAA,EAAY,QAAA,EAAYnD,CAAAA,CAAc,KAAKmD,CAAAA,CAAQ,IAAA,EAAM,CACzE,CAEQ,eAAA,EAAgC,CACtC,OAAO,IAAA,CAAK,KACd,CAGQ,cAAA,EAA4C,CAClD,OAAI,IAAA,CAAK,WAAmB,IAAA,CAAK,UAAA,EACjC,KAAK,UAAA,CAAa,IAAA,CAAK,WAAYC,CAAAA,EAAMA,CAAAA,CAAE,OAAO,CAAA,CAC3C,KAAK,UAAA,CACd,CAEQ,cAA0C,CAChD,OAAI,KAAK,QAAA,CAAiB,IAAA,CAAK,QAAA,EAC/B,IAAA,CAAK,SAAW,IAAA,CAAK,UAAA,CAAYA,CAAAA,EAAMA,CAAAA,CAAE,MAAM,WAAA,EAAa,CAAA,CACrD,IAAA,CAAK,SACd,CAEQ,eAAA,EAA6C,CACnD,OAAI,IAAA,CAAK,YAAoB,IAAA,CAAK,WAAA,EAClC,IAAA,CAAK,WAAA,CAAc,KAAK,UAAA,CAAYA,CAAAA,EAAMA,CAAAA,CAAE,QAAA,CAAS,aAAa,CAAA,CAC3D,IAAA,CAAK,WAAA,CACd,CAEQ,WAAA,EAAyC,CAC/C,OAAI,IAAA,CAAK,OAAA,CAAgB,KAAK,OAAA,EAC9B,IAAA,CAAK,OAAA,CAAU,IAAA,CAAK,WAAYA,CAAAA,EAAMA,CAAAA,CAAE,IAAA,CAAK,WAAA,EAAa,CAAA,CACnD,IAAA,CAAK,OAAA,CACd,CAEQ,WAAWC,CAAAA,CAA6D,CAC9E,IAAMnD,CAAAA,CAAO,IAAA,CAAK,iBAAgB,CAC5Bc,CAAAA,CAAQ,IAAI,GAAA,CAClB,QAASH,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIX,CAAAA,CAAK,OAAQW,CAAAA,EAAAA,CAAK,CACpC,IAAMY,CAAAA,CAAM4B,EAAMnD,CAAAA,CAAKW,CAAC,CAAC,CAAA,CACzB,GAAI,CAACY,CAAAA,CAAK,SACV,IAAM6B,CAAAA,CAAMtC,EAAM,GAAA,CAAIS,CAAG,CAAA,CACrB6B,CAAAA,CAAKA,EAAI,IAAA,CAAKpD,CAAAA,CAAKW,CAAC,CAAC,EACpBG,CAAAA,CAAM,GAAA,CAAIS,EAAK,CAACvB,CAAAA,CAAKW,CAAC,CAAC,CAAC,EAC/B,CACA,OAAOG,CACT,CAGQ,QAAA,CACNU,CAAAA,CACA6B,EAC6B,CAC7B,IAAMC,CAAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,CAAGD,CAAAA,EAAS,OAAS,GAAG,CAAA,CACzCE,EAAO,IAAA,CAAK,GAAA,CAAI,CAAA,CAAGF,CAAAA,EAAS,MAAQ,CAAC,CAAA,CACvCG,CAAAA,CAAWhC,CAAAA,CAEX6B,GAAS,UAAA,GACXG,CAAAA,CAAWA,CAAAA,CAAS,MAAA,CAAQpB,GAAMA,CAAAA,CAAE,UAAA,GAAeiB,EAAQ,UAAU,CAAA,CAAA,CAEnEA,GAAS,YAAA,GACXG,CAAAA,CAAWA,CAAAA,CAAS,MAAA,CAAQpB,GAAMA,CAAAA,CAAE,QAAQ,GAG9C,IAAMqB,CAAAA,CAAQD,EAAS,MAAA,CACjBE,CAAAA,CAAa,IAAA,CAAK,IAAA,CAAKD,EAAQH,CAAK,CAAA,CACpCK,GAASJ,CAAAA,CAAO,CAAA,EAAKD,EAG3B,OAAO,CAAE,IAAA,CAFIE,CAAAA,CAAS,MAAMG,CAAAA,CAAOA,CAAAA,CAAQL,CAAK,CAAA,CAEjC,MAAAG,CAAAA,CAAO,IAAA,CAAAF,CAAAA,CAAM,KAAA,CAAAD,EAAO,UAAA,CAAAI,CAAW,CAChD,CASA,YAAA,CAAaT,EAAiBI,CAAAA,CAAkE,CAC9F,GAAI,CAACJ,GAAW,OAAOA,CAAAA,EAAY,QAAA,CACjC,OAAOhD,kBAA8B,2CAA2C,CAAA,CAGlF,IAAM2D,CAAAA,CAAUX,EAAQ,IAAA,EAAK,CAC7B,GAAI,CAAC,IAAA,CAAK,eAAeW,CAAO,CAAA,CAAG,CACjC,IAAMxD,EAAcwC,CAAAA,CAAoB,IAAA,CAAK,cAAA,EAAe,CAAGgB,CAAO,CAAA,CACtE,OAAO3D,CAAAA,CAAAA,iBAAAA,CAEL,CAAA,iBAAA,EAAoB2D,CAAO,CAAA,8DAAA,CAAA,CAC3BxD,CACF,CACF,CAEA,IAAMoB,EAAU,IAAA,CAAK,cAAA,EAAe,CAAE,GAAA,CAAIoC,CAAO,CAAA,CACjD,GAAI,CAACpC,CAAAA,EAAWA,CAAAA,CAAQ,SAAW,CAAA,CAAG,CACpC,IAAMpB,CAAAA,CAAcwC,EAAoB,IAAA,CAAK,cAAA,GAAkBgB,CAAO,CAAA,CACtE,OAAO3D,CAAAA,CAAAA,mBAAAA,CAAkC,CAAA,2BAAA,EAA8B2D,CAAO,CAAA,EAAA,CAAA,CAAMxD,CAAW,CACjG,CAEA,OAAOL,CAAAA,CAAG,KAAK,QAAA,CAASyB,CAAAA,CAAS6B,CAAO,CAAC,CAC3C,CAGA,iBAAA,CAAkBJ,EAA8C,CAC9D,GAAI,CAACA,CAAAA,EAAW,OAAOA,CAAAA,EAAY,QAAA,CACjC,OAAOhD,CAAAA,CAAAA,eAAAA,CAA8B,2CAA2C,CAAA,CAGlF,IAAM2D,EAAUX,CAAAA,CAAQ,IAAA,EAAK,CAC7B,GAAI,CAAC,IAAA,CAAK,cAAA,CAAeW,CAAO,CAAA,CAAG,CACjC,IAAMxD,CAAAA,CAAcwC,CAAAA,CAAoB,IAAA,CAAK,cAAA,GAAkBgB,CAAO,CAAA,CACtE,OAAO3D,CAAAA,CAAAA,iBAAAA,CAEL,oBAAoB2D,CAAO,CAAA,8DAAA,CAAA,CAC3BxD,CACF,CACF,CAEA,IAAMoB,CAAAA,CAAU,KAAK,cAAA,EAAe,CAAE,IAAIoC,CAAO,CAAA,CACjD,GAAI,CAACpC,GAAWA,CAAAA,CAAQ,MAAA,GAAW,EAAG,CACpC,IAAMpB,EAAcwC,CAAAA,CAAoB,IAAA,CAAK,cAAA,EAAe,CAAGgB,CAAO,CAAA,CACtE,OAAO3D,sBAAkC,CAAA,2BAAA,EAA8B2D,CAAO,KAAMxD,CAAW,CACjG,CAEA,IAAMyD,EAAQrC,CAAAA,CAAQ,CAAC,CAAA,CACvB,OAAOzB,EAAG,CACR,OAAA,CAAS6D,CAAAA,CACT,QAAA,CAAUC,EAAM,QAAA,CAChB,KAAA,CAAOA,EAAM,KAAA,CACb,OAAA,CAAShE,EACT,KAAA,CAAO2B,CAAAA,CAAQ,GAAA,CAAKY,CAAAA,GAAO,CACzB,OAAA,CAASA,CAAAA,CAAE,OAAA,CACX,IAAA,CAAMA,EAAE,IAAA,CACR,QAAA,CAAUA,CAAAA,CAAE,QAAA,CACZ,UAAWA,CAAAA,CAAE,SACf,EAAE,CAAA,CACF,aAAA,CAAeZ,EAAQ,MAAA,CAAQ0B,CAAAA,EAAMA,CAAAA,CAAE,QAAQ,EAAE,MAAA,CACjD,cAAA,CAAgB1B,CAAAA,CAAQ,IAAA,CAAM0B,GAAMA,CAAAA,CAAE,QAAA,GAAa,IAAI,CACzD,CAAC,CACH,CAKA,WAAWY,CAAAA,CAAeT,CAAAA,CAAkE,CAC1F,GAAI,CAACS,CAAAA,EAAS,OAAOA,GAAU,QAAA,EAAY,CAACA,CAAAA,CAAM,IAAA,GAChD,OAAO7D,CAAAA,CAAAA,eAAAA,CAA8B,wDAAwD,CAAA,CAG/F,IAAM8D,CAAAA,CAAa,IAAA,CAAK,cAAa,CAC/BvC,CAAAA,CAAUuC,EAAW,GAAA,CAAID,CAAAA,CAAM,IAAA,EAAK,CAAE,aAAa,CAAA,CACzD,GAAI,CAACtC,GAAWA,CAAAA,CAAQ,MAAA,GAAW,CAAA,CAAG,CACpC,IAAMpB,CAAAA,CAAcmC,CAAAA,CAAiBwB,EAAY,IAAA,CAAK,WAAA,GAAeD,CAAAA,CAAM,IAAA,EAAK,CAAG,OAAO,EAC1F,OAAO7D,CAAAA,CAAAA,iBAAAA,CAAgC,CAAA,yBAAA,EAA4B6D,CAAAA,CAAM,MAAM,CAAA,EAAA,CAAA,CAAM1D,CAAW,CAClG,CAEA,OAAOL,CAAAA,CAAG,KAAK,QAAA,CAASyB,CAAAA,CAAS6B,CAAO,CAAC,CAC3C,CAGA,eAAA,CAAgBS,EAA0C,CACxD,GAAI,CAACA,CAAAA,EAAS,OAAOA,CAAAA,EAAU,QAAA,EAAY,CAACA,CAAAA,CAAM,MAAK,CACrD,OAAO7D,kBAA8B,wDAAwD,CAAA,CAG/F,IAAM8D,CAAAA,CAAa,IAAA,CAAK,YAAA,EAAa,CAC/BvC,EAAUuC,CAAAA,CAAW,GAAA,CAAID,EAAM,IAAA,EAAK,CAAE,aAAa,CAAA,CACzD,GAAI,CAACtC,GAAWA,CAAAA,CAAQ,MAAA,GAAW,EAAG,CACpC,IAAMpB,EAAcmC,CAAAA,CAAiBwB,CAAAA,CAAY,IAAA,CAAK,WAAA,GAAeD,CAAAA,CAAM,IAAA,EAAK,CAAG,OAAO,EAC1F,OAAO7D,CAAAA,CAAAA,iBAAAA,CAAgC,CAAA,yBAAA,EAA4B6D,CAAAA,CAAM,MAAM,CAAA,EAAA,CAAA,CAAM1D,CAAW,CAClG,CAEA,IAAM4D,CAAAA,CAAc,IAAI,GAAA,CAClBC,CAAAA,CAAa,IAAI,GAAA,CACvB,IAAA,IAAW7B,CAAAA,IAAKZ,CAAAA,CACVY,EAAE,QAAA,EAAU4B,CAAAA,CAAY,GAAA,CAAI5B,CAAAA,CAAE,QAAQ,CAAA,CAC1C6B,CAAAA,CAAW,IAAI7B,CAAAA,CAAE,OAAO,EAG1B,OAAOrC,CAAAA,CAAG,CACR,KAAA,CAAOyB,EAAQ,CAAC,CAAA,CAAE,KAAA,CAClB,OAAA,CAAS3B,EACT,cAAA,CAAgBmE,CAAAA,CAAY,IAAA,CAC5B,UAAA,CAAYxC,EAAQ,MAAA,CACpB,aAAA,CAAeyC,EAAW,IAAA,CAC1B,SAAA,CAAW,MAAM,IAAA,CAAKD,CAAW,CAAA,CAAE,IAAA,EACrC,CAAC,CACH,CAGA,YAAA,EAAyB,CACvB,IAAME,CAAAA,CAAM,IAAA,CAAK,YAAA,EAAa,CAC9B,OAAO,KAAA,CAAM,IAAA,CAAKA,EAAI,IAAA,EAAM,EACzB,MAAA,CAAQnC,CAAAA,EAAMA,CAAAA,CAAE,MAAA,CAAS,CAAC,CAAA,CAC1B,GAAA,CAAKA,CAAAA,EAAM,CACV,IAAM8B,CAAAA,CAAQK,CAAAA,CAAI,GAAA,CAAInC,CAAC,EACvB,OAAO8B,CAAAA,CAAQA,EAAM,CAAC,CAAA,CAAE,MAAQ9B,CAClC,CAAC,CAAA,CACA,IAAA,EACL,CAKA,aAAA,CAAcoC,CAAAA,CAAkBd,CAAAA,CAAkE,CAChG,GAAI,CAACc,CAAAA,EAAY,OAAOA,GAAa,QAAA,EAAY,CAACA,EAAS,IAAA,EAAK,CAC9D,OAAOlE,CAAAA,CAAAA,eAAAA,CAA8B,2DAA2D,CAAA,CAGlG,IAAMmE,EAAgB,IAAA,CAAK,eAAA,EAAgB,CACrC5C,CAAAA,CAAU4C,EAAc,GAAA,CAAID,CAAAA,CAAS,IAAA,EAAK,CAAE,aAAa,CAAA,CAC/D,GAAI,CAAC3C,CAAAA,EAAWA,EAAQ,MAAA,GAAW,CAAA,CAAG,CACpC,IAAMpB,EAAcmC,CAAAA,CAAiB6B,CAAAA,CAAe,KAAK,WAAA,EAAY,CAAGD,EAAS,IAAA,EAAK,CAAG,UAAU,CAAA,CACnG,OAAOlE,CAAAA,CAAAA,oBAAAA,CAAmC,CAAA,4BAAA,EAA+BkE,EAAS,IAAA,EAAM,KAAM/D,CAAW,CAC3G,CAEA,OAAOL,EAAG,IAAA,CAAK,QAAA,CAASyB,CAAAA,CAAS6B,CAAO,CAAC,CAC3C,CAGA,kBAAA,CAAmBc,CAAAA,CAAgD,CACjE,GAAI,CAACA,GAAY,OAAOA,CAAAA,EAAa,UAAY,CAACA,CAAAA,CAAS,IAAA,EAAK,CAC9D,OAAOlE,CAAAA,CAAAA,eAAAA,CAA8B,2DAA2D,CAAA,CAGlG,IAAMmE,EAAgB,IAAA,CAAK,eAAA,EAAgB,CACrC5C,CAAAA,CAAU4C,EAAc,GAAA,CAAID,CAAAA,CAAS,MAAK,CAAE,WAAA,EAAa,CAAA,CAC/D,GAAI,CAAC3C,CAAAA,EAAWA,EAAQ,MAAA,GAAW,CAAA,CAAG,CACpC,IAAMpB,EAAcmC,CAAAA,CAAiB6B,CAAAA,CAAe,IAAA,CAAK,WAAA,GAAeD,CAAAA,CAAS,IAAA,GAAQ,UAAU,CAAA,CACnG,OAAOlE,CAAAA,CAAAA,oBAAAA,CAAmC,CAAA,4BAAA,EAA+BkE,CAAAA,CAAS,IAAA,EAAM,CAAA,EAAA,CAAA,CAAM/D,CAAW,CAC3G,CAEA,IAAM6D,CAAAA,CAAa,IAAI,GAAA,CACvB,IAAA,IAAW7B,KAAKZ,CAAAA,CAASyC,CAAAA,CAAW,IAAI7B,CAAAA,CAAE,OAAO,EAEjD,OAAOrC,CAAAA,CAAG,CACR,QAAA,CAAUyB,EAAQ,CAAC,CAAA,CAAE,QAAA,CACrB,KAAA,CAAOA,EAAQ,CAAC,CAAA,CAAE,KAAA,CAClB,OAAA,CAAS3B,EACT,UAAA,CAAY2B,CAAAA,CAAQ,OACpB,aAAA,CAAeyC,CAAAA,CAAW,KAC1B,QAAA,CAAU,KAAA,CAAM,IAAA,CAAKA,CAAU,EAAE,IAAA,EACnC,CAAC,CACH,CAGA,mBAAA,CAAoBH,CAAAA,CAAsC,CACxD,GAAI,CAACA,CAAAA,EAAS,OAAOA,GAAU,QAAA,EAAY,CAACA,EAAM,IAAA,EAAK,CACrD,OAAO7D,CAAAA,CAAAA,eAAAA,CAA8B,wDAAwD,CAAA,CAG/F,IAAM8D,CAAAA,CAAa,IAAA,CAAK,cAAa,CAC/BvC,CAAAA,CAAUuC,CAAAA,CAAW,GAAA,CAAID,EAAM,IAAA,EAAK,CAAE,aAAa,CAAA,CACzD,GAAI,CAACtC,CAAAA,EAAWA,CAAAA,CAAQ,MAAA,GAAW,EAAG,CACpC,IAAMpB,EAAcmC,CAAAA,CAAiBwB,CAAAA,CAAY,KAAK,WAAA,EAAY,CAAGD,CAAAA,CAAM,IAAA,GAAQ,OAAO,CAAA,CAC1F,OAAO7D,CAAAA,CAAAA,iBAAAA,CAAgC,CAAA,yBAAA,EAA4B6D,EAAM,IAAA,EAAM,CAAA,EAAA,CAAA,CAAM1D,CAAW,CAClG,CAEA,IAAMiE,CAAAA,CAAM,IAAI,IAChB,IAAA,IAAWjC,CAAAA,IAAKZ,CAAAA,CACVY,CAAAA,CAAE,UAAUiC,CAAAA,CAAI,GAAA,CAAIjC,EAAE,QAAQ,CAAA,CAEpC,OAAOrC,CAAAA,CAAG,KAAA,CAAM,IAAA,CAAKsE,CAAG,EAAE,IAAA,EAAM,CAClC,CAGA,iBAA4B,CAC1B,IAAMH,CAAAA,CAAM,IAAA,CAAK,iBAAgB,CACjC,OAAO,MAAM,IAAA,CAAKA,CAAAA,CAAI,MAAM,CAAA,CACzB,MAAA,CAAQI,CAAAA,EAAMA,EAAE,MAAA,CAAS,CAAC,CAAA,CAC1B,GAAA,CAAKA,GAAM,CACV,IAAMT,CAAAA,CAAQK,CAAAA,CAAI,IAAII,CAAC,CAAA,CACvB,OAAOT,CAAAA,CAAQA,CAAAA,CAAM,CAAC,CAAA,CAAE,QAAA,CAAWS,CACrC,CAAC,EACA,IAAA,EACL,CAKA,SAAA,CAAUC,EAAclB,CAAAA,CAAkE,CACxF,GAAI,CAACkB,GAAQ,OAAOA,CAAAA,EAAS,UAAY,CAACA,CAAAA,CAAK,MAAK,CAClD,OAAOtE,CAAAA,CAAAA,eAAAA,CAA8B,uDAAuD,EAG9F,IAAMgC,CAAAA,CAAY,IAAA,CAAK,WAAA,GACjBT,CAAAA,CAAUS,CAAAA,CAAU,GAAA,CAAIsC,CAAAA,CAAK,MAAK,CAAE,WAAA,EAAa,CAAA,CACvD,GAAI,CAAC/C,CAAAA,EAAWA,CAAAA,CAAQ,MAAA,GAAW,CAAA,CAAG,CACpC,IAAMpB,CAAAA,CAAcS,CAAAA,CAAYoB,CAAAA,CAAWsC,EAAK,IAAA,EAAK,CAAG,MAAM,CAAA,CAC9D,OAAOtE,CAAAA,CAAAA,YAAAA,CAA2B,CAAA,wBAAA,EAA2BsE,EAAK,IAAA,EAAM,KAAMnE,CAAW,CAC3F,CAEA,OAAOL,EAAG,IAAA,CAAK,QAAA,CAASyB,CAAAA,CAAS6B,CAAO,CAAC,CAC3C,CAKA,kBAAA,CAAmBS,CAAAA,CAAsC,CACvD,GAAI,CAACA,GAAS,OAAOA,CAAAA,EAAU,UAAY,CAACA,CAAAA,CAAM,IAAA,EAAK,CACrD,OAAO7D,CAAAA,CAAAA,eAAAA,CAA8B,wDAAwD,EAG/F,IAAM8D,CAAAA,CAAa,KAAK,YAAA,EAAa,CAC/BvC,CAAAA,CAAUuC,CAAAA,CAAW,IAAID,CAAAA,CAAM,IAAA,GAAO,WAAA,EAAa,EACzD,GAAI,CAACtC,CAAAA,EAAWA,CAAAA,CAAQ,SAAW,CAAA,CAAG,CACpC,IAAMpB,CAAAA,CAAcmC,EAAiBwB,CAAAA,CAAY,IAAA,CAAK,WAAA,EAAY,CAAGD,EAAM,IAAA,EAAK,CAAG,OAAO,CAAA,CAC1F,OAAO7D,oBAAgC,CAAA,yBAAA,EAA4B6D,CAAAA,CAAM,IAAA,EAAM,KAAM1D,CAAW,CAClG,CAEA,IAAMiE,EAAM,IAAI,GAAA,CAChB,IAAA,IAAWjC,CAAAA,IAAKZ,EAAS6C,CAAAA,CAAI,GAAA,CAAIjC,EAAE,OAAO,CAAA,CAC1C,OAAOrC,CAAAA,CAAG,KAAA,CAAM,IAAA,CAAKsE,CAAG,EAAE,IAAA,EAAM,CAClC,CAGA,sBAAsBF,CAAAA,CAAyC,CAC7D,GAAI,CAACA,GAAY,OAAOA,CAAAA,EAAa,UAAY,CAACA,CAAAA,CAAS,MAAK,CAC9D,OAAOlE,CAAAA,CAAAA,eAAAA,CAA8B,2DAA2D,EAGlG,IAAMmE,CAAAA,CAAgB,IAAA,CAAK,eAAA,GACrB5C,CAAAA,CAAU4C,CAAAA,CAAc,GAAA,CAAID,CAAAA,CAAS,MAAK,CAAE,WAAA,EAAa,CAAA,CAC/D,GAAI,CAAC3C,CAAAA,EAAWA,CAAAA,CAAQ,MAAA,GAAW,CAAA,CAAG,CACpC,IAAMpB,CAAAA,CAAcmC,CAAAA,CAAiB6B,CAAAA,CAAe,KAAK,WAAA,EAAY,CAAGD,CAAAA,CAAS,IAAA,GAAQ,UAAU,CAAA,CACnG,OAAOlE,CAAAA,CAAAA,oBAAAA,CAAmC,CAAA,4BAAA,EAA+BkE,EAAS,IAAA,EAAM,CAAA,EAAA,CAAA,CAAM/D,CAAW,CAC3G,CAEA,IAAMiE,CAAAA,CAAM,IAAI,IAChB,IAAA,IAAWjC,CAAAA,IAAKZ,CAAAA,CAAS6C,CAAAA,CAAI,IAAIjC,CAAAA,CAAE,OAAO,EAC1C,OAAOrC,CAAAA,CAAG,MAAM,IAAA,CAAKsE,CAAG,CAAA,CAAE,IAAA,EAAM,CAClC,CAQA,MAAA,CAAOtD,CAAAA,CAAesC,EAAkE,CACtF,GAAI,CAACtC,CAAAA,EAAS,OAAOA,CAAAA,EAAU,QAAA,EAAY,CAACA,CAAAA,CAAM,IAAA,GAChD,OAAOd,CAAAA,CAAAA,eAAAA,CAA8B,0DAA0D,CAAA,CAGjG,IAAMD,CAAAA,CAAO,IAAA,CAAK,iBAAgB,CAC5BkB,CAAAA,CAAIH,EAAM,IAAA,EAAK,CAAE,WAAA,EAAY,CAC7BuC,EAAQ,IAAA,CAAK,GAAA,CAAI,EAAGD,CAAAA,EAAS,KAAA,EAAS,GAAG,CAAA,CACzCE,CAAAA,CAAO,IAAA,CAAK,GAAA,CAAI,EAAGF,CAAAA,EAAS,IAAA,EAAQ,CAAC,CAAA,CACrCmB,EAAanB,CAAAA,EAAS,UAAA,CACtBoB,CAAAA,CAAepB,CAAAA,EAAS,aAExBqB,CAAAA,CAAwB,GACxBC,CAAAA,CAAWpB,CAAAA,CAAOD,EAASA,CAAAA,CAEjC,IAAA,IAAS3C,CAAAA,CAAI,CAAA,CAAGA,EAAIX,CAAAA,CAAK,MAAA,EAAU0E,CAAAA,CAAQ,MAAA,CAASC,EAAShE,CAAAA,EAAAA,CAAK,CAChE,IAAMyB,CAAAA,CAAIpC,EAAKW,CAAC,CAAA,CACZ6D,GAAcpC,CAAAA,CAAE,UAAA,GAAeoC,GAC/BC,CAAAA,EAAgB,CAACrC,CAAAA,CAAE,QAAA,EAAA,CAGrBA,EAAE,OAAA,CAAQ,QAAA,CAASlB,CAAC,CAAA,EACpBkB,EAAE,IAAA,CAAK,WAAA,EAAY,CAAE,QAAA,CAASlB,CAAC,CAAA,EAC/BkB,CAAAA,CAAE,SAAS,WAAA,EAAY,CAAE,SAASlB,CAAC,CAAA,EACnCkB,CAAAA,CAAE,KAAA,CAAM,aAAY,CAAE,QAAA,CAASlB,CAAC,CAAA,EAChCkB,CAAAA,CAAE,OAAO,WAAA,EAAY,CAAE,QAAA,CAASlB,CAAC,GACjCkB,CAAAA,CAAE,MAAA,CAAO,aAAY,CAAE,QAAA,CAASlB,CAAC,CAAA,GAEjCwD,CAAAA,CAAQ,IAAA,CAAKtC,CAAC,EAElB,CAEA,GAAIsC,CAAAA,CAAQ,MAAA,GAAW,EACrB,OAAOzE,CAAAA,CAAAA,YAAAA,CAA2B,CAAA,sBAAA,EAAyBc,CAAAA,CAAM,MAAM,CAAA,EAAA,CAAI,EAG7E,IAAM0C,CAAAA,CAAQiB,EAAQ,MAAA,CAChBhB,CAAAA,CAAa,IAAA,CAAK,IAAA,CAAKD,EAAQH,CAAK,CAAA,CACpCK,CAAAA,CAAAA,CAASJ,CAAAA,CAAO,GAAKD,CAAAA,CAE3B,OAAOvD,CAAAA,CAAG,CACR,KAAM2E,CAAAA,CAAQ,KAAA,CAAMf,EAAOA,CAAAA,CAAQL,CAAK,EACxC,KAAA,CAAAG,CAAAA,CACA,IAAA,CAAAF,CAAAA,CACA,MAAAD,CAAAA,CACA,UAAA,CAAAI,CACF,CAAC,CACH,CASA,UAAA,CACEkB,CAAAA,CACAC,CAAAA,CACAC,EAAW,EAAA,CACXxB,CAAAA,CAAQ,GACqB,CAC7B,GAAI,OAAOsB,CAAAA,EAAQ,QAAA,EAAY,OAAOC,CAAAA,EAAQ,UAAY,CAAC,MAAA,CAAO,SAASD,CAAG,CAAA,EAAK,CAAC,MAAA,CAAO,QAAA,CAASC,CAAG,CAAA,CACrG,OAAO5E,CAAAA,CAAAA,qBAAAA,CAAoC,+CAA+C,EAE5F,GAAI2E,CAAAA,CAAM,KAAOA,CAAAA,CAAM,EAAA,EAAMC,CAAAA,CAAM,IAAA,EAAQA,EAAM,GAAA,CAC/C,OAAO5E,CAAAA,CAAAA,qBAAAA,CAEL,CAAA,qBAAA,EAAwB2E,CAAG,CAAA,EAAA,EAAKC,CAAG,CAAA,qDAAA,CACrC,CAAA,CAEF,IAAM7E,CAAAA,CAAO,IAAA,CAAK,iBAAgB,CAE5B+E,CAAAA,CAAOD,EAAW,GAAA,CAClBE,CAAAA,CAAOF,CAAAA,EAAY,GAAA,CAAM,KAAK,GAAA,CAAIG,CAAAA,CAAML,CAAG,CAAC,GAC5CM,CAAAA,CAASN,CAAAA,CAAMG,CAAAA,CACfI,CAAAA,CAASP,EAAMG,CAAAA,CACfK,CAAAA,CAASP,EAAMG,CAAAA,CACfK,CAAAA,CAASR,EAAMG,CAAAA,CAEf3C,CAAAA,CAA0B,EAAC,CAEjC,QAAS1B,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIX,CAAAA,CAAK,OAAQW,CAAAA,EAAAA,CAAK,CACpC,IAAMyB,CAAAA,CAAIpC,EAAKW,CAAC,CAAA,CAIhB,GAHIyB,CAAAA,CAAE,QAAA,GAAa,MAAQA,CAAAA,CAAE,SAAA,GAAc,IAAA,EAEvCA,CAAAA,CAAE,SAAW8C,CAAAA,EAAU9C,CAAAA,CAAE,QAAA,CAAW+C,CAAAA,EACpC/C,EAAE,SAAA,CAAYgD,CAAAA,EAAUhD,CAAAA,CAAE,SAAA,CAAYiD,EAAQ,SAElD,IAAMf,EAAIgB,CAAAA,CAAUV,CAAAA,CAAKC,EAAKzC,CAAAA,CAAE,QAAA,CAAUA,CAAAA,CAAE,SAAS,EACjDkC,CAAAA,EAAKQ,CAAAA,EACPzC,CAAAA,CAAQ,IAAA,CAAK,CAAE,GAAGD,CAAAA,CAAG,UAAA,CAAY,IAAA,CAAK,MAAMkC,CAAAA,CAAI,GAAG,EAAI,GAAI,CAAC,EAEhE,CAEAjC,CAAAA,CAAQ,IAAA,CAAK,CAAC9B,EAAGC,CAAAA,GAAMD,CAAAA,CAAE,UAAA,CAAaC,CAAAA,CAAE,UAAU,CAAA,CAClD,IAAM+E,CAAAA,CAASlD,CAAAA,CAAQ,MAAM,CAAA,CAAGiB,CAAK,EAErC,OAAIiC,CAAAA,CAAO,SAAW,CAAA,CACbtF,CAAAA,CAAAA,YAAAA,CAA2B,CAAA,6BAAA,EAAgC6E,CAAQ,UAAUF,CAAG,CAAA,EAAA,EAAKC,CAAG,CAAA,EAAA,CAAI,EAG9F9E,CAAAA,CAAGwF,CAAM,CAClB,CAKA,iBAA0B,CACxB,OAAO,KAAK,eAAA,EAAgB,CAAE,MAChC,CAGA,gBAAA,EAA2B,CACzB,OAAO,KAAK,cAAA,EAAe,CAAE,IAC/B,CAIA,UAAA,EAAmB,CACjB,IAAA,CAAK,UAAA,CAAa,IAAA,CAClB,IAAA,CAAK,SAAW,IAAA,CAChB,IAAA,CAAK,YAAc,IAAA,CACnB,IAAA,CAAK,QAAU,KACjB,CACF,EAGA,SAASN,EAAMO,CAAAA,CAAqB,CAClC,OAAOA,CAAAA,EAAO,KAAK,EAAA,CAAK,GAAA,CAC1B,CAEA,SAASF,EAAUG,CAAAA,CAAcC,CAAAA,CAAcC,EAAcC,CAAAA,CAAsB,CAEjF,IAAMb,CAAAA,CAAOE,CAAAA,CAAMU,CAAAA,CAAOF,CAAI,EACxBI,CAAAA,CAAOZ,CAAAA,CAAMW,CAAAA,CAAOF,CAAI,EACxBnF,CAAAA,CACJ,IAAA,CAAK,GAAA,CAAIwE,CAAAA,CAAO,CAAC,CAAA,EAAK,CAAA,CACtB,KAAK,GAAA,CAAIE,CAAAA,CAAMQ,CAAI,CAAC,CAAA,CAAI,IAAA,CAAK,GAAA,CAAIR,EAAMU,CAAI,CAAC,CAAA,CAAI,IAAA,CAAK,IAAIE,CAAAA,CAAO,CAAC,CAAA,EAAK,CAAA,CACxE,OAAO,IAAA,CAAI,CAAA,CAAI,KAAK,KAAA,CAAM,IAAA,CAAK,KAAKtF,CAAC,CAAA,CAAG,IAAA,CAAK,IAAA,CAAK,EAAIA,CAAC,CAAC,CAC1D,CCxrBA,IAAMV,CAAAA,CAAU,QACVC,CAAAA,CAAgB,cAAA,CAgBhBgG,EACJ,8FAAA,CAEEC,CAAAA,CAAkC,KAEtC,SAASC,CAAAA,CAAiBC,CAAAA,CAAqB,CAC7C,OAAI,CAACA,CAAAA,EAAO,OAAOA,CAAAA,EAAQ,SAAiB,EAAA,CACrCA,CAAAA,CAAI,OAAA,CAAQH,CAAAA,CAAqB,EAAE,CAAA,CAAE,OAAA,CAAQ,UAAW,GAAG,CAAA,CAAE,MACtE,CAEA,SAASI,CAAAA,CAAQC,EAAsB,CACrC,GAAIA,CAAAA,EAAQ,IAAA,CAA2B,OAAO,EAAA,CAC9C,IAAMpE,CAAAA,CAAI,MAAA,CAAOoE,CAAG,CAAA,CAAE,IAAA,GACtB,OAAOpE,CAAAA,GAAM,KAAO,EAAA,CAAKA,CAAAA,CAAE,OAAA,CAAQ,SAAA,CAAW,GAAG,CACnD,CAEA,SAASqE,CAAAA,CAAQD,EAA6B,CAC5C,GAAIA,CAAAA,EAAQ,IAAA,CAA2B,OAAO,IAAA,CAC9C,IAAME,EAAI,MAAA,CAAOF,CAAG,EACpB,OAAI,CAAC,MAAA,CAAO,QAAA,CAASE,CAAC,CAAA,EAAKA,CAAAA,GAAM,EAAU,IAAA,CACpCA,CACT,CAEA,SAASC,CAAAA,CAAgB1B,CAAAA,CAA6B,CACpD,OAAOA,CAAAA,GAAQ,IAAA,EAASA,GAAO,GAAA,EAAOA,CAAAA,EAAO,EAC/C,CAEA,SAAS2B,CAAAA,CAAiB1B,CAAAA,CAA6B,CACrD,OAAOA,CAAAA,GAAQ,IAAA,EAASA,CAAAA,EAAO,MAAQA,CAAAA,EAAO,GAChD,CAEA,SAAS2B,EAAoBP,CAAAA,CAAyB,CACpD,IAAMQ,CAAAA,CAAQ,MAAA,CAAOR,CAAG,CAAA,CAAE,OAAA,CAAQ,KAAA,CAAO,EAAE,EAAE,WAAA,EAAY,CAAE,IAAA,EAAK,CAEhE,OAD4B,CAAC,IAAA,CAAM,IAAA,CAAM,IAAA,CAAM,KAAM,KAAK,CAAA,CAC5C,SAASQ,CAAmB,CAAA,CAAIA,EAAQ,IACxD,CAEA,SAASC,CAAAA,CAAOC,EAAuC,CACrD,IAAM1D,CAAAA,CAAUiD,CAAAA,CAAQS,EAAI,CAAC,CAAA,CACvBC,CAAAA,CAAOZ,CAAAA,CAAiBE,EAAQS,CAAAA,CAAI,CAAC,CAAC,CAAA,CACtCxC,CAAAA,CAAW+B,EAAQS,CAAAA,CAAI,CAAC,CAAA,CACxB7C,CAAAA,CAAQoC,EAAQS,CAAAA,CAAI,CAAC,CAAA,CAG3B,GADI,CAAC1D,CAAAA,EAAW,CAAC2D,CAAAA,EAAQ,CAACzC,GAAY,CAACL,CAAAA,EACnC,CAAChE,CAAAA,CAAc,IAAA,CAAKmD,CAAO,CAAA,CAAG,OAAO,IAAA,CAEzC,IAAM4D,EAAWT,CAAAA,CAAQO,CAAAA,CAAI,CAAC,CAAA,CACxBG,EAAYV,CAAAA,CAAQO,CAAAA,CAAI,CAAC,CAAA,CAC/B,OAAI,CAACL,CAAAA,CAAgBO,CAAQ,CAAA,EAAK,CAACN,EAAiBO,CAAS,CAAA,CAAU,IAAA,CAEhE,CACL,QAAA7D,CAAAA,CACA,IAAA,CAAA2D,CAAAA,CACA,UAAA,CAAYJ,EAAoBG,CAAAA,CAAI,CAAC,CAAA,CACrC,QAAA,CAAUA,EAAI,CAAA,GAAM,CAAA,CACpB,SAAAxC,CAAAA,CACA,KAAA,CAAAL,EACA,OAAA,CAASjE,CAAAA,CACT,MAAA,CAAQqG,CAAAA,CAAQS,EAAI,CAAC,CAAA,CACrB,MAAA,CAAQT,CAAAA,CAAQS,EAAI,CAAC,CAAA,CACrB,QAAA,CAAUT,CAAAA,CAAQS,EAAI,CAAC,CAAA,CACvB,SAAAE,CAAAA,CACA,SAAA,CAAAC,CACF,CACF,CAEA,SAASC,CAAAA,CAAS3E,EAAuB,CACvC,OAAO,GAAGA,CAAAA,CAAE,OAAO,IAAIA,CAAAA,CAAE,IAAA,CAAK,WAAA,EAAa,IAAIA,CAAAA,CAAE,QAAA,CAAS,aAAa,CAAA,CAAA,EAAIA,EAAE,UAAU,CAAA,CACzF,CAEA,SAAS4E,EAAUf,CAAAA,CAAoC,CACrD,IAAMvD,CAAAA,CAAO,IAAI,GAAA,CACXuE,CAAAA,CAAuB,EAAC,CAE9B,QAAStG,CAAAA,CAAI,CAAA,CAAGA,EAAIsF,CAAAA,CAAI,MAAA,CAAQtF,IAAK,CACnC,IAAMuG,CAAAA,CAASR,CAAAA,CAAOT,EAAItF,CAAC,CAAC,CAAA,CAC5B,GAAI,CAACuG,CAAAA,CAAQ,SAEb,IAAM3F,CAAAA,CAAMwF,EAASG,CAAM,CAAA,CACvBxE,EAAK,GAAA,CAAInB,CAAG,IAEhBmB,CAAAA,CAAK,GAAA,CAAInB,CAAG,CAAA,CACZ0F,EAAO,IAAA,CAAKC,CAAM,CAAA,EACpB,CAEA,OAAOD,CACT,CAGA,eAAsBE,CAAAA,EAAyC,CAC7D,GAAIpB,CAAAA,CAAY,OAAOA,CAAAA,CAEvB,IAAMqB,EAAM,IAAI,GAAA,CAAI,0BAAA,CAA4B,4PAAe,CAAA,CACzDC,CAAAA,CAAW,MAAM,KAAA,CAAMD,CAAG,EAChC,GAAI,CAACC,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,uCAAuCA,CAAAA,CAAS,MAAM,IAAIA,CAAAA,CAAS,UAAU,CAAA,CAAA,CAAG,CAAA,CAGlG,IAAMC,CAAAA,CAAa,IAAI,UAAA,CAAW,MAAMD,EAAS,WAAA,EAAa,CAAA,CACxDE,CAAAA,CAAWC,aAAQF,CAAU,CAAA,CAC7BG,EAAO,IAAI,WAAA,GAAc,MAAA,CAAOF,CAAQ,CAAA,CACxCtB,CAAAA,CAAM,KAAK,KAAA,CAAMwB,CAAI,CAAA,CAE3B,OAAA1B,EAAaiB,CAAAA,CAAUf,CAAG,CAAA,CACnBF,CACT,CAEO,SAAS2B,CAAAA,EAA8B,CAC5C3B,CAAAA,CAAa,KACf,CC9HA,IAAI4B,CAAAA,CAAwC,IAAA,CAG5C,eAAsBC,IAAyC,CAC7D,GAAID,CAAAA,CAAkB,OAAOA,EAC7B,IAAM3H,CAAAA,CAAO,MAAMmH,CAAAA,GACnB,OAAAQ,CAAAA,CAAmB,IAAI3E,CAAAA,CAAahD,CAAI,EACjC2H,CACT,CAGA,eAAsBE,EAAAA,EAA4C,CAChE,IAAM7H,CAAAA,CAAO,MAAMmH,CAAAA,EAAgB,CACnC,OAAO,IAAInE,CAAAA,CAAahD,CAAI,CAC9B,CAGO,SAAS8H,EAAAA,EAA0B,CACxCH,CAAAA,CAAmB,IAAA,CACnBD,IACF","file":"browser.js","sourcesContent":["// ─── Error handling ─────────────────────────────────────────────\nexport enum ErrorCode {\n INVALID_PINCODE = 'INVALID_PINCODE',\n PINCODE_NOT_FOUND = 'PINCODE_NOT_FOUND',\n STATE_NOT_FOUND = 'STATE_NOT_FOUND',\n DISTRICT_NOT_FOUND = 'DISTRICT_NOT_FOUND',\n INVALID_COORDINATES = 'INVALID_COORDINATES',\n INVALID_INPUT = 'INVALID_INPUT',\n NO_RESULTS = 'NO_RESULTS',\n}\n\nexport interface ApiError {\n code: ErrorCode;\n message: string;\n suggestions?: string[];\n}\n\nexport interface ApiResponse<T> {\n success: boolean;\n data: T | null;\n error?: ApiError;\n}\n\n// ─── Normalized public type ─────────────────────────────────────\nexport interface PostOffice {\n pincode: string;\n area: string;\n officeType: OfficeType;\n delivery: boolean;\n district: string;\n state: string;\n country: string;\n circle: string;\n region: string;\n division: string;\n latitude: number | null;\n longitude: number | null;\n}\n\nexport type OfficeType = 'BO' | 'SO' | 'HO' | 'PO' | 'GPO';\n\n// ─── Query options ──────────────────────────────────────────────\nexport interface QueryOptions {\n /** Max results to return (default: 100) */\n limit?: number;\n /** Page number, 1-based (default: 1) */\n page?: number;\n /** Filter by office type */\n officeType?: OfficeType;\n /** Filter only delivery offices */\n deliveryOnly?: boolean;\n}\n\n// ─── Paginated result ───────────────────────────────────────────\nexport interface PaginatedResult<T> {\n data: T[];\n total: number;\n page: number;\n limit: number;\n totalPages: number;\n}\n\n// ─── Location result (with distance) ────────────────────────────\nexport interface NearbyResult extends PostOffice {\n distanceKm: number;\n}\n\n// ─── Slim area shape (used in summaries) ────────────────────────\nexport interface AreaInfo {\n pincode: string;\n area: string;\n latitude: number | null;\n longitude: number | null;\n}\n\n// ─── Summary types ──────────────────────────────────────────────\nexport interface PincodeSummary {\n pincode: string;\n district: string;\n state: string;\n country: string;\n areas: AreaInfo[];\n deliveryAreas: number;\n hasCoordinates: boolean;\n}\n\nexport interface DistrictSummary {\n district: string;\n state: string;\n country: string;\n totalAreas: number;\n totalPincodes: number;\n pincodes: string[];\n}\n\nexport interface StateSummary {\n state: string;\n country: string;\n totalDistricts: number;\n totalAreas: number;\n totalPincodes: number;\n districts: string[];\n}\n","import {\n PostOffice,\n QueryOptions,\n PaginatedResult,\n NearbyResult,\n PincodeSummary,\n DistrictSummary,\n StateSummary,\n ApiResponse,\n ErrorCode,\n} from './types';\n\nconst COUNTRY = 'INDIA';\nconst PINCODE_REGEX = /^[1-9]\\d{5}$/;\n\n// ─── Response helpers ─────────────────────────────────────────────\n\nfunction ok<T>(data: T): ApiResponse<T> {\n return { success: true, data };\n}\n\nfunction fail<T>(code: ErrorCode, message: string, suggestions?: string[]): ApiResponse<T> {\n const error: { code: ErrorCode; message: string; suggestions?: string[] } = { code, message };\n if (suggestions && suggestions.length > 0) {\n error.suggestions = suggestions;\n error.message += ` Did you mean: ${suggestions.join(', ')}?`;\n }\n return { success: false, data: null, error };\n}\n\n/** Simple Levenshtein distance for fuzzy matching */\nfunction levenshtein(a: string, b: string): number {\n const m = a.length, n = b.length;\n const dp: number[][] = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));\n for (let i = 0; i <= m; i++) dp[i][0] = i;\n for (let j = 0; j <= n; j++) dp[0][j] = j;\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n dp[i][j] = a[i - 1] === b[j - 1]\n ? dp[i - 1][j - 1]\n : 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);\n }\n }\n return dp[m][n];\n}\n\n/**\n * Find similar keys from an index map using substring, word, and fuzzy matching.\n * Returns up to `max` original-cased names that partially match the query.\n */\nfunction findSimilar(\n index: Map<string, PostOffice[]>,\n query: string,\n field: 'district' | 'state' | 'area',\n max = 5,\n): string[] {\n const q = query.toLowerCase();\n const words = q.split(/\\s+/).filter((w) => w.length >= 3);\n const scored: { name: string; score: number }[] = [];\n // Allow edits proportional to query length (max 3), min query length 4\n const maxDist = q.length < 4 ? 0 : Math.min(3, Math.ceil(q.length / 3));\n\n for (const [key, records] of index) {\n if (!key) continue;\n const originalName = records[0] ? records[0][field] : key;\n\n let score = 0;\n\n // Exact substring match (highest) — skip very short queries to avoid noise\n if (q.length >= 3 && key.includes(q)) {\n score += 10;\n }\n\n // Individual word matches\n for (const word of words) {\n if (key.includes(word)) score += 3;\n }\n\n // Query is a substring of the key or vice versa\n if (q.length >= 4 && q.includes(key)) score += 5;\n\n // Fuzzy match: compare against each word in the key\n if (score === 0) {\n const keyWords = key.split(/\\s+/);\n for (const kw of keyWords) {\n const dist = levenshtein(q, kw);\n if (dist <= maxDist) {\n score += (10 - dist * 2);\n break;\n }\n }\n // Also try full key comparison for single-word queries\n if (score === 0 && keyWords.length === 1) {\n const dist = levenshtein(q, key);\n if (dist <= maxDist) {\n score += (10 - dist * 2);\n }\n }\n }\n\n if (score > 0) {\n scored.push({ name: originalName, score });\n }\n }\n\n return scored\n .sort((a, b) => b.score - a.score)\n .slice(0, max)\n .map((s) => s.name);\n}\n\n/**\n * Cross-index lookup: when a district/state isn't found, check if the query\n * matches an area name and return the districts/states those areas belong to.\n * Prioritizes exact area name matches, then partial matches.\n */\nfunction findFromAreas(\n areaIndex: Map<string, PostOffice[]>,\n query: string,\n field: 'district' | 'state',\n max = 5,\n): string[] {\n const q = query.toLowerCase();\n if (q.length < 3) return [];\n const exact = new Set<string>();\n const partial = new Set<string>();\n\n for (const [key, records] of areaIndex) {\n if (key === q) {\n for (const r of records) exact.add(r[field]);\n } else if (key.includes(q)) {\n for (const r of records) partial.add(r[field]);\n }\n }\n\n // Merge: exact matches first, then partial\n const results: string[] = Array.from(exact);\n for (const p of partial) {\n if (!exact.has(p)) results.push(p);\n if (results.length >= max) break;\n }\n\n return results;\n}\n\n/**\n * Merge suggestions from index-level fuzzy and cross-index area lookups.\n * Area cross-matches come first (more relevant), then fuzzy matches.\n */\nfunction mergeSuggestions(\n index: Map<string, PostOffice[]>,\n areaIndex: Map<string, PostOffice[]>,\n query: string,\n field: 'district' | 'state',\n max = 5,\n): string[] {\n const fromAreas = findFromAreas(areaIndex, query, field, max);\n const fromIndex = findSimilar(index, query, field, max);\n const seen = new Set(fromAreas);\n const merged = [...fromAreas];\n for (const s of fromIndex) {\n if (!seen.has(s)) {\n merged.push(s);\n seen.add(s);\n }\n if (merged.length >= max) break;\n }\n return merged.slice(0, max);\n}\n\n/**\n * Find similar pincodes when input is invalid or not found.\n * - Too long: extract all 6-digit substrings and check if they exist\n * - Too short / partial: prefix-match against known pincodes\n * - Typos: try single-digit corrections\n */\nfunction findSimilarPincodes(\n index: Map<string, PostOffice[]>,\n input: string,\n max = 5,\n): string[] {\n const digits = input.replace(/\\D/g, '');\n const results = new Set<string>();\n\n // Too long — try all 6-digit substrings\n if (digits.length > 6) {\n for (let i = 0; i <= digits.length - 6; i++) {\n const candidate = digits.substring(i, i + 6);\n if (index.has(candidate)) results.add(candidate);\n if (results.size >= max) return Array.from(results);\n }\n }\n\n // Prefix match — find pincodes starting with the digits\n if (digits.length >= 3 && digits.length <= 6) {\n for (const key of index.keys()) {\n if (key.startsWith(digits)) results.add(key);\n if (results.size >= max) return Array.from(results);\n }\n }\n\n return Array.from(results);\n}\n\n/**\n * - Geo-nearby → Haversine with early bounding-box pruning.\n * - All responses wrapped in ApiResponse with proper error codes.\n */\nexport class IndiaPincode {\n private _data: PostOffice[] | null;\n\n // ─── Indexes (lazy) ─────────────────────────────────────────\n private _byPincode: Map<string, PostOffice[]> | null = null;\n private _byState: Map<string, PostOffice[]> | null = null;\n private _byDistrict: Map<string, PostOffice[]> | null = null;\n private _byArea: Map<string, PostOffice[]> | null = null;\n\n constructor(data: PostOffice[]) {\n this._data = data;\n }\n\n private isValidPincode(pincode: string): boolean {\n return typeof pincode === 'string' && PINCODE_REGEX.test(pincode.trim());\n }\n\n private loadRuntimeData(): PostOffice[] {\n return this._data!;\n }\n\n // ─── Index builders ─────────────────────────────────────────\n private indexByPincode(): Map<string, PostOffice[]> {\n if (this._byPincode) return this._byPincode;\n this._byPincode = this.buildIndex((o) => o.pincode);\n return this._byPincode;\n }\n\n private indexByState(): Map<string, PostOffice[]> {\n if (this._byState) return this._byState;\n this._byState = this.buildIndex((o) => o.state.toLowerCase());\n return this._byState;\n }\n\n private indexByDistrict(): Map<string, PostOffice[]> {\n if (this._byDistrict) return this._byDistrict;\n this._byDistrict = this.buildIndex((o) => o.district.toLowerCase());\n return this._byDistrict;\n }\n\n private indexByArea(): Map<string, PostOffice[]> {\n if (this._byArea) return this._byArea;\n this._byArea = this.buildIndex((o) => o.area.toLowerCase());\n return this._byArea;\n }\n\n private buildIndex(keyFn: (o: PostOffice) => string): Map<string, PostOffice[]> {\n const data = this.loadRuntimeData();\n const index = new Map<string, PostOffice[]>();\n for (let i = 0; i < data.length; i++) {\n const key = keyFn(data[i]);\n if (!key) continue;\n const arr = index.get(key);\n if (arr) arr.push(data[i]);\n else index.set(key, [data[i]]);\n }\n return index;\n }\n\n // ─── Helper: apply filters + pagination ─────────────────────\n private paginate(\n records: PostOffice[],\n options?: QueryOptions,\n ): PaginatedResult<PostOffice> {\n const limit = Math.max(1, options?.limit ?? 100);\n const page = Math.max(1, options?.page ?? 1);\n let filtered = records;\n\n if (options?.officeType) {\n filtered = filtered.filter((r) => r.officeType === options.officeType);\n }\n if (options?.deliveryOnly) {\n filtered = filtered.filter((r) => r.delivery);\n }\n\n const total = filtered.length;\n const totalPages = Math.ceil(total / limit);\n const start = (page - 1) * limit;\n const data = filtered.slice(start, start + limit);\n\n return { data, total, page, limit, totalPages };\n }\n\n // ═══════════════════════════════════════════════════════════════\n // PUBLIC API\n // ═══════════════════════════════════════════════════════════════\n\n // ─── Pincode lookup (O(1)) ──────────────────────────────────\n\n /** Get all post offices for a pincode. Returns error for invalid/missing pincodes. */\n getByPincode(pincode: string, options?: QueryOptions): ApiResponse<PaginatedResult<PostOffice>> {\n if (!pincode || typeof pincode !== 'string') {\n return fail(ErrorCode.INVALID_INPUT, 'Pincode is required and must be a string.');\n }\n\n const trimmed = pincode.trim();\n if (!this.isValidPincode(trimmed)) {\n const suggestions = findSimilarPincodes(this.indexByPincode(), trimmed);\n return fail(\n ErrorCode.INVALID_PINCODE,\n `Invalid pincode \"${trimmed}\". Indian pincodes must be exactly 6 digits starting with 1-9.`,\n suggestions,\n );\n }\n\n const records = this.indexByPincode().get(trimmed);\n if (!records || records.length === 0) {\n const suggestions = findSimilarPincodes(this.indexByPincode(), trimmed);\n return fail(ErrorCode.PINCODE_NOT_FOUND, `No data found for pincode \"${trimmed}\".`, suggestions);\n }\n\n return ok(this.paginate(records, options));\n }\n\n /** Get a complete summary for a pincode. */\n getPincodeSummary(pincode: string): ApiResponse<PincodeSummary> {\n if (!pincode || typeof pincode !== 'string') {\n return fail(ErrorCode.INVALID_INPUT, 'Pincode is required and must be a string.');\n }\n\n const trimmed = pincode.trim();\n if (!this.isValidPincode(trimmed)) {\n const suggestions = findSimilarPincodes(this.indexByPincode(), trimmed);\n return fail(\n ErrorCode.INVALID_PINCODE,\n `Invalid pincode \"${trimmed}\". Indian pincodes must be exactly 6 digits starting with 1-9.`,\n suggestions,\n );\n }\n\n const records = this.indexByPincode().get(trimmed);\n if (!records || records.length === 0) {\n const suggestions = findSimilarPincodes(this.indexByPincode(), trimmed);\n return fail(ErrorCode.PINCODE_NOT_FOUND, `No data found for pincode \"${trimmed}\".`, suggestions);\n }\n\n const first = records[0];\n return ok({\n pincode: trimmed,\n district: first.district,\n state: first.state,\n country: COUNTRY,\n areas: records.map((r) => ({\n pincode: r.pincode,\n area: r.area,\n latitude: r.latitude,\n longitude: r.longitude,\n })),\n deliveryAreas: records.filter((o) => o.delivery).length,\n hasCoordinates: records.some((o) => o.latitude !== null),\n });\n }\n\n // ─── State queries ──────────────────────────────────────────\n\n /** Get all post offices in a state. */\n getByState(state: string, options?: QueryOptions): ApiResponse<PaginatedResult<PostOffice>> {\n if (!state || typeof state !== 'string' || !state.trim()) {\n return fail(ErrorCode.INVALID_INPUT, 'State name is required and must be a non-empty string.');\n }\n\n const stateIndex = this.indexByState();\n const records = stateIndex.get(state.trim().toLowerCase());\n if (!records || records.length === 0) {\n const suggestions = mergeSuggestions(stateIndex, this.indexByArea(), state.trim(), 'state');\n return fail(ErrorCode.STATE_NOT_FOUND, `No data found for state \"${state.trim()}\".`, suggestions);\n }\n\n return ok(this.paginate(records, options));\n }\n\n /** Get a summary for a state — districts, pincode count, etc. */\n getStateSummary(state: string): ApiResponse<StateSummary> {\n if (!state || typeof state !== 'string' || !state.trim()) {\n return fail(ErrorCode.INVALID_INPUT, 'State name is required and must be a non-empty string.');\n }\n\n const stateIndex = this.indexByState();\n const records = stateIndex.get(state.trim().toLowerCase());\n if (!records || records.length === 0) {\n const suggestions = mergeSuggestions(stateIndex, this.indexByArea(), state.trim(), 'state');\n return fail(ErrorCode.STATE_NOT_FOUND, `No data found for state \"${state.trim()}\".`, suggestions);\n }\n\n const districtSet = new Set<string>();\n const pincodeSet = new Set<string>();\n for (const r of records) {\n if (r.district) districtSet.add(r.district);\n pincodeSet.add(r.pincode);\n }\n\n return ok({\n state: records[0].state,\n country: COUNTRY,\n totalDistricts: districtSet.size,\n totalAreas: records.length,\n totalPincodes: pincodeSet.size,\n districts: Array.from(districtSet).sort(),\n });\n }\n\n /** Get all unique state names. */\n getAllStates(): string[] {\n const idx = this.indexByState();\n return Array.from(idx.keys())\n .filter((s) => s.length > 0)\n .map((s) => {\n const first = idx.get(s);\n return first ? first[0].state : s;\n })\n .sort();\n }\n\n // ─── District queries ───────────────────────────────────────\n\n /** Get all post offices in a district. */\n getByDistrict(district: string, options?: QueryOptions): ApiResponse<PaginatedResult<PostOffice>> {\n if (!district || typeof district !== 'string' || !district.trim()) {\n return fail(ErrorCode.INVALID_INPUT, 'District name is required and must be a non-empty string.');\n }\n\n const districtIndex = this.indexByDistrict();\n const records = districtIndex.get(district.trim().toLowerCase());\n if (!records || records.length === 0) {\n const suggestions = mergeSuggestions(districtIndex, this.indexByArea(), district.trim(), 'district');\n return fail(ErrorCode.DISTRICT_NOT_FOUND, `No data found for district \"${district.trim()}\".`, suggestions);\n }\n\n return ok(this.paginate(records, options));\n }\n\n /** Get a summary for a district. */\n getDistrictSummary(district: string): ApiResponse<DistrictSummary> {\n if (!district || typeof district !== 'string' || !district.trim()) {\n return fail(ErrorCode.INVALID_INPUT, 'District name is required and must be a non-empty string.');\n }\n\n const districtIndex = this.indexByDistrict();\n const records = districtIndex.get(district.trim().toLowerCase());\n if (!records || records.length === 0) {\n const suggestions = mergeSuggestions(districtIndex, this.indexByArea(), district.trim(), 'district');\n return fail(ErrorCode.DISTRICT_NOT_FOUND, `No data found for district \"${district.trim()}\".`, suggestions);\n }\n\n const pincodeSet = new Set<string>();\n for (const r of records) pincodeSet.add(r.pincode);\n\n return ok({\n district: records[0].district,\n state: records[0].state,\n country: COUNTRY,\n totalAreas: records.length,\n totalPincodes: pincodeSet.size,\n pincodes: Array.from(pincodeSet).sort(),\n });\n }\n\n /** Get all districts for a state. */\n getDistrictsByState(state: string): ApiResponse<string[]> {\n if (!state || typeof state !== 'string' || !state.trim()) {\n return fail(ErrorCode.INVALID_INPUT, 'State name is required and must be a non-empty string.');\n }\n\n const stateIndex = this.indexByState();\n const records = stateIndex.get(state.trim().toLowerCase());\n if (!records || records.length === 0) {\n const suggestions = mergeSuggestions(stateIndex, this.indexByArea(), state.trim(), 'state');\n return fail(ErrorCode.STATE_NOT_FOUND, `No data found for state \"${state.trim()}\".`, suggestions);\n }\n\n const set = new Set<string>();\n for (const r of records) {\n if (r.district) set.add(r.district);\n }\n return ok(Array.from(set).sort());\n }\n\n /** Get all unique district names. */\n getAllDistricts(): string[] {\n const idx = this.indexByDistrict();\n return Array.from(idx.keys())\n .filter((d) => d.length > 0)\n .map((d) => {\n const first = idx.get(d);\n return first ? first[0].district : d;\n })\n .sort();\n }\n\n // ─── Area name queries ───────────────────────────────────────\n\n /** Get post offices by exact area name (case-insensitive). */\n getByArea(name: string, options?: QueryOptions): ApiResponse<PaginatedResult<PostOffice>> {\n if (!name || typeof name !== 'string' || !name.trim()) {\n return fail(ErrorCode.INVALID_INPUT, 'Area name is required and must be a non-empty string.');\n }\n\n const areaIndex = this.indexByArea();\n const records = areaIndex.get(name.trim().toLowerCase());\n if (!records || records.length === 0) {\n const suggestions = findSimilar(areaIndex, name.trim(), 'area');\n return fail(ErrorCode.NO_RESULTS, `No data found for area \"${name.trim()}\".`, suggestions);\n }\n\n return ok(this.paginate(records, options));\n }\n\n // ─── Pincode range queries ──────────────────────────────────\n\n /** Get all pincodes in a state. */\n getPincodesByState(state: string): ApiResponse<string[]> {\n if (!state || typeof state !== 'string' || !state.trim()) {\n return fail(ErrorCode.INVALID_INPUT, 'State name is required and must be a non-empty string.');\n }\n\n const stateIndex = this.indexByState();\n const records = stateIndex.get(state.trim().toLowerCase());\n if (!records || records.length === 0) {\n const suggestions = mergeSuggestions(stateIndex, this.indexByArea(), state.trim(), 'state');\n return fail(ErrorCode.STATE_NOT_FOUND, `No data found for state \"${state.trim()}\".`, suggestions);\n }\n\n const set = new Set<string>();\n for (const r of records) set.add(r.pincode);\n return ok(Array.from(set).sort());\n }\n\n /** Get all pincodes in a district. */\n getPincodesByDistrict(district: string): ApiResponse<string[]> {\n if (!district || typeof district !== 'string' || !district.trim()) {\n return fail(ErrorCode.INVALID_INPUT, 'District name is required and must be a non-empty string.');\n }\n\n const districtIndex = this.indexByDistrict();\n const records = districtIndex.get(district.trim().toLowerCase());\n if (!records || records.length === 0) {\n const suggestions = mergeSuggestions(districtIndex, this.indexByArea(), district.trim(), 'district');\n return fail(ErrorCode.DISTRICT_NOT_FOUND, `No data found for district \"${district.trim()}\".`, suggestions);\n }\n\n const set = new Set<string>();\n for (const r of records) set.add(r.pincode);\n return ok(Array.from(set).sort());\n }\n\n // ─── Free-text search ───────────────────────────────────────\n\n /**\n * Search across pincode, area name, district, state.\n * Returns early once limit is reached — no wasted iteration.\n */\n search(query: string, options?: QueryOptions): ApiResponse<PaginatedResult<PostOffice>> {\n if (!query || typeof query !== 'string' || !query.trim()) {\n return fail(ErrorCode.INVALID_INPUT, 'Search query is required and must be a non-empty string.');\n }\n\n const data = this.loadRuntimeData();\n const q = query.trim().toLowerCase();\n const limit = Math.max(1, options?.limit ?? 100);\n const page = Math.max(1, options?.page ?? 1);\n const officeType = options?.officeType;\n const deliveryOnly = options?.deliveryOnly;\n\n const matches: PostOffice[] = [];\n const maxScan = (page * limit) + limit; // fetch enough for pagination\n\n for (let i = 0; i < data.length && matches.length < maxScan; i++) {\n const r = data[i];\n if (officeType && r.officeType !== officeType) continue;\n if (deliveryOnly && !r.delivery) continue;\n\n if (\n r.pincode.includes(q) ||\n r.area.toLowerCase().includes(q) ||\n r.district.toLowerCase().includes(q) ||\n r.state.toLowerCase().includes(q) ||\n r.circle.toLowerCase().includes(q) ||\n r.region.toLowerCase().includes(q)\n ) {\n matches.push(r);\n }\n }\n\n if (matches.length === 0) {\n return fail(ErrorCode.NO_RESULTS, `No results found for \"${query.trim()}\".`);\n }\n\n const total = matches.length;\n const totalPages = Math.ceil(total / limit);\n const start = (page - 1) * limit;\n\n return ok({\n data: matches.slice(start, start + limit),\n total,\n page,\n limit,\n totalPages,\n });\n }\n\n // ─── Geo: nearby search ─────────────────────────────────────\n\n /**\n * Find post offices near a given coordinate.\n * Uses bounding-box pre-filter + Haversine for accuracy.\n * Returns sorted by distance ascending.\n */\n findNearby(\n lat: number,\n lng: number,\n radiusKm = 10,\n limit = 20,\n ): ApiResponse<NearbyResult[]> {\n if (typeof lat !== 'number' || typeof lng !== 'number' || !Number.isFinite(lat) || !Number.isFinite(lng)) {\n return fail(ErrorCode.INVALID_COORDINATES, 'Latitude and longitude must be valid numbers.');\n }\n if (lat < -90 || lat > 90 || lng < -180 || lng > 180) {\n return fail(\n ErrorCode.INVALID_COORDINATES,\n `Invalid coordinates (${lat}, ${lng}). Latitude must be -90 to 90, longitude -180 to 180.`,\n );\n }\n const data = this.loadRuntimeData();\n // Bounding-box pre-filter (1 degree ≈ 111 km)\n const dLat = radiusKm / 111;\n const dLng = radiusKm / (111 * Math.cos(toRad(lat)));\n const minLat = lat - dLat;\n const maxLat = lat + dLat;\n const minLng = lng - dLng;\n const maxLng = lng + dLng;\n\n const results: NearbyResult[] = [];\n\n for (let i = 0; i < data.length; i++) {\n const r = data[i];\n if (r.latitude === null || r.longitude === null) continue;\n // Bounding box check (cheap)\n if (r.latitude < minLat || r.latitude > maxLat) continue;\n if (r.longitude < minLng || r.longitude > maxLng) continue;\n // Haversine (accurate)\n const d = haversine(lat, lng, r.latitude, r.longitude);\n if (d <= radiusKm) {\n results.push({ ...r, distanceKm: Math.round(d * 100) / 100 });\n }\n }\n\n results.sort((a, b) => a.distanceKm - b.distanceKm);\n const sliced = results.slice(0, limit);\n\n if (sliced.length === 0) {\n return fail(ErrorCode.NO_RESULTS, `No post offices found within ${radiusKm}km of (${lat}, ${lng}).`);\n }\n\n return ok(sliced);\n }\n\n // ─── Bulk / utility ─────────────────────────────────────────\n\n /** Total number of post office records loaded. */\n getTotalRecords(): number {\n return this.loadRuntimeData().length;\n }\n\n /** Total number of unique pincodes. */\n getTotalPincodes(): number {\n return this.indexByPincode().size;\n }\n\n /** Clear all cached data and indexes — reloads fresh on next call. */\n /** Clear all cached indexes — rebuilds on next call. */\n clearCache(): void {\n this._byPincode = null;\n this._byState = null;\n this._byDistrict = null;\n this._byArea = null;\n }\n}\n\n// ─── Haversine helpers ────────────────────────────────────────────\nfunction toRad(deg: number): number {\n return deg * (Math.PI / 180);\n}\n\nfunction haversine(lat1: number, lon1: number, lat2: number, lon2: number): number {\n const R = 6371;\n const dLat = toRad(lat2 - lat1);\n const dLon = toRad(lon2 - lon1);\n const a =\n Math.sin(dLat / 2) ** 2 +\n Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) * Math.sin(dLon / 2) ** 2;\n return R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n}\n\n\n","import { inflate } from 'pako';\nimport { PostOffice, OfficeType } from './types';\n\nconst COUNTRY = 'INDIA';\nconst PINCODE_REGEX = /^[1-9]\\d{5}$/;\n\ninterface CompactRecord {\n c: string;\n r: string;\n v: string;\n o: string;\n p: string;\n t: string;\n d: number;\n i: string;\n s: string;\n a: number;\n n: number;\n}\n\nconst OFFICE_SUFFIX_REGEX =\n /\\s+\\(?(?:B\\.?O\\.?|S\\.?O\\.?|H\\.?O\\.?|P\\.?O\\.?|G\\.?P\\.?O\\.?|M\\.?D\\.?G\\.?|R\\.?M\\.?S\\.?)\\)?\\s*$/i;\n\nlet cachedData: PostOffice[] | null = null;\n\nfunction sanitizeCityName(raw: string): string {\n if (!raw || typeof raw !== 'string') return '';\n return raw.replace(OFFICE_SUFFIX_REGEX, '').replace(/\\s{2,}/g, ' ').trim();\n}\n\nfunction trimStr(val: unknown): string {\n if (val === null || val === undefined) return '';\n const s = String(val).trim();\n return s === 'NA' ? '' : s.replace(/\\s{2,}/g, ' ');\n}\n\nfunction safeNum(val: unknown): number | null {\n if (val === null || val === undefined) return null;\n const n = Number(val);\n if (!Number.isFinite(n) || n === 0) return null;\n return n;\n}\n\nfunction isValidLatitude(lat: number | null): boolean {\n return lat === null || (lat >= -90 && lat <= 90);\n}\n\nfunction isValidLongitude(lng: number | null): boolean {\n return lng === null || (lng >= -180 && lng <= 180);\n}\n\nfunction normalizeOfficeType(raw: string): OfficeType {\n const upper = String(raw).replace(/\\./g, '').toUpperCase().trim();\n const valid: OfficeType[] = ['BO', 'SO', 'HO', 'PO', 'GPO'];\n return (valid.includes(upper as OfficeType) ? upper : 'BO') as OfficeType;\n}\n\nfunction expand(rec: CompactRecord): PostOffice | null {\n const pincode = trimStr(rec.p);\n const area = sanitizeCityName(trimStr(rec.o));\n const district = trimStr(rec.i);\n const state = trimStr(rec.s);\n\n if (!pincode || !area || !district || !state) return null;\n if (!PINCODE_REGEX.test(pincode)) return null;\n\n const latitude = safeNum(rec.a);\n const longitude = safeNum(rec.n);\n if (!isValidLatitude(latitude) || !isValidLongitude(longitude)) return null;\n\n return {\n pincode,\n area,\n officeType: normalizeOfficeType(rec.t),\n delivery: rec.d === 1,\n district,\n state,\n country: COUNTRY,\n circle: trimStr(rec.c),\n region: trimStr(rec.r),\n division: trimStr(rec.v),\n latitude,\n longitude,\n };\n}\n\nfunction dedupKey(r: PostOffice): string {\n return `${r.pincode}|${r.area.toLowerCase()}|${r.district.toLowerCase()}|${r.officeType}`;\n}\n\nfunction normalize(raw: CompactRecord[]): PostOffice[] {\n const seen = new Set<string>();\n const result: PostOffice[] = [];\n\n for (let i = 0; i < raw.length; i++) {\n const record = expand(raw[i]);\n if (!record) continue;\n\n const key = dedupKey(record);\n if (seen.has(key)) continue;\n\n seen.add(key);\n result.push(record);\n }\n\n return result;\n}\n\n/** Browser-safe loader that fetches and inflates gzipped dataset. */\nexport async function loadBrowserData(): Promise<PostOffice[]> {\n if (cachedData) return cachedData;\n\n const url = new URL('../data/pincodes.json.gz', import.meta.url);\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`india-pincode: failed to load data (${response.status} ${response.statusText})`);\n }\n\n const compressed = new Uint8Array(await response.arrayBuffer());\n const inflated = inflate(compressed);\n const json = new TextDecoder().decode(inflated);\n const raw = JSON.parse(json) as CompactRecord[];\n\n cachedData = normalize(raw);\n return cachedData;\n}\n\nexport function clearBrowserDataCache(): void {\n cachedData = null;\n}\n","import { IndiaPincode } from './pincode-lookup';\nimport { loadBrowserData, clearBrowserDataCache } from './data-loader.browser';\n\nlet _browserInstance: IndiaPincode | null = null;\n\n/** Returns a singleton instance initialized with browser-loaded data. */\nexport async function getIndiaPincode(): Promise<IndiaPincode> {\n if (_browserInstance) return _browserInstance;\n const data = await loadBrowserData();\n _browserInstance = new IndiaPincode(data);\n return _browserInstance;\n}\n\n/** Creates a fresh instance (non-singleton) for advanced browser use cases. */\nexport async function createIndiaPincode(): Promise<IndiaPincode> {\n const data = await loadBrowserData();\n return new IndiaPincode(data);\n}\n\n/** Clears singleton and cached data in browser runtimes. */\nexport function clearBrowserCache(): void {\n _browserInstance = null;\n clearBrowserDataCache();\n}\n\nexport { IndiaPincode };\nexport {\n PostOffice,\n OfficeType,\n AreaInfo,\n QueryOptions,\n PaginatedResult,\n NearbyResult,\n PincodeSummary,\n DistrictSummary,\n StateSummary,\n ApiResponse,\n ApiError,\n ErrorCode,\n} from './types';\n"]}
1
+ {"version":3,"sources":["../src/types.ts","../src/pincode-lookup.ts","../src/data-loader.browser.ts","../src/browser.ts"],"names":["ErrorCode","COUNTRY","PINCODE_REGEX","ok","data","fail","code","message","suggestions","error","levenshtein","a","b","m","dp","i","j","findSimilar","index","query","field","max","q","words","w","scored","maxDist","key","records","originalName","score","word","keyWords","kw","dist","s","findFromAreas","areaIndex","exact","partial","r","results","p","mergeSuggestions","fromAreas","fromIndex","seen","merged","findSimilarPincodes","input","digits","candidate","IndiaPincode","pincode","o","keyFn","arr","options","limit","page","filtered","total","totalPages","start","trimmed","first","state","stateIndex","districtSet","pincodeSet","idx","district","districtIndex","set","d","name","officeType","deliveryOnly","matches","maxScan","lat","lng","radiusKm","dLat","dLng","toRad","minLat","maxLat","minLng","maxLng","haversine","sliced","deg","lat1","lon1","lat2","lon2","dLon","OFFICE_SUFFIX_REGEX","cachedData","sanitizeCityName","raw","trimStr","val","safeNum","n","isValidLatitude","isValidLongitude","normalizeOfficeType","upper","expand","rec","area","latitude","longitude","dedupKey","normalize","result","record","loadBrowserData","url","response","compressed","inflated","ungzip","json","clearBrowserDataCache","_browserInstance","getIndiaPincode","createIndiaPincode","clearBrowserCache"],"mappings":"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","file":"browser.js","sourcesContent":["// ─── Error handling ─────────────────────────────────────────────\nexport enum ErrorCode {\n INVALID_PINCODE = 'INVALID_PINCODE',\n PINCODE_NOT_FOUND = 'PINCODE_NOT_FOUND',\n STATE_NOT_FOUND = 'STATE_NOT_FOUND',\n DISTRICT_NOT_FOUND = 'DISTRICT_NOT_FOUND',\n INVALID_COORDINATES = 'INVALID_COORDINATES',\n INVALID_INPUT = 'INVALID_INPUT',\n NO_RESULTS = 'NO_RESULTS',\n}\n\nexport interface ApiError {\n code: ErrorCode;\n message: string;\n suggestions?: string[];\n}\n\nexport interface ApiResponse<T> {\n success: boolean;\n data: T | null;\n error?: ApiError;\n}\n\n// ─── Normalized public type ─────────────────────────────────────\nexport interface PostOffice {\n pincode: string;\n area: string;\n officeType: OfficeType;\n delivery: boolean;\n district: string;\n state: string;\n country: string;\n circle: string;\n region: string;\n division: string;\n latitude: number | null;\n longitude: number | null;\n}\n\nexport type OfficeType = 'BO' | 'SO' | 'HO' | 'PO' | 'GPO';\n\n// ─── Query options ──────────────────────────────────────────────\nexport interface QueryOptions {\n /** Max results to return (default: 100) */\n limit?: number;\n /** Page number, 1-based (default: 1) */\n page?: number;\n /** Filter by office type */\n officeType?: OfficeType;\n /** Filter only delivery offices */\n deliveryOnly?: boolean;\n}\n\n// ─── Paginated result ───────────────────────────────────────────\nexport interface PaginatedResult<T> {\n data: T[];\n total: number;\n page: number;\n limit: number;\n totalPages: number;\n}\n\n// ─── Location result (with distance) ────────────────────────────\nexport interface NearbyResult extends PostOffice {\n distanceKm: number;\n}\n\n// ─── Slim area shape (used in summaries) ────────────────────────\nexport interface AreaInfo {\n pincode: string;\n area: string;\n latitude: number | null;\n longitude: number | null;\n}\n\n// ─── Summary types ──────────────────────────────────────────────\nexport interface PincodeSummary {\n pincode: string;\n district: string;\n state: string;\n country: string;\n areas: AreaInfo[];\n deliveryAreas: number;\n hasCoordinates: boolean;\n}\n\nexport interface DistrictSummary {\n district: string;\n state: string;\n country: string;\n totalAreas: number;\n totalPincodes: number;\n pincodes: string[];\n}\n\nexport interface StateSummary {\n state: string;\n country: string;\n totalDistricts: number;\n totalAreas: number;\n totalPincodes: number;\n districts: string[];\n}\n","import {\n PostOffice,\n QueryOptions,\n PaginatedResult,\n NearbyResult,\n PincodeSummary,\n DistrictSummary,\n StateSummary,\n ApiResponse,\n ErrorCode,\n} from './types';\n\nconst COUNTRY = 'INDIA';\nconst PINCODE_REGEX = /^[1-9]\\d{5}$/;\n\n// ─── Response helpers ─────────────────────────────────────────────\n\nfunction ok<T>(data: T): ApiResponse<T> {\n return { success: true, data };\n}\n\nfunction fail<T>(code: ErrorCode, message: string, suggestions?: string[]): ApiResponse<T> {\n const error: { code: ErrorCode; message: string; suggestions?: string[] } = { code, message };\n if (suggestions && suggestions.length > 0) {\n error.suggestions = suggestions;\n error.message += ` Did you mean: ${suggestions.join(', ')}?`;\n }\n return { success: false, data: null, error };\n}\n\n/** Simple Levenshtein distance for fuzzy matching */\nfunction levenshtein(a: string, b: string): number {\n const m = a.length, n = b.length;\n const dp: number[][] = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));\n for (let i = 0; i <= m; i++) dp[i][0] = i;\n for (let j = 0; j <= n; j++) dp[0][j] = j;\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n dp[i][j] = a[i - 1] === b[j - 1]\n ? dp[i - 1][j - 1]\n : 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);\n }\n }\n return dp[m][n];\n}\n\n/**\n * Find similar keys from an index map using substring, word, and fuzzy matching.\n * Returns up to `max` original-cased names that partially match the query.\n */\nfunction findSimilar(\n index: Map<string, PostOffice[]>,\n query: string,\n field: 'district' | 'state' | 'area',\n max = 5,\n): string[] {\n const q = query.toLowerCase();\n const words = q.split(/\\s+/).filter((w) => w.length >= 3);\n const scored: { name: string; score: number }[] = [];\n // Allow edits proportional to query length (max 3), min query length 4\n const maxDist = q.length < 4 ? 0 : Math.min(3, Math.ceil(q.length / 3));\n\n for (const [key, records] of index) {\n if (!key) continue;\n const originalName = records[0] ? records[0][field] : key;\n\n let score = 0;\n\n // Exact substring match (highest) — skip very short queries to avoid noise\n if (q.length >= 3 && key.includes(q)) {\n score += 10;\n }\n\n // Individual word matches\n for (const word of words) {\n if (key.includes(word)) score += 3;\n }\n\n // Query is a substring of the key or vice versa\n if (q.length >= 4 && q.includes(key)) score += 5;\n\n // Fuzzy match: compare against each word in the key\n if (score === 0) {\n const keyWords = key.split(/\\s+/);\n for (const kw of keyWords) {\n const dist = levenshtein(q, kw);\n if (dist <= maxDist) {\n score += (10 - dist * 2);\n break;\n }\n }\n // Also try full key comparison for single-word queries\n if (score === 0 && keyWords.length === 1) {\n const dist = levenshtein(q, key);\n if (dist <= maxDist) {\n score += (10 - dist * 2);\n }\n }\n }\n\n if (score > 0) {\n scored.push({ name: originalName, score });\n }\n }\n\n return scored\n .sort((a, b) => b.score - a.score)\n .slice(0, max)\n .map((s) => s.name);\n}\n\n/**\n * Cross-index lookup: when a district/state isn't found, check if the query\n * matches an area name and return the districts/states those areas belong to.\n * Prioritizes exact area name matches, then partial matches.\n */\nfunction findFromAreas(\n areaIndex: Map<string, PostOffice[]>,\n query: string,\n field: 'district' | 'state',\n max = 5,\n): string[] {\n const q = query.toLowerCase();\n if (q.length < 3) return [];\n const exact = new Set<string>();\n const partial = new Set<string>();\n\n for (const [key, records] of areaIndex) {\n if (key === q) {\n for (const r of records) exact.add(r[field]);\n } else if (key.includes(q)) {\n for (const r of records) partial.add(r[field]);\n }\n }\n\n // Merge: exact matches first, then partial\n const results: string[] = Array.from(exact);\n for (const p of partial) {\n if (!exact.has(p)) results.push(p);\n if (results.length >= max) break;\n }\n\n return results;\n}\n\n/**\n * Merge suggestions from index-level fuzzy and cross-index area lookups.\n * Area cross-matches come first (more relevant), then fuzzy matches.\n */\nfunction mergeSuggestions(\n index: Map<string, PostOffice[]>,\n areaIndex: Map<string, PostOffice[]>,\n query: string,\n field: 'district' | 'state',\n max = 5,\n): string[] {\n const fromAreas = findFromAreas(areaIndex, query, field, max);\n const fromIndex = findSimilar(index, query, field, max);\n const seen = new Set(fromAreas);\n const merged = [...fromAreas];\n for (const s of fromIndex) {\n if (!seen.has(s)) {\n merged.push(s);\n seen.add(s);\n }\n if (merged.length >= max) break;\n }\n return merged.slice(0, max);\n}\n\n/**\n * Find similar pincodes when input is invalid or not found.\n * - Too long: extract all 6-digit substrings and check if they exist\n * - Too short / partial: prefix-match against known pincodes\n * - Typos: try single-digit corrections\n */\nfunction findSimilarPincodes(\n index: Map<string, PostOffice[]>,\n input: string,\n max = 5,\n): string[] {\n const digits = input.replace(/\\D/g, '');\n const results = new Set<string>();\n\n // Too long — try all 6-digit substrings\n if (digits.length > 6) {\n for (let i = 0; i <= digits.length - 6; i++) {\n const candidate = digits.substring(i, i + 6);\n if (index.has(candidate)) results.add(candidate);\n if (results.size >= max) return Array.from(results);\n }\n }\n\n // Prefix match — find pincodes starting with the digits\n if (digits.length >= 3 && digits.length <= 6) {\n for (const key of index.keys()) {\n if (key.startsWith(digits)) results.add(key);\n if (results.size >= max) return Array.from(results);\n }\n }\n\n return Array.from(results);\n}\n\n/**\n * - Geo-nearby → Haversine with early bounding-box pruning.\n * - All responses wrapped in ApiResponse with proper error codes.\n */\nexport class IndiaPincode {\n private _data: PostOffice[] | null;\n\n // ─── Indexes (lazy) ─────────────────────────────────────────\n private _byPincode: Map<string, PostOffice[]> | null = null;\n private _byState: Map<string, PostOffice[]> | null = null;\n private _byDistrict: Map<string, PostOffice[]> | null = null;\n private _byArea: Map<string, PostOffice[]> | null = null;\n\n constructor(data: PostOffice[]) {\n this._data = data;\n }\n\n private isValidPincode(pincode: string): boolean {\n return typeof pincode === 'string' && PINCODE_REGEX.test(pincode.trim());\n }\n\n private loadRuntimeData(): PostOffice[] {\n return this._data!;\n }\n\n // ─── Index builders ─────────────────────────────────────────\n private indexByPincode(): Map<string, PostOffice[]> {\n if (this._byPincode) return this._byPincode;\n this._byPincode = this.buildIndex((o) => o.pincode);\n return this._byPincode;\n }\n\n private indexByState(): Map<string, PostOffice[]> {\n if (this._byState) return this._byState;\n this._byState = this.buildIndex((o) => o.state.toLowerCase());\n return this._byState;\n }\n\n private indexByDistrict(): Map<string, PostOffice[]> {\n if (this._byDistrict) return this._byDistrict;\n this._byDistrict = this.buildIndex((o) => o.district.toLowerCase());\n return this._byDistrict;\n }\n\n private indexByArea(): Map<string, PostOffice[]> {\n if (this._byArea) return this._byArea;\n this._byArea = this.buildIndex((o) => o.area.toLowerCase());\n return this._byArea;\n }\n\n private buildIndex(keyFn: (o: PostOffice) => string): Map<string, PostOffice[]> {\n const data = this.loadRuntimeData();\n const index = new Map<string, PostOffice[]>();\n for (let i = 0; i < data.length; i++) {\n const key = keyFn(data[i]);\n if (!key) continue;\n const arr = index.get(key);\n if (arr) arr.push(data[i]);\n else index.set(key, [data[i]]);\n }\n return index;\n }\n\n // ─── Helper: apply filters + pagination ─────────────────────\n private paginate(\n records: PostOffice[],\n options?: QueryOptions,\n ): PaginatedResult<PostOffice> {\n const limit = Math.max(1, options?.limit ?? 100);\n const page = Math.max(1, options?.page ?? 1);\n let filtered = records;\n\n if (options?.officeType) {\n filtered = filtered.filter((r) => r.officeType === options.officeType);\n }\n if (options?.deliveryOnly) {\n filtered = filtered.filter((r) => r.delivery);\n }\n\n const total = filtered.length;\n const totalPages = Math.ceil(total / limit);\n const start = (page - 1) * limit;\n const data = filtered.slice(start, start + limit);\n\n return { data, total, page, limit, totalPages };\n }\n\n // ═══════════════════════════════════════════════════════════════\n // PUBLIC API\n // ═══════════════════════════════════════════════════════════════\n\n // ─── Pincode lookup (O(1)) ──────────────────────────────────\n\n /** Get all post offices for a pincode. Returns error for invalid/missing pincodes. */\n getByPincode(pincode: string, options?: QueryOptions): ApiResponse<PaginatedResult<PostOffice>> {\n if (!pincode || typeof pincode !== 'string') {\n return fail(ErrorCode.INVALID_INPUT, 'Pincode is required and must be a string.');\n }\n\n const trimmed = pincode.trim();\n if (!this.isValidPincode(trimmed)) {\n const suggestions = findSimilarPincodes(this.indexByPincode(), trimmed);\n return fail(\n ErrorCode.INVALID_PINCODE,\n `Invalid pincode \"${trimmed}\". Indian pincodes must be exactly 6 digits starting with 1-9.`,\n suggestions,\n );\n }\n\n const records = this.indexByPincode().get(trimmed);\n if (!records || records.length === 0) {\n const suggestions = findSimilarPincodes(this.indexByPincode(), trimmed);\n return fail(ErrorCode.PINCODE_NOT_FOUND, `No data found for pincode \"${trimmed}\".`, suggestions);\n }\n\n return ok(this.paginate(records, options));\n }\n\n /** Get a complete summary for a pincode. */\n getPincodeSummary(pincode: string): ApiResponse<PincodeSummary> {\n if (!pincode || typeof pincode !== 'string') {\n return fail(ErrorCode.INVALID_INPUT, 'Pincode is required and must be a string.');\n }\n\n const trimmed = pincode.trim();\n if (!this.isValidPincode(trimmed)) {\n const suggestions = findSimilarPincodes(this.indexByPincode(), trimmed);\n return fail(\n ErrorCode.INVALID_PINCODE,\n `Invalid pincode \"${trimmed}\". Indian pincodes must be exactly 6 digits starting with 1-9.`,\n suggestions,\n );\n }\n\n const records = this.indexByPincode().get(trimmed);\n if (!records || records.length === 0) {\n const suggestions = findSimilarPincodes(this.indexByPincode(), trimmed);\n return fail(ErrorCode.PINCODE_NOT_FOUND, `No data found for pincode \"${trimmed}\".`, suggestions);\n }\n\n const first = records[0];\n return ok({\n pincode: trimmed,\n district: first.district,\n state: first.state,\n country: COUNTRY,\n areas: records.map((r) => ({\n pincode: r.pincode,\n area: r.area,\n latitude: r.latitude,\n longitude: r.longitude,\n })),\n deliveryAreas: records.filter((o) => o.delivery).length,\n hasCoordinates: records.some((o) => o.latitude !== null),\n });\n }\n\n // ─── State queries ──────────────────────────────────────────\n\n /** Get all post offices in a state. */\n getByState(state: string, options?: QueryOptions): ApiResponse<PaginatedResult<PostOffice>> {\n if (!state || typeof state !== 'string' || !state.trim()) {\n return fail(ErrorCode.INVALID_INPUT, 'State name is required and must be a non-empty string.');\n }\n\n const stateIndex = this.indexByState();\n const records = stateIndex.get(state.trim().toLowerCase());\n if (!records || records.length === 0) {\n const suggestions = mergeSuggestions(stateIndex, this.indexByArea(), state.trim(), 'state');\n return fail(ErrorCode.STATE_NOT_FOUND, `No data found for state \"${state.trim()}\".`, suggestions);\n }\n\n return ok(this.paginate(records, options));\n }\n\n /** Get a summary for a state — districts, pincode count, etc. */\n getStateSummary(state: string): ApiResponse<StateSummary> {\n if (!state || typeof state !== 'string' || !state.trim()) {\n return fail(ErrorCode.INVALID_INPUT, 'State name is required and must be a non-empty string.');\n }\n\n const stateIndex = this.indexByState();\n const records = stateIndex.get(state.trim().toLowerCase());\n if (!records || records.length === 0) {\n const suggestions = mergeSuggestions(stateIndex, this.indexByArea(), state.trim(), 'state');\n return fail(ErrorCode.STATE_NOT_FOUND, `No data found for state \"${state.trim()}\".`, suggestions);\n }\n\n const districtSet = new Set<string>();\n const pincodeSet = new Set<string>();\n for (const r of records) {\n if (r.district) districtSet.add(r.district);\n pincodeSet.add(r.pincode);\n }\n\n return ok({\n state: records[0].state,\n country: COUNTRY,\n totalDistricts: districtSet.size,\n totalAreas: records.length,\n totalPincodes: pincodeSet.size,\n districts: Array.from(districtSet).sort(),\n });\n }\n\n /** Get all unique state names. */\n getAllStates(): string[] {\n const idx = this.indexByState();\n return Array.from(idx.keys())\n .filter((s) => s.length > 0)\n .map((s) => {\n const first = idx.get(s);\n return first ? first[0].state : s;\n })\n .sort();\n }\n\n // ─── District queries ───────────────────────────────────────\n\n /** Get all post offices in a district. */\n getByDistrict(district: string, options?: QueryOptions): ApiResponse<PaginatedResult<PostOffice>> {\n if (!district || typeof district !== 'string' || !district.trim()) {\n return fail(ErrorCode.INVALID_INPUT, 'District name is required and must be a non-empty string.');\n }\n\n const districtIndex = this.indexByDistrict();\n const records = districtIndex.get(district.trim().toLowerCase());\n if (!records || records.length === 0) {\n const suggestions = mergeSuggestions(districtIndex, this.indexByArea(), district.trim(), 'district');\n return fail(ErrorCode.DISTRICT_NOT_FOUND, `No data found for district \"${district.trim()}\".`, suggestions);\n }\n\n return ok(this.paginate(records, options));\n }\n\n /** Get a summary for a district. */\n getDistrictSummary(district: string): ApiResponse<DistrictSummary> {\n if (!district || typeof district !== 'string' || !district.trim()) {\n return fail(ErrorCode.INVALID_INPUT, 'District name is required and must be a non-empty string.');\n }\n\n const districtIndex = this.indexByDistrict();\n const records = districtIndex.get(district.trim().toLowerCase());\n if (!records || records.length === 0) {\n const suggestions = mergeSuggestions(districtIndex, this.indexByArea(), district.trim(), 'district');\n return fail(ErrorCode.DISTRICT_NOT_FOUND, `No data found for district \"${district.trim()}\".`, suggestions);\n }\n\n const pincodeSet = new Set<string>();\n for (const r of records) pincodeSet.add(r.pincode);\n\n return ok({\n district: records[0].district,\n state: records[0].state,\n country: COUNTRY,\n totalAreas: records.length,\n totalPincodes: pincodeSet.size,\n pincodes: Array.from(pincodeSet).sort(),\n });\n }\n\n /** Get all districts for a state. */\n getDistrictsByState(state: string): ApiResponse<string[]> {\n if (!state || typeof state !== 'string' || !state.trim()) {\n return fail(ErrorCode.INVALID_INPUT, 'State name is required and must be a non-empty string.');\n }\n\n const stateIndex = this.indexByState();\n const records = stateIndex.get(state.trim().toLowerCase());\n if (!records || records.length === 0) {\n const suggestions = mergeSuggestions(stateIndex, this.indexByArea(), state.trim(), 'state');\n return fail(ErrorCode.STATE_NOT_FOUND, `No data found for state \"${state.trim()}\".`, suggestions);\n }\n\n const set = new Set<string>();\n for (const r of records) {\n if (r.district) set.add(r.district);\n }\n return ok(Array.from(set).sort());\n }\n\n /** Get all unique district names. */\n getAllDistricts(): string[] {\n const idx = this.indexByDistrict();\n return Array.from(idx.keys())\n .filter((d) => d.length > 0)\n .map((d) => {\n const first = idx.get(d);\n return first ? first[0].district : d;\n })\n .sort();\n }\n\n // ─── Area name queries ───────────────────────────────────────\n\n /** Get post offices by exact area name (case-insensitive). */\n getByArea(name: string, options?: QueryOptions): ApiResponse<PaginatedResult<PostOffice>> {\n if (!name || typeof name !== 'string' || !name.trim()) {\n return fail(ErrorCode.INVALID_INPUT, 'Area name is required and must be a non-empty string.');\n }\n\n const areaIndex = this.indexByArea();\n const records = areaIndex.get(name.trim().toLowerCase());\n if (!records || records.length === 0) {\n const suggestions = findSimilar(areaIndex, name.trim(), 'area');\n return fail(ErrorCode.NO_RESULTS, `No data found for area \"${name.trim()}\".`, suggestions);\n }\n\n return ok(this.paginate(records, options));\n }\n\n // ─── Pincode range queries ──────────────────────────────────\n\n /** Get all pincodes in a state. */\n getPincodesByState(state: string): ApiResponse<string[]> {\n if (!state || typeof state !== 'string' || !state.trim()) {\n return fail(ErrorCode.INVALID_INPUT, 'State name is required and must be a non-empty string.');\n }\n\n const stateIndex = this.indexByState();\n const records = stateIndex.get(state.trim().toLowerCase());\n if (!records || records.length === 0) {\n const suggestions = mergeSuggestions(stateIndex, this.indexByArea(), state.trim(), 'state');\n return fail(ErrorCode.STATE_NOT_FOUND, `No data found for state \"${state.trim()}\".`, suggestions);\n }\n\n const set = new Set<string>();\n for (const r of records) set.add(r.pincode);\n return ok(Array.from(set).sort());\n }\n\n /** Get all pincodes in a district. */\n getPincodesByDistrict(district: string): ApiResponse<string[]> {\n if (!district || typeof district !== 'string' || !district.trim()) {\n return fail(ErrorCode.INVALID_INPUT, 'District name is required and must be a non-empty string.');\n }\n\n const districtIndex = this.indexByDistrict();\n const records = districtIndex.get(district.trim().toLowerCase());\n if (!records || records.length === 0) {\n const suggestions = mergeSuggestions(districtIndex, this.indexByArea(), district.trim(), 'district');\n return fail(ErrorCode.DISTRICT_NOT_FOUND, `No data found for district \"${district.trim()}\".`, suggestions);\n }\n\n const set = new Set<string>();\n for (const r of records) set.add(r.pincode);\n return ok(Array.from(set).sort());\n }\n\n // ─── Free-text search ───────────────────────────────────────\n\n /**\n * Search across pincode, area name, district, state.\n * Returns early once limit is reached — no wasted iteration.\n */\n search(query: string, options?: QueryOptions): ApiResponse<PaginatedResult<PostOffice>> {\n if (!query || typeof query !== 'string' || !query.trim()) {\n return fail(ErrorCode.INVALID_INPUT, 'Search query is required and must be a non-empty string.');\n }\n\n const data = this.loadRuntimeData();\n const q = query.trim().toLowerCase();\n const limit = Math.max(1, options?.limit ?? 100);\n const page = Math.max(1, options?.page ?? 1);\n const officeType = options?.officeType;\n const deliveryOnly = options?.deliveryOnly;\n\n const matches: PostOffice[] = [];\n const maxScan = (page * limit) + limit; // fetch enough for pagination\n\n for (let i = 0; i < data.length && matches.length < maxScan; i++) {\n const r = data[i];\n if (officeType && r.officeType !== officeType) continue;\n if (deliveryOnly && !r.delivery) continue;\n\n if (\n r.pincode.includes(q) ||\n r.area.toLowerCase().includes(q) ||\n r.district.toLowerCase().includes(q) ||\n r.state.toLowerCase().includes(q) ||\n r.circle.toLowerCase().includes(q) ||\n r.region.toLowerCase().includes(q)\n ) {\n matches.push(r);\n }\n }\n\n if (matches.length === 0) {\n return fail(ErrorCode.NO_RESULTS, `No results found for \"${query.trim()}\".`);\n }\n\n const total = matches.length;\n const totalPages = Math.ceil(total / limit);\n const start = (page - 1) * limit;\n\n return ok({\n data: matches.slice(start, start + limit),\n total,\n page,\n limit,\n totalPages,\n });\n }\n\n // ─── Geo: nearby search ─────────────────────────────────────\n\n /**\n * Find post offices near a given coordinate.\n * Uses bounding-box pre-filter + Haversine for accuracy.\n * Returns sorted by distance ascending.\n */\n findNearby(\n lat: number,\n lng: number,\n radiusKm = 10,\n limit = 20,\n ): ApiResponse<NearbyResult[]> {\n if (typeof lat !== 'number' || typeof lng !== 'number' || !Number.isFinite(lat) || !Number.isFinite(lng)) {\n return fail(ErrorCode.INVALID_COORDINATES, 'Latitude and longitude must be valid numbers.');\n }\n if (lat < -90 || lat > 90 || lng < -180 || lng > 180) {\n return fail(\n ErrorCode.INVALID_COORDINATES,\n `Invalid coordinates (${lat}, ${lng}). Latitude must be -90 to 90, longitude -180 to 180.`,\n );\n }\n const data = this.loadRuntimeData();\n // Bounding-box pre-filter (1 degree ≈ 111 km)\n const dLat = radiusKm / 111;\n const dLng = radiusKm / (111 * Math.cos(toRad(lat)));\n const minLat = lat - dLat;\n const maxLat = lat + dLat;\n const minLng = lng - dLng;\n const maxLng = lng + dLng;\n\n const results: NearbyResult[] = [];\n\n for (let i = 0; i < data.length; i++) {\n const r = data[i];\n if (r.latitude === null || r.longitude === null) continue;\n // Bounding box check (cheap)\n if (r.latitude < minLat || r.latitude > maxLat) continue;\n if (r.longitude < minLng || r.longitude > maxLng) continue;\n // Haversine (accurate)\n const d = haversine(lat, lng, r.latitude, r.longitude);\n if (d <= radiusKm) {\n results.push({ ...r, distanceKm: Math.round(d * 100) / 100 });\n }\n }\n\n results.sort((a, b) => a.distanceKm - b.distanceKm);\n const sliced = results.slice(0, limit);\n\n if (sliced.length === 0) {\n return fail(ErrorCode.NO_RESULTS, `No post offices found within ${radiusKm}km of (${lat}, ${lng}).`);\n }\n\n return ok(sliced);\n }\n\n // ─── Bulk / utility ─────────────────────────────────────────\n\n /** Total number of post office records loaded. */\n getTotalRecords(): number {\n return this.loadRuntimeData().length;\n }\n\n /** Total number of unique pincodes. */\n getTotalPincodes(): number {\n return this.indexByPincode().size;\n }\n\n /** Clear all cached data and indexes — reloads fresh on next call. */\n /** Clear all cached indexes — rebuilds on next call. */\n clearCache(): void {\n this._byPincode = null;\n this._byState = null;\n this._byDistrict = null;\n this._byArea = null;\n }\n}\n\n// ─── Haversine helpers ────────────────────────────────────────────\nfunction toRad(deg: number): number {\n return deg * (Math.PI / 180);\n}\n\nfunction haversine(lat1: number, lon1: number, lat2: number, lon2: number): number {\n const R = 6371;\n const dLat = toRad(lat2 - lat1);\n const dLon = toRad(lon2 - lon1);\n const a =\n Math.sin(dLat / 2) ** 2 +\n Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) * Math.sin(dLon / 2) ** 2;\n return R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n}\n\n\n","import { ungzip } from 'pako';\nimport { PostOffice, OfficeType } from './types';\n\nconst COUNTRY = 'INDIA';\nconst PINCODE_REGEX = /^[1-9]\\d{5}$/;\n\ninterface CompactRecord {\n c: string;\n r: string;\n v: string;\n o: string;\n p: string;\n t: string;\n d: number;\n i: string;\n s: string;\n a: number;\n n: number;\n}\n\nconst OFFICE_SUFFIX_REGEX =\n /\\s+\\(?(?:B\\.?O\\.?|S\\.?O\\.?|H\\.?O\\.?|P\\.?O\\.?|G\\.?P\\.?O\\.?|M\\.?D\\.?G\\.?|R\\.?M\\.?S\\.?)\\)?\\s*$/i;\n\nlet cachedData: PostOffice[] | null = null;\n\nfunction sanitizeCityName(raw: string): string {\n if (!raw || typeof raw !== 'string') return '';\n return raw.replace(OFFICE_SUFFIX_REGEX, '').replace(/\\s{2,}/g, ' ').trim();\n}\n\nfunction trimStr(val: unknown): string {\n if (val === null || val === undefined) return '';\n const s = String(val).trim();\n return s === 'NA' ? '' : s.replace(/\\s{2,}/g, ' ');\n}\n\nfunction safeNum(val: unknown): number | null {\n if (val === null || val === undefined) return null;\n const n = Number(val);\n if (!Number.isFinite(n) || n === 0) return null;\n return n;\n}\n\nfunction isValidLatitude(lat: number | null): boolean {\n return lat === null || (lat >= -90 && lat <= 90);\n}\n\nfunction isValidLongitude(lng: number | null): boolean {\n return lng === null || (lng >= -180 && lng <= 180);\n}\n\nfunction normalizeOfficeType(raw: string): OfficeType {\n const upper = String(raw).replace(/\\./g, '').toUpperCase().trim();\n const valid: OfficeType[] = ['BO', 'SO', 'HO', 'PO', 'GPO'];\n return (valid.includes(upper as OfficeType) ? upper : 'BO') as OfficeType;\n}\n\nfunction expand(rec: CompactRecord): PostOffice | null {\n const pincode = trimStr(rec.p);\n const area = sanitizeCityName(trimStr(rec.o));\n const district = trimStr(rec.i);\n const state = trimStr(rec.s);\n\n if (!pincode || !area || !district || !state) return null;\n if (!PINCODE_REGEX.test(pincode)) return null;\n\n const latitude = safeNum(rec.a);\n const longitude = safeNum(rec.n);\n if (!isValidLatitude(latitude) || !isValidLongitude(longitude)) return null;\n\n return {\n pincode,\n area,\n officeType: normalizeOfficeType(rec.t),\n delivery: rec.d === 1,\n district,\n state,\n country: COUNTRY,\n circle: trimStr(rec.c),\n region: trimStr(rec.r),\n division: trimStr(rec.v),\n latitude,\n longitude,\n };\n}\n\nfunction dedupKey(r: PostOffice): string {\n return `${r.pincode}|${r.area.toLowerCase()}|${r.district.toLowerCase()}|${r.officeType}`;\n}\n\nfunction normalize(raw: CompactRecord[]): PostOffice[] {\n const seen = new Set<string>();\n const result: PostOffice[] = [];\n\n for (let i = 0; i < raw.length; i++) {\n const record = expand(raw[i]);\n if (!record) continue;\n\n const key = dedupKey(record);\n if (seen.has(key)) continue;\n\n seen.add(key);\n result.push(record);\n }\n\n return result;\n}\n\n/** Browser-safe loader that fetches and inflates gzipped dataset. */\nexport async function loadBrowserData(): Promise<PostOffice[]> {\n if (cachedData) return cachedData;\n\n const url = new URL('../data/pincodes.json.gz', import.meta.url);\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`india-pincode: failed to load data (${response.status} ${response.statusText})`);\n }\n\n const compressed = new Uint8Array(await response.arrayBuffer());\n const inflated = ungzip(compressed);\n const json = new TextDecoder().decode(inflated);\n const raw = JSON.parse(json) as CompactRecord[];\n\n cachedData = normalize(raw);\n return cachedData;\n}\n\nexport function clearBrowserDataCache(): void {\n cachedData = null;\n}\n","import { IndiaPincode } from './pincode-lookup';\nimport { loadBrowserData, clearBrowserDataCache } from './data-loader.browser';\n\nlet _browserInstance: IndiaPincode | null = null;\n\n/** Returns a singleton instance initialized with browser-loaded data. */\nexport async function getIndiaPincode(): Promise<IndiaPincode> {\n if (_browserInstance) return _browserInstance;\n const data = await loadBrowserData();\n _browserInstance = new IndiaPincode(data);\n return _browserInstance;\n}\n\n/** Creates a fresh instance (non-singleton) for advanced browser use cases. */\nexport async function createIndiaPincode(): Promise<IndiaPincode> {\n const data = await loadBrowserData();\n return new IndiaPincode(data);\n}\n\n/** Clears singleton and cached data in browser runtimes. */\nexport function clearBrowserCache(): void {\n _browserInstance = null;\n clearBrowserDataCache();\n}\n\nexport { IndiaPincode };\nexport {\n PostOffice,\n OfficeType,\n AreaInfo,\n QueryOptions,\n PaginatedResult,\n NearbyResult,\n PincodeSummary,\n DistrictSummary,\n StateSummary,\n ApiResponse,\n ApiError,\n ErrorCode,\n} from './types';\n"]}
package/dist/browser.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import {inflate}from'pako';var T=(c=>(c.INVALID_PINCODE="INVALID_PINCODE",c.PINCODE_NOT_FOUND="PINCODE_NOT_FOUND",c.STATE_NOT_FOUND="STATE_NOT_FOUND",c.DISTRICT_NOT_FOUND="DISTRICT_NOT_FOUND",c.INVALID_COORDINATES="INVALID_COORDINATES",c.INVALID_INPUT="INVALID_INPUT",c.NO_RESULTS="NO_RESULTS",c))(T||{});var S="INDIA",B=/^[1-9]\d{5}$/;function p(s){return {success:true,data:s}}function u(s,t,i){let n={code:s,message:t};return i&&i.length>0&&(n.suggestions=i,n.message+=` Did you mean: ${i.join(", ")}?`),{success:false,data:null,error:n}}function R(s,t){let i=s.length,n=t.length,r=Array.from({length:i+1},()=>Array(n+1).fill(0));for(let e=0;e<=i;e++)r[e][0]=e;for(let e=0;e<=n;e++)r[0][e]=e;for(let e=1;e<=i;e++)for(let o=1;o<=n;o++)r[e][o]=s[e-1]===t[o-1]?r[e-1][o-1]:1+Math.min(r[e-1][o],r[e][o-1],r[e-1][o-1]);return r[i][n]}function L(s,t,i,n=5){let r=t.toLowerCase(),e=r.split(/\s+/).filter(a=>a.length>=3),o=[],c=r.length<4?0:Math.min(3,Math.ceil(r.length/3));for(let[a,f]of s){if(!a)continue;let g=f[0]?f[0][i]:a,l=0;r.length>=3&&a.includes(r)&&(l+=10);for(let y of e)a.includes(y)&&(l+=3);if(r.length>=4&&r.includes(a)&&(l+=5),l===0){let y=a.split(/\s+/);for(let h of y){let m=R(r,h);if(m<=c){l+=10-m*2;break}}if(l===0&&y.length===1){let h=R(r,a);h<=c&&(l+=10-h*2);}}l>0&&o.push({name:g,score:l});}return o.sort((a,f)=>f.score-a.score).slice(0,n).map(a=>a.name)}function U(s,t,i,n=5){let r=t.toLowerCase();if(r.length<3)return [];let e=new Set,o=new Set;for(let[a,f]of s)if(a===r)for(let g of f)e.add(g[i]);else if(a.includes(r))for(let g of f)o.add(g[i]);let c=Array.from(e);for(let a of o)if(e.has(a)||c.push(a),c.length>=n)break;return c}function O(s,t,i,n,r=5){let e=U(t,i,n,r),o=L(s,i,n,r),c=new Set(e),a=[...e];for(let f of o)if(c.has(f)||(a.push(f),c.add(f)),a.length>=r)break;return a.slice(0,r)}function D(s,t,i=5){let n=t.replace(/\D/g,""),r=new Set;if(n.length>6)for(let e=0;e<=n.length-6;e++){let o=n.substring(e,e+6);if(s.has(o)&&r.add(o),r.size>=i)return Array.from(r)}if(n.length>=3&&n.length<=6){for(let e of s.keys())if(e.startsWith(n)&&r.add(e),r.size>=i)return Array.from(r)}return Array.from(r)}var N=class{constructor(t){this._byPincode=null;this._byState=null;this._byDistrict=null;this._byArea=null;this._data=t;}isValidPincode(t){return typeof t=="string"&&B.test(t.trim())}loadRuntimeData(){return this._data}indexByPincode(){return this._byPincode?this._byPincode:(this._byPincode=this.buildIndex(t=>t.pincode),this._byPincode)}indexByState(){return this._byState?this._byState:(this._byState=this.buildIndex(t=>t.state.toLowerCase()),this._byState)}indexByDistrict(){return this._byDistrict?this._byDistrict:(this._byDistrict=this.buildIndex(t=>t.district.toLowerCase()),this._byDistrict)}indexByArea(){return this._byArea?this._byArea:(this._byArea=this.buildIndex(t=>t.area.toLowerCase()),this._byArea)}buildIndex(t){let i=this.loadRuntimeData(),n=new Map;for(let r=0;r<i.length;r++){let e=t(i[r]);if(!e)continue;let o=n.get(e);o?o.push(i[r]):n.set(e,[i[r]]);}return n}paginate(t,i){let n=Math.max(1,i?.limit??100),r=Math.max(1,i?.page??1),e=t;i?.officeType&&(e=e.filter(g=>g.officeType===i.officeType)),i?.deliveryOnly&&(e=e.filter(g=>g.delivery));let o=e.length,c=Math.ceil(o/n),a=(r-1)*n;return {data:e.slice(a,a+n),total:o,page:r,limit:n,totalPages:c}}getByPincode(t,i){if(!t||typeof t!="string")return u("INVALID_INPUT","Pincode is required and must be a string.");let n=t.trim();if(!this.isValidPincode(n)){let e=D(this.indexByPincode(),n);return u("INVALID_PINCODE",`Invalid pincode "${n}". Indian pincodes must be exactly 6 digits starting with 1-9.`,e)}let r=this.indexByPincode().get(n);if(!r||r.length===0){let e=D(this.indexByPincode(),n);return u("PINCODE_NOT_FOUND",`No data found for pincode "${n}".`,e)}return p(this.paginate(r,i))}getPincodeSummary(t){if(!t||typeof t!="string")return u("INVALID_INPUT","Pincode is required and must be a string.");let i=t.trim();if(!this.isValidPincode(i)){let e=D(this.indexByPincode(),i);return u("INVALID_PINCODE",`Invalid pincode "${i}". Indian pincodes must be exactly 6 digits starting with 1-9.`,e)}let n=this.indexByPincode().get(i);if(!n||n.length===0){let e=D(this.indexByPincode(),i);return u("PINCODE_NOT_FOUND",`No data found for pincode "${i}".`,e)}let r=n[0];return p({pincode:i,district:r.district,state:r.state,country:S,areas:n.map(e=>({pincode:e.pincode,area:e.area,latitude:e.latitude,longitude:e.longitude})),deliveryAreas:n.filter(e=>e.delivery).length,hasCoordinates:n.some(e=>e.latitude!==null)})}getByState(t,i){if(!t||typeof t!="string"||!t.trim())return u("INVALID_INPUT","State name is required and must be a non-empty string.");let n=this.indexByState(),r=n.get(t.trim().toLowerCase());if(!r||r.length===0){let e=O(n,this.indexByArea(),t.trim(),"state");return u("STATE_NOT_FOUND",`No data found for state "${t.trim()}".`,e)}return p(this.paginate(r,i))}getStateSummary(t){if(!t||typeof t!="string"||!t.trim())return u("INVALID_INPUT","State name is required and must be a non-empty string.");let i=this.indexByState(),n=i.get(t.trim().toLowerCase());if(!n||n.length===0){let o=O(i,this.indexByArea(),t.trim(),"state");return u("STATE_NOT_FOUND",`No data found for state "${t.trim()}".`,o)}let r=new Set,e=new Set;for(let o of n)o.district&&r.add(o.district),e.add(o.pincode);return p({state:n[0].state,country:S,totalDistricts:r.size,totalAreas:n.length,totalPincodes:e.size,districts:Array.from(r).sort()})}getAllStates(){let t=this.indexByState();return Array.from(t.keys()).filter(i=>i.length>0).map(i=>{let n=t.get(i);return n?n[0].state:i}).sort()}getByDistrict(t,i){if(!t||typeof t!="string"||!t.trim())return u("INVALID_INPUT","District name is required and must be a non-empty string.");let n=this.indexByDistrict(),r=n.get(t.trim().toLowerCase());if(!r||r.length===0){let e=O(n,this.indexByArea(),t.trim(),"district");return u("DISTRICT_NOT_FOUND",`No data found for district "${t.trim()}".`,e)}return p(this.paginate(r,i))}getDistrictSummary(t){if(!t||typeof t!="string"||!t.trim())return u("INVALID_INPUT","District name is required and must be a non-empty string.");let i=this.indexByDistrict(),n=i.get(t.trim().toLowerCase());if(!n||n.length===0){let e=O(i,this.indexByArea(),t.trim(),"district");return u("DISTRICT_NOT_FOUND",`No data found for district "${t.trim()}".`,e)}let r=new Set;for(let e of n)r.add(e.pincode);return p({district:n[0].district,state:n[0].state,country:S,totalAreas:n.length,totalPincodes:r.size,pincodes:Array.from(r).sort()})}getDistrictsByState(t){if(!t||typeof t!="string"||!t.trim())return u("INVALID_INPUT","State name is required and must be a non-empty string.");let i=this.indexByState(),n=i.get(t.trim().toLowerCase());if(!n||n.length===0){let e=O(i,this.indexByArea(),t.trim(),"state");return u("STATE_NOT_FOUND",`No data found for state "${t.trim()}".`,e)}let r=new Set;for(let e of n)e.district&&r.add(e.district);return p(Array.from(r).sort())}getAllDistricts(){let t=this.indexByDistrict();return Array.from(t.keys()).filter(i=>i.length>0).map(i=>{let n=t.get(i);return n?n[0].district:i}).sort()}getByArea(t,i){if(!t||typeof t!="string"||!t.trim())return u("INVALID_INPUT","Area name is required and must be a non-empty string.");let n=this.indexByArea(),r=n.get(t.trim().toLowerCase());if(!r||r.length===0){let e=L(n,t.trim(),"area");return u("NO_RESULTS",`No data found for area "${t.trim()}".`,e)}return p(this.paginate(r,i))}getPincodesByState(t){if(!t||typeof t!="string"||!t.trim())return u("INVALID_INPUT","State name is required and must be a non-empty string.");let i=this.indexByState(),n=i.get(t.trim().toLowerCase());if(!n||n.length===0){let e=O(i,this.indexByArea(),t.trim(),"state");return u("STATE_NOT_FOUND",`No data found for state "${t.trim()}".`,e)}let r=new Set;for(let e of n)r.add(e.pincode);return p(Array.from(r).sort())}getPincodesByDistrict(t){if(!t||typeof t!="string"||!t.trim())return u("INVALID_INPUT","District name is required and must be a non-empty string.");let i=this.indexByDistrict(),n=i.get(t.trim().toLowerCase());if(!n||n.length===0){let e=O(i,this.indexByArea(),t.trim(),"district");return u("DISTRICT_NOT_FOUND",`No data found for district "${t.trim()}".`,e)}let r=new Set;for(let e of n)r.add(e.pincode);return p(Array.from(r).sort())}search(t,i){if(!t||typeof t!="string"||!t.trim())return u("INVALID_INPUT","Search query is required and must be a non-empty string.");let n=this.loadRuntimeData(),r=t.trim().toLowerCase(),e=Math.max(1,i?.limit??100),o=Math.max(1,i?.page??1),c=i?.officeType,a=i?.deliveryOnly,f=[],g=o*e+e;for(let m=0;m<n.length&&f.length<g;m++){let d=n[m];c&&d.officeType!==c||a&&!d.delivery||(d.pincode.includes(r)||d.area.toLowerCase().includes(r)||d.district.toLowerCase().includes(r)||d.state.toLowerCase().includes(r)||d.circle.toLowerCase().includes(r)||d.region.toLowerCase().includes(r))&&f.push(d);}if(f.length===0)return u("NO_RESULTS",`No results found for "${t.trim()}".`);let l=f.length,y=Math.ceil(l/e),h=(o-1)*e;return p({data:f.slice(h,h+e),total:l,page:o,limit:e,totalPages:y})}findNearby(t,i,n=10,r=20){if(typeof t!="number"||typeof i!="number"||!Number.isFinite(t)||!Number.isFinite(i))return u("INVALID_COORDINATES","Latitude and longitude must be valid numbers.");if(t<-90||t>90||i<-180||i>180)return u("INVALID_COORDINATES",`Invalid coordinates (${t}, ${i}). Latitude must be -90 to 90, longitude -180 to 180.`);let e=this.loadRuntimeData(),o=n/111,c=n/(111*Math.cos(I(t))),a=t-o,f=t+o,g=i-c,l=i+c,y=[];for(let m=0;m<e.length;m++){let d=e[m];if(d.latitude===null||d.longitude===null||d.latitude<a||d.latitude>f||d.longitude<g||d.longitude>l)continue;let x=M(t,i,d.latitude,d.longitude);x<=n&&y.push({...d,distanceKm:Math.round(x*100)/100});}y.sort((m,d)=>m.distanceKm-d.distanceKm);let h=y.slice(0,r);return h.length===0?u("NO_RESULTS",`No post offices found within ${n}km of (${t}, ${i}).`):p(h)}getTotalRecords(){return this.loadRuntimeData().length}getTotalPincodes(){return this.indexByPincode().size}clearCache(){this._byPincode=null,this._byState=null,this._byDistrict=null,this._byArea=null;}};function I(s){return s*(Math.PI/180)}function M(s,t,i,n){let e=I(i-s),o=I(n-t),c=Math.sin(e/2)**2+Math.cos(I(s))*Math.cos(I(i))*Math.sin(o/2)**2;return 6371*2*Math.atan2(Math.sqrt(c),Math.sqrt(1-c))}var E="INDIA",$=/^[1-9]\d{5}$/,V=/\s+\(?(?:B\.?O\.?|S\.?O\.?|H\.?O\.?|P\.?O\.?|G\.?P\.?O\.?|M\.?D\.?G\.?|R\.?M\.?S\.?)\)?\s*$/i,b=null;function F(s){return !s||typeof s!="string"?"":s.replace(V,"").replace(/\s{2,}/g," ").trim()}function P(s){if(s==null)return "";let t=String(s).trim();return t==="NA"?"":t.replace(/\s{2,}/g," ")}function w(s){if(s==null)return null;let t=Number(s);return !Number.isFinite(t)||t===0?null:t}function k(s){return s===null||s>=-90&&s<=90}function q(s){return s===null||s>=-180&&s<=180}function z(s){let t=String(s).replace(/\./g,"").toUpperCase().trim();return ["BO","SO","HO","PO","GPO"].includes(t)?t:"BO"}function Q(s){let t=P(s.p),i=F(P(s.o)),n=P(s.i),r=P(s.s);if(!t||!i||!n||!r||!$.test(t))return null;let e=w(s.a),o=w(s.n);return !k(e)||!q(o)?null:{pincode:t,area:i,officeType:z(s.t),delivery:s.d===1,district:n,state:r,country:E,circle:P(s.c),region:P(s.r),division:P(s.v),latitude:e,longitude:o}}function G(s){return `${s.pincode}|${s.area.toLowerCase()}|${s.district.toLowerCase()}|${s.officeType}`}function j(s){let t=new Set,i=[];for(let n=0;n<s.length;n++){let r=Q(s[n]);if(!r)continue;let e=G(r);t.has(e)||(t.add(e),i.push(r));}return i}async function _(){if(b)return b;let s=new URL("../data/pincodes.json.gz",import.meta.url),t=await fetch(s);if(!t.ok)throw new Error(`india-pincode: failed to load data (${t.status} ${t.statusText})`);let i=new Uint8Array(await t.arrayBuffer()),n=inflate(i),r=new TextDecoder().decode(n),e=JSON.parse(r);return b=j(e),b}function C(){b=null;}var A=null;async function ct(){if(A)return A;let s=await _();return A=new N(s),A}async function ut(){let s=await _();return new N(s)}function dt(){A=null,C();}export{T as ErrorCode,N as IndiaPincode,dt as clearBrowserCache,ut as createIndiaPincode,ct as getIndiaPincode};//# sourceMappingURL=browser.mjs.map
1
+ import {ungzip}from'pako';var T=(c=>(c.INVALID_PINCODE="INVALID_PINCODE",c.PINCODE_NOT_FOUND="PINCODE_NOT_FOUND",c.STATE_NOT_FOUND="STATE_NOT_FOUND",c.DISTRICT_NOT_FOUND="DISTRICT_NOT_FOUND",c.INVALID_COORDINATES="INVALID_COORDINATES",c.INVALID_INPUT="INVALID_INPUT",c.NO_RESULTS="NO_RESULTS",c))(T||{});var S="INDIA",B=/^[1-9]\d{5}$/;function p(s){return {success:true,data:s}}function u(s,t,i){let n={code:s,message:t};return i&&i.length>0&&(n.suggestions=i,n.message+=` Did you mean: ${i.join(", ")}?`),{success:false,data:null,error:n}}function R(s,t){let i=s.length,n=t.length,r=Array.from({length:i+1},()=>Array(n+1).fill(0));for(let e=0;e<=i;e++)r[e][0]=e;for(let e=0;e<=n;e++)r[0][e]=e;for(let e=1;e<=i;e++)for(let o=1;o<=n;o++)r[e][o]=s[e-1]===t[o-1]?r[e-1][o-1]:1+Math.min(r[e-1][o],r[e][o-1],r[e-1][o-1]);return r[i][n]}function L(s,t,i,n=5){let r=t.toLowerCase(),e=r.split(/\s+/).filter(a=>a.length>=3),o=[],c=r.length<4?0:Math.min(3,Math.ceil(r.length/3));for(let[a,f]of s){if(!a)continue;let g=f[0]?f[0][i]:a,l=0;r.length>=3&&a.includes(r)&&(l+=10);for(let y of e)a.includes(y)&&(l+=3);if(r.length>=4&&r.includes(a)&&(l+=5),l===0){let y=a.split(/\s+/);for(let h of y){let m=R(r,h);if(m<=c){l+=10-m*2;break}}if(l===0&&y.length===1){let h=R(r,a);h<=c&&(l+=10-h*2);}}l>0&&o.push({name:g,score:l});}return o.sort((a,f)=>f.score-a.score).slice(0,n).map(a=>a.name)}function U(s,t,i,n=5){let r=t.toLowerCase();if(r.length<3)return [];let e=new Set,o=new Set;for(let[a,f]of s)if(a===r)for(let g of f)e.add(g[i]);else if(a.includes(r))for(let g of f)o.add(g[i]);let c=Array.from(e);for(let a of o)if(e.has(a)||c.push(a),c.length>=n)break;return c}function O(s,t,i,n,r=5){let e=U(t,i,n,r),o=L(s,i,n,r),c=new Set(e),a=[...e];for(let f of o)if(c.has(f)||(a.push(f),c.add(f)),a.length>=r)break;return a.slice(0,r)}function D(s,t,i=5){let n=t.replace(/\D/g,""),r=new Set;if(n.length>6)for(let e=0;e<=n.length-6;e++){let o=n.substring(e,e+6);if(s.has(o)&&r.add(o),r.size>=i)return Array.from(r)}if(n.length>=3&&n.length<=6){for(let e of s.keys())if(e.startsWith(n)&&r.add(e),r.size>=i)return Array.from(r)}return Array.from(r)}var N=class{constructor(t){this._byPincode=null;this._byState=null;this._byDistrict=null;this._byArea=null;this._data=t;}isValidPincode(t){return typeof t=="string"&&B.test(t.trim())}loadRuntimeData(){return this._data}indexByPincode(){return this._byPincode?this._byPincode:(this._byPincode=this.buildIndex(t=>t.pincode),this._byPincode)}indexByState(){return this._byState?this._byState:(this._byState=this.buildIndex(t=>t.state.toLowerCase()),this._byState)}indexByDistrict(){return this._byDistrict?this._byDistrict:(this._byDistrict=this.buildIndex(t=>t.district.toLowerCase()),this._byDistrict)}indexByArea(){return this._byArea?this._byArea:(this._byArea=this.buildIndex(t=>t.area.toLowerCase()),this._byArea)}buildIndex(t){let i=this.loadRuntimeData(),n=new Map;for(let r=0;r<i.length;r++){let e=t(i[r]);if(!e)continue;let o=n.get(e);o?o.push(i[r]):n.set(e,[i[r]]);}return n}paginate(t,i){let n=Math.max(1,i?.limit??100),r=Math.max(1,i?.page??1),e=t;i?.officeType&&(e=e.filter(g=>g.officeType===i.officeType)),i?.deliveryOnly&&(e=e.filter(g=>g.delivery));let o=e.length,c=Math.ceil(o/n),a=(r-1)*n;return {data:e.slice(a,a+n),total:o,page:r,limit:n,totalPages:c}}getByPincode(t,i){if(!t||typeof t!="string")return u("INVALID_INPUT","Pincode is required and must be a string.");let n=t.trim();if(!this.isValidPincode(n)){let e=D(this.indexByPincode(),n);return u("INVALID_PINCODE",`Invalid pincode "${n}". Indian pincodes must be exactly 6 digits starting with 1-9.`,e)}let r=this.indexByPincode().get(n);if(!r||r.length===0){let e=D(this.indexByPincode(),n);return u("PINCODE_NOT_FOUND",`No data found for pincode "${n}".`,e)}return p(this.paginate(r,i))}getPincodeSummary(t){if(!t||typeof t!="string")return u("INVALID_INPUT","Pincode is required and must be a string.");let i=t.trim();if(!this.isValidPincode(i)){let e=D(this.indexByPincode(),i);return u("INVALID_PINCODE",`Invalid pincode "${i}". Indian pincodes must be exactly 6 digits starting with 1-9.`,e)}let n=this.indexByPincode().get(i);if(!n||n.length===0){let e=D(this.indexByPincode(),i);return u("PINCODE_NOT_FOUND",`No data found for pincode "${i}".`,e)}let r=n[0];return p({pincode:i,district:r.district,state:r.state,country:S,areas:n.map(e=>({pincode:e.pincode,area:e.area,latitude:e.latitude,longitude:e.longitude})),deliveryAreas:n.filter(e=>e.delivery).length,hasCoordinates:n.some(e=>e.latitude!==null)})}getByState(t,i){if(!t||typeof t!="string"||!t.trim())return u("INVALID_INPUT","State name is required and must be a non-empty string.");let n=this.indexByState(),r=n.get(t.trim().toLowerCase());if(!r||r.length===0){let e=O(n,this.indexByArea(),t.trim(),"state");return u("STATE_NOT_FOUND",`No data found for state "${t.trim()}".`,e)}return p(this.paginate(r,i))}getStateSummary(t){if(!t||typeof t!="string"||!t.trim())return u("INVALID_INPUT","State name is required and must be a non-empty string.");let i=this.indexByState(),n=i.get(t.trim().toLowerCase());if(!n||n.length===0){let o=O(i,this.indexByArea(),t.trim(),"state");return u("STATE_NOT_FOUND",`No data found for state "${t.trim()}".`,o)}let r=new Set,e=new Set;for(let o of n)o.district&&r.add(o.district),e.add(o.pincode);return p({state:n[0].state,country:S,totalDistricts:r.size,totalAreas:n.length,totalPincodes:e.size,districts:Array.from(r).sort()})}getAllStates(){let t=this.indexByState();return Array.from(t.keys()).filter(i=>i.length>0).map(i=>{let n=t.get(i);return n?n[0].state:i}).sort()}getByDistrict(t,i){if(!t||typeof t!="string"||!t.trim())return u("INVALID_INPUT","District name is required and must be a non-empty string.");let n=this.indexByDistrict(),r=n.get(t.trim().toLowerCase());if(!r||r.length===0){let e=O(n,this.indexByArea(),t.trim(),"district");return u("DISTRICT_NOT_FOUND",`No data found for district "${t.trim()}".`,e)}return p(this.paginate(r,i))}getDistrictSummary(t){if(!t||typeof t!="string"||!t.trim())return u("INVALID_INPUT","District name is required and must be a non-empty string.");let i=this.indexByDistrict(),n=i.get(t.trim().toLowerCase());if(!n||n.length===0){let e=O(i,this.indexByArea(),t.trim(),"district");return u("DISTRICT_NOT_FOUND",`No data found for district "${t.trim()}".`,e)}let r=new Set;for(let e of n)r.add(e.pincode);return p({district:n[0].district,state:n[0].state,country:S,totalAreas:n.length,totalPincodes:r.size,pincodes:Array.from(r).sort()})}getDistrictsByState(t){if(!t||typeof t!="string"||!t.trim())return u("INVALID_INPUT","State name is required and must be a non-empty string.");let i=this.indexByState(),n=i.get(t.trim().toLowerCase());if(!n||n.length===0){let e=O(i,this.indexByArea(),t.trim(),"state");return u("STATE_NOT_FOUND",`No data found for state "${t.trim()}".`,e)}let r=new Set;for(let e of n)e.district&&r.add(e.district);return p(Array.from(r).sort())}getAllDistricts(){let t=this.indexByDistrict();return Array.from(t.keys()).filter(i=>i.length>0).map(i=>{let n=t.get(i);return n?n[0].district:i}).sort()}getByArea(t,i){if(!t||typeof t!="string"||!t.trim())return u("INVALID_INPUT","Area name is required and must be a non-empty string.");let n=this.indexByArea(),r=n.get(t.trim().toLowerCase());if(!r||r.length===0){let e=L(n,t.trim(),"area");return u("NO_RESULTS",`No data found for area "${t.trim()}".`,e)}return p(this.paginate(r,i))}getPincodesByState(t){if(!t||typeof t!="string"||!t.trim())return u("INVALID_INPUT","State name is required and must be a non-empty string.");let i=this.indexByState(),n=i.get(t.trim().toLowerCase());if(!n||n.length===0){let e=O(i,this.indexByArea(),t.trim(),"state");return u("STATE_NOT_FOUND",`No data found for state "${t.trim()}".`,e)}let r=new Set;for(let e of n)r.add(e.pincode);return p(Array.from(r).sort())}getPincodesByDistrict(t){if(!t||typeof t!="string"||!t.trim())return u("INVALID_INPUT","District name is required and must be a non-empty string.");let i=this.indexByDistrict(),n=i.get(t.trim().toLowerCase());if(!n||n.length===0){let e=O(i,this.indexByArea(),t.trim(),"district");return u("DISTRICT_NOT_FOUND",`No data found for district "${t.trim()}".`,e)}let r=new Set;for(let e of n)r.add(e.pincode);return p(Array.from(r).sort())}search(t,i){if(!t||typeof t!="string"||!t.trim())return u("INVALID_INPUT","Search query is required and must be a non-empty string.");let n=this.loadRuntimeData(),r=t.trim().toLowerCase(),e=Math.max(1,i?.limit??100),o=Math.max(1,i?.page??1),c=i?.officeType,a=i?.deliveryOnly,f=[],g=o*e+e;for(let m=0;m<n.length&&f.length<g;m++){let d=n[m];c&&d.officeType!==c||a&&!d.delivery||(d.pincode.includes(r)||d.area.toLowerCase().includes(r)||d.district.toLowerCase().includes(r)||d.state.toLowerCase().includes(r)||d.circle.toLowerCase().includes(r)||d.region.toLowerCase().includes(r))&&f.push(d);}if(f.length===0)return u("NO_RESULTS",`No results found for "${t.trim()}".`);let l=f.length,y=Math.ceil(l/e),h=(o-1)*e;return p({data:f.slice(h,h+e),total:l,page:o,limit:e,totalPages:y})}findNearby(t,i,n=10,r=20){if(typeof t!="number"||typeof i!="number"||!Number.isFinite(t)||!Number.isFinite(i))return u("INVALID_COORDINATES","Latitude and longitude must be valid numbers.");if(t<-90||t>90||i<-180||i>180)return u("INVALID_COORDINATES",`Invalid coordinates (${t}, ${i}). Latitude must be -90 to 90, longitude -180 to 180.`);let e=this.loadRuntimeData(),o=n/111,c=n/(111*Math.cos(I(t))),a=t-o,f=t+o,g=i-c,l=i+c,y=[];for(let m=0;m<e.length;m++){let d=e[m];if(d.latitude===null||d.longitude===null||d.latitude<a||d.latitude>f||d.longitude<g||d.longitude>l)continue;let x=M(t,i,d.latitude,d.longitude);x<=n&&y.push({...d,distanceKm:Math.round(x*100)/100});}y.sort((m,d)=>m.distanceKm-d.distanceKm);let h=y.slice(0,r);return h.length===0?u("NO_RESULTS",`No post offices found within ${n}km of (${t}, ${i}).`):p(h)}getTotalRecords(){return this.loadRuntimeData().length}getTotalPincodes(){return this.indexByPincode().size}clearCache(){this._byPincode=null,this._byState=null,this._byDistrict=null,this._byArea=null;}};function I(s){return s*(Math.PI/180)}function M(s,t,i,n){let e=I(i-s),o=I(n-t),c=Math.sin(e/2)**2+Math.cos(I(s))*Math.cos(I(i))*Math.sin(o/2)**2;return 6371*2*Math.atan2(Math.sqrt(c),Math.sqrt(1-c))}var E="INDIA",$=/^[1-9]\d{5}$/,V=/\s+\(?(?:B\.?O\.?|S\.?O\.?|H\.?O\.?|P\.?O\.?|G\.?P\.?O\.?|M\.?D\.?G\.?|R\.?M\.?S\.?)\)?\s*$/i,b=null;function F(s){return !s||typeof s!="string"?"":s.replace(V,"").replace(/\s{2,}/g," ").trim()}function P(s){if(s==null)return "";let t=String(s).trim();return t==="NA"?"":t.replace(/\s{2,}/g," ")}function w(s){if(s==null)return null;let t=Number(s);return !Number.isFinite(t)||t===0?null:t}function k(s){return s===null||s>=-90&&s<=90}function q(s){return s===null||s>=-180&&s<=180}function z(s){let t=String(s).replace(/\./g,"").toUpperCase().trim();return ["BO","SO","HO","PO","GPO"].includes(t)?t:"BO"}function Q(s){let t=P(s.p),i=F(P(s.o)),n=P(s.i),r=P(s.s);if(!t||!i||!n||!r||!$.test(t))return null;let e=w(s.a),o=w(s.n);return !k(e)||!q(o)?null:{pincode:t,area:i,officeType:z(s.t),delivery:s.d===1,district:n,state:r,country:E,circle:P(s.c),region:P(s.r),division:P(s.v),latitude:e,longitude:o}}function G(s){return `${s.pincode}|${s.area.toLowerCase()}|${s.district.toLowerCase()}|${s.officeType}`}function j(s){let t=new Set,i=[];for(let n=0;n<s.length;n++){let r=Q(s[n]);if(!r)continue;let e=G(r);t.has(e)||(t.add(e),i.push(r));}return i}async function _(){if(b)return b;let s=new URL("../data/pincodes.json.gz",import.meta.url),t=await fetch(s);if(!t.ok)throw new Error(`india-pincode: failed to load data (${t.status} ${t.statusText})`);let i=new Uint8Array(await t.arrayBuffer()),n=ungzip(i),r=new TextDecoder().decode(n),e=JSON.parse(r);return b=j(e),b}function C(){b=null;}var A=null;async function ct(){if(A)return A;let s=await _();return A=new N(s),A}async function ut(){let s=await _();return new N(s)}function dt(){A=null,C();}export{T as ErrorCode,N as IndiaPincode,dt as clearBrowserCache,ut as createIndiaPincode,ct as getIndiaPincode};//# sourceMappingURL=browser.mjs.map
2
2
  //# sourceMappingURL=browser.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts","../src/pincode-lookup.ts","../src/data-loader.browser.ts","../src/browser.ts"],"names":["ErrorCode","COUNTRY","PINCODE_REGEX","ok","data","fail","code","message","suggestions","error","levenshtein","a","b","m","dp","i","j","findSimilar","index","query","field","max","q","words","w","scored","maxDist","key","records","originalName","score","word","keyWords","kw","dist","s","findFromAreas","areaIndex","exact","partial","r","results","p","mergeSuggestions","fromAreas","fromIndex","seen","merged","findSimilarPincodes","input","digits","candidate","IndiaPincode","pincode","o","keyFn","arr","options","limit","page","filtered","total","totalPages","start","trimmed","first","state","stateIndex","districtSet","pincodeSet","idx","district","districtIndex","set","d","name","officeType","deliveryOnly","matches","maxScan","lat","lng","radiusKm","dLat","dLng","toRad","minLat","maxLat","minLng","maxLng","haversine","sliced","deg","lat1","lon1","lat2","lon2","dLon","OFFICE_SUFFIX_REGEX","cachedData","sanitizeCityName","raw","trimStr","val","safeNum","n","isValidLatitude","isValidLongitude","normalizeOfficeType","upper","expand","rec","area","latitude","longitude","dedupKey","normalize","result","record","loadBrowserData","url","response","compressed","inflated","inflate","json","clearBrowserDataCache","_browserInstance","getIndiaPincode","createIndiaPincode","clearBrowserCache"],"mappings":"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","file":"browser.mjs","sourcesContent":["// ─── Error handling ─────────────────────────────────────────────\nexport enum ErrorCode {\n INVALID_PINCODE = 'INVALID_PINCODE',\n PINCODE_NOT_FOUND = 'PINCODE_NOT_FOUND',\n STATE_NOT_FOUND = 'STATE_NOT_FOUND',\n DISTRICT_NOT_FOUND = 'DISTRICT_NOT_FOUND',\n INVALID_COORDINATES = 'INVALID_COORDINATES',\n INVALID_INPUT = 'INVALID_INPUT',\n NO_RESULTS = 'NO_RESULTS',\n}\n\nexport interface ApiError {\n code: ErrorCode;\n message: string;\n suggestions?: string[];\n}\n\nexport interface ApiResponse<T> {\n success: boolean;\n data: T | null;\n error?: ApiError;\n}\n\n// ─── Normalized public type ─────────────────────────────────────\nexport interface PostOffice {\n pincode: string;\n area: string;\n officeType: OfficeType;\n delivery: boolean;\n district: string;\n state: string;\n country: string;\n circle: string;\n region: string;\n division: string;\n latitude: number | null;\n longitude: number | null;\n}\n\nexport type OfficeType = 'BO' | 'SO' | 'HO' | 'PO' | 'GPO';\n\n// ─── Query options ──────────────────────────────────────────────\nexport interface QueryOptions {\n /** Max results to return (default: 100) */\n limit?: number;\n /** Page number, 1-based (default: 1) */\n page?: number;\n /** Filter by office type */\n officeType?: OfficeType;\n /** Filter only delivery offices */\n deliveryOnly?: boolean;\n}\n\n// ─── Paginated result ───────────────────────────────────────────\nexport interface PaginatedResult<T> {\n data: T[];\n total: number;\n page: number;\n limit: number;\n totalPages: number;\n}\n\n// ─── Location result (with distance) ────────────────────────────\nexport interface NearbyResult extends PostOffice {\n distanceKm: number;\n}\n\n// ─── Slim area shape (used in summaries) ────────────────────────\nexport interface AreaInfo {\n pincode: string;\n area: string;\n latitude: number | null;\n longitude: number | null;\n}\n\n// ─── Summary types ──────────────────────────────────────────────\nexport interface PincodeSummary {\n pincode: string;\n district: string;\n state: string;\n country: string;\n areas: AreaInfo[];\n deliveryAreas: number;\n hasCoordinates: boolean;\n}\n\nexport interface DistrictSummary {\n district: string;\n state: string;\n country: string;\n totalAreas: number;\n totalPincodes: number;\n pincodes: string[];\n}\n\nexport interface StateSummary {\n state: string;\n country: string;\n totalDistricts: number;\n totalAreas: number;\n totalPincodes: number;\n districts: string[];\n}\n","import {\n PostOffice,\n QueryOptions,\n PaginatedResult,\n NearbyResult,\n PincodeSummary,\n DistrictSummary,\n StateSummary,\n ApiResponse,\n ErrorCode,\n} from './types';\n\nconst COUNTRY = 'INDIA';\nconst PINCODE_REGEX = /^[1-9]\\d{5}$/;\n\n// ─── Response helpers ─────────────────────────────────────────────\n\nfunction ok<T>(data: T): ApiResponse<T> {\n return { success: true, data };\n}\n\nfunction fail<T>(code: ErrorCode, message: string, suggestions?: string[]): ApiResponse<T> {\n const error: { code: ErrorCode; message: string; suggestions?: string[] } = { code, message };\n if (suggestions && suggestions.length > 0) {\n error.suggestions = suggestions;\n error.message += ` Did you mean: ${suggestions.join(', ')}?`;\n }\n return { success: false, data: null, error };\n}\n\n/** Simple Levenshtein distance for fuzzy matching */\nfunction levenshtein(a: string, b: string): number {\n const m = a.length, n = b.length;\n const dp: number[][] = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));\n for (let i = 0; i <= m; i++) dp[i][0] = i;\n for (let j = 0; j <= n; j++) dp[0][j] = j;\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n dp[i][j] = a[i - 1] === b[j - 1]\n ? dp[i - 1][j - 1]\n : 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);\n }\n }\n return dp[m][n];\n}\n\n/**\n * Find similar keys from an index map using substring, word, and fuzzy matching.\n * Returns up to `max` original-cased names that partially match the query.\n */\nfunction findSimilar(\n index: Map<string, PostOffice[]>,\n query: string,\n field: 'district' | 'state' | 'area',\n max = 5,\n): string[] {\n const q = query.toLowerCase();\n const words = q.split(/\\s+/).filter((w) => w.length >= 3);\n const scored: { name: string; score: number }[] = [];\n // Allow edits proportional to query length (max 3), min query length 4\n const maxDist = q.length < 4 ? 0 : Math.min(3, Math.ceil(q.length / 3));\n\n for (const [key, records] of index) {\n if (!key) continue;\n const originalName = records[0] ? records[0][field] : key;\n\n let score = 0;\n\n // Exact substring match (highest) — skip very short queries to avoid noise\n if (q.length >= 3 && key.includes(q)) {\n score += 10;\n }\n\n // Individual word matches\n for (const word of words) {\n if (key.includes(word)) score += 3;\n }\n\n // Query is a substring of the key or vice versa\n if (q.length >= 4 && q.includes(key)) score += 5;\n\n // Fuzzy match: compare against each word in the key\n if (score === 0) {\n const keyWords = key.split(/\\s+/);\n for (const kw of keyWords) {\n const dist = levenshtein(q, kw);\n if (dist <= maxDist) {\n score += (10 - dist * 2);\n break;\n }\n }\n // Also try full key comparison for single-word queries\n if (score === 0 && keyWords.length === 1) {\n const dist = levenshtein(q, key);\n if (dist <= maxDist) {\n score += (10 - dist * 2);\n }\n }\n }\n\n if (score > 0) {\n scored.push({ name: originalName, score });\n }\n }\n\n return scored\n .sort((a, b) => b.score - a.score)\n .slice(0, max)\n .map((s) => s.name);\n}\n\n/**\n * Cross-index lookup: when a district/state isn't found, check if the query\n * matches an area name and return the districts/states those areas belong to.\n * Prioritizes exact area name matches, then partial matches.\n */\nfunction findFromAreas(\n areaIndex: Map<string, PostOffice[]>,\n query: string,\n field: 'district' | 'state',\n max = 5,\n): string[] {\n const q = query.toLowerCase();\n if (q.length < 3) return [];\n const exact = new Set<string>();\n const partial = new Set<string>();\n\n for (const [key, records] of areaIndex) {\n if (key === q) {\n for (const r of records) exact.add(r[field]);\n } else if (key.includes(q)) {\n for (const r of records) partial.add(r[field]);\n }\n }\n\n // Merge: exact matches first, then partial\n const results: string[] = Array.from(exact);\n for (const p of partial) {\n if (!exact.has(p)) results.push(p);\n if (results.length >= max) break;\n }\n\n return results;\n}\n\n/**\n * Merge suggestions from index-level fuzzy and cross-index area lookups.\n * Area cross-matches come first (more relevant), then fuzzy matches.\n */\nfunction mergeSuggestions(\n index: Map<string, PostOffice[]>,\n areaIndex: Map<string, PostOffice[]>,\n query: string,\n field: 'district' | 'state',\n max = 5,\n): string[] {\n const fromAreas = findFromAreas(areaIndex, query, field, max);\n const fromIndex = findSimilar(index, query, field, max);\n const seen = new Set(fromAreas);\n const merged = [...fromAreas];\n for (const s of fromIndex) {\n if (!seen.has(s)) {\n merged.push(s);\n seen.add(s);\n }\n if (merged.length >= max) break;\n }\n return merged.slice(0, max);\n}\n\n/**\n * Find similar pincodes when input is invalid or not found.\n * - Too long: extract all 6-digit substrings and check if they exist\n * - Too short / partial: prefix-match against known pincodes\n * - Typos: try single-digit corrections\n */\nfunction findSimilarPincodes(\n index: Map<string, PostOffice[]>,\n input: string,\n max = 5,\n): string[] {\n const digits = input.replace(/\\D/g, '');\n const results = new Set<string>();\n\n // Too long — try all 6-digit substrings\n if (digits.length > 6) {\n for (let i = 0; i <= digits.length - 6; i++) {\n const candidate = digits.substring(i, i + 6);\n if (index.has(candidate)) results.add(candidate);\n if (results.size >= max) return Array.from(results);\n }\n }\n\n // Prefix match — find pincodes starting with the digits\n if (digits.length >= 3 && digits.length <= 6) {\n for (const key of index.keys()) {\n if (key.startsWith(digits)) results.add(key);\n if (results.size >= max) return Array.from(results);\n }\n }\n\n return Array.from(results);\n}\n\n/**\n * - Geo-nearby → Haversine with early bounding-box pruning.\n * - All responses wrapped in ApiResponse with proper error codes.\n */\nexport class IndiaPincode {\n private _data: PostOffice[] | null;\n\n // ─── Indexes (lazy) ─────────────────────────────────────────\n private _byPincode: Map<string, PostOffice[]> | null = null;\n private _byState: Map<string, PostOffice[]> | null = null;\n private _byDistrict: Map<string, PostOffice[]> | null = null;\n private _byArea: Map<string, PostOffice[]> | null = null;\n\n constructor(data: PostOffice[]) {\n this._data = data;\n }\n\n private isValidPincode(pincode: string): boolean {\n return typeof pincode === 'string' && PINCODE_REGEX.test(pincode.trim());\n }\n\n private loadRuntimeData(): PostOffice[] {\n return this._data!;\n }\n\n // ─── Index builders ─────────────────────────────────────────\n private indexByPincode(): Map<string, PostOffice[]> {\n if (this._byPincode) return this._byPincode;\n this._byPincode = this.buildIndex((o) => o.pincode);\n return this._byPincode;\n }\n\n private indexByState(): Map<string, PostOffice[]> {\n if (this._byState) return this._byState;\n this._byState = this.buildIndex((o) => o.state.toLowerCase());\n return this._byState;\n }\n\n private indexByDistrict(): Map<string, PostOffice[]> {\n if (this._byDistrict) return this._byDistrict;\n this._byDistrict = this.buildIndex((o) => o.district.toLowerCase());\n return this._byDistrict;\n }\n\n private indexByArea(): Map<string, PostOffice[]> {\n if (this._byArea) return this._byArea;\n this._byArea = this.buildIndex((o) => o.area.toLowerCase());\n return this._byArea;\n }\n\n private buildIndex(keyFn: (o: PostOffice) => string): Map<string, PostOffice[]> {\n const data = this.loadRuntimeData();\n const index = new Map<string, PostOffice[]>();\n for (let i = 0; i < data.length; i++) {\n const key = keyFn(data[i]);\n if (!key) continue;\n const arr = index.get(key);\n if (arr) arr.push(data[i]);\n else index.set(key, [data[i]]);\n }\n return index;\n }\n\n // ─── Helper: apply filters + pagination ─────────────────────\n private paginate(\n records: PostOffice[],\n options?: QueryOptions,\n ): PaginatedResult<PostOffice> {\n const limit = Math.max(1, options?.limit ?? 100);\n const page = Math.max(1, options?.page ?? 1);\n let filtered = records;\n\n if (options?.officeType) {\n filtered = filtered.filter((r) => r.officeType === options.officeType);\n }\n if (options?.deliveryOnly) {\n filtered = filtered.filter((r) => r.delivery);\n }\n\n const total = filtered.length;\n const totalPages = Math.ceil(total / limit);\n const start = (page - 1) * limit;\n const data = filtered.slice(start, start + limit);\n\n return { data, total, page, limit, totalPages };\n }\n\n // ═══════════════════════════════════════════════════════════════\n // PUBLIC API\n // ═══════════════════════════════════════════════════════════════\n\n // ─── Pincode lookup (O(1)) ──────────────────────────────────\n\n /** Get all post offices for a pincode. Returns error for invalid/missing pincodes. */\n getByPincode(pincode: string, options?: QueryOptions): ApiResponse<PaginatedResult<PostOffice>> {\n if (!pincode || typeof pincode !== 'string') {\n return fail(ErrorCode.INVALID_INPUT, 'Pincode is required and must be a string.');\n }\n\n const trimmed = pincode.trim();\n if (!this.isValidPincode(trimmed)) {\n const suggestions = findSimilarPincodes(this.indexByPincode(), trimmed);\n return fail(\n ErrorCode.INVALID_PINCODE,\n `Invalid pincode \"${trimmed}\". Indian pincodes must be exactly 6 digits starting with 1-9.`,\n suggestions,\n );\n }\n\n const records = this.indexByPincode().get(trimmed);\n if (!records || records.length === 0) {\n const suggestions = findSimilarPincodes(this.indexByPincode(), trimmed);\n return fail(ErrorCode.PINCODE_NOT_FOUND, `No data found for pincode \"${trimmed}\".`, suggestions);\n }\n\n return ok(this.paginate(records, options));\n }\n\n /** Get a complete summary for a pincode. */\n getPincodeSummary(pincode: string): ApiResponse<PincodeSummary> {\n if (!pincode || typeof pincode !== 'string') {\n return fail(ErrorCode.INVALID_INPUT, 'Pincode is required and must be a string.');\n }\n\n const trimmed = pincode.trim();\n if (!this.isValidPincode(trimmed)) {\n const suggestions = findSimilarPincodes(this.indexByPincode(), trimmed);\n return fail(\n ErrorCode.INVALID_PINCODE,\n `Invalid pincode \"${trimmed}\". Indian pincodes must be exactly 6 digits starting with 1-9.`,\n suggestions,\n );\n }\n\n const records = this.indexByPincode().get(trimmed);\n if (!records || records.length === 0) {\n const suggestions = findSimilarPincodes(this.indexByPincode(), trimmed);\n return fail(ErrorCode.PINCODE_NOT_FOUND, `No data found for pincode \"${trimmed}\".`, suggestions);\n }\n\n const first = records[0];\n return ok({\n pincode: trimmed,\n district: first.district,\n state: first.state,\n country: COUNTRY,\n areas: records.map((r) => ({\n pincode: r.pincode,\n area: r.area,\n latitude: r.latitude,\n longitude: r.longitude,\n })),\n deliveryAreas: records.filter((o) => o.delivery).length,\n hasCoordinates: records.some((o) => o.latitude !== null),\n });\n }\n\n // ─── State queries ──────────────────────────────────────────\n\n /** Get all post offices in a state. */\n getByState(state: string, options?: QueryOptions): ApiResponse<PaginatedResult<PostOffice>> {\n if (!state || typeof state !== 'string' || !state.trim()) {\n return fail(ErrorCode.INVALID_INPUT, 'State name is required and must be a non-empty string.');\n }\n\n const stateIndex = this.indexByState();\n const records = stateIndex.get(state.trim().toLowerCase());\n if (!records || records.length === 0) {\n const suggestions = mergeSuggestions(stateIndex, this.indexByArea(), state.trim(), 'state');\n return fail(ErrorCode.STATE_NOT_FOUND, `No data found for state \"${state.trim()}\".`, suggestions);\n }\n\n return ok(this.paginate(records, options));\n }\n\n /** Get a summary for a state — districts, pincode count, etc. */\n getStateSummary(state: string): ApiResponse<StateSummary> {\n if (!state || typeof state !== 'string' || !state.trim()) {\n return fail(ErrorCode.INVALID_INPUT, 'State name is required and must be a non-empty string.');\n }\n\n const stateIndex = this.indexByState();\n const records = stateIndex.get(state.trim().toLowerCase());\n if (!records || records.length === 0) {\n const suggestions = mergeSuggestions(stateIndex, this.indexByArea(), state.trim(), 'state');\n return fail(ErrorCode.STATE_NOT_FOUND, `No data found for state \"${state.trim()}\".`, suggestions);\n }\n\n const districtSet = new Set<string>();\n const pincodeSet = new Set<string>();\n for (const r of records) {\n if (r.district) districtSet.add(r.district);\n pincodeSet.add(r.pincode);\n }\n\n return ok({\n state: records[0].state,\n country: COUNTRY,\n totalDistricts: districtSet.size,\n totalAreas: records.length,\n totalPincodes: pincodeSet.size,\n districts: Array.from(districtSet).sort(),\n });\n }\n\n /** Get all unique state names. */\n getAllStates(): string[] {\n const idx = this.indexByState();\n return Array.from(idx.keys())\n .filter((s) => s.length > 0)\n .map((s) => {\n const first = idx.get(s);\n return first ? first[0].state : s;\n })\n .sort();\n }\n\n // ─── District queries ───────────────────────────────────────\n\n /** Get all post offices in a district. */\n getByDistrict(district: string, options?: QueryOptions): ApiResponse<PaginatedResult<PostOffice>> {\n if (!district || typeof district !== 'string' || !district.trim()) {\n return fail(ErrorCode.INVALID_INPUT, 'District name is required and must be a non-empty string.');\n }\n\n const districtIndex = this.indexByDistrict();\n const records = districtIndex.get(district.trim().toLowerCase());\n if (!records || records.length === 0) {\n const suggestions = mergeSuggestions(districtIndex, this.indexByArea(), district.trim(), 'district');\n return fail(ErrorCode.DISTRICT_NOT_FOUND, `No data found for district \"${district.trim()}\".`, suggestions);\n }\n\n return ok(this.paginate(records, options));\n }\n\n /** Get a summary for a district. */\n getDistrictSummary(district: string): ApiResponse<DistrictSummary> {\n if (!district || typeof district !== 'string' || !district.trim()) {\n return fail(ErrorCode.INVALID_INPUT, 'District name is required and must be a non-empty string.');\n }\n\n const districtIndex = this.indexByDistrict();\n const records = districtIndex.get(district.trim().toLowerCase());\n if (!records || records.length === 0) {\n const suggestions = mergeSuggestions(districtIndex, this.indexByArea(), district.trim(), 'district');\n return fail(ErrorCode.DISTRICT_NOT_FOUND, `No data found for district \"${district.trim()}\".`, suggestions);\n }\n\n const pincodeSet = new Set<string>();\n for (const r of records) pincodeSet.add(r.pincode);\n\n return ok({\n district: records[0].district,\n state: records[0].state,\n country: COUNTRY,\n totalAreas: records.length,\n totalPincodes: pincodeSet.size,\n pincodes: Array.from(pincodeSet).sort(),\n });\n }\n\n /** Get all districts for a state. */\n getDistrictsByState(state: string): ApiResponse<string[]> {\n if (!state || typeof state !== 'string' || !state.trim()) {\n return fail(ErrorCode.INVALID_INPUT, 'State name is required and must be a non-empty string.');\n }\n\n const stateIndex = this.indexByState();\n const records = stateIndex.get(state.trim().toLowerCase());\n if (!records || records.length === 0) {\n const suggestions = mergeSuggestions(stateIndex, this.indexByArea(), state.trim(), 'state');\n return fail(ErrorCode.STATE_NOT_FOUND, `No data found for state \"${state.trim()}\".`, suggestions);\n }\n\n const set = new Set<string>();\n for (const r of records) {\n if (r.district) set.add(r.district);\n }\n return ok(Array.from(set).sort());\n }\n\n /** Get all unique district names. */\n getAllDistricts(): string[] {\n const idx = this.indexByDistrict();\n return Array.from(idx.keys())\n .filter((d) => d.length > 0)\n .map((d) => {\n const first = idx.get(d);\n return first ? first[0].district : d;\n })\n .sort();\n }\n\n // ─── Area name queries ───────────────────────────────────────\n\n /** Get post offices by exact area name (case-insensitive). */\n getByArea(name: string, options?: QueryOptions): ApiResponse<PaginatedResult<PostOffice>> {\n if (!name || typeof name !== 'string' || !name.trim()) {\n return fail(ErrorCode.INVALID_INPUT, 'Area name is required and must be a non-empty string.');\n }\n\n const areaIndex = this.indexByArea();\n const records = areaIndex.get(name.trim().toLowerCase());\n if (!records || records.length === 0) {\n const suggestions = findSimilar(areaIndex, name.trim(), 'area');\n return fail(ErrorCode.NO_RESULTS, `No data found for area \"${name.trim()}\".`, suggestions);\n }\n\n return ok(this.paginate(records, options));\n }\n\n // ─── Pincode range queries ──────────────────────────────────\n\n /** Get all pincodes in a state. */\n getPincodesByState(state: string): ApiResponse<string[]> {\n if (!state || typeof state !== 'string' || !state.trim()) {\n return fail(ErrorCode.INVALID_INPUT, 'State name is required and must be a non-empty string.');\n }\n\n const stateIndex = this.indexByState();\n const records = stateIndex.get(state.trim().toLowerCase());\n if (!records || records.length === 0) {\n const suggestions = mergeSuggestions(stateIndex, this.indexByArea(), state.trim(), 'state');\n return fail(ErrorCode.STATE_NOT_FOUND, `No data found for state \"${state.trim()}\".`, suggestions);\n }\n\n const set = new Set<string>();\n for (const r of records) set.add(r.pincode);\n return ok(Array.from(set).sort());\n }\n\n /** Get all pincodes in a district. */\n getPincodesByDistrict(district: string): ApiResponse<string[]> {\n if (!district || typeof district !== 'string' || !district.trim()) {\n return fail(ErrorCode.INVALID_INPUT, 'District name is required and must be a non-empty string.');\n }\n\n const districtIndex = this.indexByDistrict();\n const records = districtIndex.get(district.trim().toLowerCase());\n if (!records || records.length === 0) {\n const suggestions = mergeSuggestions(districtIndex, this.indexByArea(), district.trim(), 'district');\n return fail(ErrorCode.DISTRICT_NOT_FOUND, `No data found for district \"${district.trim()}\".`, suggestions);\n }\n\n const set = new Set<string>();\n for (const r of records) set.add(r.pincode);\n return ok(Array.from(set).sort());\n }\n\n // ─── Free-text search ───────────────────────────────────────\n\n /**\n * Search across pincode, area name, district, state.\n * Returns early once limit is reached — no wasted iteration.\n */\n search(query: string, options?: QueryOptions): ApiResponse<PaginatedResult<PostOffice>> {\n if (!query || typeof query !== 'string' || !query.trim()) {\n return fail(ErrorCode.INVALID_INPUT, 'Search query is required and must be a non-empty string.');\n }\n\n const data = this.loadRuntimeData();\n const q = query.trim().toLowerCase();\n const limit = Math.max(1, options?.limit ?? 100);\n const page = Math.max(1, options?.page ?? 1);\n const officeType = options?.officeType;\n const deliveryOnly = options?.deliveryOnly;\n\n const matches: PostOffice[] = [];\n const maxScan = (page * limit) + limit; // fetch enough for pagination\n\n for (let i = 0; i < data.length && matches.length < maxScan; i++) {\n const r = data[i];\n if (officeType && r.officeType !== officeType) continue;\n if (deliveryOnly && !r.delivery) continue;\n\n if (\n r.pincode.includes(q) ||\n r.area.toLowerCase().includes(q) ||\n r.district.toLowerCase().includes(q) ||\n r.state.toLowerCase().includes(q) ||\n r.circle.toLowerCase().includes(q) ||\n r.region.toLowerCase().includes(q)\n ) {\n matches.push(r);\n }\n }\n\n if (matches.length === 0) {\n return fail(ErrorCode.NO_RESULTS, `No results found for \"${query.trim()}\".`);\n }\n\n const total = matches.length;\n const totalPages = Math.ceil(total / limit);\n const start = (page - 1) * limit;\n\n return ok({\n data: matches.slice(start, start + limit),\n total,\n page,\n limit,\n totalPages,\n });\n }\n\n // ─── Geo: nearby search ─────────────────────────────────────\n\n /**\n * Find post offices near a given coordinate.\n * Uses bounding-box pre-filter + Haversine for accuracy.\n * Returns sorted by distance ascending.\n */\n findNearby(\n lat: number,\n lng: number,\n radiusKm = 10,\n limit = 20,\n ): ApiResponse<NearbyResult[]> {\n if (typeof lat !== 'number' || typeof lng !== 'number' || !Number.isFinite(lat) || !Number.isFinite(lng)) {\n return fail(ErrorCode.INVALID_COORDINATES, 'Latitude and longitude must be valid numbers.');\n }\n if (lat < -90 || lat > 90 || lng < -180 || lng > 180) {\n return fail(\n ErrorCode.INVALID_COORDINATES,\n `Invalid coordinates (${lat}, ${lng}). Latitude must be -90 to 90, longitude -180 to 180.`,\n );\n }\n const data = this.loadRuntimeData();\n // Bounding-box pre-filter (1 degree ≈ 111 km)\n const dLat = radiusKm / 111;\n const dLng = radiusKm / (111 * Math.cos(toRad(lat)));\n const minLat = lat - dLat;\n const maxLat = lat + dLat;\n const minLng = lng - dLng;\n const maxLng = lng + dLng;\n\n const results: NearbyResult[] = [];\n\n for (let i = 0; i < data.length; i++) {\n const r = data[i];\n if (r.latitude === null || r.longitude === null) continue;\n // Bounding box check (cheap)\n if (r.latitude < minLat || r.latitude > maxLat) continue;\n if (r.longitude < minLng || r.longitude > maxLng) continue;\n // Haversine (accurate)\n const d = haversine(lat, lng, r.latitude, r.longitude);\n if (d <= radiusKm) {\n results.push({ ...r, distanceKm: Math.round(d * 100) / 100 });\n }\n }\n\n results.sort((a, b) => a.distanceKm - b.distanceKm);\n const sliced = results.slice(0, limit);\n\n if (sliced.length === 0) {\n return fail(ErrorCode.NO_RESULTS, `No post offices found within ${radiusKm}km of (${lat}, ${lng}).`);\n }\n\n return ok(sliced);\n }\n\n // ─── Bulk / utility ─────────────────────────────────────────\n\n /** Total number of post office records loaded. */\n getTotalRecords(): number {\n return this.loadRuntimeData().length;\n }\n\n /** Total number of unique pincodes. */\n getTotalPincodes(): number {\n return this.indexByPincode().size;\n }\n\n /** Clear all cached data and indexes — reloads fresh on next call. */\n /** Clear all cached indexes — rebuilds on next call. */\n clearCache(): void {\n this._byPincode = null;\n this._byState = null;\n this._byDistrict = null;\n this._byArea = null;\n }\n}\n\n// ─── Haversine helpers ────────────────────────────────────────────\nfunction toRad(deg: number): number {\n return deg * (Math.PI / 180);\n}\n\nfunction haversine(lat1: number, lon1: number, lat2: number, lon2: number): number {\n const R = 6371;\n const dLat = toRad(lat2 - lat1);\n const dLon = toRad(lon2 - lon1);\n const a =\n Math.sin(dLat / 2) ** 2 +\n Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) * Math.sin(dLon / 2) ** 2;\n return R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n}\n\n\n","import { inflate } from 'pako';\nimport { PostOffice, OfficeType } from './types';\n\nconst COUNTRY = 'INDIA';\nconst PINCODE_REGEX = /^[1-9]\\d{5}$/;\n\ninterface CompactRecord {\n c: string;\n r: string;\n v: string;\n o: string;\n p: string;\n t: string;\n d: number;\n i: string;\n s: string;\n a: number;\n n: number;\n}\n\nconst OFFICE_SUFFIX_REGEX =\n /\\s+\\(?(?:B\\.?O\\.?|S\\.?O\\.?|H\\.?O\\.?|P\\.?O\\.?|G\\.?P\\.?O\\.?|M\\.?D\\.?G\\.?|R\\.?M\\.?S\\.?)\\)?\\s*$/i;\n\nlet cachedData: PostOffice[] | null = null;\n\nfunction sanitizeCityName(raw: string): string {\n if (!raw || typeof raw !== 'string') return '';\n return raw.replace(OFFICE_SUFFIX_REGEX, '').replace(/\\s{2,}/g, ' ').trim();\n}\n\nfunction trimStr(val: unknown): string {\n if (val === null || val === undefined) return '';\n const s = String(val).trim();\n return s === 'NA' ? '' : s.replace(/\\s{2,}/g, ' ');\n}\n\nfunction safeNum(val: unknown): number | null {\n if (val === null || val === undefined) return null;\n const n = Number(val);\n if (!Number.isFinite(n) || n === 0) return null;\n return n;\n}\n\nfunction isValidLatitude(lat: number | null): boolean {\n return lat === null || (lat >= -90 && lat <= 90);\n}\n\nfunction isValidLongitude(lng: number | null): boolean {\n return lng === null || (lng >= -180 && lng <= 180);\n}\n\nfunction normalizeOfficeType(raw: string): OfficeType {\n const upper = String(raw).replace(/\\./g, '').toUpperCase().trim();\n const valid: OfficeType[] = ['BO', 'SO', 'HO', 'PO', 'GPO'];\n return (valid.includes(upper as OfficeType) ? upper : 'BO') as OfficeType;\n}\n\nfunction expand(rec: CompactRecord): PostOffice | null {\n const pincode = trimStr(rec.p);\n const area = sanitizeCityName(trimStr(rec.o));\n const district = trimStr(rec.i);\n const state = trimStr(rec.s);\n\n if (!pincode || !area || !district || !state) return null;\n if (!PINCODE_REGEX.test(pincode)) return null;\n\n const latitude = safeNum(rec.a);\n const longitude = safeNum(rec.n);\n if (!isValidLatitude(latitude) || !isValidLongitude(longitude)) return null;\n\n return {\n pincode,\n area,\n officeType: normalizeOfficeType(rec.t),\n delivery: rec.d === 1,\n district,\n state,\n country: COUNTRY,\n circle: trimStr(rec.c),\n region: trimStr(rec.r),\n division: trimStr(rec.v),\n latitude,\n longitude,\n };\n}\n\nfunction dedupKey(r: PostOffice): string {\n return `${r.pincode}|${r.area.toLowerCase()}|${r.district.toLowerCase()}|${r.officeType}`;\n}\n\nfunction normalize(raw: CompactRecord[]): PostOffice[] {\n const seen = new Set<string>();\n const result: PostOffice[] = [];\n\n for (let i = 0; i < raw.length; i++) {\n const record = expand(raw[i]);\n if (!record) continue;\n\n const key = dedupKey(record);\n if (seen.has(key)) continue;\n\n seen.add(key);\n result.push(record);\n }\n\n return result;\n}\n\n/** Browser-safe loader that fetches and inflates gzipped dataset. */\nexport async function loadBrowserData(): Promise<PostOffice[]> {\n if (cachedData) return cachedData;\n\n const url = new URL('../data/pincodes.json.gz', import.meta.url);\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`india-pincode: failed to load data (${response.status} ${response.statusText})`);\n }\n\n const compressed = new Uint8Array(await response.arrayBuffer());\n const inflated = inflate(compressed);\n const json = new TextDecoder().decode(inflated);\n const raw = JSON.parse(json) as CompactRecord[];\n\n cachedData = normalize(raw);\n return cachedData;\n}\n\nexport function clearBrowserDataCache(): void {\n cachedData = null;\n}\n","import { IndiaPincode } from './pincode-lookup';\nimport { loadBrowserData, clearBrowserDataCache } from './data-loader.browser';\n\nlet _browserInstance: IndiaPincode | null = null;\n\n/** Returns a singleton instance initialized with browser-loaded data. */\nexport async function getIndiaPincode(): Promise<IndiaPincode> {\n if (_browserInstance) return _browserInstance;\n const data = await loadBrowserData();\n _browserInstance = new IndiaPincode(data);\n return _browserInstance;\n}\n\n/** Creates a fresh instance (non-singleton) for advanced browser use cases. */\nexport async function createIndiaPincode(): Promise<IndiaPincode> {\n const data = await loadBrowserData();\n return new IndiaPincode(data);\n}\n\n/** Clears singleton and cached data in browser runtimes. */\nexport function clearBrowserCache(): void {\n _browserInstance = null;\n clearBrowserDataCache();\n}\n\nexport { IndiaPincode };\nexport {\n PostOffice,\n OfficeType,\n AreaInfo,\n QueryOptions,\n PaginatedResult,\n NearbyResult,\n PincodeSummary,\n DistrictSummary,\n StateSummary,\n ApiResponse,\n ApiError,\n ErrorCode,\n} from './types';\n"]}
1
+ {"version":3,"sources":["../src/types.ts","../src/pincode-lookup.ts","../src/data-loader.browser.ts","../src/browser.ts"],"names":["ErrorCode","COUNTRY","PINCODE_REGEX","ok","data","fail","code","message","suggestions","error","levenshtein","a","b","m","dp","i","j","findSimilar","index","query","field","max","q","words","w","scored","maxDist","key","records","originalName","score","word","keyWords","kw","dist","s","findFromAreas","areaIndex","exact","partial","r","results","p","mergeSuggestions","fromAreas","fromIndex","seen","merged","findSimilarPincodes","input","digits","candidate","IndiaPincode","pincode","o","keyFn","arr","options","limit","page","filtered","total","totalPages","start","trimmed","first","state","stateIndex","districtSet","pincodeSet","idx","district","districtIndex","set","d","name","officeType","deliveryOnly","matches","maxScan","lat","lng","radiusKm","dLat","dLng","toRad","minLat","maxLat","minLng","maxLng","haversine","sliced","deg","lat1","lon1","lat2","lon2","dLon","OFFICE_SUFFIX_REGEX","cachedData","sanitizeCityName","raw","trimStr","val","safeNum","n","isValidLatitude","isValidLongitude","normalizeOfficeType","upper","expand","rec","area","latitude","longitude","dedupKey","normalize","result","record","loadBrowserData","url","response","compressed","inflated","ungzip","json","clearBrowserDataCache","_browserInstance","getIndiaPincode","createIndiaPincode","clearBrowserCache"],"mappings":"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","file":"browser.mjs","sourcesContent":["// ─── Error handling ─────────────────────────────────────────────\nexport enum ErrorCode {\n INVALID_PINCODE = 'INVALID_PINCODE',\n PINCODE_NOT_FOUND = 'PINCODE_NOT_FOUND',\n STATE_NOT_FOUND = 'STATE_NOT_FOUND',\n DISTRICT_NOT_FOUND = 'DISTRICT_NOT_FOUND',\n INVALID_COORDINATES = 'INVALID_COORDINATES',\n INVALID_INPUT = 'INVALID_INPUT',\n NO_RESULTS = 'NO_RESULTS',\n}\n\nexport interface ApiError {\n code: ErrorCode;\n message: string;\n suggestions?: string[];\n}\n\nexport interface ApiResponse<T> {\n success: boolean;\n data: T | null;\n error?: ApiError;\n}\n\n// ─── Normalized public type ─────────────────────────────────────\nexport interface PostOffice {\n pincode: string;\n area: string;\n officeType: OfficeType;\n delivery: boolean;\n district: string;\n state: string;\n country: string;\n circle: string;\n region: string;\n division: string;\n latitude: number | null;\n longitude: number | null;\n}\n\nexport type OfficeType = 'BO' | 'SO' | 'HO' | 'PO' | 'GPO';\n\n// ─── Query options ──────────────────────────────────────────────\nexport interface QueryOptions {\n /** Max results to return (default: 100) */\n limit?: number;\n /** Page number, 1-based (default: 1) */\n page?: number;\n /** Filter by office type */\n officeType?: OfficeType;\n /** Filter only delivery offices */\n deliveryOnly?: boolean;\n}\n\n// ─── Paginated result ───────────────────────────────────────────\nexport interface PaginatedResult<T> {\n data: T[];\n total: number;\n page: number;\n limit: number;\n totalPages: number;\n}\n\n// ─── Location result (with distance) ────────────────────────────\nexport interface NearbyResult extends PostOffice {\n distanceKm: number;\n}\n\n// ─── Slim area shape (used in summaries) ────────────────────────\nexport interface AreaInfo {\n pincode: string;\n area: string;\n latitude: number | null;\n longitude: number | null;\n}\n\n// ─── Summary types ──────────────────────────────────────────────\nexport interface PincodeSummary {\n pincode: string;\n district: string;\n state: string;\n country: string;\n areas: AreaInfo[];\n deliveryAreas: number;\n hasCoordinates: boolean;\n}\n\nexport interface DistrictSummary {\n district: string;\n state: string;\n country: string;\n totalAreas: number;\n totalPincodes: number;\n pincodes: string[];\n}\n\nexport interface StateSummary {\n state: string;\n country: string;\n totalDistricts: number;\n totalAreas: number;\n totalPincodes: number;\n districts: string[];\n}\n","import {\n PostOffice,\n QueryOptions,\n PaginatedResult,\n NearbyResult,\n PincodeSummary,\n DistrictSummary,\n StateSummary,\n ApiResponse,\n ErrorCode,\n} from './types';\n\nconst COUNTRY = 'INDIA';\nconst PINCODE_REGEX = /^[1-9]\\d{5}$/;\n\n// ─── Response helpers ─────────────────────────────────────────────\n\nfunction ok<T>(data: T): ApiResponse<T> {\n return { success: true, data };\n}\n\nfunction fail<T>(code: ErrorCode, message: string, suggestions?: string[]): ApiResponse<T> {\n const error: { code: ErrorCode; message: string; suggestions?: string[] } = { code, message };\n if (suggestions && suggestions.length > 0) {\n error.suggestions = suggestions;\n error.message += ` Did you mean: ${suggestions.join(', ')}?`;\n }\n return { success: false, data: null, error };\n}\n\n/** Simple Levenshtein distance for fuzzy matching */\nfunction levenshtein(a: string, b: string): number {\n const m = a.length, n = b.length;\n const dp: number[][] = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));\n for (let i = 0; i <= m; i++) dp[i][0] = i;\n for (let j = 0; j <= n; j++) dp[0][j] = j;\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n dp[i][j] = a[i - 1] === b[j - 1]\n ? dp[i - 1][j - 1]\n : 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);\n }\n }\n return dp[m][n];\n}\n\n/**\n * Find similar keys from an index map using substring, word, and fuzzy matching.\n * Returns up to `max` original-cased names that partially match the query.\n */\nfunction findSimilar(\n index: Map<string, PostOffice[]>,\n query: string,\n field: 'district' | 'state' | 'area',\n max = 5,\n): string[] {\n const q = query.toLowerCase();\n const words = q.split(/\\s+/).filter((w) => w.length >= 3);\n const scored: { name: string; score: number }[] = [];\n // Allow edits proportional to query length (max 3), min query length 4\n const maxDist = q.length < 4 ? 0 : Math.min(3, Math.ceil(q.length / 3));\n\n for (const [key, records] of index) {\n if (!key) continue;\n const originalName = records[0] ? records[0][field] : key;\n\n let score = 0;\n\n // Exact substring match (highest) — skip very short queries to avoid noise\n if (q.length >= 3 && key.includes(q)) {\n score += 10;\n }\n\n // Individual word matches\n for (const word of words) {\n if (key.includes(word)) score += 3;\n }\n\n // Query is a substring of the key or vice versa\n if (q.length >= 4 && q.includes(key)) score += 5;\n\n // Fuzzy match: compare against each word in the key\n if (score === 0) {\n const keyWords = key.split(/\\s+/);\n for (const kw of keyWords) {\n const dist = levenshtein(q, kw);\n if (dist <= maxDist) {\n score += (10 - dist * 2);\n break;\n }\n }\n // Also try full key comparison for single-word queries\n if (score === 0 && keyWords.length === 1) {\n const dist = levenshtein(q, key);\n if (dist <= maxDist) {\n score += (10 - dist * 2);\n }\n }\n }\n\n if (score > 0) {\n scored.push({ name: originalName, score });\n }\n }\n\n return scored\n .sort((a, b) => b.score - a.score)\n .slice(0, max)\n .map((s) => s.name);\n}\n\n/**\n * Cross-index lookup: when a district/state isn't found, check if the query\n * matches an area name and return the districts/states those areas belong to.\n * Prioritizes exact area name matches, then partial matches.\n */\nfunction findFromAreas(\n areaIndex: Map<string, PostOffice[]>,\n query: string,\n field: 'district' | 'state',\n max = 5,\n): string[] {\n const q = query.toLowerCase();\n if (q.length < 3) return [];\n const exact = new Set<string>();\n const partial = new Set<string>();\n\n for (const [key, records] of areaIndex) {\n if (key === q) {\n for (const r of records) exact.add(r[field]);\n } else if (key.includes(q)) {\n for (const r of records) partial.add(r[field]);\n }\n }\n\n // Merge: exact matches first, then partial\n const results: string[] = Array.from(exact);\n for (const p of partial) {\n if (!exact.has(p)) results.push(p);\n if (results.length >= max) break;\n }\n\n return results;\n}\n\n/**\n * Merge suggestions from index-level fuzzy and cross-index area lookups.\n * Area cross-matches come first (more relevant), then fuzzy matches.\n */\nfunction mergeSuggestions(\n index: Map<string, PostOffice[]>,\n areaIndex: Map<string, PostOffice[]>,\n query: string,\n field: 'district' | 'state',\n max = 5,\n): string[] {\n const fromAreas = findFromAreas(areaIndex, query, field, max);\n const fromIndex = findSimilar(index, query, field, max);\n const seen = new Set(fromAreas);\n const merged = [...fromAreas];\n for (const s of fromIndex) {\n if (!seen.has(s)) {\n merged.push(s);\n seen.add(s);\n }\n if (merged.length >= max) break;\n }\n return merged.slice(0, max);\n}\n\n/**\n * Find similar pincodes when input is invalid or not found.\n * - Too long: extract all 6-digit substrings and check if they exist\n * - Too short / partial: prefix-match against known pincodes\n * - Typos: try single-digit corrections\n */\nfunction findSimilarPincodes(\n index: Map<string, PostOffice[]>,\n input: string,\n max = 5,\n): string[] {\n const digits = input.replace(/\\D/g, '');\n const results = new Set<string>();\n\n // Too long — try all 6-digit substrings\n if (digits.length > 6) {\n for (let i = 0; i <= digits.length - 6; i++) {\n const candidate = digits.substring(i, i + 6);\n if (index.has(candidate)) results.add(candidate);\n if (results.size >= max) return Array.from(results);\n }\n }\n\n // Prefix match — find pincodes starting with the digits\n if (digits.length >= 3 && digits.length <= 6) {\n for (const key of index.keys()) {\n if (key.startsWith(digits)) results.add(key);\n if (results.size >= max) return Array.from(results);\n }\n }\n\n return Array.from(results);\n}\n\n/**\n * - Geo-nearby → Haversine with early bounding-box pruning.\n * - All responses wrapped in ApiResponse with proper error codes.\n */\nexport class IndiaPincode {\n private _data: PostOffice[] | null;\n\n // ─── Indexes (lazy) ─────────────────────────────────────────\n private _byPincode: Map<string, PostOffice[]> | null = null;\n private _byState: Map<string, PostOffice[]> | null = null;\n private _byDistrict: Map<string, PostOffice[]> | null = null;\n private _byArea: Map<string, PostOffice[]> | null = null;\n\n constructor(data: PostOffice[]) {\n this._data = data;\n }\n\n private isValidPincode(pincode: string): boolean {\n return typeof pincode === 'string' && PINCODE_REGEX.test(pincode.trim());\n }\n\n private loadRuntimeData(): PostOffice[] {\n return this._data!;\n }\n\n // ─── Index builders ─────────────────────────────────────────\n private indexByPincode(): Map<string, PostOffice[]> {\n if (this._byPincode) return this._byPincode;\n this._byPincode = this.buildIndex((o) => o.pincode);\n return this._byPincode;\n }\n\n private indexByState(): Map<string, PostOffice[]> {\n if (this._byState) return this._byState;\n this._byState = this.buildIndex((o) => o.state.toLowerCase());\n return this._byState;\n }\n\n private indexByDistrict(): Map<string, PostOffice[]> {\n if (this._byDistrict) return this._byDistrict;\n this._byDistrict = this.buildIndex((o) => o.district.toLowerCase());\n return this._byDistrict;\n }\n\n private indexByArea(): Map<string, PostOffice[]> {\n if (this._byArea) return this._byArea;\n this._byArea = this.buildIndex((o) => o.area.toLowerCase());\n return this._byArea;\n }\n\n private buildIndex(keyFn: (o: PostOffice) => string): Map<string, PostOffice[]> {\n const data = this.loadRuntimeData();\n const index = new Map<string, PostOffice[]>();\n for (let i = 0; i < data.length; i++) {\n const key = keyFn(data[i]);\n if (!key) continue;\n const arr = index.get(key);\n if (arr) arr.push(data[i]);\n else index.set(key, [data[i]]);\n }\n return index;\n }\n\n // ─── Helper: apply filters + pagination ─────────────────────\n private paginate(\n records: PostOffice[],\n options?: QueryOptions,\n ): PaginatedResult<PostOffice> {\n const limit = Math.max(1, options?.limit ?? 100);\n const page = Math.max(1, options?.page ?? 1);\n let filtered = records;\n\n if (options?.officeType) {\n filtered = filtered.filter((r) => r.officeType === options.officeType);\n }\n if (options?.deliveryOnly) {\n filtered = filtered.filter((r) => r.delivery);\n }\n\n const total = filtered.length;\n const totalPages = Math.ceil(total / limit);\n const start = (page - 1) * limit;\n const data = filtered.slice(start, start + limit);\n\n return { data, total, page, limit, totalPages };\n }\n\n // ═══════════════════════════════════════════════════════════════\n // PUBLIC API\n // ═══════════════════════════════════════════════════════════════\n\n // ─── Pincode lookup (O(1)) ──────────────────────────────────\n\n /** Get all post offices for a pincode. Returns error for invalid/missing pincodes. */\n getByPincode(pincode: string, options?: QueryOptions): ApiResponse<PaginatedResult<PostOffice>> {\n if (!pincode || typeof pincode !== 'string') {\n return fail(ErrorCode.INVALID_INPUT, 'Pincode is required and must be a string.');\n }\n\n const trimmed = pincode.trim();\n if (!this.isValidPincode(trimmed)) {\n const suggestions = findSimilarPincodes(this.indexByPincode(), trimmed);\n return fail(\n ErrorCode.INVALID_PINCODE,\n `Invalid pincode \"${trimmed}\". Indian pincodes must be exactly 6 digits starting with 1-9.`,\n suggestions,\n );\n }\n\n const records = this.indexByPincode().get(trimmed);\n if (!records || records.length === 0) {\n const suggestions = findSimilarPincodes(this.indexByPincode(), trimmed);\n return fail(ErrorCode.PINCODE_NOT_FOUND, `No data found for pincode \"${trimmed}\".`, suggestions);\n }\n\n return ok(this.paginate(records, options));\n }\n\n /** Get a complete summary for a pincode. */\n getPincodeSummary(pincode: string): ApiResponse<PincodeSummary> {\n if (!pincode || typeof pincode !== 'string') {\n return fail(ErrorCode.INVALID_INPUT, 'Pincode is required and must be a string.');\n }\n\n const trimmed = pincode.trim();\n if (!this.isValidPincode(trimmed)) {\n const suggestions = findSimilarPincodes(this.indexByPincode(), trimmed);\n return fail(\n ErrorCode.INVALID_PINCODE,\n `Invalid pincode \"${trimmed}\". Indian pincodes must be exactly 6 digits starting with 1-9.`,\n suggestions,\n );\n }\n\n const records = this.indexByPincode().get(trimmed);\n if (!records || records.length === 0) {\n const suggestions = findSimilarPincodes(this.indexByPincode(), trimmed);\n return fail(ErrorCode.PINCODE_NOT_FOUND, `No data found for pincode \"${trimmed}\".`, suggestions);\n }\n\n const first = records[0];\n return ok({\n pincode: trimmed,\n district: first.district,\n state: first.state,\n country: COUNTRY,\n areas: records.map((r) => ({\n pincode: r.pincode,\n area: r.area,\n latitude: r.latitude,\n longitude: r.longitude,\n })),\n deliveryAreas: records.filter((o) => o.delivery).length,\n hasCoordinates: records.some((o) => o.latitude !== null),\n });\n }\n\n // ─── State queries ──────────────────────────────────────────\n\n /** Get all post offices in a state. */\n getByState(state: string, options?: QueryOptions): ApiResponse<PaginatedResult<PostOffice>> {\n if (!state || typeof state !== 'string' || !state.trim()) {\n return fail(ErrorCode.INVALID_INPUT, 'State name is required and must be a non-empty string.');\n }\n\n const stateIndex = this.indexByState();\n const records = stateIndex.get(state.trim().toLowerCase());\n if (!records || records.length === 0) {\n const suggestions = mergeSuggestions(stateIndex, this.indexByArea(), state.trim(), 'state');\n return fail(ErrorCode.STATE_NOT_FOUND, `No data found for state \"${state.trim()}\".`, suggestions);\n }\n\n return ok(this.paginate(records, options));\n }\n\n /** Get a summary for a state — districts, pincode count, etc. */\n getStateSummary(state: string): ApiResponse<StateSummary> {\n if (!state || typeof state !== 'string' || !state.trim()) {\n return fail(ErrorCode.INVALID_INPUT, 'State name is required and must be a non-empty string.');\n }\n\n const stateIndex = this.indexByState();\n const records = stateIndex.get(state.trim().toLowerCase());\n if (!records || records.length === 0) {\n const suggestions = mergeSuggestions(stateIndex, this.indexByArea(), state.trim(), 'state');\n return fail(ErrorCode.STATE_NOT_FOUND, `No data found for state \"${state.trim()}\".`, suggestions);\n }\n\n const districtSet = new Set<string>();\n const pincodeSet = new Set<string>();\n for (const r of records) {\n if (r.district) districtSet.add(r.district);\n pincodeSet.add(r.pincode);\n }\n\n return ok({\n state: records[0].state,\n country: COUNTRY,\n totalDistricts: districtSet.size,\n totalAreas: records.length,\n totalPincodes: pincodeSet.size,\n districts: Array.from(districtSet).sort(),\n });\n }\n\n /** Get all unique state names. */\n getAllStates(): string[] {\n const idx = this.indexByState();\n return Array.from(idx.keys())\n .filter((s) => s.length > 0)\n .map((s) => {\n const first = idx.get(s);\n return first ? first[0].state : s;\n })\n .sort();\n }\n\n // ─── District queries ───────────────────────────────────────\n\n /** Get all post offices in a district. */\n getByDistrict(district: string, options?: QueryOptions): ApiResponse<PaginatedResult<PostOffice>> {\n if (!district || typeof district !== 'string' || !district.trim()) {\n return fail(ErrorCode.INVALID_INPUT, 'District name is required and must be a non-empty string.');\n }\n\n const districtIndex = this.indexByDistrict();\n const records = districtIndex.get(district.trim().toLowerCase());\n if (!records || records.length === 0) {\n const suggestions = mergeSuggestions(districtIndex, this.indexByArea(), district.trim(), 'district');\n return fail(ErrorCode.DISTRICT_NOT_FOUND, `No data found for district \"${district.trim()}\".`, suggestions);\n }\n\n return ok(this.paginate(records, options));\n }\n\n /** Get a summary for a district. */\n getDistrictSummary(district: string): ApiResponse<DistrictSummary> {\n if (!district || typeof district !== 'string' || !district.trim()) {\n return fail(ErrorCode.INVALID_INPUT, 'District name is required and must be a non-empty string.');\n }\n\n const districtIndex = this.indexByDistrict();\n const records = districtIndex.get(district.trim().toLowerCase());\n if (!records || records.length === 0) {\n const suggestions = mergeSuggestions(districtIndex, this.indexByArea(), district.trim(), 'district');\n return fail(ErrorCode.DISTRICT_NOT_FOUND, `No data found for district \"${district.trim()}\".`, suggestions);\n }\n\n const pincodeSet = new Set<string>();\n for (const r of records) pincodeSet.add(r.pincode);\n\n return ok({\n district: records[0].district,\n state: records[0].state,\n country: COUNTRY,\n totalAreas: records.length,\n totalPincodes: pincodeSet.size,\n pincodes: Array.from(pincodeSet).sort(),\n });\n }\n\n /** Get all districts for a state. */\n getDistrictsByState(state: string): ApiResponse<string[]> {\n if (!state || typeof state !== 'string' || !state.trim()) {\n return fail(ErrorCode.INVALID_INPUT, 'State name is required and must be a non-empty string.');\n }\n\n const stateIndex = this.indexByState();\n const records = stateIndex.get(state.trim().toLowerCase());\n if (!records || records.length === 0) {\n const suggestions = mergeSuggestions(stateIndex, this.indexByArea(), state.trim(), 'state');\n return fail(ErrorCode.STATE_NOT_FOUND, `No data found for state \"${state.trim()}\".`, suggestions);\n }\n\n const set = new Set<string>();\n for (const r of records) {\n if (r.district) set.add(r.district);\n }\n return ok(Array.from(set).sort());\n }\n\n /** Get all unique district names. */\n getAllDistricts(): string[] {\n const idx = this.indexByDistrict();\n return Array.from(idx.keys())\n .filter((d) => d.length > 0)\n .map((d) => {\n const first = idx.get(d);\n return first ? first[0].district : d;\n })\n .sort();\n }\n\n // ─── Area name queries ───────────────────────────────────────\n\n /** Get post offices by exact area name (case-insensitive). */\n getByArea(name: string, options?: QueryOptions): ApiResponse<PaginatedResult<PostOffice>> {\n if (!name || typeof name !== 'string' || !name.trim()) {\n return fail(ErrorCode.INVALID_INPUT, 'Area name is required and must be a non-empty string.');\n }\n\n const areaIndex = this.indexByArea();\n const records = areaIndex.get(name.trim().toLowerCase());\n if (!records || records.length === 0) {\n const suggestions = findSimilar(areaIndex, name.trim(), 'area');\n return fail(ErrorCode.NO_RESULTS, `No data found for area \"${name.trim()}\".`, suggestions);\n }\n\n return ok(this.paginate(records, options));\n }\n\n // ─── Pincode range queries ──────────────────────────────────\n\n /** Get all pincodes in a state. */\n getPincodesByState(state: string): ApiResponse<string[]> {\n if (!state || typeof state !== 'string' || !state.trim()) {\n return fail(ErrorCode.INVALID_INPUT, 'State name is required and must be a non-empty string.');\n }\n\n const stateIndex = this.indexByState();\n const records = stateIndex.get(state.trim().toLowerCase());\n if (!records || records.length === 0) {\n const suggestions = mergeSuggestions(stateIndex, this.indexByArea(), state.trim(), 'state');\n return fail(ErrorCode.STATE_NOT_FOUND, `No data found for state \"${state.trim()}\".`, suggestions);\n }\n\n const set = new Set<string>();\n for (const r of records) set.add(r.pincode);\n return ok(Array.from(set).sort());\n }\n\n /** Get all pincodes in a district. */\n getPincodesByDistrict(district: string): ApiResponse<string[]> {\n if (!district || typeof district !== 'string' || !district.trim()) {\n return fail(ErrorCode.INVALID_INPUT, 'District name is required and must be a non-empty string.');\n }\n\n const districtIndex = this.indexByDistrict();\n const records = districtIndex.get(district.trim().toLowerCase());\n if (!records || records.length === 0) {\n const suggestions = mergeSuggestions(districtIndex, this.indexByArea(), district.trim(), 'district');\n return fail(ErrorCode.DISTRICT_NOT_FOUND, `No data found for district \"${district.trim()}\".`, suggestions);\n }\n\n const set = new Set<string>();\n for (const r of records) set.add(r.pincode);\n return ok(Array.from(set).sort());\n }\n\n // ─── Free-text search ───────────────────────────────────────\n\n /**\n * Search across pincode, area name, district, state.\n * Returns early once limit is reached — no wasted iteration.\n */\n search(query: string, options?: QueryOptions): ApiResponse<PaginatedResult<PostOffice>> {\n if (!query || typeof query !== 'string' || !query.trim()) {\n return fail(ErrorCode.INVALID_INPUT, 'Search query is required and must be a non-empty string.');\n }\n\n const data = this.loadRuntimeData();\n const q = query.trim().toLowerCase();\n const limit = Math.max(1, options?.limit ?? 100);\n const page = Math.max(1, options?.page ?? 1);\n const officeType = options?.officeType;\n const deliveryOnly = options?.deliveryOnly;\n\n const matches: PostOffice[] = [];\n const maxScan = (page * limit) + limit; // fetch enough for pagination\n\n for (let i = 0; i < data.length && matches.length < maxScan; i++) {\n const r = data[i];\n if (officeType && r.officeType !== officeType) continue;\n if (deliveryOnly && !r.delivery) continue;\n\n if (\n r.pincode.includes(q) ||\n r.area.toLowerCase().includes(q) ||\n r.district.toLowerCase().includes(q) ||\n r.state.toLowerCase().includes(q) ||\n r.circle.toLowerCase().includes(q) ||\n r.region.toLowerCase().includes(q)\n ) {\n matches.push(r);\n }\n }\n\n if (matches.length === 0) {\n return fail(ErrorCode.NO_RESULTS, `No results found for \"${query.trim()}\".`);\n }\n\n const total = matches.length;\n const totalPages = Math.ceil(total / limit);\n const start = (page - 1) * limit;\n\n return ok({\n data: matches.slice(start, start + limit),\n total,\n page,\n limit,\n totalPages,\n });\n }\n\n // ─── Geo: nearby search ─────────────────────────────────────\n\n /**\n * Find post offices near a given coordinate.\n * Uses bounding-box pre-filter + Haversine for accuracy.\n * Returns sorted by distance ascending.\n */\n findNearby(\n lat: number,\n lng: number,\n radiusKm = 10,\n limit = 20,\n ): ApiResponse<NearbyResult[]> {\n if (typeof lat !== 'number' || typeof lng !== 'number' || !Number.isFinite(lat) || !Number.isFinite(lng)) {\n return fail(ErrorCode.INVALID_COORDINATES, 'Latitude and longitude must be valid numbers.');\n }\n if (lat < -90 || lat > 90 || lng < -180 || lng > 180) {\n return fail(\n ErrorCode.INVALID_COORDINATES,\n `Invalid coordinates (${lat}, ${lng}). Latitude must be -90 to 90, longitude -180 to 180.`,\n );\n }\n const data = this.loadRuntimeData();\n // Bounding-box pre-filter (1 degree ≈ 111 km)\n const dLat = radiusKm / 111;\n const dLng = radiusKm / (111 * Math.cos(toRad(lat)));\n const minLat = lat - dLat;\n const maxLat = lat + dLat;\n const minLng = lng - dLng;\n const maxLng = lng + dLng;\n\n const results: NearbyResult[] = [];\n\n for (let i = 0; i < data.length; i++) {\n const r = data[i];\n if (r.latitude === null || r.longitude === null) continue;\n // Bounding box check (cheap)\n if (r.latitude < minLat || r.latitude > maxLat) continue;\n if (r.longitude < minLng || r.longitude > maxLng) continue;\n // Haversine (accurate)\n const d = haversine(lat, lng, r.latitude, r.longitude);\n if (d <= radiusKm) {\n results.push({ ...r, distanceKm: Math.round(d * 100) / 100 });\n }\n }\n\n results.sort((a, b) => a.distanceKm - b.distanceKm);\n const sliced = results.slice(0, limit);\n\n if (sliced.length === 0) {\n return fail(ErrorCode.NO_RESULTS, `No post offices found within ${radiusKm}km of (${lat}, ${lng}).`);\n }\n\n return ok(sliced);\n }\n\n // ─── Bulk / utility ─────────────────────────────────────────\n\n /** Total number of post office records loaded. */\n getTotalRecords(): number {\n return this.loadRuntimeData().length;\n }\n\n /** Total number of unique pincodes. */\n getTotalPincodes(): number {\n return this.indexByPincode().size;\n }\n\n /** Clear all cached data and indexes — reloads fresh on next call. */\n /** Clear all cached indexes — rebuilds on next call. */\n clearCache(): void {\n this._byPincode = null;\n this._byState = null;\n this._byDistrict = null;\n this._byArea = null;\n }\n}\n\n// ─── Haversine helpers ────────────────────────────────────────────\nfunction toRad(deg: number): number {\n return deg * (Math.PI / 180);\n}\n\nfunction haversine(lat1: number, lon1: number, lat2: number, lon2: number): number {\n const R = 6371;\n const dLat = toRad(lat2 - lat1);\n const dLon = toRad(lon2 - lon1);\n const a =\n Math.sin(dLat / 2) ** 2 +\n Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) * Math.sin(dLon / 2) ** 2;\n return R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n}\n\n\n","import { ungzip } from 'pako';\nimport { PostOffice, OfficeType } from './types';\n\nconst COUNTRY = 'INDIA';\nconst PINCODE_REGEX = /^[1-9]\\d{5}$/;\n\ninterface CompactRecord {\n c: string;\n r: string;\n v: string;\n o: string;\n p: string;\n t: string;\n d: number;\n i: string;\n s: string;\n a: number;\n n: number;\n}\n\nconst OFFICE_SUFFIX_REGEX =\n /\\s+\\(?(?:B\\.?O\\.?|S\\.?O\\.?|H\\.?O\\.?|P\\.?O\\.?|G\\.?P\\.?O\\.?|M\\.?D\\.?G\\.?|R\\.?M\\.?S\\.?)\\)?\\s*$/i;\n\nlet cachedData: PostOffice[] | null = null;\n\nfunction sanitizeCityName(raw: string): string {\n if (!raw || typeof raw !== 'string') return '';\n return raw.replace(OFFICE_SUFFIX_REGEX, '').replace(/\\s{2,}/g, ' ').trim();\n}\n\nfunction trimStr(val: unknown): string {\n if (val === null || val === undefined) return '';\n const s = String(val).trim();\n return s === 'NA' ? '' : s.replace(/\\s{2,}/g, ' ');\n}\n\nfunction safeNum(val: unknown): number | null {\n if (val === null || val === undefined) return null;\n const n = Number(val);\n if (!Number.isFinite(n) || n === 0) return null;\n return n;\n}\n\nfunction isValidLatitude(lat: number | null): boolean {\n return lat === null || (lat >= -90 && lat <= 90);\n}\n\nfunction isValidLongitude(lng: number | null): boolean {\n return lng === null || (lng >= -180 && lng <= 180);\n}\n\nfunction normalizeOfficeType(raw: string): OfficeType {\n const upper = String(raw).replace(/\\./g, '').toUpperCase().trim();\n const valid: OfficeType[] = ['BO', 'SO', 'HO', 'PO', 'GPO'];\n return (valid.includes(upper as OfficeType) ? upper : 'BO') as OfficeType;\n}\n\nfunction expand(rec: CompactRecord): PostOffice | null {\n const pincode = trimStr(rec.p);\n const area = sanitizeCityName(trimStr(rec.o));\n const district = trimStr(rec.i);\n const state = trimStr(rec.s);\n\n if (!pincode || !area || !district || !state) return null;\n if (!PINCODE_REGEX.test(pincode)) return null;\n\n const latitude = safeNum(rec.a);\n const longitude = safeNum(rec.n);\n if (!isValidLatitude(latitude) || !isValidLongitude(longitude)) return null;\n\n return {\n pincode,\n area,\n officeType: normalizeOfficeType(rec.t),\n delivery: rec.d === 1,\n district,\n state,\n country: COUNTRY,\n circle: trimStr(rec.c),\n region: trimStr(rec.r),\n division: trimStr(rec.v),\n latitude,\n longitude,\n };\n}\n\nfunction dedupKey(r: PostOffice): string {\n return `${r.pincode}|${r.area.toLowerCase()}|${r.district.toLowerCase()}|${r.officeType}`;\n}\n\nfunction normalize(raw: CompactRecord[]): PostOffice[] {\n const seen = new Set<string>();\n const result: PostOffice[] = [];\n\n for (let i = 0; i < raw.length; i++) {\n const record = expand(raw[i]);\n if (!record) continue;\n\n const key = dedupKey(record);\n if (seen.has(key)) continue;\n\n seen.add(key);\n result.push(record);\n }\n\n return result;\n}\n\n/** Browser-safe loader that fetches and inflates gzipped dataset. */\nexport async function loadBrowserData(): Promise<PostOffice[]> {\n if (cachedData) return cachedData;\n\n const url = new URL('../data/pincodes.json.gz', import.meta.url);\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`india-pincode: failed to load data (${response.status} ${response.statusText})`);\n }\n\n const compressed = new Uint8Array(await response.arrayBuffer());\n const inflated = ungzip(compressed);\n const json = new TextDecoder().decode(inflated);\n const raw = JSON.parse(json) as CompactRecord[];\n\n cachedData = normalize(raw);\n return cachedData;\n}\n\nexport function clearBrowserDataCache(): void {\n cachedData = null;\n}\n","import { IndiaPincode } from './pincode-lookup';\nimport { loadBrowserData, clearBrowserDataCache } from './data-loader.browser';\n\nlet _browserInstance: IndiaPincode | null = null;\n\n/** Returns a singleton instance initialized with browser-loaded data. */\nexport async function getIndiaPincode(): Promise<IndiaPincode> {\n if (_browserInstance) return _browserInstance;\n const data = await loadBrowserData();\n _browserInstance = new IndiaPincode(data);\n return _browserInstance;\n}\n\n/** Creates a fresh instance (non-singleton) for advanced browser use cases. */\nexport async function createIndiaPincode(): Promise<IndiaPincode> {\n const data = await loadBrowserData();\n return new IndiaPincode(data);\n}\n\n/** Clears singleton and cached data in browser runtimes. */\nexport function clearBrowserCache(): void {\n _browserInstance = null;\n clearBrowserDataCache();\n}\n\nexport { IndiaPincode };\nexport {\n PostOffice,\n OfficeType,\n AreaInfo,\n QueryOptions,\n PaginatedResult,\n NearbyResult,\n PincodeSummary,\n DistrictSummary,\n StateSummary,\n ApiResponse,\n ApiError,\n ErrorCode,\n} from './types';\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "india-pincode",
3
- "version": "2.5.0",
4
- "description": "Ultra-fast lookup for Indian pincode datastate, city, district, latitude, longitude. Works standalone or as a NestJS module.",
3
+ "version": "2.5.2",
4
+ "description": "Ultra-fast Indian pincode lookup165K+ post offices, state, district, geo search. Works in React, Node.js, NestJS, and any JS/TS project.",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
7
7
  "types": "dist/index.d.ts",
@@ -40,7 +40,12 @@
40
40
  "state",
41
41
  "city",
42
42
  "district",
43
- "geocode"
43
+ "geocode",
44
+ "react",
45
+ "browser",
46
+ "frontend",
47
+ "nextjs",
48
+ "express"
44
49
  ],
45
50
  "author": "Deepak Kumar",
46
51
  "license": "MIT",