@open-pioneer/map 1.4.0-dev.20260625074633 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/CHANGELOG.md +46 -22
  2. package/LayerFactory.d.ts +1 -1
  3. package/LayerFactory.js.map +1 -1
  4. package/MapRegistry.js +1 -1
  5. package/MapRegistry.js.map +1 -1
  6. package/README.md +8 -14
  7. package/_virtual/source-info.js +8 -6
  8. package/_virtual/source-info.js.map +1 -1
  9. package/layers/AbstractLayer.d.ts +36 -3
  10. package/layers/AbstractLayer.js +123 -79
  11. package/layers/AbstractLayer.js.map +1 -1
  12. package/layers/AbstractLayerBase.d.ts +2 -2
  13. package/layers/AbstractLayerBase.js.map +1 -1
  14. package/layers/GroupLayer.d.ts +2 -1
  15. package/layers/GroupLayer.js +4 -1
  16. package/layers/GroupLayer.js.map +1 -1
  17. package/layers/SimpleLayer.d.ts +1 -1
  18. package/layers/SimpleLayer.js +1 -1
  19. package/layers/SimpleLayer.js.map +1 -1
  20. package/layers/WMSLayer.js +59 -11
  21. package/layers/WMSLayer.js.map +1 -1
  22. package/layers/WMTSLayer.d.ts +1 -1
  23. package/layers/WMTSLayer.js +11 -5
  24. package/layers/WMTSLayer.js.map +1 -1
  25. package/layers/group/GroupLayerCollection.d.ts +2 -2
  26. package/layers/group/GroupLayerCollection.js +1 -1
  27. package/layers/group/GroupLayerCollection.js.map +1 -1
  28. package/layers/shared/SublayerBaseType.d.ts +9 -0
  29. package/layers/shared/SublayersCollection.js.map +1 -1
  30. package/layers/shared/getRecursiveLayers.d.ts +1 -1
  31. package/layers/shared/getRecursiveLayers.js +12 -5
  32. package/layers/shared/getRecursiveLayers.js.map +1 -1
  33. package/layers/shared/internals.d.ts +3 -2
  34. package/layers/shared/internals.js +2 -1
  35. package/layers/shared/internals.js.map +1 -1
  36. package/layers/unions.js.map +1 -1
  37. package/layers/wms/WMSSublayer.d.ts +14 -1
  38. package/layers/wms/WMSSublayer.js +29 -2
  39. package/layers/wms/WMSSublayer.js.map +1 -1
  40. package/layers/wms/getAttributions.js.map +1 -1
  41. package/layers/wms/getLegendUrl.js +1 -1
  42. package/layers/wms/getLegendUrl.js.map +1 -1
  43. package/layers/wmts/getAttributions.js.map +1 -1
  44. package/layers/wmts/getLegendUrl.js +1 -1
  45. package/layers/wmts/getLegendUrl.js.map +1 -1
  46. package/model/Highlights.js.map +1 -1
  47. package/model/LayerCollection.js.map +1 -1
  48. package/model/MapAttributions.js.map +1 -1
  49. package/model/MapModel.d.ts +5 -5
  50. package/model/MapModel.js +4 -4
  51. package/model/MapModel.js.map +1 -1
  52. package/model/Overlays.d.ts +2 -2
  53. package/model/Overlays.js +2 -2
  54. package/model/Overlays.js.map +1 -1
  55. package/model/createMapModel.js +23 -23
  56. package/model/createMapModel.js.map +1 -1
  57. package/model/getGeometries.js.map +1 -1
  58. package/package.json +10 -10
  59. package/ui/DefaultMapProvider.js.map +1 -1
  60. package/ui/MapAnchor.js.map +1 -1
  61. package/ui/MapContainer.js +2 -2
  62. package/ui/MapContainer.js.map +1 -1
  63. package/ui/MapContainerContext.js.map +1 -1
  64. package/ui/OverlaysRenderer.js.map +1 -1
  65. package/ui/computeMapAnchorStyles.js.map +1 -1
  66. package/ui/hooks/useMapModel.d.ts +7 -0
  67. package/ui/hooks/useMapModel.js +10 -1
  68. package/ui/hooks/useMapModel.js.map +1 -1
  69. package/ui/styles.css +0 -2
  70. package/ui/styles.css.map +1 -1
  71. package/utils/fetch.js.map +1 -1
  72. package/utils/geometry-utils.js.map +1 -1
  73. package/utils/ol-test-support.js.map +1 -1
  74. package/utils/projections.js.map +1 -1
  75. package/utils/sanitize.js.map +1 -1
@@ -1,17 +1,17 @@
1
- import { computed, watch, batch } from '@conterra/reactivity-core';
1
+ import { reactive, computed, watch, batch } from '@conterra/reactivity-core';
2
2
  import { createLogger, deprecated, destroyResource, isAbortError } from '@open-pioneer/core';
3
3
  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
- import { sourceId$6 as sourceId } from '../_virtual/source-info.js';
6
+ import { sourceId$7 as sourceId } from '../_virtual/source-info.js';
7
7
  import { fetchText } from '../utils/fetch.js';
8
8
  import { INTERNAL_CONSTRUCTOR_TAG } from '../utils/InternalConstructorTag.js';
9
9
  import { AbstractLayer } from './AbstractLayer.js';
10
- import { GET_RAW_SUBLAYERS, ATTACH_TO_PARENT, ATTACH_TO_MAP, DETACH_FROM_MAP, GET_DEPS, SET_LEGEND } from './shared/internals.js';
10
+ import { GET_RAW_SUBLAYERS, ATTACH_TO_PARENT, ATTACH_TO_MAP, DETACH_FROM_MAP, SET_METADATA_LOAD_INFO, GET_DEPS, SET_LEGEND } from './shared/internals.js';
11
11
  import { SublayersCollection } from './shared/SublayersCollection.js';
12
12
  import { getAttributions } from './wms/getAttributions.js';
13
13
  import { getLegendUrl } from './wms/getLegendUrl.js';
14
- import { constructSublayers } from './wms/WMSSublayer.js';
14
+ import { constructSublayers, SET_SUBLAYER_LOAD_INFO } from './wms/WMSSublayer.js';
15
15
 
16
16
  const LOG = createLogger(sourceId);
17
17
  const deprecatedConstructor = deprecated({
@@ -27,8 +27,9 @@ class WMSLayer extends AbstractLayer {
27
27
  #source;
28
28
  #fetchCapabilities;
29
29
  #loadStarted = false;
30
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
30
+ // oxlint-disable-next-line @typescript-eslint/no-explicit-any
31
31
  #capabilities;
32
+ #invalidSublayerNames = reactive();
32
33
  #abortController = new AbortController();
33
34
  #visibleSublayers;
34
35
  #sublayersWatch;
@@ -142,16 +143,22 @@ class WMSLayer extends AbstractLayer {
142
143
  return;
143
144
  }
144
145
  this.#loadStarted = true;
146
+ this[SET_METADATA_LOAD_INFO]("loading");
145
147
  this.#fetchWMSCapabilities().then((result) => {
146
148
  batch(() => {
147
149
  this.#initializeWithMetadata(result);
150
+ this[SET_METADATA_LOAD_INFO]("loaded");
148
151
  });
149
152
  }).catch((error) => {
150
153
  if (isAbortError(error)) {
151
154
  LOG.debug(`Layer '${this.id}' has been destroyed before fetching capabilities`);
152
- return;
153
155
  }
154
156
  LOG.error(`Failed to initialize WMS layer '${this.id}'`, error);
157
+ const wrappedError = error instanceof Error ? error : new Error(`Failed to initialize WMS layer '${this.id}'`);
158
+ this[SET_METADATA_LOAD_INFO]({
159
+ kind: "error",
160
+ error: wrappedError
161
+ });
155
162
  });
156
163
  }
157
164
  /**
@@ -160,7 +167,7 @@ class WMSLayer extends AbstractLayer {
160
167
  */
161
168
  #updateLayersParam(layers) {
162
169
  this.#source.updateParams({
163
- "LAYERS": layers
170
+ LAYERS: layers
164
171
  });
165
172
  const source = layers.length === 0 ? null : this.#source;
166
173
  if (this.#layer.getSource() !== source) {
@@ -168,9 +175,13 @@ class WMSLayer extends AbstractLayer {
168
175
  }
169
176
  }
170
177
  #getVisibleLayerNames() {
178
+ const invalidSublayerNames = this.#invalidSublayerNames.value;
171
179
  const layers = [];
172
180
  const filter = (sublayer) => sublayer.visible;
173
181
  for (const sublayer of walkLeaves(this.#sublayers, filter)) {
182
+ if (sublayer.name && invalidSublayerNames && invalidSublayerNames.has(sublayer.name)) {
183
+ continue;
184
+ }
174
185
  if (sublayer.name) {
175
186
  layers.push(sublayer.name);
176
187
  }
@@ -192,12 +203,31 @@ class WMSLayer extends AbstractLayer {
192
203
  this.#source.setAttributions(attributions);
193
204
  }
194
205
  }
195
- for (const layer of walkLeaves(this.#sublayers)) {
196
- if (layer.name) {
197
- const legendUrl = getLegendUrl(capabilities, layer.name);
198
- layer[SET_LEGEND](legendUrl);
206
+ const hasCapabilityTree = !!capabilities?.Capability?.Layer;
207
+ const sublayerNames = hasCapabilityTree ? collectLayerNames(capabilities) : void 0;
208
+ const invalidSublayerNames = /* @__PURE__ */ new Set();
209
+ for (const sublayer of walkLeaves(this.#sublayers)) {
210
+ if (!sublayer.name) {
211
+ continue;
199
212
  }
213
+ if (sublayerNames && !sublayerNames.has(sublayer.name)) {
214
+ LOG.error(
215
+ `WMS sublayer name '${sublayer.name}' of layer '${this.id}' not found in capabilities.`
216
+ );
217
+ invalidSublayerNames.add(sublayer.name);
218
+ sublayer[SET_SUBLAYER_LOAD_INFO]({
219
+ kind: "error",
220
+ error: new Error(
221
+ `WMS sublayer name '${sublayer.name}' not found in capabilities.`
222
+ )
223
+ });
224
+ continue;
225
+ }
226
+ sublayer[SET_SUBLAYER_LOAD_INFO]("loaded");
227
+ const legendUrl = getLegendUrl(capabilities, sublayer.name);
228
+ sublayer[SET_LEGEND](legendUrl);
200
229
  }
230
+ this.#invalidSublayerNames.value = invalidSublayerNames;
201
231
  }
202
232
  async #loadImage(imageWrapper, imageUrl) {
203
233
  const httpService = this[GET_DEPS]().httpService;
@@ -218,6 +248,24 @@ class WMSLayer extends AbstractLayer {
218
248
  image.src = objectUrl;
219
249
  }
220
250
  }
251
+ function collectLayerNames(capabilities) {
252
+ const names = /* @__PURE__ */ new Set();
253
+ const visit = (layer) => {
254
+ if (!layer) {
255
+ return;
256
+ }
257
+ if (typeof layer.Name === "string") {
258
+ names.add(layer.Name);
259
+ }
260
+ if (Array.isArray(layer.Layer)) {
261
+ for (const child of layer.Layer) {
262
+ visit(child);
263
+ }
264
+ }
265
+ };
266
+ visit(capabilities?.Capability?.Layer);
267
+ return names;
268
+ }
221
269
  function* walkLeaves(sublayers, filter) {
222
270
  for (const sublayer of sublayers[GET_RAW_SUBLAYERS]()) {
223
271
  if (filter && !filter(sublayer)) {
@@ -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 { sourceId } from \"open-pioneer:source-info\";\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 { getAttributions } from \"./wms/getAttributions\";\nimport { getLegendUrl } from \"./wms/getLegendUrl\";\nimport { constructSublayers, WMSSublayer, WMSSublayerConfig } from \"./wms/WMSSublayer\";\nimport { Sublayer } from \"./unions\";\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(sourceId);\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 /**\n * Returns the current source associated with this layer as a reactive property.\n *\n * Note that the return type may be expanded in the future with additional source types.\n */\n get olSource(): ImageWMS | undefined {\n // source does not change in this class; no signal is required\n return this.#source;\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 /**\n * @internal\n *\n * Note: this property was never documented and has been exposed by accident.\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 this.#fetchWMSCapabilities()\n .then((result: string) => {\n batch(() => {\n this.#initializeWithMetadata(result);\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 initialize WMS 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 filter = (sublayer: Sublayer) => sublayer.visible;\n for (const sublayer of walkLeaves(this.#sublayers, filter)) {\n // Push sublayer if layer name is not an empty string | undefined | ...\n if (sublayer.name) {\n layers.push(sublayer.name);\n }\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 #initializeWithMetadata(metadata: string) {\n const parser = new WMSCapabilities();\n const capabilities = parser.read(metadata);\n this.#capabilities = capabilities;\n\n // Apply attributions from metadata if none are set.\n if (this.#source.getAttributions() == null) {\n const attributions = getAttributions(capabilities);\n if (attributions) {\n this.#source.setAttributions(attributions);\n }\n }\n\n for (const layer of walkLeaves(this.#sublayers)) {\n if (layer.name) {\n const legendUrl = getLegendUrl(capabilities, layer.name);\n layer[SET_LEGEND](legendUrl);\n }\n }\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/**\n * Yields all leaf notes in the given collection (recursively).\n */\nfunction* walkLeaves(\n sublayers: SublayersCollection<WMSSublayer>,\n filter?: (sublayer: Sublayer) => boolean\n): Generator<WMSSublayer> {\n for (const sublayer of sublayers[GET_RAW_SUBLAYERS]()) {\n if (filter && !filter(sublayer)) {\n continue;\n }\n\n const nested = sublayer.sublayers[GET_RAW_SUBLAYERS]();\n if (nested.length) {\n yield* walkLeaves(sublayer.sublayers, filter);\n } else {\n yield sublayer;\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<WMSLayerConfig, WMSLayer> = WMSLayer;\n void check;\n}\n"],"names":[],"mappings":"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"}
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\n\nimport { batch, computed, reactive, 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 { sourceId } from \"open-pioneer:source-info\";\n// oxlint-disable-next-line @typescript-eslint/no-unused-vars\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 SET_METADATA_LOAD_INFO\n} from \"./shared/internals\";\nimport { LayerConfig } from \"./shared/LayerConfig\";\nimport { SublayersCollection } from \"./shared/SublayersCollection\";\nimport { Sublayer } from \"./unions\";\nimport { getAttributions } from \"./wms/getAttributions\";\nimport { getLegendUrl } from \"./wms/getLegendUrl\";\nimport {\n constructSublayers,\n SET_SUBLAYER_LOAD_INFO,\n WMSSublayer,\n WMSSublayerConfig\n} 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(sourceId);\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 // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n #capabilities: Record<string, any> | undefined;\n readonly #invalidSublayerNames = reactive<Set<string>>();\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 /**\n * Returns the current source associated with this layer as a reactive property.\n *\n * Note that the return type may be expanded in the future with additional source types.\n */\n get olSource(): ImageWMS | undefined {\n // source does not change in this class; no signal is required\n return this.#source;\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 /**\n * @internal\n *\n * Note: this property was never documented and has been exposed by accident.\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 this[SET_METADATA_LOAD_INFO](\"loading\");\n this.#fetchWMSCapabilities()\n .then((result: string) => {\n batch(() => {\n this.#initializeWithMetadata(result);\n this[SET_METADATA_LOAD_INFO](\"loaded\");\n });\n })\n .catch((error: unknown) => {\n if (isAbortError(error)) {\n LOG.debug(`Layer '${this.id}' has been destroyed before fetching capabilities`);\n }\n LOG.error(`Failed to initialize WMS layer '${this.id}'`, error);\n const wrappedError =\n error instanceof Error\n ? error\n : new Error(`Failed to initialize WMS layer '${this.id}'`);\n this[SET_METADATA_LOAD_INFO]({\n kind: \"error\",\n error: wrappedError\n });\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 invalidSublayerNames = this.#invalidSublayerNames.value;\n\n const layers: string[] = [];\n const filter = (sublayer: Sublayer) => sublayer.visible;\n for (const sublayer of walkLeaves(this.#sublayers, filter)) {\n // Skip sublayers with an invalid name: including them in the request would\n // make the whole GetMap fail and hide the valid sublayers as well.\n if (sublayer.name && invalidSublayerNames && invalidSublayerNames.has(sublayer.name)) {\n continue;\n }\n // Push sublayer if layer name is not an empty string | undefined | ...\n if (sublayer.name) {\n layers.push(sublayer.name);\n }\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 #initializeWithMetadata(metadata: string) {\n const parser = new WMSCapabilities();\n const capabilities = parser.read(metadata);\n this.#capabilities = capabilities;\n\n // Apply attributions from metadata if none are set.\n if (this.#source.getAttributions() == null) {\n const attributions = getAttributions(capabilities);\n if (attributions) {\n this.#source.setAttributions(attributions);\n }\n }\n\n const hasCapabilityTree = !!capabilities?.Capability?.Layer;\n const sublayerNames = hasCapabilityTree ? collectLayerNames(capabilities) : undefined;\n const invalidSublayerNames = new Set<string>();\n for (const sublayer of walkLeaves(this.#sublayers)) {\n if (!sublayer.name) {\n continue;\n }\n if (sublayerNames && !sublayerNames.has(sublayer.name)) {\n LOG.error(\n `WMS sublayer name '${sublayer.name}' of layer '${this.id}' not found in capabilities.`\n );\n invalidSublayerNames.add(sublayer.name);\n sublayer[SET_SUBLAYER_LOAD_INFO]({\n kind: \"error\",\n error: new Error(\n `WMS sublayer name '${sublayer.name}' not found in capabilities.`\n )\n });\n continue;\n }\n sublayer[SET_SUBLAYER_LOAD_INFO](\"loaded\");\n const legendUrl = getLegendUrl(capabilities, sublayer.name);\n sublayer[SET_LEGEND](legendUrl);\n }\n\n this.#invalidSublayerNames.value = invalidSublayerNames;\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/**\n * Collects all layer `Name` values from a parsed WMS capabilities document.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction collectLayerNames(capabilities: Record<string, any> | undefined): Set<string> {\n const names = new Set<string>();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const visit = (layer: Record<string, any> | undefined) => {\n if (!layer) {\n return;\n }\n if (typeof layer.Name === \"string\") {\n names.add(layer.Name);\n }\n if (Array.isArray(layer.Layer)) {\n for (const child of layer.Layer) {\n visit(child);\n }\n }\n };\n visit(capabilities?.Capability?.Layer);\n return names;\n}\n\n/**\n * Yields all leaf notes in the given collection (recursively).\n */\nfunction* walkLeaves(\n sublayers: SublayersCollection<WMSSublayer>,\n filter?: (sublayer: Sublayer) => boolean\n): Generator<WMSSublayer> {\n for (const sublayer of sublayers[GET_RAW_SUBLAYERS]()) {\n if (filter && !filter(sublayer)) {\n continue;\n }\n\n const nested = sublayer.sublayers[GET_RAW_SUBLAYERS]();\n if (nested.length) {\n yield* walkLeaves(sublayer.sublayers, filter);\n } else {\n yield sublayer;\n }\n }\n}\n\n// Ensure layer class is assignable to the constructor interface (there is no \"implements\" for the class itself).\n// oxlint-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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"}
@@ -2,8 +2,8 @@ import WMTS, { Options as WMTSSourceOptions } from "ol/source/WMTS";
2
2
  import { MapModel } from "../model/MapModel";
3
3
  import { InternalConstructorTag } from "../utils/InternalConstructorTag";
4
4
  import { AbstractLayer } from "./AbstractLayer";
5
- import { LayerConfig } from "./shared/LayerConfig";
6
5
  import { ATTACH_TO_MAP, LayerDependencies } from "./shared/internals";
6
+ import { LayerConfig } from "./shared/LayerConfig";
7
7
  /**
8
8
  * Configuration options supported by {@link WMTSLayer}.
9
9
  *
@@ -1,14 +1,14 @@
1
1
  import { reactive, batch } from '@conterra/reactivity-core';
2
2
  import { createLogger, deprecated, isAbortError } from '@open-pioneer/core';
3
3
  import { ImageTile } from 'ol';
4
- import TileState from 'ol/TileState.js';
5
4
  import WMTSCapabilities from 'ol/format/WMTSCapabilities.js';
6
5
  import TileLayer from 'ol/layer/Tile.js';
7
6
  import WMTS, { optionsFromCapabilities } from 'ol/source/WMTS.js';
8
- import { sourceId$8 as sourceId } from '../_virtual/source-info.js';
7
+ import TileState from 'ol/TileState.js';
8
+ import { sourceId$9 as sourceId } from '../_virtual/source-info.js';
9
9
  import { fetchText } from '../utils/fetch.js';
10
10
  import { AbstractLayer } from './AbstractLayer.js';
11
- import { ATTACH_TO_MAP, GET_DEPS } from './shared/internals.js';
11
+ import { ATTACH_TO_MAP, SET_METADATA_LOAD_INFO, GET_DEPS } from './shared/internals.js';
12
12
  import { getAttributions } from './wmts/getAttributions.js';
13
13
  import { getLegendUrl } from './wmts/getLegendUrl.js';
14
14
 
@@ -93,16 +93,22 @@ class WMTSLayer extends AbstractLayer {
93
93
  return;
94
94
  }
95
95
  this.#loadStarted = true;
96
+ this[SET_METADATA_LOAD_INFO]("loading");
96
97
  this.#fetchWMTSCapabilities().then((result) => {
97
98
  batch(() => {
98
99
  this.#initializeWithMetadata(result);
100
+ this[SET_METADATA_LOAD_INFO]("loaded");
99
101
  });
100
102
  }).catch((error) => {
101
103
  if (isAbortError(error)) {
102
104
  LOG.debug(`Layer '${this.name}' has been destroyed before fetching the data`);
103
- return;
104
105
  }
105
106
  LOG.error(`Failed to initialize WMTS layer '${this.name}'`, error);
107
+ const wrappedError = error instanceof Error ? error : new Error(`Failed to initialize WMTS layer '${this.name}'`);
108
+ this[SET_METADATA_LOAD_INFO]({
109
+ kind: "error",
110
+ error: wrappedError
111
+ });
106
112
  });
107
113
  }
108
114
  async #fetchWMTSCapabilities() {
@@ -174,7 +180,7 @@ class WMTSLayer extends AbstractLayer {
174
180
  }
175
181
  }
176
182
  }
177
- /* eslint-disable @typescript-eslint/no-explicit-any */
183
+ /* oxlint-disable @typescript-eslint/no-explicit-any */
178
184
  #existsStyleInCapabilities(capabilities, styleToUse) {
179
185
  const layerDesc = capabilities.Contents?.Layer?.find(
180
186
  (layer) => layer.Identifier === this.#name
@@ -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 { batch, 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 TileSourceType from \"ol/source/Tile\";\nimport WMTS, { optionsFromCapabilities, Options as WMTSSourceOptions } from \"ol/source/WMTS\";\nimport { sourceId } from \"open-pioneer:source-info\";\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 { getAttributions } from \"./wmts/getAttributions\";\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<WMTSSourceOptions>;\n}\n\nconst LOG = createLogger(sourceId);\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 #sourceOptions: Partial<WMTSSourceOptions>;\n #olSource = reactive<WMTS>();\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 /**\n * Returns the current source associated with this layer as a reactive property.\n *\n * Note that the return type may be expanded in the future with additional source types.\n */\n get olSource(): WMTS | undefined {\n return this.#olSource.value;\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 batch(() => {\n this.#initializeWithMetadata(result);\n });\n })\n .catch((error) => {\n if (isAbortError(error)) {\n LOG.debug(`Layer '${this.name}' has been destroyed before fetching the data`);\n return;\n }\n LOG.error(`Failed to initialize WMTS layer '${this.name}'`, error);\n //TODO: how to set the load state to 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 #initializeWithMetadata(metadata: string) {\n const parser = new WMTSCapabilities();\n const capabilities = parser.read(metadata);\n const options = optionsFromCapabilities(capabilities, {\n layer: this.#name,\n matrixSet: this.#matrixSet\n });\n if (!options) {\n throw new Error(`Layer '${this.#name}' was not found in capabilities`);\n }\n if (options.matrixSet !== this.#matrixSet) {\n throw new Error(`Tile matrix set '${this.#matrixSet}' was not found in capabilities`);\n }\n\n const { attributions: explicitAttributions, ...sourceOptions } = this.#sourceOptions;\n if (sourceOptions.style && sourceOptions.style !== options.style) {\n const styleToUse = this.#existsStyleInCapabilities(capabilities, sourceOptions.style);\n if (!styleToUse) {\n throw new Error(`Style '${sourceOptions.style}' was not found in capabilities`);\n }\n }\n\n const attributions = explicitAttributions ?? getAttributions(capabilities);\n const source = (this.#olSource.value = new WMTS({\n ...options,\n attributions,\n ...sourceOptions,\n tileLoadFunction: (tile, tileUrl) => {\n this.#loadTile(tile, tileUrl);\n }\n }));\n this.#layer.setSource(source);\n\n const activeStyleId = source.getStyle();\n const legendUrl = getLegendUrl(capabilities, this.name, activeStyleId);\n this.#legend.value = legendUrl;\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 /* eslint-disable @typescript-eslint/no-explicit-any */\n #existsStyleInCapabilities(capabilities: any, styleToUse: string): boolean {\n // NOTE: we have a style override, check if the style exists in the capabilities\n // the helper optionsFromCapabilities, supports style, too, but uses the Title instead of the Identifier, to find a match in the capabilities\n const layerDesc = capabilities.Contents?.Layer?.find(\n (layer: any) => layer.Identifier === this.#name\n );\n return layerDesc?.Style?.some((style: any) => style.Identifier === styleToUse) ?? false;\n }\n /* eslint-enable @typescript-eslint/no-explicit-any */\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 | OffscreenCanvas): htmlElement is HTMLImageElement {\n return \"tagName\" in htmlElement && 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\n\nimport { batch, reactive } from \"@conterra/reactivity-core\";\nimport { createLogger, deprecated, isAbortError } from \"@open-pioneer/core\";\nimport { ImageTile } from \"ol\";\nimport WMTSCapabilities from \"ol/format/WMTSCapabilities\";\nimport TileLayer from \"ol/layer/Tile\";\nimport type TileSourceType from \"ol/source/Tile\";\nimport WMTS, { optionsFromCapabilities, Options as WMTSSourceOptions } from \"ol/source/WMTS\";\nimport Tile from \"ol/Tile\";\nimport TileState from \"ol/TileState\";\nimport { sourceId } from \"open-pioneer:source-info\";\n// oxlint-disable-next-line @typescript-eslint/no-unused-vars\nimport type { LayerFactory } from \"../LayerFactory\";\nimport { MapModel } from \"../model/MapModel\";\nimport { fetchText } from \"../utils/fetch\";\nimport { InternalConstructorTag } from \"../utils/InternalConstructorTag\";\nimport { AbstractLayer } from \"./AbstractLayer\";\nimport {\n ATTACH_TO_MAP,\n GET_DEPS,\n LayerConstructor,\n LayerDependencies,\n SET_METADATA_LOAD_INFO\n} from \"./shared/internals\";\nimport { LayerConfig } from \"./shared/LayerConfig\";\nimport { getAttributions } from \"./wmts/getAttributions\";\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<WMTSSourceOptions>;\n}\n\nconst LOG = createLogger(sourceId);\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 #sourceOptions: Partial<WMTSSourceOptions>;\n #olSource = reactive<WMTS>();\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 /**\n * Returns the current source associated with this layer as a reactive property.\n *\n * Note that the return type may be expanded in the future with additional source types.\n */\n get olSource(): WMTS | undefined {\n return this.#olSource.value;\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[SET_METADATA_LOAD_INFO](\"loading\");\n this.#fetchWMTSCapabilities()\n .then((result: string) => {\n batch(() => {\n this.#initializeWithMetadata(result);\n this[SET_METADATA_LOAD_INFO](\"loaded\");\n });\n })\n .catch((error: unknown) => {\n if (isAbortError(error)) {\n LOG.debug(`Layer '${this.name}' has been destroyed before fetching the data`);\n }\n LOG.error(`Failed to initialize WMTS layer '${this.name}'`, error);\n const wrappedError =\n error instanceof Error\n ? error\n : new Error(`Failed to initialize WMTS layer '${this.name}'`);\n this[SET_METADATA_LOAD_INFO]({\n kind: \"error\",\n error: wrappedError\n });\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 #initializeWithMetadata(metadata: string) {\n const parser = new WMTSCapabilities();\n const capabilities = parser.read(metadata);\n const options = optionsFromCapabilities(capabilities, {\n layer: this.#name,\n matrixSet: this.#matrixSet\n });\n if (!options) {\n throw new Error(`Layer '${this.#name}' was not found in capabilities`);\n }\n if (options.matrixSet !== this.#matrixSet) {\n throw new Error(`Tile matrix set '${this.#matrixSet}' was not found in capabilities`);\n }\n\n const { attributions: explicitAttributions, ...sourceOptions } = this.#sourceOptions;\n if (sourceOptions.style && sourceOptions.style !== options.style) {\n const styleToUse = this.#existsStyleInCapabilities(capabilities, sourceOptions.style);\n if (!styleToUse) {\n throw new Error(`Style '${sourceOptions.style}' was not found in capabilities`);\n }\n }\n\n const attributions = explicitAttributions ?? getAttributions(capabilities);\n const source = (this.#olSource.value = new WMTS({\n ...options,\n attributions,\n ...sourceOptions,\n tileLoadFunction: (tile, tileUrl) => {\n this.#loadTile(tile, tileUrl);\n }\n }));\n this.#layer.setSource(source);\n\n const activeStyleId = source.getStyle();\n const legendUrl = getLegendUrl(capabilities, this.name, activeStyleId);\n this.#legend.value = legendUrl;\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 /* oxlint-disable @typescript-eslint/no-explicit-any */\n #existsStyleInCapabilities(capabilities: any, styleToUse: string): boolean {\n // NOTE: we have a style override, check if the style exists in the capabilities\n // the helper optionsFromCapabilities, supports style, too, but uses the Title instead of the Identifier, to find a match in the capabilities\n const layerDesc = capabilities.Contents?.Layer?.find(\n (layer: any) => layer.Identifier === this.#name\n );\n return layerDesc?.Style?.some((style: any) => style.Identifier === styleToUse) ?? false;\n }\n /* eslint-enable @typescript-eslint/no-explicit-any */\n}\n\n// Ensure layer class is assignable to the constructor interface (there is no \"implements\" for the class itself).\n// oxlint-disable-next-line no-constant-condition\nif (false) {\n const check: LayerConstructor<WMTSLayerConfig, WMTSLayer> = WMTSLayer;\n void check;\n}\n\nfunction isHtmlImage(htmlElement: HTMLElement | OffscreenCanvas): htmlElement is HTMLImageElement {\n return \"tagName\" in htmlElement && htmlElement.tagName === \"IMG\";\n}\n"],"names":[],"mappings":"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"}
@@ -1,8 +1,8 @@
1
- import { LayerRetrievalOptions, RecursiveRetrievalOptions } from "../shared/LayerRetrievalOptions";
1
+ import { InternalConstructorTag } from "../../utils/InternalConstructorTag";
2
2
  import { GroupLayer } from "../GroupLayer";
3
3
  import { ChildrenCollection } from "../shared/ChildrenCollection";
4
4
  import { GET_PARENT, GET_RAW_LAYERS } from "../shared/internals";
5
- import { InternalConstructorTag } from "../../utils/InternalConstructorTag";
5
+ import { LayerRetrievalOptions, RecursiveRetrievalOptions } from "../shared/LayerRetrievalOptions";
6
6
  import { AnyLayer, Layer } from "../unions";
7
7
  /**
8
8
  * Contains {@link Layer} instances that belong to a {@link GroupLayer}
@@ -1,6 +1,6 @@
1
+ import { assertInternalConstructor } from '../../utils/InternalConstructorTag.js';
1
2
  import { getRecursiveLayers } from '../shared/getRecursiveLayers.js';
2
3
  import { ATTACH_TO_GROUP, DETACH_FROM_GROUP, GET_RAW_LAYERS, GET_PARENT } from '../shared/internals.js';
3
- import { assertInternalConstructor } from '../../utils/InternalConstructorTag.js';
4
4
 
5
5
  class GroupLayerCollection {
6
6
  #layers;
@@ -1 +1 @@
1
- {"version":3,"file":"GroupLayerCollection.js","sources":["GroupLayerCollection.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { getRecursiveLayers } from \"../shared/getRecursiveLayers\";\nimport { LayerRetrievalOptions, RecursiveRetrievalOptions } from \"../shared/LayerRetrievalOptions\";\nimport { AbstractLayer } from \"../AbstractLayer\";\nimport { GroupLayer } from \"../GroupLayer\";\nimport { ChildrenCollection } from \"../shared/ChildrenCollection\";\nimport {\n ATTACH_TO_GROUP,\n DETACH_FROM_GROUP,\n GET_PARENT,\n GET_RAW_LAYERS\n} from \"../shared/internals\";\nimport {\n assertInternalConstructor,\n InternalConstructorTag\n} from \"../../utils/InternalConstructorTag\";\nimport { AnyLayer, Layer } from \"../unions\";\n\n/**\n * Contains {@link Layer} instances that belong to a {@link GroupLayer}\n *\n * @group Layer Utilities\n */\n// NOTE: adding / removing currently not supported.\n// When adding support for dynamic content, make sure to also updating the layer indexing logic in the map (LayerCollectionImpl).\n// Nested children of a group layer must also be found in id-lookups.\nexport class GroupLayerCollection implements ChildrenCollection<Layer> {\n #layers: Layer[];\n #parent: GroupLayer;\n\n /** @internal */\n constructor(layers: Layer[], parent: GroupLayer, tag: InternalConstructorTag) {\n assertInternalConstructor(tag);\n layers = layers.slice(); // Don't modify the input\n for (const layer of layers) {\n if (layer.isBaseLayer) {\n throw new Error(\n `Layer '${layer.id}' of group '${parent.id}' is marked as base layer. Layers that belong to a group layer cannot be a base layer.`\n );\n }\n layer[ATTACH_TO_GROUP](parent); //attach every layer to the parent group layer\n }\n this.#layers = layers as (Layer & AbstractLayer)[];\n this.#parent = parent;\n }\n\n /**\n * Destroys this collection, all contained layers are detached from their parent group layer\n */\n destroy() {\n for (const layer of this.#layers) {\n layer[DETACH_FROM_GROUP]();\n layer.destroy();\n }\n this.#layers = [];\n }\n\n // Generic method name for consistent interface\n getItems(options?: LayerRetrievalOptions): Layer[] {\n return this.getLayers(options);\n }\n\n /**\n * Returns all layers in this collection\n */\n getLayers(options?: LayerRetrievalOptions | undefined): Layer[] {\n // NOTE: sort options are ignored because layers are always ordered at this time.\n let allLayers = this.#layers.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 group contains many, deeply nested sub groups, this function could potentially be expensive.\n */\n getRecursiveLayers(options?: RecursiveRetrievalOptions): AnyLayer[] {\n return getRecursiveLayers({\n from: this,\n sortByDisplayOrder: options?.sortByDisplayOrder,\n includeInternalLayers: options?.includeInternalLayers,\n filter: options?.filter\n });\n }\n\n /**\n * Returns a reference to the internal group layer array.\n *\n * NOTE: Do not modify directly!\n *\n * @internal\n */\n [GET_RAW_LAYERS](): Layer[] {\n return this.#layers;\n }\n\n /**\n * Returns the parent group layer that owns this collection.\n *\n * @internal\n */\n [GET_PARENT](): GroupLayer {\n return this.#parent;\n }\n}\n"],"names":[],"mappings":";;;;AA2BO,MAAM,oBAAA,CAA0D;AAAA,EACnE,OAAA;AAAA,EACA,OAAA;AAAA;AAAA,EAGA,WAAA,CAAY,MAAA,EAAiB,MAAA,EAAoB,GAAA,EAA6B;AAC1E,IAAA,yBAAA,CAA0B,GAAG,CAAA;AAC7B,IAAA,MAAA,GAAS,OAAO,KAAA,EAAM;AACtB,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AACxB,MAAA,IAAI,MAAM,WAAA,EAAa;AACnB,QAAA,MAAM,IAAI,KAAA;AAAA,UACN,CAAA,OAAA,EAAU,KAAA,CAAM,EAAE,CAAA,YAAA,EAAe,OAAO,EAAE,CAAA,sFAAA;AAAA,SAC9C;AAAA,MACJ;AACA,MAAA,KAAA,CAAM,eAAe,EAAE,MAAM,CAAA;AAAA,IACjC;AACA,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AACf,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAU;AACN,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,OAAA,EAAS;AAC9B,MAAA,KAAA,CAAM,iBAAiB,CAAA,EAAE;AACzB,MAAA,KAAA,CAAM,OAAA,EAAQ;AAAA,IAClB;AACA,IAAA,IAAA,CAAK,UAAU,EAAC;AAAA,EACpB;AAAA;AAAA,EAGA,SAAS,OAAA,EAA0C;AAC/C,IAAA,OAAO,IAAA,CAAK,UAAU,OAAO,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,OAAA,EAAsD;AAE5D,IAAA,IAAI,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAM;AAEnC,IAAA,IAAI,CAAC,SAAS,qBAAA,EAAuB;AACjC,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,OAAA,EAAiD;AAChE,IAAA,OAAO,kBAAA,CAAmB;AAAA,MACtB,IAAA,EAAM,IAAA;AAAA,MACN,oBAAoB,OAAA,EAAS,kBAAA;AAAA,MAC7B,uBAAuB,OAAA,EAAS,qBAAA;AAAA,MAChC,QAAQ,OAAA,EAAS;AAAA,KACpB,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,CAAC,cAAc,CAAA,GAAa;AACxB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,CAAC,UAAU,CAAA,GAAgB;AACvB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EAChB;AACJ;;;;"}
1
+ {"version":3,"file":"GroupLayerCollection.js","sources":["GroupLayerCollection.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n assertInternalConstructor,\n InternalConstructorTag\n} from \"../../utils/InternalConstructorTag\";\nimport { AbstractLayer } from \"../AbstractLayer\";\nimport { GroupLayer } from \"../GroupLayer\";\nimport { ChildrenCollection } from \"../shared/ChildrenCollection\";\nimport { getRecursiveLayers } from \"../shared/getRecursiveLayers\";\nimport {\n ATTACH_TO_GROUP,\n DETACH_FROM_GROUP,\n GET_PARENT,\n GET_RAW_LAYERS\n} from \"../shared/internals\";\nimport { LayerRetrievalOptions, RecursiveRetrievalOptions } from \"../shared/LayerRetrievalOptions\";\nimport { AnyLayer, Layer } from \"../unions\";\n\n/**\n * Contains {@link Layer} instances that belong to a {@link GroupLayer}\n *\n * @group Layer Utilities\n */\n// NOTE: adding / removing currently not supported.\n// When adding support for dynamic content, make sure to also updating the layer indexing logic in the map (LayerCollectionImpl).\n// Nested children of a group layer must also be found in id-lookups.\nexport class GroupLayerCollection implements ChildrenCollection<Layer> {\n #layers: Layer[];\n #parent: GroupLayer;\n\n /** @internal */\n constructor(layers: Layer[], parent: GroupLayer, tag: InternalConstructorTag) {\n assertInternalConstructor(tag);\n layers = layers.slice(); // Don't modify the input\n for (const layer of layers) {\n if (layer.isBaseLayer) {\n throw new Error(\n `Layer '${layer.id}' of group '${parent.id}' is marked as base layer. Layers that belong to a group layer cannot be a base layer.`\n );\n }\n layer[ATTACH_TO_GROUP](parent); //attach every layer to the parent group layer\n }\n this.#layers = layers as (Layer & AbstractLayer)[];\n this.#parent = parent;\n }\n\n /**\n * Destroys this collection, all contained layers are detached from their parent group layer\n */\n destroy() {\n for (const layer of this.#layers) {\n layer[DETACH_FROM_GROUP]();\n layer.destroy();\n }\n this.#layers = [];\n }\n\n // Generic method name for consistent interface\n getItems(options?: LayerRetrievalOptions): Layer[] {\n return this.getLayers(options);\n }\n\n /**\n * Returns all layers in this collection\n */\n getLayers(options?: LayerRetrievalOptions | undefined): Layer[] {\n // NOTE: sort options are ignored because layers are always ordered at this time.\n let allLayers = this.#layers.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 group contains many, deeply nested sub groups, this function could potentially be expensive.\n */\n getRecursiveLayers(options?: RecursiveRetrievalOptions): AnyLayer[] {\n return getRecursiveLayers({\n from: this,\n sortByDisplayOrder: options?.sortByDisplayOrder,\n includeInternalLayers: options?.includeInternalLayers,\n filter: options?.filter\n });\n }\n\n /**\n * Returns a reference to the internal group layer array.\n *\n * NOTE: Do not modify directly!\n *\n * @internal\n */\n [GET_RAW_LAYERS](): Layer[] {\n return this.#layers;\n }\n\n /**\n * Returns the parent group layer that owns this collection.\n *\n * @internal\n */\n [GET_PARENT](): GroupLayer {\n return this.#parent;\n }\n}\n"],"names":[],"mappings":";;;;AA4BO,MAAM,oBAAA,CAA0D;AAAA,EACnE,OAAA;AAAA,EACA,OAAA;AAAA;AAAA,EAGA,WAAA,CAAY,MAAA,EAAiB,MAAA,EAAoB,GAAA,EAA6B;AAC1E,IAAA,yBAAA,CAA0B,GAAG,CAAA;AAC7B,IAAA,MAAA,GAAS,OAAO,KAAA,EAAM;AACtB,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AACxB,MAAA,IAAI,MAAM,WAAA,EAAa;AACnB,QAAA,MAAM,IAAI,KAAA;AAAA,UACN,CAAA,OAAA,EAAU,KAAA,CAAM,EAAE,CAAA,YAAA,EAAe,OAAO,EAAE,CAAA,sFAAA;AAAA,SAC9C;AAAA,MACJ;AACA,MAAA,KAAA,CAAM,eAAe,EAAE,MAAM,CAAA;AAAA,IACjC;AACA,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AACf,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAU;AACN,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,OAAA,EAAS;AAC9B,MAAA,KAAA,CAAM,iBAAiB,CAAA,EAAE;AACzB,MAAA,KAAA,CAAM,OAAA,EAAQ;AAAA,IAClB;AACA,IAAA,IAAA,CAAK,UAAU,EAAC;AAAA,EACpB;AAAA;AAAA,EAGA,SAAS,OAAA,EAA0C;AAC/C,IAAA,OAAO,IAAA,CAAK,UAAU,OAAO,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,OAAA,EAAsD;AAE5D,IAAA,IAAI,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAM;AAEnC,IAAA,IAAI,CAAC,SAAS,qBAAA,EAAuB;AACjC,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,OAAA,EAAiD;AAChE,IAAA,OAAO,kBAAA,CAAmB;AAAA,MACtB,IAAA,EAAM,IAAA;AAAA,MACN,oBAAoB,OAAA,EAAS,kBAAA;AAAA,MAC7B,uBAAuB,OAAA,EAAS,qBAAA;AAAA,MAChC,QAAQ,OAAA,EAAS;AAAA,KACpB,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,CAAC,cAAc,CAAA,GAAa;AACxB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,CAAC,UAAU,CAAA,GAAgB;AACvB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EAChB;AACJ;;;;"}
@@ -1,3 +1,4 @@
1
+ import type { LayerLoadState } from "../AbstractLayer";
1
2
  import { AbstractLayerBase } from "../AbstractLayerBase";
2
3
  import { AnyLayer, Layer, SublayerTypes } from "../unions";
3
4
  /**
@@ -19,4 +20,12 @@ export interface SublayerBaseType extends AbstractLayerBase {
19
20
  * The parent layer that owns this sublayer.
20
21
  */
21
22
  readonly parentLayer: Layer;
23
+ /**
24
+ * The load state of this sublayer (independent of its parent layer).
25
+ */
26
+ readonly loadState: LayerLoadState;
27
+ /**
28
+ * The error associated with this sublayer, if any.
29
+ */
30
+ readonly loadError: Error | undefined;
22
31
  }
@@ -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 {\n assertInternalConstructor,\n InternalConstructorTag\n} from \"../../utils/InternalConstructorTag\";\nimport { 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<\n SublayerType extends SublayerBaseType\n> implements ChildrenCollection<SublayerType> {\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,CAEiC;AAAA,EAC1C,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,OAAA,EAA6D;AAEtE,IAAA,IAAI,SAAA,GAAY,IAAA,CAAK,UAAA,CAAW,KAAA,EAAM;AAEtC,IAAA,IAAI,CAAC,SAAS,qBAAA,EAAuB;AACjC,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,OAAA,EAAiD;AAChE,IAAA,OAAO,kBAAA,CAAmB;AAAA;AAAA;AAAA;AAAA,MAItB,IAAA,EAAM,IAAA;AAAA,MACN,oBAAoB,OAAA,EAAS,kBAAA;AAAA,MAC7B,uBAAuB,OAAA,EAAS,qBAAA;AAAA,MAChC,QAAQ,OAAA,EAAS;AAAA,KACpB,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\n\nimport {\n assertInternalConstructor,\n InternalConstructorTag\n} from \"../../utils/InternalConstructorTag\";\nimport { 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<\n SublayerType extends SublayerBaseType\n> implements ChildrenCollection<SublayerType> {\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":";;;;AAoBO,MAAM,mBAAA,CAEiC;AAAA,EAC1C,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,OAAA,EAA6D;AAEtE,IAAA,IAAI,SAAA,GAAY,IAAA,CAAK,UAAA,CAAW,KAAA,EAAM;AAEtC,IAAA,IAAI,CAAC,SAAS,qBAAA,EAAuB;AACjC,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,OAAA,EAAiD;AAChE,IAAA,OAAO,kBAAA,CAAmB;AAAA;AAAA;AAAA;AAAA,MAItB,IAAA,EAAM,IAAA;AAAA,MACN,oBAAoB,OAAA,EAAS,kBAAA;AAAA,MAC7B,uBAAuB,OAAA,EAAS,qBAAA;AAAA,MAChC,QAAQ,OAAA,EAAS;AAAA,KACpB,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,5 +1,5 @@
1
- import { ChildrenCollection } from "./ChildrenCollection";
2
1
  import { AnyLayer } from "../unions";
2
+ import { ChildrenCollection } from "./ChildrenCollection";
3
3
  import { RecursiveRetrievalOptions } from "./LayerRetrievalOptions";
4
4
  /** @internal */
5
5
  export interface RecursiveLayerOptions<LayerType> extends RecursiveRetrievalOptions {
@@ -3,10 +3,17 @@ function getRecursiveLayers(options) {
3
3
  const sortByDisplayOrder = options.sortByDisplayOrder ?? false;
4
4
  const includeInternalLayers = options.includeInternalLayers ?? false;
5
5
  const result = [];
6
- gatherRecursiveLayers(options.from, filter, sortByDisplayOrder, includeInternalLayers, result);
6
+ gatherRecursiveLayers({
7
+ from: options.from,
8
+ filter,
9
+ sortByDisplayOrder,
10
+ includeInternalLayers,
11
+ result
12
+ });
7
13
  return result;
8
14
  }
9
- function gatherRecursiveLayers(from, filter, sortByDisplayOrder, includeInternalLayers, result) {
15
+ function gatherRecursiveLayers(options) {
16
+ const { from, filter, sortByDisplayOrder, includeInternalLayers, result } = options;
10
17
  const layers = from.getItems({
11
18
  sortByDisplayOrder,
12
19
  includeInternalLayers
@@ -19,13 +26,13 @@ function gatherRecursiveLayers(from, filter, sortByDisplayOrder, includeInternal
19
26
  }
20
27
  const children = layer.children;
21
28
  if (children) {
22
- gatherRecursiveLayers(
23
- children,
29
+ gatherRecursiveLayers({
30
+ from: children,
24
31
  filter,
25
32
  sortByDisplayOrder,
26
33
  includeInternalLayers,
27
34
  result
28
- );
35
+ });
29
36
  }
30
37
  result.push(layer);
31
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"getRecursiveLayers.js","sources":["getRecursiveLayers.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { ChildrenCollection } from \"./ChildrenCollection\";\nimport { AnyLayer } from \"../unions\";\nimport { RecursiveRetrievalOptions } from \"./LayerRetrievalOptions\";\n\n/** @internal */\nexport interface RecursiveLayerOptions<LayerType> extends RecursiveRetrievalOptions {\n /**\n * Starting point(s) of the recursion.\n * The layers in this collections and their all of their children (recursively) will be included in the result.\n */\n from: ChildrenCollection<LayerType>;\n\n /**\n * If set to `true`, layers will be ordered by their display order:\n * Layers listed first in the returned array are shown _below_ layers listed at a later index.\n *\n * By default, layers are returned in arbitrary order.\n */\n sortByDisplayOrder?: boolean;\n}\n\nexport function getRecursiveLayers<LayerType extends AnyLayer>(\n options: RecursiveLayerOptions<LayerType>\n): AnyLayer[] {\n const filter = options.filter ?? (() => true);\n const sortByDisplayOrder = options.sortByDisplayOrder ?? false;\n const includeInternalLayers = options.includeInternalLayers ?? false;\n const result: AnyLayer[] = [];\n gatherRecursiveLayers(options.from, filter, sortByDisplayOrder, includeInternalLayers, result);\n return result;\n}\n\n// Walks the layer tree recursively and gathers matching layers into the result array.\nfunction gatherRecursiveLayers<LayerType extends AnyLayer>(\n from: ChildrenCollection<LayerType>,\n filter: (layer: AnyLayer) => boolean,\n sortByDisplayOrder: boolean,\n includeInternalLayers: boolean,\n result: AnyLayer[]\n): void {\n const layers = from.getItems({\n sortByDisplayOrder: sortByDisplayOrder,\n includeInternalLayers: includeInternalLayers\n });\n for (const layer of layers) {\n if (!filter(layer)) {\n continue;\n } else if (!includeInternalLayers && layer.internal) {\n continue;\n }\n\n const children = layer.children;\n if (children) {\n // Pushes into result as a side effect\n gatherRecursiveLayers(\n children,\n filter,\n sortByDisplayOrder,\n includeInternalLayers,\n result\n );\n }\n result.push(layer);\n }\n}\n"],"names":[],"mappings":"AAuBO,SAAS,mBACZ,OAAA,EACU;AACV,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,KAAW,MAAM,IAAA,CAAA;AACxC,EAAA,MAAM,kBAAA,GAAqB,QAAQ,kBAAA,IAAsB,KAAA;AACzD,EAAA,MAAM,qBAAA,GAAwB,QAAQ,qBAAA,IAAyB,KAAA;AAC/D,EAAA,MAAM,SAAqB,EAAC;AAC5B,EAAA,qBAAA,CAAsB,OAAA,CAAQ,IAAA,EAAM,MAAA,EAAQ,kBAAA,EAAoB,uBAAuB,MAAM,CAAA;AAC7F,EAAA,OAAO,MAAA;AACX;AAGA,SAAS,qBAAA,CACL,IAAA,EACA,MAAA,EACA,kBAAA,EACA,uBACA,MAAA,EACI;AACJ,EAAA,MAAM,MAAA,GAAS,KAAK,QAAA,CAAS;AAAA,IACzB,kBAAA;AAAA,IACA;AAAA,GACH,CAAA;AACD,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AACxB,IAAA,IAAI,CAAC,MAAA,CAAO,KAAK,CAAA,EAAG;AAChB,MAAA;AAAA,IACJ,CAAA,MAAA,IAAW,CAAC,qBAAA,IAAyB,KAAA,CAAM,QAAA,EAAU;AACjD,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,WAAW,KAAA,CAAM,QAAA;AACvB,IAAA,IAAI,QAAA,EAAU;AAEV,MAAA,qBAAA;AAAA,QACI,QAAA;AAAA,QACA,MAAA;AAAA,QACA,kBAAA;AAAA,QACA,qBAAA;AAAA,QACA;AAAA,OACJ;AAAA,IACJ;AACA,IAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,EACrB;AACJ;;;;"}
1
+ {"version":3,"file":"getRecursiveLayers.js","sources":["getRecursiveLayers.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\n\nimport { AnyLayer } from \"../unions\";\nimport { ChildrenCollection } from \"./ChildrenCollection\";\nimport { RecursiveRetrievalOptions } from \"./LayerRetrievalOptions\";\n\n/** @internal */\nexport interface RecursiveLayerOptions<LayerType> extends RecursiveRetrievalOptions {\n /**\n * Starting point(s) of the recursion.\n * The layers in this collections and their all of their children (recursively) will be included in the result.\n */\n from: ChildrenCollection<LayerType>;\n\n /**\n * If set to `true`, layers will be ordered by their display order:\n * Layers listed first in the returned array are shown _below_ layers listed at a later index.\n *\n * By default, layers are returned in arbitrary order.\n */\n sortByDisplayOrder?: boolean;\n}\n\nexport function getRecursiveLayers<LayerType extends AnyLayer>(\n options: RecursiveLayerOptions<LayerType>\n): AnyLayer[] {\n const filter = options.filter ?? (() => true);\n const sortByDisplayOrder = options.sortByDisplayOrder ?? false;\n const includeInternalLayers = options.includeInternalLayers ?? false;\n const result: AnyLayer[] = [];\n gatherRecursiveLayers({\n from: options.from,\n filter,\n sortByDisplayOrder,\n includeInternalLayers,\n result\n });\n return result;\n}\n\ninterface GatherOptions<LayerType extends AnyLayer> {\n from: ChildrenCollection<LayerType>;\n filter: (layer: AnyLayer) => boolean;\n sortByDisplayOrder: boolean;\n includeInternalLayers: boolean;\n result: AnyLayer[];\n}\n\n// Walks the layer tree recursively and gathers matching layers into the result array.\nfunction gatherRecursiveLayers<LayerType extends AnyLayer>(\n options: GatherOptions<LayerType>\n): void {\n const { from, filter, sortByDisplayOrder, includeInternalLayers, result } = options;\n const layers = from.getItems({\n sortByDisplayOrder: sortByDisplayOrder,\n includeInternalLayers: includeInternalLayers\n });\n for (const layer of layers) {\n if (!filter(layer)) {\n continue;\n } else if (!includeInternalLayers && layer.internal) {\n continue;\n }\n\n const children = layer.children;\n if (children) {\n // Pushes into result as a side effect\n gatherRecursiveLayers({\n from: children,\n filter,\n sortByDisplayOrder,\n includeInternalLayers,\n result\n });\n }\n result.push(layer);\n }\n}\n"],"names":[],"mappings":"AAwBO,SAAS,mBACZ,OAAA,EACU;AACV,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,KAAW,MAAM,IAAA,CAAA;AACxC,EAAA,MAAM,kBAAA,GAAqB,QAAQ,kBAAA,IAAsB,KAAA;AACzD,EAAA,MAAM,qBAAA,GAAwB,QAAQ,qBAAA,IAAyB,KAAA;AAC/D,EAAA,MAAM,SAAqB,EAAC;AAC5B,EAAA,qBAAA,CAAsB;AAAA,IAClB,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,MAAA;AAAA,IACA,kBAAA;AAAA,IACA,qBAAA;AAAA,IACA;AAAA,GACH,CAAA;AACD,EAAA,OAAO,MAAA;AACX;AAWA,SAAS,sBACL,OAAA,EACI;AACJ,EAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,kBAAA,EAAoB,qBAAA,EAAuB,QAAO,GAAI,OAAA;AAC5E,EAAA,MAAM,MAAA,GAAS,KAAK,QAAA,CAAS;AAAA,IACzB,kBAAA;AAAA,IACA;AAAA,GACH,CAAA;AACD,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AACxB,IAAA,IAAI,CAAC,MAAA,CAAO,KAAK,CAAA,EAAG;AAChB,MAAA;AAAA,IACJ,CAAA,MAAA,IAAW,CAAC,qBAAA,IAAyB,KAAA,CAAM,QAAA,EAAU;AACjD,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,WAAW,KAAA,CAAM,QAAA;AACvB,IAAA,IAAI,QAAA,EAAU;AAEV,MAAA,qBAAA,CAAsB;AAAA,QAClB,IAAA,EAAM,QAAA;AAAA,QACN,MAAA;AAAA,QACA,kBAAA;AAAA,QACA,qBAAA;AAAA,QACA;AAAA,OACH,CAAA;AAAA,IACL;AACA,IAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,EACrB;AACJ;;;;"}
@@ -1,7 +1,7 @@
1
1
  import { HttpService } from "@open-pioneer/http";
2
- import { LayerConfig } from "./LayerConfig";
3
- import { Layer } from "../unions";
4
2
  import { InternalConstructorTag } from "../../utils/InternalConstructorTag";
3
+ import { Layer } from "../unions";
4
+ import { LayerConfig } from "./LayerConfig";
5
5
  /**
6
6
  * Options passed from the layer factory to the layer constructor.
7
7
  *
@@ -42,3 +42,4 @@ export declare const GET_RAW_SUBLAYERS: unique symbol;
42
42
  export declare const ATTACH_TO_PARENT: unique symbol;
43
43
  export declare const SET_LEGEND: unique symbol;
44
44
  export declare const LAYER_DEPS: unique symbol;
45
+ export declare const SET_METADATA_LOAD_INFO: unique symbol;
@@ -26,6 +26,7 @@ const GET_RAW_SUBLAYERS = /* @__PURE__ */ Symbol("GET_RAW_SUBLAYERS");
26
26
  const ATTACH_TO_PARENT = /* @__PURE__ */ Symbol("ATTACH_TO_PARENT");
27
27
  const SET_LEGEND = /* @__PURE__ */ Symbol("SET_LEGEND");
28
28
  const LAYER_DEPS = /* @__PURE__ */ Symbol("LAYER_DEPS");
29
+ const SET_METADATA_LOAD_INFO = /* @__PURE__ */ Symbol("SET_METADATA_LOAD_INFO");
29
30
 
30
- export { ATTACH_TO_GROUP, ATTACH_TO_MAP, ATTACH_TO_PARENT, DETACH_FROM_GROUP, DETACH_FROM_MAP, GET_DEPS, GET_PARENT, GET_RAW_LAYERS, GET_RAW_SUBLAYERS, LAYER_DEPS, SET_LEGEND, SET_VISIBLE, getLayerDependencies };
31
+ export { ATTACH_TO_GROUP, ATTACH_TO_MAP, ATTACH_TO_PARENT, DETACH_FROM_GROUP, DETACH_FROM_MAP, GET_DEPS, GET_PARENT, GET_RAW_LAYERS, GET_RAW_SUBLAYERS, LAYER_DEPS, SET_LEGEND, SET_METADATA_LOAD_INFO, SET_VISIBLE, getLayerDependencies };
31
32
  //# sourceMappingURL=internals.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"internals.js","sources":["internals.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { HttpService } from \"@open-pioneer/http\";\nimport { LayerConfig } from \"./LayerConfig\";\nimport { Layer } from \"../unions\";\nimport {\n InternalConstructorTag,\n INTERNAL_CONSTRUCTOR_TAG\n} from \"../../utils/InternalConstructorTag\";\n\n/**\n * Options passed from the layer factory to the layer constructor.\n *\n * @internal\n */\nexport interface LayerDependencies {\n httpService: HttpService;\n}\n\n/**\n * Interface implemented by layer classes (the prototype, not the instance).\n *\n * - `Config`: the options supported or required as construction parameters.\n * - `LayerType`: the type of the resulting layer instance.\n *\n * @internal\n */\nexport interface LayerConstructor<Config extends LayerConfig, LayerType extends Layer> {\n prototype: LayerType;\n new (config: Config, deps: LayerDependencies, tag: InternalConstructorTag): LayerType;\n}\n\n/**\n * Helper function to verify that the correct tag was used.\n *\n * Returns the layer dependencies passed by the layer factory or returns undefined.\n *\n * Throws an error if an invalid tag was provided.\n */\nexport function getLayerDependencies(\n deps: LayerDependencies | undefined,\n tag: InternalConstructorTag | undefined\n): LayerDependencies | undefined {\n if (tag == null) {\n // no tag -> used old constructor overload\n return undefined;\n }\n if (tag !== INTERNAL_CONSTRUCTOR_TAG) {\n throw new Error(\n \"Attempt to call an internal layer constructor. Use the LayerFactory service instead.\"\n );\n }\n if (!deps) {\n // If the correct tag was used, then the dependencies must have been passed by the factory\n throw new Error(\"Internal error: layer dependencies are missing\");\n }\n return deps;\n}\n\n// use symbols for internal functions\nexport const SET_VISIBLE = Symbol(\"SET_VISIBLE\");\nexport const DETACH_FROM_MAP = Symbol(\"DETACH_FROM_MAP\");\nexport const ATTACH_TO_MAP = Symbol(\"ATTACH_TO_MAP\");\nexport const ATTACH_TO_GROUP = Symbol(\"ATTACH_TO_GROUP\");\nexport const DETACH_FROM_GROUP = Symbol(\"DETACH_FROM_GROUP\");\nexport const GET_RAW_LAYERS = Symbol(\"GET_RAW_LAYERS\");\nexport const GET_PARENT = Symbol(\"GET_PARENT\");\nexport const GET_DEPS = Symbol(\"GET_DEPS\");\nexport const GET_RAW_SUBLAYERS = Symbol(\"GET_RAW_SUBLAYERS\");\nexport const ATTACH_TO_PARENT = Symbol(\"ATTACH_TO_PARENT\");\nexport const SET_LEGEND = Symbol(\"SET_LEGEND\");\nexport const LAYER_DEPS = Symbol(\"LAYER_DEPS\");\n"],"names":[],"mappings":";;AAuCO,SAAS,oBAAA,CACZ,MACA,GAAA,EAC6B;AAC7B,EAAA,IAAI,OAAO,IAAA,EAAM;AAEb,IAAA,OAAO,MAAA;AAAA,EACX;AACA,EAAA,IAAI,QAAQ,wBAAA,EAA0B;AAClC,IAAA,MAAM,IAAI,KAAA;AAAA,MACN;AAAA,KACJ;AAAA,EACJ;AACA,EAAA,IAAI,CAAC,IAAA,EAAM;AAEP,IAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,EACpE;AACA,EAAA,OAAO,IAAA;AACX;AAGO,MAAM,WAAA,0BAAqB,aAAa;AACxC,MAAM,eAAA,0BAAyB,iBAAiB;AAChD,MAAM,aAAA,0BAAuB,eAAe;AAC5C,MAAM,eAAA,0BAAyB,iBAAiB;AAChD,MAAM,iBAAA,0BAA2B,mBAAmB;AACpD,MAAM,cAAA,0BAAwB,gBAAgB;AAC9C,MAAM,UAAA,0BAAoB,YAAY;AACtC,MAAM,QAAA,0BAAkB,UAAU;AAClC,MAAM,iBAAA,0BAA2B,mBAAmB;AACpD,MAAM,gBAAA,0BAA0B,kBAAkB;AAClD,MAAM,UAAA,0BAAoB,YAAY;AACtC,MAAM,UAAA,0BAAoB,YAAY;;;;"}
1
+ {"version":3,"file":"internals.js","sources":["internals.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\n\nimport { HttpService } from \"@open-pioneer/http\";\nimport {\n InternalConstructorTag,\n INTERNAL_CONSTRUCTOR_TAG\n} from \"../../utils/InternalConstructorTag\";\nimport { Layer } from \"../unions\";\nimport { LayerConfig } from \"./LayerConfig\";\n\n/**\n * Options passed from the layer factory to the layer constructor.\n *\n * @internal\n */\nexport interface LayerDependencies {\n httpService: HttpService;\n}\n\n/**\n * Interface implemented by layer classes (the prototype, not the instance).\n *\n * - `Config`: the options supported or required as construction parameters.\n * - `LayerType`: the type of the resulting layer instance.\n *\n * @internal\n */\nexport interface LayerConstructor<Config extends LayerConfig, LayerType extends Layer> {\n prototype: LayerType;\n new (config: Config, deps: LayerDependencies, tag: InternalConstructorTag): LayerType;\n}\n\n/**\n * Helper function to verify that the correct tag was used.\n *\n * Returns the layer dependencies passed by the layer factory or returns undefined.\n *\n * Throws an error if an invalid tag was provided.\n */\nexport function getLayerDependencies(\n deps: LayerDependencies | undefined,\n tag: InternalConstructorTag | undefined\n): LayerDependencies | undefined {\n if (tag == null) {\n // no tag -> used old constructor overload\n return undefined;\n }\n if (tag !== INTERNAL_CONSTRUCTOR_TAG) {\n throw new Error(\n \"Attempt to call an internal layer constructor. Use the LayerFactory service instead.\"\n );\n }\n if (!deps) {\n // If the correct tag was used, then the dependencies must have been passed by the factory\n throw new Error(\"Internal error: layer dependencies are missing\");\n }\n return deps;\n}\n\n// use symbols for internal functions\nexport const SET_VISIBLE = Symbol(\"SET_VISIBLE\");\nexport const DETACH_FROM_MAP = Symbol(\"DETACH_FROM_MAP\");\nexport const ATTACH_TO_MAP = Symbol(\"ATTACH_TO_MAP\");\nexport const ATTACH_TO_GROUP = Symbol(\"ATTACH_TO_GROUP\");\nexport const DETACH_FROM_GROUP = Symbol(\"DETACH_FROM_GROUP\");\nexport const GET_RAW_LAYERS = Symbol(\"GET_RAW_LAYERS\");\nexport const GET_PARENT = Symbol(\"GET_PARENT\");\nexport const GET_DEPS = Symbol(\"GET_DEPS\");\nexport const GET_RAW_SUBLAYERS = Symbol(\"GET_RAW_SUBLAYERS\");\nexport const ATTACH_TO_PARENT = Symbol(\"ATTACH_TO_PARENT\");\nexport const SET_LEGEND = Symbol(\"SET_LEGEND\");\nexport const LAYER_DEPS = Symbol(\"LAYER_DEPS\");\nexport const SET_METADATA_LOAD_INFO = Symbol(\"SET_METADATA_LOAD_INFO\");\n"],"names":[],"mappings":";;AAwCO,SAAS,oBAAA,CACZ,MACA,GAAA,EAC6B;AAC7B,EAAA,IAAI,OAAO,IAAA,EAAM;AAEb,IAAA,OAAO,MAAA;AAAA,EACX;AACA,EAAA,IAAI,QAAQ,wBAAA,EAA0B;AAClC,IAAA,MAAM,IAAI,KAAA;AAAA,MACN;AAAA,KACJ;AAAA,EACJ;AACA,EAAA,IAAI,CAAC,IAAA,EAAM;AAEP,IAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,EACpE;AACA,EAAA,OAAO,IAAA;AACX;AAGO,MAAM,WAAA,0BAAqB,aAAa;AACxC,MAAM,eAAA,0BAAyB,iBAAiB;AAChD,MAAM,aAAA,0BAAuB,eAAe;AAC5C,MAAM,eAAA,0BAAyB,iBAAiB;AAChD,MAAM,iBAAA,0BAA2B,mBAAmB;AACpD,MAAM,cAAA,0BAAwB,gBAAgB;AAC9C,MAAM,UAAA,0BAAoB,YAAY;AACtC,MAAM,QAAA,0BAAkB,UAAU;AAClC,MAAM,iBAAA,0BAA2B,mBAAmB;AACpD,MAAM,gBAAA,0BAA0B,kBAAkB;AAClD,MAAM,UAAA,0BAAoB,YAAY;AACtC,MAAM,UAAA,0BAAoB,YAAY;AACtC,MAAM,sBAAA,0BAAgC,wBAAwB;;;;"}
@@ -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 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;;;;"}
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\n\n// oxlint-disable-next-line @typescript-eslint/no-unused-vars\nimport { type LayerBaseType } from \"..\";\nimport { type GroupLayer } from \"./GroupLayer\";\n// oxlint-disable-next-line @typescript-eslint/no-unused-vars\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":"AAoEO,SAAS,WAAW,KAAA,EAAoC;AAC3D,EAAA,OAAO,aAAA,IAAiB,KAAA;AAC5B;AAOO,SAAS,QAAQ,KAAA,EAAiC;AACrD,EAAA,OAAO,SAAA,IAAa,KAAA;AACxB;;;;"}