@open-pioneer/map 1.0.0-dev.20251020091932 → 1.0.0-dev.20251021074813

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/CHANGELOG.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @open-pioneer/map
2
2
 
3
- ## 1.0.0-dev.20251020091932
3
+ ## 1.0.0-dev.20251021074813
4
4
 
5
5
  ### Major Changes
6
6
 
@@ -24,11 +24,22 @@
24
24
  The described behavior is aligned for the functions `getItems()`, `getLayers()`, `getAllLayers()` and `getRecursiveLayers()` in `LayerCollection`, `WMSLayer` and `GroupLayer`.
25
25
  The function `getRecursiveLayers()` does not return non-internal child layers of an internal layer.
26
26
 
27
- - b3709f1: **Breaking:** Remove old event API from layer types and the map model. These were only used for the `"destroy"` event.
27
+ - b3709f1: **Breaking:** Remove old event API from layer types and the map model.
28
+
29
+ These were only used for the `"destroy"` event.
30
+
31
+ ```ts
32
+ // OLD, removed API:
33
+ const layer = ...;
34
+ layer.on("destroyed", () => {
35
+ console.debug("layer was destroyed");
36
+ });
37
+ ```
28
38
 
29
39
  The destroy event still exists, but is now based on the event system of the [reactivity API](https://github.com/conterra/reactivity/tree/main/packages/reactivity-events):
30
40
 
31
41
  ```ts
42
+ // NEW
32
43
  import { on } from "@conterra/reactivity-events";
33
44
 
34
45
  const layer = ...;
@@ -42,10 +53,44 @@
42
53
  });
43
54
  ```
44
55
 
56
+ - a1614de: **Breaking**: Remove support for `mapId` in all React components.
57
+
58
+ To configure the map for a component (for example: `Legend`), either pass the `map`
59
+ as an explicit parameter or use the `DefaultMapProvider`:
60
+
61
+ ```ts
62
+ // Explicit API
63
+ <Legend map={map} />
64
+
65
+ // All children of the DefaultMapProvider can use the configured map
66
+ <DefaultMapProvider map={map}>
67
+ <MapContainer />
68
+ <Legend />
69
+ <SomeOtherComponent />
70
+ </DefaultMapProvider>;
71
+ ```
72
+
73
+ Support for `mapId` was removed in [PR #486](https://github.com/open-pioneer/trails-openlayers-base-packages/pull/486).
74
+
45
75
  ### Minor Changes
46
76
 
77
+ - 29a10df: Support buffer for zoom geometries.
78
+ Use the `buffer` option to specify the size increase. E.g. `0.1` for 10% size increase.
79
+
80
+ We use the already existing `calculateBufferedExtent` function to compute the buffer.
81
+
82
+ For example:
83
+
84
+ ```ts
85
+ const map: MapModel = ...;
86
+ const highlight = map.highlightAndZoom(someGeometries, {
87
+ // Grows extent by 10%
88
+ buffer: 0.1
89
+ });
90
+ ```
91
+
47
92
  - 2702df4: Introduce `internal` property for all layer types (including sublayers).
48
- If `internal` is `true` (default: `false`) the layer is not considered by any UI widget (e.g. legend and Toc).
93
+ If `internal` is `true` (default: `false`) the layer is not considered by any UI widget (e.g. Legend and Toc).
49
94
  The `internal` state of a layer is not to be confused with the layer's visibility on the map which is determined by the `visible` property.
50
95
 
51
96
  ```typescript
@@ -155,7 +200,7 @@
155
200
  }
156
201
  ```
157
202
 
158
- - aeb9000: Add new `"topmost"` option to add layers that are always displayed on the top (above all other layers).
203
+ - aeb9000: Add new `"topmost"` option to add layers that are always displayed on top (above all other layers).
159
204
 
160
205
  A new layers can be added at `topmost` to ensure that this layer will always be displayed on top of the other layers.
161
206
  This can be used, for example, to implement highlights or to draw graphics.
@@ -197,23 +242,9 @@
197
242
  ### Patch Changes
198
243
 
199
244
  - c6180c6: Update eslint to version 9.
200
- - 29a10df: Support buffer for zoom geometries.
201
-
202
- For example:
203
-
204
- ```ts
205
- const map: MapModel = ...;
206
- const highlight = map.highlightAndZoom(someGeometries, {
207
- // Grows extent by 10%
208
- buffer: 0.1
209
- });
210
- ```
211
-
212
245
  - 10d2fe7: Update dependencies
213
246
  - 12561fe: The default value of the `role` prop on the `MapContainer` was changed to `application` to allow map keyboard navigation while using NVDA screen reader.
214
247
  - 8986b3b: Remove obsolete dependency @types/proj4
215
- - dfd7c7e: We use the already existing calculateBufferedExtent instead of the highlights buffer.
216
- Use the `buffer` to specify the size increase. E.g. `1.1` for 10% size increase.
217
248
  - 138d85b: Update core packages to 4.1.0
218
249
  - 2c8b617: Introduce `MapRegistry.createMapModel` method to create a `MapModel` without a `MapConfigProvider`.
219
250
  For more details, see [PR](https://github.com/open-pioneer/trails-openlayers-base-packages/pull/499) and [issue](https://github.com/open-pioneer/trails-openlayers-base-packages/issues/483).
@@ -1,8 +1,8 @@
1
1
  import OlBaseLayer from "ol/layer/Base";
2
2
  import { MapModel } from "../model/MapModel";
3
- import { AbstractLayerBase } from "./AbstractLayerBase";
4
- import { LayerDependencies, SET_VISIBLE, ATTACH_TO_MAP, GET_DEPS } from "./shared/internals";
5
3
  import { InternalConstructorTag } from "../utils/InternalConstructorTag";
4
+ import { AbstractLayerBase } from "./AbstractLayerBase";
5
+ import { ATTACH_TO_MAP, GET_DEPS, LayerDependencies, SET_VISIBLE } from "./shared/internals";
6
6
  import { SimpleLayerConfig } from "./SimpleLayer";
7
7
  import { LayerTypes } from "./unions";
8
8
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"AbstractLayer.js","sources":["AbstractLayer.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { reactive, Reactive, ReadonlyReactive, synchronized } from \"@conterra/reactivity-core\";\nimport { createLogger, destroyResource, Resource } from \"@open-pioneer/core\";\nimport { EventsKey } from \"ol/events\";\nimport OlBaseLayer from \"ol/layer/Base\";\nimport OlLayer from \"ol/layer/Layer\";\nimport { unByKey } from \"ol/Observable\";\nimport OlSource from \"ol/source/Source\";\nimport { MapModel } from \"../model/MapModel\";\nimport { AbstractLayerBase } from \"./AbstractLayerBase\";\nimport {\n getLayerDependencies,\n LayerDependencies,\n LAYER_DEPS,\n SET_VISIBLE,\n ATTACH_TO_MAP,\n GET_DEPS\n} from \"./shared/internals\";\nimport { InternalConstructorTag } from \"../utils/InternalConstructorTag\";\nimport { HealthCheckFunction, LayerConfig } from \"./shared/LayerConfig\";\nimport { SimpleLayerConfig } from \"./SimpleLayer\";\nimport { Layer, LayerTypes } from \"./unions\";\n\n// Imported for typedoc\n// eslint-disable-next-line unused-imports/no-unused-imports\nimport { SimpleLayer } from \"./SimpleLayer\";\n\nconst LOG = createLogger(\"map:AbstractLayer\");\n\n/**\n * The load state of a layer.\n *\n * @group Layer Utilities\n **/\nexport type LayerLoadState = \"not-loaded\" | \"loading\" | \"loaded\" | \"error\";\n\n/**\n * Represents an operational layer in the map.\n *\n * These layers always have an associated OpenLayers layer.\n *\n * Instances of this interface cannot be constructed directly; use a real layer\n * class such as {@link SimpleLayer} instead.\n *\n * @group Layers\n */\nexport abstract class AbstractLayer extends AbstractLayerBase {\n // Layer dependencies are present when the LayerFactory API was used to construct the layer.\n // They may currently be undefined for compatibility reasons (in which case they will be used\n // from the map, once connected).\n #deps: LayerDependencies | undefined;\n #olLayer: OlBaseLayer;\n #isBaseLayer: boolean;\n #healthCheck?: string | HealthCheckFunction;\n\n #visible: ReadonlyReactive<boolean>;\n #loadState: Reactive<LayerLoadState>;\n\n #stateWatchResource: Resource | undefined;\n\n constructor(\n config: SimpleLayerConfig,\n deps?: LayerDependencies,\n internalTag?: InternalConstructorTag\n ) {\n super(config);\n this.#deps = getLayerDependencies(deps, internalTag);\n this.#olLayer = config.olLayer;\n this.#isBaseLayer = config.isBaseLayer ?? false;\n this.#healthCheck = config.healthCheck;\n this.#visible = synchronized(\n () => this.#olLayer.getVisible(),\n (cb) => {\n const key = this.#olLayer.on(\"change:visible\", cb);\n return () => unByKey(key);\n }\n );\n this.#loadState = reactive(getSourceState(getSource(this.#olLayer)));\n\n this[SET_VISIBLE](config.visible ?? true); // apply initial visibility\n }\n\n override destroy() {\n if (this.isDestroyed) {\n return;\n }\n\n this.#stateWatchResource = destroyResource(this.#stateWatchResource);\n this.olLayer.dispose();\n super.destroy();\n }\n\n /**\n * Identifies the type of this layer.\n */\n abstract override readonly type: LayerTypes;\n\n override get visible(): boolean {\n return this.#visible.value;\n }\n\n /**\n * The raw OpenLayers layer.\n */\n get olLayer(): OlBaseLayer {\n return this.#olLayer;\n }\n\n /**\n * True if this layer is a base layer.\n *\n * Only one base layer can be visible at a time.\n */\n get isBaseLayer(): boolean {\n return this.#isBaseLayer;\n }\n\n /**\n * The load state of a layer.\n */\n get loadState(): LayerLoadState {\n return this.#loadState.value;\n }\n\n /**\n * Called by the map model when the layer is added to the map.\n *\n * @internal\n */\n override [ATTACH_TO_MAP](map: MapModel): void {\n super[ATTACH_TO_MAP](map);\n\n if (!this.#stateWatchResource) {\n const { initial: initialState, resource: stateWatchResource } = watchLoadState(\n this,\n this.#healthCheck,\n (state) => {\n this.#loadState.value = state;\n }\n );\n this.#stateWatchResource = stateWatchResource;\n this.#loadState.value = initialState;\n }\n }\n\n override setVisible(newVisibility: boolean): void {\n if (this.isBaseLayer) {\n LOG.warn(\n `Cannot change visibility of base layer '${this.id}': use activateBaseLayer() on the map's LayerCollection instead.`\n );\n return;\n }\n\n this[SET_VISIBLE](newVisibility);\n }\n\n /** @internal */\n [SET_VISIBLE](newVisibility: boolean): void {\n if (this.#olLayer.getVisible() !== newVisibility) {\n this.#olLayer.setVisible(newVisibility);\n }\n }\n\n /** @internal */\n [GET_DEPS](): LayerDependencies {\n const deps = this.#deps;\n if (deps) {\n return deps;\n }\n\n const map = this.nullableMap;\n if (map) {\n return map[LAYER_DEPS];\n }\n throw new Error(\n `Layer '${this.id}' has not been attached to a map yet. \"\n + \"Use the LayerFactory to create an instance or add the layer to the map first.`\n );\n }\n}\n\nfunction watchLoadState(\n layer: AbstractLayer,\n healthCheck: LayerConfig[\"healthCheck\"],\n onChange: (newState: LayerLoadState) => void\n): { initial: LayerLoadState; resource: Resource } {\n const olLayer = layer.olLayer;\n\n if (!(olLayer instanceof OlLayer)) {\n // Some layers don't have a source (such as group)\n return {\n initial: \"loaded\",\n resource: {\n destroy() {\n void 0;\n }\n }\n };\n }\n\n let currentSource = getSource(olLayer);\n const currentOlLayerState = getSourceState(currentSource);\n\n let currentLoadState: LayerLoadState = currentOlLayerState;\n let currentHealthState = \"loading\"; // initial state loading until health check finished\n\n // custom health check not needed when OpenLayers already returning an error state\n if (currentOlLayerState !== \"error\") {\n // health check only once during initialization\n doHealthCheck(layer, healthCheck).then((state: LayerLoadState) => {\n currentHealthState = state;\n updateState();\n });\n }\n\n const updateState = () => {\n const olLayerState = getSourceState(currentSource);\n const nextLoadState: LayerLoadState =\n currentHealthState === \"error\" ? \"error\" : olLayerState;\n\n if (currentLoadState !== nextLoadState) {\n currentLoadState = nextLoadState;\n onChange(currentLoadState);\n }\n };\n\n let stateHandle: EventsKey | undefined;\n stateHandle = currentSource?.on(\"change\", () => {\n updateState();\n });\n\n const sourceHandle = olLayer.on(\"change:source\", () => {\n // unsubscribe from old source\n stateHandle && unByKey(stateHandle);\n stateHandle = undefined;\n\n // subscribe to new source and update state\n currentSource = getSource(olLayer);\n stateHandle = currentSource?.on(\"change\", () => {\n updateState();\n });\n updateState();\n });\n return {\n initial: currentLoadState,\n resource: {\n destroy() {\n stateHandle && unByKey(stateHandle);\n unByKey(sourceHandle);\n }\n }\n };\n}\n\nasync function doHealthCheck(\n layer: AbstractLayer,\n healthCheck: LayerConfig[\"healthCheck\"]\n): Promise<LayerLoadState> {\n if (healthCheck == null) {\n return \"loaded\";\n }\n\n let healthCheckFn: HealthCheckFunction;\n if (typeof healthCheck === \"function\") {\n healthCheckFn = healthCheck;\n } else if (typeof healthCheck === \"string\") {\n healthCheckFn = async () => {\n const httpService = layer[GET_DEPS]().httpService;\n const response = await httpService.fetch(healthCheck);\n if (response.ok) {\n return \"loaded\";\n }\n LOG.warn(\n `Health check failed for layer '${layer.id}' (http status ${response.status})`\n );\n return \"error\";\n };\n } else {\n LOG.error(\n `Unexpected object for 'healthCheck' parameter of layer '${layer.id}'`,\n healthCheck\n );\n return \"error\";\n }\n\n try {\n return await healthCheckFn(layer as Layer);\n } catch (e) {\n LOG.warn(`Health check failed for layer '${layer.id}'`, e);\n return \"error\";\n }\n}\n\nfunction getSource(olLayer: OlLayer | OlBaseLayer) {\n if (!(olLayer instanceof OlLayer)) {\n return undefined;\n }\n return (olLayer?.getSource() as OlSource | null) ?? undefined;\n}\n\nfunction getSourceState(olSource: OlSource | undefined) {\n const state = olSource?.getState();\n switch (state) {\n case undefined:\n return \"loaded\";\n case \"undefined\":\n return \"not-loaded\";\n case \"loading\":\n return \"loading\";\n case \"ready\":\n return \"loaded\";\n case \"error\":\n return \"error\";\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AbstractLayer.js","sources":["AbstractLayer.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { reactive, Reactive, ReadonlyReactive, synchronized } from \"@conterra/reactivity-core\";\nimport { createLogger, destroyResource, Resource } from \"@open-pioneer/core\";\nimport { EventsKey } from \"ol/events\";\nimport OlBaseLayer from \"ol/layer/Base\";\nimport OlLayer from \"ol/layer/Layer\";\nimport { unByKey } from \"ol/Observable\";\nimport OlSource from \"ol/source/Source\";\nimport { MapModel } from \"../model/MapModel\";\nimport { InternalConstructorTag } from \"../utils/InternalConstructorTag\";\nimport { AbstractLayerBase } from \"./AbstractLayerBase\";\nimport {\n ATTACH_TO_MAP,\n GET_DEPS,\n getLayerDependencies,\n LAYER_DEPS,\n LayerDependencies,\n SET_VISIBLE\n} from \"./shared/internals\";\nimport { HealthCheckFunction, LayerConfig } from \"./shared/LayerConfig\";\nimport { SimpleLayer, SimpleLayerConfig } from \"./SimpleLayer\";\nimport { Layer, LayerTypes } from \"./unions\";\n\nconst LOG = createLogger(\"map:AbstractLayer\");\n\n/**\n * The load state of a layer.\n *\n * @group Layer Utilities\n **/\nexport type LayerLoadState = \"not-loaded\" | \"loading\" | \"loaded\" | \"error\";\n\n/**\n * Represents an operational layer in the map.\n *\n * These layers always have an associated OpenLayers layer.\n *\n * Instances of this interface cannot be constructed directly; use a real layer\n * class such as {@link SimpleLayer} instead.\n *\n * @group Layers\n */\nexport abstract class AbstractLayer extends AbstractLayerBase {\n // Layer dependencies are present when the LayerFactory API was used to construct the layer.\n // They may currently be undefined for compatibility reasons (in which case they will be used\n // from the map, once connected).\n #deps: LayerDependencies | undefined;\n #olLayer: OlBaseLayer;\n #isBaseLayer: boolean;\n #healthCheck?: string | HealthCheckFunction;\n\n #visible: ReadonlyReactive<boolean>;\n #loadState: Reactive<LayerLoadState>;\n\n #stateWatchResource: Resource | undefined;\n\n constructor(\n config: SimpleLayerConfig,\n deps?: LayerDependencies,\n internalTag?: InternalConstructorTag\n ) {\n super(config);\n this.#deps = getLayerDependencies(deps, internalTag);\n this.#olLayer = config.olLayer;\n this.#isBaseLayer = config.isBaseLayer ?? false;\n this.#healthCheck = config.healthCheck;\n this.#visible = synchronized(\n () => this.#olLayer.getVisible(),\n (cb) => {\n const key = this.#olLayer.on(\"change:visible\", cb);\n return () => unByKey(key);\n }\n );\n this.#loadState = reactive(getSourceState(getSource(this.#olLayer)));\n\n this[SET_VISIBLE](config.visible ?? true); // apply initial visibility\n }\n\n override destroy() {\n if (this.isDestroyed) {\n return;\n }\n\n this.#stateWatchResource = destroyResource(this.#stateWatchResource);\n this.olLayer.dispose();\n super.destroy();\n }\n\n /**\n * Identifies the type of this layer.\n */\n abstract override readonly type: LayerTypes;\n\n override get visible(): boolean {\n return this.#visible.value;\n }\n\n /**\n * The raw OpenLayers layer.\n */\n get olLayer(): OlBaseLayer {\n return this.#olLayer;\n }\n\n /**\n * True if this layer is a base layer.\n *\n * Only one base layer can be visible at a time.\n */\n get isBaseLayer(): boolean {\n return this.#isBaseLayer;\n }\n\n /**\n * The load state of a layer.\n */\n get loadState(): LayerLoadState {\n return this.#loadState.value;\n }\n\n /**\n * Called by the map model when the layer is added to the map.\n *\n * @internal\n */\n override [ATTACH_TO_MAP](map: MapModel): void {\n super[ATTACH_TO_MAP](map);\n\n if (!this.#stateWatchResource) {\n const { initial: initialState, resource: stateWatchResource } = watchLoadState(\n this,\n this.#healthCheck,\n (state) => {\n this.#loadState.value = state;\n }\n );\n this.#stateWatchResource = stateWatchResource;\n this.#loadState.value = initialState;\n }\n }\n\n override setVisible(newVisibility: boolean): void {\n if (this.isBaseLayer) {\n LOG.warn(\n `Cannot change visibility of base layer '${this.id}': use activateBaseLayer() on the map's LayerCollection instead.`\n );\n return;\n }\n\n this[SET_VISIBLE](newVisibility);\n }\n\n /** @internal */\n [SET_VISIBLE](newVisibility: boolean): void {\n if (this.#olLayer.getVisible() !== newVisibility) {\n this.#olLayer.setVisible(newVisibility);\n }\n }\n\n /** @internal */\n [GET_DEPS](): LayerDependencies {\n const deps = this.#deps;\n if (deps) {\n return deps;\n }\n\n const map = this.nullableMap;\n if (map) {\n return map[LAYER_DEPS];\n }\n throw new Error(\n `Layer '${this.id}' has not been attached to a map yet. \"\n + \"Use the LayerFactory to create an instance or add the layer to the map first.`\n );\n }\n}\n\nfunction watchLoadState(\n layer: AbstractLayer,\n healthCheck: LayerConfig[\"healthCheck\"],\n onChange: (newState: LayerLoadState) => void\n): { initial: LayerLoadState; resource: Resource } {\n const olLayer = layer.olLayer;\n\n if (!(olLayer instanceof OlLayer)) {\n // Some layers don't have a source (such as group)\n return {\n initial: \"loaded\",\n resource: {\n destroy() {\n void 0;\n }\n }\n };\n }\n\n let currentSource = getSource(olLayer);\n const currentOlLayerState = getSourceState(currentSource);\n\n let currentLoadState: LayerLoadState = currentOlLayerState;\n let currentHealthState = \"loading\"; // initial state loading until health check finished\n\n // custom health check not needed when OpenLayers already returning an error state\n if (currentOlLayerState !== \"error\") {\n // health check only once during initialization\n doHealthCheck(layer, healthCheck).then((state: LayerLoadState) => {\n currentHealthState = state;\n updateState();\n });\n }\n\n const updateState = () => {\n const olLayerState = getSourceState(currentSource);\n const nextLoadState: LayerLoadState =\n currentHealthState === \"error\" ? \"error\" : olLayerState;\n\n if (currentLoadState !== nextLoadState) {\n currentLoadState = nextLoadState;\n onChange(currentLoadState);\n }\n };\n\n let stateHandle: EventsKey | undefined;\n stateHandle = currentSource?.on(\"change\", () => {\n updateState();\n });\n\n const sourceHandle = olLayer.on(\"change:source\", () => {\n // unsubscribe from old source\n stateHandle && unByKey(stateHandle);\n stateHandle = undefined;\n\n // subscribe to new source and update state\n currentSource = getSource(olLayer);\n stateHandle = currentSource?.on(\"change\", () => {\n updateState();\n });\n updateState();\n });\n return {\n initial: currentLoadState,\n resource: {\n destroy() {\n stateHandle && unByKey(stateHandle);\n unByKey(sourceHandle);\n }\n }\n };\n}\n\nasync function doHealthCheck(\n layer: AbstractLayer,\n healthCheck: LayerConfig[\"healthCheck\"]\n): Promise<LayerLoadState> {\n if (healthCheck == null) {\n return \"loaded\";\n }\n\n let healthCheckFn: HealthCheckFunction;\n if (typeof healthCheck === \"function\") {\n healthCheckFn = healthCheck;\n } else if (typeof healthCheck === \"string\") {\n healthCheckFn = async () => {\n const httpService = layer[GET_DEPS]().httpService;\n const response = await httpService.fetch(healthCheck);\n if (response.ok) {\n return \"loaded\";\n }\n LOG.warn(\n `Health check failed for layer '${layer.id}' (http status ${response.status})`\n );\n return \"error\";\n };\n } else {\n LOG.error(\n `Unexpected object for 'healthCheck' parameter of layer '${layer.id}'`,\n healthCheck\n );\n return \"error\";\n }\n\n try {\n return await healthCheckFn(layer as Layer);\n } catch (e) {\n LOG.warn(`Health check failed for layer '${layer.id}'`, e);\n return \"error\";\n }\n}\n\nfunction getSource(olLayer: OlLayer | OlBaseLayer) {\n if (!(olLayer instanceof OlLayer)) {\n return undefined;\n }\n return (olLayer?.getSource() as OlSource | null) ?? undefined;\n}\n\nfunction getSourceState(olSource: OlSource | undefined) {\n const state = olSource?.getState();\n switch (state) {\n case undefined:\n return \"loaded\";\n case \"undefined\":\n return \"not-loaded\";\n case \"loading\":\n return \"loading\";\n case \"ready\":\n return \"loaded\";\n case \"error\":\n return \"error\";\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1,11 +1,11 @@
1
1
  import { Group } from "ol/layer";
2
2
  import { MapModel } from "../model/MapModel";
3
+ import { InternalConstructorTag } from "../utils/InternalConstructorTag";
3
4
  import { AbstractLayer } from "./AbstractLayer";
5
+ import { GroupLayerCollection } from "./group/GroupLayerCollection";
4
6
  import { LayerConfig } from "./shared/LayerConfig";
5
7
  import { ATTACH_TO_MAP, DETACH_FROM_MAP, LayerDependencies } from "./shared/internals";
6
- import { InternalConstructorTag } from "../utils/InternalConstructorTag";
7
8
  import { Layer } from "./unions";
8
- import { GroupLayerCollection } from "./group/GroupLayerCollection";
9
9
  /**
10
10
  * Configuration options to construct a {@link GroupLayer}.
11
11
  *
@@ -1,9 +1,9 @@
1
1
  import { deprecated } from '@open-pioneer/core';
2
2
  import { Group } from 'ol/layer.js';
3
- import { AbstractLayer } from './AbstractLayer.js';
4
- import { ATTACH_TO_MAP, GET_RAW_LAYERS, DETACH_FROM_MAP } from './shared/internals.js';
5
3
  import { INTERNAL_CONSTRUCTOR_TAG } from '../utils/InternalConstructorTag.js';
4
+ import { AbstractLayer } from './AbstractLayer.js';
6
5
  import { GroupLayerCollection } from './group/GroupLayerCollection.js';
6
+ import { ATTACH_TO_MAP, GET_RAW_LAYERS, DETACH_FROM_MAP } from './shared/internals.js';
7
7
 
8
8
  const deprecatedConstructor = deprecated({
9
9
  name: "GroupLayer constructor",
@@ -1 +1 @@
1
- {"version":3,"file":"GroupLayer.js","sources":["GroupLayer.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { deprecated } from \"@open-pioneer/core\";\nimport { Group } from \"ol/layer\";\nimport { MapModel } from \"../model/MapModel\";\nimport { AbstractLayer } from \"./AbstractLayer\";\nimport { LayerConfig } from \"./shared/LayerConfig\";\nimport {\n ATTACH_TO_MAP,\n DETACH_FROM_MAP,\n GET_RAW_LAYERS,\n LayerConstructor,\n LayerDependencies\n} from \"./shared/internals\";\nimport { INTERNAL_CONSTRUCTOR_TAG, InternalConstructorTag } from \"../utils/InternalConstructorTag\";\nimport { Layer } from \"./unions\";\nimport { GroupLayerCollection } from \"./group/GroupLayerCollection\";\n\n// Import for api docs\n// eslint-disable-next-line unused-imports/no-unused-imports\nimport type { LayerFactory } from \"../LayerFactory\";\n\n/**\n * Configuration options to construct a {@link GroupLayer}.\n *\n * @group Layers\n */\nexport interface GroupLayerConfig extends LayerConfig {\n /**\n * List of layers that belong to the new group layer.\n *\n * The group layer takes ownership of the given layers: they will be destroyed when the parent is destroyed.\n * A layer must have a unique parent: it can only be added to the map or a single group layer.\n */\n layers: Layer[];\n}\n\nconst deprecatedConstructor = deprecated({\n name: \"GroupLayer constructor\",\n packageName: \"@open-pioneer/map\",\n since: \"v1.0.0\",\n alternative: \"use LayerFactory.create() instead\"\n});\n\n/**\n * Represents a group of layers.\n *\n * A group layer contains a collection of {@link Layer} children.\n * Groups can be nested to form a hierarchy.\n *\n * @group Layers\n */\nexport class GroupLayer extends AbstractLayer {\n #children: GroupLayerCollection;\n\n /**\n * @deprecated Prefer using {@link LayerFactory.create} instead of calling the constructor directly\n */\n constructor(config: GroupLayerConfig);\n\n /**\n * NOTE: Do not use this overload. Use {@link LayerFactory.create} instead.\n *\n * @internal\n */\n constructor(\n config: GroupLayerConfig,\n deps: LayerDependencies,\n internalTag: InternalConstructorTag\n );\n\n constructor(\n config: GroupLayerConfig,\n deps?: LayerDependencies,\n internalTag?: InternalConstructorTag\n ) {\n if (!internalTag) {\n deprecatedConstructor();\n }\n\n const groupLayers = config.layers;\n const olGroup = new Group({ layers: groupLayers.map((sublayer) => sublayer.olLayer) });\n super({ ...config, olLayer: olGroup }, deps, internalTag);\n this.#children = new GroupLayerCollection(groupLayers, this, INTERNAL_CONSTRUCTOR_TAG);\n }\n\n override get type() {\n return \"group\" as const;\n }\n\n override get legend() {\n return undefined;\n }\n\n /**\n * Layers contained in this group.\n */\n override get layers(): GroupLayerCollection {\n return this.#children;\n }\n\n override get sublayers(): undefined {\n return undefined;\n }\n\n /**\n * Raw OpenLayers group instance.\n *\n * **Warning:** Do not manipulate the collection of layers in this group directly, changes are not synchronized!\n */\n override get olLayer(): Group {\n return super.olLayer as Group;\n }\n\n /** @internal */\n override [ATTACH_TO_MAP](map: MapModel): void {\n super[ATTACH_TO_MAP](map);\n this.layers[GET_RAW_LAYERS]().forEach((layer) => layer[ATTACH_TO_MAP](map));\n }\n\n /** @internal */\n override [DETACH_FROM_MAP](): void {\n super[DETACH_FROM_MAP]();\n this.layers[GET_RAW_LAYERS]().forEach((layer) => layer[DETACH_FROM_MAP]());\n }\n}\n\n// Ensure layer class is assignable to the constructor interface (there is no \"implements\" for the class itself).\n// eslint-disable-next-line no-constant-condition\nif (false) {\n const check: LayerConstructor<GroupLayerConfig, GroupLayer> = GroupLayer;\n void check;\n}\n"],"names":[],"mappings":";;;;;;;AAqCA,MAAM,wBAAwB,UAAA,CAAW;AAAA,EACrC,IAAA,EAAM,wBAAA;AAAA,EACN,WAAA,EAAa,mBAAA;AAAA,EACb,KAAA,EAAO,QAAA;AAAA,EACP,WAAA,EAAa;AACjB,CAAC,CAAA;AAUM,MAAM,mBAAmB,aAAA,CAAc;AAAA,EAC1C,SAAA;AAAA,EAkBA,WAAA,CACI,MAAA,EACA,IAAA,EACA,WAAA,EACF;AACE,IAAA,IAAI,CAAC,WAAA,EAAa;AACd,MAAA,qBAAA,EAAsB;AAAA,IAC1B;AAEA,IAAA,MAAM,cAAc,MAAA,CAAO,MAAA;AAC3B,IAAA,MAAM,OAAA,GAAU,IAAI,KAAA,CAAM,EAAE,MAAA,EAAQ,WAAA,CAAY,GAAA,CAAI,CAAC,QAAA,KAAa,QAAA,CAAS,OAAO,CAAA,EAAG,CAAA;AACrF,IAAA,KAAA,CAAM,EAAE,GAAG,MAAA,EAAQ,SAAS,OAAA,EAAQ,EAAG,MAAM,WAAW,CAAA;AACxD,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,oBAAA,CAAqB,WAAA,EAAa,MAAM,wBAAwB,CAAA;AAAA,EACzF;AAAA,EAEA,IAAa,IAAA,GAAO;AAChB,IAAA,OAAO,OAAA;AAAA,EACX;AAAA,EAEA,IAAa,MAAA,GAAS;AAClB,IAAA,OAAO,MAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,IAAa,MAAA,GAA+B;AACxC,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EAChB;AAAA,EAEA,IAAa,SAAA,GAAuB;AAChC,IAAA,OAAO,MAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAa,OAAA,GAAiB;AAC1B,IAAA,OAAO,KAAA,CAAM,OAAA;AAAA,EACjB;AAAA;AAAA,EAGA,CAAU,aAAa,CAAA,CAAE,GAAA,EAAqB;AAC1C,IAAA,KAAA,CAAM,aAAa,EAAE,GAAG,CAAA;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,cAAc,CAAA,EAAE,CAAE,OAAA,CAAQ,CAAC,KAAA,KAAU,KAAA,CAAM,aAAa,CAAA,CAAE,GAAG,CAAC,CAAA;AAAA,EAC9E;AAAA;AAAA,EAGA,CAAU,eAAe,CAAA,GAAU;AAC/B,IAAA,KAAA,CAAM,eAAe,CAAA,EAAE;AACvB,IAAA,IAAA,CAAK,MAAA,CAAO,cAAc,CAAA,EAAE,CAAE,OAAA,CAAQ,CAAC,KAAA,KAAU,KAAA,CAAM,eAAe,CAAA,EAAG,CAAA;AAAA,EAC7E;AACJ;;;;"}
1
+ {"version":3,"file":"GroupLayer.js","sources":["GroupLayer.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { deprecated } from \"@open-pioneer/core\";\nimport { Group } from \"ol/layer\";\nimport type { LayerFactory } from \"../LayerFactory\";\nimport { MapModel } from \"../model/MapModel\";\nimport { INTERNAL_CONSTRUCTOR_TAG, InternalConstructorTag } from \"../utils/InternalConstructorTag\";\nimport { AbstractLayer } from \"./AbstractLayer\";\nimport { GroupLayerCollection } from \"./group/GroupLayerCollection\";\nimport { LayerConfig } from \"./shared/LayerConfig\";\nimport {\n ATTACH_TO_MAP,\n DETACH_FROM_MAP,\n GET_RAW_LAYERS,\n LayerConstructor,\n LayerDependencies\n} from \"./shared/internals\";\nimport { Layer } from \"./unions\";\n\n/**\n * Configuration options to construct a {@link GroupLayer}.\n *\n * @group Layers\n */\nexport interface GroupLayerConfig extends LayerConfig {\n /**\n * List of layers that belong to the new group layer.\n *\n * The group layer takes ownership of the given layers: they will be destroyed when the parent is destroyed.\n * A layer must have a unique parent: it can only be added to the map or a single group layer.\n */\n layers: Layer[];\n}\n\nconst deprecatedConstructor = deprecated({\n name: \"GroupLayer constructor\",\n packageName: \"@open-pioneer/map\",\n since: \"v1.0.0\",\n alternative: \"use LayerFactory.create() instead\"\n});\n\n/**\n * Represents a group of layers.\n *\n * A group layer contains a collection of {@link Layer} children.\n * Groups can be nested to form a hierarchy.\n *\n * @group Layers\n */\nexport class GroupLayer extends AbstractLayer {\n #children: GroupLayerCollection;\n\n /**\n * @deprecated Prefer using {@link LayerFactory.create} instead of calling the constructor directly\n */\n constructor(config: GroupLayerConfig);\n\n /**\n * NOTE: Do not use this overload. Use {@link LayerFactory.create} instead.\n *\n * @internal\n */\n constructor(\n config: GroupLayerConfig,\n deps: LayerDependencies,\n internalTag: InternalConstructorTag\n );\n\n constructor(\n config: GroupLayerConfig,\n deps?: LayerDependencies,\n internalTag?: InternalConstructorTag\n ) {\n if (!internalTag) {\n deprecatedConstructor();\n }\n\n const groupLayers = config.layers;\n const olGroup = new Group({ layers: groupLayers.map((sublayer) => sublayer.olLayer) });\n super({ ...config, olLayer: olGroup }, deps, internalTag);\n this.#children = new GroupLayerCollection(groupLayers, this, INTERNAL_CONSTRUCTOR_TAG);\n }\n\n override get type() {\n return \"group\" as const;\n }\n\n override get legend() {\n return undefined;\n }\n\n /**\n * Layers contained in this group.\n */\n override get layers(): GroupLayerCollection {\n return this.#children;\n }\n\n override get sublayers(): undefined {\n return undefined;\n }\n\n /**\n * Raw OpenLayers group instance.\n *\n * **Warning:** Do not manipulate the collection of layers in this group directly, changes are not synchronized!\n */\n override get olLayer(): Group {\n return super.olLayer as Group;\n }\n\n /** @internal */\n override [ATTACH_TO_MAP](map: MapModel): void {\n super[ATTACH_TO_MAP](map);\n this.layers[GET_RAW_LAYERS]().forEach((layer) => layer[ATTACH_TO_MAP](map));\n }\n\n /** @internal */\n override [DETACH_FROM_MAP](): void {\n super[DETACH_FROM_MAP]();\n this.layers[GET_RAW_LAYERS]().forEach((layer) => layer[DETACH_FROM_MAP]());\n }\n}\n\n// Ensure layer class is assignable to the constructor interface (there is no \"implements\" for the class itself).\n// eslint-disable-next-line no-constant-condition\nif (false) {\n const check: LayerConstructor<GroupLayerConfig, GroupLayer> = GroupLayer;\n void check;\n}\n"],"names":[],"mappings":";;;;;;;AAkCA,MAAM,wBAAwB,UAAA,CAAW;AAAA,EACrC,IAAA,EAAM,wBAAA;AAAA,EACN,WAAA,EAAa,mBAAA;AAAA,EACb,KAAA,EAAO,QAAA;AAAA,EACP,WAAA,EAAa;AACjB,CAAC,CAAA;AAUM,MAAM,mBAAmB,aAAA,CAAc;AAAA,EAC1C,SAAA;AAAA,EAkBA,WAAA,CACI,MAAA,EACA,IAAA,EACA,WAAA,EACF;AACE,IAAA,IAAI,CAAC,WAAA,EAAa;AACd,MAAA,qBAAA,EAAsB;AAAA,IAC1B;AAEA,IAAA,MAAM,cAAc,MAAA,CAAO,MAAA;AAC3B,IAAA,MAAM,OAAA,GAAU,IAAI,KAAA,CAAM,EAAE,MAAA,EAAQ,WAAA,CAAY,GAAA,CAAI,CAAC,QAAA,KAAa,QAAA,CAAS,OAAO,CAAA,EAAG,CAAA;AACrF,IAAA,KAAA,CAAM,EAAE,GAAG,MAAA,EAAQ,SAAS,OAAA,EAAQ,EAAG,MAAM,WAAW,CAAA;AACxD,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,oBAAA,CAAqB,WAAA,EAAa,MAAM,wBAAwB,CAAA;AAAA,EACzF;AAAA,EAEA,IAAa,IAAA,GAAO;AAChB,IAAA,OAAO,OAAA;AAAA,EACX;AAAA,EAEA,IAAa,MAAA,GAAS;AAClB,IAAA,OAAO,MAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,IAAa,MAAA,GAA+B;AACxC,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EAChB;AAAA,EAEA,IAAa,SAAA,GAAuB;AAChC,IAAA,OAAO,MAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAa,OAAA,GAAiB;AAC1B,IAAA,OAAO,KAAA,CAAM,OAAA;AAAA,EACjB;AAAA;AAAA,EAGA,CAAU,aAAa,CAAA,CAAE,GAAA,EAAqB;AAC1C,IAAA,KAAA,CAAM,aAAa,EAAE,GAAG,CAAA;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,cAAc,CAAA,EAAE,CAAE,OAAA,CAAQ,CAAC,KAAA,KAAU,KAAA,CAAM,aAAa,CAAA,CAAE,GAAG,CAAC,CAAA;AAAA,EAC9E;AAAA;AAAA,EAGA,CAAU,eAAe,CAAA,GAAU;AAC/B,IAAA,KAAA,CAAM,eAAe,CAAA,EAAE;AACvB,IAAA,IAAA,CAAK,MAAA,CAAO,cAAc,CAAA,EAAE,CAAE,OAAA,CAAQ,CAAC,KAAA,KAAU,KAAA,CAAM,eAAe,CAAA,EAAG,CAAA;AAAA,EAC7E;AACJ;;;;"}
@@ -1,8 +1,8 @@
1
1
  import type OlBaseLayer from "ol/layer/Base";
2
+ import { InternalConstructorTag } from "../utils/InternalConstructorTag";
2
3
  import { AbstractLayer } from "./AbstractLayer";
3
4
  import { LayerConfig } from "./shared/LayerConfig";
4
5
  import { LayerDependencies } from "./shared/internals";
5
- import { InternalConstructorTag } from "../utils/InternalConstructorTag";
6
6
  /**
7
7
  * Options to construct a simple layer.
8
8
  *
@@ -1 +1 @@
1
- {"version":3,"file":"SimpleLayer.js","sources":["SimpleLayer.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { deprecated } from \"@open-pioneer/core\";\nimport type OlBaseLayer from \"ol/layer/Base\";\nimport { AbstractLayer } from \"./AbstractLayer\";\nimport { LayerConfig } from \"./shared/LayerConfig\";\nimport { LayerConstructor, LayerDependencies } from \"./shared/internals\";\nimport { InternalConstructorTag } from \"../utils/InternalConstructorTag\";\n\n// Import for api docs\n// eslint-disable-next-line unused-imports/no-unused-imports\nimport type { LayerFactory } from \"../LayerFactory\";\n\n/**\n * Options to construct a simple layer.\n *\n * Simple layers are wrappers around a custom OpenLayers layer.\n *\n * @group Layers\n */\nexport interface SimpleLayerConfig extends LayerConfig {\n /**\n * The raw OpenLayers instance.\n */\n olLayer: OlBaseLayer;\n}\n\nconst deprecatedConstructor = deprecated({\n name: \"SimpleLayer constructor\",\n packageName: \"@open-pioneer/map\",\n since: \"v1.0.0\",\n alternative: \"use LayerFactory.create() instead\"\n});\n\n/**\n * A simple layer that accepts a custom OpenLayers layer instance.\n *\n * Any kind of open layers can be made to work with the map package using this class.\n * Some API features (such as sublayers) may not be available.\n *\n * @group Layers\n */\nexport class SimpleLayer extends AbstractLayer {\n /**\n * @deprecated Prefer using {@link LayerFactory.create} instead of calling the constructor directly\n */\n constructor(config: SimpleLayerConfig);\n\n /**\n * NOTE: Do not use this overload. Use {@link LayerFactory.create} instead.\n *\n * @internal\n */\n constructor(\n config: SimpleLayerConfig,\n deps: LayerDependencies,\n internalTag: InternalConstructorTag\n );\n constructor(\n config: SimpleLayerConfig,\n deps?: LayerDependencies,\n internalTag?: InternalConstructorTag\n ) {\n if (!internalTag) {\n deprecatedConstructor();\n }\n super(config, deps, internalTag);\n }\n\n override get type() {\n return \"simple\" as const;\n }\n\n override get legend(): undefined {\n return undefined;\n }\n\n override get layers(): undefined {\n return undefined;\n }\n\n override get sublayers(): undefined {\n return undefined;\n }\n}\n\n// Ensure layer class is assignable to the constructor interface (there is no \"implements\" for the class itself).\n// eslint-disable-next-line no-constant-condition\nif (false) {\n const check: LayerConstructor<SimpleLayerConfig, SimpleLayer> = SimpleLayer;\n void check;\n}\n"],"names":[],"mappings":";;;AA2BA,MAAM,wBAAwB,UAAA,CAAW;AAAA,EACrC,IAAA,EAAM,yBAAA;AAAA,EACN,WAAA,EAAa,mBAAA;AAAA,EACb,KAAA,EAAO,QAAA;AAAA,EACP,WAAA,EAAa;AACjB,CAAC,CAAA;AAUM,MAAM,oBAAoB,aAAA,CAAc;AAAA,EAgB3C,WAAA,CACI,MAAA,EACA,IAAA,EACA,WAAA,EACF;AACE,IAAA,IAAI,CAAC,WAAA,EAAa;AACd,MAAA,qBAAA,EAAsB;AAAA,IAC1B;AACA,IAAA,KAAA,CAAM,MAAA,EAAQ,MAAM,WAAW,CAAA;AAAA,EACnC;AAAA,EAEA,IAAa,IAAA,GAAO;AAChB,IAAA,OAAO,QAAA;AAAA,EACX;AAAA,EAEA,IAAa,MAAA,GAAoB;AAC7B,IAAA,OAAO,MAAA;AAAA,EACX;AAAA,EAEA,IAAa,MAAA,GAAoB;AAC7B,IAAA,OAAO,MAAA;AAAA,EACX;AAAA,EAEA,IAAa,SAAA,GAAuB;AAChC,IAAA,OAAO,MAAA;AAAA,EACX;AACJ;;;;"}
1
+ {"version":3,"file":"SimpleLayer.js","sources":["SimpleLayer.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { deprecated } from \"@open-pioneer/core\";\nimport type OlBaseLayer from \"ol/layer/Base\";\nimport type { LayerFactory } from \"../LayerFactory\";\nimport { InternalConstructorTag } from \"../utils/InternalConstructorTag\";\nimport { AbstractLayer } from \"./AbstractLayer\";\nimport { LayerConfig } from \"./shared/LayerConfig\";\nimport { LayerConstructor, LayerDependencies } from \"./shared/internals\";\n\n/**\n * Options to construct a simple layer.\n *\n * Simple layers are wrappers around a custom OpenLayers layer.\n *\n * @group Layers\n */\nexport interface SimpleLayerConfig extends LayerConfig {\n /**\n * The raw OpenLayers instance.\n */\n olLayer: OlBaseLayer;\n}\n\nconst deprecatedConstructor = deprecated({\n name: \"SimpleLayer constructor\",\n packageName: \"@open-pioneer/map\",\n since: \"v1.0.0\",\n alternative: \"use LayerFactory.create() instead\"\n});\n\n/**\n * A simple layer that accepts a custom OpenLayers layer instance.\n *\n * Any kind of open layers can be made to work with the map package using this class.\n * Some API features (such as sublayers) may not be available.\n *\n * @group Layers\n */\nexport class SimpleLayer extends AbstractLayer {\n /**\n * @deprecated Prefer using {@link LayerFactory.create} instead of calling the constructor directly\n */\n constructor(config: SimpleLayerConfig);\n\n /**\n * NOTE: Do not use this overload. Use {@link LayerFactory.create} instead.\n *\n * @internal\n */\n constructor(\n config: SimpleLayerConfig,\n deps: LayerDependencies,\n internalTag: InternalConstructorTag\n );\n constructor(\n config: SimpleLayerConfig,\n deps?: LayerDependencies,\n internalTag?: InternalConstructorTag\n ) {\n if (!internalTag) {\n deprecatedConstructor();\n }\n super(config, deps, internalTag);\n }\n\n override get type() {\n return \"simple\" as const;\n }\n\n override get legend(): undefined {\n return undefined;\n }\n\n override get layers(): undefined {\n return undefined;\n }\n\n override get sublayers(): undefined {\n return undefined;\n }\n}\n\n// Ensure layer class is assignable to the constructor interface (there is no \"implements\" for the class itself).\n// eslint-disable-next-line no-constant-condition\nif (false) {\n const check: LayerConstructor<SimpleLayerConfig, SimpleLayer> = SimpleLayer;\n void check;\n}\n"],"names":[],"mappings":";;;AAwBA,MAAM,wBAAwB,UAAA,CAAW;AAAA,EACrC,IAAA,EAAM,yBAAA;AAAA,EACN,WAAA,EAAa,mBAAA;AAAA,EACb,KAAA,EAAO,QAAA;AAAA,EACP,WAAA,EAAa;AACjB,CAAC,CAAA;AAUM,MAAM,oBAAoB,aAAA,CAAc;AAAA,EAgB3C,WAAA,CACI,MAAA,EACA,IAAA,EACA,WAAA,EACF;AACE,IAAA,IAAI,CAAC,WAAA,EAAa;AACd,MAAA,qBAAA,EAAsB;AAAA,IAC1B;AACA,IAAA,KAAA,CAAM,MAAA,EAAQ,MAAM,WAAW,CAAA;AAAA,EACnC;AAAA,EAEA,IAAa,IAAA,GAAO;AAChB,IAAA,OAAO,QAAA;AAAA,EACX;AAAA,EAEA,IAAa,MAAA,GAAoB;AAC7B,IAAA,OAAO,MAAA;AAAA,EACX;AAAA,EAEA,IAAa,MAAA,GAAoB;AAC7B,IAAA,OAAO,MAAA;AAAA,EACX;AAAA,EAEA,IAAa,SAAA,GAAuB;AAChC,IAAA,OAAO,MAAA;AAAA,EACX;AACJ;;;;"}
@@ -1,8 +1,8 @@
1
1
  import type { Options as WMSSourceOptions } from "ol/source/ImageWMS";
2
2
  import { MapModel } from "../model/MapModel";
3
+ import { InternalConstructorTag } from "../utils/InternalConstructorTag";
3
4
  import { AbstractLayer } from "./AbstractLayer";
4
5
  import { ATTACH_TO_MAP, DETACH_FROM_MAP, LayerDependencies } from "./shared/internals";
5
- import { InternalConstructorTag } from "../utils/InternalConstructorTag";
6
6
  import { LayerConfig } from "./shared/LayerConfig";
7
7
  import { SublayersCollection } from "./shared/SublayersCollection";
8
8
  import { WMSSublayer, WMSSublayerConfig } from "./wms/WMSSublayer";
@@ -4,9 +4,9 @@ import WMSCapabilities from 'ol/format/WMSCapabilities.js';
4
4
  import ImageLayer from 'ol/layer/Image.js';
5
5
  import ImageWMS from 'ol/source/ImageWMS.js';
6
6
  import { fetchText } from '../utils/fetch.js';
7
+ import { INTERNAL_CONSTRUCTOR_TAG } from '../utils/InternalConstructorTag.js';
7
8
  import { AbstractLayer } from './AbstractLayer.js';
8
9
  import { GET_RAW_SUBLAYERS, ATTACH_TO_PARENT, ATTACH_TO_MAP, DETACH_FROM_MAP, SET_LEGEND, GET_DEPS } from './shared/internals.js';
9
- import { INTERNAL_CONSTRUCTOR_TAG } from '../utils/InternalConstructorTag.js';
10
10
  import { SublayersCollection } from './shared/SublayersCollection.js';
11
11
  import { getLegendUrl } from './wms/getLegendUrl.js';
12
12
  import { constructSublayers } from './wms/WMSSublayer.js';
@@ -1 +1 @@
1
- {"version":3,"file":"WMSLayer.js","sources":["WMSLayer.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { batch, computed, ReadonlyReactive, watch } from \"@conterra/reactivity-core\";\nimport {\n createLogger,\n deprecated,\n destroyResource,\n isAbortError,\n Resource\n} from \"@open-pioneer/core\";\nimport { ImageWrapper } from \"ol\";\nimport WMSCapabilities from \"ol/format/WMSCapabilities\";\nimport ImageLayer from \"ol/layer/Image\";\nimport type ImageSource from \"ol/source/Image\";\nimport type { Options as WMSSourceOptions } from \"ol/source/ImageWMS\";\nimport ImageWMS from \"ol/source/ImageWMS\";\nimport { MapModel } from \"../model/MapModel\";\nimport { fetchText } from \"../utils/fetch\";\nimport { AbstractLayer } from \"./AbstractLayer\";\nimport {\n ATTACH_TO_MAP,\n ATTACH_TO_PARENT,\n DETACH_FROM_MAP,\n GET_DEPS,\n GET_RAW_SUBLAYERS,\n SET_LEGEND,\n LayerConstructor,\n LayerDependencies\n} from \"./shared/internals\";\nimport { INTERNAL_CONSTRUCTOR_TAG, InternalConstructorTag } from \"../utils/InternalConstructorTag\";\nimport { LayerConfig } from \"./shared/LayerConfig\";\nimport { SublayersCollection } from \"./shared/SublayersCollection\";\nimport { getLegendUrl } from \"./wms/getLegendUrl\";\nimport { constructSublayers, WMSSublayer, WMSSublayerConfig } from \"./wms/WMSSublayer\";\n\n// Import for api docs\n// eslint-disable-next-line unused-imports/no-unused-imports\nimport type { LayerFactory } from \"../LayerFactory\";\n\n/**\n * Configuration options to construct a {@link WMSLayer}.\n *\n * @group Layers\n */\nexport interface WMSLayerConfig extends LayerConfig {\n /** URL of the WMS service. */\n url: string;\n\n /** Configures the layer's sublayers. */\n sublayers?: WMSSublayerConfig[];\n\n /**\n * Additional source options for the layer's WMS source.\n *\n * NOTE: These options are intended for advanced configuration:\n * the WMS Layer manages some of the OpenLayers source options itself.\n */\n sourceOptions?: Partial<WMSSourceOptions>;\n\n /**\n * Whether to automatically fetch capabilities from the service when needed (default: `true`).\n *\n * Setting this to `false` can be useful as a performance optimization when capabilities are not really required by the application.\n * Note that this will disable some features of the WMS layer: for example, the legend URL will not be available.\n */\n fetchCapabilities?: boolean;\n}\n\nconst LOG = createLogger(\"map:WMSLayer\");\n\nconst deprecatedConstructor = deprecated({\n name: \"WMSLayer constructor\",\n packageName: \"@open-pioneer/map\",\n since: \"v1.0.0\",\n alternative: \"use LayerFactory.create() instead\"\n});\n\n/**\n * Displays an OGC Web Map Service (WMS).\n *\n * @group Layers\n */\nexport class WMSLayer extends AbstractLayer {\n #url: string;\n #sublayers: SublayersCollection<WMSSublayer>;\n #layer: ImageLayer<ImageSource>;\n #source: ImageWMS;\n #fetchCapabilities: boolean;\n\n #loadStarted = false;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n #capabilities: Record<string, any> | undefined;\n readonly #abortController = new AbortController();\n\n #visibleSublayers: ReadonlyReactive<string[]>;\n #sublayersWatch: Resource | undefined;\n\n /**\n * @deprecated Prefer using {@link LayerFactory.create} instead of calling the constructor directly\n */\n constructor(config: WMSLayerConfig);\n\n /**\n * NOTE: Do not use this overload. Use {@link LayerFactory.create} instead.\n *\n * @internal\n */\n constructor(\n config: WMSLayerConfig,\n deps: LayerDependencies,\n internalTag: InternalConstructorTag\n );\n constructor(\n config: WMSLayerConfig,\n deps?: LayerDependencies,\n internalTag?: InternalConstructorTag\n ) {\n if (!internalTag) {\n deprecatedConstructor();\n }\n\n const layer = new ImageLayer();\n super(\n {\n ...config,\n olLayer: layer\n },\n deps,\n internalTag\n );\n const source = new ImageWMS({\n ...config.sourceOptions,\n url: config.url,\n params: {\n ...config.sourceOptions?.params\n },\n // Use http service to load tiles; needed for authentication etc.\n imageLoadFunction: (wrapper, url) => {\n return this.#loadImage(wrapper, url).catch((error) => {\n LOG.error(`Failed to load tile at '${url}'`, error);\n });\n }\n });\n this.#url = config.url;\n this.#fetchCapabilities = config.fetchCapabilities ?? true;\n this.#source = source;\n this.#layer = layer;\n\n this.#sublayers = new SublayersCollection(\n constructSublayers(config.sublayers),\n INTERNAL_CONSTRUCTOR_TAG\n );\n this.#sublayers\n [GET_RAW_SUBLAYERS]()\n .forEach((sublayer) => sublayer[ATTACH_TO_PARENT](this, this));\n\n this.#visibleSublayers = computed(() => this.#getVisibleLayerNames(), {\n equal(a, b) {\n return a.length === b.length && a.every((v, i) => v === b[i]);\n }\n });\n\n this.#sublayersWatch = watch(\n () => [this.#visibleSublayers.value],\n ([layers]) => {\n this.#updateLayersParam(layers);\n },\n {\n immediate: true\n }\n );\n }\n\n override destroy() {\n this.#abortController.abort();\n this.#sublayersWatch = destroyResource(this.#sublayersWatch);\n super.destroy();\n }\n\n get type() {\n return \"wms\" as const;\n }\n\n get legend() {\n return undefined;\n }\n\n /** The URL of the WMS service that was used during layer construction. */\n get url(): string {\n return this.#url;\n }\n\n get layers(): undefined {\n return undefined;\n }\n\n /**\n * Holds the sublayers of this layer.\n */\n get sublayers(): SublayersCollection<WMSSublayer> {\n return this.#sublayers;\n }\n\n get capabilities() {\n return this.#capabilities;\n }\n\n /** @internal */\n [ATTACH_TO_MAP](map: MapModel): void {\n super[ATTACH_TO_MAP](map);\n for (const sublayer of this.#sublayers.getSublayers()) {\n sublayer[ATTACH_TO_MAP](map);\n }\n\n this.#load();\n }\n\n /** @internal */\n [DETACH_FROM_MAP](): void {\n super[DETACH_FROM_MAP]();\n for (const sublayer of this.#sublayers.getSublayers()) {\n sublayer[DETACH_FROM_MAP]();\n }\n }\n\n #load() {\n if (this.#loadStarted || !this.#fetchCapabilities) {\n return;\n }\n this.#loadStarted = true;\n\n /** Find all leaf nodes representing a layer in the structure */\n const getNestedSublayer = (sublayers: WMSSublayer[], layers: WMSSublayer[]) => {\n for (const sublayer of sublayers) {\n const nested = sublayer.sublayers.getSublayers();\n if (nested.length) {\n getNestedSublayer(nested, layers);\n } else {\n if (sublayer.name) {\n layers.push(sublayer);\n }\n }\n }\n };\n\n this.#fetchWMSCapabilities()\n .then((result: string) => {\n batch(() => {\n const parser = new WMSCapabilities();\n const capabilities = parser.read(result);\n this.#capabilities = capabilities;\n\n const layers: WMSSublayer[] = [];\n getNestedSublayer(this.#sublayers.getSublayers(), layers);\n\n for (const layer of layers) {\n const legendUrl = getLegendUrl(capabilities, layer.name!);\n layer[SET_LEGEND](legendUrl);\n }\n });\n })\n .catch((error) => {\n if (isAbortError(error)) {\n LOG.debug(`Layer '${this.id}' has been destroyed before fetching capabilities`);\n return;\n }\n LOG.error(`Failed to fetch WMS capabilities for layer '${this.id}'`, error);\n });\n }\n\n /**\n * Gathers the visibility of _all_ sublayers and assembles the 'layers' WMS parameter.\n * The parameters are then applied to the WMS source.\n */\n #updateLayersParam(layers: string[]) {\n this.#source.updateParams({\n \"LAYERS\": layers\n });\n\n // only set source if there are visible sublayers, otherwise\n // we send an invalid http request\n const source = layers.length === 0 ? null : this.#source;\n if (this.#layer.getSource() !== source) {\n this.#layer.setSource(source);\n }\n }\n\n #getVisibleLayerNames() {\n const layers: string[] = [];\n const visitSublayer = (sublayer: WMSSublayer) => {\n if (!sublayer.visible) {\n return;\n }\n\n const nestedSublayers = sublayer.sublayers[GET_RAW_SUBLAYERS]();\n if (nestedSublayers.length) {\n for (const nestedSublayer of nestedSublayers) {\n visitSublayer(nestedSublayer);\n }\n } else {\n /**\n * Push sublayer only, if layer name is not an empty string | undefined | ...\n */\n if (sublayer.name) {\n layers.push(sublayer.name);\n }\n }\n };\n\n for (const sublayer of this.sublayers[GET_RAW_SUBLAYERS]()) {\n visitSublayer(sublayer);\n }\n return layers;\n }\n\n async #fetchWMSCapabilities(): Promise<string> {\n const httpService = this[GET_DEPS]().httpService;\n const url = `${this.#url}?LANGUAGE=ger&SERVICE=WMS&REQUEST=GetCapabilities`;\n return fetchText(url, httpService, this.#abortController.signal);\n }\n\n async #loadImage(imageWrapper: ImageWrapper, imageUrl: string): Promise<void> {\n const httpService = this[GET_DEPS]().httpService;\n const image = imageWrapper.getImage() as HTMLImageElement;\n\n const response = await httpService.fetch(imageUrl);\n if (!response.ok) {\n throw new Error(`Request failed with status ${response.status}.`);\n }\n\n const blob = await response.blob();\n const objectUrl = URL.createObjectURL(blob);\n const finish = () => {\n // Cleanup object URL after load to prevent memory leaks.\n // https://stackoverflow.com/questions/62473876/openlayers-6-settileloadfunction-documented-example-uses-url-createobjecturld\n URL.revokeObjectURL(objectUrl);\n image.removeEventListener(\"load\", finish);\n image.removeEventListener(\"error\", finish);\n };\n\n image.addEventListener(\"load\", finish);\n image.addEventListener(\"error\", finish);\n image.src = objectUrl;\n }\n}\n\n// Ensure layer class is assignable to the constructor interface (there is no \"implements\" for the class itself).\n// eslint-disable-next-line no-constant-condition\nif (false) {\n const check: LayerConstructor<WMSLayerConfig, WMSLayer> = WMSLayer;\n void check;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;AAoEA,MAAM,GAAA,GAAM,aAAa,cAAc,CAAA;AAEvC,MAAM,wBAAwB,UAAA,CAAW;AAAA,EACrC,IAAA,EAAM,sBAAA;AAAA,EACN,WAAA,EAAa,mBAAA;AAAA,EACb,KAAA,EAAO,QAAA;AAAA,EACP,WAAA,EAAa;AACjB,CAAC,CAAA;AAOM,MAAM,iBAAiB,aAAA,CAAc;AAAA,EACxC,IAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,kBAAA;AAAA,EAEA,YAAA,GAAe,KAAA;AAAA;AAAA,EAEf,aAAA;AAAA,EACS,gBAAA,GAAmB,IAAI,eAAA,EAAgB;AAAA,EAEhD,iBAAA;AAAA,EACA,eAAA;AAAA,EAiBA,WAAA,CACI,MAAA,EACA,IAAA,EACA,WAAA,EACF;AACE,IAAA,IAAI,CAAC,WAAA,EAAa;AACd,MAAA,qBAAA,EAAsB;AAAA,IAC1B;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,EAAW;AAC7B,IAAA,KAAA;AAAA,MACI;AAAA,QACI,GAAG,MAAA;AAAA,QACH,OAAA,EAAS;AAAA,OACb;AAAA,MACA,IAAA;AAAA,MACA;AAAA,KACJ;AACA,IAAA,MAAM,MAAA,GAAS,IAAI,QAAA,CAAS;AAAA,MACxB,GAAG,MAAA,CAAO,aAAA;AAAA,MACV,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,MAAA,EAAQ;AAAA,QACJ,GAAG,OAAO,aAAA,EAAe;AAAA,OAC7B;AAAA;AAAA,MAEA,iBAAA,EAAmB,CAAC,OAAA,EAAS,GAAA,KAAQ;AACjC,QAAA,OAAO,KAAK,UAAA,CAAW,OAAA,EAAS,GAAG,CAAA,CAAE,KAAA,CAAM,CAAC,KAAA,KAAU;AAClD,UAAA,GAAA,CAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,GAAG,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,QACtD,CAAC,CAAA;AAAA,MACL;AAAA,KACH,CAAA;AACD,IAAA,IAAA,CAAK,OAAO,MAAA,CAAO,GAAA;AACnB,IAAA,IAAA,CAAK,kBAAA,GAAqB,OAAO,iBAAA,IAAqB,IAAA;AACtD,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AACf,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AAEd,IAAA,IAAA,CAAK,aAAa,IAAI,mBAAA;AAAA,MAClB,kBAAA,CAAmB,OAAO,SAAS,CAAA;AAAA,MACnC;AAAA,KACJ;AACA,IAAA,IAAA,CAAK,UAAA,CACA,iBAAiB,CAAA,EAAE,CACnB,OAAA,CAAQ,CAAC,QAAA,KAAa,QAAA,CAAS,gBAAgB,CAAA,CAAE,IAAA,EAAM,IAAI,CAAC,CAAA;AAEjE,IAAA,IAAA,CAAK,iBAAA,GAAoB,QAAA,CAAS,MAAM,IAAA,CAAK,uBAAsB,EAAG;AAAA,MAClE,KAAA,CAAM,GAAG,CAAA,EAAG;AACR,QAAA,OAAO,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,KAAM,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,MAChE;AAAA,KACH,CAAA;AAED,IAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AAAA,MACnB,MAAM,CAAC,IAAA,CAAK,iBAAA,CAAkB,KAAK,CAAA;AAAA,MACnC,CAAC,CAAC,MAAM,CAAA,KAAM;AACV,QAAA,IAAA,CAAK,mBAAmB,MAAM,CAAA;AAAA,MAClC,CAAA;AAAA,MACA;AAAA,QACI,SAAA,EAAW;AAAA;AACf,KACJ;AAAA,EACJ;AAAA,EAES,OAAA,GAAU;AACf,IAAA,IAAA,CAAK,iBAAiB,KAAA,EAAM;AAC5B,IAAA,IAAA,CAAK,eAAA,GAAkB,eAAA,CAAgB,IAAA,CAAK,eAAe,CAAA;AAC3D,IAAA,KAAA,CAAM,OAAA,EAAQ;AAAA,EAClB;AAAA,EAEA,IAAI,IAAA,GAAO;AACP,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,IAAI,MAAA,GAAS;AACT,IAAA,OAAO,MAAA;AAAA,EACX;AAAA;AAAA,EAGA,IAAI,GAAA,GAAc;AACd,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EAChB;AAAA,EAEA,IAAI,MAAA,GAAoB;AACpB,IAAA,OAAO,MAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAA,GAA8C;AAC9C,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EAChB;AAAA,EAEA,IAAI,YAAA,GAAe;AACf,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EAChB;AAAA;AAAA,EAGA,CAAC,aAAa,CAAA,CAAE,GAAA,EAAqB;AACjC,IAAA,KAAA,CAAM,aAAa,EAAE,GAAG,CAAA;AACxB,IAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,UAAA,CAAW,YAAA,EAAa,EAAG;AACnD,MAAA,QAAA,CAAS,aAAa,EAAE,GAAG,CAAA;AAAA,IAC/B;AAEA,IAAA,IAAA,CAAK,KAAA,EAAM;AAAA,EACf;AAAA;AAAA,EAGA,CAAC,eAAe,CAAA,GAAU;AACtB,IAAA,KAAA,CAAM,eAAe,CAAA,EAAE;AACvB,IAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,UAAA,CAAW,YAAA,EAAa,EAAG;AACnD,MAAA,QAAA,CAAS,eAAe,CAAA,EAAE;AAAA,IAC9B;AAAA,EACJ;AAAA,EAEA,KAAA,GAAQ;AACJ,IAAA,IAAI,IAAA,CAAK,YAAA,IAAgB,CAAC,IAAA,CAAK,kBAAA,EAAoB;AAC/C,MAAA;AAAA,IACJ;AACA,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAGpB,IAAA,MAAM,iBAAA,GAAoB,CAAC,SAAA,EAA0B,MAAA,KAA0B;AAC3E,MAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAC9B,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,SAAA,CAAU,YAAA,EAAa;AAC/C,QAAA,IAAI,OAAO,MAAA,EAAQ;AACf,UAAA,iBAAA,CAAkB,QAAQ,MAAM,CAAA;AAAA,QACpC,CAAA,MAAO;AACH,UAAA,IAAI,SAAS,IAAA,EAAM;AACf,YAAA,MAAA,CAAO,KAAK,QAAQ,CAAA;AAAA,UACxB;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ,CAAA;AAEA,IAAA,IAAA,CAAK,qBAAA,EAAsB,CACtB,IAAA,CAAK,CAAC,MAAA,KAAmB;AACtB,MAAA,KAAA,CAAM,MAAM;AACR,QAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,QAAA,MAAM,YAAA,GAAe,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AACvC,QAAA,IAAA,CAAK,aAAA,GAAgB,YAAA;AAErB,QAAA,MAAM,SAAwB,EAAC;AAC/B,QAAA,iBAAA,CAAkB,IAAA,CAAK,UAAA,CAAW,YAAA,EAAa,EAAG,MAAM,CAAA;AAExD,QAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AACxB,UAAA,MAAM,SAAA,GAAY,YAAA,CAAa,YAAA,EAAc,KAAA,CAAM,IAAK,CAAA;AACxD,UAAA,KAAA,CAAM,UAAU,EAAE,SAAS,CAAA;AAAA,QAC/B;AAAA,MACJ,CAAC,CAAA;AAAA,IACL,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,KAAA,KAAU;AACd,MAAA,IAAI,YAAA,CAAa,KAAK,CAAA,EAAG;AACrB,QAAA,GAAA,CAAI,KAAA,CAAM,CAAA,OAAA,EAAU,IAAA,CAAK,EAAE,CAAA,iDAAA,CAAmD,CAAA;AAC9E,QAAA;AAAA,MACJ;AACA,MAAA,GAAA,CAAI,KAAA,CAAM,CAAA,4CAAA,EAA+C,IAAA,CAAK,EAAE,KAAK,KAAK,CAAA;AAAA,IAC9E,CAAC,CAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,mBAAmB,MAAA,EAAkB;AACjC,IAAA,IAAA,CAAK,QAAQ,YAAA,CAAa;AAAA,MACtB,QAAA,EAAU;AAAA,KACb,CAAA;AAID,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,KAAW,CAAA,GAAI,OAAO,IAAA,CAAK,OAAA;AACjD,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,SAAA,EAAU,KAAM,MAAA,EAAQ;AACpC,MAAA,IAAA,CAAK,MAAA,CAAO,UAAU,MAAM,CAAA;AAAA,IAChC;AAAA,EACJ;AAAA,EAEA,qBAAA,GAAwB;AACpB,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,MAAM,aAAA,GAAgB,CAAC,QAAA,KAA0B;AAC7C,MAAA,IAAI,CAAC,SAAS,OAAA,EAAS;AACnB,QAAA;AAAA,MACJ;AAEA,MAAA,MAAM,eAAA,GAAkB,QAAA,CAAS,SAAA,CAAU,iBAAiB,CAAA,EAAE;AAC9D,MAAA,IAAI,gBAAgB,MAAA,EAAQ;AACxB,QAAA,KAAA,MAAW,kBAAkB,eAAA,EAAiB;AAC1C,UAAA,aAAA,CAAc,cAAc,CAAA;AAAA,QAChC;AAAA,MACJ,CAAA,MAAO;AAIH,QAAA,IAAI,SAAS,IAAA,EAAM;AACf,UAAA,MAAA,CAAO,IAAA,CAAK,SAAS,IAAI,CAAA;AAAA,QAC7B;AAAA,MACJ;AAAA,IACJ,CAAA;AAEA,IAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,SAAA,CAAU,iBAAiB,GAAE,EAAG;AACxD,MAAA,aAAA,CAAc,QAAQ,CAAA;AAAA,IAC1B;AACA,IAAA,OAAO,MAAA;AAAA,EACX;AAAA,EAEA,MAAM,qBAAA,GAAyC;AAC3C,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,QAAQ,CAAA,EAAE,CAAE,WAAA;AACrC,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,iDAAA,CAAA;AACxB,IAAA,OAAO,SAAA,CAAU,GAAA,EAAK,WAAA,EAAa,IAAA,CAAK,iBAAiB,MAAM,CAAA;AAAA,EACnE;AAAA,EAEA,MAAM,UAAA,CAAW,YAAA,EAA4B,QAAA,EAAiC;AAC1E,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,QAAQ,CAAA,EAAE,CAAE,WAAA;AACrC,IAAA,MAAM,KAAA,GAAQ,aAAa,QAAA,EAAS;AAEpC,IAAA,MAAM,QAAA,GAAW,MAAM,WAAA,CAAY,KAAA,CAAM,QAAQ,CAAA;AACjD,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,QAAA,CAAS,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,IACpE;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AAC1C,IAAA,MAAM,SAAS,MAAM;AAGjB,MAAA,GAAA,CAAI,gBAAgB,SAAS,CAAA;AAC7B,MAAA,KAAA,CAAM,mBAAA,CAAoB,QAAQ,MAAM,CAAA;AACxC,MAAA,KAAA,CAAM,mBAAA,CAAoB,SAAS,MAAM,CAAA;AAAA,IAC7C,CAAA;AAEA,IAAA,KAAA,CAAM,gBAAA,CAAiB,QAAQ,MAAM,CAAA;AACrC,IAAA,KAAA,CAAM,gBAAA,CAAiB,SAAS,MAAM,CAAA;AACtC,IAAA,KAAA,CAAM,GAAA,GAAM,SAAA;AAAA,EAChB;AACJ;;;;"}
1
+ {"version":3,"file":"WMSLayer.js","sources":["WMSLayer.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { batch, computed, ReadonlyReactive, watch } from \"@conterra/reactivity-core\";\nimport {\n createLogger,\n deprecated,\n destroyResource,\n isAbortError,\n Resource\n} from \"@open-pioneer/core\";\nimport { ImageWrapper } from \"ol\";\nimport WMSCapabilities from \"ol/format/WMSCapabilities\";\nimport ImageLayer from \"ol/layer/Image\";\nimport type ImageSource from \"ol/source/Image\";\nimport type { Options as WMSSourceOptions } from \"ol/source/ImageWMS\";\nimport ImageWMS from \"ol/source/ImageWMS\";\nimport type { LayerFactory } from \"../LayerFactory\";\nimport { MapModel } from \"../model/MapModel\";\nimport { fetchText } from \"../utils/fetch\";\nimport { INTERNAL_CONSTRUCTOR_TAG, InternalConstructorTag } from \"../utils/InternalConstructorTag\";\nimport { AbstractLayer } from \"./AbstractLayer\";\nimport {\n ATTACH_TO_MAP,\n ATTACH_TO_PARENT,\n DETACH_FROM_MAP,\n GET_DEPS,\n GET_RAW_SUBLAYERS,\n LayerConstructor,\n LayerDependencies,\n SET_LEGEND\n} from \"./shared/internals\";\nimport { LayerConfig } from \"./shared/LayerConfig\";\nimport { SublayersCollection } from \"./shared/SublayersCollection\";\nimport { getLegendUrl } from \"./wms/getLegendUrl\";\nimport { constructSublayers, WMSSublayer, WMSSublayerConfig } from \"./wms/WMSSublayer\";\n\n/**\n * Configuration options to construct a {@link WMSLayer}.\n *\n * @group Layers\n */\nexport interface WMSLayerConfig extends LayerConfig {\n /** URL of the WMS service. */\n url: string;\n\n /** Configures the layer's sublayers. */\n sublayers?: WMSSublayerConfig[];\n\n /**\n * Additional source options for the layer's WMS source.\n *\n * NOTE: These options are intended for advanced configuration:\n * the WMS Layer manages some of the OpenLayers source options itself.\n */\n sourceOptions?: Partial<WMSSourceOptions>;\n\n /**\n * Whether to automatically fetch capabilities from the service when needed (default: `true`).\n *\n * Setting this to `false` can be useful as a performance optimization when capabilities are not really required by the application.\n * Note that this will disable some features of the WMS layer: for example, the legend URL will not be available.\n */\n fetchCapabilities?: boolean;\n}\n\nconst LOG = createLogger(\"map:WMSLayer\");\n\nconst deprecatedConstructor = deprecated({\n name: \"WMSLayer constructor\",\n packageName: \"@open-pioneer/map\",\n since: \"v1.0.0\",\n alternative: \"use LayerFactory.create() instead\"\n});\n\n/**\n * Displays an OGC Web Map Service (WMS).\n *\n * @group Layers\n */\nexport class WMSLayer extends AbstractLayer {\n #url: string;\n #sublayers: SublayersCollection<WMSSublayer>;\n #layer: ImageLayer<ImageSource>;\n #source: ImageWMS;\n #fetchCapabilities: boolean;\n\n #loadStarted = false;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n #capabilities: Record<string, any> | undefined;\n readonly #abortController = new AbortController();\n\n #visibleSublayers: ReadonlyReactive<string[]>;\n #sublayersWatch: Resource | undefined;\n\n /**\n * @deprecated Prefer using {@link LayerFactory.create} instead of calling the constructor directly\n */\n constructor(config: WMSLayerConfig);\n\n /**\n * NOTE: Do not use this overload. Use {@link LayerFactory.create} instead.\n *\n * @internal\n */\n constructor(\n config: WMSLayerConfig,\n deps: LayerDependencies,\n internalTag: InternalConstructorTag\n );\n constructor(\n config: WMSLayerConfig,\n deps?: LayerDependencies,\n internalTag?: InternalConstructorTag\n ) {\n if (!internalTag) {\n deprecatedConstructor();\n }\n\n const layer = new ImageLayer();\n super(\n {\n ...config,\n olLayer: layer\n },\n deps,\n internalTag\n );\n const source = new ImageWMS({\n ...config.sourceOptions,\n url: config.url,\n params: {\n ...config.sourceOptions?.params\n },\n // Use http service to load tiles; needed for authentication etc.\n imageLoadFunction: (wrapper, url) => {\n return this.#loadImage(wrapper, url).catch((error) => {\n LOG.error(`Failed to load tile at '${url}'`, error);\n });\n }\n });\n this.#url = config.url;\n this.#fetchCapabilities = config.fetchCapabilities ?? true;\n this.#source = source;\n this.#layer = layer;\n\n this.#sublayers = new SublayersCollection(\n constructSublayers(config.sublayers),\n INTERNAL_CONSTRUCTOR_TAG\n );\n this.#sublayers\n [GET_RAW_SUBLAYERS]()\n .forEach((sublayer) => sublayer[ATTACH_TO_PARENT](this, this));\n\n this.#visibleSublayers = computed(() => this.#getVisibleLayerNames(), {\n equal(a, b) {\n return a.length === b.length && a.every((v, i) => v === b[i]);\n }\n });\n\n this.#sublayersWatch = watch(\n () => [this.#visibleSublayers.value],\n ([layers]) => {\n this.#updateLayersParam(layers);\n },\n {\n immediate: true\n }\n );\n }\n\n override destroy() {\n this.#abortController.abort();\n this.#sublayersWatch = destroyResource(this.#sublayersWatch);\n super.destroy();\n }\n\n get type() {\n return \"wms\" as const;\n }\n\n get legend() {\n return undefined;\n }\n\n /** The URL of the WMS service that was used during layer construction. */\n get url(): string {\n return this.#url;\n }\n\n get layers(): undefined {\n return undefined;\n }\n\n /**\n * Holds the sublayers of this layer.\n */\n get sublayers(): SublayersCollection<WMSSublayer> {\n return this.#sublayers;\n }\n\n get capabilities() {\n return this.#capabilities;\n }\n\n /** @internal */\n [ATTACH_TO_MAP](map: MapModel): void {\n super[ATTACH_TO_MAP](map);\n for (const sublayer of this.#sublayers.getSublayers()) {\n sublayer[ATTACH_TO_MAP](map);\n }\n\n this.#load();\n }\n\n /** @internal */\n [DETACH_FROM_MAP](): void {\n super[DETACH_FROM_MAP]();\n for (const sublayer of this.#sublayers.getSublayers()) {\n sublayer[DETACH_FROM_MAP]();\n }\n }\n\n #load() {\n if (this.#loadStarted || !this.#fetchCapabilities) {\n return;\n }\n this.#loadStarted = true;\n\n /** Find all leaf nodes representing a layer in the structure */\n const getNestedSublayer = (sublayers: WMSSublayer[], layers: WMSSublayer[]) => {\n for (const sublayer of sublayers) {\n const nested = sublayer.sublayers.getSublayers();\n if (nested.length) {\n getNestedSublayer(nested, layers);\n } else {\n if (sublayer.name) {\n layers.push(sublayer);\n }\n }\n }\n };\n\n this.#fetchWMSCapabilities()\n .then((result: string) => {\n batch(() => {\n const parser = new WMSCapabilities();\n const capabilities = parser.read(result);\n this.#capabilities = capabilities;\n\n const layers: WMSSublayer[] = [];\n getNestedSublayer(this.#sublayers.getSublayers(), layers);\n\n for (const layer of layers) {\n const legendUrl = getLegendUrl(capabilities, layer.name!);\n layer[SET_LEGEND](legendUrl);\n }\n });\n })\n .catch((error) => {\n if (isAbortError(error)) {\n LOG.debug(`Layer '${this.id}' has been destroyed before fetching capabilities`);\n return;\n }\n LOG.error(`Failed to fetch WMS capabilities for layer '${this.id}'`, error);\n });\n }\n\n /**\n * Gathers the visibility of _all_ sublayers and assembles the 'layers' WMS parameter.\n * The parameters are then applied to the WMS source.\n */\n #updateLayersParam(layers: string[]) {\n this.#source.updateParams({\n \"LAYERS\": layers\n });\n\n // only set source if there are visible sublayers, otherwise\n // we send an invalid http request\n const source = layers.length === 0 ? null : this.#source;\n if (this.#layer.getSource() !== source) {\n this.#layer.setSource(source);\n }\n }\n\n #getVisibleLayerNames() {\n const layers: string[] = [];\n const visitSublayer = (sublayer: WMSSublayer) => {\n if (!sublayer.visible) {\n return;\n }\n\n const nestedSublayers = sublayer.sublayers[GET_RAW_SUBLAYERS]();\n if (nestedSublayers.length) {\n for (const nestedSublayer of nestedSublayers) {\n visitSublayer(nestedSublayer);\n }\n } else {\n /**\n * Push sublayer only, if layer name is not an empty string | undefined | ...\n */\n if (sublayer.name) {\n layers.push(sublayer.name);\n }\n }\n };\n\n for (const sublayer of this.sublayers[GET_RAW_SUBLAYERS]()) {\n visitSublayer(sublayer);\n }\n return layers;\n }\n\n async #fetchWMSCapabilities(): Promise<string> {\n const httpService = this[GET_DEPS]().httpService;\n const url = `${this.#url}?LANGUAGE=ger&SERVICE=WMS&REQUEST=GetCapabilities`;\n return fetchText(url, httpService, this.#abortController.signal);\n }\n\n async #loadImage(imageWrapper: ImageWrapper, imageUrl: string): Promise<void> {\n const httpService = this[GET_DEPS]().httpService;\n const image = imageWrapper.getImage() as HTMLImageElement;\n\n const response = await httpService.fetch(imageUrl);\n if (!response.ok) {\n throw new Error(`Request failed with status ${response.status}.`);\n }\n\n const blob = await response.blob();\n const objectUrl = URL.createObjectURL(blob);\n const finish = () => {\n // Cleanup object URL after load to prevent memory leaks.\n // https://stackoverflow.com/questions/62473876/openlayers-6-settileloadfunction-documented-example-uses-url-createobjecturld\n URL.revokeObjectURL(objectUrl);\n image.removeEventListener(\"load\", finish);\n image.removeEventListener(\"error\", finish);\n };\n\n image.addEventListener(\"load\", finish);\n image.addEventListener(\"error\", finish);\n image.src = objectUrl;\n }\n}\n\n// Ensure layer class is assignable to the constructor interface (there is no \"implements\" for the class itself).\n// eslint-disable-next-line no-constant-condition\nif (false) {\n const check: LayerConstructor<WMSLayerConfig, WMSLayer> = WMSLayer;\n void check;\n}\n"],"names":[],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  import type { Options as WMSSourceOptions } from "ol/source/ImageWMS";
2
2
  import { MapModel } from "../model/MapModel";
3
+ import { InternalConstructorTag } from "../utils/InternalConstructorTag";
3
4
  import { AbstractLayer } from "./AbstractLayer";
4
5
  import { LayerConfig } from "./shared/LayerConfig";
5
6
  import { ATTACH_TO_MAP, LayerDependencies } from "./shared/internals";
6
- import { InternalConstructorTag } from "../utils/InternalConstructorTag";
7
7
  /**
8
8
  * Configuration options supported by {@link WMTSLayer}.
9
9
  *
@@ -1 +1 @@
1
- {"version":3,"file":"WMTSLayer.js","sources":["WMTSLayer.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { reactive } from \"@conterra/reactivity-core\";\nimport { createLogger, deprecated, isAbortError } from \"@open-pioneer/core\";\nimport { ImageTile } from \"ol\";\nimport Tile from \"ol/Tile\";\nimport TileState from \"ol/TileState\";\nimport WMTSCapabilities from \"ol/format/WMTSCapabilities\";\nimport TileLayer from \"ol/layer/Tile\";\nimport type { Options as WMSSourceOptions } from \"ol/source/ImageWMS\";\nimport type TileSourceType from \"ol/source/Tile\";\nimport WMTS, { optionsFromCapabilities } from \"ol/source/WMTS\";\nimport { MapModel } from \"../model/MapModel\";\nimport { fetchText } from \"../utils/fetch\";\nimport { AbstractLayer } from \"./AbstractLayer\";\nimport { LayerConfig } from \"./shared/LayerConfig\";\nimport { ATTACH_TO_MAP, GET_DEPS, LayerConstructor, LayerDependencies } from \"./shared/internals\";\nimport { InternalConstructorTag } from \"../utils/InternalConstructorTag\";\nimport { getLegendUrl } from \"./wmts/getLegendUrl\";\n\n// Import for api docs\n// eslint-disable-next-line unused-imports/no-unused-imports\nimport type { LayerFactory } from \"../LayerFactory\";\n\n/**\n * Configuration options supported by {@link WMTSLayer}.\n *\n * @group Layers\n */\nexport interface WMTSLayerConfig extends LayerConfig {\n /** URL of the WMTS service. */\n url: string;\n\n /** The name of the WMTS layer in the service's capabilities. */\n name: string;\n\n /** The name of the tile matrix set in the service's capabilities. */\n matrixSet: string;\n\n /**\n * Additional source options for the layer's WMTS source.\n *\n * NOTE: These options are intended for advanced configuration:\n * the WMTS Layer manages some of the OpenLayers source options itself.\n */\n sourceOptions?: Partial<WMSSourceOptions>;\n}\n\nconst LOG = createLogger(\"map:WMTSLayer\");\n\nconst deprecatedConstructor = deprecated({\n name: \"WMTSLayer constructor\",\n packageName: \"@open-pioneer/map\",\n since: \"v1.0.0\",\n alternative: \"use LayerFactory.create() instead\"\n});\n\n/**\n * Displays an OGC Web Map Tile Service (WMTS).\n *\n * @group Layers\n */\nexport class WMTSLayer extends AbstractLayer {\n #url: string;\n #name: string;\n #matrixSet: string;\n #layer: TileLayer<TileSourceType>;\n #source: WMTS | undefined;\n #sourceOptions?: Partial<WMSSourceOptions>;\n #legend = reactive<string | undefined>();\n\n #loadStarted = false;\n\n readonly #abortController = new AbortController();\n\n /**\n * @deprecated Prefer using {@link LayerFactory.create} instead of calling the constructor directly\n */\n constructor(config: WMTSLayerConfig);\n\n /**\n * NOTE: Do not use this overload. Use {@link LayerFactory.create} instead.\n *\n * @internal\n */\n constructor(\n config: WMTSLayerConfig,\n deps: LayerDependencies,\n internalTag: InternalConstructorTag\n );\n\n constructor(\n config: WMTSLayerConfig,\n deps?: LayerDependencies,\n internalTag?: InternalConstructorTag\n ) {\n if (!internalTag) {\n deprecatedConstructor();\n }\n\n const layer = new TileLayer();\n super(\n {\n ...config,\n olLayer: layer\n },\n deps,\n internalTag\n );\n this.#url = config.url;\n this.#name = config.name;\n this.#layer = layer;\n this.#matrixSet = config.matrixSet;\n this.#sourceOptions = config.sourceOptions;\n }\n\n destroy(): void {\n this.#abortController.abort();\n super.destroy();\n }\n\n get type() {\n return \"wmts\" as const;\n }\n\n /** URL of the WMTS service. */\n override get legend(): string | undefined {\n return this.#legend.value;\n }\n\n override get sublayers(): undefined {\n return undefined;\n }\n\n override get layers(): undefined {\n return undefined;\n }\n\n get url() {\n return this.#url;\n }\n\n /** The name of the WMTS layer in the service's capabilities. */\n get name() {\n return this.#name;\n }\n\n /** The name of the tile matrix set in the service's capabilities. */\n get matrixSet() {\n return this.#matrixSet;\n }\n\n override [ATTACH_TO_MAP](map: MapModel): void {\n super[ATTACH_TO_MAP](map);\n this.#load();\n }\n\n #load() {\n if (this.#loadStarted) {\n return;\n }\n this.#loadStarted = true;\n this.#fetchWMTSCapabilities()\n .then((result: string) => {\n const parser = new WMTSCapabilities();\n const capabilities = parser.read(result);\n const options = optionsFromCapabilities(capabilities, {\n layer: this.#name,\n matrixSet: this.#matrixSet\n });\n if (!options) {\n throw new Error(\"Layer was not found in capabilities\");\n }\n const source = new WMTS({\n ...options,\n ...this.#sourceOptions,\n tileLoadFunction: (tile, tileUrl) => {\n this.#loadTile(tile, tileUrl);\n }\n });\n this.#source = source;\n this.#layer.setSource(this.#source);\n const activeStyleId = source.getStyle();\n const legendUrl = getLegendUrl(capabilities, this.name, activeStyleId);\n this.#legend.value = legendUrl;\n })\n .catch((error) => {\n if (isAbortError(error)) {\n LOG.debug(`Layer ${this.name} has been destroyed before fetching the data`);\n LOG.debug(`Layer ${this.name} has been destroyed before fetching the data`);\n return;\n }\n LOG.error(`Failed fetching WMTS capabilities for Layer ${this.name}`, error);\n });\n }\n\n async #fetchWMTSCapabilities(): Promise<string> {\n const httpService = this[GET_DEPS]().httpService;\n return fetchText(this.#url, httpService, this.#abortController.signal);\n }\n\n async #loadTile(tile: Tile, tileUrl: string): Promise<void> {\n const httpService = this[GET_DEPS]().httpService;\n try {\n if (!(tile instanceof ImageTile)) {\n throw new Error(\"Only 'ImageTile' is supported for now.\");\n }\n\n const image = tile.getImage();\n if (!isHtmlImage(image)) {\n // Could also be canvas or video\n throw new Error(\"Only <img> tags are supported as tiles for now.\");\n }\n\n const response = await httpService.fetch(tileUrl);\n if (!response.ok) {\n throw new Error(`Tile request failed with status ${response.status}.`);\n }\n\n const blob = await response.blob();\n const objectUrl = URL.createObjectURL(blob);\n const finish = () => {\n // Cleanup object URL after load to prevent memory leaks.\n // https://stackoverflow.com/questions/62473876/openlayers-6-settileloadfunction-documented-example-uses-url-createobjecturld\n URL.revokeObjectURL(objectUrl);\n image.removeEventListener(\"load\", finish);\n image.removeEventListener(\"error\", finish);\n };\n image.addEventListener(\"load\", finish);\n image.addEventListener(\"error\", finish);\n image.src = objectUrl;\n } catch (e) {\n tile.setState(TileState.ERROR);\n if (!isAbortError(e)) {\n LOG.error(\"Failed to load tile\", e);\n }\n }\n }\n}\n\n// Ensure layer class is assignable to the constructor interface (there is no \"implements\" for the class itself).\n// eslint-disable-next-line no-constant-condition\nif (false) {\n const check: LayerConstructor<WMTSLayerConfig, WMTSLayer> = WMTSLayer;\n void check;\n}\n\nfunction isHtmlImage(htmlElement: HTMLElement): htmlElement is HTMLImageElement {\n return htmlElement.tagName === \"IMG\";\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"WMTSLayer.js","sources":["WMTSLayer.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { reactive } from \"@conterra/reactivity-core\";\nimport { createLogger, deprecated, isAbortError } from \"@open-pioneer/core\";\nimport { ImageTile } from \"ol\";\nimport Tile from \"ol/Tile\";\nimport TileState from \"ol/TileState\";\nimport WMTSCapabilities from \"ol/format/WMTSCapabilities\";\nimport TileLayer from \"ol/layer/Tile\";\nimport type { Options as WMSSourceOptions } from \"ol/source/ImageWMS\";\nimport type TileSourceType from \"ol/source/Tile\";\nimport WMTS, { optionsFromCapabilities } from \"ol/source/WMTS\";\nimport type { LayerFactory } from \"../LayerFactory\";\nimport { MapModel } from \"../model/MapModel\";\nimport { InternalConstructorTag } from \"../utils/InternalConstructorTag\";\nimport { fetchText } from \"../utils/fetch\";\nimport { AbstractLayer } from \"./AbstractLayer\";\nimport { LayerConfig } from \"./shared/LayerConfig\";\nimport { ATTACH_TO_MAP, GET_DEPS, LayerConstructor, LayerDependencies } from \"./shared/internals\";\nimport { getLegendUrl } from \"./wmts/getLegendUrl\";\n\n/**\n * Configuration options supported by {@link WMTSLayer}.\n *\n * @group Layers\n */\nexport interface WMTSLayerConfig extends LayerConfig {\n /** URL of the WMTS service. */\n url: string;\n\n /** The name of the WMTS layer in the service's capabilities. */\n name: string;\n\n /** The name of the tile matrix set in the service's capabilities. */\n matrixSet: string;\n\n /**\n * Additional source options for the layer's WMTS source.\n *\n * NOTE: These options are intended for advanced configuration:\n * the WMTS Layer manages some of the OpenLayers source options itself.\n */\n sourceOptions?: Partial<WMSSourceOptions>;\n}\n\nconst LOG = createLogger(\"map:WMTSLayer\");\n\nconst deprecatedConstructor = deprecated({\n name: \"WMTSLayer constructor\",\n packageName: \"@open-pioneer/map\",\n since: \"v1.0.0\",\n alternative: \"use LayerFactory.create() instead\"\n});\n\n/**\n * Displays an OGC Web Map Tile Service (WMTS).\n *\n * @group Layers\n */\nexport class WMTSLayer extends AbstractLayer {\n #url: string;\n #name: string;\n #matrixSet: string;\n #layer: TileLayer<TileSourceType>;\n #source: WMTS | undefined;\n #sourceOptions?: Partial<WMSSourceOptions>;\n #legend = reactive<string | undefined>();\n\n #loadStarted = false;\n\n readonly #abortController = new AbortController();\n\n /**\n * @deprecated Prefer using {@link LayerFactory.create} instead of calling the constructor directly\n */\n constructor(config: WMTSLayerConfig);\n\n /**\n * NOTE: Do not use this overload. Use {@link LayerFactory.create} instead.\n *\n * @internal\n */\n constructor(\n config: WMTSLayerConfig,\n deps: LayerDependencies,\n internalTag: InternalConstructorTag\n );\n\n constructor(\n config: WMTSLayerConfig,\n deps?: LayerDependencies,\n internalTag?: InternalConstructorTag\n ) {\n if (!internalTag) {\n deprecatedConstructor();\n }\n\n const layer = new TileLayer();\n super(\n {\n ...config,\n olLayer: layer\n },\n deps,\n internalTag\n );\n this.#url = config.url;\n this.#name = config.name;\n this.#layer = layer;\n this.#matrixSet = config.matrixSet;\n this.#sourceOptions = config.sourceOptions;\n }\n\n destroy(): void {\n this.#abortController.abort();\n super.destroy();\n }\n\n get type() {\n return \"wmts\" as const;\n }\n\n /** URL of the WMTS service. */\n override get legend(): string | undefined {\n return this.#legend.value;\n }\n\n override get sublayers(): undefined {\n return undefined;\n }\n\n override get layers(): undefined {\n return undefined;\n }\n\n get url() {\n return this.#url;\n }\n\n /** The name of the WMTS layer in the service's capabilities. */\n get name() {\n return this.#name;\n }\n\n /** The name of the tile matrix set in the service's capabilities. */\n get matrixSet() {\n return this.#matrixSet;\n }\n\n override [ATTACH_TO_MAP](map: MapModel): void {\n super[ATTACH_TO_MAP](map);\n this.#load();\n }\n\n #load() {\n if (this.#loadStarted) {\n return;\n }\n this.#loadStarted = true;\n this.#fetchWMTSCapabilities()\n .then((result: string) => {\n const parser = new WMTSCapabilities();\n const capabilities = parser.read(result);\n const options = optionsFromCapabilities(capabilities, {\n layer: this.#name,\n matrixSet: this.#matrixSet\n });\n if (!options) {\n throw new Error(\"Layer was not found in capabilities\");\n }\n const source = new WMTS({\n ...options,\n ...this.#sourceOptions,\n tileLoadFunction: (tile, tileUrl) => {\n this.#loadTile(tile, tileUrl);\n }\n });\n this.#source = source;\n this.#layer.setSource(this.#source);\n const activeStyleId = source.getStyle();\n const legendUrl = getLegendUrl(capabilities, this.name, activeStyleId);\n this.#legend.value = legendUrl;\n })\n .catch((error) => {\n if (isAbortError(error)) {\n LOG.debug(`Layer ${this.name} has been destroyed before fetching the data`);\n LOG.debug(`Layer ${this.name} has been destroyed before fetching the data`);\n return;\n }\n LOG.error(`Failed fetching WMTS capabilities for Layer ${this.name}`, error);\n });\n }\n\n async #fetchWMTSCapabilities(): Promise<string> {\n const httpService = this[GET_DEPS]().httpService;\n return fetchText(this.#url, httpService, this.#abortController.signal);\n }\n\n async #loadTile(tile: Tile, tileUrl: string): Promise<void> {\n const httpService = this[GET_DEPS]().httpService;\n try {\n if (!(tile instanceof ImageTile)) {\n throw new Error(\"Only 'ImageTile' is supported for now.\");\n }\n\n const image = tile.getImage();\n if (!isHtmlImage(image)) {\n // Could also be canvas or video\n throw new Error(\"Only <img> tags are supported as tiles for now.\");\n }\n\n const response = await httpService.fetch(tileUrl);\n if (!response.ok) {\n throw new Error(`Tile request failed with status ${response.status}.`);\n }\n\n const blob = await response.blob();\n const objectUrl = URL.createObjectURL(blob);\n const finish = () => {\n // Cleanup object URL after load to prevent memory leaks.\n // https://stackoverflow.com/questions/62473876/openlayers-6-settileloadfunction-documented-example-uses-url-createobjecturld\n URL.revokeObjectURL(objectUrl);\n image.removeEventListener(\"load\", finish);\n image.removeEventListener(\"error\", finish);\n };\n image.addEventListener(\"load\", finish);\n image.addEventListener(\"error\", finish);\n image.src = objectUrl;\n } catch (e) {\n tile.setState(TileState.ERROR);\n if (!isAbortError(e)) {\n LOG.error(\"Failed to load tile\", e);\n }\n }\n }\n}\n\n// Ensure layer class is assignable to the constructor interface (there is no \"implements\" for the class itself).\n// eslint-disable-next-line no-constant-condition\nif (false) {\n const check: LayerConstructor<WMTSLayerConfig, WMTSLayer> = WMTSLayer;\n void check;\n}\n\nfunction isHtmlImage(htmlElement: HTMLElement): htmlElement is HTMLImageElement {\n return htmlElement.tagName === \"IMG\";\n}\n"],"names":[],"mappings":"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"}
@@ -1,8 +1,8 @@
1
- import { LayerRetrievalOptions, RecursiveRetrievalOptions } from "./LayerRetrievalOptions";
1
+ import { InternalConstructorTag } from "../../utils/InternalConstructorTag";
2
2
  import { Sublayer } from "../unions";
3
3
  import { ChildrenCollection } from "./ChildrenCollection";
4
4
  import { GET_RAW_SUBLAYERS } from "./internals";
5
- import { InternalConstructorTag } from "../../utils/InternalConstructorTag";
5
+ import { LayerRetrievalOptions, RecursiveRetrievalOptions } from "./LayerRetrievalOptions";
6
6
  import { SublayerBaseType } from "./SublayerBaseType";
7
7
  /**
8
8
  * Contains the sublayers that belong to a {@link Layer} or {@link Sublayer}.
@@ -1,6 +1,6 @@
1
+ import { assertInternalConstructor } from '../../utils/InternalConstructorTag.js';
1
2
  import { getRecursiveLayers } from './getRecursiveLayers.js';
2
3
  import { GET_RAW_SUBLAYERS } from './internals.js';
3
- import { assertInternalConstructor } from '../../utils/InternalConstructorTag.js';
4
4
 
5
5
  class SublayersCollection {
6
6
  #sublayers;
@@ -1 +1 @@
1
- {"version":3,"file":"SublayersCollection.js","sources":["SublayersCollection.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { getRecursiveLayers } from \"./getRecursiveLayers\";\nimport { LayerRetrievalOptions, RecursiveRetrievalOptions } from \"./LayerRetrievalOptions\";\nimport { Sublayer } from \"../unions\";\nimport { ChildrenCollection } from \"./ChildrenCollection\";\nimport { GET_RAW_SUBLAYERS } from \"./internals\";\nimport {\n assertInternalConstructor,\n InternalConstructorTag\n} from \"../../utils/InternalConstructorTag\";\nimport { SublayerBaseType } from \"./SublayerBaseType\";\n\n// Imported for typedoc\n// eslint-disable-next-line unused-imports/no-unused-imports\nimport { Layer } from \"../unions\";\n\n/**\n * Contains the sublayers that belong to a {@link Layer} or {@link Sublayer}.\n *\n * @group Layer Utilities\n */\n// NOTE: adding / removing sublayers currently not supported\nexport class SublayersCollection<SublayerType extends SublayerBaseType>\n implements ChildrenCollection<SublayerType>\n{\n #sublayers: SublayerType[];\n\n /** @internal */\n constructor(sublayers: SublayerType[], tag: InternalConstructorTag) {\n assertInternalConstructor(tag);\n this.#sublayers = sublayers;\n }\n\n destroy() {\n for (const layer of this.#sublayers) {\n layer.destroy();\n }\n this.#sublayers = [];\n }\n\n // Generic method name for consistent interface\n getItems(options?: LayerRetrievalOptions): SublayerType[] {\n return this.getSublayers(options);\n }\n\n /**\n * Returns the child sublayers in this collection.\n */\n getSublayers(_options?: LayerRetrievalOptions | undefined): SublayerType[] {\n // NOTE: sort options are ignored because layers are always ordered at this time.\n let allLayers = this.#sublayers.slice();\n\n if (!_options?.includeInternalLayers) {\n allLayers = allLayers.filter((l) => !l.internal);\n }\n\n return allLayers;\n }\n\n /**\n * Returns a list of all layers in the collection, including all children (recursively).\n *\n * > Note: This includes base layers by default (see `options.filter`).\n * > Use the `\"base\"` or `\"operational\"` short hand values to filter by base layer or operational layers.\n * >\n * > If the collection contains many, deeply nested sublayers, this function could potentially be expensive.\n */\n getRecursiveLayers(_options?: RecursiveRetrievalOptions): Sublayer[] {\n return getRecursiveLayers({\n // NOTE: This is safe (but not elegant) because this class does not know about the entire type hierarchy (unions).\n // _Might_ be possible to refactor this class to use the Sublayer union instead in the generic type parameters,\n // but then we might also introduce a cycle in the type definitions, which could be bad (?).\n from: this as unknown as SublayersCollection<Sublayer>,\n sortByDisplayOrder: _options?.sortByDisplayOrder,\n includeInternalLayers: _options?.includeInternalLayers,\n filter: _options?.filter\n }) as Sublayer[]; // we know for sure that all children are sublayers: sublayers do not point to layers\n }\n\n /**\n * Returns a reference to the internal sublayers array.\n *\n * NOTE: Do not modify directly!\n *\n * @internal\n */\n [GET_RAW_SUBLAYERS](): SublayerType[] {\n return this.#sublayers;\n }\n}\n"],"names":[],"mappings":";;;;AAuBO,MAAM,mBAAA,CAEb;AAAA,EACI,UAAA;AAAA;AAAA,EAGA,WAAA,CAAY,WAA2B,GAAA,EAA6B;AAChE,IAAA,yBAAA,CAA0B,GAAG,CAAA;AAC7B,IAAA,IAAA,CAAK,UAAA,GAAa,SAAA;AAAA,EACtB;AAAA,EAEA,OAAA,GAAU;AACN,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,UAAA,EAAY;AACjC,MAAA,KAAA,CAAM,OAAA,EAAQ;AAAA,IAClB;AACA,IAAA,IAAA,CAAK,aAAa,EAAC;AAAA,EACvB;AAAA;AAAA,EAGA,SAAS,OAAA,EAAiD;AACtD,IAAA,OAAO,IAAA,CAAK,aAAa,OAAO,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,QAAA,EAA8D;AAEvE,IAAA,IAAI,SAAA,GAAY,IAAA,CAAK,UAAA,CAAW,KAAA,EAAM;AAEtC,IAAA,IAAI,CAAC,UAAU,qBAAA,EAAuB;AAClC,MAAA,SAAA,GAAY,UAAU,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,EAAE,QAAQ,CAAA;AAAA,IACnD;AAEA,IAAA,OAAO,SAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,mBAAmB,QAAA,EAAkD;AACjE,IAAA,OAAO,kBAAA,CAAmB;AAAA;AAAA;AAAA;AAAA,MAItB,IAAA,EAAM,IAAA;AAAA,MACN,oBAAoB,QAAA,EAAU,kBAAA;AAAA,MAC9B,uBAAuB,QAAA,EAAU,qBAAA;AAAA,MACjC,QAAQ,QAAA,EAAU;AAAA,KACrB,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,CAAC,iBAAiB,CAAA,GAAoB;AAClC,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EAChB;AACJ;;;;"}
1
+ {"version":3,"file":"SublayersCollection.js","sources":["SublayersCollection.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport {\n assertInternalConstructor,\n InternalConstructorTag\n} from \"../../utils/InternalConstructorTag\";\nimport { Layer, Sublayer } from \"../unions\";\nimport { ChildrenCollection } from \"./ChildrenCollection\";\nimport { getRecursiveLayers } from \"./getRecursiveLayers\";\nimport { GET_RAW_SUBLAYERS } from \"./internals\";\nimport { LayerRetrievalOptions, RecursiveRetrievalOptions } from \"./LayerRetrievalOptions\";\nimport { SublayerBaseType } from \"./SublayerBaseType\";\n\n/**\n * Contains the sublayers that belong to a {@link Layer} or {@link Sublayer}.\n *\n * @group Layer Utilities\n */\n// NOTE: adding / removing sublayers currently not supported\nexport class SublayersCollection<SublayerType extends SublayerBaseType>\n implements ChildrenCollection<SublayerType>\n{\n #sublayers: SublayerType[];\n\n /** @internal */\n constructor(sublayers: SublayerType[], tag: InternalConstructorTag) {\n assertInternalConstructor(tag);\n this.#sublayers = sublayers;\n }\n\n destroy() {\n for (const layer of this.#sublayers) {\n layer.destroy();\n }\n this.#sublayers = [];\n }\n\n // Generic method name for consistent interface\n getItems(options?: LayerRetrievalOptions): SublayerType[] {\n return this.getSublayers(options);\n }\n\n /**\n * Returns the child sublayers in this collection.\n */\n getSublayers(_options?: LayerRetrievalOptions | undefined): SublayerType[] {\n // NOTE: sort options are ignored because layers are always ordered at this time.\n let allLayers = this.#sublayers.slice();\n\n if (!_options?.includeInternalLayers) {\n allLayers = allLayers.filter((l) => !l.internal);\n }\n\n return allLayers;\n }\n\n /**\n * Returns a list of all layers in the collection, including all children (recursively).\n *\n * > Note: This includes base layers by default (see `options.filter`).\n * > Use the `\"base\"` or `\"operational\"` short hand values to filter by base layer or operational layers.\n * >\n * > If the collection contains many, deeply nested sublayers, this function could potentially be expensive.\n */\n getRecursiveLayers(_options?: RecursiveRetrievalOptions): Sublayer[] {\n return getRecursiveLayers({\n // NOTE: This is safe (but not elegant) because this class does not know about the entire type hierarchy (unions).\n // _Might_ be possible to refactor this class to use the Sublayer union instead in the generic type parameters,\n // but then we might also introduce a cycle in the type definitions, which could be bad (?).\n from: this as unknown as SublayersCollection<Sublayer>,\n sortByDisplayOrder: _options?.sortByDisplayOrder,\n includeInternalLayers: _options?.includeInternalLayers,\n filter: _options?.filter\n }) as Sublayer[]; // we know for sure that all children are sublayers: sublayers do not point to layers\n }\n\n /**\n * Returns a reference to the internal sublayers array.\n *\n * NOTE: Do not modify directly!\n *\n * @internal\n */\n [GET_RAW_SUBLAYERS](): SublayerType[] {\n return this.#sublayers;\n }\n}\n"],"names":[],"mappings":";;;;AAmBO,MAAM,mBAAA,CAEb;AAAA,EACI,UAAA;AAAA;AAAA,EAGA,WAAA,CAAY,WAA2B,GAAA,EAA6B;AAChE,IAAA,yBAAA,CAA0B,GAAG,CAAA;AAC7B,IAAA,IAAA,CAAK,UAAA,GAAa,SAAA;AAAA,EACtB;AAAA,EAEA,OAAA,GAAU;AACN,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,UAAA,EAAY;AACjC,MAAA,KAAA,CAAM,OAAA,EAAQ;AAAA,IAClB;AACA,IAAA,IAAA,CAAK,aAAa,EAAC;AAAA,EACvB;AAAA;AAAA,EAGA,SAAS,OAAA,EAAiD;AACtD,IAAA,OAAO,IAAA,CAAK,aAAa,OAAO,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,QAAA,EAA8D;AAEvE,IAAA,IAAI,SAAA,GAAY,IAAA,CAAK,UAAA,CAAW,KAAA,EAAM;AAEtC,IAAA,IAAI,CAAC,UAAU,qBAAA,EAAuB;AAClC,MAAA,SAAA,GAAY,UAAU,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,EAAE,QAAQ,CAAA;AAAA,IACnD;AAEA,IAAA,OAAO,SAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,mBAAmB,QAAA,EAAkD;AACjE,IAAA,OAAO,kBAAA,CAAmB;AAAA;AAAA;AAAA;AAAA,MAItB,IAAA,EAAM,IAAA;AAAA,MACN,oBAAoB,QAAA,EAAU,kBAAA;AAAA,MAC9B,uBAAuB,QAAA,EAAU,qBAAA;AAAA,MACjC,QAAQ,QAAA,EAAU;AAAA,KACrB,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,CAAC,iBAAiB,CAAA,GAAoB;AAClC,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EAChB;AACJ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"unions.js","sources":["unions.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { type GroupLayer } from \"./GroupLayer\";\nimport { type SimpleLayer } from \"./SimpleLayer\";\nimport { type WMSSublayer } from \"./wms/WMSSublayer\";\nimport { type WMSLayer } from \"./WMSLayer\";\nimport { type WMTSLayer } from \"./WMTSLayer\";\n\n// Imports for typedoc\n// eslint-disable-next-line unused-imports/no-unused-imports\nimport { type SublayerBaseType } from \"./shared/SublayerBaseType\";\n// eslint-disable-next-line unused-imports/no-unused-imports\nimport { type LayerBaseType } from \"..\";\n\n/**\n * Supported layer type identifiers.\n *\n * NOTE: More layer types may be added in future versions.\n *\n * @group Layers\n */\nexport type LayerTypes = \"simple\" | \"wms\" | \"wmts\" | \"group\";\n\n/**\n * Supported sublayer type identifiers.\n *\n * NOTE: More sublayer types may be added in future versions.\n *\n * @group Layers\n */\nexport type SublayerTypes = \"wms-sublayer\";\n\n/**\n * Supported layer type identifiers for both operational layers and sublayers.\n *\n * @group Layers\n */\nexport type AnyLayerTypes = LayerTypes | SublayerTypes;\n\n/**\n * Union type for all layers (extending {@link LayerBaseType}).\n *\n * NOTE: More layer implementations may be added in future versions.\n *\n * @group Layers\n */\nexport type Layer = SimpleLayer | WMSLayer | WMTSLayer | GroupLayer;\n\n/**\n * Union type for all sublayers (extending {@link SublayerBaseType}.\n *\n * NOTE: More sublayer implementations may be added in future versions.\n *\n * @group Layers\n */\nexport type Sublayer = WMSSublayer;\n\n/**\n * Union for all types of layers\n *\n * @group Layers\n */\nexport type AnyLayer = Layer | Sublayer;\n\n/**\n * Type guard for checking if the layer is a {@link Sublayer}.\n *\n * @group Layers\n */\nexport function isSublayer(layer: AnyLayer): layer is Sublayer {\n return \"parentLayer\" in layer;\n}\n\n/**\n * Type guard for checking if the layer is a {@link Layer} (and not a {@link Sublayer}).\n *\n * @group Layers\n */\nexport function isLayer(layer: AnyLayer): layer is Layer {\n return \"olLayer\" in layer;\n}\n"],"names":[],"mappings":"AAqEO,SAAS,WAAW,KAAA,EAAoC;AAC3D,EAAA,OAAO,aAAA,IAAiB,KAAA;AAC5B;AAOO,SAAS,QAAQ,KAAA,EAAiC;AACrD,EAAA,OAAO,SAAA,IAAa,KAAA;AACxB;;;;"}
1
+ {"version":3,"file":"unions.js","sources":["unions.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { type LayerBaseType } from \"..\";\nimport { type GroupLayer } from \"./GroupLayer\";\nimport { type SublayerBaseType } from \"./shared/SublayerBaseType\";\nimport { type SimpleLayer } from \"./SimpleLayer\";\nimport { type WMSSublayer } from \"./wms/WMSSublayer\";\nimport { type WMSLayer } from \"./WMSLayer\";\nimport { type WMTSLayer } from \"./WMTSLayer\";\n\n/**\n * Supported layer type identifiers.\n *\n * NOTE: More layer types may be added in future versions.\n *\n * @group Layers\n */\nexport type LayerTypes = \"simple\" | \"wms\" | \"wmts\" | \"group\";\n\n/**\n * Supported sublayer type identifiers.\n *\n * NOTE: More sublayer types may be added in future versions.\n *\n * @group Layers\n */\nexport type SublayerTypes = \"wms-sublayer\";\n\n/**\n * Supported layer type identifiers for both operational layers and sublayers.\n *\n * @group Layers\n */\nexport type AnyLayerTypes = LayerTypes | SublayerTypes;\n\n/**\n * Union type for all layers (extending {@link LayerBaseType}).\n *\n * NOTE: More layer implementations may be added in future versions.\n *\n * @group Layers\n */\nexport type Layer = SimpleLayer | WMSLayer | WMTSLayer | GroupLayer;\n\n/**\n * Union type for all sublayers (extending {@link SublayerBaseType}.\n *\n * NOTE: More sublayer implementations may be added in future versions.\n *\n * @group Layers\n */\nexport type Sublayer = WMSSublayer;\n\n/**\n * Union for all types of layers\n *\n * @group Layers\n */\nexport type AnyLayer = Layer | Sublayer;\n\n/**\n * Type guard for checking if the layer is a {@link Sublayer}.\n *\n * @group Layers\n */\nexport function isSublayer(layer: AnyLayer): layer is Sublayer {\n return \"parentLayer\" in layer;\n}\n\n/**\n * Type guard for checking if the layer is a {@link Layer} (and not a {@link Sublayer}).\n *\n * @group Layers\n */\nexport function isLayer(layer: AnyLayer): layer is Layer {\n return \"olLayer\" in layer;\n}\n"],"names":[],"mappings":"AAiEO,SAAS,WAAW,KAAA,EAAoC;AAC3D,EAAA,OAAO,aAAA,IAAiB,KAAA;AAC5B;AAOO,SAAS,QAAQ,KAAA,EAAiC;AACrD,EAAA,OAAO,SAAA,IAAa,KAAA;AACxB;;;;"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@open-pioneer/map",
4
- "version": "1.0.0-dev.20251020091932",
4
+ "version": "1.0.0-dev.20251021074813",
5
5
  "description": "This package integrates OpenLayers maps into an open pioneer trails application.",
6
6
  "keywords": [
7
7
  "open-pioneer-trails"
@@ -14,11 +14,11 @@
14
14
  "directory": "src/packages/map"
15
15
  },
16
16
  "dependencies": {
17
- "@chakra-ui/react": "^3.27.1",
18
- "@open-pioneer/core": "4.2.0-dev.20251017113502",
19
- "@open-pioneer/http": "4.2.0-dev.20251017113502",
20
- "@open-pioneer/react-utils": "4.2.0-dev.20251017113502",
21
- "@open-pioneer/runtime": "4.2.0-dev.20251017113502",
17
+ "@chakra-ui/react": "^3.28.0",
18
+ "@open-pioneer/core": "4.2.0-dev.20251021072202",
19
+ "@open-pioneer/http": "4.2.0-dev.20251021072202",
20
+ "@open-pioneer/react-utils": "4.2.0-dev.20251021072202",
21
+ "@open-pioneer/runtime": "4.2.0-dev.20251021072202",
22
22
  "ol": "^10.6.1",
23
23
  "proj4": "^2.19.10",
24
24
  "react": "^19.2.0",