UNPKG

digipinjs

Version:

A comprehensive TypeScript library for encoding and decoding Indian geographic coordinates into DIGIPIN format (Indian Postal Digital PIN system). Features CLI tools, caching, batch processing, and Express middleware for seamless integration.

63 lines (62 loc) 2.36 kB
import { getLatLngFromDigiPin, } from './core'; import { getDistance as getCoordinateDistance, getPreciseDistance as getPreciseCoordinateDistance, } from 'geolib'; import { normalizeDigiPin } from './util'; function isCoordinates(value) { if (!value || typeof value !== 'object') { return false; } const maybe = value; return (typeof maybe.latitude === 'number' && typeof maybe.longitude === 'number'); } function resolveCoordinates(input, decodeOptions = {}) { if (typeof input === 'string') { return getLatLngFromDigiPin(input, decodeOptions); } if (isCoordinates(input)) { return input; } throw new TypeError('Unsupported pin input'); } export function getDistance(start, end, accuracy = 1, decodeOptions = {}) { if (typeof start === 'string') { normalizeDigiPin(start); } if (typeof end === 'string') { normalizeDigiPin(end); } const startCoords = resolveCoordinates(start, decodeOptions); const endCoords = resolveCoordinates(end, decodeOptions); return getCoordinateDistance(startCoords, endCoords, accuracy); } export function getPreciseDistance(start, end, accuracy = 1, decodeOptions = {}) { if (typeof start === 'string') { normalizeDigiPin(start); } if (typeof end === 'string') { normalizeDigiPin(end); } const startCoords = resolveCoordinates(start, decodeOptions); const endCoords = resolveCoordinates(end, decodeOptions); return getPreciseCoordinateDistance(startCoords, endCoords, accuracy); } export function orderByDistance(reference, pins, options = {}) { const { accuracy = 1, decodeOptions = {}, distanceFn = (start, end) => getCoordinateDistance(start, end, accuracy), } = options; if (typeof reference === 'string') { normalizeDigiPin(reference); } const referenceCoords = resolveCoordinates(reference, decodeOptions); return pins .map((pin) => ({ pin, coords: resolveCoordinates(pin, decodeOptions), })) .sort((a, b) => distanceFn(referenceCoords, a.coords) - distanceFn(referenceCoords, b.coords)) .map(({ pin }) => pin); } export function findNearest(reference, pins, options = {}) { if (pins.length === 0) { return undefined; } return orderByDistance(reference, pins, options)[0]; }