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