@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/ogc-tiles.js
CHANGED
|
@@ -11,42 +11,72 @@ import { encodePathSegments, trimTrailingSlashes } from "./path-utils.js";
|
|
|
11
11
|
import { createOgcMetadataParams } from "./wire-shared.js";
|
|
12
12
|
/** Default OGC tile-matrix-set used when none is specified (Web Mercator XYZ). */
|
|
13
13
|
export const DEFAULT_OGC_TILE_MATRIX_SET = "WebMercatorQuad";
|
|
14
|
+
/** Honua facade path prefix for OGC API Tiles. */
|
|
15
|
+
const TILES_FACADE_BASE = "/ogc/tiles";
|
|
16
|
+
/**
|
|
17
|
+
* Resolve the OGC API Tiles path prefix: the caller-supplied raw `basePath` (a
|
|
18
|
+
* `connect()`-discovered third-party service root) or the Honua facade default.
|
|
19
|
+
* Trailing slashes are trimmed so a discovered root and the facade compose the
|
|
20
|
+
* same sub-paths. Mirrors the OGC API Records seam in `ogc-records.ts`.
|
|
21
|
+
*/
|
|
22
|
+
function tilesBase(request) {
|
|
23
|
+
// An omitted basePath uses the Honua facade; an explicit "" is a legitimate
|
|
24
|
+
// root-mounted raw service and must NOT fall back to the facade prefix.
|
|
25
|
+
if (request.basePath === undefined)
|
|
26
|
+
return TILES_FACADE_BASE;
|
|
27
|
+
const base = request.basePath;
|
|
28
|
+
let end = base.length;
|
|
29
|
+
while (end > 0 && base.charCodeAt(end - 1) === 0x2f)
|
|
30
|
+
end--;
|
|
31
|
+
return base.slice(0, end);
|
|
32
|
+
}
|
|
33
|
+
/** Cache-key discriminator so a discovered root never collides with the facade. */
|
|
34
|
+
function tilesBaseKey(request) {
|
|
35
|
+
const base = tilesBase(request);
|
|
36
|
+
return base === TILES_FACADE_BASE ? "" : `${base}:`;
|
|
37
|
+
}
|
|
14
38
|
/**
|
|
15
39
|
* Top-level OGC API Tiles handle. Mirrors `HonuaOgcFeatures` for the
|
|
16
40
|
* tiles conformance classes.
|
|
17
41
|
*/
|
|
18
42
|
export class HonuaOgcTiles {
|
|
19
43
|
client;
|
|
44
|
+
basePath;
|
|
20
45
|
constructor(options) {
|
|
21
46
|
this.client = options.client;
|
|
47
|
+
this.basePath = options.basePath;
|
|
48
|
+
}
|
|
49
|
+
withBase(request) {
|
|
50
|
+
return this.basePath !== undefined ? { ...request, basePath: this.basePath } : request;
|
|
22
51
|
}
|
|
23
52
|
tileset(collectionId, tileMatrixSetId) {
|
|
24
53
|
return new HonuaOgcTileset({
|
|
25
54
|
client: this.client,
|
|
26
55
|
collectionId,
|
|
27
56
|
tileMatrixSetId,
|
|
57
|
+
...(this.basePath !== undefined ? { basePath: this.basePath } : {}),
|
|
28
58
|
});
|
|
29
59
|
}
|
|
30
60
|
async landing(request = {}) {
|
|
31
|
-
return this.client.getOgcTilesLanding(request);
|
|
61
|
+
return this.client.getOgcTilesLanding(this.withBase(request));
|
|
32
62
|
}
|
|
33
63
|
async conformance(request = {}) {
|
|
34
|
-
return this.client.getOgcTilesConformance(request);
|
|
64
|
+
return this.client.getOgcTilesConformance(this.withBase(request));
|
|
35
65
|
}
|
|
36
66
|
async tileMatrixSets(request = {}) {
|
|
37
|
-
return this.client.listOgcTileMatrixSets(request);
|
|
67
|
+
return this.client.listOgcTileMatrixSets(this.withBase(request));
|
|
38
68
|
}
|
|
39
69
|
async tileMatrixSet(tileMatrixSetId, request = {}) {
|
|
40
|
-
return this.client.getOgcTileMatrixSet({ ...request, tileMatrixSetId });
|
|
70
|
+
return this.client.getOgcTileMatrixSet(this.withBase({ ...request, tileMatrixSetId }));
|
|
41
71
|
}
|
|
42
72
|
async tilesets(request) {
|
|
43
|
-
return this.client.listOgcCollectionTilesets(request);
|
|
73
|
+
return this.client.listOgcCollectionTilesets(this.withBase(request));
|
|
44
74
|
}
|
|
45
75
|
async tilesetMetadata(request) {
|
|
46
|
-
return this.client.getOgcCollectionTileset(request);
|
|
76
|
+
return this.client.getOgcCollectionTileset(this.withBase(request));
|
|
47
77
|
}
|
|
48
78
|
async tile(request) {
|
|
49
|
-
return this.client.fetchOgcTile(request);
|
|
79
|
+
return this.client.fetchOgcTile(this.withBase(request));
|
|
50
80
|
}
|
|
51
81
|
/**
|
|
52
82
|
* Build a MapLibre-ready vector source definition for a tiled collection.
|
|
@@ -67,7 +97,8 @@ export class HonuaOgcTiles {
|
|
|
67
97
|
const baseUrl = trimTrailingSlashes(this.client.serverBaseUrl);
|
|
68
98
|
const collection = encodePathSegments(serviceId);
|
|
69
99
|
const matrixSet = encodeURIComponent(tileMatrixSetId);
|
|
70
|
-
const
|
|
100
|
+
const base = tilesBase({ ...(this.basePath !== undefined ? { basePath: this.basePath } : {}) });
|
|
101
|
+
const template = `${baseUrl}${base}/collections/${collection}/tiles/${matrixSet}/{z}/{y}/{x}`;
|
|
71
102
|
const source = {
|
|
72
103
|
type: "vector",
|
|
73
104
|
tiles: [template],
|
|
@@ -112,16 +143,19 @@ export class HonuaOgcTileset {
|
|
|
112
143
|
client;
|
|
113
144
|
collectionId;
|
|
114
145
|
tileMatrixSetId;
|
|
146
|
+
basePath;
|
|
115
147
|
constructor(options) {
|
|
116
148
|
this.client = options.client;
|
|
117
149
|
this.collectionId = options.collectionId;
|
|
118
150
|
this.tileMatrixSetId = options.tileMatrixSetId;
|
|
151
|
+
this.basePath = options.basePath;
|
|
119
152
|
}
|
|
120
153
|
async metadata(request = {}) {
|
|
121
154
|
return this.client.getOgcCollectionTileset({
|
|
122
155
|
...request,
|
|
123
156
|
collectionId: this.collectionId,
|
|
124
157
|
tileMatrixSetId: this.tileMatrixSetId,
|
|
158
|
+
...(this.basePath !== undefined ? { basePath: this.basePath } : {}),
|
|
125
159
|
});
|
|
126
160
|
}
|
|
127
161
|
async tile(request) {
|
|
@@ -129,6 +163,7 @@ export class HonuaOgcTileset {
|
|
|
129
163
|
...request,
|
|
130
164
|
collectionId: this.collectionId,
|
|
131
165
|
tileMatrixSetId: this.tileMatrixSetId,
|
|
166
|
+
...(this.basePath !== undefined ? { basePath: this.basePath } : {}),
|
|
132
167
|
});
|
|
133
168
|
}
|
|
134
169
|
}
|
|
@@ -142,30 +177,34 @@ export function createHonuaOgcTiles(client) {
|
|
|
142
177
|
// exposes thin `get*/list*/fetch*` delegators that call these.
|
|
143
178
|
export async function getOgcTilesLanding(transport, request = {}) {
|
|
144
179
|
const params = createOgcMetadataParams(request);
|
|
145
|
-
|
|
180
|
+
const base = tilesBase(request);
|
|
181
|
+
return transport.requestCachedMetadataJson(`ogc-tiles:landing:${tilesBaseKey(request)}${params.toString()}`, `${base}?${params.toString()}`, request);
|
|
146
182
|
}
|
|
147
183
|
export async function getOgcTilesConformance(transport, request = {}) {
|
|
148
184
|
const params = createOgcMetadataParams(request);
|
|
149
|
-
|
|
185
|
+
const base = tilesBase(request);
|
|
186
|
+
return transport.requestCachedMetadataJson(`ogc-tiles:conformance:${tilesBaseKey(request)}${params.toString()}`, `${base}/conformance?${params.toString()}`, request);
|
|
150
187
|
}
|
|
151
188
|
export async function listOgcTileMatrixSets(transport, request = {}) {
|
|
152
189
|
const params = createOgcMetadataParams(request);
|
|
153
|
-
|
|
190
|
+
const base = tilesBase(request);
|
|
191
|
+
return transport.requestCachedMetadataJson(`ogc-tiles:tile-matrix-sets:${tilesBaseKey(request)}${params.toString()}`, `${base}/tileMatrixSets?${params.toString()}`, request);
|
|
154
192
|
}
|
|
155
193
|
export async function getOgcTileMatrixSet(transport, request) {
|
|
156
194
|
const params = createOgcMetadataParams(request);
|
|
157
|
-
|
|
195
|
+
const base = tilesBase(request);
|
|
196
|
+
return transport.requestCachedMetadataJson(`ogc-tiles:tile-matrix-set:${tilesBaseKey(request)}${request.tileMatrixSetId}:${params.toString()}`, `${base}/tileMatrixSets/${encodeURIComponent(request.tileMatrixSetId)}?${params.toString()}`, request);
|
|
158
197
|
}
|
|
159
198
|
export async function listOgcCollectionTilesets(transport, request) {
|
|
160
199
|
const params = createOgcMetadataParams(request);
|
|
161
|
-
const path =
|
|
162
|
-
return transport.requestCachedMetadataJson(`ogc-tiles:tilesets:${request.collectionId}:${params.toString()}`, `${path}?${params.toString()}`, request);
|
|
200
|
+
const path = `${tilesBase(request)}/collections/${encodeURIComponent(String(request.collectionId))}/tiles`;
|
|
201
|
+
return transport.requestCachedMetadataJson(`ogc-tiles:tilesets:${tilesBaseKey(request)}${request.collectionId}:${params.toString()}`, `${path}?${params.toString()}`, request);
|
|
163
202
|
}
|
|
164
203
|
export async function getOgcCollectionTileset(transport, request) {
|
|
165
204
|
const params = createOgcMetadataParams(request);
|
|
166
|
-
const path =
|
|
205
|
+
const path = `${tilesBase(request)}/collections/${encodeURIComponent(String(request.collectionId))}` +
|
|
167
206
|
`/tiles/${encodeURIComponent(request.tileMatrixSetId)}`;
|
|
168
|
-
return transport.requestCachedMetadataJson(`ogc-tiles:tileset:${request.collectionId}:${request.tileMatrixSetId}:${params.toString()}`, `${path}?${params.toString()}`, request);
|
|
207
|
+
return transport.requestCachedMetadataJson(`ogc-tiles:tileset:${tilesBaseKey(request)}${request.collectionId}:${request.tileMatrixSetId}:${params.toString()}`, `${path}?${params.toString()}`, request);
|
|
169
208
|
}
|
|
170
209
|
export async function fetchOgcTile(transport, request) {
|
|
171
210
|
const params = new URLSearchParams();
|
|
@@ -178,6 +217,6 @@ export async function fetchOgcTile(transport, request) {
|
|
|
178
217
|
const matrixSet = encodeURIComponent(request.tileMatrixSetId);
|
|
179
218
|
const matrix = encodeURIComponent(String(request.tileMatrix));
|
|
180
219
|
const query = params.size > 0 ? `?${params.toString()}` : "";
|
|
181
|
-
const path =
|
|
220
|
+
const path = `${tilesBase(request)}/collections/${collection}/tiles/${matrixSet}/${matrix}/${request.tileRow}/${request.tileCol}${query}`;
|
|
182
221
|
return transport.requestBytes("GET", path, request.accept, undefined, request.signal);
|
|
183
222
|
}
|
package/core/path-utils.d.ts
CHANGED
|
@@ -21,6 +21,15 @@ export declare function trimSurroundingSlashes(value: string): string;
|
|
|
21
21
|
* or `_` padding) without anchored `^x+|x+$` regexes.
|
|
22
22
|
*/
|
|
23
23
|
export declare function trimChar(value: string, char: string): string;
|
|
24
|
+
/**
|
|
25
|
+
* Remove a trailing run of characters from `value` that belong to `chars`.
|
|
26
|
+
*
|
|
27
|
+
* Equivalent to `value.replace(new RegExp(\`[${chars}]+$\`), "")` but avoids
|
|
28
|
+
* building an anchored character-class regex (which can exhibit polynomial
|
|
29
|
+
* matching on adversarial input) by scanning backward from the end with
|
|
30
|
+
* simple index arithmetic instead.
|
|
31
|
+
*/
|
|
32
|
+
export declare function trimTrailingCharsIn(value: string, chars: string): string;
|
|
24
33
|
/**
|
|
25
34
|
* Return `value` with any `?query` and `#fragment` suffix removed.
|
|
26
35
|
*
|
package/core/path-utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path-utils.d.ts","sourceRoot":"","sources":["../../../src/core/path-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,wDAAwD;AACxD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMzD;AAED,uDAAuD;AACvD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMxD;AAED,oEAAoE;AACpE,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAW5D;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAU3D;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGhD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAS7D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQxD"}
|
|
1
|
+
{"version":3,"file":"path-utils.d.ts","sourceRoot":"","sources":["../../../src/core/path-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,wDAAwD;AACxD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMzD;AAED,uDAAuD;AACvD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMxD;AAED,oEAAoE;AACpE,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAW5D;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAUxE;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAU3D;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGhD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAS7D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQxD"}
|
package/core/path-utils.js
CHANGED
|
@@ -46,6 +46,25 @@ export function trimChar(value, char) {
|
|
|
46
46
|
}
|
|
47
47
|
return start === 0 && end === value.length ? value : value.slice(start, end);
|
|
48
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* Remove a trailing run of characters from `value` that belong to `chars`.
|
|
51
|
+
*
|
|
52
|
+
* Equivalent to `value.replace(new RegExp(\`[${chars}]+$\`), "")` but avoids
|
|
53
|
+
* building an anchored character-class regex (which can exhibit polynomial
|
|
54
|
+
* matching on adversarial input) by scanning backward from the end with
|
|
55
|
+
* simple index arithmetic instead.
|
|
56
|
+
*/
|
|
57
|
+
export function trimTrailingCharsIn(value, chars) {
|
|
58
|
+
const allowed = new Set();
|
|
59
|
+
for (let i = 0; i < chars.length; i += 1) {
|
|
60
|
+
allowed.add(chars.charCodeAt(i));
|
|
61
|
+
}
|
|
62
|
+
let end = value.length;
|
|
63
|
+
while (end > 0 && allowed.has(value.charCodeAt(end - 1))) {
|
|
64
|
+
end -= 1;
|
|
65
|
+
}
|
|
66
|
+
return end === value.length ? value : value.slice(0, end);
|
|
67
|
+
}
|
|
49
68
|
/**
|
|
50
69
|
* Return `value` with any `?query` and `#fragment` suffix removed.
|
|
51
70
|
*
|
|
@@ -66,6 +66,7 @@ export interface HonuaProtocolTransport {
|
|
|
66
66
|
*/
|
|
67
67
|
pipelineFetch(method: QueryMethod, path: string, init?: RequestInit, callerSignal?: AbortSignal, options?: {
|
|
68
68
|
okStatuses?: readonly number[];
|
|
69
|
+
redirect?: "safe-follow" | "error";
|
|
69
70
|
}): Promise<Response>;
|
|
70
71
|
/**
|
|
71
72
|
* Request a PBF binary response and decode it, transparently falling back to
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol-transport.d.ts","sourceRoot":"","sources":["../../../src/core/protocol-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB;;;;OAIG;IACH,WAAW,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAElH;;;OAGG;IACH,WAAW,CACT,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,QAAQ,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GACzF,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAElE;;;OAGG;IACH,YAAY,CACV,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,IAAI,CAAC,EAAE,WAAW,EAClB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC;QAAE,KAAK,EAAE,UAAU,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAEvE;;;OAGG;IACH,yBAAyB,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAEhH;;;OAGG;IACH,aAAa,CACX,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,WAAW,EAClB,YAAY,CAAC,EAAE,WAAW,EAC1B,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,
|
|
1
|
+
{"version":3,"file":"protocol-transport.d.ts","sourceRoot":"","sources":["../../../src/core/protocol-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB;;;;OAIG;IACH,WAAW,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAElH;;;OAGG;IACH,WAAW,CACT,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,QAAQ,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GACzF,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAElE;;;OAGG;IACH,YAAY,CACV,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,IAAI,CAAC,EAAE,WAAW,EAClB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC;QAAE,KAAK,EAAE,UAAU,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAEvE;;;OAGG;IACH,yBAAyB,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAEhH;;;OAGG;IACH,aAAa,CACX,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,WAAW,EAClB,YAAY,CAAC,EAAE,WAAW,EAC1B,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,aAAa,GAAG,OAAO,CAAA;KAAE,GAC/E,OAAO,CAAC,QAAQ,CAAC,CAAC;IAErB;;;OAGG;IACH,6BAA6B,CAAC,CAAC,GAAG,OAAO,EACvC,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,eAAe,EACvB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,CAAC,CAAC,CAAC;CACf"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-pipeline.d.ts","sourceRoot":"","sources":["../../../src/core/request-pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,cAAc,EAAwC,MAAM,aAAa,CAAC;AACpG,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEjE;;;;;;;GAOG;AAEH,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACpC;AAED,eAAO,MAAM,sBAAsB,EAAE,WAAW,CAAC,MAAM,CAAiC,CAAC;AACzF,eAAO,MAAM,qBAAqB,EAAE,WAAW,CAAC,WAAW,
|
|
1
|
+
{"version":3,"file":"request-pipeline.d.ts","sourceRoot":"","sources":["../../../src/core/request-pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,cAAc,EAAwC,MAAM,aAAa,CAAC;AACpG,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEjE;;;;;;;GAOG;AAEH,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACpC;AAED,eAAO,MAAM,sBAAsB,EAAE,WAAW,CAAC,MAAM,CAAiC,CAAC;AACzF,eAAO,MAAM,qBAAqB,EAAE,WAAW,CAAC,WAAW,CAA6C,CAAC;AAEzG,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAKpF;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,iBAAiB,GAAG,SAAS,GAAG,sBAAsB,GAAG,SAAS,CAsChH;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM,GAAG,SAAS,CAgBzF;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,CAExE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,sBAAsB,GAAG,SAAS,EAChD,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,KAAK,EAAE,OAAO,GACb,OAAO,CAkBT;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,sBAAsB,GAAG,SAAS,EAChD,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,QAAQ,GAClB,MAAM,CAWR;AAED;;;;;;GAMG;AACH,eAAO,MAAM,4BAA4B,EAAE,WAAW,CAAC,MAAM,CAK3D,CAAC;AAKH;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAUnE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,sBAAsB,GAAG,SAAS,EAChD,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,OAAO,GACf,OAAO,CAYT;AAYD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,sBAAsB,GAAG,SAAS,EAChD,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,OAAO,GACb,MAAM,CAOR;AAED,wBAAsB,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAkB3E;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,CAQ3D;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC;IAChC,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,wBAAgB,mBAAmB,CACjC,cAAc,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,EAC9C,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,aAAa,CA8Cf;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,cAAc,CAgB7E"}
|
package/core/request-pipeline.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { HonuaAbortError, HonuaHttpError, HonuaNetworkError, HonuaTimeoutError } from "./errors.js";
|
|
2
2
|
export const DEFAULT_RETRY_STATUSES = new Set([429, 502, 503, 504]);
|
|
3
|
-
export const DEFAULT_RETRY_METHODS = new Set(["GET", "PUT", "DELETE"]);
|
|
3
|
+
export const DEFAULT_RETRY_METHODS = new Set(["GET", "HEAD", "PUT", "DELETE"]);
|
|
4
4
|
export function normalizeTimeoutMs(timeoutMs) {
|
|
5
5
|
if (typeof timeoutMs !== "number" || !Number.isFinite(timeoutMs)) {
|
|
6
6
|
return undefined;
|
package/core/spatial-filter.d.ts
CHANGED
|
@@ -45,8 +45,12 @@ export declare function point(x: number, y: number, spatialReference?: HonuaSpat
|
|
|
45
45
|
*/
|
|
46
46
|
export declare function polygon(rings: number[][][], spatialReference?: HonuaSpatialReference): SpatialFilter;
|
|
47
47
|
/**
|
|
48
|
-
* Create an envelope spatial filter centered on a point
|
|
49
|
-
*
|
|
48
|
+
* Create an axis-aligned envelope spatial filter centered on a point.
|
|
49
|
+
*
|
|
50
|
+
* This is a planar expansion in the input coordinate system's units. It is an
|
|
51
|
+
* envelope approximation, not a circular, geodesic, or topological geometry
|
|
52
|
+
* buffer. Use `buffer` from `@honua/sdk-js/geometry` when a true geometry
|
|
53
|
+
* buffer is required.
|
|
50
54
|
*
|
|
51
55
|
* @param x - Center x coordinate
|
|
52
56
|
* @param y - Center y coordinate
|
|
@@ -58,11 +62,11 @@ export declare function polygon(rings: number[][][], spatialReference?: HonuaSpa
|
|
|
58
62
|
* // 0.5-degree bounding box around a point
|
|
59
63
|
* const req: QueryFeaturesRequest = {
|
|
60
64
|
* serviceId: "svc", layerId: 0,
|
|
61
|
-
* ...
|
|
65
|
+
* ...bufferEnvelope(-118.24, 34.05, 0.5),
|
|
62
66
|
* };
|
|
63
67
|
* ```
|
|
64
68
|
*/
|
|
65
|
-
export declare function
|
|
69
|
+
export declare function bufferEnvelope(x: number, y: number, distance: number, spatialReference?: HonuaSpatialReference): SpatialFilter;
|
|
66
70
|
/**
|
|
67
71
|
* Wrap an existing geometry with `esriSpatialRelIntersects`.
|
|
68
72
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spatial-filter.d.ts","sourceRoot":"","sources":["../../../src/core/spatial-filter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"spatial-filter.d.ts","sourceRoot":"","sources":["../../../src/core/spatial-filter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAE1F;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,YAAY,EAAE,gBAAgB,CAAC;IAC/B,UAAU,CAAC,EAAE,cAAc,CAAC;CAC7B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,gBAAgB,CAAC,EAAE,qBAAqB,GACvC,aAAa,CAQf;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,qBAAqB,GAAG,aAAa,CAQnG;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,gBAAgB,CAAC,EAAE,qBAAqB,GAAG,aAAa,CAQpG;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,cAAc,CAC5B,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,QAAQ,EAAE,MAAM,EAChB,gBAAgB,CAAC,EAAE,qBAAqB,GACvC,aAAa,CAuBf;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,aAAa,CAMlF;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,aAAa,CAMhF;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,aAAa,CAM9E"}
|
package/core/spatial-filter.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { HonuaGeometryError } from "./errors.js";
|
|
1
2
|
/**
|
|
2
3
|
* Create an envelope (bounding box) spatial filter.
|
|
3
4
|
*
|
|
@@ -62,8 +63,12 @@ export function polygon(rings, spatialReference) {
|
|
|
62
63
|
};
|
|
63
64
|
}
|
|
64
65
|
/**
|
|
65
|
-
* Create an envelope spatial filter centered on a point
|
|
66
|
-
*
|
|
66
|
+
* Create an axis-aligned envelope spatial filter centered on a point.
|
|
67
|
+
*
|
|
68
|
+
* This is a planar expansion in the input coordinate system's units. It is an
|
|
69
|
+
* envelope approximation, not a circular, geodesic, or topological geometry
|
|
70
|
+
* buffer. Use `buffer` from `@honua/sdk-js/geometry` when a true geometry
|
|
71
|
+
* buffer is required.
|
|
67
72
|
*
|
|
68
73
|
* @param x - Center x coordinate
|
|
69
74
|
* @param y - Center y coordinate
|
|
@@ -75,12 +80,25 @@ export function polygon(rings, spatialReference) {
|
|
|
75
80
|
* // 0.5-degree bounding box around a point
|
|
76
81
|
* const req: QueryFeaturesRequest = {
|
|
77
82
|
* serviceId: "svc", layerId: 0,
|
|
78
|
-
* ...
|
|
83
|
+
* ...bufferEnvelope(-118.24, 34.05, 0.5),
|
|
79
84
|
* };
|
|
80
85
|
* ```
|
|
81
86
|
*/
|
|
82
|
-
export function
|
|
83
|
-
|
|
87
|
+
export function bufferEnvelope(x, y, distance, spatialReference) {
|
|
88
|
+
if (![x, y, distance].every(isFiniteNumber) || distance < 0) {
|
|
89
|
+
throw new HonuaGeometryError("malformed-geometry", "Cannot create a buffer envelope: x, y, and distance must be finite numbers and distance must be non-negative", {
|
|
90
|
+
operation: "buffer-envelope",
|
|
91
|
+
reason: "invalid-coordinate-or-distance",
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
const bounds = [x - distance, y - distance, x + distance, y + distance];
|
|
95
|
+
if (!bounds.every(isFiniteNumber)) {
|
|
96
|
+
throw new HonuaGeometryError("malformed-geometry", "Cannot create a buffer envelope: computed bounds must be finite", {
|
|
97
|
+
operation: "buffer-envelope",
|
|
98
|
+
reason: "computed-bounds-not-finite",
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
return envelope(...bounds, spatialReference);
|
|
84
102
|
}
|
|
85
103
|
/**
|
|
86
104
|
* Wrap an existing geometry with `esriSpatialRelIntersects`.
|
|
@@ -131,23 +149,195 @@ export function spatialWithin(geometry) {
|
|
|
131
149
|
* Detect the Esri geometry type from a plain geometry object by inspecting
|
|
132
150
|
* its shape (duck-typing).
|
|
133
151
|
*
|
|
152
|
+
* @see https://developers.arcgis.com/rest/services-reference/enterprise/geometry-objects/
|
|
134
153
|
* @internal
|
|
135
154
|
*/
|
|
136
155
|
function detectGeometryType(geometry) {
|
|
137
|
-
if (
|
|
138
|
-
|
|
156
|
+
if (!isGeometryRecord(geometry)) {
|
|
157
|
+
throw new HonuaGeometryError("malformed-geometry", "Unable to classify geometry: geometry must be a non-null object", {
|
|
158
|
+
operation: "classify",
|
|
159
|
+
reason: "geometry-must-be-object",
|
|
160
|
+
keys: [],
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
const keys = Object.keys(geometry).sort();
|
|
164
|
+
const candidates = [
|
|
165
|
+
hasAnyOwn(geometry, ["xmin", "ymin", "xmax", "ymax"]) ? "envelope" : undefined,
|
|
166
|
+
hasOwn(geometry, "rings") ? "polygon" : undefined,
|
|
167
|
+
hasOwn(geometry, "paths") ? "polyline" : undefined,
|
|
168
|
+
hasOwn(geometry, "points") ? "multipoint" : undefined,
|
|
169
|
+
hasAnyOwn(geometry, ["x", "y"]) ? "point" : undefined,
|
|
170
|
+
].filter((candidate) => candidate !== undefined);
|
|
171
|
+
if (candidates.length === 0) {
|
|
172
|
+
throw geometryClassificationError("unknown-geometry", "no supported Esri geometry shape was found", keys);
|
|
173
|
+
}
|
|
174
|
+
if (candidates.length > 1) {
|
|
175
|
+
throw geometryClassificationError("malformed-geometry", `geometry contains conflicting shape discriminators: ${candidates.join(", ")}`, keys);
|
|
176
|
+
}
|
|
177
|
+
const candidate = candidates[0];
|
|
178
|
+
switch (candidate) {
|
|
179
|
+
case "envelope":
|
|
180
|
+
assertEnvelope(geometry, keys);
|
|
181
|
+
return "esriGeometryEnvelope";
|
|
182
|
+
case "polygon":
|
|
183
|
+
assertParts(geometry, "rings", "polygon", 4, true, keys);
|
|
184
|
+
return "esriGeometryPolygon";
|
|
185
|
+
case "polyline":
|
|
186
|
+
assertParts(geometry, "paths", "polyline", 2, false, keys);
|
|
187
|
+
return "esriGeometryPolyline";
|
|
188
|
+
case "multipoint":
|
|
189
|
+
assertPositions(geometry, keys);
|
|
190
|
+
return "esriGeometryMultipoint";
|
|
191
|
+
case "point":
|
|
192
|
+
assertPoint(geometry, keys);
|
|
193
|
+
return "esriGeometryPoint";
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
function isGeometryRecord(value) {
|
|
197
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
198
|
+
}
|
|
199
|
+
function hasOwn(value, key) {
|
|
200
|
+
return Object.prototype.hasOwnProperty.call(value, key);
|
|
201
|
+
}
|
|
202
|
+
function hasAnyOwn(value, keys) {
|
|
203
|
+
return keys.some((key) => hasOwn(value, key));
|
|
204
|
+
}
|
|
205
|
+
function isFiniteNumber(value) {
|
|
206
|
+
return typeof value === "number" && Number.isFinite(value);
|
|
207
|
+
}
|
|
208
|
+
function assertPoint(geometry, keys) {
|
|
209
|
+
if (hasOwn(geometry, "x") && geometry.x === null) {
|
|
210
|
+
assertEmptyMembers(geometry, ["y", "z", "m", "id"], "point", keys);
|
|
211
|
+
return;
|
|
139
212
|
}
|
|
140
|
-
if (
|
|
141
|
-
|
|
213
|
+
if (!isFiniteNumber(geometry.x) || !isFiniteNumber(geometry.y)) {
|
|
214
|
+
throw geometryClassificationError("malformed-geometry", "point requires finite numeric x and y coordinates", keys, "point");
|
|
215
|
+
}
|
|
216
|
+
assertOptionalFiniteMember(geometry, "z", "point", keys);
|
|
217
|
+
assertOptionalFiniteMember(geometry, "m", "point", keys, true);
|
|
218
|
+
assertOptionalFiniteMember(geometry, "id", "point", keys);
|
|
219
|
+
}
|
|
220
|
+
function assertEnvelope(geometry, keys) {
|
|
221
|
+
if (hasOwn(geometry, "xmin") && geometry.xmin === null) {
|
|
222
|
+
assertEmptyMembers(geometry, ["ymin", "xmax", "ymax", "zmin", "zmax", "mmin", "mmax", "idmin", "idmax"], "envelope", keys);
|
|
223
|
+
return;
|
|
142
224
|
}
|
|
143
|
-
|
|
144
|
-
|
|
225
|
+
const { xmin, ymin, xmax, ymax } = geometry;
|
|
226
|
+
if (![xmin, ymin, xmax, ymax].every(isFiniteNumber)) {
|
|
227
|
+
throw geometryClassificationError("malformed-geometry", "envelope requires finite numeric xmin, ymin, xmax, and ymax coordinates", keys, "envelope");
|
|
145
228
|
}
|
|
146
|
-
if (
|
|
147
|
-
|
|
229
|
+
if (xmin > xmax || ymin > ymax) {
|
|
230
|
+
throw geometryClassificationError("malformed-geometry", "envelope minimum coordinates must not exceed maximum coordinates", keys, "envelope");
|
|
148
231
|
}
|
|
149
|
-
|
|
150
|
-
|
|
232
|
+
assertOptionalBounds(geometry, "zmin", "zmax", "envelope", keys);
|
|
233
|
+
assertOptionalBounds(geometry, "mmin", "mmax", "envelope", keys);
|
|
234
|
+
assertOptionalBounds(geometry, "idmin", "idmax", "envelope", keys);
|
|
235
|
+
}
|
|
236
|
+
function assertPositions(geometry, keys) {
|
|
237
|
+
const value = geometry.points;
|
|
238
|
+
if (!Array.isArray(value)) {
|
|
239
|
+
throw geometryClassificationError("malformed-geometry", "multipoint points must be an array of coordinate positions", keys, "multipoint");
|
|
240
|
+
}
|
|
241
|
+
const dimensions = geometryDimensions(geometry, "multipoint", keys);
|
|
242
|
+
for (const position of value) {
|
|
243
|
+
// ArcGIS permits empty point slots in multipoints and ignores them during
|
|
244
|
+
// spatial evaluation. Preserve that wire-compatible behavior while still
|
|
245
|
+
// rejecting every non-empty malformed position.
|
|
246
|
+
if (Array.isArray(position) && position.length === 0)
|
|
247
|
+
continue;
|
|
248
|
+
assertPosition(position, dimensions, "multipoint", keys);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
function assertParts(geometry, property, shape, minimumPositions, requireClosure, keys) {
|
|
252
|
+
const value = geometry[property];
|
|
253
|
+
if (!Array.isArray(value)) {
|
|
254
|
+
throw geometryClassificationError("malformed-geometry", `${shape} ${property} must be an array of coordinate arrays`, keys, shape);
|
|
151
255
|
}
|
|
152
|
-
|
|
256
|
+
const dimensions = geometryDimensions(geometry, shape, keys);
|
|
257
|
+
for (const part of value) {
|
|
258
|
+
if (!Array.isArray(part)) {
|
|
259
|
+
throw geometryClassificationError("malformed-geometry", `${shape} ${property} must contain coordinate arrays`, keys, shape);
|
|
260
|
+
}
|
|
261
|
+
// The REST empty sentinel is an empty outer paths/rings array. Empty inner
|
|
262
|
+
// parts are not canonical and cannot be mixed with populated parts.
|
|
263
|
+
if (part.length < minimumPositions) {
|
|
264
|
+
throw geometryClassificationError("malformed-geometry", `${shape} ${property} parts require at least ${minimumPositions} positions`, keys, shape);
|
|
265
|
+
}
|
|
266
|
+
for (const position of part)
|
|
267
|
+
assertPosition(position, dimensions, shape, keys);
|
|
268
|
+
if (requireClosure) {
|
|
269
|
+
const first = part[0];
|
|
270
|
+
const last = part[part.length - 1];
|
|
271
|
+
if (first[0] !== last[0] || first[1] !== last[1]) {
|
|
272
|
+
throw geometryClassificationError("malformed-geometry", `${shape} ${property} parts must be closed`, keys, shape);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
function geometryDimensions(geometry, shape, keys) {
|
|
278
|
+
return {
|
|
279
|
+
hasZ: geometryBooleanFlag(geometry, "hasZ", shape, keys),
|
|
280
|
+
hasM: geometryBooleanFlag(geometry, "hasM", shape, keys),
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
function geometryBooleanFlag(geometry, property, shape, keys) {
|
|
284
|
+
if (!hasOwn(geometry, property))
|
|
285
|
+
return false;
|
|
286
|
+
if (typeof geometry[property] !== "boolean") {
|
|
287
|
+
throw geometryClassificationError("malformed-geometry", `${shape} ${property} must be a boolean when present`, keys, shape);
|
|
288
|
+
}
|
|
289
|
+
return geometry[property];
|
|
290
|
+
}
|
|
291
|
+
function assertPosition(value, dimensions, shape, keys) {
|
|
292
|
+
const minimumArity = dimensions.hasZ ? 3 : 2;
|
|
293
|
+
const maximumArity = minimumArity + (dimensions.hasM ? 1 : 0);
|
|
294
|
+
if (!Array.isArray(value) || value.length < minimumArity || value.length > maximumArity || value.length > 4) {
|
|
295
|
+
throw geometryClassificationError("malformed-geometry", `${shape} positions must match declared hasZ/hasM dimensions and contain at most four ordinates`, keys, shape);
|
|
296
|
+
}
|
|
297
|
+
if (!isFiniteNumber(value[0]) || !isFiniteNumber(value[1])) {
|
|
298
|
+
throw geometryClassificationError("malformed-geometry", `${shape} positions require finite numeric x and y ordinates`, keys, shape);
|
|
299
|
+
}
|
|
300
|
+
if (dimensions.hasZ && !isFiniteNumber(value[2])) {
|
|
301
|
+
throw geometryClassificationError("malformed-geometry", `${shape} positions require a finite z ordinate when hasZ is true`, keys, shape);
|
|
302
|
+
}
|
|
303
|
+
if (dimensions.hasM && value.length === maximumArity) {
|
|
304
|
+
const measure = value[maximumArity - 1];
|
|
305
|
+
if (measure !== null && !isFiniteNumber(measure)) {
|
|
306
|
+
throw geometryClassificationError("malformed-geometry", `${shape} m ordinates must be finite numbers, null, or omitted`, keys, shape);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
function assertEmptyMembers(geometry, members, shape, keys) {
|
|
311
|
+
const contradictory = members.filter((member) => hasOwn(geometry, member) && geometry[member] !== null);
|
|
312
|
+
if (contradictory.length > 0) {
|
|
313
|
+
throw geometryClassificationError("malformed-geometry", `${shape} empty sentinel conflicts with non-null members: ${contradictory.join(", ")}`, keys, shape);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
function assertOptionalFiniteMember(geometry, property, shape, keys, allowNull = false) {
|
|
317
|
+
if (!hasOwn(geometry, property))
|
|
318
|
+
return;
|
|
319
|
+
const value = geometry[property];
|
|
320
|
+
if ((allowNull && value === null) || isFiniteNumber(value))
|
|
321
|
+
return;
|
|
322
|
+
const expectation = allowNull ? "a finite number or null" : "a finite number";
|
|
323
|
+
throw geometryClassificationError("malformed-geometry", `${shape} ${property} must be ${expectation} when present`, keys, shape);
|
|
324
|
+
}
|
|
325
|
+
function assertOptionalBounds(geometry, minimumProperty, maximumProperty, shape, keys) {
|
|
326
|
+
const hasMinimum = hasOwn(geometry, minimumProperty);
|
|
327
|
+
const hasMaximum = hasOwn(geometry, maximumProperty);
|
|
328
|
+
if (!hasMinimum && !hasMaximum)
|
|
329
|
+
return;
|
|
330
|
+
const minimum = geometry[minimumProperty];
|
|
331
|
+
const maximum = geometry[maximumProperty];
|
|
332
|
+
if (!hasMinimum || !hasMaximum || !isFiniteNumber(minimum) || !isFiniteNumber(maximum) || minimum > maximum) {
|
|
333
|
+
throw geometryClassificationError("malformed-geometry", `envelope ${minimumProperty}/${maximumProperty} must be a complete ordered pair of finite numbers`, keys, shape);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
function geometryClassificationError(code, reason, keys, shape) {
|
|
337
|
+
return new HonuaGeometryError(code, `Unable to classify geometry: ${reason}`, {
|
|
338
|
+
operation: "classify",
|
|
339
|
+
reason,
|
|
340
|
+
keys,
|
|
341
|
+
...(shape === undefined ? {} : { shape }),
|
|
342
|
+
});
|
|
153
343
|
}
|
package/core/stac-static.d.ts
CHANGED
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
*
|
|
16
16
|
* @module
|
|
17
17
|
*/
|
|
18
|
+
import type { SourceLocator } from "../contract/types.js";
|
|
18
19
|
import type { HonuaClient } from "./client.js";
|
|
19
20
|
import type { HonuaStacItemCollectionResponse } from "./types.js";
|
|
20
21
|
/** Bounded search parameters for a static catalog traversal. */
|
|
@@ -34,7 +35,8 @@ export interface StacStaticSearchParams {
|
|
|
34
35
|
export declare class HonuaStacStaticCatalog {
|
|
35
36
|
readonly client: HonuaClient;
|
|
36
37
|
private readonly rootUrl;
|
|
37
|
-
|
|
38
|
+
private readonly policy;
|
|
39
|
+
constructor(client: HonuaClient, rootUrl?: string, policy?: SourceLocator["stacStatic"]);
|
|
38
40
|
/**
|
|
39
41
|
* Traverse the catalog tree, collect matching items, and return them in
|
|
40
42
|
* the STAC search envelope shape.
|
|
@@ -44,7 +46,9 @@ export declare class HonuaStacStaticCatalog {
|
|
|
44
46
|
/**
|
|
45
47
|
* Breadth-first walk collecting item documents. Descends `rel="child"`
|
|
46
48
|
* links; a `collections` filter prunes Collection subtrees whose `id`
|
|
47
|
-
* is not requested.
|
|
49
|
+
* is not requested. Every attempted document, traversal depth, per-document
|
|
50
|
+
* link list, response body, redirect, and origin is bounded by the locator's
|
|
51
|
+
* admitted policy.
|
|
48
52
|
*/
|
|
49
53
|
private collectItems;
|
|
50
54
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stac-static.d.ts","sourceRoot":"","sources":["../../../src/core/stac-static.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,KAAK,EAAE,+BAA+B,EAAyB,MAAM,YAAY,CAAC;AAEzF,gEAAgE;AAChE,MAAM,WAAW,sBAAsB;IACrC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,IAAI,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;
|
|
1
|
+
{"version":3,"file":"stac-static.d.ts","sourceRoot":"","sources":["../../../src/core/stac-static.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,KAAK,EAAE,+BAA+B,EAAyB,MAAM,YAAY,CAAC;AAEzF,gEAAgE;AAChE,MAAM,WAAW,sBAAsB;IACrC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,IAAI,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AA6CD;;;;;GAKG;AACH,qBAAa,sBAAsB;IACjC,SAAgB,MAAM,EAAE,WAAW,CAAC;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;gBAE7B,MAAM,EAAE,WAAW,EAAE,OAAO,SAAK,EAAE,MAAM,CAAC,EAAE,aAAa,CAAC,YAAY,CAAC;IAM1F;;;OAGG;IACU,MAAM,CAAC,MAAM,GAAE,sBAA2B,GAAG,OAAO,CAAC,+BAA+B,CAAC;YAcpF,QAAQ;IA0BtB;;;;;;OAMG;YACW,YAAY;CAkE3B"}
|