@nextgis/geocoder 1.9.2 → 1.11.2
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.
- package/lib/geocoder.cjs.js +2 -2
- package/lib/geocoder.cjs.js.map +1 -1
- package/lib/geocoder.cjs.prod.js +1 -1
- package/lib/geocoder.cjs.prod.js.map +1 -1
- package/lib/geocoder.esm-browser.js +190 -48
- package/lib/geocoder.esm-browser.js.map +1 -1
- package/lib/geocoder.esm-browser.prod.js +1 -1
- package/lib/geocoder.esm-browser.prod.js.map +1 -1
- package/lib/geocoder.esm-bundler.js +2 -2
- package/lib/geocoder.esm-bundler.js.map +1 -1
- package/lib/geocoder.esm-bundler.prod.js +1 -1
- package/lib/geocoder.esm-bundler.prod.js.map +1 -1
- package/lib/geocoder.global.js +234 -59
- package/lib/geocoder.global.js.map +1 -1
- package/lib/geocoder.global.prod.js +1 -1
- package/lib/geocoder.global.prod.js.map +1 -1
- package/package.json +6 -6
package/lib/geocoder.cjs.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** Bundle of @nextgis/geocoder; version: 1.
|
|
1
|
+
/** Bundle of @nextgis/geocoder; version: 1.11.2; author: NextGIS */
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
@@ -91,7 +91,7 @@ class NgwProvider extends BaseProvider {
|
|
|
91
91
|
});
|
|
92
92
|
this.requests.push(request);
|
|
93
93
|
request.catch((er) => {
|
|
94
|
-
console.
|
|
94
|
+
console.warn(er);
|
|
95
95
|
});
|
|
96
96
|
const resp = await request;
|
|
97
97
|
const entries = [];
|
package/lib/geocoder.cjs.js.map
CHANGED
|
@@ -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';\nimport CancelablePromise from '@nextgis/cancelable-promise';\nimport { SearchItem } from './types/SearchItem';\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 abstract search(query: string): AsyncGenerator<SearchItem>;\n\n abstract result(item: SearchItem): CancelablePromise<any>;\n\n abstract abort?(): void;\n}\n","import CancelablePromise from '@nextgis/cancelable-promise';\nimport { BaseProvider } from './providers/BaseProvider';\nimport { GeocoderOptions } from './GeocoderOptions';\nimport { BaseGeocoder } from './BaseGeocoder';\nimport { SearchItem } from './types/SearchItem';\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 for (const provider of this.providers) {\n try {\n const results = provider.search(query);\n\n for await (const r of results) {\n yield { ...r, provider, _id: ID++ };\n }\n } catch (er) {\n //\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","import { BaseProviderOptions } from './BaseProviderOptions';\nimport { BaseGeocoder } from '../BaseGeocoder';\n\nexport abstract class BaseProvider<\n O extends BaseProviderOptions = BaseProviderOptions,\n> extends BaseGeocoder<O> {\n searchUrl?: string;\n label?: string;\n}\n","import NgwConnector, { ResourceStoreItem } from '@nextgis/ngw-connector';\nimport CancelablePromise from '@nextgis/cancelable-promise';\nimport { BaseProvider } from './BaseProvider';\nimport { BaseProviderOptions } from './BaseProviderOptions';\nimport { SearchItem } from '../types/SearchItem';\nimport { ResultItem } from '../types/ResultItem';\n\ninterface NgwSearchItem extends SearchItem {\n resourceId: number;\n featureId: number;\n}\n\ninterface SearchResource {\n id: number;\n limit?: number;\n}\n\ninterface NgwProviderOptions extends BaseProviderOptions {\n connector?: NgwConnector;\n searchResources: SearchResource[];\n}\n\nexport class NgwProvider extends BaseProvider<NgwProviderOptions> {\n caseInsensitive = true;\n searchUrl = 'https://maxim.nextgis.com';\n searchResources: SearchResource[] = [];\n private connector: NgwConnector;\n private requests: CancelablePromise[] = [];\n\n constructor(options: NgwProviderOptions) {\n super(options);\n\n this.connector =\n options.connector ||\n new NgwConnector({\n baseUrl: this.searchUrl,\n });\n this.searchResources = options.searchResources;\n }\n\n abort(): void {\n this.requests.forEach((x) => {\n x.cancel();\n });\n this.requests = [];\n }\n\n async *search(like: string): AsyncGenerator<NgwSearchItem, void, unknown> {\n for (const resource of this.searchResources) {\n const limit = resource.limit || 300;\n const request = this.connector.get(\n 'feature_layer.store',\n {\n headers: { RANGE: `items=0-${limit}` },\n },\n {\n id: resource.id,\n like,\n },\n );\n this.requests.push(request);\n request.catch((er) => {\n console.log(er);\n });\n const resp = await request;\n const entries: ResourceStoreItem[] = [];\n if (resp) {\n resp.forEach((x) => {\n entries.push({\n query: like,\n resourceId: resource.id,\n ...x,\n });\n });\n }\n for (const item of this._items(entries)) {\n item.result = () => this.result(item);\n yield item;\n }\n }\n }\n\n result(item: NgwSearchItem): CancelablePromise<ResultItem> {\n const req = this.connector\n .get('feature_layer.feature.item_extent', null, {\n id: item.resourceId,\n fid: item.featureId,\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 this.requests.push(req);\n return req;\n }\n\n _items(entries: ResourceStoreItem[]): NgwSearchItem[] {\n const items: NgwSearchItem[] = [];\n entries.forEach((entry) => {\n const meta = this.searchResources.find((x) => x.id === entry.resourceId);\n if (meta) {\n items.push({\n query: entry.query,\n text: entry.label,\n featureId: entry.id,\n resourceId: entry.resourceId,\n });\n }\n });\n return items;\n }\n}\n","import { fixUrlStr } from '@nextgis/utils';\nimport CancelablePromise from '@nextgis/cancelable-promise';\nimport { BaseProvider } from './BaseProvider';\nimport { BaseProviderOptions } from './BaseProviderOptions';\nimport { FeatureCollection } from 'geojson';\nimport { SearchItem } from '../types/SearchItem';\nimport { ResultItem } from '../types/ResultItem';\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 }\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","/**\n * Modern geocoder on async generators. May use different data providers.\n *\n * @packageDocumentation\n * @module geocoder\n */\nimport { GeocoderOptions } from './GeocoderOptions';\nimport { Geocoder } from './Geocoder';\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","CancelablePromise","NgwConnector","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';\nimport CancelablePromise from '@nextgis/cancelable-promise';\nimport { SearchItem } from './types/SearchItem';\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 abstract search(query: string): AsyncGenerator<SearchItem>;\n\n abstract result(item: SearchItem): CancelablePromise<any>;\n\n abstract abort?(): void;\n}\n","import CancelablePromise from '@nextgis/cancelable-promise';\nimport { BaseProvider } from './providers/BaseProvider';\nimport { GeocoderOptions } from './GeocoderOptions';\nimport { BaseGeocoder } from './BaseGeocoder';\nimport { SearchItem } from './types/SearchItem';\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 for (const provider of this.providers) {\n try {\n const results = provider.search(query);\n\n for await (const r of results) {\n yield { ...r, provider, _id: ID++ };\n }\n } catch (er) {\n //\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","import { BaseProviderOptions } from './BaseProviderOptions';\nimport { BaseGeocoder } from '../BaseGeocoder';\n\nexport abstract class BaseProvider<\n O extends BaseProviderOptions = BaseProviderOptions,\n> extends BaseGeocoder<O> {\n searchUrl?: string;\n label?: string;\n}\n","import NgwConnector, { ResourceStoreItem } from '@nextgis/ngw-connector';\nimport CancelablePromise from '@nextgis/cancelable-promise';\nimport { BaseProvider } from './BaseProvider';\nimport { BaseProviderOptions } from './BaseProviderOptions';\nimport { SearchItem } from '../types/SearchItem';\nimport { ResultItem } from '../types/ResultItem';\n\ninterface NgwSearchItem extends SearchItem {\n resourceId: number;\n featureId: number;\n}\n\ninterface SearchResource {\n id: number;\n limit?: number;\n}\n\ninterface NgwProviderOptions extends BaseProviderOptions {\n connector?: NgwConnector;\n searchResources: SearchResource[];\n}\n\nexport class NgwProvider extends BaseProvider<NgwProviderOptions> {\n caseInsensitive = true;\n searchUrl = 'https://maxim.nextgis.com';\n searchResources: SearchResource[] = [];\n private connector: NgwConnector;\n private requests: CancelablePromise[] = [];\n\n constructor(options: NgwProviderOptions) {\n super(options);\n\n this.connector =\n options.connector ||\n new NgwConnector({\n baseUrl: this.searchUrl,\n });\n this.searchResources = options.searchResources;\n }\n\n abort(): void {\n this.requests.forEach((x) => {\n x.cancel();\n });\n this.requests = [];\n }\n\n async *search(like: string): AsyncGenerator<NgwSearchItem, void, unknown> {\n for (const resource of this.searchResources) {\n const limit = resource.limit || 300;\n const request = this.connector.get(\n 'feature_layer.store',\n {\n headers: { RANGE: `items=0-${limit}` },\n },\n {\n id: resource.id,\n like,\n },\n );\n this.requests.push(request);\n request.catch((er) => {\n console.warn(er);\n });\n const resp = await request;\n const entries: ResourceStoreItem[] = [];\n if (resp) {\n resp.forEach((x) => {\n entries.push({\n query: like,\n resourceId: resource.id,\n ...x,\n });\n });\n }\n for (const item of this._items(entries)) {\n item.result = () => this.result(item);\n yield item;\n }\n }\n }\n\n result(item: NgwSearchItem): CancelablePromise<ResultItem> {\n const req = this.connector\n .get('feature_layer.feature.item_extent', null, {\n id: item.resourceId,\n fid: item.featureId,\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 this.requests.push(req);\n return req;\n }\n\n _items(entries: ResourceStoreItem[]): NgwSearchItem[] {\n const items: NgwSearchItem[] = [];\n entries.forEach((entry) => {\n const meta = this.searchResources.find((x) => x.id === entry.resourceId);\n if (meta) {\n items.push({\n query: entry.query,\n text: entry.label,\n featureId: entry.id,\n resourceId: entry.resourceId,\n });\n }\n });\n return items;\n }\n}\n","import { fixUrlStr } from '@nextgis/utils';\nimport CancelablePromise from '@nextgis/cancelable-promise';\nimport { BaseProvider } from './BaseProvider';\nimport { BaseProviderOptions } from './BaseProviderOptions';\nimport { FeatureCollection } from 'geojson';\nimport { SearchItem } from '../types/SearchItem';\nimport { ResultItem } from '../types/ResultItem';\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 }\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","/**\n * Modern geocoder on async generators. May use different data providers.\n *\n * @packageDocumentation\n * @module geocoder\n */\nimport { GeocoderOptions } from './GeocoderOptions';\nimport { Geocoder } from './Geocoder';\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","CancelablePromise","NgwConnector","fixUrlStr"],"mappings":"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"}
|
package/lib/geocoder.cjs.prod.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@nextgis/cancelable-promise"),t=require("@nextgis/utils"),s=require("@nextgis/ngw-connector");function r(e){return e&&"object"==typeof e&&"default"in e?e.default:e}var o=r(e),c=r(s);class i{constructor(e){e&&t.objectAssign(this,e)}}let n=0;class a extends i{constructor(e){super(e),this.providers=[],e&&e.providers&&(this.providers=e.providers)}abort(){this.providers.forEach((e=>{e.abort&&e.abort()}))}async*search(e){for(const
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@nextgis/cancelable-promise"),t=require("@nextgis/utils"),s=require("@nextgis/ngw-connector");function r(e){return e&&"object"==typeof e&&"default"in e?e.default:e}var o=r(e),c=r(s);class i{constructor(e){e&&t.objectAssign(this,e)}}let n=0;class a extends i{constructor(e){super(e),this.providers=[],e&&e.providers&&(this.providers=e.providers)}abort(){this.providers.forEach((e=>{e.abort&&e.abort()}))}async*search(e){for(const s of this.providers)try{const t=s.search(e);for await(const e of t)yield{...e,provider:s,_id:n++}}catch(t){}}result(e){return e.provider?e.provider.result(e):o.resolve(void 0)}}class u extends i{}exports.BaseProvider=u,exports.Geocoder=a,exports.NgwProvider=class extends u{constructor(e){super(e),this.caseInsensitive=!0,this.searchUrl="https://maxim.nextgis.com",this.searchResources=[],this.requests=[],this.connector=e.connector||new c({baseUrl:this.searchUrl}),this.searchResources=e.searchResources}abort(){this.requests.forEach((e=>{e.cancel()})),this.requests=[]}async*search(e){for(const t of this.searchResources){const s=this.connector.get("feature_layer.store",{headers:{RANGE:`items=0-${t.limit||300}`}},{id:t.id,like:e});this.requests.push(s),s.catch((e=>{console.warn(e)}));const r=await s,o=[];r&&r.forEach((s=>{o.push({query:e,resourceId:t.id,...s})}));for(const e of this._items(o))e.result=()=>this.result(e),yield e}}result(e){const t=this.connector.get("feature_layer.feature.item_extent",null,{id:e.resourceId,fid:e.featureId}).then((t=>{const s=t.extent;return{text:e.text,extent:[s.minLon,s.minLat,s.maxLon,s.maxLat]}}));return this.requests.push(t),t}_items(e){const t=[];return e.forEach((e=>{this.searchResources.find((t=>t.id===e.resourceId))&&t.push({query:e.query,text:e.label,featureId:e.id,resourceId:e.resourceId})})),t}},exports.NominatimProvider=class extends u{constructor(e){super(e),this.searchUrl="https://nominatim.openstreetmap.org",this._requests=[]}abort(){this._requests.forEach((e=>e.cancel())),this._requests=[]}async*search(e){const s=t.fixUrlStr(`${this.searchUrl}/search?format=geojson&polygon_geojson=1&q=${e}`),r=new o(((t,r,o)=>{const c=new XMLHttpRequest;c.open("GET",s,!0),c.onload=()=>{try{const s=JSON.parse(c.responseText).features.map((t=>({geom:t,extent:t.bbox,text:t.properties&&t.properties.display_name,query:e})));t(s)}catch(s){r(s)}},c.onerror=e=>{r(e)},o((()=>{c.abort()})),c.send()})).catch((e=>{throw e}));this._requests.push(r);const c=await r;if(c)for(const t of c)t.result=()=>this.result(t),yield t}result(e){return o.resolve({text:e.text,extent:e.extent||[],geom:e.geom})}},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';\nimport CancelablePromise from '@nextgis/cancelable-promise';\nimport { SearchItem } from './types/SearchItem';\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 abstract search(query: string): AsyncGenerator<SearchItem>;\n\n abstract result(item: SearchItem): CancelablePromise<any>;\n\n abstract abort?(): void;\n}\n","import CancelablePromise from '@nextgis/cancelable-promise';\nimport { BaseProvider } from './providers/BaseProvider';\nimport { GeocoderOptions } from './GeocoderOptions';\nimport { BaseGeocoder } from './BaseGeocoder';\nimport { SearchItem } from './types/SearchItem';\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 for (const provider of this.providers) {\n try {\n const results = provider.search(query);\n\n for await (const r of results) {\n yield { ...r, provider, _id: ID++ };\n }\n } catch (er) {\n //\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","import { BaseProviderOptions } from './BaseProviderOptions';\nimport { BaseGeocoder } from '../BaseGeocoder';\n\nexport abstract class BaseProvider<\n O extends BaseProviderOptions = BaseProviderOptions,\n> extends BaseGeocoder<O> {\n searchUrl?: string;\n label?: string;\n}\n","import NgwConnector, { ResourceStoreItem } from '@nextgis/ngw-connector';\nimport CancelablePromise from '@nextgis/cancelable-promise';\nimport { BaseProvider } from './BaseProvider';\nimport { BaseProviderOptions } from './BaseProviderOptions';\nimport { SearchItem } from '../types/SearchItem';\nimport { ResultItem } from '../types/ResultItem';\n\ninterface NgwSearchItem extends SearchItem {\n resourceId: number;\n featureId: number;\n}\n\ninterface SearchResource {\n id: number;\n limit?: number;\n}\n\ninterface NgwProviderOptions extends BaseProviderOptions {\n connector?: NgwConnector;\n searchResources: SearchResource[];\n}\n\nexport class NgwProvider extends BaseProvider<NgwProviderOptions> {\n caseInsensitive = true;\n searchUrl = 'https://maxim.nextgis.com';\n searchResources: SearchResource[] = [];\n private connector: NgwConnector;\n private requests: CancelablePromise[] = [];\n\n constructor(options: NgwProviderOptions) {\n super(options);\n\n this.connector =\n options.connector ||\n new NgwConnector({\n baseUrl: this.searchUrl,\n });\n this.searchResources = options.searchResources;\n }\n\n abort(): void {\n this.requests.forEach((x) => {\n x.cancel();\n });\n this.requests = [];\n }\n\n async *search(like: string): AsyncGenerator<NgwSearchItem, void, unknown> {\n for (const resource of this.searchResources) {\n const limit = resource.limit || 300;\n const request = this.connector.get(\n 'feature_layer.store',\n {\n headers: { RANGE: `items=0-${limit}` },\n },\n {\n id: resource.id,\n like,\n },\n );\n this.requests.push(request);\n request.catch((er) => {\n console.log(er);\n });\n const resp = await request;\n const entries: ResourceStoreItem[] = [];\n if (resp) {\n resp.forEach((x) => {\n entries.push({\n query: like,\n resourceId: resource.id,\n ...x,\n });\n });\n }\n for (const item of this._items(entries)) {\n item.result = () => this.result(item);\n yield item;\n }\n }\n }\n\n result(item: NgwSearchItem): CancelablePromise<ResultItem> {\n const req = this.connector\n .get('feature_layer.feature.item_extent', null, {\n id: item.resourceId,\n fid: item.featureId,\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 this.requests.push(req);\n return req;\n }\n\n _items(entries: ResourceStoreItem[]): NgwSearchItem[] {\n const items: NgwSearchItem[] = [];\n entries.forEach((entry) => {\n const meta = this.searchResources.find((x) => x.id === entry.resourceId);\n if (meta) {\n items.push({\n query: entry.query,\n text: entry.label,\n featureId: entry.id,\n resourceId: entry.resourceId,\n });\n }\n });\n return items;\n }\n}\n","import { fixUrlStr } from '@nextgis/utils';\nimport CancelablePromise from '@nextgis/cancelable-promise';\nimport { BaseProvider } from './BaseProvider';\nimport { BaseProviderOptions } from './BaseProviderOptions';\nimport { FeatureCollection } from 'geojson';\nimport { SearchItem } from '../types/SearchItem';\nimport { ResultItem } from '../types/ResultItem';\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 }\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","/**\n * Modern geocoder on async generators. May use different data providers.\n *\n * @packageDocumentation\n * @module geocoder\n */\nimport { GeocoderOptions } from './GeocoderOptions';\nimport { Geocoder } from './Geocoder';\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","providers","abort","forEach","x","search","query","provider","results","r","_id","er","result","item","CancelablePromise","resolve","undefined","BaseProvider","connector","NgwConnector","baseUrl","searchUrl","searchResources","requests","cancel","like","resource","request","get","headers","RANGE","limit","id","push","catch","console","log","resp","entries","resourceId","_items","req","fid","featureId","then","e","extent","text","minLon","minLat","maxLon","maxLat","items","entry","find","label","_requests","val","url","fixUrlStr","reject","onCancel","xhr","XMLHttpRequest","open","onload","features","JSON","parse","responseText","map","geom","bbox","properties","display_name","onerror","send","i","model"],"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';\nimport CancelablePromise from '@nextgis/cancelable-promise';\nimport { SearchItem } from './types/SearchItem';\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 abstract search(query: string): AsyncGenerator<SearchItem>;\n\n abstract result(item: SearchItem): CancelablePromise<any>;\n\n abstract abort?(): void;\n}\n","import CancelablePromise from '@nextgis/cancelable-promise';\nimport { BaseProvider } from './providers/BaseProvider';\nimport { GeocoderOptions } from './GeocoderOptions';\nimport { BaseGeocoder } from './BaseGeocoder';\nimport { SearchItem } from './types/SearchItem';\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 for (const provider of this.providers) {\n try {\n const results = provider.search(query);\n\n for await (const r of results) {\n yield { ...r, provider, _id: ID++ };\n }\n } catch (er) {\n //\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","import { BaseProviderOptions } from './BaseProviderOptions';\nimport { BaseGeocoder } from '../BaseGeocoder';\n\nexport abstract class BaseProvider<\n O extends BaseProviderOptions = BaseProviderOptions,\n> extends BaseGeocoder<O> {\n searchUrl?: string;\n label?: string;\n}\n","import NgwConnector, { ResourceStoreItem } from '@nextgis/ngw-connector';\nimport CancelablePromise from '@nextgis/cancelable-promise';\nimport { BaseProvider } from './BaseProvider';\nimport { BaseProviderOptions } from './BaseProviderOptions';\nimport { SearchItem } from '../types/SearchItem';\nimport { ResultItem } from '../types/ResultItem';\n\ninterface NgwSearchItem extends SearchItem {\n resourceId: number;\n featureId: number;\n}\n\ninterface SearchResource {\n id: number;\n limit?: number;\n}\n\ninterface NgwProviderOptions extends BaseProviderOptions {\n connector?: NgwConnector;\n searchResources: SearchResource[];\n}\n\nexport class NgwProvider extends BaseProvider<NgwProviderOptions> {\n caseInsensitive = true;\n searchUrl = 'https://maxim.nextgis.com';\n searchResources: SearchResource[] = [];\n private connector: NgwConnector;\n private requests: CancelablePromise[] = [];\n\n constructor(options: NgwProviderOptions) {\n super(options);\n\n this.connector =\n options.connector ||\n new NgwConnector({\n baseUrl: this.searchUrl,\n });\n this.searchResources = options.searchResources;\n }\n\n abort(): void {\n this.requests.forEach((x) => {\n x.cancel();\n });\n this.requests = [];\n }\n\n async *search(like: string): AsyncGenerator<NgwSearchItem, void, unknown> {\n for (const resource of this.searchResources) {\n const limit = resource.limit || 300;\n const request = this.connector.get(\n 'feature_layer.store',\n {\n headers: { RANGE: `items=0-${limit}` },\n },\n {\n id: resource.id,\n like,\n },\n );\n this.requests.push(request);\n request.catch((er) => {\n console.warn(er);\n });\n const resp = await request;\n const entries: ResourceStoreItem[] = [];\n if (resp) {\n resp.forEach((x) => {\n entries.push({\n query: like,\n resourceId: resource.id,\n ...x,\n });\n });\n }\n for (const item of this._items(entries)) {\n item.result = () => this.result(item);\n yield item;\n }\n }\n }\n\n result(item: NgwSearchItem): CancelablePromise<ResultItem> {\n const req = this.connector\n .get('feature_layer.feature.item_extent', null, {\n id: item.resourceId,\n fid: item.featureId,\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 this.requests.push(req);\n return req;\n }\n\n _items(entries: ResourceStoreItem[]): NgwSearchItem[] {\n const items: NgwSearchItem[] = [];\n entries.forEach((entry) => {\n const meta = this.searchResources.find((x) => x.id === entry.resourceId);\n if (meta) {\n items.push({\n query: entry.query,\n text: entry.label,\n featureId: entry.id,\n resourceId: entry.resourceId,\n });\n }\n });\n return items;\n }\n}\n","import { fixUrlStr } from '@nextgis/utils';\nimport CancelablePromise from '@nextgis/cancelable-promise';\nimport { BaseProvider } from './BaseProvider';\nimport { BaseProviderOptions } from './BaseProviderOptions';\nimport { FeatureCollection } from 'geojson';\nimport { SearchItem } from '../types/SearchItem';\nimport { ResultItem } from '../types/ResultItem';\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 }\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","/**\n * Modern geocoder on async generators. May use different data providers.\n *\n * @packageDocumentation\n * @module geocoder\n */\nimport { GeocoderOptions } from './GeocoderOptions';\nimport { Geocoder } from './Geocoder';\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","providers","abort","forEach","x","search","query","provider","results","r","_id","er","result","item","CancelablePromise","resolve","undefined","BaseProvider","connector","NgwConnector","baseUrl","searchUrl","searchResources","requests","cancel","like","resource","request","get","headers","RANGE","limit","id","push","catch","console","warn","resp","entries","resourceId","_items","req","fid","featureId","then","e","extent","text","minLon","minLat","maxLon","maxLat","items","entry","find","label","_requests","val","url","fixUrlStr","reject","onCancel","xhr","XMLHttpRequest","open","onload","features","JSON","parse","responseText","map","geom","bbox","properties","display_name","onerror","send","i","model"],"mappings":"+QAIsBA,EAGpBC,YAAYC,GACNA,GACFC,eAAaC,KAAMF,ICHzB,IAAIG,EAAK,QAEIC,UAAiBN,EAG5BC,YAAYC,GACVK,MAAML,GAHRE,eAA4B,GAItBF,GAAWA,EAAQM,YACrBJ,KAAKI,UAAYN,EAAQM,WAI7BC,QACEL,KAAKI,UAAUE,SAASC,IAClBA,EAAEF,OACJE,EAAEF,WAKRG,aAAcC,GACZ,IAAK,MAAMC,KAAYV,KAAKI,UAC1B,IACE,MAAMO,EAAUD,EAASF,OAAOC,GAEhC,UAAW,MAAMG,KAAKD,OACd,IAAKC,EAAGF,SAAAA,EAAUG,IAAKZ,KAE/B,MAAOa,KAMbC,OAAOC,GACL,OAAIA,EAAKN,SACAM,EAAKN,SAASK,OAAOC,GAEvBC,EAAkBC,aAAQC,UCzCfC,UAEZxB,+ECiBuBwB,EAO/BvB,YAAYC,GACVK,MAAML,GAPRE,sBAAkB,EAClBA,eAAY,4BACZA,qBAAoC,GAE5BA,cAAgC,GAKtCA,KAAKqB,UACHvB,EAAQuB,WACR,IAAIC,EAAa,CACfC,QAASvB,KAAKwB,YAElBxB,KAAKyB,gBAAkB3B,EAAQ2B,gBAGjCpB,QACEL,KAAK0B,SAASpB,SAASC,IACrBA,EAAEoB,YAEJ3B,KAAK0B,SAAW,GAGlBlB,aAAcoB,GACZ,IAAK,MAAMC,KAAY7B,KAAKyB,gBAAiB,CAC3C,MACMK,EAAU9B,KAAKqB,UAAUU,IAC7B,sBACA,CACEC,QAAS,CAAEC,MAAO,WAJRJ,EAASK,OAAS,QAM9B,CACEC,GAAIN,EAASM,GACbP,KAAAA,IAGJ5B,KAAK0B,SAASU,KAAKN,GACnBA,EAAQO,OAAOvB,IACbwB,QAAQC,KAAKzB,MAEf,MAAM0B,QAAaV,EACbW,EAA+B,GACjCD,GACFA,EAAKlC,SAASC,IACZkC,EAAQL,KAAK,CACX3B,MAAOmB,EACPc,WAAYb,EAASM,MAClB5B,OAIT,IAAK,MAAMS,KAAQhB,KAAK2C,OAAOF,GAC7BzB,EAAKD,OAAS,IAAMf,KAAKe,OAAOC,SAC1BA,GAKZD,OAAOC,GACL,MAAM4B,EAAM5C,KAAKqB,UACdU,IAAI,oCAAqC,KAAM,CAC9CI,GAAInB,EAAK0B,WACTG,IAAK7B,EAAK8B,YAEXC,MAAMxC,IACL,MAAMyC,EAAIzC,EAAE0C,OACZ,MAAO,CACLC,KAAMlC,EAAKkC,KACXD,OAAQ,CAACD,EAAEG,OAAQH,EAAEI,OAAQJ,EAAEK,OAAQL,EAAEM,YAI/C,OADAtD,KAAK0B,SAASU,KAAKQ,GACZA,EAGTD,OAAOF,GACL,MAAMc,EAAyB,GAY/B,OAXAd,EAAQnC,SAASkD,IACFxD,KAAKyB,gBAAgBgC,MAAMlD,GAAMA,EAAE4B,KAAOqB,EAAMd,cAE3Da,EAAMnB,KAAK,CACT3B,MAAO+C,EAAM/C,MACbyC,KAAMM,EAAME,MACZZ,UAAWU,EAAMrB,GACjBO,WAAYc,EAAMd,gBAIjBa,4CCxG4BnC,EAKrCvB,YAAYC,GACVK,MAAML,GALRE,eAAY,sCAEJA,eAAiC,GAMzCK,QACEL,KAAK2D,UAAUrD,SAASC,GAAMA,EAAEoB,WAChC3B,KAAK2D,UAAY,GAGnBnD,aAAcoD,GAEZ,MAAMC,EAAMC,YAEV,GAAG9D,KAAKwB,uDAAuDoC,KAE3D9B,EAAU,IAAIb,GAClB,CAACC,EAAS6C,EAAQC,KAChB,MAAMC,EAAM,IAAIC,eAChBD,EAAIE,KAAK,MAAON,GAAK,GACrBI,EAAIG,OAAS,KACX,IACE,MACMC,EADUC,KAAKC,MAAMN,EAAIO,cACQH,SAASI,KAAKlE,IAC5C,CACLmE,KAAMnE,EACN0C,OAAQ1C,EAAEoE,KACVzB,KAAM3C,EAAEqE,YAAcrE,EAAEqE,WAAWC,aACnCpE,MAAOmD,MAGX1C,EAAQmD,GACR,MAAOvD,GACPiD,EAAOjD,KAIXmD,EAAIa,QAAWhE,IACbiD,EAAOjD,IAGTkD,GAAS,KACPC,EAAI5D,WAGN4D,EAAIc,UAEN1C,OAAOvB,IAIP,MAAMA,KAERd,KAAK2D,UAAUvB,KAAKN,GACpB,MAAMyB,QAAczB,EACpB,GAAIyB,EACF,IAAK,MAAMyB,KAAKzB,EACdyB,EAAEjE,OAAS,IAAMf,KAAKe,OAAOiE,SACvBA,EAKZjE,OAAOkE,GACL,OAAOhE,EAAkBC,QAAQ,CAC/BgC,KAAM+B,EAAM/B,KACZD,OAAQgC,EAAMhC,QAAU,GACxByB,KAAMO,EAAMP,iCC7DK5E,GACrB,OAAO,IAAII,EAASJ"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** Bundle of @nextgis/geocoder; version: 1.
|
|
1
|
+
/** Bundle of @nextgis/geocoder; version: 1.11.2; author: NextGIS */
|
|
2
2
|
class CancelError extends Error {
|
|
3
3
|
constructor() {
|
|
4
4
|
super();
|
|
@@ -356,6 +356,23 @@ var CancelablePromise = CancelablePromise$1;
|
|
|
356
356
|
*/
|
|
357
357
|
function defined(val) {
|
|
358
358
|
return val !== undefined && val !== null;
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* from https://github.com/CesiumGS/cesium/blob/master/Source/Core/defined.js
|
|
362
|
+
*
|
|
363
|
+
* @param val - The object.
|
|
364
|
+
* @returns Returns true if the object is defined and not empty string, returns false otherwise.
|
|
365
|
+
*
|
|
366
|
+
* @example
|
|
367
|
+
* ```javascript
|
|
368
|
+
* full('foo') // true
|
|
369
|
+
* full('') // false
|
|
370
|
+
* full(undefined) // false
|
|
371
|
+
* full(0) // true
|
|
372
|
+
* ```
|
|
373
|
+
*/
|
|
374
|
+
function full(val) {
|
|
375
|
+
return typeof val === 'string' ? !!val : defined(val);
|
|
359
376
|
}
|
|
360
377
|
|
|
361
378
|
/**
|
|
@@ -962,13 +979,45 @@ function eventTargetAgnosticAddListener(emitter, name, listener, flags) {
|
|
|
962
979
|
}
|
|
963
980
|
}
|
|
964
981
|
|
|
982
|
+
/**
|
|
983
|
+
* @example
|
|
984
|
+
* ```javascript
|
|
985
|
+
* const cache1 = new Cache();
|
|
986
|
+
* cache1.add('foo', 'value');
|
|
987
|
+
*
|
|
988
|
+
* const cache2 = new Cache();
|
|
989
|
+
* cache2.match('foo'); // value
|
|
990
|
+
*
|
|
991
|
+
* const cache3 = new Cache({ namespace: 'foo' });
|
|
992
|
+
* cache3.match('foo'); // undefined
|
|
993
|
+
* ```
|
|
994
|
+
*
|
|
995
|
+
* @example
|
|
996
|
+
* ```javascript
|
|
997
|
+
* let COUNTER = 0;
|
|
998
|
+
* const createPromise = () => new Promise((res) => {
|
|
999
|
+
* COUNTER++
|
|
1000
|
+
* setTimeout(() => res('Ok'), 300)
|
|
1001
|
+
* });
|
|
1002
|
+
*
|
|
1003
|
+
* const cache = new Cache();
|
|
1004
|
+
* for (let i = 0; i < 10; i++) {
|
|
1005
|
+
* cache.add('foo', createPromise).then((data) => {
|
|
1006
|
+
* console.log(data); // 'Ok'
|
|
1007
|
+
* });
|
|
1008
|
+
* }
|
|
1009
|
+
* console.log(COUNTER); // 1
|
|
1010
|
+
* ```
|
|
1011
|
+
*/
|
|
965
1012
|
class Cache$1 {
|
|
966
|
-
constructor() {
|
|
1013
|
+
constructor(options = {}) {
|
|
1014
|
+
var _a;
|
|
967
1015
|
this.cache = [];
|
|
968
|
-
|
|
969
|
-
|
|
1016
|
+
const namespace = (_a = options.namespace) !== null && _a !== void 0 ? _a : 'default';
|
|
1017
|
+
if (Cache$1.instance[namespace]) {
|
|
1018
|
+
return Cache$1.instance[namespace];
|
|
970
1019
|
}
|
|
971
|
-
Cache$1.instance = this;
|
|
1020
|
+
Cache$1.instance[namespace] = this;
|
|
972
1021
|
return this;
|
|
973
1022
|
}
|
|
974
1023
|
clean() {
|
|
@@ -977,8 +1026,33 @@ class Cache$1 {
|
|
|
977
1026
|
all() {
|
|
978
1027
|
return this.cache;
|
|
979
1028
|
}
|
|
980
|
-
|
|
981
|
-
|
|
1029
|
+
/**
|
|
1030
|
+
* Caching only a non-empty value.
|
|
1031
|
+
*
|
|
1032
|
+
* Useful for get or create strategy
|
|
1033
|
+
* @example
|
|
1034
|
+
* ```javascript
|
|
1035
|
+
* const cache = new Cache();
|
|
1036
|
+
* const getItemFunc = () => fetch(url).then((data) => {
|
|
1037
|
+
* return data.json(); // undefined
|
|
1038
|
+
* });
|
|
1039
|
+
* const item = await cache.addFull('foo', getItemFunc);
|
|
1040
|
+
* if (!item) {
|
|
1041
|
+
* await createItem(); // 'New item'
|
|
1042
|
+
* }
|
|
1043
|
+
*
|
|
1044
|
+
* // somewhere else in the code
|
|
1045
|
+
* const item = await cache.addFull('foo', getItemFunc).then((resp) => {
|
|
1046
|
+
* console.log(resp); // 'New item'
|
|
1047
|
+
* })
|
|
1048
|
+
*
|
|
1049
|
+
* ```
|
|
1050
|
+
*/
|
|
1051
|
+
addFull(key, valueToSet, props) {
|
|
1052
|
+
return this.add(key, valueToSet, props, true);
|
|
1053
|
+
}
|
|
1054
|
+
add(key, valueToSet, props, onlyFull) {
|
|
1055
|
+
const exist = this._find(key, props);
|
|
982
1056
|
if (!exist) {
|
|
983
1057
|
let value;
|
|
984
1058
|
if (valueToSet instanceof Function) {
|
|
@@ -987,18 +1061,31 @@ class Cache$1 {
|
|
|
987
1061
|
else {
|
|
988
1062
|
value = valueToSet;
|
|
989
1063
|
}
|
|
990
|
-
const
|
|
1064
|
+
const props_ = props && JSON.parse(JSON.stringify(objectRemoveEmpty(props)));
|
|
991
1065
|
const cacheItem = {
|
|
992
1066
|
key,
|
|
993
1067
|
value,
|
|
994
|
-
|
|
1068
|
+
props: props_,
|
|
1069
|
+
// TODO: remove backward compatibility use only props
|
|
1070
|
+
options: props_,
|
|
995
1071
|
};
|
|
1072
|
+
if (onlyFull && !full(value)) {
|
|
1073
|
+
return value;
|
|
1074
|
+
}
|
|
996
1075
|
this.cache.push(cacheItem);
|
|
997
1076
|
if (value instanceof Promise) {
|
|
998
1077
|
value.catch((er) => {
|
|
999
|
-
this.delete(key,
|
|
1078
|
+
this.delete(key, props);
|
|
1000
1079
|
throw er;
|
|
1001
1080
|
});
|
|
1081
|
+
if (onlyFull) {
|
|
1082
|
+
value.then((x) => {
|
|
1083
|
+
if (!full(x)) {
|
|
1084
|
+
this.delete(key, props);
|
|
1085
|
+
}
|
|
1086
|
+
return x;
|
|
1087
|
+
});
|
|
1088
|
+
}
|
|
1002
1089
|
return value;
|
|
1003
1090
|
}
|
|
1004
1091
|
return value;
|
|
@@ -1007,40 +1094,49 @@ class Cache$1 {
|
|
|
1007
1094
|
return exist.value;
|
|
1008
1095
|
}
|
|
1009
1096
|
}
|
|
1010
|
-
match(key,
|
|
1011
|
-
const cacheRecord = this._find(key,
|
|
1097
|
+
match(key, props) {
|
|
1098
|
+
const cacheRecord = this._find(key, props);
|
|
1012
1099
|
if (cacheRecord) {
|
|
1013
1100
|
return cacheRecord.value;
|
|
1014
1101
|
}
|
|
1015
1102
|
}
|
|
1016
|
-
matchAll(key,
|
|
1103
|
+
matchAll(key, props) {
|
|
1017
1104
|
if (key) {
|
|
1018
1105
|
return this.cache
|
|
1019
|
-
.filter((x) => this._filter(x, key,
|
|
1106
|
+
.filter((x) => this._filter(x, key, props))
|
|
1020
1107
|
.map((x) => x.value);
|
|
1021
1108
|
}
|
|
1022
1109
|
return this.cache.map((x) => x.value);
|
|
1023
1110
|
}
|
|
1024
|
-
delete(
|
|
1025
|
-
|
|
1111
|
+
delete(keyOrItem, props) {
|
|
1112
|
+
let exist = [];
|
|
1113
|
+
if (typeof keyOrItem === 'string') {
|
|
1114
|
+
exist = this.cache.filter((x) => this._filter(x, keyOrItem, props));
|
|
1115
|
+
}
|
|
1116
|
+
else {
|
|
1117
|
+
exist.push(keyOrItem);
|
|
1118
|
+
}
|
|
1026
1119
|
for (const e of exist) {
|
|
1027
1120
|
const index = this.cache.indexOf(e);
|
|
1028
1121
|
this.cache.splice(index, 1);
|
|
1029
1122
|
}
|
|
1030
1123
|
}
|
|
1031
|
-
_find(key,
|
|
1032
|
-
return this.cache.find((x) => this._filter(x, key,
|
|
1124
|
+
_find(key, props) {
|
|
1125
|
+
return this.cache.find((x) => this._filter(x, key, props));
|
|
1033
1126
|
}
|
|
1034
|
-
_filter(item, key,
|
|
1127
|
+
_filter(item, key, props) {
|
|
1035
1128
|
if (item.key === key) {
|
|
1036
|
-
if (
|
|
1037
|
-
|
|
1129
|
+
if (props) {
|
|
1130
|
+
// TODO: remove backward compatibility
|
|
1131
|
+
const itemProps = item.props || item.options;
|
|
1132
|
+
return objectDeepEqual(itemProps || {}, objectRemoveEmpty(props));
|
|
1038
1133
|
}
|
|
1039
1134
|
return true;
|
|
1040
1135
|
}
|
|
1041
1136
|
return false;
|
|
1042
1137
|
}
|
|
1043
|
-
}
|
|
1138
|
+
}
|
|
1139
|
+
Cache$1.instance = {};
|
|
1044
1140
|
|
|
1045
1141
|
/**
|
|
1046
1142
|
* Caching for asynchronous functions
|
|
@@ -1075,6 +1171,10 @@ class NetworkError extends Error {
|
|
|
1075
1171
|
}
|
|
1076
1172
|
}
|
|
1077
1173
|
|
|
1174
|
+
function isObject(val) {
|
|
1175
|
+
return Object.prototype.toString.call(val) === '[object Object]';
|
|
1176
|
+
}
|
|
1177
|
+
|
|
1078
1178
|
let loadData;
|
|
1079
1179
|
// @ts-ignore
|
|
1080
1180
|
{
|
|
@@ -1108,7 +1208,7 @@ let loadData;
|
|
|
1108
1208
|
}
|
|
1109
1209
|
};
|
|
1110
1210
|
xhr.onload = () => {
|
|
1111
|
-
if ([401, 403, 404, 500].indexOf(xhr.status) !== -1) {
|
|
1211
|
+
if ([401, 403, 404, 422, 500].indexOf(xhr.status) !== -1) {
|
|
1112
1212
|
error(new NgwError(getResponseText()));
|
|
1113
1213
|
}
|
|
1114
1214
|
processingResponse();
|
|
@@ -1163,7 +1263,7 @@ let loadData;
|
|
|
1163
1263
|
data = new FormData();
|
|
1164
1264
|
data.append('file', options.file);
|
|
1165
1265
|
if (options.data) {
|
|
1166
|
-
for (const d in data) {
|
|
1266
|
+
for (const d in options.data) {
|
|
1167
1267
|
data.append(d, data[d]);
|
|
1168
1268
|
}
|
|
1169
1269
|
}
|
|
@@ -1249,28 +1349,36 @@ function removeConnector(connector) {
|
|
|
1249
1349
|
}
|
|
1250
1350
|
}
|
|
1251
1351
|
|
|
1252
|
-
|
|
1253
|
-
return Object.prototype.toString.call(val) === '[object Object]';
|
|
1254
|
-
}
|
|
1255
|
-
|
|
1352
|
+
const exclude = ['description'];
|
|
1256
1353
|
/**
|
|
1354
|
+
* @remarks
|
|
1355
|
+
* https://docs.nextgis.ru/docs_ngweb_dev/doc/developer/resource.html#search-resources
|
|
1356
|
+
*
|
|
1257
1357
|
* ```
|
|
1258
|
-
* { keyname,
|
|
1358
|
+
* { keyname, owner_user: { id }} > { keyname, owner_user__id }
|
|
1259
1359
|
* ```
|
|
1360
|
+
*
|
|
1260
1361
|
* @param resource - Any property from NGW resource item
|
|
1261
1362
|
*/
|
|
1262
1363
|
function resourceToQuery(resource, prefix = '') {
|
|
1263
1364
|
prefix = prefix ? prefix + '__' : '';
|
|
1264
1365
|
const query = {};
|
|
1265
|
-
|
|
1266
|
-
if (
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1366
|
+
for (const [key, value] of Object.entries(resource)) {
|
|
1367
|
+
if (exclude.indexOf(key) === -1) {
|
|
1368
|
+
if (isObject(value)) {
|
|
1369
|
+
if (key === 'owner_user') {
|
|
1370
|
+
const children = resourceToQuery(value, key);
|
|
1371
|
+
Object.assign(query, children);
|
|
1372
|
+
}
|
|
1373
|
+
else if (key === 'parent' && 'id' in value) {
|
|
1374
|
+
query.parent_id = value.id;
|
|
1375
|
+
}
|
|
1376
|
+
}
|
|
1377
|
+
else if (defined(value)) {
|
|
1378
|
+
query[prefix + key] = value;
|
|
1379
|
+
}
|
|
1272
1380
|
}
|
|
1273
|
-
}
|
|
1381
|
+
}
|
|
1274
1382
|
return query;
|
|
1275
1383
|
}
|
|
1276
1384
|
|
|
@@ -1295,19 +1403,30 @@ class ResourcesControl {
|
|
|
1295
1403
|
*/
|
|
1296
1404
|
getOne(resource, requestOptions) {
|
|
1297
1405
|
const cache = new Cache();
|
|
1406
|
+
const forCache = {};
|
|
1407
|
+
const opt = { ...requestOptions, cache: false };
|
|
1408
|
+
if (typeof resource === 'string') {
|
|
1409
|
+
forCache.keyname = resource;
|
|
1410
|
+
}
|
|
1411
|
+
else if (typeof resource === 'number') {
|
|
1412
|
+
forCache.id = resource;
|
|
1413
|
+
}
|
|
1414
|
+
else if (isObject(resource)) {
|
|
1415
|
+
forCache.id = resource.id;
|
|
1416
|
+
}
|
|
1298
1417
|
const makeRequest = () => {
|
|
1299
1418
|
if (typeof resource === 'string') {
|
|
1300
|
-
return this._fetchResourceBy({ keyname: resource },
|
|
1419
|
+
return this._fetchResourceBy({ keyname: resource }, opt);
|
|
1301
1420
|
}
|
|
1302
1421
|
else if (typeof resource === 'number') {
|
|
1303
|
-
return this._fetchResourceById(resource,
|
|
1422
|
+
return this._fetchResourceById(resource, opt);
|
|
1304
1423
|
}
|
|
1305
1424
|
else if (isObject(resource)) {
|
|
1306
|
-
return this._fetchResourceBy(resource,
|
|
1425
|
+
return this._fetchResourceBy(resource, opt);
|
|
1307
1426
|
}
|
|
1308
1427
|
return CancelablePromise.resolve(undefined);
|
|
1309
1428
|
};
|
|
1310
|
-
return cache.
|
|
1429
|
+
return cache.addFull('resource', makeRequest, forCache);
|
|
1311
1430
|
}
|
|
1312
1431
|
getOneOrFail(resource, requestOptions) {
|
|
1313
1432
|
return this.getOne(resource, requestOptions).then((res) => {
|
|
@@ -1373,11 +1492,11 @@ class ResourcesControl {
|
|
|
1373
1492
|
})
|
|
1374
1493
|
.then((resources) => {
|
|
1375
1494
|
if (resources) {
|
|
1376
|
-
|
|
1495
|
+
for (const x of resources) {
|
|
1377
1496
|
this.cache.add('resource.item', CancelablePromise.resolve(x), {
|
|
1378
1497
|
id: x.resource.id,
|
|
1379
1498
|
});
|
|
1380
|
-
}
|
|
1499
|
+
}
|
|
1381
1500
|
}
|
|
1382
1501
|
return resources;
|
|
1383
1502
|
});
|
|
@@ -1424,12 +1543,35 @@ class ResourcesControl {
|
|
|
1424
1543
|
return this.getId(resource).then((id) => {
|
|
1425
1544
|
if (id !== undefined) {
|
|
1426
1545
|
return this.connector.delete('resource.item', null, { id }).then(() => {
|
|
1427
|
-
this.
|
|
1546
|
+
this._cleanResourceItemCache(id);
|
|
1428
1547
|
return undefined;
|
|
1429
1548
|
});
|
|
1430
1549
|
}
|
|
1431
1550
|
});
|
|
1432
1551
|
}
|
|
1552
|
+
async _cleanResourceItemCache(id) {
|
|
1553
|
+
const all = this.cache.all();
|
|
1554
|
+
const toDelete = [];
|
|
1555
|
+
for (const c of all) {
|
|
1556
|
+
const cid = c.options && c.options.id;
|
|
1557
|
+
if (['resource.item', 'resource'].includes(c.key) && cid !== undefined) {
|
|
1558
|
+
if (typeof cid === 'number') {
|
|
1559
|
+
if (cid === id) {
|
|
1560
|
+
toDelete.push(c);
|
|
1561
|
+
}
|
|
1562
|
+
}
|
|
1563
|
+
else {
|
|
1564
|
+
const rid = await this.getId(cid);
|
|
1565
|
+
if (rid === id) {
|
|
1566
|
+
toDelete.push(c);
|
|
1567
|
+
}
|
|
1568
|
+
}
|
|
1569
|
+
}
|
|
1570
|
+
}
|
|
1571
|
+
for (const d of toDelete) {
|
|
1572
|
+
this.cache.delete(d);
|
|
1573
|
+
}
|
|
1574
|
+
}
|
|
1433
1575
|
_fetchResourceById(id, requestOptions) {
|
|
1434
1576
|
const promise = () => this.connector.get('resource.item', requestOptions, { id });
|
|
1435
1577
|
return this.cache
|
|
@@ -1633,7 +1775,7 @@ class NgwConnector$1 {
|
|
|
1633
1775
|
headers: this.getAuthorizationHeaders(credentials),
|
|
1634
1776
|
// withCredentials: true
|
|
1635
1777
|
};
|
|
1636
|
-
// Do not use
|
|
1778
|
+
// Do not use apiRequest('auth.current_user') to avoid circular-references
|
|
1637
1779
|
return this.makeQuery('/api/component/auth/current_user', {}, options)
|
|
1638
1780
|
.then((data) => {
|
|
1639
1781
|
this.user = data;
|
|
@@ -1791,7 +1933,7 @@ class NgwConnector$1 {
|
|
|
1791
1933
|
}
|
|
1792
1934
|
// remove double slash
|
|
1793
1935
|
url = fixUrlStr(url);
|
|
1794
|
-
return this._loadData(url, options);
|
|
1936
|
+
return this._loadData(encodeURI(url), options);
|
|
1795
1937
|
}
|
|
1796
1938
|
else {
|
|
1797
1939
|
throw new Error('Empty `url` not allowed');
|
|
@@ -1892,7 +2034,7 @@ class NgwConnector$1 {
|
|
|
1892
2034
|
else {
|
|
1893
2035
|
// @ts-ignore
|
|
1894
2036
|
{
|
|
1895
|
-
console.warn(httpError);
|
|
2037
|
+
console.warn('DEV WARN', httpError);
|
|
1896
2038
|
}
|
|
1897
2039
|
const er = this._handleHttpError(httpError);
|
|
1898
2040
|
if (er) {
|
|
@@ -1963,7 +2105,7 @@ class NgwProvider extends BaseProvider {
|
|
|
1963
2105
|
});
|
|
1964
2106
|
this.requests.push(request);
|
|
1965
2107
|
request.catch((er) => {
|
|
1966
|
-
console.
|
|
2108
|
+
console.warn(er);
|
|
1967
2109
|
});
|
|
1968
2110
|
const resp = await request;
|
|
1969
2111
|
const entries = [];
|