@honua/react 0.0.20-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (597) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +9 -0
  3. package/contract/analytics-sources.d.ts +149 -0
  4. package/contract/analytics-sources.d.ts.map +1 -0
  5. package/contract/analytics-sources.js +235 -0
  6. package/contract/edit-session.d.ts +203 -0
  7. package/contract/edit-session.d.ts.map +1 -0
  8. package/contract/edit-session.js +760 -0
  9. package/contract/edit-sketch.d.ts +91 -0
  10. package/contract/edit-sketch.d.ts.map +1 -0
  11. package/contract/edit-sketch.js +281 -0
  12. package/contract/index.d.ts +61 -0
  13. package/contract/index.d.ts.map +1 -0
  14. package/contract/index.js +51 -0
  15. package/contract/jobs.d.ts +149 -0
  16. package/contract/jobs.d.ts.map +1 -0
  17. package/contract/jobs.js +40 -0
  18. package/contract/source.d.ts +423 -0
  19. package/contract/source.d.ts.map +1 -0
  20. package/contract/source.js +3802 -0
  21. package/contract/spatial-aggregation.d.ts +336 -0
  22. package/contract/spatial-aggregation.d.ts.map +1 -0
  23. package/contract/spatial-aggregation.js +298 -0
  24. package/contract/temporal.d.ts +455 -0
  25. package/contract/temporal.d.ts.map +1 -0
  26. package/contract/temporal.js +146 -0
  27. package/contract/tiles.d.ts +370 -0
  28. package/contract/tiles.d.ts.map +1 -0
  29. package/contract/tiles.js +519 -0
  30. package/contract/types.d.ts +665 -0
  31. package/contract/types.d.ts.map +1 -0
  32. package/contract/types.js +175 -0
  33. package/contract/widget-source.d.ts +205 -0
  34. package/contract/widget-source.d.ts.map +1 -0
  35. package/contract/widget-source.js +1473 -0
  36. package/control-plane/client.d.ts +95 -0
  37. package/control-plane/client.d.ts.map +1 -0
  38. package/control-plane/client.js +374 -0
  39. package/control-plane/index.d.ts +18 -0
  40. package/control-plane/index.d.ts.map +1 -0
  41. package/control-plane/index.js +14 -0
  42. package/control-plane/types.d.ts +233 -0
  43. package/control-plane/types.d.ts.map +1 -0
  44. package/control-plane/types.js +7 -0
  45. package/core/batch.d.ts +37 -0
  46. package/core/batch.d.ts.map +1 -0
  47. package/core/batch.js +79 -0
  48. package/core/cache-state.d.ts +79 -0
  49. package/core/cache-state.d.ts.map +1 -0
  50. package/core/cache-state.js +87 -0
  51. package/core/client.d.ts +577 -0
  52. package/core/client.d.ts.map +1 -0
  53. package/core/client.js +1664 -0
  54. package/core/compatibility.d.ts +18 -0
  55. package/core/compatibility.d.ts.map +1 -0
  56. package/core/compatibility.js +245 -0
  57. package/core/errors.d.ts +107 -0
  58. package/core/errors.d.ts.map +1 -0
  59. package/core/errors.js +156 -0
  60. package/core/esri-geojson.d.ts +66 -0
  61. package/core/esri-geojson.d.ts.map +1 -0
  62. package/core/esri-geojson.js +363 -0
  63. package/core/geoservices.d.ts +34 -0
  64. package/core/geoservices.d.ts.map +1 -0
  65. package/core/geoservices.js +434 -0
  66. package/core/grpc-adapter.d.ts +23 -0
  67. package/core/grpc-adapter.d.ts.map +1 -0
  68. package/core/grpc-adapter.js +688 -0
  69. package/core/odata.d.ts +347 -0
  70. package/core/odata.d.ts.map +1 -0
  71. package/core/odata.js +913 -0
  72. package/core/ogc-conformance.d.ts +35 -0
  73. package/core/ogc-conformance.d.ts.map +1 -0
  74. package/core/ogc-conformance.js +134 -0
  75. package/core/ogc-features.d.ts +23 -0
  76. package/core/ogc-features.d.ts.map +1 -0
  77. package/core/ogc-features.js +114 -0
  78. package/core/ogc-maps.d.ts +49 -0
  79. package/core/ogc-maps.d.ts.map +1 -0
  80. package/core/ogc-maps.js +126 -0
  81. package/core/ogc-processes.d.ts +118 -0
  82. package/core/ogc-processes.d.ts.map +1 -0
  83. package/core/ogc-processes.js +423 -0
  84. package/core/ogc-records.d.ts +75 -0
  85. package/core/ogc-records.d.ts.map +1 -0
  86. package/core/ogc-records.js +251 -0
  87. package/core/ogc-tiles.d.ts +125 -0
  88. package/core/ogc-tiles.d.ts.map +1 -0
  89. package/core/ogc-tiles.js +183 -0
  90. package/core/path-utils.d.ts +69 -0
  91. package/core/path-utils.d.ts.map +1 -0
  92. package/core/path-utils.js +123 -0
  93. package/core/pbf-decoder.d.ts +39 -0
  94. package/core/pbf-decoder.d.ts.map +1 -0
  95. package/core/pbf-decoder.js +702 -0
  96. package/core/process-runner.d.ts +104 -0
  97. package/core/process-runner.d.ts.map +1 -0
  98. package/core/process-runner.js +315 -0
  99. package/core/protocol-transport.d.ts +76 -0
  100. package/core/protocol-transport.d.ts.map +1 -0
  101. package/core/protocol-transport.js +15 -0
  102. package/core/query-builder.d.ts +261 -0
  103. package/core/query-builder.d.ts.map +1 -0
  104. package/core/query-builder.js +538 -0
  105. package/core/request-pipeline.d.ts +88 -0
  106. package/core/request-pipeline.d.ts.map +1 -0
  107. package/core/request-pipeline.js +273 -0
  108. package/core/spatial-filter.d.ts +93 -0
  109. package/core/spatial-filter.d.ts.map +1 -0
  110. package/core/spatial-filter.js +153 -0
  111. package/core/stac.d.ts +55 -0
  112. package/core/stac.d.ts.map +1 -0
  113. package/core/stac.js +229 -0
  114. package/core/surfaces.d.ts +527 -0
  115. package/core/surfaces.d.ts.map +1 -0
  116. package/core/surfaces.js +1917 -0
  117. package/core/terrain-elevation.d.ts +114 -0
  118. package/core/terrain-elevation.d.ts.map +1 -0
  119. package/core/terrain-elevation.js +150 -0
  120. package/core/types.d.ts +1355 -0
  121. package/core/types.d.ts.map +1 -0
  122. package/core/types.js +13 -0
  123. package/core/wfs-capabilities.d.ts +143 -0
  124. package/core/wfs-capabilities.d.ts.map +1 -0
  125. package/core/wfs-capabilities.js +478 -0
  126. package/core/wfs-filter.d.ts +118 -0
  127. package/core/wfs-filter.d.ts.map +1 -0
  128. package/core/wfs-filter.js +634 -0
  129. package/core/wfs.d.ts +219 -0
  130. package/core/wfs.d.ts.map +1 -0
  131. package/core/wfs.js +406 -0
  132. package/core/wire-shared.d.ts +32 -0
  133. package/core/wire-shared.d.ts.map +1 -0
  134. package/core/wire-shared.js +76 -0
  135. package/core/wms-axis.d.ts +36 -0
  136. package/core/wms-axis.d.ts.map +1 -0
  137. package/core/wms-axis.js +73 -0
  138. package/core/wms-capabilities.d.ts +110 -0
  139. package/core/wms-capabilities.d.ts.map +1 -0
  140. package/core/wms-capabilities.js +559 -0
  141. package/core/wms-types.d.ts +128 -0
  142. package/core/wms-types.d.ts.map +1 -0
  143. package/core/wms-types.js +32 -0
  144. package/core/wms.d.ts +144 -0
  145. package/core/wms.d.ts.map +1 -0
  146. package/core/wms.js +338 -0
  147. package/core/wmts-capabilities.d.ts +82 -0
  148. package/core/wmts-capabilities.d.ts.map +1 -0
  149. package/core/wmts-capabilities.js +402 -0
  150. package/core/wmts.d.ts +103 -0
  151. package/core/wmts.d.ts.map +1 -0
  152. package/core/wmts.js +332 -0
  153. package/core/xml-text.d.ts +20 -0
  154. package/core/xml-text.d.ts.map +1 -0
  155. package/core/xml-text.js +85 -0
  156. package/esri-compat/basemap-gallery.d.ts +38 -0
  157. package/esri-compat/basemap-gallery.d.ts.map +1 -0
  158. package/esri-compat/basemap-gallery.js +159 -0
  159. package/esri-compat/basemap-layer-list.d.ts +35 -0
  160. package/esri-compat/basemap-layer-list.d.ts.map +1 -0
  161. package/esri-compat/basemap-layer-list.js +139 -0
  162. package/esri-compat/basemap.d.ts +32 -0
  163. package/esri-compat/basemap.d.ts.map +1 -0
  164. package/esri-compat/basemap.js +84 -0
  165. package/esri-compat/bookmarks.d.ts +36 -0
  166. package/esri-compat/bookmarks.d.ts.map +1 -0
  167. package/esri-compat/bookmarks.js +108 -0
  168. package/esri-compat/class-breaks-renderer.d.ts +50 -0
  169. package/esri-compat/class-breaks-renderer.d.ts.map +1 -0
  170. package/esri-compat/class-breaks-renderer.js +164 -0
  171. package/esri-compat/color.d.ts +22 -0
  172. package/esri-compat/color.d.ts.map +1 -0
  173. package/esri-compat/color.js +106 -0
  174. package/esri-compat/controls.d.ts +174 -0
  175. package/esri-compat/controls.d.ts.map +1 -0
  176. package/esri-compat/controls.js +479 -0
  177. package/esri-compat/coordinate-conversion.d.ts +41 -0
  178. package/esri-compat/coordinate-conversion.d.ts.map +1 -0
  179. package/esri-compat/coordinate-conversion.js +125 -0
  180. package/esri-compat/directions.d.ts +45 -0
  181. package/esri-compat/directions.d.ts.map +1 -0
  182. package/esri-compat/directions.js +123 -0
  183. package/esri-compat/editor.d.ts +47 -0
  184. package/esri-compat/editor.d.ts.map +1 -0
  185. package/esri-compat/editor.js +170 -0
  186. package/esri-compat/esri-config.d.ts +16 -0
  187. package/esri-compat/esri-config.d.ts.map +1 -0
  188. package/esri-compat/esri-config.js +23 -0
  189. package/esri-compat/esri-request.d.ts +17 -0
  190. package/esri-compat/esri-request.d.ts.map +1 -0
  191. package/esri-compat/esri-request.js +127 -0
  192. package/esri-compat/event-bus.d.ts +106 -0
  193. package/esri-compat/event-bus.d.ts.map +1 -0
  194. package/esri-compat/event-bus.js +90 -0
  195. package/esri-compat/expand.d.ts +36 -0
  196. package/esri-compat/expand.d.ts.map +1 -0
  197. package/esri-compat/expand.js +97 -0
  198. package/esri-compat/extent.d.ts +43 -0
  199. package/esri-compat/extent.d.ts.map +1 -0
  200. package/esri-compat/extent.js +140 -0
  201. package/esri-compat/feature-filter.d.ts +55 -0
  202. package/esri-compat/feature-filter.d.ts.map +1 -0
  203. package/esri-compat/feature-filter.js +109 -0
  204. package/esri-compat/feature-form.d.ts +64 -0
  205. package/esri-compat/feature-form.d.ts.map +1 -0
  206. package/esri-compat/feature-form.js +137 -0
  207. package/esri-compat/feature-layer.d.ts +173 -0
  208. package/esri-compat/feature-layer.d.ts.map +1 -0
  209. package/esri-compat/feature-layer.js +661 -0
  210. package/esri-compat/feature-set.d.ts +32 -0
  211. package/esri-compat/feature-set.d.ts.map +1 -0
  212. package/esri-compat/feature-set.js +80 -0
  213. package/esri-compat/feature-table.d.ts +141 -0
  214. package/esri-compat/feature-table.d.ts.map +1 -0
  215. package/esri-compat/feature-table.js +500 -0
  216. package/esri-compat/feature-templates.d.ts +41 -0
  217. package/esri-compat/feature-templates.d.ts.map +1 -0
  218. package/esri-compat/feature-templates.js +97 -0
  219. package/esri-compat/feature.d.ts +33 -0
  220. package/esri-compat/feature.d.ts.map +1 -0
  221. package/esri-compat/feature.js +83 -0
  222. package/esri-compat/geojson-layer.d.ts +86 -0
  223. package/esri-compat/geojson-layer.d.ts.map +1 -0
  224. package/esri-compat/geojson-layer.js +191 -0
  225. package/esri-compat/geometry-engine.d.ts +107 -0
  226. package/esri-compat/geometry-engine.d.ts.map +1 -0
  227. package/esri-compat/geometry-engine.js +266 -0
  228. package/esri-compat/graphic.d.ts +46 -0
  229. package/esri-compat/graphic.d.ts.map +1 -0
  230. package/esri-compat/graphic.js +103 -0
  231. package/esri-compat/graphics-layer.d.ts +49 -0
  232. package/esri-compat/graphics-layer.d.ts.map +1 -0
  233. package/esri-compat/graphics-layer.js +185 -0
  234. package/esri-compat/group-layer.d.ts +48 -0
  235. package/esri-compat/group-layer.d.ts.map +1 -0
  236. package/esri-compat/group-layer.js +212 -0
  237. package/esri-compat/identify.d.ts +71 -0
  238. package/esri-compat/identify.d.ts.map +1 -0
  239. package/esri-compat/identify.js +299 -0
  240. package/esri-compat/identity-manager.d.ts +31 -0
  241. package/esri-compat/identity-manager.d.ts.map +1 -0
  242. package/esri-compat/identity-manager.js +115 -0
  243. package/esri-compat/imagery-layer.d.ts +78 -0
  244. package/esri-compat/imagery-layer.d.ts.map +1 -0
  245. package/esri-compat/imagery-layer.js +167 -0
  246. package/esri-compat/label-class.d.ts +31 -0
  247. package/esri-compat/label-class.d.ts.map +1 -0
  248. package/esri-compat/label-class.js +102 -0
  249. package/esri-compat/layer-list.d.ts +77 -0
  250. package/esri-compat/layer-list.d.ts.map +1 -0
  251. package/esri-compat/layer-list.js +342 -0
  252. package/esri-compat/legend.d.ts +53 -0
  253. package/esri-compat/legend.d.ts.map +1 -0
  254. package/esri-compat/legend.js +254 -0
  255. package/esri-compat/map-image-layer.d.ts +162 -0
  256. package/esri-compat/map-image-layer.d.ts.map +1 -0
  257. package/esri-compat/map-image-layer.js +709 -0
  258. package/esri-compat/map-view.d.ts +323 -0
  259. package/esri-compat/map-view.d.ts.map +1 -0
  260. package/esri-compat/map-view.js +1175 -0
  261. package/esri-compat/map.d.ts +47 -0
  262. package/esri-compat/map.d.ts.map +1 -0
  263. package/esri-compat/map.js +209 -0
  264. package/esri-compat/measurement-2d.d.ts +61 -0
  265. package/esri-compat/measurement-2d.d.ts.map +1 -0
  266. package/esri-compat/measurement-2d.js +184 -0
  267. package/esri-compat/measurement.d.ts +45 -0
  268. package/esri-compat/measurement.d.ts.map +1 -0
  269. package/esri-compat/measurement.js +193 -0
  270. package/esri-compat/oauth-info.d.ts +35 -0
  271. package/esri-compat/oauth-info.d.ts.map +1 -0
  272. package/esri-compat/oauth-info.js +115 -0
  273. package/esri-compat/picture-marker-symbol.d.ts +35 -0
  274. package/esri-compat/picture-marker-symbol.d.ts.map +1 -0
  275. package/esri-compat/picture-marker-symbol.js +126 -0
  276. package/esri-compat/point.d.ts +31 -0
  277. package/esri-compat/point.d.ts.map +1 -0
  278. package/esri-compat/point.js +102 -0
  279. package/esri-compat/polygon.d.ts +31 -0
  280. package/esri-compat/polygon.d.ts.map +1 -0
  281. package/esri-compat/polygon.js +107 -0
  282. package/esri-compat/polyline.d.ts +31 -0
  283. package/esri-compat/polyline.d.ts.map +1 -0
  284. package/esri-compat/polyline.js +107 -0
  285. package/esri-compat/popup-template.d.ts +55 -0
  286. package/esri-compat/popup-template.d.ts.map +1 -0
  287. package/esri-compat/popup-template.js +128 -0
  288. package/esri-compat/popup.d.ts +54 -0
  289. package/esri-compat/popup.d.ts.map +1 -0
  290. package/esri-compat/popup.js +312 -0
  291. package/esri-compat/print.d.ts +47 -0
  292. package/esri-compat/print.d.ts.map +1 -0
  293. package/esri-compat/print.js +105 -0
  294. package/esri-compat/query.d.ts +58 -0
  295. package/esri-compat/query.d.ts.map +1 -0
  296. package/esri-compat/query.js +128 -0
  297. package/esri-compat/reactive-utils.d.ts +24 -0
  298. package/esri-compat/reactive-utils.d.ts.map +1 -0
  299. package/esri-compat/reactive-utils.js +193 -0
  300. package/esri-compat/request.d.ts +41 -0
  301. package/esri-compat/request.d.ts.map +1 -0
  302. package/esri-compat/request.js +253 -0
  303. package/esri-compat/route-layer.d.ts +59 -0
  304. package/esri-compat/route-layer.d.ts.map +1 -0
  305. package/esri-compat/route-layer.js +223 -0
  306. package/esri-compat/route-task.d.ts +88 -0
  307. package/esri-compat/route-task.d.ts.map +1 -0
  308. package/esri-compat/route-task.js +225 -0
  309. package/esri-compat/scene-view.d.ts +41 -0
  310. package/esri-compat/scene-view.d.ts.map +1 -0
  311. package/esri-compat/scene-view.js +68 -0
  312. package/esri-compat/search.d.ts +112 -0
  313. package/esri-compat/search.d.ts.map +1 -0
  314. package/esri-compat/search.js +820 -0
  315. package/esri-compat/simple-fill-symbol.d.ts +27 -0
  316. package/esri-compat/simple-fill-symbol.d.ts.map +1 -0
  317. package/esri-compat/simple-fill-symbol.js +85 -0
  318. package/esri-compat/simple-line-symbol.d.ts +27 -0
  319. package/esri-compat/simple-line-symbol.d.ts.map +1 -0
  320. package/esri-compat/simple-line-symbol.js +85 -0
  321. package/esri-compat/simple-marker-symbol.d.ts +29 -0
  322. package/esri-compat/simple-marker-symbol.d.ts.map +1 -0
  323. package/esri-compat/simple-marker-symbol.js +92 -0
  324. package/esri-compat/simple-renderer.d.ts +29 -0
  325. package/esri-compat/simple-renderer.d.ts.map +1 -0
  326. package/esri-compat/simple-renderer.js +92 -0
  327. package/esri-compat/sketch.d.ts +64 -0
  328. package/esri-compat/sketch.d.ts.map +1 -0
  329. package/esri-compat/sketch.js +227 -0
  330. package/esri-compat/spatial-reference.d.ts +31 -0
  331. package/esri-compat/spatial-reference.d.ts.map +1 -0
  332. package/esri-compat/spatial-reference.js +102 -0
  333. package/esri-compat/swipe.d.ts +34 -0
  334. package/esri-compat/swipe.d.ts.map +1 -0
  335. package/esri-compat/swipe.js +93 -0
  336. package/esri-compat/table-list.d.ts +36 -0
  337. package/esri-compat/table-list.d.ts.map +1 -0
  338. package/esri-compat/table-list.js +126 -0
  339. package/esri-compat/text-symbol.d.ts +37 -0
  340. package/esri-compat/text-symbol.d.ts.map +1 -0
  341. package/esri-compat/text-symbol.js +123 -0
  342. package/esri-compat/tile-layer.d.ts +52 -0
  343. package/esri-compat/tile-layer.d.ts.map +1 -0
  344. package/esri-compat/tile-layer.js +168 -0
  345. package/esri-compat/time-slider.d.ts +70 -0
  346. package/esri-compat/time-slider.d.ts.map +1 -0
  347. package/esri-compat/time-slider.js +208 -0
  348. package/esri-compat/track.d.ts +51 -0
  349. package/esri-compat/track.d.ts.map +1 -0
  350. package/esri-compat/track.js +174 -0
  351. package/esri-compat/unique-value-renderer.d.ts +41 -0
  352. package/esri-compat/unique-value-renderer.d.ts.map +1 -0
  353. package/esri-compat/unique-value-renderer.js +127 -0
  354. package/esri-compat/url.d.ts +13 -0
  355. package/esri-compat/url.d.ts.map +1 -0
  356. package/esri-compat/url.js +68 -0
  357. package/esri-compat/vector-tile-layer.d.ts +47 -0
  358. package/esri-compat/vector-tile-layer.d.ts.map +1 -0
  359. package/esri-compat/vector-tile-layer.js +130 -0
  360. package/esri-compat/web-map.d.ts +14 -0
  361. package/esri-compat/web-map.d.ts.map +1 -0
  362. package/esri-compat/web-map.js +24 -0
  363. package/esri-compat/wfs-layer.d.ts +64 -0
  364. package/esri-compat/wfs-layer.d.ts.map +1 -0
  365. package/esri-compat/wfs-layer.js +145 -0
  366. package/esri-compat/wms-layer.d.ts +76 -0
  367. package/esri-compat/wms-layer.d.ts.map +1 -0
  368. package/esri-compat/wms-layer.js +157 -0
  369. package/exploration/context.d.ts +25 -0
  370. package/exploration/context.d.ts.map +1 -0
  371. package/exploration/context.js +396 -0
  372. package/exploration/index.d.ts +27 -0
  373. package/exploration/index.d.ts.map +1 -0
  374. package/exploration/index.js +24 -0
  375. package/exploration/presets.d.ts +27 -0
  376. package/exploration/presets.d.ts.map +1 -0
  377. package/exploration/presets.js +114 -0
  378. package/exploration/reducer.d.ts +23 -0
  379. package/exploration/reducer.d.ts.map +1 -0
  380. package/exploration/reducer.js +332 -0
  381. package/exploration/selection.d.ts +25 -0
  382. package/exploration/selection.d.ts.map +1 -0
  383. package/exploration/selection.js +34 -0
  384. package/exploration/selectors.d.ts +56 -0
  385. package/exploration/selectors.d.ts.map +1 -0
  386. package/exploration/selectors.js +110 -0
  387. package/exploration/types.d.ts +294 -0
  388. package/exploration/types.d.ts.map +1 -0
  389. package/exploration/types.js +33 -0
  390. package/expr/expression.d.ts +457 -0
  391. package/expr/expression.d.ts.map +1 -0
  392. package/expr/expression.js +663 -0
  393. package/expr/index.d.ts +32 -0
  394. package/expr/index.d.ts.map +1 -0
  395. package/expr/index.js +30 -0
  396. package/gen/honua/v1/feature_service_pb.d.ts +918 -0
  397. package/gen/honua/v1/feature_service_pb.d.ts.map +1 -0
  398. package/gen/honua/v1/feature_service_pb.js +375 -0
  399. package/generated-app/errors.d.ts +41 -0
  400. package/generated-app/errors.d.ts.map +1 -0
  401. package/generated-app/errors.js +41 -0
  402. package/generated-app/index.d.ts +17 -0
  403. package/generated-app/index.d.ts.map +1 -0
  404. package/generated-app/index.js +12 -0
  405. package/generated-app/manifest.d.ts +183 -0
  406. package/generated-app/manifest.d.ts.map +1 -0
  407. package/generated-app/manifest.js +14 -0
  408. package/generated-app/projection.d.ts +44 -0
  409. package/generated-app/projection.d.ts.map +1 -0
  410. package/generated-app/projection.js +234 -0
  411. package/generated-app/runtime.d.ts +215 -0
  412. package/generated-app/runtime.d.ts.map +1 -0
  413. package/generated-app/runtime.js +1196 -0
  414. package/interactions/detail-model.d.ts +54 -0
  415. package/interactions/detail-model.d.ts.map +1 -0
  416. package/interactions/detail-model.js +105 -0
  417. package/interactions/exploration-bindings.d.ts +120 -0
  418. package/interactions/exploration-bindings.d.ts.map +1 -0
  419. package/interactions/exploration-bindings.js +218 -0
  420. package/interactions/feature-state.d.ts +144 -0
  421. package/interactions/feature-state.d.ts.map +1 -0
  422. package/interactions/feature-state.js +169 -0
  423. package/interactions/hit-test.d.ts +112 -0
  424. package/interactions/hit-test.d.ts.map +1 -0
  425. package/interactions/hit-test.js +291 -0
  426. package/interactions/index.d.ts +31 -0
  427. package/interactions/index.d.ts.map +1 -0
  428. package/interactions/index.js +24 -0
  429. package/interactions/share-state.d.ts +36 -0
  430. package/interactions/share-state.d.ts.map +1 -0
  431. package/interactions/share-state.js +123 -0
  432. package/map/feature-service-adapter.d.ts +138 -0
  433. package/map/feature-service-adapter.d.ts.map +1 -0
  434. package/map/feature-service-adapter.js +279 -0
  435. package/map/honua-map.d.ts +203 -0
  436. package/map/honua-map.d.ts.map +1 -0
  437. package/map/honua-map.js +347 -0
  438. package/map/index.d.ts +27 -0
  439. package/map/index.d.ts.map +1 -0
  440. package/map/index.js +22 -0
  441. package/map/maplibre-target.d.ts +103 -0
  442. package/map/maplibre-target.d.ts.map +1 -0
  443. package/map/maplibre-target.js +164 -0
  444. package/map/webmap-maplibre.d.ts +60 -0
  445. package/map/webmap-maplibre.d.ts.map +1 -0
  446. package/map/webmap-maplibre.js +212 -0
  447. package/package.json +37 -0
  448. package/react/context.d.ts +32 -0
  449. package/react/context.d.ts.map +1 -0
  450. package/react/context.js +19 -0
  451. package/react/honua-layer.d.ts +35 -0
  452. package/react/honua-layer.d.ts.map +1 -0
  453. package/react/honua-layer.js +47 -0
  454. package/react/honua-map.d.ts +83 -0
  455. package/react/honua-map.d.ts.map +1 -0
  456. package/react/honua-map.js +109 -0
  457. package/react/honua-popup.d.ts +26 -0
  458. package/react/honua-popup.d.ts.map +1 -0
  459. package/react/honua-popup.js +34 -0
  460. package/react/hooks.d.ts +127 -0
  461. package/react/hooks.d.ts.map +1 -0
  462. package/react/hooks.js +206 -0
  463. package/react/index.d.ts +42 -0
  464. package/react/index.d.ts.map +1 -0
  465. package/react/index.js +34 -0
  466. package/react/provider.d.ts +36 -0
  467. package/react/provider.d.ts.map +1 -0
  468. package/react/provider.js +35 -0
  469. package/react/query-cache.d.ts +76 -0
  470. package/react/query-cache.d.ts.map +1 -0
  471. package/react/query-cache.js +188 -0
  472. package/runtime/diff.d.ts +31 -0
  473. package/runtime/diff.d.ts.map +1 -0
  474. package/runtime/diff.js +143 -0
  475. package/runtime/errors.d.ts +40 -0
  476. package/runtime/errors.d.ts.map +1 -0
  477. package/runtime/errors.js +35 -0
  478. package/runtime/index.d.ts +59 -0
  479. package/runtime/index.d.ts.map +1 -0
  480. package/runtime/index.js +43 -0
  481. package/runtime/legend.d.ts +23 -0
  482. package/runtime/legend.d.ts.map +1 -0
  483. package/runtime/legend.js +38 -0
  484. package/runtime/load-package.d.ts +125 -0
  485. package/runtime/load-package.d.ts.map +1 -0
  486. package/runtime/load-package.js +264 -0
  487. package/runtime/map-package-fetch.d.ts +107 -0
  488. package/runtime/map-package-fetch.d.ts.map +1 -0
  489. package/runtime/map-package-fetch.js +336 -0
  490. package/runtime/map-package-realtime.d.ts +169 -0
  491. package/runtime/map-package-realtime.d.ts.map +1 -0
  492. package/runtime/map-package-realtime.js +350 -0
  493. package/runtime/map-package-validation.d.ts +43 -0
  494. package/runtime/map-package-validation.d.ts.map +1 -0
  495. package/runtime/map-package-validation.js +269 -0
  496. package/runtime/map-package-watch.d.ts +78 -0
  497. package/runtime/map-package-watch.d.ts.map +1 -0
  498. package/runtime/map-package-watch.js +695 -0
  499. package/runtime/map-package.d.ts +167 -0
  500. package/runtime/map-package.d.ts.map +1 -0
  501. package/runtime/map-package.js +15 -0
  502. package/runtime/ogc-styles.d.ts +110 -0
  503. package/runtime/ogc-styles.d.ts.map +1 -0
  504. package/runtime/ogc-styles.js +195 -0
  505. package/runtime/popups.d.ts +62 -0
  506. package/runtime/popups.d.ts.map +1 -0
  507. package/runtime/popups.js +95 -0
  508. package/runtime/query-tiles.d.ts +217 -0
  509. package/runtime/query-tiles.d.ts.map +1 -0
  510. package/runtime/query-tiles.js +801 -0
  511. package/runtime/runtime.d.ts +243 -0
  512. package/runtime/runtime.d.ts.map +1 -0
  513. package/runtime/runtime.js +1147 -0
  514. package/runtime/source-bridge.d.ts +99 -0
  515. package/runtime/source-bridge.d.ts.map +1 -0
  516. package/runtime/source-bridge.js +401 -0
  517. package/runtime/style-compose.d.ts +46 -0
  518. package/runtime/style-compose.d.ts.map +1 -0
  519. package/runtime/style-compose.js +144 -0
  520. package/runtime/style-interactions.d.ts +141 -0
  521. package/runtime/style-interactions.d.ts.map +1 -0
  522. package/runtime/style-interactions.js +574 -0
  523. package/runtime/style-spec-validation.d.ts +23 -0
  524. package/runtime/style-spec-validation.d.ts.map +1 -0
  525. package/runtime/style-spec-validation.js +357 -0
  526. package/studio/capability-manifest.d.ts +285 -0
  527. package/studio/capability-manifest.d.ts.map +1 -0
  528. package/studio/capability-manifest.js +59 -0
  529. package/studio/chart-spec.d.ts +85 -0
  530. package/studio/chart-spec.d.ts.map +1 -0
  531. package/studio/chart-spec.js +106 -0
  532. package/studio/index.d.ts +34 -0
  533. package/studio/index.d.ts.map +1 -0
  534. package/studio/index.js +27 -0
  535. package/studio/provenance.d.ts +131 -0
  536. package/studio/provenance.d.ts.map +1 -0
  537. package/studio/provenance.js +39 -0
  538. package/studio/publish.d.ts +64 -0
  539. package/studio/publish.d.ts.map +1 -0
  540. package/studio/publish.js +13 -0
  541. package/studio/types.d.ts +278 -0
  542. package/studio/types.d.ts.map +1 -0
  543. package/studio/types.js +71 -0
  544. package/studio/validate.d.ts +45 -0
  545. package/studio/validate.d.ts.map +1 -0
  546. package/studio/validate.js +255 -0
  547. package/studio/validation.d.ts +112 -0
  548. package/studio/validation.d.ts.map +1 -0
  549. package/studio/validation.js +42 -0
  550. package/style/factory.d.ts +30 -0
  551. package/style/factory.d.ts.map +1 -0
  552. package/style/factory.js +61 -0
  553. package/style/index.d.ts +25 -0
  554. package/style/index.d.ts.map +1 -0
  555. package/style/index.js +24 -0
  556. package/style/specification.d.ts +203 -0
  557. package/style/specification.d.ts.map +1 -0
  558. package/style/specification.js +178 -0
  559. package/style/wms-wmts-resolvers.d.ts +38 -0
  560. package/style/wms-wmts-resolvers.d.ts.map +1 -0
  561. package/style/wms-wmts-resolvers.js +92 -0
  562. package/webmap/contract.d.ts +28 -0
  563. package/webmap/contract.d.ts.map +1 -0
  564. package/webmap/contract.js +130 -0
  565. package/webmap/convert-basemap.d.ts +17 -0
  566. package/webmap/convert-basemap.d.ts.map +1 -0
  567. package/webmap/convert-basemap.js +78 -0
  568. package/webmap/convert-extent.d.ts +17 -0
  569. package/webmap/convert-extent.d.ts.map +1 -0
  570. package/webmap/convert-extent.js +114 -0
  571. package/webmap/convert-label.d.ts +13 -0
  572. package/webmap/convert-label.d.ts.map +1 -0
  573. package/webmap/convert-label.js +125 -0
  574. package/webmap/convert-layer.d.ts +22 -0
  575. package/webmap/convert-layer.d.ts.map +1 -0
  576. package/webmap/convert-layer.js +181 -0
  577. package/webmap/convert-popup.d.ts +34 -0
  578. package/webmap/convert-popup.d.ts.map +1 -0
  579. package/webmap/convert-popup.js +68 -0
  580. package/webmap/convert-renderer.d.ts +17 -0
  581. package/webmap/convert-renderer.d.ts.map +1 -0
  582. package/webmap/convert-renderer.js +161 -0
  583. package/webmap/convert-symbol.d.ts +17 -0
  584. package/webmap/convert-symbol.d.ts.map +1 -0
  585. package/webmap/convert-symbol.js +122 -0
  586. package/webmap/index.d.ts +44 -0
  587. package/webmap/index.d.ts.map +1 -0
  588. package/webmap/index.js +33 -0
  589. package/webmap/parse.d.ts +25 -0
  590. package/webmap/parse.d.ts.map +1 -0
  591. package/webmap/parse.js +83 -0
  592. package/webmap/types.d.ts +264 -0
  593. package/webmap/types.d.ts.map +1 -0
  594. package/webmap/types.js +13 -0
  595. package/webmap/warnings.d.ts +30 -0
  596. package/webmap/warnings.d.ts.map +1 -0
  597. package/webmap/warnings.js +37 -0
@@ -0,0 +1,801 @@
1
+ /**
2
+ * Runtime helpers for query-backed vector tile sources.
3
+ *
4
+ * This module is MapLibre-shaped but does not import `maplibre-gl`.
5
+ * Callers can use the pure source-spec helpers, or the request controller
6
+ * when they need explicit viewport/tile lifecycle management outside
7
+ * MapLibre's built-in source loader.
8
+ *
9
+ * @module
10
+ */
11
+ import { assessAnalyticsSourcePushdown } from "../contract/analytics-sources.js";
12
+ import { buildQueryTileCacheKey, buildQueryTileServerPath, normalizeQueryTileKey, normalizeQueryTileSourceDescriptor, parseQueryTileFeatureDetailResponse, parseQueryTileJson, parseQueryTileServerErrorResponse, queryTileKeyString, queryTileServerRequestParamsFromDescriptor, stableJson, } from "../contract/tiles.js";
13
+ import { trimLeadingSlashes, trimTrailingSlashes } from "../core/path-utils.js";
14
+ export class QueryTileServerResponseError extends Error {
15
+ status;
16
+ url;
17
+ response;
18
+ body;
19
+ validators;
20
+ constructor(options) {
21
+ super(options.message);
22
+ this.name = "QueryTileServerResponseError";
23
+ this.status = options.status;
24
+ this.url = options.url;
25
+ this.response = options.response;
26
+ this.body = options.body;
27
+ this.validators = options.validators ?? {};
28
+ }
29
+ }
30
+ const WEB_MERCATOR_LAT_LIMIT = 85.05112878;
31
+ const DEFAULT_MAX_VIEWPORT_TILES = 1024;
32
+ const MAX_SAFE_TILE_ZOOM = 30;
33
+ const DEFAULT_VIEWPORT_FETCH_CONCURRENCY = 8;
34
+ const TILE_PUSHDOWN_PROTOCOLS = new Set([
35
+ "ogc-tiles",
36
+ "wmts",
37
+ "maplibre-vector",
38
+ "maplibre-raster",
39
+ "geoservices-map-service",
40
+ ]);
41
+ const QUERY_FALLBACK_PROTOCOLS = new Set([
42
+ "grpc",
43
+ "geoservices-feature-service",
44
+ "geoservices-map-service",
45
+ "geoservices-image-service",
46
+ "ogc-features",
47
+ "ogc-records",
48
+ "stac",
49
+ "wfs",
50
+ "wms",
51
+ "odata",
52
+ ]);
53
+ /** Build a MapLibre-compatible TileJSON document from a query tile descriptor. */
54
+ export function buildQueryTileJson(descriptor, options = {}) {
55
+ const normalized = normalizeQueryTileSourceDescriptor(descriptor);
56
+ const tilejson = normalized.tilejson;
57
+ const tiles = tilejson?.tiles?.length ? tilejson.tiles : [buildQueryTileUrlTemplate(normalized, options)];
58
+ return {
59
+ tilejson: "3.0.0",
60
+ ...tilejson,
61
+ tiles,
62
+ name: tilejson?.name ?? normalized.id,
63
+ attribution: tilejson?.attribution ?? normalized.attribution,
64
+ scheme: tilejson?.scheme ?? normalized.scheme,
65
+ minzoom: tilejson?.minzoom ?? normalized.minzoom,
66
+ maxzoom: tilejson?.maxzoom ?? normalized.maxzoom,
67
+ bounds: tilejson?.bounds ?? normalized.bounds,
68
+ vector_layers: tilejson?.vector_layers ?? [
69
+ {
70
+ id: normalized.sourceId,
71
+ fields: fieldsToTileJson(normalized.projection?.fields),
72
+ minzoom: normalized.minzoom,
73
+ maxzoom: normalized.maxzoom,
74
+ },
75
+ ],
76
+ };
77
+ }
78
+ /** Build a MapLibre vector source spec using TileJSON URL or inline tile template metadata. */
79
+ export function buildMapLibreQueryTileSourceSpec(descriptor, options = {}) {
80
+ const normalized = normalizeQueryTileSourceDescriptor(descriptor);
81
+ const endpoint = { ...(normalized.endpoint ?? {}), ...(options.endpoint ?? {}) };
82
+ const promoteId = promoteIdFromIdentity(normalized.featureIdentity);
83
+ if (options.useTileJsonUrl !== false && endpoint.tilejsonUrl) {
84
+ return {
85
+ type: "vector",
86
+ url: endpoint.tilejsonUrl,
87
+ ...(promoteId ? { promoteId } : {}),
88
+ ...(options.volatile !== undefined ? { volatile: options.volatile } : {}),
89
+ };
90
+ }
91
+ const tilejson = buildQueryTileJson(normalized, options);
92
+ return {
93
+ type: "vector",
94
+ tiles: [...tilejson.tiles],
95
+ scheme: tilejson.scheme,
96
+ tileSize: normalized.tileSize,
97
+ minzoom: tilejson.minzoom,
98
+ maxzoom: tilejson.maxzoom,
99
+ bounds: tilejson.bounds,
100
+ attribution: tilejson.attribution,
101
+ ...(promoteId ? { promoteId } : {}),
102
+ ...(options.volatile !== undefined ? { volatile: options.volatile } : {}),
103
+ };
104
+ }
105
+ /** Build a URL template with MapLibre `{z}` / `{x}` / `{y}` placeholders. */
106
+ export function buildQueryTileUrlTemplate(descriptor, options = {}) {
107
+ const normalized = normalizeQueryTileSourceDescriptor(descriptor);
108
+ const endpoint = { ...(normalized.endpoint ?? {}), ...(options.endpoint ?? {}) };
109
+ if (endpoint.urlTemplate)
110
+ return endpoint.urlTemplate;
111
+ if (normalized.tilejson?.tiles?.[0])
112
+ return normalized.tilejson.tiles[0];
113
+ const baseUrl = endpoint.baseUrl ?? normalized.source?.locator.url;
114
+ if (!baseUrl) {
115
+ throw new Error(`query tile descriptor "${normalized.id}" is missing endpoint.baseUrl or endpoint.urlTemplate`);
116
+ }
117
+ const path = endpoint.path ??
118
+ buildQueryTileServerPath("tile", {
119
+ sourceId: normalized.sourceId,
120
+ routePrefix: "",
121
+ format: normalized.format ?? "mvt",
122
+ });
123
+ const normalizedPath = trimLeadingSlashes(path);
124
+ const url = joinUrl(baseUrl, normalizedPath);
125
+ const params = {
126
+ ...queryTileServerRequestParamsFromDescriptor(normalized, {
127
+ params: options.includeCacheKey
128
+ ? { cacheKey: buildQueryTileCacheKey(normalized, { z: 0, x: 0, y: 0 }, { cache: options.cache }) }
129
+ : undefined,
130
+ }),
131
+ ...(options.extraParams ?? {}),
132
+ };
133
+ return appendParams(url, params);
134
+ }
135
+ /** Substitute one normalized tile key into a query tile URL template. */
136
+ export function buildQueryTileUrl(descriptor, tileKey, options = {}) {
137
+ const key = normalizeQueryTileKey(tileKey);
138
+ return buildQueryTileUrlTemplate(descriptor, options)
139
+ .replaceAll("{z}", String(key.z))
140
+ .replaceAll("{x}", String(key.x))
141
+ .replaceAll("{y}", String(key.y))
142
+ .replaceAll("{tileMatrix}", String(key.z))
143
+ .replaceAll("{tileCol}", String(key.x))
144
+ .replaceAll("{tileRow}", String(key.y));
145
+ }
146
+ /** Fetch and validate TileJSON from a dynamic query tile server. */
147
+ export async function fetchQueryTileJson(descriptor, options = {}) {
148
+ const normalized = normalizeQueryTileSourceDescriptor(descriptor);
149
+ const url = options.url ?? buildQueryTileJsonRequestUrl(normalized, options);
150
+ const response = await queryTileFetch(options)(url, {
151
+ method: "GET",
152
+ headers: queryTileRequestHeaders("application/json", options),
153
+ signal: options.signal,
154
+ credentials: options.credentials,
155
+ });
156
+ const validators = queryTileValidatorsFromHeaders(response.headers);
157
+ if (response.status === 304) {
158
+ return { url, status: response.status, notModified: true, validators };
159
+ }
160
+ const body = await readJsonBody(response);
161
+ if (!response.ok) {
162
+ throw queryTileServerResponseError(url, response.status, body, validators);
163
+ }
164
+ const tilejson = parseQueryTileJson(body);
165
+ return {
166
+ url,
167
+ status: response.status,
168
+ notModified: false,
169
+ validators,
170
+ tilejson,
171
+ degraded: tilejson["honua:queryTiles"]?.degraded,
172
+ };
173
+ }
174
+ /** Fetch and validate a source-qualified feature-detail response from a query tile server. */
175
+ export async function fetchQueryTileFeatureDetail(descriptor, target, options = {}) {
176
+ const normalized = normalizeQueryTileSourceDescriptor(descriptor);
177
+ const url = options.url ?? buildQueryTileFeatureDetailRequestUrl(normalized, target, options);
178
+ const response = await queryTileFetch(options)(url, {
179
+ method: "GET",
180
+ headers: queryTileRequestHeaders("application/json", options),
181
+ signal: options.signal,
182
+ credentials: options.credentials,
183
+ });
184
+ const validators = queryTileValidatorsFromHeaders(response.headers);
185
+ if (response.status === 304) {
186
+ return { url, status: response.status, notModified: true, validators };
187
+ }
188
+ const body = await readJsonBody(response);
189
+ if (!response.ok) {
190
+ throw queryTileServerResponseError(url, response.status, body, validators);
191
+ }
192
+ const detail = parseQueryTileFeatureDetailResponse(body);
193
+ return {
194
+ url,
195
+ status: response.status,
196
+ notModified: false,
197
+ validators,
198
+ detail,
199
+ degraded: detail.degraded,
200
+ };
201
+ }
202
+ /** Compute visible XYZ tiles for a WGS84 bounds + zoom viewport. */
203
+ export function queryTilesForViewport(viewport) {
204
+ const { z, ranges, maxTiles } = normalizedViewportTileRanges(viewport);
205
+ const cardinality = tileRangeCardinality(ranges);
206
+ if (cardinality > maxTiles) {
207
+ throw new Error(`viewport resolves to ${cardinality} tiles, exceeding maxTiles=${maxTiles}`);
208
+ }
209
+ const out = [];
210
+ const seen = new Set();
211
+ for (const range of ranges) {
212
+ for (let x = range.minX; x <= range.maxX; x += 1) {
213
+ for (let y = range.minY; y <= range.maxY; y += 1) {
214
+ const tile = normalizeQueryTileKey({ z, x, y });
215
+ const id = stableJson(tile);
216
+ if (seen.has(id))
217
+ continue;
218
+ seen.add(id);
219
+ if (out.length >= maxTiles) {
220
+ throw new Error(`viewport resolves to more than maxTiles=${maxTiles} tiles`);
221
+ }
222
+ out.push(tile);
223
+ }
224
+ }
225
+ }
226
+ return out;
227
+ }
228
+ /** Diagnose protocol support, fallback behavior, and cache observability gaps. */
229
+ export function diagnoseQueryTileSourceSupport(descriptor) {
230
+ const normalized = normalizeQueryTileSourceDescriptor(descriptor);
231
+ const protocol = normalized.protocol;
232
+ const diagnostics = [];
233
+ const base = {
234
+ sourceId: normalized.sourceId,
235
+ descriptorId: normalized.id,
236
+ ...(protocol ? { protocol } : {}),
237
+ };
238
+ const hasEndpoint = Boolean(normalized.endpoint?.urlTemplate) ||
239
+ Boolean(normalized.endpoint?.baseUrl) ||
240
+ Boolean(normalized.endpoint?.tilejsonUrl) ||
241
+ Boolean(normalized.tilejson?.tiles?.length) ||
242
+ Boolean(normalized.source?.locator.url);
243
+ if (!hasEndpoint) {
244
+ diagnostics.push({
245
+ ...base,
246
+ severity: "error",
247
+ code: "missing-tile-endpoint",
248
+ message: "query tile source has no urlTemplate, tilejson, baseUrl, or source locator URL",
249
+ });
250
+ }
251
+ if (!protocol) {
252
+ if (normalized.analyticsSource) {
253
+ const assessment = assessAnalyticsSourcePushdown(normalized.analyticsSource, "tiles", {
254
+ operation: "tiles",
255
+ cache: normalized.analyticsSource.cache?.key,
256
+ });
257
+ diagnostics.push({
258
+ ...base,
259
+ severity: assessment.supported ? "info" : "warning",
260
+ code: assessment.supported ? "analytics-tile-pushdown-supported" : "analytics-tile-pushdown-unavailable",
261
+ capability: "tiles",
262
+ message: assessment.supported
263
+ ? `analytics source "${normalized.analyticsSource.id}" advertises tile pushdown`
264
+ : (assessment.degraded?.[0]?.reason ??
265
+ `analytics source "${normalized.analyticsSource.id}" lacks tile pushdown`),
266
+ });
267
+ if (normalized.analyticsSource.fallback?.mode === "disabled") {
268
+ diagnostics.push({
269
+ ...base,
270
+ severity: "info",
271
+ code: "client-materialization-disabled",
272
+ capability: "query",
273
+ message: "analytics source disables unbounded browser materialization",
274
+ });
275
+ }
276
+ }
277
+ else {
278
+ diagnostics.push({
279
+ ...base,
280
+ severity: "warning",
281
+ code: "unsupported-protocol",
282
+ message: "query tile source has no protocol metadata; server pushdown cannot be inferred",
283
+ });
284
+ }
285
+ }
286
+ else if (TILE_PUSHDOWN_PROTOCOLS.has(protocol)) {
287
+ diagnostics.push({
288
+ ...base,
289
+ severity: "info",
290
+ code: "tile-pushdown-supported",
291
+ capability: "tiles",
292
+ message: `protocol "${protocol}" advertises first-party tile/render support`,
293
+ });
294
+ }
295
+ else if (QUERY_FALLBACK_PROTOCOLS.has(protocol)) {
296
+ diagnostics.push({
297
+ ...base,
298
+ severity: normalized.fallback?.mode === "disabled" ? "error" : "warning",
299
+ code: normalized.fallback?.mode === "disabled" ? "fallback-disabled" : "tile-pushdown-unavailable",
300
+ capability: "tiles",
301
+ message: normalized.fallback?.mode === "disabled"
302
+ ? `protocol "${protocol}" does not support tile pushdown and fallback is disabled`
303
+ : `protocol "${protocol}" needs a query-backed tile endpoint or viewport-bounded fallback`,
304
+ });
305
+ if (normalized.fallback && normalized.fallback.mode !== "disabled") {
306
+ diagnostics.push({
307
+ ...base,
308
+ severity: "warning",
309
+ code: "fallback-enabled",
310
+ capability: "query",
311
+ message: normalized.fallback.reason ?? `fallback mode "${normalized.fallback.mode}" is enabled`,
312
+ });
313
+ }
314
+ }
315
+ else {
316
+ diagnostics.push({
317
+ ...base,
318
+ severity: "error",
319
+ code: "unsupported-protocol",
320
+ message: `protocol "${protocol}" cannot serve query tiles or query fallback requests`,
321
+ });
322
+ }
323
+ const cacheKey = normalized.cache?.key;
324
+ if (!cacheKey?.sourceVersion || !cacheKey.authorizationScope) {
325
+ diagnostics.push({
326
+ ...base,
327
+ severity: "warning",
328
+ code: "missing-cache-scope",
329
+ message: "tile cache key should include sourceVersion and authorizationScope",
330
+ });
331
+ }
332
+ if (normalized.cache?.maxEntries === undefined) {
333
+ diagnostics.push({
334
+ ...base,
335
+ severity: "warning",
336
+ code: "unbounded-cache",
337
+ message: "tile cache maxEntries is not set on the descriptor",
338
+ });
339
+ }
340
+ return diagnostics;
341
+ }
342
+ export function createQueryTileRequestController(descriptor, options) {
343
+ return new QueryTileRequestController(descriptor, options);
344
+ }
345
+ /** Viewport-aware tile request manager with abortable inflight requests and bounded cache. */
346
+ export class QueryTileRequestController {
347
+ descriptor;
348
+ #fetchTile;
349
+ #cachePolicy;
350
+ #onEvent;
351
+ #cache = new Map();
352
+ #inflight = new Map();
353
+ constructor(descriptor, options) {
354
+ this.descriptor = normalizeQueryTileSourceDescriptor(descriptor);
355
+ this.#fetchTile = options.fetchTile;
356
+ this.#cachePolicy = { ...(this.descriptor.cache ?? {}), ...(options.cache ?? {}) };
357
+ this.#onEvent = options.onEvent;
358
+ }
359
+ requestTile(tileKey, options = {}) {
360
+ const key = normalizeQueryTileKey(tileKey);
361
+ const cacheKey = this.#cacheKey(key, options.cache);
362
+ const cached = this.#cache.get(cacheKey);
363
+ const now = Date.now();
364
+ const cacheEnabled = this.#cacheEnabled(options.cache);
365
+ if (cacheEnabled && cached && this.#isFresh(cached, now)) {
366
+ cached.lastAccessedAt = now;
367
+ this.#emit({ type: "tile-cache-hit", ...this.#eventBase(key, cacheKey), value: cached.value });
368
+ return Promise.resolve(cached.value);
369
+ }
370
+ if (cached)
371
+ this.#evict(cacheKey, cached, "invalidate");
372
+ const inflight = this.#inflight.get(cacheKey);
373
+ if (inflight)
374
+ return inflight.promise;
375
+ const controller = new AbortController();
376
+ const cleanup = linkAbortSignals(controller, options.signal);
377
+ const url = buildQueryTileUrl(this.descriptor, key, { cache: options.cache });
378
+ const request = {
379
+ descriptor: this.descriptor,
380
+ tileKey: key,
381
+ cacheKey,
382
+ url,
383
+ signal: controller.signal,
384
+ };
385
+ this.#emit({ type: "tile-requested", ...this.#eventBase(key, cacheKey), url });
386
+ const promise = this.#fetchTile(request)
387
+ .then((value) => {
388
+ if (controller.signal.aborted) {
389
+ this.#emit({
390
+ type: "tile-aborted",
391
+ ...this.#eventBase(key, cacheKey),
392
+ reason: controller.signal.reason,
393
+ });
394
+ throw abortError(controller.signal.reason);
395
+ }
396
+ if (cacheEnabled) {
397
+ this.#cache.set(cacheKey, {
398
+ value,
399
+ tileKey: key,
400
+ createdAt: Date.now(),
401
+ lastAccessedAt: Date.now(),
402
+ });
403
+ this.#enforceMaxEntries();
404
+ }
405
+ this.#emit({ type: "tile-loaded", ...this.#eventBase(key, cacheKey), value });
406
+ return value;
407
+ })
408
+ .catch((error) => {
409
+ if (controller.signal.aborted || isAbortError(error)) {
410
+ this.#emit({
411
+ type: "tile-aborted",
412
+ ...this.#eventBase(key, cacheKey),
413
+ reason: controller.signal.reason ?? error,
414
+ });
415
+ }
416
+ else {
417
+ this.#emit({ type: "tile-error", ...this.#eventBase(key, cacheKey), error });
418
+ }
419
+ throw error;
420
+ })
421
+ .finally(() => {
422
+ cleanup();
423
+ this.#inflight.delete(cacheKey);
424
+ });
425
+ this.#inflight.set(cacheKey, { promise, controller, tileKey: key, cacheKey });
426
+ return promise;
427
+ }
428
+ async requestViewport(viewport, options = {}) {
429
+ const tiles = queryTilesForViewport(viewport);
430
+ const visibleCacheKeys = new Set(tiles.map((tile) => this.#cacheKey(tile, options.cache)));
431
+ if (options.abortOutOfViewport !== false) {
432
+ for (const [cacheKey, entry] of this.#inflight) {
433
+ if (!visibleCacheKeys.has(cacheKey))
434
+ entry.controller.abort("out-of-viewport");
435
+ }
436
+ }
437
+ const results = await allSettledLimited(tiles, normalizeConcurrency(options.concurrency, DEFAULT_VIEWPORT_FETCH_CONCURRENCY), (tile) => this.requestTile(tile, options));
438
+ return {
439
+ viewport,
440
+ tiles,
441
+ results,
442
+ diagnostics: this.diagnostics(),
443
+ };
444
+ }
445
+ abort(tileKey, reason = "aborted") {
446
+ if (!tileKey) {
447
+ for (const entry of this.#inflight.values())
448
+ entry.controller.abort(reason);
449
+ return;
450
+ }
451
+ const normalized = normalizeQueryTileKey(tileKey);
452
+ for (const entry of this.#inflight.values()) {
453
+ if (sameTile(entry.tileKey, normalized))
454
+ entry.controller.abort(reason);
455
+ }
456
+ }
457
+ invalidate(predicate) {
458
+ let count = 0;
459
+ for (const [cacheKey, entry] of this.#cache) {
460
+ if (!predicate || predicate({ cacheKey, tileKey: entry.tileKey, value: entry.value })) {
461
+ this.#evict(cacheKey, entry, "invalidate");
462
+ count += 1;
463
+ }
464
+ }
465
+ return count;
466
+ }
467
+ clearCache() {
468
+ for (const [cacheKey, entry] of this.#cache) {
469
+ this.#evict(cacheKey, entry, "clear");
470
+ }
471
+ }
472
+ dispose() {
473
+ this.abort(undefined, "disposed");
474
+ this.clearCache();
475
+ }
476
+ cacheSnapshot() {
477
+ return {
478
+ entries: this.#cache.size,
479
+ inflight: this.#inflight.size,
480
+ maxEntries: this.#cachePolicy.maxEntries,
481
+ tileKeys: [...this.#cache.values()].map((entry) => queryTileKeyString(entry.tileKey)),
482
+ };
483
+ }
484
+ diagnostics() {
485
+ return diagnoseQueryTileSourceSupport({
486
+ ...this.descriptor,
487
+ cache: { ...(this.descriptor.cache ?? {}), ...this.#cachePolicy },
488
+ });
489
+ }
490
+ #cacheKey(tileKey, cache) {
491
+ return buildQueryTileCacheKey(this.descriptor, tileKey, { cache });
492
+ }
493
+ #cacheEnabled(cache) {
494
+ const key = { ...(this.descriptor.cache?.key ?? {}), ...(cache ?? {}) };
495
+ return typeof key.authorizationScope === "string" && key.authorizationScope.length > 0;
496
+ }
497
+ #isFresh(entry, now) {
498
+ const ttlMs = this.#cachePolicy.ttlMs;
499
+ return ttlMs === undefined || now - entry.createdAt <= ttlMs;
500
+ }
501
+ #enforceMaxEntries() {
502
+ const maxEntries = this.#cachePolicy.maxEntries;
503
+ if (maxEntries === undefined || maxEntries < 0)
504
+ return;
505
+ while (this.#cache.size > maxEntries) {
506
+ const lru = [...this.#cache.entries()].sort((a, b) => a[1].lastAccessedAt - b[1].lastAccessedAt)[0];
507
+ if (!lru)
508
+ return;
509
+ this.#evict(lru[0], lru[1], "lru");
510
+ }
511
+ }
512
+ #evict(cacheKey, entry, reason) {
513
+ if (!this.#cache.delete(cacheKey))
514
+ return;
515
+ this.#emit({ type: "tile-evicted", ...this.#eventBase(entry.tileKey, cacheKey), reason });
516
+ }
517
+ #eventBase(tileKey, cacheKey) {
518
+ return {
519
+ descriptorId: this.descriptor.id,
520
+ sourceId: this.descriptor.sourceId,
521
+ tileKey,
522
+ cacheKey,
523
+ };
524
+ }
525
+ #emit(event) {
526
+ this.#onEvent?.(event);
527
+ }
528
+ }
529
+ function fieldsToTileJson(fields) {
530
+ if (!fields || fields.length === 0)
531
+ return undefined;
532
+ return Object.fromEntries(fields.map((field) => [field, "String"]));
533
+ }
534
+ function promoteIdFromIdentity(identity) {
535
+ if (identity?.promoteId)
536
+ return identity.promoteId;
537
+ if (typeof identity?.idProperty === "string")
538
+ return identity.idProperty;
539
+ return undefined;
540
+ }
541
+ function buildQueryTileJsonRequestUrl(descriptor, options) {
542
+ const endpoint = { ...(descriptor.endpoint ?? {}), ...(options.endpoint ?? {}) };
543
+ if (options.url)
544
+ return options.url;
545
+ if (endpoint.tilejsonUrl)
546
+ return appendParams(endpoint.tilejsonUrl, {
547
+ ...queryTileServerRequestParamsFromDescriptor(descriptor, { params: options.params }),
548
+ ...(options.extraParams ?? {}),
549
+ });
550
+ const baseUrl = endpoint.baseUrl ?? descriptor.source?.locator.url;
551
+ if (!baseUrl) {
552
+ throw new Error(`query tile descriptor "${descriptor.id}" is missing endpoint.baseUrl or endpoint.tilejsonUrl`);
553
+ }
554
+ const path = buildQueryTileServerPath("tilejson", {
555
+ sourceId: descriptor.sourceId,
556
+ routePrefix: options.routePrefix ?? "",
557
+ });
558
+ return appendParams(joinUrl(baseUrl, path), {
559
+ ...queryTileServerRequestParamsFromDescriptor(descriptor, { params: options.params }),
560
+ ...(options.extraParams ?? {}),
561
+ });
562
+ }
563
+ function buildQueryTileFeatureDetailRequestUrl(descriptor, target, options) {
564
+ const detailTemplate = descriptor.tilejson?.["honua:queryTiles"]?.detailUrlTemplate;
565
+ const baseUrl = descriptor.endpoint?.baseUrl ?? descriptor.source?.locator.url;
566
+ const url = detailTemplate
567
+ ? substituteFeatureDetailTemplate(detailTemplate, target)
568
+ : baseUrl
569
+ ? joinUrl(baseUrl, buildQueryTileServerPath("feature-detail", {
570
+ sourceId: target.sourceId || descriptor.sourceId,
571
+ featureId: target.id,
572
+ routePrefix: options.routePrefix ?? "",
573
+ }))
574
+ : undefined;
575
+ if (!url) {
576
+ throw new Error(`query tile descriptor "${descriptor.id}" is missing detailUrlTemplate or endpoint.baseUrl`);
577
+ }
578
+ return appendParams(url, { ...(options.params ?? {}), ...(options.extraParams ?? {}) });
579
+ }
580
+ function substituteFeatureDetailTemplate(template, target) {
581
+ return template
582
+ .replaceAll("{sourceId}", encodeURIComponent(target.sourceId))
583
+ .replaceAll("{featureId}", encodeURIComponent(String(target.id)))
584
+ .replaceAll("{id}", encodeURIComponent(String(target.id)))
585
+ .replaceAll("{sourceLayer}", encodeURIComponent(target.sourceLayer ?? ""));
586
+ }
587
+ function queryTileFetch(options) {
588
+ const fetchImpl = options.fetch ?? globalThis.fetch?.bind(globalThis);
589
+ if (!fetchImpl)
590
+ throw new Error("fetch is required to request query tile server resources");
591
+ return fetchImpl;
592
+ }
593
+ function queryTileRequestHeaders(accept, options) {
594
+ const headers = new Headers(options.headers);
595
+ if (!headers.has("Accept"))
596
+ headers.set("Accept", accept);
597
+ if (options.validators?.etag && !headers.has("If-None-Match")) {
598
+ headers.set("If-None-Match", options.validators.etag);
599
+ }
600
+ if (options.validators?.lastModified && !headers.has("If-Modified-Since")) {
601
+ headers.set("If-Modified-Since", options.validators.lastModified);
602
+ }
603
+ return headers;
604
+ }
605
+ function queryTileValidatorsFromHeaders(headers) {
606
+ return stripUndefined({
607
+ etag: headers.get("ETag") ?? undefined,
608
+ lastModified: headers.get("Last-Modified") ?? undefined,
609
+ cacheControl: headers.get("Cache-Control") ?? undefined,
610
+ expires: headers.get("Expires") ?? undefined,
611
+ vary: headers.get("Vary") ?? undefined,
612
+ sourceVersion: headers.get("X-Honua-Source-Version") ?? undefined,
613
+ });
614
+ }
615
+ async function readJsonBody(response) {
616
+ const text = await response.text();
617
+ if (text.length === 0)
618
+ return undefined;
619
+ return JSON.parse(text);
620
+ }
621
+ function queryTileServerResponseError(url, status, body, validators) {
622
+ let errorResponse;
623
+ try {
624
+ errorResponse = parseQueryTileServerErrorResponse(body);
625
+ }
626
+ catch {
627
+ errorResponse = undefined;
628
+ }
629
+ return new QueryTileServerResponseError({
630
+ status,
631
+ url,
632
+ response: errorResponse,
633
+ body,
634
+ validators,
635
+ message: errorResponse?.error.message ?? `query tile server request failed with HTTP ${status}`,
636
+ });
637
+ }
638
+ function joinUrl(baseUrl, path) {
639
+ const [basePath, query = ""] = baseUrl.split("?", 2);
640
+ const joined = `${trimTrailingSlashes(basePath)}/${trimLeadingSlashes(path)}`;
641
+ return query ? `${joined}?${query}` : joined;
642
+ }
643
+ function appendParams(url, params) {
644
+ const searchParams = new URLSearchParams();
645
+ for (const [key, value] of Object.entries(params)) {
646
+ const serialized = urlParamValue(value);
647
+ if (serialized === undefined)
648
+ continue;
649
+ searchParams.set(key, serialized);
650
+ }
651
+ const query = searchParams.toString();
652
+ if (!query)
653
+ return url;
654
+ return `${url}${url.includes("?") ? "&" : "?"}${query}`;
655
+ }
656
+ function urlParamValue(value) {
657
+ if (value === undefined || value === null)
658
+ return undefined;
659
+ if (Array.isArray(value))
660
+ return value.join(",");
661
+ if (typeof value === "object")
662
+ return stableJson(value);
663
+ return String(value);
664
+ }
665
+ function stripUndefined(value) {
666
+ const out = {};
667
+ for (const [key, entry] of Object.entries(value)) {
668
+ if (entry !== undefined)
669
+ out[key] = entry;
670
+ }
671
+ return out;
672
+ }
673
+ function normalizedViewportTileRanges(viewport) {
674
+ validateViewport(viewport);
675
+ const z = clampZoom(Math.floor(viewport.zoom), viewport.minzoom, viewport.maxzoom);
676
+ if (!Number.isSafeInteger(z) || z < 0 || z > MAX_SAFE_TILE_ZOOM) {
677
+ throw new Error(`viewport zoom ${z} exceeds safe tile zoom ${MAX_SAFE_TILE_ZOOM}`);
678
+ }
679
+ const maxTiles = Math.trunc(viewport.maxTiles ?? DEFAULT_MAX_VIEWPORT_TILES);
680
+ return {
681
+ z,
682
+ ranges: tileRangesForBounds(viewport.bounds, z),
683
+ maxTiles,
684
+ };
685
+ }
686
+ function validateViewport(viewport) {
687
+ if (!Array.isArray(viewport.bounds) || viewport.bounds.length !== 4) {
688
+ throw new Error("viewport bounds must be [west, south, east, north]");
689
+ }
690
+ if (viewport.bounds.some((value) => typeof value !== "number" || !Number.isFinite(value))) {
691
+ throw new Error("viewport bounds must contain finite numbers");
692
+ }
693
+ const [west, south, east, north] = viewport.bounds;
694
+ if (south > north) {
695
+ throw new Error("viewport bounds south must be <= north");
696
+ }
697
+ if (west < -360 || west > 360 || east < -360 || east > 360 || south < -90 || north > 90) {
698
+ throw new Error("viewport bounds exceed supported WGS84 ranges");
699
+ }
700
+ for (const [name, value] of [
701
+ ["zoom", viewport.zoom],
702
+ ["minzoom", viewport.minzoom],
703
+ ["maxzoom", viewport.maxzoom],
704
+ ["maxTiles", viewport.maxTiles],
705
+ ]) {
706
+ if (value !== undefined && (typeof value !== "number" || !Number.isFinite(value))) {
707
+ throw new Error(`viewport ${name} must be finite`);
708
+ }
709
+ }
710
+ if (viewport.maxTiles !== undefined && viewport.maxTiles < 1) {
711
+ throw new Error("viewport maxTiles must be >= 1");
712
+ }
713
+ }
714
+ function clampZoom(zoom, minzoom, maxzoom) {
715
+ const min = minzoom ?? 0;
716
+ const max = maxzoom ?? 24;
717
+ return Math.min(max, Math.max(min, zoom));
718
+ }
719
+ function tileRangesForBounds(bounds, z) {
720
+ const [west, south, east, north] = bounds;
721
+ if (west <= east)
722
+ return [tileRangeForNormalizedBounds(west, south, east, north, z)];
723
+ return [
724
+ tileRangeForNormalizedBounds(west, south, 180, north, z),
725
+ tileRangeForNormalizedBounds(-180, south, east, north, z),
726
+ ];
727
+ }
728
+ function tileRangeForNormalizedBounds(west, south, east, north, z) {
729
+ const tileCount = 2 ** z;
730
+ const minX = lonToTileX(west, z);
731
+ const maxX = lonToTileX(east, z);
732
+ const minY = latToTileY(north, z);
733
+ const maxY = latToTileY(south, z);
734
+ return {
735
+ minX: Math.max(0, Math.min(tileCount - 1, Math.min(minX, maxX))),
736
+ maxX: Math.max(0, Math.min(tileCount - 1, Math.max(minX, maxX))),
737
+ minY: Math.max(0, Math.min(tileCount - 1, Math.min(minY, maxY))),
738
+ maxY: Math.max(0, Math.min(tileCount - 1, Math.max(minY, maxY))),
739
+ };
740
+ }
741
+ function tileRangeCardinality(ranges) {
742
+ return ranges.reduce((total, range) => total + (range.maxX - range.minX + 1) * (range.maxY - range.minY + 1), 0);
743
+ }
744
+ function lonToTileX(lon, z) {
745
+ const clampedLon = Math.max(-180, Math.min(180, lon));
746
+ return Math.floor(((clampedLon + 180) / 360) * 2 ** z);
747
+ }
748
+ function latToTileY(lat, z) {
749
+ const clampedLat = Math.max(-WEB_MERCATOR_LAT_LIMIT, Math.min(WEB_MERCATOR_LAT_LIMIT, lat));
750
+ const radians = (clampedLat * Math.PI) / 180;
751
+ return Math.floor(((1 - Math.log(Math.tan(radians) + 1 / Math.cos(radians)) / Math.PI) / 2) * 2 ** z);
752
+ }
753
+ function sameTile(a, b) {
754
+ return a.z === b.z && a.x === b.x && a.y === b.y;
755
+ }
756
+ async function allSettledLimited(values, concurrency, worker) {
757
+ const results = new Array(values.length);
758
+ let nextIndex = 0;
759
+ async function run() {
760
+ for (;;) {
761
+ const index = nextIndex;
762
+ nextIndex += 1;
763
+ if (index >= values.length)
764
+ return;
765
+ try {
766
+ results[index] = { status: "fulfilled", value: await worker(values[index]) };
767
+ }
768
+ catch (reason) {
769
+ results[index] = { status: "rejected", reason };
770
+ }
771
+ }
772
+ }
773
+ const workers = Array.from({ length: Math.min(concurrency, values.length) }, () => run());
774
+ await Promise.all(workers);
775
+ return results;
776
+ }
777
+ function normalizeConcurrency(value, fallback) {
778
+ if (typeof value !== "number" || !Number.isFinite(value))
779
+ return fallback;
780
+ return Math.max(1, Math.trunc(value));
781
+ }
782
+ function linkAbortSignals(controller, signal) {
783
+ if (!signal)
784
+ return () => undefined;
785
+ if (signal.aborted) {
786
+ controller.abort(signal.reason);
787
+ return () => undefined;
788
+ }
789
+ const abort = () => controller.abort(signal.reason);
790
+ signal.addEventListener("abort", abort, { once: true });
791
+ return () => signal.removeEventListener("abort", abort);
792
+ }
793
+ function isAbortError(error) {
794
+ return ((error instanceof DOMException && error.name === "AbortError") ||
795
+ (error instanceof Error && error.name === "AbortError"));
796
+ }
797
+ function abortError(reason) {
798
+ const error = new Error(typeof reason === "string" ? reason : "tile request aborted");
799
+ error.name = "AbortError";
800
+ return error;
801
+ }