@nextgis/geocoder 2.4.0 → 3.0.0-alpha.0

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,9 +1,8 @@
1
- /** Bundle of @nextgis/geocoder; version: 2.4.0; author: NextGIS */
1
+ /** Bundle of @nextgis/geocoder; version: 3.0.0-alpha.0; author: NextGIS */
2
2
  'use strict';
3
3
 
4
4
  Object.defineProperty(exports, '__esModule', { value: true });
5
5
 
6
- var CancelablePromise = require('@nextgis/cancelable-promise');
7
6
  var utils = require('@nextgis/utils');
8
7
  var NgwConnector = require('@nextgis/ngw-connector');
9
8
  var ngwKit = require('@nextgis/ngw-kit');
@@ -18,7 +17,7 @@ class BaseGeocoder {
18
17
 
19
18
  var __defProp$3 = Object.defineProperty;
20
19
  var __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
21
- var __publicField$3 = (obj, key, value) => __defNormalProp$3(obj, typeof key !== "symbol" ? key + "" : key, value);
20
+ var __publicField$3 = (obj, key, value) => __defNormalProp$3(obj, key + "" , value);
22
21
  let ID = 0;
23
22
  class Geocoder extends BaseGeocoder {
24
23
  constructor(options) {
@@ -63,7 +62,7 @@ class Geocoder extends BaseGeocoder {
63
62
  if (item.provider) {
64
63
  return item.provider.result(item);
65
64
  }
66
- return CancelablePromise.resolve(void 0);
65
+ return Promise.resolve(void 0);
67
66
  }
68
67
  async *reverse(coordinates) {
69
68
  for (const provider of this.providers) {
@@ -270,53 +269,48 @@ class NominatimProvider extends BaseProvider {
270
269
  constructor(options) {
271
270
  super(options);
272
271
  __publicField(this, "searchUrl", "https://nominatim.openstreetmap.org");
273
- __publicField(this, "_requests", []);
272
+ __publicField(this, "_abort", []);
274
273
  if (options && options.searchUrl) {
275
274
  this.searchUrl = options.searchUrl;
276
275
  }
277
276
  }
278
277
  abort() {
279
- this._requests.forEach((x) => x.cancel());
280
- this._requests = [];
278
+ this._abort.forEach((x) => x());
279
+ this._abort = [];
281
280
  }
282
281
  async *search(val) {
283
282
  const url = utils.fixUrlStr(
284
283
  // `${this.baseUrl}/search?format=geojson&polygon_geojson=1${window.locale === 'ru' ? '&accept-language=ru-RU,en-US' : ''}&q=${val}`
285
284
  `${this.searchUrl}/search?format=geojson&polygon_geojson=1&q=${val}`
286
285
  );
287
- const request = new CancelablePromise(
288
- (resolve, reject, onCancel) => {
289
- const xhr = new XMLHttpRequest();
290
- xhr.open("GET", url, true);
291
- xhr.onload = () => {
292
- try {
293
- const geojson = JSON.parse(xhr.responseText);
294
- const features = geojson.features.map((x) => {
295
- return {
296
- geom: x,
297
- extent: x.bbox,
298
- text: x.properties && x.properties.display_name,
299
- query: val
300
- };
301
- });
302
- resolve(features);
303
- } catch (er) {
304
- reject(er);
305
- }
306
- };
307
- xhr.onerror = (er) => {
286
+ const request = new Promise((resolve, reject) => {
287
+ const xhr = new XMLHttpRequest();
288
+ xhr.open("GET", url, true);
289
+ xhr.onload = () => {
290
+ try {
291
+ const geojson = JSON.parse(xhr.responseText);
292
+ const features = geojson.features.map((x) => {
293
+ return {
294
+ geom: x,
295
+ extent: x.bbox,
296
+ text: x.properties && x.properties.display_name,
297
+ query: val
298
+ };
299
+ });
300
+ resolve(features);
301
+ } catch (er) {
308
302
  reject(er);
309
- };
310
- onCancel(() => {
311
- xhr.abort();
312
- });
313
- xhr.send();
314
- }
315
- ).catch((er) => {
303
+ }
304
+ };
305
+ xhr.onerror = (er) => {
306
+ reject(er);
307
+ };
308
+ this._abort.push(xhr.abort);
309
+ xhr.send();
310
+ }).catch((er) => {
316
311
  if (er.name === "CancelError") ;
317
312
  throw er;
318
313
  });
319
- this._requests.push(request);
320
314
  const items = await request;
321
315
  if (items) {
322
316
  for (const i of items) {
@@ -326,7 +320,7 @@ class NominatimProvider extends BaseProvider {
326
320
  }
327
321
  }
328
322
  result(model) {
329
- return CancelablePromise.resolve({
323
+ return Promise.resolve({
330
324
  text: model.text,
331
325
  extent: model.extent || [],
332
326
  geom: model.geom
@@ -337,38 +331,33 @@ class NominatimProvider extends BaseProvider {
337
331
  const url = utils.fixUrlStr(
338
332
  `${this.searchUrl}/reverse?format=geojson&lat=${lat}&lon=${lng}`
339
333
  );
340
- const request = new CancelablePromise(
341
- (resolve, reject, onCancel) => {
342
- const xhr = new XMLHttpRequest();
343
- xhr.open("GET", url, true);
344
- xhr.onload = () => {
345
- try {
346
- const geojson = JSON.parse(xhr.responseText);
347
- const feature = geojson.features[0];
348
- const result = {
349
- geom: feature,
350
- extent: feature.bbox,
351
- text: feature.properties && feature.properties.display_name,
352
- query: `${lat}, ${lng}`
353
- };
354
- resolve(result);
355
- } catch (er) {
356
- reject(er);
357
- }
358
- };
359
- xhr.onerror = (er) => {
334
+ const request = new Promise((resolve, reject) => {
335
+ const xhr = new XMLHttpRequest();
336
+ xhr.open("GET", url, true);
337
+ xhr.onload = () => {
338
+ try {
339
+ const geojson = JSON.parse(xhr.responseText);
340
+ const feature = geojson.features[0];
341
+ const result = {
342
+ geom: feature,
343
+ extent: feature.bbox,
344
+ text: feature.properties && feature.properties.display_name,
345
+ query: `${lat}, ${lng}`
346
+ };
347
+ resolve(result);
348
+ } catch (er) {
360
349
  reject(er);
361
- };
362
- onCancel(() => {
363
- xhr.abort();
364
- });
365
- xhr.send();
366
- }
367
- ).catch((er) => {
350
+ }
351
+ };
352
+ xhr.onerror = (er) => {
353
+ reject(er);
354
+ };
355
+ this._abort.push(xhr.abort);
356
+ xhr.send();
357
+ }).catch((er) => {
368
358
  if (er.name === "CancelError") ;
369
359
  throw er;
370
360
  });
371
- this._requests.push(request);
372
361
  const item = await request;
373
362
  if (item) {
374
363
  item.result = () => this.result(item);
@@ -1 +1 @@
1
- {"version":3,"file":"geocoder.cjs.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 { SearchItem } from './types/SearchItem';\nimport type CancelablePromise from '@nextgis/cancelable-promise';\nimport type { LngLatArray } from '@nextgis/utils';\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): CancelablePromise<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 CancelablePromise from '@nextgis/cancelable-promise';\n\nimport { BaseGeocoder } from './BaseGeocoder';\n\nimport type { GeocoderOptions } from './GeocoderOptions';\nimport type { BaseProvider } from './providers/BaseProvider';\nimport type { SearchItem } from './types/SearchItem';\nimport type { LngLatArray } from '@nextgis/utils';\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 !== 'CancelError') {\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): CancelablePromise<any> {\n if (item.provider) {\n return item.provider.result(item);\n }\n return CancelablePromise.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 (er) {\n // Handle or log errors as needed\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 { BaseProviderOptions } from './BaseProviderOptions';\nimport type { ResultItem } from '../types/ResultItem';\nimport type { SearchItem } from '../types/SearchItem';\nimport type CancelablePromise from '@nextgis/cancelable-promise';\nimport type {\n FeatureItem,\n NgwConnectorOptions,\n ResourceItem,\n} from '@nextgis/ngw-connector';\nimport type { FetchNgwItemsOptions } from '@nextgis/ngw-kit';\nimport type { LngLatArray } from '@nextgis/utils';\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: ResourceItem;\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: ResourceItem;\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 !== 'CancelError'\n ) {\n console.warn(er);\n }\n }\n }\n }\n\n result(item: NgwSearchItem): CancelablePromise<ResultItem> {\n const signal = this._makeSignal();\n const req = this.connector\n .get(\n 'feature_layer.feature.item_extent',\n { signal },\n {\n id: item.resourceId,\n fid: item.featureId,\n },\n )\n .then((x) => {\n const e = x.extent;\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: ResourceItem;\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 CancelablePromise from '@nextgis/cancelable-promise';\nimport { fixUrlStr } from '@nextgis/utils';\n\nimport { BaseProvider } from './BaseProvider';\n\nimport type { BaseProviderOptions } from './BaseProviderOptions';\nimport type { ResultItem } from '../types/ResultItem';\nimport type { SearchItem } from '../types/SearchItem';\nimport type { LngLatArray } from '@nextgis/utils';\nimport type { FeatureCollection } from 'geojson';\n\nexport class NominatimProvider extends BaseProvider {\n searchUrl = 'https://nominatim.openstreetmap.org';\n\n private _requests: CancelablePromise[] = [];\n\n constructor(options?: BaseProviderOptions) {\n super(options);\n if (options && options.searchUrl) {\n this.searchUrl = options.searchUrl;\n }\n }\n\n abort(): void {\n this._requests.forEach((x) => x.cancel());\n this._requests = [];\n }\n\n async *search(val: string): AsyncGenerator<SearchItem, void, unknown> {\n // RFC2616 accept - language string\n const url = fixUrlStr(\n // `${this.baseUrl}/search?format=geojson&polygon_geojson=1${window.locale === 'ru' ? '&accept-language=ru-RU,en-US' : ''}&q=${val}`\n `${this.searchUrl}/search?format=geojson&polygon_geojson=1&q=${val}`,\n );\n const request = new CancelablePromise<SearchItem[]>(\n (resolve, reject, onCancel) => {\n const xhr = new XMLHttpRequest();\n xhr.open('GET', url, true);\n xhr.onload = () => {\n try {\n const geojson = JSON.parse(xhr.responseText) 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 resolve(features);\n } catch (er) {\n reject(er);\n }\n };\n\n xhr.onerror = (er) => {\n reject(er);\n };\n\n onCancel(() => {\n xhr.abort();\n });\n\n xhr.send();\n },\n ).catch((er) => {\n if (er.name === 'CancelError') {\n //\n }\n throw er;\n });\n this._requests.push(request);\n const items = await request;\n if (items) {\n for (const i of items) {\n i.result = () => this.result(i);\n yield i;\n }\n }\n }\n\n result(model: SearchItem): CancelablePromise<ResultItem> {\n return CancelablePromise.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 url = fixUrlStr(\n `${this.searchUrl}/reverse?format=geojson&lat=${lat}&lon=${lng}`,\n );\n const request = new CancelablePromise<SearchItem>(\n (resolve, reject, onCancel) => {\n const xhr = new XMLHttpRequest();\n xhr.open('GET', url, true);\n xhr.onload = () => {\n try {\n const geojson = JSON.parse(xhr.responseText) as FeatureCollection;\n const feature = geojson.features[0];\n const result: SearchItem = {\n geom: feature,\n extent: feature.bbox,\n text: feature.properties && feature.properties.display_name,\n query: `${lat}, ${lng}`,\n };\n resolve(result);\n } catch (er) {\n reject(er);\n }\n };\n xhr.onerror = (er) => {\n reject(er);\n };\n\n onCancel(() => {\n xhr.abort();\n });\n\n xhr.send();\n },\n ).catch((er) => {\n if (er.name === 'CancelError') {\n //\n }\n throw er;\n });\n this._requests.push(request);\n const item = await request;\n if (item) {\n item.result = () => this.result(item);\n yield item;\n }\n }\n}\n","import { Geocoder } from './Geocoder';\n\nimport type { GeocoderOptions } from './GeocoderOptions';\n\nexport { Geocoder, GeocoderOptions };\nexport { BaseProvider } from './providers/BaseProvider';\nexport { NgwProvider } from './providers/NgwProvider';\nexport { NominatimProvider } from './providers/NominatimProvider';\n\nexport * from './providers/BaseProviderOptions';\nexport * from './types/ResultItem';\nexport * from './types/SearchItem';\n\nexport function create(options: GeocoderOptions): Geocoder {\n return new Geocoder(options);\n}\n"],"names":["objectAssign","__publicField","fetchNgwLayerItems","_a","fixUrlStr"],"mappings":"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"}
1
+ {"version":3,"file":"geocoder.cjs.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 { SearchItem } from './types/SearchItem';\nimport type { LngLatArray } from '@nextgis/utils';\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 { GeocoderOptions } from './GeocoderOptions';\nimport type { BaseProvider } from './providers/BaseProvider';\nimport type { SearchItem } from './types/SearchItem';\nimport type { LngLatArray } from '@nextgis/utils';\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 !== 'CancelError') {\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 (er) {\n // Handle or log errors as needed\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 { BaseProviderOptions } from './BaseProviderOptions';\nimport type { ResultItem } from '../types/ResultItem';\nimport type { SearchItem } from '../types/SearchItem';\nimport type {\n FeatureItem,\n NgwConnectorOptions,\n ResourceItem,\n} from '@nextgis/ngw-connector';\nimport type { FetchNgwItemsOptions } from '@nextgis/ngw-kit';\nimport type { LngLatArray } from '@nextgis/utils';\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: ResourceItem;\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: ResourceItem;\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 !== 'CancelError'\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 .get(\n 'feature_layer.feature.item_extent',\n { signal },\n {\n id: item.resourceId,\n fid: item.featureId,\n },\n )\n .then((x) => {\n const e = x.extent;\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: ResourceItem;\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 { BaseProviderOptions } from './BaseProviderOptions';\nimport type { ResultItem } from '../types/ResultItem';\nimport type { SearchItem } from '../types/SearchItem';\nimport type { LngLatArray } from '@nextgis/utils';\nimport type { FeatureCollection } from 'geojson';\n\nexport class NominatimProvider extends BaseProvider {\n searchUrl = 'https://nominatim.openstreetmap.org';\n\n private _abort: (() => void)[] = [];\n\n constructor(options?: BaseProviderOptions) {\n super(options);\n if (options && options.searchUrl) {\n this.searchUrl = options.searchUrl;\n }\n }\n\n abort(): void {\n this._abort.forEach((x) => x());\n this._abort = [];\n }\n\n async *search(val: string): AsyncGenerator<SearchItem, void, unknown> {\n // RFC2616 accept - language string\n const url = fixUrlStr(\n // `${this.baseUrl}/search?format=geojson&polygon_geojson=1${window.locale === 'ru' ? '&accept-language=ru-RU,en-US' : ''}&q=${val}`\n `${this.searchUrl}/search?format=geojson&polygon_geojson=1&q=${val}`,\n );\n const request = new Promise<SearchItem[]>((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open('GET', url, true);\n xhr.onload = () => {\n try {\n const geojson = JSON.parse(xhr.responseText) 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 resolve(features);\n } catch (er) {\n reject(er);\n }\n };\n\n xhr.onerror = (er) => {\n reject(er);\n };\n\n this._abort.push(xhr.abort);\n\n xhr.send();\n }).catch((er) => {\n if (er.name === 'CancelError') {\n //\n }\n throw er;\n });\n const items = await request;\n if (items) {\n for (const i of items) {\n i.result = () => this.result(i);\n yield i;\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 url = fixUrlStr(\n `${this.searchUrl}/reverse?format=geojson&lat=${lat}&lon=${lng}`,\n );\n const request = new Promise<SearchItem>((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open('GET', url, true);\n xhr.onload = () => {\n try {\n const geojson = JSON.parse(xhr.responseText) as FeatureCollection;\n const feature = geojson.features[0];\n const result: SearchItem = {\n geom: feature,\n extent: feature.bbox,\n text: feature.properties && feature.properties.display_name,\n query: `${lat}, ${lng}`,\n };\n resolve(result);\n } catch (er) {\n reject(er);\n }\n };\n xhr.onerror = (er) => {\n reject(er);\n };\n\n this._abort.push(xhr.abort);\n\n xhr.send();\n }).catch((er) => {\n if (er.name === 'CancelError') {\n //\n }\n throw er;\n });\n\n const item = await request;\n if (item) {\n item.result = () => this.result(item);\n yield item;\n }\n }\n}\n","import { Geocoder } from './Geocoder';\n\nimport type { GeocoderOptions } from './GeocoderOptions';\n\nexport { Geocoder, GeocoderOptions };\nexport { BaseProvider } from './providers/BaseProvider';\nexport { NgwProvider } from './providers/NgwProvider';\nexport { NominatimProvider } from './providers/NominatimProvider';\n\nexport * from './providers/BaseProviderOptions';\nexport * from './types/ResultItem';\nexport * from './types/SearchItem';\n\nexport function create(options: GeocoderOptions): Geocoder {\n return new Geocoder(options);\n}\n"],"names":["objectAssign","__publicField","fetchNgwLayerItems","_a","fixUrlStr"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@nextgis/cancelable-promise"),r=require("@nextgis/utils"),t=require("@nextgis/ngw-connector"),s=require("@nextgis/ngw-kit");class o{constructor(e){e&&r.objectAssign(this,e)}}var n=Object.defineProperty,i=(e,r,t)=>((e,r,t)=>r in e?n(e,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[r]=t)(e,"symbol"!=typeof r?r+"":r,t);let a=0;class c extends o{constructor(e){super(e),i(this,"providers",[]),e&&e.providers&&(this.providers=e.providers)}abort(){this.providers.forEach((e=>{e.abort&&e.abort()}))}async*search(e){this.abort();let r=!0;const t=[];for(const o of this.providers)try{const t=o.search(e);for await(const e of t)r=!1,yield{...e,provider:o,_id:a++}}catch(s){"CancelError"!==s.name&&t.push(s)}if(r&&t.length)throw new Error(`All providers failed: ${t.map((e=>e.message)).join("; ")}`)}result(r){return r.provider?r.provider.result(r):e.resolve(void 0)}async*reverse(e){for(const t of this.providers)if(t.reverse)try{const r=t.reverse(e);for await(const e of r)yield{...e,provider:t,_id:a++}}catch(r){}}async reverseGeocodeFirstResult(e){for(const t of this.providers)if("function"==typeof t.reverse)try{for await(const r of t.reverse(e))return r}catch(r){console.error("Error in reverse geocoding:",r)}}}var l=Object.defineProperty,u=(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);class h extends o{constructor(){super(...arguments),u(this,"searchUrl"),u(this,"label")}}var d=Object.defineProperty,f=(e,r,t)=>((e,r,t)=>r in e?d(e,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[r]=t)(e,"symbol"!=typeof r?r+"":r,t);const p=class e extends h{constructor(e){var r;if(super(e),f(this,"searchResources",[]),f(this,"connector"),f(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({baseUrl:this.searchUrl,...e.connectorOptions}),this.searchResources=e.searchResources}abort(){this._abortControllers.forEach((e=>{e.abort()})),this._abortControllers.length=0}async*search(r){var t,o;const n=this._makeSignal();for(const a of this.searchResources){if(n.aborted)break;const{searchMethod:c}=a,l=null!=(t=a.limit)?t:e.limit,u=null!=(o=a.id)?o:a.resourceId;try{const e=await this.connector.getResourceOrFail(u,{cache:!0}),t={connector:this.connector,resourceId:u,signal:n,limit:l};"like"===c?t.like=r:t.ilike=r;const o=s.fetchNgwLayerItems(t),i=await o;for(const s of this._items({entries:i,query:r,config:a,resourceItem:e}))s.result=()=>this.result(s),yield s}catch(i){i&&"name"in i&&"CancelError"!==i.name&&console.warn(i)}}}result(e){const r=this._makeSignal();return this.connector.get("feature_layer.feature.item_extent",{signal:r},{id:e.resourceId,fid:e.featureId}).then((r=>{const t=r.extent;return{text:e.text,extent:[t.minLon,t.minLat,t.maxLon,t.maxLat]}}))}async*reverse(e){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:s}){var o;const n=[];let i;s.feature_layer&&(i=null==(o=s.feature_layer.fields.find((e=>e.label_field)))?void 0:o.keyname);return this.searchResources.find((e=>{var r;return null!=(r=e.id)?r:e.resourceId===s.resource.id}))&&e.forEach((e=>{let o=i?e.fields[i]:e.id;t.renderSearch?o=t.renderSearch({item:e,resourceItem:s}):i&&(o=e.fields[i]),n.push({query:r,text:o,featureId:e.id,resourceId:s.resource.id,item:e,resourceItem:s})})),n}};f(p,"limit",300);let m=p;var b=Object.defineProperty,v=(e,r,t)=>((e,r,t)=>r in e?b(e,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[r]=t)(e,"symbol"!=typeof r?r+"":r,t);exports.BaseProvider=h,exports.Geocoder=c,exports.NgwProvider=m,exports.NominatimProvider=class extends h{constructor(e){super(e),v(this,"searchUrl","https://nominatim.openstreetmap.org"),v(this,"_requests",[]),e&&e.searchUrl&&(this.searchUrl=e.searchUrl)}abort(){this._requests.forEach((e=>e.cancel())),this._requests=[]}async*search(t){const s=r.fixUrlStr(`${this.searchUrl}/search?format=geojson&polygon_geojson=1&q=${t}`),o=new e(((e,r,o)=>{const n=new XMLHttpRequest;n.open("GET",s,!0),n.onload=()=>{try{const r=JSON.parse(n.responseText).features.map((e=>({geom:e,extent:e.bbox,text:e.properties&&e.properties.display_name,query:t})));e(r)}catch(s){r(s)}},n.onerror=e=>{r(e)},o((()=>{n.abort()})),n.send()})).catch((e=>{throw e}));this._requests.push(o);const n=await o;if(n)for(const e of n)e.result=()=>this.result(e),yield e}result(r){return e.resolve({text:r.text,extent:r.extent||[],geom:r.geom})}async*reverse(t){const[s,o]=t,n=r.fixUrlStr(`${this.searchUrl}/reverse?format=geojson&lat=${o}&lon=${s}`),i=new e(((e,r,t)=>{const i=new XMLHttpRequest;i.open("GET",n,!0),i.onload=()=>{try{const r=JSON.parse(i.responseText).features[0];e({geom:r,extent:r.bbox,text:r.properties&&r.properties.display_name,query:`${o}, ${s}`})}catch(t){r(t)}},i.onerror=e=>{r(e)},t((()=>{i.abort()})),i.send()})).catch((e=>{throw e}));this._requests.push(i);const a=await i;a&&(a.result=()=>this.result(a),yield a)}},exports.create=function(e){return new c(e)};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@nextgis/utils"),r=require("@nextgis/ngw-connector"),t=require("@nextgis/ngw-kit");class o{constructor(r){r&&e.objectAssign(this,r)}}var s=Object.defineProperty,n=(e,r,t)=>((e,r,t)=>r in e?s(e,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[r]=t)(e,r+"",t);let i=0;class a extends o{constructor(e){super(e),n(this,"providers",[]),e&&e.providers&&(this.providers=e.providers)}abort(){this.providers.forEach((e=>{e.abort&&e.abort()}))}async*search(e){this.abort();let r=!0;const t=[];for(const s of this.providers)try{const t=s.search(e);for await(const e of t)r=!1,yield{...e,provider:s,_id:i++}}catch(o){"CancelError"!==o.name&&t.push(o)}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)}async*reverse(e){for(const t of this.providers)if(t.reverse)try{const r=t.reverse(e);for await(const e of r)yield{...e,provider:t,_id:i++}}catch(r){}}async reverseGeocodeFirstResult(e){for(const t of this.providers)if("function"==typeof t.reverse)try{for await(const r of t.reverse(e))return r}catch(r){console.error("Error in reverse geocoding:",r)}}}var c=Object.defineProperty,l=(e,r,t)=>((e,r,t)=>r in e?c(e,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[r]=t)(e,"symbol"!=typeof r?r+"":r,t);class u extends o{constructor(){super(...arguments),l(this,"searchUrl"),l(this,"label")}}var h=Object.defineProperty,d=(e,r,t)=>((e,r,t)=>r in e?h(e,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[r]=t)(e,"symbol"!=typeof r?r+"":r,t);const f=class e extends u{constructor(e){var t;if(super(e),d(this,"searchResources",[]),d(this,"connector"),d(this,"_abortControllers",[]),!e.searchUrl&&!(null==(t=e.connectorOptions)?void 0:t.baseUrl))throw new Error("The `searchUrl` of `connectorOptions.baseUrl` are required");this.connector=e.connector||new r({baseUrl:this.searchUrl,...e.connectorOptions}),this.searchResources=e.searchResources}abort(){this._abortControllers.forEach((e=>{e.abort()})),this._abortControllers.length=0}async*search(r){var o,s;const n=this._makeSignal();for(const a of this.searchResources){if(n.aborted)break;const{searchMethod:c}=a,l=null!=(o=a.limit)?o:e.limit,u=null!=(s=a.id)?s:a.resourceId;try{const e=await this.connector.getResourceOrFail(u,{cache:!0}),o={connector:this.connector,resourceId:u,signal:n,limit:l};"like"===c?o.like=r:o.ilike=r;const s=t.fetchNgwLayerItems(o),i=await s;for(const t of this._items({entries:i,query:r,config:a,resourceItem:e}))t.result=()=>this.result(t),yield t}catch(i){i&&"name"in i&&"CancelError"!==i.name&&console.warn(i)}}}result(e){const r=this._makeSignal();return this.connector.get("feature_layer.feature.item_extent",{signal:r},{id:e.resourceId,fid:e.featureId}).then((r=>{const t=r.extent;return{text:e.text,extent:[t.minLon,t.minLat,t.maxLon,t.maxLat]}}))}async*reverse(e){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 s;const n=[];let i;o.feature_layer&&(i=null==(s=o.feature_layer.fields.find((e=>e.label_field)))?void 0:s.keyname);return this.searchResources.find((e=>{var r;return null!=(r=e.id)?r:e.resourceId===o.resource.id}))&&e.forEach((e=>{let s=i?e.fields[i]:e.id;t.renderSearch?s=t.renderSearch({item:e,resourceItem:o}):i&&(s=e.fields[i]),n.push({query:r,text:s,featureId:e.id,resourceId:o.resource.id,item:e,resourceItem:o})})),n}};d(f,"limit",300);let p=f;var m=Object.defineProperty,b=(e,r,t)=>((e,r,t)=>r in e?m(e,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[r]=t)(e,"symbol"!=typeof r?r+"":r,t);exports.BaseProvider=u,exports.Geocoder=a,exports.NgwProvider=p,exports.NominatimProvider=class extends u{constructor(e){super(e),b(this,"searchUrl","https://nominatim.openstreetmap.org"),b(this,"_abort",[]),e&&e.searchUrl&&(this.searchUrl=e.searchUrl)}abort(){this._abort.forEach((e=>e())),this._abort=[]}async*search(r){const t=e.fixUrlStr(`${this.searchUrl}/search?format=geojson&polygon_geojson=1&q=${r}`),o=new Promise(((e,o)=>{const s=new XMLHttpRequest;s.open("GET",t,!0),s.onload=()=>{try{const t=JSON.parse(s.responseText).features.map((e=>({geom:e,extent:e.bbox,text:e.properties&&e.properties.display_name,query:r})));e(t)}catch(t){o(t)}},s.onerror=e=>{o(e)},this._abort.push(s.abort),s.send()})).catch((e=>{throw e})),s=await o;if(s)for(const e of s)e.result=()=>this.result(e),yield e}result(e){return Promise.resolve({text:e.text,extent:e.extent||[],geom:e.geom})}async*reverse(r){const[t,o]=r,s=e.fixUrlStr(`${this.searchUrl}/reverse?format=geojson&lat=${o}&lon=${t}`),n=new Promise(((e,r)=>{const n=new XMLHttpRequest;n.open("GET",s,!0),n.onload=()=>{try{const r=JSON.parse(n.responseText).features[0];e({geom:r,extent:r.bbox,text:r.properties&&r.properties.display_name,query:`${o}, ${t}`})}catch(s){r(s)}},n.onerror=e=>{r(e)},this._abort.push(n.abort),n.send()})).catch((e=>{throw e})),i=await n;i&&(i.result=()=>this.result(i),yield i)}},exports.create=function(e){return new a(e)};
2
2
  //# sourceMappingURL=geocoder.cjs.prod.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"geocoder.cjs.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 { SearchItem } from './types/SearchItem';\nimport type CancelablePromise from '@nextgis/cancelable-promise';\nimport type { LngLatArray } from '@nextgis/utils';\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): CancelablePromise<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 CancelablePromise from '@nextgis/cancelable-promise';\n\nimport { BaseGeocoder } from './BaseGeocoder';\n\nimport type { GeocoderOptions } from './GeocoderOptions';\nimport type { BaseProvider } from './providers/BaseProvider';\nimport type { SearchItem } from './types/SearchItem';\nimport type { LngLatArray } from '@nextgis/utils';\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 !== 'CancelError') {\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): CancelablePromise<any> {\n if (item.provider) {\n return item.provider.result(item);\n }\n return CancelablePromise.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 (er) {\n // Handle or log errors as needed\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 { BaseProviderOptions } from './BaseProviderOptions';\nimport type { ResultItem } from '../types/ResultItem';\nimport type { SearchItem } from '../types/SearchItem';\nimport type CancelablePromise from '@nextgis/cancelable-promise';\nimport type {\n FeatureItem,\n NgwConnectorOptions,\n ResourceItem,\n} from '@nextgis/ngw-connector';\nimport type { FetchNgwItemsOptions } from '@nextgis/ngw-kit';\nimport type { LngLatArray } from '@nextgis/utils';\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: ResourceItem;\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: ResourceItem;\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 !== 'CancelError'\n ) {\n console.warn(er);\n }\n }\n }\n }\n\n result(item: NgwSearchItem): CancelablePromise<ResultItem> {\n const signal = this._makeSignal();\n const req = this.connector\n .get(\n 'feature_layer.feature.item_extent',\n { signal },\n {\n id: item.resourceId,\n fid: item.featureId,\n },\n )\n .then((x) => {\n const e = x.extent;\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: ResourceItem;\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 CancelablePromise from '@nextgis/cancelable-promise';\nimport { fixUrlStr } from '@nextgis/utils';\n\nimport { BaseProvider } from './BaseProvider';\n\nimport type { BaseProviderOptions } from './BaseProviderOptions';\nimport type { ResultItem } from '../types/ResultItem';\nimport type { SearchItem } from '../types/SearchItem';\nimport type { LngLatArray } from '@nextgis/utils';\nimport type { FeatureCollection } from 'geojson';\n\nexport class NominatimProvider extends BaseProvider {\n searchUrl = 'https://nominatim.openstreetmap.org';\n\n private _requests: CancelablePromise[] = [];\n\n constructor(options?: BaseProviderOptions) {\n super(options);\n if (options && options.searchUrl) {\n this.searchUrl = options.searchUrl;\n }\n }\n\n abort(): void {\n this._requests.forEach((x) => x.cancel());\n this._requests = [];\n }\n\n async *search(val: string): AsyncGenerator<SearchItem, void, unknown> {\n // RFC2616 accept - language string\n const url = fixUrlStr(\n // `${this.baseUrl}/search?format=geojson&polygon_geojson=1${window.locale === 'ru' ? '&accept-language=ru-RU,en-US' : ''}&q=${val}`\n `${this.searchUrl}/search?format=geojson&polygon_geojson=1&q=${val}`,\n );\n const request = new CancelablePromise<SearchItem[]>(\n (resolve, reject, onCancel) => {\n const xhr = new XMLHttpRequest();\n xhr.open('GET', url, true);\n xhr.onload = () => {\n try {\n const geojson = JSON.parse(xhr.responseText) 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 resolve(features);\n } catch (er) {\n reject(er);\n }\n };\n\n xhr.onerror = (er) => {\n reject(er);\n };\n\n onCancel(() => {\n xhr.abort();\n });\n\n xhr.send();\n },\n ).catch((er) => {\n if (er.name === 'CancelError') {\n //\n }\n throw er;\n });\n this._requests.push(request);\n const items = await request;\n if (items) {\n for (const i of items) {\n i.result = () => this.result(i);\n yield i;\n }\n }\n }\n\n result(model: SearchItem): CancelablePromise<ResultItem> {\n return CancelablePromise.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 url = fixUrlStr(\n `${this.searchUrl}/reverse?format=geojson&lat=${lat}&lon=${lng}`,\n );\n const request = new CancelablePromise<SearchItem>(\n (resolve, reject, onCancel) => {\n const xhr = new XMLHttpRequest();\n xhr.open('GET', url, true);\n xhr.onload = () => {\n try {\n const geojson = JSON.parse(xhr.responseText) as FeatureCollection;\n const feature = geojson.features[0];\n const result: SearchItem = {\n geom: feature,\n extent: feature.bbox,\n text: feature.properties && feature.properties.display_name,\n query: `${lat}, ${lng}`,\n };\n resolve(result);\n } catch (er) {\n reject(er);\n }\n };\n xhr.onerror = (er) => {\n reject(er);\n };\n\n onCancel(() => {\n xhr.abort();\n });\n\n xhr.send();\n },\n ).catch((er) => {\n if (er.name === 'CancelError') {\n //\n }\n throw er;\n });\n this._requests.push(request);\n const item = await request;\n if (item) {\n item.result = () => this.result(item);\n yield item;\n }\n }\n}\n","import { Geocoder } from './Geocoder';\n\nimport type { GeocoderOptions } from './GeocoderOptions';\n\nexport { Geocoder, GeocoderOptions };\nexport { BaseProvider } from './providers/BaseProvider';\nexport { NgwProvider } from './providers/NgwProvider';\nexport { NominatimProvider } from './providers/NominatimProvider';\n\nexport * from './providers/BaseProviderOptions';\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","__publicField","providers","abort","forEach","x","search","query","allProvidersFailed","errors","provider","results","r","_id","err","name","push","length","Error","map","e","message","join","result","item","CancelablePromise","resolve","reverse","coordinates","er","reverseGeocodeFirstResult","error","console","BaseProvider","arguments","_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","warn","get","fid","featureId","then","extent","text","minLon","minLat","maxLon","maxLat","abortController","AbortController","items","labelField","feature_layer","fields","find","f","label_field","keyname","entry","renderSearch","NgwProvider","_requests","cancel","val","url","fixUrlStr","reject","onCancel","xhr","XMLHttpRequest","open","onload","features","JSON","parse","responseText","geom","bbox","properties","display_name","onerror","send","catch","i","model","lng","lat","feature"],"mappings":"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"}
1
+ {"version":3,"file":"geocoder.cjs.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 { SearchItem } from './types/SearchItem';\nimport type { LngLatArray } from '@nextgis/utils';\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 { GeocoderOptions } from './GeocoderOptions';\nimport type { BaseProvider } from './providers/BaseProvider';\nimport type { SearchItem } from './types/SearchItem';\nimport type { LngLatArray } from '@nextgis/utils';\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 !== 'CancelError') {\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 (er) {\n // Handle or log errors as needed\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 { BaseProviderOptions } from './BaseProviderOptions';\nimport type { ResultItem } from '../types/ResultItem';\nimport type { SearchItem } from '../types/SearchItem';\nimport type {\n FeatureItem,\n NgwConnectorOptions,\n ResourceItem,\n} from '@nextgis/ngw-connector';\nimport type { FetchNgwItemsOptions } from '@nextgis/ngw-kit';\nimport type { LngLatArray } from '@nextgis/utils';\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: ResourceItem;\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: ResourceItem;\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 !== 'CancelError'\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 .get(\n 'feature_layer.feature.item_extent',\n { signal },\n {\n id: item.resourceId,\n fid: item.featureId,\n },\n )\n .then((x) => {\n const e = x.extent;\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: ResourceItem;\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 { BaseProviderOptions } from './BaseProviderOptions';\nimport type { ResultItem } from '../types/ResultItem';\nimport type { SearchItem } from '../types/SearchItem';\nimport type { LngLatArray } from '@nextgis/utils';\nimport type { FeatureCollection } from 'geojson';\n\nexport class NominatimProvider extends BaseProvider {\n searchUrl = 'https://nominatim.openstreetmap.org';\n\n private _abort: (() => void)[] = [];\n\n constructor(options?: BaseProviderOptions) {\n super(options);\n if (options && options.searchUrl) {\n this.searchUrl = options.searchUrl;\n }\n }\n\n abort(): void {\n this._abort.forEach((x) => x());\n this._abort = [];\n }\n\n async *search(val: string): AsyncGenerator<SearchItem, void, unknown> {\n // RFC2616 accept - language string\n const url = fixUrlStr(\n // `${this.baseUrl}/search?format=geojson&polygon_geojson=1${window.locale === 'ru' ? '&accept-language=ru-RU,en-US' : ''}&q=${val}`\n `${this.searchUrl}/search?format=geojson&polygon_geojson=1&q=${val}`,\n );\n const request = new Promise<SearchItem[]>((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open('GET', url, true);\n xhr.onload = () => {\n try {\n const geojson = JSON.parse(xhr.responseText) 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 resolve(features);\n } catch (er) {\n reject(er);\n }\n };\n\n xhr.onerror = (er) => {\n reject(er);\n };\n\n this._abort.push(xhr.abort);\n\n xhr.send();\n }).catch((er) => {\n if (er.name === 'CancelError') {\n //\n }\n throw er;\n });\n const items = await request;\n if (items) {\n for (const i of items) {\n i.result = () => this.result(i);\n yield i;\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 url = fixUrlStr(\n `${this.searchUrl}/reverse?format=geojson&lat=${lat}&lon=${lng}`,\n );\n const request = new Promise<SearchItem>((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open('GET', url, true);\n xhr.onload = () => {\n try {\n const geojson = JSON.parse(xhr.responseText) as FeatureCollection;\n const feature = geojson.features[0];\n const result: SearchItem = {\n geom: feature,\n extent: feature.bbox,\n text: feature.properties && feature.properties.display_name,\n query: `${lat}, ${lng}`,\n };\n resolve(result);\n } catch (er) {\n reject(er);\n }\n };\n xhr.onerror = (er) => {\n reject(er);\n };\n\n this._abort.push(xhr.abort);\n\n xhr.send();\n }).catch((er) => {\n if (er.name === 'CancelError') {\n //\n }\n throw er;\n });\n\n const item = await request;\n if (item) {\n item.result = () => this.result(item);\n yield item;\n }\n }\n}\n","import { Geocoder } from './Geocoder';\n\nimport type { GeocoderOptions } from './GeocoderOptions';\n\nexport { Geocoder, GeocoderOptions };\nexport { BaseProvider } from './providers/BaseProvider';\nexport { NgwProvider } from './providers/NgwProvider';\nexport { NominatimProvider } from './providers/NominatimProvider';\n\nexport * from './providers/BaseProviderOptions';\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","__publicField","providers","abort","forEach","x","search","query","allProvidersFailed","errors","provider","results","r","_id","err","name","push","length","Error","map","e","message","join","result","item","Promise","resolve","reverse","coordinates","er","reverseGeocodeFirstResult","error","console","BaseProvider","arguments","_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","warn","get","fid","featureId","then","extent","text","minLon","minLat","maxLon","maxLat","abortController","AbortController","items","labelField","feature_layer","fields","find","f","label_field","keyname","entry","renderSearch","NgwProvider","_abort","val","url","fixUrlStr","reject","xhr","XMLHttpRequest","open","onload","features","JSON","parse","responseText","geom","bbox","properties","display_name","onerror","send","catch","i","model","lng","lat","feature"],"mappings":"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"}