@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.
- package/LICENSE +201 -0
- package/README.md +9 -0
- package/contract/analytics-sources.d.ts +149 -0
- package/contract/analytics-sources.d.ts.map +1 -0
- package/contract/analytics-sources.js +235 -0
- package/contract/edit-session.d.ts +203 -0
- package/contract/edit-session.d.ts.map +1 -0
- package/contract/edit-session.js +760 -0
- package/contract/edit-sketch.d.ts +91 -0
- package/contract/edit-sketch.d.ts.map +1 -0
- package/contract/edit-sketch.js +281 -0
- package/contract/index.d.ts +61 -0
- package/contract/index.d.ts.map +1 -0
- package/contract/index.js +51 -0
- package/contract/jobs.d.ts +149 -0
- package/contract/jobs.d.ts.map +1 -0
- package/contract/jobs.js +40 -0
- package/contract/source.d.ts +423 -0
- package/contract/source.d.ts.map +1 -0
- package/contract/source.js +3802 -0
- package/contract/spatial-aggregation.d.ts +336 -0
- package/contract/spatial-aggregation.d.ts.map +1 -0
- package/contract/spatial-aggregation.js +298 -0
- package/contract/temporal.d.ts +455 -0
- package/contract/temporal.d.ts.map +1 -0
- package/contract/temporal.js +146 -0
- package/contract/tiles.d.ts +370 -0
- package/contract/tiles.d.ts.map +1 -0
- package/contract/tiles.js +519 -0
- package/contract/types.d.ts +665 -0
- package/contract/types.d.ts.map +1 -0
- package/contract/types.js +175 -0
- package/contract/widget-source.d.ts +205 -0
- package/contract/widget-source.d.ts.map +1 -0
- package/contract/widget-source.js +1473 -0
- package/control-plane/client.d.ts +95 -0
- package/control-plane/client.d.ts.map +1 -0
- package/control-plane/client.js +374 -0
- package/control-plane/index.d.ts +18 -0
- package/control-plane/index.d.ts.map +1 -0
- package/control-plane/index.js +14 -0
- package/control-plane/types.d.ts +233 -0
- package/control-plane/types.d.ts.map +1 -0
- package/control-plane/types.js +7 -0
- package/core/batch.d.ts +37 -0
- package/core/batch.d.ts.map +1 -0
- package/core/batch.js +79 -0
- package/core/cache-state.d.ts +79 -0
- package/core/cache-state.d.ts.map +1 -0
- package/core/cache-state.js +87 -0
- package/core/client.d.ts +577 -0
- package/core/client.d.ts.map +1 -0
- package/core/client.js +1664 -0
- package/core/compatibility.d.ts +18 -0
- package/core/compatibility.d.ts.map +1 -0
- package/core/compatibility.js +245 -0
- package/core/errors.d.ts +107 -0
- package/core/errors.d.ts.map +1 -0
- package/core/errors.js +156 -0
- package/core/esri-geojson.d.ts +66 -0
- package/core/esri-geojson.d.ts.map +1 -0
- package/core/esri-geojson.js +363 -0
- package/core/geoservices.d.ts +34 -0
- package/core/geoservices.d.ts.map +1 -0
- package/core/geoservices.js +434 -0
- package/core/grpc-adapter.d.ts +23 -0
- package/core/grpc-adapter.d.ts.map +1 -0
- package/core/grpc-adapter.js +688 -0
- package/core/odata.d.ts +347 -0
- package/core/odata.d.ts.map +1 -0
- package/core/odata.js +913 -0
- package/core/ogc-conformance.d.ts +35 -0
- package/core/ogc-conformance.d.ts.map +1 -0
- package/core/ogc-conformance.js +134 -0
- package/core/ogc-features.d.ts +23 -0
- package/core/ogc-features.d.ts.map +1 -0
- package/core/ogc-features.js +114 -0
- package/core/ogc-maps.d.ts +49 -0
- package/core/ogc-maps.d.ts.map +1 -0
- package/core/ogc-maps.js +126 -0
- package/core/ogc-processes.d.ts +118 -0
- package/core/ogc-processes.d.ts.map +1 -0
- package/core/ogc-processes.js +423 -0
- package/core/ogc-records.d.ts +75 -0
- package/core/ogc-records.d.ts.map +1 -0
- package/core/ogc-records.js +251 -0
- package/core/ogc-tiles.d.ts +125 -0
- package/core/ogc-tiles.d.ts.map +1 -0
- package/core/ogc-tiles.js +183 -0
- package/core/path-utils.d.ts +69 -0
- package/core/path-utils.d.ts.map +1 -0
- package/core/path-utils.js +123 -0
- package/core/pbf-decoder.d.ts +39 -0
- package/core/pbf-decoder.d.ts.map +1 -0
- package/core/pbf-decoder.js +702 -0
- package/core/process-runner.d.ts +104 -0
- package/core/process-runner.d.ts.map +1 -0
- package/core/process-runner.js +315 -0
- package/core/protocol-transport.d.ts +76 -0
- package/core/protocol-transport.d.ts.map +1 -0
- package/core/protocol-transport.js +15 -0
- package/core/query-builder.d.ts +261 -0
- package/core/query-builder.d.ts.map +1 -0
- package/core/query-builder.js +538 -0
- package/core/request-pipeline.d.ts +88 -0
- package/core/request-pipeline.d.ts.map +1 -0
- package/core/request-pipeline.js +273 -0
- package/core/spatial-filter.d.ts +93 -0
- package/core/spatial-filter.d.ts.map +1 -0
- package/core/spatial-filter.js +153 -0
- package/core/stac.d.ts +55 -0
- package/core/stac.d.ts.map +1 -0
- package/core/stac.js +229 -0
- package/core/surfaces.d.ts +527 -0
- package/core/surfaces.d.ts.map +1 -0
- package/core/surfaces.js +1917 -0
- package/core/terrain-elevation.d.ts +114 -0
- package/core/terrain-elevation.d.ts.map +1 -0
- package/core/terrain-elevation.js +150 -0
- package/core/types.d.ts +1355 -0
- package/core/types.d.ts.map +1 -0
- package/core/types.js +13 -0
- package/core/wfs-capabilities.d.ts +143 -0
- package/core/wfs-capabilities.d.ts.map +1 -0
- package/core/wfs-capabilities.js +478 -0
- package/core/wfs-filter.d.ts +118 -0
- package/core/wfs-filter.d.ts.map +1 -0
- package/core/wfs-filter.js +634 -0
- package/core/wfs.d.ts +219 -0
- package/core/wfs.d.ts.map +1 -0
- package/core/wfs.js +406 -0
- package/core/wire-shared.d.ts +32 -0
- package/core/wire-shared.d.ts.map +1 -0
- package/core/wire-shared.js +76 -0
- package/core/wms-axis.d.ts +36 -0
- package/core/wms-axis.d.ts.map +1 -0
- package/core/wms-axis.js +73 -0
- package/core/wms-capabilities.d.ts +110 -0
- package/core/wms-capabilities.d.ts.map +1 -0
- package/core/wms-capabilities.js +559 -0
- package/core/wms-types.d.ts +128 -0
- package/core/wms-types.d.ts.map +1 -0
- package/core/wms-types.js +32 -0
- package/core/wms.d.ts +144 -0
- package/core/wms.d.ts.map +1 -0
- package/core/wms.js +338 -0
- package/core/wmts-capabilities.d.ts +82 -0
- package/core/wmts-capabilities.d.ts.map +1 -0
- package/core/wmts-capabilities.js +402 -0
- package/core/wmts.d.ts +103 -0
- package/core/wmts.d.ts.map +1 -0
- package/core/wmts.js +332 -0
- package/core/xml-text.d.ts +20 -0
- package/core/xml-text.d.ts.map +1 -0
- package/core/xml-text.js +85 -0
- package/esri-compat/basemap-gallery.d.ts +38 -0
- package/esri-compat/basemap-gallery.d.ts.map +1 -0
- package/esri-compat/basemap-gallery.js +159 -0
- package/esri-compat/basemap-layer-list.d.ts +35 -0
- package/esri-compat/basemap-layer-list.d.ts.map +1 -0
- package/esri-compat/basemap-layer-list.js +139 -0
- package/esri-compat/basemap.d.ts +32 -0
- package/esri-compat/basemap.d.ts.map +1 -0
- package/esri-compat/basemap.js +84 -0
- package/esri-compat/bookmarks.d.ts +36 -0
- package/esri-compat/bookmarks.d.ts.map +1 -0
- package/esri-compat/bookmarks.js +108 -0
- package/esri-compat/class-breaks-renderer.d.ts +50 -0
- package/esri-compat/class-breaks-renderer.d.ts.map +1 -0
- package/esri-compat/class-breaks-renderer.js +164 -0
- package/esri-compat/color.d.ts +22 -0
- package/esri-compat/color.d.ts.map +1 -0
- package/esri-compat/color.js +106 -0
- package/esri-compat/controls.d.ts +174 -0
- package/esri-compat/controls.d.ts.map +1 -0
- package/esri-compat/controls.js +479 -0
- package/esri-compat/coordinate-conversion.d.ts +41 -0
- package/esri-compat/coordinate-conversion.d.ts.map +1 -0
- package/esri-compat/coordinate-conversion.js +125 -0
- package/esri-compat/directions.d.ts +45 -0
- package/esri-compat/directions.d.ts.map +1 -0
- package/esri-compat/directions.js +123 -0
- package/esri-compat/editor.d.ts +47 -0
- package/esri-compat/editor.d.ts.map +1 -0
- package/esri-compat/editor.js +170 -0
- package/esri-compat/esri-config.d.ts +16 -0
- package/esri-compat/esri-config.d.ts.map +1 -0
- package/esri-compat/esri-config.js +23 -0
- package/esri-compat/esri-request.d.ts +17 -0
- package/esri-compat/esri-request.d.ts.map +1 -0
- package/esri-compat/esri-request.js +127 -0
- package/esri-compat/event-bus.d.ts +106 -0
- package/esri-compat/event-bus.d.ts.map +1 -0
- package/esri-compat/event-bus.js +90 -0
- package/esri-compat/expand.d.ts +36 -0
- package/esri-compat/expand.d.ts.map +1 -0
- package/esri-compat/expand.js +97 -0
- package/esri-compat/extent.d.ts +43 -0
- package/esri-compat/extent.d.ts.map +1 -0
- package/esri-compat/extent.js +140 -0
- package/esri-compat/feature-filter.d.ts +55 -0
- package/esri-compat/feature-filter.d.ts.map +1 -0
- package/esri-compat/feature-filter.js +109 -0
- package/esri-compat/feature-form.d.ts +64 -0
- package/esri-compat/feature-form.d.ts.map +1 -0
- package/esri-compat/feature-form.js +137 -0
- package/esri-compat/feature-layer.d.ts +173 -0
- package/esri-compat/feature-layer.d.ts.map +1 -0
- package/esri-compat/feature-layer.js +661 -0
- package/esri-compat/feature-set.d.ts +32 -0
- package/esri-compat/feature-set.d.ts.map +1 -0
- package/esri-compat/feature-set.js +80 -0
- package/esri-compat/feature-table.d.ts +141 -0
- package/esri-compat/feature-table.d.ts.map +1 -0
- package/esri-compat/feature-table.js +500 -0
- package/esri-compat/feature-templates.d.ts +41 -0
- package/esri-compat/feature-templates.d.ts.map +1 -0
- package/esri-compat/feature-templates.js +97 -0
- package/esri-compat/feature.d.ts +33 -0
- package/esri-compat/feature.d.ts.map +1 -0
- package/esri-compat/feature.js +83 -0
- package/esri-compat/geojson-layer.d.ts +86 -0
- package/esri-compat/geojson-layer.d.ts.map +1 -0
- package/esri-compat/geojson-layer.js +191 -0
- package/esri-compat/geometry-engine.d.ts +107 -0
- package/esri-compat/geometry-engine.d.ts.map +1 -0
- package/esri-compat/geometry-engine.js +266 -0
- package/esri-compat/graphic.d.ts +46 -0
- package/esri-compat/graphic.d.ts.map +1 -0
- package/esri-compat/graphic.js +103 -0
- package/esri-compat/graphics-layer.d.ts +49 -0
- package/esri-compat/graphics-layer.d.ts.map +1 -0
- package/esri-compat/graphics-layer.js +185 -0
- package/esri-compat/group-layer.d.ts +48 -0
- package/esri-compat/group-layer.d.ts.map +1 -0
- package/esri-compat/group-layer.js +212 -0
- package/esri-compat/identify.d.ts +71 -0
- package/esri-compat/identify.d.ts.map +1 -0
- package/esri-compat/identify.js +299 -0
- package/esri-compat/identity-manager.d.ts +31 -0
- package/esri-compat/identity-manager.d.ts.map +1 -0
- package/esri-compat/identity-manager.js +115 -0
- package/esri-compat/imagery-layer.d.ts +78 -0
- package/esri-compat/imagery-layer.d.ts.map +1 -0
- package/esri-compat/imagery-layer.js +167 -0
- package/esri-compat/label-class.d.ts +31 -0
- package/esri-compat/label-class.d.ts.map +1 -0
- package/esri-compat/label-class.js +102 -0
- package/esri-compat/layer-list.d.ts +77 -0
- package/esri-compat/layer-list.d.ts.map +1 -0
- package/esri-compat/layer-list.js +342 -0
- package/esri-compat/legend.d.ts +53 -0
- package/esri-compat/legend.d.ts.map +1 -0
- package/esri-compat/legend.js +254 -0
- package/esri-compat/map-image-layer.d.ts +162 -0
- package/esri-compat/map-image-layer.d.ts.map +1 -0
- package/esri-compat/map-image-layer.js +709 -0
- package/esri-compat/map-view.d.ts +323 -0
- package/esri-compat/map-view.d.ts.map +1 -0
- package/esri-compat/map-view.js +1175 -0
- package/esri-compat/map.d.ts +47 -0
- package/esri-compat/map.d.ts.map +1 -0
- package/esri-compat/map.js +209 -0
- package/esri-compat/measurement-2d.d.ts +61 -0
- package/esri-compat/measurement-2d.d.ts.map +1 -0
- package/esri-compat/measurement-2d.js +184 -0
- package/esri-compat/measurement.d.ts +45 -0
- package/esri-compat/measurement.d.ts.map +1 -0
- package/esri-compat/measurement.js +193 -0
- package/esri-compat/oauth-info.d.ts +35 -0
- package/esri-compat/oauth-info.d.ts.map +1 -0
- package/esri-compat/oauth-info.js +115 -0
- package/esri-compat/picture-marker-symbol.d.ts +35 -0
- package/esri-compat/picture-marker-symbol.d.ts.map +1 -0
- package/esri-compat/picture-marker-symbol.js +126 -0
- package/esri-compat/point.d.ts +31 -0
- package/esri-compat/point.d.ts.map +1 -0
- package/esri-compat/point.js +102 -0
- package/esri-compat/polygon.d.ts +31 -0
- package/esri-compat/polygon.d.ts.map +1 -0
- package/esri-compat/polygon.js +107 -0
- package/esri-compat/polyline.d.ts +31 -0
- package/esri-compat/polyline.d.ts.map +1 -0
- package/esri-compat/polyline.js +107 -0
- package/esri-compat/popup-template.d.ts +55 -0
- package/esri-compat/popup-template.d.ts.map +1 -0
- package/esri-compat/popup-template.js +128 -0
- package/esri-compat/popup.d.ts +54 -0
- package/esri-compat/popup.d.ts.map +1 -0
- package/esri-compat/popup.js +312 -0
- package/esri-compat/print.d.ts +47 -0
- package/esri-compat/print.d.ts.map +1 -0
- package/esri-compat/print.js +105 -0
- package/esri-compat/query.d.ts +58 -0
- package/esri-compat/query.d.ts.map +1 -0
- package/esri-compat/query.js +128 -0
- package/esri-compat/reactive-utils.d.ts +24 -0
- package/esri-compat/reactive-utils.d.ts.map +1 -0
- package/esri-compat/reactive-utils.js +193 -0
- package/esri-compat/request.d.ts +41 -0
- package/esri-compat/request.d.ts.map +1 -0
- package/esri-compat/request.js +253 -0
- package/esri-compat/route-layer.d.ts +59 -0
- package/esri-compat/route-layer.d.ts.map +1 -0
- package/esri-compat/route-layer.js +223 -0
- package/esri-compat/route-task.d.ts +88 -0
- package/esri-compat/route-task.d.ts.map +1 -0
- package/esri-compat/route-task.js +225 -0
- package/esri-compat/scene-view.d.ts +41 -0
- package/esri-compat/scene-view.d.ts.map +1 -0
- package/esri-compat/scene-view.js +68 -0
- package/esri-compat/search.d.ts +112 -0
- package/esri-compat/search.d.ts.map +1 -0
- package/esri-compat/search.js +820 -0
- package/esri-compat/simple-fill-symbol.d.ts +27 -0
- package/esri-compat/simple-fill-symbol.d.ts.map +1 -0
- package/esri-compat/simple-fill-symbol.js +85 -0
- package/esri-compat/simple-line-symbol.d.ts +27 -0
- package/esri-compat/simple-line-symbol.d.ts.map +1 -0
- package/esri-compat/simple-line-symbol.js +85 -0
- package/esri-compat/simple-marker-symbol.d.ts +29 -0
- package/esri-compat/simple-marker-symbol.d.ts.map +1 -0
- package/esri-compat/simple-marker-symbol.js +92 -0
- package/esri-compat/simple-renderer.d.ts +29 -0
- package/esri-compat/simple-renderer.d.ts.map +1 -0
- package/esri-compat/simple-renderer.js +92 -0
- package/esri-compat/sketch.d.ts +64 -0
- package/esri-compat/sketch.d.ts.map +1 -0
- package/esri-compat/sketch.js +227 -0
- package/esri-compat/spatial-reference.d.ts +31 -0
- package/esri-compat/spatial-reference.d.ts.map +1 -0
- package/esri-compat/spatial-reference.js +102 -0
- package/esri-compat/swipe.d.ts +34 -0
- package/esri-compat/swipe.d.ts.map +1 -0
- package/esri-compat/swipe.js +93 -0
- package/esri-compat/table-list.d.ts +36 -0
- package/esri-compat/table-list.d.ts.map +1 -0
- package/esri-compat/table-list.js +126 -0
- package/esri-compat/text-symbol.d.ts +37 -0
- package/esri-compat/text-symbol.d.ts.map +1 -0
- package/esri-compat/text-symbol.js +123 -0
- package/esri-compat/tile-layer.d.ts +52 -0
- package/esri-compat/tile-layer.d.ts.map +1 -0
- package/esri-compat/tile-layer.js +168 -0
- package/esri-compat/time-slider.d.ts +70 -0
- package/esri-compat/time-slider.d.ts.map +1 -0
- package/esri-compat/time-slider.js +208 -0
- package/esri-compat/track.d.ts +51 -0
- package/esri-compat/track.d.ts.map +1 -0
- package/esri-compat/track.js +174 -0
- package/esri-compat/unique-value-renderer.d.ts +41 -0
- package/esri-compat/unique-value-renderer.d.ts.map +1 -0
- package/esri-compat/unique-value-renderer.js +127 -0
- package/esri-compat/url.d.ts +13 -0
- package/esri-compat/url.d.ts.map +1 -0
- package/esri-compat/url.js +68 -0
- package/esri-compat/vector-tile-layer.d.ts +47 -0
- package/esri-compat/vector-tile-layer.d.ts.map +1 -0
- package/esri-compat/vector-tile-layer.js +130 -0
- package/esri-compat/web-map.d.ts +14 -0
- package/esri-compat/web-map.d.ts.map +1 -0
- package/esri-compat/web-map.js +24 -0
- package/esri-compat/wfs-layer.d.ts +64 -0
- package/esri-compat/wfs-layer.d.ts.map +1 -0
- package/esri-compat/wfs-layer.js +145 -0
- package/esri-compat/wms-layer.d.ts +76 -0
- package/esri-compat/wms-layer.d.ts.map +1 -0
- package/esri-compat/wms-layer.js +157 -0
- package/exploration/context.d.ts +25 -0
- package/exploration/context.d.ts.map +1 -0
- package/exploration/context.js +396 -0
- package/exploration/index.d.ts +27 -0
- package/exploration/index.d.ts.map +1 -0
- package/exploration/index.js +24 -0
- package/exploration/presets.d.ts +27 -0
- package/exploration/presets.d.ts.map +1 -0
- package/exploration/presets.js +114 -0
- package/exploration/reducer.d.ts +23 -0
- package/exploration/reducer.d.ts.map +1 -0
- package/exploration/reducer.js +332 -0
- package/exploration/selection.d.ts +25 -0
- package/exploration/selection.d.ts.map +1 -0
- package/exploration/selection.js +34 -0
- package/exploration/selectors.d.ts +56 -0
- package/exploration/selectors.d.ts.map +1 -0
- package/exploration/selectors.js +110 -0
- package/exploration/types.d.ts +294 -0
- package/exploration/types.d.ts.map +1 -0
- package/exploration/types.js +33 -0
- package/expr/expression.d.ts +457 -0
- package/expr/expression.d.ts.map +1 -0
- package/expr/expression.js +663 -0
- package/expr/index.d.ts +32 -0
- package/expr/index.d.ts.map +1 -0
- package/expr/index.js +30 -0
- package/gen/honua/v1/feature_service_pb.d.ts +918 -0
- package/gen/honua/v1/feature_service_pb.d.ts.map +1 -0
- package/gen/honua/v1/feature_service_pb.js +375 -0
- package/generated-app/errors.d.ts +41 -0
- package/generated-app/errors.d.ts.map +1 -0
- package/generated-app/errors.js +41 -0
- package/generated-app/index.d.ts +17 -0
- package/generated-app/index.d.ts.map +1 -0
- package/generated-app/index.js +12 -0
- package/generated-app/manifest.d.ts +183 -0
- package/generated-app/manifest.d.ts.map +1 -0
- package/generated-app/manifest.js +14 -0
- package/generated-app/projection.d.ts +44 -0
- package/generated-app/projection.d.ts.map +1 -0
- package/generated-app/projection.js +234 -0
- package/generated-app/runtime.d.ts +215 -0
- package/generated-app/runtime.d.ts.map +1 -0
- package/generated-app/runtime.js +1196 -0
- package/interactions/detail-model.d.ts +54 -0
- package/interactions/detail-model.d.ts.map +1 -0
- package/interactions/detail-model.js +105 -0
- package/interactions/exploration-bindings.d.ts +120 -0
- package/interactions/exploration-bindings.d.ts.map +1 -0
- package/interactions/exploration-bindings.js +218 -0
- package/interactions/feature-state.d.ts +144 -0
- package/interactions/feature-state.d.ts.map +1 -0
- package/interactions/feature-state.js +169 -0
- package/interactions/hit-test.d.ts +112 -0
- package/interactions/hit-test.d.ts.map +1 -0
- package/interactions/hit-test.js +291 -0
- package/interactions/index.d.ts +31 -0
- package/interactions/index.d.ts.map +1 -0
- package/interactions/index.js +24 -0
- package/interactions/share-state.d.ts +36 -0
- package/interactions/share-state.d.ts.map +1 -0
- package/interactions/share-state.js +123 -0
- package/map/feature-service-adapter.d.ts +138 -0
- package/map/feature-service-adapter.d.ts.map +1 -0
- package/map/feature-service-adapter.js +279 -0
- package/map/honua-map.d.ts +203 -0
- package/map/honua-map.d.ts.map +1 -0
- package/map/honua-map.js +347 -0
- package/map/index.d.ts +27 -0
- package/map/index.d.ts.map +1 -0
- package/map/index.js +22 -0
- package/map/maplibre-target.d.ts +103 -0
- package/map/maplibre-target.d.ts.map +1 -0
- package/map/maplibre-target.js +164 -0
- package/map/webmap-maplibre.d.ts +60 -0
- package/map/webmap-maplibre.d.ts.map +1 -0
- package/map/webmap-maplibre.js +212 -0
- package/package.json +37 -0
- package/react/context.d.ts +32 -0
- package/react/context.d.ts.map +1 -0
- package/react/context.js +19 -0
- package/react/honua-layer.d.ts +35 -0
- package/react/honua-layer.d.ts.map +1 -0
- package/react/honua-layer.js +47 -0
- package/react/honua-map.d.ts +83 -0
- package/react/honua-map.d.ts.map +1 -0
- package/react/honua-map.js +109 -0
- package/react/honua-popup.d.ts +26 -0
- package/react/honua-popup.d.ts.map +1 -0
- package/react/honua-popup.js +34 -0
- package/react/hooks.d.ts +127 -0
- package/react/hooks.d.ts.map +1 -0
- package/react/hooks.js +206 -0
- package/react/index.d.ts +42 -0
- package/react/index.d.ts.map +1 -0
- package/react/index.js +34 -0
- package/react/provider.d.ts +36 -0
- package/react/provider.d.ts.map +1 -0
- package/react/provider.js +35 -0
- package/react/query-cache.d.ts +76 -0
- package/react/query-cache.d.ts.map +1 -0
- package/react/query-cache.js +188 -0
- package/runtime/diff.d.ts +31 -0
- package/runtime/diff.d.ts.map +1 -0
- package/runtime/diff.js +143 -0
- package/runtime/errors.d.ts +40 -0
- package/runtime/errors.d.ts.map +1 -0
- package/runtime/errors.js +35 -0
- package/runtime/index.d.ts +59 -0
- package/runtime/index.d.ts.map +1 -0
- package/runtime/index.js +43 -0
- package/runtime/legend.d.ts +23 -0
- package/runtime/legend.d.ts.map +1 -0
- package/runtime/legend.js +38 -0
- package/runtime/load-package.d.ts +125 -0
- package/runtime/load-package.d.ts.map +1 -0
- package/runtime/load-package.js +264 -0
- package/runtime/map-package-fetch.d.ts +107 -0
- package/runtime/map-package-fetch.d.ts.map +1 -0
- package/runtime/map-package-fetch.js +336 -0
- package/runtime/map-package-realtime.d.ts +169 -0
- package/runtime/map-package-realtime.d.ts.map +1 -0
- package/runtime/map-package-realtime.js +350 -0
- package/runtime/map-package-validation.d.ts +43 -0
- package/runtime/map-package-validation.d.ts.map +1 -0
- package/runtime/map-package-validation.js +269 -0
- package/runtime/map-package-watch.d.ts +78 -0
- package/runtime/map-package-watch.d.ts.map +1 -0
- package/runtime/map-package-watch.js +695 -0
- package/runtime/map-package.d.ts +167 -0
- package/runtime/map-package.d.ts.map +1 -0
- package/runtime/map-package.js +15 -0
- package/runtime/ogc-styles.d.ts +110 -0
- package/runtime/ogc-styles.d.ts.map +1 -0
- package/runtime/ogc-styles.js +195 -0
- package/runtime/popups.d.ts +62 -0
- package/runtime/popups.d.ts.map +1 -0
- package/runtime/popups.js +95 -0
- package/runtime/query-tiles.d.ts +217 -0
- package/runtime/query-tiles.d.ts.map +1 -0
- package/runtime/query-tiles.js +801 -0
- package/runtime/runtime.d.ts +243 -0
- package/runtime/runtime.d.ts.map +1 -0
- package/runtime/runtime.js +1147 -0
- package/runtime/source-bridge.d.ts +99 -0
- package/runtime/source-bridge.d.ts.map +1 -0
- package/runtime/source-bridge.js +401 -0
- package/runtime/style-compose.d.ts +46 -0
- package/runtime/style-compose.d.ts.map +1 -0
- package/runtime/style-compose.js +144 -0
- package/runtime/style-interactions.d.ts +141 -0
- package/runtime/style-interactions.d.ts.map +1 -0
- package/runtime/style-interactions.js +574 -0
- package/runtime/style-spec-validation.d.ts +23 -0
- package/runtime/style-spec-validation.d.ts.map +1 -0
- package/runtime/style-spec-validation.js +357 -0
- package/studio/capability-manifest.d.ts +285 -0
- package/studio/capability-manifest.d.ts.map +1 -0
- package/studio/capability-manifest.js +59 -0
- package/studio/chart-spec.d.ts +85 -0
- package/studio/chart-spec.d.ts.map +1 -0
- package/studio/chart-spec.js +106 -0
- package/studio/index.d.ts +34 -0
- package/studio/index.d.ts.map +1 -0
- package/studio/index.js +27 -0
- package/studio/provenance.d.ts +131 -0
- package/studio/provenance.d.ts.map +1 -0
- package/studio/provenance.js +39 -0
- package/studio/publish.d.ts +64 -0
- package/studio/publish.d.ts.map +1 -0
- package/studio/publish.js +13 -0
- package/studio/types.d.ts +278 -0
- package/studio/types.d.ts.map +1 -0
- package/studio/types.js +71 -0
- package/studio/validate.d.ts +45 -0
- package/studio/validate.d.ts.map +1 -0
- package/studio/validate.js +255 -0
- package/studio/validation.d.ts +112 -0
- package/studio/validation.d.ts.map +1 -0
- package/studio/validation.js +42 -0
- package/style/factory.d.ts +30 -0
- package/style/factory.d.ts.map +1 -0
- package/style/factory.js +61 -0
- package/style/index.d.ts +25 -0
- package/style/index.d.ts.map +1 -0
- package/style/index.js +24 -0
- package/style/specification.d.ts +203 -0
- package/style/specification.d.ts.map +1 -0
- package/style/specification.js +178 -0
- package/style/wms-wmts-resolvers.d.ts +38 -0
- package/style/wms-wmts-resolvers.d.ts.map +1 -0
- package/style/wms-wmts-resolvers.js +92 -0
- package/webmap/contract.d.ts +28 -0
- package/webmap/contract.d.ts.map +1 -0
- package/webmap/contract.js +130 -0
- package/webmap/convert-basemap.d.ts +17 -0
- package/webmap/convert-basemap.d.ts.map +1 -0
- package/webmap/convert-basemap.js +78 -0
- package/webmap/convert-extent.d.ts +17 -0
- package/webmap/convert-extent.d.ts.map +1 -0
- package/webmap/convert-extent.js +114 -0
- package/webmap/convert-label.d.ts +13 -0
- package/webmap/convert-label.d.ts.map +1 -0
- package/webmap/convert-label.js +125 -0
- package/webmap/convert-layer.d.ts +22 -0
- package/webmap/convert-layer.d.ts.map +1 -0
- package/webmap/convert-layer.js +181 -0
- package/webmap/convert-popup.d.ts +34 -0
- package/webmap/convert-popup.d.ts.map +1 -0
- package/webmap/convert-popup.js +68 -0
- package/webmap/convert-renderer.d.ts +17 -0
- package/webmap/convert-renderer.d.ts.map +1 -0
- package/webmap/convert-renderer.js +161 -0
- package/webmap/convert-symbol.d.ts +17 -0
- package/webmap/convert-symbol.d.ts.map +1 -0
- package/webmap/convert-symbol.js +122 -0
- package/webmap/index.d.ts +44 -0
- package/webmap/index.d.ts.map +1 -0
- package/webmap/index.js +33 -0
- package/webmap/parse.d.ts +25 -0
- package/webmap/parse.d.ts.map +1 -0
- package/webmap/parse.js +83 -0
- package/webmap/types.d.ts +264 -0
- package/webmap/types.d.ts.map +1 -0
- package/webmap/types.js +13 -0
- package/webmap/warnings.d.ts +30 -0
- package/webmap/warnings.d.ts.map +1 -0
- 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"}
|