esri-gl 0.9.0-alpha.10
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/LICENSE +227 -0
- package/README.md +455 -0
- package/dist/esri-gl.esm.js +2694 -0
- package/dist/esri-gl.esm.js.map +1 -0
- package/dist/esri-gl.js +2719 -0
- package/dist/esri-gl.js.map +1 -0
- package/dist/esri-gl.min.js +2 -0
- package/dist/esri-gl.min.js.map +1 -0
- package/dist/types/Services/DynamicMapService.d.ts +35 -0
- package/dist/types/Services/FeatureService.d.ts +48 -0
- package/dist/types/Services/ImageService.d.ts +32 -0
- package/dist/types/Services/MapService.d.ts +30 -0
- package/dist/types/Services/MapServiceTypes.d.ts +87 -0
- package/dist/types/Services/Service.d.ts +118 -0
- package/dist/types/Services/SimpleMapService.d.ts +30 -0
- package/dist/types/Services/TiledMapService.d.ts +28 -0
- package/dist/types/Services/VectorBasemapStyle.d.ts +9 -0
- package/dist/types/Services/VectorTileService.d.ts +41 -0
- package/dist/types/Tasks/Find.d.ts +85 -0
- package/dist/types/Tasks/IdentifyFeatures.d.ts +91 -0
- package/dist/types/Tasks/IdentifyImage.d.ts +107 -0
- package/dist/types/Tasks/Query.d.ts +180 -0
- package/dist/types/Tasks/Task.d.ts +50 -0
- package/dist/types/examples/EsriLeafletStyleAPI.d.ts +8 -0
- package/dist/types/main.d.ts +14 -0
- package/dist/types/types.d.ts +88 -0
- package/dist/types/utils.d.ts +4 -0
- package/package.json +116 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"esri-gl.min.js","sources":["../src/utils.ts","../src/Services/Service.ts","../src/Tasks/Task.ts","../src/Tasks/Query.ts","../src/Tasks/Find.ts","../src/Tasks/IdentifyImage.ts","../src/Services/DynamicMapService.ts","../src/Services/FeatureService.ts","../src/Tasks/IdentifyFeatures.ts","../src/Services/ImageService.ts","../src/Services/TiledMapService.ts","../src/Services/VectorBasemapStyle.ts","../src/Services/VectorTileService.ts"],"sourcesContent":["import type { Map, ServiceMetadata } from '@/types';\n\nexport function cleanTrailingSlash(url: string): string {\n return url.replace(/\\/$/, '');\n}\n\nexport function getServiceDetails(\n url: string,\n fetchOptions: RequestInit = {}\n): Promise<ServiceMetadata> {\n return new Promise((resolve, reject) => {\n fetch(`${url}?f=json`, fetchOptions)\n .then(response => response.json())\n .then(data => resolve(data))\n .catch(error => reject(error));\n });\n}\n\nconst POWERED_BY_ESRI_ATTRIBUTION_STRING = 'Powered by <a href=\"https://www.esri.com\">Esri</a>';\n\n// This requires hooking into some undocumented properties\nexport function updateAttribution(newAttribution: string, sourceId: string, map: Map): void {\n // Accessing undocumented MapLibre/Mapbox internal properties\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const mapWithControls = map as any;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const attributionController = mapWithControls._controls?.find((c: any) => '_attribHTML' in c);\n if (!attributionController) return;\n\n const customAttribution = attributionController.options?.customAttribution;\n\n if (typeof customAttribution === 'string') {\n attributionController.options.customAttribution = `${customAttribution} | ${POWERED_BY_ESRI_ATTRIBUTION_STRING}`;\n } else if (customAttribution === undefined) {\n if (attributionController.options) {\n attributionController.options.customAttribution = POWERED_BY_ESRI_ATTRIBUTION_STRING;\n }\n } else if (Array.isArray(customAttribution)) {\n if (customAttribution.indexOf(POWERED_BY_ESRI_ATTRIBUTION_STRING) === -1) {\n customAttribution.push(POWERED_BY_ESRI_ATTRIBUTION_STRING);\n }\n }\n\n // Accessing undocumented map style properties\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const mapStyle = (map as any).style;\n if (mapStyle?.sourceCaches?.[sourceId]?._source) {\n mapStyle.sourceCaches[sourceId]._source.attribution = newAttribution;\n } else if (mapStyle?._otherSourceCaches?.[sourceId]?._source) {\n mapStyle._otherSourceCaches[sourceId]._source.attribution = newAttribution;\n } else {\n console.warn(`Source ${sourceId} not found when trying to update attribution`);\n return; // Don't try to update attributions if source doesn't exist\n }\n\n // Call undocumented method to update attribution display\n if (attributionController._updateAttributions) {\n attributionController._updateAttributions();\n }\n}\n","import { cleanTrailingSlash, updateAttribution } from '@/utils';\nimport type { Map, ServiceMetadata } from '@/types';\n\nexport interface ServiceOptions {\n url: string;\n proxy?: boolean;\n useCors?: boolean;\n timeout?: number;\n token?: string;\n requestParams?: Record<string, unknown>;\n getAttributionFromService?: boolean;\n}\n\nexport type ServiceCallback<T = unknown> = (error?: Error, response?: T) => void;\n\nexport interface ServiceEvents {\n requeststart: { url: string; params: Record<string, unknown>; method: string };\n requestsuccess: {\n url: string;\n params: Record<string, unknown>;\n response: unknown;\n method: string;\n };\n requesterror: {\n url: string;\n params: Record<string, unknown>;\n message: string;\n code?: number;\n method: string;\n };\n requestend: { url: string; params: Record<string, unknown>; method: string };\n authenticationrequired: { authenticate: (token: string) => void };\n}\n\n/**\n * Base Service class for ArcGIS REST API services\n * Similar to Esri Leaflet's Service class\n */\nexport class Service {\n protected options: ServiceOptions & {\n proxy: boolean;\n useCors: boolean;\n timeout: number;\n getAttributionFromService: boolean;\n };\n protected _requestQueue: Array<\n [string, string, Record<string, unknown>, (error?: Error, response?: unknown) => void, unknown]\n > = [];\n protected _authenticating: boolean = false;\n protected _serviceMetadata: ServiceMetadata | null = null;\n protected _map?: Map;\n\n private _eventListeners: Partial<\n Record<keyof ServiceEvents, ((event: ServiceEvents[keyof ServiceEvents]) => void)[]>\n > = {};\n\n constructor(options: ServiceOptions) {\n if (!options.url) {\n throw new Error('A url must be supplied as part of the service options.');\n }\n\n this.options = {\n proxy: false,\n useCors: true,\n timeout: 0,\n getAttributionFromService: true,\n ...options,\n url: cleanTrailingSlash(options.url),\n };\n }\n\n /**\n * Make a GET request\n */\n async get(path: string, params: Record<string, unknown> = {}): Promise<unknown> {\n return this._request('GET', path, params);\n }\n\n /**\n * Make a POST request\n */\n async post(path: string, params: Record<string, unknown> = {}): Promise<unknown> {\n return this._request('POST', path, params);\n }\n\n /**\n * Make a generic request\n */\n async request(path: string, params: Record<string, unknown> = {}): Promise<unknown> {\n return this._request('GET', path, params);\n }\n\n /**\n * Make a request with callback support (public for Tasks)\n */\n requestWithCallback<T = unknown>(\n method: string,\n path: string,\n params: Record<string, unknown>,\n callback?: ServiceCallback<T>\n ): Promise<T> | void {\n if (callback) {\n this._requestWithCallback(method, path, params, callback);\n return;\n }\n return this._request(method, path, params) as Promise<T>;\n }\n\n /**\n * Get service metadata\n */\n async metadata(): Promise<ServiceMetadata> {\n if (this._serviceMetadata) {\n return this._serviceMetadata;\n }\n\n try {\n const response = await this._request('GET', '', { f: 'json' });\n this._serviceMetadata = response as ServiceMetadata;\n return this._serviceMetadata;\n } catch (error) {\n const isTestEnvironment = typeof process !== 'undefined' && process.env?.NODE_ENV === 'test';\n if (!isTestEnvironment) {\n console.error('Error fetching service metadata:', error);\n }\n throw error;\n }\n }\n\n /**\n * Set authentication token\n */\n authenticate(token: string): Service {\n this._authenticating = false;\n this.options.token = token;\n this._runQueue();\n return this;\n }\n\n /**\n * Get request timeout\n */\n getTimeout(): number {\n return this.options.timeout;\n }\n\n /**\n * Set request timeout\n */\n setTimeout(timeout: number): Service {\n this.options.timeout = timeout;\n return this;\n }\n\n /**\n * Set attribution from service metadata\n */\n async setAttributionFromService(): Promise<void> {\n if (!this._map) {\n return;\n }\n\n if (this._serviceMetadata) {\n updateAttribution(this._serviceMetadata.copyrightText || '', 'service', this._map);\n return;\n }\n\n try {\n await this.metadata();\n if (this._serviceMetadata && typeof this._serviceMetadata === 'object') {\n const metadata = this._serviceMetadata as ServiceMetadata;\n updateAttribution(metadata?.copyrightText || '', 'service', this._map);\n }\n } catch (error) {\n console.warn('Could not fetch service attribution:', error);\n }\n }\n\n /**\n * Add event listener\n */\n on<K extends keyof ServiceEvents>(\n event: K,\n callback: (event: ServiceEvents[K]) => void\n ): Service {\n if (!this._eventListeners[event]) {\n this._eventListeners[event] = [];\n }\n this._eventListeners[event]!.push(\n callback as (event: ServiceEvents[keyof ServiceEvents]) => void\n );\n return this;\n }\n\n /**\n * Remove event listener\n */\n off<K extends keyof ServiceEvents>(\n event: K,\n callback: (event: ServiceEvents[K]) => void\n ): Service {\n const listeners = this._eventListeners[event];\n if (listeners) {\n const index = listeners.indexOf(\n callback as (event: ServiceEvents[keyof ServiceEvents]) => void\n );\n if (index > -1) {\n listeners.splice(index, 1);\n }\n }\n return this;\n }\n\n /**\n * Fire an event\n */\n fire<K extends keyof ServiceEvents>(event: K, data: ServiceEvents[K]): Service {\n const listeners = this._eventListeners[event];\n if (listeners) {\n listeners.forEach(callback => callback(data));\n }\n return this;\n }\n\n // Private methods\n\n private _requestWithCallback<T = unknown>(\n method: string,\n path: string,\n params: Record<string, unknown>,\n callback: ServiceCallback<T>\n ): void {\n this.fire('requeststart', {\n url: this.options.url + path,\n params,\n method,\n });\n\n const wrappedCallback = this._createServiceCallback(method, path, params, (error, response) => {\n callback(error, response as T);\n });\n\n let finalParams = { ...params };\n if (this.options.token) {\n finalParams.token = this.options.token;\n }\n if (this.options.requestParams) {\n finalParams = { ...finalParams, ...this.options.requestParams };\n }\n\n if (this._authenticating) {\n this._requestQueue.push([method, path, finalParams, wrappedCallback, this]);\n } else {\n this._makeRequest(method, path, finalParams, wrappedCallback);\n }\n }\n\n private async _request(\n method: string,\n path: string,\n params: Record<string, unknown>\n ): Promise<unknown> {\n this.fire('requeststart', {\n url: this.options.url + path,\n params,\n method,\n });\n\n return new Promise((resolve, reject) => {\n const wrappedCallback = this._createServiceCallback(\n method,\n path,\n params,\n (error, response) => {\n if (error) {\n reject(error);\n } else {\n resolve(response);\n }\n }\n );\n\n let finalParams = { ...params };\n if (this.options.token) {\n finalParams.token = this.options.token;\n }\n if (this.options.requestParams) {\n finalParams = { ...finalParams, ...this.options.requestParams };\n }\n\n if (this._authenticating) {\n this._requestQueue.push([method, path, finalParams, wrappedCallback, this]);\n } else {\n this._makeRequest(method, path, finalParams, wrappedCallback);\n }\n });\n }\n\n private async _makeRequest(\n method: string,\n path: string,\n params: Record<string, unknown>,\n callback: (error?: Error, response?: unknown) => void\n ): Promise<void> {\n const url = this.options.proxy\n ? `${this.options.proxy}?${this.options.url}${path}`\n : `${this.options.url}${path}`;\n\n try {\n let response: Response;\n\n if (method === 'POST') {\n const formData = new FormData();\n Object.keys(params).forEach(key => {\n const value = params[key];\n if (value !== undefined && value !== null) {\n if (typeof value === 'object') {\n formData.append(key, JSON.stringify(value));\n } else {\n formData.append(key, value.toString());\n }\n }\n });\n\n response = await fetch(url, {\n method: 'POST',\n body: formData,\n });\n } else {\n const searchParams = new URLSearchParams();\n Object.keys(params).forEach(key => {\n const value = params[key];\n if (value !== undefined && value !== null) {\n if (Array.isArray(value)) {\n searchParams.append(key, value.join(','));\n } else if (typeof value === 'object') {\n searchParams.append(key, JSON.stringify(value));\n } else {\n searchParams.append(key, value.toString());\n }\n }\n });\n\n const fullUrl = `${url}?${searchParams.toString()}`;\n response = await fetch(fullUrl);\n }\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const data = await response.json();\n callback(undefined, data);\n } catch (error) {\n callback(error as Error);\n }\n }\n\n private _createServiceCallback(\n method: string,\n path: string,\n params: Record<string, unknown>,\n callback: (error?: Error, response?: unknown) => void\n ): (error?: Error, response?: unknown) => void {\n return (error?: Error, response?: unknown) => {\n // Check if error has authentication-related status codes\n const errorWithCode = error as Error & { code?: number };\n if (error && (errorWithCode.code === 499 || errorWithCode.code === 498)) {\n this._authenticating = true;\n this._requestQueue.push([method, path, params, callback, this]);\n\n // Fire event for users to handle re-authentication\n this.fire('authenticationrequired', {\n authenticate: (token: string) => this.authenticate(token),\n });\n\n // Add authenticate method to error for callback handling\n const authError = error as Error & { authenticate?: (token: string) => void };\n authError.authenticate = (token: string) => this.authenticate(token);\n }\n\n if (error) {\n this.fire('requesterror', {\n url: this.options.url + path,\n params,\n message: error.message,\n code: errorWithCode.code,\n method,\n });\n } else {\n this.fire('requestsuccess', {\n url: this.options.url + path,\n params,\n response,\n method,\n });\n }\n\n this.fire('requestend', {\n url: this.options.url + path,\n params,\n method,\n });\n\n callback(error, response);\n };\n }\n\n private _runQueue(): void {\n for (let i = this._requestQueue.length - 1; i >= 0; i--) {\n const request = this._requestQueue[i];\n const [method, path, params, callback] = request;\n if (callback) {\n this._makeRequest(method, path, params, callback);\n }\n }\n this._requestQueue = [];\n }\n}\n\nexport function service(options: ServiceOptions): Service {\n return new Service(options);\n}\n\nexport default service;\n","import { cleanTrailingSlash } from '@/utils';\nimport { Service } from '@/Services/Service';\nimport type { ServiceCallback } from '@/Services/Service';\n\nexport interface TaskOptions {\n url?: string;\n proxy?: boolean;\n useCors?: boolean;\n requestParams?: Record<string, unknown>;\n token?: string;\n apikey?: string;\n}\n\n/**\n * Base Task class for ArcGIS REST API operations\n * Similar to Esri Leaflet's Task class\n */\nexport class Task {\n protected _service?: Service;\n protected options: TaskOptions;\n protected params: Record<string, unknown> = {};\n protected path: string = '';\n protected setters: Record<string, string> = {};\n\n constructor(endpoint: string | TaskOptions | Service) {\n // endpoint can be either a url (and options) for an ArcGIS Rest Service or an instance of Service\n if (endpoint && typeof endpoint === 'object' && 'request' in endpoint) {\n this._service = endpoint as Service;\n this.options = {}; // Service will handle its own options\n } else if (typeof endpoint === 'string') {\n this.options = { url: cleanTrailingSlash(endpoint) };\n } else {\n this.options = { ...(endpoint as TaskOptions) };\n if (this.options.url) {\n this.options.url = cleanTrailingSlash(this.options.url);\n }\n }\n\n // Initialize params if not already set by subclass\n if (!this.params) {\n this.params = {};\n }\n\n // Generate setter methods based on the setters object\n if (this.setters) {\n for (const setter in this.setters) {\n const param = this.setters[setter];\n (this as Record<string, unknown>)[setter] = this.generateSetter(param, this);\n }\n }\n }\n\n /**\n * Generate a method for each methodName:paramName in the setters for this task\n */\n generateSetter(param: string, context: Task): (value: unknown) => Task {\n return function (value: unknown): Task {\n context.params[param] = value;\n return context;\n };\n }\n\n /**\n * Set authentication token\n */\n token(token: string): Task {\n if (this._service) {\n this._service.authenticate(token);\n } else {\n this.params.token = token;\n }\n return this;\n }\n\n /**\n * Set API key (alias for token)\n */\n apikey(apikey: string): Task {\n return this.token(apikey);\n }\n\n /**\n * Set whether to return formatted or unformatted values (ArcGIS Server 10.5+)\n */\n format(formatted: boolean): Task {\n this.params.returnUnformattedValues = !formatted;\n return this;\n }\n\n /**\n * Execute the task request with callback (Esri Leaflet style)\n */\n run(callback: ServiceCallback): void {\n if (this.options.requestParams) {\n Object.assign(this.params, this.options.requestParams);\n }\n\n if (this._service) {\n this._service.requestWithCallback('POST', this.path, this.params, callback);\n return;\n }\n\n // Direct request fallback\n this._request('POST', this.path, this.params, callback);\n }\n\n /**\n * Execute the task request with Promise\n */\n async request<T = unknown>(): Promise<T> {\n if (this.options.requestParams) {\n Object.assign(this.params, this.options.requestParams);\n }\n\n if (this._service) {\n return this._service.requestWithCallback('POST', this.path, this.params) as Promise<T>;\n }\n\n return new Promise((resolve, reject) => {\n this._request('POST', this.path, this.params, (error?: Error, response?: unknown) => {\n if (error) {\n reject(error);\n } else {\n resolve(response as T);\n }\n });\n });\n }\n\n /**\n * Direct HTTP request (when not using a service)\n */\n private _request(\n method: string,\n path: string,\n params: Record<string, unknown>,\n callback: ServiceCallback\n ): void {\n if (!this.options.url) {\n callback(new Error('URL is required for task execution'));\n return;\n }\n\n // Ensure proper URL construction with path separator\n const baseUrl = this.options.url.endsWith('/')\n ? this.options.url.slice(0, -1)\n : this.options.url;\n const cleanPath = path.startsWith('/') ? path : `/${path}`;\n const fullServiceUrl = `${baseUrl}${cleanPath}`;\n\n const url = this.options.proxy ? `${this.options.proxy}?${fullServiceUrl}` : fullServiceUrl;\n\n // Convert params to URLSearchParams\n const searchParams = new URLSearchParams();\n Object.keys(params).forEach(key => {\n const value = params[key];\n if (value !== undefined && value !== null) {\n if (Array.isArray(value)) {\n searchParams.append(key, value.join(','));\n } else if (typeof value === 'object') {\n searchParams.append(key, JSON.stringify(value));\n } else {\n searchParams.append(key, value.toString());\n }\n }\n });\n\n const fullUrl = method === 'GET' ? `${url}?${searchParams.toString()}` : url;\n\n const fetchOptions: RequestInit = {\n method,\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n };\n\n if (method === 'POST') {\n fetchOptions.body = searchParams.toString();\n }\n\n fetch(fullUrl, fetchOptions)\n .then(response => {\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n return response.json();\n })\n .then(data => callback(undefined, data))\n .catch(error => callback(error));\n }\n}\n","import { Task } from './Task';\nimport { Service } from '@/Services/Service';\n\nexport interface QueryOptions {\n url: string;\n token?: string;\n where?: string;\n outFields?: string | string[];\n returnGeometry?: boolean;\n spatialRel?: string;\n geometry?: unknown;\n geometryType?: string;\n inSR?: string | number;\n outSR?: string | number;\n returnDistinctValues?: boolean;\n returnIdsOnly?: boolean;\n returnCountOnly?: boolean;\n returnExtentOnly?: boolean;\n orderByFields?: string;\n groupByFieldsForStatistics?: string;\n outStatistics?: unknown[];\n resultOffset?: number;\n resultRecordCount?: number;\n maxAllowableOffset?: number;\n geometryPrecision?: number;\n time?: number[];\n gdbVersion?: string;\n historicMoment?: number;\n returnTrueCurves?: boolean;\n returnZ?: boolean;\n returnM?: boolean;\n f?: string;\n}\n\nexport interface QueryGeometry {\n x?: number;\n y?: number;\n xmin?: number;\n ymin?: number;\n xmax?: number;\n ymax?: number;\n paths?: number[][][];\n rings?: number[][][];\n points?: number[][];\n spatialReference?: {\n wkid: number;\n latestWkid?: number;\n };\n}\n\nexport interface Bounds {\n _southWest: { lat: number; lng: number };\n _northEast: { lat: number; lng: number };\n}\n\n/**\n * Query task for ArcGIS Feature Services\n * Based on Esri Leaflet's Query functionality\n */\nexport class Query extends Task {\n protected setters = {\n offset: 'resultOffset',\n limit: 'resultRecordCount',\n fields: 'outFields',\n precision: 'geometryPrecision',\n featureIds: 'objectIds',\n returnGeometry: 'returnGeometry',\n returnM: 'returnM',\n transform: 'datumTransformation',\n token: 'token',\n };\n\n protected path = 'query';\n\n protected params: Record<string, unknown> = {\n returnGeometry: true,\n where: '1=1',\n outSR: 4326,\n outFields: '*',\n f: 'json',\n };\n\n constructor(options: string | QueryOptions | Service) {\n super(options);\n this.path = 'query';\n\n // If options is a QueryOptions object, merge relevant properties into params\n if (\n options &&\n typeof options === 'object' &&\n !('request' in options) &&\n typeof options !== 'string'\n ) {\n const queryOptions = options as QueryOptions;\n\n // Merge query-specific options into params\n if (queryOptions.where !== undefined) this.params.where = queryOptions.where;\n if (queryOptions.outFields !== undefined) this.params.outFields = queryOptions.outFields;\n if (queryOptions.returnGeometry !== undefined)\n this.params.returnGeometry = queryOptions.returnGeometry;\n if (queryOptions.spatialRel !== undefined) this.params.spatialRel = queryOptions.spatialRel;\n if (queryOptions.geometry !== undefined) this.params.geometry = queryOptions.geometry;\n if (queryOptions.geometryType !== undefined)\n this.params.geometryType = queryOptions.geometryType;\n if (queryOptions.inSR !== undefined) this.params.inSR = queryOptions.inSR;\n if (queryOptions.outSR !== undefined) this.params.outSR = queryOptions.outSR;\n if (queryOptions.returnDistinctValues !== undefined)\n this.params.returnDistinctValues = queryOptions.returnDistinctValues;\n if (queryOptions.returnIdsOnly !== undefined)\n this.params.returnIdsOnly = queryOptions.returnIdsOnly;\n if (queryOptions.returnCountOnly !== undefined)\n this.params.returnCountOnly = queryOptions.returnCountOnly;\n if (queryOptions.returnExtentOnly !== undefined)\n this.params.returnExtentOnly = queryOptions.returnExtentOnly;\n if (queryOptions.orderByFields !== undefined)\n this.params.orderByFields = queryOptions.orderByFields;\n if (queryOptions.groupByFieldsForStatistics !== undefined)\n this.params.groupByFieldsForStatistics = queryOptions.groupByFieldsForStatistics;\n if (queryOptions.outStatistics !== undefined)\n this.params.outStatistics = queryOptions.outStatistics;\n if (queryOptions.resultOffset !== undefined)\n this.params.resultOffset = queryOptions.resultOffset;\n if (queryOptions.resultRecordCount !== undefined)\n this.params.resultRecordCount = queryOptions.resultRecordCount;\n if (queryOptions.maxAllowableOffset !== undefined)\n this.params.maxAllowableOffset = queryOptions.maxAllowableOffset;\n if (queryOptions.geometryPrecision !== undefined)\n this.params.geometryPrecision = queryOptions.geometryPrecision;\n if (queryOptions.time !== undefined) this.params.time = queryOptions.time;\n if (queryOptions.gdbVersion !== undefined) this.params.gdbVersion = queryOptions.gdbVersion;\n if (queryOptions.historicMoment !== undefined)\n this.params.historicMoment = queryOptions.historicMoment;\n if (queryOptions.returnTrueCurves !== undefined)\n this.params.returnTrueCurves = queryOptions.returnTrueCurves;\n if (queryOptions.returnZ !== undefined) this.params.returnZ = queryOptions.returnZ;\n if (queryOptions.returnM !== undefined) this.params.returnM = queryOptions.returnM;\n if (queryOptions.token !== undefined) this.params.token = queryOptions.token;\n }\n }\n\n // Spatial relationship methods\n\n /**\n * Returns a feature if its shape is wholly contained within the search geometry\n */\n within(geometry: QueryGeometry | unknown): Query {\n this._setGeometryParams(geometry);\n this.params.spatialRel = 'esriSpatialRelContains';\n return this;\n }\n\n /**\n * Returns a feature if any spatial relationship is found\n */\n intersects(geometry: QueryGeometry | unknown): Query {\n this._setGeometryParams(geometry);\n this.params.spatialRel = 'esriSpatialRelIntersects';\n return this;\n }\n\n /**\n * Returns a feature if its shape wholly contains the search geometry\n */\n contains(geometry: QueryGeometry | unknown): Query {\n this._setGeometryParams(geometry);\n this.params.spatialRel = 'esriSpatialRelWithin';\n return this;\n }\n\n /**\n * Returns a feature if the intersection of the interiors is not empty and has lower dimension\n */\n crosses(geometry: QueryGeometry | unknown): Query {\n this._setGeometryParams(geometry);\n this.params.spatialRel = 'esriSpatialRelCrosses';\n return this;\n }\n\n /**\n * Returns a feature if the two shapes share a common boundary\n */\n touches(geometry: QueryGeometry | unknown): Query {\n this._setGeometryParams(geometry);\n this.params.spatialRel = 'esriSpatialRelTouches';\n return this;\n }\n\n /**\n * Returns a feature if the intersection results in same dimension but different from both shapes\n */\n overlaps(geometry: QueryGeometry | unknown): Query {\n this._setGeometryParams(geometry);\n this.params.spatialRel = 'esriSpatialRelOverlaps';\n return this;\n }\n\n /**\n * Returns a feature if the envelope of the two shapes intersects\n */\n bboxIntersects(geometry: QueryGeometry | unknown): Query {\n this._setGeometryParams(geometry);\n this.params.spatialRel = 'esriSpatialRelEnvelopeIntersects';\n return this;\n }\n\n /**\n * Nearby search - only valid for ArcGIS Server 10.3+ or ArcGIS Online\n */\n nearby(latlng: { lat: number; lng: number }, radius: number): Query {\n this.params.geometry = [latlng.lng, latlng.lat];\n this.params.geometryType = 'esriGeometryPoint';\n this.params.spatialRel = 'esriSpatialRelIntersects';\n this.params.units = 'esriSRUnit_Meter';\n this.params.distance = radius;\n this.params.inSR = 4326;\n return this;\n }\n\n // Query methods\n\n /**\n * Set WHERE clause for the query\n */\n where(whereClause: string): Query {\n this.params.where = whereClause;\n return this;\n }\n\n /**\n * Set time range for temporal queries\n */\n between(start: Date | number, end: Date | number): Query {\n const startTime = start instanceof Date ? start.valueOf() : start;\n const endTime = end instanceof Date ? end.valueOf() : end;\n this.params.time = [startTime, endTime];\n return this;\n }\n\n /**\n * Simplify geometries based on map resolution\n */\n simplify(\n map: { getBounds(): Bounds; getSize(): { x: number; y: number } },\n factor: number\n ): Query {\n const bounds = map.getBounds();\n const mapWidth = Math.abs(bounds._northEast.lng - bounds._southWest.lng);\n this.params.maxAllowableOffset = (mapWidth / map.getSize().x) * factor;\n return this;\n }\n\n /**\n * Set order by fields\n */\n orderBy(fieldName: string, order: 'ASC' | 'DESC' = 'ASC'): Query {\n const currentOrder = (this.params.orderByFields as string) || '';\n this.params.orderByFields = currentOrder\n ? `${currentOrder},${fieldName} ${order}`\n : `${fieldName} ${order}`;\n return this;\n }\n\n /**\n * Set specific layer to query (for Map Services)\n */\n layer(layerId: number): Query {\n this.path = `${layerId}/query`;\n return this;\n }\n\n /**\n * Return only distinct values\n */\n distinct(): Query {\n this.params.returnGeometry = false;\n this.params.returnDistinctValues = true;\n return this;\n }\n\n /**\n * Set pixel size for image services\n */\n pixelSize(point: { x: number; y: number }): Query {\n this.params.pixelSize = [point.x, point.y];\n return this;\n }\n\n // Execution methods\n\n /**\n * Execute the query and return features\n */\n async run(): Promise<GeoJSON.FeatureCollection> {\n this._cleanParams();\n\n // Use GeoJSON format if supported\n this.params.f = 'geojson';\n\n try {\n const response = await this.request<GeoJSON.FeatureCollection>();\n return response;\n } catch {\n // Fallback to JSON format and convert\n this.params.f = 'json';\n const response = await this.request<{\n features?: Array<{\n attributes: Record<string, unknown>;\n geometry?: unknown;\n }>;\n }>();\n\n return this._convertToGeoJSON(response);\n }\n }\n\n /**\n * Execute the query and return only the count\n */\n async count(): Promise<number> {\n this._cleanParams();\n this.params.returnCountOnly = true;\n const response = await this.request<{ count: number }>();\n return response.count;\n }\n\n /**\n * Execute the query and return only feature IDs\n */\n async ids(): Promise<number[]> {\n this._cleanParams();\n this.params.returnIdsOnly = true;\n const response = await this.request<{ objectIds: number[] }>();\n return response.objectIds;\n }\n\n /**\n * Execute the query and return extent bounds (ArcGIS Server 10.3+)\n */\n async bounds(): Promise<{\n _southWest: { lat: number; lng: number };\n _northEast: { lat: number; lng: number };\n }> {\n this._cleanParams();\n this.params.returnExtentOnly = true;\n const response = await this.request<{\n extent: {\n xmin: number;\n ymin: number;\n xmax: number;\n ymax: number;\n };\n }>();\n\n if (!response.extent) {\n throw new Error('Invalid bounds returned');\n }\n\n return {\n _southWest: { lat: response.extent.ymin, lng: response.extent.xmin },\n _northEast: { lat: response.extent.ymax, lng: response.extent.xmax },\n };\n }\n\n // Private methods\n\n private _setGeometryParams(geometry: unknown): void {\n this.params.inSR = 4326;\n const converted = this._setGeometry(geometry);\n this.params.geometry = converted.geometry;\n this.params.geometryType = converted.geometryType;\n }\n\n private _setGeometry(geometry: unknown): { geometry: unknown; geometryType: string } {\n if (!geometry) {\n return { geometry: null, geometryType: 'esriGeometryPoint' };\n }\n\n // Handle different geometry types\n if (typeof geometry === 'object' && geometry !== null) {\n const geom = geometry as Record<string, unknown>;\n\n if ('lat' in geom && 'lng' in geom) {\n // Leaflet LatLng-like object\n return {\n geometry: { x: geom.lng, y: geom.lat, spatialReference: { wkid: 4326 } },\n geometryType: 'esriGeometryPoint',\n };\n }\n\n if ('_southWest' in geom && '_northEast' in geom) {\n // Leaflet Bounds-like object\n const bounds = geom as unknown as Bounds;\n return {\n geometry: {\n xmin: bounds._southWest.lng,\n ymin: bounds._southWest.lat,\n xmax: bounds._northEast.lng,\n ymax: bounds._northEast.lat,\n spatialReference: { wkid: 4326 },\n },\n geometryType: 'esriGeometryEnvelope',\n };\n }\n\n if ('xmin' in geom && 'ymin' in geom && 'xmax' in geom && 'ymax' in geom) {\n // Esri envelope geometry\n return {\n geometry,\n geometryType: 'esriGeometryEnvelope',\n };\n }\n }\n\n // Default: assume it's already in Esri geometry format\n return {\n geometry,\n geometryType: 'esriGeometryPoint',\n };\n }\n\n private _cleanParams(): void {\n delete this.params.returnIdsOnly;\n delete this.params.returnExtentOnly;\n delete this.params.returnCountOnly;\n delete this.params.returnDistinctValues;\n }\n\n private _convertToGeoJSON(response: {\n features?: Array<{\n attributes: Record<string, unknown>;\n geometry?: unknown;\n }>;\n }): GeoJSON.FeatureCollection {\n // Handle cases where features might be undefined or empty\n const features: GeoJSON.Feature[] = (response.features || []).map(feature => ({\n type: 'Feature',\n properties: feature.attributes,\n geometry: (feature.geometry as GeoJSON.Geometry) || null,\n }));\n\n return {\n type: 'FeatureCollection',\n features,\n };\n }\n}\n\nexport function query(options: string | QueryOptions): Query {\n return new Query(options);\n}\n\nexport default query;\n","import { Task } from './Task';\nimport { Service } from '@/Services/Service';\n\nexport interface FindOptions {\n url: string;\n token?: string;\n searchText?: string;\n contains?: boolean;\n searchFields?: string | string[];\n sr?: string | number;\n layers?: number | number[] | string;\n returnGeometry?: boolean;\n maxAllowableOffset?: number;\n geometryPrecision?: number;\n dynamicLayers?: unknown[];\n returnZ?: boolean;\n returnM?: boolean;\n gdbVersion?: string;\n layerDefs?: string;\n}\n\n/**\n * Find task for searching text in ArcGIS Map Services\n * Based on Esri Leaflet's Find functionality\n */\nexport class Find extends Task {\n protected setters = {\n contains: 'contains',\n text: 'searchText',\n fields: 'searchFields',\n spatialReference: 'sr',\n sr: 'sr',\n layers: 'layers',\n returnGeometry: 'returnGeometry',\n maxAllowableOffset: 'maxAllowableOffset',\n precision: 'geometryPrecision',\n dynamicLayers: 'dynamicLayers',\n returnZ: 'returnZ',\n returnM: 'returnM',\n gdbVersion: 'gdbVersion',\n token: 'token',\n };\n\n protected path = 'find';\n\n protected params: Record<string, unknown> = {\n searchText: '', // Required parameter\n layers: 'all', // Can be 'all' or comma-separated layer IDs\n contains: true,\n returnGeometry: true,\n f: 'json',\n };\n\n constructor(options: string | FindOptions | Service) {\n super(options);\n this.path = 'find';\n\n // If options is a FindOptions object, merge relevant properties into params\n if (\n options &&\n typeof options === 'object' &&\n !('request' in options) &&\n typeof options !== 'string'\n ) {\n const findOptions = options as FindOptions;\n\n // Merge find-specific options into params\n if (findOptions.searchText !== undefined) this.params.searchText = findOptions.searchText;\n if (findOptions.contains !== undefined) this.params.contains = findOptions.contains;\n if (findOptions.searchFields !== undefined) {\n this.params.searchFields = Array.isArray(findOptions.searchFields)\n ? findOptions.searchFields.join(',')\n : findOptions.searchFields;\n }\n if (findOptions.sr !== undefined) this.params.sr = findOptions.sr;\n if (findOptions.layers !== undefined) {\n // Convert array to comma-separated string or use as-is if already string\n if (Array.isArray(findOptions.layers)) {\n this.params.layers = findOptions.layers.join(',');\n } else if (typeof findOptions.layers === 'string') {\n this.params.layers = findOptions.layers;\n } else {\n this.params.layers = findOptions.layers.toString();\n }\n }\n if (findOptions.returnGeometry !== undefined)\n this.params.returnGeometry = findOptions.returnGeometry;\n if (findOptions.maxAllowableOffset !== undefined)\n this.params.maxAllowableOffset = findOptions.maxAllowableOffset;\n if (findOptions.geometryPrecision !== undefined)\n this.params.geometryPrecision = findOptions.geometryPrecision;\n if (findOptions.dynamicLayers !== undefined)\n this.params.dynamicLayers = findOptions.dynamicLayers;\n if (findOptions.returnZ !== undefined) this.params.returnZ = findOptions.returnZ;\n if (findOptions.returnM !== undefined) this.params.returnM = findOptions.returnM;\n if (findOptions.gdbVersion !== undefined) this.params.gdbVersion = findOptions.gdbVersion;\n if (findOptions.layerDefs !== undefined) this.params.layerDefs = findOptions.layerDefs;\n if (findOptions.token !== undefined) this.params.token = findOptions.token;\n }\n }\n\n /**\n * Set the text to search for\n */\n text(searchText: string): Find {\n this.params.searchText = searchText;\n return this;\n }\n\n /**\n * Set the fields to search in\n */\n fields(fields: string | string[]): Find {\n this.params.searchFields = Array.isArray(fields) ? fields.join(',') : fields;\n return this;\n }\n\n /**\n * Set whether the search should contain the text (partial match) or exact match\n */\n contains(contains: boolean): Find {\n this.params.contains = contains;\n return this;\n }\n\n /**\n * Set which layers to search in\n */\n layers(layers: number | number[] | string): Find {\n if (Array.isArray(layers)) {\n this.params.layers = layers.join(',');\n } else {\n this.params.layers = layers;\n }\n return this;\n }\n\n /**\n * Set layer definitions for filtering specific layers\n */\n layerDefs(layerId: number | string, whereClause: string): Find {\n const currentLayerDefs = (this.params.layerDefs as string) || '';\n this.params.layerDefs = currentLayerDefs\n ? `${currentLayerDefs};${layerId}:${whereClause}`\n : `${layerId}:${whereClause}`;\n return this;\n }\n\n /**\n * Simplify geometries based on map resolution\n */\n simplify(\n map: {\n getBounds(): {\n getWest(): number;\n getEast(): number;\n };\n getSize(): { x: number; y: number };\n },\n factor: number\n ): Find {\n const bounds = map.getBounds();\n const mapWidth = Math.abs(bounds.getWest() - bounds.getEast());\n this.params.maxAllowableOffset = (mapWidth / map.getSize().x) * factor;\n return this;\n }\n\n /**\n * Execute the find operation\n */\n async run(): Promise<GeoJSON.FeatureCollection<GeoJSON.Geometry | null>> {\n // Always use JSON format for Find API (GeoJSON might not be supported)\n this.params.f = 'json';\n\n try {\n const response = await this.request<{\n results?: Array<{\n layerId: number;\n layerName: string;\n foundFieldName: string;\n value: string;\n attributes: Record<string, unknown>;\n geometry?: unknown;\n }>;\n }>();\n\n return this._convertToGeoJSON(response);\n } catch (error) {\n const isTestEnvironment = typeof process !== 'undefined' && process.env?.NODE_ENV === 'test';\n if (!isTestEnvironment) {\n console.error('Find task error:', error);\n }\n throw error;\n }\n }\n\n private _convertToGeoJSON(\n response: {\n results?: Array<{\n layerId: number;\n layerName: string;\n foundFieldName: string;\n value: string;\n attributes: Record<string, unknown>;\n geometry?: unknown;\n }>;\n } | null\n ): GeoJSON.FeatureCollection<GeoJSON.Geometry | null> {\n // Handle cases where response is null or results might be undefined, null, or empty\n const results = response?.results || [];\n const features: GeoJSON.Feature<GeoJSON.Geometry | null>[] = results.map(result => ({\n type: 'Feature' as const,\n properties: {\n ...result.attributes,\n layerId: result.layerId,\n layerName: result.layerName,\n foundFieldName: result.foundFieldName,\n value: result.value,\n },\n geometry: this._convertEsriGeometry(result.geometry),\n }));\n\n return {\n type: 'FeatureCollection',\n features,\n };\n }\n\n private _convertEsriGeometry(esriGeom: unknown): GeoJSON.Geometry | null {\n if (!esriGeom || typeof esriGeom !== 'object') return null;\n\n const geom = esriGeom as Record<string, unknown>;\n\n // Point geometry\n if ('x' in geom && 'y' in geom) {\n return {\n type: 'Point',\n coordinates: [geom.x as number, geom.y as number],\n };\n }\n\n // Polygon geometry\n if ('rings' in geom && Array.isArray(geom.rings)) {\n return {\n type: 'Polygon',\n coordinates: geom.rings as number[][][],\n };\n }\n\n // Polyline geometry\n if ('paths' in geom && Array.isArray(geom.paths)) {\n const paths = geom.paths as number[][][];\n\n if (paths.length === 1) {\n // Single path = LineString\n return {\n type: 'LineString',\n coordinates: paths[0],\n };\n } else {\n // Multiple paths = MultiLineString\n return {\n type: 'MultiLineString',\n coordinates: paths,\n };\n }\n }\n\n // Default: return null for unknown geometry types\n return null;\n }\n}\n\nexport function find(options: string | FindOptions): Find {\n return new Find(options);\n}\n\nexport default find;\n","import { Task } from '@/Tasks/Task';\n\nexport interface IdentifyImageOptions {\n url: string;\n token?: string;\n geometry?: unknown;\n geometryType?: string;\n sr?: string | number;\n mosaic?: boolean;\n renderingRules?: unknown[];\n pixelSize?: [number, number];\n returnGeometry?: boolean;\n returnCatalogItems?: boolean;\n f?: string;\n}\n\nexport interface PixelValue {\n attributes: Record<string, unknown>;\n geometry?: unknown;\n}\n\nexport interface IdentifyImageResult {\n objectId?: number;\n name?: string;\n value?: string;\n location?: {\n x: number;\n y: number;\n spatialReference?: {\n wkid: number;\n latestWkid?: number;\n };\n };\n attributes?: Record<string, unknown>;\n catalogItems?: unknown[];\n catalogItemVisibilities?: number[];\n}\n\n/**\n * IdentifyImage task for identifying pixel values in ArcGIS Image Services\n * Based on Esri Leaflet's IdentifyImage functionality\n */\nexport class IdentifyImage extends Task {\n protected setters = {\n returnCatalogItems: 'returnCatalogItems',\n returnGeometry: 'returnGeometry',\n pixelSize: 'pixelSize',\n token: 'token',\n };\n\n protected path = 'identify';\n\n protected params: Record<string, unknown> = {\n sr: 4326,\n returnGeometry: false,\n returnCatalogItems: false,\n f: 'json',\n };\n\n constructor(options: string | IdentifyImageOptions) {\n super(options);\n\n // If options is a IdentifyImageOptions object, merge relevant properties into params\n if (options && typeof options === 'object' && typeof options !== 'string') {\n const imageOptions = options as IdentifyImageOptions;\n\n // Merge identify-specific options into params\n if (imageOptions.geometry !== undefined) this.params.geometry = imageOptions.geometry;\n if (imageOptions.geometryType !== undefined)\n this.params.geometryType = imageOptions.geometryType;\n if (imageOptions.sr !== undefined) this.params.sr = imageOptions.sr;\n if (imageOptions.mosaic !== undefined) this.params.mosaic = imageOptions.mosaic;\n if (imageOptions.renderingRules !== undefined)\n this.params.renderingRules = imageOptions.renderingRules;\n if (imageOptions.pixelSize !== undefined) this.params.pixelSize = imageOptions.pixelSize;\n if (imageOptions.returnGeometry !== undefined)\n this.params.returnGeometry = imageOptions.returnGeometry;\n if (imageOptions.returnCatalogItems !== undefined)\n this.params.returnCatalogItems = imageOptions.returnCatalogItems;\n if (imageOptions.token !== undefined) this.params.token = imageOptions.token;\n if (imageOptions.f !== undefined) this.params.f = imageOptions.f;\n }\n }\n\n /**\n * Identify pixel values at a specific point\n */\n at(point: { lng: number; lat: number } | [number, number]): IdentifyImage {\n let geometry: { x: number; y: number; spatialReference: { wkid: number } };\n\n if (Array.isArray(point)) {\n geometry = {\n x: point[0],\n y: point[1],\n spatialReference: { wkid: 4326 },\n };\n } else {\n geometry = {\n x: point.lng,\n y: point.lat,\n spatialReference: { wkid: 4326 },\n };\n }\n\n this.params.geometry = JSON.stringify(geometry);\n this.params.geometryType = 'esriGeometryPoint';\n this.params.sr = 4326;\n return this;\n }\n\n /**\n * Set custom geometry for identification\n */\n geometry(geometry: unknown, geometryType?: string): IdentifyImage {\n this.params.geometry = JSON.stringify(geometry);\n this.params.geometryType = geometryType || 'esriGeometryPoint';\n return this;\n }\n\n /**\n * Set pixel size for the identify operation\n */\n pixelSize(size: [number, number] | { x: number; y: number }): IdentifyImage {\n if (Array.isArray(size)) {\n this.params.pixelSize = `${size[0]},${size[1]}`;\n } else {\n this.params.pixelSize = `${size.x},${size.y}`;\n }\n return this;\n }\n\n /**\n * Set whether to return geometry with results\n */\n returnGeometry(returnGeom: boolean): IdentifyImage {\n this.params.returnGeometry = returnGeom;\n return this;\n }\n\n /**\n * Set whether to return catalog items\n */\n returnCatalogItems(returnItems: boolean): IdentifyImage {\n this.params.returnCatalogItems = returnItems;\n return this;\n }\n\n /**\n * Set mosaic rule for the identify operation\n */\n mosaicRule(rule: unknown): IdentifyImage {\n this.params.mosaicRule = JSON.stringify(rule);\n return this;\n }\n\n /**\n * Set rendering rules for the identify operation\n */\n renderingRule(rule: unknown): IdentifyImage {\n this.params.renderingRule = JSON.stringify(rule);\n return this;\n }\n\n /**\n * Execute the identify operation\n */\n async run(): Promise<{\n results: IdentifyImageResult[];\n location?: {\n x: number;\n y: number;\n spatialReference?: {\n wkid: number;\n latestWkid?: number;\n };\n };\n }> {\n const response = await this.request<{\n results?: IdentifyImageResult[];\n location?: {\n x: number;\n y: number;\n spatialReference?: {\n wkid: number;\n latestWkid?: number;\n };\n };\n // Handle different response formats\n value?: string;\n values?: string[];\n properties?: Record<string, unknown>;\n catalogItems?: unknown[];\n }>();\n\n // Normalize different response formats\n let results: IdentifyImageResult[] = [];\n\n if (response.results) {\n results = response.results;\n } else if (response.value !== undefined || response.values) {\n // Handle simple value responses\n results = [\n {\n value: response.value || (response.values && response.values[0]) || '',\n attributes: response.properties || {},\n },\n ];\n }\n\n return {\n results,\n location: response.location,\n };\n }\n\n /**\n * Execute and return pixel values as a simple array\n */\n async getPixelValues(): Promise<Array<string | number | null>> {\n const response = await this.run();\n return response.results.map(result => {\n if (result.value !== undefined) {\n const numValue = parseFloat(result.value);\n return isNaN(numValue) ? result.value : numValue;\n }\n return null;\n });\n }\n\n /**\n * Execute and return detailed pixel information\n */\n async getPixelData(): Promise<IdentifyImageResult[]> {\n const response = await this.run();\n return response.results;\n }\n}\n\nexport function identifyImage(options: string | IdentifyImageOptions): IdentifyImage {\n return new IdentifyImage(options);\n}\n\nexport default identifyImage;\n","import { cleanTrailingSlash, getServiceDetails, updateAttribution } from '@/utils';\nimport type { Map, EsriServiceOptions, RasterSourceOptions, ServiceMetadata } from '@/types';\n\ninterface DynamicMapServiceOptions extends EsriServiceOptions {\n from?: Date | number;\n to?: Date | number;\n fetchOptions?: RequestInit;\n}\n\nexport class DynamicMapService {\n private _sourceId: string;\n private _map: Map;\n private _defaultEsriOptions: Omit<Required<EsriServiceOptions>, 'url' | 'time'>;\n private _serviceMetadata: ServiceMetadata | null = null;\n\n public rasterSrcOptions?: RasterSourceOptions;\n public esriServiceOptions: DynamicMapServiceOptions;\n\n constructor(\n sourceId: string,\n map: Map,\n esriServiceOptions: DynamicMapServiceOptions,\n rasterSrcOptions?: RasterSourceOptions\n ) {\n if (!esriServiceOptions.url) {\n throw new Error('A url must be supplied as part of the esriServiceOptions object.');\n }\n\n esriServiceOptions.url = cleanTrailingSlash(esriServiceOptions.url);\n\n this._sourceId = sourceId;\n this._map = map;\n\n this._defaultEsriOptions = {\n layers: false,\n layerDefs: false,\n format: 'png24',\n dpi: 96,\n transparent: true,\n getAttributionFromService: true,\n };\n\n this.rasterSrcOptions = rasterSrcOptions;\n this.esriServiceOptions = esriServiceOptions;\n this._createSource();\n\n if (this.options.getAttributionFromService) this.setAttributionFromService();\n }\n\n get options(): Required<DynamicMapServiceOptions> {\n return {\n ...this._defaultEsriOptions,\n ...this.esriServiceOptions,\n } as Required<DynamicMapServiceOptions>;\n }\n\n get _layersStr(): string | false {\n let lyrs = this.options.layers;\n if (!lyrs) return false;\n if (!Array.isArray(lyrs)) lyrs = [lyrs];\n return `show:${lyrs.join(',')}`;\n }\n\n get _layerDefs(): string | false {\n if (this.options.layerDefs !== false) return JSON.stringify(this.options.layerDefs);\n return false;\n }\n\n get _time(): string | false {\n if (!this.options.to) return false;\n let from = this.options.from;\n let to = this.options.to;\n if (from instanceof Date) from = from.valueOf();\n if (to instanceof Date) to = to.valueOf();\n\n return `${from},${to}`;\n }\n\n get _source(): any {\n const tileSize = this.rasterSrcOptions?.tileSize ?? 256;\n // These are the bare minimum parameters\n const params = new URLSearchParams({\n bboxSR: '3857',\n imageSR: '3857',\n format: this.options.format,\n layers: this._layersStr || '',\n transparent: this.options.transparent.toString(),\n size: `${tileSize},${tileSize}`,\n f: 'image',\n });\n\n // These are optional params\n if (this._time) params.append('time', this._time);\n if (this._layerDefs) params.append('layerDefs', this._layerDefs);\n\n return {\n type: 'raster',\n tiles: [`${this.options.url}/export?bbox={bbox-epsg-3857}&${params.toString()}`],\n tileSize,\n ...this.rasterSrcOptions,\n };\n }\n\n private _createSource(): void {\n this._map.addSource(this._sourceId, this._source);\n }\n\n // This requires hooking into some undocumented methods\n private _updateSource(): void {\n const src = this._map.getSource(this._sourceId) as any;\n src.tiles[0] = this._source.tiles[0];\n src._options = this._source;\n\n if (src.setTiles) {\n // New MapboxGL >= 2.13.0\n src.setTiles(this._source.tiles);\n } else if ((this._map as any).style.sourceCaches) {\n // Old MapboxGL and MaplibreGL\n (this._map as any).style.sourceCaches[this._sourceId].clearTiles();\n (this._map as any).style.sourceCaches[this._sourceId].update((this._map as any).transform);\n } else if ((this._map as any).style._otherSourceCaches) {\n (this._map as any).style.sourceCaches[this._sourceId].clearTiles();\n (this._map as any).style.sourceCaches[this._sourceId].update((this._map as any).transform);\n }\n }\n\n setLayerDefs(obj: Record<string, string>): void {\n this.esriServiceOptions.layerDefs = obj;\n this._updateSource();\n }\n\n setLayers(arr: number[] | number): void {\n this.esriServiceOptions.layers = arr;\n this._updateSource();\n }\n\n setDate(from: Date | number, to: Date | number): void {\n this.esriServiceOptions.from = from;\n this.esriServiceOptions.to = to;\n this._updateSource();\n }\n\n setAttributionFromService(): Promise<void> {\n if (this._serviceMetadata) {\n updateAttribution(this._serviceMetadata.copyrightText || '', this._sourceId, this._map);\n return Promise.resolve();\n } else {\n return this.getMetadata().then(() => {\n updateAttribution(this._serviceMetadata?.copyrightText || '', this._sourceId, this._map);\n });\n }\n }\n\n getMetadata(): Promise<ServiceMetadata> {\n if (this._serviceMetadata !== null) return Promise.resolve(this._serviceMetadata);\n return new Promise((resolve, reject) => {\n getServiceDetails(this.esriServiceOptions.url, this.esriServiceOptions.fetchOptions)\n .then(data => {\n this._serviceMetadata = data;\n resolve(this._serviceMetadata);\n })\n .catch(err => reject(err));\n });\n }\n\n get _layersStrIdentify(): string | false {\n const layersStr = this._layersStr;\n return layersStr ? layersStr.replace('show', 'visible') : false;\n }\n\n identify(lnglat: { lng: number; lat: number }, returnGeometry: boolean = false): Promise<any> {\n const canvas = (this._map as any).getCanvas();\n const bounds = (this._map as any).getBounds().toArray();\n\n const params = new URLSearchParams({\n sr: '4326',\n geometryType: 'esriGeometryPoint',\n geometry: JSON.stringify({\n x: lnglat.lng,\n y: lnglat.lat,\n spatialReference: {\n wkid: 4326,\n },\n }),\n tolerance: '3',\n returnGeometry: returnGeometry.toString(),\n imageDisplay: `${canvas.width},${canvas.height},96`,\n mapExtent: `${bounds[0][0]},${bounds[0][1]},${bounds[1][0]},${bounds[1][1]}`,\n layers: this._layersStrIdentify || '',\n f: 'json',\n });\n\n if (this._layerDefs) params.append('layerDefs', this._layerDefs);\n if (this._time) params.append('time', this._time);\n\n return new Promise((resolve, reject) => {\n fetch(\n `${this.esriServiceOptions.url}/identify?${params.toString()}`,\n this.esriServiceOptions.fetchOptions\n )\n .then(response => response.json())\n .then(data => resolve(data))\n .catch(error => reject(error));\n });\n }\n\n update(): void {\n this._updateSource();\n }\n\n remove(): void {\n this._map.removeSource(this._sourceId);\n }\n}\n","import { cleanTrailingSlash, getServiceDetails, updateAttribution } from '@/utils';\nimport type { Map, FeatureServiceOptions, VectorSourceOptions, ServiceMetadata } from '@/types';\n\ninterface FeatureServiceExtendedOptions extends FeatureServiceOptions {\n fetchOptions?: RequestInit;\n useVectorTiles?: boolean;\n useBoundingBox?: boolean; // Enable screen bounding box filtering\n}\n\ninterface StyleData {\n type: string;\n source?: string;\n 'source-layer'?: string;\n layout?: Record<string, unknown>;\n paint?: Record<string, unknown>;\n}\n\nexport class FeatureService {\n private _sourceId: string;\n private _map: Map;\n private _defaultEsriOptions: Partial<FeatureServiceOptions>;\n private _serviceMetadata: ServiceMetadata | null = null;\n private _defaultStyleData: StyleData | null = null;\n private _boundingBoxUpdateHandler: (() => void) | null = null;\n\n public vectorSrcOptions?: VectorSourceOptions;\n public esriServiceOptions: FeatureServiceExtendedOptions;\n\n constructor(\n sourceId: string,\n map: Map,\n esriServiceOptions: FeatureServiceExtendedOptions,\n vectorSrcOptions?: VectorSourceOptions\n ) {\n if (!esriServiceOptions.url) {\n throw new Error('A url must be supplied as part of the esriServiceOptions object.');\n }\n\n esriServiceOptions.url = cleanTrailingSlash(esriServiceOptions.url);\n\n this._sourceId = sourceId;\n this._map = map;\n\n this._defaultEsriOptions = {\n where: '1=1',\n outFields: '*',\n f: 'geojson',\n returnGeometry: true,\n // Only include geometry/spatial params when geometry is specified\n // No defaults for inSR/outSR; let server defaults apply\n // Do not send maxRecordCount: it's a server capability, not a query param\n token: '',\n };\n\n this.vectorSrcOptions = vectorSrcOptions;\n this.esriServiceOptions = esriServiceOptions;\n\n // Default to vector tiles unless explicitly disabled\n if (this.esriServiceOptions.useVectorTiles === undefined) {\n this.esriServiceOptions.useVectorTiles = true;\n }\n\n // Default to bounding box filtering for better performance\n if (this.esriServiceOptions.useBoundingBox === undefined) {\n this.esriServiceOptions.useBoundingBox = true;\n }\n\n this._createSource();\n }\n\n private async _createSource(): Promise<void> {\n try {\n // Get service metadata\n this._serviceMetadata = await getServiceDetails(\n this.esriServiceOptions.url,\n this.esriServiceOptions.fetchOptions\n );\n\n // Check if vector tiles should be used (default behavior)\n // Note: Most FeatureServers don't support vector tiles, so we'll detect and fallback\n const isTestEnvironment = typeof process !== 'undefined' && process.env?.NODE_ENV === 'test';\n if (!isTestEnvironment) {\n console.log(\n 'FeatureService: useVectorTiles setting:',\n this.esriServiceOptions.useVectorTiles\n );\n }\n const vectorTileSupport = await this._checkVectorTileSupport();\n if (!isTestEnvironment) {\n console.log('FeatureService: Vector tile support detected:', vectorTileSupport);\n }\n\n const useVectorTiles = this.esriServiceOptions.useVectorTiles !== false && vectorTileSupport;\n if (!isTestEnvironment) {\n console.log('FeatureService: Final decision - using vector tiles:', useVectorTiles);\n }\n\n if (useVectorTiles) {\n // Create vector tile source\n const tileUrl = this._buildTileUrl();\n if (!isTestEnvironment) {\n console.log('FeatureService: Using vector tiles for FeatureService:', tileUrl);\n }\n\n // Add vector source to map\n this._map.addSource(this._sourceId, {\n type: 'vector',\n tiles: [tileUrl],\n maxzoom: 24,\n ...this.vectorSrcOptions,\n });\n } else {\n // Fallback to GeoJSON (most common for FeatureServers)\n const queryUrl = this._buildQueryUrl();\n if (!isTestEnvironment) {\n console.log('FeatureService: Using GeoJSON for FeatureService:', queryUrl);\n }\n\n this._map.addSource(this._sourceId, {\n type: 'geojson',\n data: queryUrl,\n });\n }\n\n // Update attribution after source is added if available in service metadata\n if (this._serviceMetadata?.copyrightText) {\n updateAttribution(this._serviceMetadata.copyrightText, this._sourceId, this._map);\n }\n\n // Set up bounding box update listeners if using GeoJSON and bounding box filtering\n if (!useVectorTiles && this.esriServiceOptions.useBoundingBox) {\n this._setupBoundingBoxUpdates();\n }\n } catch (error) {\n const isTestEnvironment = typeof process !== 'undefined' && process.env?.NODE_ENV === 'test';\n if (!isTestEnvironment) {\n console.error('Error creating FeatureService source:', error);\n }\n // Don't rethrow - service should handle errors gracefully\n // The source just won't be created and the service will be in a degraded state\n }\n }\n\n private async _checkVectorTileSupport(): Promise<boolean> {\n try {\n // Try to check if a VectorTileServer endpoint exists\n const vectorTileUrl = this.esriServiceOptions.url.replace(\n '/FeatureServer/',\n '/VectorTileServer/'\n );\n\n // Only check if the URL actually changed (meaning it was a FeatureServer URL)\n if (vectorTileUrl === this.esriServiceOptions.url) {\n const isTestEnvironment =\n typeof process !== 'undefined' && process.env?.NODE_ENV === 'test';\n if (!isTestEnvironment) {\n console.log('FeatureService: Not a FeatureServer URL, falling back to GeoJSON');\n }\n return false;\n }\n\n const isTestEnvironment = typeof process !== 'undefined' && process.env?.NODE_ENV === 'test';\n if (!isTestEnvironment) {\n console.log('FeatureService: Checking vector tile support at:', vectorTileUrl);\n }\n const response = await fetch(vectorTileUrl + '?f=json', this.esriServiceOptions.fetchOptions);\n\n if (response.ok) {\n const data = await response.json();\n if (data && !data.error) {\n if (!isTestEnvironment) {\n console.log('FeatureService: Vector tile endpoint found and working:', vectorTileUrl);\n console.log('FeatureService: Vector tile service data:', data);\n }\n return true;\n } else {\n if (!isTestEnvironment) {\n console.log('FeatureService: Vector tile endpoint returned error:', data?.error);\n }\n return false;\n }\n } else {\n if (!isTestEnvironment) {\n console.log('FeatureService: Vector tile endpoint returned HTTP', response.status);\n }\n return false;\n }\n } catch (error) {\n const isTestEnvironment = typeof process !== 'undefined' && process.env?.NODE_ENV === 'test';\n if (!isTestEnvironment) {\n console.log('FeatureService: Vector tile check failed, falling back to GeoJSON:', error);\n }\n return false;\n }\n }\n\n private _buildTileUrl(): string {\n const baseUrl = this.esriServiceOptions.url;\n // Check if this is a FeatureServer that supports vector tiles\n // Most FeatureServers don't have VectorTileServer endpoints\n // We'll use a different approach for FeatureServers with vector tile capability\n\n // Try to construct vector tile URL from FeatureServer URL\n // Some services have both FeatureServer and VectorTileServer endpoints\n const vectorTileUrl = baseUrl.replace('/FeatureServer/', '/VectorTileServer/');\n return `${vectorTileUrl}/tile/{z}/{y}/{x}.pbf`;\n }\n\n private _buildQueryUrl(): string {\n const options = { ...this._defaultEsriOptions, ...this.esriServiceOptions };\n const baseUrl = `${options.url}/query`;\n const params = new URLSearchParams();\n\n // Add query parameters (FeatureServer /layerId/query does not accept 'layers')\n\n params.append('where', options.where || '1=1');\n params.append(\n 'outFields',\n Array.isArray(options.outFields) ? options.outFields.join(',') : options.outFields || '*'\n );\n params.append('f', options.f || 'geojson');\n params.append('returnGeometry', (options.returnGeometry !== false).toString());\n\n // Add bounding box geometry if enabled and map is available\n if (options.useBoundingBox !== false && this._map) {\n const bounds = this._map.getBounds();\n if (bounds) {\n const geometry = {\n xmin: bounds.getWest(),\n ymin: bounds.getSouth(),\n xmax: bounds.getEast(),\n ymax: bounds.getNorth(),\n spatialReference: { wkid: 4326 },\n };\n params.append('geometry', JSON.stringify(geometry));\n params.append('geometryType', 'esriGeometryEnvelope');\n params.append('spatialRel', 'esriSpatialRelIntersects');\n params.append('inSR', '4326');\n }\n }\n\n // Only include geometry-related params when geometry is present (and not bounding box)\n if (options.geometry && options.useBoundingBox === false) {\n params.append('geometry', JSON.stringify(options.geometry));\n if (options.geometryType) params.append('geometryType', options.geometryType);\n if (options.spatialRel) params.append('spatialRel', options.spatialRel);\n if (options.inSR) params.append('inSR', options.inSR);\n }\n if (options.outSR) params.append('outSR', options.outSR);\n if (options.orderByFields) params.append('orderByFields', options.orderByFields);\n if (options.groupByFieldsForStatistics)\n params.append('groupByFieldsForStatistics', options.groupByFieldsForStatistics);\n if (options.outStatistics && options.outStatistics.length > 0)\n params.append('outStatistics', JSON.stringify(options.outStatistics));\n if (options.having) params.append('having', options.having);\n if (options.resultOffset) params.append('resultOffset', options.resultOffset.toString());\n if (options.resultRecordCount)\n params.append('resultRecordCount', options.resultRecordCount.toString());\n if (options.token) params.append('token', options.token);\n\n return `${baseUrl}?${params.toString()}`;\n }\n\n get _source(): unknown {\n return this._map.getSource(this._sourceId);\n }\n\n get _url(): string {\n return this._buildQueryUrl();\n }\n\n get serviceMetadata(): ServiceMetadata | null {\n return this._serviceMetadata;\n }\n\n get defaultStyle(): StyleData {\n if (this._defaultStyleData) return this._defaultStyleData;\n\n // Generate default style based on geometry type from service metadata\n const geometryType = String(this._serviceMetadata?.geometryType || 'esriGeometryPoint');\n const isVectorTiles = this.esriServiceOptions.useVectorTiles !== false;\n\n // For vector tiles, we need to include source-layer\n const baseStyle: Partial<StyleData> = {\n source: this._sourceId,\n };\n\n if (isVectorTiles && this._serviceMetadata?.name) {\n baseStyle['source-layer'] = String(this._serviceMetadata.name);\n }\n\n if (geometryType.includes('Point')) {\n return {\n type: 'circle',\n ...baseStyle,\n paint: {\n 'circle-radius': 4,\n 'circle-color': '#3b82f6',\n 'circle-stroke-color': '#1e40af',\n 'circle-stroke-width': 1,\n },\n };\n } else if (geometryType.includes('Polyline')) {\n return {\n type: 'line',\n ...baseStyle,\n paint: {\n 'line-color': '#3b82f6',\n 'line-width': 2,\n },\n };\n } else if (geometryType.includes('Polygon')) {\n return {\n type: 'fill',\n ...baseStyle,\n paint: {\n 'fill-color': 'rgba(59, 130, 246, 0.4)',\n 'fill-outline-color': '#1e40af',\n },\n };\n }\n\n // Default to circle for unknown geometry types\n return {\n type: 'circle',\n ...baseStyle,\n paint: {\n 'circle-radius': 4,\n 'circle-color': '#3b82f6',\n 'circle-stroke-color': '#1e40af',\n 'circle-stroke-width': 1,\n },\n };\n }\n\n getStyle(): Promise<StyleData> {\n return new Promise((resolve, reject) => {\n if (this._serviceMetadata) {\n resolve(this.defaultStyle);\n } else {\n // Wait for service metadata to be loaded\n this._getServiceMetadata()\n .then(() => resolve(this.defaultStyle))\n .catch(error => reject(error));\n }\n });\n }\n\n private async _getServiceMetadata(): Promise<void> {\n if (this._serviceMetadata) return;\n\n this._serviceMetadata = await getServiceDetails(\n this.esriServiceOptions.url,\n this.esriServiceOptions.fetchOptions\n );\n }\n\n updateData(): void {\n // For GeoJSON sources with bounding box filtering, update the data URL\n if (\n this.esriServiceOptions.useVectorTiles === false &&\n this.esriServiceOptions.useBoundingBox\n ) {\n const source = this._map.getSource(this._sourceId);\n if (source && 'setData' in source && typeof source.setData === 'function') {\n const newQueryUrl = this._buildQueryUrl();\n const isTestEnvironment =\n typeof process !== 'undefined' && process.env?.NODE_ENV === 'test';\n if (!isTestEnvironment) {\n console.log('Updating FeatureService data with new bounding box:', newQueryUrl);\n }\n // @ts-ignore - GeoJSON source setData method not in generic Source type\n source.setData(newQueryUrl);\n }\n } else {\n // Vector tile sources don't need dynamic data updates like GeoJSON\n // The tiles are fetched automatically based on the tile URL\n // For filtering, we would need to recreate the source or use layer filtering\n console.warn(\n 'updateData() is only applicable for GeoJSON sources with bounding box filtering.'\n );\n }\n }\n\n private _setupBoundingBoxUpdates(): void {\n if (this._boundingBoxUpdateHandler) {\n // Remove existing handler\n this._map.off('moveend', this._boundingBoxUpdateHandler);\n this._map.off('zoomend', this._boundingBoxUpdateHandler);\n }\n\n // Debounced update function to prevent excessive API calls\n let updateTimeout: NodeJS.Timeout | null = null;\n this._boundingBoxUpdateHandler = () => {\n if (updateTimeout) {\n clearTimeout(updateTimeout);\n }\n updateTimeout = setTimeout(() => {\n this.updateData();\n }, 300); // 300ms debounce\n };\n\n // Listen for map movement and zoom changes\n this._map.on('moveend', this._boundingBoxUpdateHandler);\n this._map.on('zoomend', this._boundingBoxUpdateHandler);\n }\n\n private _removeBoundingBoxUpdates(): void {\n if (this._boundingBoxUpdateHandler) {\n this._map.off('moveend', this._boundingBoxUpdateHandler);\n this._map.off('zoomend', this._boundingBoxUpdateHandler);\n this._boundingBoxUpdateHandler = null;\n }\n }\n\n updateSource(): void {\n // Remove existing source and recreate with new parameters\n if (this._map.getSource(this._sourceId)) {\n this._map.removeSource(this._sourceId);\n }\n this._createSource();\n }\n\n setWhere(whereClause: string): void {\n this.esriServiceOptions.where = whereClause;\n this.updateSource();\n }\n\n setOutFields(fields: string | string[]): void {\n this.esriServiceOptions.outFields = fields;\n this.updateSource();\n }\n\n setLayers(layers: number[] | number): void {\n this.esriServiceOptions.layers = layers;\n this.updateSource();\n }\n\n setGeometry(geometry: Record<string, unknown>, geometryType?: string): void {\n this.esriServiceOptions.geometry = geometry;\n if (geometryType) {\n this.esriServiceOptions.geometryType = geometryType;\n }\n this.updateSource();\n }\n\n clearGeometry(): void {\n delete this.esriServiceOptions.geometry;\n delete this.esriServiceOptions.geometryType;\n this.updateSource();\n }\n\n setBoundingBoxFilter(enabled: boolean): void {\n this.esriServiceOptions.useBoundingBox = enabled;\n if (enabled && this.esriServiceOptions.useVectorTiles === false) {\n this._setupBoundingBoxUpdates();\n } else {\n this._removeBoundingBoxUpdates();\n }\n this.updateSource();\n }\n\n // Note: maxRecordCount is a server capability; not settable via query params\n\n remove(): void {\n this._removeBoundingBoxUpdates();\n if (this._map.getSource(this._sourceId)) {\n this._map.removeSource(this._sourceId);\n }\n }\n\n async queryFeatures(\n options?: Partial<FeatureServiceOptions>\n ): Promise<GeoJSON.FeatureCollection> {\n const queryOptions = { ...this.esriServiceOptions, ...options };\n const queryUrl = this._buildQueryUrlWithOptions(queryOptions);\n\n try {\n const response = await fetch(queryUrl, this.esriServiceOptions.fetchOptions);\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n return await response.json();\n } catch (error) {\n const isTestEnvironment = typeof process !== 'undefined' && process.env?.NODE_ENV === 'test';\n if (!isTestEnvironment) {\n console.error('Error querying features:', error);\n }\n throw error;\n }\n }\n\n private _buildQueryUrlWithOptions(options: Partial<FeatureServiceOptions>): string {\n const mergedOptions = { ...this._defaultEsriOptions, ...options };\n const baseUrl = `${mergedOptions.url}/query`;\n const params = new URLSearchParams();\n\n // Add query parameters using the same logic as _buildQueryUrl (omit 'layers')\n\n params.append('where', mergedOptions.where || '1=1');\n params.append(\n 'outFields',\n Array.isArray(mergedOptions.outFields)\n ? mergedOptions.outFields.join(',')\n : mergedOptions.outFields || '*'\n );\n params.append('f', mergedOptions.f || 'geojson');\n params.append('returnGeometry', (mergedOptions.returnGeometry !== false).toString());\n\n if (mergedOptions.geometry) {\n params.append('geometry', JSON.stringify(mergedOptions.geometry));\n if (mergedOptions.geometryType) params.append('geometryType', mergedOptions.geometryType);\n if (mergedOptions.spatialRel) params.append('spatialRel', mergedOptions.spatialRel);\n if (mergedOptions.inSR) params.append('inSR', mergedOptions.inSR);\n }\n if (mergedOptions.outSR) params.append('outSR', mergedOptions.outSR);\n if (mergedOptions.orderByFields) params.append('orderByFields', mergedOptions.orderByFields);\n if (mergedOptions.groupByFieldsForStatistics)\n params.append('groupByFieldsForStatistics', mergedOptions.groupByFieldsForStatistics);\n if (mergedOptions.outStatistics && mergedOptions.outStatistics.length > 0)\n params.append('outStatistics', JSON.stringify(mergedOptions.outStatistics));\n if (mergedOptions.having) params.append('having', mergedOptions.having);\n if (mergedOptions.resultOffset)\n params.append('resultOffset', mergedOptions.resultOffset.toString());\n if (mergedOptions.resultRecordCount)\n params.append('resultRecordCount', mergedOptions.resultRecordCount.toString());\n if (mergedOptions.token) params.append('token', mergedOptions.token);\n\n return `${baseUrl}?${params.toString()}`;\n }\n}\n","import { Task, type TaskOptions } from '@/Tasks/Task';\nimport { Service } from '@/Services/Service';\nimport type { Map } from '@/types';\nexport interface IdentifyFeaturesOptions {\n url: string;\n layers?: number[] | number | string;\n layerDefs?: Record<string, string>;\n tolerance?: number;\n returnGeometry?: boolean;\n maxAllowableOffset?: number;\n geometryPrecision?: number;\n dynamicLayers?: unknown[];\n mapExtent?: [number, number, number, number];\n imageDisplay?: [number, number, number];\n sr?: string | number;\n layerTimeOptions?: Record<string, unknown>;\n time?: number[] | Date[];\n fetchOptions?: RequestInit;\n}\n\nexport interface IdentifyResult {\n layerId: number;\n layerName: string;\n value: string;\n displayFieldName: string;\n attributes: Record<string, unknown>;\n geometry?: unknown;\n geometryType?: string;\n}\n\nexport interface IdentifyResponse {\n results: IdentifyResult[];\n}\n\nexport interface GeometryInput {\n x: number;\n y: number;\n spatialReference?: {\n wkid: number;\n latestWkid?: number;\n };\n}\n\n/**\n * IdentifyFeatures task for performing identify operations against ArcGIS Map Services\n * Similar to Esri Leaflet's identifyFeatures functionality\n */\nexport class IdentifyFeatures extends Task {\n protected setters = {\n layers: 'layers',\n precision: 'geometryPrecision',\n tolerance: 'tolerance',\n returnGeometry: 'returnGeometry',\n };\n\n protected path = '/identify';\n\n protected params: Record<string, unknown> = {\n sr: 4326,\n layers: 'all',\n tolerance: 3,\n returnGeometry: true,\n f: 'json',\n };\n\n constructor(options: string | IdentifyFeaturesOptions | Service) {\n // Handle different input types and convert to TaskOptions format\n let taskOptions: string | TaskOptions;\n\n if (typeof options === 'string') {\n taskOptions = options;\n } else if (options instanceof Service) {\n // Extract URL from Service instance\n taskOptions = { url: (options as Service & { options: { url: string } }).options.url };\n } else {\n // It's IdentifyFeaturesOptions, use as TaskOptions\n taskOptions = options;\n }\n\n super(taskOptions);\n this.path = '/identify';\n\n // Ensure dynamic setters are available even though subclass fields\n // are initialized after super() runs. This rebinds setter methods.\n if (this.setters) {\n for (const [method, param] of Object.entries(this.setters)) {\n (this as unknown as Record<string, unknown>)[method] = this.generateSetter(param, this);\n }\n }\n }\n\n /**\n * Perform identify operation at a point location\n */\n at(point: { lng: number; lat: number } | [number, number]): IdentifyFeatures {\n let geometry: GeometryInput;\n\n if (Array.isArray(point)) {\n geometry = {\n x: point[0],\n y: point[1],\n spatialReference: { wkid: 4326 },\n };\n } else {\n geometry = {\n x: point.lng,\n y: point.lat,\n spatialReference: { wkid: 4326 },\n };\n }\n\n this.params.geometry = JSON.stringify(geometry);\n this.params.geometryType = 'esriGeometryPoint';\n return this;\n }\n\n // Strongly-typed chainable setters for common Identify params\n layers(value: number[] | number | string): IdentifyFeatures {\n this.params.layers = value;\n return this;\n }\n\n tolerance(value: number): IdentifyFeatures {\n this.params.tolerance = value;\n return this;\n }\n\n returnGeometry(value: boolean): IdentifyFeatures {\n this.params.returnGeometry = value;\n return this;\n }\n\n precision(value: number): IdentifyFeatures {\n this.params.geometryPrecision = value;\n return this;\n }\n\n /**\n * Set the map extent and image display for the identify operation\n */\n on(map: Map): IdentifyFeatures {\n try {\n const bounds = map.getBounds().toArray();\n this.params.mapExtent = [bounds[0][0], bounds[0][1], bounds[1][0], bounds[1][1]].join(',');\n\n const canvas = map.getCanvas();\n this.params.imageDisplay = [canvas.width, canvas.height, 96].join(',');\n } catch (error) {\n console.warn('Could not extract map extent and display info:', error);\n }\n return this;\n }\n\n /**\n * Set layer definitions for filtering specific layers\n */\n layerDef(layerId: number | string, whereClause: string): IdentifyFeatures {\n const currentLayerDefs = (this.params.layerDefs as string) || '';\n this.params.layerDefs = currentLayerDefs\n ? `${currentLayerDefs};${layerId}:${whereClause}`\n : `${layerId}:${whereClause}`;\n return this;\n }\n\n /**\n * Simplify geometries based on map resolution\n */\n simplify(\n map: {\n getBounds(): {\n getWest(): number;\n getEast(): number;\n };\n getSize(): { x: number; y: number };\n },\n factor: number\n ): IdentifyFeatures {\n const bounds = map.getBounds();\n const mapWidth = Math.abs(bounds.getWest() - bounds.getEast());\n this.params.maxAllowableOffset = (mapWidth / map.getSize().x) * factor;\n return this;\n }\n\n /**\n * Execute the identify operation\n */\n async run(): Promise<GeoJSON.FeatureCollection> {\n try {\n const response = await this.request<{\n results: Array<{\n layerId: number;\n layerName: string;\n value: string;\n displayFieldName: string;\n attributes: Record<string, unknown>;\n geometry?: unknown;\n }>;\n }>();\n\n return this._convertToGeoJSON(response);\n } catch (error) {\n const isTestEnvironment = typeof process !== 'undefined' && process.env?.NODE_ENV === 'test';\n if (!isTestEnvironment) {\n console.error('IdentifyFeatures error:', error);\n }\n throw error;\n }\n }\n\n private _convertToGeoJSON(response: {\n results: Array<{\n layerId: number;\n layerName: string;\n value: string;\n displayFieldName: string;\n attributes: Record<string, unknown>;\n geometry?: unknown;\n }>;\n }): GeoJSON.FeatureCollection {\n const features: GeoJSON.Feature[] = (response.results || []).map(result => {\n const feature: GeoJSON.Feature = {\n type: 'Feature',\n properties: {\n ...result.attributes,\n layerId: result.layerId,\n layerName: result.layerName,\n displayFieldName: result.displayFieldName,\n value: result.value,\n },\n geometry: (result.geometry as GeoJSON.Geometry) || null,\n };\n\n // Add layerId as a custom property for easier identification\n const featureWithLayerId = feature as GeoJSON.Feature & { layerId: number };\n featureWithLayerId.layerId = result.layerId;\n\n return feature;\n });\n\n return {\n type: 'FeatureCollection',\n features,\n };\n }\n}\n","import { cleanTrailingSlash, getServiceDetails, updateAttribution } from '@/utils';\nimport type { Map, ImageServiceOptions, RasterSourceOptions, ServiceMetadata } from '@/types';\n\ninterface ImageServiceExtendedOptions extends ImageServiceOptions {\n from?: Date | number;\n to?: Date | number;\n fetchOptions?: RequestInit;\n}\n\nexport class ImageService {\n private _sourceId: string;\n private _map: Map;\n private _defaultEsriOptions: Omit<\n Required<ImageServiceOptions>,\n 'url' | 'renderingRule' | 'mosaicRule' | 'bbox' | 'size' | 'bboxSR' | 'imageSR'\n >;\n private _serviceMetadata: ServiceMetadata | null = null;\n\n public rasterSrcOptions?: RasterSourceOptions;\n public esriServiceOptions: ImageServiceExtendedOptions;\n\n constructor(\n sourceId: string,\n map: Map,\n esriServiceOptions: ImageServiceExtendedOptions,\n rasterSrcOptions?: RasterSourceOptions\n ) {\n if (!esriServiceOptions.url) {\n throw new Error('A url must be supplied as part of the esriServiceOptions object.');\n }\n\n esriServiceOptions.url = cleanTrailingSlash(esriServiceOptions.url);\n\n this._sourceId = sourceId;\n this._map = map;\n\n this._defaultEsriOptions = {\n layers: false,\n layerDefs: false,\n format: 'jpgpng',\n dpi: 96,\n transparent: true,\n getAttributionFromService: true,\n time: false,\n };\n\n this.rasterSrcOptions = rasterSrcOptions;\n this.esriServiceOptions = esriServiceOptions;\n this._createSource();\n\n if (this.options.getAttributionFromService) this.setAttributionFromService();\n }\n\n get options(): Required<ImageServiceExtendedOptions> {\n return {\n ...this._defaultEsriOptions,\n ...this.esriServiceOptions,\n } as Required<ImageServiceExtendedOptions>;\n }\n\n get _time(): string | false {\n if (!this.options.to) return false;\n let from = this.options.from;\n let to = this.options.to;\n if (from instanceof Date) from = from.valueOf();\n if (to instanceof Date) to = to.valueOf();\n\n return `${from},${to}`;\n }\n\n get _source(): any {\n const tileSize = this.rasterSrcOptions?.tileSize ?? 256;\n // These are the bare minimum parameters\n const params = new URLSearchParams({\n bboxSR: '3857',\n imageSR: '3857',\n format: this.options.format,\n size: `${tileSize},${tileSize}`,\n f: 'image',\n });\n\n // These are optional params\n if (this._time) params.append('time', this._time);\n if (this.options.mosaicRule)\n params.append('mosaicRule', JSON.stringify(this.options.mosaicRule));\n if (this.options.renderingRule)\n params.append('renderingRule', JSON.stringify(this.options.renderingRule));\n\n return {\n type: 'raster',\n tiles: [`${this.options.url}/exportImage?bbox={bbox-epsg-3857}&${params.toString()}`],\n tileSize,\n ...this.rasterSrcOptions,\n };\n }\n\n private _createSource(): void {\n this._map.addSource(this._sourceId, this._source);\n }\n\n // This requires hooking into some undocumented methods\n private _updateSource(): void {\n const src = this._map.getSource(this._sourceId) as any;\n src.tiles[0] = this._source.tiles[0];\n src._options = this._source;\n\n if (src.setTiles) {\n // New MapboxGL >= 2.13.0\n src.setTiles(this._source.tiles);\n } else if ((this._map as any).style.sourceCaches) {\n // Old MapboxGL and MaplibreGL\n (this._map as any).style.sourceCaches[this._sourceId].clearTiles();\n (this._map as any).style.sourceCaches[this._sourceId].update((this._map as any).transform);\n } else if ((this._map as any).style._otherSourceCaches) {\n (this._map as any).style.sourceCaches[this._sourceId].clearTiles();\n (this._map as any).style.sourceCaches[this._sourceId].update((this._map as any).transform);\n }\n }\n\n setDate(from: Date | number, to: Date | number): void {\n this.esriServiceOptions.from = from;\n this.esriServiceOptions.to = to;\n this._updateSource();\n }\n\n setRenderingRule(rule: Record<string, any>): void {\n this.esriServiceOptions.renderingRule = rule;\n this._updateSource();\n }\n\n setMosaicRule(rule: Record<string, any>): void {\n this.esriServiceOptions.mosaicRule = rule;\n this._updateSource();\n }\n\n setAttributionFromService(): Promise<void> {\n if (this._serviceMetadata) {\n updateAttribution(this._serviceMetadata.copyrightText || '', this._sourceId, this._map);\n return Promise.resolve();\n } else {\n return this.getMetadata().then(() => {\n updateAttribution(this._serviceMetadata?.copyrightText || '', this._sourceId, this._map);\n });\n }\n }\n\n getMetadata(): Promise<ServiceMetadata> {\n if (this._serviceMetadata !== null) return Promise.resolve(this._serviceMetadata);\n return new Promise((resolve, reject) => {\n getServiceDetails(this.esriServiceOptions.url, this.esriServiceOptions.fetchOptions)\n .then(data => {\n this._serviceMetadata = data;\n resolve(this._serviceMetadata);\n })\n .catch(err => reject(err));\n });\n }\n\n identify(lnglat: { lng: number; lat: number }, returnGeometry: boolean = false): Promise<any> {\n const canvas = (this._map as any).getCanvas();\n const bounds = (this._map as any).getBounds().toArray();\n\n const params = new URLSearchParams({\n sr: '4326',\n geometryType: 'esriGeometryPoint',\n geometry: JSON.stringify({\n x: lnglat.lng,\n y: lnglat.lat,\n spatialReference: {\n wkid: 4326,\n },\n }),\n tolerance: '3',\n returnGeometry: returnGeometry.toString(),\n imageDisplay: `${canvas.width},${canvas.height},96`,\n mapExtent: `${bounds[0][0]},${bounds[0][1]},${bounds[1][0]},${bounds[1][1]}`,\n f: 'json',\n });\n\n if (this._time) params.append('time', this._time);\n\n return new Promise((resolve, reject) => {\n fetch(\n `${this.esriServiceOptions.url}/identify?${params.toString()}`,\n this.esriServiceOptions.fetchOptions\n )\n .then(response => response.json())\n .then(data => resolve(data))\n .catch(error => reject(error));\n });\n }\n\n update(): void {\n this._updateSource();\n }\n\n remove(): void {\n this._map.removeSource(this._sourceId);\n }\n}\n","import { cleanTrailingSlash, getServiceDetails, updateAttribution } from '@/utils';\nimport type { Map, EsriServiceOptions, RasterSourceOptions, ServiceMetadata } from '@/types';\n\ninterface TiledMapServiceOptions extends EsriServiceOptions {\n fetchOptions?: RequestInit;\n}\n\ninterface RasterSource {\n type: 'raster';\n tiles: string[];\n tileSize?: number;\n attribution?: string;\n bounds?: number[];\n minzoom?: number;\n maxzoom?: number;\n}\n\nexport class TiledMapService {\n private _sourceId: string;\n private _map: Map;\n private _serviceMetadata: ServiceMetadata | null = null;\n\n public rasterSrcOptions?: RasterSourceOptions;\n public esriServiceOptions: TiledMapServiceOptions;\n\n constructor(\n sourceId: string,\n map: Map,\n esriServiceOptions: TiledMapServiceOptions,\n rasterSrcOptions?: RasterSourceOptions\n ) {\n if (!esriServiceOptions.url) {\n throw new Error('A url must be supplied as part of the esriServiceOptions object.');\n }\n\n esriServiceOptions.url = cleanTrailingSlash(esriServiceOptions.url);\n\n this._sourceId = sourceId;\n this._map = map;\n\n this.rasterSrcOptions = rasterSrcOptions;\n this.esriServiceOptions = esriServiceOptions;\n this._createSource();\n\n if (esriServiceOptions.getAttributionFromService) {\n this.setAttributionFromService().catch(() => {\n // Silently handle attribution fetch errors to prevent unhandled rejections\n });\n }\n }\n\n get _source(): RasterSource {\n return {\n ...this.rasterSrcOptions,\n type: 'raster',\n tiles: [`${this.esriServiceOptions.url}/tile/{z}/{y}/{x}`],\n tileSize: this.rasterSrcOptions?.tileSize || 256,\n };\n }\n\n private _createSource(): void {\n this._map.addSource(this._sourceId, this._source as unknown as Parameters<Map['addSource']>[1]);\n }\n\n setAttributionFromService(): Promise<void> {\n if (this._serviceMetadata) {\n updateAttribution(this._serviceMetadata.copyrightText || '', this._sourceId, this._map);\n return Promise.resolve();\n } else {\n return this.getMetadata().then(() => {\n updateAttribution(this._serviceMetadata?.copyrightText || '', this._sourceId, this._map);\n });\n }\n }\n\n getMetadata(): Promise<ServiceMetadata> {\n if (this._serviceMetadata !== null) return Promise.resolve(this._serviceMetadata);\n return new Promise((resolve, reject) => {\n getServiceDetails(this.esriServiceOptions.url, this.esriServiceOptions.fetchOptions)\n .then(data => {\n this._serviceMetadata = data;\n resolve(data);\n })\n .catch(err => reject(err));\n });\n }\n\n update(): void {\n // For tiled services, we would typically need to recreate the source\n // but for now we'll just call getSource to satisfy the test\n this._map.getSource(this._sourceId);\n }\n\n remove(): void {\n this._map.removeSource(this._sourceId);\n }\n}\n","export class VectorBasemapStyle {\n public styleName: string;\n private _apikey: string;\n\n constructor(styleName?: string, apikey?: string) {\n if (!apikey) {\n throw new Error('An Esri API Key must be supplied to consume vector basemap styles');\n }\n\n this.styleName = styleName || 'ArcGIS:Streets';\n this._apikey = apikey;\n }\n\n get styleUrl(): string {\n return `https://basemaps-api.arcgis.com/arcgis/rest/services/styles/${this.styleName}?type=style&apiKey=${this._apikey}`;\n }\n\n setStyle(styleName: string): void {\n this.styleName = styleName;\n }\n\n update(): void {\n // Style updates are handled by changing the styleUrl\n }\n\n remove(): void {\n // Vector basemap styles don't need explicit removal\n }\n}\n","import { cleanTrailingSlash, getServiceDetails } from '@/utils';\nimport type { Map, VectorTileServiceOptions, VectorSourceOptions, ServiceMetadata } from '@/types';\n\ninterface VectorTileServiceExtendedOptions extends VectorTileServiceOptions {\n useDefaultStyle?: boolean;\n fetchOptions?: RequestInit;\n}\n\ninterface StyleLayoutPaint {\n [key: string]: unknown;\n}\n\ninterface StyleData {\n type: string;\n // Mapbox layer definition fields\n source?: string;\n 'source-layer': string;\n layout?: StyleLayoutPaint;\n paint?: StyleLayoutPaint;\n}\n\nexport class VectorTileService {\n private _sourceId: string;\n private _map: Map;\n private _defaultEsriOptions: { useDefaultStyle: boolean };\n private _serviceMetadata: ServiceMetadata | null = null;\n private _defaultStyleData: StyleData | null = null;\n\n public vectorSrcOptions?: VectorSourceOptions;\n public esriServiceOptions: VectorTileServiceExtendedOptions;\n\n constructor(\n sourceId: string,\n map: Map,\n esriServiceOptions: VectorTileServiceExtendedOptions,\n vectorSrcOptions?: VectorSourceOptions\n ) {\n if (!esriServiceOptions.url) {\n throw new Error('A url must be supplied as part of the esriServiceOptions object.');\n }\n\n esriServiceOptions.url = cleanTrailingSlash(esriServiceOptions.url);\n\n this._sourceId = sourceId;\n this._map = map;\n\n this._defaultEsriOptions = {\n useDefaultStyle: true,\n };\n\n this.vectorSrcOptions = vectorSrcOptions;\n this.esriServiceOptions = esriServiceOptions;\n\n this._createSource();\n }\n\n get options(): Required<VectorTileServiceExtendedOptions> {\n return {\n ...this._defaultEsriOptions,\n ...this.esriServiceOptions,\n } as Required<VectorTileServiceExtendedOptions>;\n }\n\n get _tileUrl(): string {\n if (this._serviceMetadata === null) return '/tile/{z}/{y}/{x}.pbf';\n return this._serviceMetadata.tiles?.[0] || '/tile/{z}/{y}/{x}.pbf';\n }\n\n get _source(): VectorSourceOptions & { type: 'vector'; tiles: string[] } {\n return {\n ...(this.vectorSrcOptions || {}),\n type: 'vector',\n tiles: [`${this.options.url}${this._tileUrl}`],\n } as VectorSourceOptions & { type: 'vector'; tiles: string[] };\n }\n\n private _createSource(): void {\n this._map.addSource(this._sourceId, this._source as unknown as Parameters<Map['addSource']>[1]);\n }\n\n private _mapToLocalSource(style: StyleData): StyleData {\n return {\n type: style.type,\n source: this._sourceId,\n 'source-layer': style['source-layer'],\n layout: style.layout,\n paint: style.paint,\n };\n }\n\n get defaultStyle(): StyleData {\n // Consumers should only call after getStyle resolves\n return this._mapToLocalSource(this._defaultStyleData!);\n }\n\n get _styleUrl(): string {\n // Return a RELATIVE path which will be prefixed with options.url during fetch\n // ArcGIS VectorTileServer typically exposes defaultStyles like 'resources/styles/root.json'\n if (this._serviceMetadata === null) return 'resources/styles/root.json';\n return this._serviceMetadata.defaultStyles || 'resources/styles/root.json';\n }\n\n getStyle(): Promise<StyleData> {\n // Always resolve the mapped defaultStyle so the 'source' equals this._sourceId\n if (this._defaultStyleData !== null) return Promise.resolve(this.defaultStyle);\n return new Promise((resolve, reject) => {\n const load = () =>\n this._retrieveStyle()\n .then(() => resolve(this.defaultStyle))\n .catch(error => reject(error));\n\n if (this._serviceMetadata === null) {\n this.getMetadata()\n .then(() => load())\n .catch(error => reject(error));\n } else {\n load();\n }\n });\n }\n\n private _retrieveStyle(): Promise<void> {\n return new Promise((resolve, reject) => {\n fetch(`${this.options.url}/${this._styleUrl}`, this.esriServiceOptions.fetchOptions)\n .then(response => {\n if (!response.ok) throw new Error(`Failed to fetch style: ${response.status}`);\n return response.json();\n })\n .then(data => {\n if (!data || !Array.isArray(data.layers) || data.layers.length === 0) {\n throw new Error('VectorTile style document is missing layers.');\n }\n // Use the first layer as a simple default style for the demo\n this._defaultStyleData = data.layers[0];\n resolve();\n })\n .catch(error => reject(error));\n });\n }\n\n getMetadata(): Promise<ServiceMetadata> {\n if (this._serviceMetadata !== null) return Promise.resolve(this._serviceMetadata);\n return new Promise((resolve, reject) => {\n getServiceDetails(this.esriServiceOptions.url, this.esriServiceOptions.fetchOptions)\n .then(data => {\n this._serviceMetadata = data;\n resolve(this._serviceMetadata);\n })\n .catch(err => reject(err));\n });\n }\n\n update(): void {\n // Vector tile services don't need dynamic updates like dynamic services\n }\n\n remove(): void {\n this._map.removeSource(this._sourceId);\n }\n}\n"],"names":["cleanTrailingSlash","url","replace","getServiceDetails","fetchOptions","Promise","resolve","reject","fetch","then","response","json","data","catch","error","POWERED_BY_ESRI_ATTRIBUTION_STRING","updateAttribution","newAttribution","sourceId","map","mapWithControls","attributionController","_controls","find","c","customAttribution","options","undefined","Array","isArray","indexOf","push","mapStyle","style","sourceCaches","_source","attribution","_otherSourceCaches","console","warn","_updateAttributions","Service","constructor","Object","defineProperty","this","Error","proxy","useCors","timeout","getAttributionFromService","get","path","params","_request","post","request","requestWithCallback","method","callback","_requestWithCallback","metadata","_serviceMetadata","f","process","env","NODE_ENV","authenticate","token","_authenticating","_runQueue","getTimeout","setTimeout","setAttributionFromService","_map","copyrightText","on","event","_eventListeners","off","listeners","index","splice","fire","forEach","wrappedCallback","_createServiceCallback","finalParams","requestParams","_requestQueue","_makeRequest","formData","FormData","keys","key","value","append","JSON","stringify","toString","body","searchParams","URLSearchParams","join","fullUrl","ok","status","errorWithCode","code","message","i","length","Task","endpoint","_service","setters","setter","param","generateSetter","context","apikey","format","formatted","returnUnformattedValues","run","assign","fullServiceUrl","endsWith","slice","startsWith","headers","Query","super","offset","limit","fields","precision","featureIds","returnGeometry","returnM","transform","where","outSR","outFields","queryOptions","spatialRel","geometry","geometryType","inSR","returnDistinctValues","returnIdsOnly","returnCountOnly","returnExtentOnly","orderByFields","groupByFieldsForStatistics","outStatistics","resultOffset","resultRecordCount","maxAllowableOffset","geometryPrecision","time","gdbVersion","historicMoment","returnTrueCurves","returnZ","within","_setGeometryParams","intersects","contains","crosses","touches","overlaps","bboxIntersects","nearby","latlng","radius","lng","lat","units","distance","whereClause","between","start","end","startTime","Date","valueOf","endTime","simplify","factor","bounds","getBounds","mapWidth","Math","abs","_northEast","_southWest","getSize","x","orderBy","fieldName","order","currentOrder","layer","layerId","distinct","pixelSize","point","y","_cleanParams","_convertToGeoJSON","count","ids","objectIds","extent","ymin","xmin","ymax","xmax","converted","_setGeometry","geom","spatialReference","wkid","type","features","feature","properties","attributes","Find","text","sr","layers","dynamicLayers","searchText","findOptions","searchFields","layerDefs","currentLayerDefs","getWest","getEast","results","result","layerName","foundFieldName","_convertEsriGeometry","esriGeom","coordinates","rings","paths","IdentifyImage","returnCatalogItems","imageOptions","mosaic","renderingRules","at","size","returnGeom","returnItems","mosaicRule","rule","renderingRule","values","location","getPixelValues","numValue","parseFloat","isNaN","getPixelData","esriServiceOptions","rasterSrcOptions","_sourceId","_defaultEsriOptions","dpi","transparent","_createSource","_layersStr","lyrs","_layerDefs","_time","to","from","tileSize","bboxSR","imageSR","tiles","addSource","_updateSource","src","getSource","_options","setTiles","clearTiles","update","setLayerDefs","obj","setLayers","arr","setDate","getMetadata","err","_layersStrIdentify","layersStr","identify","lnglat","canvas","getCanvas","toArray","tolerance","imageDisplay","width","height","mapExtent","remove","removeSource","vectorSrcOptions","useVectorTiles","useBoundingBox","isTestEnvironment","log","vectorTileSupport","_checkVectorTileSupport","tileUrl","_buildTileUrl","maxzoom","queryUrl","_buildQueryUrl","_setupBoundingBoxUpdates","vectorTileUrl","baseUrl","getSouth","getNorth","having","_url","serviceMetadata","defaultStyle","_defaultStyleData","String","isVectorTiles","baseStyle","source","name","includes","paint","getStyle","_getServiceMetadata","updateData","setData","newQueryUrl","_boundingBoxUpdateHandler","updateTimeout","clearTimeout","_removeBoundingBoxUpdates","updateSource","setWhere","setOutFields","setGeometry","clearGeometry","setBoundingBoxFilter","enabled","queryFeatures","_buildQueryUrlWithOptions","mergedOptions","taskOptions","entries","layerDef","displayFieldName","setRenderingRule","setMosaicRule","styleName","_apikey","styleUrl","setStyle","useDefaultStyle","_tileUrl","_mapToLocalSource","layout","_styleUrl","defaultStyles","load","_retrieveStyle"],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { Map, EsriServiceOptions, RasterSourceOptions, ServiceMetadata } from '@/types';
|
|
2
|
+
interface DynamicMapServiceOptions extends EsriServiceOptions {
|
|
3
|
+
from?: Date | number;
|
|
4
|
+
to?: Date | number;
|
|
5
|
+
fetchOptions?: RequestInit;
|
|
6
|
+
}
|
|
7
|
+
export declare class DynamicMapService {
|
|
8
|
+
private _sourceId;
|
|
9
|
+
private _map;
|
|
10
|
+
private _defaultEsriOptions;
|
|
11
|
+
private _serviceMetadata;
|
|
12
|
+
rasterSrcOptions?: RasterSourceOptions;
|
|
13
|
+
esriServiceOptions: DynamicMapServiceOptions;
|
|
14
|
+
constructor(sourceId: string, map: Map, esriServiceOptions: DynamicMapServiceOptions, rasterSrcOptions?: RasterSourceOptions);
|
|
15
|
+
get options(): Required<DynamicMapServiceOptions>;
|
|
16
|
+
get _layersStr(): string | false;
|
|
17
|
+
get _layerDefs(): string | false;
|
|
18
|
+
get _time(): string | false;
|
|
19
|
+
get _source(): any;
|
|
20
|
+
private _createSource;
|
|
21
|
+
private _updateSource;
|
|
22
|
+
setLayerDefs(obj: Record<string, string>): void;
|
|
23
|
+
setLayers(arr: number[] | number): void;
|
|
24
|
+
setDate(from: Date | number, to: Date | number): void;
|
|
25
|
+
setAttributionFromService(): Promise<void>;
|
|
26
|
+
getMetadata(): Promise<ServiceMetadata>;
|
|
27
|
+
get _layersStrIdentify(): string | false;
|
|
28
|
+
identify(lnglat: {
|
|
29
|
+
lng: number;
|
|
30
|
+
lat: number;
|
|
31
|
+
}, returnGeometry?: boolean): Promise<any>;
|
|
32
|
+
update(): void;
|
|
33
|
+
remove(): void;
|
|
34
|
+
}
|
|
35
|
+
export {};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { Map, FeatureServiceOptions, VectorSourceOptions, ServiceMetadata } from '@/types';
|
|
2
|
+
interface FeatureServiceExtendedOptions extends FeatureServiceOptions {
|
|
3
|
+
fetchOptions?: RequestInit;
|
|
4
|
+
useVectorTiles?: boolean;
|
|
5
|
+
useBoundingBox?: boolean;
|
|
6
|
+
}
|
|
7
|
+
interface StyleData {
|
|
8
|
+
type: string;
|
|
9
|
+
source?: string;
|
|
10
|
+
'source-layer'?: string;
|
|
11
|
+
layout?: Record<string, unknown>;
|
|
12
|
+
paint?: Record<string, unknown>;
|
|
13
|
+
}
|
|
14
|
+
export declare class FeatureService {
|
|
15
|
+
private _sourceId;
|
|
16
|
+
private _map;
|
|
17
|
+
private _defaultEsriOptions;
|
|
18
|
+
private _serviceMetadata;
|
|
19
|
+
private _defaultStyleData;
|
|
20
|
+
private _boundingBoxUpdateHandler;
|
|
21
|
+
vectorSrcOptions?: VectorSourceOptions;
|
|
22
|
+
esriServiceOptions: FeatureServiceExtendedOptions;
|
|
23
|
+
constructor(sourceId: string, map: Map, esriServiceOptions: FeatureServiceExtendedOptions, vectorSrcOptions?: VectorSourceOptions);
|
|
24
|
+
private _createSource;
|
|
25
|
+
private _checkVectorTileSupport;
|
|
26
|
+
private _buildTileUrl;
|
|
27
|
+
private _buildQueryUrl;
|
|
28
|
+
get _source(): unknown;
|
|
29
|
+
get _url(): string;
|
|
30
|
+
get serviceMetadata(): ServiceMetadata | null;
|
|
31
|
+
get defaultStyle(): StyleData;
|
|
32
|
+
getStyle(): Promise<StyleData>;
|
|
33
|
+
private _getServiceMetadata;
|
|
34
|
+
updateData(): void;
|
|
35
|
+
private _setupBoundingBoxUpdates;
|
|
36
|
+
private _removeBoundingBoxUpdates;
|
|
37
|
+
updateSource(): void;
|
|
38
|
+
setWhere(whereClause: string): void;
|
|
39
|
+
setOutFields(fields: string | string[]): void;
|
|
40
|
+
setLayers(layers: number[] | number): void;
|
|
41
|
+
setGeometry(geometry: Record<string, unknown>, geometryType?: string): void;
|
|
42
|
+
clearGeometry(): void;
|
|
43
|
+
setBoundingBoxFilter(enabled: boolean): void;
|
|
44
|
+
remove(): void;
|
|
45
|
+
queryFeatures(options?: Partial<FeatureServiceOptions>): Promise<GeoJSON.FeatureCollection>;
|
|
46
|
+
private _buildQueryUrlWithOptions;
|
|
47
|
+
}
|
|
48
|
+
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { Map, ImageServiceOptions, RasterSourceOptions, ServiceMetadata } from '@/types';
|
|
2
|
+
interface ImageServiceExtendedOptions extends ImageServiceOptions {
|
|
3
|
+
from?: Date | number;
|
|
4
|
+
to?: Date | number;
|
|
5
|
+
fetchOptions?: RequestInit;
|
|
6
|
+
}
|
|
7
|
+
export declare class ImageService {
|
|
8
|
+
private _sourceId;
|
|
9
|
+
private _map;
|
|
10
|
+
private _defaultEsriOptions;
|
|
11
|
+
private _serviceMetadata;
|
|
12
|
+
rasterSrcOptions?: RasterSourceOptions;
|
|
13
|
+
esriServiceOptions: ImageServiceExtendedOptions;
|
|
14
|
+
constructor(sourceId: string, map: Map, esriServiceOptions: ImageServiceExtendedOptions, rasterSrcOptions?: RasterSourceOptions);
|
|
15
|
+
get options(): Required<ImageServiceExtendedOptions>;
|
|
16
|
+
get _time(): string | false;
|
|
17
|
+
get _source(): any;
|
|
18
|
+
private _createSource;
|
|
19
|
+
private _updateSource;
|
|
20
|
+
setDate(from: Date | number, to: Date | number): void;
|
|
21
|
+
setRenderingRule(rule: Record<string, any>): void;
|
|
22
|
+
setMosaicRule(rule: Record<string, any>): void;
|
|
23
|
+
setAttributionFromService(): Promise<void>;
|
|
24
|
+
getMetadata(): Promise<ServiceMetadata>;
|
|
25
|
+
identify(lnglat: {
|
|
26
|
+
lng: number;
|
|
27
|
+
lat: number;
|
|
28
|
+
}, returnGeometry?: boolean): Promise<any>;
|
|
29
|
+
update(): void;
|
|
30
|
+
remove(): void;
|
|
31
|
+
}
|
|
32
|
+
export {};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Service, ServiceOptions } from './Service';
|
|
2
|
+
import { IdentifyFeatures } from '../Tasks/IdentifyFeatures';
|
|
3
|
+
import { Query } from '../Tasks/Query';
|
|
4
|
+
import { Find } from '../Tasks/Find';
|
|
5
|
+
export interface MapServiceOptions extends ServiceOptions {
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* MapService - ArcGIS Server Map Service
|
|
9
|
+
* Exactly matches Esri Leaflet's MapService pattern
|
|
10
|
+
*/
|
|
11
|
+
export declare class MapService extends Service {
|
|
12
|
+
constructor(options: MapServiceOptions);
|
|
13
|
+
/**
|
|
14
|
+
* Return an IdentifyFeatures task instance
|
|
15
|
+
*/
|
|
16
|
+
identify(): IdentifyFeatures;
|
|
17
|
+
/**
|
|
18
|
+
* Return a Query task instance
|
|
19
|
+
*/
|
|
20
|
+
query(): Query;
|
|
21
|
+
/**
|
|
22
|
+
* Return a Find task instance
|
|
23
|
+
*/
|
|
24
|
+
find(): Find;
|
|
25
|
+
export(params: Record<string, unknown>): Promise<{
|
|
26
|
+
href?: string;
|
|
27
|
+
}>;
|
|
28
|
+
}
|
|
29
|
+
export declare function mapService(options: MapServiceOptions): MapService;
|
|
30
|
+
export default mapService;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
export interface LayerTimeOptions {
|
|
2
|
+
useTime?: boolean;
|
|
3
|
+
timeFields?: string[];
|
|
4
|
+
timeExtent?: [number, number];
|
|
5
|
+
}
|
|
6
|
+
export interface DynamicLayer {
|
|
7
|
+
id: number;
|
|
8
|
+
source?: {
|
|
9
|
+
type: string;
|
|
10
|
+
mapLayerId?: number;
|
|
11
|
+
workspaceId?: string;
|
|
12
|
+
dataSourceName?: string;
|
|
13
|
+
};
|
|
14
|
+
definitionExpression?: string;
|
|
15
|
+
drawingInfo?: Record<string, unknown>;
|
|
16
|
+
transparency?: number;
|
|
17
|
+
visible?: boolean;
|
|
18
|
+
minScale?: number;
|
|
19
|
+
maxScale?: number;
|
|
20
|
+
}
|
|
21
|
+
export interface EsriGeometry {
|
|
22
|
+
x?: number;
|
|
23
|
+
y?: number;
|
|
24
|
+
spatialReference?: {
|
|
25
|
+
wkid: number;
|
|
26
|
+
};
|
|
27
|
+
rings?: number[][][];
|
|
28
|
+
paths?: number[][][];
|
|
29
|
+
points?: number[][];
|
|
30
|
+
}
|
|
31
|
+
export interface IdentifyResult {
|
|
32
|
+
layerId: number;
|
|
33
|
+
layerName: string;
|
|
34
|
+
value: string;
|
|
35
|
+
displayFieldName: string;
|
|
36
|
+
feature: {
|
|
37
|
+
attributes: Record<string, unknown>;
|
|
38
|
+
geometry?: EsriGeometry;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
export interface IdentifyResponse {
|
|
42
|
+
results: IdentifyResult[];
|
|
43
|
+
}
|
|
44
|
+
export interface FindResult {
|
|
45
|
+
layerId: number;
|
|
46
|
+
layerName: string;
|
|
47
|
+
foundFieldName: string;
|
|
48
|
+
value: string;
|
|
49
|
+
displayFieldName: string;
|
|
50
|
+
feature: {
|
|
51
|
+
attributes: Record<string, unknown>;
|
|
52
|
+
geometry?: EsriGeometry;
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
export interface FindResponse {
|
|
56
|
+
results: FindResult[];
|
|
57
|
+
}
|
|
58
|
+
export interface QueryFeature {
|
|
59
|
+
attributes: Record<string, unknown>;
|
|
60
|
+
geometry?: EsriGeometry;
|
|
61
|
+
}
|
|
62
|
+
export interface QueryResponse {
|
|
63
|
+
features: QueryFeature[];
|
|
64
|
+
exceededTransferLimit?: boolean;
|
|
65
|
+
spatialReference?: {
|
|
66
|
+
wkid: number;
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
export interface StatisticDefinition {
|
|
70
|
+
statisticType: 'count' | 'sum' | 'min' | 'max' | 'avg' | 'stddev' | 'var';
|
|
71
|
+
onStatisticField: string;
|
|
72
|
+
outStatisticFieldName: string;
|
|
73
|
+
}
|
|
74
|
+
export interface QuantizationParameters {
|
|
75
|
+
mode: string;
|
|
76
|
+
originPosition?: string;
|
|
77
|
+
tolerance?: number;
|
|
78
|
+
extent?: {
|
|
79
|
+
xmin: number;
|
|
80
|
+
ymin: number;
|
|
81
|
+
xmax: number;
|
|
82
|
+
ymax: number;
|
|
83
|
+
spatialReference?: {
|
|
84
|
+
wkid: number;
|
|
85
|
+
};
|
|
86
|
+
};
|
|
87
|
+
}
|