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.
69 lines (68 loc) • 2.55 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getDistance = getDistance;
exports.getPreciseDistance = getPreciseDistance;
exports.orderByDistance = orderByDistance;
exports.findNearest = findNearest;
const core_1 = require("./core");
const geolib_1 = require("geolib");
const util_1 = require("./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 (0, core_1.getLatLngFromDigiPin)(input, decodeOptions);
}
if (isCoordinates(input)) {
return input;
}
throw new TypeError('Unsupported pin input');
}
function getDistance(start, end, accuracy = 1, decodeOptions = {}) {
if (typeof start === 'string') {
(0, util_1.normalizeDigiPin)(start);
}
if (typeof end === 'string') {
(0, util_1.normalizeDigiPin)(end);
}
const startCoords = resolveCoordinates(start, decodeOptions);
const endCoords = resolveCoordinates(end, decodeOptions);
return (0, geolib_1.getDistance)(startCoords, endCoords, accuracy);
}
function getPreciseDistance(start, end, accuracy = 1, decodeOptions = {}) {
if (typeof start === 'string') {
(0, util_1.normalizeDigiPin)(start);
}
if (typeof end === 'string') {
(0, util_1.normalizeDigiPin)(end);
}
const startCoords = resolveCoordinates(start, decodeOptions);
const endCoords = resolveCoordinates(end, decodeOptions);
return (0, geolib_1.getPreciseDistance)(startCoords, endCoords, accuracy);
}
function orderByDistance(reference, pins, options = {}) {
const { accuracy = 1, decodeOptions = {}, distanceFn = (start, end) => (0, geolib_1.getDistance)(start, end, accuracy), } = options;
if (typeof reference === 'string') {
(0, util_1.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);
}
function findNearest(reference, pins, options = {}) {
if (pins.length === 0) {
return undefined;
}
return orderByDistance(reference, pins, options)[0];
}