@goparrot/geocoder
Version:
TypeScript GeoCoder, node geocoding library, supports google maps, mapquest, here, open street map, tom tom
70 lines • 3.49 kB
JavaScript
import { InvalidCredentialsException, UnsupportedAccuracyException } from '../../../../exception';
import { AccuracyEnum } from '../../../../model';
import { sliceFrom } from '../../../../util';
import { MapQuestLocationTransformer } from '../../transformer';
export var MapQuestLocationQualityEnum;
(function (MapQuestLocationQualityEnum) {
MapQuestLocationQualityEnum["COUNTRY"] = "COUNTRY";
MapQuestLocationQualityEnum["ZIP"] = "ZIP";
MapQuestLocationQualityEnum["ZIP_EXTENDED"] = "ZIP_EXTENDED";
MapQuestLocationQualityEnum["STATE"] = "STATE";
MapQuestLocationQualityEnum["COUNTY"] = "COUNTY";
MapQuestLocationQualityEnum["CITY"] = "CITY";
MapQuestLocationQualityEnum["NEIGHBORHOOD"] = "NEIGHBORHOOD";
MapQuestLocationQualityEnum["STREET"] = "STREET";
MapQuestLocationQualityEnum["ADDRESS"] = "ADDRESS";
MapQuestLocationQualityEnum["POINT"] = "POINT";
})(MapQuestLocationQualityEnum || (MapQuestLocationQualityEnum = {}));
export function MapQuestCommonCommandMixin(Base) {
class MapQuestCommonCommand extends Base {
constructor(...args) {
const [httpClient, apiKey] = args;
super(httpClient);
this.apiKey = apiKey;
if (!this.apiKey) {
throw new InvalidCredentialsException('Invalid or missing api key.');
}
}
async validateResponse(_response) {
//
}
static getMaxAccuracy() {
return AccuracyEnum.STREET_NAME;
}
async parseResponse(response, query) {
if (!Array.isArray(response.data.results) || !response.data.results.length) {
return [];
}
const locations = response.data.results[0].locations.filter((raw) => this.accuracyFilter(raw, query.accuracy));
if (!Array.isArray(locations) || !locations.length) {
return [];
}
return Promise.all(locations.map(async (raw) => new MapQuestLocationTransformer(raw)));
}
accuracyFilter(raw, accuracy) {
if (!accuracy) {
return true;
}
switch (accuracy) {
// should never happen, as there is validation before
// case AccuracyEnum.HOUSE_NUMBER:
// return this.isQualityAppropriate(MapQuestLocationQualityEnum.POINT, location.geocodeQuality);
case AccuracyEnum.STREET_NAME:
return this.isQualityAppropriate(MapQuestLocationQualityEnum.STREET, raw.geocodeQuality);
case AccuracyEnum.CITY:
return this.isQualityAppropriate(MapQuestLocationQualityEnum.CITY, raw.geocodeQuality);
case AccuracyEnum.STATE:
return this.isQualityAppropriate(MapQuestLocationQualityEnum.STATE, raw.geocodeQuality);
case AccuracyEnum.COUNTRY:
return this.isQualityAppropriate(MapQuestLocationQualityEnum.COUNTRY, raw.geocodeQuality);
}
// should never happen, as there is validation before
throw new UnsupportedAccuracyException(`Unsupported "${accuracy}" accuracy.`);
}
isQualityAppropriate(sliceToQuality, locationQuality) {
return sliceFrom(Object.values(MapQuestLocationQualityEnum), sliceToQuality).includes(locationQuality);
}
}
return MapQuestCommonCommand;
}
//# sourceMappingURL=map-quest-common-command.mixin.js.map