@loaders.gl/arcgis 5.0.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.
Files changed (125) hide show
  1. package/LICENSE +52 -0
  2. package/README.md +28 -0
  3. package/dist/arcgis/arcgis-capability-graph.d.ts +50 -0
  4. package/dist/arcgis/arcgis-capability-graph.d.ts.map +1 -0
  5. package/dist/arcgis/arcgis-capability-graph.js +221 -0
  6. package/dist/arcgis/arcgis-capability-graph.js.map +1 -0
  7. package/dist/arcgis/arcgis-feature-query.d.ts +53 -0
  8. package/dist/arcgis/arcgis-feature-query.d.ts.map +1 -0
  9. package/dist/arcgis/arcgis-feature-query.js +381 -0
  10. package/dist/arcgis/arcgis-feature-query.js.map +1 -0
  11. package/dist/arcgis/arcgis-feature-server-source-loader-types.d.ts +33 -0
  12. package/dist/arcgis/arcgis-feature-server-source-loader-types.d.ts.map +1 -0
  13. package/dist/arcgis/arcgis-feature-server-source-loader-types.js +21 -0
  14. package/dist/arcgis/arcgis-feature-server-source-loader-types.js.map +1 -0
  15. package/dist/arcgis/arcgis-feature-server-source-loader.d.ts +84 -0
  16. package/dist/arcgis/arcgis-feature-server-source-loader.d.ts.map +1 -0
  17. package/dist/arcgis/arcgis-feature-server-source-loader.js +280 -0
  18. package/dist/arcgis/arcgis-feature-server-source-loader.js.map +1 -0
  19. package/dist/arcgis/arcgis-image-server-source-loader-types.d.ts +31 -0
  20. package/dist/arcgis/arcgis-image-server-source-loader-types.d.ts.map +1 -0
  21. package/dist/arcgis/arcgis-image-server-source-loader-types.js +21 -0
  22. package/dist/arcgis/arcgis-image-server-source-loader-types.js.map +1 -0
  23. package/dist/arcgis/arcgis-image-server-source-loader.d.ts +60 -0
  24. package/dist/arcgis/arcgis-image-server-source-loader.d.ts.map +1 -0
  25. package/dist/arcgis/arcgis-image-server-source-loader.js +130 -0
  26. package/dist/arcgis/arcgis-image-server-source-loader.js.map +1 -0
  27. package/dist/arcgis/arcgis-image-tile-source-loader-types.d.ts +31 -0
  28. package/dist/arcgis/arcgis-image-tile-source-loader-types.d.ts.map +1 -0
  29. package/dist/arcgis/arcgis-image-tile-source-loader-types.js +21 -0
  30. package/dist/arcgis/arcgis-image-tile-source-loader-types.js.map +1 -0
  31. package/dist/arcgis/arcgis-image-tile-source-loader.d.ts +63 -0
  32. package/dist/arcgis/arcgis-image-tile-source-loader.d.ts.map +1 -0
  33. package/dist/arcgis/arcgis-image-tile-source-loader.js +147 -0
  34. package/dist/arcgis/arcgis-image-tile-source-loader.js.map +1 -0
  35. package/dist/arcgis/arcgis-map-tile-source-loader-types.d.ts +31 -0
  36. package/dist/arcgis/arcgis-map-tile-source-loader-types.d.ts.map +1 -0
  37. package/dist/arcgis/arcgis-map-tile-source-loader-types.js +21 -0
  38. package/dist/arcgis/arcgis-map-tile-source-loader-types.js.map +1 -0
  39. package/dist/arcgis/arcgis-map-tile-source-loader.d.ts +62 -0
  40. package/dist/arcgis/arcgis-map-tile-source-loader.d.ts.map +1 -0
  41. package/dist/arcgis/arcgis-map-tile-source-loader.js +196 -0
  42. package/dist/arcgis/arcgis-map-tile-source-loader.js.map +1 -0
  43. package/dist/arcgis/arcgis-scene-aggregation.d.ts +34 -0
  44. package/dist/arcgis/arcgis-scene-aggregation.d.ts.map +1 -0
  45. package/dist/arcgis/arcgis-scene-aggregation.js +57 -0
  46. package/dist/arcgis/arcgis-scene-aggregation.js.map +1 -0
  47. package/dist/arcgis/arcgis-scene-server-source-loader-types.d.ts +31 -0
  48. package/dist/arcgis/arcgis-scene-server-source-loader-types.d.ts.map +1 -0
  49. package/dist/arcgis/arcgis-scene-server-source-loader-types.js +21 -0
  50. package/dist/arcgis/arcgis-scene-server-source-loader-types.js.map +1 -0
  51. package/dist/arcgis/arcgis-scene-server-source-loader.d.ts +64 -0
  52. package/dist/arcgis/arcgis-scene-server-source-loader.d.ts.map +1 -0
  53. package/dist/arcgis/arcgis-scene-server-source-loader.js +159 -0
  54. package/dist/arcgis/arcgis-scene-server-source-loader.js.map +1 -0
  55. package/dist/arcgis/arcgis-server.d.ts +15 -0
  56. package/dist/arcgis/arcgis-server.d.ts.map +1 -0
  57. package/dist/arcgis/arcgis-server.js +41 -0
  58. package/dist/arcgis/arcgis-server.js.map +1 -0
  59. package/dist/arcgis/arcgis-url-utils.d.ts +3 -0
  60. package/dist/arcgis/arcgis-url-utils.d.ts.map +1 -0
  61. package/dist/arcgis/arcgis-url-utils.js +23 -0
  62. package/dist/arcgis/arcgis-url-utils.js.map +1 -0
  63. package/dist/arcgis/arcgis-vector-tile-server-source-loader-types.d.ts +31 -0
  64. package/dist/arcgis/arcgis-vector-tile-server-source-loader-types.d.ts.map +1 -0
  65. package/dist/arcgis/arcgis-vector-tile-server-source-loader-types.js +21 -0
  66. package/dist/arcgis/arcgis-vector-tile-server-source-loader-types.js.map +1 -0
  67. package/dist/arcgis/arcgis-vector-tile-server-source-loader.d.ts +66 -0
  68. package/dist/arcgis/arcgis-vector-tile-server-source-loader.d.ts.map +1 -0
  69. package/dist/arcgis/arcgis-vector-tile-server-source-loader.js +150 -0
  70. package/dist/arcgis/arcgis-vector-tile-server-source-loader.js.map +1 -0
  71. package/dist/arcgis-feature-query-types.d.ts +77 -0
  72. package/dist/arcgis-feature-query-types.d.ts.map +1 -0
  73. package/dist/arcgis-feature-query-types.js +5 -0
  74. package/dist/arcgis-feature-query-types.js.map +1 -0
  75. package/dist/arcgis-items.d.ts +64 -0
  76. package/dist/arcgis-items.d.ts.map +1 -0
  77. package/dist/arcgis-items.js +137 -0
  78. package/dist/arcgis-items.js.map +1 -0
  79. package/dist/arcgis-source-types.d.ts +372 -0
  80. package/dist/arcgis-source-types.d.ts.map +1 -0
  81. package/dist/arcgis-source-types.js +108 -0
  82. package/dist/arcgis-source-types.js.map +1 -0
  83. package/dist/authentication.d.ts +25 -0
  84. package/dist/authentication.d.ts.map +1 -0
  85. package/dist/authentication.js +94 -0
  86. package/dist/authentication.js.map +1 -0
  87. package/dist/bundled.d.ts +152 -0
  88. package/dist/bundled.d.ts.map +1 -0
  89. package/dist/bundled.js +34 -0
  90. package/dist/bundled.js.map +1 -0
  91. package/dist/index.cjs +25620 -0
  92. package/dist/index.cjs.map +6 -0
  93. package/dist/index.d.ts +24 -0
  94. package/dist/index.d.ts.map +1 -0
  95. package/dist/index.js +11 -0
  96. package/dist/index.js.map +1 -0
  97. package/dist/service-registry.d.ts +18 -0
  98. package/dist/service-registry.d.ts.map +1 -0
  99. package/dist/service-registry.js +29 -0
  100. package/dist/service-registry.js.map +1 -0
  101. package/package.json +96 -0
  102. package/src/arcgis/arcgis-capability-graph.ts +297 -0
  103. package/src/arcgis/arcgis-feature-query.ts +442 -0
  104. package/src/arcgis/arcgis-feature-server-source-loader-types.ts +34 -0
  105. package/src/arcgis/arcgis-feature-server-source-loader.ts +373 -0
  106. package/src/arcgis/arcgis-image-server-source-loader-types.ts +34 -0
  107. package/src/arcgis/arcgis-image-server-source-loader.ts +186 -0
  108. package/src/arcgis/arcgis-image-tile-source-loader-types.ts +34 -0
  109. package/src/arcgis/arcgis-image-tile-source-loader.ts +192 -0
  110. package/src/arcgis/arcgis-map-tile-source-loader-types.ts +34 -0
  111. package/src/arcgis/arcgis-map-tile-source-loader.ts +248 -0
  112. package/src/arcgis/arcgis-scene-aggregation.ts +90 -0
  113. package/src/arcgis/arcgis-scene-server-source-loader-types.ts +36 -0
  114. package/src/arcgis/arcgis-scene-server-source-loader.ts +216 -0
  115. package/src/arcgis/arcgis-server.ts +61 -0
  116. package/src/arcgis/arcgis-url-utils.ts +26 -0
  117. package/src/arcgis/arcgis-vector-tile-server-source-loader-types.ts +36 -0
  118. package/src/arcgis/arcgis-vector-tile-server-source-loader.ts +196 -0
  119. package/src/arcgis-feature-query-types.ts +89 -0
  120. package/src/arcgis-items.ts +233 -0
  121. package/src/arcgis-source-types.ts +372 -0
  122. package/src/authentication.ts +118 -0
  123. package/src/bundled.ts +68 -0
  124. package/src/index.ts +70 -0
  125. package/src/service-registry.ts +43 -0
@@ -0,0 +1,233 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import type {FetchLike} from '@loaders.gl/loader-utils';
6
+
7
+ /** A supported service-backed portal item, retaining the original portal metadata. */
8
+ export type ArcGISItem = {
9
+ /** Portal item identifier. */
10
+ id: string;
11
+ /** Display title supplied by the publisher. */
12
+ title: string;
13
+ /** Portal item type, distinct from the REST service type. */
14
+ type: string;
15
+ /** REST service endpoint. */
16
+ url: string;
17
+ /** Publisher description, potentially containing HTML; do not render it unsanitized. */
18
+ description?: string;
19
+ /** Publisher attribution, potentially containing HTML. */
20
+ accessInformation?: string;
21
+ /** Geographic item extent in longitude/latitude, when published. */
22
+ extent?: number[][];
23
+ /** Unmodified additional portal metadata. */
24
+ [name: string]: unknown;
25
+ };
26
+
27
+ /** An explicit service/layer choice; resolving a choice does not prove renderer support. */
28
+ export type ArcGISItemLayer = {
29
+ /** Numeric layer identifier, or null for a single root service. */
30
+ id: number | null;
31
+ /** Publisher-provided layer name. */
32
+ name: string;
33
+ /** Endpoint to pass to an appropriate ArcGIS source loader. */
34
+ url: string;
35
+ /** Whether this is a spatial layer, nonspatial table, or root service. */
36
+ kind: 'layer' | 'table' | 'service';
37
+ };
38
+
39
+ /** A resolved service item with choices and optional selected layer metadata. */
40
+ export type ArcGISItemResolution = {
41
+ /** Canonical portal REST root, including an Enterprise web-adaptor path. */
42
+ portalUrl: string;
43
+ /** Original item metadata, including description, extent and attribution. */
44
+ item: ArcGISItem;
45
+ /** Original service metadata. */
46
+ service: Record<string, any>;
47
+ /** Available choices; no implicit first-layer selection is made. */
48
+ layers: ArcGISItemLayer[];
49
+ /** Explicitly selected layer and its raw fields, domains, extent and attribution. */
50
+ selectedLayer?: ArcGISItemLayer & {
51
+ /** Unmodified selected-layer metadata. */ metadata: Record<string, any>;
52
+ };
53
+ };
54
+
55
+ /** Controls item resolution without owning authentication or OAuth state. */
56
+ export type ArcGISItemOptions = {
57
+ /** Portal root or sharing/rest endpoint. Defaults to ArcGIS Online for bare IDs. */
58
+ portalUrl?: string;
59
+ /** Shared authenticated transport, also used for service and selected-layer metadata. */
60
+ fetch?: FetchLike;
61
+ /** Cancels all metadata requests. */
62
+ signal?: AbortSignal;
63
+ /** Explicit layer/table identifier to inspect, or null for a root service. */
64
+ layerId?: number | null;
65
+ };
66
+
67
+ /** Service-backed item types supported by this resolver. */
68
+ const ITEM_SERVICES: Readonly<Record<string, string>> = {
69
+ 'Feature Service': 'FeatureServer',
70
+ 'Map Service': 'MapServer',
71
+ 'Image Service': 'ImageServer',
72
+ 'Vector Tile Service': 'VectorTileServer',
73
+ 'Scene Service': 'SceneServer'
74
+ };
75
+
76
+ /**
77
+ * Resolves a portal item ID, item-details URL, or item REST URL into explicit service choices.
78
+ * Fetches only item, service, and (when selected) layer metadata. Web Maps/Web Scenes are rejected.
79
+ * URLs discovered in metadata never expand the credential's trusted origins.
80
+ */
81
+ export async function resolveArcGISItem(
82
+ input: string,
83
+ options: ArcGISItemOptions = {}
84
+ ): Promise<ArcGISItemResolution> {
85
+ const {itemId, portalUrl} = parseItemReference(input, options.portalUrl);
86
+ const fetchFile = options.fetch || fetch;
87
+ const item = (await fetchMetadata(
88
+ `${portalUrl}/content/items/${itemId}`,
89
+ fetchFile,
90
+ options.signal
91
+ )) as ArcGISItem;
92
+ const serviceType = Object.hasOwn(ITEM_SERVICES, item.type)
93
+ ? ITEM_SERVICES[item.type]
94
+ : undefined;
95
+ if (!serviceType)
96
+ throw new Error(
97
+ 'Unsupported ArcGIS item type. Resolve a service item, not a Web Map or Web Scene.'
98
+ );
99
+ if (
100
+ typeof item.id !== 'string' ||
101
+ item.id.toLowerCase() !== itemId ||
102
+ typeof item.title !== 'string'
103
+ )
104
+ throw new Error('Invalid ArcGIS item metadata.');
105
+ const serviceUrl = parseEndpoint(item.url);
106
+ const serviceMatch = serviceUrl.pathname.match(
107
+ /\/(FeatureServer|MapServer|ImageServer|VectorTileServer|SceneServer)(?:\/(?:layers\/)?(\d+))?\/?$/i
108
+ );
109
+ if (
110
+ !serviceMatch ||
111
+ serviceMatch[1].toLowerCase() !== serviceType.toLowerCase() ||
112
+ (serviceMatch[2] !== undefined &&
113
+ !new RegExp(
114
+ serviceType === 'SceneServer'
115
+ ? '/SceneServer/layers/\\d+/?$'
116
+ : '/(FeatureServer|MapServer)/\\d+/?$',
117
+ 'i'
118
+ ).test(serviceUrl.pathname))
119
+ ) {
120
+ throw new Error('ArcGIS item URL does not match its supported service type.');
121
+ }
122
+ const url = serviceUrl.href.replace(/\/$/, '');
123
+ const service = await fetchMetadata(url, fetchFile, options.signal);
124
+ const isLayer = serviceMatch[2] !== undefined;
125
+ const layers: ArcGISItemLayer[] = isLayer
126
+ ? [
127
+ {
128
+ id: Number(serviceMatch[2]),
129
+ name: service.name || item.title,
130
+ url,
131
+ kind: service.type === 'Table' ? 'table' : 'layer'
132
+ }
133
+ ]
134
+ : [
135
+ ...createLayerChoices(service.layers, 'layer', url, serviceType),
136
+ ...createLayerChoices(service.tables, 'table', url, serviceType)
137
+ ];
138
+ // Map roots are also useful as image sources; image/vector tile roots are single services.
139
+ if (!isLayer && serviceType !== 'FeatureServer' && serviceType !== 'SceneServer') {
140
+ layers.unshift({id: null, name: service.name || item.title, url, kind: 'service'});
141
+ }
142
+ const resolution: ArcGISItemResolution = {portalUrl, item, service, layers};
143
+ if (options.layerId !== undefined) {
144
+ const layer = layers.find(candidate => candidate.id === options.layerId);
145
+ if (!layer) throw new Error('The requested ArcGIS layer or table is not present in this item.');
146
+ const metadata =
147
+ layer.url === url ? service : await fetchMetadata(layer.url, fetchFile, options.signal);
148
+ resolution.selectedLayer = {...layer, metadata};
149
+ }
150
+ return resolution;
151
+ }
152
+
153
+ /** Builds choices from advertised numeric layer IDs without recursively fetching sublayers. */
154
+ function createLayerChoices(
155
+ entries: any,
156
+ kind: 'layer' | 'table',
157
+ url: string,
158
+ serviceType: string
159
+ ): ArcGISItemLayer[] {
160
+ if (!Array.isArray(entries)) return [];
161
+ return entries
162
+ .filter(entry => Number.isSafeInteger(entry?.id) && entry.id >= 0)
163
+ .map(entry => ({
164
+ id: entry.id,
165
+ name: typeof entry.name === 'string' ? entry.name : String(entry.id),
166
+ url: `${url}/${serviceType === 'SceneServer' ? 'layers/' : ''}${entry.id}`,
167
+ kind
168
+ }));
169
+ }
170
+
171
+ /** Parses only documented item URL shapes, retaining Enterprise portal prefixes. */
172
+ function parseItemReference(
173
+ input: string,
174
+ configuredPortal?: string
175
+ ): {itemId: string; portalUrl: string} {
176
+ let itemId = input;
177
+ let inferredPortal: string | undefined;
178
+ if (!/^[a-f\d]{32}$/i.test(input)) {
179
+ const url = new URL(input);
180
+ if (!['http:', 'https:'].includes(url.protocol) || url.username || url.password || url.hash)
181
+ throw new Error('Invalid ArcGIS item URL.');
182
+ const details = url.pathname.match(/^(.*)\/home\/item\.html$/);
183
+ const rest = url.pathname.match(/^(.*)\/sharing\/rest\/content\/items\/([a-f\d]{32})\/?$/i);
184
+ if (details) {
185
+ itemId = url.searchParams.get('id') || '';
186
+ inferredPortal = `${url.origin}${details[1]}/sharing/rest`;
187
+ } else if (rest) {
188
+ itemId = rest[2];
189
+ inferredPortal = `${url.origin}${rest[1]}/sharing/rest`;
190
+ } else throw new Error('Expected an ArcGIS item ID or item-details/REST URL.');
191
+ if ([...url.searchParams.keys()].some(key => !['id', 'f'].includes(key)))
192
+ throw new Error('Item URLs must not contain credentials or extra parameters.');
193
+ }
194
+ if (!/^[a-f\d]{32}$/i.test(itemId))
195
+ throw new Error('ArcGIS item IDs must contain 32 hexadecimal characters.');
196
+ const portal = parseEndpoint(configuredPortal || inferredPortal || 'https://www.arcgis.com');
197
+ const portalUrl = `${portal.href.replace(/\/$/, '').replace(/\/sharing\/rest$/i, '')}/sharing/rest`;
198
+ if (inferredPortal && portalUrl !== inferredPortal)
199
+ throw new Error('Item URL does not belong to the configured portal.');
200
+ return {itemId: itemId.toLowerCase(), portalUrl};
201
+ }
202
+
203
+ /** Rejects credential-bearing or non-HTTP metadata endpoints. */
204
+ function parseEndpoint(value: string): URL {
205
+ const url = new URL(value);
206
+ if (
207
+ !['http:', 'https:'].includes(url.protocol) ||
208
+ url.username ||
209
+ url.password ||
210
+ url.search ||
211
+ url.hash
212
+ ) {
213
+ throw new Error(
214
+ 'ArcGIS endpoints must be HTTP(S) URLs without credentials, query parameters or fragments.'
215
+ );
216
+ }
217
+ return url;
218
+ }
219
+
220
+ /** Reads JSON metadata and rejects ArcGIS error envelopes even with HTTP 200. */
221
+ async function fetchMetadata(
222
+ url: string,
223
+ fetchFile: FetchLike,
224
+ signal?: AbortSignal
225
+ ): Promise<Record<string, any>> {
226
+ const response = await fetchFile(`${url}?f=json`, {signal});
227
+ if (!response.ok) throw new Error(`ArcGIS metadata request failed (HTTP ${response.status}).`);
228
+ const metadata = await response.json();
229
+ if (!metadata || typeof metadata !== 'object' || Array.isArray(metadata) || metadata.error) {
230
+ throw new Error('ArcGIS metadata is unavailable or access was denied.');
231
+ }
232
+ return metadata;
233
+ }
@@ -0,0 +1,372 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import type {DataSourceOptions, SourceLoader} from '@loaders.gl/loader-utils';
6
+ import type {ImageLoaderOptions} from '@loaders.gl/images';
7
+ import type {MVTLoaderOptions} from '@loaders.gl/mvt';
8
+
9
+ /** Static source metadata shared by lazy descriptors and runtime loaders. */
10
+ type ArcGISSourceMetadata = Omit<SourceLoader, 'dataType' | 'batchType' | 'createDataSource'>;
11
+
12
+ /** Parameters for ArcGIS FeatureServer query requests. */
13
+ export type ArcGISFeatureServiceQueryOptions = {
14
+ /** Include feature geometries in the response. */
15
+ returnGeometry?: boolean;
16
+ /** SQL where clause. */
17
+ where?: string;
18
+ /** Output spatial reference. */
19
+ outSR?: string | number;
20
+ /** Output fields. */
21
+ outFields?: string | string[];
22
+ /** Input spatial reference for supplied geometry. */
23
+ inSR?: string | number;
24
+ /** Filter geometry as an ArcGIS REST geometry string. */
25
+ geometry?: string;
26
+ /** Filter geometry type. */
27
+ geometryType?:
28
+ | 'esriGeometryEnvelope'
29
+ | 'esriGeometryPoint'
30
+ | 'esriGeometryPolyline'
31
+ | 'esriGeometryPolygon';
32
+ /** Spatial relationship for geometry filters. */
33
+ spatialRel?:
34
+ | 'esriSpatialRelIntersects'
35
+ | 'esriSpatialRelContains'
36
+ | 'esriSpatialRelCrosses'
37
+ | 'esriSpatialRelEnvelopeIntersects'
38
+ | 'esriSpatialRelIndexIntersects'
39
+ | 'esriSpatialRelOverlaps'
40
+ | 'esriSpatialRelTouches'
41
+ | 'esriSpatialRelWithin';
42
+ /** Geometry precision. */
43
+ geometryPrecision?: number;
44
+ /** Query result type. */
45
+ resultType?: 'none' | 'standard' | 'tile';
46
+ /** Restrict retrieval to these object IDs. */
47
+ objectIds?: (number | string)[] | string;
48
+ /** Time instant or extent in ArcGIS REST syntax. */
49
+ time?: string | number;
50
+ /** Explicit offset for queryFeaturePage(); complete queries manage this themselves. */
51
+ resultOffset?: number;
52
+ /** Explicit page limit for queryFeaturePage(). */
53
+ resultRecordCount?: number;
54
+ /** Explicit ordering for queryFeaturePage(); complete queries order by object ID. */
55
+ orderByFields?: string;
56
+ /** Response format hint; spatial reads use GeoJSON and nonspatial tables use JSON. */
57
+ f?: 'geojson' | 'json' | 'pjson';
58
+ };
59
+
60
+ /** Options for the ArcGIS FeatureServer source. */
61
+ export type ArcGISFeatureServerSourceLoaderOptions = DataSourceOptions & {
62
+ 'arcgis-feature-server'?: {
63
+ /** Default ArcGIS query request parameters. */
64
+ queryParameters?: Partial<ArcGISFeatureServiceQueryOptions>;
65
+ };
66
+ };
67
+
68
+ /** Options for the ArcGIS ImageServer source. */
69
+ export type ArcGISImageSourceLoaderProps = DataSourceOptions &
70
+ ImageLoaderOptions & {
71
+ 'arcgis-image-server'?: {
72
+ /** Default ArcGIS exportImage request parameters. */
73
+ exportImageParameters?: Partial<ArcGISExportImageParameters>;
74
+ };
75
+ };
76
+
77
+ /** Parameters for ArcGIS ImageServer exportImage requests. */
78
+ export type ArcGISExportImageParameters = {
79
+ /** Bounding box of the requested image. */
80
+ bbox: [number, number, number, number];
81
+ /** Spatial reference of the supplied bbox. */
82
+ bboxSR?: string | number;
83
+ /** Pixel width of returned image. */
84
+ width: number;
85
+ /** Pixel height of returned image. */
86
+ height: number;
87
+ /** Spatial reference of the returned image. */
88
+ imageSR?: string | number;
89
+ /** Requested image format. */
90
+ format?: 'jpgpng' | 'png' | 'png8' | 'png24' | 'jpg' | 'bmp' | 'gif' | 'tiff' | 'png32' | 'lerc';
91
+ /** Requested pixel type. */
92
+ pixelType?: 'U1' | 'U2' | 'U4' | 'U8' | 'S8' | 'U16' | 'S16' | 'U32' | 'S32' | 'F32' | 'F64';
93
+ /** NoData pixel value. */
94
+ noData?: string | number;
95
+ /** NoData interpretation mode. */
96
+ noDataInterpretation?: 'esriNoDataMatchAny' | 'esriNoDataMatchAll';
97
+ /** Resampling interpolation. */
98
+ interpolation?: string;
99
+ /** Compression type. */
100
+ compression?: string;
101
+ /** Compression quality. */
102
+ compressionQuality?: number;
103
+ /** Band ids to export. */
104
+ bandIds?: string | number[];
105
+ /** Mosaic rule JSON string or object. */
106
+ mosaicRule?: string | Record<string, unknown>;
107
+ /** Rendering rule JSON string or object. */
108
+ renderingRule?: string | Record<string, unknown>;
109
+ /** ArcGIS response format. */
110
+ f?: 'image' | 'json' | 'pjson';
111
+ };
112
+
113
+ /** Options for the ArcGIS ImageServer tile source. */
114
+ export type ArcGISImageTileSourceLoaderOptions = DataSourceOptions &
115
+ ImageLoaderOptions & {
116
+ 'arcgis-image-server-tiles'?: {
117
+ /** Tile size used for exportImage requests. */
118
+ tileSize?: number;
119
+ /** Optional service URL pool for simple request distribution. */
120
+ urls?: string[];
121
+ /** Additional exportImage parameters. */
122
+ parameters?: Record<string, string | number | boolean>;
123
+ /** Response format, using LERC for analytical raster tiles. */
124
+ format?: 'png32' | 'lerc';
125
+ };
126
+ };
127
+
128
+ /** Options for an ArcGIS cached MapServer tile source. */
129
+ export type ArcGISMapTileSourceLoaderOptions = DataSourceOptions &
130
+ ImageLoaderOptions & {
131
+ 'arcgis-map-server'?: {
132
+ /** Select cached tiles, dynamic export tiles, or automatic metadata-based selection. */
133
+ mode?: 'cached' | 'dynamic' | 'auto';
134
+ /** Tile size used for dynamic export requests. */
135
+ tileSize?: number;
136
+ /** Optional custom tile URL template. */
137
+ urlTemplate?: string;
138
+ /** Optional service URL pool for simple request distribution. */
139
+ urls?: string[];
140
+ /** Additional query parameters sent to the metadata endpoint. */
141
+ parameters?: Record<string, string>;
142
+ /** Metadata document supplied by the application. */
143
+ metadata?: ArcGISMapServerMetadata;
144
+ /** Default parameters forwarded to MapServer `export` requests. */
145
+ exportParameters?: Record<string, string | number | boolean>;
146
+ };
147
+ };
148
+
149
+ /** Relevant normalized fields from an ArcGIS MapServer metadata document. */
150
+ export type ArcGISMapServerMetadata = {
151
+ name?: string;
152
+ description?: string;
153
+ serviceDescription?: string;
154
+ copyrightText?: string;
155
+ fullExtent?: {xmin: number; ymin: number; xmax: number; ymax: number; spatialReference?: unknown};
156
+ spatialReference?: unknown;
157
+ tileInfo?: {
158
+ lods?: {level: number}[];
159
+ rows?: number;
160
+ cols?: number;
161
+ format?: string;
162
+ spatialReference?: unknown;
163
+ origin?: {x: number; y: number};
164
+ };
165
+ };
166
+
167
+ /** Parameters that can be changed between ArcGIS map tile requests. */
168
+ export type ArcGISMapTileParameters = Record<string, string | number | boolean>;
169
+
170
+ /** Parameters accepted by the ArcGIS SceneServer query endpoint. */
171
+ export type ArcGISSceneQueryOptions = {
172
+ /** SQL where clause. */
173
+ where?: string;
174
+ /** Object IDs to include. */
175
+ objectIds?: number[] | string;
176
+ /** Geometry filter encoded using ArcGIS REST geometry syntax. */
177
+ geometry?: unknown;
178
+ /** Geometry type for the geometry filter. */
179
+ geometryType?: string;
180
+ /** Spatial relationship for the geometry filter. */
181
+ spatialRel?: string;
182
+ /** Fields to return. */
183
+ outFields?: string | string[];
184
+ /** Whether feature geometry should be included. */
185
+ returnGeometry?: boolean;
186
+ /** Input spatial reference. */
187
+ inSR?: string | number | object;
188
+ /** Output spatial reference. */
189
+ outSR?: string | number | object;
190
+ /** ArcGIS result type. */
191
+ resultType?: string;
192
+ /** Result page offset. */
193
+ resultOffset?: number;
194
+ /** Maximum records in one page. */
195
+ resultRecordCount?: number;
196
+ /** Response format. */
197
+ f?: 'json' | 'pjson';
198
+ /** Abort signal for the request. */
199
+ signal?: AbortSignal;
200
+ };
201
+
202
+ /** Normalized result returned by a SceneServer query. */
203
+ export type ArcGISSceneQueryResult = {
204
+ /** Returned SceneServer features. */
205
+ features: unknown[];
206
+ /** Field metadata advertised by the layer. */
207
+ fields?: unknown[];
208
+ /** Whether another page is available. */
209
+ exceededTransferLimit?: boolean;
210
+ /** Original response metadata for advanced consumers. */
211
+ rawMetadata?: unknown;
212
+ };
213
+
214
+ /** Options for an ArcGIS SceneServer source. */
215
+ export type ArcGISSceneServerSourceOptions = DataSourceOptions & {
216
+ 'arcgis-scene-server'?: {
217
+ /** Layer identifier used when the input URL ends at `/SceneServer`. */
218
+ layerId?: number | string;
219
+ /** ArcGIS token applied to metadata and tile-resource requests. */
220
+ token?: string;
221
+ /** Optional metadata document for offline or preloaded use. */
222
+ metadata?: unknown;
223
+ };
224
+ };
225
+
226
+ /** ArcGIS vector tile service metadata. */
227
+ export type ArcGISVectorTileServiceMetadata = {
228
+ /** Human-readable service description. */
229
+ serviceDescription?: string;
230
+ /** Map name exposed by the service. */
231
+ mapName?: string;
232
+ /** Tile grid information. */
233
+ tileInfo?: {
234
+ /** Tile width in pixels. */
235
+ cols?: number;
236
+ /** Tile height in pixels. */
237
+ rows?: number;
238
+ /** Tile format, normally pbf. */
239
+ format?: string;
240
+ /** Tile origin. */
241
+ origin?: {x: number; y: number};
242
+ /** Tile grid spatial reference. */
243
+ spatialReference?: {wkid?: number; latestWkid?: number};
244
+ /** Levels of detail. */
245
+ lods?: Array<{level: number; resolution: number; scale?: number}>;
246
+ };
247
+ /** Full service extent. */
248
+ fullExtent?: {xmin: number; ymin: number; xmax: number; ymax: number};
249
+ /** Initial service extent. */
250
+ initialExtent?: {xmin: number; ymin: number; xmax: number; ymax: number};
251
+ };
252
+
253
+ /** Options for the ArcGIS VectorTileServer source. */
254
+ export type ArcGISVectorTileServerSourceLoaderOptions = DataSourceOptions &
255
+ MVTLoaderOptions & {
256
+ 'arcgis-vector-tile-server'?: {
257
+ /** Optional MVT parser options. */
258
+ mvt?: MVTLoaderOptions['mvt'];
259
+ };
260
+ };
261
+
262
+ /** Shared ArcGISFeatureServerSourceLoader metadata, without runtime or lazy-loading dependencies. */
263
+ export const ARCGIS_FEATURE_SERVER_SOURCE_LOADER_METADATA = {
264
+ name: 'ArcGISFeatureServer',
265
+ id: 'arcgis-feature-server',
266
+ module: 'arcgis',
267
+ version: '0.0.0',
268
+ extensions: [],
269
+ mimeTypes: [],
270
+ type: 'arcgis-feature-server',
271
+ fromUrl: true,
272
+ fromBlob: false,
273
+ options: {
274
+ url: undefined!,
275
+ 'arcgis-feature-server': {}
276
+ },
277
+ defaultOptions: {
278
+ url: undefined!,
279
+ 'arcgis-feature-server': {}
280
+ },
281
+ testURL: (url: string): boolean =>
282
+ /\/featureserver(?:[/?#]|$)/i.test(url) || /\/mapserver\/\d+(?:[/?#]|$)/i.test(url)
283
+ } as const satisfies ArcGISSourceMetadata;
284
+
285
+ /** Shared ArcGISImageServerSourceLoader metadata, without runtime or lazy-loading dependencies. */
286
+ export const ARCGIS_IMAGE_SERVER_SOURCE_LOADER_METADATA = {
287
+ name: 'ArcGISImageServer',
288
+ id: 'arcgis-image-server',
289
+ module: 'arcgis',
290
+ version: '0.0.0',
291
+ extensions: [],
292
+ mimeTypes: [],
293
+ type: 'arcgis-image-server',
294
+ fromUrl: true,
295
+ fromBlob: false,
296
+ options: {
297
+ 'arcgis-image-server': {
298
+ // TODO - add options here
299
+ }
300
+ },
301
+ defaultOptions: {
302
+ 'arcgis-image-server': {
303
+ // TODO - add options here
304
+ }
305
+ },
306
+ testURL: (url: string): boolean => url.toLowerCase().includes('imageserver')
307
+ } as const satisfies ArcGISSourceMetadata;
308
+
309
+ /** Shared ArcGISImageTileSourceLoader metadata, without runtime or lazy-loading dependencies. */
310
+ export const ARCGIS_IMAGE_TILE_SOURCE_LOADER_METADATA = {
311
+ name: 'ArcGIS ImageServer tiles',
312
+ id: 'arcgis-image-server-tiles',
313
+ module: 'arcgis',
314
+ version: '0.0.0',
315
+ extensions: [],
316
+ mimeTypes: [],
317
+ type: 'arcgis-image-server-tiles',
318
+ fromUrl: true,
319
+ fromBlob: false,
320
+ options: {'arcgis-image-server-tiles': {}},
321
+ defaultOptions: {'arcgis-image-server-tiles': {}},
322
+ testURL: (url: string): boolean => /imageserver/i.test(url)
323
+ } as const satisfies ArcGISSourceMetadata;
324
+
325
+ /** Shared ArcGISMapTileSourceLoader metadata, without runtime or lazy-loading dependencies. */
326
+ export const ARCGIS_MAP_TILE_SOURCE_LOADER_METADATA = {
327
+ name: 'ArcGIS MapServer tiles',
328
+ id: 'arcgis-map-server',
329
+ module: 'arcgis',
330
+ version: '0.0.0',
331
+ extensions: [],
332
+ mimeTypes: [],
333
+ type: 'arcgis-map-server',
334
+ fromUrl: true,
335
+ fromBlob: false,
336
+ options: {'arcgis-map-server': {}},
337
+ defaultOptions: {'arcgis-map-server': {}},
338
+ testURL: (url: string): boolean =>
339
+ /mapserver/i.test(url) && !/imageserver|featureserver/i.test(url)
340
+ } as const satisfies ArcGISSourceMetadata;
341
+
342
+ /** Shared ArcGISSceneServerSourceLoader metadata, without runtime or lazy-loading dependencies. */
343
+ export const ARCGIS_SCENE_SERVER_SOURCE_LOADER_METADATA = {
344
+ name: 'ArcGIS SceneServer',
345
+ id: 'arcgis-scene-server',
346
+ module: 'arcgis',
347
+ version: '0.0.0',
348
+ extensions: [],
349
+ mimeTypes: ['application/json'],
350
+ type: 'arcgis-scene-server',
351
+ fromUrl: true,
352
+ fromBlob: false,
353
+ options: {'arcgis-scene-server': {}},
354
+ defaultOptions: {'arcgis-scene-server': {}},
355
+ testURL: (url: string): boolean => /\/SceneServer(?:[\/?#]|$)/i.test(url)
356
+ } as const satisfies ArcGISSourceMetadata;
357
+
358
+ /** Shared ArcGISVectorTileServerSourceLoader metadata, without runtime or lazy-loading dependencies. */
359
+ export const ARCGIS_VECTOR_TILE_SERVER_SOURCE_LOADER_METADATA = {
360
+ name: 'ArcGIS VectorTileServer',
361
+ id: 'arcgis-vector-tile-server',
362
+ module: 'arcgis',
363
+ version: '0.0.0',
364
+ extensions: [],
365
+ mimeTypes: ['application/vnd.mapbox-vector-tile', 'application/x-protobuf'],
366
+ type: 'arcgis-vector-tile-server',
367
+ fromUrl: true,
368
+ fromBlob: false,
369
+ options: {'arcgis-vector-tile-server': {}},
370
+ defaultOptions: {'arcgis-vector-tile-server': {}},
371
+ testURL: (url: string): boolean => /\/vectortileserver(?:[\/?#]|$)/i.test(url)
372
+ } as const satisfies ArcGISSourceMetadata;