@honua/react 0.0.20-alpha.0 → 0.1.1-beta.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/contract/discovery.d.ts +231 -0
- package/contract/discovery.d.ts.map +1 -0
- package/contract/discovery.js +554 -0
- package/contract/edit-sketch.d.ts +8 -0
- package/contract/edit-sketch.d.ts.map +1 -1
- package/contract/edit-sketch.js +15 -0
- package/contract/edit-snapping.d.ts +160 -0
- package/contract/edit-snapping.d.ts.map +1 -0
- package/contract/edit-snapping.js +675 -0
- package/contract/generated/projjson-v0.7-crs-validator.d.ts +35 -0
- package/contract/generated/projjson-v0.7-crs-validator.d.ts.map +1 -0
- package/contract/generated/projjson-v0.7-crs-validator.js +3941 -0
- package/contract/index.d.ts +12 -1
- package/contract/index.d.ts.map +1 -1
- package/contract/index.js +4 -0
- package/contract/pmtiles.d.ts +193 -0
- package/contract/pmtiles.d.ts.map +1 -0
- package/contract/pmtiles.js +195 -0
- package/contract/protocol-module.d.ts +70 -0
- package/contract/protocol-module.d.ts.map +1 -0
- package/contract/protocol-module.js +1 -0
- package/contract/schema-envelope.d.ts +26 -0
- package/contract/schema-envelope.d.ts.map +1 -0
- package/contract/schema-envelope.js +25 -0
- package/contract/schema.d.ts +582 -0
- package/contract/schema.d.ts.map +1 -0
- package/contract/schema.js +2483 -0
- package/contract/source-capability-support.d.ts +6 -0
- package/contract/source-capability-support.d.ts.map +1 -0
- package/contract/source-capability-support.js +154 -0
- package/contract/source.d.ts +57 -15
- package/contract/source.d.ts.map +1 -1
- package/contract/source.js +368 -65
- package/contract/types.d.ts +171 -6
- package/contract/types.d.ts.map +1 -1
- package/contract/types.js +14 -14
- package/core/auth/client-credentials-provider.d.ts +51 -0
- package/core/auth/client-credentials-provider.d.ts.map +1 -0
- package/core/auth/client-credentials-provider.js +115 -0
- package/core/auth/credential-store.d.ts +52 -0
- package/core/auth/credential-store.d.ts.map +1 -0
- package/core/auth/credential-store.js +82 -0
- package/core/auth/index.d.ts +23 -0
- package/core/auth/index.d.ts.map +1 -0
- package/core/auth/index.js +20 -0
- package/core/auth/oauth2-provider.d.ts +114 -0
- package/core/auth/oauth2-provider.d.ts.map +1 -0
- package/core/auth/oauth2-provider.js +408 -0
- package/core/auth/pkce.d.ts +25 -0
- package/core/auth/pkce.d.ts.map +1 -0
- package/core/auth/pkce.js +46 -0
- package/core/auth/static-providers.d.ts +20 -0
- package/core/auth/static-providers.d.ts.map +1 -0
- package/core/auth/static-providers.js +26 -0
- package/core/auth/token-endpoint.d.ts +40 -0
- package/core/auth/token-endpoint.d.ts.map +1 -0
- package/core/auth/token-endpoint.js +133 -0
- package/core/auth/types.d.ts +144 -0
- package/core/auth/types.d.ts.map +1 -0
- package/core/auth/types.js +8 -0
- package/core/bounded-json.d.ts +4 -0
- package/core/bounded-json.d.ts.map +1 -0
- package/core/bounded-json.js +38 -0
- package/core/cache-state.d.ts +9 -0
- package/core/cache-state.d.ts.map +1 -1
- package/core/cache-state.js +10 -0
- package/core/capabilities-xml.d.ts +33 -0
- package/core/capabilities-xml.d.ts.map +1 -0
- package/core/capabilities-xml.js +331 -0
- package/core/client.d.ts +35 -2
- package/core/client.d.ts.map +1 -1
- package/core/client.js +167 -29
- package/core/error-classifications.d.ts +153 -0
- package/core/error-classifications.d.ts.map +1 -0
- package/core/error-classifications.js +140 -0
- package/core/error-code-registry.d.ts +158 -0
- package/core/error-code-registry.d.ts.map +1 -0
- package/core/error-code-registry.js +143 -0
- package/core/error-envelope.d.ts +68 -0
- package/core/error-envelope.d.ts.map +1 -0
- package/core/error-envelope.js +357 -0
- package/core/errors.d.ts +73 -25
- package/core/errors.d.ts.map +1 -1
- package/core/errors.js +113 -46
- package/core/geoparquet-sql.d.ts +190 -0
- package/core/geoparquet-sql.d.ts.map +1 -0
- package/core/geoparquet-sql.js +368 -0
- package/core/odata-key-path.d.ts +12 -0
- package/core/odata-key-path.d.ts.map +1 -0
- package/core/odata-key-path.js +28 -0
- package/core/odata-write-codec.d.ts +66 -0
- package/core/odata-write-codec.d.ts.map +1 -0
- package/core/odata-write-codec.js +1083 -0
- package/core/odata.d.ts +59 -7
- package/core/odata.d.ts.map +1 -1
- package/core/odata.js +431 -99
- package/core/ogc-endpoint-layout.d.ts +70 -0
- package/core/ogc-endpoint-layout.d.ts.map +1 -0
- package/core/ogc-endpoint-layout.js +173 -0
- package/core/ogc-features.d.ts.map +1 -1
- package/core/ogc-features.js +35 -17
- package/core/ogc-maps.d.ts +7 -0
- package/core/ogc-maps.d.ts.map +1 -1
- package/core/ogc-maps.js +46 -7
- package/core/ogc-processes.d.ts +2 -1
- package/core/ogc-processes.d.ts.map +1 -1
- package/core/ogc-processes.js +33 -5
- package/core/ogc-records.d.ts +9 -0
- package/core/ogc-records.d.ts.map +1 -1
- package/core/ogc-records.js +78 -29
- package/core/ogc-tiles.d.ts +10 -1
- package/core/ogc-tiles.d.ts.map +1 -1
- package/core/ogc-tiles.js +56 -17
- package/core/path-utils.d.ts +9 -0
- package/core/path-utils.d.ts.map +1 -1
- package/core/path-utils.js +19 -0
- package/core/protocol-transport.d.ts +1 -0
- package/core/protocol-transport.d.ts.map +1 -1
- package/core/request-pipeline.d.ts.map +1 -1
- package/core/request-pipeline.js +1 -1
- package/core/spatial-filter.d.ts +8 -4
- package/core/spatial-filter.d.ts.map +1 -1
- package/core/spatial-filter.js +206 -16
- package/core/stac-static.d.ts +55 -0
- package/core/stac-static.d.ts.map +1 -0
- package/core/stac-static.js +386 -0
- package/core/stac.d.ts +12 -0
- package/core/stac.d.ts.map +1 -1
- package/core/stac.js +45 -15
- package/core/surfaces.d.ts +13 -0
- package/core/surfaces.d.ts.map +1 -1
- package/core/surfaces.js +127 -16
- package/core/types.d.ts +174 -7
- package/core/types.d.ts.map +1 -1
- package/core/wfs-capabilities.d.ts +12 -0
- package/core/wfs-capabilities.d.ts.map +1 -1
- package/core/wfs-capabilities.js +22 -3
- package/core/wfs.d.ts +13 -0
- package/core/wfs.d.ts.map +1 -1
- package/core/wfs.js +35 -5
- package/core/wms-capabilities.d.ts +56 -84
- package/core/wms-capabilities.d.ts.map +1 -1
- package/core/wms-capabilities.js +212 -509
- package/core/wmts-capabilities.d.ts +62 -62
- package/core/wmts-capabilities.d.ts.map +1 -1
- package/core/wmts-capabilities.js +224 -371
- package/esri-compat/editor.d.ts +8 -0
- package/esri-compat/editor.d.ts.map +1 -1
- package/esri-compat/editor.js +13 -0
- package/esri-compat/feature-layer.d.ts +2 -0
- package/esri-compat/feature-layer.d.ts.map +1 -1
- package/esri-compat/feature-layer.js +1 -0
- package/esri-compat/identity-manager.d.ts +43 -0
- package/esri-compat/identity-manager.d.ts.map +1 -1
- package/esri-compat/identity-manager.js +131 -1
- package/esri-compat/layer-list.d.ts +11 -0
- package/esri-compat/layer-list.d.ts.map +1 -1
- package/esri-compat/layer-list.js +49 -0
- package/esri-compat/legend.d.ts +10 -0
- package/esri-compat/legend.d.ts.map +1 -1
- package/esri-compat/legend.js +27 -0
- package/esri-compat/oauth-info.d.ts +15 -0
- package/esri-compat/oauth-info.d.ts.map +1 -1
- package/esri-compat/oauth-info.js +27 -0
- package/esri-compat/portal.d.ts +197 -0
- package/esri-compat/portal.d.ts.map +1 -0
- package/esri-compat/portal.js +251 -0
- package/esri-compat/renderer-objects.d.ts +40 -0
- package/esri-compat/renderer-objects.d.ts.map +1 -0
- package/esri-compat/renderer-objects.js +62 -0
- package/esri-compat/sketch.d.ts +43 -0
- package/esri-compat/sketch.d.ts.map +1 -1
- package/esri-compat/sketch.js +46 -0
- package/esri-compat/snapping.d.ts +43 -0
- package/esri-compat/snapping.d.ts.map +1 -0
- package/esri-compat/snapping.js +45 -0
- package/esri-compat/url.d.ts.map +1 -1
- package/esri-compat/url.js +1 -1
- package/esri-compat/widget-host.d.ts +84 -0
- package/esri-compat/widget-host.d.ts.map +1 -0
- package/esri-compat/widget-host.js +159 -0
- package/filter-registry/index.d.ts +145 -0
- package/filter-registry/index.d.ts.map +1 -0
- package/filter-registry/index.js +531 -0
- package/generated-app/errors.d.ts +18 -2
- package/generated-app/errors.d.ts.map +1 -1
- package/generated-app/errors.js +44 -11
- package/map/automatic-mount-integration.d.ts +134 -0
- package/map/automatic-mount-integration.d.ts.map +1 -0
- package/map/automatic-mount-integration.js +305 -0
- package/map/automatic-source-strategy.d.ts +125 -0
- package/map/automatic-source-strategy.d.ts.map +1 -0
- package/map/automatic-source-strategy.js +494 -0
- package/map/data-to-map-bridge.d.ts +293 -0
- package/map/data-to-map-bridge.d.ts.map +1 -0
- package/map/data-to-map-bridge.js +817 -0
- package/map/geojson-projection.d.ts +33 -0
- package/map/geojson-projection.d.ts.map +1 -0
- package/map/geojson-projection.js +118 -0
- package/map/index.d.ts +14 -0
- package/map/index.d.ts.map +1 -1
- package/map/index.js +8 -0
- package/map/raster-source-spec.d.ts +30 -0
- package/map/raster-source-spec.d.ts.map +1 -0
- package/map/raster-source-spec.js +190 -0
- package/map/raster-source-strategy.d.ts +65 -0
- package/map/raster-source-strategy.d.ts.map +1 -0
- package/map/raster-source-strategy.js +232 -0
- package/map/source-to-maplibre.d.ts +91 -0
- package/map/source-to-maplibre.d.ts.map +1 -0
- package/map/source-to-maplibre.js +454 -0
- package/map/temporal-playback.d.ts +139 -0
- package/map/temporal-playback.d.ts.map +1 -0
- package/map/temporal-playback.js +247 -0
- package/package.json +19 -1
- package/query-planner/canonical.d.ts +7 -0
- package/query-planner/canonical.d.ts.map +1 -0
- package/query-planner/canonical.js +145 -0
- package/query-planner/cql2-json.d.ts +17 -0
- package/query-planner/cql2-json.d.ts.map +1 -0
- package/query-planner/cql2-json.js +646 -0
- package/query-planner/diagnostics.d.ts +35 -0
- package/query-planner/diagnostics.d.ts.map +1 -0
- package/query-planner/diagnostics.js +373 -0
- package/query-planner/duckdb.d.ts +79 -0
- package/query-planner/duckdb.d.ts.map +1 -0
- package/query-planner/duckdb.js +758 -0
- package/query-planner/execution-context.d.ts +5 -0
- package/query-planner/execution-context.d.ts.map +1 -0
- package/query-planner/execution-context.js +50 -0
- package/query-planner/executor.d.ts +5 -0
- package/query-planner/executor.d.ts.map +1 -0
- package/query-planner/executor.js +223 -0
- package/query-planner/geoservices.d.ts +91 -0
- package/query-planner/geoservices.d.ts.map +1 -0
- package/query-planner/geoservices.js +667 -0
- package/query-planner/grpc.d.ts +100 -0
- package/query-planner/grpc.d.ts.map +1 -0
- package/query-planner/grpc.js +736 -0
- package/query-planner/index.d.ts +44 -0
- package/query-planner/index.d.ts.map +1 -0
- package/query-planner/index.js +30 -0
- package/query-planner/ir.d.ts +20 -0
- package/query-planner/ir.d.ts.map +1 -0
- package/query-planner/ir.js +417 -0
- package/query-planner/local-aggregate.d.ts +5 -0
- package/query-planner/local-aggregate.d.ts.map +1 -0
- package/query-planner/local-aggregate.js +126 -0
- package/query-planner/odata.d.ts +48 -0
- package/query-planner/odata.d.ts.map +1 -0
- package/query-planner/odata.js +662 -0
- package/query-planner/ogc-compiler.d.ts +55 -0
- package/query-planner/ogc-compiler.d.ts.map +1 -0
- package/query-planner/ogc-compiler.js +480 -0
- package/query-planner/ogc-features.d.ts +53 -0
- package/query-planner/ogc-features.d.ts.map +1 -0
- package/query-planner/ogc-features.js +617 -0
- package/query-planner/planner.d.ts +17 -0
- package/query-planner/planner.d.ts.map +1 -0
- package/query-planner/planner.js +818 -0
- package/query-planner/resource.d.ts +94 -0
- package/query-planner/resource.d.ts.map +1 -0
- package/query-planner/resource.js +526 -0
- package/query-planner/semantic-canonical.d.ts +15 -0
- package/query-planner/semantic-canonical.d.ts.map +1 -0
- package/query-planner/semantic-canonical.js +62 -0
- package/query-planner/semantic-compat.d.ts +10 -0
- package/query-planner/semantic-compat.d.ts.map +1 -0
- package/query-planner/semantic-compat.js +35 -0
- package/query-planner/semantic-compiler.d.ts +64 -0
- package/query-planner/semantic-compiler.d.ts.map +1 -0
- package/query-planner/semantic-compiler.js +81 -0
- package/query-planner/semantic-literals.d.ts +30 -0
- package/query-planner/semantic-literals.d.ts.map +1 -0
- package/query-planner/semantic-literals.js +133 -0
- package/query-planner/semantic-types.d.ts +265 -0
- package/query-planner/semantic-types.d.ts.map +1 -0
- package/query-planner/semantic-types.js +1 -0
- package/query-planner/semantic.d.ts +54 -0
- package/query-planner/semantic.d.ts.map +1 -0
- package/query-planner/semantic.js +1421 -0
- package/query-planner/types.d.ts +560 -0
- package/query-planner/types.d.ts.map +1 -0
- package/query-planner/types.js +49 -0
- package/query-planner/wfs-semantic.d.ts +58 -0
- package/query-planner/wfs-semantic.d.ts.map +1 -0
- package/query-planner/wfs-semantic.js +547 -0
- package/query-planner/wfs.d.ts +6 -0
- package/query-planner/wfs.d.ts.map +1 -0
- package/query-planner/wfs.js +71 -0
- package/react/external-map.d.ts +67 -0
- package/react/external-map.d.ts.map +1 -0
- package/react/external-map.js +63 -0
- package/react/honua-map.d.ts.map +1 -1
- package/react/honua-map.js +3 -2
- package/react/honua-source-layer.d.ts +110 -0
- package/react/honua-source-layer.d.ts.map +1 -0
- package/react/honua-source-layer.js +101 -0
- package/react/hooks.d.ts +28 -0
- package/react/hooks.d.ts.map +1 -1
- package/react/hooks.js +26 -4
- package/react/index.d.ts +8 -0
- package/react/index.d.ts.map +1 -1
- package/react/index.js +5 -0
- package/react/query-cache.d.ts +26 -4
- package/react/query-cache.d.ts.map +1 -1
- package/react/query-cache.js +51 -8
- package/react/selection.d.ts +177 -0
- package/react/selection.d.ts.map +1 -0
- package/react/selection.js +0 -0
- package/react/use-mounted-source.d.ts +69 -0
- package/react/use-mounted-source.d.ts.map +1 -0
- package/react/use-mounted-source.js +346 -0
- package/runtime/edit-snapping.d.ts +107 -0
- package/runtime/edit-snapping.d.ts.map +1 -0
- package/runtime/edit-snapping.js +190 -0
- package/runtime/errors.d.ts +3 -2
- package/runtime/errors.d.ts.map +1 -1
- package/runtime/errors.js +19 -2
- package/runtime/index.d.ts +8 -2
- package/runtime/index.d.ts.map +1 -1
- package/runtime/index.js +4 -4
- package/runtime/load-package.d.ts.map +1 -1
- package/runtime/load-package.js +8 -0
- package/runtime/map-package-validation.d.ts +0 -13
- package/runtime/map-package-validation.d.ts.map +1 -1
- package/runtime/map-package-validation.js +0 -12
- package/runtime/map-package.d.ts +1 -1
- package/runtime/map-package.d.ts.map +1 -1
- package/runtime/maplibre-renderer.d.ts +41 -0
- package/runtime/maplibre-renderer.d.ts.map +1 -0
- package/runtime/maplibre-renderer.js +322 -0
- package/runtime/pmtiles-protocol.d.ts +77 -0
- package/runtime/pmtiles-protocol.d.ts.map +1 -0
- package/runtime/pmtiles-protocol.js +120 -0
- package/runtime/query-tiles.d.ts +2 -1
- package/runtime/query-tiles.d.ts.map +1 -1
- package/runtime/query-tiles.js +6 -2
- package/runtime/source-bridge.d.ts +4 -4
- package/runtime/source-bridge.d.ts.map +1 -1
- package/runtime/source-bridge.js +36 -56
- package/runtime/style-interactions.d.ts +3 -2
- package/runtime/style-interactions.d.ts.map +1 -1
- package/runtime/style-interactions.js +11 -3
- package/runtime/terra-draw-sketch.d.ts +275 -0
- package/runtime/terra-draw-sketch.d.ts.map +1 -0
- package/runtime/terra-draw-sketch.js +404 -0
- package/source-capability-registry.d.ts +1 -0
- package/source-capability-registry.js +1 -0
- package/source-capability-types.d.ts +186 -0
- package/source-capability-types.js +7 -0
- package/style/index.d.ts +2 -0
- package/style/index.d.ts.map +1 -1
- package/style/index.js +2 -0
- package/style/renderers.d.ts +326 -0
- package/style/renderers.d.ts.map +1 -0
- package/style/renderers.js +517 -0
- package/webmap/convert-renderer.d.ts +24 -3
- package/webmap/convert-renderer.d.ts.map +1 -1
- package/webmap/convert-renderer.js +93 -112
- package/webmap/index.d.ts +1 -1
- package/webmap/index.d.ts.map +1 -1
- package/webmap/index.js +1 -1
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Incremental integration surface for an automatic Source → MapLibre mount.
|
|
3
|
+
*
|
|
4
|
+
* REQ-004 of #390: wire the filter registry, interactions/hit-test, edits, and
|
|
5
|
+
* realtime feature state into the automatic mount **without a full reload**
|
|
6
|
+
* where MapLibre supports incremental change (`setFilter`, `setFeatureState`,
|
|
7
|
+
* source `setData` through {@link MountedAutomaticMapLibreSource.refresh}).
|
|
8
|
+
*
|
|
9
|
+
* This module is peer-injected and safe to import in Node/SSR/worker code: it
|
|
10
|
+
* never imports `maplibre-gl`. Every renderer touch point is duck-typed so any
|
|
11
|
+
* object exposing the small surface below — including a real MapLibre `Map` —
|
|
12
|
+
* satisfies it.
|
|
13
|
+
*/
|
|
14
|
+
import type { FeatureId } from "../contract/types.js";
|
|
15
|
+
import { HonuaSdkError } from "../core/error-envelope.js";
|
|
16
|
+
import { type FilterRegistry, type FilterRegistryProjectionOptions, type FilterRegistryUnsubscribe, type RuntimeStyleFilterExpression } from "../filter-registry/index.js";
|
|
17
|
+
import type { HonuaHitTestMap, HonuaHitTestResult, HonuaNormalizeHitTestOptions, HonuaPointerInput } from "../interactions/hit-test.js";
|
|
18
|
+
import type { ExecuteQueryPlanOptions } from "../query-planner/types.js";
|
|
19
|
+
import type { AutomaticMapLibrePlan, MountedAutomaticMapLibreSource } from "./automatic-source-strategy.js";
|
|
20
|
+
/** A stable, machine-readable integration failure. */
|
|
21
|
+
export type AutomaticMapLibreIntegrationErrorCode = "disposed" | "invalid-target";
|
|
22
|
+
export declare class HonuaAutomaticMapLibreIntegrationError extends HonuaSdkError {
|
|
23
|
+
readonly code: AutomaticMapLibreIntegrationErrorCode;
|
|
24
|
+
readonly detail?: Readonly<Record<string, unknown>> | undefined;
|
|
25
|
+
constructor(code: AutomaticMapLibreIntegrationErrorCode, message: string, detail?: Readonly<Record<string, unknown>> | undefined);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Minimal MapLibre-shaped surface the integration mutates incrementally. A real
|
|
29
|
+
* `maplibregl.Map` satisfies this; feature-state, filters, and hit-test are all
|
|
30
|
+
* optional so a raster-only mount still attaches cleanly (it simply has no
|
|
31
|
+
* interactive layers to bind).
|
|
32
|
+
*/
|
|
33
|
+
export interface AutomaticMapLibreIntegrationMap extends HonuaHitTestMap {
|
|
34
|
+
/** Replace a layer filter in place (incremental; no style reload). */
|
|
35
|
+
setFilter?(layerId: string, filter?: unknown): void;
|
|
36
|
+
/** Read the current layer filter so baked-in geometry filters are preserved. */
|
|
37
|
+
getFilter?(layerId: string): unknown;
|
|
38
|
+
setFeatureState?(target: {
|
|
39
|
+
source: string;
|
|
40
|
+
id: FeatureId;
|
|
41
|
+
sourceLayer?: string;
|
|
42
|
+
}, state: Record<string, unknown>): void;
|
|
43
|
+
getFeatureState?(target: {
|
|
44
|
+
source: string;
|
|
45
|
+
id: FeatureId;
|
|
46
|
+
sourceLayer?: string;
|
|
47
|
+
}): Record<string, unknown>;
|
|
48
|
+
removeFeatureState?(target: {
|
|
49
|
+
source: string;
|
|
50
|
+
id: FeatureId;
|
|
51
|
+
sourceLayer?: string;
|
|
52
|
+
}, key?: string): void;
|
|
53
|
+
on?(event: string, layer: string, handler: (...args: unknown[]) => void): void;
|
|
54
|
+
off?(event: string, layer: string, handler: (...args: unknown[]) => void): void;
|
|
55
|
+
}
|
|
56
|
+
export type AutomaticMapLibreIntegrationDiagnosticCode = "filter-applied" | "filter-registry-bound" | "selection-changed" | "hover-changed" | "realtime-feature-state" | "edit-refreshed" | "capability-unavailable";
|
|
57
|
+
export interface AutomaticMapLibreIntegrationDiagnostic {
|
|
58
|
+
readonly code: AutomaticMapLibreIntegrationDiagnosticCode;
|
|
59
|
+
readonly severity: "info" | "warning";
|
|
60
|
+
readonly message: string;
|
|
61
|
+
readonly detail?: Readonly<Record<string, unknown>>;
|
|
62
|
+
}
|
|
63
|
+
/** A single realtime feature-state delta targeting a mounted feature. */
|
|
64
|
+
export interface RealtimeFeatureStateDelta {
|
|
65
|
+
readonly id: FeatureId;
|
|
66
|
+
readonly state: Record<string, unknown>;
|
|
67
|
+
readonly sourceLayer?: string;
|
|
68
|
+
}
|
|
69
|
+
export interface AutomaticMapLibreIntegrationOptions {
|
|
70
|
+
/** Feature-state key toggled on click. @default "selected" */
|
|
71
|
+
readonly selectionStateKey?: string;
|
|
72
|
+
/** Feature-state key toggled on hover. @default "hover" */
|
|
73
|
+
readonly hoverStateKey?: string;
|
|
74
|
+
/** Enable single-click selection wiring. @default true */
|
|
75
|
+
readonly selection?: boolean;
|
|
76
|
+
/** Enable pointer hover wiring. @default true */
|
|
77
|
+
readonly hover?: boolean;
|
|
78
|
+
/** Allow multiple simultaneously selected features. @default false */
|
|
79
|
+
readonly multiSelect?: boolean;
|
|
80
|
+
/** Vector-tile source layer for feature-state targets. */
|
|
81
|
+
readonly sourceLayer?: string;
|
|
82
|
+
/** Observe selection changes. */
|
|
83
|
+
readonly onSelectionChange?: (selectedIds: ReadonlySet<FeatureId>) => void;
|
|
84
|
+
}
|
|
85
|
+
export interface BindFilterRegistryOptions extends FilterRegistryProjectionOptions {
|
|
86
|
+
/** Apply the current registry snapshot immediately. @default true */
|
|
87
|
+
readonly fireImmediately?: boolean;
|
|
88
|
+
}
|
|
89
|
+
/** Cohesive incremental-integration controller for one automatic mount. */
|
|
90
|
+
export interface AutomaticMapLibreIntegration {
|
|
91
|
+
readonly sourceId: string;
|
|
92
|
+
readonly layerIds: readonly string[];
|
|
93
|
+
readonly selectedIds: ReadonlySet<FeatureId>;
|
|
94
|
+
readonly hoveredId: FeatureId | undefined;
|
|
95
|
+
readonly appliedFilter: RuntimeStyleFilterExpression | undefined;
|
|
96
|
+
readonly diagnostics: readonly AutomaticMapLibreIntegrationDiagnostic[];
|
|
97
|
+
/** Apply a compiled runtime style filter across all mounted layers in place. */
|
|
98
|
+
setRuntimeFilter(filter: RuntimeStyleFilterExpression | undefined): void;
|
|
99
|
+
/** Subscribe to a filter registry and project active clauses to the layers. */
|
|
100
|
+
bindFilterRegistry(registry: FilterRegistry, options?: BindFilterRegistryOptions): FilterRegistryUnsubscribe;
|
|
101
|
+
/** Apply realtime feature-state deltas incrementally (no reload). */
|
|
102
|
+
applyRealtimeFeatureState(deltas: readonly RealtimeFeatureStateDelta[]): void;
|
|
103
|
+
/** Remove a realtime feature-state key (or all state) from a feature. */
|
|
104
|
+
clearRealtimeFeatureState(id: FeatureId, key?: string): void;
|
|
105
|
+
/** Programmatically select a feature. */
|
|
106
|
+
select(id: FeatureId): void;
|
|
107
|
+
/** Programmatically deselect a feature. */
|
|
108
|
+
deselect(id: FeatureId): void;
|
|
109
|
+
/** Clear all selected features. */
|
|
110
|
+
clearSelection(): void;
|
|
111
|
+
/** Renderer-neutral hit-test scoped to the mounted layers. */
|
|
112
|
+
hitTest(input: HonuaPointerInput, options?: HonuaNormalizeHitTestOptions): Promise<HonuaHitTestResult>;
|
|
113
|
+
/** Refresh mounted data in place (materialized edits flow through setData). */
|
|
114
|
+
refresh(options?: ExecuteQueryPlanOptions): Promise<AutomaticMapLibrePlan>;
|
|
115
|
+
/** Remove every listener/subscription and clear feature state. Leak-free. */
|
|
116
|
+
dispose(): void;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Attach an incremental-integration controller to a mounted automatic source.
|
|
120
|
+
*
|
|
121
|
+
* @example
|
|
122
|
+
* ```ts
|
|
123
|
+
* const plan = explainAutomaticSourceToMapLibre(source, { queryPlan });
|
|
124
|
+
* const mounted = await mountAutomaticSourceToMapLibre(map, source, plan, { queryPlan });
|
|
125
|
+
* const integration = attachAutomaticMapLibreInteractions(map, mounted, {
|
|
126
|
+
* onSelectionChange: (ids) => sidebar.render([...ids]),
|
|
127
|
+
* });
|
|
128
|
+
* integration.bindFilterRegistry(registry, { sourceId: source.descriptor.id });
|
|
129
|
+
* // realtime delta, no reload:
|
|
130
|
+
* integration.applyRealtimeFeatureState([{ id: 42, state: { status: "active" } }]);
|
|
131
|
+
* ```
|
|
132
|
+
*/
|
|
133
|
+
export declare function attachAutomaticMapLibreInteractions(map: AutomaticMapLibreIntegrationMap, mounted: MountedAutomaticMapLibreSource, options?: AutomaticMapLibreIntegrationOptions): AutomaticMapLibreIntegration;
|
|
134
|
+
//# sourceMappingURL=automatic-mount-integration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"automatic-mount-integration.d.ts","sourceRoot":"","sources":["../../../src/map/automatic-mount-integration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Incremental integration surface for an automatic Source → MapLibre mount.
|
|
3
|
+
*
|
|
4
|
+
* REQ-004 of #390: wire the filter registry, interactions/hit-test, edits, and
|
|
5
|
+
* realtime feature state into the automatic mount **without a full reload**
|
|
6
|
+
* where MapLibre supports incremental change (`setFilter`, `setFeatureState`,
|
|
7
|
+
* source `setData` through {@link MountedAutomaticMapLibreSource.refresh}).
|
|
8
|
+
*
|
|
9
|
+
* This module is peer-injected and safe to import in Node/SSR/worker code: it
|
|
10
|
+
* never imports `maplibre-gl`. Every renderer touch point is duck-typed so any
|
|
11
|
+
* object exposing the small surface below — including a real MapLibre `Map` —
|
|
12
|
+
* satisfies it.
|
|
13
|
+
*/
|
|
14
|
+
import { HonuaSdkError } from "../core/error-envelope.js";
|
|
15
|
+
import { compileRuntimeStyleFilter, selectActiveFilterClauses, } from "../filter-registry/index.js";
|
|
16
|
+
import { hitTestMap } from "../interactions/hit-test.js";
|
|
17
|
+
export class HonuaAutomaticMapLibreIntegrationError extends HonuaSdkError {
|
|
18
|
+
code;
|
|
19
|
+
detail;
|
|
20
|
+
constructor(code, message, detail) {
|
|
21
|
+
super(AUTOMATIC_MAPLIBRE_INTEGRATION_ERROR_CODES[code], message, { context: detail });
|
|
22
|
+
this.code = code;
|
|
23
|
+
this.detail = detail;
|
|
24
|
+
this.name = "HonuaAutomaticMapLibreIntegrationError";
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const AUTOMATIC_MAPLIBRE_INTEGRATION_ERROR_CODES = {
|
|
28
|
+
disposed: "map.automatic-integration.disposed",
|
|
29
|
+
"invalid-target": "map.automatic-integration.invalid-target",
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Attach an incremental-integration controller to a mounted automatic source.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```ts
|
|
36
|
+
* const plan = explainAutomaticSourceToMapLibre(source, { queryPlan });
|
|
37
|
+
* const mounted = await mountAutomaticSourceToMapLibre(map, source, plan, { queryPlan });
|
|
38
|
+
* const integration = attachAutomaticMapLibreInteractions(map, mounted, {
|
|
39
|
+
* onSelectionChange: (ids) => sidebar.render([...ids]),
|
|
40
|
+
* });
|
|
41
|
+
* integration.bindFilterRegistry(registry, { sourceId: source.descriptor.id });
|
|
42
|
+
* // realtime delta, no reload:
|
|
43
|
+
* integration.applyRealtimeFeatureState([{ id: 42, state: { status: "active" } }]);
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export function attachAutomaticMapLibreInteractions(map, mounted, options = {}) {
|
|
47
|
+
const { selectionStateKey = "selected", hoverStateKey = "hover", selection = true, hover = true, multiSelect = false, sourceLayer, onSelectionChange, } = options;
|
|
48
|
+
const sourceId = mounted.sourceId;
|
|
49
|
+
const layerIds = [...mounted.layerIds];
|
|
50
|
+
const diagnostics = [];
|
|
51
|
+
const selected = new Set();
|
|
52
|
+
let hoveredId;
|
|
53
|
+
let appliedFilter;
|
|
54
|
+
let disposed = false;
|
|
55
|
+
let registryUnsubscribe;
|
|
56
|
+
// Capture each layer's baked-in filter (e.g. the geojson geometry-type
|
|
57
|
+
// matrix) so runtime filters compose instead of clobbering them.
|
|
58
|
+
const baseFilters = new Map();
|
|
59
|
+
if (typeof map.getFilter === "function") {
|
|
60
|
+
for (const layerId of layerIds) {
|
|
61
|
+
try {
|
|
62
|
+
baseFilters.set(layerId, map.getFilter(layerId));
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
/* layer without a readable filter */
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
const featureStateCapable = typeof map.setFeatureState === "function" && typeof map.removeFeatureState === "function";
|
|
70
|
+
const filterCapable = typeof map.setFilter === "function";
|
|
71
|
+
const eventCapable = typeof map.on === "function" && typeof map.off === "function";
|
|
72
|
+
const assertLive = () => {
|
|
73
|
+
if (disposed)
|
|
74
|
+
throw new HonuaAutomaticMapLibreIntegrationError("disposed", "The automatic MapLibre integration was disposed.");
|
|
75
|
+
};
|
|
76
|
+
const setFeatureStateSafe = (id, state, layer) => {
|
|
77
|
+
map.setFeatureState?.(featureTarget(sourceId, id, layer ?? sourceLayer), state);
|
|
78
|
+
};
|
|
79
|
+
const removeFeatureStateSafe = (id, key) => {
|
|
80
|
+
map.removeFeatureState?.(featureTarget(sourceId, id, sourceLayer), key);
|
|
81
|
+
};
|
|
82
|
+
const applyFilterToLayers = (filter) => {
|
|
83
|
+
appliedFilter = filter;
|
|
84
|
+
if (!filterCapable) {
|
|
85
|
+
diagnostics.push({
|
|
86
|
+
code: "capability-unavailable",
|
|
87
|
+
severity: "warning",
|
|
88
|
+
message: "The renderer does not expose setFilter; runtime filter was recorded but not applied.",
|
|
89
|
+
});
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
for (const layerId of layerIds) {
|
|
93
|
+
const base = baseFilters.get(layerId);
|
|
94
|
+
const composed = composeFilter(base, filter);
|
|
95
|
+
map.setFilter?.(layerId, composed);
|
|
96
|
+
}
|
|
97
|
+
diagnostics.push({
|
|
98
|
+
code: "filter-applied",
|
|
99
|
+
severity: "info",
|
|
100
|
+
message: filter ? "Applied a runtime style filter across mounted layers." : "Cleared the runtime style filter.",
|
|
101
|
+
detail: { layerCount: layerIds.length },
|
|
102
|
+
});
|
|
103
|
+
};
|
|
104
|
+
const notifySelection = () => onSelectionChange?.(selected);
|
|
105
|
+
const selectInternal = (id) => {
|
|
106
|
+
if (!featureStateCapable)
|
|
107
|
+
return;
|
|
108
|
+
if (!multiSelect)
|
|
109
|
+
clearSelectionInternal();
|
|
110
|
+
map.setFeatureState?.(featureTarget(sourceId, id, sourceLayer), { [selectionStateKey]: true });
|
|
111
|
+
selected.add(id);
|
|
112
|
+
};
|
|
113
|
+
const deselectInternal = (id) => {
|
|
114
|
+
if (!selected.has(id))
|
|
115
|
+
return;
|
|
116
|
+
map.setFeatureState?.(featureTarget(sourceId, id, sourceLayer), { [selectionStateKey]: false });
|
|
117
|
+
selected.delete(id);
|
|
118
|
+
};
|
|
119
|
+
const clearSelectionInternal = () => {
|
|
120
|
+
for (const id of selected)
|
|
121
|
+
map.setFeatureState?.(featureTarget(sourceId, id, sourceLayer), { [selectionStateKey]: false });
|
|
122
|
+
selected.clear();
|
|
123
|
+
};
|
|
124
|
+
const onLayerClick = (...args) => {
|
|
125
|
+
const id = firstFeatureId(args[0]);
|
|
126
|
+
if (id === undefined)
|
|
127
|
+
return;
|
|
128
|
+
if (selected.has(id))
|
|
129
|
+
deselectInternal(id);
|
|
130
|
+
else
|
|
131
|
+
selectInternal(id);
|
|
132
|
+
diagnostics.push({ code: "selection-changed", severity: "info", message: "Selection toggled from a click." });
|
|
133
|
+
notifySelection();
|
|
134
|
+
};
|
|
135
|
+
const onLayerMove = (...args) => {
|
|
136
|
+
const id = firstFeatureId(args[0]);
|
|
137
|
+
if (id === undefined)
|
|
138
|
+
return;
|
|
139
|
+
if (hoveredId !== undefined && hoveredId !== id)
|
|
140
|
+
map.setFeatureState?.(featureTarget(sourceId, hoveredId, sourceLayer), { [hoverStateKey]: false });
|
|
141
|
+
hoveredId = id;
|
|
142
|
+
map.setFeatureState?.(featureTarget(sourceId, id, sourceLayer), { [hoverStateKey]: true });
|
|
143
|
+
};
|
|
144
|
+
const onLayerLeave = () => {
|
|
145
|
+
if (hoveredId === undefined)
|
|
146
|
+
return;
|
|
147
|
+
map.setFeatureState?.(featureTarget(sourceId, hoveredId, sourceLayer), { [hoverStateKey]: false });
|
|
148
|
+
hoveredId = undefined;
|
|
149
|
+
};
|
|
150
|
+
// Wire pointer interactions per layer (the geojson auto mount installs one
|
|
151
|
+
// layer per geometry kind, so a single source can carry several layers).
|
|
152
|
+
const wiredClick = selection && featureStateCapable && eventCapable;
|
|
153
|
+
const wiredHover = hover && featureStateCapable && eventCapable;
|
|
154
|
+
if (wiredClick)
|
|
155
|
+
for (const layerId of layerIds)
|
|
156
|
+
map.on?.("click", layerId, onLayerClick);
|
|
157
|
+
if (wiredHover)
|
|
158
|
+
for (const layerId of layerIds) {
|
|
159
|
+
map.on?.("mousemove", layerId, onLayerMove);
|
|
160
|
+
map.on?.("mouseleave", layerId, onLayerLeave);
|
|
161
|
+
}
|
|
162
|
+
if ((selection || hover) && !featureStateCapable) {
|
|
163
|
+
diagnostics.push({
|
|
164
|
+
code: "capability-unavailable",
|
|
165
|
+
severity: "warning",
|
|
166
|
+
message: "The renderer does not expose feature-state; selection and hover wiring were skipped.",
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
return {
|
|
170
|
+
sourceId,
|
|
171
|
+
layerIds,
|
|
172
|
+
get selectedIds() {
|
|
173
|
+
return selected;
|
|
174
|
+
},
|
|
175
|
+
get hoveredId() {
|
|
176
|
+
return hoveredId;
|
|
177
|
+
},
|
|
178
|
+
get appliedFilter() {
|
|
179
|
+
return appliedFilter;
|
|
180
|
+
},
|
|
181
|
+
get diagnostics() {
|
|
182
|
+
return diagnostics;
|
|
183
|
+
},
|
|
184
|
+
setRuntimeFilter(filter) {
|
|
185
|
+
assertLive();
|
|
186
|
+
applyFilterToLayers(filter);
|
|
187
|
+
},
|
|
188
|
+
bindFilterRegistry(registry, bindOptions = {}) {
|
|
189
|
+
assertLive();
|
|
190
|
+
const project = (clauses) => applyFilterToLayers(compileRuntimeStyleFilter(clauses));
|
|
191
|
+
registryUnsubscribe?.();
|
|
192
|
+
const unsubscribe = registry.subscribe((event) => {
|
|
193
|
+
project(selectActiveFilterClauses(event.snapshot, bindOptions));
|
|
194
|
+
});
|
|
195
|
+
registryUnsubscribe = unsubscribe;
|
|
196
|
+
if (bindOptions.fireImmediately !== false)
|
|
197
|
+
project(selectActiveFilterClauses(registry.snapshot, bindOptions));
|
|
198
|
+
diagnostics.push({
|
|
199
|
+
code: "filter-registry-bound",
|
|
200
|
+
severity: "info",
|
|
201
|
+
message: "Bound the filter registry to the mounted layers.",
|
|
202
|
+
});
|
|
203
|
+
return () => {
|
|
204
|
+
unsubscribe();
|
|
205
|
+
if (registryUnsubscribe === unsubscribe)
|
|
206
|
+
registryUnsubscribe = undefined;
|
|
207
|
+
};
|
|
208
|
+
},
|
|
209
|
+
applyRealtimeFeatureState(deltas) {
|
|
210
|
+
assertLive();
|
|
211
|
+
if (!featureStateCapable) {
|
|
212
|
+
diagnostics.push({
|
|
213
|
+
code: "capability-unavailable",
|
|
214
|
+
severity: "warning",
|
|
215
|
+
message: "The renderer does not expose setFeatureState; realtime deltas were dropped.",
|
|
216
|
+
});
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
for (const delta of deltas) {
|
|
220
|
+
if (delta.id === undefined || delta.id === null)
|
|
221
|
+
throw new HonuaAutomaticMapLibreIntegrationError("invalid-target", "Realtime deltas require a feature id.");
|
|
222
|
+
setFeatureStateSafe(delta.id, delta.state, delta.sourceLayer);
|
|
223
|
+
}
|
|
224
|
+
diagnostics.push({
|
|
225
|
+
code: "realtime-feature-state",
|
|
226
|
+
severity: "info",
|
|
227
|
+
message: "Applied realtime feature-state deltas in place.",
|
|
228
|
+
detail: { count: deltas.length },
|
|
229
|
+
});
|
|
230
|
+
},
|
|
231
|
+
clearRealtimeFeatureState(id, key) {
|
|
232
|
+
assertLive();
|
|
233
|
+
removeFeatureStateSafe(id, key);
|
|
234
|
+
},
|
|
235
|
+
select(id) {
|
|
236
|
+
assertLive();
|
|
237
|
+
selectInternal(id);
|
|
238
|
+
diagnostics.push({ code: "selection-changed", severity: "info", message: "Feature selected programmatically." });
|
|
239
|
+
notifySelection();
|
|
240
|
+
},
|
|
241
|
+
deselect(id) {
|
|
242
|
+
assertLive();
|
|
243
|
+
deselectInternal(id);
|
|
244
|
+
diagnostics.push({
|
|
245
|
+
code: "selection-changed",
|
|
246
|
+
severity: "info",
|
|
247
|
+
message: "Feature deselected programmatically.",
|
|
248
|
+
});
|
|
249
|
+
notifySelection();
|
|
250
|
+
},
|
|
251
|
+
clearSelection() {
|
|
252
|
+
assertLive();
|
|
253
|
+
clearSelectionInternal();
|
|
254
|
+
diagnostics.push({ code: "selection-changed", severity: "info", message: "Selection cleared programmatically." });
|
|
255
|
+
notifySelection();
|
|
256
|
+
},
|
|
257
|
+
hitTest(input, hitOptions = {}) {
|
|
258
|
+
assertLive();
|
|
259
|
+
return hitTestMap(map, input, { layers: layerIds, ...hitOptions });
|
|
260
|
+
},
|
|
261
|
+
async refresh(refreshOptions) {
|
|
262
|
+
assertLive();
|
|
263
|
+
const plan = await mounted.refresh(refreshOptions);
|
|
264
|
+
diagnostics.push({ code: "edit-refreshed", severity: "info", message: "Refreshed mounted data in place." });
|
|
265
|
+
return plan;
|
|
266
|
+
},
|
|
267
|
+
dispose() {
|
|
268
|
+
if (disposed)
|
|
269
|
+
return;
|
|
270
|
+
disposed = true;
|
|
271
|
+
registryUnsubscribe?.();
|
|
272
|
+
registryUnsubscribe = undefined;
|
|
273
|
+
if (wiredClick)
|
|
274
|
+
for (const layerId of layerIds)
|
|
275
|
+
map.off?.("click", layerId, onLayerClick);
|
|
276
|
+
if (wiredHover)
|
|
277
|
+
for (const layerId of layerIds) {
|
|
278
|
+
map.off?.("mousemove", layerId, onLayerMove);
|
|
279
|
+
map.off?.("mouseleave", layerId, onLayerLeave);
|
|
280
|
+
}
|
|
281
|
+
if (featureStateCapable) {
|
|
282
|
+
onLayerLeave();
|
|
283
|
+
clearSelectionInternal();
|
|
284
|
+
}
|
|
285
|
+
},
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
function composeFilter(base, runtime) {
|
|
289
|
+
const hasBase = Array.isArray(base) && base.length > 0;
|
|
290
|
+
if (runtime === undefined)
|
|
291
|
+
return hasBase ? base : undefined;
|
|
292
|
+
if (!hasBase)
|
|
293
|
+
return runtime;
|
|
294
|
+
return ["all", base, runtime];
|
|
295
|
+
}
|
|
296
|
+
function featureTarget(source, id, sourceLayer) {
|
|
297
|
+
return sourceLayer ? { source, id, sourceLayer } : { source, id };
|
|
298
|
+
}
|
|
299
|
+
function firstFeatureId(event) {
|
|
300
|
+
if (!event || typeof event !== "object")
|
|
301
|
+
return undefined;
|
|
302
|
+
const features = event.features;
|
|
303
|
+
const id = features?.[0]?.id;
|
|
304
|
+
return id === undefined || id === null ? undefined : id;
|
|
305
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Explainable, dependency-free automatic Source -> MapLibre strategy selection.
|
|
3
|
+
*
|
|
4
|
+
* Planning is pure and renderer-neutral. Mounting consumes only the minimal
|
|
5
|
+
* injected MapLibre host surface and delegates to the focused feature/raster
|
|
6
|
+
* adapters where possible.
|
|
7
|
+
*/
|
|
8
|
+
import type { Source } from "../contract/types.js";
|
|
9
|
+
import { type HonuaErrorOptions, HonuaSdkError } from "../core/error-envelope.js";
|
|
10
|
+
import type { ExecuteQueryPlanOptions, QueryExecutionPlanV1 } from "../query-planner/types.js";
|
|
11
|
+
import { type MapLibreRasterStrategy } from "./raster-source-strategy.js";
|
|
12
|
+
import { type MapLibreGeometryKind, type MapLibreSourceWorkflowState, type SourceToMapLibreMap } from "./source-to-maplibre.js";
|
|
13
|
+
export declare const AUTOMATIC_MAPLIBRE_PLAN_KIND: "honua.maplibre-source-plan";
|
|
14
|
+
export declare const AUTOMATIC_MAPLIBRE_PLAN_VERSION: "1.0";
|
|
15
|
+
export declare const MAX_AUTOMATIC_GEOJSON_FEATURES = 100000;
|
|
16
|
+
export type AutomaticMapLibreStrategy = "geojson-query" | "vector-tiles" | "pmtiles-vector" | "pmtiles-raster" | "dynamic-query-tiles" | MapLibreRasterStrategy;
|
|
17
|
+
export type AutomaticMapLibreReasonCode = "selected" | "eligible-not-selected" | "protocol-mismatch" | "capability-mismatch" | "missing-query-plan" | "unsupported-query-plan" | "plan-context-mismatch" | "unbounded-materialization" | "missing-metadata" | "invalid-option" | "unsafe-url" | "unsupported-crs" | "stale-evidence" | "override-mismatch";
|
|
18
|
+
export interface AutomaticMapLibreCandidate {
|
|
19
|
+
readonly strategy: AutomaticMapLibreStrategy;
|
|
20
|
+
readonly eligible: boolean;
|
|
21
|
+
readonly reason: AutomaticMapLibreReasonCode;
|
|
22
|
+
readonly fidelity: "exact" | "unsupported";
|
|
23
|
+
readonly dataPath: "native" | "materialized";
|
|
24
|
+
readonly requiredPeers: readonly ("maplibre-gl" | "pmtiles")[];
|
|
25
|
+
readonly message: string;
|
|
26
|
+
}
|
|
27
|
+
export interface AutomaticMapLibreDiagnostic {
|
|
28
|
+
readonly code: AutomaticMapLibreReasonCode;
|
|
29
|
+
readonly severity: "info" | "warning" | "error";
|
|
30
|
+
readonly strategy?: AutomaticMapLibreStrategy;
|
|
31
|
+
readonly message: string;
|
|
32
|
+
}
|
|
33
|
+
export interface AutomaticMapLibreNativeSourceSpec {
|
|
34
|
+
readonly type: "vector" | "raster";
|
|
35
|
+
readonly tiles?: readonly string[];
|
|
36
|
+
readonly url?: string;
|
|
37
|
+
readonly scheme?: "xyz" | "tms";
|
|
38
|
+
readonly tileSize?: number;
|
|
39
|
+
readonly minzoom?: number;
|
|
40
|
+
readonly maxzoom?: number;
|
|
41
|
+
readonly bounds?: readonly [number, number, number, number];
|
|
42
|
+
readonly attribution?: string;
|
|
43
|
+
readonly promoteId?: string | Readonly<Record<string, string>>;
|
|
44
|
+
readonly volatile?: boolean;
|
|
45
|
+
}
|
|
46
|
+
export interface ExplainAutomaticMapLibreOptions {
|
|
47
|
+
/** Accepted, immutable query plan. Required for materialized GeoJSON. */
|
|
48
|
+
readonly queryPlan?: QueryExecutionPlanV1;
|
|
49
|
+
/** A source spec built by the dynamic-query-tile helpers. */
|
|
50
|
+
readonly queryTileSource?: AutomaticMapLibreNativeSourceSpec;
|
|
51
|
+
/** Required layer name for vector tile and vector PMTiles sources. */
|
|
52
|
+
readonly sourceLayer?: string;
|
|
53
|
+
/** Archive payload evidence obtained from PMTiles metadata. */
|
|
54
|
+
readonly pmtilesType?: "vector" | "raster";
|
|
55
|
+
readonly override?: AutomaticMapLibreStrategy;
|
|
56
|
+
readonly sourceId?: string;
|
|
57
|
+
readonly layerId?: string;
|
|
58
|
+
readonly beforeId?: string;
|
|
59
|
+
readonly geometry?: MapLibreGeometryKind | "auto";
|
|
60
|
+
readonly paint?: Readonly<Record<string, unknown>>;
|
|
61
|
+
readonly layout?: Readonly<Record<string, unknown>>;
|
|
62
|
+
readonly minzoom?: number;
|
|
63
|
+
readonly maxzoom?: number;
|
|
64
|
+
readonly tileSize?: number;
|
|
65
|
+
readonly format?: string;
|
|
66
|
+
readonly transparent?: boolean;
|
|
67
|
+
/** Caller-observed metadata time and explicit freshness budget. */
|
|
68
|
+
readonly evidence?: {
|
|
69
|
+
readonly observedAt: string;
|
|
70
|
+
readonly maxAgeMs: number;
|
|
71
|
+
/** Explicit clock evidence keeps planning deterministic. */
|
|
72
|
+
readonly now: string;
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
export interface AutomaticMapLibrePlan {
|
|
76
|
+
readonly kind: typeof AUTOMATIC_MAPLIBRE_PLAN_KIND;
|
|
77
|
+
readonly version: typeof AUTOMATIC_MAPLIBRE_PLAN_VERSION;
|
|
78
|
+
readonly id: string;
|
|
79
|
+
readonly sourceId: string;
|
|
80
|
+
readonly protocol: string;
|
|
81
|
+
readonly selected?: AutomaticMapLibreCandidate;
|
|
82
|
+
readonly candidates: readonly AutomaticMapLibreCandidate[];
|
|
83
|
+
readonly diagnostics: readonly AutomaticMapLibreDiagnostic[];
|
|
84
|
+
readonly bounds?: readonly [number, number, number, number];
|
|
85
|
+
readonly freshness: Readonly<{
|
|
86
|
+
mode: string;
|
|
87
|
+
observedAt?: string;
|
|
88
|
+
maxAgeMs?: number;
|
|
89
|
+
stale: boolean;
|
|
90
|
+
}>;
|
|
91
|
+
readonly provenance: Readonly<{
|
|
92
|
+
endpoint: string;
|
|
93
|
+
sourceVersion?: string;
|
|
94
|
+
schemaVersion?: string;
|
|
95
|
+
authorizationScope: readonly string[];
|
|
96
|
+
queryPlanId?: string;
|
|
97
|
+
queryPlanFingerprint?: string;
|
|
98
|
+
}>;
|
|
99
|
+
readonly cache: "source-owned" | "immutable-archive" | "query-plan-bypass";
|
|
100
|
+
readonly source?: AutomaticMapLibreNativeSourceSpec;
|
|
101
|
+
readonly layers: readonly Readonly<Record<string, unknown>>[];
|
|
102
|
+
}
|
|
103
|
+
export type AutomaticMapLibreWorkflowState = MapLibreSourceWorkflowState | "cancelled";
|
|
104
|
+
export interface MountedAutomaticMapLibreSource {
|
|
105
|
+
readonly strategy: AutomaticMapLibreStrategy;
|
|
106
|
+
readonly sourceId: string;
|
|
107
|
+
readonly layerIds: readonly string[];
|
|
108
|
+
readonly state: AutomaticMapLibreWorkflowState;
|
|
109
|
+
readonly diagnostics: readonly AutomaticMapLibreDiagnostic[];
|
|
110
|
+
readonly ready: Promise<AutomaticMapLibrePlan>;
|
|
111
|
+
refresh(options?: ExecuteQueryPlanOptions): Promise<AutomaticMapLibrePlan>;
|
|
112
|
+
cancel(reason?: unknown): void;
|
|
113
|
+
dispose(): void;
|
|
114
|
+
}
|
|
115
|
+
export type AutomaticMapLibreErrorCode = "no-eligible-strategy" | "stale-plan" | "source-conflict" | "layer-conflict" | "map-mutation-failed" | "cancelled" | "disposed";
|
|
116
|
+
export declare class HonuaAutomaticMapLibreStrategyError extends HonuaSdkError {
|
|
117
|
+
readonly code: AutomaticMapLibreErrorCode;
|
|
118
|
+
readonly detail?: Readonly<Record<string, unknown>> | undefined;
|
|
119
|
+
constructor(code: AutomaticMapLibreErrorCode, message: string, detail?: Readonly<Record<string, unknown>> | undefined, options?: HonuaErrorOptions);
|
|
120
|
+
}
|
|
121
|
+
/** Explain every strategy and select the first exact eligible candidate. */
|
|
122
|
+
export declare function explainAutomaticSourceToMapLibre<T>(source: Source<T>, options?: ExplainAutomaticMapLibreOptions): AutomaticMapLibrePlan;
|
|
123
|
+
/** Mount an explained plan through one cross-strategy lifecycle. */
|
|
124
|
+
export declare function mountAutomaticSourceToMapLibre<T>(map: SourceToMapLibreMap, source: Source<T>, plan: AutomaticMapLibrePlan, options?: ExplainAutomaticMapLibreOptions & ExecuteQueryPlanOptions): Promise<MountedAutomaticMapLibreSource>;
|
|
125
|
+
//# sourceMappingURL=automatic-source-strategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"automatic-source-strategy.d.ts","sourceRoot":"","sources":["../../../src/map/automatic-source-strategy.ts"],"names":[],"mappings":"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"}
|