@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,396 @@
1
+ /**
2
+ * `ExplorationContext` runtime — a thin coalescing event bus over the
3
+ * pure reducer in `./reducer.ts`.
4
+ *
5
+ * State is updated synchronously on `dispatch`. Listener callbacks run on
6
+ * a microtask so a burst of intents within the same tick coalesces into a
7
+ * single `ChangeEvent` per slice (the merged set of changed slices, the
8
+ * latest state, and the previous state at the start of the tick).
9
+ *
10
+ * The implementation deliberately avoids `Promise.resolve().then` in tests
11
+ * by using `queueMicrotask`, which integrates with vitest's fake-timer /
12
+ * `await Promise.resolve()` flushing.
13
+ *
14
+ * @module
15
+ */
16
+ import { HonuaExplorationContextError } from "../core/errors.js";
17
+ import { LINKED_VIEW_PRESETS, propagationFor } from "./presets.js";
18
+ import { reduce } from "./reducer.js";
19
+ import { EMPTY_STATE, } from "./types.js";
20
+ /**
21
+ * Construct an `ExplorationContext` over a dataset.
22
+ *
23
+ * The returned object is the canonical place to read and mutate
24
+ * exploration state. Bind views with `bind()` and listen to slice changes
25
+ * via `subscribe()`.
26
+ */
27
+ export function createExplorationContext(options) {
28
+ const { datasetId, sourceIds } = options;
29
+ const sourceIdsCopy = [...sourceIds];
30
+ // `mergeInitial` resolves the active preset (explicit `options.preset`
31
+ // overrides `initialState.preset`, which overrides the empty default).
32
+ // Derive `policy` from the merged state's preset rather than reading
33
+ // `options.preset` directly so that a caller who seeds the context via
34
+ // `initialState.preset` (without `options.preset`) still starts with a
35
+ // policy that matches their intended linked-view behavior.
36
+ let state = mergeInitial(options.initialState, options.preset);
37
+ let policy = LINKED_VIEW_PRESETS[state.preset];
38
+ let disposed = false;
39
+ const bindings = new Map();
40
+ const sliceListeners = new Map();
41
+ // Coalescing state — a microtask is scheduled at most once per tick.
42
+ // `pendingRawChangedSlices` is the full set of slices the reducer changed
43
+ // (used to wake `"all"` subscribers per the public slice contract);
44
+ // `pendingChangedSlices` is the policy-filtered subset used to wake
45
+ // slice-specific subscribers.
46
+ let pendingFlush = false;
47
+ let pendingPrev = state;
48
+ const pendingRawChangedSlices = new Set();
49
+ const pendingChangedSlices = new Set();
50
+ let pendingOrigin;
51
+ function ensureLive(op) {
52
+ if (disposed) {
53
+ throw new HonuaExplorationContextError("disposed", `ExplorationContext("${datasetId}") cannot ${op} after dispose()`);
54
+ }
55
+ }
56
+ function scheduleFlush() {
57
+ if (pendingFlush)
58
+ return;
59
+ pendingFlush = true;
60
+ queueMicrotask(() => {
61
+ pendingFlush = false;
62
+ if (pendingRawChangedSlices.size === 0)
63
+ return;
64
+ // `"all"` subscribers see every change the reducer produced, including
65
+ // those the linked-view policy kept local to the originating view.
66
+ // Slice-specific subscribers only fire for the filtered subset.
67
+ const allEvent = {
68
+ state,
69
+ previous: pendingPrev,
70
+ changedSlices: new Set(pendingRawChangedSlices),
71
+ origin: pendingOrigin,
72
+ };
73
+ const filteredChanges = new Set(pendingChangedSlices);
74
+ pendingRawChangedSlices.clear();
75
+ pendingChangedSlices.clear();
76
+ pendingPrev = state;
77
+ pendingOrigin = undefined;
78
+ const allListeners = sliceListeners.get("all");
79
+ if (allListeners) {
80
+ for (const fn of [...allListeners])
81
+ fn(allEvent);
82
+ }
83
+ for (const slice of filteredChanges) {
84
+ const listeners = sliceListeners.get(slice);
85
+ if (!listeners)
86
+ continue;
87
+ const sliceEvent = {
88
+ state: allEvent.state,
89
+ previous: allEvent.previous,
90
+ changedSlices: filteredChanges,
91
+ origin: allEvent.origin,
92
+ };
93
+ for (const fn of [...listeners])
94
+ fn(sliceEvent);
95
+ }
96
+ });
97
+ }
98
+ return {
99
+ datasetId,
100
+ sourceIds: sourceIdsCopy,
101
+ get state() {
102
+ return state;
103
+ },
104
+ get policy() {
105
+ return policy;
106
+ },
107
+ bind(view) {
108
+ ensureLive("bind");
109
+ const binding = { id: view.id, role: view.role };
110
+ if (bindings.has(binding.id)) {
111
+ throw new HonuaExplorationContextError("duplicate-binding", `ExplorationContext("${datasetId}"): a view is already bound with id "${binding.id}"`);
112
+ }
113
+ bindings.set(binding.id, binding);
114
+ let unbound = false;
115
+ return {
116
+ id: binding.id,
117
+ unbind() {
118
+ if (unbound)
119
+ return;
120
+ unbound = true;
121
+ bindings.delete(binding.id);
122
+ },
123
+ };
124
+ },
125
+ connectView(view) {
126
+ ensureLive("connectView");
127
+ const context = this;
128
+ const handle = context.bind(view);
129
+ const binding = bindings.get(handle.id) ?? { id: handle.id, role: view.role };
130
+ const subscriptions = new Set();
131
+ let unbound = false;
132
+ function ensureBound(op) {
133
+ ensureLive(op);
134
+ if (unbound) {
135
+ throw new HonuaExplorationContextError("unbound-view", `ExplorationContext("${datasetId}"): view "${binding.id}" cannot ${op} after unbind()`);
136
+ }
137
+ }
138
+ function dispatchFromView(intent) {
139
+ ensureBound("dispatch");
140
+ context.dispatch(withViewId(intent, binding.id));
141
+ }
142
+ function subscribeFromView(slice, fn, options = {}) {
143
+ ensureBound("subscribe");
144
+ const slices = normalizeSubscription(slice);
145
+ if (slices.length === 0)
146
+ return () => { };
147
+ let active = true;
148
+ let pendingFlush = false;
149
+ let pendingEvent;
150
+ const pendingChangedSlices = new Set();
151
+ function flushViewEvent() {
152
+ pendingFlush = false;
153
+ if (!active || !pendingEvent || pendingChangedSlices.size === 0)
154
+ return;
155
+ const base = pendingEvent;
156
+ const changedSlices = new Set(pendingChangedSlices);
157
+ pendingEvent = undefined;
158
+ pendingChangedSlices.clear();
159
+ const event = {
160
+ state: base.state,
161
+ previous: base.previous,
162
+ changedSlices,
163
+ origin: base.origin,
164
+ view: binding,
165
+ selfOrigin: base.origin?.viewId === binding.id,
166
+ };
167
+ fn(event);
168
+ }
169
+ function receive(event) {
170
+ if (!active)
171
+ return;
172
+ const selfOrigin = event.origin?.viewId === binding.id;
173
+ if (selfOrigin && !options.includeSelf)
174
+ return;
175
+ pendingEvent = event;
176
+ for (const changed of event.changedSlices)
177
+ pendingChangedSlices.add(changed);
178
+ if (pendingFlush)
179
+ return;
180
+ pendingFlush = true;
181
+ queueMicrotask(flushViewEvent);
182
+ }
183
+ const unsubs = slices.map((entry) => context.subscribe(entry, receive));
184
+ const unsubscribe = () => {
185
+ if (!active)
186
+ return;
187
+ active = false;
188
+ for (const unsub of unsubs)
189
+ unsub();
190
+ subscriptions.delete(unsubscribe);
191
+ };
192
+ subscriptions.add(unsubscribe);
193
+ return unsubscribe;
194
+ }
195
+ const controller = {
196
+ id: binding.id,
197
+ role: binding.role,
198
+ get state() {
199
+ return context.state;
200
+ },
201
+ get policy() {
202
+ return context.policy;
203
+ },
204
+ dispatch: dispatchFromView,
205
+ subscribe: subscribeFromView,
206
+ setFilter(id, clause) {
207
+ dispatchFromView({ kind: "set-filter", id, clause });
208
+ },
209
+ clearFilter(id) {
210
+ dispatchFromView({ kind: "clear-filter", id });
211
+ },
212
+ setSpatialFilter(spatialFilter) {
213
+ dispatchFromView({ kind: "set-spatial-filter", spatialFilter });
214
+ },
215
+ setExtent(extent) {
216
+ dispatchFromView({ kind: "set-extent", extent });
217
+ },
218
+ select(ids, options) {
219
+ dispatchFromView({ kind: "select", ids, replace: options?.replace });
220
+ },
221
+ deselect(ids) {
222
+ dispatchFromView({ kind: "deselect", ids });
223
+ },
224
+ setSort(sort) {
225
+ dispatchFromView({ kind: "set-sort", sort });
226
+ },
227
+ setPage(page) {
228
+ dispatchFromView({ kind: "set-page", page });
229
+ },
230
+ setVisibleFields(fields) {
231
+ dispatchFromView({ kind: "set-visible-fields", fields });
232
+ },
233
+ setGrouping(grouping) {
234
+ dispatchFromView({ kind: "set-grouping", grouping });
235
+ },
236
+ setAggregation(aggregation) {
237
+ dispatchFromView({ kind: "set-aggregation", aggregation });
238
+ },
239
+ applyPreset(preset) {
240
+ dispatchFromView({ kind: "apply-preset", preset });
241
+ },
242
+ snapshot() {
243
+ ensureBound("snapshot");
244
+ return context.snapshot();
245
+ },
246
+ restore(snapshot) {
247
+ ensureBound("restore");
248
+ context.restore(snapshot);
249
+ },
250
+ unbind() {
251
+ if (unbound)
252
+ return;
253
+ unbound = true;
254
+ for (const unsub of [...subscriptions])
255
+ unsub();
256
+ subscriptions.clear();
257
+ handle.unbind();
258
+ },
259
+ };
260
+ return controller;
261
+ },
262
+ dispatch(intent) {
263
+ ensureLive("dispatch");
264
+ const result = reduce(state, intent);
265
+ if (result.changedSlices.size === 0)
266
+ return;
267
+ const filtered = filterByPolicy(result.changedSlices, intent, policy, bindings);
268
+ // Always update central state — propagation only filters which slice
269
+ // listeners are woken, not whether the state itself moves. Record the
270
+ // raw changed slices so `"all"` subscribers always see the change per
271
+ // the public slice contract, even when the filtered set is empty.
272
+ const movedToFreshTick = pendingRawChangedSlices.size === 0;
273
+ if (movedToFreshTick)
274
+ pendingPrev = state;
275
+ state = result.state;
276
+ for (const slice of result.changedSlices)
277
+ pendingRawChangedSlices.add(slice);
278
+ for (const slice of filtered)
279
+ pendingChangedSlices.add(slice);
280
+ pendingOrigin = intent;
281
+ // Sync preset rotation if the intent was apply-preset.
282
+ if (intent.kind === "apply-preset") {
283
+ policy = LINKED_VIEW_PRESETS[intent.preset];
284
+ }
285
+ else if (intent.kind === "snapshot-restore") {
286
+ policy = LINKED_VIEW_PRESETS[state.preset];
287
+ }
288
+ if (pendingRawChangedSlices.size > 0)
289
+ scheduleFlush();
290
+ },
291
+ subscribe(slice, fn) {
292
+ ensureLive("subscribe");
293
+ let listeners = sliceListeners.get(slice);
294
+ if (!listeners) {
295
+ listeners = new Set();
296
+ sliceListeners.set(slice, listeners);
297
+ }
298
+ listeners.add(fn);
299
+ return () => {
300
+ const set = sliceListeners.get(slice);
301
+ if (!set)
302
+ return;
303
+ set.delete(fn);
304
+ if (set.size === 0)
305
+ sliceListeners.delete(slice);
306
+ };
307
+ },
308
+ snapshot() {
309
+ // Detach the snapshot from live state — the contract advertises
310
+ // snapshots as serializable value objects, so caller-side mutation
311
+ // must not leak into the context and vice versa.
312
+ return { version: 1, state: cloneExplorationState(state) };
313
+ },
314
+ restore(snapshot) {
315
+ ensureLive("restore");
316
+ if (snapshot.version !== 1) {
317
+ throw new HonuaExplorationContextError("incompatible-snapshot", `ExplorationContext("${datasetId}"): snapshot version ${String(snapshot.version)} is not supported`);
318
+ }
319
+ this.dispatch({
320
+ kind: "snapshot-restore",
321
+ snapshot: { version: 1, state: cloneExplorationState(snapshot.state) },
322
+ });
323
+ },
324
+ dispose() {
325
+ if (disposed)
326
+ return;
327
+ disposed = true;
328
+ bindings.clear();
329
+ sliceListeners.clear();
330
+ pendingRawChangedSlices.clear();
331
+ pendingChangedSlices.clear();
332
+ pendingFlush = false;
333
+ },
334
+ };
335
+ }
336
+ // `EMPTY_STATE` and caller-provided `initialState` both hold live nested
337
+ // objects. Deep-clone the merged result so (a) multiple fresh contexts do not
338
+ // share nested references, and (b) post-construction mutation of the caller's
339
+ // `initialState` cannot bypass `dispatch()` by aliasing into live state.
340
+ function mergeInitial(initial, preset) {
341
+ const merged = {
342
+ ...EMPTY_STATE,
343
+ ...(initial ?? {}),
344
+ preset: preset ?? initial?.preset ?? EMPTY_STATE.preset,
345
+ };
346
+ return structuredClone(merged);
347
+ }
348
+ /**
349
+ * Deep-copy an `ExplorationState`. Used at the snapshot / restore boundary
350
+ * so that saved snapshots and the live state do not alias shared arrays or
351
+ * nested objects — callers may retain, serialize, and mutate snapshots
352
+ * without side effects on the context, and vice versa.
353
+ */
354
+ function cloneExplorationState(source) {
355
+ return structuredClone(source);
356
+ }
357
+ /**
358
+ * Apply linked-view propagation. Every intent updates central state; the
359
+ * returned set is the subset of changed slices that should wake listeners
360
+ * given the originating view's role.
361
+ *
362
+ * Rules:
363
+ * - If `intent.viewId` is undefined, the intent is "external" — all
364
+ * changed slices propagate.
365
+ * - If the binding exists and the role's preset entry permits the slice,
366
+ * the slice propagates.
367
+ * - If the binding does not exist, treat as external.
368
+ * - `apply-preset` and `snapshot-restore` always propagate fully so that
369
+ * structural changes are visible everywhere.
370
+ */
371
+ function filterByPolicy(changed, intent, policy, bindings) {
372
+ if (intent.kind === "apply-preset" || intent.kind === "snapshot-restore") {
373
+ return changed;
374
+ }
375
+ if (!intent.viewId)
376
+ return changed;
377
+ const binding = bindings.get(intent.viewId);
378
+ if (!binding)
379
+ return changed;
380
+ const allowed = propagationFor(policy.preset, binding.role);
381
+ if (allowed.size === 0)
382
+ return new Set();
383
+ const out = new Set();
384
+ for (const slice of changed) {
385
+ if (allowed.has(slice))
386
+ out.add(slice);
387
+ }
388
+ return out;
389
+ }
390
+ function withViewId(intent, viewId) {
391
+ return { ...intent, viewId };
392
+ }
393
+ function normalizeSubscription(slice) {
394
+ const values = Array.isArray(slice) ? slice : [slice];
395
+ return [...new Set(values)];
396
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * `@honua/sdk-js/exploration` — protocol-neutral state container shared across
3
+ * linked views (map / table / chart). Provides `createExplorationContext()`
4
+ * with preset link policies (`globalLinked`, `mapDriven`, `gridDriven`,
5
+ * `chartDriven`, `decoupled`). See `docs/exploration-context.md` for the
6
+ * full design.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import { createExplorationContext } from "@honua/sdk-js/exploration";
11
+ *
12
+ * const ctx = createExplorationContext({ dataset, preset: "globalLinked" });
13
+ * ctx.dispatch({ type: "set-extent", extent });
14
+ * const unsubscribe = ctx.subscribe(["selection"], (state) => render(state));
15
+ * ```
16
+ *
17
+ * @packageDocumentation
18
+ */
19
+ export { EMPTY_STATE, SLICES, } from "./types.js";
20
+ export type { ApplyPresetIntent, ChangeEvent, ClearFilterIntent, CreateExplorationContextOptions, DeselectIntent, ExplorationContext, ExplorationIntent, ExplorationSlice, ExplorationState, ExplorationStateSnapshot, ExplorationViewChangeEvent, ExplorationViewController, ExplorationViewIntent, ExplorationViewListener, ExplorationViewSubscribeOptions, ExplorationViewSubscription, FeatureSelectionTarget, FilterClause, FilterOperator, LinkedViewPolicy, LinkedViewPresetName, LinkedViewRule, Listener, SelectIntent, SetAggregationIntent, SetExtentIntent, SetFilterIntent, SetGroupingIntent, SetPageIntent, SetSortIntent, SetSpatialFilterIntent, SetVisibleFieldsIntent, SnapshotRestoreIntent, SourceQualifiedFeatureSelectionTarget, Unsubscribe, ViewBinding, ViewHandle, ViewRole, } from "./types.js";
21
+ export { LINKED_VIEW_PRESETS, propagationFor } from "./presets.js";
22
+ export { reduce, type ReducerResult } from "./reducer.js";
23
+ export { createExplorationContext } from "./context.js";
24
+ export { featureSelectionKey, isSourceQualifiedSelectionTarget, sourceFeatureSelectionTarget } from "./selection.js";
25
+ export { extentToSpatialFilter, selectLinkedViewQueryProjection, subscribeExplorationSelector, } from "./selectors.js";
26
+ export type { ExplorationSelector, ExplorationSelectorListener, ExplorationSelectorSubscribeOptions, LinkedViewQueryProjection, LinkedViewQueryProjectionOptions, LinkedViewSpatialMode, } from "./selectors.js";
27
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/exploration/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EACL,WAAW,EACX,MAAM,GACP,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,iBAAiB,EACjB,WAAW,EACX,iBAAiB,EACjB,+BAA+B,EAC/B,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,wBAAwB,EACxB,0BAA0B,EAC1B,yBAAyB,EACzB,qBAAqB,EACrB,uBAAuB,EACvB,+BAA+B,EAC/B,2BAA2B,EAC3B,sBAAsB,EACtB,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,EACd,QAAQ,EACR,YAAY,EACZ,oBAAoB,EACpB,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACrB,qCAAqC,EACrC,WAAW,EACX,WAAW,EACX,UAAU,EACV,QAAQ,GACT,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,gCAAgC,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAC;AACrH,OAAO,EACL,qBAAqB,EACrB,+BAA+B,EAC/B,4BAA4B,GAC7B,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,mBAAmB,EACnB,2BAA2B,EAC3B,mCAAmC,EACnC,yBAAyB,EACzB,gCAAgC,EAChC,qBAAqB,GACtB,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * `@honua/sdk-js/exploration` — protocol-neutral state container shared across
3
+ * linked views (map / table / chart). Provides `createExplorationContext()`
4
+ * with preset link policies (`globalLinked`, `mapDriven`, `gridDriven`,
5
+ * `chartDriven`, `decoupled`). See `docs/exploration-context.md` for the
6
+ * full design.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import { createExplorationContext } from "@honua/sdk-js/exploration";
11
+ *
12
+ * const ctx = createExplorationContext({ dataset, preset: "globalLinked" });
13
+ * ctx.dispatch({ type: "set-extent", extent });
14
+ * const unsubscribe = ctx.subscribe(["selection"], (state) => render(state));
15
+ * ```
16
+ *
17
+ * @packageDocumentation
18
+ */
19
+ export { EMPTY_STATE, SLICES, } from "./types.js";
20
+ export { LINKED_VIEW_PRESETS, propagationFor } from "./presets.js";
21
+ export { reduce } from "./reducer.js";
22
+ export { createExplorationContext } from "./context.js";
23
+ export { featureSelectionKey, isSourceQualifiedSelectionTarget, sourceFeatureSelectionTarget } from "./selection.js";
24
+ export { extentToSpatialFilter, selectLinkedViewQueryProjection, subscribeExplorationSelector, } from "./selectors.js";
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Built-in linked-view presets. The presets are declarative — the reducer
3
+ * uses them to decide whether an intent originating in one view should
4
+ * propagate to peers.
5
+ *
6
+ * Documented in `docs/exploration-context.md`.
7
+ *
8
+ * @module
9
+ */
10
+ import type { ExplorationSlice, LinkedViewPolicy, LinkedViewPresetName, ViewRole } from "./types.js";
11
+ /**
12
+ * Built-in presets. The role-keyed `propagatesSlices` arrays describe what
13
+ * a view of that role contributes when it is the originator of an intent.
14
+ *
15
+ * Usage by the reducer: when an intent arrives with `viewId`, the reducer
16
+ * looks up the originator's role and intersects the slices it changed
17
+ * with the role's `propagatesSlices`. Slices outside the intersection are
18
+ * still applied to the central state but listeners on peer views' specific
19
+ * slice subscriptions are not woken.
20
+ *
21
+ * `globalLinked` is the default — it is the safe choice for prototypes
22
+ * and small dashboards where every change should affect every view.
23
+ */
24
+ export declare const LINKED_VIEW_PRESETS: Readonly<Record<LinkedViewPresetName, LinkedViewPolicy>>;
25
+ /** Lookup the slices a role propagates under a given preset. */
26
+ export declare function propagationFor(preset: LinkedViewPresetName, role: ViewRole): ReadonlySet<ExplorationSlice>;
27
+ //# sourceMappingURL=presets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../../../src/exploration/presets.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAiBrG;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,oBAAoB,EAAE,gBAAgB,CAAC,CA6DxF,CAAC;AAcF,gEAAgE;AAChE,wBAAgB,cAAc,CAAC,MAAM,EAAE,oBAAoB,EAAE,IAAI,EAAE,QAAQ,GAAG,WAAW,CAAC,gBAAgB,CAAC,CAI1G"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Built-in linked-view presets. The presets are declarative — the reducer
3
+ * uses them to decide whether an intent originating in one view should
4
+ * propagate to peers.
5
+ *
6
+ * Documented in `docs/exploration-context.md`.
7
+ *
8
+ * @module
9
+ */
10
+ const ALL_SLICES = [
11
+ "filters",
12
+ "spatialFilter",
13
+ "extent",
14
+ "selection",
15
+ "sort",
16
+ "page",
17
+ "visibleFields",
18
+ "grouping",
19
+ "aggregation",
20
+ "preset",
21
+ ];
22
+ const NO_SLICES = [];
23
+ /**
24
+ * Built-in presets. The role-keyed `propagatesSlices` arrays describe what
25
+ * a view of that role contributes when it is the originator of an intent.
26
+ *
27
+ * Usage by the reducer: when an intent arrives with `viewId`, the reducer
28
+ * looks up the originator's role and intersects the slices it changed
29
+ * with the role's `propagatesSlices`. Slices outside the intersection are
30
+ * still applied to the central state but listeners on peer views' specific
31
+ * slice subscriptions are not woken.
32
+ *
33
+ * `globalLinked` is the default — it is the safe choice for prototypes
34
+ * and small dashboards where every change should affect every view.
35
+ */
36
+ export const LINKED_VIEW_PRESETS = {
37
+ globalLinked: {
38
+ preset: "globalLinked",
39
+ rules: roleRules({
40
+ map: ALL_SLICES,
41
+ grid: ALL_SLICES,
42
+ chart: ALL_SLICES,
43
+ filter: ALL_SLICES,
44
+ detail: ALL_SLICES,
45
+ form: ALL_SLICES,
46
+ custom: ALL_SLICES,
47
+ }),
48
+ },
49
+ mapDriven: {
50
+ preset: "mapDriven",
51
+ rules: roleRules({
52
+ map: ["extent", "spatialFilter", "selection", "filters"],
53
+ grid: NO_SLICES,
54
+ chart: NO_SLICES,
55
+ filter: ["filters", "spatialFilter"],
56
+ detail: NO_SLICES,
57
+ form: NO_SLICES,
58
+ custom: NO_SLICES,
59
+ }),
60
+ },
61
+ gridDriven: {
62
+ preset: "gridDriven",
63
+ rules: roleRules({
64
+ map: NO_SLICES,
65
+ grid: ["selection", "sort", "page", "filters", "visibleFields"],
66
+ chart: NO_SLICES,
67
+ filter: ["filters", "spatialFilter"],
68
+ detail: NO_SLICES,
69
+ form: NO_SLICES,
70
+ custom: NO_SLICES,
71
+ }),
72
+ },
73
+ chartDriven: {
74
+ preset: "chartDriven",
75
+ rules: roleRules({
76
+ map: NO_SLICES,
77
+ grid: NO_SLICES,
78
+ chart: ["grouping", "aggregation", "filters", "selection"],
79
+ filter: ["filters"],
80
+ detail: NO_SLICES,
81
+ form: NO_SLICES,
82
+ custom: NO_SLICES,
83
+ }),
84
+ },
85
+ decoupled: {
86
+ preset: "decoupled",
87
+ rules: roleRules({
88
+ map: NO_SLICES,
89
+ grid: NO_SLICES,
90
+ chart: NO_SLICES,
91
+ filter: NO_SLICES,
92
+ detail: NO_SLICES,
93
+ form: NO_SLICES,
94
+ custom: NO_SLICES,
95
+ }),
96
+ },
97
+ };
98
+ function roleRules(table) {
99
+ return [
100
+ { role: "map", propagatesSlices: table.map },
101
+ { role: "grid", propagatesSlices: table.grid },
102
+ { role: "chart", propagatesSlices: table.chart },
103
+ { role: "filter", propagatesSlices: table.filter },
104
+ { role: "detail", propagatesSlices: table.detail },
105
+ { role: "form", propagatesSlices: table.form },
106
+ { role: "custom", propagatesSlices: table.custom },
107
+ ];
108
+ }
109
+ /** Lookup the slices a role propagates under a given preset. */
110
+ export function propagationFor(preset, role) {
111
+ const policy = LINKED_VIEW_PRESETS[preset];
112
+ const rule = policy.rules.find((r) => r.role === role);
113
+ return new Set(rule?.propagatesSlices ?? NO_SLICES);
114
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Pure reducer for `ExplorationState`. Every transition returns a new
3
+ * state object — readers may use referential equality to detect change on
4
+ * any slice (e.g. `prev.filters !== next.filters`).
5
+ *
6
+ * The reducer does not own scheduling, propagation, or events; those live
7
+ * in `./context.ts`.
8
+ *
9
+ * @module
10
+ */
11
+ import type { ExplorationIntent, ExplorationSlice, ExplorationState } from "./types.js";
12
+ export interface ReducerResult {
13
+ readonly state: ExplorationState;
14
+ readonly changedSlices: ReadonlySet<ExplorationSlice>;
15
+ }
16
+ /**
17
+ * Apply one intent. Returns the next state plus the set of slices that
18
+ * actually changed (by reference). Callers compare the set rather than
19
+ * re-deriving it so that "no-op" intents (e.g. setting the same sort)
20
+ * do not wake listeners.
21
+ */
22
+ export declare function reduce(state: ExplorationState, intent: ExplorationIntent): ReducerResult;
23
+ //# sourceMappingURL=reducer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reducer.d.ts","sourceRoot":"","sources":["../../../src/exploration/reducer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,KAAK,EACV,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAGjB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC;IACjC,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC,gBAAgB,CAAC,CAAC;CACvD;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,iBAAiB,GAAG,aAAa,CA4GxF"}