@nextgis/geocoder 4.0.0-alpha.5 → 4.0.0-alpha.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- /** Bundle of @nextgis/geocoder; version: 4.0.0-alpha.5; author: NextGIS */
1
+ /** Bundle of @nextgis/geocoder; version: 4.0.0-alpha.8; author: NextGIS */
2
2
  import { objectAssign, fixUrlStr } from '@nextgis/utils';
3
3
  import NgwConnector from '@nextgis/ngw-connector';
4
4
  import { fetchNgwLayerItems } from '@nextgis/ngw-kit';
@@ -17,7 +17,7 @@ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
17
17
  var __getOwnPropSymbols$1 = Object.getOwnPropertySymbols;
18
18
  var __hasOwnProp$1 = Object.prototype.hasOwnProperty;
19
19
  var __propIsEnum$1 = Object.prototype.propertyIsEnumerable;
20
- var __knownSymbol$2 = (name, symbol) => (symbol = Symbol[name]) ? symbol : Symbol.for("Symbol." + name);
20
+ var __knownSymbol$2 = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
21
21
  var __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
22
22
  var __spreadValues$1 = (a, b) => {
23
23
  for (var prop in b || (b = {}))
@@ -64,7 +64,7 @@ var __asyncGenerator$2 = (__this, __arguments, generator) => {
64
64
  } catch (e) {
65
65
  no(e);
66
66
  }
67
- }, method = (k) => it[k] = (x) => new Promise((yes, no) => resume(k, x, yes, no)), it = {};
67
+ }, method = (k, call, wait, clear) => it[k] = (x) => (call = new Promise((yes, no, run) => (run = () => resume(k, x, yes, no), q ? q.then(run) : run())), clear = () => q === wait && (q = 0), q = wait = call.then(clear, clear), call), q, it = {};
68
68
  return generator = generator.apply(__this, __arguments), it[__knownSymbol$2("asyncIterator")] = () => it, method("next"), method("throw"), method("return"), it;
69
69
  };
70
70
  var __forAwait = (obj, it, method) => (it = obj[__knownSymbol$2("asyncIterator")]) ? it.call(obj) : (obj = obj[__knownSymbol$2("iterator")](), it = {}, method = (key, fn) => (fn = obj[key]) && (it[key] = (arg) => new Promise((yes, no, done) => (arg = fn.call(obj, arg), done = arg.done, Promise.resolve(arg.value).then((value) => yes({ value, done }), no)))), method("next"), method("return"), it);
@@ -215,7 +215,7 @@ var __defProp$1 = Object.defineProperty;
215
215
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
216
216
  var __hasOwnProp = Object.prototype.hasOwnProperty;
217
217
  var __propIsEnum = Object.prototype.propertyIsEnumerable;
218
- var __knownSymbol$1 = (name, symbol) => (symbol = Symbol[name]) ? symbol : Symbol.for("Symbol." + name);
218
+ var __knownSymbol$1 = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
219
219
  var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
220
220
  var __spreadValues = (a, b) => {
221
221
  for (var prop in b || (b = {}))
@@ -241,7 +241,7 @@ var __asyncGenerator$1 = (__this, __arguments, generator) => {
241
241
  } catch (e) {
242
242
  no(e);
243
243
  }
244
- }, method = (k) => it[k] = (x) => new Promise((yes, no) => resume(k, x, yes, no)), it = {};
244
+ }, method = (k, call, wait, clear) => it[k] = (x) => (call = new Promise((yes, no, run) => (run = () => resume(k, x, yes, no), q ? q.then(run) : run())), clear = () => q === wait && (q = 0), q = wait = call.then(clear, clear), call), q, it = {};
245
245
  return generator = generator.apply(__this, __arguments), it[__knownSymbol$1("asyncIterator")] = () => it, method("next"), method("throw"), method("return"), it;
246
246
  };
247
247
  const _NgwProvider = class _NgwProvider extends BaseProvider {
@@ -389,7 +389,7 @@ __publicField$1(_NgwProvider, "limit", 300);
389
389
  let NgwProvider = _NgwProvider;
390
390
 
391
391
  var __defProp = Object.defineProperty;
392
- var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : Symbol.for("Symbol." + name);
392
+ var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
393
393
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
394
394
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
395
395
  var __await = function(promise, isYieldStar) {
@@ -404,13 +404,13 @@ var __asyncGenerator = (__this, __arguments, generator) => {
404
404
  } catch (e) {
405
405
  no(e);
406
406
  }
407
- }, method = (k) => it[k] = (x) => new Promise((yes, no) => resume(k, x, yes, no)), it = {};
407
+ }, method = (k, call, wait, clear) => it[k] = (x) => (call = new Promise((yes, no, run) => (run = () => resume(k, x, yes, no), q ? q.then(run) : run())), clear = () => q === wait && (q = 0), q = wait = call.then(clear, clear), call), q, it = {};
408
408
  return generator = generator.apply(__this, __arguments), it[__knownSymbol("asyncIterator")] = () => it, method("next"), method("throw"), method("return"), it;
409
409
  };
410
410
  class NominatimProvider extends BaseProvider {
411
411
  constructor(options) {
412
412
  super();
413
- this.options = options;
413
+ __publicField(this, "options", options);
414
414
  __publicField(this, "searchUrl", "https://nominatim.openstreetmap.org");
415
415
  __publicField(this, "_abortControllers", []);
416
416
  if (options && options.searchUrl) {
@@ -1 +1 @@
1
- {"version":3,"file":"geocoder.esm-bundler.js","sources":["../src/BaseGeocoder.ts","../src/Geocoder.ts","../src/providers/BaseProvider.ts","../src/providers/NgwProvider.ts","../src/providers/NominatimProvider.ts","../src/index.ts"],"sourcesContent":["import { objectAssign } from '@nextgis/utils';\n\nimport type { LngLatArray } from '@nextgis/utils';\n\nimport type { SearchItem } from './types/SearchItem';\n\n/**\n * Represents the base class for a geocoder.\n * This abstract class provides the basic methods that every geocoder should implement.\n *\n * @template O - The type of options that can be passed to the geocoder.\n */\nexport abstract class BaseGeocoder<\n O extends Record<string, any> = Record<string, any>,\n> {\n constructor(options?: O) {\n if (options) {\n objectAssign(this, options);\n }\n }\n\n /**\n * Search method to retrieve geocoding results.\n *\n * @abstract\n * @param query - The search string to geocode.\n * @yields An async generator that yields search results.\n */\n abstract search(query: string): AsyncGenerator<SearchItem>;\n\n /**\n * Method to retrieve detailed result for a specific search item.\n *\n * @abstract\n * @param item - The search item to get detailed result for.\n * @returns A promise that resolves to the detailed result.\n */\n abstract result(item: SearchItem): Promise<any>;\n\n /**\n * Method for reverse geocoding.\n * Takes coordinates and returns the corresponding address or location information.\n *\n * @abstract\n * @param coordinates - The longitude and latitude values.\n * @returns An async generator that yields reverse geocoding results.\n */\n abstract reverse(coordinates: LngLatArray): AsyncGenerator<SearchItem>;\n\n /**\n * Optional method to abort any ongoing geocoding requests.\n *\n * @abstract\n */\n abstract abort?(): void;\n}\n","import { BaseGeocoder } from './BaseGeocoder';\n\nimport type { LngLatArray } from '@nextgis/utils';\n\nimport type { BaseProvider } from './providers/BaseProvider';\nimport type { SearchItem } from './types/SearchItem';\nimport type { GeocoderOptions } from './GeocoderOptions';\n\nlet ID = 0;\n\nexport class Geocoder extends BaseGeocoder<GeocoderOptions> {\n providers: BaseProvider[] = [];\n\n constructor(options: GeocoderOptions) {\n super(options);\n if (options && options.providers) {\n this.providers = options.providers;\n }\n }\n\n abort(): void {\n this.providers.forEach((x) => {\n if (x.abort) {\n x.abort();\n }\n });\n }\n\n async *search(query: string): AsyncGenerator<SearchItem, void, unknown> {\n this.abort();\n let allProvidersFailed = true;\n const errors: Error[] = [];\n\n for (const provider of this.providers) {\n try {\n const results = provider.search(query);\n\n for await (const r of results) {\n allProvidersFailed = false;\n yield { ...r, provider, _id: ID++ };\n }\n } catch (err) {\n const er = err as Error;\n if (er.name !== 'AbortError') {\n errors.push(er);\n }\n }\n }\n\n if (allProvidersFailed && errors.length) {\n throw new Error(\n `All providers failed: ${errors.map((e) => e.message).join('; ')}`,\n );\n }\n }\n\n result(item: SearchItem): Promise<any> {\n if (item.provider) {\n return item.provider.result(item);\n }\n return Promise.resolve(undefined);\n }\n\n async *reverse(\n coordinates: LngLatArray,\n ): AsyncGenerator<SearchItem, void, unknown> {\n for (const provider of this.providers) {\n if (!provider.reverse) {\n continue;\n }\n\n try {\n const results = provider.reverse(coordinates);\n\n for await (const r of results) {\n yield { ...r, provider, _id: ID++ };\n }\n } catch {\n // ignore\n }\n }\n }\n\n /**\n * Returns the first reverse geocoding result for given coordinates from any provider.\n *\n * @param coordinates - The longitude and latitude values.\n * @returns A promise that resolves to the first reverse geocoding result, or undefined if no results are found.\n */\n async reverseGeocodeFirstResult(\n coordinates: LngLatArray,\n ): Promise<SearchItem | undefined> {\n for (const provider of this.providers) {\n if (typeof provider.reverse === 'function') {\n try {\n for await (const result of provider.reverse(coordinates)) {\n return result;\n }\n } catch (error) {\n console.error('Error in reverse geocoding:', error);\n }\n }\n }\n return undefined;\n }\n}\n","import { BaseGeocoder } from '../BaseGeocoder';\n\nimport type { BaseProviderOptions } from './BaseProviderOptions';\n\n/**\n * Abstract base class representing a search provider.\n * It builds upon the BaseGeocoder functionalities with provider-specific properties.\n * @template O - Options type which extends BaseProviderOptions.\n */\nexport abstract class BaseProvider<\n O extends BaseProviderOptions = BaseProviderOptions,\n> extends BaseGeocoder<O> {\n /**\n * URL endpoint for the search service.\n * This is where queries will be sent to obtain search results.\n */\n searchUrl?: string;\n\n /**\n * Label to represent the provider.\n * Useful for user interfaces to display the source of search results.\n */\n label?: string;\n}\n","import NgwConnector from '@nextgis/ngw-connector';\nimport { fetchNgwLayerItems } from '@nextgis/ngw-kit';\n\nimport { BaseProvider } from './BaseProvider';\n\nimport type { FeatureItem, NgwConnectorOptions } from '@nextgis/ngw-connector';\nimport type { FetchNgwItemsOptions } from '@nextgis/ngw-kit';\nimport type { LngLatArray } from '@nextgis/utils';\nimport type { CompositeRead } from '@nextgisweb/resource/type/api';\n\nimport type { ResultItem } from '../types/ResultItem';\nimport type { SearchItem } from '../types/SearchItem';\n\nimport type { BaseProviderOptions } from './BaseProviderOptions';\n\n/**\n * Extends the basic search item with NGW-specific properties.\n */\ninterface NgwSearchItem extends SearchItem {\n /** ID of the NGW resource */\n resourceId: number;\n /** ID of the feature in the NGW resource */\n featureId: number;\n /** The specific feature item from NGW */\n item: FeatureItem;\n /** The NGW resource item */\n resourceItem: CompositeRead;\n}\n\n/**\n * Defines the structure for a rendered search item.\n */\ninterface RenderSearchItem {\n /** The specific feature item */\n item: FeatureItem;\n /** The NGW resource item */\n resourceItem: CompositeRead;\n}\n\n/**\n * Options for searching within a NGW resource.\n */\ninterface SearchResource extends FetchNgwItemsOptions {\n /** The search method used ('ilike' is case-insensitive) */\n searchMethod?: 'ilike' | 'like';\n /** Custom rendering function for search results */\n renderSearch?: (item: RenderSearchItem) => string | HTMLElement;\n}\n\n/**\n * Options required to initialize an NGW provider.\n */\ninterface NgwProviderOptions extends BaseProviderOptions {\n /** Connector instance for NGW. If not provided, will be created internally */\n connector?: NgwConnector;\n /** List of NGW resources to search within */\n searchResources: SearchResource[];\n /** Options for the internal NgwConnector (if one needs to be created) */\n connectorOptions?: NgwConnectorOptions;\n}\n\nexport class NgwProvider extends BaseProvider<NgwProviderOptions> {\n static limit = 300;\n\n searchResources: SearchResource[] = [];\n\n private connector: NgwConnector;\n private _abortControllers: AbortController[] = [];\n\n constructor(options: NgwProviderOptions) {\n super(options);\n if (!options.searchUrl && !options.connectorOptions?.baseUrl) {\n throw new Error(\n 'The `searchUrl` of `connectorOptions.baseUrl` are required',\n );\n }\n\n this.connector =\n options.connector ||\n new NgwConnector({\n baseUrl: this.searchUrl,\n ...options.connectorOptions,\n });\n this.searchResources = options.searchResources;\n }\n\n abort(): void {\n this._abortControllers.forEach((a) => {\n a.abort();\n });\n this._abortControllers.length = 0;\n }\n\n async *search(query: string): AsyncGenerator<NgwSearchItem, void, unknown> {\n const signal = this._makeSignal();\n for (const config of this.searchResources) {\n if (signal.aborted) {\n break;\n }\n const { searchMethod } = config;\n\n const limit = config.limit ?? NgwProvider.limit;\n //\n const resourceId = (config as any).id ?? config.resourceId;\n\n try {\n const resource = await this.connector.getResourceOrFail(resourceId, {\n cache: true,\n });\n\n const options: FetchNgwItemsOptions = {\n connector: this.connector,\n resourceId,\n signal,\n limit,\n };\n\n if (searchMethod === 'like') {\n options.like = query;\n } else {\n options.ilike = query;\n }\n\n const request = fetchNgwLayerItems(options);\n\n const entries = await request;\n\n for (const item of this._items({\n entries,\n query,\n config,\n resourceItem: resource,\n })) {\n item.result = () => this.result(item);\n yield item;\n }\n } catch (er) {\n if (\n er &&\n 'name' in (er as Error) &&\n (er as Error).name !== 'AbortError'\n ) {\n console.warn(er);\n }\n }\n }\n }\n\n result(item: NgwSearchItem): Promise<ResultItem> {\n const signal = this._makeSignal();\n const req = this.connector\n .route('feature_layer.feature.item_extent', {\n id: item.resourceId,\n fid: item.featureId,\n })\n .get({ signal })\n .then((x) => {\n const e = x.extent || {\n minLon: 0,\n minLat: 0,\n maxLon: 0,\n maxLat: 0,\n };\n return {\n text: item.text,\n extent: [e.minLon, e.minLat, e.maxLon, e.maxLat],\n };\n });\n return req;\n }\n\n async *reverse(\n coordinates: LngLatArray,\n ): AsyncGenerator<SearchItem, void, unknown> {\n throw new Error('Not implemented');\n yield undefined as any;\n }\n\n private _makeSignal() {\n const abortController = new AbortController();\n this._abortControllers.push(abortController);\n return abortController.signal;\n }\n\n private _items({\n entries,\n query,\n config,\n resourceItem,\n }: {\n config: SearchResource;\n entries: FeatureItem[];\n query: string;\n resourceItem: CompositeRead;\n }): NgwSearchItem[] {\n const items: NgwSearchItem[] = [];\n\n let labelField: string | undefined = undefined;\n\n if (resourceItem.feature_layer) {\n labelField = resourceItem.feature_layer.fields.find(\n (f) => f.label_field,\n )?.keyname;\n }\n\n const meta = this.searchResources.find(\n (x) => (x as any).id ?? x.resourceId === resourceItem.resource.id,\n );\n if (meta) {\n entries.forEach((entry) => {\n let text = labelField ? entry.fields[labelField] : entry.id;\n if (config.renderSearch) {\n text = config.renderSearch({\n item: entry,\n resourceItem,\n });\n } else if (labelField) {\n text = entry.fields[labelField];\n }\n\n items.push({\n query: query,\n text,\n featureId: entry.id,\n resourceId: resourceItem.resource.id,\n item: entry,\n resourceItem,\n });\n });\n }\n return items;\n }\n}\n","import { fixUrlStr } from '@nextgis/utils';\n\nimport { BaseProvider } from './BaseProvider';\n\nimport type { LngLatArray } from '@nextgis/utils';\nimport type { FeatureCollection } from 'geojson';\n\nimport type { ResultItem } from '../types/ResultItem';\nimport type { SearchItem } from '../types/SearchItem';\n\nimport type { BaseProviderOptions } from './BaseProviderOptions';\n\n/**\n * Nominatim based options {@link https://nominatim.org/release-docs/latest/api/Search}\n */\nexport interface NominatimProviderOptions extends BaseProviderOptions {\n /** Browser language string */\n language?: string;\n /** Comma-separated list of country codes {}*/\n countrycodes?: string;\n /** Limit the number of search results */\n limit?: number;\n /** Include address details in the results */\n addressdetails?: boolean;\n /** Restrict the results to the specified viewbox */\n bounded?: boolean;\n /** Focuses the search on the given area [minLon, minLat, maxLon, maxLat] */\n viewbox?: [number, number, number, number];\n}\n\nexport class NominatimProvider\n extends BaseProvider<NominatimProviderOptions>\n implements NominatimProviderOptions\n{\n searchUrl = 'https://nominatim.openstreetmap.org';\n private _abortControllers: AbortController[] = [];\n\n constructor(public options?: NominatimProviderOptions) {\n super();\n if (options && options.searchUrl) {\n this.searchUrl = options.searchUrl;\n }\n }\n\n abort(): void {\n this._abortControllers.forEach((controller) => {\n controller.abort();\n });\n this._abortControllers = [];\n }\n\n async *search(val: string): AsyncGenerator<SearchItem, void, unknown> {\n const params = new URLSearchParams({\n format: 'geojson',\n polygon_geojson: '1',\n q: val,\n limit: this.options?.limit?.toString() || '10',\n });\n\n if (this.options?.countrycodes) {\n params.append('countrycodes', this.options.countrycodes);\n }\n if (this.options?.addressdetails) {\n params.append('addressdetails', '1');\n }\n if (this.options?.language) {\n params.append('accept-language', this.options.language);\n }\n if (this.options?.bounded) {\n params.append('bounded', '1');\n }\n if (this.options?.viewbox) {\n const [minLon, minLat, maxLon, maxLat] = this.options.viewbox;\n params.append('viewbox', `${minLon},${minLat},${maxLon},${maxLat}`);\n }\n\n const url = fixUrlStr(`${this.searchUrl}/search?${params.toString()}`);\n const controller = new AbortController();\n this._abortControllers.push(controller);\n\n try {\n const response = await fetch(url, { signal: controller.signal });\n if (!response.ok) {\n throw new Error(`Network response was not ok: ${response.statusText}`);\n }\n const geojson = (await response.json()) as FeatureCollection;\n const features: SearchItem[] = geojson.features.map((x) => {\n return {\n geom: x,\n extent: x.bbox,\n text: x.properties && x.properties.display_name,\n query: val,\n };\n });\n\n for (const item of features) {\n item.result = () => this.result(item);\n yield item;\n }\n } catch (error) {\n if ((error as Error).name === 'AbortError') {\n // ignore\n } else {\n throw error;\n }\n }\n }\n\n result(model: SearchItem): Promise<ResultItem> {\n return Promise.resolve({\n text: model.text,\n extent: model.extent || [],\n geom: model.geom,\n });\n }\n\n async *reverse(\n coordinates: LngLatArray,\n ): AsyncGenerator<SearchItem, void, unknown> {\n const [lng, lat] = coordinates;\n const params = new URLSearchParams({\n format: 'geojson',\n lat: lat.toString(),\n lon: lng.toString(),\n });\n\n if (this.options?.addressdetails) {\n params.append('addressdetails', '1');\n }\n if (this.options?.language) {\n params.append('accept-language', this.options.language);\n }\n\n const url = fixUrlStr(`${this.searchUrl}/reverse?${params.toString()}`);\n const controller = new AbortController();\n this._abortControllers.push(controller);\n\n try {\n const response = await fetch(url, { signal: controller.signal });\n if (!response.ok) {\n throw new Error(`Network response was not ok: ${response.statusText}`);\n }\n const geojson = (await response.json()) as FeatureCollection;\n const feature = geojson.features[0];\n const item: SearchItem = {\n geom: feature,\n extent: feature.bbox,\n text: feature.properties && feature.properties.display_name,\n query: `${lat}, ${lng}`,\n };\n\n item.result = () => this.result(item);\n yield item;\n } catch (error) {\n if ((error as Error).name === 'AbortError') {\n // ignore\n } else {\n throw error;\n }\n }\n }\n}\n","import { Geocoder } from './Geocoder';\n\nimport type { GeocoderOptions } from './GeocoderOptions';\n\nexport { Geocoder, GeocoderOptions };\nexport { BaseProvider } from './providers/BaseProvider';\nexport * from './providers/BaseProviderOptions';\nexport { NgwProvider } from './providers/NgwProvider';\nexport { NominatimProvider } from './providers/NominatimProvider';\nexport * from './types/ResultItem';\nexport * from './types/SearchItem';\n\nexport function create(options: GeocoderOptions): Geocoder {\n return new Geocoder(options);\n}\n"],"names":["__publicField","__asyncGenerator","__await","__spreadValues","error","_a"],"mappings":"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"}
1
+ {"version":3,"file":"geocoder.esm-bundler.js","sources":["../src/BaseGeocoder.ts","../src/Geocoder.ts","../src/providers/BaseProvider.ts","../src/providers/NgwProvider.ts","../src/providers/NominatimProvider.ts","../src/index.ts"],"sourcesContent":["import { objectAssign } from '@nextgis/utils';\n\nimport type { LngLatArray } from '@nextgis/utils';\n\nimport type { SearchItem } from './types/SearchItem';\n\n/**\n * Represents the base class for a geocoder.\n * This abstract class provides the basic methods that every geocoder should implement.\n *\n * @template O - The type of options that can be passed to the geocoder.\n */\nexport abstract class BaseGeocoder<\n O extends Record<string, any> = Record<string, any>,\n> {\n constructor(options?: O) {\n if (options) {\n objectAssign(this, options);\n }\n }\n\n /**\n * Search method to retrieve geocoding results.\n *\n * @abstract\n * @param query - The search string to geocode.\n * @yields An async generator that yields search results.\n */\n abstract search(query: string): AsyncGenerator<SearchItem>;\n\n /**\n * Method to retrieve detailed result for a specific search item.\n *\n * @abstract\n * @param item - The search item to get detailed result for.\n * @returns A promise that resolves to the detailed result.\n */\n abstract result(item: SearchItem): Promise<any>;\n\n /**\n * Method for reverse geocoding.\n * Takes coordinates and returns the corresponding address or location information.\n *\n * @abstract\n * @param coordinates - The longitude and latitude values.\n * @returns An async generator that yields reverse geocoding results.\n */\n abstract reverse(coordinates: LngLatArray): AsyncGenerator<SearchItem>;\n\n /**\n * Optional method to abort any ongoing geocoding requests.\n *\n * @abstract\n */\n abstract abort?(): void;\n}\n","import { BaseGeocoder } from './BaseGeocoder';\n\nimport type { LngLatArray } from '@nextgis/utils';\n\nimport type { BaseProvider } from './providers/BaseProvider';\nimport type { SearchItem } from './types/SearchItem';\nimport type { GeocoderOptions } from './GeocoderOptions';\n\nlet ID = 0;\n\nexport class Geocoder extends BaseGeocoder<GeocoderOptions> {\n providers: BaseProvider[] = [];\n\n constructor(options: GeocoderOptions) {\n super(options);\n if (options && options.providers) {\n this.providers = options.providers;\n }\n }\n\n abort(): void {\n this.providers.forEach((x) => {\n if (x.abort) {\n x.abort();\n }\n });\n }\n\n async *search(query: string): AsyncGenerator<SearchItem, void, unknown> {\n this.abort();\n let allProvidersFailed = true;\n const errors: Error[] = [];\n\n for (const provider of this.providers) {\n try {\n const results = provider.search(query);\n\n for await (const r of results) {\n allProvidersFailed = false;\n yield { ...r, provider, _id: ID++ };\n }\n } catch (err) {\n const er = err as Error;\n if (er.name !== 'AbortError') {\n errors.push(er);\n }\n }\n }\n\n if (allProvidersFailed && errors.length) {\n throw new Error(\n `All providers failed: ${errors.map((e) => e.message).join('; ')}`,\n );\n }\n }\n\n result(item: SearchItem): Promise<any> {\n if (item.provider) {\n return item.provider.result(item);\n }\n return Promise.resolve(undefined);\n }\n\n async *reverse(\n coordinates: LngLatArray,\n ): AsyncGenerator<SearchItem, void, unknown> {\n for (const provider of this.providers) {\n if (!provider.reverse) {\n continue;\n }\n\n try {\n const results = provider.reverse(coordinates);\n\n for await (const r of results) {\n yield { ...r, provider, _id: ID++ };\n }\n } catch {\n // ignore\n }\n }\n }\n\n /**\n * Returns the first reverse geocoding result for given coordinates from any provider.\n *\n * @param coordinates - The longitude and latitude values.\n * @returns A promise that resolves to the first reverse geocoding result, or undefined if no results are found.\n */\n async reverseGeocodeFirstResult(\n coordinates: LngLatArray,\n ): Promise<SearchItem | undefined> {\n for (const provider of this.providers) {\n if (typeof provider.reverse === 'function') {\n try {\n for await (const result of provider.reverse(coordinates)) {\n return result;\n }\n } catch (error) {\n console.error('Error in reverse geocoding:', error);\n }\n }\n }\n return undefined;\n }\n}\n","import { BaseGeocoder } from '../BaseGeocoder';\n\nimport type { BaseProviderOptions } from './BaseProviderOptions';\n\n/**\n * Abstract base class representing a search provider.\n * It builds upon the BaseGeocoder functionalities with provider-specific properties.\n * @template O - Options type which extends BaseProviderOptions.\n */\nexport abstract class BaseProvider<\n O extends BaseProviderOptions = BaseProviderOptions,\n> extends BaseGeocoder<O> {\n /**\n * URL endpoint for the search service.\n * This is where queries will be sent to obtain search results.\n */\n searchUrl?: string;\n\n /**\n * Label to represent the provider.\n * Useful for user interfaces to display the source of search results.\n */\n label?: string;\n}\n","import NgwConnector from '@nextgis/ngw-connector';\nimport { fetchNgwLayerItems } from '@nextgis/ngw-kit';\n\nimport { BaseProvider } from './BaseProvider';\n\nimport type { FeatureItem, NgwConnectorOptions } from '@nextgis/ngw-connector';\nimport type { FetchNgwItemsOptions } from '@nextgis/ngw-kit';\nimport type { LngLatArray } from '@nextgis/utils';\nimport type { CompositeRead } from '@nextgisweb/resource/type/api';\n\nimport type { ResultItem } from '../types/ResultItem';\nimport type { SearchItem } from '../types/SearchItem';\n\nimport type { BaseProviderOptions } from './BaseProviderOptions';\n\n/**\n * Extends the basic search item with NGW-specific properties.\n */\ninterface NgwSearchItem extends SearchItem {\n /** ID of the NGW resource */\n resourceId: number;\n /** ID of the feature in the NGW resource */\n featureId: number;\n /** The specific feature item from NGW */\n item: FeatureItem;\n /** The NGW resource item */\n resourceItem: CompositeRead;\n}\n\n/**\n * Defines the structure for a rendered search item.\n */\ninterface RenderSearchItem {\n /** The specific feature item */\n item: FeatureItem;\n /** The NGW resource item */\n resourceItem: CompositeRead;\n}\n\n/**\n * Options for searching within a NGW resource.\n */\ninterface SearchResource extends FetchNgwItemsOptions {\n /** The search method used ('ilike' is case-insensitive) */\n searchMethod?: 'ilike' | 'like';\n /** Custom rendering function for search results */\n renderSearch?: (item: RenderSearchItem) => string | HTMLElement;\n}\n\n/**\n * Options required to initialize an NGW provider.\n */\ninterface NgwProviderOptions extends BaseProviderOptions {\n /** Connector instance for NGW. If not provided, will be created internally */\n connector?: NgwConnector;\n /** List of NGW resources to search within */\n searchResources: SearchResource[];\n /** Options for the internal NgwConnector (if one needs to be created) */\n connectorOptions?: NgwConnectorOptions;\n}\n\nexport class NgwProvider extends BaseProvider<NgwProviderOptions> {\n static limit = 300;\n\n searchResources: SearchResource[] = [];\n\n private connector: NgwConnector;\n private _abortControllers: AbortController[] = [];\n\n constructor(options: NgwProviderOptions) {\n super(options);\n if (!options.searchUrl && !options.connectorOptions?.baseUrl) {\n throw new Error(\n 'The `searchUrl` of `connectorOptions.baseUrl` are required',\n );\n }\n\n this.connector =\n options.connector ||\n new NgwConnector({\n baseUrl: this.searchUrl,\n ...options.connectorOptions,\n });\n this.searchResources = options.searchResources;\n }\n\n abort(): void {\n this._abortControllers.forEach((a) => {\n a.abort();\n });\n this._abortControllers.length = 0;\n }\n\n async *search(query: string): AsyncGenerator<NgwSearchItem, void, unknown> {\n const signal = this._makeSignal();\n for (const config of this.searchResources) {\n if (signal.aborted) {\n break;\n }\n const { searchMethod } = config;\n\n const limit = config.limit ?? NgwProvider.limit;\n //\n const resourceId = (config as any).id ?? config.resourceId;\n\n try {\n const resource = await this.connector.getResourceOrFail(resourceId, {\n cache: true,\n });\n\n const options: FetchNgwItemsOptions = {\n connector: this.connector,\n resourceId,\n signal,\n limit,\n };\n\n if (searchMethod === 'like') {\n options.like = query;\n } else {\n options.ilike = query;\n }\n\n const request = fetchNgwLayerItems(options);\n\n const entries = await request;\n\n for (const item of this._items({\n entries,\n query,\n config,\n resourceItem: resource,\n })) {\n item.result = () => this.result(item);\n yield item;\n }\n } catch (er) {\n if (\n er &&\n 'name' in (er as Error) &&\n (er as Error).name !== 'AbortError'\n ) {\n console.warn(er);\n }\n }\n }\n }\n\n result(item: NgwSearchItem): Promise<ResultItem> {\n const signal = this._makeSignal();\n const req = this.connector\n .route('feature_layer.feature.item_extent', {\n id: item.resourceId,\n fid: item.featureId,\n })\n .get({ signal })\n .then((x) => {\n const e = x.extent || {\n minLon: 0,\n minLat: 0,\n maxLon: 0,\n maxLat: 0,\n };\n return {\n text: item.text,\n extent: [e.minLon, e.minLat, e.maxLon, e.maxLat],\n };\n });\n return req;\n }\n\n async *reverse(\n coordinates: LngLatArray,\n ): AsyncGenerator<SearchItem, void, unknown> {\n throw new Error('Not implemented');\n yield undefined as any;\n }\n\n private _makeSignal() {\n const abortController = new AbortController();\n this._abortControllers.push(abortController);\n return abortController.signal;\n }\n\n private _items({\n entries,\n query,\n config,\n resourceItem,\n }: {\n config: SearchResource;\n entries: FeatureItem[];\n query: string;\n resourceItem: CompositeRead;\n }): NgwSearchItem[] {\n const items: NgwSearchItem[] = [];\n\n let labelField: string | undefined = undefined;\n\n if (resourceItem.feature_layer) {\n labelField = resourceItem.feature_layer.fields.find(\n (f) => f.label_field,\n )?.keyname;\n }\n\n const meta = this.searchResources.find(\n (x) => (x as any).id ?? x.resourceId === resourceItem.resource.id,\n );\n if (meta) {\n entries.forEach((entry) => {\n let text = labelField ? entry.fields[labelField] : entry.id;\n if (config.renderSearch) {\n text = config.renderSearch({\n item: entry,\n resourceItem,\n });\n } else if (labelField) {\n text = entry.fields[labelField];\n }\n\n items.push({\n query: query,\n text,\n featureId: entry.id,\n resourceId: resourceItem.resource.id,\n item: entry,\n resourceItem,\n });\n });\n }\n return items;\n }\n}\n","import { fixUrlStr } from '@nextgis/utils';\n\nimport { BaseProvider } from './BaseProvider';\n\nimport type { LngLatArray } from '@nextgis/utils';\nimport type { FeatureCollection } from 'geojson';\n\nimport type { ResultItem } from '../types/ResultItem';\nimport type { SearchItem } from '../types/SearchItem';\n\nimport type { BaseProviderOptions } from './BaseProviderOptions';\n\n/**\n * Nominatim based options {@link https://nominatim.org/release-docs/latest/api/Search}\n */\nexport interface NominatimProviderOptions extends BaseProviderOptions {\n /** Browser language string */\n language?: string;\n /** Comma-separated list of country codes {}*/\n countrycodes?: string;\n /** Limit the number of search results */\n limit?: number;\n /** Include address details in the results */\n addressdetails?: boolean;\n /** Restrict the results to the specified viewbox */\n bounded?: boolean;\n /** Focuses the search on the given area [minLon, minLat, maxLon, maxLat] */\n viewbox?: [number, number, number, number];\n}\n\nexport class NominatimProvider\n extends BaseProvider<NominatimProviderOptions>\n implements NominatimProviderOptions\n{\n searchUrl = 'https://nominatim.openstreetmap.org';\n private _abortControllers: AbortController[] = [];\n\n constructor(public options?: NominatimProviderOptions) {\n super();\n if (options && options.searchUrl) {\n this.searchUrl = options.searchUrl;\n }\n }\n\n abort(): void {\n this._abortControllers.forEach((controller) => {\n controller.abort();\n });\n this._abortControllers = [];\n }\n\n async *search(val: string): AsyncGenerator<SearchItem, void, unknown> {\n const params = new URLSearchParams({\n format: 'geojson',\n polygon_geojson: '1',\n q: val,\n limit: this.options?.limit?.toString() || '10',\n });\n\n if (this.options?.countrycodes) {\n params.append('countrycodes', this.options.countrycodes);\n }\n if (this.options?.addressdetails) {\n params.append('addressdetails', '1');\n }\n if (this.options?.language) {\n params.append('accept-language', this.options.language);\n }\n if (this.options?.bounded) {\n params.append('bounded', '1');\n }\n if (this.options?.viewbox) {\n const [minLon, minLat, maxLon, maxLat] = this.options.viewbox;\n params.append('viewbox', `${minLon},${minLat},${maxLon},${maxLat}`);\n }\n\n const url = fixUrlStr(`${this.searchUrl}/search?${params.toString()}`);\n const controller = new AbortController();\n this._abortControllers.push(controller);\n\n try {\n const response = await fetch(url, { signal: controller.signal });\n if (!response.ok) {\n throw new Error(`Network response was not ok: ${response.statusText}`);\n }\n const geojson = (await response.json()) as FeatureCollection;\n const features: SearchItem[] = geojson.features.map((x) => {\n return {\n geom: x,\n extent: x.bbox,\n text: x.properties && x.properties.display_name,\n query: val,\n };\n });\n\n for (const item of features) {\n item.result = () => this.result(item);\n yield item;\n }\n } catch (error) {\n if ((error as Error).name === 'AbortError') {\n // ignore\n } else {\n throw error;\n }\n }\n }\n\n result(model: SearchItem): Promise<ResultItem> {\n return Promise.resolve({\n text: model.text,\n extent: model.extent || [],\n geom: model.geom,\n });\n }\n\n async *reverse(\n coordinates: LngLatArray,\n ): AsyncGenerator<SearchItem, void, unknown> {\n const [lng, lat] = coordinates;\n const params = new URLSearchParams({\n format: 'geojson',\n lat: lat.toString(),\n lon: lng.toString(),\n });\n\n if (this.options?.addressdetails) {\n params.append('addressdetails', '1');\n }\n if (this.options?.language) {\n params.append('accept-language', this.options.language);\n }\n\n const url = fixUrlStr(`${this.searchUrl}/reverse?${params.toString()}`);\n const controller = new AbortController();\n this._abortControllers.push(controller);\n\n try {\n const response = await fetch(url, { signal: controller.signal });\n if (!response.ok) {\n throw new Error(`Network response was not ok: ${response.statusText}`);\n }\n const geojson = (await response.json()) as FeatureCollection;\n const feature = geojson.features[0];\n const item: SearchItem = {\n geom: feature,\n extent: feature.bbox,\n text: feature.properties && feature.properties.display_name,\n query: `${lat}, ${lng}`,\n };\n\n item.result = () => this.result(item);\n yield item;\n } catch (error) {\n if ((error as Error).name === 'AbortError') {\n // ignore\n } else {\n throw error;\n }\n }\n }\n}\n","import { Geocoder } from './Geocoder';\n\nimport type { GeocoderOptions } from './GeocoderOptions';\n\nexport { Geocoder, GeocoderOptions };\nexport { BaseProvider } from './providers/BaseProvider';\nexport * from './providers/BaseProviderOptions';\nexport { NgwProvider } from './providers/NgwProvider';\nexport { NominatimProvider } from './providers/NominatimProvider';\nexport * from './types/ResultItem';\nexport * from './types/SearchItem';\n\nexport function create(options: GeocoderOptions): Geocoder {\n return new Geocoder(options);\n}\n"],"names":["__publicField","__asyncGenerator","__await","__spreadValues","error","_a"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{objectAssign as e,fixUrlStr as r}from"@nextgis/utils";import t from"@nextgis/ngw-connector";import{fetchNgwLayerItems as o}from"@nextgis/ngw-kit";class n{constructor(r){r&&e(this,r)}}var s=Object.defineProperty,i=Object.defineProperties,l=Object.getOwnPropertyDescriptors,a=Object.getOwnPropertySymbols,c=Object.prototype.hasOwnProperty,u=Object.prototype.propertyIsEnumerable,h=(e,r)=>(r=Symbol[e])?r:Symbol.for("Symbol."+e),d=(e,r,t)=>r in e?s(e,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[r]=t,p=(e,r)=>{for(var t in r||(r={}))c.call(r,t)&&d(e,t,r[t]);if(a)for(var t of a(r))u.call(r,t)&&d(e,t,r[t]);return e},f=(e,r)=>i(e,l(r)),y=function(e,r){this[0]=e,this[1]=r},v=(e,r,t)=>{var o=(e,r,n,s)=>{try{var i=t[e](r),l=(r=i.value)instanceof y,a=i.done;Promise.resolve(l?r[0]:r).then(t=>l?o("return"===e?e:"next",r[1]?{done:t.done,value:t.value}:t,n,s):n({value:t,done:a})).catch(e=>o("throw",e,n,s))}catch(c){s(c)}},n=e=>s[e]=r=>new Promise((t,n)=>o(e,r,t,n)),s={};return t=t.apply(e,r),s[h("asyncIterator")]=()=>s,n("next"),n("throw"),n("return"),s},m=(e,r,t)=>(r=e[h("asyncIterator")])?r.call(e):(e=e[h("iterator")](),r={},(t=(t,o)=>(o=e[t])&&(r[t]=r=>new Promise((t,n,s)=>(r=o.call(e,r),s=r.done,Promise.resolve(r.value).then(e=>t({value:e,done:s}),n)))))("next"),t("return"),r);let b=0;class w extends n{constructor(e){super(e),d(this,"providers"+"",[]),e&&e.providers&&(this.providers=e.providers)}abort(){this.providers.forEach(e=>{e.abort&&e.abort()})}search(e){return v(this,null,function*(){this.abort();let r=!0;const t=[];for(const a of this.providers)try{const t=a.search(e);try{for(var o,n,s,i=m(t);o=!(n=yield new y(i.next())).done;o=!1){const e=n.value;r=!1,yield f(p({},e),{provider:a,_id:b++})}}catch(n){s=[n]}finally{try{o&&(n=i.return)&&(yield new y(n.call(i)))}finally{if(s)throw s[0]}}}catch(l){"AbortError"!==l.name&&t.push(l)}if(r&&t.length)throw new Error(`All providers failed: ${t.map(e=>e.message).join("; ")}`)})}result(e){return e.provider?e.provider.result(e):Promise.resolve(void 0)}reverse(e){return v(this,null,function*(){for(const i of this.providers)if(i.reverse)try{const s=i.reverse(e);try{for(var r,t,o,n=m(s);r=!(t=yield new y(n.next())).done;r=!1){const e=t.value;yield f(p({},e),{provider:i,_id:b++})}}catch(t){o=[t]}finally{try{r&&(t=n.return)&&(yield new y(t.call(n)))}finally{if(o)throw o[0]}}}catch(s){}})}reverseGeocodeFirstResult(e){return r=this,t=null,o=function*(){for(const i of this.providers)if("function"==typeof i.reverse)try{try{for(var r,t,o,n=m(i.reverse(e));r=!(t=yield n.next()).done;r=!1)return t.value}catch(t){o=[t]}finally{try{r&&(t=n.return)&&(yield t.call(n))}finally{if(o)throw o[0]}}}catch(s){console.error("Error in reverse geocoding:",s)}},new Promise((e,n)=>{var s=e=>{try{l(o.next(e))}catch(r){n(r)}},i=e=>{try{l(o.throw(e))}catch(r){n(r)}},l=r=>r.done?e(r.value):Promise.resolve(r.value).then(s,i);l((o=o.apply(r,t)).next())});var r,t,o}}var g=Object.defineProperty,x=(e,r,t)=>((e,r,t)=>r in e?g(e,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[r]=t)(e,"symbol"!=typeof r?r+"":r,t);class P extends n{constructor(){super(...arguments),x(this,"searchUrl"),x(this,"label")}}var _=Object.defineProperty,S=Object.getOwnPropertySymbols,O=Object.prototype.hasOwnProperty,j=Object.prototype.propertyIsEnumerable,I=(e,r,t)=>r in e?_(e,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[r]=t,E=(e,r,t)=>I(e,"symbol"!=typeof r?r+"":r,t),k=function(e,r){this[0]=e,this[1]=r},U=(e,r,t)=>{var o,n,s=(e,r,o,n)=>{try{var i=t[e](r),l=(r=i.value)instanceof k,a=i.done;Promise.resolve(l?r[0]:r).then(t=>l?s("return"===e?e:"next",r[1]?{done:t.done,value:t.value}:t,o,n):o({value:t,done:a})).catch(e=>s("throw",e,o,n))}catch(c){n(c)}},i=e=>l[e]=r=>new Promise((t,o)=>s(e,r,t,o)),l={};return t=t.apply(e,r),l[(o="asyncIterator",(n=Symbol[o])?n:Symbol.for("Symbol."+o))]=()=>l,i("next"),i("throw"),i("return"),l};const $=class e extends P{constructor(e){var r;if(super(e),E(this,"searchResources",[]),E(this,"connector"),E(this,"_abortControllers",[]),!e.searchUrl&&!(null==(r=e.connectorOptions)?void 0:r.baseUrl))throw new Error("The `searchUrl` of `connectorOptions.baseUrl` are required");this.connector=e.connector||new t(((e,r)=>{for(var t in r||(r={}))O.call(r,t)&&I(e,t,r[t]);if(S)for(var t of S(r))j.call(r,t)&&I(e,t,r[t]);return e})({baseUrl:this.searchUrl},e.connectorOptions)),this.searchResources=e.searchResources}abort(){this._abortControllers.forEach(e=>{e.abort()}),this._abortControllers.length=0}search(r){return U(this,null,function*(){var t,n;const s=this._makeSignal();for(const l of this.searchResources){if(s.aborted)break;const{searchMethod:a}=l,c=null!=(t=l.limit)?t:e.limit,u=null!=(n=l.id)?n:l.resourceId;try{const e=yield new k(this.connector.getResourceOrFail(u,{cache:!0})),t={connector:this.connector,resourceId:u,signal:s,limit:c};"like"===a?t.like=r:t.ilike=r;const n=o(t),i=yield new k(n);for(const o of this._items({entries:i,query:r,config:l,resourceItem:e}))o.result=()=>this.result(o),yield o}catch(i){i&&"name"in i&&"AbortError"!==i.name&&console.warn(i)}}})}result(e){const r=this._makeSignal();return this.connector.route("feature_layer.feature.item_extent",{id:e.resourceId,fid:e.featureId}).get({signal:r}).then(r=>{const t=r.extent||{minLon:0,minLat:0,maxLon:0,maxLat:0};return{text:e.text,extent:[t.minLon,t.minLat,t.maxLon,t.maxLat]}})}reverse(e){return U(this,null,function*(){throw new Error("Not implemented")})}_makeSignal(){const e=new AbortController;return this._abortControllers.push(e),e.signal}_items({entries:e,query:r,config:t,resourceItem:o}){var n;const s=[];let i;o.feature_layer&&(i=null==(n=o.feature_layer.fields.find(e=>e.label_field))?void 0:n.keyname);return this.searchResources.find(e=>{var r;return null!=(r=e.id)?r:e.resourceId===o.resource.id})&&e.forEach(e=>{let n=i?e.fields[i]:e.id;t.renderSearch?n=t.renderSearch({item:e,resourceItem:o}):i&&(n=e.fields[i]),s.push({query:r,text:n,featureId:e.id,resourceId:o.resource.id,item:e,resourceItem:o})}),s}};E($,"limit",300);let C=$;var L=Object.defineProperty,R=(e,r,t)=>((e,r,t)=>r in e?L(e,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[r]=t)(e,"symbol"!=typeof r?r+"":r,t),A=function(e,r){this[0]=e,this[1]=r},q=(e,r,t)=>{var o,n,s=(e,r,o,n)=>{try{var i=t[e](r),l=(r=i.value)instanceof A,a=i.done;Promise.resolve(l?r[0]:r).then(t=>l?s("return"===e?e:"next",r[1]?{done:t.done,value:t.value}:t,o,n):o({value:t,done:a})).catch(e=>s("throw",e,o,n))}catch(c){n(c)}},i=e=>l[e]=r=>new Promise((t,o)=>s(e,r,t,o)),l={};return t=t.apply(e,r),l[(o="asyncIterator",(n=Symbol[o])?n:Symbol.for("Symbol."+o))]=()=>l,i("next"),i("throw"),i("return"),l};class N extends P{constructor(e){super(),this.options=e,R(this,"searchUrl","https://nominatim.openstreetmap.org"),R(this,"_abortControllers",[]),e&&e.searchUrl&&(this.searchUrl=e.searchUrl)}abort(){this._abortControllers.forEach(e=>{e.abort()}),this._abortControllers=[]}search(e){return q(this,null,function*(){var t,o,n,s,i,l,a;const c=new URLSearchParams({format:"geojson",polygon_geojson:"1",q:e,limit:(null==(o=null==(t=this.options)?void 0:t.limit)?void 0:o.toString())||"10"});if((null==(n=this.options)?void 0:n.countrycodes)&&c.append("countrycodes",this.options.countrycodes),(null==(s=this.options)?void 0:s.addressdetails)&&c.append("addressdetails","1"),(null==(i=this.options)?void 0:i.language)&&c.append("accept-language",this.options.language),(null==(l=this.options)?void 0:l.bounded)&&c.append("bounded","1"),null==(a=this.options)?void 0:a.viewbox){const[e,r,t,o]=this.options.viewbox;c.append("viewbox",`${e},${r},${t},${o}`)}const u=r(`${this.searchUrl}/search?${c.toString()}`),h=new AbortController;this._abortControllers.push(h);try{const r=yield new A(fetch(u,{signal:h.signal}));if(!r.ok)throw new Error(`Network response was not ok: ${r.statusText}`);const t=(yield new A(r.json())).features.map(r=>({geom:r,extent:r.bbox,text:r.properties&&r.properties.display_name,query:e}));for(const e of t)e.result=()=>this.result(e),yield e}catch(d){if("AbortError"!==d.name)throw d}})}result(e){return Promise.resolve({text:e.text,extent:e.extent||[],geom:e.geom})}reverse(e){return q(this,null,function*(){var t,o;const[n,s]=e,i=new URLSearchParams({format:"geojson",lat:s.toString(),lon:n.toString()});(null==(t=this.options)?void 0:t.addressdetails)&&i.append("addressdetails","1"),(null==(o=this.options)?void 0:o.language)&&i.append("accept-language",this.options.language);const l=r(`${this.searchUrl}/reverse?${i.toString()}`),a=new AbortController;this._abortControllers.push(a);try{const e=yield new A(fetch(l,{signal:a.signal}));if(!e.ok)throw new Error(`Network response was not ok: ${e.statusText}`);const r=(yield new A(e.json())).features[0],t={geom:r,extent:r.bbox,text:r.properties&&r.properties.display_name,query:`${s}, ${n}`};t.result=()=>this.result(t),yield t}catch(c){if("AbortError"!==c.name)throw c}})}}function T(e){return new w(e)}export{P as BaseProvider,w as Geocoder,C as NgwProvider,N as NominatimProvider,T as create};
1
+ import{objectAssign as e,fixUrlStr as r}from"@nextgis/utils";import t from"@nextgis/ngw-connector";import{fetchNgwLayerItems as o}from"@nextgis/ngw-kit";class n{constructor(r){r&&e(this,r)}}var s=Object.defineProperty,i=Object.defineProperties,l=Object.getOwnPropertyDescriptors,a=Object.getOwnPropertySymbols,c=Object.prototype.hasOwnProperty,u=Object.prototype.propertyIsEnumerable,h=(e,r)=>(r=Symbol[e])?r:Symbol.for("Symbol."+e),d=(e,r,t)=>r in e?s(e,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[r]=t,p=(e,r)=>{for(var t in r||(r={}))c.call(r,t)&&d(e,t,r[t]);if(a)for(var t of a(r))u.call(r,t)&&d(e,t,r[t]);return e},f=(e,r)=>i(e,l(r)),y=function(e,r){this[0]=e,this[1]=r},v=(e,r,t)=>{var o,n=(e,r,o,s)=>{try{var i=t[e](r),l=(r=i.value)instanceof y,a=i.done;Promise.resolve(l?r[0]:r).then(t=>l?n("return"===e?e:"next",r[1]?{done:t.done,value:t.value}:t,o,s):o({value:t,done:a})).catch(e=>n("throw",e,o,s))}catch(c){s(c)}},s=(e,r,t,s)=>i[e]=i=>(r=new Promise((r,t,s)=>(s=()=>n(e,i,r,t),o?o.then(s):s())),s=()=>o===t&&(o=0),o=t=r.then(s,s),r),i={};return t=t.apply(e,r),i[h("asyncIterator")]=()=>i,s("next"),s("throw"),s("return"),i},m=(e,r,t)=>(r=e[h("asyncIterator")])?r.call(e):(e=e[h("iterator")](),r={},(t=(t,o)=>(o=e[t])&&(r[t]=r=>new Promise((t,n,s)=>(r=o.call(e,r),s=r.done,Promise.resolve(r.value).then(e=>t({value:e,done:s}),n)))))("next"),t("return"),r);let b=0;class w extends n{constructor(e){super(e),d(this,"providers"+"",[]),e&&e.providers&&(this.providers=e.providers)}abort(){this.providers.forEach(e=>{e.abort&&e.abort()})}search(e){return v(this,null,function*(){this.abort();let r=!0;const t=[];for(const a of this.providers)try{const t=a.search(e);try{for(var o,n,s,i=m(t);o=!(n=yield new y(i.next())).done;o=!1){const e=n.value;r=!1,yield f(p({},e),{provider:a,_id:b++})}}catch(n){s=[n]}finally{try{o&&(n=i.return)&&(yield new y(n.call(i)))}finally{if(s)throw s[0]}}}catch(l){"AbortError"!==l.name&&t.push(l)}if(r&&t.length)throw new Error(`All providers failed: ${t.map(e=>e.message).join("; ")}`)})}result(e){return e.provider?e.provider.result(e):Promise.resolve(void 0)}reverse(e){return v(this,null,function*(){for(const i of this.providers)if(i.reverse)try{const s=i.reverse(e);try{for(var r,t,o,n=m(s);r=!(t=yield new y(n.next())).done;r=!1){const e=t.value;yield f(p({},e),{provider:i,_id:b++})}}catch(t){o=[t]}finally{try{r&&(t=n.return)&&(yield new y(t.call(n)))}finally{if(o)throw o[0]}}}catch(s){}})}reverseGeocodeFirstResult(e){return r=this,t=null,o=function*(){for(const i of this.providers)if("function"==typeof i.reverse)try{try{for(var r,t,o,n=m(i.reverse(e));r=!(t=yield n.next()).done;r=!1)return t.value}catch(t){o=[t]}finally{try{r&&(t=n.return)&&(yield t.call(n))}finally{if(o)throw o[0]}}}catch(s){console.error("Error in reverse geocoding:",s)}},new Promise((e,n)=>{var s=e=>{try{l(o.next(e))}catch(r){n(r)}},i=e=>{try{l(o.throw(e))}catch(r){n(r)}},l=r=>r.done?e(r.value):Promise.resolve(r.value).then(s,i);l((o=o.apply(r,t)).next())});var r,t,o}}var g=Object.defineProperty,x=(e,r,t)=>((e,r,t)=>r in e?g(e,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[r]=t)(e,"symbol"!=typeof r?r+"":r,t);class P extends n{constructor(){super(...arguments),x(this,"searchUrl"),x(this,"label")}}var _=Object.defineProperty,S=Object.getOwnPropertySymbols,O=Object.prototype.hasOwnProperty,j=Object.prototype.propertyIsEnumerable,I=(e,r,t)=>r in e?_(e,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[r]=t,E=(e,r,t)=>I(e,"symbol"!=typeof r?r+"":r,t),k=function(e,r){this[0]=e,this[1]=r},U=(e,r,t)=>{var o,n,s,i=(e,r,o,n)=>{try{var s=t[e](r),l=(r=s.value)instanceof k,a=s.done;Promise.resolve(l?r[0]:r).then(t=>l?i("return"===e?e:"next",r[1]?{done:t.done,value:t.value}:t,o,n):o({value:t,done:a})).catch(e=>i("throw",e,o,n))}catch(c){n(c)}},l=(e,r,t,n)=>a[e]=s=>(r=new Promise((r,t,n)=>(n=()=>i(e,s,r,t),o?o.then(n):n())),n=()=>o===t&&(o=0),o=t=r.then(n,n),r),a={};return t=t.apply(e,r),a[(n="asyncIterator",(s=Symbol[n])?s:Symbol.for("Symbol."+n))]=()=>a,l("next"),l("throw"),l("return"),a};const $=class e extends P{constructor(e){var r;if(super(e),E(this,"searchResources",[]),E(this,"connector"),E(this,"_abortControllers",[]),!e.searchUrl&&!(null==(r=e.connectorOptions)?void 0:r.baseUrl))throw new Error("The `searchUrl` of `connectorOptions.baseUrl` are required");this.connector=e.connector||new t(((e,r)=>{for(var t in r||(r={}))O.call(r,t)&&I(e,t,r[t]);if(S)for(var t of S(r))j.call(r,t)&&I(e,t,r[t]);return e})({baseUrl:this.searchUrl},e.connectorOptions)),this.searchResources=e.searchResources}abort(){this._abortControllers.forEach(e=>{e.abort()}),this._abortControllers.length=0}search(r){return U(this,null,function*(){var t,n;const s=this._makeSignal();for(const l of this.searchResources){if(s.aborted)break;const{searchMethod:a}=l,c=null!=(t=l.limit)?t:e.limit,u=null!=(n=l.id)?n:l.resourceId;try{const e=yield new k(this.connector.getResourceOrFail(u,{cache:!0})),t={connector:this.connector,resourceId:u,signal:s,limit:c};"like"===a?t.like=r:t.ilike=r;const n=o(t),i=yield new k(n);for(const o of this._items({entries:i,query:r,config:l,resourceItem:e}))o.result=()=>this.result(o),yield o}catch(i){i&&"name"in i&&"AbortError"!==i.name&&console.warn(i)}}})}result(e){const r=this._makeSignal();return this.connector.route("feature_layer.feature.item_extent",{id:e.resourceId,fid:e.featureId}).get({signal:r}).then(r=>{const t=r.extent||{minLon:0,minLat:0,maxLon:0,maxLat:0};return{text:e.text,extent:[t.minLon,t.minLat,t.maxLon,t.maxLat]}})}reverse(e){return U(this,null,function*(){throw new Error("Not implemented")})}_makeSignal(){const e=new AbortController;return this._abortControllers.push(e),e.signal}_items({entries:e,query:r,config:t,resourceItem:o}){var n;const s=[];let i;o.feature_layer&&(i=null==(n=o.feature_layer.fields.find(e=>e.label_field))?void 0:n.keyname);return this.searchResources.find(e=>{var r;return null!=(r=e.id)?r:e.resourceId===o.resource.id})&&e.forEach(e=>{let n=i?e.fields[i]:e.id;t.renderSearch?n=t.renderSearch({item:e,resourceItem:o}):i&&(n=e.fields[i]),s.push({query:r,text:n,featureId:e.id,resourceId:o.resource.id,item:e,resourceItem:o})}),s}};E($,"limit",300);let C=$;var L=Object.defineProperty,R=(e,r,t)=>((e,r,t)=>r in e?L(e,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[r]=t)(e,"symbol"!=typeof r?r+"":r,t),A=function(e,r){this[0]=e,this[1]=r},q=(e,r,t)=>{var o,n,s,i=(e,r,o,n)=>{try{var s=t[e](r),l=(r=s.value)instanceof A,a=s.done;Promise.resolve(l?r[0]:r).then(t=>l?i("return"===e?e:"next",r[1]?{done:t.done,value:t.value}:t,o,n):o({value:t,done:a})).catch(e=>i("throw",e,o,n))}catch(c){n(c)}},l=(e,r,t,n)=>a[e]=s=>(r=new Promise((r,t,n)=>(n=()=>i(e,s,r,t),o?o.then(n):n())),n=()=>o===t&&(o=0),o=t=r.then(n,n),r),a={};return t=t.apply(e,r),a[(n="asyncIterator",(s=Symbol[n])?s:Symbol.for("Symbol."+n))]=()=>a,l("next"),l("throw"),l("return"),a};class N extends P{constructor(e){super(),R(this,"options",e),R(this,"searchUrl","https://nominatim.openstreetmap.org"),R(this,"_abortControllers",[]),e&&e.searchUrl&&(this.searchUrl=e.searchUrl)}abort(){this._abortControllers.forEach(e=>{e.abort()}),this._abortControllers=[]}search(e){return q(this,null,function*(){var t,o,n,s,i,l,a;const c=new URLSearchParams({format:"geojson",polygon_geojson:"1",q:e,limit:(null==(o=null==(t=this.options)?void 0:t.limit)?void 0:o.toString())||"10"});if((null==(n=this.options)?void 0:n.countrycodes)&&c.append("countrycodes",this.options.countrycodes),(null==(s=this.options)?void 0:s.addressdetails)&&c.append("addressdetails","1"),(null==(i=this.options)?void 0:i.language)&&c.append("accept-language",this.options.language),(null==(l=this.options)?void 0:l.bounded)&&c.append("bounded","1"),null==(a=this.options)?void 0:a.viewbox){const[e,r,t,o]=this.options.viewbox;c.append("viewbox",`${e},${r},${t},${o}`)}const u=r(`${this.searchUrl}/search?${c.toString()}`),h=new AbortController;this._abortControllers.push(h);try{const r=yield new A(fetch(u,{signal:h.signal}));if(!r.ok)throw new Error(`Network response was not ok: ${r.statusText}`);const t=(yield new A(r.json())).features.map(r=>({geom:r,extent:r.bbox,text:r.properties&&r.properties.display_name,query:e}));for(const e of t)e.result=()=>this.result(e),yield e}catch(d){if("AbortError"!==d.name)throw d}})}result(e){return Promise.resolve({text:e.text,extent:e.extent||[],geom:e.geom})}reverse(e){return q(this,null,function*(){var t,o;const[n,s]=e,i=new URLSearchParams({format:"geojson",lat:s.toString(),lon:n.toString()});(null==(t=this.options)?void 0:t.addressdetails)&&i.append("addressdetails","1"),(null==(o=this.options)?void 0:o.language)&&i.append("accept-language",this.options.language);const l=r(`${this.searchUrl}/reverse?${i.toString()}`),a=new AbortController;this._abortControllers.push(a);try{const e=yield new A(fetch(l,{signal:a.signal}));if(!e.ok)throw new Error(`Network response was not ok: ${e.statusText}`);const r=(yield new A(e.json())).features[0],t={geom:r,extent:r.bbox,text:r.properties&&r.properties.display_name,query:`${s}, ${n}`};t.result=()=>this.result(t),yield t}catch(c){if("AbortError"!==c.name)throw c}})}}function T(e){return new w(e)}export{P as BaseProvider,w as Geocoder,C as NgwProvider,N as NominatimProvider,T as create};
2
2
  //# sourceMappingURL=geocoder.esm-bundler.prod.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"geocoder.esm-bundler.prod.js","sources":["../src/BaseGeocoder.ts","../src/Geocoder.ts","../src/providers/BaseProvider.ts","../src/providers/NgwProvider.ts","../src/providers/NominatimProvider.ts","../src/index.ts"],"sourcesContent":["import { objectAssign } from '@nextgis/utils';\n\nimport type { LngLatArray } from '@nextgis/utils';\n\nimport type { SearchItem } from './types/SearchItem';\n\n/**\n * Represents the base class for a geocoder.\n * This abstract class provides the basic methods that every geocoder should implement.\n *\n * @template O - The type of options that can be passed to the geocoder.\n */\nexport abstract class BaseGeocoder<\n O extends Record<string, any> = Record<string, any>,\n> {\n constructor(options?: O) {\n if (options) {\n objectAssign(this, options);\n }\n }\n\n /**\n * Search method to retrieve geocoding results.\n *\n * @abstract\n * @param query - The search string to geocode.\n * @yields An async generator that yields search results.\n */\n abstract search(query: string): AsyncGenerator<SearchItem>;\n\n /**\n * Method to retrieve detailed result for a specific search item.\n *\n * @abstract\n * @param item - The search item to get detailed result for.\n * @returns A promise that resolves to the detailed result.\n */\n abstract result(item: SearchItem): Promise<any>;\n\n /**\n * Method for reverse geocoding.\n * Takes coordinates and returns the corresponding address or location information.\n *\n * @abstract\n * @param coordinates - The longitude and latitude values.\n * @returns An async generator that yields reverse geocoding results.\n */\n abstract reverse(coordinates: LngLatArray): AsyncGenerator<SearchItem>;\n\n /**\n * Optional method to abort any ongoing geocoding requests.\n *\n * @abstract\n */\n abstract abort?(): void;\n}\n","import { BaseGeocoder } from './BaseGeocoder';\n\nimport type { LngLatArray } from '@nextgis/utils';\n\nimport type { BaseProvider } from './providers/BaseProvider';\nimport type { SearchItem } from './types/SearchItem';\nimport type { GeocoderOptions } from './GeocoderOptions';\n\nlet ID = 0;\n\nexport class Geocoder extends BaseGeocoder<GeocoderOptions> {\n providers: BaseProvider[] = [];\n\n constructor(options: GeocoderOptions) {\n super(options);\n if (options && options.providers) {\n this.providers = options.providers;\n }\n }\n\n abort(): void {\n this.providers.forEach((x) => {\n if (x.abort) {\n x.abort();\n }\n });\n }\n\n async *search(query: string): AsyncGenerator<SearchItem, void, unknown> {\n this.abort();\n let allProvidersFailed = true;\n const errors: Error[] = [];\n\n for (const provider of this.providers) {\n try {\n const results = provider.search(query);\n\n for await (const r of results) {\n allProvidersFailed = false;\n yield { ...r, provider, _id: ID++ };\n }\n } catch (err) {\n const er = err as Error;\n if (er.name !== 'AbortError') {\n errors.push(er);\n }\n }\n }\n\n if (allProvidersFailed && errors.length) {\n throw new Error(\n `All providers failed: ${errors.map((e) => e.message).join('; ')}`,\n );\n }\n }\n\n result(item: SearchItem): Promise<any> {\n if (item.provider) {\n return item.provider.result(item);\n }\n return Promise.resolve(undefined);\n }\n\n async *reverse(\n coordinates: LngLatArray,\n ): AsyncGenerator<SearchItem, void, unknown> {\n for (const provider of this.providers) {\n if (!provider.reverse) {\n continue;\n }\n\n try {\n const results = provider.reverse(coordinates);\n\n for await (const r of results) {\n yield { ...r, provider, _id: ID++ };\n }\n } catch {\n // ignore\n }\n }\n }\n\n /**\n * Returns the first reverse geocoding result for given coordinates from any provider.\n *\n * @param coordinates - The longitude and latitude values.\n * @returns A promise that resolves to the first reverse geocoding result, or undefined if no results are found.\n */\n async reverseGeocodeFirstResult(\n coordinates: LngLatArray,\n ): Promise<SearchItem | undefined> {\n for (const provider of this.providers) {\n if (typeof provider.reverse === 'function') {\n try {\n for await (const result of provider.reverse(coordinates)) {\n return result;\n }\n } catch (error) {\n console.error('Error in reverse geocoding:', error);\n }\n }\n }\n return undefined;\n }\n}\n","import { BaseGeocoder } from '../BaseGeocoder';\n\nimport type { BaseProviderOptions } from './BaseProviderOptions';\n\n/**\n * Abstract base class representing a search provider.\n * It builds upon the BaseGeocoder functionalities with provider-specific properties.\n * @template O - Options type which extends BaseProviderOptions.\n */\nexport abstract class BaseProvider<\n O extends BaseProviderOptions = BaseProviderOptions,\n> extends BaseGeocoder<O> {\n /**\n * URL endpoint for the search service.\n * This is where queries will be sent to obtain search results.\n */\n searchUrl?: string;\n\n /**\n * Label to represent the provider.\n * Useful for user interfaces to display the source of search results.\n */\n label?: string;\n}\n","import NgwConnector from '@nextgis/ngw-connector';\nimport { fetchNgwLayerItems } from '@nextgis/ngw-kit';\n\nimport { BaseProvider } from './BaseProvider';\n\nimport type { FeatureItem, NgwConnectorOptions } from '@nextgis/ngw-connector';\nimport type { FetchNgwItemsOptions } from '@nextgis/ngw-kit';\nimport type { LngLatArray } from '@nextgis/utils';\nimport type { CompositeRead } from '@nextgisweb/resource/type/api';\n\nimport type { ResultItem } from '../types/ResultItem';\nimport type { SearchItem } from '../types/SearchItem';\n\nimport type { BaseProviderOptions } from './BaseProviderOptions';\n\n/**\n * Extends the basic search item with NGW-specific properties.\n */\ninterface NgwSearchItem extends SearchItem {\n /** ID of the NGW resource */\n resourceId: number;\n /** ID of the feature in the NGW resource */\n featureId: number;\n /** The specific feature item from NGW */\n item: FeatureItem;\n /** The NGW resource item */\n resourceItem: CompositeRead;\n}\n\n/**\n * Defines the structure for a rendered search item.\n */\ninterface RenderSearchItem {\n /** The specific feature item */\n item: FeatureItem;\n /** The NGW resource item */\n resourceItem: CompositeRead;\n}\n\n/**\n * Options for searching within a NGW resource.\n */\ninterface SearchResource extends FetchNgwItemsOptions {\n /** The search method used ('ilike' is case-insensitive) */\n searchMethod?: 'ilike' | 'like';\n /** Custom rendering function for search results */\n renderSearch?: (item: RenderSearchItem) => string | HTMLElement;\n}\n\n/**\n * Options required to initialize an NGW provider.\n */\ninterface NgwProviderOptions extends BaseProviderOptions {\n /** Connector instance for NGW. If not provided, will be created internally */\n connector?: NgwConnector;\n /** List of NGW resources to search within */\n searchResources: SearchResource[];\n /** Options for the internal NgwConnector (if one needs to be created) */\n connectorOptions?: NgwConnectorOptions;\n}\n\nexport class NgwProvider extends BaseProvider<NgwProviderOptions> {\n static limit = 300;\n\n searchResources: SearchResource[] = [];\n\n private connector: NgwConnector;\n private _abortControllers: AbortController[] = [];\n\n constructor(options: NgwProviderOptions) {\n super(options);\n if (!options.searchUrl && !options.connectorOptions?.baseUrl) {\n throw new Error(\n 'The `searchUrl` of `connectorOptions.baseUrl` are required',\n );\n }\n\n this.connector =\n options.connector ||\n new NgwConnector({\n baseUrl: this.searchUrl,\n ...options.connectorOptions,\n });\n this.searchResources = options.searchResources;\n }\n\n abort(): void {\n this._abortControllers.forEach((a) => {\n a.abort();\n });\n this._abortControllers.length = 0;\n }\n\n async *search(query: string): AsyncGenerator<NgwSearchItem, void, unknown> {\n const signal = this._makeSignal();\n for (const config of this.searchResources) {\n if (signal.aborted) {\n break;\n }\n const { searchMethod } = config;\n\n const limit = config.limit ?? NgwProvider.limit;\n //\n const resourceId = (config as any).id ?? config.resourceId;\n\n try {\n const resource = await this.connector.getResourceOrFail(resourceId, {\n cache: true,\n });\n\n const options: FetchNgwItemsOptions = {\n connector: this.connector,\n resourceId,\n signal,\n limit,\n };\n\n if (searchMethod === 'like') {\n options.like = query;\n } else {\n options.ilike = query;\n }\n\n const request = fetchNgwLayerItems(options);\n\n const entries = await request;\n\n for (const item of this._items({\n entries,\n query,\n config,\n resourceItem: resource,\n })) {\n item.result = () => this.result(item);\n yield item;\n }\n } catch (er) {\n if (\n er &&\n 'name' in (er as Error) &&\n (er as Error).name !== 'AbortError'\n ) {\n console.warn(er);\n }\n }\n }\n }\n\n result(item: NgwSearchItem): Promise<ResultItem> {\n const signal = this._makeSignal();\n const req = this.connector\n .route('feature_layer.feature.item_extent', {\n id: item.resourceId,\n fid: item.featureId,\n })\n .get({ signal })\n .then((x) => {\n const e = x.extent || {\n minLon: 0,\n minLat: 0,\n maxLon: 0,\n maxLat: 0,\n };\n return {\n text: item.text,\n extent: [e.minLon, e.minLat, e.maxLon, e.maxLat],\n };\n });\n return req;\n }\n\n async *reverse(\n coordinates: LngLatArray,\n ): AsyncGenerator<SearchItem, void, unknown> {\n throw new Error('Not implemented');\n yield undefined as any;\n }\n\n private _makeSignal() {\n const abortController = new AbortController();\n this._abortControllers.push(abortController);\n return abortController.signal;\n }\n\n private _items({\n entries,\n query,\n config,\n resourceItem,\n }: {\n config: SearchResource;\n entries: FeatureItem[];\n query: string;\n resourceItem: CompositeRead;\n }): NgwSearchItem[] {\n const items: NgwSearchItem[] = [];\n\n let labelField: string | undefined = undefined;\n\n if (resourceItem.feature_layer) {\n labelField = resourceItem.feature_layer.fields.find(\n (f) => f.label_field,\n )?.keyname;\n }\n\n const meta = this.searchResources.find(\n (x) => (x as any).id ?? x.resourceId === resourceItem.resource.id,\n );\n if (meta) {\n entries.forEach((entry) => {\n let text = labelField ? entry.fields[labelField] : entry.id;\n if (config.renderSearch) {\n text = config.renderSearch({\n item: entry,\n resourceItem,\n });\n } else if (labelField) {\n text = entry.fields[labelField];\n }\n\n items.push({\n query: query,\n text,\n featureId: entry.id,\n resourceId: resourceItem.resource.id,\n item: entry,\n resourceItem,\n });\n });\n }\n return items;\n }\n}\n","import { fixUrlStr } from '@nextgis/utils';\n\nimport { BaseProvider } from './BaseProvider';\n\nimport type { LngLatArray } from '@nextgis/utils';\nimport type { FeatureCollection } from 'geojson';\n\nimport type { ResultItem } from '../types/ResultItem';\nimport type { SearchItem } from '../types/SearchItem';\n\nimport type { BaseProviderOptions } from './BaseProviderOptions';\n\n/**\n * Nominatim based options {@link https://nominatim.org/release-docs/latest/api/Search}\n */\nexport interface NominatimProviderOptions extends BaseProviderOptions {\n /** Browser language string */\n language?: string;\n /** Comma-separated list of country codes {}*/\n countrycodes?: string;\n /** Limit the number of search results */\n limit?: number;\n /** Include address details in the results */\n addressdetails?: boolean;\n /** Restrict the results to the specified viewbox */\n bounded?: boolean;\n /** Focuses the search on the given area [minLon, minLat, maxLon, maxLat] */\n viewbox?: [number, number, number, number];\n}\n\nexport class NominatimProvider\n extends BaseProvider<NominatimProviderOptions>\n implements NominatimProviderOptions\n{\n searchUrl = 'https://nominatim.openstreetmap.org';\n private _abortControllers: AbortController[] = [];\n\n constructor(public options?: NominatimProviderOptions) {\n super();\n if (options && options.searchUrl) {\n this.searchUrl = options.searchUrl;\n }\n }\n\n abort(): void {\n this._abortControllers.forEach((controller) => {\n controller.abort();\n });\n this._abortControllers = [];\n }\n\n async *search(val: string): AsyncGenerator<SearchItem, void, unknown> {\n const params = new URLSearchParams({\n format: 'geojson',\n polygon_geojson: '1',\n q: val,\n limit: this.options?.limit?.toString() || '10',\n });\n\n if (this.options?.countrycodes) {\n params.append('countrycodes', this.options.countrycodes);\n }\n if (this.options?.addressdetails) {\n params.append('addressdetails', '1');\n }\n if (this.options?.language) {\n params.append('accept-language', this.options.language);\n }\n if (this.options?.bounded) {\n params.append('bounded', '1');\n }\n if (this.options?.viewbox) {\n const [minLon, minLat, maxLon, maxLat] = this.options.viewbox;\n params.append('viewbox', `${minLon},${minLat},${maxLon},${maxLat}`);\n }\n\n const url = fixUrlStr(`${this.searchUrl}/search?${params.toString()}`);\n const controller = new AbortController();\n this._abortControllers.push(controller);\n\n try {\n const response = await fetch(url, { signal: controller.signal });\n if (!response.ok) {\n throw new Error(`Network response was not ok: ${response.statusText}`);\n }\n const geojson = (await response.json()) as FeatureCollection;\n const features: SearchItem[] = geojson.features.map((x) => {\n return {\n geom: x,\n extent: x.bbox,\n text: x.properties && x.properties.display_name,\n query: val,\n };\n });\n\n for (const item of features) {\n item.result = () => this.result(item);\n yield item;\n }\n } catch (error) {\n if ((error as Error).name === 'AbortError') {\n // ignore\n } else {\n throw error;\n }\n }\n }\n\n result(model: SearchItem): Promise<ResultItem> {\n return Promise.resolve({\n text: model.text,\n extent: model.extent || [],\n geom: model.geom,\n });\n }\n\n async *reverse(\n coordinates: LngLatArray,\n ): AsyncGenerator<SearchItem, void, unknown> {\n const [lng, lat] = coordinates;\n const params = new URLSearchParams({\n format: 'geojson',\n lat: lat.toString(),\n lon: lng.toString(),\n });\n\n if (this.options?.addressdetails) {\n params.append('addressdetails', '1');\n }\n if (this.options?.language) {\n params.append('accept-language', this.options.language);\n }\n\n const url = fixUrlStr(`${this.searchUrl}/reverse?${params.toString()}`);\n const controller = new AbortController();\n this._abortControllers.push(controller);\n\n try {\n const response = await fetch(url, { signal: controller.signal });\n if (!response.ok) {\n throw new Error(`Network response was not ok: ${response.statusText}`);\n }\n const geojson = (await response.json()) as FeatureCollection;\n const feature = geojson.features[0];\n const item: SearchItem = {\n geom: feature,\n extent: feature.bbox,\n text: feature.properties && feature.properties.display_name,\n query: `${lat}, ${lng}`,\n };\n\n item.result = () => this.result(item);\n yield item;\n } catch (error) {\n if ((error as Error).name === 'AbortError') {\n // ignore\n } else {\n throw error;\n }\n }\n }\n}\n","import { Geocoder } from './Geocoder';\n\nimport type { GeocoderOptions } from './GeocoderOptions';\n\nexport { Geocoder, GeocoderOptions };\nexport { BaseProvider } from './providers/BaseProvider';\nexport * from './providers/BaseProviderOptions';\nexport { NgwProvider } from './providers/NgwProvider';\nexport { NominatimProvider } from './providers/NominatimProvider';\nexport * from './types/ResultItem';\nexport * from './types/SearchItem';\n\nexport function create(options: GeocoderOptions): Geocoder {\n return new Geocoder(options);\n}\n"],"names":["BaseGeocoder","constructor","options","objectAssign","this","ID","Geocoder","super","providers","abort","forEach","x","search","query","__asyncGenerator","allProvidersFailed","errors","provider","results","more","temp","error","iter","__forAwait","__await","next","done","r","value","__spreadProps","__spreadValues","_id","return","call","err","name","push","length","Error","map","e","message","join","result","item","Promise","resolve","reverse","coordinates","reverseGeocodeFirstResult","console","BaseProvider","arguments","__publicField","_NgwProvider","_a","searchUrl","connectorOptions","baseUrl","connector","NgwConnector","searchResources","_abortControllers","a","_b","signal","_makeSignal","config","aborted","searchMethod","limit","resourceId","id","resource","getResourceOrFail","cache","like","ilike","request","fetchNgwLayerItems","entries","_items","resourceItem","er","warn","route","fid","featureId","get","then","extent","minLon","minLat","maxLon","maxLat","text","abortController","AbortController","items","labelField","feature_layer","fields","find","f","label_field","keyname","entry","renderSearch","NgwProvider","NominatimProvider","controller","val","_c","_d","_e","_f","_g","params","URLSearchParams","format","polygon_geojson","q","toString","countrycodes","append","addressdetails","language","bounded","viewbox","url","fixUrlStr","response","fetch","ok","statusText","features","json","geom","bbox","properties","display_name","model","lng","lat","lon","feature","create"],"mappings":"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"}
1
+ {"version":3,"file":"geocoder.esm-bundler.prod.js","sources":["../src/BaseGeocoder.ts","../src/Geocoder.ts","../src/providers/BaseProvider.ts","../src/providers/NgwProvider.ts","../src/providers/NominatimProvider.ts","../src/index.ts"],"sourcesContent":["import { objectAssign } from '@nextgis/utils';\n\nimport type { LngLatArray } from '@nextgis/utils';\n\nimport type { SearchItem } from './types/SearchItem';\n\n/**\n * Represents the base class for a geocoder.\n * This abstract class provides the basic methods that every geocoder should implement.\n *\n * @template O - The type of options that can be passed to the geocoder.\n */\nexport abstract class BaseGeocoder<\n O extends Record<string, any> = Record<string, any>,\n> {\n constructor(options?: O) {\n if (options) {\n objectAssign(this, options);\n }\n }\n\n /**\n * Search method to retrieve geocoding results.\n *\n * @abstract\n * @param query - The search string to geocode.\n * @yields An async generator that yields search results.\n */\n abstract search(query: string): AsyncGenerator<SearchItem>;\n\n /**\n * Method to retrieve detailed result for a specific search item.\n *\n * @abstract\n * @param item - The search item to get detailed result for.\n * @returns A promise that resolves to the detailed result.\n */\n abstract result(item: SearchItem): Promise<any>;\n\n /**\n * Method for reverse geocoding.\n * Takes coordinates and returns the corresponding address or location information.\n *\n * @abstract\n * @param coordinates - The longitude and latitude values.\n * @returns An async generator that yields reverse geocoding results.\n */\n abstract reverse(coordinates: LngLatArray): AsyncGenerator<SearchItem>;\n\n /**\n * Optional method to abort any ongoing geocoding requests.\n *\n * @abstract\n */\n abstract abort?(): void;\n}\n","import { BaseGeocoder } from './BaseGeocoder';\n\nimport type { LngLatArray } from '@nextgis/utils';\n\nimport type { BaseProvider } from './providers/BaseProvider';\nimport type { SearchItem } from './types/SearchItem';\nimport type { GeocoderOptions } from './GeocoderOptions';\n\nlet ID = 0;\n\nexport class Geocoder extends BaseGeocoder<GeocoderOptions> {\n providers: BaseProvider[] = [];\n\n constructor(options: GeocoderOptions) {\n super(options);\n if (options && options.providers) {\n this.providers = options.providers;\n }\n }\n\n abort(): void {\n this.providers.forEach((x) => {\n if (x.abort) {\n x.abort();\n }\n });\n }\n\n async *search(query: string): AsyncGenerator<SearchItem, void, unknown> {\n this.abort();\n let allProvidersFailed = true;\n const errors: Error[] = [];\n\n for (const provider of this.providers) {\n try {\n const results = provider.search(query);\n\n for await (const r of results) {\n allProvidersFailed = false;\n yield { ...r, provider, _id: ID++ };\n }\n } catch (err) {\n const er = err as Error;\n if (er.name !== 'AbortError') {\n errors.push(er);\n }\n }\n }\n\n if (allProvidersFailed && errors.length) {\n throw new Error(\n `All providers failed: ${errors.map((e) => e.message).join('; ')}`,\n );\n }\n }\n\n result(item: SearchItem): Promise<any> {\n if (item.provider) {\n return item.provider.result(item);\n }\n return Promise.resolve(undefined);\n }\n\n async *reverse(\n coordinates: LngLatArray,\n ): AsyncGenerator<SearchItem, void, unknown> {\n for (const provider of this.providers) {\n if (!provider.reverse) {\n continue;\n }\n\n try {\n const results = provider.reverse(coordinates);\n\n for await (const r of results) {\n yield { ...r, provider, _id: ID++ };\n }\n } catch {\n // ignore\n }\n }\n }\n\n /**\n * Returns the first reverse geocoding result for given coordinates from any provider.\n *\n * @param coordinates - The longitude and latitude values.\n * @returns A promise that resolves to the first reverse geocoding result, or undefined if no results are found.\n */\n async reverseGeocodeFirstResult(\n coordinates: LngLatArray,\n ): Promise<SearchItem | undefined> {\n for (const provider of this.providers) {\n if (typeof provider.reverse === 'function') {\n try {\n for await (const result of provider.reverse(coordinates)) {\n return result;\n }\n } catch (error) {\n console.error('Error in reverse geocoding:', error);\n }\n }\n }\n return undefined;\n }\n}\n","import { BaseGeocoder } from '../BaseGeocoder';\n\nimport type { BaseProviderOptions } from './BaseProviderOptions';\n\n/**\n * Abstract base class representing a search provider.\n * It builds upon the BaseGeocoder functionalities with provider-specific properties.\n * @template O - Options type which extends BaseProviderOptions.\n */\nexport abstract class BaseProvider<\n O extends BaseProviderOptions = BaseProviderOptions,\n> extends BaseGeocoder<O> {\n /**\n * URL endpoint for the search service.\n * This is where queries will be sent to obtain search results.\n */\n searchUrl?: string;\n\n /**\n * Label to represent the provider.\n * Useful for user interfaces to display the source of search results.\n */\n label?: string;\n}\n","import NgwConnector from '@nextgis/ngw-connector';\nimport { fetchNgwLayerItems } from '@nextgis/ngw-kit';\n\nimport { BaseProvider } from './BaseProvider';\n\nimport type { FeatureItem, NgwConnectorOptions } from '@nextgis/ngw-connector';\nimport type { FetchNgwItemsOptions } from '@nextgis/ngw-kit';\nimport type { LngLatArray } from '@nextgis/utils';\nimport type { CompositeRead } from '@nextgisweb/resource/type/api';\n\nimport type { ResultItem } from '../types/ResultItem';\nimport type { SearchItem } from '../types/SearchItem';\n\nimport type { BaseProviderOptions } from './BaseProviderOptions';\n\n/**\n * Extends the basic search item with NGW-specific properties.\n */\ninterface NgwSearchItem extends SearchItem {\n /** ID of the NGW resource */\n resourceId: number;\n /** ID of the feature in the NGW resource */\n featureId: number;\n /** The specific feature item from NGW */\n item: FeatureItem;\n /** The NGW resource item */\n resourceItem: CompositeRead;\n}\n\n/**\n * Defines the structure for a rendered search item.\n */\ninterface RenderSearchItem {\n /** The specific feature item */\n item: FeatureItem;\n /** The NGW resource item */\n resourceItem: CompositeRead;\n}\n\n/**\n * Options for searching within a NGW resource.\n */\ninterface SearchResource extends FetchNgwItemsOptions {\n /** The search method used ('ilike' is case-insensitive) */\n searchMethod?: 'ilike' | 'like';\n /** Custom rendering function for search results */\n renderSearch?: (item: RenderSearchItem) => string | HTMLElement;\n}\n\n/**\n * Options required to initialize an NGW provider.\n */\ninterface NgwProviderOptions extends BaseProviderOptions {\n /** Connector instance for NGW. If not provided, will be created internally */\n connector?: NgwConnector;\n /** List of NGW resources to search within */\n searchResources: SearchResource[];\n /** Options for the internal NgwConnector (if one needs to be created) */\n connectorOptions?: NgwConnectorOptions;\n}\n\nexport class NgwProvider extends BaseProvider<NgwProviderOptions> {\n static limit = 300;\n\n searchResources: SearchResource[] = [];\n\n private connector: NgwConnector;\n private _abortControllers: AbortController[] = [];\n\n constructor(options: NgwProviderOptions) {\n super(options);\n if (!options.searchUrl && !options.connectorOptions?.baseUrl) {\n throw new Error(\n 'The `searchUrl` of `connectorOptions.baseUrl` are required',\n );\n }\n\n this.connector =\n options.connector ||\n new NgwConnector({\n baseUrl: this.searchUrl,\n ...options.connectorOptions,\n });\n this.searchResources = options.searchResources;\n }\n\n abort(): void {\n this._abortControllers.forEach((a) => {\n a.abort();\n });\n this._abortControllers.length = 0;\n }\n\n async *search(query: string): AsyncGenerator<NgwSearchItem, void, unknown> {\n const signal = this._makeSignal();\n for (const config of this.searchResources) {\n if (signal.aborted) {\n break;\n }\n const { searchMethod } = config;\n\n const limit = config.limit ?? NgwProvider.limit;\n //\n const resourceId = (config as any).id ?? config.resourceId;\n\n try {\n const resource = await this.connector.getResourceOrFail(resourceId, {\n cache: true,\n });\n\n const options: FetchNgwItemsOptions = {\n connector: this.connector,\n resourceId,\n signal,\n limit,\n };\n\n if (searchMethod === 'like') {\n options.like = query;\n } else {\n options.ilike = query;\n }\n\n const request = fetchNgwLayerItems(options);\n\n const entries = await request;\n\n for (const item of this._items({\n entries,\n query,\n config,\n resourceItem: resource,\n })) {\n item.result = () => this.result(item);\n yield item;\n }\n } catch (er) {\n if (\n er &&\n 'name' in (er as Error) &&\n (er as Error).name !== 'AbortError'\n ) {\n console.warn(er);\n }\n }\n }\n }\n\n result(item: NgwSearchItem): Promise<ResultItem> {\n const signal = this._makeSignal();\n const req = this.connector\n .route('feature_layer.feature.item_extent', {\n id: item.resourceId,\n fid: item.featureId,\n })\n .get({ signal })\n .then((x) => {\n const e = x.extent || {\n minLon: 0,\n minLat: 0,\n maxLon: 0,\n maxLat: 0,\n };\n return {\n text: item.text,\n extent: [e.minLon, e.minLat, e.maxLon, e.maxLat],\n };\n });\n return req;\n }\n\n async *reverse(\n coordinates: LngLatArray,\n ): AsyncGenerator<SearchItem, void, unknown> {\n throw new Error('Not implemented');\n yield undefined as any;\n }\n\n private _makeSignal() {\n const abortController = new AbortController();\n this._abortControllers.push(abortController);\n return abortController.signal;\n }\n\n private _items({\n entries,\n query,\n config,\n resourceItem,\n }: {\n config: SearchResource;\n entries: FeatureItem[];\n query: string;\n resourceItem: CompositeRead;\n }): NgwSearchItem[] {\n const items: NgwSearchItem[] = [];\n\n let labelField: string | undefined = undefined;\n\n if (resourceItem.feature_layer) {\n labelField = resourceItem.feature_layer.fields.find(\n (f) => f.label_field,\n )?.keyname;\n }\n\n const meta = this.searchResources.find(\n (x) => (x as any).id ?? x.resourceId === resourceItem.resource.id,\n );\n if (meta) {\n entries.forEach((entry) => {\n let text = labelField ? entry.fields[labelField] : entry.id;\n if (config.renderSearch) {\n text = config.renderSearch({\n item: entry,\n resourceItem,\n });\n } else if (labelField) {\n text = entry.fields[labelField];\n }\n\n items.push({\n query: query,\n text,\n featureId: entry.id,\n resourceId: resourceItem.resource.id,\n item: entry,\n resourceItem,\n });\n });\n }\n return items;\n }\n}\n","import { fixUrlStr } from '@nextgis/utils';\n\nimport { BaseProvider } from './BaseProvider';\n\nimport type { LngLatArray } from '@nextgis/utils';\nimport type { FeatureCollection } from 'geojson';\n\nimport type { ResultItem } from '../types/ResultItem';\nimport type { SearchItem } from '../types/SearchItem';\n\nimport type { BaseProviderOptions } from './BaseProviderOptions';\n\n/**\n * Nominatim based options {@link https://nominatim.org/release-docs/latest/api/Search}\n */\nexport interface NominatimProviderOptions extends BaseProviderOptions {\n /** Browser language string */\n language?: string;\n /** Comma-separated list of country codes {}*/\n countrycodes?: string;\n /** Limit the number of search results */\n limit?: number;\n /** Include address details in the results */\n addressdetails?: boolean;\n /** Restrict the results to the specified viewbox */\n bounded?: boolean;\n /** Focuses the search on the given area [minLon, minLat, maxLon, maxLat] */\n viewbox?: [number, number, number, number];\n}\n\nexport class NominatimProvider\n extends BaseProvider<NominatimProviderOptions>\n implements NominatimProviderOptions\n{\n searchUrl = 'https://nominatim.openstreetmap.org';\n private _abortControllers: AbortController[] = [];\n\n constructor(public options?: NominatimProviderOptions) {\n super();\n if (options && options.searchUrl) {\n this.searchUrl = options.searchUrl;\n }\n }\n\n abort(): void {\n this._abortControllers.forEach((controller) => {\n controller.abort();\n });\n this._abortControllers = [];\n }\n\n async *search(val: string): AsyncGenerator<SearchItem, void, unknown> {\n const params = new URLSearchParams({\n format: 'geojson',\n polygon_geojson: '1',\n q: val,\n limit: this.options?.limit?.toString() || '10',\n });\n\n if (this.options?.countrycodes) {\n params.append('countrycodes', this.options.countrycodes);\n }\n if (this.options?.addressdetails) {\n params.append('addressdetails', '1');\n }\n if (this.options?.language) {\n params.append('accept-language', this.options.language);\n }\n if (this.options?.bounded) {\n params.append('bounded', '1');\n }\n if (this.options?.viewbox) {\n const [minLon, minLat, maxLon, maxLat] = this.options.viewbox;\n params.append('viewbox', `${minLon},${minLat},${maxLon},${maxLat}`);\n }\n\n const url = fixUrlStr(`${this.searchUrl}/search?${params.toString()}`);\n const controller = new AbortController();\n this._abortControllers.push(controller);\n\n try {\n const response = await fetch(url, { signal: controller.signal });\n if (!response.ok) {\n throw new Error(`Network response was not ok: ${response.statusText}`);\n }\n const geojson = (await response.json()) as FeatureCollection;\n const features: SearchItem[] = geojson.features.map((x) => {\n return {\n geom: x,\n extent: x.bbox,\n text: x.properties && x.properties.display_name,\n query: val,\n };\n });\n\n for (const item of features) {\n item.result = () => this.result(item);\n yield item;\n }\n } catch (error) {\n if ((error as Error).name === 'AbortError') {\n // ignore\n } else {\n throw error;\n }\n }\n }\n\n result(model: SearchItem): Promise<ResultItem> {\n return Promise.resolve({\n text: model.text,\n extent: model.extent || [],\n geom: model.geom,\n });\n }\n\n async *reverse(\n coordinates: LngLatArray,\n ): AsyncGenerator<SearchItem, void, unknown> {\n const [lng, lat] = coordinates;\n const params = new URLSearchParams({\n format: 'geojson',\n lat: lat.toString(),\n lon: lng.toString(),\n });\n\n if (this.options?.addressdetails) {\n params.append('addressdetails', '1');\n }\n if (this.options?.language) {\n params.append('accept-language', this.options.language);\n }\n\n const url = fixUrlStr(`${this.searchUrl}/reverse?${params.toString()}`);\n const controller = new AbortController();\n this._abortControllers.push(controller);\n\n try {\n const response = await fetch(url, { signal: controller.signal });\n if (!response.ok) {\n throw new Error(`Network response was not ok: ${response.statusText}`);\n }\n const geojson = (await response.json()) as FeatureCollection;\n const feature = geojson.features[0];\n const item: SearchItem = {\n geom: feature,\n extent: feature.bbox,\n text: feature.properties && feature.properties.display_name,\n query: `${lat}, ${lng}`,\n };\n\n item.result = () => this.result(item);\n yield item;\n } catch (error) {\n if ((error as Error).name === 'AbortError') {\n // ignore\n } else {\n throw error;\n }\n }\n }\n}\n","import { Geocoder } from './Geocoder';\n\nimport type { GeocoderOptions } from './GeocoderOptions';\n\nexport { Geocoder, GeocoderOptions };\nexport { BaseProvider } from './providers/BaseProvider';\nexport * from './providers/BaseProviderOptions';\nexport { NgwProvider } from './providers/NgwProvider';\nexport { NominatimProvider } from './providers/NominatimProvider';\nexport * from './types/ResultItem';\nexport * from './types/SearchItem';\n\nexport function create(options: GeocoderOptions): Geocoder {\n return new Geocoder(options);\n}\n"],"names":["BaseGeocoder","constructor","options","objectAssign","this","ID","Geocoder","super","providers","abort","forEach","x","search","query","__asyncGenerator","allProvidersFailed","errors","provider","results","more","temp","error","iter","__forAwait","__await","next","done","r","value","__spreadProps","__spreadValues","_id","return","call","err","name","push","length","Error","map","e","message","join","result","item","Promise","resolve","reverse","coordinates","reverseGeocodeFirstResult","console","BaseProvider","arguments","__publicField","_NgwProvider","_a","searchUrl","connectorOptions","baseUrl","connector","NgwConnector","searchResources","_abortControllers","a","_b","signal","_makeSignal","config","aborted","searchMethod","limit","resourceId","id","resource","getResourceOrFail","cache","like","ilike","request","fetchNgwLayerItems","entries","_items","resourceItem","er","warn","route","fid","featureId","get","then","extent","minLon","minLat","maxLon","maxLat","text","abortController","AbortController","items","labelField","feature_layer","fields","find","f","label_field","keyname","entry","renderSearch","NgwProvider","NominatimProvider","controller","val","_c","_d","_e","_f","_g","params","URLSearchParams","format","polygon_geojson","q","toString","countrycodes","append","addressdetails","language","bounded","viewbox","url","fixUrlStr","response","fetch","ok","statusText","features","json","geom","bbox","properties","display_name","model","lng","lat","lon","feature","create"],"mappings":"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"}