diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cc6a957..188369a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,7 +16,7 @@ jobs: strategy: matrix: - node-version: [18.x] + node-version: [20.x, 22.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ steps: diff --git a/README.md b/README.md index f94301b..f7b7008 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,6 @@ Features: | [OsmGeocoder](https://nominatim.org/release-docs/develop/) | ✅ | ✅ | ❌ | Searches nominatim.org | | [PeliasGeocoder](https://github.com/pelias/documentation/blob/master/README.md) | ✅ | ✅ | ❌ | Local or [Geocode.earth](https://geocode.earth/docs) | | [PickpointGeocoder](https://pickpoint.io/api-reference) | ✅ | ✅ | ❌ | Search Results based on OSM | -| [TeleportGeocoder](https://developers.teleport.org/api/resources/) | ✅ | ✅ | ❌ | Searches only by city names, no addresses | | [TomTomGeocoder](https://developer.tomtom.com/) | ✅ | ✅ | ❌ | | | [YandexGeocoder](https://yandex.com/dev/maps/geocoder/) | ✅ | ✅ | ❌ | | @@ -52,7 +51,7 @@ Features: import { fetchAdapter, OsmGeocoder } from '@spurreiter/geocoder' const adapter = fetchAdapter() -const geocoder = new OsmGeocoder(adapter, { language: 'en', limit: 5 }) +const geocoder = new OsmGeocoder(adapter, { language: 'en', limit: 5, referer: 'https://mysite' }) const results = await geocoder.forward('135 pilkington avenue, birmingham') // [ @@ -119,7 +118,7 @@ import { Cascade, fetchAdapter, HereGeocoder, OsmGeocoder } from '@spurreiter/ge const language = "es" const geocoders = [ new HereGeocoder(adapter, { apiKey: 'your-api-key', language }), - new OsmGeocoder(adapter, { language }) + new OsmGeocoder(adapter, { language, referer: 'https://mysite' }) ] const cascade = new Cascade(geocoders) @@ -139,7 +138,7 @@ import { Combine, fetchAdapter, HereGeocoder, OsmGeocoder } from '@spurreiter/ge const geocoders = [ new HereGeocoder(adapter, { apiKey: 'your-api-key' }), - new OsmGeocoder(adapter) + new OsmGeocoder(adapter, { referer: 'https://mysite' }) ] const combine = new Combine(geocoders) diff --git a/package.json b/package.json index 8622a9d..eb57044 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@spurreiter/geocoder", - "version": "1.5.5", + "version": "2.0.0-0", "description": "Node geocoding library, google maps, bing maps, mapquest, mapbox, here maps, arcgis, nominatim, ...", "keywords": [ "geocoder", @@ -17,7 +17,6 @@ "osm", "pelias", "pickpoint-api", - "teleport", "yandex-api" ], "homepage": "https://github.com/spurreiter/geocoder#readme", @@ -50,9 +49,9 @@ "all": "npm-run-all clean test build lint types", "clean": "rimraf types coverage lib", "lint": "eslint --fix --ext js .", - "build": "rollup -c", + "build": "./scripts/version.cjs && rollup -c", "test": "c8 mocha", - "types": "rimraf types; tsc --emitDeclarationOnly true --noEmitOnError && cp src/*.d.ts types" + "types": "rimraf types; tsc && cp src/*.d.ts types" }, "mocha": { "exit": true, @@ -61,25 +60,25 @@ }, "dependencies": { "agentkeepalive": "^4.5.0", - "got": "^13.0.0", - "i18n-iso-countries": "^7.7.0" + "got": "^14.4.1", + "i18n-iso-countries": "^7.11.2" }, "devDependencies": { - "@types/node": "^20.8.7", - "c8": "^8.0.1", - "dotenv": "^16.3.1", - "eslint": "^8.52.0", + "@types/node": "^20.14.10", + "c8": "^9.1.0", + "dotenv": "^16.4.5", + "eslint": "^8.57.0", "eslint-config-standard": "^17.1.0", - "eslint-plugin-import": "^2.28.1", - "eslint-plugin-n": "^16.2.0", - "eslint-plugin-promise": "^6.1.1", - "mocha": "^10.2.0", - "npm-run-all2": "^6.1.1", - "rimraf": "^5.0.5", - "rollup": "^4.1.4", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-n": "^16.6.2", + "eslint-plugin-promise": "^6.4.0", + "mocha": "^10.6.0", + "npm-run-all2": "^6.2.2", + "rimraf": "^5.0.9", + "rollup": "^4.18.1", "serialize-to-module": "^1.1.0", - "sinon": "^17.0.0", - "typescript": "^5.2.2" + "sinon": "^17.0.2", + "typescript": "^5.5.3" }, "engines": { "node": ">=14" diff --git a/scripts/version.cjs b/scripts/version.cjs new file mode 100755 index 0000000..6557711 --- /dev/null +++ b/scripts/version.cjs @@ -0,0 +1,13 @@ +#!/usr/bin/env node + +const fs = require('node:fs') +const path = require('node:path') +const { version } = require('../package.json') + +const content = `export const version = '${version}'\n` + +fs.writeFileSync( + path.resolve(__dirname, '..', 'src/version.js'), + content, + 'utf-8' +) diff --git a/src/adapter.js b/src/adapter.js index f7bdf1b..90a2673 100644 --- a/src/adapter.js +++ b/src/adapter.js @@ -1,8 +1,8 @@ // @ts-expect-error import got from 'got' -// @ts-expect-error import HttpAgent from 'agentkeepalive' import { isNumber } from './utils/index.js' +import { version } from './version.js' const { HttpsAgent } = HttpAgent /** @typedef {import('./types').AdapterOptions} AdapterOptions */ @@ -35,7 +35,7 @@ export function fetchAdapter (opts) { } if (!globalOpts.headers[USER_AGENT]) { - globalOpts.headers[USER_AGENT] = 'Mozilla/5.0 (X11; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0' + globalOpts.headers[USER_AGENT] = `geocoder/${version}` } return (url, options = {}) => { diff --git a/src/geocoder/index.js b/src/geocoder/index.js index 708d608..e27885b 100644 --- a/src/geocoder/index.js +++ b/src/geocoder/index.js @@ -16,6 +16,5 @@ export * from './openmapquest.js' export * from './osm.js' export * from './pelias.js' export * from './pickpoint.js' -export * from './teleport.js' export * from './tomtom.js' export * from './yandex.js' diff --git a/src/geocoder/mapquest.js b/src/geocoder/mapquest.js index e00eb17..944a118 100644 --- a/src/geocoder/mapquest.js +++ b/src/geocoder/mapquest.js @@ -41,7 +41,7 @@ export class MapQuestGeocoder extends AbstractGeocoder { // @ts-ignore super(adapter, options) - const { apiKey, licensed, limit: maxResults, ...params } = options + const { apiKey, licensed = true, limit: maxResults, ...params } = options if (!apiKey) { throw new Error(`You must specify apiKey to use ${this.constructor.name}`) diff --git a/src/geocoder/openmapquest.js b/src/geocoder/openmapquest.js index dd977fd..be98a55 100644 --- a/src/geocoder/openmapquest.js +++ b/src/geocoder/openmapquest.js @@ -37,7 +37,7 @@ export class OpenMapQuestGeocoder extends OsmGeocoder { * @param {string} [options.language] */ constructor (adapter, options = { apiKey: '' }) { - super(adapter, options) + super(adapter, { ...options, needsReferer: false }) const { apiKey, ...params } = options diff --git a/src/geocoder/osm.js b/src/geocoder/osm.js index e982bd3..1fed661 100644 --- a/src/geocoder/osm.js +++ b/src/geocoder/osm.js @@ -14,11 +14,14 @@ function mapParams (params) { } function hasResult (result) { - return (Array.isArray(result) && result.length && result[0].osm_type) || (result && result.osm_type) + return ( + (Array.isArray(result) && result.length && result[0].osm_type) || + (result && result.osm_type) + ) } function mapToNumber (arr) { - return Array.isArray(arr) ? arr.map(n => +n) : undefined + return Array.isArray(arr) ? arr.map((n) => +n) : undefined } function toBbox (boundingbox) { @@ -61,6 +64,7 @@ export class OsmGeocoder extends AbstractGeocoder { * @see https://nominatim.org/release-docs/develop/api/Search/ * @param {fetchAdapterFn} adapter * @param {object} options + * @param {string} [options.referer] referer header * @param {number} [options.limit=10] * @param {string} [options.language] * @param {number} [options.addressdetails] @@ -70,8 +74,9 @@ export class OsmGeocoder extends AbstractGeocoder { * @param {number} [options.dedupe] * @param {string} [options.endpoint] custom endpoint * @param {string} [options.revEndpoint] custom reverse endpoint + * @param {boolean} [options.needsReferer] */ - constructor (adapter, options = {}) { + constructor (adapter, options) { // @ts-ignore super(adapter, options) @@ -80,11 +85,21 @@ export class OsmGeocoder extends AbstractGeocoder { revEndpoint = 'https://nominatim.openstreetmap.org/reverse', // @ts-ignore apiKey, + referer, + needsReferer = true, ...params - } = options + } = options || {} + + if (needsReferer && !referer) { + throw new Error( + 'Nominatim Usage Policy requires Referer header; ' + + 'https://operations.osmfoundation.org/policies/nominatim/' + ) + } this.endpoint = endpoint this.revEndpoint = revEndpoint + this.fetchopts = referer ? { headers: { referer } } : undefined this.params = { ...params, @@ -108,7 +123,7 @@ export class OsmGeocoder extends AbstractGeocoder { params = mapParams(params) const url = this.createUrl(this.endpoint, params) - const res = await this.adapter(url) + const res = await this.adapter(url, this.fetchopts) if (res.status !== 200) { throw HttpError(res) } @@ -130,7 +145,7 @@ export class OsmGeocoder extends AbstractGeocoder { const url = this.createUrl(this.revEndpoint, params) - const res = await this.adapter(url) + const res = await this.adapter(url, this.fetchopts) if (res.status !== 200) { throw HttpError(res) } diff --git a/src/geocoder/pickpoint.js b/src/geocoder/pickpoint.js index 6b15edb..db7b125 100644 --- a/src/geocoder/pickpoint.js +++ b/src/geocoder/pickpoint.js @@ -36,13 +36,12 @@ export class PickpointGeocoder extends OsmGeocoder { * @param {number} [options.limit=10] * @param {string} [options.language] */ - constructor (adapter, options = { apiKey: '' }) { - super(adapter, options) - - const { apiKey, ...params } = options + constructor (adapter, options) { + super(adapter, { ...options, needsReferer: false }) + const { apiKey, ...params } = options || {} if (!apiKey) { - throw new Error(`You must specify apiKey to use ${this.constructor.name}`) + throw new Error('You must specify apiKey to use PickpointGeocoder') } this.endpoint = 'https://api.pickpoint.io/v1/forward' diff --git a/src/geocoder/teleport.js b/src/geocoder/teleport.js deleted file mode 100644 index e0bcffe..0000000 --- a/src/geocoder/teleport.js +++ /dev/null @@ -1,157 +0,0 @@ -/** - * @credits https://github.com/nchaulet/node-geocoder/blob/master/lib/geocoder/teleportgeocoder.js - * @license MIT - */ - -import { AbstractGeocoder } from './abstract.js' -import { HttpError, toFixed } from '../utils/index.js' - -/** @typedef {import('../adapter.js').fetchAdapterFn} fetchAdapterFn */ - -function getEmbeddedPath (parent, path, def) { - const elements = path.split('/') - for (const i in elements) { - const element = elements[i] - const embedded = parent._embedded - if (!embedded) { - return undefined - } - const child = embedded[element] - if (!child) { - return undefined - } - parent = child - } - return parent -} - -/** - * @typedef {object} TeleportForwardQuery - * @property {string} address - */ - -/** - * @typedef {object} TeleportReverseQuery - * @property {number} lat latitude - * @property {number} lng longitude - */ - -/** - * with Teleport geocoder only cities can by found but no addresses - */ -export class TeleportGeocoder extends AbstractGeocoder { - /** - * available options - * @see https://developers.teleport.org/api/resources/ - * @param {fetchAdapterFn} adapter - * @param {object} options - */ - constructor (adapter, options = {}) { - super(adapter, options) - this.params = options - } - - get endpoint () { - return 'https://api.teleport.org/api/cities' - } - - get revEndpoint () { - return 'https://api.teleport.org/api/locations' - } - - /** - * @param {string|TeleportForwardQuery} query - * @returns {Promise} - */ - async _forward (query) { - let params = { - ...this.params, - search: query, - embed: 'city:search-results/city:item/{city:country,city:admin1_division,city:urban_area}' - } - - if (typeof query !== 'string' && query.address) { - const { address, ...other } = query - params = { ...params, ...other, search: address } - } - - const url = this.createUrl(this.endpoint, params) - - const res = await this.adapter(url) - if (res.status !== 200) { - throw HttpError(res) - } - const result = await res.json() - const searchResults = getEmbeddedPath(result, 'city:search-results') - - if (!searchResults) { - return this.wrapRaw([], result) - } - const results = searchResults.map(this._formatResult.bind(this, 'city:item')) - // console.dir({ body: result }, { depth: null }) - return this.wrapRaw(results, result) - } - - /** - * @param {TeleportReverseQuery} query - * @returns {Promise} - */ - async _reverse (query) { - const { lat, lng, ...other } = query - const params = { - ...this.params, - ...other, - embed: 'location:nearest-cities/location:nearest-city/{city:country,city:admin1_division,city:urban_area}' - } - - const url = this.createUrl( - `${this.revEndpoint}/${lat},${lng}`, - params - ) - - const res = await this.adapter(url) - if (res.status !== 200) { - throw HttpError(res) - } - const result = await res.json() - const searchResults = getEmbeddedPath(result, 'location:nearest-cities') - - if (!searchResults) { - return this.wrapRaw([], result) - } - const results = searchResults.map(this._formatResult.bind(this, 'location:nearest-city')) - // console.dir({ body: result, expResults: results }, { depth: null }) - return this.wrapRaw(results, result) - } - - _formatResult (cityRelationName, result) { - const city = getEmbeddedPath(result, cityRelationName) - const admin1 = getEmbeddedPath(city, 'city:admin1_division') || {} - const country = getEmbeddedPath(city, 'city:country') || {} - const urbanArea = getEmbeddedPath(city, 'city:urban_area') || {} - const urbanAreaLinks = urbanArea._links || {} - const extra = { - urbanArea: urbanArea.name, - urbanAreaApiUrl: (urbanAreaLinks.self || {}).href, - urbanAreaWebUrl: urbanArea.teleport_city_url - } - if (result.distance_km) { - extra.distanceKm = result.distance_km - extra.confidence = toFixed(Math.max(0, 25 - result.distance_km) / 25 * 10) - } - if (result.matching_full_name) { - extra.matchingFullName = result.matching_full_name - } - - return { - latitude: city.location.latlon.latitude, - longitude: city.location.latlon.longitude, - city: city.name, - country: country.name, - countryCode: country.iso_alpha2, - state: admin1.name, - stateCode: admin1.geonames_admin1_code, - extra - } - } -} diff --git a/src/utils/isocode.js b/src/utils/isocode.js index 491b89a..7f10859 100644 --- a/src/utils/isocode.js +++ b/src/utils/isocode.js @@ -4,7 +4,7 @@ import countries from 'i18n-iso-countries' /** * convert alpha3 to alpha2 country code * @param {string} code - * @returns {string} + * @returns {string|undefined} */ export const countryCode = (code) => (code && code.length === 3) ? countries.alpha3ToAlpha2(code) diff --git a/src/version.js b/src/version.js new file mode 100644 index 0000000..b27b7d3 --- /dev/null +++ b/src/version.js @@ -0,0 +1 @@ +export const version = '1.5.5' diff --git a/test/geocoder/fixtures/bingmaps.js b/test/geocoder/fixtures/bingmaps.js index 18a9aa4..e5487b2 100644 --- a/test/geocoder/fixtures/bingmaps.js +++ b/test/geocoder/fixtures/bingmaps.js @@ -126,19 +126,19 @@ const m = { }] }, forward: { - formattedAddress: '1 Port des Champs-Élysées, 75008 Paris, France', - latitude: 48.8642334, - longitude: 2.3153574, + formattedAddress: '1 Avenue des Champs-Élysées, 75008 Paris, France', + latitude: 48.8666195, + longitude: 2.3170832, country: 'France', countryCode: 'FR', state: 'Île-de-France', - region: 'Paris', + region: 'Ville de Paris', city: 'Paris', zipcode: '75008', - streetName: '1 Port des Champs-Élysées', + streetName: '1 Avenue des Champs-Élysées', extra: { confidence: 1, - bbox: [2.307528977635416, 48.86037068242933, 2.3231858223645836, 48.86809611757068] + bbox: [2.3092544044119108, 48.86275678242932, 2.324911995588089, 48.870482217570675] } }, reverse: { diff --git a/test/geocoder/fixtures/google.js b/test/geocoder/fixtures/google.js index 0b33077..381f7ba 100644 --- a/test/geocoder/fixtures/google.js +++ b/test/geocoder/fixtures/google.js @@ -1053,8 +1053,8 @@ const m = { }, forward: { formattedAddress: '1 Av. des Champs-Élysées, 75008 Paris, France', - latitude: 48.8694849, - longitude: 2.3094449, + latitude: 48.8694746, + longitude: 2.3094593, country: 'France', countryCode: 'FR', state: 'Île-de-France', diff --git a/test/geocoder/fixtures/ipstack.js b/test/geocoder/fixtures/ipstack.js index b183932..163d8fe 100644 --- a/test/geocoder/fixtures/ipstack.js +++ b/test/geocoder/fixtures/ipstack.js @@ -119,7 +119,7 @@ const m = { country: 'United States', regionCode: 'CA', regionName: 'California', - city: 'Hemet', + city: 'Menifee', zipcode: '92543' } } diff --git a/test/geocoder/fixtures/locationiq.js b/test/geocoder/fixtures/locationiq.js index 9433f2f..079f74e 100644 --- a/test/geocoder/fixtures/locationiq.js +++ b/test/geocoder/fixtures/locationiq.js @@ -93,28 +93,28 @@ const m = { }] }, forward: { - formattedAddress: "1, Rue Des Champs, Ézanville, Écouen, Val-d'Oise, 95460, France", - latitude: '49.032287', - longitude: '2.367155', + formattedAddress: 'Métro 1, Promenade des Champs-Élysées, Quartier des Champs-Élysées, 8th Arrondissement of Paris, Paris, Ile-de-France, Metropolitan France, 75008, France', + latitude: '48.8676736', + longitude: '2.3136172', country: 'France', countryCode: 'FR', - state: "Val-d'Oise", - region: undefined, - county: 'Écouen', - city: 'Ézanville', - zipcode: '95460', - streetName: 'Rue Des Champs', - streetNumber: '1', + state: 'Ile-de-France', + region: 'Metropolitan France', + county: undefined, + city: 'Paris', + zipcode: '75008', + streetName: 'Promenade des Champs-Élysées', + streetNumber: undefined, extra: { - id: '333255683840', - confidence: 0.25, - type: undefined, - addrType: undefined, - bbox: ['2.367155', '49.032287', '2.367155', '49.032287'] + id: '238037360', + confidence: 0.41, + type: 'subway', + addrType: 'railway', + bbox: ['2.3097952', '48.8672731', '2.3148457', '48.869063'] } }, reverse: { - formattedAddress: '277, Bedford Avenue, Williamsburg, New York, Kings County, New York, 11211, USA', + formattedAddress: '277, Bedford Avenue, Williamsburg, Brooklyn, New York, Kings County, New York, 11211, USA', latitude: '40.714255', longitude: '-73.961302', country: 'United States of America', @@ -127,7 +127,7 @@ const m = { streetName: 'Bedford Avenue', streetNumber: '277', extra: { - id: '331566812314', + id: '332391496564', confidence: 0.225, type: undefined, addrType: undefined, diff --git a/test/geocoder/fixtures/mapbox.js b/test/geocoder/fixtures/mapbox.js index ac751f5..b734cba 100644 --- a/test/geocoder/fixtures/mapbox.js +++ b/test/geocoder/fixtures/mapbox.js @@ -892,7 +892,7 @@ const m = { streetNumber: '1', neighbourhood: 'Plateau', extra: { - id: 'address.3903175983506984', + id: 'address.4094307396599160', category: undefined, bbox: undefined } @@ -911,7 +911,7 @@ const m = { streetNumber: '277', neighbourhood: 'Williamsburg', extra: { - id: 'address.7620263091570834', + id: 'address.1326994189738106', category: undefined, bbox: undefined } diff --git a/test/geocoder/fixtures/mapquest.js b/test/geocoder/fixtures/mapquest.js index 428a003..d41e9a3 100644 --- a/test/geocoder/fixtures/mapquest.js +++ b/test/geocoder/fixtures/mapquest.js @@ -143,37 +143,37 @@ const m = { }] }, forward: { - formattedAddress: 'US', - latitude: 39.78373, - longitude: -100.445882, - country: 'United States of America', - countryCode: 'US', - state: undefined, - county: undefined, - city: undefined, - zipcode: undefined, - streetName: undefined, - neighbourhood: undefined, + formattedAddress: '1 Port des Champs-Élysées, Paris, IDF 75008, FR', + latitude: 48.86434, + longitude: 2.31432, + country: 'France', + countryCode: 'FR', + state: 'IDF', + county: 'Paris', + city: 'Paris', + zipcode: '75008', + streetName: '1 Port des Champs-Élysées', + neighbourhood: '8th Arrondissement', extra: { id: '0', - sideOfStreet: 'N' + sideOfStreet: 'L' } }, reverse: { - formattedAddress: '279 Bedford Avenue, New York City, NY 11211, US', - latitude: 40.714205, - longitude: -73.961315, + formattedAddress: '277 Bedford Ave, Brooklyn, NY 11211-4203, US', + latitude: 40.71431, + longitude: -73.96142, country: 'United States of America', countryCode: 'US', state: 'NY', - county: undefined, - city: 'New York City', - zipcode: '11211', - streetName: '279 Bedford Avenue', - neighbourhood: undefined, + county: 'Kings', + city: 'Brooklyn', + zipcode: '11211-4203', + streetName: '277 Bedford Ave', + neighbourhood: 'Williamsburg', extra: { id: '0', - sideOfStreet: 'N' + sideOfStreet: 'R' } } } diff --git a/test/geocoder/fixtures/opencage.js b/test/geocoder/fixtures/opencage.js index 008ab0f..031ec28 100644 --- a/test/geocoder/fixtures/opencage.js +++ b/test/geocoder/fixtures/opencage.js @@ -540,20 +540,20 @@ const m = { }] }, forward: { - formattedAddress: 'Paris 08 Élysée, Paris, France', - latitude: 48.8763, - longitude: 2.3183, + formattedAddress: '1 Rond-Point des Champs-Élysées - Marcel Dassault, 75008 Paris, France', + latitude: 48.8682435, + longitude: 2.3098118, country: 'France', countryCode: 'FR', - state: 'Île-de-France', + state: 'Ile-de-France', county: 'Paris', - city: 'Paris 08 Élysée', - zipcode: undefined, - streetName: undefined, - streetNumber: undefined, + city: 'Paris', + zipcode: '75008', + streetName: 'Rond-Point des Champs-Élysées - Marcel Dassault', + streetNumber: '1', extra: { - confidence: 0.7, - confidenceKm: 5 + confidence: 1, + confidenceKm: 0.25 } }, reverse: { diff --git a/test/geocoder/fixtures/opendatafrance.js b/test/geocoder/fixtures/opendatafrance.js index 997a177..6bb9ef0 100644 --- a/test/geocoder/fixtures/opendatafrance.js +++ b/test/geocoder/fixtures/opendatafrance.js @@ -342,7 +342,7 @@ const m = { citycode: '75108', extra: { id: '75108_1733', - confidence: 0.5656 + confidence: 0.5658 }, streetName: 'Avenue des Champs Elysées' }, diff --git a/test/geocoder/fixtures/osm.js b/test/geocoder/fixtures/osm.js index 7e08e26..037dea0 100644 --- a/test/geocoder/fixtures/osm.js +++ b/test/geocoder/fixtures/osm.js @@ -98,9 +98,9 @@ const m = { }] }, forward: { - formattedAddress: 'Avenue des Champs-Élysées, Quartier du Faubourg-du-Roule, Paris 8e Arrondissement, Paris, Île-de-France, France métropolitaine, 75008, France', - latitude: 48.8732055, - longitude: 2.2968419, + formattedAddress: 'Métro 1, Avenue des Champs-Élysées, Quartier du Faubourg-du-Roule, Paris 8e Arrondissement, Paris, Île-de-France, France métropolitaine, 75008, France', + latitude: 48.8676736, + longitude: 2.3136172, country: 'France', countryCode: 'FR', state: 'Île-de-France', @@ -112,9 +112,9 @@ const m = { streetNumber: undefined, neighbourhood: undefined, extra: { - id: 642898830, - confidence: 0.1, - bbox: [2.296504, 48.8731289, 2.297083, 48.8733134] + id: 531017871, + confidence: 0.0001, + bbox: [2.3097952, 48.8672731, 2.3148457, 48.869063] } }, reverse: { diff --git a/test/geocoder/fixtures/yandex.js b/test/geocoder/fixtures/yandex.js index 6e6a345..3e8f9f8 100644 --- a/test/geocoder/fixtures/yandex.js +++ b/test/geocoder/fixtures/yandex.js @@ -1257,9 +1257,9 @@ const m = { } }, reverse: { - formattedAddress: 'Соединённые Штаты Америки, штат Нью-Йорк, район Бруклин, авеню Бедфорд', - latitude: 40.653586, - longitude: -73.956114, + formattedAddress: 'Соединённые Штаты Америки, штат Нью-Йорк, боро Бруклин, авеню Бедфорд', + latitude: 40.653641, + longitude: -73.956123, country: 'Соединённые Штаты Америки', countryCode: 'US', state: 'штат Нью-Йорк', diff --git a/test/geocoder/mapquest.spec.js b/test/geocoder/mapquest.spec.js index 98c0ca6..88a3372 100644 --- a/test/geocoder/mapquest.spec.js +++ b/test/geocoder/mapquest.spec.js @@ -60,7 +60,7 @@ describe('MapQuestGeocoder', function () { assert.deepStrictEqual(results, []) - sinon.assert.calledOnceWithExactly(mockedAdapter, 'http://open.mapquestapi.com/geocoding/v1/address?key=apiKey&location=1+champs+%C3%A9lys%C3%A9e+Paris') + sinon.assert.calledOnceWithExactly(mockedAdapter, 'http://www.mapquestapi.com/geocoding/v1/address?key=apiKey&location=1+champs+%C3%A9lys%C3%A9e+Paris') }) it('should throw on error', async function () { @@ -84,7 +84,7 @@ describe('MapQuestGeocoder', function () { const query = '135 pilkington avenue, birmingham' const { body, expResults } = fixtures[query] - const expUrl = 'http://open.mapquestapi.com/geocoding/v1/address?key=apiKey&location=135+pilkington+avenue%2C+birmingham' + const expUrl = 'http://www.mapquestapi.com/geocoding/v1/address?key=apiKey&location=135+pilkington+avenue%2C+birmingham' const mockedAdapter = sinon.stub().returns( Promise.resolve({ @@ -106,7 +106,7 @@ describe('MapQuestGeocoder', function () { const query = '135 pilkington avenue, birmingham' const { body, expResults } = fixtures[query] - const expUrl = 'http://open.mapquestapi.com/geocoding/v1/address?key=apiKey&location=135+pilkington+avenue%2C+birmingham' + const expUrl = 'http://www.mapquestapi.com/geocoding/v1/address?key=apiKey&location=135+pilkington+avenue%2C+birmingham' const mockedAdapter = sinon.stub().returns( Promise.resolve({ @@ -144,7 +144,7 @@ describe('MapQuestGeocoder', function () { assert.deepStrictEqual(results, []) - sinon.assert.calledOnceWithExactly(mockedAdapter, 'http://open.mapquestapi.com/geocoding/v1/reverse?key=apiKey&location=40.714232%2C-73.9612889') + sinon.assert.calledOnceWithExactly(mockedAdapter, 'http://www.mapquestapi.com/geocoding/v1/reverse?key=apiKey&location=40.714232%2C-73.9612889') }) it('should throw on error', async function () { @@ -167,7 +167,7 @@ describe('MapQuestGeocoder', function () { it('should return address', async function () { const query = '40.714232,-73.9612889' const { body, expResults } = fixtures[query] - const expUrl = 'http://open.mapquestapi.com/geocoding/v1/reverse?key=apiKey&location=40.714232%2C-73.9612889' + const expUrl = 'http://www.mapquestapi.com/geocoding/v1/reverse?key=apiKey&location=40.714232%2C-73.9612889' const mockedAdapter = sinon.stub().returns( Promise.resolve({ diff --git a/test/geocoder/opendatafrance.spec.js b/test/geocoder/opendatafrance.spec.js index f3dd575..7fc530a 100644 --- a/test/geocoder/opendatafrance.spec.js +++ b/test/geocoder/opendatafrance.spec.js @@ -2,6 +2,7 @@ import assert from 'assert' import sinon from 'sinon' import { OpendataFranceGeocoder, fetchAdapter } from '../../src/index.js' import { fixtures } from './fixtures/opendatafrance.js' +import { itWithApiKey } from './helper.js' import { updateFixture, writeFixtures } from './fixtures/support.js' describe('OpendataFranceGeocoder', function () { @@ -175,13 +176,15 @@ describe('OpendataFranceGeocoder', function () { }) describe('call api', () => { + // set apiKey to random value; required to run tests on github + const { OPENDATAFRANCE_TEST: apiKey } = process.env let geocoder before(function () { - geocoder = new OpendataFranceGeocoder(fetchAdapter(), { }) + geocoder = new OpendataFranceGeocoder(fetchAdapter(), {}) }) - it('should call forward api', async function () { + itWithApiKey(apiKey, 'should call forward api', async function () { const query = '1 champs élysée Paris' const results = await geocoder.forward(query) // eslint-disable-next-line no-console @@ -189,7 +192,7 @@ describe('OpendataFranceGeocoder', function () { assert.deepStrictEqual(results[0], fixtures.forward) }) - it('should call reverse api', async function () { + itWithApiKey(apiKey, 'should call reverse api', async function () { const query = '49.12027,6.17559' const results = await geocoder.reverse(query) // eslint-disable-next-line no-console diff --git a/test/geocoder/openmapquest.spec.js b/test/geocoder/openmapquest.spec.js index c959168..ccbdf4b 100644 --- a/test/geocoder/openmapquest.spec.js +++ b/test/geocoder/openmapquest.spec.js @@ -54,7 +54,11 @@ describe('OpenMapQuestGeocoder', function () { assert.deepStrictEqual(results, []) - sinon.assert.calledOnceWithExactly(mockedAdapter, 'http://open.mapquestapi.com/nominatim/v1/search.php?key=apiKey&format=json&addressdetails=1&q=1+champs+%C3%A9lys%C3%A9e+Paris') + sinon.assert.calledOnceWithExactly( + mockedAdapter, + 'http://open.mapquestapi.com/nominatim/v1/search.php?key=apiKey&format=json&addressdetails=1&q=1+champs+%C3%A9lys%C3%A9e+Paris', + undefined + ) }) it('should call api in different language', async function () { @@ -65,21 +69,26 @@ describe('OpenMapQuestGeocoder', function () { }) ) - const geocoder = new OpenMapQuestGeocoder(mockedAdapter, { ...options, language: 'de' }) + const geocoder = new OpenMapQuestGeocoder(mockedAdapter, { + ...options, + language: 'de' + }) const results = await geocoder.forward('1 champs élysée Paris') assert.deepStrictEqual(results, []) - sinon.assert.calledOnceWithExactly(mockedAdapter, 'http://open.mapquestapi.com/nominatim/v1/search.php?key=apiKey&format=json&addressdetails=1&q=1+champs+%C3%A9lys%C3%A9e+Paris&accept-language=de') + sinon.assert.calledOnceWithExactly( + mockedAdapter, + 'http://open.mapquestapi.com/nominatim/v1/search.php?key=apiKey&format=json&addressdetails=1&q=1+champs+%C3%A9lys%C3%A9e+Paris&accept-language=de', + undefined + ) }) it('should throw on error', async function () { - const mockedAdapter = sinon.stub().returns( - ({ - status: 502, - json: () => Promise.resolve({}) - }) - ) + const mockedAdapter = sinon.stub().returns({ + status: 502, + json: () => Promise.resolve({}) + }) const geocoder = new OpenMapQuestGeocoder(mockedAdapter, options) try { @@ -93,7 +102,8 @@ describe('OpenMapQuestGeocoder', function () { it('should return address', async function () { const query = '135 pilkington avenue, birmingham' const { body, expResults } = fixtures[query] - const expUrl = 'http://open.mapquestapi.com/nominatim/v1/search.php?key=apiKey&format=json&addressdetails=1&q=135+pilkington+avenue%2C+birmingham' + const expUrl = + 'http://open.mapquestapi.com/nominatim/v1/search.php?key=apiKey&format=json&addressdetails=1&q=135+pilkington+avenue%2C+birmingham' const mockedAdapter = sinon.stub().returns( Promise.resolve({ @@ -106,13 +116,14 @@ describe('OpenMapQuestGeocoder', function () { const results = await geocoder.forward(query) assert.deepStrictEqual(results, expResults) - sinon.assert.calledOnceWithExactly(mockedAdapter, expUrl) + sinon.assert.calledOnceWithExactly(mockedAdapter, expUrl, undefined) }) it('should return address when object', async function () { const query = '135 pilkington avenue, birmingham' const { body, expResults } = fixtures[query] - const expUrl = 'http://open.mapquestapi.com/nominatim/v1/search.php?key=apiKey&format=json&addressdetails=1&q=135+pilkington+avenue%2C+birmingham' + const expUrl = + 'http://open.mapquestapi.com/nominatim/v1/search.php?key=apiKey&format=json&addressdetails=1&q=135+pilkington+avenue%2C+birmingham' const mockedAdapter = sinon.stub().returns( Promise.resolve({ @@ -125,7 +136,7 @@ describe('OpenMapQuestGeocoder', function () { const results = await geocoder.forward({ address: query }) assert.deepStrictEqual(results, expResults) - sinon.assert.calledOnceWithExactly(mockedAdapter, expUrl) + sinon.assert.calledOnceWithExactly(mockedAdapter, expUrl, undefined) }) }) @@ -139,19 +150,24 @@ describe('OpenMapQuestGeocoder', function () { ) const geocoder = new OpenMapQuestGeocoder(mockedAdapter, options) - const results = await geocoder.reverse({ lat: 40.714232, lng: -73.9612889 }) + const results = await geocoder.reverse({ + lat: 40.714232, + lng: -73.9612889 + }) assert.deepStrictEqual(results, []) - sinon.assert.calledOnceWithExactly(mockedAdapter, 'http://open.mapquestapi.com/nominatim/v1/reverse.php?key=apiKey&format=json&addressdetails=1&lat=40.714232&lon=-73.9612889') + sinon.assert.calledOnceWithExactly( + mockedAdapter, + 'http://open.mapquestapi.com/nominatim/v1/reverse.php?key=apiKey&format=json&addressdetails=1&lat=40.714232&lon=-73.9612889', + undefined + ) }) it('should throw on error', async function () { - const mockedAdapter = sinon.stub().returns( - ({ - status: 502, - json: () => Promise.resolve({}) - }) - ) + const mockedAdapter = sinon.stub().returns({ + status: 502, + json: () => Promise.resolve({}) + }) const geocoder = new OpenMapQuestGeocoder(mockedAdapter, options) try { @@ -165,7 +181,8 @@ describe('OpenMapQuestGeocoder', function () { it('should return address', async function () { const query = '40.714232,-73.9612889' const { body, expResults } = fixtures[query] - const expUrl = 'http://open.mapquestapi.com/nominatim/v1/reverse.php?key=apiKey&format=json&addressdetails=1&lat=40.714232&lon=-73.9612889' + const expUrl = + 'http://open.mapquestapi.com/nominatim/v1/reverse.php?key=apiKey&format=json&addressdetails=1&lat=40.714232&lon=-73.9612889' const mockedAdapter = sinon.stub().returns( Promise.resolve({ @@ -178,7 +195,7 @@ describe('OpenMapQuestGeocoder', function () { const results = await geocoder.reverse(query) assert.deepStrictEqual(results, expResults) - sinon.assert.calledOnceWithExactly(mockedAdapter, expUrl) + sinon.assert.calledOnceWithExactly(mockedAdapter, expUrl, undefined) }) }) }) diff --git a/test/geocoder/osm.spec.js b/test/geocoder/osm.spec.js index 8d12289..be5f52b 100644 --- a/test/geocoder/osm.spec.js +++ b/test/geocoder/osm.spec.js @@ -2,10 +2,13 @@ import assert from 'assert' import sinon from 'sinon' import { OsmGeocoder, fetchAdapter } from '../../src/index.js' import { fixtures } from './fixtures/osm.js' +import { itWithApiKey } from './helper.js' import { updateFixture, writeFixtures } from './fixtures/support.js' +const referer = 'https://github.com/spurreiter/geocoder' + describe('OsmGeocoder', function () { - const options = {} + const options = { referer } const mockedAdapter = sinon.stub() after(() => { @@ -53,7 +56,11 @@ describe('OsmGeocoder', function () { assert.deepStrictEqual(results, []) - sinon.assert.calledOnceWithExactly(mockedAdapter, 'https://nominatim.openstreetmap.org/search?format=json&addressdetails=1&q=1+champs+%C3%A9lys%C3%A9e+Paris') + sinon.assert.calledOnceWithExactly( + mockedAdapter, + 'https://nominatim.openstreetmap.org/search?format=json&addressdetails=1&q=1+champs+%C3%A9lys%C3%A9e+Paris', + { headers: { referer } } + ) }) it('should call api in different language', async function () { @@ -69,7 +76,11 @@ describe('OsmGeocoder', function () { assert.deepStrictEqual(results, []) - sinon.assert.calledOnceWithExactly(mockedAdapter, 'https://nominatim.openstreetmap.org/search?format=json&addressdetails=1&q=1+champs+%C3%A9lys%C3%A9e+Paris&accept-language=de') + sinon.assert.calledOnceWithExactly( + mockedAdapter, + 'https://nominatim.openstreetmap.org/search?format=json&addressdetails=1&q=1+champs+%C3%A9lys%C3%A9e+Paris&accept-language=de', + { headers: { referer } } + ) }) it('should throw on error', async function () { @@ -105,7 +116,9 @@ describe('OsmGeocoder', function () { const results = await geocoder.forward(query) assert.deepStrictEqual(results, expResults) - sinon.assert.calledOnceWithExactly(mockedAdapter, expUrl) + sinon.assert.calledOnceWithExactly(mockedAdapter, expUrl, { + headers: { referer: options.referer } + }) }) it('should return address when object', async function () { @@ -124,7 +137,9 @@ describe('OsmGeocoder', function () { const results = await geocoder.forward({ address: query }) assert.deepStrictEqual(results, expResults) - sinon.assert.calledOnceWithExactly(mockedAdapter, expUrl) + sinon.assert.calledOnceWithExactly(mockedAdapter, expUrl, { + headers: { referer: options.referer } + }) }) }) @@ -141,7 +156,11 @@ describe('OsmGeocoder', function () { const results = await geocoder.reverse({ lat: 40.714232, lng: -73.9612889 }) assert.deepStrictEqual(results, []) - sinon.assert.calledOnceWithExactly(mockedAdapter, 'https://nominatim.openstreetmap.org/reverse?format=json&addressdetails=1&lat=40.714232&lon=-73.9612889') + sinon.assert.calledOnceWithExactly( + mockedAdapter, + 'https://nominatim.openstreetmap.org/reverse?format=json&addressdetails=1&lat=40.714232&lon=-73.9612889', + { headers: { referer } } + ) }) it('should throw on error', async function () { @@ -176,18 +195,22 @@ describe('OsmGeocoder', function () { const results = await geocoder.reverse(query) assert.deepStrictEqual(results, expResults) - sinon.assert.calledOnceWithExactly(mockedAdapter, expUrl) + sinon.assert.calledOnceWithExactly(mockedAdapter, expUrl, { + headers: { referer: options.referer } + }) }) }) describe('call api', () => { + // set apiKey to random value; required to run tests on github + const { OSM_TEST: apiKey } = process.env let geocoder before(function () { - geocoder = new OsmGeocoder(fetchAdapter(), { }) + geocoder = new OsmGeocoder(fetchAdapter(), { referer }) }) - it('should call forward api', async function () { + itWithApiKey(apiKey, 'should call forward api', async function () { const query = 'Paris Avenue des Champs Elysees 1' const results = await geocoder.forward(query) // eslint-disable-next-line no-console @@ -195,7 +218,7 @@ describe('OsmGeocoder', function () { assert.deepStrictEqual(results[0], fixtures.forward) }) - it('should call reverse api', async function () { + itWithApiKey(apiKey, 'should call reverse api', async function () { const query = '40.714232,-73.9612889' const results = await geocoder.reverse(query) // eslint-disable-next-line no-console diff --git a/test/geocoder/pickpoint.spec.js b/test/geocoder/pickpoint.spec.js index 3d0fff8..79aad62 100644 --- a/test/geocoder/pickpoint.spec.js +++ b/test/geocoder/pickpoint.spec.js @@ -22,7 +22,7 @@ describe('PickpointGeocoder', function () { it('needs an apiKey', () => { assert.throws(() => { - new PickpointGeocoder(mockedAdapter) + new PickpointGeocoder(mockedAdapter, { referer: 'http://localhost' }) }, /You must specify apiKey to use PickpointGeocoder/) }) @@ -60,7 +60,11 @@ describe('PickpointGeocoder', function () { assert.deepStrictEqual(results, []) - sinon.assert.calledOnceWithExactly(mockedAdapter, 'https://api.pickpoint.io/v1/forward?key=apiKey&format=json&addressdetails=1&q=1+champs+%C3%A9lys%C3%A9e+Paris') + sinon.assert.calledOnceWithExactly( + mockedAdapter, + 'https://api.pickpoint.io/v1/forward?key=apiKey&format=json&addressdetails=1&q=1+champs+%C3%A9lys%C3%A9e+Paris', + undefined + ) }) it('should call api in different language', async function () { @@ -71,21 +75,26 @@ describe('PickpointGeocoder', function () { }) ) - const geocoder = new PickpointGeocoder(mockedAdapter, { ...options, language: 'de' }) + const geocoder = new PickpointGeocoder(mockedAdapter, { + ...options, + language: 'de' + }) const results = await geocoder.forward('1 champs élysée Paris') assert.deepStrictEqual(results, []) - sinon.assert.calledOnceWithExactly(mockedAdapter, 'https://api.pickpoint.io/v1/forward?key=apiKey&format=json&addressdetails=1&q=1+champs+%C3%A9lys%C3%A9e+Paris&accept-language=de') + sinon.assert.calledOnceWithExactly( + mockedAdapter, + 'https://api.pickpoint.io/v1/forward?key=apiKey&format=json&addressdetails=1&q=1+champs+%C3%A9lys%C3%A9e+Paris&accept-language=de', + undefined + ) }) it('should throw on error', async function () { - const mockedAdapter = sinon.stub().returns( - ({ - status: 502, - json: () => Promise.resolve({}) - }) - ) + const mockedAdapter = sinon.stub().returns({ + status: 502, + json: () => Promise.resolve({}) + }) const geocoder = new PickpointGeocoder(mockedAdapter, options) try { @@ -99,7 +108,8 @@ describe('PickpointGeocoder', function () { it('should return address', async function () { const query = '135 pilkington avenue, birmingham' const { body, expResults } = fixtures[query] - const expUrl = 'https://api.pickpoint.io/v1/forward?key=apiKey&format=json&addressdetails=1&q=135+pilkington+avenue%2C+birmingham' + const expUrl = + 'https://api.pickpoint.io/v1/forward?key=apiKey&format=json&addressdetails=1&q=135+pilkington+avenue%2C+birmingham' const mockedAdapter = sinon.stub().returns( Promise.resolve({ @@ -112,13 +122,14 @@ describe('PickpointGeocoder', function () { const results = await geocoder.forward(query) assert.deepStrictEqual(results, expResults) - sinon.assert.calledOnceWithExactly(mockedAdapter, expUrl) + sinon.assert.calledOnceWithExactly(mockedAdapter, expUrl, undefined) }) it('should return address when object', async function () { const query = '135 pilkington avenue, birmingham' const { body, expResults } = fixtures[query] - const expUrl = 'https://api.pickpoint.io/v1/forward?key=apiKey&format=json&addressdetails=1&q=135+pilkington+avenue%2C+birmingham' + const expUrl = + 'https://api.pickpoint.io/v1/forward?key=apiKey&format=json&addressdetails=1&q=135+pilkington+avenue%2C+birmingham' const mockedAdapter = sinon.stub().returns( Promise.resolve({ @@ -131,7 +142,7 @@ describe('PickpointGeocoder', function () { const results = await geocoder.forward({ address: query }) assert.deepStrictEqual(results, expResults) - sinon.assert.calledOnceWithExactly(mockedAdapter, expUrl) + sinon.assert.calledOnceWithExactly(mockedAdapter, expUrl, undefined) }) }) @@ -145,19 +156,24 @@ describe('PickpointGeocoder', function () { ) const geocoder = new PickpointGeocoder(mockedAdapter, options) - const results = await geocoder.reverse({ lat: 40.714232, lng: -73.9612889 }) + const results = await geocoder.reverse({ + lat: 40.714232, + lng: -73.9612889 + }) assert.deepStrictEqual(results, []) - sinon.assert.calledOnceWithExactly(mockedAdapter, 'https://api.pickpoint.io/v1/reverse?key=apiKey&format=json&addressdetails=1&lat=40.714232&lon=-73.9612889') + sinon.assert.calledOnceWithExactly( + mockedAdapter, + 'https://api.pickpoint.io/v1/reverse?key=apiKey&format=json&addressdetails=1&lat=40.714232&lon=-73.9612889', + undefined + ) }) it('should throw on error', async function () { - const mockedAdapter = sinon.stub().returns( - ({ - status: 502, - json: () => Promise.resolve({}) - }) - ) + const mockedAdapter = sinon.stub().returns({ + status: 502, + json: () => Promise.resolve({}) + }) const geocoder = new PickpointGeocoder(mockedAdapter, options) try { @@ -171,7 +187,8 @@ describe('PickpointGeocoder', function () { it('should return address', async function () { const query = '40.714232,-73.9612889' const { body, expResults } = fixtures[query] - const expUrl = 'https://api.pickpoint.io/v1/reverse?key=apiKey&format=json&addressdetails=1&lat=40.714232&lon=-73.9612889' + const expUrl = + 'https://api.pickpoint.io/v1/reverse?key=apiKey&format=json&addressdetails=1&lat=40.714232&lon=-73.9612889' const mockedAdapter = sinon.stub().returns( Promise.resolve({ @@ -184,7 +201,7 @@ describe('PickpointGeocoder', function () { const results = await geocoder.reverse(query) assert.deepStrictEqual(results, expResults) - sinon.assert.calledOnceWithExactly(mockedAdapter, expUrl) + sinon.assert.calledOnceWithExactly(mockedAdapter, expUrl, undefined) }) }) diff --git a/test/geocoder/teleport.spec.js b/test/geocoder/teleport.spec.js deleted file mode 100644 index cf8a523..0000000 --- a/test/geocoder/teleport.spec.js +++ /dev/null @@ -1,192 +0,0 @@ -import assert from 'assert' -import sinon from 'sinon' -import { TeleportGeocoder, fetchAdapter } from '../../src/index.js' -import { fixtures } from './fixtures/teleport.js' -import { updateFixture, writeFixtures } from './fixtures/support.js' - -describe('TeleportGeocoder', function () { - const options = { apiKey: 'apiKey' } - const mockedAdapter = sinon.stub() - - after(() => { - writeFixtures('teleport.js', fixtures) - }) - - describe('constructor', () => { - it('an adapter must be set', () => { - assert.throws(() => { - new TeleportGeocoder() - }, /TeleportGeocoder needs an adapter/) - }) - - it('is an instance of TeleportGeocoder', () => { - const geocoder = new TeleportGeocoder(mockedAdapter, options) - assert.ok(geocoder instanceof TeleportGeocoder) - }) - }) - - describe('forward', () => { - it('should not accept IPv4', () => { - const geocoder = new TeleportGeocoder(mockedAdapter, options) - assert.throws(() => { - geocoder.forward('127.0.0.1') - }, /TeleportGeocoder does not support geocoding IPv4/) - }) - - it('should not accept IPv6', () => { - const geocoder = new TeleportGeocoder(mockedAdapter, options) - assert.throws(() => { - geocoder.forward('2001:0db8:0000:85a3:0000:0000:ac1f:8001') - }, /TeleportGeocoder does not support geocoding IPv6/) - }) - - it('should call api', async function () { - const mockedAdapter = sinon.stub().returns( - Promise.resolve({ - status: 200, - json: () => Promise.resolve({}) - }) - ) - - const geocoder = new TeleportGeocoder(mockedAdapter, options) - const results = await geocoder.forward('Paris') - - assert.deepStrictEqual(results, []) - - sinon.assert.calledOnceWithExactly(mockedAdapter, 'https://api.teleport.org/api/cities?apiKey=apiKey&search=Paris&embed=city%3Asearch-results%2Fcity%3Aitem%2F%7Bcity%3Acountry%2Ccity%3Aadmin1_division%2Ccity%3Aurban_area%7D') - }) - - it('should throw on error', async function () { - const mockedAdapter = sinon.stub().returns( - ({ - status: 502, - json: () => Promise.resolve({}) - }) - ) - - const geocoder = new TeleportGeocoder(mockedAdapter, options) - try { - await geocoder.forward('1 champs élysée Paris') - assert.ok(false, 'shall not reach here') - } catch (e) { - assert.strictEqual(e.status, 502) - } - }) - - it('should return address', async function () { - const query = 'birmingham, england' - const { body, expResults } = fixtures[query] - const expUrl = 'https://api.teleport.org/api/cities?apiKey=apiKey&search=birmingham%2C+england&embed=city%3Asearch-results%2Fcity%3Aitem%2F%7Bcity%3Acountry%2Ccity%3Aadmin1_division%2Ccity%3Aurban_area%7D' - - const mockedAdapter = sinon.stub().returns( - Promise.resolve({ - status: 200, - json: () => Promise.resolve(body) - }) - ) - - const geocoder = new TeleportGeocoder(mockedAdapter, options) - const results = await geocoder.forward(query) - - assert.deepStrictEqual(results, expResults) - sinon.assert.calledOnceWithExactly(mockedAdapter, expUrl) - }) - - it('should return address when object', async function () { - const query = 'birmingham, england' - const { body, expResults } = fixtures[query] - const expUrl = 'https://api.teleport.org/api/cities?apiKey=apiKey&search=birmingham%2C+england&embed=city%3Asearch-results%2Fcity%3Aitem%2F%7Bcity%3Acountry%2Ccity%3Aadmin1_division%2Ccity%3Aurban_area%7D' - - const mockedAdapter = sinon.stub().returns( - Promise.resolve({ - status: 200, - json: () => Promise.resolve(body) - }) - ) - - const geocoder = new TeleportGeocoder(mockedAdapter, options) - const results = await geocoder.forward({ address: query }) - - assert.deepStrictEqual(results, expResults) - sinon.assert.calledOnceWithExactly(mockedAdapter, expUrl) - }) - }) - - describe('reverse', () => { - it('should call api', async function () { - const mockedAdapter = sinon.stub().returns( - Promise.resolve({ - status: 200, - json: () => Promise.resolve({}) - }) - ) - - const geocoder = new TeleportGeocoder(mockedAdapter, options) - const results = await geocoder.reverse({ lat: 40.714232, lng: -73.9612889 }) - - assert.deepStrictEqual(results, []) - sinon.assert.calledOnceWithExactly(mockedAdapter, 'https://api.teleport.org/api/locations/40.714232,-73.9612889?apiKey=apiKey&embed=location%3Anearest-cities%2Flocation%3Anearest-city%2F%7Bcity%3Acountry%2Ccity%3Aadmin1_division%2Ccity%3Aurban_area%7D') - }) - - it('should throw on error', async function () { - const mockedAdapter = sinon.stub().returns( - ({ - status: 502, - json: () => Promise.resolve({}) - }) - ) - - const geocoder = new TeleportGeocoder(mockedAdapter, options) - try { - await geocoder.reverse({ lat: 40.714232, lon: -73.9612889 }) - assert.ok(false, 'shall not reach here') - } catch (e) { - assert.strictEqual(e.status, 502) - } - }) - - it('should return address', async function () { - const query = '40.714232,-73.9612889' - const { body, expResults } = fixtures[query] - const expUrl = 'https://api.teleport.org/api/locations/40.714232,-73.9612889?apiKey=apiKey&embed=location%3Anearest-cities%2Flocation%3Anearest-city%2F%7Bcity%3Acountry%2Ccity%3Aadmin1_division%2Ccity%3Aurban_area%7D' - - const mockedAdapter = sinon.stub().returns( - Promise.resolve({ - status: 200, - json: () => Promise.resolve(body) - }) - ) - - const geocoder = new TeleportGeocoder(mockedAdapter, options) - const results = await geocoder.reverse(query) - - assert.deepStrictEqual(results, expResults) - sinon.assert.calledOnceWithExactly(mockedAdapter, expUrl) - }) - }) - - describe('call api', () => { - const { ARCGIS_APIKEY: apiKey } = process.env - let geocoder - - before(function () { - geocoder = new TeleportGeocoder(fetchAdapter(), { apiKey }) - }) - - it('should call forward api', async function () { - const query = 'Paris' - const results = await geocoder.forward(query) - // eslint-disable-next-line no-console - updateFixture(fixtures, 'forward', results[0]) - assert.deepStrictEqual(results[0], fixtures.forward) - }) - - it('should call reverse api', async function () { - const query = '40.714232,-73.9612889' - const results = await geocoder.reverse(query) - // eslint-disable-next-line no-console - updateFixture(fixtures, 'reverse', results[0]) - assert.deepStrictEqual(results[0], fixtures.reverse) - }) - }) -}) diff --git a/tsconfig.json b/tsconfig.json index d5ec764..777dffa 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,7 +5,9 @@ "checkJs": true, "declaration": true, "declarationDir": "types", - // "moduleResolution": "node", + "emitDeclarationOnly": true, + "moduleResolution": "node", + "noEmitOnError": true, "noImplicitAny": false, "strict": true, "target": "ES2021" @@ -14,9 +16,9 @@ "src" ], "exclude": [ - "coverage", - "lib", - "node_modules", - "test" + "./coverage", + "./lib", + "./node_modules", + "./test" ] } diff --git a/types/adapter.d.ts b/types/adapter.d.ts index 436b26d..b4dc190 100644 --- a/types/adapter.d.ts +++ b/types/adapter.d.ts @@ -30,5 +30,5 @@ export class Response { json(): Promise; formData(): Promise; } -export type AdapterOptions = import('./types').AdapterOptions; +export type AdapterOptions = import("./types").AdapterOptions; export type fetchAdapterFn = typeof import("./types").fetchAdapterFn; diff --git a/types/cascade.d.ts b/types/cascade.d.ts index d0b7fd8..742e7a9 100644 --- a/types/cascade.d.ts +++ b/types/cascade.d.ts @@ -23,9 +23,9 @@ export class Cascade { */ reverse(query: ReverseQuery): Promise; } -export type AbstractGeocoder = import('./geocoder/abstract').AbstractGeocoder; -export type CascadeOptions = import('./types').CascadeOptions; -export type ForwardQuery = import('./types').ForwardQuery; -export type ReverseQuery = import('./types').ReverseQuery; -export type GeocoderResult = import('./types').GeocoderResult; +export type AbstractGeocoder = import("./geocoder/abstract").AbstractGeocoder; +export type CascadeOptions = import("./types").CascadeOptions; +export type ForwardQuery = import("./types").ForwardQuery; +export type ReverseQuery = import("./types").ReverseQuery; +export type GeocoderResult = import("./types").GeocoderResult; import { CircuitBreaker } from './circuitbreaker.js'; diff --git a/types/circuitbreaker.d.ts b/types/circuitbreaker.d.ts index 7f93494..5460a20 100644 --- a/types/circuitbreaker.d.ts +++ b/types/circuitbreaker.d.ts @@ -28,9 +28,9 @@ export class CircuitBreaker { */ reverse(query: ReverseQuery): Promise; } -export type AbstractGeocoder = import('./geocoder/abstract').AbstractGeocoder; -export type CircuitBreakerError = import('./types').CircuitBreakerError; -export type CircuitBreakerOptions = import('./types').CircuitBreakerOptions; -export type ForwardQuery = import('./types').ForwardQuery; -export type ReverseQuery = import('./types').ReverseQuery; -export type GeocoderResult = import('./types').GeocoderResult; +export type AbstractGeocoder = import("./geocoder/abstract").AbstractGeocoder; +export type CircuitBreakerError = import("./types").CircuitBreakerError; +export type CircuitBreakerOptions = import("./types").CircuitBreakerOptions; +export type ForwardQuery = import("./types").ForwardQuery; +export type ReverseQuery = import("./types").ReverseQuery; +export type GeocoderResult = import("./types").GeocoderResult; diff --git a/types/combine.d.ts b/types/combine.d.ts index f390aca..d127dbb 100644 --- a/types/combine.d.ts +++ b/types/combine.d.ts @@ -26,9 +26,9 @@ export class Combine { */ reverse(query: ReverseQuery): Promise; } -export type AbstractGeocoder = import('./geocoder/abstract').AbstractGeocoder; -export type CombineOptions = import('./types').CombineOptions; -export type ForwardQuery = import('./types').ForwardQuery; -export type ReverseQuery = import('./types').ReverseQuery; -export type GeocoderResult = import('./types').GeocoderResult; +export type AbstractGeocoder = import("./geocoder/abstract").AbstractGeocoder; +export type CombineOptions = import("./types").CombineOptions; +export type ForwardQuery = import("./types").ForwardQuery; +export type ReverseQuery = import("./types").ReverseQuery; +export type GeocoderResult = import("./types").GeocoderResult; import { CircuitBreaker } from './circuitbreaker.js'; diff --git a/types/formatter/geojson.d.ts b/types/formatter/geojson.d.ts index b3b2c5b..603ccfe 100644 --- a/types/formatter/geojson.d.ts +++ b/types/formatter/geojson.d.ts @@ -4,6 +4,6 @@ * @returns */ export function geoJsonFormatter(results: GeocoderResult[], opts: object): import("../types").GeoJsonFeatureCollection | undefined; -export type GeocoderResult = import('../types').GeocoderResult; -export type GeoJsonFeature = import('../types').GeoJsonFeature; -export type GeoJsonFeatureCollection = import('../types').GeoJsonFeatureCollection; +export type GeocoderResult = import("../types").GeocoderResult; +export type GeoJsonFeature = import("../types").GeoJsonFeature; +export type GeoJsonFeatureCollection = import("../types").GeoJsonFeatureCollection; diff --git a/types/formatter/gpx.d.ts b/types/formatter/gpx.d.ts index 4d32996..727d23b 100644 --- a/types/formatter/gpx.d.ts +++ b/types/formatter/gpx.d.ts @@ -1,2 +1,2 @@ export function gpxFormatter(results: GeocoderResult[]): string; -export type GeocoderResult = import('../types').GeocoderResult; +export type GeocoderResult = import("../types").GeocoderResult; diff --git a/types/geocoder/abstract.d.ts b/types/geocoder/abstract.d.ts index 60309ac..6b85438 100644 --- a/types/geocoder/abstract.d.ts +++ b/types/geocoder/abstract.d.ts @@ -58,7 +58,7 @@ export class AbstractGeocoder { * @param {object} body * @returns {WrappedResults} */ - protected wrapRaw(results: any, body: object): any[]; + protected wrapRaw(results: any | undefined, body: object): any[]; /** * forward geocoding * @protected @@ -75,7 +75,7 @@ export class AbstractGeocoder { */ protected _reverse(query: string | ReverseQuery): Promise; } -export type fetchAdapterFn = import('../adapter.js').fetchAdapterFn; -export type ForwardQuery = import('../types').ForwardQuery; -export type ReverseQuery = import('../types').ReverseQuery; -export type GeocoderResult = import('../types').GeocoderResult; +export type fetchAdapterFn = import("../adapter.js").fetchAdapterFn; +export type ForwardQuery = import("../types").ForwardQuery; +export type ReverseQuery = import("../types").ReverseQuery; +export type GeocoderResult = import("../types").GeocoderResult; diff --git a/types/geocoder/arcgis.d.ts b/types/geocoder/arcgis.d.ts index 5b082a2..8f5d410 100644 --- a/types/geocoder/arcgis.d.ts +++ b/types/geocoder/arcgis.d.ts @@ -63,13 +63,16 @@ export class ArcGisGeocoder extends AbstractGeocoder { */ _formatResultRev(language: any, result: object): object; } -export type fetchAdapterFn = import('../adapter.js').fetchAdapterFn; +export type fetchAdapterFn = import("../adapter.js").fetchAdapterFn; /** * see https://developers.arcgis.com/rest/geocode/api-reference/geocoding-find-address-candidates.htm */ export type ArcGisForwardQuery = { address: string; limit?: number | undefined; + /** + * see https://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer?f=pjson for list of values + */ /** * see https://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer?f=pjson for list of values */ @@ -81,10 +84,16 @@ export type ArcGisForwardQuery = { * see https://developers.arcgis.com/rest/geocode/api-reference/geocoding-reverse-geocode.htm */ export type ArcGisReverseQuery = { + /** + * latitude + */ /** * latitude */ lat: number; + /** + * longitude + */ /** * longitude */ diff --git a/types/geocoder/bingmaps.d.ts b/types/geocoder/bingmaps.d.ts index 274ed37..ff79741 100644 --- a/types/geocoder/bingmaps.d.ts +++ b/types/geocoder/bingmaps.d.ts @@ -65,7 +65,7 @@ export class BingMapsGeocoder extends AbstractGeocoder { }; }; } -export type fetchAdapterFn = import('../adapter.js').fetchAdapterFn; +export type fetchAdapterFn = import("../adapter.js").fetchAdapterFn; /** * see https://docs.microsoft.com/en-us/bingmaps/rest-services/locations/find-a-location-by-address */ @@ -78,10 +78,16 @@ export type BingMapsForwardQuery = { * see https://docs.microsoft.com/en-us/bingmaps/rest-services/locations/find-a-location-by-point */ export type BingMapsReverseQuery = { + /** + * latitude + */ /** * latitude */ lat: number; + /** + * longitude + */ /** * longitude */ diff --git a/types/geocoder/geocodio.d.ts b/types/geocoder/geocodio.d.ts index 176db4f..ffe74d9 100644 --- a/types/geocoder/geocodio.d.ts +++ b/types/geocoder/geocodio.d.ts @@ -67,16 +67,22 @@ export class GeocodioGeocoder extends AbstractGeocoder { }; }; } -export type fetchAdapterFn = import('../adapter.js').fetchAdapterFn; +export type fetchAdapterFn = import("../adapter.js").fetchAdapterFn; /** * see https://www.geocod.io/docs/#single-address */ export type GeocodioForwardQuery = { address: string; + /** + * not supported + */ /** * not supported */ language?: string | undefined; + /** + * Maximum number of results to be returned + */ /** * Maximum number of results to be returned */ @@ -90,18 +96,30 @@ export type GeocodioForwardQuery = { * see https://www.geocod.io/docs/#reverse-geocoding */ export type GeocodioReverseQuery = { + /** + * latitude + */ /** * latitude */ lat: number; + /** + * longitude + */ /** * longitude */ lng: number; + /** + * not supported + */ /** * not supported */ language?: string | undefined; + /** + * Maximum number of results to be returned + */ /** * Maximum number of results to be returned */ diff --git a/types/geocoder/geolite2.d.ts b/types/geocoder/geolite2.d.ts index 4412577..d7a471d 100644 --- a/types/geocoder/geolite2.d.ts +++ b/types/geocoder/geolite2.d.ts @@ -52,7 +52,7 @@ export class GeoLite2Geocoder extends AbstractGeocoder { }; }; } -export type fetchAdapterFn = import('../adapter.js').fetchAdapterFn; +export type fetchAdapterFn = import("../adapter.js").fetchAdapterFn; export type GeoLite2ForwardQuery = { address: string; language?: string | undefined; diff --git a/types/geocoder/google.d.ts b/types/geocoder/google.d.ts index f2e26c5..a9230f1 100644 --- a/types/geocoder/google.d.ts +++ b/types/geocoder/google.d.ts @@ -59,11 +59,14 @@ export class GoogleGeocoder extends AbstractGeocoder { extra: any; }; } -export type fetchAdapterFn = import('../adapter.js').fetchAdapterFn; +export type fetchAdapterFn = import("../adapter.js").fetchAdapterFn; /** * see https://developers.google.com/maps/documentation/geocoding/overview#GeocodingRequests */ export type GoogleForwardQuery = { + /** + * - + */ /** * - */ @@ -77,10 +80,16 @@ export type GoogleForwardQuery = { * see https://developers.google.com/maps/documentation/geocoding/overview#ReverseGeocoding */ export type GoogleReverseQuery = { + /** + * latitude + */ /** * latitude */ lat: number; + /** + * longitude + */ /** * longitude */ diff --git a/types/geocoder/here.d.ts b/types/geocoder/here.d.ts index 84835a3..eaa6b43 100644 --- a/types/geocoder/here.d.ts +++ b/types/geocoder/here.d.ts @@ -37,7 +37,7 @@ export class HereGeocoder extends AbstractGeocoder { latitude: any; longitude: any; country: any; - countryCode: string; + countryCode: string | undefined; state: any; county: any; city: any; @@ -52,25 +52,37 @@ export class HereGeocoder extends AbstractGeocoder { }; }; } -export type fetchAdapterFn = import('../adapter.js').fetchAdapterFn; +export type fetchAdapterFn = import("../adapter.js").fetchAdapterFn; export type HereForwardQuery = { address: string; language?: string | undefined; + /** + * Maximum number of results to be returned + */ /** * Maximum number of results to be returned */ limit?: number | undefined; }; export type HereReverseQuery = { + /** + * latitude + */ /** * latitude */ lat: number; + /** + * longitude + */ /** * longitude */ lng: number; language?: string | undefined; + /** + * Maximum number of results to be returned + */ /** * Maximum number of results to be returned */ diff --git a/types/geocoder/index.d.ts b/types/geocoder/index.d.ts index 4085ca0..b4932f4 100644 --- a/types/geocoder/index.d.ts +++ b/types/geocoder/index.d.ts @@ -15,6 +15,5 @@ export * from "./openmapquest.js"; export * from "./osm.js"; export * from "./pelias.js"; export * from "./pickpoint.js"; -export * from "./teleport.js"; export * from "./tomtom.js"; export * from "./yandex.js"; diff --git a/types/geocoder/ipstack.d.ts b/types/geocoder/ipstack.d.ts index 0839586..e9beb7c 100644 --- a/types/geocoder/ipstack.d.ts +++ b/types/geocoder/ipstack.d.ts @@ -24,5 +24,5 @@ export class IpStackGeocoder extends AbstractGeocoder { zipcode: any; }; } -export type fetchAdapterFn = import('../adapter.js').fetchAdapterFn; +export type fetchAdapterFn = import("../adapter.js").fetchAdapterFn; import { AbstractGeocoder } from './abstract.js'; diff --git a/types/geocoder/locationiq.d.ts b/types/geocoder/locationiq.d.ts index 770bca1..c3a26f3 100644 --- a/types/geocoder/locationiq.d.ts +++ b/types/geocoder/locationiq.d.ts @@ -56,25 +56,37 @@ export class LocationIqGeocoder extends AbstractGeocoder { }; }; } -export type fetchAdapterFn = import('../adapter.js').fetchAdapterFn; +export type fetchAdapterFn = import("../adapter.js").fetchAdapterFn; export type LocationIqForwardQuery = { address: string; language?: string | undefined; + /** + * Maximum number of results to be returned + */ /** * Maximum number of results to be returned */ limit?: number | undefined; }; export type LocationIqReverseQuery = { + /** + * latitude + */ /** * latitude */ lat: number; + /** + * longitude + */ /** * longitude */ lng: number; language?: string | undefined; + /** + * Maximum number of results to be returned + */ /** * Maximum number of results to be returned */ diff --git a/types/geocoder/mapbox.d.ts b/types/geocoder/mapbox.d.ts index d913ba0..23e2ef9 100644 --- a/types/geocoder/mapbox.d.ts +++ b/types/geocoder/mapbox.d.ts @@ -70,12 +70,18 @@ export class MapBoxGeocoder extends AbstractGeocoder { }; }; } -export type fetchAdapterFn = import('../adapter.js').fetchAdapterFn; +export type fetchAdapterFn = import("../adapter.js").fetchAdapterFn; export type MapBoxForwardQuery = { + /** + * - + */ /** * - */ address: string; + /** + * Maximum number of results to be returned + */ /** * Maximum number of results to be returned */ @@ -89,14 +95,23 @@ export type MapBoxForwardQuery = { country?: string[] | undefined; }; export type MapBoxReverseQuery = { + /** + * latitude + */ /** * latitude */ lat: number; + /** + * longitude + */ /** * longitude */ lng: number; + /** + * Maximum number of results to be returned + */ /** * Maximum number of results to be returned */ diff --git a/types/geocoder/mapquest.d.ts b/types/geocoder/mapquest.d.ts index c4114e1..3f75c54 100644 --- a/types/geocoder/mapquest.d.ts +++ b/types/geocoder/mapquest.d.ts @@ -72,12 +72,18 @@ export class MapQuestGeocoder extends AbstractGeocoder { }; }; } -export type fetchAdapterFn = import('../adapter.js').fetchAdapterFn; +export type fetchAdapterFn = import("../adapter.js").fetchAdapterFn; export type MapQuestForwardQuery = { + /** + * - + */ /** * - */ address: string; + /** + * Maximum number of results to be returned + */ /** * Maximum number of results to be returned */ @@ -91,14 +97,23 @@ export type MapQuestForwardQuery = { country?: string[] | undefined; }; export type MapQuestReverseQuery = { + /** + * latitude + */ /** * latitude */ lat: number; + /** + * longitude + */ /** * longitude */ lng: number; + /** + * Maximum number of results to be returned + */ /** * Maximum number of results to be returned */ diff --git a/types/geocoder/opencage.d.ts b/types/geocoder/opencage.d.ts index 85e178c..fc4af92 100644 --- a/types/geocoder/opencage.d.ts +++ b/types/geocoder/opencage.d.ts @@ -53,12 +53,18 @@ export class OpenCageGeocoder extends AbstractGeocoder { }; }; } -export type fetchAdapterFn = import('../adapter.js').fetchAdapterFn; +export type fetchAdapterFn = import("../adapter.js").fetchAdapterFn; export type OpenCageForwardQuery = { + /** + * - + */ /** * - */ address: string; + /** + * Maximum number of results to be returned + */ /** * Maximum number of results to be returned */ @@ -70,14 +76,23 @@ export type OpenCageForwardQuery = { roadinfo?: number | undefined; }; export type OpenCageReverseQuery = { + /** + * latitude + */ /** * latitude */ lat: number; + /** + * longitude + */ /** * longitude */ lng: number; + /** + * Maximum number of results to be returned + */ /** * Maximum number of results to be returned */ diff --git a/types/geocoder/opendatafrance.d.ts b/types/geocoder/opendatafrance.d.ts index fc8aa21..dc2a2da 100644 --- a/types/geocoder/opendatafrance.d.ts +++ b/types/geocoder/opendatafrance.d.ts @@ -57,12 +57,15 @@ export class OpendataFranceGeocoder extends AbstractGeocoder { }; }; } -export type fetchAdapterFn = import('../adapter.js').fetchAdapterFn; +export type fetchAdapterFn = import("../adapter.js").fetchAdapterFn; /** * see https://geo.api.gouv.fr/adresse */ export type OpendataFranceForwardQuery = { address: string; + /** + * Maximum number of results to be returned + */ /** * Maximum number of results to be returned */ @@ -72,14 +75,23 @@ export type OpendataFranceForwardQuery = { * see https://geo.api.gouv.fr/adresse */ export type OpendataFranceReverseQuery = { + /** + * latitude + */ /** * latitude */ lat: number; + /** + * longitude + */ /** * longitude */ lng: number; + /** + * Maximum number of results to be returned + */ /** * Maximum number of results to be returned */ diff --git a/types/geocoder/openmapquest.d.ts b/types/geocoder/openmapquest.d.ts index ee5efd4..eee2eba 100644 --- a/types/geocoder/openmapquest.d.ts +++ b/types/geocoder/openmapquest.d.ts @@ -44,40 +44,64 @@ export class OpenMapQuestGeocoder extends OsmGeocoder { language?: string | undefined; }; } -export type fetchAdapterFn = import('../adapter.js').fetchAdapterFn; +export type fetchAdapterFn = import("../adapter.js").fetchAdapterFn; /** * see https://developer.mapquest.com/documentation/open/nominatim-search/search/ */ export type OpenMapQuestForwardQuery = { + /** + * - + */ /** * - */ address: string; + /** + * Maximum number of results to be returned + */ /** * Maximum number of results to be returned */ limit?: number | undefined; language?: string | undefined; + /** + * search by country + */ /** * search by country */ country?: string | undefined; + /** + * search by states + */ /** * search by states */ state?: string | undefined; + /** + * search by districts / provinces + */ /** * search by districts / provinces */ county?: string | undefined; + /** + * search by names of cities + */ /** * search by names of cities */ city?: string | undefined; + /** + * search by names of streets. Should be specified in the following format ` ` + */ /** * search by names of streets. Should be specified in the following format ` ` */ street?: string | undefined; + /** + * limit the results to a specified postal code + */ /** * limit the results to a specified postal code */ @@ -87,19 +111,31 @@ export type OpenMapQuestForwardQuery = { * see https://developer.mapquest.com/documentation/open/nominatim-search/reverse/ */ export type OpenMapQuestReverseQuery = { + /** + * latitude + */ /** * latitude */ lat: number; + /** + * longitude + */ /** * longitude */ lng: number; + /** + * Maximum number of results to be returned + */ /** * Maximum number of results to be returned */ limit?: number | undefined; language?: string | undefined; + /** + * 0..18 + */ /** * 0..18 */ diff --git a/types/geocoder/osm.d.ts b/types/geocoder/osm.d.ts index c669c57..683d2d9 100644 --- a/types/geocoder/osm.d.ts +++ b/types/geocoder/osm.d.ts @@ -29,6 +29,7 @@ export class OsmGeocoder extends AbstractGeocoder { * @see https://nominatim.org/release-docs/develop/api/Search/ * @param {fetchAdapterFn} adapter * @param {object} options + * @param {string} [options.referer] referer header * @param {number} [options.limit=10] * @param {string} [options.language] * @param {number} [options.addressdetails] @@ -38,8 +39,10 @@ export class OsmGeocoder extends AbstractGeocoder { * @param {number} [options.dedupe] * @param {string} [options.endpoint] custom endpoint * @param {string} [options.revEndpoint] custom reverse endpoint + * @param {boolean} [options.needsReferer] */ - constructor(adapter: fetchAdapterFn, options?: { + constructor(adapter: fetchAdapterFn, options: { + referer?: string | undefined; limit?: number | undefined; language?: string | undefined; addressdetails?: number | undefined; @@ -49,9 +52,15 @@ export class OsmGeocoder extends AbstractGeocoder { dedupe?: number | undefined; endpoint?: string | undefined; revEndpoint?: string | undefined; + needsReferer?: boolean | undefined; }); endpoint: string; revEndpoint: string; + fetchopts: { + headers: { + referer: string; + }; + } | undefined; params: { format: string; addressdetails: number; @@ -93,12 +102,18 @@ export class OsmGeocoder extends AbstractGeocoder { }; }; } -export type fetchAdapterFn = import('../adapter.js').fetchAdapterFn; +export type fetchAdapterFn = import("../adapter.js").fetchAdapterFn; export type OsmForwardQuery = { + /** + * - + */ /** * - */ address: string; + /** + * Maximum number of results to be returned + */ /** * Maximum number of results to be returned */ @@ -113,14 +128,23 @@ export type OsmForwardQuery = { dedupe?: number | undefined; }; export type OsmReverseQuery = { + /** + * latitude + */ /** * latitude */ lat: number; + /** + * longitude + */ /** * longitude */ lng: number; + /** + * Maximum number of results to be returned + */ /** * Maximum number of results to be returned */ diff --git a/types/geocoder/pelias.d.ts b/types/geocoder/pelias.d.ts index 30257f0..9a2c0bc 100644 --- a/types/geocoder/pelias.d.ts +++ b/types/geocoder/pelias.d.ts @@ -39,7 +39,7 @@ export class PeliasGeocoder extends AbstractGeocoder { latitude: any; longitude: any; country: any; - countryCode: string; + countryCode: string | undefined; state: any; county: any; city: any; @@ -51,15 +51,21 @@ export class PeliasGeocoder extends AbstractGeocoder { }; }; } -export type fetchAdapterFn = import('../adapter.js').fetchAdapterFn; +export type fetchAdapterFn = import("../adapter.js").fetchAdapterFn; export type PeliasForwardQuery = { address: string; }; export type PeliasReverseQuery = { + /** + * latitude + */ /** * latitude */ lat: number; + /** + * longitude + */ /** * longitude */ diff --git a/types/geocoder/pickpoint.d.ts b/types/geocoder/pickpoint.d.ts index b60bbb9..bd4d1ac 100644 --- a/types/geocoder/pickpoint.d.ts +++ b/types/geocoder/pickpoint.d.ts @@ -31,7 +31,7 @@ export class PickpointGeocoder extends OsmGeocoder { * @param {number} [options.limit=10] * @param {string} [options.language] */ - constructor(adapter: fetchAdapterFn, options?: { + constructor(adapter: fetchAdapterFn, options: { apiKey: string; limit?: number | undefined; language?: string | undefined; @@ -44,40 +44,64 @@ export class PickpointGeocoder extends OsmGeocoder { language?: string | undefined; }; } -export type fetchAdapterFn = import('../adapter.js').fetchAdapterFn; +export type fetchAdapterFn = import("../adapter.js").fetchAdapterFn; /** * see https://pickpoint.io/api-reference#forward-geocoding */ export type PickpointForwardQuery = { + /** + * - + */ /** * - */ address: string; + /** + * Maximum number of results to be returned + */ /** * Maximum number of results to be returned */ limit?: number | undefined; language?: string | undefined; + /** + * search by country + */ /** * search by country */ country?: string | undefined; + /** + * search by states + */ /** * search by states */ state?: string | undefined; + /** + * search by districts / provinces + */ /** * search by districts / provinces */ county?: string | undefined; + /** + * search by names of cities + */ /** * search by names of cities */ city?: string | undefined; + /** + * search by names of streets. Should be specified in the following format ` ` + */ /** * search by names of streets. Should be specified in the following format ` ` */ street?: string | undefined; + /** + * limit the results to a specified postal code + */ /** * limit the results to a specified postal code */ @@ -87,19 +111,31 @@ export type PickpointForwardQuery = { * see https://pickpoint.io/api-reference#reverse-geocoding */ export type PickpointReverseQuery = { + /** + * latitude + */ /** * latitude */ lat: number; + /** + * longitude + */ /** * longitude */ lng: number; + /** + * Maximum number of results to be returned + */ /** * Maximum number of results to be returned */ limit?: number | undefined; language?: string | undefined; + /** + * 0..18 + */ /** * 0..18 */ diff --git a/types/geocoder/teleport.d.ts b/types/geocoder/teleport.d.ts deleted file mode 100644 index b82318a..0000000 --- a/types/geocoder/teleport.d.ts +++ /dev/null @@ -1,63 +0,0 @@ -/** - * @typedef {object} TeleportForwardQuery - * @property {string} address - */ -/** - * @typedef {object} TeleportReverseQuery - * @property {number} lat latitude - * @property {number} lng longitude - */ -/** - * with Teleport geocoder only cities can by found but no addresses - */ -export class TeleportGeocoder extends AbstractGeocoder { - /** - * available options - * @see https://developers.teleport.org/api/resources/ - * @param {fetchAdapterFn} adapter - * @param {object} options - */ - constructor(adapter: fetchAdapterFn, options?: object); - params: any; - get endpoint(): string; - get revEndpoint(): string; - /** - * @param {string|TeleportForwardQuery} query - * @returns {Promise} - */ - _forward(query: string | TeleportForwardQuery): Promise; - /** - * @param {TeleportReverseQuery} query - * @returns {Promise} - */ - _reverse(query: TeleportReverseQuery): Promise; - _formatResult(cityRelationName: any, result: any): { - latitude: any; - longitude: any; - city: any; - country: any; - countryCode: any; - state: any; - stateCode: any; - extra: { - urbanArea: any; - urbanAreaApiUrl: any; - urbanAreaWebUrl: any; - }; - }; -} -export type fetchAdapterFn = import('../adapter.js').fetchAdapterFn; -export type TeleportForwardQuery = { - address: string; -}; -export type TeleportReverseQuery = { - /** - * latitude - */ - lat: number; - /** - * longitude - */ - lng: number; -}; -import { AbstractGeocoder } from './abstract.js'; diff --git a/types/geocoder/tomtom.d.ts b/types/geocoder/tomtom.d.ts index fd84116..d47a8a3 100644 --- a/types/geocoder/tomtom.d.ts +++ b/types/geocoder/tomtom.d.ts @@ -65,13 +65,16 @@ export class TomTomGeocoder extends AbstractGeocoder { */ _formatResultRev(result: object): object; } -export type fetchAdapterFn = import('../adapter.js').fetchAdapterFn; +export type fetchAdapterFn = import("../adapter.js").fetchAdapterFn; /** * see https://developer.tomtom.com/search-api/documentation/geocoding-service/geocode */ export type TomTomForwardQuery = { address: string; limit?: number | undefined; + /** + * see for list of values + */ /** * see for list of values */ @@ -83,10 +86,16 @@ export type TomTomForwardQuery = { * see https://developer.tomtom.com/search-api/documentation/reverse-geocoding-service/reverse-geocode */ export type TomTomReverseQuery = { + /** + * latitude + */ /** * latitude */ lat: number; + /** + * longitude + */ /** * longitude */ diff --git a/types/geocoder/yandex.d.ts b/types/geocoder/yandex.d.ts index 915f0d4..86d1172 100644 --- a/types/geocoder/yandex.d.ts +++ b/types/geocoder/yandex.d.ts @@ -59,28 +59,43 @@ export class YandexGeocoder extends AbstractGeocoder { }; }; } -export type fetchAdapterFn = import('../adapter.js').fetchAdapterFn; +export type fetchAdapterFn = import("../adapter.js").fetchAdapterFn; export type YandexForwardQuery = { address: string; language?: string | undefined; + /** + * house, street, metro, district, locality + */ /** * house, street, metro, district, locality */ kind?: string | undefined; + /** + * [0,1] + */ /** * [0,1] */ rspn?: number | undefined; + /** + * Longitude and latitude of the center of the search area + */ /** * Longitude and latitude of the center of the search area */ ll?: string | undefined; }; export type YandexReverseQuery = { + /** + * latitude + */ /** * latitude */ lat: number; + /** + * longitude + */ /** * longitude */ diff --git a/types/utils/httperror.d.ts b/types/utils/httperror.d.ts index eed49bb..c7611d4 100644 --- a/types/utils/httperror.d.ts +++ b/types/utils/httperror.d.ts @@ -5,5 +5,5 @@ * @returns {HttpErrorType} */ export function HttpError(response: Response): HttpErrorType; -export type Response = import('../adapter').Response; -export type HttpErrorType = import('../types').HttpError; +export type Response = import("../adapter").Response; +export type HttpErrorType = import("../types").HttpError; diff --git a/types/utils/isocode.d.ts b/types/utils/isocode.d.ts index 283294e..b13ee8e 100644 --- a/types/utils/isocode.d.ts +++ b/types/utils/isocode.d.ts @@ -1,2 +1,2 @@ -export function countryCode(code: string): string; +export function countryCode(code: string): string | undefined; export function countryName(code: string, language?: string | undefined): string | undefined; diff --git a/types/version.d.ts b/types/version.d.ts new file mode 100644 index 0000000..0d914fb --- /dev/null +++ b/types/version.d.ts @@ -0,0 +1 @@ +export const version: "1.5.5";