{"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/googleProvider.ts","../src/providers/hereProvider.ts","../src/providers/openStreetMapProvider.ts","../src/providers/locationIQProvider.ts","../src/providers/openCageProvider.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 container?: string;\n item?: string;\n };\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\n constructor({ handleClick, classNames = {} }: ResultListProps) {\n this.handleClick = handleClick;\n\n this.container = createElement(\n 'div',\n cx('results', classNames.container),\n );\n this.container.addEventListener('click', this.onClick, true);\n\n this.resultItem = createElement('div', cx(classNames.item));\n }\n\n render(results: SearchResult[] = []): 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 = result.label;\n this.container.appendChild(child);\n });\n\n if (results.length > 0) {\n addClassName(this.container.parentElement, 'open');\n addClassName(this.container, 'active');\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.handleClick({ result: this.results[idx] });\n };\n}\n","import L, { 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 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: 'Sorry, that address could not be found.',\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 },\n autoComplete: true,\n autoCompleteDelay: 250,\n autoClose: false,\n keepResult: false,\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 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 };\n\n autoComplete: boolean;\n autoCompleteDelay: number;\n maxSuggestions: number;\n autoClose: boolean;\n keepResult: 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 });\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);\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 } = this.options;\n\n // @ts-ignore\n const markers = Object.keys(this.markers._layers);\n if (markers.length >= this.options.maxMarkers) {\n // @ts-ignore\n this.markers.removeLayer(markers[0]);\n }\n\n const marker = this.addMarker(result, query);\n this.centerMap(result);\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()) {\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 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"],"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","target","hasAttribute","idx","Number","getAttribute","result","results","resultItem","item","render","clear","child","_this2","cloneNode","label","length","parentElement","select","index","from","children","selected","count","lastChild","removeChild","defaultOptions","position","style","showMarker","showPopup","popupFormat","marker","icon","L","Icon","Default","undefined","draggable","maxMarkers","maxSuggestions","retainZoomLevel","animateZoom","notFoundMessage","messageHideDelay","zoomLevel","button","resetButton","msgbox","autoComplete","autoCompleteDelay","autoClose","keepResult","UNINITIALIZED_ERR","Control","options","initialize","cb","wait","immediate","timeout","Error","provider","markers","FeatureGroup","searchElement","title","href","DomEvent","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","_layers","removeLayer","addMarker","centerMap","fireEvent","location","closeResults","Marker","y","x","popupLabel","bindPopup","addLayer","openPopup","on","_this6","getLatLng","resultBounds","bounds","LatLngBounds","LatLng","toBounds","isValid","getBounds","fitBounds","animate","setView","getCenter","getZoom","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","GoogleProvider","formatted_address","viewport","southwest","northeast","HereProvider","items","OpenStreetMapProvider","host","reverseUrl","format","REVERSE","lon","display_name","parseFloat","boundingbox","LocationIQProvider","OpenCageProvider","formatted"],"mappings":"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"}