@honua/app-platform 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 (840) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +11 -0
  3. package/app/index.d.ts +164 -0
  4. package/app/index.d.ts.map +1 -0
  5. package/app/index.js +424 -0
  6. package/app-controller/controller.d.ts +425 -0
  7. package/app-controller/controller.d.ts.map +1 -0
  8. package/app-controller/controller.js +1173 -0
  9. package/app-controller/index.d.ts +14 -0
  10. package/app-controller/index.d.ts.map +1 -0
  11. package/app-controller/index.js +12 -0
  12. package/app-workspace/index.d.ts +421 -0
  13. package/app-workspace/index.d.ts.map +1 -0
  14. package/app-workspace/index.js +722 -0
  15. package/collaboration/client.d.ts +40 -0
  16. package/collaboration/client.d.ts.map +1 -0
  17. package/collaboration/client.js +299 -0
  18. package/collaboration/errors.d.ts +15 -0
  19. package/collaboration/errors.d.ts.map +1 -0
  20. package/collaboration/errors.js +17 -0
  21. package/collaboration/fixture.d.ts +41 -0
  22. package/collaboration/fixture.d.ts.map +1 -0
  23. package/collaboration/fixture.js +362 -0
  24. package/collaboration/index.d.ts +18 -0
  25. package/collaboration/index.d.ts.map +1 -0
  26. package/collaboration/index.js +14 -0
  27. package/collaboration/types.d.ts +240 -0
  28. package/collaboration/types.d.ts.map +1 -0
  29. package/collaboration/types.js +1 -0
  30. package/contract/analytics-sources.d.ts +149 -0
  31. package/contract/analytics-sources.d.ts.map +1 -0
  32. package/contract/analytics-sources.js +235 -0
  33. package/contract/edit-session.d.ts +203 -0
  34. package/contract/edit-session.d.ts.map +1 -0
  35. package/contract/edit-session.js +760 -0
  36. package/contract/edit-sketch.d.ts +91 -0
  37. package/contract/edit-sketch.d.ts.map +1 -0
  38. package/contract/edit-sketch.js +281 -0
  39. package/contract/index.d.ts +63 -0
  40. package/contract/index.d.ts.map +1 -0
  41. package/contract/index.js +52 -0
  42. package/contract/jobs.d.ts +149 -0
  43. package/contract/jobs.d.ts.map +1 -0
  44. package/contract/jobs.js +40 -0
  45. package/contract/pmtiles.d.ts +162 -0
  46. package/contract/pmtiles.d.ts.map +1 -0
  47. package/contract/pmtiles.js +155 -0
  48. package/contract/source.d.ts +447 -0
  49. package/contract/source.d.ts.map +1 -0
  50. package/contract/source.js +3909 -0
  51. package/contract/spatial-aggregation.d.ts +336 -0
  52. package/contract/spatial-aggregation.d.ts.map +1 -0
  53. package/contract/spatial-aggregation.js +298 -0
  54. package/contract/temporal.d.ts +455 -0
  55. package/contract/temporal.d.ts.map +1 -0
  56. package/contract/temporal.js +146 -0
  57. package/contract/tiles.d.ts +370 -0
  58. package/contract/tiles.d.ts.map +1 -0
  59. package/contract/tiles.js +519 -0
  60. package/contract/types.d.ts +694 -0
  61. package/contract/types.d.ts.map +1 -0
  62. package/contract/types.js +183 -0
  63. package/contract/widget-source.d.ts +205 -0
  64. package/contract/widget-source.d.ts.map +1 -0
  65. package/contract/widget-source.js +1473 -0
  66. package/control-plane/client.d.ts +95 -0
  67. package/control-plane/client.d.ts.map +1 -0
  68. package/control-plane/client.js +374 -0
  69. package/control-plane/index.d.ts +18 -0
  70. package/control-plane/index.d.ts.map +1 -0
  71. package/control-plane/index.js +14 -0
  72. package/control-plane/types.d.ts +233 -0
  73. package/control-plane/types.d.ts.map +1 -0
  74. package/control-plane/types.js +7 -0
  75. package/controls/basemap-style-binding.d.ts +54 -0
  76. package/controls/basemap-style-binding.d.ts.map +1 -0
  77. package/controls/basemap-style-binding.js +199 -0
  78. package/controls/basemap-switcher.d.ts +95 -0
  79. package/controls/basemap-switcher.d.ts.map +1 -0
  80. package/controls/basemap-switcher.js +379 -0
  81. package/controls/element-utils.d.ts +48 -0
  82. package/controls/element-utils.d.ts.map +1 -0
  83. package/controls/element-utils.js +78 -0
  84. package/controls/index.d.ts +33 -0
  85. package/controls/index.d.ts.map +1 -0
  86. package/controls/index.js +30 -0
  87. package/controls/layer-list.d.ts +98 -0
  88. package/controls/layer-list.d.ts.map +1 -0
  89. package/controls/layer-list.js +375 -0
  90. package/controls/legend-derive.d.ts +53 -0
  91. package/controls/legend-derive.d.ts.map +1 -0
  92. package/controls/legend-derive.js +196 -0
  93. package/controls/legend.d.ts +104 -0
  94. package/controls/legend.d.ts.map +1 -0
  95. package/controls/legend.js +381 -0
  96. package/controls/swipe-control.d.ts +80 -0
  97. package/controls/swipe-control.d.ts.map +1 -0
  98. package/controls/swipe-control.js +368 -0
  99. package/controls/types.d.ts +227 -0
  100. package/controls/types.d.ts.map +1 -0
  101. package/controls/types.js +11 -0
  102. package/core/auth/client-credentials-provider.d.ts +51 -0
  103. package/core/auth/client-credentials-provider.d.ts.map +1 -0
  104. package/core/auth/client-credentials-provider.js +115 -0
  105. package/core/auth/credential-store.d.ts +52 -0
  106. package/core/auth/credential-store.d.ts.map +1 -0
  107. package/core/auth/credential-store.js +82 -0
  108. package/core/auth/index.d.ts +23 -0
  109. package/core/auth/index.d.ts.map +1 -0
  110. package/core/auth/index.js +20 -0
  111. package/core/auth/oauth2-provider.d.ts +114 -0
  112. package/core/auth/oauth2-provider.d.ts.map +1 -0
  113. package/core/auth/oauth2-provider.js +408 -0
  114. package/core/auth/pkce.d.ts +25 -0
  115. package/core/auth/pkce.d.ts.map +1 -0
  116. package/core/auth/pkce.js +46 -0
  117. package/core/auth/static-providers.d.ts +20 -0
  118. package/core/auth/static-providers.d.ts.map +1 -0
  119. package/core/auth/static-providers.js +26 -0
  120. package/core/auth/token-endpoint.d.ts +40 -0
  121. package/core/auth/token-endpoint.d.ts.map +1 -0
  122. package/core/auth/token-endpoint.js +133 -0
  123. package/core/auth/types.d.ts +144 -0
  124. package/core/auth/types.d.ts.map +1 -0
  125. package/core/auth/types.js +8 -0
  126. package/core/batch.d.ts +37 -0
  127. package/core/batch.d.ts.map +1 -0
  128. package/core/batch.js +79 -0
  129. package/core/cache-state.d.ts +79 -0
  130. package/core/cache-state.d.ts.map +1 -0
  131. package/core/cache-state.js +87 -0
  132. package/core/client.d.ts +607 -0
  133. package/core/client.d.ts.map +1 -0
  134. package/core/client.js +1716 -0
  135. package/core/compatibility.d.ts +18 -0
  136. package/core/compatibility.d.ts.map +1 -0
  137. package/core/compatibility.js +245 -0
  138. package/core/errors.d.ts +139 -0
  139. package/core/errors.d.ts.map +1 -0
  140. package/core/errors.js +176 -0
  141. package/core/esri-geojson.d.ts +66 -0
  142. package/core/esri-geojson.d.ts.map +1 -0
  143. package/core/esri-geojson.js +363 -0
  144. package/core/geoparquet-sql.d.ts +162 -0
  145. package/core/geoparquet-sql.d.ts.map +1 -0
  146. package/core/geoparquet-sql.js +333 -0
  147. package/core/geoservices.d.ts +34 -0
  148. package/core/geoservices.d.ts.map +1 -0
  149. package/core/geoservices.js +434 -0
  150. package/core/grpc-adapter.d.ts +23 -0
  151. package/core/grpc-adapter.d.ts.map +1 -0
  152. package/core/grpc-adapter.js +688 -0
  153. package/core/odata.d.ts +347 -0
  154. package/core/odata.d.ts.map +1 -0
  155. package/core/odata.js +913 -0
  156. package/core/ogc-conformance.d.ts +35 -0
  157. package/core/ogc-conformance.d.ts.map +1 -0
  158. package/core/ogc-conformance.js +134 -0
  159. package/core/ogc-endpoint-layout.d.ts +70 -0
  160. package/core/ogc-endpoint-layout.d.ts.map +1 -0
  161. package/core/ogc-endpoint-layout.js +173 -0
  162. package/core/ogc-features.d.ts +23 -0
  163. package/core/ogc-features.d.ts.map +1 -0
  164. package/core/ogc-features.js +129 -0
  165. package/core/ogc-maps.d.ts +49 -0
  166. package/core/ogc-maps.d.ts.map +1 -0
  167. package/core/ogc-maps.js +126 -0
  168. package/core/ogc-processes.d.ts +118 -0
  169. package/core/ogc-processes.d.ts.map +1 -0
  170. package/core/ogc-processes.js +423 -0
  171. package/core/ogc-records.d.ts +75 -0
  172. package/core/ogc-records.d.ts.map +1 -0
  173. package/core/ogc-records.js +251 -0
  174. package/core/ogc-tiles.d.ts +125 -0
  175. package/core/ogc-tiles.d.ts.map +1 -0
  176. package/core/ogc-tiles.js +183 -0
  177. package/core/path-utils.d.ts +69 -0
  178. package/core/path-utils.d.ts.map +1 -0
  179. package/core/path-utils.js +123 -0
  180. package/core/pbf-decoder.d.ts +39 -0
  181. package/core/pbf-decoder.d.ts.map +1 -0
  182. package/core/pbf-decoder.js +702 -0
  183. package/core/process-runner.d.ts +104 -0
  184. package/core/process-runner.d.ts.map +1 -0
  185. package/core/process-runner.js +315 -0
  186. package/core/protocol-transport.d.ts +76 -0
  187. package/core/protocol-transport.d.ts.map +1 -0
  188. package/core/protocol-transport.js +15 -0
  189. package/core/query-builder.d.ts +261 -0
  190. package/core/query-builder.d.ts.map +1 -0
  191. package/core/query-builder.js +538 -0
  192. package/core/request-pipeline.d.ts +88 -0
  193. package/core/request-pipeline.d.ts.map +1 -0
  194. package/core/request-pipeline.js +273 -0
  195. package/core/spatial-filter.d.ts +93 -0
  196. package/core/spatial-filter.d.ts.map +1 -0
  197. package/core/spatial-filter.js +153 -0
  198. package/core/stac-static.d.ts +51 -0
  199. package/core/stac-static.d.ts.map +1 -0
  200. package/core/stac-static.js +195 -0
  201. package/core/stac.d.ts +67 -0
  202. package/core/stac.d.ts.map +1 -0
  203. package/core/stac.js +259 -0
  204. package/core/surfaces.d.ts +540 -0
  205. package/core/surfaces.d.ts.map +1 -0
  206. package/core/surfaces.js +1964 -0
  207. package/core/terrain-elevation.d.ts +114 -0
  208. package/core/terrain-elevation.d.ts.map +1 -0
  209. package/core/terrain-elevation.js +150 -0
  210. package/core/types.d.ts +1404 -0
  211. package/core/types.d.ts.map +1 -0
  212. package/core/types.js +13 -0
  213. package/core/wfs-capabilities.d.ts +153 -0
  214. package/core/wfs-capabilities.d.ts.map +1 -0
  215. package/core/wfs-capabilities.js +490 -0
  216. package/core/wfs-filter.d.ts +118 -0
  217. package/core/wfs-filter.d.ts.map +1 -0
  218. package/core/wfs-filter.js +634 -0
  219. package/core/wfs.d.ts +232 -0
  220. package/core/wfs.d.ts.map +1 -0
  221. package/core/wfs.js +426 -0
  222. package/core/wire-shared.d.ts +32 -0
  223. package/core/wire-shared.d.ts.map +1 -0
  224. package/core/wire-shared.js +76 -0
  225. package/core/wms-axis.d.ts +36 -0
  226. package/core/wms-axis.d.ts.map +1 -0
  227. package/core/wms-axis.js +73 -0
  228. package/core/wms-capabilities.d.ts +110 -0
  229. package/core/wms-capabilities.d.ts.map +1 -0
  230. package/core/wms-capabilities.js +559 -0
  231. package/core/wms-types.d.ts +128 -0
  232. package/core/wms-types.d.ts.map +1 -0
  233. package/core/wms-types.js +32 -0
  234. package/core/wms.d.ts +144 -0
  235. package/core/wms.d.ts.map +1 -0
  236. package/core/wms.js +338 -0
  237. package/core/wmts-capabilities.d.ts +82 -0
  238. package/core/wmts-capabilities.d.ts.map +1 -0
  239. package/core/wmts-capabilities.js +402 -0
  240. package/core/wmts.d.ts +103 -0
  241. package/core/wmts.d.ts.map +1 -0
  242. package/core/wmts.js +332 -0
  243. package/core/xml-text.d.ts +20 -0
  244. package/core/xml-text.d.ts.map +1 -0
  245. package/core/xml-text.js +85 -0
  246. package/esri-compat/basemap-gallery.d.ts +38 -0
  247. package/esri-compat/basemap-gallery.d.ts.map +1 -0
  248. package/esri-compat/basemap-gallery.js +159 -0
  249. package/esri-compat/basemap-layer-list.d.ts +35 -0
  250. package/esri-compat/basemap-layer-list.d.ts.map +1 -0
  251. package/esri-compat/basemap-layer-list.js +139 -0
  252. package/esri-compat/basemap.d.ts +32 -0
  253. package/esri-compat/basemap.d.ts.map +1 -0
  254. package/esri-compat/basemap.js +84 -0
  255. package/esri-compat/bookmarks.d.ts +36 -0
  256. package/esri-compat/bookmarks.d.ts.map +1 -0
  257. package/esri-compat/bookmarks.js +108 -0
  258. package/esri-compat/class-breaks-renderer.d.ts +50 -0
  259. package/esri-compat/class-breaks-renderer.d.ts.map +1 -0
  260. package/esri-compat/class-breaks-renderer.js +164 -0
  261. package/esri-compat/color.d.ts +22 -0
  262. package/esri-compat/color.d.ts.map +1 -0
  263. package/esri-compat/color.js +106 -0
  264. package/esri-compat/controls.d.ts +174 -0
  265. package/esri-compat/controls.d.ts.map +1 -0
  266. package/esri-compat/controls.js +479 -0
  267. package/esri-compat/coordinate-conversion.d.ts +41 -0
  268. package/esri-compat/coordinate-conversion.d.ts.map +1 -0
  269. package/esri-compat/coordinate-conversion.js +125 -0
  270. package/esri-compat/directions.d.ts +45 -0
  271. package/esri-compat/directions.d.ts.map +1 -0
  272. package/esri-compat/directions.js +123 -0
  273. package/esri-compat/editor.d.ts +47 -0
  274. package/esri-compat/editor.d.ts.map +1 -0
  275. package/esri-compat/editor.js +170 -0
  276. package/esri-compat/esri-config.d.ts +16 -0
  277. package/esri-compat/esri-config.d.ts.map +1 -0
  278. package/esri-compat/esri-config.js +23 -0
  279. package/esri-compat/esri-request.d.ts +17 -0
  280. package/esri-compat/esri-request.d.ts.map +1 -0
  281. package/esri-compat/esri-request.js +127 -0
  282. package/esri-compat/event-bus.d.ts +106 -0
  283. package/esri-compat/event-bus.d.ts.map +1 -0
  284. package/esri-compat/event-bus.js +90 -0
  285. package/esri-compat/expand.d.ts +36 -0
  286. package/esri-compat/expand.d.ts.map +1 -0
  287. package/esri-compat/expand.js +97 -0
  288. package/esri-compat/extent.d.ts +43 -0
  289. package/esri-compat/extent.d.ts.map +1 -0
  290. package/esri-compat/extent.js +140 -0
  291. package/esri-compat/feature-filter.d.ts +55 -0
  292. package/esri-compat/feature-filter.d.ts.map +1 -0
  293. package/esri-compat/feature-filter.js +109 -0
  294. package/esri-compat/feature-form.d.ts +64 -0
  295. package/esri-compat/feature-form.d.ts.map +1 -0
  296. package/esri-compat/feature-form.js +137 -0
  297. package/esri-compat/feature-layer.d.ts +173 -0
  298. package/esri-compat/feature-layer.d.ts.map +1 -0
  299. package/esri-compat/feature-layer.js +661 -0
  300. package/esri-compat/feature-set.d.ts +32 -0
  301. package/esri-compat/feature-set.d.ts.map +1 -0
  302. package/esri-compat/feature-set.js +80 -0
  303. package/esri-compat/feature-table.d.ts +141 -0
  304. package/esri-compat/feature-table.d.ts.map +1 -0
  305. package/esri-compat/feature-table.js +500 -0
  306. package/esri-compat/feature-templates.d.ts +41 -0
  307. package/esri-compat/feature-templates.d.ts.map +1 -0
  308. package/esri-compat/feature-templates.js +97 -0
  309. package/esri-compat/feature.d.ts +33 -0
  310. package/esri-compat/feature.d.ts.map +1 -0
  311. package/esri-compat/feature.js +83 -0
  312. package/esri-compat/geojson-layer.d.ts +86 -0
  313. package/esri-compat/geojson-layer.d.ts.map +1 -0
  314. package/esri-compat/geojson-layer.js +191 -0
  315. package/esri-compat/geometry-engine.d.ts +107 -0
  316. package/esri-compat/geometry-engine.d.ts.map +1 -0
  317. package/esri-compat/geometry-engine.js +266 -0
  318. package/esri-compat/graphic.d.ts +46 -0
  319. package/esri-compat/graphic.d.ts.map +1 -0
  320. package/esri-compat/graphic.js +103 -0
  321. package/esri-compat/graphics-layer.d.ts +49 -0
  322. package/esri-compat/graphics-layer.d.ts.map +1 -0
  323. package/esri-compat/graphics-layer.js +185 -0
  324. package/esri-compat/group-layer.d.ts +48 -0
  325. package/esri-compat/group-layer.d.ts.map +1 -0
  326. package/esri-compat/group-layer.js +212 -0
  327. package/esri-compat/identify.d.ts +71 -0
  328. package/esri-compat/identify.d.ts.map +1 -0
  329. package/esri-compat/identify.js +299 -0
  330. package/esri-compat/identity-manager.d.ts +74 -0
  331. package/esri-compat/identity-manager.d.ts.map +1 -0
  332. package/esri-compat/identity-manager.js +245 -0
  333. package/esri-compat/imagery-layer.d.ts +78 -0
  334. package/esri-compat/imagery-layer.d.ts.map +1 -0
  335. package/esri-compat/imagery-layer.js +167 -0
  336. package/esri-compat/label-class.d.ts +31 -0
  337. package/esri-compat/label-class.d.ts.map +1 -0
  338. package/esri-compat/label-class.js +102 -0
  339. package/esri-compat/layer-list.d.ts +77 -0
  340. package/esri-compat/layer-list.d.ts.map +1 -0
  341. package/esri-compat/layer-list.js +342 -0
  342. package/esri-compat/legend.d.ts +53 -0
  343. package/esri-compat/legend.d.ts.map +1 -0
  344. package/esri-compat/legend.js +254 -0
  345. package/esri-compat/map-image-layer.d.ts +162 -0
  346. package/esri-compat/map-image-layer.d.ts.map +1 -0
  347. package/esri-compat/map-image-layer.js +709 -0
  348. package/esri-compat/map-view.d.ts +323 -0
  349. package/esri-compat/map-view.d.ts.map +1 -0
  350. package/esri-compat/map-view.js +1175 -0
  351. package/esri-compat/map.d.ts +47 -0
  352. package/esri-compat/map.d.ts.map +1 -0
  353. package/esri-compat/map.js +209 -0
  354. package/esri-compat/measurement-2d.d.ts +61 -0
  355. package/esri-compat/measurement-2d.d.ts.map +1 -0
  356. package/esri-compat/measurement-2d.js +184 -0
  357. package/esri-compat/measurement.d.ts +45 -0
  358. package/esri-compat/measurement.d.ts.map +1 -0
  359. package/esri-compat/measurement.js +193 -0
  360. package/esri-compat/oauth-info.d.ts +50 -0
  361. package/esri-compat/oauth-info.d.ts.map +1 -0
  362. package/esri-compat/oauth-info.js +142 -0
  363. package/esri-compat/picture-marker-symbol.d.ts +35 -0
  364. package/esri-compat/picture-marker-symbol.d.ts.map +1 -0
  365. package/esri-compat/picture-marker-symbol.js +126 -0
  366. package/esri-compat/point.d.ts +31 -0
  367. package/esri-compat/point.d.ts.map +1 -0
  368. package/esri-compat/point.js +102 -0
  369. package/esri-compat/polygon.d.ts +31 -0
  370. package/esri-compat/polygon.d.ts.map +1 -0
  371. package/esri-compat/polygon.js +107 -0
  372. package/esri-compat/polyline.d.ts +31 -0
  373. package/esri-compat/polyline.d.ts.map +1 -0
  374. package/esri-compat/polyline.js +107 -0
  375. package/esri-compat/popup-template.d.ts +55 -0
  376. package/esri-compat/popup-template.d.ts.map +1 -0
  377. package/esri-compat/popup-template.js +128 -0
  378. package/esri-compat/popup.d.ts +54 -0
  379. package/esri-compat/popup.d.ts.map +1 -0
  380. package/esri-compat/popup.js +312 -0
  381. package/esri-compat/print.d.ts +47 -0
  382. package/esri-compat/print.d.ts.map +1 -0
  383. package/esri-compat/print.js +105 -0
  384. package/esri-compat/query.d.ts +58 -0
  385. package/esri-compat/query.d.ts.map +1 -0
  386. package/esri-compat/query.js +128 -0
  387. package/esri-compat/reactive-utils.d.ts +24 -0
  388. package/esri-compat/reactive-utils.d.ts.map +1 -0
  389. package/esri-compat/reactive-utils.js +193 -0
  390. package/esri-compat/request.d.ts +41 -0
  391. package/esri-compat/request.d.ts.map +1 -0
  392. package/esri-compat/request.js +253 -0
  393. package/esri-compat/route-layer.d.ts +59 -0
  394. package/esri-compat/route-layer.d.ts.map +1 -0
  395. package/esri-compat/route-layer.js +223 -0
  396. package/esri-compat/route-task.d.ts +88 -0
  397. package/esri-compat/route-task.d.ts.map +1 -0
  398. package/esri-compat/route-task.js +225 -0
  399. package/esri-compat/scene-view.d.ts +41 -0
  400. package/esri-compat/scene-view.d.ts.map +1 -0
  401. package/esri-compat/scene-view.js +68 -0
  402. package/esri-compat/search.d.ts +112 -0
  403. package/esri-compat/search.d.ts.map +1 -0
  404. package/esri-compat/search.js +820 -0
  405. package/esri-compat/simple-fill-symbol.d.ts +27 -0
  406. package/esri-compat/simple-fill-symbol.d.ts.map +1 -0
  407. package/esri-compat/simple-fill-symbol.js +85 -0
  408. package/esri-compat/simple-line-symbol.d.ts +27 -0
  409. package/esri-compat/simple-line-symbol.d.ts.map +1 -0
  410. package/esri-compat/simple-line-symbol.js +85 -0
  411. package/esri-compat/simple-marker-symbol.d.ts +29 -0
  412. package/esri-compat/simple-marker-symbol.d.ts.map +1 -0
  413. package/esri-compat/simple-marker-symbol.js +92 -0
  414. package/esri-compat/simple-renderer.d.ts +29 -0
  415. package/esri-compat/simple-renderer.d.ts.map +1 -0
  416. package/esri-compat/simple-renderer.js +92 -0
  417. package/esri-compat/sketch.d.ts +64 -0
  418. package/esri-compat/sketch.d.ts.map +1 -0
  419. package/esri-compat/sketch.js +227 -0
  420. package/esri-compat/spatial-reference.d.ts +31 -0
  421. package/esri-compat/spatial-reference.d.ts.map +1 -0
  422. package/esri-compat/spatial-reference.js +102 -0
  423. package/esri-compat/swipe.d.ts +34 -0
  424. package/esri-compat/swipe.d.ts.map +1 -0
  425. package/esri-compat/swipe.js +93 -0
  426. package/esri-compat/table-list.d.ts +36 -0
  427. package/esri-compat/table-list.d.ts.map +1 -0
  428. package/esri-compat/table-list.js +126 -0
  429. package/esri-compat/text-symbol.d.ts +37 -0
  430. package/esri-compat/text-symbol.d.ts.map +1 -0
  431. package/esri-compat/text-symbol.js +123 -0
  432. package/esri-compat/tile-layer.d.ts +52 -0
  433. package/esri-compat/tile-layer.d.ts.map +1 -0
  434. package/esri-compat/tile-layer.js +168 -0
  435. package/esri-compat/time-slider.d.ts +70 -0
  436. package/esri-compat/time-slider.d.ts.map +1 -0
  437. package/esri-compat/time-slider.js +208 -0
  438. package/esri-compat/track.d.ts +51 -0
  439. package/esri-compat/track.d.ts.map +1 -0
  440. package/esri-compat/track.js +174 -0
  441. package/esri-compat/unique-value-renderer.d.ts +41 -0
  442. package/esri-compat/unique-value-renderer.d.ts.map +1 -0
  443. package/esri-compat/unique-value-renderer.js +127 -0
  444. package/esri-compat/url.d.ts +13 -0
  445. package/esri-compat/url.d.ts.map +1 -0
  446. package/esri-compat/url.js +68 -0
  447. package/esri-compat/vector-tile-layer.d.ts +47 -0
  448. package/esri-compat/vector-tile-layer.d.ts.map +1 -0
  449. package/esri-compat/vector-tile-layer.js +130 -0
  450. package/esri-compat/web-map.d.ts +14 -0
  451. package/esri-compat/web-map.d.ts.map +1 -0
  452. package/esri-compat/web-map.js +24 -0
  453. package/esri-compat/wfs-layer.d.ts +64 -0
  454. package/esri-compat/wfs-layer.d.ts.map +1 -0
  455. package/esri-compat/wfs-layer.js +145 -0
  456. package/esri-compat/wms-layer.d.ts +76 -0
  457. package/esri-compat/wms-layer.d.ts.map +1 -0
  458. package/esri-compat/wms-layer.js +157 -0
  459. package/exploration/context.d.ts +25 -0
  460. package/exploration/context.d.ts.map +1 -0
  461. package/exploration/context.js +396 -0
  462. package/exploration/index.d.ts +27 -0
  463. package/exploration/index.d.ts.map +1 -0
  464. package/exploration/index.js +24 -0
  465. package/exploration/presets.d.ts +27 -0
  466. package/exploration/presets.d.ts.map +1 -0
  467. package/exploration/presets.js +114 -0
  468. package/exploration/reducer.d.ts +23 -0
  469. package/exploration/reducer.d.ts.map +1 -0
  470. package/exploration/reducer.js +332 -0
  471. package/exploration/selection.d.ts +25 -0
  472. package/exploration/selection.d.ts.map +1 -0
  473. package/exploration/selection.js +34 -0
  474. package/exploration/selectors.d.ts +56 -0
  475. package/exploration/selectors.d.ts.map +1 -0
  476. package/exploration/selectors.js +110 -0
  477. package/exploration/types.d.ts +294 -0
  478. package/exploration/types.d.ts.map +1 -0
  479. package/exploration/types.js +33 -0
  480. package/expr/expression.d.ts +457 -0
  481. package/expr/expression.d.ts.map +1 -0
  482. package/expr/expression.js +663 -0
  483. package/expr/index.d.ts +32 -0
  484. package/expr/index.d.ts.map +1 -0
  485. package/expr/index.js +30 -0
  486. package/filter-registry/index.d.ts +145 -0
  487. package/filter-registry/index.d.ts.map +1 -0
  488. package/filter-registry/index.js +531 -0
  489. package/gen/honua/v1/feature_service_pb.d.ts +918 -0
  490. package/gen/honua/v1/feature_service_pb.d.ts.map +1 -0
  491. package/gen/honua/v1/feature_service_pb.js +375 -0
  492. package/generated-app/errors.d.ts +41 -0
  493. package/generated-app/errors.d.ts.map +1 -0
  494. package/generated-app/errors.js +41 -0
  495. package/generated-app/index.d.ts +17 -0
  496. package/generated-app/index.d.ts.map +1 -0
  497. package/generated-app/index.js +12 -0
  498. package/generated-app/manifest.d.ts +183 -0
  499. package/generated-app/manifest.d.ts.map +1 -0
  500. package/generated-app/manifest.js +14 -0
  501. package/generated-app/projection.d.ts +44 -0
  502. package/generated-app/projection.d.ts.map +1 -0
  503. package/generated-app/projection.js +234 -0
  504. package/generated-app/runtime.d.ts +215 -0
  505. package/generated-app/runtime.d.ts.map +1 -0
  506. package/generated-app/runtime.js +1196 -0
  507. package/geocoding/index.d.ts +106 -0
  508. package/geocoding/index.d.ts.map +1 -0
  509. package/geocoding/index.js +278 -0
  510. package/interactions/detail-model.d.ts +54 -0
  511. package/interactions/detail-model.d.ts.map +1 -0
  512. package/interactions/detail-model.js +105 -0
  513. package/interactions/exploration-bindings.d.ts +120 -0
  514. package/interactions/exploration-bindings.d.ts.map +1 -0
  515. package/interactions/exploration-bindings.js +218 -0
  516. package/interactions/feature-state.d.ts +144 -0
  517. package/interactions/feature-state.d.ts.map +1 -0
  518. package/interactions/feature-state.js +169 -0
  519. package/interactions/hit-test.d.ts +112 -0
  520. package/interactions/hit-test.d.ts.map +1 -0
  521. package/interactions/hit-test.js +291 -0
  522. package/interactions/index.d.ts +31 -0
  523. package/interactions/index.d.ts.map +1 -0
  524. package/interactions/index.js +24 -0
  525. package/interactions/share-state.d.ts +36 -0
  526. package/interactions/share-state.d.ts.map +1 -0
  527. package/interactions/share-state.js +123 -0
  528. package/map/feature-service-adapter.d.ts +138 -0
  529. package/map/feature-service-adapter.d.ts.map +1 -0
  530. package/map/feature-service-adapter.js +279 -0
  531. package/map/honua-map.d.ts +203 -0
  532. package/map/honua-map.d.ts.map +1 -0
  533. package/map/honua-map.js +347 -0
  534. package/map/index.d.ts +27 -0
  535. package/map/index.d.ts.map +1 -0
  536. package/map/index.js +22 -0
  537. package/map/maplibre-target.d.ts +103 -0
  538. package/map/maplibre-target.d.ts.map +1 -0
  539. package/map/maplibre-target.js +164 -0
  540. package/map/webmap-maplibre.d.ts +60 -0
  541. package/map/webmap-maplibre.d.ts.map +1 -0
  542. package/map/webmap-maplibre.js +212 -0
  543. package/operate/client.d.ts +94 -0
  544. package/operate/client.d.ts.map +1 -0
  545. package/operate/client.js +361 -0
  546. package/operate/index.d.ts +22 -0
  547. package/operate/index.d.ts.map +1 -0
  548. package/operate/index.js +19 -0
  549. package/operate/types.d.ts +397 -0
  550. package/operate/types.d.ts.map +1 -0
  551. package/operate/types.js +17 -0
  552. package/operator/client.d.ts +60 -0
  553. package/operator/client.d.ts.map +1 -0
  554. package/operator/client.js +20 -0
  555. package/operator/controllers/approval.d.ts +52 -0
  556. package/operator/controllers/approval.d.ts.map +1 -0
  557. package/operator/controllers/approval.js +123 -0
  558. package/operator/controllers/base.d.ts +27 -0
  559. package/operator/controllers/base.d.ts.map +1 -0
  560. package/operator/controllers/base.js +53 -0
  561. package/operator/controllers/builder-workspace.d.ts +55 -0
  562. package/operator/controllers/builder-workspace.d.ts.map +1 -0
  563. package/operator/controllers/builder-workspace.js +108 -0
  564. package/operator/controllers/chat.d.ts +61 -0
  565. package/operator/controllers/chat.d.ts.map +1 -0
  566. package/operator/controllers/chat.js +154 -0
  567. package/operator/controllers/clarification.d.ts +52 -0
  568. package/operator/controllers/clarification.d.ts.map +1 -0
  569. package/operator/controllers/clarification.js +121 -0
  570. package/operator/controllers/execution.d.ts +60 -0
  571. package/operator/controllers/execution.d.ts.map +1 -0
  572. package/operator/controllers/execution.js +286 -0
  573. package/operator/controllers/index.d.ts +23 -0
  574. package/operator/controllers/index.d.ts.map +1 -0
  575. package/operator/controllers/index.js +15 -0
  576. package/operator/controllers/map-workspace.d.ts +85 -0
  577. package/operator/controllers/map-workspace.d.ts.map +1 -0
  578. package/operator/controllers/map-workspace.js +296 -0
  579. package/operator/controllers/plan-review.d.ts +66 -0
  580. package/operator/controllers/plan-review.d.ts.map +1 -0
  581. package/operator/controllers/plan-review.js +124 -0
  582. package/operator/errors.d.ts +62 -0
  583. package/operator/errors.d.ts.map +1 -0
  584. package/operator/errors.js +75 -0
  585. package/operator/i18n/index.d.ts +10 -0
  586. package/operator/i18n/index.d.ts.map +1 -0
  587. package/operator/i18n/index.js +8 -0
  588. package/operator/i18n/messages.d.ts +19 -0
  589. package/operator/i18n/messages.d.ts.map +1 -0
  590. package/operator/i18n/messages.js +54 -0
  591. package/operator/index.d.ts +19 -0
  592. package/operator/index.d.ts.map +1 -0
  593. package/operator/index.js +15 -0
  594. package/operator/telemetry.d.ts +26 -0
  595. package/operator/telemetry.d.ts.map +1 -0
  596. package/operator/telemetry.js +9 -0
  597. package/operator/theming/index.d.ts +12 -0
  598. package/operator/theming/index.d.ts.map +1 -0
  599. package/operator/theming/index.js +9 -0
  600. package/operator/theming/provider.d.ts +27 -0
  601. package/operator/theming/provider.d.ts.map +1 -0
  602. package/operator/theming/provider.js +26 -0
  603. package/operator/theming/tokens.d.ts +28 -0
  604. package/operator/theming/tokens.d.ts.map +1 -0
  605. package/operator/theming/tokens.js +65 -0
  606. package/operator/workspace/events.d.ts +70 -0
  607. package/operator/workspace/events.d.ts.map +1 -0
  608. package/operator/workspace/events.js +9 -0
  609. package/operator/workspace/index.d.ts +12 -0
  610. package/operator/workspace/index.d.ts.map +1 -0
  611. package/operator/workspace/index.js +8 -0
  612. package/operator/workspace/types.d.ts +178 -0
  613. package/operator/workspace/types.d.ts.map +1 -0
  614. package/operator/workspace/types.js +47 -0
  615. package/operator/workspace/workspace.d.ts +58 -0
  616. package/operator/workspace/workspace.d.ts.map +1 -0
  617. package/operator/workspace/workspace.js +339 -0
  618. package/package.json +105 -0
  619. package/realtime/exploration.d.ts +16 -0
  620. package/realtime/exploration.d.ts.map +1 -0
  621. package/realtime/exploration.js +32 -0
  622. package/realtime/honua-server.d.ts +123 -0
  623. package/realtime/honua-server.d.ts.map +1 -0
  624. package/realtime/honua-server.js +188 -0
  625. package/realtime/index.d.ts +20 -0
  626. package/realtime/index.d.ts.map +1 -0
  627. package/realtime/index.js +14 -0
  628. package/realtime/projections.d.ts +30 -0
  629. package/realtime/projections.d.ts.map +1 -0
  630. package/realtime/projections.js +51 -0
  631. package/realtime/reducer.d.ts +14 -0
  632. package/realtime/reducer.d.ts.map +1 -0
  633. package/realtime/reducer.js +351 -0
  634. package/realtime/sse.d.ts +23 -0
  635. package/realtime/sse.d.ts.map +1 -0
  636. package/realtime/sse.js +143 -0
  637. package/realtime/store.d.ts +18 -0
  638. package/realtime/store.d.ts.map +1 -0
  639. package/realtime/store.js +63 -0
  640. package/realtime/types.d.ts +190 -0
  641. package/realtime/types.d.ts.map +1 -0
  642. package/realtime/types.js +10 -0
  643. package/replica-sync/client.d.ts +32 -0
  644. package/replica-sync/client.d.ts.map +1 -0
  645. package/replica-sync/client.js +52 -0
  646. package/replica-sync/errors.d.ts +22 -0
  647. package/replica-sync/errors.d.ts.map +1 -0
  648. package/replica-sync/errors.js +29 -0
  649. package/replica-sync/fixture.d.ts +40 -0
  650. package/replica-sync/fixture.d.ts.map +1 -0
  651. package/replica-sync/fixture.js +364 -0
  652. package/replica-sync/index.d.ts +22 -0
  653. package/replica-sync/index.d.ts.map +1 -0
  654. package/replica-sync/index.js +17 -0
  655. package/replica-sync/types.d.ts +270 -0
  656. package/replica-sync/types.d.ts.map +1 -0
  657. package/replica-sync/types.js +13 -0
  658. package/runtime/diff.d.ts +31 -0
  659. package/runtime/diff.d.ts.map +1 -0
  660. package/runtime/diff.js +143 -0
  661. package/runtime/errors.d.ts +40 -0
  662. package/runtime/errors.d.ts.map +1 -0
  663. package/runtime/errors.js +35 -0
  664. package/runtime/index.d.ts +59 -0
  665. package/runtime/index.d.ts.map +1 -0
  666. package/runtime/index.js +40 -0
  667. package/runtime/legend.d.ts +23 -0
  668. package/runtime/legend.d.ts.map +1 -0
  669. package/runtime/legend.js +38 -0
  670. package/runtime/load-package.d.ts +125 -0
  671. package/runtime/load-package.d.ts.map +1 -0
  672. package/runtime/load-package.js +272 -0
  673. package/runtime/map-package-fetch.d.ts +107 -0
  674. package/runtime/map-package-fetch.d.ts.map +1 -0
  675. package/runtime/map-package-fetch.js +336 -0
  676. package/runtime/map-package-realtime.d.ts +169 -0
  677. package/runtime/map-package-realtime.d.ts.map +1 -0
  678. package/runtime/map-package-realtime.js +350 -0
  679. package/runtime/map-package-validation.d.ts +30 -0
  680. package/runtime/map-package-validation.d.ts.map +1 -0
  681. package/runtime/map-package-validation.js +257 -0
  682. package/runtime/map-package-watch.d.ts +78 -0
  683. package/runtime/map-package-watch.d.ts.map +1 -0
  684. package/runtime/map-package-watch.js +695 -0
  685. package/runtime/map-package.d.ts +167 -0
  686. package/runtime/map-package.d.ts.map +1 -0
  687. package/runtime/map-package.js +15 -0
  688. package/runtime/ogc-styles.d.ts +110 -0
  689. package/runtime/ogc-styles.d.ts.map +1 -0
  690. package/runtime/ogc-styles.js +195 -0
  691. package/runtime/pmtiles-protocol.d.ts +77 -0
  692. package/runtime/pmtiles-protocol.d.ts.map +1 -0
  693. package/runtime/pmtiles-protocol.js +120 -0
  694. package/runtime/popups.d.ts +62 -0
  695. package/runtime/popups.d.ts.map +1 -0
  696. package/runtime/popups.js +95 -0
  697. package/runtime/query-tiles.d.ts +217 -0
  698. package/runtime/query-tiles.d.ts.map +1 -0
  699. package/runtime/query-tiles.js +801 -0
  700. package/runtime/runtime.d.ts +243 -0
  701. package/runtime/runtime.d.ts.map +1 -0
  702. package/runtime/runtime.js +1147 -0
  703. package/runtime/source-bridge.d.ts +99 -0
  704. package/runtime/source-bridge.d.ts.map +1 -0
  705. package/runtime/source-bridge.js +428 -0
  706. package/runtime/style-compose.d.ts +46 -0
  707. package/runtime/style-compose.d.ts.map +1 -0
  708. package/runtime/style-compose.js +144 -0
  709. package/runtime/style-interactions.d.ts +141 -0
  710. package/runtime/style-interactions.d.ts.map +1 -0
  711. package/runtime/style-interactions.js +574 -0
  712. package/runtime/style-spec-validation.d.ts +23 -0
  713. package/runtime/style-spec-validation.d.ts.map +1 -0
  714. package/runtime/style-spec-validation.js +357 -0
  715. package/scene-workspace/analysis-widgets.d.ts +334 -0
  716. package/scene-workspace/analysis-widgets.d.ts.map +1 -0
  717. package/scene-workspace/analysis-widgets.js +424 -0
  718. package/scene-workspace/cesium-adapter.d.ts +438 -0
  719. package/scene-workspace/cesium-adapter.d.ts.map +1 -0
  720. package/scene-workspace/cesium-adapter.js +493 -0
  721. package/scene-workspace/index.d.ts +21 -0
  722. package/scene-workspace/index.d.ts.map +1 -0
  723. package/scene-workspace/index.js +14 -0
  724. package/scene-workspace/primitives.d.ts +162 -0
  725. package/scene-workspace/primitives.d.ts.map +1 -0
  726. package/scene-workspace/primitives.js +255 -0
  727. package/scene-workspace/scene-discovery.d.ts +196 -0
  728. package/scene-workspace/scene-discovery.d.ts.map +1 -0
  729. package/scene-workspace/scene-discovery.js +228 -0
  730. package/scene-workspace/scene-view.d.ts +209 -0
  731. package/scene-workspace/scene-view.d.ts.map +1 -0
  732. package/scene-workspace/scene-view.js +267 -0
  733. package/scene-workspace/types.d.ts +229 -0
  734. package/scene-workspace/types.d.ts.map +1 -0
  735. package/scene-workspace/types.js +23 -0
  736. package/scene-workspace/workspace.d.ts +13 -0
  737. package/scene-workspace/workspace.d.ts.map +1 -0
  738. package/scene-workspace/workspace.js +391 -0
  739. package/share/denial.d.ts +78 -0
  740. package/share/denial.d.ts.map +1 -0
  741. package/share/denial.js +61 -0
  742. package/share/embed-token.d.ts +71 -0
  743. package/share/embed-token.d.ts.map +1 -0
  744. package/share/embed-token.js +99 -0
  745. package/share/index.d.ts +35 -0
  746. package/share/index.d.ts.map +1 -0
  747. package/share/index.js +30 -0
  748. package/share/open-data.d.ts +114 -0
  749. package/share/open-data.d.ts.map +1 -0
  750. package/share/open-data.js +81 -0
  751. package/share/types.d.ts +163 -0
  752. package/share/types.d.ts.map +1 -0
  753. package/share/types.js +17 -0
  754. package/studio/capability-manifest.d.ts +285 -0
  755. package/studio/capability-manifest.d.ts.map +1 -0
  756. package/studio/capability-manifest.js +59 -0
  757. package/studio/chart-spec.d.ts +85 -0
  758. package/studio/chart-spec.d.ts.map +1 -0
  759. package/studio/chart-spec.js +106 -0
  760. package/studio/index.d.ts +34 -0
  761. package/studio/index.d.ts.map +1 -0
  762. package/studio/index.js +27 -0
  763. package/studio/provenance.d.ts +131 -0
  764. package/studio/provenance.d.ts.map +1 -0
  765. package/studio/provenance.js +39 -0
  766. package/studio/publish.d.ts +64 -0
  767. package/studio/publish.d.ts.map +1 -0
  768. package/studio/publish.js +13 -0
  769. package/studio/types.d.ts +278 -0
  770. package/studio/types.d.ts.map +1 -0
  771. package/studio/types.js +71 -0
  772. package/studio/validate.d.ts +45 -0
  773. package/studio/validate.d.ts.map +1 -0
  774. package/studio/validate.js +255 -0
  775. package/studio/validation.d.ts +112 -0
  776. package/studio/validation.d.ts.map +1 -0
  777. package/studio/validation.js +42 -0
  778. package/style/factory.d.ts +30 -0
  779. package/style/factory.d.ts.map +1 -0
  780. package/style/factory.js +61 -0
  781. package/style/index.d.ts +25 -0
  782. package/style/index.d.ts.map +1 -0
  783. package/style/index.js +24 -0
  784. package/style/specification.d.ts +203 -0
  785. package/style/specification.d.ts.map +1 -0
  786. package/style/specification.js +178 -0
  787. package/style/wms-wmts-resolvers.d.ts +38 -0
  788. package/style/wms-wmts-resolvers.d.ts.map +1 -0
  789. package/style/wms-wmts-resolvers.js +92 -0
  790. package/web-components/controller.d.ts +39 -0
  791. package/web-components/controller.d.ts.map +1 -0
  792. package/web-components/controller.js +640 -0
  793. package/web-components/elements.d.ts +210 -0
  794. package/web-components/elements.d.ts.map +1 -0
  795. package/web-components/elements.js +1651 -0
  796. package/web-components/index.d.ts +24 -0
  797. package/web-components/index.d.ts.map +1 -0
  798. package/web-components/index.js +22 -0
  799. package/web-components/maplibre-renderer.d.ts +22 -0
  800. package/web-components/maplibre-renderer.d.ts.map +1 -0
  801. package/web-components/maplibre-renderer.js +474 -0
  802. package/web-components/types.d.ts +397 -0
  803. package/web-components/types.d.ts.map +1 -0
  804. package/web-components/types.js +1 -0
  805. package/webmap/contract.d.ts +28 -0
  806. package/webmap/contract.d.ts.map +1 -0
  807. package/webmap/contract.js +130 -0
  808. package/webmap/convert-basemap.d.ts +17 -0
  809. package/webmap/convert-basemap.d.ts.map +1 -0
  810. package/webmap/convert-basemap.js +78 -0
  811. package/webmap/convert-extent.d.ts +17 -0
  812. package/webmap/convert-extent.d.ts.map +1 -0
  813. package/webmap/convert-extent.js +114 -0
  814. package/webmap/convert-label.d.ts +13 -0
  815. package/webmap/convert-label.d.ts.map +1 -0
  816. package/webmap/convert-label.js +125 -0
  817. package/webmap/convert-layer.d.ts +22 -0
  818. package/webmap/convert-layer.d.ts.map +1 -0
  819. package/webmap/convert-layer.js +181 -0
  820. package/webmap/convert-popup.d.ts +34 -0
  821. package/webmap/convert-popup.d.ts.map +1 -0
  822. package/webmap/convert-popup.js +68 -0
  823. package/webmap/convert-renderer.d.ts +17 -0
  824. package/webmap/convert-renderer.d.ts.map +1 -0
  825. package/webmap/convert-renderer.js +161 -0
  826. package/webmap/convert-symbol.d.ts +17 -0
  827. package/webmap/convert-symbol.d.ts.map +1 -0
  828. package/webmap/convert-symbol.js +122 -0
  829. package/webmap/index.d.ts +44 -0
  830. package/webmap/index.d.ts.map +1 -0
  831. package/webmap/index.js +33 -0
  832. package/webmap/parse.d.ts +25 -0
  833. package/webmap/parse.d.ts.map +1 -0
  834. package/webmap/parse.js +83 -0
  835. package/webmap/types.d.ts +264 -0
  836. package/webmap/types.d.ts.map +1 -0
  837. package/webmap/types.js +13 -0
  838. package/webmap/warnings.d.ts +30 -0
  839. package/webmap/warnings.d.ts.map +1 -0
  840. package/webmap/warnings.js +37 -0
@@ -0,0 +1,1173 @@
1
+ import { createExplorationContext, isSourceQualifiedSelectionTarget, sourceFeatureSelectionTarget, } from "../exploration/index.js";
2
+ export const HONUA_CONTROLLER_SNAPSHOT_VERSION = 1;
3
+ export class HonuaControllerError extends Error {
4
+ code;
5
+ constructor(code, message) {
6
+ super(message);
7
+ this.name = "HonuaControllerError";
8
+ this.code = code;
9
+ }
10
+ }
11
+ let generatedOverlayId = 0;
12
+ let generatedAnnotationId = 0;
13
+ export function createHonuaController(runtimeOrOptions = {}) {
14
+ return new HonuaController(isControllerOptions(runtimeOrOptions) ? runtimeOrOptions : { runtime: runtimeOrOptions });
15
+ }
16
+ export class HonuaController {
17
+ context;
18
+ #runtime;
19
+ #adapter;
20
+ #ownsContext;
21
+ #disposeRuntime;
22
+ #disposeAdapter;
23
+ #layerSourcePersistence;
24
+ #listeners = new Map();
25
+ #subscriptions = [];
26
+ #layerGroups;
27
+ #legendItemLayers;
28
+ #visibility;
29
+ #viewport;
30
+ #overlays = new Map();
31
+ #annotations = new Map();
32
+ #layerSourceMutations = [];
33
+ #layerSourceVersion;
34
+ #layerSourceConcurrencyToken;
35
+ #disposed = false;
36
+ #suppressExtentEvent = false;
37
+ constructor(options = {}) {
38
+ const internals = resolveInternals(options);
39
+ this.context = internals.context;
40
+ this.#runtime = internals.runtime;
41
+ this.#adapter = internals.adapter;
42
+ this.#ownsContext = internals.ownsContext;
43
+ this.#disposeRuntime = internals.disposeRuntime;
44
+ this.#disposeAdapter = internals.disposeAdapter;
45
+ this.#layerSourcePersistence = internals.layerSourcePersistence;
46
+ this.#layerGroups = structuredClone(options.layerGroups ?? {});
47
+ this.#legendItemLayers = structuredClone(options.legendItemLayers ?? {});
48
+ this.#visibility = cloneVisibility(internals.initialVisibility);
49
+ this.#viewport = normalizeViewport(internals.initialViewport);
50
+ const initialExtent = viewportToExtent(this.#viewport);
51
+ if (initialExtent && !this.context.state.extent) {
52
+ this.context.dispatch({ kind: "set-extent", extent: initialExtent });
53
+ }
54
+ this.#subscriptions.push(this.context.subscribe("extent", (event) => {
55
+ if (this.#suppressExtentEvent)
56
+ return;
57
+ const previous = this.#viewport;
58
+ this.#viewport = normalizeViewport({
59
+ ...this.#viewport,
60
+ ...extentToViewport(event.state.extent),
61
+ });
62
+ if (!viewportsEqual(previous, this.#viewport)) {
63
+ this.#emit({ type: "viewport-move", viewport: this.getViewport(), previous, source: "exploration" });
64
+ }
65
+ }));
66
+ this.#subscriptions.push(this.context.subscribe("selection", (event) => {
67
+ this.#emit({
68
+ type: "selection-change",
69
+ selection: cloneSelection(event.state.selection),
70
+ previous: cloneSelection(event.previous.selection),
71
+ source: "exploration",
72
+ });
73
+ }));
74
+ if (this.#adapter?.onViewportMove) {
75
+ this.#subscriptions.push(removeAdapterSubscription(this.#adapter.onViewportMove((viewport) => {
76
+ if (!viewport)
77
+ return;
78
+ this.#commitViewport(viewport, "adapter");
79
+ })));
80
+ }
81
+ if (this.#adapter?.onViewportMoveEnd) {
82
+ this.#subscriptions.push(removeAdapterSubscription(this.#adapter.onViewportMoveEnd((viewport) => {
83
+ const previous = this.#viewport;
84
+ if (viewport)
85
+ this.#commitViewport(viewport, "adapter", { emitMove: false });
86
+ this.#emit({ type: "viewport-move-end", viewport: this.getViewport(), previous, source: "adapter" });
87
+ })));
88
+ }
89
+ if (this.#adapter?.onIdle) {
90
+ this.#subscriptions.push(removeAdapterSubscription(this.#adapter.onIdle(() => {
91
+ this.#emit({ type: "idle", snapshot: this.snapshot(), source: "adapter" });
92
+ })));
93
+ }
94
+ }
95
+ getViewport() {
96
+ this.#assertLive("getViewport");
97
+ return cloneViewport({
98
+ ...this.#adapter?.getViewport?.(),
99
+ ...this.#viewport,
100
+ ...extentToViewport(this.context.state.extent),
101
+ });
102
+ }
103
+ setViewport(viewport, options = {}) {
104
+ this.#assertLive("setViewport");
105
+ const normalized = normalizeViewport(viewport);
106
+ const previous = this.getViewport();
107
+ this.#adapter?.setViewport?.(normalized, options);
108
+ this.#commitViewport(normalized, "controller");
109
+ this.#emit({ type: "viewport-move-end", viewport: this.getViewport(), previous, source: "controller" });
110
+ this.#queueIdle("controller");
111
+ }
112
+ fitBounds(bounds, options = {}) {
113
+ this.#assertLive("fitBounds");
114
+ assertBounds(bounds);
115
+ const previous = this.getViewport();
116
+ this.#adapter?.fitBounds?.(bounds, options);
117
+ this.#commitViewport({ bbox: [...bounds] }, "controller");
118
+ this.#emit({ type: "viewport-move-end", viewport: this.getViewport(), previous, source: "controller" });
119
+ this.#queueIdle("controller");
120
+ }
121
+ onViewportMove(listener) {
122
+ return this.on("viewport-move", listener);
123
+ }
124
+ onViewportMoveEnd(listener) {
125
+ return this.on("viewport-move-end", listener);
126
+ }
127
+ onIdle(listener) {
128
+ return this.on("idle", listener);
129
+ }
130
+ getSelection(options = {}) {
131
+ this.#assertLive("getSelection");
132
+ const selection = this.context.state.selection;
133
+ if (!options.sourceId)
134
+ return cloneSelection(selection);
135
+ return cloneSelection(selection.filter((target) => isSourceQualifiedSelectionTarget(target) && target.sourceId === options.sourceId));
136
+ }
137
+ selectFeature(sourceOrTarget, idOrOptions, maybeOptions = {}) {
138
+ this.#assertLive("selectFeature");
139
+ const target = typeof sourceOrTarget === "object"
140
+ ? sourceOrTarget
141
+ : sourceFeatureSelectionTarget(sourceOrTarget, idOrOptions, {
142
+ sourceLayer: maybeOptions.sourceLayer,
143
+ });
144
+ const replace = typeof idOrOptions === "object" ? idOrOptions.replace : maybeOptions.replace;
145
+ this.selectFeatures([target], { replace: replace ?? true });
146
+ }
147
+ selectFeatures(targets, options = {}) {
148
+ this.#assertLive("selectFeatures");
149
+ if (targets.length === 0)
150
+ return;
151
+ this.context.dispatch({ kind: "select", ids: cloneSelection(targets), replace: options.replace ?? true });
152
+ }
153
+ clearSelection(targets) {
154
+ this.#assertLive("clearSelection");
155
+ this.context.dispatch({ kind: "deselect", ids: targets ? cloneSelection(targets) : undefined });
156
+ }
157
+ onSelectionChange(listener) {
158
+ return this.on("selection-change", listener);
159
+ }
160
+ getVisibility() {
161
+ this.#assertLive("getVisibility");
162
+ return cloneVisibility(this.#visibility);
163
+ }
164
+ setVisibility(update) {
165
+ this.#assertLive("setVisibility");
166
+ this.#applyVisibilityUpdate(normalizeVisibilityUpdate(update), "controller");
167
+ }
168
+ setLayerVisibility(layerOrUpdate, visible) {
169
+ this.#assertLive("setLayerVisibility");
170
+ if (typeof layerOrUpdate === "string") {
171
+ this.#applyVisibilityUpdate({
172
+ show: visible ? [{ kind: "layer", id: layerOrUpdate }] : [],
173
+ hide: visible ? [] : [{ kind: "layer", id: layerOrUpdate }],
174
+ }, "controller");
175
+ return;
176
+ }
177
+ this.#applyVisibilityUpdate(targetsFromChangeSet("layer", layerOrUpdate), "controller");
178
+ }
179
+ setLayerGroupVisibility(update) {
180
+ this.#assertLive("setLayerGroupVisibility");
181
+ this.#applyVisibilityUpdate(targetsFromChangeSet("layer-group", update), "controller");
182
+ }
183
+ setLegendItemVisibility(update) {
184
+ this.#assertLive("setLegendItemVisibility");
185
+ this.#applyVisibilityUpdate(targetsFromChangeSet("legend-item", update), "controller");
186
+ }
187
+ onVisibilityChange(listener) {
188
+ return this.on("visibility-change", listener);
189
+ }
190
+ getSource(sourceId) {
191
+ this.#assertLive("getSource");
192
+ return cloneStyleValue(this.#currentStyle()?.sources[sourceId]);
193
+ }
194
+ listSources() {
195
+ this.#assertLive("listSources");
196
+ return cloneStyleValue(this.#currentStyle()?.sources ?? {});
197
+ }
198
+ getLayer(layerId) {
199
+ this.#assertLive("getLayer");
200
+ return cloneStyleValue(this.#currentStyle()?.layers.find((layer) => layer.id === layerId));
201
+ }
202
+ listLayers() {
203
+ this.#assertLive("listLayers");
204
+ return cloneStyleValue(this.#currentStyle()?.layers ?? []);
205
+ }
206
+ addSource(sourceId, source) {
207
+ this.#assertLive("addSource");
208
+ this.#requireLayerSourceAdapter("addSource").addSource?.(sourceId, source);
209
+ this.#recordLayerSourceMutation({ action: "source-added", sourceId });
210
+ }
211
+ updateSource(sourceId, source) {
212
+ this.#assertLive("updateSource");
213
+ this.#requireLayerSourceAdapter("updateSource").updateSource?.(sourceId, source);
214
+ this.#recordLayerSourceMutation({ action: "source-updated", sourceId });
215
+ }
216
+ removeSource(sourceId) {
217
+ this.#assertLive("removeSource");
218
+ const removedLayerIds = [...(this.#requireLayerSourceAdapter("removeSource").removeSource?.(sourceId) ?? [])];
219
+ this.#recordLayerSourceMutation({ action: "source-removed", sourceId, removedLayerIds });
220
+ return removedLayerIds;
221
+ }
222
+ addLayer(layer, order) {
223
+ this.#assertLive("addLayer");
224
+ this.#requireLayerSourceAdapter("addLayer").addLayer?.(layer, order);
225
+ this.#recordLayerSourceMutation({ action: "layer-added", layerId: layer.id, sourceId: layer.source, order });
226
+ }
227
+ updateLayer(layerId, update) {
228
+ this.#assertLive("updateLayer");
229
+ this.#requireLayerSourceAdapter("updateLayer").updateLayer?.(layerId, update);
230
+ this.#recordLayerSourceMutation({ action: "layer-updated", layerId, sourceId: this.getLayer(layerId)?.source });
231
+ }
232
+ moveLayer(layerId, order) {
233
+ this.#assertLive("moveLayer");
234
+ this.#requireLayerSourceAdapter("moveLayer").moveLayer?.(layerId, order);
235
+ this.#recordLayerSourceMutation({
236
+ action: "layer-moved",
237
+ layerId,
238
+ sourceId: this.getLayer(layerId)?.source,
239
+ order,
240
+ });
241
+ }
242
+ removeLayer(layerId) {
243
+ this.#assertLive("removeLayer");
244
+ const sourceId = this.getLayer(layerId)?.source;
245
+ const removed = this.#requireLayerSourceAdapter("removeLayer").removeLayer?.(layerId) ?? false;
246
+ if (removed)
247
+ this.#recordLayerSourceMutation({ action: "layer-removed", layerId, sourceId });
248
+ return removed;
249
+ }
250
+ setLayerPaint(layerId, paint) {
251
+ this.#assertLive("setLayerPaint");
252
+ this.#requireLayerSourceAdapter("setLayerPaint").setLayerPaint?.(layerId, paint);
253
+ this.#recordLayerSourceMutation({ action: "layer-updated", layerId, sourceId: this.getLayer(layerId)?.source });
254
+ }
255
+ setLayerLayout(layerId, layout) {
256
+ this.#assertLive("setLayerLayout");
257
+ this.#requireLayerSourceAdapter("setLayerLayout").setLayerLayout?.(layerId, layout);
258
+ this.#recordLayerSourceMutation({ action: "layer-updated", layerId, sourceId: this.getLayer(layerId)?.source });
259
+ }
260
+ setLayerFilter(layerId, filter) {
261
+ this.#assertLive("setLayerFilter");
262
+ this.#requireLayerSourceAdapter("setLayerFilter").setLayerFilter?.(layerId, filter);
263
+ this.#recordLayerSourceMutation({ action: "layer-updated", layerId, sourceId: this.getLayer(layerId)?.source });
264
+ }
265
+ refreshSource(sourceId) {
266
+ this.#assertLive("refreshSource");
267
+ const refreshed = this.#requireLayerSourceAdapter("refreshSource").refreshSource?.(sourceId) ?? false;
268
+ this.#emitLayerSourceMutation({ action: "source-refreshed", sourceId });
269
+ return refreshed;
270
+ }
271
+ validateStyleExpression(value) {
272
+ this.#assertLive("validateStyleExpression");
273
+ return [...(this.#requireLayerSourceAdapter("validateStyleExpression").validateStyleExpression?.(value) ?? [])];
274
+ }
275
+ validateFilterExpression(filter, layerId) {
276
+ this.#assertLive("validateFilterExpression");
277
+ return [
278
+ ...(this.#requireLayerSourceAdapter("validateFilterExpression").validateFilterExpression?.(filter, layerId) ??
279
+ []),
280
+ ];
281
+ }
282
+ getPendingLayerSourceMutations() {
283
+ this.#assertLive("getPendingLayerSourceMutations");
284
+ return structuredClone(this.#layerSourceMutations);
285
+ }
286
+ hasPendingLayerSourceMutations() {
287
+ this.#assertLive("hasPendingLayerSourceMutations");
288
+ return this.#layerSourceMutations.length > 0;
289
+ }
290
+ async saveLayerSourceChanges(options = {}) {
291
+ this.#assertLive("saveLayerSourceChanges");
292
+ const payload = this.#layerSourcePersistencePayload(options);
293
+ const result = await this.#invokeLayerSourcePersistence("save", payload);
294
+ const conflict = result?.conflict ?? false;
295
+ if (!conflict) {
296
+ this.#layerSourceMutations = [];
297
+ this.#layerSourceVersion = result?.version ?? options.baseVersion ?? this.#layerSourceVersion;
298
+ this.#layerSourceConcurrencyToken =
299
+ result?.concurrencyToken ?? options.concurrencyToken ?? this.#layerSourceConcurrencyToken;
300
+ }
301
+ return persistenceOutcome(payload.mutations.length, Boolean(this.#layerSourcePersistence?.save), result);
302
+ }
303
+ async discardLayerSourceChanges(options = {}) {
304
+ this.#assertLive("discardLayerSourceChanges");
305
+ const payload = this.#layerSourcePersistencePayload(options);
306
+ const result = await this.#invokeLayerSourcePersistence("discard", payload);
307
+ if (!result?.conflict)
308
+ this.#layerSourceMutations = [];
309
+ return persistenceOutcome(payload.mutations.length, Boolean(this.#layerSourcePersistence?.discard), result);
310
+ }
311
+ onLayerSourceChange(listener) {
312
+ return this.on("layer-source-change", listener);
313
+ }
314
+ addOverlay(input) {
315
+ this.#assertLive("addOverlay");
316
+ const overlay = normalizeOverlay(input);
317
+ const action = this.#overlays.has(overlay.id) ? "updated" : "added";
318
+ if (action === "updated")
319
+ this.#adapter?.removeOverlay?.(overlay.id);
320
+ this.#overlays.set(overlay.id, overlay);
321
+ this.#adapter?.addOverlay?.(overlay);
322
+ this.#emit({
323
+ type: "overlay-change",
324
+ action,
325
+ overlay,
326
+ overlays: this.getOverlays(),
327
+ source: "controller",
328
+ });
329
+ return structuredClone(overlay);
330
+ }
331
+ removeOverlay(id) {
332
+ this.#assertLive("removeOverlay");
333
+ if (!this.#overlays.has(id))
334
+ return false;
335
+ this.#overlays.delete(id);
336
+ this.#adapter?.removeOverlay?.(id);
337
+ this.#emit({
338
+ type: "overlay-change",
339
+ action: "removed",
340
+ overlayId: id,
341
+ overlays: this.getOverlays(),
342
+ source: "controller",
343
+ });
344
+ return true;
345
+ }
346
+ clearOverlays() {
347
+ this.#assertLive("clearOverlays");
348
+ if (this.#overlays.size === 0)
349
+ return;
350
+ for (const id of this.#overlays.keys())
351
+ this.#adapter?.removeOverlay?.(id);
352
+ this.#overlays.clear();
353
+ this.#emit({ type: "overlay-change", action: "cleared", overlays: [], source: "controller" });
354
+ }
355
+ getOverlays() {
356
+ this.#assertLive("getOverlays");
357
+ return structuredClone([...this.#overlays.values()]);
358
+ }
359
+ addAnnotation(input) {
360
+ this.#assertLive("addAnnotation");
361
+ const annotation = normalizeAnnotation(input);
362
+ const action = this.#annotations.has(annotation.id) ? "updated" : "added";
363
+ if (action === "updated")
364
+ this.#adapter?.removeAnnotation?.(annotation.id);
365
+ this.#annotations.set(annotation.id, annotation);
366
+ this.#adapter?.addAnnotation?.(annotation);
367
+ this.#emit({
368
+ type: "annotation-change",
369
+ action,
370
+ annotation,
371
+ annotations: this.getAnnotations(),
372
+ source: "controller",
373
+ });
374
+ return structuredClone(annotation);
375
+ }
376
+ removeAnnotation(id) {
377
+ this.#assertLive("removeAnnotation");
378
+ if (!this.#annotations.has(id))
379
+ return false;
380
+ this.#annotations.delete(id);
381
+ this.#adapter?.removeAnnotation?.(id);
382
+ this.#emit({
383
+ type: "annotation-change",
384
+ action: "removed",
385
+ annotationId: id,
386
+ annotations: this.getAnnotations(),
387
+ source: "controller",
388
+ });
389
+ return true;
390
+ }
391
+ clearAnnotations() {
392
+ this.#assertLive("clearAnnotations");
393
+ if (this.#annotations.size === 0)
394
+ return;
395
+ for (const id of this.#annotations.keys())
396
+ this.#adapter?.removeAnnotation?.(id);
397
+ this.#annotations.clear();
398
+ this.#emit({ type: "annotation-change", action: "cleared", annotations: [], source: "controller" });
399
+ }
400
+ getAnnotations() {
401
+ this.#assertLive("getAnnotations");
402
+ return structuredClone([...this.#annotations.values()]);
403
+ }
404
+ snapshot() {
405
+ this.#assertLive("snapshot");
406
+ return {
407
+ version: HONUA_CONTROLLER_SNAPSHOT_VERSION,
408
+ viewport: this.getViewport(),
409
+ exploration: this.context.snapshot(),
410
+ visibility: this.getVisibility(),
411
+ overlays: this.getOverlays(),
412
+ annotations: this.getAnnotations(),
413
+ };
414
+ }
415
+ restore(snapshot) {
416
+ this.#assertLive("restore");
417
+ if (snapshot.version !== HONUA_CONTROLLER_SNAPSHOT_VERSION) {
418
+ throw new HonuaControllerError("invalid-snapshot", `HonuaController cannot restore snapshot version ${String(snapshot.version)}`);
419
+ }
420
+ this.setViewport(snapshot.viewport);
421
+ this.context.restore(snapshot.exploration);
422
+ this.#restoreVisibility(snapshot.visibility);
423
+ for (const id of this.#overlays.keys())
424
+ this.#adapter?.removeOverlay?.(id);
425
+ this.#overlays.clear();
426
+ for (const overlay of snapshot.overlays) {
427
+ const normalized = normalizeOverlay(overlay);
428
+ this.#overlays.set(normalized.id, normalized);
429
+ this.#adapter?.addOverlay?.(normalized);
430
+ }
431
+ this.#emit({
432
+ type: "overlay-change",
433
+ action: "restored",
434
+ overlays: this.getOverlays(),
435
+ source: "snapshot",
436
+ });
437
+ for (const id of this.#annotations.keys())
438
+ this.#adapter?.removeAnnotation?.(id);
439
+ this.#annotations.clear();
440
+ for (const annotation of snapshot.annotations) {
441
+ const normalized = normalizeAnnotation(annotation);
442
+ this.#annotations.set(normalized.id, normalized);
443
+ this.#adapter?.addAnnotation?.(normalized);
444
+ }
445
+ this.#emit({
446
+ type: "annotation-change",
447
+ action: "restored",
448
+ annotations: this.getAnnotations(),
449
+ source: "snapshot",
450
+ });
451
+ }
452
+ on(type, listener) {
453
+ this.#assertLive("on");
454
+ let listeners = this.#listeners.get(type);
455
+ if (!listeners) {
456
+ listeners = new Set();
457
+ this.#listeners.set(type, listeners);
458
+ }
459
+ const controllerListener = listener;
460
+ listeners.add(controllerListener);
461
+ return () => {
462
+ const set = this.#listeners.get(type);
463
+ if (!set)
464
+ return;
465
+ set.delete(controllerListener);
466
+ if (set.size === 0)
467
+ this.#listeners.delete(type);
468
+ };
469
+ }
470
+ dispose() {
471
+ if (this.#disposed)
472
+ return;
473
+ for (const unsubscribe of this.#subscriptions.splice(0))
474
+ unsubscribe();
475
+ for (const id of this.#overlays.keys())
476
+ this.#adapter?.removeOverlay?.(id);
477
+ for (const id of this.#annotations.keys())
478
+ this.#adapter?.removeAnnotation?.(id);
479
+ this.#overlays.clear();
480
+ this.#annotations.clear();
481
+ if (this.#disposeAdapter)
482
+ this.#adapter?.dispose?.();
483
+ if (this.#disposeRuntime)
484
+ this.#runtime?.dispose?.();
485
+ if (this.#ownsContext)
486
+ this.context.dispose();
487
+ this.#disposed = true;
488
+ this.#emit({ type: "disposed" });
489
+ this.#listeners.clear();
490
+ }
491
+ #currentStyle() {
492
+ return this.#adapter?.getStyle?.() ?? this.#runtime?.composedStyle ?? this.#runtime?.mapPackage.mapSpec;
493
+ }
494
+ #requireLayerSourceAdapter(operation) {
495
+ const adapter = this.#adapter;
496
+ if (!adapter || typeof adapter[operation] !== "function") {
497
+ throw new HonuaControllerError("invalid-layer-source", `HonuaController cannot ${String(operation)} without a layer/source adapter method`);
498
+ }
499
+ return adapter;
500
+ }
501
+ #recordLayerSourceMutation(input) {
502
+ this.#emitLayerSourceMutation(input, true);
503
+ }
504
+ #emitLayerSourceMutation(input, pending = false) {
505
+ const mutation = { ...input, timestamp: new Date().toISOString() };
506
+ if (pending)
507
+ this.#layerSourceMutations.push(mutation);
508
+ this.#emit({
509
+ type: "layer-source-change",
510
+ action: mutation.action,
511
+ sourceId: mutation.sourceId,
512
+ layerId: mutation.layerId,
513
+ removedLayerIds: mutation.removedLayerIds,
514
+ mutation,
515
+ pendingMutations: structuredClone(this.#layerSourceMutations),
516
+ source: "controller",
517
+ });
518
+ }
519
+ #layerSourcePersistencePayload(options) {
520
+ return {
521
+ mutations: structuredClone(this.#layerSourceMutations),
522
+ style: cloneStyleValue(this.#currentStyle()),
523
+ mapPackage: cloneStyleValue(this.#runtime?.mapPackage),
524
+ baseVersion: options.baseVersion ?? this.#layerSourceVersion,
525
+ concurrencyToken: options.concurrencyToken ?? this.#layerSourceConcurrencyToken,
526
+ metadata: options.metadata,
527
+ };
528
+ }
529
+ async #invokeLayerSourcePersistence(operation, payload) {
530
+ try {
531
+ return (await this.#layerSourcePersistence?.[operation]?.(payload)) ?? undefined;
532
+ }
533
+ catch (error) {
534
+ throw new HonuaControllerError("persistence-failed", `HonuaController ${operation}LayerSourceChanges persistence hook failed: ${errorMessage(error)}`);
535
+ }
536
+ }
537
+ #commitViewport(viewport, source, options = {}) {
538
+ const previous = this.#viewport;
539
+ this.#viewport = normalizeViewport({ ...this.#viewport, ...viewport });
540
+ const extent = viewportToExtent(this.#viewport);
541
+ if (extent) {
542
+ this.#suppressExtentEvent = true;
543
+ try {
544
+ this.context.dispatch({ kind: "set-extent", extent });
545
+ }
546
+ finally {
547
+ this.#suppressExtentEvent = false;
548
+ }
549
+ }
550
+ if (options.emitMove === false || viewportsEqual(previous, this.#viewport))
551
+ return;
552
+ this.#emit({ type: "viewport-move", viewport: this.getViewport(), previous, source });
553
+ }
554
+ #applyVisibilityUpdate(update, source) {
555
+ if (update.show.length === 0 && update.hide.length === 0)
556
+ return;
557
+ const previous = cloneVisibility(this.#visibility);
558
+ const next = cloneVisibility(this.#visibility);
559
+ const rendererChanges = new Map();
560
+ for (const target of update.hide)
561
+ applyVisibilityTarget(next, target, false, this.#layerGroups, this.#legendItemLayers, rendererChanges);
562
+ for (const target of update.show)
563
+ applyVisibilityTarget(next, target, true, this.#layerGroups, this.#legendItemLayers, rendererChanges);
564
+ if (visibilityEqual(previous, next))
565
+ return;
566
+ for (const [layerId, visible] of rendererChanges)
567
+ this.#adapter?.setLayerVisibility?.(layerId, visible);
568
+ this.#visibility = next;
569
+ this.#emit({
570
+ type: "visibility-change",
571
+ visibility: cloneVisibility(next),
572
+ previous,
573
+ show: update.show,
574
+ hide: update.hide,
575
+ source,
576
+ });
577
+ }
578
+ #restoreVisibility(visibility) {
579
+ const previous = cloneVisibility(this.#visibility);
580
+ const next = cloneVisibility(visibility);
581
+ if (visibilityEqual(previous, next))
582
+ return;
583
+ const layerIds = new Set([...Object.keys(previous.layers), ...Object.keys(next.layers)]);
584
+ for (const layerId of layerIds) {
585
+ const visible = next.layers[layerId] ?? true;
586
+ if ((previous.layers[layerId] ?? true) !== visible) {
587
+ this.#adapter?.setLayerVisibility?.(layerId, visible);
588
+ }
589
+ }
590
+ this.#visibility = next;
591
+ this.#emit({
592
+ type: "visibility-change",
593
+ visibility: cloneVisibility(next),
594
+ previous,
595
+ show: [],
596
+ hide: [],
597
+ source: "snapshot",
598
+ });
599
+ }
600
+ #queueIdle(source) {
601
+ queueMicrotask(() => {
602
+ if (this.#disposed)
603
+ return;
604
+ this.#emit({ type: "idle", snapshot: this.snapshot(), source });
605
+ });
606
+ }
607
+ #emit(event) {
608
+ const listeners = this.#listeners.get(event.type);
609
+ if (!listeners)
610
+ return;
611
+ for (const listener of [...listeners]) {
612
+ listener(event);
613
+ }
614
+ }
615
+ #assertLive(operation) {
616
+ if (this.#disposed) {
617
+ throw new HonuaControllerError("disposed", `HonuaController cannot ${operation} after dispose()`);
618
+ }
619
+ }
620
+ }
621
+ function resolveInternals(options) {
622
+ const generatedRuntime = options.runtime && isGeneratedAppRuntimeLike(options.runtime) ? options.runtime : undefined;
623
+ const runtime = options.runtime && isMapRuntimeLike(options.runtime)
624
+ ? options.runtime
625
+ : generatedRuntime?.mapRuntime && isMapRuntimeLike(generatedRuntime.mapRuntime)
626
+ ? generatedRuntime.mapRuntime
627
+ : undefined;
628
+ if (options.runtime && !generatedRuntime && !runtime) {
629
+ throw new HonuaControllerError("invalid-runtime", "HonuaController runtime must be a HonuaMapRuntime-like or generated-app-runtime-like object");
630
+ }
631
+ const context = options.explorationContext ?? generatedRuntime?.context;
632
+ const adapter = options.adapter ?? (runtime ? createMapRuntimeControllerAdapter(runtime) : undefined);
633
+ const initialViewport = options.initialViewport ??
634
+ adapter?.getViewport?.() ??
635
+ runtime?.mapPackage.initialView ??
636
+ extentToViewport(context?.state.extent);
637
+ if (context) {
638
+ const visibility = mergeVisibility(initialVisibilityFromRuntime(runtime, options.layerGroups, options.legendItemLayers), options.initialVisibility);
639
+ return {
640
+ context,
641
+ ownsContext: false,
642
+ runtime,
643
+ adapter,
644
+ disposeRuntime: options.disposeRuntime ?? false,
645
+ disposeAdapter: options.disposeAdapter ?? false,
646
+ initialViewport: normalizeViewport(initialViewport),
647
+ initialVisibility: visibility,
648
+ layerSourcePersistence: options.layerSourcePersistence,
649
+ };
650
+ }
651
+ const sourceIds = options.sourceIds ?? runtime?.mapPackage.sourceBindings.map((binding) => binding.sourceId) ?? [];
652
+ const datasetId = options.datasetId ?? runtime?.mapPackage.mapPackageId ?? "honua-controller";
653
+ const ownedContext = createExplorationContext({
654
+ datasetId,
655
+ sourceIds,
656
+ initialState: viewportToExtent(initialViewport) ? { extent: viewportToExtent(initialViewport) } : undefined,
657
+ });
658
+ const visibility = mergeVisibility(initialVisibilityFromRuntime(runtime, options.layerGroups, options.legendItemLayers), options.initialVisibility);
659
+ return {
660
+ context: ownedContext,
661
+ ownsContext: true,
662
+ runtime,
663
+ adapter,
664
+ disposeRuntime: options.disposeRuntime ?? false,
665
+ disposeAdapter: options.disposeAdapter ?? false,
666
+ initialViewport: normalizeViewport(initialViewport),
667
+ initialVisibility: visibility,
668
+ layerSourcePersistence: options.layerSourcePersistence,
669
+ };
670
+ }
671
+ function isControllerOptions(value) {
672
+ if (typeof value !== "object" || value === null)
673
+ return false;
674
+ const runtime = value;
675
+ return !isMapRuntimeLike(runtime) && !isGeneratedAppRuntimeLike(runtime);
676
+ }
677
+ function isGeneratedAppRuntimeLike(value) {
678
+ return typeof value === "object" && value !== null && "context" in value;
679
+ }
680
+ function isMapRuntimeLike(value) {
681
+ return (typeof value === "object" &&
682
+ value !== null &&
683
+ "map" in value &&
684
+ "mapPackage" in value &&
685
+ "setViewState" in value &&
686
+ "setLayerVisibility" in value);
687
+ }
688
+ function createMapRuntimeControllerAdapter(runtime) {
689
+ const map = runtime.map;
690
+ const overlayLayers = new Map();
691
+ const annotationLayers = new Map();
692
+ const supportsTemporaryLayers = typeof map.addSource === "function" &&
693
+ typeof map.addLayer === "function" &&
694
+ typeof map.removeLayer === "function" &&
695
+ typeof map.removeSource === "function";
696
+ const adapter = {
697
+ id: `map-runtime:${runtime.mapPackage.mapPackageId}`,
698
+ getStyle() {
699
+ return runtime.composedStyle;
700
+ },
701
+ getViewport() {
702
+ return readMapViewport(map) ?? normalizeViewport(runtime.mapPackage.initialView ?? {});
703
+ },
704
+ setViewport(viewport, options) {
705
+ runtime.setViewState({
706
+ ...viewport,
707
+ ...(viewport.bbox ? { bbox: viewport.bbox } : {}),
708
+ animate: options?.animate,
709
+ padding: options?.padding,
710
+ });
711
+ },
712
+ fitBounds(bounds, options) {
713
+ runtime.setViewState({
714
+ bbox: bounds,
715
+ animate: options?.animate,
716
+ padding: options?.padding,
717
+ ...(options?.bearing !== undefined ? { bearing: options.bearing } : {}),
718
+ ...(options?.pitch !== undefined ? { pitch: options.pitch } : {}),
719
+ });
720
+ },
721
+ setLayerVisibility(layerId, visible) {
722
+ runtime.setLayerVisibility(layerId, visible);
723
+ },
724
+ addSource(sourceId, source) {
725
+ assertRuntimeCrud(runtime, "addSource");
726
+ runtime.addSource(sourceId, source);
727
+ },
728
+ updateSource(sourceId, source) {
729
+ assertRuntimeCrud(runtime, "updateSource");
730
+ runtime.updateSource(sourceId, source);
731
+ },
732
+ removeSource(sourceId) {
733
+ assertRuntimeCrud(runtime, "removeSource");
734
+ return runtime.removeSource(sourceId);
735
+ },
736
+ addLayer(layer, order) {
737
+ assertRuntimeCrud(runtime, "addLayer");
738
+ runtime.addLayer(layer, order);
739
+ },
740
+ updateLayer(layerId, update) {
741
+ assertRuntimeCrud(runtime, "updateLayer");
742
+ runtime.updateLayer(layerId, update);
743
+ },
744
+ moveLayer(layerId, order) {
745
+ assertRuntimeCrud(runtime, "moveLayer");
746
+ runtime.moveLayer(layerId, order);
747
+ },
748
+ removeLayer(layerId) {
749
+ assertRuntimeCrud(runtime, "removeLayer");
750
+ return runtime.removeLayer(layerId);
751
+ },
752
+ setLayerPaint(layerId, paint) {
753
+ assertRuntimeCrud(runtime, "setLayerPaint");
754
+ runtime.setLayerPaint(layerId, paint);
755
+ },
756
+ setLayerLayout(layerId, layout) {
757
+ assertRuntimeCrud(runtime, "setLayerLayout");
758
+ runtime.setLayerLayout(layerId, layout);
759
+ },
760
+ setLayerFilter(layerId, filter) {
761
+ assertRuntimeCrud(runtime, "setLayerFilter");
762
+ runtime.setLayerFilter(layerId, filter);
763
+ },
764
+ refreshSource(sourceId) {
765
+ assertRuntimeCrud(runtime, "refreshSource");
766
+ return runtime.refreshSource(sourceId);
767
+ },
768
+ validateStyleExpression(value) {
769
+ assertRuntimeCrud(runtime, "validateStyleExpression");
770
+ return runtime.validateStyleExpression(value);
771
+ },
772
+ validateFilterExpression(filter, layerId) {
773
+ assertRuntimeCrud(runtime, "validateFilterExpression");
774
+ return runtime.validateFilterExpression(filter, layerId);
775
+ },
776
+ onViewportMove(listener) {
777
+ return subscribeMapEvent(map, "move", () => listener(readMapViewport(map)));
778
+ },
779
+ onViewportMoveEnd(listener) {
780
+ return subscribeMapEvent(map, "moveend", () => listener(readMapViewport(map)));
781
+ },
782
+ onIdle(listener) {
783
+ return subscribeMapEvent(map, "idle", listener);
784
+ },
785
+ };
786
+ if (supportsTemporaryLayers) {
787
+ adapter.addOverlay = (overlay) => {
788
+ removeTemporaryMapItem(map, "overlay", overlay.id, overlayLayers);
789
+ const sourceId = temporarySourceId("overlay", overlay.id);
790
+ map.addSource?.(sourceId, { type: "geojson", data: overlayToGeoJson(overlay) });
791
+ const layers = overlayLayerSpecs(sourceId, overlay);
792
+ for (const layer of layers)
793
+ map.addLayer?.(layer);
794
+ overlayLayers.set(overlay.id, layers.map((layer) => String(layer.id)));
795
+ };
796
+ adapter.removeOverlay = (overlayId) => {
797
+ removeTemporaryMapItem(map, "overlay", overlayId, overlayLayers);
798
+ };
799
+ adapter.addAnnotation = (annotation) => {
800
+ removeTemporaryMapItem(map, "annotation", annotation.id, annotationLayers);
801
+ const geojson = annotationToGeoJson(annotation);
802
+ if (!geojson)
803
+ return;
804
+ const sourceId = temporarySourceId("annotation", annotation.id);
805
+ map.addSource?.(sourceId, { type: "geojson", data: geojson });
806
+ const layers = annotationLayerSpecs(sourceId, annotation);
807
+ for (const layer of layers)
808
+ map.addLayer?.(layer);
809
+ annotationLayers.set(annotation.id, layers.map((layer) => String(layer.id)));
810
+ };
811
+ adapter.removeAnnotation = (annotationId) => {
812
+ removeTemporaryMapItem(map, "annotation", annotationId, annotationLayers);
813
+ };
814
+ }
815
+ return adapter;
816
+ }
817
+ function readMapViewport(map) {
818
+ const viewport = {};
819
+ const bounds = map.getBounds?.();
820
+ if (bounds) {
821
+ viewport.bbox = [
822
+ Math.min(bounds.getWest(), bounds.getEast()),
823
+ Math.min(bounds.getSouth(), bounds.getNorth()),
824
+ Math.max(bounds.getWest(), bounds.getEast()),
825
+ Math.max(bounds.getSouth(), bounds.getNorth()),
826
+ ];
827
+ }
828
+ const center = map.getCenter?.();
829
+ if (Array.isArray(center)) {
830
+ viewport.center = [center[0], center[1]];
831
+ }
832
+ else if (center && "lng" in center) {
833
+ viewport.center = [center.lng, center.lat];
834
+ }
835
+ else if (center && "lon" in center) {
836
+ viewport.center = [center.lon, center.lat];
837
+ }
838
+ const zoom = map.getZoom?.();
839
+ if (zoom !== undefined)
840
+ viewport.zoom = zoom;
841
+ const pitch = map.getPitch?.();
842
+ if (pitch !== undefined)
843
+ viewport.pitch = pitch;
844
+ const bearing = map.getBearing?.();
845
+ if (bearing !== undefined)
846
+ viewport.bearing = bearing;
847
+ return Object.keys(viewport).length > 0 ? viewport : undefined;
848
+ }
849
+ function subscribeMapEvent(map, event, listener) {
850
+ map.on?.(event, listener);
851
+ return () => map.off?.(event, listener);
852
+ }
853
+ function assertRuntimeCrud(runtime, operation) {
854
+ if (typeof runtime[operation] !== "function") {
855
+ throw new HonuaControllerError("invalid-layer-source", `HonuaController runtime does not implement ${String(operation)}`);
856
+ }
857
+ }
858
+ function removeAdapterSubscription(subscription) {
859
+ if (typeof subscription === "function")
860
+ return subscription;
861
+ return () => subscription.remove();
862
+ }
863
+ function normalizeViewport(viewport) {
864
+ if (!viewport)
865
+ return {};
866
+ if (viewport.bbox)
867
+ assertBounds(viewport.bbox);
868
+ if (viewport.center)
869
+ assertCoordinate2d(viewport.center, "center");
870
+ for (const [key, value] of Object.entries({
871
+ zoom: viewport.zoom,
872
+ pitch: viewport.pitch,
873
+ bearing: viewport.bearing,
874
+ })) {
875
+ if (value !== undefined && !Number.isFinite(value)) {
876
+ throw new HonuaControllerError("invalid-viewport", `viewport.${key} must be a finite number`);
877
+ }
878
+ }
879
+ return structuredClone(viewport);
880
+ }
881
+ function assertBounds(bounds) {
882
+ if (bounds.length !== 4 || bounds.some((value) => !Number.isFinite(value))) {
883
+ throw new HonuaControllerError("invalid-viewport", "viewport bounds must be [west, south, east, north]");
884
+ }
885
+ if (bounds[0] > bounds[2] || bounds[1] > bounds[3]) {
886
+ throw new HonuaControllerError("invalid-viewport", "viewport bounds must be ordered west,south,east,north");
887
+ }
888
+ }
889
+ function assertCoordinate2d(coordinate, label) {
890
+ if (coordinate.length < 2 || !Number.isFinite(coordinate[0]) || !Number.isFinite(coordinate[1])) {
891
+ throw new HonuaControllerError("invalid-viewport", `${label} must contain finite longitude and latitude values`);
892
+ }
893
+ }
894
+ function viewportToExtent(viewport) {
895
+ if (!viewport?.bbox)
896
+ return undefined;
897
+ const [xmin, ymin, xmax, ymax] = viewport.bbox;
898
+ return {
899
+ xmin,
900
+ ymin,
901
+ xmax,
902
+ ymax,
903
+ spatialReference: viewport.crs === undefined || viewport.crs === "EPSG:4326" ? { wkid: 4326 } : { wkt: viewport.crs },
904
+ };
905
+ }
906
+ function extentToViewport(extent) {
907
+ if (!extent)
908
+ return {};
909
+ return {
910
+ bbox: [extent.xmin, extent.ymin, extent.xmax, extent.ymax],
911
+ crs: extent.spatialReference?.wkid !== undefined
912
+ ? `EPSG:${extent.spatialReference.wkid}`
913
+ : extent.spatialReference?.wkt,
914
+ };
915
+ }
916
+ function cloneViewport(viewport) {
917
+ return structuredClone(viewport);
918
+ }
919
+ function cloneStyleValue(value) {
920
+ return value === undefined ? value : structuredClone(value);
921
+ }
922
+ function persistenceOutcome(mutationCount, persisted, result) {
923
+ return {
924
+ mutationCount,
925
+ persisted,
926
+ conflict: result?.conflict ?? false,
927
+ version: result?.version,
928
+ concurrencyToken: result?.concurrencyToken,
929
+ detail: result?.detail,
930
+ };
931
+ }
932
+ function errorMessage(error) {
933
+ return error instanceof Error ? error.message : String(error);
934
+ }
935
+ function viewportsEqual(a, b) {
936
+ return JSON.stringify(a ?? {}) === JSON.stringify(b ?? {});
937
+ }
938
+ function cloneSelection(selection) {
939
+ return structuredClone(selection);
940
+ }
941
+ function initialVisibilityFromRuntime(runtime, layerGroups, legendItemLayers) {
942
+ const layers = {};
943
+ const style = runtime?.composedStyle ?? runtime?.mapPackage.mapSpec;
944
+ for (const layer of style?.layers ?? []) {
945
+ layers[layer.id] = (layer.layout?.visibility ?? "visible") !== "none";
946
+ }
947
+ const layerGroupVisibility = {};
948
+ for (const [groupId, layerIds] of Object.entries(layerGroups ?? {})) {
949
+ layerGroupVisibility[groupId] = layerIds.every((layerId) => layers[layerId] ?? true);
950
+ }
951
+ const legendItems = {};
952
+ for (const entry of runtime?.getLegend?.() ?? []) {
953
+ legendItems[entry.id] = true;
954
+ }
955
+ for (const itemId of Object.keys(legendItemLayers ?? {})) {
956
+ legendItems[itemId] = legendItems[itemId] ?? true;
957
+ }
958
+ return { layers, layerGroups: layerGroupVisibility, legendItems };
959
+ }
960
+ function mergeVisibility(base, override) {
961
+ return {
962
+ layers: { ...base.layers, ...(override?.layers ?? {}) },
963
+ layerGroups: { ...base.layerGroups, ...(override?.layerGroups ?? {}) },
964
+ legendItems: { ...base.legendItems, ...(override?.legendItems ?? {}) },
965
+ };
966
+ }
967
+ function cloneVisibility(visibility) {
968
+ return structuredClone(visibility);
969
+ }
970
+ function visibilityEqual(a, b) {
971
+ return JSON.stringify(a) === JSON.stringify(b);
972
+ }
973
+ function targetsFromChangeSet(kind, update) {
974
+ return {
975
+ show: (update.show ?? []).map((id) => ({ kind, id })),
976
+ hide: (update.hide ?? []).map((id) => ({ kind, id })),
977
+ };
978
+ }
979
+ function normalizeVisibilityUpdate(update) {
980
+ return {
981
+ show: (update.show ?? []).map((target) => normalizeVisibilityTarget(target)),
982
+ hide: (update.hide ?? []).map((target) => normalizeVisibilityTarget(target)),
983
+ };
984
+ }
985
+ function normalizeVisibilityTarget(target) {
986
+ return typeof target === "string" ? { kind: "layer", id: target } : { kind: target.kind, id: target.id };
987
+ }
988
+ function applyVisibilityTarget(visibility, target, visible, layerGroups, legendItemLayers, rendererChanges) {
989
+ const layers = { ...visibility.layers };
990
+ const layerGroupState = { ...visibility.layerGroups };
991
+ const legendItemState = { ...visibility.legendItems };
992
+ switch (target.kind) {
993
+ case "layer":
994
+ layers[target.id] = visible;
995
+ rendererChanges.set(target.id, visible);
996
+ break;
997
+ case "layer-group":
998
+ layerGroupState[target.id] = visible;
999
+ for (const layerId of layerGroups[target.id] ?? []) {
1000
+ layers[layerId] = visible;
1001
+ rendererChanges.set(layerId, visible);
1002
+ }
1003
+ break;
1004
+ case "legend-item":
1005
+ legendItemState[target.id] = visible;
1006
+ for (const layerId of legendItemLayers[target.id] ?? []) {
1007
+ layers[layerId] = visible;
1008
+ rendererChanges.set(layerId, visible);
1009
+ }
1010
+ break;
1011
+ }
1012
+ visibility.layers = layers;
1013
+ visibility.layerGroups = layerGroupState;
1014
+ visibility.legendItems = legendItemState;
1015
+ }
1016
+ function normalizeOverlay(input) {
1017
+ const id = input.id?.trim() || `overlay-${++generatedOverlayId}`;
1018
+ if (!id)
1019
+ throw new HonuaControllerError("invalid-overlay", "overlay.id must not be empty");
1020
+ switch (input.kind) {
1021
+ case "geojson":
1022
+ return structuredClone({ ...input, id });
1023
+ case "point":
1024
+ assertCoordinate(input.coordinate, "overlay.coordinate", "invalid-overlay");
1025
+ return structuredClone({ ...input, id });
1026
+ case "line":
1027
+ if (input.coordinates.length < 2) {
1028
+ throw new HonuaControllerError("invalid-overlay", "line overlay requires at least two coordinates");
1029
+ }
1030
+ for (const coordinate of input.coordinates)
1031
+ assertCoordinate(coordinate, "overlay.coordinates", "invalid-overlay");
1032
+ return structuredClone({ ...input, id });
1033
+ case "polygon":
1034
+ if (input.rings.length === 0 || input.rings[0].length < 4) {
1035
+ throw new HonuaControllerError("invalid-overlay", "polygon overlay requires at least one closed ring");
1036
+ }
1037
+ for (const ring of input.rings) {
1038
+ for (const coordinate of ring)
1039
+ assertCoordinate(coordinate, "overlay.rings", "invalid-overlay");
1040
+ }
1041
+ return structuredClone({ ...input, id });
1042
+ }
1043
+ }
1044
+ function normalizeAnnotation(input) {
1045
+ const id = input.id?.trim() || `annotation-${++generatedAnnotationId}`;
1046
+ if (!id)
1047
+ throw new HonuaControllerError("invalid-annotation", "annotation.id must not be empty");
1048
+ if (!input.text.trim())
1049
+ throw new HonuaControllerError("invalid-annotation", "annotation.text must not be empty");
1050
+ if ("coordinate" in input && input.coordinate) {
1051
+ assertCoordinate(input.coordinate, "annotation.coordinate", "invalid-annotation");
1052
+ }
1053
+ return structuredClone({ ...input, id });
1054
+ }
1055
+ function assertCoordinate(coordinate, label, code) {
1056
+ if (coordinate.length < 2 || coordinate.length > 3 || coordinate.some((value) => !Number.isFinite(value))) {
1057
+ throw new HonuaControllerError(code, `${label} must contain two or three finite numeric values`);
1058
+ }
1059
+ }
1060
+ function temporarySourceId(kind, id) {
1061
+ return `honua-controller-${kind}-${safeMapId(id)}`;
1062
+ }
1063
+ function safeMapId(id) {
1064
+ return id.replace(/[^A-Za-z0-9_-]+/g, "-");
1065
+ }
1066
+ function removeTemporaryMapItem(map, kind, id, layersById) {
1067
+ for (const layerId of [...(layersById.get(id) ?? [])].reverse())
1068
+ map.removeLayer?.(layerId);
1069
+ layersById.delete(id);
1070
+ map.removeSource?.(temporarySourceId(kind, id));
1071
+ }
1072
+ function overlayToGeoJson(overlay) {
1073
+ switch (overlay.kind) {
1074
+ case "geojson":
1075
+ return overlay.data;
1076
+ case "point":
1077
+ return {
1078
+ type: "Feature",
1079
+ id: overlay.id,
1080
+ properties: overlay.properties ?? {},
1081
+ geometry: { type: "Point", coordinates: overlay.coordinate },
1082
+ };
1083
+ case "line":
1084
+ return {
1085
+ type: "Feature",
1086
+ id: overlay.id,
1087
+ properties: overlay.properties ?? {},
1088
+ geometry: { type: "LineString", coordinates: overlay.coordinates },
1089
+ };
1090
+ case "polygon":
1091
+ return {
1092
+ type: "Feature",
1093
+ id: overlay.id,
1094
+ properties: overlay.properties ?? {},
1095
+ geometry: { type: "Polygon", coordinates: overlay.rings },
1096
+ };
1097
+ }
1098
+ }
1099
+ function annotationToGeoJson(annotation) {
1100
+ if (!annotation.coordinate)
1101
+ return undefined;
1102
+ return {
1103
+ type: "Feature",
1104
+ id: annotation.id,
1105
+ properties: { ...(annotation.properties ?? {}), text: annotation.text, kind: annotation.kind },
1106
+ geometry: { type: "Point", coordinates: annotation.coordinate },
1107
+ };
1108
+ }
1109
+ function overlayLayerSpecs(sourceId, overlay) {
1110
+ const id = temporarySourceId("overlay", overlay.id);
1111
+ const style = overlay.style ?? {};
1112
+ const color = style.color ?? "#2563eb";
1113
+ const pointLayer = {
1114
+ id: `${id}-point`,
1115
+ type: "circle",
1116
+ source: sourceId,
1117
+ filter: ["==", ["geometry-type"], "Point"],
1118
+ paint: {
1119
+ "circle-color": style.pointColor ?? color,
1120
+ "circle-radius": style.pointRadius ?? 6,
1121
+ "circle-opacity": style.opacity ?? 0.9,
1122
+ },
1123
+ };
1124
+ const lineLayer = {
1125
+ id: `${id}-line`,
1126
+ type: "line",
1127
+ source: sourceId,
1128
+ filter: ["in", ["geometry-type"], "LineString", "Polygon"],
1129
+ paint: {
1130
+ "line-color": style.lineColor ?? color,
1131
+ "line-width": style.lineWidth ?? 2,
1132
+ "line-opacity": style.opacity ?? 0.95,
1133
+ },
1134
+ };
1135
+ const fillLayer = {
1136
+ id: `${id}-fill`,
1137
+ type: "fill",
1138
+ source: sourceId,
1139
+ filter: ["==", ["geometry-type"], "Polygon"],
1140
+ paint: {
1141
+ "fill-color": style.fillColor ?? color,
1142
+ "fill-opacity": style.fillOpacity ?? 0.18,
1143
+ },
1144
+ };
1145
+ if (overlay.kind === "point")
1146
+ return [pointLayer];
1147
+ if (overlay.kind === "line")
1148
+ return [lineLayer];
1149
+ if (overlay.kind === "polygon")
1150
+ return [fillLayer, lineLayer];
1151
+ return [fillLayer, lineLayer, pointLayer];
1152
+ }
1153
+ function annotationLayerSpecs(sourceId, annotation) {
1154
+ const id = temporarySourceId("annotation", annotation.id);
1155
+ const style = annotation.style ?? {};
1156
+ return [
1157
+ {
1158
+ id: `${id}-text`,
1159
+ type: "symbol",
1160
+ source: sourceId,
1161
+ layout: {
1162
+ "text-field": ["get", "text"],
1163
+ "text-size": style.size ?? 13,
1164
+ "text-anchor": style.anchor ?? "top",
1165
+ },
1166
+ paint: {
1167
+ "text-color": style.color ?? "#111827",
1168
+ "text-halo-color": style.haloColor ?? "#ffffff",
1169
+ "text-halo-width": style.haloWidth ?? 1,
1170
+ },
1171
+ },
1172
+ ];
1173
+ }