@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
package/react/hooks.js
ADDED
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@honua/react` hooks: {@link useHonuaClient}, {@link useDataset},
|
|
3
|
+
* {@link useQuery}, {@link useCapabilities}, {@link useMapRuntime}, and
|
|
4
|
+
* {@link useRealtime}.
|
|
5
|
+
*
|
|
6
|
+
* All data hooks are AbortController-wired and StrictMode-safe, and expose
|
|
7
|
+
* `loading` / `error` / `data` state. Query results are referentially stable
|
|
8
|
+
* until the underlying data changes (NFR-001) because reads go through
|
|
9
|
+
* `useSyncExternalStore` over the provider's {@link HonuaQueryCache}.
|
|
10
|
+
*
|
|
11
|
+
* @module
|
|
12
|
+
*/
|
|
13
|
+
import { useCallback, useContext, useDebugValue, useEffect, useMemo, useSyncExternalStore } from "react";
|
|
14
|
+
import { createDataset } from "../contract/index.js";
|
|
15
|
+
import { HonuaContext, HonuaMapContext } from "./context.js";
|
|
16
|
+
import { idleSnapshot, stableQueryHash } from "./query-cache.js";
|
|
17
|
+
function useHonuaContext(hookName) {
|
|
18
|
+
const value = useContext(HonuaContext);
|
|
19
|
+
if (value === null) {
|
|
20
|
+
throw new Error(`${hookName} must be used within a <HonuaProvider>.`);
|
|
21
|
+
}
|
|
22
|
+
return value;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Access the {@link HonuaClient} published by the nearest {@link HonuaProvider}.
|
|
26
|
+
*
|
|
27
|
+
* @throws if called outside a `HonuaProvider`.
|
|
28
|
+
*/
|
|
29
|
+
export function useHonuaClient() {
|
|
30
|
+
return useHonuaContext("useHonuaClient").client;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Access the provider's {@link HonuaQueryCache}. Rarely needed directly;
|
|
34
|
+
* exposed for advanced invalidation (`cache.invalidate(key)` / `cache.clear()`).
|
|
35
|
+
*/
|
|
36
|
+
export function useHonuaQueryCache() {
|
|
37
|
+
return useHonuaContext("useHonuaQueryCache").cache;
|
|
38
|
+
}
|
|
39
|
+
function datasetSignature(options) {
|
|
40
|
+
const descriptors = options.sources
|
|
41
|
+
.map((descriptor) => stableQueryHash({ ...descriptor, capabilities: descriptor.capabilities }))
|
|
42
|
+
.join("|");
|
|
43
|
+
return [
|
|
44
|
+
options.id,
|
|
45
|
+
options.capabilityPolicy ?? "strict",
|
|
46
|
+
options.skipCompatibilityCheck ? "1" : "0",
|
|
47
|
+
descriptors,
|
|
48
|
+
].join("::");
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Build a memoized {@link Dataset} bound to the provider's client. The dataset
|
|
52
|
+
* identity is stable until its `id`, source descriptors, or policy change, so
|
|
53
|
+
* it is safe to pass its sources into {@link useQuery} across re-renders.
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```tsx
|
|
57
|
+
* const dataset = useDataset({
|
|
58
|
+
* id: "incidents",
|
|
59
|
+
* sources: [{ id: "incidents", protocol: "geoservices-feature-service",
|
|
60
|
+
* locator: { url, serviceId: "incidents", layerId: 0 },
|
|
61
|
+
* capabilities: PROTOCOL_DEFAULT_CAPABILITIES["geoservices-feature-service"] }],
|
|
62
|
+
* });
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
export function useDataset(options) {
|
|
66
|
+
const client = useHonuaClient();
|
|
67
|
+
const signature = datasetSignature(options);
|
|
68
|
+
// `signature` captures id/sources/policy; `resolveSource` is a function
|
|
69
|
+
// identity folded in so a new resolver rebuilds the dataset. Callers should
|
|
70
|
+
// memoize `resolveSource` to keep the dataset stable.
|
|
71
|
+
// biome-ignore lint/correctness/useExhaustiveDependencies: options.* are captured through `signature`.
|
|
72
|
+
const dataset = useMemo(() => createDataset({
|
|
73
|
+
id: options.id,
|
|
74
|
+
client,
|
|
75
|
+
sources: options.sources,
|
|
76
|
+
capabilityPolicy: options.capabilityPolicy,
|
|
77
|
+
skipCompatibilityCheck: options.skipCompatibilityCheck,
|
|
78
|
+
resolveSource: options.resolveSource,
|
|
79
|
+
}), [client, signature, options.resolveSource]);
|
|
80
|
+
useDebugValue(dataset.id);
|
|
81
|
+
return dataset;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Execute a contract {@link Query} against a {@link Source} with loading /
|
|
85
|
+
* error / data state. Results are cached per `(source, query-hash)` inside the
|
|
86
|
+
* provider and are referentially stable until the data changes. The request is
|
|
87
|
+
* aborted when the component unmounts or the query key changes; superseded
|
|
88
|
+
* responses are ignored (no races).
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* ```tsx
|
|
92
|
+
* const { data, isLoading, error, refetch } = useQuery(
|
|
93
|
+
* dataset.source("incidents"),
|
|
94
|
+
* { where: "STATUS = 'OPEN'", returnGeometry: true },
|
|
95
|
+
* );
|
|
96
|
+
* ```
|
|
97
|
+
*/
|
|
98
|
+
export function useQuery(source, query, options = {}) {
|
|
99
|
+
const { cache } = useHonuaContext("useQuery");
|
|
100
|
+
const enabled = options.enabled ?? true;
|
|
101
|
+
const drainAllPages = options.drainAllPages ?? false;
|
|
102
|
+
const sourceId = source?.descriptor.id;
|
|
103
|
+
const queryHash = stableQueryHash(query ?? {});
|
|
104
|
+
// `key` (and thus every effect below) intentionally re-derives from the
|
|
105
|
+
// stable `queryHash` rather than the `query` object identity, so an inline
|
|
106
|
+
// query literal does not thrash the cache.
|
|
107
|
+
const key = useMemo(() => {
|
|
108
|
+
if (!source || sourceId === undefined || !enabled)
|
|
109
|
+
return null;
|
|
110
|
+
return `query::${String(sourceId)}::${drainAllPages ? "all" : "page"}::${queryHash}`;
|
|
111
|
+
}, [source, sourceId, enabled, drainAllPages, queryHash]);
|
|
112
|
+
const subscribe = useCallback((onStoreChange) => (key ? cache.subscribe(key, onStoreChange) : () => { }), [cache, key]);
|
|
113
|
+
const getSnapshot = useCallback(() => (key ? cache.getSnapshot(key) : idleSnapshot()), [cache, key]);
|
|
114
|
+
const snapshot = useSyncExternalStore(subscribe, getSnapshot, () => idleSnapshot());
|
|
115
|
+
// biome-ignore lint/correctness/useExhaustiveDependencies: `key` already encodes source id + query + mode.
|
|
116
|
+
useEffect(() => {
|
|
117
|
+
if (!key || !source)
|
|
118
|
+
return;
|
|
119
|
+
cache.ensure(key, (signal) => drainAllPages ? source.queryAll({ ...query, signal }) : source.query({ ...query, signal }));
|
|
120
|
+
}, [cache, key]);
|
|
121
|
+
// biome-ignore lint/correctness/useExhaustiveDependencies: `key` already encodes source id + query + mode.
|
|
122
|
+
const refetch = useCallback(() => {
|
|
123
|
+
if (!key || !source)
|
|
124
|
+
return;
|
|
125
|
+
cache.run(key, (signal) => drainAllPages ? source.queryAll({ ...query, signal }) : source.query({ ...query, signal }));
|
|
126
|
+
}, [cache, key]);
|
|
127
|
+
useDebugValue(snapshot.status);
|
|
128
|
+
return useMemo(() => ({ ...snapshot, refetch }), [snapshot, refetch]);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Fetch the Honua server's capability / compatibility descriptor
|
|
132
|
+
* (`serverVersion`, `releaseChannel`, feature flags) with loading / error /
|
|
133
|
+
* data state. Cached per-request inside the provider.
|
|
134
|
+
*/
|
|
135
|
+
export function useCapabilities(options = {}) {
|
|
136
|
+
const { client, cache } = useHonuaContext("useCapabilities");
|
|
137
|
+
const enabled = options.enabled ?? true;
|
|
138
|
+
const requestHash = stableQueryHash(options.request ?? {});
|
|
139
|
+
const key = useMemo(() => (enabled ? `capabilities::${requestHash}` : null), [enabled, requestHash]);
|
|
140
|
+
const subscribe = useCallback((onStoreChange) => (key ? cache.subscribe(key, onStoreChange) : () => { }), [cache, key]);
|
|
141
|
+
const getSnapshot = useCallback(() => (key ? cache.getSnapshot(key) : idleSnapshot()), [cache, key]);
|
|
142
|
+
const snapshot = useSyncExternalStore(subscribe, getSnapshot, () => idleSnapshot());
|
|
143
|
+
// biome-ignore lint/correctness/useExhaustiveDependencies: request identity is captured through `requestHash`.
|
|
144
|
+
const fetcher = useCallback((signal) => client.getCompatibility({ ...options.request, signal }), [client, requestHash]);
|
|
145
|
+
useEffect(() => {
|
|
146
|
+
if (!key)
|
|
147
|
+
return;
|
|
148
|
+
cache.ensure(key, fetcher);
|
|
149
|
+
}, [cache, key, fetcher]);
|
|
150
|
+
const refetch = useCallback(() => {
|
|
151
|
+
if (!key)
|
|
152
|
+
return;
|
|
153
|
+
cache.run(key, fetcher);
|
|
154
|
+
}, [cache, key, fetcher]);
|
|
155
|
+
useDebugValue(snapshot.status);
|
|
156
|
+
return useMemo(() => ({ ...snapshot, refetch }), [snapshot, refetch]);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Access the {@link HonuaMapRuntime} owned by the nearest {@link HonuaMap}.
|
|
160
|
+
* Returns `null` until the map has finished loading its package, and when
|
|
161
|
+
* called outside a `HonuaMap`.
|
|
162
|
+
*/
|
|
163
|
+
export function useMapRuntime() {
|
|
164
|
+
return useContext(HonuaMapContext)?.runtime ?? null;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Open a realtime subscription for the lifetime of the component and tear it
|
|
168
|
+
* down on unmount (StrictMode-safe: the effect's cleanup runs between the
|
|
169
|
+
* double-invoked mounts, so no duplicate subscriptions leak).
|
|
170
|
+
*
|
|
171
|
+
* `factory` should open the subscription and return its cleanup handle. It is
|
|
172
|
+
* re-run whenever `deps` change. Works with the SDK realtime store
|
|
173
|
+
* (`store.connect(...)` returns `{ close() }`) or any `() => void` unsubscribe.
|
|
174
|
+
*
|
|
175
|
+
* @example
|
|
176
|
+
* ```tsx
|
|
177
|
+
* useRealtime(() => store.connect(transport, request), [transport, request]);
|
|
178
|
+
* ```
|
|
179
|
+
*/
|
|
180
|
+
export function useRealtime(factory, deps = []) {
|
|
181
|
+
// biome-ignore lint/correctness/useExhaustiveDependencies: the caller-supplied dependency list controls re-subscription.
|
|
182
|
+
useEffect(() => {
|
|
183
|
+
if (!factory)
|
|
184
|
+
return;
|
|
185
|
+
const handle = factory();
|
|
186
|
+
return () => {
|
|
187
|
+
runCleanup(handle);
|
|
188
|
+
};
|
|
189
|
+
}, deps);
|
|
190
|
+
}
|
|
191
|
+
function runCleanup(handle) {
|
|
192
|
+
if (!handle)
|
|
193
|
+
return;
|
|
194
|
+
if (typeof handle === "function") {
|
|
195
|
+
handle();
|
|
196
|
+
}
|
|
197
|
+
else if ("close" in handle) {
|
|
198
|
+
handle.close();
|
|
199
|
+
}
|
|
200
|
+
else if ("remove" in handle) {
|
|
201
|
+
handle.remove();
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
handle.unsubscribe();
|
|
205
|
+
}
|
|
206
|
+
}
|
package/react/index.d.ts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@honua/react` — idiomatic React bindings for the Honua SDK: a provider,
|
|
3
|
+
* data hooks, and declarative map components over the framework-neutral
|
|
4
|
+
* `@honua/sdk-js` core.
|
|
5
|
+
*
|
|
6
|
+
* The core SDK stays React-free; this entry point is the only place React is
|
|
7
|
+
* imported. It is SSR-safe (no `window`/`document` access at import time) and
|
|
8
|
+
* StrictMode-safe under React 18 and 19.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```tsx
|
|
12
|
+
* import { HonuaClient } from "@honua/sdk-js/honua";
|
|
13
|
+
* import { HonuaProvider, useDataset, useQuery } from "@honua/react";
|
|
14
|
+
*
|
|
15
|
+
* const client = new HonuaClient({ baseUrl: "https://honua.example.com" });
|
|
16
|
+
*
|
|
17
|
+
* function App() {
|
|
18
|
+
* return (
|
|
19
|
+
* <HonuaProvider client={client}>
|
|
20
|
+
* <Incidents />
|
|
21
|
+
* </HonuaProvider>
|
|
22
|
+
* );
|
|
23
|
+
* }
|
|
24
|
+
* ```
|
|
25
|
+
*
|
|
26
|
+
* @packageDocumentation
|
|
27
|
+
*/
|
|
28
|
+
export { HonuaProvider } from "./provider.js";
|
|
29
|
+
export type { HonuaProviderProps } from "./provider.js";
|
|
30
|
+
export { useHonuaClient, useHonuaQueryCache, useDataset, useQuery, useCapabilities, useMapRuntime, useRealtime, } from "./hooks.js";
|
|
31
|
+
export type { UseDatasetOptions, UseQueryOptions, UseQueryResult, UseCapabilitiesOptions, UseCapabilitiesResult, RealtimeCleanup, } from "./hooks.js";
|
|
32
|
+
export { HonuaMap } from "./honua-map.js";
|
|
33
|
+
export type { HonuaMapProps, MapLibreGlModule, MapLibreMapOptions } from "./honua-map.js";
|
|
34
|
+
export { HonuaLayer } from "./honua-layer.js";
|
|
35
|
+
export type { HonuaLayerProps, HonuaLayerSource } from "./honua-layer.js";
|
|
36
|
+
export { HonuaPopup } from "./honua-popup.js";
|
|
37
|
+
export type { HonuaPopupProps } from "./honua-popup.js";
|
|
38
|
+
export { HonuaContext, HonuaMapContext } from "./context.js";
|
|
39
|
+
export type { HonuaContextValue, HonuaMapContextValue } from "./context.js";
|
|
40
|
+
export { HonuaQueryCache, stableQueryHash, idleSnapshot } from "./query-cache.js";
|
|
41
|
+
export type { QueryStatus, QuerySnapshot, QueryFetcher } from "./query-cache.js";
|
|
42
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/react/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,YAAY,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAExD,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,UAAU,EACV,QAAQ,EACR,eAAe,EACf,aAAa,EACb,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,sBAAsB,EACtB,qBAAqB,EACrB,eAAe,GAChB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAC1F,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC7D,YAAY,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAE5E,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAClF,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC"}
|
package/react/index.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@honua/react` — idiomatic React bindings for the Honua SDK: a provider,
|
|
3
|
+
* data hooks, and declarative map components over the framework-neutral
|
|
4
|
+
* `@honua/sdk-js` core.
|
|
5
|
+
*
|
|
6
|
+
* The core SDK stays React-free; this entry point is the only place React is
|
|
7
|
+
* imported. It is SSR-safe (no `window`/`document` access at import time) and
|
|
8
|
+
* StrictMode-safe under React 18 and 19.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```tsx
|
|
12
|
+
* import { HonuaClient } from "@honua/sdk-js/honua";
|
|
13
|
+
* import { HonuaProvider, useDataset, useQuery } from "@honua/react";
|
|
14
|
+
*
|
|
15
|
+
* const client = new HonuaClient({ baseUrl: "https://honua.example.com" });
|
|
16
|
+
*
|
|
17
|
+
* function App() {
|
|
18
|
+
* return (
|
|
19
|
+
* <HonuaProvider client={client}>
|
|
20
|
+
* <Incidents />
|
|
21
|
+
* </HonuaProvider>
|
|
22
|
+
* );
|
|
23
|
+
* }
|
|
24
|
+
* ```
|
|
25
|
+
*
|
|
26
|
+
* @packageDocumentation
|
|
27
|
+
*/
|
|
28
|
+
export { HonuaProvider } from "./provider.js";
|
|
29
|
+
export { useHonuaClient, useHonuaQueryCache, useDataset, useQuery, useCapabilities, useMapRuntime, useRealtime, } from "./hooks.js";
|
|
30
|
+
export { HonuaMap } from "./honua-map.js";
|
|
31
|
+
export { HonuaLayer } from "./honua-layer.js";
|
|
32
|
+
export { HonuaPopup } from "./honua-popup.js";
|
|
33
|
+
export { HonuaContext, HonuaMapContext } from "./context.js";
|
|
34
|
+
export { HonuaQueryCache, stableQueryHash, idleSnapshot } from "./query-cache.js";
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* {@link HonuaProvider} — the root of every `@honua/react` tree. Publishes an
|
|
3
|
+
* active {@link HonuaClient} plus a per-provider {@link HonuaQueryCache} to the
|
|
4
|
+
* hooks and map components below it.
|
|
5
|
+
*
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
import { type ReactNode } from "react";
|
|
9
|
+
import type { HonuaClient } from "../core/client.js";
|
|
10
|
+
import { HonuaQueryCache } from "./query-cache.js";
|
|
11
|
+
/** Props for {@link HonuaProvider}. */
|
|
12
|
+
export interface HonuaProviderProps {
|
|
13
|
+
/** The client every descendant hook/component queries through. */
|
|
14
|
+
client: HonuaClient;
|
|
15
|
+
/**
|
|
16
|
+
* Optional externally-owned query cache. Supply one to share cached results
|
|
17
|
+
* across providers or to pre-seed a cache in tests; omit to let the provider
|
|
18
|
+
* own a fresh, session-scoped cache.
|
|
19
|
+
*/
|
|
20
|
+
cache?: HonuaQueryCache;
|
|
21
|
+
children?: ReactNode;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Wrap an application (or subtree) to make a `HonuaClient` available to the
|
|
25
|
+
* `@honua/react` hooks and map components.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```tsx
|
|
29
|
+
* const client = new HonuaClient({ baseUrl: "https://honua.example.com" });
|
|
30
|
+
* <HonuaProvider client={client}>
|
|
31
|
+
* <App />
|
|
32
|
+
* </HonuaProvider>
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare function HonuaProvider({ client, cache, children }: HonuaProviderProps): ReactNode;
|
|
36
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/react/provider.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,SAAS,EAAmB,MAAM,OAAO,CAAC;AAExD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,uCAAuC;AACvC,MAAM,WAAW,kBAAkB;IACjC,kEAAkE;IAClE,MAAM,EAAE,WAAW,CAAC;IACpB;;;;OAIG;IACH,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,kBAAkB,GAAG,SAAS,CAgBxF"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* {@link HonuaProvider} — the root of every `@honua/react` tree. Publishes an
|
|
4
|
+
* active {@link HonuaClient} plus a per-provider {@link HonuaQueryCache} to the
|
|
5
|
+
* hooks and map components below it.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import { useMemo, useRef } from "react";
|
|
10
|
+
import { HonuaContext } from "./context.js";
|
|
11
|
+
import { HonuaQueryCache } from "./query-cache.js";
|
|
12
|
+
/**
|
|
13
|
+
* Wrap an application (or subtree) to make a `HonuaClient` available to the
|
|
14
|
+
* `@honua/react` hooks and map components.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```tsx
|
|
18
|
+
* const client = new HonuaClient({ baseUrl: "https://honua.example.com" });
|
|
19
|
+
* <HonuaProvider client={client}>
|
|
20
|
+
* <App />
|
|
21
|
+
* </HonuaProvider>
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export function HonuaProvider({ client, cache, children }) {
|
|
25
|
+
// Own a stable cache for the provider's lifetime unless the caller supplies
|
|
26
|
+
// one. `useRef` keeps the same instance across re-renders and StrictMode's
|
|
27
|
+
// double-invoke of render.
|
|
28
|
+
const ownedCacheRef = useRef(null);
|
|
29
|
+
if (ownedCacheRef.current === null) {
|
|
30
|
+
ownedCacheRef.current = new HonuaQueryCache();
|
|
31
|
+
}
|
|
32
|
+
const activeCache = cache ?? ownedCacheRef.current;
|
|
33
|
+
const value = useMemo(() => ({ client, cache: activeCache }), [client, activeCache]);
|
|
34
|
+
return _jsx(HonuaContext.Provider, { value: value, children: children });
|
|
35
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Framework-neutral query cache used by the `@honua/react` hooks. Lives
|
|
3
|
+
* outside React so it can back `useSyncExternalStore` (referentially stable
|
|
4
|
+
* snapshots, StrictMode-safe subscriptions) and be shared across every hook
|
|
5
|
+
* mounted under a single {@link HonuaProvider}.
|
|
6
|
+
*
|
|
7
|
+
* The cache keys results per `(source, query-hash)` string. It never persists
|
|
8
|
+
* across sessions and holds no cross-`HonuaProvider` state: each provider owns
|
|
9
|
+
* one cache instance.
|
|
10
|
+
*
|
|
11
|
+
* @module
|
|
12
|
+
*/
|
|
13
|
+
/** Lifecycle state of a single cached query. */
|
|
14
|
+
export type QueryStatus = "idle" | "loading" | "success" | "error";
|
|
15
|
+
/**
|
|
16
|
+
* Immutable snapshot of a cached query. The same object reference is returned
|
|
17
|
+
* from {@link HonuaQueryCache.getSnapshot} until the underlying state changes,
|
|
18
|
+
* which is what gives hooks their referential stability (NFR-001).
|
|
19
|
+
*/
|
|
20
|
+
export interface QuerySnapshot<T> {
|
|
21
|
+
readonly status: QueryStatus;
|
|
22
|
+
/** Last resolved value. Preserved across background refetches. */
|
|
23
|
+
readonly data: T | undefined;
|
|
24
|
+
/** Last rejection reason, cleared on the next successful fetch. */
|
|
25
|
+
readonly error: unknown;
|
|
26
|
+
/** True only while the first fetch (no data yet) is in flight. */
|
|
27
|
+
readonly isLoading: boolean;
|
|
28
|
+
/** True whenever a fetch is in flight, including background refetches. */
|
|
29
|
+
readonly isFetching: boolean;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Returns the shared idle snapshot. Exposed so the SSR / disabled-query paths
|
|
33
|
+
* can hand back a stable reference without allocating.
|
|
34
|
+
*/
|
|
35
|
+
export declare function idleSnapshot<T>(): QuerySnapshot<T>;
|
|
36
|
+
/** A fetcher receives the cache-owned `AbortSignal` for cooperative cancellation. */
|
|
37
|
+
export type QueryFetcher<T> = (signal: AbortSignal) => Promise<T>;
|
|
38
|
+
/**
|
|
39
|
+
* Per-`HonuaProvider` cache of query results. Not a React construct; it is
|
|
40
|
+
* driven by the hooks via {@link subscribe} / {@link getSnapshot} / {@link ensure}.
|
|
41
|
+
*/
|
|
42
|
+
export declare class HonuaQueryCache {
|
|
43
|
+
private readonly entries;
|
|
44
|
+
/** Read the current snapshot for `key`; a stable idle snapshot if unseen. */
|
|
45
|
+
getSnapshot<T>(key: string): QuerySnapshot<T>;
|
|
46
|
+
/**
|
|
47
|
+
* Subscribe `listener` to changes for `key`. When the final listener for a
|
|
48
|
+
* key unsubscribes and a fetch is still in flight, the fetch is aborted so
|
|
49
|
+
* unmounting the last consumer cancels the underlying request.
|
|
50
|
+
*/
|
|
51
|
+
subscribe(key: string, listener: () => void): () => void;
|
|
52
|
+
/**
|
|
53
|
+
* Kick off a fetch for `key` only when it has never resolved and is not
|
|
54
|
+
* already in flight. This is the idempotent entry point hooks call from an
|
|
55
|
+
* effect; StrictMode's double-invoke therefore does not double-fetch.
|
|
56
|
+
*/
|
|
57
|
+
ensure<T>(key: string, fetcher: QueryFetcher<T>): void;
|
|
58
|
+
/**
|
|
59
|
+
* Force a (re)fetch for `key`, superseding any in-flight request. The last
|
|
60
|
+
* resolved `data` is preserved while the refetch runs.
|
|
61
|
+
*/
|
|
62
|
+
run<T>(key: string, fetcher: QueryFetcher<T>): void;
|
|
63
|
+
/** Drop the cached result for `key` and abort any in-flight fetch. */
|
|
64
|
+
invalidate(key: string): void;
|
|
65
|
+
/** Abort every in-flight fetch and clear all cached results. */
|
|
66
|
+
clear(): void;
|
|
67
|
+
private entryFor;
|
|
68
|
+
private write;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Deterministic, key-order-independent hash of a query-like object. Used to
|
|
72
|
+
* build the `(source, query-hash)` cache key. `AbortSignal` and `undefined`
|
|
73
|
+
* values are ignored so they do not perturb the identity of a query.
|
|
74
|
+
*/
|
|
75
|
+
export declare function stableQueryHash(value: unknown): string;
|
|
76
|
+
//# sourceMappingURL=query-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-cache.d.ts","sourceRoot":"","sources":["../../../src/react/query-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,gDAAgD;AAChD,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAEnE;;;;GAIG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,kEAAkE;IAClE,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,SAAS,CAAC;IAC7B,mEAAmE;IACnE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,kEAAkE;IAClE,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,0EAA0E;IAC1E,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;AAkBD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,CAAC,KAAK,aAAa,CAAC,CAAC,CAAC,CAElD;AAED,qFAAqF;AACrF,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;AAElE;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IAEzD,6EAA6E;IAC7E,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC;IAI7C;;;;OAIG;IACH,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IA+BxD;;;;OAIG;IACH,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI;IAOtD;;;OAGG;IACH,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI;IA2CnD,sEAAsE;IACtE,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAS7B,gEAAgE;IAChE,KAAK,IAAI,IAAI;IASb,OAAO,CAAC,QAAQ;IAShB,OAAO,CAAC,KAAK;CAMd;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEtD"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Framework-neutral query cache used by the `@honua/react` hooks. Lives
|
|
3
|
+
* outside React so it can back `useSyncExternalStore` (referentially stable
|
|
4
|
+
* snapshots, StrictMode-safe subscriptions) and be shared across every hook
|
|
5
|
+
* mounted under a single {@link HonuaProvider}.
|
|
6
|
+
*
|
|
7
|
+
* The cache keys results per `(source, query-hash)` string. It never persists
|
|
8
|
+
* across sessions and holds no cross-`HonuaProvider` state: each provider owns
|
|
9
|
+
* one cache instance.
|
|
10
|
+
*
|
|
11
|
+
* @module
|
|
12
|
+
*/
|
|
13
|
+
const IDLE_SNAPSHOT = Object.freeze({
|
|
14
|
+
status: "idle",
|
|
15
|
+
data: undefined,
|
|
16
|
+
error: undefined,
|
|
17
|
+
isLoading: false,
|
|
18
|
+
isFetching: false,
|
|
19
|
+
});
|
|
20
|
+
/**
|
|
21
|
+
* Returns the shared idle snapshot. Exposed so the SSR / disabled-query paths
|
|
22
|
+
* can hand back a stable reference without allocating.
|
|
23
|
+
*/
|
|
24
|
+
export function idleSnapshot() {
|
|
25
|
+
return IDLE_SNAPSHOT;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Per-`HonuaProvider` cache of query results. Not a React construct; it is
|
|
29
|
+
* driven by the hooks via {@link subscribe} / {@link getSnapshot} / {@link ensure}.
|
|
30
|
+
*/
|
|
31
|
+
export class HonuaQueryCache {
|
|
32
|
+
entries = new Map();
|
|
33
|
+
/** Read the current snapshot for `key`; a stable idle snapshot if unseen. */
|
|
34
|
+
getSnapshot(key) {
|
|
35
|
+
return (this.entries.get(key)?.snapshot ?? IDLE_SNAPSHOT);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Subscribe `listener` to changes for `key`. When the final listener for a
|
|
39
|
+
* key unsubscribes and a fetch is still in flight, the fetch is aborted so
|
|
40
|
+
* unmounting the last consumer cancels the underlying request.
|
|
41
|
+
*/
|
|
42
|
+
subscribe(key, listener) {
|
|
43
|
+
const entry = this.entryFor(key);
|
|
44
|
+
entry.listeners.add(listener);
|
|
45
|
+
return () => {
|
|
46
|
+
entry.listeners.delete(listener);
|
|
47
|
+
if (entry.listeners.size === 0 && entry.controller) {
|
|
48
|
+
// Last consumer left while a fetch was in flight: abort it and
|
|
49
|
+
// invalidate the run so its (now irrelevant) settlement is ignored.
|
|
50
|
+
entry.controller.abort();
|
|
51
|
+
entry.controller = undefined;
|
|
52
|
+
entry.token += 1;
|
|
53
|
+
// If nothing had resolved yet, drop back to `idle` so the next
|
|
54
|
+
// subscriber (e.g. a StrictMode remount) re-fetches from a clean
|
|
55
|
+
// state instead of being stuck on a `loading` snapshot that will
|
|
56
|
+
// never settle. A previously-resolved value is preserved.
|
|
57
|
+
if (entry.snapshot.status === "loading") {
|
|
58
|
+
entry.snapshot =
|
|
59
|
+
entry.snapshot.data === undefined
|
|
60
|
+
? IDLE_SNAPSHOT
|
|
61
|
+
: {
|
|
62
|
+
status: "success",
|
|
63
|
+
data: entry.snapshot.data,
|
|
64
|
+
error: undefined,
|
|
65
|
+
isLoading: false,
|
|
66
|
+
isFetching: false,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Kick off a fetch for `key` only when it has never resolved and is not
|
|
74
|
+
* already in flight. This is the idempotent entry point hooks call from an
|
|
75
|
+
* effect; StrictMode's double-invoke therefore does not double-fetch.
|
|
76
|
+
*/
|
|
77
|
+
ensure(key, fetcher) {
|
|
78
|
+
const entry = this.entryFor(key);
|
|
79
|
+
if (entry.snapshot.status === "idle") {
|
|
80
|
+
this.run(key, fetcher);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Force a (re)fetch for `key`, superseding any in-flight request. The last
|
|
85
|
+
* resolved `data` is preserved while the refetch runs.
|
|
86
|
+
*/
|
|
87
|
+
run(key, fetcher) {
|
|
88
|
+
const entry = this.entryFor(key);
|
|
89
|
+
entry.controller?.abort();
|
|
90
|
+
const controller = new AbortController();
|
|
91
|
+
const token = entry.token + 1;
|
|
92
|
+
entry.token = token;
|
|
93
|
+
entry.controller = controller;
|
|
94
|
+
this.write(entry, {
|
|
95
|
+
status: "loading",
|
|
96
|
+
data: entry.snapshot.data,
|
|
97
|
+
error: undefined,
|
|
98
|
+
isLoading: entry.snapshot.data === undefined,
|
|
99
|
+
isFetching: true,
|
|
100
|
+
});
|
|
101
|
+
fetcher(controller.signal).then((value) => {
|
|
102
|
+
if (entry.token !== token)
|
|
103
|
+
return;
|
|
104
|
+
entry.controller = undefined;
|
|
105
|
+
this.write(entry, {
|
|
106
|
+
status: "success",
|
|
107
|
+
data: value,
|
|
108
|
+
error: undefined,
|
|
109
|
+
isLoading: false,
|
|
110
|
+
isFetching: false,
|
|
111
|
+
});
|
|
112
|
+
}, (error) => {
|
|
113
|
+
if (entry.token !== token || controller.signal.aborted)
|
|
114
|
+
return;
|
|
115
|
+
entry.controller = undefined;
|
|
116
|
+
this.write(entry, {
|
|
117
|
+
status: "error",
|
|
118
|
+
data: entry.snapshot.data,
|
|
119
|
+
error,
|
|
120
|
+
isLoading: false,
|
|
121
|
+
isFetching: false,
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
/** Drop the cached result for `key` and abort any in-flight fetch. */
|
|
126
|
+
invalidate(key) {
|
|
127
|
+
const entry = this.entries.get(key);
|
|
128
|
+
if (!entry)
|
|
129
|
+
return;
|
|
130
|
+
entry.controller?.abort();
|
|
131
|
+
entry.controller = undefined;
|
|
132
|
+
entry.token += 1;
|
|
133
|
+
this.write(entry, IDLE_SNAPSHOT);
|
|
134
|
+
}
|
|
135
|
+
/** Abort every in-flight fetch and clear all cached results. */
|
|
136
|
+
clear() {
|
|
137
|
+
for (const entry of this.entries.values()) {
|
|
138
|
+
entry.controller?.abort();
|
|
139
|
+
entry.controller = undefined;
|
|
140
|
+
entry.token += 1;
|
|
141
|
+
}
|
|
142
|
+
this.entries.clear();
|
|
143
|
+
}
|
|
144
|
+
entryFor(key) {
|
|
145
|
+
let entry = this.entries.get(key);
|
|
146
|
+
if (!entry) {
|
|
147
|
+
entry = { snapshot: IDLE_SNAPSHOT, listeners: new Set(), controller: undefined, token: 0 };
|
|
148
|
+
this.entries.set(key, entry);
|
|
149
|
+
}
|
|
150
|
+
return entry;
|
|
151
|
+
}
|
|
152
|
+
write(entry, snapshot) {
|
|
153
|
+
entry.snapshot = snapshot;
|
|
154
|
+
for (const listener of entry.listeners) {
|
|
155
|
+
listener();
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Deterministic, key-order-independent hash of a query-like object. Used to
|
|
161
|
+
* build the `(source, query-hash)` cache key. `AbortSignal` and `undefined`
|
|
162
|
+
* values are ignored so they do not perturb the identity of a query.
|
|
163
|
+
*/
|
|
164
|
+
export function stableQueryHash(value) {
|
|
165
|
+
return stableStringify(value);
|
|
166
|
+
}
|
|
167
|
+
function stableStringify(value) {
|
|
168
|
+
if (value === null || typeof value !== "object") {
|
|
169
|
+
return JSON.stringify(value) ?? "null";
|
|
170
|
+
}
|
|
171
|
+
if (value instanceof AbortSignal) {
|
|
172
|
+
return '"[signal]"';
|
|
173
|
+
}
|
|
174
|
+
if (Array.isArray(value)) {
|
|
175
|
+
return `[${value.map((entry) => stableStringify(entry)).join(",")}]`;
|
|
176
|
+
}
|
|
177
|
+
if (value instanceof Set) {
|
|
178
|
+
return `[${[...value]
|
|
179
|
+
.map((entry) => stableStringify(entry))
|
|
180
|
+
.sort()
|
|
181
|
+
.join(",")}]`;
|
|
182
|
+
}
|
|
183
|
+
const record = value;
|
|
184
|
+
const keys = Object.keys(record)
|
|
185
|
+
.filter((key) => record[key] !== undefined && !(record[key] instanceof AbortSignal))
|
|
186
|
+
.sort();
|
|
187
|
+
return `{${keys.map((key) => `${JSON.stringify(key)}:${stableStringify(record[key])}`).join(",")}}`;
|
|
188
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Diff primitives for incremental `updatePackage` application.
|
|
3
|
+
*
|
|
4
|
+
* The runtime uses stable IDs (`sourceId`, `layer.id`) as the diff key
|
|
5
|
+
* and falls back to a full `map.setStyle` only when structural change
|
|
6
|
+
* makes incremental patching unsafe (e.g. layer reorder, mapSpec version
|
|
7
|
+
* mismatch, source type change).
|
|
8
|
+
*
|
|
9
|
+
* @module
|
|
10
|
+
*/
|
|
11
|
+
import type { HonuaMapPackage, HonuaMapPackageSourceBinding } from "./map-package.js";
|
|
12
|
+
export interface MapPackageDiff {
|
|
13
|
+
/** Bindings present in `next` but not `previous`. */
|
|
14
|
+
addedSourceBindings: HonuaMapPackageSourceBinding[];
|
|
15
|
+
/** sourceIds present in `previous` but not `next`. */
|
|
16
|
+
removedSourceIds: string[];
|
|
17
|
+
/** sourceIds whose locator / filter changed — requires add-then-remove. */
|
|
18
|
+
changedSourceIds: string[];
|
|
19
|
+
/** Layer ids newly added in `next`. */
|
|
20
|
+
addedLayerIds: string[];
|
|
21
|
+
/** Layer ids removed in `next`. */
|
|
22
|
+
removedLayerIds: string[];
|
|
23
|
+
/** Layer ids whose raw layer spec changed. */
|
|
24
|
+
changedLayerIds: string[];
|
|
25
|
+
/** Whether the diff is safe to apply incrementally. */
|
|
26
|
+
incremental: boolean;
|
|
27
|
+
/** Human-readable reason when `incremental` is false. */
|
|
28
|
+
structuralReason?: string;
|
|
29
|
+
}
|
|
30
|
+
export declare function diffPackages(previous: HonuaMapPackage, next: HonuaMapPackage): MapPackageDiff;
|
|
31
|
+
//# sourceMappingURL=diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../src/runtime/diff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,4BAA4B,EAAE,MAAM,kBAAkB,CAAC;AAEtF,MAAM,WAAW,cAAc;IAC7B,qDAAqD;IACrD,mBAAmB,EAAE,4BAA4B,EAAE,CAAC;IACpD,sDAAsD;IACtD,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,2EAA2E;IAC3E,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,uCAAuC;IACvC,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,mCAAmC;IACnC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,8CAA8C;IAC9C,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,uDAAuD;IACvD,WAAW,EAAE,OAAO,CAAC;IACrB,yDAAyD;IACzD,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,eAAe,EAAE,IAAI,EAAE,eAAe,GAAG,cAAc,CA6C7F"}
|