quantaroute-geocoding 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 QuantaRoute
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,312 @@
1
+ # QuantaRoute Geocoding Node.js SDK
2
+
3
+ A **revolutionary** Node.js/TypeScript library for geocoding addresses to DigiPin codes with **groundbreaking Location Lookup API** and offline processing capabilities.
4
+
5
+ ## 🚀 Revolutionary Features
6
+
7
+ ### 🎯 **NEW: Location Lookup API** - *Service that even government doesn't provide!*
8
+ - 🗺️ **Administrative Boundary Lookup**: Get state, division, locality, pincode from coordinates
9
+ - 📍 **36,000+ Postal Boundaries**: Complete coverage across India
10
+ - ⚡ **Sub-100ms Response**: Cached responses with database fallback
11
+ - 🎯 **Government-Level Precision**: Accuracy that official services don't offer
12
+ - 🔄 **Batch Processing**: Up to 100 locations per request
13
+
14
+ ### 🌟 **Core Features**
15
+ - 🌐 **Online API Integration**: Full access to QuantaRoute Geocoding API
16
+ - 🔌 **Offline Processing**: Process coordinates ↔ DigiPin without internet
17
+ - 📊 **TypeScript Support**: Full type definitions included
18
+ - 🚀 **Modern Async/Await**: Promise-based API
19
+ - 📈 **Error Handling**: Comprehensive error types and handling
20
+ - 🔄 **Retry Logic**: Automatic retry with exponential backoff
21
+ - 🎯 **Rate Limit Handling**: Intelligent rate limit management
22
+
23
+ ## Installation
24
+
25
+ ```bash
26
+ npm install quantaroute-geocoding
27
+ ```
28
+
29
+ For offline DigiPin processing, also install the DigiPin library:
30
+
31
+ ```bash
32
+ npm install digipin
33
+ ```
34
+
35
+ ## Quick Start
36
+
37
+ ### 🚀 **NEW: Revolutionary Location Lookup API**
38
+
39
+ ```typescript
40
+ import { QuantaRouteClient } from 'quantaroute-geocoding';
41
+
42
+ // Initialize client
43
+ const client = new QuantaRouteClient({
44
+ apiKey: 'your-api-key'
45
+ });
46
+
47
+ // 🚀 REVOLUTIONARY: Get administrative boundaries from coordinates
48
+ const result = await client.lookupLocationFromCoordinates(28.6139, 77.2090);
49
+ console.log(`Pincode: ${result.administrative_info.pincode}`); // 110001
50
+ console.log(`State: ${result.administrative_info.state}`); // Delhi
51
+ console.log(`Division: ${result.administrative_info.division}`); // New Delhi Central
52
+ console.log(`Locality: ${result.administrative_info.locality}`); // Nirman Bhawan SO
53
+ console.log(`DigiPin: ${result.digipin}`); // 39J-438-TJC7
54
+ console.log(`Response Time: ${result.response_time_ms}ms`); // <100ms
55
+
56
+ // 🚀 REVOLUTIONARY: Get boundaries from DigiPin
57
+ const digipinResult = await client.lookupLocationFromDigiPin("39J-438-TJC7");
58
+ console.log(`Pincode: ${digipinResult.administrative_info.pincode}`);
59
+ console.log(`State: ${digipinResult.administrative_info.state}`);
60
+ console.log(`Division: ${digipinResult.administrative_info.division}`);
61
+ console.log(`Locality: ${digipinResult.administrative_info.locality}`);
62
+
63
+ // 📊 Get live statistics (36,000+ boundaries)
64
+ const stats = await client.getLocationStatistics();
65
+ console.log(`Total Boundaries: ${stats.totalBoundaries.toLocaleString()}`);
66
+ console.log(`Total States: ${stats.totalStates}`);
67
+ ```
68
+
69
+ ### 🌟 **Traditional Geocoding API**
70
+
71
+ ```typescript
72
+ // Geocode an address
73
+ const geocodeResult = await client.geocode("India Gate, New Delhi, India");
74
+ console.log(`DigiPin: ${geocodeResult.digipin}`);
75
+ console.log(`Coordinates: ${geocodeResult.coordinates}`);
76
+
77
+ // Convert coordinates to DigiPin
78
+ const coordResult = await client.coordinatesToDigiPin(28.6139, 77.2090);
79
+ console.log(`DigiPin: ${coordResult.digipin}`);
80
+
81
+ // Reverse geocode DigiPin
82
+ const reverseResult = await client.reverseGeocode("39J-438-TJC7");
83
+ console.log(`Coordinates: ${reverseResult.coordinates}`);
84
+ ```
85
+
86
+ ### Offline Processing
87
+
88
+ ```typescript
89
+ import { OfflineProcessor } from 'quantaroute-geocoding';
90
+
91
+ // Initialize offline processor
92
+ const processor = new OfflineProcessor();
93
+
94
+ // Convert coordinates to DigiPin (offline)
95
+ const offlineResult = processor.coordinatesToDigiPin(28.6139, 77.2090);
96
+ console.log(`DigiPin: ${offlineResult.digipin}`);
97
+
98
+ // Convert DigiPin to coordinates (offline)
99
+ const coordsResult = processor.digiPinToCoordinates("39J-438-TJC7");
100
+ console.log(`Coordinates: ${coordsResult.coordinates}`);
101
+
102
+ // Validate DigiPin format
103
+ const validation = processor.validateDigiPin("39J-438-TJC7");
104
+ console.log(`Valid: ${validation.isValid}`);
105
+
106
+ // Calculate distance between coordinates
107
+ const distance = processor.calculateDistance(28.6139, 77.2090, 28.6150, 77.2100);
108
+ console.log(`Distance: ${distance.toFixed(2)} km`);
109
+ ```
110
+
111
+ ## 🚀 Revolutionary Location Lookup API
112
+
113
+ ### Dedicated Location Lookup Client
114
+
115
+ ```typescript
116
+ import { LocationLookupClient } from 'quantaroute-geocoding';
117
+
118
+ // Initialize dedicated location client
119
+ const locationClient = new LocationLookupClient({
120
+ apiKey: 'your-api-key'
121
+ });
122
+
123
+ // Single coordinate lookup
124
+ const result = await locationClient.lookupCoordinates(28.6139, 77.2090);
125
+ console.log(`📮 Pincode: ${result.administrative_info.pincode}`);
126
+ console.log(`🏢 Office: ${result.administrative_info.locality}`);
127
+ console.log(`🏛️ Division: ${result.administrative_info.division}`);
128
+ console.log(`⚡ Response Time: ${result.response_time_ms}ms`);
129
+
130
+ // DigiPin to boundaries
131
+ const digipinResult = await locationClient.lookupDigiPin("39J-438-TJC7");
132
+ console.log(`Administrative boundaries:`, digipinResult.administrative_info);
133
+
134
+ // Batch processing (up to 100 locations)
135
+ const locations = [
136
+ { latitude: 28.6139, longitude: 77.2090 },
137
+ { latitude: 19.0760, longitude: 72.8777 },
138
+ { digipin: "39J-438-TJC7" }
139
+ ];
140
+ const batchResults = await locationClient.batchLookup(locations);
141
+ console.log(`Processed ${batchResults.results.length} locations`);
142
+
143
+ // Live statistics
144
+ const stats = await locationClient.getStatistics();
145
+ console.log(`🗺️ Total Boundaries: ${stats.totalBoundaries.toLocaleString()}`);
146
+ console.log(`⚡ Cache Size: ${stats.cacheSize}`);
147
+
148
+ // Coverage information
149
+ const coverage = await locationClient.getCoverageInfo();
150
+ console.log(`Service capabilities:`, coverage);
151
+ ```
152
+
153
+ ### Location Lookup Output Format
154
+
155
+ ```typescript
156
+ interface LocationLookupResult {
157
+ administrative_info: {
158
+ pincode: string; // "110001"
159
+ locality: string; // "Nirman Bhawan SO"
160
+ division: string; // "New Delhi Central"
161
+ state: string; // "Delhi"
162
+ country: string; // "India"
163
+ };
164
+ coordinates: {
165
+ latitude: number; // 28.6139
166
+ longitude: number; // 77.2090
167
+ };
168
+ digipin: string; // "39J-438-TJC7"
169
+ confidence: number; // 0.95
170
+ source: 'cache' | 'database';
171
+ response_time_ms?: number; // 45
172
+ }
173
+ ```
174
+
175
+ ### Why This is Revolutionary
176
+
177
+ 🎯 **Government-Level Precision**: Access to administrative boundaries that even government APIs don't provide at this level of detail and accessibility.
178
+
179
+ 📍 **36,000+ Boundaries**: Complete coverage of Indian postal boundaries with sub-district level precision.
180
+
181
+ ⚡ **Performance**: Sub-100ms cached responses, <500ms database queries.
182
+
183
+ 🔄 **Batch Processing**: Process up to 100 locations in a single API call.
184
+
185
+ ✨ **Unique Value**: The only service providing this level of administrative boundary lookup precision for India.
186
+
187
+ ## Configuration
188
+
189
+ ### Environment Variables
190
+
191
+ Set your API key as an environment variable:
192
+
193
+ ```bash
194
+ export QUANTAROUTE_API_KEY="your-api-key"
195
+ ```
196
+
197
+ ### Client Configuration
198
+
199
+ ```typescript
200
+ const client = new QuantaRouteClient({
201
+ apiKey: 'your-key',
202
+ baseURL: 'https://api.quantaroute.com', // Custom base URL
203
+ timeout: 30000, // Request timeout in milliseconds
204
+ maxRetries: 3 // Maximum retry attempts
205
+ });
206
+ ```
207
+
208
+ ## Error Handling
209
+
210
+ ```typescript
211
+ import {
212
+ QuantaRouteError,
213
+ APIRequestError,
214
+ RateLimitError,
215
+ AuthenticationError,
216
+ ValidationError
217
+ } from 'quantaroute-geocoding';
218
+
219
+ try {
220
+ const result = await client.geocode("Invalid address");
221
+ } catch (error) {
222
+ if (error instanceof RateLimitError) {
223
+ console.log(`Rate limit exceeded. Retry after ${error.retryAfter} seconds`);
224
+ } else if (error instanceof AuthenticationError) {
225
+ console.log("Invalid API key");
226
+ } else if (error instanceof ValidationError) {
227
+ console.log(`Validation error: ${error.message}`);
228
+ } else if (error instanceof APIRequestError) {
229
+ console.log(`API error: ${error.message} (Status: ${error.statusCode})`);
230
+ }
231
+ }
232
+ ```
233
+
234
+ ## TypeScript Support
235
+
236
+ This package includes full TypeScript definitions:
237
+
238
+ ```typescript
239
+ import {
240
+ QuantaRouteClient,
241
+ LocationLookupResult,
242
+ GeocodeResult,
243
+ LocationStatistics,
244
+ BatchLocationRequest
245
+ } from 'quantaroute-geocoding';
246
+
247
+ // All types are fully typed
248
+ const client: QuantaRouteClient = new QuantaRouteClient({ apiKey: 'key' });
249
+ const result: LocationLookupResult = await client.lookupLocationFromCoordinates(28.6139, 77.2090);
250
+ ```
251
+
252
+ ## API Limits
253
+
254
+ ### Traditional Geocoding API
255
+
256
+ | Tier | Requests/Minute | Monthly Limit | Batch Size |
257
+ |------|----------------|---------------|------------|
258
+ | Free | 10 | 1,000 | 50 |
259
+ | Paid | 100 | 10,000 | 100 |
260
+ | Enterprise | 1,000 | Unlimited | 100 |
261
+
262
+ ### 🚀 Revolutionary Location Lookup API
263
+
264
+ | Tier | Requests/Minute | Monthly Limit | Batch Size | Boundaries |
265
+ |------|----------------|---------------|------------|------------|
266
+ | Free | 20 | 2,000 | 50 | 36,000+ |
267
+ | Paid | 200 | 20,000 | 100 | 36,000+ |
268
+ | Enterprise | 2,000 | Unlimited | 100 | 36,000+ |
269
+
270
+ **Performance Guarantees:**
271
+ - ⚡ Cached responses: <100ms
272
+ - 🔍 Database queries: <500ms
273
+ - 📊 Batch processing: <50ms per location
274
+ - 🎯 99.9% uptime SLA (Enterprise)
275
+
276
+ ## Examples
277
+
278
+ Check out the `examples/` directory for more comprehensive examples:
279
+
280
+ - `basic-usage.js` - Basic geocoding operations
281
+ - `location-lookup.js` - Revolutionary Location Lookup API
282
+ - `batch-processing.js` - Batch operations
283
+ - `offline-processing.js` - Offline DigiPin operations
284
+ - `error-handling.js` - Comprehensive error handling
285
+
286
+ ## Support
287
+
288
+ - 📧 Email: support@quantaroute.com
289
+ - 🌐 Website: https://quantaroute.com
290
+ - 📖 Traditional API Docs: https://api.quantaroute.com/v1/digipin/docs
291
+ - 🚀 **NEW: Location Lookup API**: https://api.quantaroute.com/v1/location
292
+ - 📊 **Live Statistics**: https://api.quantaroute.com/v1/location/stats
293
+
294
+ ### 🚀 What Makes This Revolutionary?
295
+
296
+ **QuantaRoute's Location Lookup API is the first and only service to provide:**
297
+
298
+ ✨ **Government-Level Precision**: Administrative boundary data that even government APIs don't provide at this level of detail and accessibility.
299
+
300
+ 📍 **Complete Coverage**: 36,000+ postal boundaries across India with sub-district precision.
301
+
302
+ ⚡ **Blazing Performance**: Sub-100ms cached responses, guaranteed <500ms database queries.
303
+
304
+ 🎯 **Unique Value Proposition**: The only service providing this level of administrative boundary lookup precision for India.
305
+
306
+ 🔄 **Developer-Friendly**: Simple APIs, comprehensive TypeScript support, and excellent documentation.
307
+
308
+ **Ready to revolutionize your location intelligence applications?**
309
+
310
+ ## License
311
+
312
+ MIT License - see LICENSE file for details.
@@ -0,0 +1,52 @@
1
+ import { ClientConfig, GeocodeResult, ReverseGeocodeResult, LocationLookupResult, LocationStatistics, BatchLocationRequest, BatchLocationResult } from './types';
2
+ /**
3
+ * QuantaRoute Geocoding Client
4
+ *
5
+ * Revolutionary Node.js SDK for QuantaRoute Geocoding API with Location Lookup
6
+ */
7
+ export declare class QuantaRouteClient {
8
+ private client;
9
+ private config;
10
+ constructor(config: ClientConfig);
11
+ private setupInterceptors;
12
+ private makeRequest;
13
+ /**
14
+ * Geocode an address to DigiPin
15
+ */
16
+ geocode(address: string): Promise<GeocodeResult>;
17
+ /**
18
+ * Convert coordinates to DigiPin
19
+ */
20
+ coordinatesToDigiPin(latitude: number, longitude: number): Promise<GeocodeResult>;
21
+ /**
22
+ * Reverse geocode DigiPin to coordinates
23
+ */
24
+ reverseGeocode(digipin: string): Promise<ReverseGeocodeResult>;
25
+ /**
26
+ * 🚀 REVOLUTIONARY: Get administrative boundaries from coordinates
27
+ */
28
+ lookupLocationFromCoordinates(latitude: number, longitude: number): Promise<LocationLookupResult>;
29
+ /**
30
+ * 🚀 REVOLUTIONARY: Get administrative boundaries from DigiPin
31
+ */
32
+ lookupLocationFromDigiPin(digipin: string): Promise<LocationLookupResult>;
33
+ /**
34
+ * 🚀 REVOLUTIONARY: Batch location lookup
35
+ */
36
+ batchLocationLookup(locations: BatchLocationRequest[]): Promise<BatchLocationResult>;
37
+ /**
38
+ * 📊 Get live location statistics
39
+ */
40
+ getLocationStatistics(): Promise<LocationStatistics>;
41
+ /**
42
+ * Check API usage and limits
43
+ */
44
+ getUsage(): Promise<any>;
45
+ /**
46
+ * Get API health status
47
+ */
48
+ getHealth(): Promise<any>;
49
+ private validateCoordinates;
50
+ private validateDigiPin;
51
+ }
52
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EASpB,MAAM,SAAS,CAAC;AAEjB;;;;GAIG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAyB;gBAE3B,MAAM,EAAE,YAAY;IAyBhC,OAAO,CAAC,iBAAiB;YAyBX,WAAW;IAqBzB;;OAEG;IACG,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAUtD;;OAEG;IACG,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IASvF;;OAEG;IACG,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAQpE;;OAEG;IACG,6BAA6B,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IASvG;;OAEG;IACG,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAQ/E;;OAEG;IACG,mBAAmB,CAAC,SAAS,EAAE,oBAAoB,EAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA6B1F;;OAEG;IACG,qBAAqB,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAI1D;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC;IAI9B;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC;IAI/B,OAAO,CAAC,mBAAmB;IAc3B,OAAO,CAAC,eAAe;CAUxB"}
package/dist/client.js ADDED
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.QuantaRouteClient = void 0;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ const types_1 = require("./types");
9
+ /**
10
+ * QuantaRoute Geocoding Client
11
+ *
12
+ * Revolutionary Node.js SDK for QuantaRoute Geocoding API with Location Lookup
13
+ */
14
+ class QuantaRouteClient {
15
+ constructor(config) {
16
+ this.config = {
17
+ apiKey: config.apiKey,
18
+ baseURL: config.baseURL || 'https://api.quantaroute.com',
19
+ timeout: config.timeout || 30000,
20
+ maxRetries: config.maxRetries || 3
21
+ };
22
+ if (!this.config.apiKey) {
23
+ throw new types_1.ValidationError('API key is required');
24
+ }
25
+ this.client = axios_1.default.create({
26
+ baseURL: this.config.baseURL,
27
+ timeout: this.config.timeout,
28
+ headers: {
29
+ 'Content-Type': 'application/json',
30
+ 'x-api-key': this.config.apiKey,
31
+ 'User-Agent': 'QuantaRoute-NodeJS-SDK/1.0.0'
32
+ }
33
+ });
34
+ this.setupInterceptors();
35
+ }
36
+ setupInterceptors() {
37
+ this.client.interceptors.response.use((response) => response, (error) => {
38
+ if (error.response) {
39
+ const status = error.response.status;
40
+ const data = error.response.data;
41
+ switch (status) {
42
+ case 401:
43
+ throw new types_1.AuthenticationError(data.message || 'Invalid API key');
44
+ case 429:
45
+ const retryAfter = parseInt(error.response.headers['retry-after'] || '60');
46
+ throw new types_1.RateLimitError(data.message || 'Rate limit exceeded', retryAfter);
47
+ case 400:
48
+ throw new types_1.ValidationError(data.message || 'Invalid request');
49
+ default:
50
+ throw new types_1.APIRequestError(data.message || 'API request failed', status);
51
+ }
52
+ }
53
+ throw new types_1.QuantaRouteError(error.message || 'Network error');
54
+ });
55
+ }
56
+ async makeRequest(method, endpoint, data) {
57
+ try {
58
+ const response = await this.client.request({
59
+ method,
60
+ url: endpoint,
61
+ data
62
+ });
63
+ return response.data.data;
64
+ }
65
+ catch (error) {
66
+ if (error instanceof types_1.QuantaRouteError) {
67
+ throw error;
68
+ }
69
+ throw new types_1.QuantaRouteError('Request failed');
70
+ }
71
+ }
72
+ /**
73
+ * Geocode an address to DigiPin
74
+ */
75
+ async geocode(address) {
76
+ if (!address || !address.trim()) {
77
+ throw new types_1.ValidationError('Address is required');
78
+ }
79
+ return this.makeRequest('POST', '/v1/digipin/geocode', {
80
+ address: address.trim()
81
+ });
82
+ }
83
+ /**
84
+ * Convert coordinates to DigiPin
85
+ */
86
+ async coordinatesToDigiPin(latitude, longitude) {
87
+ this.validateCoordinates(latitude, longitude);
88
+ return this.makeRequest('POST', '/v1/digipin/coordinates-to-digipin', {
89
+ latitude,
90
+ longitude
91
+ });
92
+ }
93
+ /**
94
+ * Reverse geocode DigiPin to coordinates
95
+ */
96
+ async reverseGeocode(digipin) {
97
+ this.validateDigiPin(digipin);
98
+ return this.makeRequest('POST', '/v1/digipin/reverse', {
99
+ digipin: digipin.trim()
100
+ });
101
+ }
102
+ /**
103
+ * 🚀 REVOLUTIONARY: Get administrative boundaries from coordinates
104
+ */
105
+ async lookupLocationFromCoordinates(latitude, longitude) {
106
+ this.validateCoordinates(latitude, longitude);
107
+ return this.makeRequest('POST', '/v1/location/lookup', {
108
+ latitude,
109
+ longitude
110
+ });
111
+ }
112
+ /**
113
+ * 🚀 REVOLUTIONARY: Get administrative boundaries from DigiPin
114
+ */
115
+ async lookupLocationFromDigiPin(digipin) {
116
+ this.validateDigiPin(digipin);
117
+ return this.makeRequest('POST', '/v1/location/lookup', {
118
+ digipin: digipin.trim()
119
+ });
120
+ }
121
+ /**
122
+ * 🚀 REVOLUTIONARY: Batch location lookup
123
+ */
124
+ async batchLocationLookup(locations) {
125
+ if (!locations || locations.length === 0) {
126
+ throw new types_1.ValidationError('Locations array is required');
127
+ }
128
+ if (locations.length > 100) {
129
+ throw new types_1.ValidationError('Maximum 100 locations per batch');
130
+ }
131
+ // Validate each location
132
+ locations.forEach((location, index) => {
133
+ if (!location.digipin && (location.latitude === undefined || location.longitude === undefined)) {
134
+ throw new types_1.ValidationError(`Location ${index}: Either coordinates or digipin is required`);
135
+ }
136
+ if (location.latitude !== undefined && location.longitude !== undefined) {
137
+ this.validateCoordinates(location.latitude, location.longitude);
138
+ }
139
+ if (location.digipin) {
140
+ this.validateDigiPin(location.digipin);
141
+ }
142
+ });
143
+ return this.makeRequest('POST', '/v1/location/batch-lookup', {
144
+ locations
145
+ });
146
+ }
147
+ /**
148
+ * 📊 Get live location statistics
149
+ */
150
+ async getLocationStatistics() {
151
+ return this.makeRequest('GET', '/v1/location/stats');
152
+ }
153
+ /**
154
+ * Check API usage and limits
155
+ */
156
+ async getUsage() {
157
+ return this.makeRequest('GET', '/v1/digipin/usage');
158
+ }
159
+ /**
160
+ * Get API health status
161
+ */
162
+ async getHealth() {
163
+ return this.makeRequest('GET', '/health');
164
+ }
165
+ validateCoordinates(latitude, longitude) {
166
+ if (typeof latitude !== 'number' || typeof longitude !== 'number') {
167
+ throw new types_1.ValidationError('Latitude and longitude must be numbers');
168
+ }
169
+ if (latitude < -90 || latitude > 90) {
170
+ throw new types_1.ValidationError('Latitude must be between -90 and 90');
171
+ }
172
+ if (longitude < -180 || longitude > 180) {
173
+ throw new types_1.ValidationError('Longitude must be between -180 and 180');
174
+ }
175
+ }
176
+ validateDigiPin(digipin) {
177
+ if (!digipin || typeof digipin !== 'string') {
178
+ throw new types_1.ValidationError('DigiPin is required and must be a string');
179
+ }
180
+ const digipinRegex = /^[A-Z0-9]{3}-[A-Z0-9]{3}-[A-Z0-9]{4}$/;
181
+ if (!digipinRegex.test(digipin.trim())) {
182
+ throw new types_1.ValidationError('Invalid DigiPin format. Expected format: XXX-XXX-XXXX');
183
+ }
184
+ }
185
+ }
186
+ exports.QuantaRouteClient = QuantaRouteClient;
187
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * QuantaRoute Geocoding Node.js SDK
3
+ *
4
+ * Revolutionary Node.js library for geocoding addresses to DigiPin codes with
5
+ * groundbreaking Location Lookup API and offline processing capabilities.
6
+ */
7
+ export { QuantaRouteClient } from './client';
8
+ export { LocationLookupClient } from './location-lookup';
9
+ export { OfflineProcessor } from './offline';
10
+ export { Coordinates, AdministrativeInfo, LocationLookupResult, GeocodeResult, ReverseGeocodeResult, LocationStatistics, BatchLocationRequest, BatchLocationResult, APIError, APIResponse, ClientConfig, OfflineDigiPinResult, ValidationResult, QuantaRouteError, APIRequestError, RateLimitError, AuthenticationError, ValidationError } from './types';
11
+ import { QuantaRouteClient } from './client';
12
+ export default QuantaRouteClient;
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7C,OAAO,EAEL,WAAW,EACX,kBAAkB,EAClB,oBAAoB,EACpB,aAAa,EACb,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,oBAAoB,EACpB,gBAAgB,EAGhB,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,eAAe,EAChB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,eAAe,iBAAiB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ /**
3
+ * QuantaRoute Geocoding Node.js SDK
4
+ *
5
+ * Revolutionary Node.js library for geocoding addresses to DigiPin codes with
6
+ * groundbreaking Location Lookup API and offline processing capabilities.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.ValidationError = exports.AuthenticationError = exports.RateLimitError = exports.APIRequestError = exports.QuantaRouteError = exports.OfflineProcessor = exports.LocationLookupClient = exports.QuantaRouteClient = void 0;
10
+ var client_1 = require("./client");
11
+ Object.defineProperty(exports, "QuantaRouteClient", { enumerable: true, get: function () { return client_1.QuantaRouteClient; } });
12
+ var location_lookup_1 = require("./location-lookup");
13
+ Object.defineProperty(exports, "LocationLookupClient", { enumerable: true, get: function () { return location_lookup_1.LocationLookupClient; } });
14
+ var offline_1 = require("./offline");
15
+ Object.defineProperty(exports, "OfflineProcessor", { enumerable: true, get: function () { return offline_1.OfflineProcessor; } });
16
+ var types_1 = require("./types");
17
+ // Errors
18
+ Object.defineProperty(exports, "QuantaRouteError", { enumerable: true, get: function () { return types_1.QuantaRouteError; } });
19
+ Object.defineProperty(exports, "APIRequestError", { enumerable: true, get: function () { return types_1.APIRequestError; } });
20
+ Object.defineProperty(exports, "RateLimitError", { enumerable: true, get: function () { return types_1.RateLimitError; } });
21
+ Object.defineProperty(exports, "AuthenticationError", { enumerable: true, get: function () { return types_1.AuthenticationError; } });
22
+ Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function () { return types_1.ValidationError; } });
23
+ // Default export for convenience
24
+ const client_2 = require("./client");
25
+ exports.default = client_2.QuantaRouteClient;
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,mCAA6C;AAApC,2GAAA,iBAAiB,OAAA;AAC1B,qDAAyD;AAAhD,uHAAA,oBAAoB,OAAA;AAC7B,qCAA6C;AAApC,2GAAA,gBAAgB,OAAA;AAEzB,iCAsBiB;AANf,SAAS;AACT,yGAAA,gBAAgB,OAAA;AAChB,wGAAA,eAAe,OAAA;AACf,uGAAA,cAAc,OAAA;AACd,4GAAA,mBAAmB,OAAA;AACnB,wGAAA,eAAe,OAAA;AAGjB,iCAAiC;AACjC,qCAA6C;AAC7C,kBAAe,0BAAiB,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { ClientConfig, LocationLookupResult, LocationStatistics, BatchLocationRequest, BatchLocationResult } from './types';
2
+ /**
3
+ * 🚀 REVOLUTIONARY: Dedicated Location Lookup Client
4
+ *
5
+ * Specialized client for administrative boundary lookup operations
6
+ */
7
+ export declare class LocationLookupClient {
8
+ private client;
9
+ private config;
10
+ constructor(config: ClientConfig);
11
+ private makeRequest;
12
+ /**
13
+ * 🚀 REVOLUTIONARY: Lookup administrative boundaries from coordinates
14
+ */
15
+ lookupCoordinates(latitude: number, longitude: number): Promise<LocationLookupResult>;
16
+ /**
17
+ * 🚀 REVOLUTIONARY: Lookup administrative boundaries from DigiPin
18
+ */
19
+ lookupDigiPin(digipin: string): Promise<LocationLookupResult>;
20
+ /**
21
+ * 🚀 REVOLUTIONARY: Batch lookup for multiple locations
22
+ */
23
+ batchLookup(locations: BatchLocationRequest[]): Promise<BatchLocationResult>;
24
+ /**
25
+ * 📊 Get live location statistics (36,000+ boundaries)
26
+ */
27
+ getStatistics(): Promise<LocationStatistics>;
28
+ /**
29
+ * 🌟 Get coverage information
30
+ */
31
+ getCoverageInfo(): Promise<any>;
32
+ private validateCoordinates;
33
+ private validateDigiPin;
34
+ }
35
+ //# sourceMappingURL=location-lookup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"location-lookup.d.ts","sourceRoot":"","sources":["../src/location-lookup.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EAIpB,MAAM,SAAS,CAAC;AAEjB;;;;GAIG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAyB;gBAE3B,MAAM,EAAE,YAAY;YAuBlB,WAAW;IAwBzB;;OAEG;IACG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAS3F;;OAEG;IACG,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAQnE;;OAEG;IACG,WAAW,CAAC,SAAS,EAAE,oBAAoB,EAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA6BlF;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAIlD;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC;IAIrC,OAAO,CAAC,mBAAmB;IAc3B,OAAO,CAAC,eAAe;CAUxB"}
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.LocationLookupClient = void 0;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ const types_1 = require("./types");
9
+ /**
10
+ * 🚀 REVOLUTIONARY: Dedicated Location Lookup Client
11
+ *
12
+ * Specialized client for administrative boundary lookup operations
13
+ */
14
+ class LocationLookupClient {
15
+ constructor(config) {
16
+ this.config = {
17
+ apiKey: config.apiKey,
18
+ baseURL: config.baseURL || 'https://api.quantaroute.com',
19
+ timeout: config.timeout || 30000,
20
+ maxRetries: config.maxRetries || 3
21
+ };
22
+ if (!this.config.apiKey) {
23
+ throw new types_1.ValidationError('API key is required');
24
+ }
25
+ this.client = axios_1.default.create({
26
+ baseURL: this.config.baseURL,
27
+ timeout: this.config.timeout,
28
+ headers: {
29
+ 'Content-Type': 'application/json',
30
+ 'x-api-key': this.config.apiKey,
31
+ 'User-Agent': 'QuantaRoute-LocationLookup-NodeJS/1.0.0'
32
+ }
33
+ });
34
+ }
35
+ async makeRequest(method, endpoint, data) {
36
+ try {
37
+ const response = await this.client.request({
38
+ method,
39
+ url: endpoint,
40
+ data
41
+ });
42
+ return response.data.data;
43
+ }
44
+ catch (error) {
45
+ if (error.response?.status === 401) {
46
+ throw new types_1.ValidationError('Invalid API key');
47
+ }
48
+ if (error.response?.status === 429) {
49
+ throw new types_1.ValidationError('Rate limit exceeded');
50
+ }
51
+ throw new types_1.QuantaRouteError(error.message || 'Request failed');
52
+ }
53
+ }
54
+ /**
55
+ * 🚀 REVOLUTIONARY: Lookup administrative boundaries from coordinates
56
+ */
57
+ async lookupCoordinates(latitude, longitude) {
58
+ this.validateCoordinates(latitude, longitude);
59
+ return this.makeRequest('POST', '/v1/location/lookup', {
60
+ latitude,
61
+ longitude
62
+ });
63
+ }
64
+ /**
65
+ * 🚀 REVOLUTIONARY: Lookup administrative boundaries from DigiPin
66
+ */
67
+ async lookupDigiPin(digipin) {
68
+ this.validateDigiPin(digipin);
69
+ return this.makeRequest('POST', '/v1/location/lookup', {
70
+ digipin: digipin.trim()
71
+ });
72
+ }
73
+ /**
74
+ * 🚀 REVOLUTIONARY: Batch lookup for multiple locations
75
+ */
76
+ async batchLookup(locations) {
77
+ if (!locations || locations.length === 0) {
78
+ throw new types_1.ValidationError('Locations array is required');
79
+ }
80
+ if (locations.length > 100) {
81
+ throw new types_1.ValidationError('Maximum 100 locations per batch');
82
+ }
83
+ // Validate each location
84
+ locations.forEach((location, index) => {
85
+ if (!location.digipin && (location.latitude === undefined || location.longitude === undefined)) {
86
+ throw new types_1.ValidationError(`Location ${index}: Either coordinates or digipin is required`);
87
+ }
88
+ if (location.latitude !== undefined && location.longitude !== undefined) {
89
+ this.validateCoordinates(location.latitude, location.longitude);
90
+ }
91
+ if (location.digipin) {
92
+ this.validateDigiPin(location.digipin);
93
+ }
94
+ });
95
+ return this.makeRequest('POST', '/v1/location/batch-lookup', {
96
+ locations
97
+ });
98
+ }
99
+ /**
100
+ * 📊 Get live location statistics (36,000+ boundaries)
101
+ */
102
+ async getStatistics() {
103
+ return this.makeRequest('GET', '/v1/location/stats');
104
+ }
105
+ /**
106
+ * 🌟 Get coverage information
107
+ */
108
+ async getCoverageInfo() {
109
+ return this.makeRequest('GET', '/v1/location');
110
+ }
111
+ validateCoordinates(latitude, longitude) {
112
+ if (typeof latitude !== 'number' || typeof longitude !== 'number') {
113
+ throw new types_1.ValidationError('Latitude and longitude must be numbers');
114
+ }
115
+ if (latitude < -90 || latitude > 90) {
116
+ throw new types_1.ValidationError('Latitude must be between -90 and 90');
117
+ }
118
+ if (longitude < -180 || longitude > 180) {
119
+ throw new types_1.ValidationError('Longitude must be between -180 and 180');
120
+ }
121
+ }
122
+ validateDigiPin(digipin) {
123
+ if (!digipin || typeof digipin !== 'string') {
124
+ throw new types_1.ValidationError('DigiPin is required and must be a string');
125
+ }
126
+ const digipinRegex = /^[A-Z0-9]{3}-[A-Z0-9]{3}-[A-Z0-9]{4}$/;
127
+ if (!digipinRegex.test(digipin.trim())) {
128
+ throw new types_1.ValidationError('Invalid DigiPin format. Expected format: XXX-XXX-XXXX');
129
+ }
130
+ }
131
+ }
132
+ exports.LocationLookupClient = LocationLookupClient;
133
+ //# sourceMappingURL=location-lookup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"location-lookup.js","sourceRoot":"","sources":["../src/location-lookup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { OfflineDigiPinResult, ValidationResult } from './types';
2
+ /**
3
+ * Offline DigiPin Processor
4
+ *
5
+ * Process DigiPin operations without internet connectivity
6
+ */
7
+ export declare class OfflineProcessor {
8
+ private digipin;
9
+ constructor();
10
+ /**
11
+ * Convert coordinates to DigiPin (offline)
12
+ */
13
+ coordinatesToDigiPin(latitude: number, longitude: number): OfflineDigiPinResult;
14
+ /**
15
+ * Convert DigiPin to coordinates (offline)
16
+ */
17
+ digiPinToCoordinates(digipin: string): OfflineDigiPinResult;
18
+ /**
19
+ * Validate DigiPin format (offline)
20
+ */
21
+ validateDigiPin(digipin: string): ValidationResult;
22
+ /**
23
+ * Calculate distance between two coordinates (offline)
24
+ */
25
+ calculateDistance(lat1: number, lon1: number, lat2: number, lon2: number): number;
26
+ /**
27
+ * Check if DigiPin library is available
28
+ */
29
+ isDigiPinLibraryAvailable(): boolean;
30
+ private ensureDigiPinLibrary;
31
+ private validateCoordinates;
32
+ private validateDigiPinFormat;
33
+ private toRadians;
34
+ }
35
+ //# sourceMappingURL=offline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offline.d.ts","sourceRoot":"","sources":["../src/offline.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAGjB,MAAM,SAAS,CAAC;AAEjB;;;;GAIG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAAM;;IAYrB;;OAEG;IACH,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,oBAAoB;IAqB/E;;OAEG;IACH,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,oBAAoB;IAwB3D;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB;IA4ClD;;OAEG;IACH,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;IAiBjF;;OAEG;IACH,yBAAyB,IAAI,OAAO;IAIpC,OAAO,CAAC,oBAAoB;IAM5B,OAAO,CAAC,mBAAmB;IAc3B,OAAO,CAAC,qBAAqB;IAW7B,OAAO,CAAC,SAAS;CAGlB"}
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OfflineProcessor = void 0;
4
+ const types_1 = require("./types");
5
+ /**
6
+ * Offline DigiPin Processor
7
+ *
8
+ * Process DigiPin operations without internet connectivity
9
+ */
10
+ class OfflineProcessor {
11
+ constructor() {
12
+ try {
13
+ // Try to import the digipin library
14
+ this.digipin = require('digipin');
15
+ }
16
+ catch (error) {
17
+ console.warn('DigiPin library not found. Install with: npm install digipin');
18
+ this.digipin = null;
19
+ }
20
+ }
21
+ /**
22
+ * Convert coordinates to DigiPin (offline)
23
+ */
24
+ coordinatesToDigiPin(latitude, longitude) {
25
+ this.ensureDigiPinLibrary();
26
+ this.validateCoordinates(latitude, longitude);
27
+ try {
28
+ const result = this.digipin.encode(latitude, longitude);
29
+ if (!result || result === 'Invalid coordinates') {
30
+ throw new types_1.ValidationError('Invalid coordinates for DigiPin conversion');
31
+ }
32
+ return {
33
+ digipin: result,
34
+ coordinates: { latitude, longitude },
35
+ source: 'offline'
36
+ };
37
+ }
38
+ catch (error) {
39
+ throw new types_1.ValidationError(`Failed to convert coordinates to DigiPin: ${error.message}`);
40
+ }
41
+ }
42
+ /**
43
+ * Convert DigiPin to coordinates (offline)
44
+ */
45
+ digiPinToCoordinates(digipin) {
46
+ this.ensureDigiPinLibrary();
47
+ this.validateDigiPinFormat(digipin);
48
+ try {
49
+ const result = this.digipin.decode(digipin.trim());
50
+ if (!result || result === 'Invalid DIGIPIN') {
51
+ throw new types_1.ValidationError('Invalid DigiPin code');
52
+ }
53
+ return {
54
+ digipin: digipin.trim(),
55
+ coordinates: {
56
+ latitude: result[0],
57
+ longitude: result[1]
58
+ },
59
+ source: 'offline'
60
+ };
61
+ }
62
+ catch (error) {
63
+ throw new types_1.ValidationError(`Failed to convert DigiPin to coordinates: ${error.message}`);
64
+ }
65
+ }
66
+ /**
67
+ * Validate DigiPin format (offline)
68
+ */
69
+ validateDigiPin(digipin) {
70
+ if (!digipin || typeof digipin !== 'string') {
71
+ return {
72
+ isValid: false,
73
+ digipin: digipin || '',
74
+ errors: ['DigiPin is required and must be a string'],
75
+ source: 'offline'
76
+ };
77
+ }
78
+ const cleanDigiPin = digipin.trim();
79
+ const errors = [];
80
+ // Check format
81
+ const digipinRegex = /^[A-Z0-9]{3}-[A-Z0-9]{3}-[A-Z0-9]{4}$/;
82
+ if (!digipinRegex.test(cleanDigiPin)) {
83
+ errors.push('Invalid DigiPin format. Expected format: XXX-XXX-XXXX');
84
+ }
85
+ // Check length
86
+ if (cleanDigiPin.length !== 12) {
87
+ errors.push('DigiPin must be exactly 12 characters including dashes');
88
+ }
89
+ // Check if it can be decoded (if digipin library is available)
90
+ if (this.digipin && errors.length === 0) {
91
+ try {
92
+ const result = this.digipin.decode(cleanDigiPin);
93
+ if (!result || result === 'Invalid DIGIPIN') {
94
+ errors.push('DigiPin code is not valid according to the DigiPin algorithm');
95
+ }
96
+ }
97
+ catch (error) {
98
+ errors.push('DigiPin code validation failed');
99
+ }
100
+ }
101
+ return {
102
+ isValid: errors.length === 0,
103
+ digipin: cleanDigiPin,
104
+ errors,
105
+ source: 'offline'
106
+ };
107
+ }
108
+ /**
109
+ * Calculate distance between two coordinates (offline)
110
+ */
111
+ calculateDistance(lat1, lon1, lat2, lon2) {
112
+ this.validateCoordinates(lat1, lon1);
113
+ this.validateCoordinates(lat2, lon2);
114
+ const R = 6371; // Earth's radius in kilometers
115
+ const dLat = this.toRadians(lat2 - lat1);
116
+ const dLon = this.toRadians(lon2 - lon1);
117
+ const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
118
+ Math.cos(this.toRadians(lat1)) * Math.cos(this.toRadians(lat2)) *
119
+ Math.sin(dLon / 2) * Math.sin(dLon / 2);
120
+ const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
121
+ return R * c; // Distance in kilometers
122
+ }
123
+ /**
124
+ * Check if DigiPin library is available
125
+ */
126
+ isDigiPinLibraryAvailable() {
127
+ return this.digipin !== null;
128
+ }
129
+ ensureDigiPinLibrary() {
130
+ if (!this.digipin) {
131
+ throw new types_1.ValidationError('DigiPin library not available. Install with: npm install digipin');
132
+ }
133
+ }
134
+ validateCoordinates(latitude, longitude) {
135
+ if (typeof latitude !== 'number' || typeof longitude !== 'number') {
136
+ throw new types_1.ValidationError('Latitude and longitude must be numbers');
137
+ }
138
+ if (latitude < -90 || latitude > 90) {
139
+ throw new types_1.ValidationError('Latitude must be between -90 and 90');
140
+ }
141
+ if (longitude < -180 || longitude > 180) {
142
+ throw new types_1.ValidationError('Longitude must be between -180 and 180');
143
+ }
144
+ }
145
+ validateDigiPinFormat(digipin) {
146
+ if (!digipin || typeof digipin !== 'string') {
147
+ throw new types_1.ValidationError('DigiPin is required and must be a string');
148
+ }
149
+ const digipinRegex = /^[A-Z0-9]{3}-[A-Z0-9]{3}-[A-Z0-9]{4}$/;
150
+ if (!digipinRegex.test(digipin.trim())) {
151
+ throw new types_1.ValidationError('Invalid DigiPin format. Expected format: XXX-XXX-XXXX');
152
+ }
153
+ }
154
+ toRadians(degrees) {
155
+ return degrees * (Math.PI / 180);
156
+ }
157
+ }
158
+ exports.OfflineProcessor = OfflineProcessor;
159
+ //# sourceMappingURL=offline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offline.js","sourceRoot":"","sources":["../src/offline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * QuantaRoute Geocoding SDK Types
3
+ */
4
+ export interface Coordinates {
5
+ latitude: number;
6
+ longitude: number;
7
+ }
8
+ export interface AdministrativeInfo {
9
+ country: string;
10
+ state: string;
11
+ division: string;
12
+ locality: string;
13
+ pincode: string;
14
+ }
15
+ export interface LocationLookupResult {
16
+ coordinates: Coordinates;
17
+ digipin: string;
18
+ administrative_info: AdministrativeInfo;
19
+ confidence: number;
20
+ source: 'cache' | 'database';
21
+ response_time_ms?: number;
22
+ }
23
+ export interface GeocodeResult {
24
+ digipin: string;
25
+ coordinates: Coordinates;
26
+ formatted_address?: string;
27
+ confidence: number;
28
+ source: 'api' | 'cache';
29
+ }
30
+ export interface ReverseGeocodeResult {
31
+ coordinates: Coordinates;
32
+ formatted_address: string;
33
+ digipin: string;
34
+ confidence: number;
35
+ }
36
+ export interface LocationStatistics {
37
+ totalBoundaries: number;
38
+ totalStates: number;
39
+ totalDivisions: number;
40
+ cacheSize: number;
41
+ }
42
+ export interface BatchLocationRequest {
43
+ latitude?: number;
44
+ longitude?: number;
45
+ digipin?: string;
46
+ }
47
+ export interface BatchLocationResult {
48
+ results: LocationLookupResult[];
49
+ total_processed: number;
50
+ success_count: number;
51
+ error_count: number;
52
+ processing_time_ms: number;
53
+ }
54
+ export interface APIError {
55
+ success: false;
56
+ error: string;
57
+ message: string;
58
+ code: string;
59
+ status_code?: number;
60
+ }
61
+ export interface APIResponse<T> {
62
+ success: true;
63
+ data: T;
64
+ }
65
+ export interface ClientConfig {
66
+ apiKey: string;
67
+ baseURL?: string;
68
+ timeout?: number;
69
+ maxRetries?: number;
70
+ }
71
+ export interface OfflineDigiPinResult {
72
+ digipin: string;
73
+ coordinates: Coordinates;
74
+ source: 'offline';
75
+ }
76
+ export interface ValidationResult {
77
+ isValid: boolean;
78
+ digipin: string;
79
+ errors: string[];
80
+ source: 'offline';
81
+ }
82
+ export declare class QuantaRouteError extends Error {
83
+ readonly statusCode?: number;
84
+ readonly code?: string;
85
+ constructor(message: string, statusCode?: number, code?: string);
86
+ }
87
+ export declare class APIRequestError extends QuantaRouteError {
88
+ constructor(message: string, statusCode?: number);
89
+ }
90
+ export declare class RateLimitError extends QuantaRouteError {
91
+ readonly retryAfter?: number;
92
+ constructor(message: string, retryAfter?: number);
93
+ }
94
+ export declare class AuthenticationError extends QuantaRouteError {
95
+ constructor(message?: string);
96
+ }
97
+ export declare class ValidationError extends QuantaRouteError {
98
+ constructor(message: string);
99
+ }
100
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ /**
3
+ * QuantaRoute Geocoding SDK Types
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ValidationError = exports.AuthenticationError = exports.RateLimitError = exports.APIRequestError = exports.QuantaRouteError = void 0;
7
+ class QuantaRouteError extends Error {
8
+ constructor(message, statusCode, code) {
9
+ super(message);
10
+ this.name = 'QuantaRouteError';
11
+ this.statusCode = statusCode;
12
+ this.code = code;
13
+ }
14
+ }
15
+ exports.QuantaRouteError = QuantaRouteError;
16
+ class APIRequestError extends QuantaRouteError {
17
+ constructor(message, statusCode) {
18
+ super(message, statusCode, 'API_REQUEST_ERROR');
19
+ this.name = 'APIRequestError';
20
+ }
21
+ }
22
+ exports.APIRequestError = APIRequestError;
23
+ class RateLimitError extends QuantaRouteError {
24
+ constructor(message, retryAfter) {
25
+ super(message, 429, 'RATE_LIMIT_ERROR');
26
+ this.name = 'RateLimitError';
27
+ this.retryAfter = retryAfter;
28
+ }
29
+ }
30
+ exports.RateLimitError = RateLimitError;
31
+ class AuthenticationError extends QuantaRouteError {
32
+ constructor(message = 'Invalid API key') {
33
+ super(message, 401, 'AUTHENTICATION_ERROR');
34
+ this.name = 'AuthenticationError';
35
+ }
36
+ }
37
+ exports.AuthenticationError = AuthenticationError;
38
+ class ValidationError extends QuantaRouteError {
39
+ constructor(message) {
40
+ super(message, 400, 'VALIDATION_ERROR');
41
+ this.name = 'ValidationError';
42
+ }
43
+ }
44
+ exports.ValidationError = ValidationError;
45
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AA6FH,MAAa,gBAAiB,SAAQ,KAAK;IAIzC,YAAY,OAAe,EAAE,UAAmB,EAAE,IAAa;QAC7D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAVD,4CAUC;AAED,MAAa,eAAgB,SAAQ,gBAAgB;IACnD,YAAY,OAAe,EAAE,UAAmB;QAC9C,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,mBAAmB,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AALD,0CAKC;AAED,MAAa,cAAe,SAAQ,gBAAgB;IAGlD,YAAY,OAAe,EAAE,UAAmB;QAC9C,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,kBAAkB,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;CACF;AARD,wCAQC;AAED,MAAa,mBAAoB,SAAQ,gBAAgB;IACvD,YAAY,UAAkB,iBAAiB;QAC7C,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,sBAAsB,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AALD,kDAKC;AAED,MAAa,eAAgB,SAAQ,gBAAgB;IACnD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,kBAAkB,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AALD,0CAKC"}
package/package.json ADDED
@@ -0,0 +1,75 @@
1
+ {
2
+ "name": "quantaroute-geocoding",
3
+ "version": "1.0.0",
4
+ "description": "Revolutionary Node.js SDK for QuantaRoute Geocoding API with Location Lookup and DigiPin processing",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "scripts": {
8
+ "build": "tsc",
9
+ "dev": "tsc --watch",
10
+ "test": "jest",
11
+ "lint": "eslint src/**/*.ts",
12
+ "prepare": "npm run build",
13
+ "example": "node examples/basic-usage.js"
14
+ },
15
+ "keywords": [
16
+ "geocoding",
17
+ "digipin",
18
+ "gis",
19
+ "location",
20
+ "india",
21
+ "address",
22
+ "coordinates",
23
+ "administrative-boundaries",
24
+ "pincode",
25
+ "postal-lookup",
26
+ "location-intelligence",
27
+ "quantaroute"
28
+ ],
29
+ "author": {
30
+ "name": "QuantaRoute",
31
+ "email": "support@quantaroute.com",
32
+ "url": "https://quantaroute.com"
33
+ },
34
+ "license": "MIT",
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "https://github.com/quantaroute/quantaroute-geocoding-nodejs"
38
+ },
39
+ "homepage": "https://quantaroute.com",
40
+ "bugs": {
41
+ "url": "https://github.com/quantaroute/quantaroute-geocoding-nodejs/issues"
42
+ },
43
+ "files": [
44
+ "dist/**/*",
45
+ "README.md",
46
+ "LICENSE"
47
+ ],
48
+ "dependencies": {
49
+ "axios": "^1.6.0"
50
+ },
51
+ "peerDependencies": {
52
+ "digipin": ">=1.0.0"
53
+ },
54
+ "peerDependenciesMeta": {
55
+ "digipin": {
56
+ "optional": true
57
+ }
58
+ },
59
+ "devDependencies": {
60
+ "@types/node": "^20.0.0",
61
+ "@typescript-eslint/eslint-plugin": "^6.0.0",
62
+ "@typescript-eslint/parser": "^6.0.0",
63
+ "eslint": "^8.0.0",
64
+ "jest": "^29.0.0",
65
+ "@types/jest": "^29.0.0",
66
+ "ts-jest": "^29.0.0",
67
+ "typescript": "^5.0.0"
68
+ },
69
+ "engines": {
70
+ "node": ">=14.0.0"
71
+ },
72
+ "publishConfig": {
73
+ "access": "public"
74
+ }
75
+ }