@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,634 @@
1
+ /**
2
+ * FES 2.0 Filter Encoding emitter for the WFS adapter. Two responsibilities:
3
+ *
4
+ * - Compile the canonical `Query.where` SQL-92-ish expression into a small
5
+ * FES AST. The supported subset is documented in `docs/wfs.md` —
6
+ * comparison operators, `IN`, `BETWEEN`, `LIKE`, `IS NULL`, boolean
7
+ * combinators, parenthesization, and string / number literals. Anything
8
+ * richer (subqueries, function calls, vendor extensions) yields the
9
+ * sentinel `"unsupported"` so the caller throws
10
+ * `HonuaCapabilityNotSupportedError("query")` rather than ship a
11
+ * silent partial filter.
12
+ *
13
+ * - Translate `Query.spatialFilter` into a spatial FES predicate. Only the
14
+ * simple geometries the canonical surface emits are supported — envelope,
15
+ * point, polygon, polyline. Curves and surfaces are out of scope; callers
16
+ * that need them reach the wire through `Source.protocol("wfs")`.
17
+ *
18
+ * The emitter never reaches `fetch`; it returns plain strings the adapter
19
+ * splices into the URL (KVP `filter=`) or the POST body (`<fes:Filter>`).
20
+ *
21
+ * @module
22
+ */
23
+ /**
24
+ * Sentinel used by the `where` compiler when the input contains a construct
25
+ * the FES emitter does not know how to translate. Callers should treat this
26
+ * as "fail the query" rather than "emit a partial filter".
27
+ */
28
+ export const UNSUPPORTED_FES = "unsupported";
29
+ /**
30
+ * Compile a `Query.where` SQL-92 string into FES AST. Returns
31
+ * `UNSUPPORTED_FES` for inputs the emitter cannot translate; the adapter
32
+ * promotes this to `HonuaCapabilityNotSupportedError("query")`.
33
+ */
34
+ export function compileWhere(input) {
35
+ if (input === undefined)
36
+ return { kind: "and", operands: [] };
37
+ const trimmed = input.trim();
38
+ if (trimmed.length === 0 || trimmed === "1=1")
39
+ return { kind: "and", operands: [] };
40
+ const tokens = tokenize(trimmed);
41
+ if (!tokens)
42
+ return UNSUPPORTED_FES;
43
+ const parser = new Parser(tokens);
44
+ try {
45
+ const node = parser.parseExpression();
46
+ if (!parser.atEnd())
47
+ return UNSUPPORTED_FES;
48
+ return node;
49
+ }
50
+ catch {
51
+ return UNSUPPORTED_FES;
52
+ }
53
+ }
54
+ /**
55
+ * Compile the canonical `SpatialFilter` (Esri-flavored) into the FES spatial
56
+ * leaf the adapter splices into the request. Default geometry property
57
+ * name is `the_geom`; callers may override (some servers use `geometry`,
58
+ * `shape`, etc.).
59
+ */
60
+ export function compileSpatialFilter(filter, options) {
61
+ const property = options.geometryProperty;
62
+ const srsName = options.srsName;
63
+ const op = mapSpatialRel(filter.spatialRel);
64
+ if (filter.geometryType === "esriGeometryEnvelope") {
65
+ const env = filter.geometry;
66
+ if (typeof env.xmin !== "number" ||
67
+ typeof env.ymin !== "number" ||
68
+ typeof env.xmax !== "number" ||
69
+ typeof env.ymax !== "number") {
70
+ return UNSUPPORTED_FES;
71
+ }
72
+ // <fes:BBOX> is envelope-intersects only. For any other relation the
73
+ // adapter must lower the envelope to a polygon and emit the requested
74
+ // FES spatial op explicitly so non-intersects relations preserve their
75
+ // semantics.
76
+ if (op === "Intersects") {
77
+ const envelope = {
78
+ xmin: env.xmin,
79
+ ymin: env.ymin,
80
+ xmax: env.xmax,
81
+ ymax: env.ymax,
82
+ };
83
+ if (srsName)
84
+ envelope.srsName = srsName;
85
+ return { kind: "bbox", property, envelope };
86
+ }
87
+ if (!op)
88
+ return UNSUPPORTED_FES;
89
+ const gml = envelopeToPolygonGml(env.xmin, env.ymin, env.xmax, env.ymax, srsName);
90
+ return { kind: "spatial", op, property, gml };
91
+ }
92
+ if (!op)
93
+ return UNSUPPORTED_FES;
94
+ const gml = geometryToGml(filter.geometry, filter.geometryType, srsName);
95
+ if (gml === undefined)
96
+ return UNSUPPORTED_FES;
97
+ return { kind: "spatial", op, property, gml };
98
+ }
99
+ function envelopeToPolygonGml(xmin, ymin, xmax, ymax, srsName) {
100
+ const srsAttr = srsName ? ` srsName=${attr(srsName)}` : "";
101
+ const latLon = srsAxisIsLatLon(srsName);
102
+ const c = (x, y) => formatCoord(x, y, latLon);
103
+ const ring = `${c(xmin, ymin)} ${c(xmax, ymin)} ${c(xmax, ymax)} ${c(xmin, ymax)} ${c(xmin, ymin)}`;
104
+ return `<gml:Polygon${srsAttr}><gml:exterior><gml:LinearRing><gml:posList>${ring}</gml:posList></gml:LinearRing></gml:exterior></gml:Polygon>`;
105
+ }
106
+ /**
107
+ * Well-known geographic (latitude/longitude) EPSG codes. In URN
108
+ * (`urn:ogc:def:crs:EPSG::4326`) or OGC-HTTP
109
+ * (`http://www.opengis.net/def/crs/EPSG/0/4326`) form, WFS 2.0 / GML 3.2 require
110
+ * authority axis order — latitude,longitude — for these CRSes, whereas the
111
+ * legacy short `EPSG:4326` form and `CRS84` stay longitude,latitude. Projected
112
+ * CRSes (easting,northing) already match the canonical x,y order, so they are
113
+ * intentionally excluded.
114
+ */
115
+ const LATLON_GEOGRAPHIC_EPSG = new Set([
116
+ 4326, 4979, 4258, 4269, 4267, 4203, 4283, 4759, 4490, 4674, 4617, 4612, 4619, 4668, 4555,
117
+ ]);
118
+ /**
119
+ * Decide whether a `srsName` implies latitude,longitude axis order. Defaults to
120
+ * longitude,latitude (the canonical x,y order) for the legacy short EPSG form,
121
+ * CRS84, unknown codes, and an absent srsName — preserving existing behavior and
122
+ * avoiding regressions for callers that already supply lon,lat-oriented CRSes.
123
+ */
124
+ function srsAxisIsLatLon(srsName) {
125
+ if (!srsName)
126
+ return false;
127
+ const value = srsName.trim();
128
+ // CRS84 / CRS:84 are explicitly longitude,latitude regardless of form.
129
+ if (/(?:^|[:/])CRS:?84$/i.test(value) || /CRS84/i.test(value))
130
+ return false;
131
+ // URN form: urn:ogc:def:crs:EPSG::4326 (the version segment may be empty).
132
+ const urn = value.match(/^urn:[\w-]+:def:crs:EPSG:[^:]*:(\d+)$/i);
133
+ // OGC HTTP form: http://www.opengis.net/def/crs/EPSG/0/4326
134
+ const http = value.match(/def\/crs\/EPSG\/[^/]+\/(\d+)$/i);
135
+ const code = urn?.[1] ?? http?.[1];
136
+ // The legacy short "EPSG:4326" form keeps GIS-conventional lon,lat order.
137
+ if (!code)
138
+ return false;
139
+ return LATLON_GEOGRAPHIC_EPSG.has(Number(code));
140
+ }
141
+ /** Serialize a coordinate pair honoring the resolved CRS axis order. */
142
+ function formatCoord(x, y, latLon) {
143
+ return latLon ? `${y} ${x}` : `${x} ${y}`;
144
+ }
145
+ function mapSpatialRel(rel) {
146
+ switch (rel) {
147
+ case undefined:
148
+ case "esriSpatialRelIntersects":
149
+ case "esriSpatialRelEnvelopeIntersects":
150
+ return "Intersects";
151
+ case "esriSpatialRelContains":
152
+ return "Contains";
153
+ case "esriSpatialRelWithin":
154
+ return "Within";
155
+ case "esriSpatialRelCrosses":
156
+ return "Crosses";
157
+ case "esriSpatialRelOverlaps":
158
+ return "Overlaps";
159
+ case "esriSpatialRelTouches":
160
+ return "Touches";
161
+ default:
162
+ return undefined;
163
+ }
164
+ }
165
+ /**
166
+ * Serialize a list of FES nodes into a single `<fes:Filter>` element. Used
167
+ * for both the POST GetFeature body and (URL-encoded) the KVP `filter=`
168
+ * query parameter.
169
+ *
170
+ * The FES namespace prefix is always `fes` and is bound on the root
171
+ * `<fes:Filter>` element so the result is self-contained.
172
+ */
173
+ export function serializeFes(nodes, options) {
174
+ const inner = nodes.length === 0
175
+ ? ""
176
+ : nodes.length === 1
177
+ ? serializeNode(nodes[0])
178
+ : serializeNode({ kind: "and", operands: nodes });
179
+ const typeNameAttr = options?.typeName ? ` typeNames=${attr(options.typeName)}` : "";
180
+ return `<fes:Filter xmlns:fes="http://www.opengis.net/fes/2.0" xmlns:gml="http://www.opengis.net/gml/3.2"${typeNameAttr}>${inner}</fes:Filter>`;
181
+ }
182
+ function serializeNode(node) {
183
+ switch (node.kind) {
184
+ case "and":
185
+ if (node.operands.length === 0)
186
+ return "";
187
+ if (node.operands.length === 1)
188
+ return serializeNode(node.operands[0]);
189
+ return `<fes:And>${node.operands.map(serializeNode).join("")}</fes:And>`;
190
+ case "or":
191
+ if (node.operands.length === 1)
192
+ return serializeNode(node.operands[0]);
193
+ return `<fes:Or>${node.operands.map(serializeNode).join("")}</fes:Or>`;
194
+ case "not":
195
+ return `<fes:Not>${serializeNode(node.operand)}</fes:Not>`;
196
+ case "compare":
197
+ return `<fes:${compareOpElement(node.op)}><fes:ValueReference>${escapeXml(node.property)}</fes:ValueReference><fes:Literal>${literalText(node.value)}</fes:Literal></fes:${compareOpElement(node.op)}>`;
198
+ case "between":
199
+ return `<fes:PropertyIsBetween><fes:ValueReference>${escapeXml(node.property)}</fes:ValueReference><fes:LowerBoundary><fes:Literal>${literalText(node.lower)}</fes:Literal></fes:LowerBoundary><fes:UpperBoundary><fes:Literal>${literalText(node.upper)}</fes:Literal></fes:UpperBoundary></fes:PropertyIsBetween>`;
200
+ case "in": {
201
+ if (node.values.length === 0)
202
+ return `<fes:PropertyIsEqualTo><fes:ValueReference>${escapeXml(node.property)}</fes:ValueReference><fes:Literal>${literalText({ kind: "string", value: "__honua_empty_in__" })}</fes:Literal></fes:PropertyIsEqualTo>`;
203
+ const parts = node.values.map((v) => `<fes:PropertyIsEqualTo><fes:ValueReference>${escapeXml(node.property)}</fes:ValueReference><fes:Literal>${literalText(v)}</fes:Literal></fes:PropertyIsEqualTo>`);
204
+ if (parts.length === 1)
205
+ return parts[0];
206
+ return `<fes:Or>${parts.join("")}</fes:Or>`;
207
+ }
208
+ case "like":
209
+ return `<fes:PropertyIsLike wildCard="%" singleChar="_" escapeChar="\\"><fes:ValueReference>${escapeXml(node.property)}</fes:ValueReference><fes:Literal>${escapeXml(node.pattern)}</fes:Literal></fes:PropertyIsLike>`;
210
+ case "isNull":
211
+ return `<fes:PropertyIsNull><fes:ValueReference>${escapeXml(node.property)}</fes:ValueReference></fes:PropertyIsNull>`;
212
+ case "spatial":
213
+ return `<fes:${node.op}><fes:ValueReference>${escapeXml(node.property)}</fes:ValueReference>${node.gml}</fes:${node.op}>`;
214
+ case "bbox":
215
+ return `<fes:BBOX><fes:ValueReference>${escapeXml(node.property)}</fes:ValueReference>${envelopeGml(node.envelope)}</fes:BBOX>`;
216
+ }
217
+ }
218
+ function compareOpElement(op) {
219
+ switch (op) {
220
+ case "=":
221
+ return "PropertyIsEqualTo";
222
+ case "<>":
223
+ return "PropertyIsNotEqualTo";
224
+ case "<":
225
+ return "PropertyIsLessThan";
226
+ case "<=":
227
+ return "PropertyIsLessThanOrEqualTo";
228
+ case ">":
229
+ return "PropertyIsGreaterThan";
230
+ case ">=":
231
+ return "PropertyIsGreaterThanOrEqualTo";
232
+ }
233
+ }
234
+ function literalText(value) {
235
+ return value.kind === "number" ? String(value.value) : escapeXml(value.value);
236
+ }
237
+ function escapeXml(input) {
238
+ return input
239
+ .replaceAll("&", "&amp;")
240
+ .replaceAll("<", "&lt;")
241
+ .replaceAll(">", "&gt;")
242
+ .replaceAll('"', "&quot;")
243
+ .replaceAll("'", "&apos;");
244
+ }
245
+ function attr(value) {
246
+ return `"${value.replaceAll("&", "&amp;").replaceAll('"', "&quot;").replaceAll("<", "&lt;")}"`;
247
+ }
248
+ function envelopeGml(env) {
249
+ const srsAttr = env.srsName ? ` srsName=${attr(env.srsName)}` : "";
250
+ const latLon = srsAxisIsLatLon(env.srsName);
251
+ return `<gml:Envelope${srsAttr}><gml:lowerCorner>${formatCoord(env.xmin, env.ymin, latLon)}</gml:lowerCorner><gml:upperCorner>${formatCoord(env.xmax, env.ymax, latLon)}</gml:upperCorner></gml:Envelope>`;
252
+ }
253
+ /**
254
+ * Translate a GeoJSON-style geometry into a tiny GML 3.2 fragment. Only the
255
+ * primitive shapes the canonical surface emits are supported (point, line,
256
+ * polygon). Curves and surfaces return `undefined`; callers promote that to
257
+ * `UNSUPPORTED_FES`.
258
+ */
259
+ function geometryToGml(geometry, geometryType, srsName) {
260
+ const srsAttr = srsName ? ` srsName=${attr(srsName)}` : "";
261
+ const latLon = srsAxisIsLatLon(srsName);
262
+ switch (geometryType) {
263
+ case "esriGeometryPoint": {
264
+ const x = geometry.x;
265
+ const y = geometry.y;
266
+ if (typeof x !== "number" || typeof y !== "number")
267
+ return undefined;
268
+ return `<gml:Point${srsAttr}><gml:pos>${formatCoord(x, y, latLon)}</gml:pos></gml:Point>`;
269
+ }
270
+ case "esriGeometryPolyline": {
271
+ const paths = geometry.paths;
272
+ if (!Array.isArray(paths) || paths.length === 0)
273
+ return undefined;
274
+ // Honua emits a single line; downstream curves are out of scope.
275
+ const path = paths[0];
276
+ if (!Array.isArray(path))
277
+ return undefined;
278
+ const coords = path
279
+ .map((p) => (Array.isArray(p) ? formatCoord(p[0], p[1], latLon) : ""))
280
+ .filter(Boolean)
281
+ .join(" ");
282
+ if (!coords)
283
+ return undefined;
284
+ return `<gml:LineString${srsAttr}><gml:posList>${coords}</gml:posList></gml:LineString>`;
285
+ }
286
+ case "esriGeometryPolygon": {
287
+ const rings = geometry.rings;
288
+ if (!Array.isArray(rings) || rings.length === 0)
289
+ return undefined;
290
+ const exterior = ringToPosList(rings[0], latLon);
291
+ if (!exterior)
292
+ return undefined;
293
+ const interiors = [];
294
+ for (let i = 1; i < rings.length; i += 1) {
295
+ const inner = ringToPosList(rings[i], latLon);
296
+ if (!inner)
297
+ return undefined;
298
+ interiors.push(`<gml:interior><gml:LinearRing><gml:posList>${inner}</gml:posList></gml:LinearRing></gml:interior>`);
299
+ }
300
+ return `<gml:Polygon${srsAttr}><gml:exterior><gml:LinearRing><gml:posList>${exterior}</gml:posList></gml:LinearRing></gml:exterior>${interiors.join("")}</gml:Polygon>`;
301
+ }
302
+ default:
303
+ return undefined;
304
+ }
305
+ }
306
+ function ringToPosList(ring, latLon) {
307
+ if (!Array.isArray(ring) || ring.length < 3)
308
+ return undefined;
309
+ return ring
310
+ .map((p) => (Array.isArray(p) ? formatCoord(p[0], p[1], latLon) : ""))
311
+ .filter(Boolean)
312
+ .join(" ");
313
+ }
314
+ /**
315
+ * Convert a canonical `CanonicalFeature.geometry` (GeoJSON) into a GML 3.2
316
+ * fragment for `<wfs:Insert>` / `<wfs:Update>` payloads.
317
+ */
318
+ export function geoJsonGeometryToGml(geometry, srsName) {
319
+ if (typeof geometry !== "object" || geometry === null)
320
+ return undefined;
321
+ const geom = geometry;
322
+ const srsAttr = srsName ? ` srsName=${attr(srsName)}` : "";
323
+ // Honor GML 3.2 axis order for the resolved CRS, mirroring the query-path
324
+ // emitters: authority (URN/HTTP) forms of geographic CRSes are lat,lon while
325
+ // the legacy short `EPSG:4326` form and CRS84 stay lon,lat.
326
+ const latLon = srsAxisIsLatLon(srsName);
327
+ const c = (p) => formatCoord(p[0], p[1], latLon);
328
+ switch (geom.type) {
329
+ case "Point": {
330
+ const coord = geom.coordinates;
331
+ if (!Array.isArray(coord) || typeof coord[0] !== "number" || typeof coord[1] !== "number")
332
+ return undefined;
333
+ return `<gml:Point${srsAttr}><gml:pos>${c(coord)}</gml:pos></gml:Point>`;
334
+ }
335
+ case "LineString": {
336
+ const coords = geom.coordinates;
337
+ if (!Array.isArray(coords) || coords.length === 0)
338
+ return undefined;
339
+ const posList = coords.map(c).join(" ");
340
+ return `<gml:LineString${srsAttr}><gml:posList>${posList}</gml:posList></gml:LineString>`;
341
+ }
342
+ case "Polygon": {
343
+ const coords = geom.coordinates;
344
+ if (!Array.isArray(coords) || coords.length === 0)
345
+ return undefined;
346
+ const exterior = coords[0].map(c).join(" ");
347
+ const interiors = coords
348
+ .slice(1)
349
+ .map((ring) => `<gml:interior><gml:LinearRing><gml:posList>${ring.map(c).join(" ")}</gml:posList></gml:LinearRing></gml:interior>`)
350
+ .join("");
351
+ return `<gml:Polygon${srsAttr}><gml:exterior><gml:LinearRing><gml:posList>${exterior}</gml:posList></gml:LinearRing></gml:exterior>${interiors}</gml:Polygon>`;
352
+ }
353
+ default:
354
+ return undefined;
355
+ }
356
+ }
357
+ function tokenize(input) {
358
+ const tokens = [];
359
+ const len = input.length;
360
+ let i = 0;
361
+ while (i < len) {
362
+ const ch = input[i];
363
+ if (/\s/.test(ch)) {
364
+ i += 1;
365
+ continue;
366
+ }
367
+ if (ch === "(") {
368
+ tokens.push({ kind: "lparen" });
369
+ i += 1;
370
+ continue;
371
+ }
372
+ if (ch === ")") {
373
+ tokens.push({ kind: "rparen" });
374
+ i += 1;
375
+ continue;
376
+ }
377
+ if (ch === ",") {
378
+ tokens.push({ kind: "comma" });
379
+ i += 1;
380
+ continue;
381
+ }
382
+ if (ch === "'") {
383
+ let j = i + 1;
384
+ let value = "";
385
+ while (j < len) {
386
+ if (input[j] === "'") {
387
+ if (input[j + 1] === "'") {
388
+ value += "'";
389
+ j += 2;
390
+ continue;
391
+ }
392
+ break;
393
+ }
394
+ value += input[j];
395
+ j += 1;
396
+ }
397
+ if (j >= len)
398
+ return undefined;
399
+ tokens.push({ kind: "string", value });
400
+ i = j + 1;
401
+ continue;
402
+ }
403
+ if (/[0-9]/.test(ch) || (ch === "-" && /[0-9]/.test(input[i + 1] ?? ""))) {
404
+ let j = i + 1;
405
+ while (j < len && /[0-9.]/.test(input[j]))
406
+ j += 1;
407
+ const numText = input.slice(i, j);
408
+ const n = Number(numText);
409
+ if (!Number.isFinite(n))
410
+ return undefined;
411
+ tokens.push({ kind: "number", value: n });
412
+ i = j;
413
+ continue;
414
+ }
415
+ if (ch === "<" || ch === ">") {
416
+ const next = input[i + 1];
417
+ if (next === "=" || (ch === "<" && next === ">")) {
418
+ tokens.push({ kind: "op", value: ch + next });
419
+ i += 2;
420
+ continue;
421
+ }
422
+ tokens.push({ kind: "op", value: ch });
423
+ i += 1;
424
+ continue;
425
+ }
426
+ if (ch === "=" || ch === "!") {
427
+ if (ch === "!" && input[i + 1] === "=") {
428
+ tokens.push({ kind: "op", value: "<>" });
429
+ i += 2;
430
+ continue;
431
+ }
432
+ if (ch === "=") {
433
+ tokens.push({ kind: "op", value: "=" });
434
+ i += 1;
435
+ continue;
436
+ }
437
+ return undefined;
438
+ }
439
+ if (/[A-Za-z_]/.test(ch)) {
440
+ let j = i + 1;
441
+ while (j < len && /[A-Za-z0-9_.]/.test(input[j]))
442
+ j += 1;
443
+ const value = input.slice(i, j);
444
+ tokens.push({ kind: "ident", value });
445
+ i = j;
446
+ continue;
447
+ }
448
+ return undefined;
449
+ }
450
+ return tokens;
451
+ }
452
+ class Parser {
453
+ tokens;
454
+ pos = 0;
455
+ constructor(tokens) {
456
+ this.tokens = tokens;
457
+ }
458
+ atEnd() {
459
+ return this.pos >= this.tokens.length;
460
+ }
461
+ parseExpression() {
462
+ return this.parseOr();
463
+ }
464
+ parseOr() {
465
+ let left = this.parseAnd();
466
+ while (this.matchKeyword("OR")) {
467
+ const right = this.parseAnd();
468
+ left = combine("or", left, right);
469
+ }
470
+ return left;
471
+ }
472
+ parseAnd() {
473
+ let left = this.parseNot();
474
+ while (this.matchKeyword("AND")) {
475
+ const right = this.parseNot();
476
+ left = combine("and", left, right);
477
+ }
478
+ return left;
479
+ }
480
+ parseNot() {
481
+ if (this.matchKeyword("NOT")) {
482
+ return { kind: "not", operand: this.parseNot() };
483
+ }
484
+ return this.parsePrimary();
485
+ }
486
+ parsePrimary() {
487
+ const token = this.peek();
488
+ if (!token)
489
+ throw new Error("unexpected end of expression");
490
+ if (token.kind === "lparen") {
491
+ this.pos += 1;
492
+ const expr = this.parseExpression();
493
+ this.expect("rparen");
494
+ return expr;
495
+ }
496
+ if (token.kind === "ident") {
497
+ const property = token.value;
498
+ this.pos += 1;
499
+ // IS NULL / IS NOT NULL
500
+ if (this.matchKeyword("IS")) {
501
+ const negate = this.matchKeyword("NOT");
502
+ if (!this.matchKeyword("NULL"))
503
+ throw new Error("expected NULL");
504
+ const node = { kind: "isNull", property };
505
+ return negate ? { kind: "not", operand: node } : node;
506
+ }
507
+ // BETWEEN
508
+ if (this.matchKeyword("BETWEEN")) {
509
+ const lower = this.parseLiteral();
510
+ if (!this.matchKeyword("AND"))
511
+ throw new Error("expected AND in BETWEEN");
512
+ const upper = this.parseLiteral();
513
+ return { kind: "between", property, lower, upper };
514
+ }
515
+ // NOT BETWEEN / NOT IN / NOT LIKE
516
+ if (this.matchKeyword("NOT")) {
517
+ if (this.matchKeyword("BETWEEN")) {
518
+ const lower = this.parseLiteral();
519
+ if (!this.matchKeyword("AND"))
520
+ throw new Error("expected AND in BETWEEN");
521
+ const upper = this.parseLiteral();
522
+ return { kind: "not", operand: { kind: "between", property, lower, upper } };
523
+ }
524
+ if (this.matchKeyword("IN")) {
525
+ return { kind: "not", operand: this.parseInList(property) };
526
+ }
527
+ if (this.matchKeyword("LIKE")) {
528
+ const pattern = this.parseStringLiteral();
529
+ return { kind: "not", operand: { kind: "like", property, pattern } };
530
+ }
531
+ throw new Error("unsupported NOT clause");
532
+ }
533
+ // IN
534
+ if (this.matchKeyword("IN")) {
535
+ return this.parseInList(property);
536
+ }
537
+ // LIKE
538
+ if (this.matchKeyword("LIKE")) {
539
+ const pattern = this.parseStringLiteral();
540
+ return { kind: "like", property, pattern };
541
+ }
542
+ // Comparison
543
+ const opTok = this.peek();
544
+ if (opTok && opTok.kind === "op") {
545
+ this.pos += 1;
546
+ const value = this.parseLiteral();
547
+ const op = opTok.value;
548
+ if (op !== "=" && op !== "<>" && op !== "<" && op !== "<=" && op !== ">" && op !== ">=") {
549
+ throw new Error(`unsupported operator ${op}`);
550
+ }
551
+ return { kind: "compare", op, property, value };
552
+ }
553
+ throw new Error(`unexpected token after identifier "${property}"`);
554
+ }
555
+ throw new Error(`unexpected token ${token.kind}`);
556
+ }
557
+ parseInList(property) {
558
+ this.expect("lparen");
559
+ const values = [];
560
+ while (true) {
561
+ const tok = this.peek();
562
+ if (!tok)
563
+ throw new Error("unterminated IN list");
564
+ if (tok.kind === "rparen") {
565
+ this.pos += 1;
566
+ break;
567
+ }
568
+ values.push(this.parseLiteral());
569
+ const next = this.peek();
570
+ if (next?.kind === "comma") {
571
+ this.pos += 1;
572
+ continue;
573
+ }
574
+ if (next?.kind === "rparen") {
575
+ this.pos += 1;
576
+ break;
577
+ }
578
+ throw new Error("expected , or ) in IN list");
579
+ }
580
+ return { kind: "in", property, values };
581
+ }
582
+ parseLiteral() {
583
+ const tok = this.peek();
584
+ if (!tok)
585
+ throw new Error("expected literal");
586
+ if (tok.kind === "string") {
587
+ this.pos += 1;
588
+ return { kind: "string", value: tok.value };
589
+ }
590
+ if (tok.kind === "number") {
591
+ this.pos += 1;
592
+ return { kind: "number", value: tok.value };
593
+ }
594
+ throw new Error(`expected literal, got ${tok.kind}`);
595
+ }
596
+ parseStringLiteral() {
597
+ const tok = this.peek();
598
+ if (!tok || tok.kind !== "string")
599
+ throw new Error("expected string literal");
600
+ this.pos += 1;
601
+ return tok.value;
602
+ }
603
+ peek() {
604
+ return this.tokens[this.pos];
605
+ }
606
+ expect(kind) {
607
+ const tok = this.peek();
608
+ if (!tok || tok.kind !== kind)
609
+ throw new Error(`expected ${kind}`);
610
+ this.pos += 1;
611
+ }
612
+ matchKeyword(keyword) {
613
+ const tok = this.peek();
614
+ if (tok && tok.kind === "ident" && tok.value.toUpperCase() === keyword) {
615
+ this.pos += 1;
616
+ return true;
617
+ }
618
+ return false;
619
+ }
620
+ }
621
+ function combine(kind, left, right) {
622
+ const merged = [];
623
+ pushOperand(merged, kind, left);
624
+ pushOperand(merged, kind, right);
625
+ return { kind, operands: merged };
626
+ }
627
+ function pushOperand(target, kind, node) {
628
+ if (node.kind === kind) {
629
+ for (const op of node.operands)
630
+ target.push(op);
631
+ return;
632
+ }
633
+ target.push(node);
634
+ }