{"version":3,"file":"geosearch.umd.js","sources":["../src/domUtils.ts","../src/providers/provider.ts","../src/constants.ts","../src/SearchElement.ts","../src/resultList.ts","../src/SearchControl.ts","../src/lib/debounce.ts","../src/providers/algoliaProvider.ts","../src/providers/bingProvider.ts","../src/providers/esriProvider.ts","../src/providers/peliasProvider.ts","../src/providers/geocodeEarthProvider.ts","../src/providers/googleProvider.ts","../src/providers/hereProvider.ts","../src/providers/openStreetMapProvider.ts","../src/providers/locationIQProvider.ts","../src/providers/openCageProvider.ts","../src/providers/mapBoxProvider.ts","../src/providers/geoApiFrProvider.ts"],"sourcesContent":["export function createElement(\n element: string,\n className: string | null = '',\n parent?: Element | null,\n attributes: { [key: string]: string | ((event: any) => void) } = {},\n): T {\n const el = document.createElement(element) as T;\n\n if (className) {\n el.className = className;\n }\n\n Object.keys(attributes).forEach((key) => {\n if (typeof attributes[key] === 'function') {\n // IE doesn't support startsWith\n const type = (key.indexOf('on') === 0\n ? key.substr(2).toLowerCase()\n : key) as keyof HTMLElementEventMap;\n el.addEventListener(type, attributes[key] as () => void);\n } else if (key === 'html') {\n el.innerHTML = attributes[key] as string;\n } else if (key === 'text') {\n el.innerText = attributes[key] as string;\n } else {\n el.setAttribute(key, attributes[key] as string);\n }\n });\n\n if (parent) {\n parent.appendChild(el);\n }\n\n return el;\n}\n\nexport function stopPropagation(event: Event) {\n event.preventDefault();\n event.stopPropagation();\n}\n\nexport function createScriptElement(\n url: string,\n cb: string,\n): Promise {\n const script = createElement('script', null, document.body);\n script.setAttribute('type', 'text/javascript');\n\n return new Promise((resolve) => {\n (window as any)[cb] = (json: T): void => {\n script.remove();\n delete (window as any)[cb];\n resolve(json);\n };\n\n script.setAttribute('src', url);\n });\n}\n\nexport const cx = (...classNames: (string | undefined)[]): string =>\n classNames.filter(Boolean).join(' ').trim();\n\nexport function addClassName(\n element: Element | null,\n className: string | string[],\n): void {\n if (!element || !element.classList) {\n return;\n }\n\n // IE doesn't support adding multiple classes at once :(\n const classNames = Array.isArray(className) ? className : [className];\n classNames.forEach((name) => {\n if (!element.classList.contains(name)) {\n element.classList.add(name);\n }\n });\n}\n\nexport function removeClassName(\n element: Element | null,\n className: string | string[],\n): void {\n if (!element || !element.classList) {\n return;\n }\n\n // IE doesn't support removing multiple classes at once :(\n const classNames = Array.isArray(className) ? className : [className];\n classNames.forEach((name) => {\n if (element.classList.contains(name)) {\n element.classList.remove(name);\n }\n });\n}\n\nexport function replaceClassName(\n element: Element,\n find: string,\n replace: string,\n): void {\n removeClassName(element, find);\n addClassName(element, replace);\n}\n","export type PointTuple = [number, number];\nexport type BoundsTuple = [PointTuple, PointTuple];\n\nexport interface LatLng {\n lat: number;\n lng: number;\n}\n\nexport interface SearchResult {\n x: number;\n y: number;\n label: string;\n bounds: BoundsTuple | null;\n raw: TRawResult;\n}\n\nexport interface ProviderParams {\n [key: string]: string | number | boolean;\n}\n\nexport interface ProviderOptions {\n params?: ProviderParams;\n}\n\nexport enum RequestType {\n SEARCH,\n REVERSE,\n}\n\nexport interface EndpointArgument {\n query: string | { [key: string]: string | number | boolean };\n type?: RequestType;\n}\n\nexport interface SearchArgument {\n query: string;\n}\n\nexport interface ParseArgument {\n data: TData;\n}\n\nexport interface Provider {\n options: ProviderOptions;\n\n endpoint(options: EndpointArgument): string;\n getParamString(params: ProviderParams): string;\n parse(response: ParseArgument): SearchResult[];\n search(options: SearchArgument): Promise[]>;\n}\n\nexport default abstract class AbstractProvider<\n TRequestResult = any,\n TRawResult = any\n> implements Provider {\n options: ProviderOptions;\n\n constructor(options: ProviderOptions = {}) {\n this.options = options;\n }\n\n abstract endpoint(options: EndpointArgument): string;\n abstract parse(\n response: ParseArgument,\n ): SearchResult[];\n\n getParamString(params: ProviderParams = {}): string {\n const set = { ...this.options.params, ...params };\n return Object.keys(set)\n .map(\n (key) => `${encodeURIComponent(key)}=${encodeURIComponent(set[key])}`,\n )\n .join('&');\n }\n\n getUrl(url: string, params?: ProviderParams): string {\n return `${url}?${this.getParamString(params)}`;\n }\n\n async search(options: SearchArgument): Promise[]> {\n const url = this.endpoint({\n query: options.query,\n type: RequestType.SEARCH,\n });\n\n const request = await fetch(url);\n const json: TRequestResult = await request.json();\n return this.parse({ data: json });\n }\n}\n","export const ENTER_KEY = 13;\nexport const ESCAPE_KEY = 27;\nexport const ARROW_DOWN_KEY = 40;\nexport const ARROW_UP_KEY = 38;\nexport const ARROW_LEFT_KEY = 37;\nexport const ARROW_RIGHT_KEY = 39;\n\nexport const SPECIAL_KEYS = [\n ENTER_KEY,\n ESCAPE_KEY,\n ARROW_DOWN_KEY,\n ARROW_UP_KEY,\n ARROW_LEFT_KEY,\n ARROW_RIGHT_KEY,\n];\n","import {\n createElement,\n addClassName,\n removeClassName,\n cx,\n stopPropagation,\n replaceClassName,\n} from './domUtils';\n\nimport { ESCAPE_KEY, ENTER_KEY } from './constants';\n\ninterface SearchElementProps {\n searchLabel?: string;\n handleSubmit: (args: { query: string }) => void;\n classNames?: {\n container?: string;\n form?: string;\n input?: string;\n };\n}\n\nexport default class SearchElement {\n container: HTMLDivElement;\n form: HTMLFormElement;\n input: HTMLInputElement;\n handleSubmit: (args: { query: string }) => void;\n hasError = false;\n\n constructor({\n handleSubmit,\n searchLabel,\n classNames = {},\n }: SearchElementProps) {\n this.container = createElement(\n 'div',\n cx('geosearch', classNames.container),\n );\n\n this.form = createElement(\n 'form',\n ['', classNames.form].join(' '),\n this.container,\n {\n autocomplete: 'none',\n onClick: stopPropagation,\n onDblClick: stopPropagation,\n touchStart: stopPropagation,\n touchEnd: stopPropagation,\n },\n );\n\n this.input = createElement(\n 'input',\n ['glass', classNames.input].join(' '),\n this.form,\n {\n type: 'text',\n placeholder: searchLabel || 'search',\n onInput: this.onInput,\n onKeyUp: (e) => this.onKeyUp(e),\n onKeyPress: (e) => this.onKeyPress(e),\n onFocus: this.onFocus,\n onBlur: this.onBlur,\n\n // For some reason, leaflet is blocking the 'touchstart', manually give\n // focus to the input onClick\n // > Ignored attempt to cancel a touchstart event with cancelable=false,\n // > for example because scrolling is in progress and cannot be interrupted.\n onClick: () => {\n this.input.focus();\n this.input.dispatchEvent(new Event('focus'));\n },\n },\n );\n\n this.handleSubmit = handleSubmit;\n }\n\n onFocus(): void {\n addClassName(this.form, 'active');\n }\n\n onBlur(): void {\n removeClassName(this.form, 'active');\n }\n\n async onSubmit(event: Event): Promise {\n stopPropagation(event);\n replaceClassName(this.container, 'error', 'pending');\n\n await this.handleSubmit({ query: this.input.value });\n removeClassName(this.container, 'pending');\n }\n\n onInput(): void {\n if (!this.hasError) {\n return;\n }\n\n removeClassName(this.container, 'error');\n this.hasError = false;\n }\n\n onKeyUp(event: KeyboardEvent): void {\n if (event.keyCode !== ESCAPE_KEY) {\n return;\n }\n\n removeClassName(this.container, ['pending', 'active']);\n\n this.input.value = '';\n\n document.body.focus();\n document.body.blur();\n }\n\n onKeyPress(event: KeyboardEvent): void {\n if (event.keyCode !== ENTER_KEY) {\n return;\n }\n\n this.onSubmit(event);\n }\n\n setQuery(query: string): void {\n this.input.value = query;\n }\n}\n","import { createElement, addClassName, removeClassName, cx } from './domUtils';\nimport { SearchResult } from './providers/provider';\n\ninterface ResultListProps {\n handleClick: (args: { result: SearchResult }) => void;\n classNames?: {\n resultlist?: string;\n item?: string;\n notfound?: string;\n };\n notFoundMessage?: string;\n}\n\nexport default class ResultList {\n handleClick?: (args: { result: SearchResult }) => void;\n selected = -1;\n results: SearchResult[] = [];\n\n container: HTMLDivElement;\n resultItem: HTMLDivElement;\n notFoundMessage?: HTMLDivElement;\n\n constructor({\n handleClick,\n classNames = {},\n notFoundMessage,\n }: ResultListProps) {\n this.handleClick = handleClick;\n this.notFoundMessage = !!notFoundMessage\n ? createElement(\n 'div',\n cx(classNames.notfound),\n undefined,\n { html: notFoundMessage! },\n )\n : undefined;\n\n this.container = createElement(\n 'div',\n cx('results', classNames.resultlist),\n );\n this.container.addEventListener('click', this.onClick, true);\n\n this.resultItem = createElement('div', cx(classNames.item));\n }\n\n render(results: SearchResult[] = [], resultFormat: Function): void {\n this.clear();\n\n results.forEach((result, idx) => {\n const child = this.resultItem.cloneNode(true) as HTMLDivElement;\n child.setAttribute('data-key', `${idx}`);\n child.innerHTML = resultFormat({ result });\n this.container.appendChild(child);\n });\n\n if (results.length > 0) {\n addClassName(this.container.parentElement, 'open');\n addClassName(this.container, 'active');\n } else if (!!this.notFoundMessage) {\n this.container.appendChild(this.notFoundMessage);\n addClassName(this.container.parentElement, 'open');\n }\n\n this.results = results;\n }\n\n select(index: number): SearchResult {\n // eslint-disable-next-line no-confusing-arrow\n Array.from(this.container.children).forEach((child, idx) =>\n idx === index\n ? addClassName(child, 'active')\n : removeClassName(child, 'active'),\n );\n\n this.selected = index;\n return this.results[index];\n }\n\n count(): number {\n return this.results ? this.results.length : 0;\n }\n\n clear(): void {\n this.selected = -1;\n\n while (this.container.lastChild) {\n this.container.removeChild(this.container.lastChild);\n }\n\n removeClassName(this.container.parentElement, 'open');\n removeClassName(this.container, 'active');\n }\n\n onClick = (event: Event): void => {\n if (typeof this.handleClick !== 'function') {\n return;\n }\n\n const target = event.target as HTMLDivElement;\n if (\n !target ||\n !this.container.contains(target) ||\n !target.hasAttribute('data-key')\n ) {\n return;\n }\n\n const idx = Number(target.getAttribute('data-key'));\n this.clear();\n this.handleClick({ result: this.results[idx] });\n };\n}\n","import * as L from 'leaflet';\nimport { ControlPosition, FeatureGroup, MarkerOptions, Map } from 'leaflet';\nimport SearchElement from './SearchElement';\nimport ResultList from './resultList';\nimport debounce from './lib/debounce';\n\nimport {\n createElement,\n addClassName,\n removeClassName,\n stopPropagation,\n} from './domUtils';\nimport {\n ENTER_KEY,\n SPECIAL_KEYS,\n ARROW_UP_KEY,\n ARROW_DOWN_KEY,\n ESCAPE_KEY,\n} from './constants';\nimport AbstractProvider, { SearchResult } from './providers/provider';\nimport { Provider } from './providers';\n\nconst defaultOptions: Omit = {\n position: 'topleft',\n style: 'button',\n showMarker: true,\n showPopup: false,\n popupFormat: ({ result }) => `${result.label}`,\n resultFormat: ({ result }) => `${result.label}`,\n marker: {\n icon: L && L.Icon ? new L.Icon.Default() : undefined,\n draggable: false,\n },\n maxMarkers: 1,\n maxSuggestions: 5,\n retainZoomLevel: false,\n animateZoom: true,\n searchLabel: 'Enter address',\n notFoundMessage: '',\n messageHideDelay: 3000,\n zoomLevel: 18,\n classNames: {\n container: 'leaflet-bar leaflet-control leaflet-control-geosearch',\n button: 'leaflet-bar-part leaflet-bar-part-single',\n resetButton: 'reset',\n msgbox: 'leaflet-bar message',\n form: '',\n input: '',\n resultlist: '',\n item: '',\n notfound: 'leaflet-bar-notfound',\n },\n autoComplete: true,\n autoCompleteDelay: 250,\n autoClose: false,\n keepResult: false,\n updateMap: true,\n};\n\nconst UNINITIALIZED_ERR =\n 'Leaflet must be loaded before instantiating the GeoSearch control';\n\ninterface SearchControlProps {\n /** the provider to use for searching */\n provider: Provider;\n /** the leaflet position to render the element in */\n position: ControlPosition;\n /**\n * the stye of the search element\n * @default bar\n **/\n style: 'button' | 'bar';\n\n marker: MarkerOptions;\n maxMarkers: number;\n showMarker: boolean;\n showPopup: boolean;\n popupFormat(args: {\n query: Selection;\n result: SearchResult;\n }): string;\n\n resultFormat(args: { result: SearchResult }): string;\n\n searchLabel: string;\n notFoundMessage: string;\n messageHideDelay: number;\n\n animateZoom: boolean;\n zoomLevel: number;\n retainZoomLevel: boolean;\n\n classNames: {\n container: string;\n button: string;\n resetButton: string;\n msgbox: string;\n form: string;\n input: string;\n resultlist: string;\n item: string;\n notfound: string;\n };\n\n autoComplete: boolean;\n autoCompleteDelay: number;\n maxSuggestions: number;\n autoClose: boolean;\n keepResult: boolean;\n updateMap: boolean;\n}\n\nexport type SearchControlOptions = Partial & {\n provider: Provider;\n};\n\ninterface Selection {\n query: string;\n data?: SearchResult;\n}\n\ninterface SearchControl {\n options: Omit & {\n provider?: SearchControlProps['provider'];\n };\n markers: FeatureGroup;\n searchElement: SearchElement;\n resultList: ResultList;\n classNames: SearchControlProps['classNames'];\n container: HTMLDivElement;\n input: HTMLInputElement;\n button: HTMLAnchorElement;\n resetButton: HTMLAnchorElement;\n map: Map;\n\n // [key: string]: any;\n initialize(options: SearchControlProps): void;\n onSubmit(result: Selection): void;\n onClick(event: Event): void;\n clearResults(event?: KeyboardEvent | null, force?: boolean): void;\n autoSearch(event: KeyboardEvent): void;\n selectResult(event: KeyboardEvent): void;\n showResult(result: SearchResult, query: Selection): void;\n addMarker(result: SearchResult, selection: Selection): void;\n centerMap(result: SearchResult): void;\n closeResults(): void;\n getZoom(): number;\n onAdd(map: Map): HTMLDivElement;\n onRemove(): SearchControl;\n}\n\n// @ts-ignore\nconst Control: SearchControl = {\n options: { ...defaultOptions },\n classNames: { ...defaultOptions.classNames },\n\n initialize(options: SearchControlOptions) {\n if (!L) {\n throw new Error(UNINITIALIZED_ERR);\n }\n\n if (!options.provider) {\n throw new Error('Provider is missing from options');\n }\n\n // merge given options with control defaults\n this.options = { ...this.options, ...options };\n this.classNames = { ...this.classNames, ...options.classNames };\n\n this.markers = new L.FeatureGroup();\n this.classNames.container += ` leaflet-geosearch-${this.options.style}`;\n\n this.searchElement = new SearchElement({\n searchLabel: this.options.searchLabel,\n classNames: {\n container: this.classNames.container,\n form: this.classNames.form,\n input: this.classNames.input,\n },\n handleSubmit: (result) => this.onSubmit(result),\n });\n\n this.button = createElement(\n 'a',\n this.classNames.button,\n this.searchElement.container,\n {\n title: this.options.searchLabel,\n href: '#',\n onClick: (e) => this.onClick(e),\n },\n );\n\n L.DomEvent.disableClickPropagation(this.button);\n\n this.resetButton = createElement(\n 'a',\n this.classNames.resetButton,\n this.searchElement.form,\n {\n text: '×',\n href: '#',\n onClick: () => this.clearResults(null, true),\n },\n );\n\n L.DomEvent.disableClickPropagation(this.resetButton);\n\n if (this.options.autoComplete) {\n this.resultList = new ResultList({\n handleClick: ({ result }): void => {\n this.searchElement.input.value = result.label;\n this.onSubmit({ query: result.label, data: result });\n },\n classNames: {\n resultlist: this.classNames.resultlist,\n item: this.classNames.item,\n notfound: this.classNames.notfound,\n },\n notFoundMessage: this.options.notFoundMessage,\n });\n\n this.searchElement.form.appendChild(this.resultList.container);\n\n this.searchElement.input.addEventListener(\n 'keyup',\n debounce(\n (e: KeyboardEvent) => this.autoSearch(e),\n this.options.autoCompleteDelay,\n ),\n true,\n );\n\n this.searchElement.input.addEventListener(\n 'keydown',\n (e: KeyboardEvent) => this.selectResult(e),\n true,\n );\n\n this.searchElement.input.addEventListener(\n 'keydown',\n (e: KeyboardEvent) => this.clearResults(e, true),\n true,\n );\n }\n\n this.searchElement.form.addEventListener(\n 'click',\n (e) => {\n e.preventDefault();\n },\n false,\n );\n },\n\n onAdd(map: Map) {\n const { showMarker, style } = this.options;\n\n this.map = map;\n if (showMarker) {\n this.markers.addTo(map);\n }\n\n if (style === 'bar') {\n const root = map\n .getContainer()\n .querySelector('.leaflet-control-container');\n\n this.container = createElement(\n 'div',\n 'leaflet-control-geosearch leaflet-geosearch-bar',\n );\n\n this.container.appendChild(this.searchElement.form);\n root!.appendChild(this.container);\n }\n\n L.DomEvent.disableClickPropagation(this.searchElement.form);\n return this.searchElement.container;\n },\n\n onRemove() {\n this.container?.remove();\n return this;\n },\n\n onClick(event: Event) {\n event.preventDefault();\n event.stopPropagation();\n\n const { container, input } = this.searchElement;\n\n if (container.classList.contains('active')) {\n removeClassName(container, 'active');\n this.clearResults();\n } else {\n addClassName(container, 'active');\n input.focus();\n }\n },\n\n selectResult(event) {\n if (\n [ENTER_KEY, ARROW_DOWN_KEY, ARROW_UP_KEY].indexOf(event.keyCode) === -1\n ) {\n return;\n }\n\n event.preventDefault();\n\n if (event.keyCode === ENTER_KEY) {\n const item = this.resultList.select(this.resultList.selected);\n this.onSubmit({ query: this.searchElement.input.value, data: item });\n return;\n }\n\n const max = this.resultList.count() - 1;\n if (max < 0) {\n return;\n }\n\n const { selected } = this.resultList;\n const next = event.keyCode === ARROW_DOWN_KEY ? selected + 1 : selected - 1;\n const idx = next < 0 ? max : next > max ? 0 : next;\n\n const item = this.resultList.select(idx);\n this.searchElement.input.value = item.label;\n },\n\n clearResults(event: KeyboardEvent | null, force = false) {\n if (event && event.keyCode !== ESCAPE_KEY) {\n return;\n }\n\n const { keepResult, autoComplete } = this.options;\n\n if (force || !keepResult) {\n this.searchElement.input.value = '';\n this.markers.clearLayers();\n }\n\n if (autoComplete) {\n this.resultList.clear();\n }\n },\n\n async autoSearch(event) {\n if (SPECIAL_KEYS.indexOf(event.keyCode) > -1) {\n return;\n }\n\n const query = (event.target as HTMLInputElement).value;\n const { provider } = this.options;\n\n if (query.length) {\n let results = await provider!.search({ query });\n results = results.slice(0, this.options.maxSuggestions);\n this.resultList.render(results, this.options.resultFormat);\n } else {\n this.resultList.clear();\n }\n },\n\n async onSubmit(query) {\n const { provider } = this.options;\n\n const results = await provider!.search(query);\n\n if (results && results.length > 0) {\n this.showResult(results[0], query);\n }\n },\n\n showResult(result, query) {\n const { autoClose, updateMap } = this.options;\n\n const markers = this.markers.getLayers();\n if (markers.length >= this.options.maxMarkers) {\n this.markers.removeLayer(markers[0]);\n }\n\n const marker = this.addMarker(result, query);\n\n if (updateMap) {\n this.centerMap(result);\n }\n\n this.map.fireEvent('geosearch/showlocation', {\n location: result,\n marker,\n });\n\n if (autoClose) {\n this.closeResults();\n }\n },\n\n closeResults() {\n const { container } = this.searchElement;\n\n if (container.classList.contains('active')) {\n removeClassName(container, 'active');\n }\n\n this.clearResults();\n },\n\n addMarker(result, query) {\n const { marker: options, showPopup, popupFormat } = this.options;\n const marker = new L.Marker([result.y, result.x], options);\n let popupLabel = result.label;\n\n if (typeof popupFormat === 'function') {\n popupLabel = popupFormat({ query, result });\n }\n\n marker.bindPopup(popupLabel);\n\n this.markers.addLayer(marker);\n\n if (showPopup) {\n marker.openPopup();\n }\n\n if (options.draggable) {\n marker.on('dragend', (args) => {\n this.map.fireEvent('geosearch/marker/dragend', {\n location: marker.getLatLng(),\n event: args,\n });\n });\n }\n\n return marker;\n },\n\n centerMap(result) {\n const { retainZoomLevel, animateZoom } = this.options;\n\n const resultBounds = result.bounds\n ? new L.LatLngBounds(result.bounds)\n : new L.LatLng(result.y, result.x).toBounds(10);\n\n const bounds = resultBounds.isValid()\n ? resultBounds\n : this.markers.getBounds();\n\n if (!retainZoomLevel && resultBounds.isValid() && !result.bounds) {\n this.map.setView(bounds.getCenter(), this.getZoom(), {\n animate: animateZoom,\n });\n } else if (!retainZoomLevel && resultBounds.isValid()) {\n this.map.fitBounds(bounds, { animate: animateZoom });\n } else {\n this.map.setView(bounds.getCenter(), this.getZoom(), {\n animate: animateZoom,\n });\n }\n },\n\n getZoom(): number {\n const { retainZoomLevel, zoomLevel } = this.options;\n return retainZoomLevel ? this.map.getZoom() : zoomLevel;\n },\n};\n\nexport default function SearchControl(...options: any[]) {\n if (!L) {\n throw new Error(UNINITIALIZED_ERR);\n }\n\n const LControl = L.Control.extend(Control);\n return new LControl(...options);\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nexport default function debounce(\n cb: (...args: any[]) => void,\n wait = 250,\n immediate = false,\n): (...args: any[]) => void {\n let timeout: ReturnType | null;\n\n return (...args: any[]): void => {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n timeout = setTimeout(() => {\n timeout = null;\n\n if (!immediate) {\n cb(...args);\n }\n }, wait);\n\n if (immediate && !timeout) {\n cb(...args);\n }\n };\n}\n","import AbstractProvider, {\n LatLng,\n ParseArgument,\n SearchArgument,\n SearchResult,\n} from './provider';\n\ninterface RequestResult {\n hits: RawResult[];\n}\n\ninterface ValueMatch {\n value: string;\n matchLevel: string;\n matchedWords: string[];\n fullyHighlighted?: boolean;\n}\n\ninterface RawResult {\n country: { [key: string]: string };\n country_code: string;\n city: { [key: string]: string[] };\n importance: number;\n _tags: string[];\n postcode: string[];\n population: number;\n is_country: boolean;\n is_highway: boolean;\n is_city: boolean;\n is_popular: boolean;\n administrative: string[];\n admin_level: number;\n is_suburb: boolean;\n locale_names: {\n default: string[];\n };\n _geoloc: LatLng;\n objectID: string;\n _highlightResult: {\n country: {\n default: ValueMatch;\n [key: string]: ValueMatch;\n };\n city: {\n default: ValueMatch[];\n [key: string]: ValueMatch[];\n };\n postcode: ValueMatch[];\n administrative: ValueMatch[];\n locale_names: {\n default: ValueMatch[];\n };\n };\n}\n\ninterface ProviderOptions {\n key?: string;\n [key: string]: string | boolean | number | undefined;\n}\n\nexport default class Provider extends AbstractProvider<\n RequestResult,\n RawResult\n> {\n endpoint(): string {\n // No query, Algolia requires POST request\n return 'https://places-dsn.algolia.net/1/places/query';\n }\n\n /**\n * Find index of value with best match\n * (full, fallback to partial, and then to 0)\n */\n findBestMatchLevelIndex(vms: ValueMatch[]): number {\n const match =\n vms.find((vm) => vm.matchLevel === 'full') ||\n vms.find((vm) => vm.matchLevel === 'partial');\n return match ? vms.indexOf(match) : 0;\n }\n\n /**\n * Algolia not provides labels for hits, so\n * we will implement that builder ourselves\n */\n getLabel(result: RawResult): string {\n return [\n // Building + Street\n result.locale_names?.default[\n this.findBestMatchLevelIndex(\n result._highlightResult.locale_names.default,\n )\n ],\n // City\n result.city?.default[\n this.findBestMatchLevelIndex(result._highlightResult.city.default)\n ],\n // Administrative (State / Province)\n result.administrative[\n this.findBestMatchLevelIndex(result._highlightResult.administrative)\n ],\n // Zip code / Postal code\n result.postcode?.[\n this.findBestMatchLevelIndex(result._highlightResult.postcode)\n ],\n // Country\n result.country?.default,\n ]\n .filter(Boolean)\n .join(', ');\n }\n\n parse(response: ParseArgument): SearchResult[] {\n return response.data.hits.map((r) => ({\n x: r._geoloc.lng,\n y: r._geoloc.lat,\n label: this.getLabel(r),\n bounds: null, // Algolia API does not provide bounds\n raw: r,\n }));\n }\n\n async search({ query }: SearchArgument): Promise[]> {\n const params = typeof query === 'string' ? { query } : query;\n\n const request = await fetch(this.endpoint(), {\n method: 'POST',\n body: JSON.stringify({\n ...this.options.params,\n ...params,\n }),\n });\n\n const json = await request.json();\n return this.parse({ data: json });\n }\n}\n","import AbstractProvider, {\n EndpointArgument,\n ParseArgument,\n SearchArgument,\n SearchResult,\n} from './provider';\nimport { createScriptElement } from '../domUtils';\n\nexport interface RequestResult {\n authenticationResultCode: string;\n brandLogoUri: string;\n copyright: string;\n resourceSets: {\n estimatedTotal: number;\n resources: RawResult[];\n }[];\n statusCode: number;\n statusDescription: string;\n traceId: string;\n}\n\nexport interface RawResult {\n __type: string;\n bbox: [number, number, number, number];\n name: string;\n point: { type: 'Point'; coordinates: [number, number] };\n address: {\n adminDistrict: string;\n adminDistrict2: string;\n countryRegion: string;\n formattedAddress: string;\n locality: string;\n };\n confidence: string;\n entityType: string;\n geocodePoints: [\n {\n type: 'Point';\n coordinates: [number, number];\n calculationMethod: string;\n usageTypes: string[];\n },\n ];\n matchCodes: string[];\n}\n\nexport default class BingProvider extends AbstractProvider<\n RequestResult,\n RawResult\n> {\n searchUrl = 'https://dev.virtualearth.net/REST/v1/Locations';\n\n endpoint({ query, jsonp }: EndpointArgument & { jsonp: string }): string {\n const params = typeof query === 'string' ? { q: query } : query;\n params.jsonp = jsonp;\n\n return this.getUrl(this.searchUrl, params);\n }\n\n parse(response: ParseArgument): SearchResult[] {\n if (response.data.resourceSets.length === 0) {\n return [];\n }\n\n return response.data.resourceSets[0].resources.map((r) => ({\n x: r.point.coordinates[1],\n y: r.point.coordinates[0],\n label: r.address.formattedAddress,\n bounds: [\n [r.bbox[0], r.bbox[1]], // s, w\n [r.bbox[2], r.bbox[3]], // n, e\n ],\n raw: r,\n }));\n }\n\n async search({ query }: SearchArgument): Promise[]> {\n const jsonp = `BING_JSONP_CB_${Date.now()}`;\n const json = await createScriptElement(\n this.endpoint({ query, jsonp }),\n jsonp,\n );\n\n return this.parse({ data: json });\n }\n}\n","import AbstractProvider, {\n EndpointArgument,\n ParseArgument,\n SearchResult,\n} from './provider';\n\ninterface RequestResult {\n spatialReference: { wkid: number; latestWkid: number };\n locations: RawResult[];\n}\n\ninterface RawResult {\n name: string;\n extent: {\n xmin: number;\n ymin: number;\n xmax: number;\n ymax: number;\n };\n feature: {\n geometry: { x: number; y: number };\n attributes: { Score: number; Addr_Type: string };\n };\n}\n\nexport default class EsriProvider extends AbstractProvider<\n RequestResult,\n RawResult\n> {\n searchUrl =\n 'https://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer/find';\n\n endpoint({ query }: EndpointArgument): string {\n const params = typeof query === 'string' ? { text: query } : query;\n params.f = 'json';\n\n return this.getUrl(this.searchUrl, params);\n }\n\n parse(result: ParseArgument): SearchResult[] {\n return result.data.locations.map((r) => ({\n x: r.feature.geometry.x,\n y: r.feature.geometry.y,\n label: r.name,\n bounds: [\n [r.extent.ymin, r.extent.xmin], // s, w\n [r.extent.ymax, r.extent.xmax], // n, e\n ],\n raw: r,\n }));\n }\n}\n","import AbstractProvider, {\n EndpointArgument,\n ParseArgument,\n ProviderOptions,\n RequestType,\n SearchResult,\n} from './provider';\n\nexport interface RequestResult {\n geocoding: object;\n features: RawResult[];\n}\n\nexport type PeliasProviderOptions = {\n host?: string;\n} & ProviderOptions;\n\nexport interface RawResult {\n type: 'Feature';\n geometry: {\n type: 'Point';\n coordinates: [number, number];\n };\n bbox?: [number, number, number, number];\n properties: {\n id: string;\n source_id: string;\n gid: string;\n\n layer: string;\n source: string;\n\n label: string;\n name: string;\n\n accuracy: 'centroid' | 'point';\n confidence?: number;\n match_type?: 'exact' | 'interpolated' | 'fallback';\n\n borough?: string;\n borough_a?: string;\n borough_gid?: string;\n continent?: string;\n continent_a?: string;\n continent_gid?: string;\n country?: string;\n country_a?: string;\n country_gid?: string;\n county?: string;\n county_a?: string;\n county_gid?: string;\n dependency?: string;\n dependency_a?: string;\n dependency_gid?: string;\n empire?: string;\n empire_a?: string;\n empire_gid?: string;\n localadmin?: string;\n localadmin_a?: string;\n localadmin_gid?: string;\n locality?: string;\n locality_a?: string;\n locality_gid?: string;\n macrocounty?: string;\n macrocounty_a?: string;\n macrocounty_gid?: string;\n macroregion?: string;\n macroregion_a?: string;\n macroregion_gid?: string;\n marinearea?: string;\n marinearea_a?: string;\n marinearea_gid?: string;\n neighbourhood?: string;\n neighbourhood_a?: string;\n neighbourhood_gid?: string;\n ocean?: string;\n ocean_a?: string;\n ocean_gid?: string;\n postalcode?: string;\n postalcode_a?: string;\n postalcode_gid?: string;\n region?: string;\n region_a?: string;\n region_gid?: string;\n\n street?: string;\n housenumber?: string;\n\n addendum?: any;\n };\n}\n\nexport default class PeliasProvider extends AbstractProvider<\n RequestResult,\n RawResult\n> {\n // Pelias servers are self-hosted so you'll need to configure the 'options.host' string\n // to identify where requests to your running pelias/api server instance should be sent.\n // note: you SHOULD include the scheme, domain and port but NOT any path or parameters.\n // If you're using the Docker setup (https://github.com/pelias/docker)\n // then the default host of 'http://localhost:4000' will work out of the box.\n host: string;\n\n constructor(options: PeliasProviderOptions = {}) {\n super(options);\n this.host = options.host || 'http://localhost:4000';\n }\n\n /**\n * note: Pelias has four different query modes:\n * /v1/autocomplete: for partially completed inputs (such as when a user types)\n * /v1/search: for completed inputs (such as when geocoding a CSV file)\n * /v1/search/structured: for completed inputs with fields already separated\n * /v1/reverse: for finding places nearby/enveloping a point\n */\n endpoint({ query, type }: EndpointArgument) {\n switch (type) {\n // case RequestType.AUTOCOMPLETE:\n // const autocompleteParams = (typeof query === 'string') ? { text: query } : query;\n // return this.getUrl(`${this.host}/v1/autocomplete`, autocompleteParams);\n\n // case RequestType.FULLTEXT:\n // const searchParams = (typeof query === 'string') ? { text: query } : query;\n // return this.getUrl(`${this.host}/v1/search`, searchParams);\n\n // case RequestType.STRUCTURED:\n // const structuredParams = (typeof query === 'string') ? { address: query } : query;\n // return this.getUrl(`${this.host}/v1/search/structured`, structuredParams);\n\n case RequestType.REVERSE:\n const reverseParams = typeof query === 'string' ? {} : query;\n return this.getUrl(`${this.host}/v1/reverse`, reverseParams);\n\n // note: the default query mode is set to 'autocomplete'\n default:\n const autocompleteParams =\n typeof query === 'string' ? { text: query } : query;\n return this.getUrl(`${this.host}/v1/autocomplete`, autocompleteParams);\n }\n }\n\n parse(response: ParseArgument): SearchResult[] {\n return response.data.features.map((feature) => {\n const res: SearchResult = {\n x: feature.geometry.coordinates[0],\n y: feature.geometry.coordinates[1],\n label: feature.properties.label,\n bounds: null,\n raw: feature,\n };\n\n // bbox values are only available for features derived from non-point geometries\n // geojson bbox format: [minX, minY, maxX, maxY]\n if (Array.isArray(feature.bbox) && feature.bbox.length === 4) {\n res.bounds = [\n [feature.bbox[1], feature.bbox[0]], // s, w\n [feature.bbox[3], feature.bbox[2]], // n, e\n ];\n }\n\n return res;\n });\n }\n}\n","import PeliasProvider, { PeliasProviderOptions } from './peliasProvider';\n\nexport default class GeocodeEarthProvider extends PeliasProvider {\n constructor(options: PeliasProviderOptions = {}) {\n options.host = 'https://api.geocode.earth';\n super(options);\n }\n}\n","import AbstractProvider, {\n EndpointArgument,\n LatLng,\n ParseArgument,\n SearchResult,\n} from './provider';\n\nexport interface RequestResult {\n results: RawResult[];\n status: string;\n}\n\nexport interface RawResult {\n address_components: {\n long_name: string;\n short_name: string;\n types: string[];\n }[];\n formatted_address: string;\n geometry: {\n location: LatLng;\n location_type: string;\n viewport: {\n northeast: LatLng;\n southwest: LatLng;\n };\n };\n place_id: string;\n plus_code: {\n compound_code: string;\n global_code: string;\n };\n types: string[];\n}\n\nexport default class GoogleProvider extends AbstractProvider<\n RequestResult,\n RawResult\n> {\n searchUrl = 'https://maps.googleapis.com/maps/api/geocode/json';\n\n endpoint({ query }: EndpointArgument) {\n const params = typeof query === 'string' ? { address: query } : query;\n return this.getUrl(this.searchUrl, params);\n }\n\n parse(result: ParseArgument): SearchResult[] {\n return result.data.results.map((r) => ({\n x: r.geometry.location.lng,\n y: r.geometry.location.lat,\n label: r.formatted_address,\n bounds: [\n [r.geometry.viewport.southwest.lat, r.geometry.viewport.southwest.lng], // s, w\n [r.geometry.viewport.northeast.lat, r.geometry.viewport.northeast.lng], // n, e\n ],\n raw: r,\n }));\n }\n}\n","import AbstractProvider, {\n EndpointArgument,\n LatLng,\n ParseArgument,\n SearchResult,\n} from './provider';\n\nexport interface RequestResult {\n items: RawResult[];\n}\n\nexport interface RawResult {\n title: string;\n id: string;\n resultType: string;\n address: {\n label: string;\n countryCode: string;\n countryName: string;\n state: string;\n county: string;\n city: string;\n district: string;\n street: string;\n postalCode: string;\n houseNumber: string;\n };\n position: LatLng;\n access: LatLng[];\n categories: { id: string }[];\n contacts: { [key: string]: { value: string }[] }[];\n scoring: {\n queryScore: number;\n fieldScore: {\n placeName: number;\n };\n };\n}\n\nexport default class HereProvider extends AbstractProvider<\n RequestResult,\n RawResult\n> {\n searchUrl = 'https://geocode.search.hereapi.com/v1/geocode';\n\n endpoint({ query }: EndpointArgument): string {\n const params = typeof query === 'string' ? { q: query } : query;\n return this.getUrl(this.searchUrl, params);\n }\n\n parse(response: ParseArgument): SearchResult[] {\n return response.data.items.map((r) => ({\n x: r.position.lng,\n y: r.position.lat,\n label: r.address.label,\n bounds: null,\n raw: r,\n }));\n }\n}\n","/* eslint-disable @typescript-eslint/camelcase */\nimport AbstractProvider, {\n EndpointArgument,\n ParseArgument,\n ProviderOptions,\n RequestType,\n SearchResult,\n} from './provider';\nimport hasShape from '../lib/hasShape';\n\nexport type RequestResult = RawResult[];\n\nexport interface RawResult {\n place_id: string;\n license: string;\n osm_type: string;\n osm_id: number;\n boundingbox: [string, string, string, string];\n lat: string;\n lon: string;\n display_name: string;\n class: string;\n type: string;\n importance: number;\n icon?: string;\n}\n\nexport type OpenStreetMapProviderOptions = {\n searchUrl?: string;\n reverseUrl?: string;\n} & ProviderOptions;\n\nexport default class OpenStreetMapProvider extends AbstractProvider<\n RawResult[],\n RawResult\n> {\n searchUrl: string;\n reverseUrl: string;\n\n constructor(options: OpenStreetMapProviderOptions = {}) {\n super(options);\n\n const host = 'https://nominatim.openstreetmap.org';\n this.searchUrl = options.searchUrl || `${host}/search`;\n this.reverseUrl = options.reverseUrl || `${host}/reverse`;\n }\n\n endpoint({ query, type }: EndpointArgument): string {\n const params = typeof query === 'string' ? { q: query } : query;\n params.format = 'json';\n\n switch (type) {\n case RequestType.REVERSE:\n return this.getUrl(this.reverseUrl, params);\n\n default:\n return this.getUrl(this.searchUrl, params);\n }\n }\n\n parse(response: ParseArgument): SearchResult[] {\n const records = Array.isArray(response.data)\n ? response.data\n : [response.data];\n\n return records.map((r) => ({\n x: Number(r.lon),\n y: Number(r.lat),\n label: r.display_name,\n bounds: [\n [parseFloat(r.boundingbox[0]), parseFloat(r.boundingbox[2])], // s, w\n [parseFloat(r.boundingbox[1]), parseFloat(r.boundingbox[3])], // n, e\n ],\n raw: r,\n }));\n }\n}\n","import OpenStreetMapProvider, {\n OpenStreetMapProviderOptions,\n} from './openStreetMapProvider';\n\nexport default class LocationIQProvider extends OpenStreetMapProvider {\n constructor(options: OpenStreetMapProviderOptions) {\n super({\n ...options,\n searchUrl: `https://locationiq.org/v1/search.php`,\n reverseUrl: `https://locationiq.org/v1/reverse.php`,\n });\n }\n}\n","import AbstractProvider, {\n EndpointArgument,\n LatLng,\n ParseArgument,\n SearchArgument,\n SearchResult,\n} from './provider';\n\nexport interface RequestResult {\n results: RawResult[];\n}\n\nexport interface RawResult {\n annotations: {\n DMS: { lat: string; lng: string };\n MGRS: string;\n Maidenhead: string;\n Mercator: { x: number; y: number };\n OSM: {\n edit_url: string;\n note_url: string;\n url: string;\n };\n UN_M49: {\n regions: { [key: string]: string };\n statistical_groupings: string[];\n };\n callingcode: number;\n currency: {\n alternate_symbols: string[];\n decimal_mark: string;\n html_entity: string;\n iso_code: string;\n iso_numeric: string;\n name: string;\n smallest_denomination: number;\n subunit: string;\n subunit_to_unit: number;\n symbol: string;\n symbol_first: number;\n thousands_separator: string;\n };\n flag: string;\n geohash: string;\n qibla: number;\n roadinfo: {\n drive_on: string;\n road: string;\n road_type: string;\n speed_in: string;\n };\n sun: {\n rise: {\n apparent: number;\n astronomical: number;\n civil: number;\n nautical: number;\n };\n set: {\n apparent: number;\n astronomical: number;\n civil: number;\n nautical: number;\n };\n };\n timezone: {\n name: string;\n now_in_dst: number;\n offset_sec: number;\n offset_string: string;\n short_name: string;\n };\n what3words: { words: string };\n };\n bounds: {\n northeast: LatLng;\n southwest: LatLng;\n };\n formatted: string;\n geometry: LatLng;\n}\n\nexport default class OpenCageProvider extends AbstractProvider<\n RequestResult,\n RawResult\n> {\n searchUrl = 'https://api.opencagedata.com/geocode/v1/json';\n\n endpoint({ query }: EndpointArgument) {\n const params = typeof query === 'string' ? { q: query } : query;\n params.format = 'json';\n\n return this.getUrl(this.searchUrl, params);\n }\n\n parse(response: ParseArgument): SearchResult[] {\n return response.data.results.map((r) => ({\n x: r.geometry.lng,\n y: r.geometry.lat,\n label: r.formatted,\n bounds: [\n [r.bounds.southwest.lat, r.bounds.southwest.lng], // s, w\n [r.bounds.northeast.lat, r.bounds.northeast.lng], // n, e\n ],\n raw: r,\n }));\n }\n\n async search(options: SearchArgument): Promise[]> {\n // opencage returns a 400 error when query length < 2\n if (options.query.length < 2) {\n return [];\n }\n\n return super.search(options);\n }\n}\n","import AbstractProvider, {\n EndpointArgument,\n ParseArgument,\n ProviderOptions,\n SearchResult,\n BoundsTuple,\n} from './provider';\n\nexport type RequestResult = {\n features: RawResult[];\n};\nexport interface RawResult {\n center: [string, string];\n text: string;\n place_name: string;\n bbox: [string, string, string, string];\n}\n\nexport type MapBoxProviderOptions = {\n searchUrl?: string;\n reverseUrl?: string;\n} & ProviderOptions;\n\nexport default class MapBoxProvider extends AbstractProvider<\n RequestResult,\n RawResult\n> {\n searchUrl: string;\n\n constructor(options: MapBoxProviderOptions = {}) {\n super(options);\n\n const host = 'https://a.tiles.mapbox.com';\n this.searchUrl = options.searchUrl || `${host}/v4/geocode/mapbox.places/`;\n }\n\n endpoint({ query }: EndpointArgument): string {\n return this.getUrl(`${this.searchUrl}${query}.json`);\n }\n\n parse(response: ParseArgument): SearchResult[] {\n const records = Array.isArray(response.data.features)\n ? response.data.features\n : [];\n\n return records.map((r) => {\n let bounds = null;\n if (r.bbox) {\n bounds = [\n [parseFloat(r.bbox[1]), parseFloat(r.bbox[0])], // s, w\n [parseFloat(r.bbox[3]), parseFloat(r.bbox[2])], // n, e\n ] as BoundsTuple;\n }\n\n return {\n x: Number(r.center[0]),\n y: Number(r.center[1]),\n label: r.place_name ? r.place_name : r.text,\n bounds,\n raw: r,\n };\n });\n }\n}\n","import AbstractProvider, {\n EndpointArgument,\n ParseArgument,\n ProviderOptions,\n SearchResult,\n RequestType,\n} from './provider';\n\nexport interface RequestResult {\n features: RawResult[];\n type: string;\n version: string;\n attribution: string;\n licence: string;\n query: string;\n limit: string;\n}\n\nexport interface RawResult {\n properties: {\n label: string;\n score: number;\n importance: number;\n x: number;\n y: number;\n housenumber: string;\n id: string;\n type: string;\n name: string;\n postcode: string;\n citycode: string;\n city: string;\n context: string;\n street: string;\n };\n type: string;\n geometry: {\n coordinates: number[];\n type: string;\n };\n}\n\nexport type GeoApiFrProviderOptions = {\n searchUrl?: string;\n reverseUrl?: string;\n} & ProviderOptions;\n\nexport default class GeoApiFrProvider extends AbstractProvider<\n RequestResult,\n RawResult\n> {\n searchUrl: string;\n reverseUrl: string;\n\n constructor(options: GeoApiFrProviderOptions = {}) {\n super(options);\n\n const host = 'https://api-adresse.data.gouv.fr';\n this.searchUrl = options.searchUrl || `${host}/search`;\n this.reverseUrl = options.reverseUrl || `${host}/reverse`;\n }\n\n endpoint({ query, type }: EndpointArgument) {\n const params = typeof query === 'string' ? { q: query } : query;\n\n switch (type) {\n case RequestType.REVERSE:\n return this.getUrl(this.reverseUrl, params);\n\n default:\n return this.getUrl(this.searchUrl, params);\n }\n }\n\n parse(result: ParseArgument): SearchResult[] {\n return result.data.features.map((r) => ({\n x: r.geometry.coordinates[0],\n y: r.geometry.coordinates[1],\n label: r.properties.label,\n bounds: null,\n raw: r,\n }));\n }\n}\n"],"names":["createElement","element","className","parent","attributes","el","document","Object","keys","forEach","key","type","indexOf","substr","toLowerCase","addEventListener","innerHTML","innerText","setAttribute","appendChild","stopPropagation","event","preventDefault","cx","classNames","filter","Boolean","join","trim","addClassName","classList","Array","isArray","name","contains","add","removeClassName","remove","RequestType","ENTER_KEY","ARROW_DOWN_KEY","ARROW_UP_KEY","SPECIAL_KEYS","SearchElement","handleSubmit","searchLabel","this","container","form","autocomplete","onClick","onDblClick","touchStart","touchEnd","input","placeholder","onInput","onKeyUp","e","_this","onKeyPress","onFocus","onBlur","focus","dispatchEvent","Event","onSubmit","_this3","query","value","hasError","keyCode","body","blur","setQuery","ResultList","handleClick","notFoundMessage","target","hasAttribute","idx","Number","getAttribute","clear","result","results","notfound","undefined","html","resultlist","resultItem","item","render","resultFormat","child","_this2","cloneNode","length","parentElement","select","index","from","children","selected","count","lastChild","removeChild","defaultOptions","position","style","showMarker","showPopup","popupFormat","label","marker","icon","L","Default","draggable","maxMarkers","maxSuggestions","retainZoomLevel","animateZoom","messageHideDelay","zoomLevel","button","resetButton","msgbox","autoComplete","autoCompleteDelay","autoClose","keepResult","updateMap","UNINITIALIZED_ERR","Control","options","initialize","cb","wait","immediate","timeout","Error","provider","markers","searchElement","title","href","disableClickPropagation","text","clearResults","resultList","data","autoSearch","args","clearTimeout","setTimeout","selectResult","onAdd","map","addTo","root","getContainer","querySelector","onRemove","max","next","force","clearLayers","search","slice","_this5","showResult","getLayers","removeLayer","addMarker","centerMap","fireEvent","location","closeResults","y","x","popupLabel","bindPopup","addLayer","openPopup","on","_this6","getLatLng","resultBounds","bounds","toBounds","isValid","getBounds","setView","getCenter","getZoom","animate","fitBounds","SearchControl","LControl","extend","AbstractProvider","getParamString","params","set","encodeURIComponent","getUrl","url","endpoint","SEARCH","fetch","request","json","parse","Provider","findBestMatchLevelIndex","vms","match","find","vm","matchLevel","getLabel","locale_names","_result$locale_names","_highlightResult","city","_result$city","administrative","postcode","_result$postcode","country","_result$country","response","hits","r","_geoloc","lng","lat","raw","method","JSON","stringify","BingProvider","q","jsonp","searchUrl","resourceSets","resources","point","coordinates","address","formattedAddress","bbox","script","Date","now","Promise","resolve","window","EsriProvider","f","locations","feature","geometry","extent","ymin","xmin","ymax","xmax","PeliasProvider","host","REVERSE","features","res","properties","GeocodeEarthProvider","GoogleProvider","formatted_address","viewport","southwest","northeast","HereProvider","items","OpenStreetMapProvider","reverseUrl","format","lon","display_name","parseFloat","boundingbox","LocationIQProvider","OpenCageProvider","formatted","MapBoxProvider","center","place_name","GeoApiFrProvider"],"mappings":"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"}