@honua/react 0.1.0-beta.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 +11 -2
- package/contract/index.d.ts.map +1 -1
- package/contract/index.js +4 -1
- package/contract/pmtiles.d.ts +31 -0
- package/contract/pmtiles.d.ts.map +1 -1
- package/contract/pmtiles.js +60 -20
- 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 +35 -17
- package/contract/source.d.ts.map +1 -1
- package/contract/source.js +267 -71
- package/contract/types.d.ts +140 -4
- package/contract/types.d.ts.map +1 -1
- package/contract/types.js +6 -14
- 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 +4 -1
- package/core/client.d.ts.map +1 -1
- package/core/client.js +115 -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 +45 -29
- package/core/errors.d.ts.map +1 -1
- package/core/errors.js +97 -50
- package/core/geoparquet-sql.d.ts +30 -2
- package/core/geoparquet-sql.d.ts.map +1 -1
- package/core/geoparquet-sql.js +38 -3
- 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-features.d.ts.map +1 -1
- package/core/ogc-features.js +3 -0
- 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 +6 -2
- package/core/stac-static.d.ts.map +1 -1
- package/core/stac-static.js +260 -69
- package/core/surfaces.d.ts.map +1 -1
- package/core/surfaces.js +69 -5
- package/core/types.d.ts +125 -7
- package/core/types.d.ts.map +1 -1
- package/core/wfs-capabilities.d.ts +2 -0
- package/core/wfs-capabilities.d.ts.map +1 -1
- package/core/wfs-capabilities.js +8 -1
- package/core/wfs.d.ts.map +1 -1
- package/core/wfs.js +10 -0
- 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/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/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 +14 -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 +6 -0
- package/runtime/index.d.ts.map +1 -1
- package/runtime/index.js +3 -0
- 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/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 +9 -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
package/core/errors.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
2
|
+
* Tagged hierarchy for the migrated Honua SDK error domains. The common
|
|
3
|
+
* `isHonuaError(error)` guard also recognizes migrated query, map, runtime,
|
|
4
|
+
* realtime, offline, and plugin subclasses. See
|
|
5
|
+
* [`docs/errors.md`](../../docs/errors.md) for exact coverage, residual domains,
|
|
6
|
+
* recovery hints, and the retryability classification.
|
|
6
7
|
*
|
|
7
8
|
* @example
|
|
8
9
|
* ```ts
|
|
@@ -29,9 +30,26 @@
|
|
|
29
30
|
*
|
|
30
31
|
* @packageDocumentation
|
|
31
32
|
*/
|
|
32
|
-
import {
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
import { type HonuaErrorMetadata, type HonuaErrorOptions, HonuaSdkError } from "./error-envelope.js";
|
|
34
|
+
export type HonuaDiscoveryErrorCode = "ambiguous-protocol" | "ambiguous-source" | "invalid-endpoint" | "invalid-cache-identity" | "invalid-discovery-cache" | "invalid-capability" | "unsupported-protocol" | "protocol-mismatch";
|
|
35
|
+
/** Discovery input, metadata, or cache identity is invalid or inconsistent. */
|
|
36
|
+
export declare class HonuaDiscoveryError extends HonuaSdkError {
|
|
37
|
+
readonly code: HonuaDiscoveryErrorCode;
|
|
38
|
+
readonly detail?: Readonly<Record<string, unknown>> | undefined;
|
|
39
|
+
constructor(code: HonuaDiscoveryErrorCode, message: string, detail?: Readonly<Record<string, unknown>> | undefined, options?: HonuaErrorOptions);
|
|
40
|
+
}
|
|
41
|
+
/** Stable reason codes for geometry inputs that cannot be classified safely. */
|
|
42
|
+
export type HonuaGeometryErrorCode = "unknown-geometry" | "malformed-geometry";
|
|
43
|
+
/**
|
|
44
|
+
* Thrown when a geometry cannot be classified without guessing. The structured
|
|
45
|
+
* `code` and `detail` fields let callers distinguish an unsupported shape from
|
|
46
|
+
* a recognized-but-malformed Esri geometry without parsing the message.
|
|
47
|
+
*/
|
|
48
|
+
export declare class HonuaGeometryError extends HonuaSdkError {
|
|
49
|
+
readonly code: HonuaGeometryErrorCode;
|
|
50
|
+
readonly detail?: Readonly<Record<string, unknown>> | undefined;
|
|
51
|
+
constructor(code: HonuaGeometryErrorCode, message: string, detail?: Readonly<Record<string, unknown>> | undefined, options?: HonuaErrorOptions);
|
|
52
|
+
}
|
|
35
53
|
/**
|
|
36
54
|
* Thrown when the server returns a non-2xx HTTP status. Branch on
|
|
37
55
|
* `.statusCode` to decide recovery: refresh credentials on 401/403, respect
|
|
@@ -39,30 +57,30 @@ import { HonuaWmtsCapabilitiesParseError } from "./wmts-capabilities.js";
|
|
|
39
57
|
*
|
|
40
58
|
* @see [`docs/errors.md`](../../docs/errors.md)
|
|
41
59
|
*/
|
|
42
|
-
export declare class HonuaHttpError extends
|
|
60
|
+
export declare class HonuaHttpError extends HonuaSdkError {
|
|
43
61
|
readonly statusCode: number;
|
|
44
62
|
readonly body: unknown;
|
|
45
|
-
constructor(statusCode: number, message: string, body: unknown);
|
|
63
|
+
constructor(statusCode: number, message: string, body: unknown, options?: HonuaErrorOptions);
|
|
46
64
|
}
|
|
47
65
|
/** Thrown when a request exceeds the configured timeout. */
|
|
48
|
-
export declare class HonuaTimeoutError extends
|
|
66
|
+
export declare class HonuaTimeoutError extends HonuaSdkError {
|
|
49
67
|
readonly timeoutMs: number;
|
|
50
|
-
constructor(timeoutMs: number);
|
|
68
|
+
constructor(timeoutMs: number, options?: HonuaErrorOptions);
|
|
51
69
|
}
|
|
52
70
|
/** Thrown when a network-level failure occurs (DNS, connection refused, etc.). */
|
|
53
|
-
export declare class HonuaNetworkError extends
|
|
71
|
+
export declare class HonuaNetworkError extends HonuaSdkError {
|
|
54
72
|
readonly cause: unknown;
|
|
55
|
-
constructor(message: string, cause: unknown);
|
|
73
|
+
constructor(message: string, cause: unknown, metadata?: HonuaErrorMetadata);
|
|
56
74
|
}
|
|
57
75
|
/** Thrown when a request is aborted via a caller-provided AbortSignal. */
|
|
58
|
-
export declare class HonuaAbortError extends
|
|
59
|
-
constructor(message?: string);
|
|
76
|
+
export declare class HonuaAbortError extends HonuaSdkError {
|
|
77
|
+
constructor(message?: string, options?: HonuaErrorOptions);
|
|
60
78
|
}
|
|
61
79
|
/** Thrown when a gRPC-Web request fails, wrapping the underlying ConnectError. */
|
|
62
|
-
export declare class HonuaGrpcError extends
|
|
80
|
+
export declare class HonuaGrpcError extends HonuaSdkError {
|
|
63
81
|
readonly code: number;
|
|
64
82
|
readonly details: unknown;
|
|
65
|
-
constructor(code: number, message: string, details?: unknown);
|
|
83
|
+
constructor(code: number, message: string, details?: unknown, options?: HonuaErrorOptions);
|
|
66
84
|
}
|
|
67
85
|
/**
|
|
68
86
|
* Thrown when a `Source` is asked to perform an operation that the underlying
|
|
@@ -71,11 +89,11 @@ export declare class HonuaGrpcError extends Error {
|
|
|
71
89
|
* decide whether to swap protocols, fall back to a degraded strategy, or
|
|
72
90
|
* surface the limitation to the user.
|
|
73
91
|
*/
|
|
74
|
-
export declare class HonuaCapabilityNotSupportedError extends
|
|
92
|
+
export declare class HonuaCapabilityNotSupportedError extends HonuaSdkError {
|
|
75
93
|
readonly capability: string;
|
|
76
94
|
readonly protocol: string;
|
|
77
95
|
readonly sourceId: string | undefined;
|
|
78
|
-
constructor(capability: string, protocol: string, sourceId?: string);
|
|
96
|
+
constructor(capability: string, protocol: string, sourceId?: string, options?: HonuaErrorOptions);
|
|
79
97
|
}
|
|
80
98
|
/**
|
|
81
99
|
* Cause codes for {@link HonuaAuthError}. They classify *why* an auth flow
|
|
@@ -102,12 +120,10 @@ export type HonuaAuthErrorCode = "interaction_required" | "refresh_failed" | "in
|
|
|
102
120
|
*
|
|
103
121
|
* @see [`docs/errors.md`](../../docs/errors.md)
|
|
104
122
|
*/
|
|
105
|
-
export declare class HonuaAuthError extends
|
|
123
|
+
export declare class HonuaAuthError extends HonuaSdkError {
|
|
106
124
|
readonly code: HonuaAuthErrorCode;
|
|
107
125
|
readonly cause: unknown;
|
|
108
|
-
constructor(code: HonuaAuthErrorCode, message: string, options?:
|
|
109
|
-
cause?: unknown;
|
|
110
|
-
});
|
|
126
|
+
constructor(code: HonuaAuthErrorCode, message: string, options?: HonuaErrorOptions);
|
|
111
127
|
}
|
|
112
128
|
/**
|
|
113
129
|
* Thrown when an `ExplorationContext` operation is invalid — for example,
|
|
@@ -115,9 +131,9 @@ export declare class HonuaAuthError extends Error {
|
|
|
115
131
|
* an incompatible snapshot, or binding a view that requests a slice that is
|
|
116
132
|
* not exposed by the current dataset.
|
|
117
133
|
*/
|
|
118
|
-
export declare class HonuaExplorationContextError extends
|
|
134
|
+
export declare class HonuaExplorationContextError extends HonuaSdkError {
|
|
119
135
|
readonly code: string;
|
|
120
|
-
constructor(code: string, message: string);
|
|
136
|
+
constructor(code: string, message: string, options?: HonuaErrorOptions);
|
|
121
137
|
}
|
|
122
138
|
/**
|
|
123
139
|
* Thrown when a WFS server replies with an `ows:ExceptionReport`. Carries the
|
|
@@ -127,13 +143,13 @@ export declare class HonuaExplorationContextError extends Error {
|
|
|
127
143
|
* `src/core/wfs-capabilities.ts`; raw access lives behind the `protocol("wfs")`
|
|
128
144
|
* escape hatch.
|
|
129
145
|
*/
|
|
130
|
-
export declare class HonuaWfsExceptionError extends
|
|
146
|
+
export declare class HonuaWfsExceptionError extends HonuaSdkError {
|
|
131
147
|
readonly exceptionCode: string;
|
|
132
148
|
readonly locator: string | undefined;
|
|
133
|
-
constructor(exceptionCode: string, message: string, locator?: string);
|
|
149
|
+
constructor(exceptionCode: string, message: string, locator?: string, options?: HonuaErrorOptions);
|
|
134
150
|
}
|
|
135
|
-
/**
|
|
136
|
-
export type HonuaError =
|
|
151
|
+
/** Any public SDK error participating in the tagged envelope. */
|
|
152
|
+
export type HonuaError = HonuaSdkError;
|
|
137
153
|
/** Type guard that narrows any value to one of the Honua SDK error types. */
|
|
138
154
|
export declare function isHonuaError(error: unknown): error is HonuaError;
|
|
139
155
|
//# sourceMappingURL=errors.d.ts.map
|
package/core/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/core/errors.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/core/errors.ts"],"names":[],"mappings":"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"}
|
package/core/errors.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
2
|
+
* Tagged hierarchy for the migrated Honua SDK error domains. The common
|
|
3
|
+
* `isHonuaError(error)` guard also recognizes migrated query, map, runtime,
|
|
4
|
+
* realtime, offline, and plugin subclasses. See
|
|
5
|
+
* [`docs/errors.md`](../../docs/errors.md) for exact coverage, residual domains,
|
|
6
|
+
* recovery hints, and the retryability classification.
|
|
6
7
|
*
|
|
7
8
|
* @example
|
|
8
9
|
* ```ts
|
|
@@ -29,9 +30,39 @@
|
|
|
29
30
|
*
|
|
30
31
|
* @packageDocumentation
|
|
31
32
|
*/
|
|
32
|
-
import {
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
import { HonuaSdkError, isHonuaSdkError, mergeHonuaErrorContext, } from "./error-envelope.js";
|
|
34
|
+
/** Discovery input, metadata, or cache identity is invalid or inconsistent. */
|
|
35
|
+
export class HonuaDiscoveryError extends HonuaSdkError {
|
|
36
|
+
code;
|
|
37
|
+
detail;
|
|
38
|
+
constructor(code, message, detail, options = {}) {
|
|
39
|
+
super(`discovery.${code}`, message, {
|
|
40
|
+
...options,
|
|
41
|
+
context: mergeHonuaErrorContext(detail, options.context),
|
|
42
|
+
});
|
|
43
|
+
this.code = code;
|
|
44
|
+
this.detail = detail;
|
|
45
|
+
this.name = "HonuaDiscoveryError";
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Thrown when a geometry cannot be classified without guessing. The structured
|
|
50
|
+
* `code` and `detail` fields let callers distinguish an unsupported shape from
|
|
51
|
+
* a recognized-but-malformed Esri geometry without parsing the message.
|
|
52
|
+
*/
|
|
53
|
+
export class HonuaGeometryError extends HonuaSdkError {
|
|
54
|
+
code;
|
|
55
|
+
detail;
|
|
56
|
+
constructor(code, message, detail, options = {}) {
|
|
57
|
+
super(`core.geometry.${code}`, message, {
|
|
58
|
+
...options,
|
|
59
|
+
context: mergeHonuaErrorContext(detail, options.context),
|
|
60
|
+
});
|
|
61
|
+
this.code = code;
|
|
62
|
+
this.detail = detail;
|
|
63
|
+
this.name = "HonuaGeometryError";
|
|
64
|
+
}
|
|
65
|
+
}
|
|
35
66
|
/**
|
|
36
67
|
* Thrown when the server returns a non-2xx HTTP status. Branch on
|
|
37
68
|
* `.statusCode` to decide recovery: refresh credentials on 401/403, respect
|
|
@@ -39,49 +70,58 @@ import { HonuaWmtsCapabilitiesParseError } from "./wmts-capabilities.js";
|
|
|
39
70
|
*
|
|
40
71
|
* @see [`docs/errors.md`](../../docs/errors.md)
|
|
41
72
|
*/
|
|
42
|
-
export class HonuaHttpError extends
|
|
73
|
+
export class HonuaHttpError extends HonuaSdkError {
|
|
43
74
|
statusCode;
|
|
44
75
|
body;
|
|
45
|
-
constructor(statusCode, message, body) {
|
|
46
|
-
super(`HTTP ${statusCode}: ${message}
|
|
76
|
+
constructor(statusCode, message, body, options = {}) {
|
|
77
|
+
super(HTTP_RETRYABLE_STATUSES.has(statusCode) ? "core.http.transient" : "core.http.rejected", `HTTP ${statusCode}: ${message}`, {
|
|
78
|
+
...options,
|
|
79
|
+
context: mergeHonuaErrorContext(options.context, { statusCode }),
|
|
80
|
+
});
|
|
47
81
|
this.name = "HonuaHttpError";
|
|
48
82
|
this.statusCode = statusCode;
|
|
49
83
|
this.body = body;
|
|
50
84
|
}
|
|
51
85
|
}
|
|
52
86
|
/** Thrown when a request exceeds the configured timeout. */
|
|
53
|
-
export class HonuaTimeoutError extends
|
|
87
|
+
export class HonuaTimeoutError extends HonuaSdkError {
|
|
54
88
|
timeoutMs;
|
|
55
|
-
constructor(timeoutMs) {
|
|
56
|
-
super(`Request timed out after ${timeoutMs}ms
|
|
89
|
+
constructor(timeoutMs, options = {}) {
|
|
90
|
+
super("core.timeout", `Request timed out after ${timeoutMs}ms`, {
|
|
91
|
+
...options,
|
|
92
|
+
context: mergeHonuaErrorContext(options.context, { timeoutMs }),
|
|
93
|
+
});
|
|
57
94
|
this.name = "HonuaTimeoutError";
|
|
58
95
|
this.timeoutMs = timeoutMs;
|
|
59
96
|
}
|
|
60
97
|
}
|
|
61
98
|
/** Thrown when a network-level failure occurs (DNS, connection refused, etc.). */
|
|
62
|
-
export class HonuaNetworkError extends
|
|
99
|
+
export class HonuaNetworkError extends HonuaSdkError {
|
|
63
100
|
cause;
|
|
64
|
-
constructor(message, cause) {
|
|
65
|
-
super(message);
|
|
101
|
+
constructor(message, cause, metadata = {}) {
|
|
102
|
+
super("core.network", message, { ...metadata, cause });
|
|
66
103
|
this.name = "HonuaNetworkError";
|
|
67
104
|
this.cause = cause;
|
|
68
105
|
}
|
|
69
106
|
}
|
|
70
107
|
/** Thrown when a request is aborted via a caller-provided AbortSignal. */
|
|
71
|
-
export class HonuaAbortError extends
|
|
72
|
-
constructor(message = "Request was aborted") {
|
|
73
|
-
super(message);
|
|
108
|
+
export class HonuaAbortError extends HonuaSdkError {
|
|
109
|
+
constructor(message = "Request was aborted", options = {}) {
|
|
110
|
+
super("core.cancelled", message, options);
|
|
74
111
|
this.name = "HonuaAbortError";
|
|
75
112
|
}
|
|
76
113
|
}
|
|
77
114
|
/** Thrown when a gRPC-Web request fails, wrapping the underlying ConnectError. */
|
|
78
|
-
export class HonuaGrpcError extends
|
|
115
|
+
export class HonuaGrpcError extends HonuaSdkError {
|
|
79
116
|
code;
|
|
80
117
|
details;
|
|
81
|
-
constructor(code, message, details) {
|
|
82
|
-
super(message
|
|
83
|
-
|
|
118
|
+
constructor(code, message, details, options = {}) {
|
|
119
|
+
super(GRPC_RETRYABLE_CODES.has(code) ? "core.grpc.transient" : "core.grpc.rejected", message, {
|
|
120
|
+
...options,
|
|
121
|
+
context: mergeHonuaErrorContext(options.context, { grpcCode: code }),
|
|
122
|
+
});
|
|
84
123
|
this.code = code;
|
|
124
|
+
this.name = "HonuaGrpcError";
|
|
85
125
|
this.details = details;
|
|
86
126
|
}
|
|
87
127
|
}
|
|
@@ -92,14 +132,18 @@ export class HonuaGrpcError extends Error {
|
|
|
92
132
|
* decide whether to swap protocols, fall back to a degraded strategy, or
|
|
93
133
|
* surface the limitation to the user.
|
|
94
134
|
*/
|
|
95
|
-
export class HonuaCapabilityNotSupportedError extends
|
|
135
|
+
export class HonuaCapabilityNotSupportedError extends HonuaSdkError {
|
|
96
136
|
capability;
|
|
97
137
|
protocol;
|
|
98
138
|
sourceId;
|
|
99
|
-
constructor(capability, protocol, sourceId) {
|
|
100
|
-
|
|
139
|
+
constructor(capability, protocol, sourceId, options = {}) {
|
|
140
|
+
const message = sourceId
|
|
101
141
|
? `Capability "${capability}" is not supported by protocol "${protocol}" on source "${sourceId}"`
|
|
102
|
-
: `Capability "${capability}" is not supported by protocol "${protocol}"
|
|
142
|
+
: `Capability "${capability}" is not supported by protocol "${protocol}"`;
|
|
143
|
+
super("core.capability-not-supported", message, {
|
|
144
|
+
...options,
|
|
145
|
+
context: mergeHonuaErrorContext(options.context, { capability, protocol, sourceId }),
|
|
146
|
+
});
|
|
103
147
|
this.name = "HonuaCapabilityNotSupportedError";
|
|
104
148
|
this.capability = capability;
|
|
105
149
|
this.protocol = protocol;
|
|
@@ -115,13 +159,13 @@ export class HonuaCapabilityNotSupportedError extends Error {
|
|
|
115
159
|
*
|
|
116
160
|
* @see [`docs/errors.md`](../../docs/errors.md)
|
|
117
161
|
*/
|
|
118
|
-
export class HonuaAuthError extends
|
|
162
|
+
export class HonuaAuthError extends HonuaSdkError {
|
|
119
163
|
code;
|
|
120
164
|
cause;
|
|
121
165
|
constructor(code, message, options = {}) {
|
|
122
|
-
super(message);
|
|
123
|
-
this.name = "HonuaAuthError";
|
|
166
|
+
super(AUTH_ERROR_CODES[code], message, options);
|
|
124
167
|
this.code = code;
|
|
168
|
+
this.name = "HonuaAuthError";
|
|
125
169
|
this.cause = options.cause;
|
|
126
170
|
}
|
|
127
171
|
}
|
|
@@ -131,12 +175,15 @@ export class HonuaAuthError extends Error {
|
|
|
131
175
|
* an incompatible snapshot, or binding a view that requests a slice that is
|
|
132
176
|
* not exposed by the current dataset.
|
|
133
177
|
*/
|
|
134
|
-
export class HonuaExplorationContextError extends
|
|
178
|
+
export class HonuaExplorationContextError extends HonuaSdkError {
|
|
135
179
|
code;
|
|
136
|
-
constructor(code, message) {
|
|
137
|
-
super(message
|
|
138
|
-
|
|
180
|
+
constructor(code, message, options = {}) {
|
|
181
|
+
super("core.exploration-context", message, {
|
|
182
|
+
...options,
|
|
183
|
+
context: mergeHonuaErrorContext(options.context, { reason: code }),
|
|
184
|
+
});
|
|
139
185
|
this.code = code;
|
|
186
|
+
this.name = "HonuaExplorationContextError";
|
|
140
187
|
}
|
|
141
188
|
}
|
|
142
189
|
/**
|
|
@@ -147,13 +194,17 @@ export class HonuaExplorationContextError extends Error {
|
|
|
147
194
|
* `src/core/wfs-capabilities.ts`; raw access lives behind the `protocol("wfs")`
|
|
148
195
|
* escape hatch.
|
|
149
196
|
*/
|
|
150
|
-
export class HonuaWfsExceptionError extends
|
|
197
|
+
export class HonuaWfsExceptionError extends HonuaSdkError {
|
|
151
198
|
exceptionCode;
|
|
152
199
|
locator;
|
|
153
|
-
constructor(exceptionCode, message, locator) {
|
|
154
|
-
|
|
200
|
+
constructor(exceptionCode, message, locator, options = {}) {
|
|
201
|
+
const formattedMessage = locator
|
|
155
202
|
? `WFS ExceptionReport ${exceptionCode} (${locator}): ${message}`
|
|
156
|
-
: `WFS ExceptionReport ${exceptionCode}: ${message}
|
|
203
|
+
: `WFS ExceptionReport ${exceptionCode}: ${message}`;
|
|
204
|
+
super("core.wfs-exception", formattedMessage, {
|
|
205
|
+
...options,
|
|
206
|
+
context: mergeHonuaErrorContext(options.context, { exceptionCode, locator }),
|
|
207
|
+
});
|
|
157
208
|
this.name = "HonuaWfsExceptionError";
|
|
158
209
|
this.exceptionCode = exceptionCode;
|
|
159
210
|
this.locator = locator;
|
|
@@ -161,16 +212,12 @@ export class HonuaWfsExceptionError extends Error {
|
|
|
161
212
|
}
|
|
162
213
|
/** Type guard that narrows any value to one of the Honua SDK error types. */
|
|
163
214
|
export function isHonuaError(error) {
|
|
164
|
-
return (error
|
|
165
|
-
error instanceof HonuaTimeoutError ||
|
|
166
|
-
error instanceof HonuaNetworkError ||
|
|
167
|
-
error instanceof HonuaAbortError ||
|
|
168
|
-
error instanceof HonuaGrpcError ||
|
|
169
|
-
error instanceof HonuaAuthError ||
|
|
170
|
-
error instanceof HonuaCapabilityNotSupportedError ||
|
|
171
|
-
error instanceof HonuaExplorationContextError ||
|
|
172
|
-
error instanceof HonuaWfsExceptionError ||
|
|
173
|
-
error instanceof HonuaJobFailedError ||
|
|
174
|
-
error instanceof HonuaWmsCapabilitiesParseError ||
|
|
175
|
-
error instanceof HonuaWmtsCapabilitiesParseError);
|
|
215
|
+
return isHonuaSdkError(error);
|
|
176
216
|
}
|
|
217
|
+
const HTTP_RETRYABLE_STATUSES = new Set([408, 429, 500, 502, 503, 504]);
|
|
218
|
+
const GRPC_RETRYABLE_CODES = new Set([4, 8, 10, 14]);
|
|
219
|
+
const AUTH_ERROR_CODES = {
|
|
220
|
+
interaction_required: "core.auth.interaction-required",
|
|
221
|
+
refresh_failed: "core.auth.refresh-failed",
|
|
222
|
+
invalid_grant: "core.auth.invalid-grant",
|
|
223
|
+
};
|
package/core/geoparquet-sql.d.ts
CHANGED
|
@@ -66,8 +66,23 @@ export declare function parquetSourceExpr(urls: readonly string[]): string;
|
|
|
66
66
|
* 2.11, Mar 2025) — DuckDB reads it as a `GEOMETRY`, used directly.
|
|
67
67
|
* - `geojson`: GeoParquet `GeoJSON` encoding (string) — wrap with
|
|
68
68
|
* `ST_GeomFromGeoJSON(...)`.
|
|
69
|
-
|
|
70
|
-
|
|
69
|
+
* - `geoarrow-point` / `geoarrow-linestring` / `geoarrow-polygon` /
|
|
70
|
+
* `geoarrow-multipoint` / `geoarrow-multilinestring` /
|
|
71
|
+
* `geoarrow-multipolygon`: GeoParquet **1.1** native single-geometry
|
|
72
|
+
* encodings (`geo.columns[].encoding`). DuckDB exposes these as nested
|
|
73
|
+
* `STRUCT`/`LIST` columns, not a `GEOMETRY` value — there is no DuckDB
|
|
74
|
+
* spatial expression for them. Geometry projection is decoded in JS by
|
|
75
|
+
* `@honua/sdk-js/geoparquet`'s native decoder (`native-geometry.ts`, built
|
|
76
|
+
* on `src/columnar/geoarrow.ts`); a spatial predicate against one of these
|
|
77
|
+
* columns requires a GeoParquet 1.1 bbox-covering column
|
|
78
|
+
* ({@link GeometryColumnPlan.bboxColumn}) and otherwise fails closed — see
|
|
79
|
+
* {@link geometryExpr}.
|
|
80
|
+
*/
|
|
81
|
+
export type GeometryEncoding = "wkb" | "native" | "geojson" | "geoarrow-point" | "geoarrow-linestring" | "geoarrow-polygon" | "geoarrow-multipoint" | "geoarrow-multilinestring" | "geoarrow-multipolygon";
|
|
82
|
+
/** The `geoarrow-*` subset of {@link GeometryEncoding} (GeoParquet 1.1 native). */
|
|
83
|
+
export type GeoArrowNativeGeometryEncoding = Extract<GeometryEncoding, `geoarrow-${string}`>;
|
|
84
|
+
/** True for a GeoParquet 1.1 native single-geometry encoding (see {@link GeometryEncoding}). */
|
|
85
|
+
export declare function isGeoArrowNativeEncoding(encoding: GeometryEncoding): encoding is GeoArrowNativeGeometryEncoding;
|
|
71
86
|
export interface GeometryColumnPlan {
|
|
72
87
|
/** Geometry column name in the parquet file. */
|
|
73
88
|
readonly column: string;
|
|
@@ -79,10 +94,23 @@ export interface GeometryColumnPlan {
|
|
|
79
94
|
* can prune row groups without decoding any geometry.
|
|
80
95
|
*/
|
|
81
96
|
readonly bboxColumn?: string;
|
|
97
|
+
/**
|
|
98
|
+
* Coordinate dimensions physically stored by a `geoarrow-*` encoding.
|
|
99
|
+
* Required (and only meaningful) when {@link encoding} is one of the
|
|
100
|
+
* `geoarrow-*` values; GeoParquet 1.1 native encodings carry no `M`.
|
|
101
|
+
*/
|
|
102
|
+
readonly nativeDimensions?: "xy" | "xyz";
|
|
82
103
|
}
|
|
83
104
|
/**
|
|
84
105
|
* SQL expression that yields a DuckDB `GEOMETRY` from the stored geometry
|
|
85
106
|
* column, adapting to the physical encoding.
|
|
107
|
+
*
|
|
108
|
+
* @throws for a `geoarrow-*` encoding — GeoParquet 1.1 native columns are
|
|
109
|
+
* nested `STRUCT`/`LIST` values with no DuckDB spatial-predicate
|
|
110
|
+
* expression. Callers must fail closed before constructing SQL rather than
|
|
111
|
+
* let a malformed `ST_Intersects(...)` reach DuckDB; use a bbox-covering
|
|
112
|
+
* column for spatial pushdown and the dedicated native decoder for
|
|
113
|
+
* geometry projection instead.
|
|
86
114
|
*/
|
|
87
115
|
export declare function geometryExpr(plan: GeometryColumnPlan): string;
|
|
88
116
|
export interface BBox {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geoparquet-sql.d.ts","sourceRoot":"","sources":["../../../src/core/geoparquet-sql.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EAAiB,eAAe,EAAE,KAAK,EAAY,MAAM,sBAAsB,CAAC;AAC5F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIzD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASpD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQnD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKnD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKpD;AAID;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAOjE;AAID
|
|
1
|
+
{"version":3,"file":"geoparquet-sql.d.ts","sourceRoot":"","sources":["../../../src/core/geoparquet-sql.ts"],"names":[],"mappings":"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"}
|
package/core/geoparquet-sql.js
CHANGED
|
@@ -90,9 +90,28 @@ export function parquetSourceExpr(urls) {
|
|
|
90
90
|
const arg = list.length === 1 ? list[0] : `[${list.join(", ")}]`;
|
|
91
91
|
return `read_parquet(${arg}, union_by_name = true, hive_partitioning = true)`;
|
|
92
92
|
}
|
|
93
|
+
const GEOARROW_NATIVE_ENCODINGS = new Set([
|
|
94
|
+
"geoarrow-point",
|
|
95
|
+
"geoarrow-linestring",
|
|
96
|
+
"geoarrow-polygon",
|
|
97
|
+
"geoarrow-multipoint",
|
|
98
|
+
"geoarrow-multilinestring",
|
|
99
|
+
"geoarrow-multipolygon",
|
|
100
|
+
]);
|
|
101
|
+
/** True for a GeoParquet 1.1 native single-geometry encoding (see {@link GeometryEncoding}). */
|
|
102
|
+
export function isGeoArrowNativeEncoding(encoding) {
|
|
103
|
+
return GEOARROW_NATIVE_ENCODINGS.has(encoding);
|
|
104
|
+
}
|
|
93
105
|
/**
|
|
94
106
|
* SQL expression that yields a DuckDB `GEOMETRY` from the stored geometry
|
|
95
107
|
* column, adapting to the physical encoding.
|
|
108
|
+
*
|
|
109
|
+
* @throws for a `geoarrow-*` encoding — GeoParquet 1.1 native columns are
|
|
110
|
+
* nested `STRUCT`/`LIST` values with no DuckDB spatial-predicate
|
|
111
|
+
* expression. Callers must fail closed before constructing SQL rather than
|
|
112
|
+
* let a malformed `ST_Intersects(...)` reach DuckDB; use a bbox-covering
|
|
113
|
+
* column for spatial pushdown and the dedicated native decoder for
|
|
114
|
+
* geometry projection instead.
|
|
96
115
|
*/
|
|
97
116
|
export function geometryExpr(plan) {
|
|
98
117
|
const col = quoteIdentifier(plan.column);
|
|
@@ -103,6 +122,13 @@ export function geometryExpr(plan) {
|
|
|
103
122
|
return `ST_GeomFromGeoJSON(${col})`;
|
|
104
123
|
case "native":
|
|
105
124
|
return col;
|
|
125
|
+
case "geoarrow-point":
|
|
126
|
+
case "geoarrow-linestring":
|
|
127
|
+
case "geoarrow-polygon":
|
|
128
|
+
case "geoarrow-multipoint":
|
|
129
|
+
case "geoarrow-multilinestring":
|
|
130
|
+
case "geoarrow-multipolygon":
|
|
131
|
+
throw new Error(`geoparquet: column ${JSON.stringify(plan.column)} uses the GeoParquet 1.1 native "${plan.encoding.slice("geoarrow-".length)}" encoding, which DuckDB stores as a nested struct/list value with no spatial-predicate expression. Supply a bbox-covering column for spatialFilter pushdown; geometry projection is decoded separately from the raw column.`);
|
|
106
132
|
}
|
|
107
133
|
}
|
|
108
134
|
/**
|
|
@@ -209,7 +235,15 @@ function projection(query, options) {
|
|
|
209
235
|
const geom = options.geometry;
|
|
210
236
|
const geomAlias = quoteIdentifier(options.geometryAlias ?? DEFAULT_GEOMETRY_ALIAS);
|
|
211
237
|
const wantGeometry = query.returnGeometry !== false && geom !== undefined;
|
|
212
|
-
|
|
238
|
+
// `geoarrow-*` columns are raw nested struct/list values, not a DuckDB
|
|
239
|
+
// `GEOMETRY` — project them as-is and let the caller's native decoder
|
|
240
|
+
// (built on src/columnar/geoarrow.ts) turn the materialized rows into
|
|
241
|
+
// GeoJSON. Every other encoding keeps projecting `ST_AsGeoJSON(...)` text.
|
|
242
|
+
const geomSelect = wantGeometry
|
|
243
|
+
? isGeoArrowNativeEncoding(geom.encoding)
|
|
244
|
+
? `${quoteIdentifier(geom.column)} AS ${geomAlias}`
|
|
245
|
+
: `ST_AsGeoJSON(${geometryExpr(geom)}) AS ${geomAlias}`
|
|
246
|
+
: undefined;
|
|
213
247
|
const outFields = query.outFields;
|
|
214
248
|
if (outFields && outFields.length > 0) {
|
|
215
249
|
const cols = outFields.filter((f) => !geom || f !== geom.column).map((f) => quoteIdentifier(f));
|
|
@@ -328,6 +362,7 @@ export function rowEstimateSql(sources) {
|
|
|
328
362
|
* rows for Parquet-native geometry files, which carry no `geo` metadata.
|
|
329
363
|
*/
|
|
330
364
|
export function geoMetadataSql(sources) {
|
|
331
|
-
const
|
|
332
|
-
|
|
365
|
+
const list = sources.map(stringLiteral);
|
|
366
|
+
const arg = list.length === 1 ? list[0] : `[${list.join(", ")}]`;
|
|
367
|
+
return `SELECT files.file_name, geo.value FROM parquet_file_metadata(${arg}) AS files LEFT JOIN parquet_kv_metadata(${arg}) AS geo ON geo.file_name = files.file_name AND decode(geo.key) = 'geo' ORDER BY files.file_name`;
|
|
333
368
|
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Encode an OData key predicate without hiding its structural grammar.
|
|
3
|
+
*
|
|
4
|
+
* Quotes plus the `,` / `=` delimiters outside quoted literals remain
|
|
5
|
+
* visible to direct and JSON-batch OData parsers. Unsafe value characters
|
|
6
|
+
* are percent-encoded by Unicode code point so non-BMP string keys remain
|
|
7
|
+
* valid path data rather than splitting or truncating the target URL.
|
|
8
|
+
*
|
|
9
|
+
* @internal
|
|
10
|
+
*/
|
|
11
|
+
export declare function encodeOdataKeyPredicatePath(key: string | number): string;
|
|
12
|
+
//# sourceMappingURL=odata-key-path.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"odata-key-path.d.ts","sourceRoot":"","sources":["../../../src/core/odata-key-path.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAiBxE"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Encode an OData key predicate without hiding its structural grammar.
|
|
3
|
+
*
|
|
4
|
+
* Quotes plus the `,` / `=` delimiters outside quoted literals remain
|
|
5
|
+
* visible to direct and JSON-batch OData parsers. Unsafe value characters
|
|
6
|
+
* are percent-encoded by Unicode code point so non-BMP string keys remain
|
|
7
|
+
* valid path data rather than splitting or truncating the target URL.
|
|
8
|
+
*
|
|
9
|
+
* @internal
|
|
10
|
+
*/
|
|
11
|
+
export function encodeOdataKeyPredicatePath(key) {
|
|
12
|
+
const raw = String(key);
|
|
13
|
+
let output = "";
|
|
14
|
+
let inQuote = false;
|
|
15
|
+
for (const character of raw) {
|
|
16
|
+
if (character === "'") {
|
|
17
|
+
inQuote = !inQuote;
|
|
18
|
+
output += "'";
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
if (!inQuote && (character === "," || character === "=")) {
|
|
22
|
+
output += character;
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
output += /[A-Za-z0-9\-._~]/.test(character) ? character : encodeURIComponent(character);
|
|
26
|
+
}
|
|
27
|
+
return output;
|
|
28
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metadata-driven OData write encoding primitives.
|
|
3
|
+
*
|
|
4
|
+
* This module deliberately has no transport dependencies. Callers supply the
|
|
5
|
+
* already-cached CSDL projection and decide how to attach the encoded body,
|
|
6
|
+
* content type, and key to an HTTP request.
|
|
7
|
+
*/
|
|
8
|
+
import { type HonuaOdataMetadata } from "./odata.js";
|
|
9
|
+
/** Stable failure categories for local, pre-transport encoding errors. */
|
|
10
|
+
export type HonuaOdataEdmEncodingErrorCode = "cyclic-value" | "invalid-metadata" | "invalid-options" | "invalid-value" | "max-depth-exceeded" | "missing-key" | "resource-limit-exceeded" | "unknown-entity-set" | "unsupported-type";
|
|
11
|
+
/**
|
|
12
|
+
* A redacted local encoding failure.
|
|
13
|
+
*
|
|
14
|
+
* Messages contain a fixed explanation and a bounded, escaped property path.
|
|
15
|
+
* The rejected value and request body are intentionally never retained.
|
|
16
|
+
*/
|
|
17
|
+
export declare class HonuaOdataEdmEncodingError extends TypeError {
|
|
18
|
+
readonly code: HonuaOdataEdmEncodingErrorCode;
|
|
19
|
+
readonly path: string;
|
|
20
|
+
constructor(code: HonuaOdataEdmEncodingErrorCode, path: string);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Controls the hard recursion bound for complex, collection, and untyped
|
|
24
|
+
* values. Fixed breadth and aggregate-node budgets also protect every call.
|
|
25
|
+
*/
|
|
26
|
+
export interface HonuaOdataEdmEncodingOptions {
|
|
27
|
+
/** Maximum nested container depth. Defaults to and cannot exceed 32. */
|
|
28
|
+
readonly maxDepth?: number;
|
|
29
|
+
}
|
|
30
|
+
/** Controls metadata-typed entity-key encoding. */
|
|
31
|
+
export interface HonuaOdataEntityKeyEncodingOptions extends HonuaOdataEdmEncodingOptions {
|
|
32
|
+
/**
|
|
33
|
+
* Ordered metadata key fields to place in this URL predicate. Omit this for
|
|
34
|
+
* a direct entity set. Navigation paths may provide the child-key subset
|
|
35
|
+
* because the parent key is already carried by the path.
|
|
36
|
+
*/
|
|
37
|
+
readonly keyFields?: readonly string[];
|
|
38
|
+
}
|
|
39
|
+
/** Body projection consumed by a later HTTP/edit integration layer. */
|
|
40
|
+
export interface HonuaOdataEncodedWriteBody {
|
|
41
|
+
/** JSON-compatible body with metadata-declared values encoded losslessly. */
|
|
42
|
+
readonly body: Record<string, unknown>;
|
|
43
|
+
/** Whether the body requires `IEEE754Compatible=true` on its media type. */
|
|
44
|
+
readonly requiresIeee754Compatible: boolean;
|
|
45
|
+
}
|
|
46
|
+
/** Key projection consumed by direct and batch URL builders. */
|
|
47
|
+
export interface HonuaOdataEncodedEntityKey {
|
|
48
|
+
/** OData key predicate content, without surrounding parentheses. */
|
|
49
|
+
readonly literal: string;
|
|
50
|
+
/** The same predicate encoded as one RFC 3986-safe URL path segment. */
|
|
51
|
+
readonly pathSegment: string;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Encode one entity body using the entity and complex property declarations in
|
|
55
|
+
* an existing OData metadata snapshot.
|
|
56
|
+
*/
|
|
57
|
+
export declare function encodeOdataWriteBody(metadata: HonuaOdataMetadata, entitySet: string, body: Readonly<Record<string, unknown>>, options?: HonuaOdataEdmEncodingOptions): HonuaOdataEncodedWriteBody;
|
|
58
|
+
/**
|
|
59
|
+
* Encode a single or composite primary key in metadata declaration order.
|
|
60
|
+
*
|
|
61
|
+
* A single key accepts either its scalar value or an object carrying the key
|
|
62
|
+
* property. Composite keys require an object so component names cannot be
|
|
63
|
+
* confused or reordered by the caller.
|
|
64
|
+
*/
|
|
65
|
+
export declare function encodeOdataEntityKey(metadata: HonuaOdataMetadata, entitySet: string, key: unknown, options?: HonuaOdataEntityKeyEncodingOptions): HonuaOdataEncodedEntityKey;
|
|
66
|
+
//# sourceMappingURL=odata-write-codec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"odata-write-codec.d.ts","sourceRoot":"","sources":["../../../src/core/odata-write-codec.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAGL,KAAK,kBAAkB,EAGxB,MAAM,YAAY,CAAC;AAwCpB,0EAA0E;AAC1E,MAAM,MAAM,8BAA8B,GACtC,cAAc,GACd,kBAAkB,GAClB,iBAAiB,GACjB,eAAe,GACf,oBAAoB,GACpB,aAAa,GACb,yBAAyB,GACzB,oBAAoB,GACpB,kBAAkB,CAAC;AAEvB;;;;;GAKG;AACH,qBAAa,0BAA2B,SAAQ,SAAS;IACvD,SAAgB,IAAI,EAAE,8BAA8B,CAAC;IACrD,SAAgB,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,8BAA8B,EAAE,IAAI,EAAE,MAAM;CAMtE;AAED;;;GAGG;AACH,MAAM,WAAW,4BAA4B;IAC3C,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,mDAAmD;AACnD,MAAM,WAAW,kCAAmC,SAAQ,4BAA4B;IACtF;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC;AAED,uEAAuE;AACvE,MAAM,WAAW,0BAA0B;IACzC,6EAA6E;IAC7E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,4EAA4E;IAC5E,QAAQ,CAAC,yBAAyB,EAAE,OAAO,CAAC;CAC7C;AAED,gEAAgE;AAChE,MAAM,WAAW,0BAA0B;IACzC,oEAAoE;IACpE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,wEAAwE;IACxE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAkBD;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,kBAAkB,EAC5B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACvC,OAAO,GAAE,4BAAiC,GACzC,0BAA0B,CAS5B;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,kBAAkB,EAC5B,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,OAAO,EACZ,OAAO,GAAE,kCAAuC,GAC/C,0BAA0B,CAyC5B"}
|