@nextgis/ngw-connector 1.8.4 → 1.9.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/index.d.ts CHANGED
@@ -303,11 +303,11 @@ declare class NgwConnector {
303
303
  /**
304
304
  * {@inheritDoc ResourcesControl.getOne}
305
305
  */
306
- getResource(resource: ResourceDefinition): CancelablePromise<ResourceItem | undefined>;
306
+ getResource(resource: ResourceDefinition, requestOptions?: Pick<RequestOptions, 'cache'>): CancelablePromise<ResourceItem | undefined>;
307
307
  /**
308
308
  * {@inheritDoc ResourcesControl.getOneOrFail}
309
309
  */
310
- getResourceOrFail(resource: ResourceDefinition): CancelablePromise<ResourceItem>;
310
+ getResourceOrFail(resource: ResourceDefinition, requestOptions?: Pick<RequestOptions, 'cache'>): CancelablePromise<ResourceItem>;
311
311
  /**
312
312
  * @deprecated - use {@link NgwConnector.getResource}
313
313
  */
@@ -323,23 +323,23 @@ declare class NgwConnector {
323
323
  /**
324
324
  * {@inheritDoc ResourcesControl.getId}
325
325
  */
326
- getResourceId(resource: ResourceDefinition): CancelablePromise<number | undefined>;
326
+ getResourceId(resource: ResourceDefinition, requestOptions?: Pick<RequestOptions, 'cache'>): CancelablePromise<number | undefined>;
327
327
  /**
328
328
  * {@inheritDoc ResourcesControl.getIdOrFail}
329
329
  */
330
- getResourceIdOrFail(resource: ResourceDefinition): CancelablePromise<number>;
330
+ getResourceIdOrFail(resource: ResourceDefinition, requestOptions?: Pick<RequestOptions, 'cache'>): CancelablePromise<number>;
331
331
  /**
332
332
  * {@inheritDoc ResourcesControl.getMany}
333
333
  */
334
- getResourcesBy(resource: DeepPartial<Resource>): CancelablePromise<ResourceItem[]>;
334
+ getResourcesBy(resource: DeepPartial<Resource>, requestOptions?: Pick<RequestOptions, 'cache'>): CancelablePromise<ResourceItem[]>;
335
335
  /**
336
336
  * {@inheritDoc ResourcesControl.getParent}
337
337
  */
338
- getResourceParent(resource: ResourceDefinition): CancelablePromise<ResourceItem | undefined>;
338
+ getResourceParent(resource: ResourceDefinition, requestOptions?: Pick<RequestOptions, 'cache'>): CancelablePromise<ResourceItem | undefined>;
339
339
  /**
340
340
  * {@inheritDoc ResourcesControl.getChildrenOf}
341
341
  */
342
- getResourceChildren(resource: ResourceDefinition): CancelablePromise<ResourceItem[]>;
342
+ getResourceChildren(resource: ResourceDefinition, requestOptions?: Pick<RequestOptions, 'cache'>): CancelablePromise<ResourceItem[]>;
343
343
  /**
344
344
  * {@inheritDoc ResourcesControl.update}
345
345
  */
@@ -702,7 +702,7 @@ export declare interface Resource {
702
702
  scopes: string[];
703
703
  }
704
704
 
705
- export declare type ResourceCls = 'vector_layer' | 'resource_group' | 'postgis_layer' | 'wmsserver_service' | 'basemap_layer' | 'postgis_connection' | 'webmap' | 'wfsserver_service' | 'vector_layer' | 'raster_layer' | 'mapserver_style' | 'qgis_vector_style' | 'qgis_raster_style' | 'raster_style' | 'file_bucket' | 'lookup_table' | 'wmsclient_layer' | 'wmsclient_connection' | 'formbuilder_form' | 'file_bucket' | 'terrain_provider' | 'model_3d' | 'tmsclient_layer';
705
+ export declare type ResourceCls = 'resource_group' | 'postgis_layer' | 'wmsserver_service' | 'basemap_layer' | 'postgis_connection' | 'webmap' | 'wfsserver_service' | 'vector_layer' | 'raster_layer' | 'mapserver_style' | 'qgis_vector_style' | 'qgis_raster_style' | 'raster_style' | 'file_bucket' | 'lookup_table' | 'wmsclient_layer' | 'wmsclient_connection' | 'formbuilder_form' | 'file_bucket' | 'terrain_provider' | 'model_3d' | 'tmsclient_layer';
706
706
 
707
707
  export declare type ResourceDefinition = ResourceIdKeynameDef | DeepPartial<Resource>;
708
708
 
@@ -758,7 +758,7 @@ declare class ResourcesControl {
758
758
  * Fetching resource would be cached to speed up next call
759
759
  */
760
760
  getOne(resource: ResourceDefinition, requestOptions?: RequestOptions): CancelablePromise<ResourceItem | undefined>;
761
- getOneOrFail(resource: ResourceDefinition): CancelablePromise<ResourceItem>;
761
+ getOneOrFail(resource: ResourceDefinition, requestOptions?: Pick<RequestOptions, 'cache'>): CancelablePromise<ResourceItem>;
762
762
  /**
763
763
  * A fast way to retrieve resource ID for any resource definition.
764
764
  * @param resource - Any available resource definition
@@ -769,7 +769,7 @@ declare class ResourcesControl {
769
769
  * then this method will come in handy to facilitate the extraction of the identifier
770
770
  * if the resource is specified through a keyname or other parameters.
771
771
  */
772
- getId(resource: ResourceDefinition): CancelablePromise<number | undefined>;
772
+ getId(resource: ResourceDefinition, requestOptions?: Pick<RequestOptions, 'cache'>): CancelablePromise<number | undefined>;
773
773
  /**
774
774
  * A fast way to retrieve resource ID for any resource definition.
775
775
  * @param resource - Any available resource definition
@@ -778,10 +778,10 @@ declare class ResourcesControl {
778
778
  * Similar with {@link NgwConnector.getResourceId | getResourceId} but rise error if resource is not exist.
779
779
  * To not make one more checks if the resource is definitely exists
780
780
  */
781
- getIdOrFail(resource: ResourceDefinition): CancelablePromise<number>;
781
+ getIdOrFail(resource: ResourceDefinition, requestOptions?: Pick<RequestOptions, 'cache'>): CancelablePromise<number>;
782
782
  getMany(resource: DeepPartial<Resource>, requestOptions?: RequestOptions): CancelablePromise<ResourceItem[]>;
783
- getParent(resource: ResourceDefinition): CancelablePromise<ResourceItem | undefined>;
784
- getChildrenOf(resource: ResourceDefinition): CancelablePromise<ResourceItem[]>;
783
+ getParent(resource: ResourceDefinition, requestOptions?: Pick<RequestOptions, 'cache'>): CancelablePromise<ResourceItem | undefined>;
784
+ getChildrenOf(resource: ResourceDefinition, requestOptions?: Pick<RequestOptions, 'cache'>): CancelablePromise<ResourceItem[]>;
785
785
  update(resource: ResourceDefinition, data: DeepPartial<ResourceItem>): CancelablePromise<ResourceItem | undefined>;
786
786
  /**
787
787
  * Fast way to delete resource from NGW and clean cache.
@@ -1,4 +1,4 @@
1
- /** Bundle of @nextgis/ngw-connector; version: 1.8.4; author: NextGIS */
1
+ /** Bundle of @nextgis/ngw-connector; version: 1.9.2; author: NextGIS */
2
2
  'use strict';
3
3
 
4
4
  var events = require('events');
@@ -238,8 +238,8 @@ class ResourcesControl {
238
238
  };
239
239
  return cache.add('resource', makeRequest, { resource });
240
240
  }
241
- getOneOrFail(resource) {
242
- return this.getOne(resource).then((res) => {
241
+ getOneOrFail(resource, requestOptions) {
242
+ return this.getOne(resource, requestOptions).then((res) => {
243
243
  if (res) {
244
244
  return res;
245
245
  }
@@ -256,12 +256,12 @@ class ResourcesControl {
256
256
  * then this method will come in handy to facilitate the extraction of the identifier
257
257
  * if the resource is specified through a keyname or other parameters.
258
258
  */
259
- getId(resource) {
259
+ getId(resource, requestOptions) {
260
260
  if (typeof resource === 'number') {
261
261
  return CancelablePromise__default.resolve(resource);
262
262
  }
263
263
  else if (typeof resource === 'string' || isObject(resource)) {
264
- return this.getOne(resource).then((res) => {
264
+ return this.getOne(resource, requestOptions).then((res) => {
265
265
  if (res) {
266
266
  return res.resource.id;
267
267
  }
@@ -277,8 +277,8 @@ class ResourcesControl {
277
277
  * Similar with {@link NgwConnector.getResourceId | getResourceId} but rise error if resource is not exist.
278
278
  * To not make one more checks if the resource is definitely exists
279
279
  */
280
- getIdOrFail(resource) {
281
- return this.getId(resource).then((resp) => {
280
+ getIdOrFail(resource, requestOptions) {
281
+ return this.getId(resource, requestOptions).then((resp) => {
282
282
  if (resp === undefined) {
283
283
  throw new Error();
284
284
  }
@@ -314,18 +314,18 @@ class ResourcesControl {
314
314
  return items;
315
315
  });
316
316
  }
317
- getParent(resource) {
318
- return this.connector.getResource(resource).then((child) => {
317
+ getParent(resource, requestOptions) {
318
+ return this.getOne(resource, requestOptions).then((child) => {
319
319
  if (child) {
320
- return this.connector.getResource(child.resource.parent.id);
320
+ return this.getOne(child.resource.parent.id, requestOptions);
321
321
  }
322
322
  return CancelablePromise__default.resolve(undefined);
323
323
  });
324
324
  }
325
- getChildrenOf(resource) {
325
+ getChildrenOf(resource, requestOptions) {
326
326
  return this.getId(resource).then((parent) => {
327
327
  return this.connector
328
- .get('resource.collection', { cache: true }, {
328
+ .get('resource.collection', { cache: true, ...requestOptions }, {
329
329
  parent,
330
330
  })
331
331
  .then((items) => {
@@ -732,14 +732,14 @@ class NgwConnector$1 {
732
732
  /**
733
733
  * {@inheritDoc ResourcesControl.getOne}
734
734
  */
735
- getResource(resource) {
736
- return this.resources.getOne(resource);
735
+ getResource(resource, requestOptions) {
736
+ return this.resources.getOne(resource, requestOptions);
737
737
  }
738
738
  /**
739
739
  * {@inheritDoc ResourcesControl.getOneOrFail}
740
740
  */
741
- getResourceOrFail(resource) {
742
- return this.resources.getOneOrFail(resource);
741
+ getResourceOrFail(resource, requestOptions) {
742
+ return this.resources.getOneOrFail(resource, requestOptions);
743
743
  }
744
744
  /**
745
745
  * @deprecated - use {@link NgwConnector.getResource}
@@ -762,32 +762,32 @@ class NgwConnector$1 {
762
762
  /**
763
763
  * {@inheritDoc ResourcesControl.getId}
764
764
  */
765
- getResourceId(resource) {
766
- return this.resources.getId(resource);
765
+ getResourceId(resource, requestOptions) {
766
+ return this.resources.getId(resource, requestOptions);
767
767
  }
768
768
  /**
769
769
  * {@inheritDoc ResourcesControl.getIdOrFail}
770
770
  */
771
- getResourceIdOrFail(resource) {
772
- return this.resources.getIdOrFail(resource);
771
+ getResourceIdOrFail(resource, requestOptions) {
772
+ return this.resources.getIdOrFail(resource, requestOptions);
773
773
  }
774
774
  /**
775
775
  * {@inheritDoc ResourcesControl.getMany}
776
776
  */
777
- getResourcesBy(resource) {
778
- return this.resources.getMany(resource);
777
+ getResourcesBy(resource, requestOptions) {
778
+ return this.resources.getMany(resource, requestOptions);
779
779
  }
780
780
  /**
781
781
  * {@inheritDoc ResourcesControl.getParent}
782
782
  */
783
- getResourceParent(resource) {
784
- return this.resources.getParent(resource);
783
+ getResourceParent(resource, requestOptions) {
784
+ return this.resources.getParent(resource, requestOptions);
785
785
  }
786
786
  /**
787
787
  * {@inheritDoc ResourcesControl.getChildrenOf}
788
788
  */
789
- getResourceChildren(resource) {
790
- return this.resources.getChildrenOf(resource);
789
+ getResourceChildren(resource, requestOptions) {
790
+ return this.resources.getChildrenOf(resource, requestOptions);
791
791
  }
792
792
  /**
793
793
  * {@inheritDoc ResourcesControl.update}
@@ -1 +1 @@
1
- {"version":3,"file":"ngw-connector.cjs.js","sources":["../src/errors/NgwError.ts","../src/utils/loadData.ts","../src/utils/template.ts","../src/errors/ResourceNotFoundError.ts","../src/errors/InsufficientPermissionsError.ts","../src/activeConnectors.ts","../src/utils/isObject.ts","../src/utils/resourceToQuery.ts","../src/utils/resourceCompare.ts","../src/ResourcesControl.ts","../src/utils/apiRequest.ts","../src/NgwConnector.ts","../src/index.ts"],"sourcesContent":["import { NgwExceptions } from '../interfaces';\n\n/**\n * Thrown when...\n */\nexport class NgwError extends Error {\n name = 'NgwError';\n\n title!: string;\n message!: string;\n detail!: string;\n exception!: NgwExceptions;\n status_code!: number | 404 | 500;\n data?: Record<string, any>;\n guru_meditation!: string;\n\n constructor(er?: NgwError) {\n super();\n Object.assign(this, er);\n Object.setPrototypeOf(this, NgwError.prototype);\n }\n}\n","import {\n RequestOptions as NgwRequestOptions,\n RequestMethods,\n} from '../interfaces';\nimport { NgwError } from '../errors/NgwError';\nimport { NetworkError } from '../errors/NetworkError';\n\n// readyState\n// Holds the status of the XMLHttpRequest.\n// 0: request not initialized\n// 1: server connection established\n// 2: request received\n// 3: processing request\n// 4: request finished and response is ready\n\n// status\n// 200: \"OK\"\n// 201 \"Created\"\tThe request has been fulfilled, and a new resource is created\n// 403: \"Forbidden\"\n// 404: \"Page not found\"\n// 500: \"Internal Server Error\"\n// For a complete list go to the Http Messages Reference\n\ntype LoadData = (\n url: string,\n callback: (...args: any[]) => any,\n options: NgwRequestOptions<RequestMethods> | undefined,\n error: (reason?: any) => void,\n onCancel: (cancelHandler: () => void) => void,\n) => void;\n\nlet loadData: LoadData;\n// @ts-ignore\nif (__BROWSER__) {\n loadData = (\n url: string,\n callback: (...args: any[]) => any,\n options: NgwRequestOptions = {},\n error: (reason?: any) => void,\n onCancel: (cancelHandler: () => void) => void,\n ): void => {\n options.method = options.method || 'GET';\n\n const xhr = new XMLHttpRequest();\n xhr.open(options.method || 'GET', url, true); // true for asynchronous\n\n if (options.responseType === 'blob') {\n xhr.responseType = options.responseType;\n }\n const getResponseText = () => {\n try {\n return JSON.parse(xhr.responseText);\n } catch (er) {\n return xhr.responseText;\n }\n };\n const processingResponse = (forError = false) => {\n const cb = forError ? error : callback;\n if (options.responseType === 'blob') {\n cb(xhr.response);\n } else {\n if (xhr.responseText) {\n cb(getResponseText());\n } else {\n error({ message: '' });\n }\n }\n };\n xhr.onload = () => {\n if ([401, 403, 404, 500].indexOf(xhr.status) !== -1) {\n error(new NgwError(getResponseText()));\n }\n processingResponse();\n };\n\n // xhr.onreadystatechange = () => {\n // if (\n // (xhr.readyState === 4 && xhr.status === 200) ||\n // (xhr.readyState === 3 && xhr.status === 201)\n // ) {\n // processingResponse();\n // } else if (xhr.readyState === 3 && xhr.status === 400) {\n // processingResponse();\n // } else if (xhr.readyState === 4 && xhr.status === 500) {\n // processingResponse();\n // } else if (xhr.readyState === 4 && xhr.status === 401) {\n // error(xhr.statusText);\n // } else if (xhr.readyState === 4) {\n // error('request error');\n // }\n // };\n\n xhr.onerror = (er) => {\n if (xhr.status === 0) {\n error(new NetworkError(url));\n } else {\n error(er);\n }\n };\n\n xhr.upload.onprogress = function (e) {\n if (e.lengthComputable) {\n const percentComplete = (e.loaded / e.total) * 100;\n if (options.onProgress) {\n options.onProgress(percentComplete, e);\n }\n // console.log(percentComplete + '% uploaded');\n }\n };\n\n const headers = options.headers;\n if (headers) {\n for (const h in headers) {\n const header = headers[h];\n if (typeof header === 'string') {\n xhr.setRequestHeader(h, header);\n }\n }\n }\n if (options.withCredentials !== undefined) {\n xhr.withCredentials = options.withCredentials;\n }\n\n let data: FormData | any;\n if (options.file) {\n data = new FormData();\n data.append('file', options.file);\n if (options.data) {\n for (const d in data) {\n data.append(d, data[d]);\n }\n }\n } else {\n data = options.data\n ? typeof options.data === 'string'\n ? options.data\n : JSON.stringify(options.data)\n : null;\n }\n if (onCancel) {\n onCancel(() => {\n xhr.abort();\n });\n }\n xhr.send(data);\n };\n} else {\n const url = require('url');\n const http = require('http');\n const https = require('https');\n\n const adapterFor = (inputUrl: string) => {\n const adapters: Record<string, any> = {\n 'http:': http,\n 'https:': https,\n };\n const protocol = url.parse(inputUrl).protocol || 'https:';\n return adapters[protocol];\n };\n\n loadData = (\n url: string,\n callback: (...args: any[]) => any,\n options: NgwRequestOptions<RequestMethods> = {},\n error: (reason?: any) => void,\n onCancel: (cancelHandler: () => void) => void,\n ): Promise<unknown> => {\n const request = new Promise((resolve, reject) => {\n const adapter = adapterFor(url);\n if (adapter) {\n const requestOpt = {\n headers: options.headers || {},\n method: options.method,\n };\n const body =\n typeof options.data === 'string'\n ? options.data\n : JSON.stringify(options.data);\n // https://stackoverflow.com/questions/35589109/node-http-delete-request-no-longer-works-after-upgrading-from-0-10-40\n if (body !== undefined && options.method !== 'POST') {\n Object.assign(requestOpt.headers, {\n 'Content-Type': 'application/json',\n 'Content-Length': Buffer.byteLength(body),\n });\n }\n const req = adapter.request(url, requestOpt, (resp: any) => {\n let data = '';\n resp.on('data', (chunk: any) => {\n data += chunk;\n });\n resp.on('end', () => {\n if (data) {\n let json: Record<string, any> | undefined;\n try {\n json = JSON.parse(data);\n if (json && json.status_code && json.status_code) {\n reject(json.message);\n }\n } catch (er) {\n reject(er);\n // throw new Error(er);\n }\n if (json !== undefined) {\n resolve(json);\n }\n }\n reject('no data');\n });\n });\n req.on('error', (err: any) => {\n reject(err);\n });\n if (body) {\n req.write(body);\n }\n onCancel(() => {\n req.abort();\n });\n req.end();\n } else {\n throw new Error(`Given URL '${url}' is not correct`);\n }\n });\n return request\n .then((data) => {\n if (callback) {\n callback(data);\n }\n return data;\n })\n .catch((er) => {\n if (error) {\n error(er);\n } else {\n throw new Error(er);\n }\n });\n };\n}\n\nexport { loadData };\n","// https://github.com/Leaflet/Leaflet/blob/b507e21c510b53cd704fb8d3f89bb46ea925c8eb/src/core/Util.js#L165\nconst templateRe = /\\{ *([\\w_-]+) *\\}/g;\n\nexport function template(str: string, data: { [param: string]: any }): string {\n return str.replace(templateRe, (s, key) => {\n let value = data[key];\n\n if (value === undefined) {\n throw new Error('No value provided for letiable ' + s);\n } else if (typeof value === 'function') {\n value = value(data);\n }\n return value;\n });\n}\n","import { NgwError } from './NgwError';\nimport { NgwExceptions } from '../interfaces';\n\n/**\n * Thrown when ...\n */\nexport class ResourceNotFoundError extends NgwError {\n name = 'ResourceNotFoundError';\n exception: NgwExceptions = 'nextgisweb.resource.exception.ResourceNotFound';\n\n constructor(obj?: ResourceNotFoundError) {\n super(obj);\n Object.setPrototypeOf(this, ResourceNotFoundError.prototype);\n }\n}\n","import { NgwError } from './NgwError';\nimport { NgwExceptions } from '../interfaces';\n\n/**\n * Thrown when ...\n */\nexport class InsufficientPermissionsError extends NgwError {\n name = 'InsufficientPermissionsError';\n exception: NgwExceptions =\n 'nextgisweb.core.exception.InsufficientPermissions';\n\n constructor(obj: InsufficientPermissionsError) {\n super(obj);\n Object.setPrototypeOf(this, InsufficientPermissionsError.prototype);\n }\n}\n","import { NgwConnectorOptions } from './interfaces';\nimport { NgwConnector } from './NgwConnector';\nimport { objectDeepEqual } from '@nextgis/utils';\n\nexport const CONNECTORS: NgwConnector[] = [];\n\nexport function addConnector(connector: NgwConnector): void {\n CONNECTORS.push(connector);\n}\n\nexport function findConnector(\n options: NgwConnectorOptions,\n): NgwConnector | undefined {\n return CONNECTORS.find((x) => {\n if (x.options.baseUrl === options.baseUrl) {\n if (options.auth) {\n if (x.options.auth) {\n return objectDeepEqual(x.options.auth, options.auth);\n }\n } else {\n // if auth not in find options; use first connector with same url\n return true;\n }\n }\n });\n}\n\nexport function removeConnector(connector: NgwConnector): void {\n const index = CONNECTORS.indexOf(connector);\n if (index !== -1) {\n CONNECTORS.splice(index, 1);\n }\n}\n\nexport function findAndRemoveConnector(options: NgwConnectorOptions): void {\n const exist = findConnector(options);\n if (exist) {\n removeConnector(exist);\n }\n}\n","export function isObject(val: unknown): val is Record<string | number, any> {\n return Object.prototype.toString.call(val) === '[object Object]';\n}\n","import { DeepPartial, defined } from '@nextgis/utils';\nimport { Resource } from '../types/ResourceItem';\nimport { isObject } from './isObject';\n\n/**\n * ```\n * { keyname, parent: { id }} > { keyname, parent__id }\n * ```\n * @param resource - Any property from NGW resource item\n */\nexport function resourceToQuery(\n resource: DeepPartial<Resource>,\n prefix = '',\n): Record<string, unknown> {\n prefix = prefix ? prefix + '__' : '';\n const query: Record<string, any> = {};\n Object.entries(resource).forEach(([key, value]) => {\n if (isObject(value)) {\n const children = resourceToQuery(value as DeepPartial<Resource>, key);\n Object.assign(query, children);\n } else if (defined(value)) {\n query[prefix + key] = value;\n }\n });\n return query;\n}\n","import { objectDeepEqual } from '@nextgis/utils';\nimport type { DeepPartial } from '@nextgis/utils';\nimport type { Resource } from '../types/ResourceItem';\n\nexport function resourceCompare(\n res1: DeepPartial<Resource>,\n res2: DeepPartial<Resource>,\n): boolean {\n return objectDeepEqual(res1, res2);\n}\n","import CancelablePromise from '@nextgis/cancelable-promise';\nimport { defined } from '@nextgis/utils';\nimport Cache from '@nextgis/cache';\n\nimport { resourceToQuery } from './utils/resourceToQuery';\nimport { resourceCompare } from './utils/resourceCompare';\nimport { ResourceNotFoundError } from './errors/ResourceNotFoundError';\n\nimport { isObject } from './utils/isObject';\n\nimport type { DeepPartial } from '@nextgis/utils';\nimport type { NgwConnector } from './NgwConnector';\nimport type { ResourceItem, Resource } from './types/ResourceItem';\nimport type { RequestOptions, ResourceDefinition } from './interfaces';\n\nexport class ResourcesControl {\n cache = new Cache<\n CancelablePromise<ResourceItem | undefined>,\n { id?: number }\n >();\n\n constructor(private connector: NgwConnector) {}\n\n // -------------------------------------------------------------------------\n // Resource Methods\n // -------------------------------------------------------------------------\n\n /**\n * Receive resource from NGW by id, keyname or search-object parameter.\n * @param resource - Resource id, keyname or search-object\n *\n * @remarks\n * Fetching resource would be cached to speed up next call\n */\n getOne(\n resource: ResourceDefinition,\n requestOptions?: RequestOptions,\n ): CancelablePromise<ResourceItem | undefined> {\n const cache = new Cache();\n const makeRequest = () => {\n if (typeof resource === 'string') {\n return this._fetchResourceBy({ keyname: resource }, requestOptions);\n } else if (typeof resource === 'number') {\n return this._fetchResourceById(resource, requestOptions);\n } else if (isObject(resource)) {\n return this._fetchResourceBy(resource, requestOptions);\n }\n return CancelablePromise.resolve(undefined);\n };\n return cache.add('resource', makeRequest, { resource });\n }\n\n getOneOrFail(resource: ResourceDefinition): CancelablePromise<ResourceItem> {\n return this.getOne(resource).then((res) => {\n if (res) {\n return res;\n }\n throw new ResourceNotFoundError();\n });\n }\n\n /**\n * A fast way to retrieve resource ID for any resource definition.\n * @param resource - Any available resource definition\n *\n * @remarks\n * There are situations when exactly the resource id is needed\n * (for example, to compose the correct request to the api)\n * then this method will come in handy to facilitate the extraction of the identifier\n * if the resource is specified through a keyname or other parameters.\n */\n getId(resource: ResourceDefinition): CancelablePromise<number | undefined> {\n if (typeof resource === 'number') {\n return CancelablePromise.resolve(resource);\n } else if (typeof resource === 'string' || isObject(resource)) {\n return this.getOne(resource).then((res) => {\n if (res) {\n return res.resource.id;\n }\n });\n }\n return CancelablePromise.resolve(undefined);\n }\n\n /**\n * A fast way to retrieve resource ID for any resource definition.\n * @param resource - Any available resource definition\n *\n * @remarks\n * Similar with {@link NgwConnector.getResourceId | getResourceId} but rise error if resource is not exist.\n * To not make one more checks if the resource is definitely exists\n */\n getIdOrFail(resource: ResourceDefinition): CancelablePromise<number> {\n return this.getId(resource).then((resp) => {\n if (resp === undefined) {\n throw new Error();\n }\n return resp;\n });\n }\n\n getMany(\n resource: DeepPartial<Resource>,\n requestOptions?: RequestOptions,\n ): CancelablePromise<ResourceItem[]> {\n return this._resourceCacheFilter(resource).then((items) => {\n if (!items.length) {\n const query: Record<string, unknown> = {};\n if (resource.keyname) {\n query.keyname = resource.keyname;\n } else {\n Object.assign(query, resourceToQuery(resource));\n }\n return this.connector\n .get('resource.search', requestOptions, {\n serialization: 'full',\n ...query,\n })\n .then((resources) => {\n if (resources) {\n resources.forEach((x) => {\n this.cache.add('resource.item', CancelablePromise.resolve(x), {\n id: x.resource.id,\n });\n });\n }\n return resources;\n });\n }\n return items;\n });\n }\n\n getParent(\n resource: ResourceDefinition,\n ): CancelablePromise<ResourceItem | undefined> {\n return this.connector.getResource(resource).then((child) => {\n if (child) {\n return this.connector.getResource(child.resource.parent.id);\n }\n return CancelablePromise.resolve(undefined);\n });\n }\n\n getChildrenOf(\n resource: ResourceDefinition,\n ): CancelablePromise<ResourceItem[]> {\n return this.getId(resource).then((parent) => {\n return this.connector\n .get(\n 'resource.collection',\n { cache: true },\n {\n parent,\n },\n )\n .then((items) => {\n for (const i of items) {\n this.cache.add('resource.item', CancelablePromise.resolve(i), {\n id: i.resource.id,\n });\n }\n return items;\n });\n });\n }\n\n update(\n resource: ResourceDefinition,\n data: DeepPartial<ResourceItem>,\n ): CancelablePromise<ResourceItem | undefined> {\n return this.getId(resource).then((id) => {\n if (id !== undefined) {\n return this.connector.put('resource.item', { data }, { id });\n }\n });\n }\n\n /**\n * Fast way to delete resource from NGW and clean cache.\n * @param resource - Resource definition\n */\n delete(resource: ResourceDefinition): CancelablePromise<void> {\n return this.getId(resource).then((id) => {\n if (id !== undefined) {\n return this.connector.delete('resource.item', null, { id }).then(() => {\n this.cache.delete('resource.item', { id });\n return undefined;\n });\n }\n });\n }\n\n private _fetchResourceById(\n id: number,\n requestOptions?: RequestOptions,\n ): CancelablePromise<ResourceItem | undefined> {\n const promise = () =>\n this.connector.get('resource.item', requestOptions, { id });\n\n return this.cache\n .add('resource.item', promise, {\n id,\n })\n .catch((er) => {\n if (!(er instanceof ResourceNotFoundError)) {\n throw er;\n }\n return undefined;\n });\n }\n\n private _fetchResourceBy(\n resource: DeepPartial<Resource>,\n requestOptions?: RequestOptions,\n ): CancelablePromise<ResourceItem | undefined> {\n return this.getMany(resource, requestOptions).then((resources) => {\n return resources[0];\n });\n }\n\n private _resourceCacheFilter(\n resource: DeepPartial<Resource>,\n ): CancelablePromise<ResourceItem[]> {\n return CancelablePromise.all(this.cache.matchAll('resource.item')).then(\n (resources) => {\n const items: ResourceItem[] = [];\n resources.filter((x) => {\n if (x) {\n // identical by uniq props\n if (resource.keyname && x.resource.keyname) {\n return resource.keyname === x.resource.keyname;\n }\n if (defined(resource.id) && defined(x.resource.id)) {\n return resource.id === x.resource.id;\n }\n return resourceCompare(resource, x.resource);\n }\n });\n return items;\n },\n );\n }\n}\n","import CancelablePromise from '@nextgis/cancelable-promise';\nimport { template } from './template';\nimport type { NgwConnector } from '../NgwConnector';\nimport type {\n RequestItemKeys,\n RequestItemsParams,\n RequestOptions,\n} from '../interfaces';\nimport type { RequestItemsParamsMap } from '../types/RequestItemsParamsMap';\n\ninterface ApiRequestOptions<K extends keyof RequestItemsParamsMap> {\n name: string;\n connector: NgwConnector;\n params: RequestItemsParams<K>;\n requestOptions: RequestOptions;\n}\n\nexport function apiRequest<\n K extends keyof RequestItemsParamsMap,\n P extends RequestItemKeys = RequestItemKeys,\n>(opt: ApiRequestOptions<K>): CancelablePromise<P[K]> {\n const params = opt.params;\n return new CancelablePromise((resolve, reject) => {\n opt.connector\n .connect()\n .then((apiItems) => {\n let apiItem = apiItems && apiItems[opt.name];\n if (apiItem) {\n apiItem = [...apiItem];\n let url = apiItem.shift();\n if (apiItem.length) {\n const replaceParams: {\n [num: number]: string;\n } = {};\n for (let fry = 0; fry < apiItem.length; fry++) {\n const arg = apiItem[fry];\n replaceParams[fry] = '{' + arg + '}';\n if (params[arg] === undefined) {\n throw new Error(\n '`' + arg + '`' + ' url api argument is not specified',\n );\n }\n }\n if (url) {\n url = template(url, replaceParams);\n }\n }\n // Transfer part of the parameters from `params` to the URL string\n if (params) {\n const paramArray = [];\n const paramList = params.paramList;\n if (Array.isArray(paramList)) {\n delete params.paramList;\n paramList.forEach((x) => {\n paramArray.push(`${x[0]}=${x[1]}`);\n });\n }\n for (const p in params) {\n if (apiItem.indexOf(p) === -1) {\n paramArray.push(`${p}=${params[p]}`);\n }\n }\n if (paramArray.length) {\n url = url + '?' + paramArray.join('&');\n }\n }\n if (url) {\n resolve(opt.connector.makeQuery(url, params, opt.requestOptions));\n } else {\n reject(new Error('request url is not set'));\n }\n } else {\n resolve(undefined);\n }\n })\n .catch((er) => {\n reject(er);\n });\n });\n}\n","import { EventEmitter } from 'events';\nimport CancelablePromise from '@nextgis/cancelable-promise';\nimport { objectRemoveEmpty } from '@nextgis/utils';\nimport { fixUrlStr } from '@nextgis/utils';\nimport Cache from '@nextgis/cache';\n\nimport { loadData } from './utils/loadData';\nimport { template } from './utils/template';\nimport { NgwError } from './errors/NgwError';\nimport { ResourceNotFoundError } from './errors/ResourceNotFoundError';\nimport { InsufficientPermissionsError } from './errors/InsufficientPermissionsError';\nimport {\n addConnector,\n findConnector,\n removeConnector,\n} from './activeConnectors';\nimport { ResourcesControl } from './ResourcesControl';\n\nimport type { DeepPartial } from '@nextgis/utils';\nimport type {\n DeleteRequestItemsResponseMap,\n PatchRequestItemsResponseMap,\n PostRequestItemsResponseMap,\n GetRequestItemsResponseMap,\n PutRequestItemsResponseMap,\n ResourceIdKeynameDef,\n NgwConnectorOptions,\n ResourceDefinition,\n RequestItemsParams,\n RequestItemKeys,\n RequestHeaders,\n RequestOptions,\n PyramidRoute,\n Credentials,\n UserInfo,\n Params,\n} from './interfaces';\nimport type { RequestItemsParamsMap } from './types/RequestItemsParamsMap';\nimport type { ResourceItem, Resource } from './types/ResourceItem';\nimport { apiRequest } from './utils/apiRequest';\n\nlet ID = 0;\n\nexport class NgwConnector {\n static errors = {\n NgwError,\n ResourceNotFoundError,\n };\n id = ID++;\n\n emitter = new EventEmitter();\n user?: UserInfo;\n\n resources!: ResourcesControl;\n\n private routeStr = '/api/component/pyramid/route';\n\n constructor(public options: NgwConnectorOptions) {\n const exist = findConnector(options);\n if (exist) {\n return exist;\n } else {\n if (this.options.route) {\n this.routeStr = this.options.route;\n }\n this.resources = new ResourcesControl(this);\n addConnector(this);\n }\n }\n\n static create(options: NgwConnectorOptions): NgwConnector {\n return new this(options);\n }\n\n /**\n * Fast way to specify the connection address to NextGIS Web.\n * The current connection will be severed.\n * @param baseUrl - NGW url\n */\n setNgw(baseUrl: string): void {\n this.logout();\n this.options.baseUrl = baseUrl;\n addConnector(this);\n }\n\n /**\n * Establishing a connection with NextGIS Web to fulfill all other requests.\n * @remarks\n * This method need not be called manually as it is used when forming a request in {@link NgwConnector.apiRequest | apiRequest}.\n * Can be used to check connection.\n * @example\n * ```javascript\n * const connector = new NgwConnector({baseUrl: 'https://demo.nextgis.com'});\n * connector.connect()\n * .then(() => console.log('Ok'))\n * .catch((er) => console.log('Connection problem', er));\n * ```\n */\n connect(): CancelablePromise<PyramidRoute> {\n const cache = new Cache();\n const auth = this.options.auth;\n const makeConnect = () =>\n new CancelablePromise((resolve, reject) => {\n const makeQuery = () => {\n return this.makeQuery(this.routeStr, {}, {})\n .then((route: PyramidRoute) => {\n resolve(route);\n })\n .catch((er) => {\n reject(er);\n });\n };\n if (auth) {\n const { login, password } = auth;\n if (login && password) {\n return this.getUserInfo({ login, password })\n .then(() => {\n makeQuery();\n })\n .catch((er) => reject(er));\n }\n }\n return makeQuery();\n });\n return cache.add('route', makeConnect, {\n id: this.id,\n auth,\n baseUrl: this.options.baseUrl,\n });\n }\n\n /**\n * Quick way to change NextGIS Web user.\n * @param credentials - New user credentials\n */\n login(credentials: Credentials): CancelablePromise<UserInfo> {\n this.logout();\n addConnector(this);\n return this.getUserInfo(credentials);\n }\n\n /**\n * Disconnecting a user. Aborting all current requests\n */\n logout(): void {\n removeConnector(this);\n this.options.auth = undefined;\n this.user = undefined;\n this.emitter.emit('logout');\n this.resources.cache.clean();\n }\n\n getUserInfo(credentials?: Credentials): CancelablePromise<UserInfo> {\n if (this.user && this.user.id) {\n return CancelablePromise.resolve(this.user);\n }\n if (credentials) {\n this.options.auth = credentials;\n }\n const options: RequestOptions = {\n headers: this.getAuthorizationHeaders(credentials),\n // withCredentials: true\n };\n\n // Do not use request('auth.current_user') to avoid circular-references\n return this.makeQuery('/api/component/auth/current_user', {}, options)\n .then((data: UserInfo) => {\n this.user = data;\n this.emitter.emit('login', data);\n return data;\n })\n .catch((er) => {\n this.emitter.emit('login:error', er);\n throw er;\n });\n }\n\n /**\n * Obtaining the required Headers for authentication of requests in the NGW.\n */\n getAuthorizationHeaders(\n credentials?: Credentials,\n ): RequestHeaders | undefined {\n const client = this.makeClientId(credentials);\n if (client) {\n return {\n Authorization: 'Basic ' + client,\n };\n }\n }\n\n makeClientId(credentials?: Credentials): string | undefined {\n credentials = credentials || this.options.auth;\n if (credentials) {\n const { login, password } = credentials;\n const str = unescape(encodeURIComponent(`${login}:${password}`));\n // @ts-ignore\n if (__BROWSER__) {\n return window.btoa(str);\n } else {\n return Buffer.from(str).toString('base64');\n }\n }\n }\n\n /**\n * Send request to NGW api router.\n * @param name - NGW route name from {@link https://docs.nextgis.com/docs_ngweb_dev/doc/developer/resource.html#routes | routes}\n * @param params - Request item params or query params\n * @param requestOptions - Request options\n *\n * @example\n * ```javascript\n *\n * // there is such an NGW route item\n * // \"feature_layer.feature.item\": [\n * // \"/api/resource/{0}/feature/{1}\",\n * // \"id\",\n * // \"fid\"\n * // ],\n *\n * const connector = new NgwConnector({ baseUrl: 'https://example.nextgis.com' });\n * connector.apiRequest('feature_layer.feature.item', {\n * // request params for {0} and {1}\n * 'id': 2011,\n * 'fid': 101,\n * // query params\n * 'srs': 4326,\n * 'geom_format': 'geojson',\n * }, { method: 'GET' });\n * // send get-request to 'https://example.nextgis.com/api/resource/2011/feature/101?srs=4326&geom_format=geojson'\n *\n * ```\n */\n apiRequest<\n K extends keyof RequestItemsParamsMap,\n P extends RequestItemKeys = RequestItemKeys,\n >(\n name: K,\n params_: RequestItemsParams<K> = {},\n requestOptions: RequestOptions = {},\n ): CancelablePromise<P[K]> {\n const { method, headers, withCredentials, responseType } = requestOptions;\n const params = objectRemoveEmpty(params_);\n const makeApiRequest = () =>\n apiRequest({ name, params, requestOptions, connector: this });\n if (requestOptions.cache && method === 'GET') {\n const cache = new Cache<CancelablePromise<P[K]>>();\n return cache.add(name, makeApiRequest, {\n params,\n ...objectRemoveEmpty({\n headers,\n withCredentials,\n responseType,\n baseUrl: this.options.baseUrl,\n auth: this.options.auth,\n }),\n });\n }\n return makeApiRequest();\n }\n\n /**\n * Shortcut method for send POST request to NGW.\n * @param name - NGW route name from {@link https://docs.nextgis.com/docs_ngweb_dev/doc/developer/resource.html#routes | routes}\n * @param options - Request options\n * @param params - Request item params or query params\n *\n * @example\n * ```javascript\n * connector.post('resource.collection', { data: POST_PAYLOAD })\n * .then((newResource) => console.log(newResource))\n * .catch((error) => console.warn(error));\n * ```\n */\n post<K extends keyof RequestItemsParamsMap>(\n name: K,\n options?: RequestOptions<'POST'>,\n params?: RequestItemsParams<K>,\n ): CancelablePromise<PostRequestItemsResponseMap[K]> {\n options = options || {};\n options.method = 'POST';\n return this.apiRequest<K, PostRequestItemsResponseMap>(\n name,\n params,\n options,\n );\n }\n\n /**\n * Shortcut method for send GET request to NGW.\n * @param name - NGW route name from {@link https://docs.nextgis.com/docs_ngweb_dev/doc/developer/resource.html#routes | routes}\n * @param options - Request options\n * @param params - Request item params or query params\n */\n get<K extends keyof RequestItemsParamsMap>(\n name: K,\n options?: RequestOptions | undefined | null,\n params?: RequestItemsParams<K>,\n ): CancelablePromise<GetRequestItemsResponseMap[K]> {\n options = options || {};\n options.method = 'GET';\n return this.apiRequest<K, GetRequestItemsResponseMap>(\n name,\n params,\n options,\n );\n }\n\n /**\n * Shortcut method for send PATCH request to NGW.\n * @param name - NGW route name from {@link https://docs.nextgis.com/docs_ngweb_dev/doc/developer/resource.html#routes | routes}\n * @param options - Request options\n * @param params - Request item params or query params\n */\n patch<K extends keyof RequestItemsParamsMap>(\n name: K,\n options?: RequestOptions,\n params?: RequestItemsParams<K>,\n ): CancelablePromise<PatchRequestItemsResponseMap[K]> {\n options = options || {};\n options.method = 'PATCH';\n return this.apiRequest<K, PatchRequestItemsResponseMap>(\n name,\n params,\n options,\n );\n }\n\n /**\n * Shortcut method for send PUT request to NGW.\n * @param name - NGW route name from {@link https://docs.nextgis.com/docs_ngweb_dev/doc/developer/resource.html#routes | routes}\n * @param options - Request options\n * @param params - Request item params or query params\n */\n put<K extends keyof RequestItemsParamsMap>(\n name: K,\n options?: RequestOptions,\n params?: RequestItemsParams<K>,\n ): CancelablePromise<PutRequestItemsResponseMap[K]> {\n options = options || {};\n options.method = 'PUT';\n return this.apiRequest<K, PutRequestItemsResponseMap>(\n name,\n params,\n options,\n );\n }\n\n /**\n * Shortcut method for send DELETE request to NGW.\n * @param name - NGW route name from {@link https://docs.nextgis.com/docs_ngweb_dev/doc/developer/resource.html#routes | routes}\n * @param options - Request options\n * @param params - Request item params or query params\n */\n delete<K extends keyof RequestItemsParamsMap>(\n name: K,\n options?: RequestOptions | undefined | null,\n params?: RequestItemsParams<K>,\n ): CancelablePromise<DeleteRequestItemsResponseMap[K]> {\n options = options || {};\n options.method = 'DELETE';\n return this.apiRequest<K, DeleteRequestItemsResponseMap>(\n name,\n params,\n options,\n );\n }\n\n /**\n * Send request to NGW.\n * @param url - URL address to NGW\n * @param params - Query params\n * @param options - Request options\n */\n makeQuery(\n url: string,\n params?: Params,\n options: RequestOptions = {},\n ): CancelablePromise<any> {\n url = (this.options.baseUrl ? this.options.baseUrl : '') + url;\n if (url) {\n if (params) {\n url = template(url, params);\n }\n // remove double slash\n url = fixUrlStr(url);\n return this._loadData(url, options);\n } else {\n throw new Error('Empty `url` not allowed');\n }\n }\n\n // -------------------------------------------------------------------------\n // Resource Methods\n // -------------------------------------------------------------------------\n\n /**\n * {@inheritDoc ResourcesControl.getOne}\n */\n getResource(\n resource: ResourceDefinition,\n ): CancelablePromise<ResourceItem | undefined> {\n return this.resources.getOne(resource);\n }\n\n /**\n * {@inheritDoc ResourcesControl.getOneOrFail}\n */\n getResourceOrFail(\n resource: ResourceDefinition,\n ): CancelablePromise<ResourceItem> {\n return this.resources.getOneOrFail(resource);\n }\n\n /**\n * @deprecated - use {@link NgwConnector.getResource}\n */\n getResourceBy(\n resource: DeepPartial<Resource>,\n ): CancelablePromise<ResourceItem | undefined> {\n return this.resources.getOne(resource);\n }\n\n /**\n * @deprecated - use {@link NgwConnector.getResource}\n */\n getResourceByKeyname(\n keyname: string,\n ): CancelablePromise<ResourceItem | undefined> {\n return this.resources.getOne(keyname);\n }\n\n /**\n * @deprecated - use {@link NgwConnector.getResource}\n */\n getResourceById(id: number): CancelablePromise<ResourceItem | undefined> {\n return this.resources.getOne(id);\n }\n\n /**\n * {@inheritDoc ResourcesControl.getId}\n */\n getResourceId(\n resource: ResourceDefinition,\n ): CancelablePromise<number | undefined> {\n return this.resources.getId(resource);\n }\n\n /**\n * {@inheritDoc ResourcesControl.getIdOrFail}\n */\n getResourceIdOrFail(resource: ResourceDefinition): CancelablePromise<number> {\n return this.resources.getIdOrFail(resource);\n }\n\n /**\n * {@inheritDoc ResourcesControl.getMany}\n */\n getResourcesBy(\n resource: DeepPartial<Resource>,\n ): CancelablePromise<ResourceItem[]> {\n return this.resources.getMany(resource);\n }\n\n /**\n * {@inheritDoc ResourcesControl.getParent}\n */\n getResourceParent(\n resource: ResourceDefinition,\n ): CancelablePromise<ResourceItem | undefined> {\n return this.resources.getParent(resource);\n }\n\n /**\n * {@inheritDoc ResourcesControl.getChildrenOf}\n */\n getResourceChildren(\n resource: ResourceDefinition,\n ): CancelablePromise<ResourceItem[]> {\n return this.resources.getChildrenOf(resource);\n }\n\n /**\n * {@inheritDoc ResourcesControl.update}\n */\n updateResource(\n resource: ResourceIdKeynameDef,\n data: DeepPartial<ResourceItem>,\n ): CancelablePromise<ResourceItem | undefined> {\n return this.resources.update(resource, data);\n }\n\n /**\n * {@inheritDoc ResourcesControl.delete}\n */\n deleteResource(resource: ResourceIdKeynameDef): CancelablePromise<void> {\n return this.resources.delete(resource);\n }\n\n /**\n * @internal\n */\n protected _loadData(\n url: string,\n options: RequestOptions,\n ): CancelablePromise<any> {\n options.responseType = options.responseType || 'json';\n return new CancelablePromise((resolve, reject, onCancel) => {\n if (this.user) {\n options = options || {};\n // options.withCredentials = true;\n options.headers = {\n ...this.getAuthorizationHeaders(),\n ...options.headers,\n };\n }\n loadData(url, resolve, options, reject, onCancel);\n }).catch((httpError) => {\n if (httpError instanceof CancelablePromise.CancelError) {\n // not need to handle cancel error because onCancel method is used\n } else {\n // @ts-ignore\n if (__DEV__) {\n console.warn(httpError);\n }\n const er = this._handleHttpError(httpError);\n if (er) {\n throw er;\n }\n }\n });\n }\n\n private _handleHttpError(er: Error) {\n if (er) {\n if (er instanceof NgwError) {\n if (er.exception === 'nextgisweb.resource.exception.ResourceNotFound') {\n throw new ResourceNotFoundError(er);\n } else if (\n er.exception === 'nextgisweb.core.exception.InsufficientPermissions'\n ) {\n throw new InsufficientPermissionsError(er);\n }\n }\n }\n return er;\n }\n}\n","/**\n * A lightweight HTTP client optimized for use with {@link http://docs.nextgis.ru/docs_ngweb_dev/doc/developer/toc.html | NextGIS Web} API\n *\n * @remarks\n * Make sure CORS is registered in the {@link https://docs.nextgis.com/docs_ngcom/source/CORS.html | NextGIS Web settings } to be able to send requests.\n *\n * @packageDocumentation\n * @module ngw-connector\n */\nimport { NgwConnector } from './NgwConnector';\n\nexport * from './interfaces';\nexport * from './types/ResourceItem';\nexport * from './types/FeatureLayer';\nexport * from './types/RequestItemsParamsMap';\nexport * from './types/ResourceStore';\n\n// export { NgwConnector };\nexport default NgwConnector;\n"],"names":["objectDeepEqual","defined","Cache","CancelablePromise","NgwConnector","EventEmitter","objectRemoveEmpty","fixUrlStr"],"mappings":"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"}
1
+ {"version":3,"file":"ngw-connector.cjs.js","sources":["../src/errors/NgwError.ts","../src/utils/loadData.ts","../src/utils/template.ts","../src/errors/ResourceNotFoundError.ts","../src/errors/InsufficientPermissionsError.ts","../src/activeConnectors.ts","../src/utils/isObject.ts","../src/utils/resourceToQuery.ts","../src/utils/resourceCompare.ts","../src/ResourcesControl.ts","../src/utils/apiRequest.ts","../src/NgwConnector.ts","../src/index.ts"],"sourcesContent":["import { NgwExceptions } from '../interfaces';\n\n/**\n * Thrown when...\n */\nexport class NgwError extends Error {\n name = 'NgwError';\n\n title!: string;\n message!: string;\n detail!: string;\n exception!: NgwExceptions;\n status_code!: number | 404 | 500;\n data?: Record<string, any>;\n guru_meditation!: string;\n\n constructor(er?: NgwError) {\n super();\n Object.assign(this, er);\n Object.setPrototypeOf(this, NgwError.prototype);\n }\n}\n","import {\n RequestOptions as NgwRequestOptions,\n RequestMethods,\n} from '../interfaces';\nimport { NgwError } from '../errors/NgwError';\nimport { NetworkError } from '../errors/NetworkError';\n\n// readyState\n// Holds the status of the XMLHttpRequest.\n// 0: request not initialized\n// 1: server connection established\n// 2: request received\n// 3: processing request\n// 4: request finished and response is ready\n\n// status\n// 200: \"OK\"\n// 201 \"Created\"\tThe request has been fulfilled, and a new resource is created\n// 403: \"Forbidden\"\n// 404: \"Page not found\"\n// 500: \"Internal Server Error\"\n// For a complete list go to the Http Messages Reference\n\ntype LoadData = (\n url: string,\n callback: (...args: any[]) => any,\n options: NgwRequestOptions<RequestMethods> | undefined,\n error: (reason?: any) => void,\n onCancel: (cancelHandler: () => void) => void,\n) => void;\n\nlet loadData: LoadData;\n// @ts-ignore\nif (__BROWSER__) {\n loadData = (\n url: string,\n callback: (...args: any[]) => any,\n options: NgwRequestOptions = {},\n error: (reason?: any) => void,\n onCancel: (cancelHandler: () => void) => void,\n ): void => {\n options.method = options.method || 'GET';\n\n const xhr = new XMLHttpRequest();\n xhr.open(options.method || 'GET', url, true); // true for asynchronous\n\n if (options.responseType === 'blob') {\n xhr.responseType = options.responseType;\n }\n const getResponseText = () => {\n try {\n return JSON.parse(xhr.responseText);\n } catch (er) {\n return xhr.responseText;\n }\n };\n const processingResponse = (forError = false) => {\n const cb = forError ? error : callback;\n if (options.responseType === 'blob') {\n cb(xhr.response);\n } else {\n if (xhr.responseText) {\n cb(getResponseText());\n } else {\n error({ message: '' });\n }\n }\n };\n xhr.onload = () => {\n if ([401, 403, 404, 500].indexOf(xhr.status) !== -1) {\n error(new NgwError(getResponseText()));\n }\n processingResponse();\n };\n\n // xhr.onreadystatechange = () => {\n // if (\n // (xhr.readyState === 4 && xhr.status === 200) ||\n // (xhr.readyState === 3 && xhr.status === 201)\n // ) {\n // processingResponse();\n // } else if (xhr.readyState === 3 && xhr.status === 400) {\n // processingResponse();\n // } else if (xhr.readyState === 4 && xhr.status === 500) {\n // processingResponse();\n // } else if (xhr.readyState === 4 && xhr.status === 401) {\n // error(xhr.statusText);\n // } else if (xhr.readyState === 4) {\n // error('request error');\n // }\n // };\n\n xhr.onerror = (er) => {\n if (xhr.status === 0) {\n error(new NetworkError(url));\n } else {\n error(er);\n }\n };\n\n xhr.upload.onprogress = function (e) {\n if (e.lengthComputable) {\n const percentComplete = (e.loaded / e.total) * 100;\n if (options.onProgress) {\n options.onProgress(percentComplete, e);\n }\n // console.log(percentComplete + '% uploaded');\n }\n };\n\n const headers = options.headers;\n if (headers) {\n for (const h in headers) {\n const header = headers[h];\n if (typeof header === 'string') {\n xhr.setRequestHeader(h, header);\n }\n }\n }\n if (options.withCredentials !== undefined) {\n xhr.withCredentials = options.withCredentials;\n }\n\n let data: FormData | any;\n if (options.file) {\n data = new FormData();\n data.append('file', options.file);\n if (options.data) {\n for (const d in data) {\n data.append(d, data[d]);\n }\n }\n } else {\n data = options.data\n ? typeof options.data === 'string'\n ? options.data\n : JSON.stringify(options.data)\n : null;\n }\n if (onCancel) {\n onCancel(() => {\n xhr.abort();\n });\n }\n xhr.send(data);\n };\n} else {\n const url = require('url');\n const http = require('http');\n const https = require('https');\n\n const adapterFor = (inputUrl: string) => {\n const adapters: Record<string, any> = {\n 'http:': http,\n 'https:': https,\n };\n const protocol = url.parse(inputUrl).protocol || 'https:';\n return adapters[protocol];\n };\n\n loadData = (\n url: string,\n callback: (...args: any[]) => any,\n options: NgwRequestOptions<RequestMethods> = {},\n error: (reason?: any) => void,\n onCancel: (cancelHandler: () => void) => void,\n ): Promise<unknown> => {\n const request = new Promise((resolve, reject) => {\n const adapter = adapterFor(url);\n if (adapter) {\n const requestOpt = {\n headers: options.headers || {},\n method: options.method,\n };\n const body =\n typeof options.data === 'string'\n ? options.data\n : JSON.stringify(options.data);\n // https://stackoverflow.com/questions/35589109/node-http-delete-request-no-longer-works-after-upgrading-from-0-10-40\n if (body !== undefined && options.method !== 'POST') {\n Object.assign(requestOpt.headers, {\n 'Content-Type': 'application/json',\n 'Content-Length': Buffer.byteLength(body),\n });\n }\n const req = adapter.request(url, requestOpt, (resp: any) => {\n let data = '';\n resp.on('data', (chunk: any) => {\n data += chunk;\n });\n resp.on('end', () => {\n if (data) {\n let json: Record<string, any> | undefined;\n try {\n json = JSON.parse(data);\n if (json && json.status_code && json.status_code) {\n reject(json.message);\n }\n } catch (er) {\n reject(er);\n // throw new Error(er);\n }\n if (json !== undefined) {\n resolve(json);\n }\n }\n reject('no data');\n });\n });\n req.on('error', (err: any) => {\n reject(err);\n });\n if (body) {\n req.write(body);\n }\n onCancel(() => {\n req.abort();\n });\n req.end();\n } else {\n throw new Error(`Given URL '${url}' is not correct`);\n }\n });\n return request\n .then((data) => {\n if (callback) {\n callback(data);\n }\n return data;\n })\n .catch((er) => {\n if (error) {\n error(er);\n } else {\n throw new Error(er);\n }\n });\n };\n}\n\nexport { loadData };\n","// https://github.com/Leaflet/Leaflet/blob/b507e21c510b53cd704fb8d3f89bb46ea925c8eb/src/core/Util.js#L165\nconst templateRe = /\\{ *([\\w_-]+) *\\}/g;\n\nexport function template(str: string, data: { [param: string]: any }): string {\n return str.replace(templateRe, (s, key) => {\n let value = data[key];\n\n if (value === undefined) {\n throw new Error('No value provided for letiable ' + s);\n } else if (typeof value === 'function') {\n value = value(data);\n }\n return value;\n });\n}\n","import { NgwError } from './NgwError';\nimport { NgwExceptions } from '../interfaces';\n\n/**\n * Thrown when ...\n */\nexport class ResourceNotFoundError extends NgwError {\n name = 'ResourceNotFoundError';\n exception: NgwExceptions = 'nextgisweb.resource.exception.ResourceNotFound';\n\n constructor(obj?: ResourceNotFoundError) {\n super(obj);\n Object.setPrototypeOf(this, ResourceNotFoundError.prototype);\n }\n}\n","import { NgwError } from './NgwError';\nimport { NgwExceptions } from '../interfaces';\n\n/**\n * Thrown when ...\n */\nexport class InsufficientPermissionsError extends NgwError {\n name = 'InsufficientPermissionsError';\n exception: NgwExceptions =\n 'nextgisweb.core.exception.InsufficientPermissions';\n\n constructor(obj: InsufficientPermissionsError) {\n super(obj);\n Object.setPrototypeOf(this, InsufficientPermissionsError.prototype);\n }\n}\n","import { NgwConnectorOptions } from './interfaces';\nimport { NgwConnector } from './NgwConnector';\nimport { objectDeepEqual } from '@nextgis/utils';\n\nexport const CONNECTORS: NgwConnector[] = [];\n\nexport function addConnector(connector: NgwConnector): void {\n CONNECTORS.push(connector);\n}\n\nexport function findConnector(\n options: NgwConnectorOptions,\n): NgwConnector | undefined {\n return CONNECTORS.find((x) => {\n if (x.options.baseUrl === options.baseUrl) {\n if (options.auth) {\n if (x.options.auth) {\n return objectDeepEqual(x.options.auth, options.auth);\n }\n } else {\n // if auth not in find options; use first connector with same url\n return true;\n }\n }\n });\n}\n\nexport function removeConnector(connector: NgwConnector): void {\n const index = CONNECTORS.indexOf(connector);\n if (index !== -1) {\n CONNECTORS.splice(index, 1);\n }\n}\n\nexport function findAndRemoveConnector(options: NgwConnectorOptions): void {\n const exist = findConnector(options);\n if (exist) {\n removeConnector(exist);\n }\n}\n","export function isObject(val: unknown): val is Record<string | number, any> {\n return Object.prototype.toString.call(val) === '[object Object]';\n}\n","import { DeepPartial, defined } from '@nextgis/utils';\nimport { Resource } from '../types/ResourceItem';\nimport { isObject } from './isObject';\n\n/**\n * ```\n * { keyname, parent: { id }} > { keyname, parent__id }\n * ```\n * @param resource - Any property from NGW resource item\n */\nexport function resourceToQuery(\n resource: DeepPartial<Resource>,\n prefix = '',\n): Record<string, unknown> {\n prefix = prefix ? prefix + '__' : '';\n const query: Record<string, any> = {};\n Object.entries(resource).forEach(([key, value]) => {\n if (isObject(value)) {\n const children = resourceToQuery(value as DeepPartial<Resource>, key);\n Object.assign(query, children);\n } else if (defined(value)) {\n query[prefix + key] = value;\n }\n });\n return query;\n}\n","import { objectDeepEqual } from '@nextgis/utils';\nimport type { DeepPartial } from '@nextgis/utils';\nimport type { Resource } from '../types/ResourceItem';\n\nexport function resourceCompare(\n res1: DeepPartial<Resource>,\n res2: DeepPartial<Resource>,\n): boolean {\n return objectDeepEqual(res1, res2);\n}\n","import CancelablePromise from '@nextgis/cancelable-promise';\nimport { defined } from '@nextgis/utils';\nimport Cache from '@nextgis/cache';\n\nimport { resourceToQuery } from './utils/resourceToQuery';\nimport { resourceCompare } from './utils/resourceCompare';\nimport { ResourceNotFoundError } from './errors/ResourceNotFoundError';\n\nimport { isObject } from './utils/isObject';\n\nimport type { DeepPartial } from '@nextgis/utils';\nimport type { NgwConnector } from './NgwConnector';\nimport type { ResourceItem, Resource } from './types/ResourceItem';\nimport type { RequestOptions, ResourceDefinition } from './interfaces';\n\nexport class ResourcesControl {\n cache = new Cache<\n CancelablePromise<ResourceItem | undefined>,\n { id?: number }\n >();\n\n constructor(private connector: NgwConnector) {}\n\n // -------------------------------------------------------------------------\n // Resource Methods\n // -------------------------------------------------------------------------\n\n /**\n * Receive resource from NGW by id, keyname or search-object parameter.\n * @param resource - Resource id, keyname or search-object\n *\n * @remarks\n * Fetching resource would be cached to speed up next call\n */\n getOne(\n resource: ResourceDefinition,\n requestOptions?: RequestOptions,\n ): CancelablePromise<ResourceItem | undefined> {\n const cache = new Cache();\n const makeRequest = () => {\n if (typeof resource === 'string') {\n return this._fetchResourceBy({ keyname: resource }, requestOptions);\n } else if (typeof resource === 'number') {\n return this._fetchResourceById(resource, requestOptions);\n } else if (isObject(resource)) {\n return this._fetchResourceBy(resource, requestOptions);\n }\n return CancelablePromise.resolve(undefined);\n };\n return cache.add('resource', makeRequest, { resource });\n }\n\n getOneOrFail(\n resource: ResourceDefinition,\n requestOptions?: Pick<RequestOptions, 'cache'>,\n ): CancelablePromise<ResourceItem> {\n return this.getOne(resource, requestOptions).then((res) => {\n if (res) {\n return res;\n }\n throw new ResourceNotFoundError();\n });\n }\n\n /**\n * A fast way to retrieve resource ID for any resource definition.\n * @param resource - Any available resource definition\n *\n * @remarks\n * There are situations when exactly the resource id is needed\n * (for example, to compose the correct request to the api)\n * then this method will come in handy to facilitate the extraction of the identifier\n * if the resource is specified through a keyname or other parameters.\n */\n getId(\n resource: ResourceDefinition,\n requestOptions?: Pick<RequestOptions, 'cache'>,\n ): CancelablePromise<number | undefined> {\n if (typeof resource === 'number') {\n return CancelablePromise.resolve(resource);\n } else if (typeof resource === 'string' || isObject(resource)) {\n return this.getOne(resource, requestOptions).then((res) => {\n if (res) {\n return res.resource.id;\n }\n });\n }\n return CancelablePromise.resolve(undefined);\n }\n\n /**\n * A fast way to retrieve resource ID for any resource definition.\n * @param resource - Any available resource definition\n *\n * @remarks\n * Similar with {@link NgwConnector.getResourceId | getResourceId} but rise error if resource is not exist.\n * To not make one more checks if the resource is definitely exists\n */\n getIdOrFail(\n resource: ResourceDefinition,\n requestOptions?: Pick<RequestOptions, 'cache'>,\n ): CancelablePromise<number> {\n return this.getId(resource, requestOptions).then((resp) => {\n if (resp === undefined) {\n throw new Error();\n }\n return resp;\n });\n }\n\n getMany(\n resource: DeepPartial<Resource>,\n requestOptions?: RequestOptions,\n ): CancelablePromise<ResourceItem[]> {\n return this._resourceCacheFilter(resource).then((items) => {\n if (!items.length) {\n const query: Record<string, unknown> = {};\n if (resource.keyname) {\n query.keyname = resource.keyname;\n } else {\n Object.assign(query, resourceToQuery(resource));\n }\n return this.connector\n .get('resource.search', requestOptions, {\n serialization: 'full',\n ...query,\n })\n .then((resources) => {\n if (resources) {\n resources.forEach((x) => {\n this.cache.add('resource.item', CancelablePromise.resolve(x), {\n id: x.resource.id,\n });\n });\n }\n return resources;\n });\n }\n return items;\n });\n }\n\n getParent(\n resource: ResourceDefinition,\n requestOptions?: Pick<RequestOptions, 'cache'>,\n ): CancelablePromise<ResourceItem | undefined> {\n return this.getOne(resource, requestOptions).then((child) => {\n if (child) {\n return this.getOne(child.resource.parent.id, requestOptions);\n }\n return CancelablePromise.resolve(undefined);\n });\n }\n\n getChildrenOf(\n resource: ResourceDefinition,\n requestOptions?: Pick<RequestOptions, 'cache'>,\n ): CancelablePromise<ResourceItem[]> {\n return this.getId(resource).then((parent) => {\n return this.connector\n .get(\n 'resource.collection',\n { cache: true, ...requestOptions },\n {\n parent,\n },\n )\n .then((items) => {\n for (const i of items) {\n this.cache.add('resource.item', CancelablePromise.resolve(i), {\n id: i.resource.id,\n });\n }\n return items;\n });\n });\n }\n\n update(\n resource: ResourceDefinition,\n data: DeepPartial<ResourceItem>,\n ): CancelablePromise<ResourceItem | undefined> {\n return this.getId(resource).then((id) => {\n if (id !== undefined) {\n return this.connector.put('resource.item', { data }, { id });\n }\n });\n }\n\n /**\n * Fast way to delete resource from NGW and clean cache.\n * @param resource - Resource definition\n */\n delete(resource: ResourceDefinition): CancelablePromise<void> {\n return this.getId(resource).then((id) => {\n if (id !== undefined) {\n return this.connector.delete('resource.item', null, { id }).then(() => {\n this.cache.delete('resource.item', { id });\n return undefined;\n });\n }\n });\n }\n\n private _fetchResourceById(\n id: number,\n requestOptions?: RequestOptions,\n ): CancelablePromise<ResourceItem | undefined> {\n const promise = () =>\n this.connector.get('resource.item', requestOptions, { id });\n\n return this.cache\n .add('resource.item', promise, {\n id,\n })\n .catch((er) => {\n if (!(er instanceof ResourceNotFoundError)) {\n throw er;\n }\n return undefined;\n });\n }\n\n private _fetchResourceBy(\n resource: DeepPartial<Resource>,\n requestOptions?: RequestOptions,\n ): CancelablePromise<ResourceItem | undefined> {\n return this.getMany(resource, requestOptions).then((resources) => {\n return resources[0];\n });\n }\n\n private _resourceCacheFilter(\n resource: DeepPartial<Resource>,\n ): CancelablePromise<ResourceItem[]> {\n return CancelablePromise.all(this.cache.matchAll('resource.item')).then(\n (resources) => {\n const items: ResourceItem[] = [];\n resources.filter((x) => {\n if (x) {\n // identical by uniq props\n if (resource.keyname && x.resource.keyname) {\n return resource.keyname === x.resource.keyname;\n }\n if (defined(resource.id) && defined(x.resource.id)) {\n return resource.id === x.resource.id;\n }\n return resourceCompare(resource, x.resource);\n }\n });\n return items;\n },\n );\n }\n}\n","import CancelablePromise from '@nextgis/cancelable-promise';\nimport { template } from './template';\nimport type { NgwConnector } from '../NgwConnector';\nimport type {\n RequestItemKeys,\n RequestItemsParams,\n RequestOptions,\n} from '../interfaces';\nimport type { RequestItemsParamsMap } from '../types/RequestItemsParamsMap';\n\ninterface ApiRequestOptions<K extends keyof RequestItemsParamsMap> {\n name: string;\n connector: NgwConnector;\n params: RequestItemsParams<K>;\n requestOptions: RequestOptions;\n}\n\nexport function apiRequest<\n K extends keyof RequestItemsParamsMap,\n P extends RequestItemKeys = RequestItemKeys,\n>(opt: ApiRequestOptions<K>): CancelablePromise<P[K]> {\n const params = opt.params;\n return new CancelablePromise((resolve, reject) => {\n opt.connector\n .connect()\n .then((apiItems) => {\n let apiItem = apiItems && apiItems[opt.name];\n if (apiItem) {\n apiItem = [...apiItem];\n let url = apiItem.shift();\n if (apiItem.length) {\n const replaceParams: {\n [num: number]: string;\n } = {};\n for (let fry = 0; fry < apiItem.length; fry++) {\n const arg = apiItem[fry];\n replaceParams[fry] = '{' + arg + '}';\n if (params[arg] === undefined) {\n throw new Error(\n '`' + arg + '`' + ' url api argument is not specified',\n );\n }\n }\n if (url) {\n url = template(url, replaceParams);\n }\n }\n // Transfer part of the parameters from `params` to the URL string\n if (params) {\n const paramArray = [];\n const paramList = params.paramList;\n if (Array.isArray(paramList)) {\n delete params.paramList;\n paramList.forEach((x) => {\n paramArray.push(`${x[0]}=${x[1]}`);\n });\n }\n for (const p in params) {\n if (apiItem.indexOf(p) === -1) {\n paramArray.push(`${p}=${params[p]}`);\n }\n }\n if (paramArray.length) {\n url = url + '?' + paramArray.join('&');\n }\n }\n if (url) {\n resolve(opt.connector.makeQuery(url, params, opt.requestOptions));\n } else {\n reject(new Error('request url is not set'));\n }\n } else {\n resolve(undefined);\n }\n })\n .catch((er) => {\n reject(er);\n });\n });\n}\n","import { EventEmitter } from 'events';\nimport CancelablePromise from '@nextgis/cancelable-promise';\nimport { objectRemoveEmpty } from '@nextgis/utils';\nimport { fixUrlStr } from '@nextgis/utils';\nimport Cache from '@nextgis/cache';\n\nimport { loadData } from './utils/loadData';\nimport { template } from './utils/template';\nimport { NgwError } from './errors/NgwError';\nimport { ResourceNotFoundError } from './errors/ResourceNotFoundError';\nimport { InsufficientPermissionsError } from './errors/InsufficientPermissionsError';\nimport {\n addConnector,\n findConnector,\n removeConnector,\n} from './activeConnectors';\nimport { ResourcesControl } from './ResourcesControl';\n\nimport type { DeepPartial } from '@nextgis/utils';\nimport type {\n DeleteRequestItemsResponseMap,\n PatchRequestItemsResponseMap,\n PostRequestItemsResponseMap,\n GetRequestItemsResponseMap,\n PutRequestItemsResponseMap,\n ResourceIdKeynameDef,\n NgwConnectorOptions,\n ResourceDefinition,\n RequestItemsParams,\n RequestItemKeys,\n RequestHeaders,\n RequestOptions,\n PyramidRoute,\n Credentials,\n UserInfo,\n Params,\n} from './interfaces';\nimport type { RequestItemsParamsMap } from './types/RequestItemsParamsMap';\nimport type { ResourceItem, Resource } from './types/ResourceItem';\nimport { apiRequest } from './utils/apiRequest';\n\nlet ID = 0;\n\nexport class NgwConnector {\n static errors = {\n NgwError,\n ResourceNotFoundError,\n };\n id = ID++;\n\n emitter = new EventEmitter();\n user?: UserInfo;\n\n resources!: ResourcesControl;\n\n private routeStr = '/api/component/pyramid/route';\n\n constructor(public options: NgwConnectorOptions) {\n const exist = findConnector(options);\n if (exist) {\n return exist;\n } else {\n if (this.options.route) {\n this.routeStr = this.options.route;\n }\n this.resources = new ResourcesControl(this);\n addConnector(this);\n }\n }\n\n static create(options: NgwConnectorOptions): NgwConnector {\n return new this(options);\n }\n\n /**\n * Fast way to specify the connection address to NextGIS Web.\n * The current connection will be severed.\n * @param baseUrl - NGW url\n */\n setNgw(baseUrl: string): void {\n this.logout();\n this.options.baseUrl = baseUrl;\n addConnector(this);\n }\n\n /**\n * Establishing a connection with NextGIS Web to fulfill all other requests.\n * @remarks\n * This method need not be called manually as it is used when forming a request in {@link NgwConnector.apiRequest | apiRequest}.\n * Can be used to check connection.\n * @example\n * ```javascript\n * const connector = new NgwConnector({baseUrl: 'https://demo.nextgis.com'});\n * connector.connect()\n * .then(() => console.log('Ok'))\n * .catch((er) => console.log('Connection problem', er));\n * ```\n */\n connect(): CancelablePromise<PyramidRoute> {\n const cache = new Cache();\n const auth = this.options.auth;\n const makeConnect = () =>\n new CancelablePromise((resolve, reject) => {\n const makeQuery = () => {\n return this.makeQuery(this.routeStr, {}, {})\n .then((route: PyramidRoute) => {\n resolve(route);\n })\n .catch((er) => {\n reject(er);\n });\n };\n if (auth) {\n const { login, password } = auth;\n if (login && password) {\n return this.getUserInfo({ login, password })\n .then(() => {\n makeQuery();\n })\n .catch((er) => reject(er));\n }\n }\n return makeQuery();\n });\n return cache.add('route', makeConnect, {\n id: this.id,\n auth,\n baseUrl: this.options.baseUrl,\n });\n }\n\n /**\n * Quick way to change NextGIS Web user.\n * @param credentials - New user credentials\n */\n login(credentials: Credentials): CancelablePromise<UserInfo> {\n this.logout();\n addConnector(this);\n return this.getUserInfo(credentials);\n }\n\n /**\n * Disconnecting a user. Aborting all current requests\n */\n logout(): void {\n removeConnector(this);\n this.options.auth = undefined;\n this.user = undefined;\n this.emitter.emit('logout');\n this.resources.cache.clean();\n }\n\n getUserInfo(credentials?: Credentials): CancelablePromise<UserInfo> {\n if (this.user && this.user.id) {\n return CancelablePromise.resolve(this.user);\n }\n if (credentials) {\n this.options.auth = credentials;\n }\n const options: RequestOptions = {\n headers: this.getAuthorizationHeaders(credentials),\n // withCredentials: true\n };\n\n // Do not use request('auth.current_user') to avoid circular-references\n return this.makeQuery('/api/component/auth/current_user', {}, options)\n .then((data: UserInfo) => {\n this.user = data;\n this.emitter.emit('login', data);\n return data;\n })\n .catch((er) => {\n this.emitter.emit('login:error', er);\n throw er;\n });\n }\n\n /**\n * Obtaining the required Headers for authentication of requests in the NGW.\n */\n getAuthorizationHeaders(\n credentials?: Credentials,\n ): RequestHeaders | undefined {\n const client = this.makeClientId(credentials);\n if (client) {\n return {\n Authorization: 'Basic ' + client,\n };\n }\n }\n\n makeClientId(credentials?: Credentials): string | undefined {\n credentials = credentials || this.options.auth;\n if (credentials) {\n const { login, password } = credentials;\n const str = unescape(encodeURIComponent(`${login}:${password}`));\n // @ts-ignore\n if (__BROWSER__) {\n return window.btoa(str);\n } else {\n return Buffer.from(str).toString('base64');\n }\n }\n }\n\n /**\n * Send request to NGW api router.\n * @param name - NGW route name from {@link https://docs.nextgis.com/docs_ngweb_dev/doc/developer/resource.html#routes | routes}\n * @param params - Request item params or query params\n * @param requestOptions - Request options\n *\n * @example\n * ```javascript\n *\n * // there is such an NGW route item\n * // \"feature_layer.feature.item\": [\n * // \"/api/resource/{0}/feature/{1}\",\n * // \"id\",\n * // \"fid\"\n * // ],\n *\n * const connector = new NgwConnector({ baseUrl: 'https://example.nextgis.com' });\n * connector.apiRequest('feature_layer.feature.item', {\n * // request params for {0} and {1}\n * 'id': 2011,\n * 'fid': 101,\n * // query params\n * 'srs': 4326,\n * 'geom_format': 'geojson',\n * }, { method: 'GET' });\n * // send get-request to 'https://example.nextgis.com/api/resource/2011/feature/101?srs=4326&geom_format=geojson'\n *\n * ```\n */\n apiRequest<\n K extends keyof RequestItemsParamsMap,\n P extends RequestItemKeys = RequestItemKeys,\n >(\n name: K,\n params_: RequestItemsParams<K> = {},\n requestOptions: RequestOptions = {},\n ): CancelablePromise<P[K]> {\n const { method, headers, withCredentials, responseType } = requestOptions;\n const params = objectRemoveEmpty(params_);\n const makeApiRequest = () =>\n apiRequest({ name, params, requestOptions, connector: this });\n if (requestOptions.cache && method === 'GET') {\n const cache = new Cache<CancelablePromise<P[K]>>();\n return cache.add(name, makeApiRequest, {\n params,\n ...objectRemoveEmpty({\n headers,\n withCredentials,\n responseType,\n baseUrl: this.options.baseUrl,\n auth: this.options.auth,\n }),\n });\n }\n return makeApiRequest();\n }\n\n /**\n * Shortcut method for send POST request to NGW.\n * @param name - NGW route name from {@link https://docs.nextgis.com/docs_ngweb_dev/doc/developer/resource.html#routes | routes}\n * @param options - Request options\n * @param params - Request item params or query params\n *\n * @example\n * ```javascript\n * connector.post('resource.collection', { data: POST_PAYLOAD })\n * .then((newResource) => console.log(newResource))\n * .catch((error) => console.warn(error));\n * ```\n */\n post<K extends keyof RequestItemsParamsMap>(\n name: K,\n options?: RequestOptions<'POST'>,\n params?: RequestItemsParams<K>,\n ): CancelablePromise<PostRequestItemsResponseMap[K]> {\n options = options || {};\n options.method = 'POST';\n return this.apiRequest<K, PostRequestItemsResponseMap>(\n name,\n params,\n options,\n );\n }\n\n /**\n * Shortcut method for send GET request to NGW.\n * @param name - NGW route name from {@link https://docs.nextgis.com/docs_ngweb_dev/doc/developer/resource.html#routes | routes}\n * @param options - Request options\n * @param params - Request item params or query params\n */\n get<K extends keyof RequestItemsParamsMap>(\n name: K,\n options?: RequestOptions | undefined | null,\n params?: RequestItemsParams<K>,\n ): CancelablePromise<GetRequestItemsResponseMap[K]> {\n options = options || {};\n options.method = 'GET';\n return this.apiRequest<K, GetRequestItemsResponseMap>(\n name,\n params,\n options,\n );\n }\n\n /**\n * Shortcut method for send PATCH request to NGW.\n * @param name - NGW route name from {@link https://docs.nextgis.com/docs_ngweb_dev/doc/developer/resource.html#routes | routes}\n * @param options - Request options\n * @param params - Request item params or query params\n */\n patch<K extends keyof RequestItemsParamsMap>(\n name: K,\n options?: RequestOptions,\n params?: RequestItemsParams<K>,\n ): CancelablePromise<PatchRequestItemsResponseMap[K]> {\n options = options || {};\n options.method = 'PATCH';\n return this.apiRequest<K, PatchRequestItemsResponseMap>(\n name,\n params,\n options,\n );\n }\n\n /**\n * Shortcut method for send PUT request to NGW.\n * @param name - NGW route name from {@link https://docs.nextgis.com/docs_ngweb_dev/doc/developer/resource.html#routes | routes}\n * @param options - Request options\n * @param params - Request item params or query params\n */\n put<K extends keyof RequestItemsParamsMap>(\n name: K,\n options?: RequestOptions,\n params?: RequestItemsParams<K>,\n ): CancelablePromise<PutRequestItemsResponseMap[K]> {\n options = options || {};\n options.method = 'PUT';\n return this.apiRequest<K, PutRequestItemsResponseMap>(\n name,\n params,\n options,\n );\n }\n\n /**\n * Shortcut method for send DELETE request to NGW.\n * @param name - NGW route name from {@link https://docs.nextgis.com/docs_ngweb_dev/doc/developer/resource.html#routes | routes}\n * @param options - Request options\n * @param params - Request item params or query params\n */\n delete<K extends keyof RequestItemsParamsMap>(\n name: K,\n options?: RequestOptions | undefined | null,\n params?: RequestItemsParams<K>,\n ): CancelablePromise<DeleteRequestItemsResponseMap[K]> {\n options = options || {};\n options.method = 'DELETE';\n return this.apiRequest<K, DeleteRequestItemsResponseMap>(\n name,\n params,\n options,\n );\n }\n\n /**\n * Send request to NGW.\n * @param url - URL address to NGW\n * @param params - Query params\n * @param options - Request options\n */\n makeQuery(\n url: string,\n params?: Params,\n options: RequestOptions = {},\n ): CancelablePromise<any> {\n url = (this.options.baseUrl ? this.options.baseUrl : '') + url;\n if (url) {\n if (params) {\n url = template(url, params);\n }\n // remove double slash\n url = fixUrlStr(url);\n return this._loadData(url, options);\n } else {\n throw new Error('Empty `url` not allowed');\n }\n }\n\n // -------------------------------------------------------------------------\n // Resource Methods\n // -------------------------------------------------------------------------\n\n /**\n * {@inheritDoc ResourcesControl.getOne}\n */\n getResource(\n resource: ResourceDefinition,\n requestOptions?: Pick<RequestOptions, 'cache'>,\n ): CancelablePromise<ResourceItem | undefined> {\n return this.resources.getOne(resource, requestOptions);\n }\n\n /**\n * {@inheritDoc ResourcesControl.getOneOrFail}\n */\n getResourceOrFail(\n resource: ResourceDefinition,\n requestOptions?: Pick<RequestOptions, 'cache'>,\n ): CancelablePromise<ResourceItem> {\n return this.resources.getOneOrFail(resource, requestOptions);\n }\n\n /**\n * @deprecated - use {@link NgwConnector.getResource}\n */\n getResourceBy(\n resource: DeepPartial<Resource>,\n ): CancelablePromise<ResourceItem | undefined> {\n return this.resources.getOne(resource);\n }\n\n /**\n * @deprecated - use {@link NgwConnector.getResource}\n */\n getResourceByKeyname(\n keyname: string,\n ): CancelablePromise<ResourceItem | undefined> {\n return this.resources.getOne(keyname);\n }\n\n /**\n * @deprecated - use {@link NgwConnector.getResource}\n */\n getResourceById(id: number): CancelablePromise<ResourceItem | undefined> {\n return this.resources.getOne(id);\n }\n\n /**\n * {@inheritDoc ResourcesControl.getId}\n */\n getResourceId(\n resource: ResourceDefinition,\n requestOptions?: Pick<RequestOptions, 'cache'>,\n ): CancelablePromise<number | undefined> {\n return this.resources.getId(resource, requestOptions);\n }\n\n /**\n * {@inheritDoc ResourcesControl.getIdOrFail}\n */\n getResourceIdOrFail(\n resource: ResourceDefinition,\n requestOptions?: Pick<RequestOptions, 'cache'>,\n ): CancelablePromise<number> {\n return this.resources.getIdOrFail(resource, requestOptions);\n }\n\n /**\n * {@inheritDoc ResourcesControl.getMany}\n */\n getResourcesBy(\n resource: DeepPartial<Resource>,\n requestOptions?: Pick<RequestOptions, 'cache'>,\n ): CancelablePromise<ResourceItem[]> {\n return this.resources.getMany(resource, requestOptions);\n }\n\n /**\n * {@inheritDoc ResourcesControl.getParent}\n */\n getResourceParent(\n resource: ResourceDefinition,\n requestOptions?: Pick<RequestOptions, 'cache'>,\n ): CancelablePromise<ResourceItem | undefined> {\n return this.resources.getParent(resource, requestOptions);\n }\n\n /**\n * {@inheritDoc ResourcesControl.getChildrenOf}\n */\n getResourceChildren(\n resource: ResourceDefinition,\n requestOptions?: Pick<RequestOptions, 'cache'>,\n ): CancelablePromise<ResourceItem[]> {\n return this.resources.getChildrenOf(resource, requestOptions);\n }\n\n /**\n * {@inheritDoc ResourcesControl.update}\n */\n updateResource(\n resource: ResourceIdKeynameDef,\n data: DeepPartial<ResourceItem>,\n ): CancelablePromise<ResourceItem | undefined> {\n return this.resources.update(resource, data);\n }\n\n /**\n * {@inheritDoc ResourcesControl.delete}\n */\n deleteResource(resource: ResourceIdKeynameDef): CancelablePromise<void> {\n return this.resources.delete(resource);\n }\n\n /**\n * @internal\n */\n protected _loadData(\n url: string,\n options: RequestOptions,\n ): CancelablePromise<any> {\n options.responseType = options.responseType || 'json';\n return new CancelablePromise((resolve, reject, onCancel) => {\n if (this.user) {\n options = options || {};\n // options.withCredentials = true;\n options.headers = {\n ...this.getAuthorizationHeaders(),\n ...options.headers,\n };\n }\n loadData(url, resolve, options, reject, onCancel);\n }).catch((httpError) => {\n if (httpError instanceof CancelablePromise.CancelError) {\n // not need to handle cancel error because onCancel method is used\n } else {\n // @ts-ignore\n if (__DEV__) {\n console.warn(httpError);\n }\n const er = this._handleHttpError(httpError);\n if (er) {\n throw er;\n }\n }\n });\n }\n\n private _handleHttpError(er: Error) {\n if (er) {\n if (er instanceof NgwError) {\n if (er.exception === 'nextgisweb.resource.exception.ResourceNotFound') {\n throw new ResourceNotFoundError(er);\n } else if (\n er.exception === 'nextgisweb.core.exception.InsufficientPermissions'\n ) {\n throw new InsufficientPermissionsError(er);\n }\n }\n }\n return er;\n }\n}\n","/**\n * A lightweight HTTP client optimized for use with {@link http://docs.nextgis.ru/docs_ngweb_dev/doc/developer/toc.html | NextGIS Web} API\n *\n * @remarks\n * Make sure CORS is registered in the {@link https://docs.nextgis.com/docs_ngcom/source/CORS.html | NextGIS Web settings } to be able to send requests.\n *\n * @packageDocumentation\n * @module ngw-connector\n */\nimport { NgwConnector } from './NgwConnector';\n\nexport * from './interfaces';\nexport * from './types/ResourceItem';\nexport * from './types/FeatureLayer';\nexport * from './types/RequestItemsParamsMap';\nexport * from './types/ResourceStore';\n\n// export { NgwConnector };\nexport default NgwConnector;\n"],"names":["objectDeepEqual","defined","Cache","CancelablePromise","NgwConnector","EventEmitter","objectRemoveEmpty","fixUrlStr"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";var e=require("events"),t=require("@nextgis/cancelable-promise"),r=require("@nextgis/utils"),s=require("@nextgis/cache");function o(e){return e&&"object"==typeof e&&"default"in e?e.default:e}var n=o(t),i=o(s);class c extends Error{constructor(e){super(),this.name="NgwError",Object.assign(this,e),Object.setPrototypeOf(this,c.prototype)}}let u;{const e=require("url"),t=require("http"),r=require("https"),s=s=>({"http:":t,"https:":r}[e.parse(s).protocol||"https:"]);u=(e,t,r={},o,n)=>new Promise(((t,o)=>{const i=s(e);if(!i)throw new Error(`Given URL '${e}' is not correct`);{const s={headers:r.headers||{},method:r.method},c="string"==typeof r.data?r.data:JSON.stringify(r.data);void 0!==c&&"POST"!==r.method&&Object.assign(s.headers,{"Content-Type":"application/json","Content-Length":Buffer.byteLength(c)});const u=i.request(e,s,(e=>{let r="";e.on("data",(e=>{r+=e})),e.on("end",(()=>{if(r){let e;try{e=JSON.parse(r),e&&e.status_code&&e.status_code&&o(e.message)}catch(e){o(e)}void 0!==e&&t(e)}o("no data")}))}));u.on("error",(e=>{o(e)})),c&&u.write(c),n((()=>{u.abort()})),u.end()}})).then((e=>(t&&t(e),e))).catch((e=>{if(!o)throw new Error(e);o(e)}))}const h=/\{ *([\w_-]+) *\}/g;function a(e,t){return e.replace(h,((e,r)=>{let s=t[r];if(void 0===s)throw new Error("No value provided for letiable "+e);return"function"==typeof s&&(s=s(t)),s}))}class d extends c{constructor(e){super(e),this.name="ResourceNotFoundError",this.exception="nextgisweb.resource.exception.ResourceNotFound",Object.setPrototypeOf(this,d.prototype)}}class p extends c{constructor(e){super(e),this.name="InsufficientPermissionsError",this.exception="nextgisweb.core.exception.InsufficientPermissions",Object.setPrototypeOf(this,p.prototype)}}const l=[];function f(e){l.push(e)}function g(e){return"[object Object]"===Object.prototype.toString.call(e)}function m(e,t=""){t=t?t+"__":"";const s={};return Object.entries(e).forEach((([e,o])=>{if(g(o)){const t=m(o,e);Object.assign(s,t)}else r.defined(o)&&(s[t+e]=o)})),s}class y{constructor(e){this.connector=e,this.cache=new i}getOne(e,t){return(new i).add("resource",(()=>"string"==typeof e?this._fetchResourceBy({keyname:e},t):"number"==typeof e?this._fetchResourceById(e,t):g(e)?this._fetchResourceBy(e,t):n.resolve(void 0)),{resource:e})}getOneOrFail(e){return this.getOne(e).then((e=>{if(e)return e;throw new d}))}getId(e){return"number"==typeof e?n.resolve(e):"string"==typeof e||g(e)?this.getOne(e).then((e=>{if(e)return e.resource.id})):n.resolve(void 0)}getIdOrFail(e){return this.getId(e).then((e=>{if(void 0===e)throw new Error;return e}))}getMany(e,t){return this._resourceCacheFilter(e).then((r=>{if(!r.length){const r={};return e.keyname?r.keyname=e.keyname:Object.assign(r,m(e)),this.connector.get("resource.search",t,{serialization:"full",...r}).then((e=>(e&&e.forEach((e=>{this.cache.add("resource.item",n.resolve(e),{id:e.resource.id})})),e)))}return r}))}getParent(e){return this.connector.getResource(e).then((e=>e?this.connector.getResource(e.resource.parent.id):n.resolve(void 0)))}getChildrenOf(e){return this.getId(e).then((e=>this.connector.get("resource.collection",{cache:!0},{parent:e}).then((e=>{for(const t of e)this.cache.add("resource.item",n.resolve(t),{id:t.resource.id});return e}))))}update(e,t){return this.getId(e).then((e=>{if(void 0!==e)return this.connector.put("resource.item",{data:t},{id:e})}))}delete(e){return this.getId(e).then((e=>{if(void 0!==e)return this.connector.delete("resource.item",null,{id:e}).then((()=>{this.cache.delete("resource.item",{id:e})}))}))}_fetchResourceById(e,t){return this.cache.add("resource.item",(()=>this.connector.get("resource.item",t,{id:e})),{id:e}).catch((e=>{if(!(e instanceof d))throw e}))}_fetchResourceBy(e,t){return this.getMany(e,t).then((e=>e[0]))}_resourceCacheFilter(e){return n.all(this.cache.matchAll("resource.item")).then((t=>(t.filter((t=>{if(t)return e.keyname&&t.resource.keyname?e.keyname===t.resource.keyname:r.defined(e.id)&&r.defined(t.resource.id)?e.id===t.resource.id:r.objectDeepEqual(e,t.resource)})),[])))}}let w=0;class O{constructor(t){this.options=t,this.id=w++,this.emitter=new e.EventEmitter,this.routeStr="/api/component/pyramid/route";const s=function(e){return l.find((t=>{if(t.options.baseUrl===e.baseUrl){if(!e.auth)return!0;if(t.options.auth)return r.objectDeepEqual(t.options.auth,e.auth)}}))}(t);if(s)return s;this.options.route&&(this.routeStr=this.options.route),this.resources=new y(this),f(this)}static create(e){return new this(e)}setNgw(e){this.logout(),this.options.baseUrl=e,f(this)}connect(){const e=new i,t=this.options.auth;return e.add("route",(()=>new n(((e,r)=>{const s=()=>this.makeQuery(this.routeStr,{},{}).then((t=>{e(t)})).catch((e=>{r(e)}));if(t){const{login:e,password:o}=t;if(e&&o)return this.getUserInfo({login:e,password:o}).then((()=>{s()})).catch((e=>r(e)))}return s()}))),{id:this.id,auth:t,baseUrl:this.options.baseUrl})}login(e){return this.logout(),f(this),this.getUserInfo(e)}logout(){!function(e){const t=l.indexOf(e);-1!==t&&l.splice(t,1)}(this),this.options.auth=void 0,this.user=void 0,this.emitter.emit("logout"),this.resources.cache.clean()}getUserInfo(e){if(this.user&&this.user.id)return n.resolve(this.user);e&&(this.options.auth=e);const t={headers:this.getAuthorizationHeaders(e)};return this.makeQuery("/api/component/auth/current_user",{},t).then((e=>(this.user=e,this.emitter.emit("login",e),e))).catch((e=>{throw this.emitter.emit("login:error",e),e}))}getAuthorizationHeaders(e){const t=this.makeClientId(e);if(t)return{Authorization:"Basic "+t}}makeClientId(e){if(e=e||this.options.auth){const{login:t,password:r}=e,s=unescape(encodeURIComponent(`${t}:${r}`));return Buffer.from(s).toString("base64")}}apiRequest(e,t={},s={}){const{method:o,headers:c,withCredentials:u,responseType:h}=s,d=r.objectRemoveEmpty(t),p=()=>function(e){const t=e.params;return new n(((r,s)=>{e.connector.connect().then((o=>{let n=o&&o[e.name];if(n){n=[...n];let o=n.shift();if(n.length){const e={};for(let r=0;r<n.length;r++){const s=n[r];if(e[r]="{"+s+"}",void 0===t[s])throw new Error("`"+s+"` url api argument is not specified")}o&&(o=a(o,e))}if(t){const e=[],r=t.paramList;Array.isArray(r)&&(delete t.paramList,r.forEach((t=>{e.push(`${t[0]}=${t[1]}`)})));for(const r in t)-1===n.indexOf(r)&&e.push(`${r}=${t[r]}`);e.length&&(o=o+"?"+e.join("&"))}o?r(e.connector.makeQuery(o,t,e.requestOptions)):s(new Error("request url is not set"))}else r(void 0)})).catch((e=>{s(e)}))}))}({name:e,params:d,requestOptions:s,connector:this});if(s.cache&&"GET"===o){return(new i).add(e,p,{params:d,...r.objectRemoveEmpty({headers:c,withCredentials:u,responseType:h,baseUrl:this.options.baseUrl,auth:this.options.auth})})}return p()}post(e,t,r){return(t=t||{}).method="POST",this.apiRequest(e,r,t)}get(e,t,r){return(t=t||{}).method="GET",this.apiRequest(e,r,t)}patch(e,t,r){return(t=t||{}).method="PATCH",this.apiRequest(e,r,t)}put(e,t,r){return(t=t||{}).method="PUT",this.apiRequest(e,r,t)}delete(e,t,r){return(t=t||{}).method="DELETE",this.apiRequest(e,r,t)}makeQuery(e,t,s={}){if(e=(this.options.baseUrl?this.options.baseUrl:"")+e)return t&&(e=a(e,t)),e=r.fixUrlStr(e),this._loadData(e,s);throw new Error("Empty `url` not allowed")}getResource(e){return this.resources.getOne(e)}getResourceOrFail(e){return this.resources.getOneOrFail(e)}getResourceBy(e){return this.resources.getOne(e)}getResourceByKeyname(e){return this.resources.getOne(e)}getResourceById(e){return this.resources.getOne(e)}getResourceId(e){return this.resources.getId(e)}getResourceIdOrFail(e){return this.resources.getIdOrFail(e)}getResourcesBy(e){return this.resources.getMany(e)}getResourceParent(e){return this.resources.getParent(e)}getResourceChildren(e){return this.resources.getChildrenOf(e)}updateResource(e,t){return this.resources.update(e,t)}deleteResource(e){return this.resources.delete(e)}_loadData(e,t){return t.responseType=t.responseType||"json",new n(((r,s,o)=>{this.user&&((t=t||{}).headers={...this.getAuthorizationHeaders(),...t.headers}),u(e,r,t,s,o)})).catch((e=>{if(e instanceof n.CancelError);else{const t=this._handleHttpError(e);if(t)throw t}}))}_handleHttpError(e){if(e&&e instanceof c){if("nextgisweb.resource.exception.ResourceNotFound"===e.exception)throw new d(e);if("nextgisweb.core.exception.InsufficientPermissions"===e.exception)throw new p(e)}return e}}O.errors={NgwError:c,ResourceNotFoundError:d},module.exports=O;
1
+ "use strict";var e=require("events"),t=require("@nextgis/cancelable-promise"),r=require("@nextgis/utils"),s=require("@nextgis/cache");function o(e){return e&&"object"==typeof e&&"default"in e?e.default:e}var n=o(t),i=o(s);class c extends Error{constructor(e){super(),this.name="NgwError",Object.assign(this,e),Object.setPrototypeOf(this,c.prototype)}}let u;{const e=require("url"),t=require("http"),r=require("https"),s=s=>({"http:":t,"https:":r}[e.parse(s).protocol||"https:"]);u=(e,t,r={},o,n)=>new Promise(((t,o)=>{const i=s(e);if(!i)throw new Error(`Given URL '${e}' is not correct`);{const s={headers:r.headers||{},method:r.method},c="string"==typeof r.data?r.data:JSON.stringify(r.data);void 0!==c&&"POST"!==r.method&&Object.assign(s.headers,{"Content-Type":"application/json","Content-Length":Buffer.byteLength(c)});const u=i.request(e,s,(e=>{let r="";e.on("data",(e=>{r+=e})),e.on("end",(()=>{if(r){let e;try{e=JSON.parse(r),e&&e.status_code&&e.status_code&&o(e.message)}catch(e){o(e)}void 0!==e&&t(e)}o("no data")}))}));u.on("error",(e=>{o(e)})),c&&u.write(c),n((()=>{u.abort()})),u.end()}})).then((e=>(t&&t(e),e))).catch((e=>{if(!o)throw new Error(e);o(e)}))}const h=/\{ *([\w_-]+) *\}/g;function a(e,t){return e.replace(h,((e,r)=>{let s=t[r];if(void 0===s)throw new Error("No value provided for letiable "+e);return"function"==typeof s&&(s=s(t)),s}))}class d extends c{constructor(e){super(e),this.name="ResourceNotFoundError",this.exception="nextgisweb.resource.exception.ResourceNotFound",Object.setPrototypeOf(this,d.prototype)}}class p extends c{constructor(e){super(e),this.name="InsufficientPermissionsError",this.exception="nextgisweb.core.exception.InsufficientPermissions",Object.setPrototypeOf(this,p.prototype)}}const l=[];function f(e){l.push(e)}function g(e){return"[object Object]"===Object.prototype.toString.call(e)}function m(e,t=""){t=t?t+"__":"";const s={};return Object.entries(e).forEach((([e,o])=>{if(g(o)){const t=m(o,e);Object.assign(s,t)}else r.defined(o)&&(s[t+e]=o)})),s}class y{constructor(e){this.connector=e,this.cache=new i}getOne(e,t){return(new i).add("resource",(()=>"string"==typeof e?this._fetchResourceBy({keyname:e},t):"number"==typeof e?this._fetchResourceById(e,t):g(e)?this._fetchResourceBy(e,t):n.resolve(void 0)),{resource:e})}getOneOrFail(e,t){return this.getOne(e,t).then((e=>{if(e)return e;throw new d}))}getId(e,t){return"number"==typeof e?n.resolve(e):"string"==typeof e||g(e)?this.getOne(e,t).then((e=>{if(e)return e.resource.id})):n.resolve(void 0)}getIdOrFail(e,t){return this.getId(e,t).then((e=>{if(void 0===e)throw new Error;return e}))}getMany(e,t){return this._resourceCacheFilter(e).then((r=>{if(!r.length){const r={};return e.keyname?r.keyname=e.keyname:Object.assign(r,m(e)),this.connector.get("resource.search",t,{serialization:"full",...r}).then((e=>(e&&e.forEach((e=>{this.cache.add("resource.item",n.resolve(e),{id:e.resource.id})})),e)))}return r}))}getParent(e,t){return this.getOne(e,t).then((e=>e?this.getOne(e.resource.parent.id,t):n.resolve(void 0)))}getChildrenOf(e,t){return this.getId(e).then((e=>this.connector.get("resource.collection",{cache:!0,...t},{parent:e}).then((e=>{for(const t of e)this.cache.add("resource.item",n.resolve(t),{id:t.resource.id});return e}))))}update(e,t){return this.getId(e).then((e=>{if(void 0!==e)return this.connector.put("resource.item",{data:t},{id:e})}))}delete(e){return this.getId(e).then((e=>{if(void 0!==e)return this.connector.delete("resource.item",null,{id:e}).then((()=>{this.cache.delete("resource.item",{id:e})}))}))}_fetchResourceById(e,t){return this.cache.add("resource.item",(()=>this.connector.get("resource.item",t,{id:e})),{id:e}).catch((e=>{if(!(e instanceof d))throw e}))}_fetchResourceBy(e,t){return this.getMany(e,t).then((e=>e[0]))}_resourceCacheFilter(e){return n.all(this.cache.matchAll("resource.item")).then((t=>(t.filter((t=>{if(t)return e.keyname&&t.resource.keyname?e.keyname===t.resource.keyname:r.defined(e.id)&&r.defined(t.resource.id)?e.id===t.resource.id:r.objectDeepEqual(e,t.resource)})),[])))}}let w=0;class O{constructor(t){this.options=t,this.id=w++,this.emitter=new e.EventEmitter,this.routeStr="/api/component/pyramid/route";const s=function(e){return l.find((t=>{if(t.options.baseUrl===e.baseUrl){if(!e.auth)return!0;if(t.options.auth)return r.objectDeepEqual(t.options.auth,e.auth)}}))}(t);if(s)return s;this.options.route&&(this.routeStr=this.options.route),this.resources=new y(this),f(this)}static create(e){return new this(e)}setNgw(e){this.logout(),this.options.baseUrl=e,f(this)}connect(){const e=new i,t=this.options.auth;return e.add("route",(()=>new n(((e,r)=>{const s=()=>this.makeQuery(this.routeStr,{},{}).then((t=>{e(t)})).catch((e=>{r(e)}));if(t){const{login:e,password:o}=t;if(e&&o)return this.getUserInfo({login:e,password:o}).then((()=>{s()})).catch((e=>r(e)))}return s()}))),{id:this.id,auth:t,baseUrl:this.options.baseUrl})}login(e){return this.logout(),f(this),this.getUserInfo(e)}logout(){!function(e){const t=l.indexOf(e);-1!==t&&l.splice(t,1)}(this),this.options.auth=void 0,this.user=void 0,this.emitter.emit("logout"),this.resources.cache.clean()}getUserInfo(e){if(this.user&&this.user.id)return n.resolve(this.user);e&&(this.options.auth=e);const t={headers:this.getAuthorizationHeaders(e)};return this.makeQuery("/api/component/auth/current_user",{},t).then((e=>(this.user=e,this.emitter.emit("login",e),e))).catch((e=>{throw this.emitter.emit("login:error",e),e}))}getAuthorizationHeaders(e){const t=this.makeClientId(e);if(t)return{Authorization:"Basic "+t}}makeClientId(e){if(e=e||this.options.auth){const{login:t,password:r}=e,s=unescape(encodeURIComponent(`${t}:${r}`));return Buffer.from(s).toString("base64")}}apiRequest(e,t={},s={}){const{method:o,headers:c,withCredentials:u,responseType:h}=s,d=r.objectRemoveEmpty(t),p=()=>function(e){const t=e.params;return new n(((r,s)=>{e.connector.connect().then((o=>{let n=o&&o[e.name];if(n){n=[...n];let o=n.shift();if(n.length){const e={};for(let r=0;r<n.length;r++){const s=n[r];if(e[r]="{"+s+"}",void 0===t[s])throw new Error("`"+s+"` url api argument is not specified")}o&&(o=a(o,e))}if(t){const e=[],r=t.paramList;Array.isArray(r)&&(delete t.paramList,r.forEach((t=>{e.push(`${t[0]}=${t[1]}`)})));for(const r in t)-1===n.indexOf(r)&&e.push(`${r}=${t[r]}`);e.length&&(o=o+"?"+e.join("&"))}o?r(e.connector.makeQuery(o,t,e.requestOptions)):s(new Error("request url is not set"))}else r(void 0)})).catch((e=>{s(e)}))}))}({name:e,params:d,requestOptions:s,connector:this});if(s.cache&&"GET"===o){return(new i).add(e,p,{params:d,...r.objectRemoveEmpty({headers:c,withCredentials:u,responseType:h,baseUrl:this.options.baseUrl,auth:this.options.auth})})}return p()}post(e,t,r){return(t=t||{}).method="POST",this.apiRequest(e,r,t)}get(e,t,r){return(t=t||{}).method="GET",this.apiRequest(e,r,t)}patch(e,t,r){return(t=t||{}).method="PATCH",this.apiRequest(e,r,t)}put(e,t,r){return(t=t||{}).method="PUT",this.apiRequest(e,r,t)}delete(e,t,r){return(t=t||{}).method="DELETE",this.apiRequest(e,r,t)}makeQuery(e,t,s={}){if(e=(this.options.baseUrl?this.options.baseUrl:"")+e)return t&&(e=a(e,t)),e=r.fixUrlStr(e),this._loadData(e,s);throw new Error("Empty `url` not allowed")}getResource(e,t){return this.resources.getOne(e,t)}getResourceOrFail(e,t){return this.resources.getOneOrFail(e,t)}getResourceBy(e){return this.resources.getOne(e)}getResourceByKeyname(e){return this.resources.getOne(e)}getResourceById(e){return this.resources.getOne(e)}getResourceId(e,t){return this.resources.getId(e,t)}getResourceIdOrFail(e,t){return this.resources.getIdOrFail(e,t)}getResourcesBy(e,t){return this.resources.getMany(e,t)}getResourceParent(e,t){return this.resources.getParent(e,t)}getResourceChildren(e,t){return this.resources.getChildrenOf(e,t)}updateResource(e,t){return this.resources.update(e,t)}deleteResource(e){return this.resources.delete(e)}_loadData(e,t){return t.responseType=t.responseType||"json",new n(((r,s,o)=>{this.user&&((t=t||{}).headers={...this.getAuthorizationHeaders(),...t.headers}),u(e,r,t,s,o)})).catch((e=>{if(e instanceof n.CancelError);else{const t=this._handleHttpError(e);if(t)throw t}}))}_handleHttpError(e){if(e&&e instanceof c){if("nextgisweb.resource.exception.ResourceNotFound"===e.exception)throw new d(e);if("nextgisweb.core.exception.InsufficientPermissions"===e.exception)throw new p(e)}return e}}O.errors={NgwError:c,ResourceNotFoundError:d},module.exports=O;
2
2
  //# sourceMappingURL=ngw-connector.cjs.prod.js.map