@open-pioneer/map 1.5.0-dev.20260911123645 → 1.5.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 (49) hide show
  1. package/CHANGELOG.md +529 -520
  2. package/LayerFactory.js.map +1 -1
  3. package/MapRegistry.js.map +1 -1
  4. package/README.md +37 -1
  5. package/_virtual/hooks.js.map +1 -1
  6. package/_virtual/source-info.js.map +1 -1
  7. package/layers/AbstractLayer.js.map +1 -1
  8. package/layers/AbstractLayerBase.js.map +1 -1
  9. package/layers/GroupLayer.js.map +1 -1
  10. package/layers/SimpleLayer.js.map +1 -1
  11. package/layers/WMSLayer.js.map +1 -1
  12. package/layers/WMTSLayer.js.map +1 -1
  13. package/layers/group/GroupLayerCollection.js.map +1 -1
  14. package/layers/shared/SublayersCollection.js.map +1 -1
  15. package/layers/shared/getRecursiveLayers.js.map +1 -1
  16. package/layers/shared/internals.js.map +1 -1
  17. package/layers/unions.js.map +1 -1
  18. package/layers/wms/WMSSublayer.js.map +1 -1
  19. package/layers/wms/getAttributions.js.map +1 -1
  20. package/layers/wms/getLegendUrl.js.map +1 -1
  21. package/layers/wmts/getAttributions.js.map +1 -1
  22. package/layers/wmts/getLegendUrl.js.map +1 -1
  23. package/model/Highlights.js.map +1 -1
  24. package/model/LayerCollection.js.map +1 -1
  25. package/model/MapAttributions.js.map +1 -1
  26. package/model/MapModel.d.ts +2 -1
  27. package/model/MapModel.js +16 -12
  28. package/model/MapModel.js.map +1 -1
  29. package/model/Overlays.js.map +1 -1
  30. package/model/createMapModel.js +10 -22
  31. package/model/createMapModel.js.map +1 -1
  32. package/model/getGeometries.js.map +1 -1
  33. package/package.json +8 -8
  34. package/ui/DefaultMapProvider.js.map +1 -1
  35. package/ui/MapAnchor.js.map +1 -1
  36. package/ui/MapContainer.js +3 -2
  37. package/ui/MapContainer.js.map +1 -1
  38. package/ui/MapContainerContext.js.map +1 -1
  39. package/ui/OverlaysRenderer.js.map +1 -1
  40. package/ui/computeMapAnchorStyles.js.map +1 -1
  41. package/ui/hooks/useMapModel.js.map +1 -1
  42. package/ui/styles.css +0 -1
  43. package/ui/styles.css.map +1 -1
  44. package/utils/InternalConstructorTag.js.map +1 -1
  45. package/utils/fetch.js.map +1 -1
  46. package/utils/geometry-utils.js.map +1 -1
  47. package/utils/ol-test-support.js.map +1 -1
  48. package/utils/projections.js.map +1 -1
  49. package/utils/sanitize.js.map +1 -1
@@ -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\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
+ {"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 +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\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
+ {"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 +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\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
+ {"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 +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\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
+ {"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 +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\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\");\nexport const DECLARED_AS_BASE_LAYER = Symbol(\"DECLARED_AS_BASE_LAYER\");\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;AAC9D,MAAM,sBAAA,0BAAgC,wBAAwB;;;;"}
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\");\nexport const DECLARED_AS_BASE_LAYER = Symbol(\"DECLARED_AS_BASE_LAYER\");\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;AAC9D,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\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;;;;"}
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;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"WMSSublayer.js","sources":["WMSSublayer.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Reactive, reactive } from \"@conterra/reactivity-core\";\nimport { MapModel } from \"../../model/MapModel\";\nimport {\n assertInternalConstructor,\n INTERNAL_CONSTRUCTOR_TAG,\n InternalConstructorTag\n} from \"../../utils/InternalConstructorTag\";\nimport type { LayerLoadInfo, LayerLoadState } from \"../AbstractLayer\";\nimport { AbstractLayerBase } from \"../AbstractLayerBase\";\nimport {\n ATTACH_TO_MAP,\n ATTACH_TO_PARENT,\n DETACH_FROM_MAP,\n GET_RAW_SUBLAYERS,\n SET_LEGEND\n} from \"../shared/internals\";\nimport { LayerBaseConfig } from \"../shared/LayerConfig\";\nimport { SublayerBaseType } from \"../shared/SublayerBaseType\";\nimport { SublayersCollection } from \"../shared/SublayersCollection\";\nimport { WMSLayer } from \"../WMSLayer\";\n\n/**\n * Configuration options to construct the sublayers of a {@link WMSLayer}.\n *\n * @group Layers\n */\nexport interface WMSSublayerConfig extends LayerBaseConfig {\n /**\n * The name of the WMS sublayer in the service's capabilities.\n * Not mandatory, e.g. for WMS group layer. See [WMS spec](https://www.ogc.org/standard/wms/).\n */\n name?: string;\n\n /** Configuration for nested sublayers. */\n sublayers?: WMSSublayerConfig[];\n}\n\nexport const SET_SUBLAYER_LOAD_INFO = Symbol(\"SET_SUBLAYER_LOAD_INFO\");\n\n/**\n * Represents a sublayer of a {@link WMSLayer}.\n *\n * @group Layers\n */\nexport class WMSSublayer extends AbstractLayerBase implements SublayerBaseType {\n #parent: WMSSublayer | WMSLayer | undefined;\n #parentLayer: WMSLayer | undefined;\n #name: string | undefined;\n #legend = reactive<string>();\n #sublayers: SublayersCollection<WMSSublayer>;\n #visible: Reactive<boolean>;\n #loadInfo = reactive<LayerLoadInfo>(\"loaded\");\n\n /**\n * @internal\n */\n constructor(config: WMSSublayerConfig, tag: InternalConstructorTag) {\n assertInternalConstructor(tag);\n\n super(config);\n this.#name = config.name;\n this.#visible = reactive(config.visible ?? true);\n this.#sublayers = new SublayersCollection(\n constructSublayers(config.sublayers),\n INTERNAL_CONSTRUCTOR_TAG\n );\n }\n\n override get type() {\n return \"wms-sublayer\" as const;\n }\n\n /**\n * The name of the WMS sublayer in the service's capabilities.\n *\n * Is optional as a WMS group layer in a WMS service does not need to have a name.\n */\n get name(): string | undefined {\n return this.#name;\n }\n\n override get layers(): undefined {\n return undefined;\n }\n\n override get sublayers(): SublayersCollection<WMSSublayer> {\n return this.#sublayers;\n }\n\n override get parent(): WMSSublayer | WMSLayer {\n const parent = this.#parent;\n if (!parent) {\n throw new Error(`WMS sublayer ${this.id} has not been attached to its parent yet.`);\n }\n return parent;\n }\n\n get parentLayer(): WMSLayer {\n const parentLayer = this.#parentLayer;\n if (!parentLayer) {\n throw new Error(`WMS sublayer ${this.id} has not been attached to its parent yet.`);\n }\n return parentLayer;\n }\n\n override get legend(): string | undefined {\n return this.#legend.value;\n }\n\n get loadState(): LayerLoadState {\n const current = this.#loadInfo.value;\n if (typeof current === \"string\") {\n return current;\n }\n return current.kind;\n }\n\n /**\n * The error (if any) that prevented this sublayer from loading.\n */\n get loadError(): Error | undefined {\n const current = this.#loadInfo.value;\n if (typeof current === \"object\" && \"kind\" in current && current.kind === \"error\") {\n return current.error;\n }\n return undefined;\n }\n\n override get visible(): boolean {\n return this.#visible.value;\n }\n\n /**\n * Called by the parent layer when it is attached to the map to attach all sublayers.\n *\n * @internal\n */\n override [ATTACH_TO_MAP](map: MapModel): void {\n super[ATTACH_TO_MAP](map);\n\n // Recurse into nested sublayers\n for (const sublayer of this.sublayers[GET_RAW_SUBLAYERS]()) {\n sublayer[ATTACH_TO_MAP](map);\n }\n }\n\n /** @internal */\n override [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 /**\n * Attaches this sublayer to its parent _layer_ and its immediate parent _layer or sublayer_.\n *\n * @internal\n */\n [ATTACH_TO_PARENT](parentLayer: WMSLayer, parent: WMSLayer | WMSSublayer): void {\n if (this.#parent) {\n throw new Error(\n `WMS sublayer '${this.id}' has already been attached to parent '${this.#parent.id}'`\n );\n }\n this.#parent = parent;\n\n if (this.#parentLayer) {\n throw new Error(\n `WMS sublayer '${this.id}' has already been attached to parent layer '${this.#parentLayer.id}'`\n );\n }\n this.#parentLayer = parentLayer;\n\n // Recurse into nested sublayers\n for (const sublayer of this.sublayers[GET_RAW_SUBLAYERS]()) {\n sublayer[ATTACH_TO_PARENT](parentLayer, this);\n }\n }\n\n /**\n * Called by the parent layer to update the legend on load.\n *\n * @internal\n */\n [SET_LEGEND](legendUrl: string | undefined) {\n this.#legend.value = legendUrl;\n }\n\n /**\n * Called by the parent layer once the capabilities have been validated.\n *\n * @internal\n */\n [SET_SUBLAYER_LOAD_INFO](loadInfo: LayerLoadInfo): void {\n this.#loadInfo.value = loadInfo;\n }\n\n override setVisible(newVisibility: boolean): void {\n this.#visible.value = newVisibility;\n }\n}\n\n/**\n * Constructs a tree of wms sublayers from a nested configuration object.\n */\nexport function constructSublayers(sublayerConfigs: WMSSublayerConfig[] = []): WMSSublayer[] {\n const sublayers: WMSSublayer[] = [];\n try {\n for (const sublayerConfig of sublayerConfigs) {\n sublayers.push(new WMSSublayer(sublayerConfig, INTERNAL_CONSTRUCTOR_TAG));\n }\n return sublayers;\n } catch (e) {\n // Ensure previous sublayers are destroyed if a single constructor throws\n while (sublayers.length) {\n const layer = sublayers.pop();\n layer?.destroy();\n }\n throw new Error(\"Failed to construct sublayers.\", { cause: e });\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"WMSSublayer.js","sources":["WMSSublayer.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Reactive, reactive } from \"@conterra/reactivity-core\";\nimport { MapModel } from \"../../model/MapModel\";\nimport {\n assertInternalConstructor,\n INTERNAL_CONSTRUCTOR_TAG,\n InternalConstructorTag\n} from \"../../utils/InternalConstructorTag\";\nimport type { LayerLoadInfo, LayerLoadState } from \"../AbstractLayer\";\nimport { AbstractLayerBase } from \"../AbstractLayerBase\";\nimport {\n ATTACH_TO_MAP,\n ATTACH_TO_PARENT,\n DETACH_FROM_MAP,\n GET_RAW_SUBLAYERS,\n SET_LEGEND\n} from \"../shared/internals\";\nimport { LayerBaseConfig } from \"../shared/LayerConfig\";\nimport { SublayerBaseType } from \"../shared/SublayerBaseType\";\nimport { SublayersCollection } from \"../shared/SublayersCollection\";\nimport { WMSLayer } from \"../WMSLayer\";\n\n/**\n * Configuration options to construct the sublayers of a {@link WMSLayer}.\n *\n * @group Layers\n */\nexport interface WMSSublayerConfig extends LayerBaseConfig {\n /**\n * The name of the WMS sublayer in the service's capabilities.\n * Not mandatory, e.g. for WMS group layer. See [WMS spec](https://www.ogc.org/standard/wms/).\n */\n name?: string;\n\n /** Configuration for nested sublayers. */\n sublayers?: WMSSublayerConfig[];\n}\n\nexport const SET_SUBLAYER_LOAD_INFO = Symbol(\"SET_SUBLAYER_LOAD_INFO\");\n\n/**\n * Represents a sublayer of a {@link WMSLayer}.\n *\n * @group Layers\n */\nexport class WMSSublayer extends AbstractLayerBase implements SublayerBaseType {\n #parent: WMSSublayer | WMSLayer | undefined;\n #parentLayer: WMSLayer | undefined;\n #name: string | undefined;\n #legend = reactive<string>();\n #sublayers: SublayersCollection<WMSSublayer>;\n #visible: Reactive<boolean>;\n #loadInfo = reactive<LayerLoadInfo>(\"loaded\");\n\n /**\n * @internal\n */\n constructor(config: WMSSublayerConfig, tag: InternalConstructorTag) {\n assertInternalConstructor(tag);\n\n super(config);\n this.#name = config.name;\n this.#visible = reactive(config.visible ?? true);\n this.#sublayers = new SublayersCollection(\n constructSublayers(config.sublayers),\n INTERNAL_CONSTRUCTOR_TAG\n );\n }\n\n override get type() {\n return \"wms-sublayer\" as const;\n }\n\n /**\n * The name of the WMS sublayer in the service's capabilities.\n *\n * Is optional as a WMS group layer in a WMS service does not need to have a name.\n */\n get name(): string | undefined {\n return this.#name;\n }\n\n override get layers(): undefined {\n return undefined;\n }\n\n override get sublayers(): SublayersCollection<WMSSublayer> {\n return this.#sublayers;\n }\n\n override get parent(): WMSSublayer | WMSLayer {\n const parent = this.#parent;\n if (!parent) {\n throw new Error(`WMS sublayer ${this.id} has not been attached to its parent yet.`);\n }\n return parent;\n }\n\n get parentLayer(): WMSLayer {\n const parentLayer = this.#parentLayer;\n if (!parentLayer) {\n throw new Error(`WMS sublayer ${this.id} has not been attached to its parent yet.`);\n }\n return parentLayer;\n }\n\n override get legend(): string | undefined {\n return this.#legend.value;\n }\n\n get loadState(): LayerLoadState {\n const current = this.#loadInfo.value;\n if (typeof current === \"string\") {\n return current;\n }\n return current.kind;\n }\n\n /**\n * The error (if any) that prevented this sublayer from loading.\n */\n get loadError(): Error | undefined {\n const current = this.#loadInfo.value;\n if (typeof current === \"object\" && \"kind\" in current && current.kind === \"error\") {\n return current.error;\n }\n return undefined;\n }\n\n override get visible(): boolean {\n return this.#visible.value;\n }\n\n /**\n * Called by the parent layer when it is attached to the map to attach all sublayers.\n *\n * @internal\n */\n override [ATTACH_TO_MAP](map: MapModel): void {\n super[ATTACH_TO_MAP](map);\n\n // Recurse into nested sublayers\n for (const sublayer of this.sublayers[GET_RAW_SUBLAYERS]()) {\n sublayer[ATTACH_TO_MAP](map);\n }\n }\n\n /** @internal */\n override [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 /**\n * Attaches this sublayer to its parent _layer_ and its immediate parent _layer or sublayer_.\n *\n * @internal\n */\n [ATTACH_TO_PARENT](parentLayer: WMSLayer, parent: WMSLayer | WMSSublayer): void {\n if (this.#parent) {\n throw new Error(\n `WMS sublayer '${this.id}' has already been attached to parent '${this.#parent.id}'`\n );\n }\n this.#parent = parent;\n\n if (this.#parentLayer) {\n throw new Error(\n `WMS sublayer '${this.id}' has already been attached to parent layer '${this.#parentLayer.id}'`\n );\n }\n this.#parentLayer = parentLayer;\n\n // Recurse into nested sublayers\n for (const sublayer of this.sublayers[GET_RAW_SUBLAYERS]()) {\n sublayer[ATTACH_TO_PARENT](parentLayer, this);\n }\n }\n\n /**\n * Called by the parent layer to update the legend on load.\n *\n * @internal\n */\n [SET_LEGEND](legendUrl: string | undefined) {\n this.#legend.value = legendUrl;\n }\n\n /**\n * Called by the parent layer once the capabilities have been validated.\n *\n * @internal\n */\n [SET_SUBLAYER_LOAD_INFO](loadInfo: LayerLoadInfo): void {\n this.#loadInfo.value = loadInfo;\n }\n\n override setVisible(newVisibility: boolean): void {\n this.#visible.value = newVisibility;\n }\n}\n\n/**\n * Constructs a tree of wms sublayers from a nested configuration object.\n */\nexport function constructSublayers(sublayerConfigs: WMSSublayerConfig[] = []): WMSSublayer[] {\n const sublayers: WMSSublayer[] = [];\n try {\n for (const sublayerConfig of sublayerConfigs) {\n sublayers.push(new WMSSublayer(sublayerConfig, INTERNAL_CONSTRUCTOR_TAG));\n }\n return sublayers;\n } catch (e) {\n // Ensure previous sublayers are destroyed if a single constructor throws\n while (sublayers.length) {\n const layer = sublayers.pop();\n layer?.destroy();\n }\n throw new Error(\"Failed to construct sublayers.\", { cause: e });\n }\n}\n"],"names":[],"mappings":";;;;;;AAwCO,MAAM,sBAAA,0BAAgC,wBAAwB;AAO9D,MAAM,oBAAoB,iBAAA,CAA8C;AAAA,EAC3E,OAAA;AAAA,EACA,YAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAU,QAAA,EAAiB;AAAA,EAC3B,UAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,GAAY,SAAwB,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA,EAK5C,WAAA,CAAY,QAA2B,GAAA,EAA6B;AAChE,IAAA,yBAAA,CAA0B,GAAG,CAAA;AAE7B,IAAA,KAAA,CAAM,MAAM,CAAA;AACZ,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,IAAA;AACpB,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA,CAAS,MAAA,CAAO,OAAA,IAAW,IAAI,CAAA;AAC/C,IAAA,IAAA,CAAK,aAAa,IAAI,mBAAA;AAAA,MAClB,kBAAA,CAAmB,OAAO,SAAS,CAAA;AAAA,MACnC;AAAA,KACJ;AAAA,EACJ;AAAA,EAEA,IAAa,IAAA,GAAO;AAChB,IAAA,OAAO,cAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,IAAA,GAA2B;AAC3B,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EAChB;AAAA,EAEA,IAAa,MAAA,GAAoB;AAC7B,IAAA,OAAO,MAAA;AAAA,EACX;AAAA,EAEA,IAAa,SAAA,GAA8C;AACvD,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EAChB;AAAA,EAEA,IAAa,MAAA,GAAiC;AAC1C,IAAA,MAAM,SAAS,IAAA,CAAK,OAAA;AACpB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACT,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,aAAA,EAAgB,IAAA,CAAK,EAAE,CAAA,yCAAA,CAA2C,CAAA;AAAA,IACtF;AACA,IAAA,OAAO,MAAA;AAAA,EACX;AAAA,EAEA,IAAI,WAAA,GAAwB;AACxB,IAAA,MAAM,cAAc,IAAA,CAAK,YAAA;AACzB,IAAA,IAAI,CAAC,WAAA,EAAa;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,aAAA,EAAgB,IAAA,CAAK,EAAE,CAAA,yCAAA,CAA2C,CAAA;AAAA,IACtF;AACA,IAAA,OAAO,WAAA;AAAA,EACX;AAAA,EAEA,IAAa,MAAA,GAA6B;AACtC,IAAA,OAAO,KAAK,OAAA,CAAQ,KAAA;AAAA,EACxB;AAAA,EAEA,IAAI,SAAA,GAA4B;AAC5B,IAAA,MAAM,OAAA,GAAU,KAAK,SAAA,CAAU,KAAA;AAC/B,IAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC7B,MAAA,OAAO,OAAA;AAAA,IACX;AACA,IAAA,OAAO,OAAA,CAAQ,IAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAA,GAA+B;AAC/B,IAAA,MAAM,OAAA,GAAU,KAAK,SAAA,CAAU,KAAA;AAC/B,IAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,UAAU,OAAA,IAAW,OAAA,CAAQ,SAAS,OAAA,EAAS;AAC9E,MAAA,OAAO,OAAA,CAAQ,KAAA;AAAA,IACnB;AACA,IAAA,OAAO,MAAA;AAAA,EACX;AAAA,EAEA,IAAa,OAAA,GAAmB;AAC5B,IAAA,OAAO,KAAK,QAAA,CAAS,KAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,CAAU,aAAa,CAAA,CAAE,GAAA,EAAqB;AAC1C,IAAA,KAAA,CAAM,aAAa,EAAE,GAAG,CAAA;AAGxB,IAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,SAAA,CAAU,iBAAiB,GAAE,EAAG;AACxD,MAAA,QAAA,CAAS,aAAa,EAAE,GAAG,CAAA;AAAA,IAC/B;AAAA,EACJ;AAAA;AAAA,EAGA,CAAU,eAAe,CAAA,GAAU;AAC/B,IAAA,KAAA,CAAM,eAAe,CAAA,EAAE;AACvB,IAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,UAAA,CAAW,YAAA,EAAa,EAAG;AACnD,MAAA,QAAA,CAAS,eAAe,CAAA,EAAE;AAAA,IAC9B;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,CAAC,gBAAgB,CAAA,CAAE,WAAA,EAAuB,MAAA,EAAsC;AAC5E,IAAA,IAAI,KAAK,OAAA,EAAS;AACd,MAAA,MAAM,IAAI,KAAA;AAAA,QACN,iBAAiB,IAAA,CAAK,EAAE,CAAA,uCAAA,EAA0C,IAAA,CAAK,QAAQ,EAAE,CAAA,CAAA;AAAA,OACrF;AAAA,IACJ;AACA,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AAEf,IAAA,IAAI,KAAK,YAAA,EAAc;AACnB,MAAA,MAAM,IAAI,KAAA;AAAA,QACN,iBAAiB,IAAA,CAAK,EAAE,CAAA,6CAAA,EAAgD,IAAA,CAAK,aAAa,EAAE,CAAA,CAAA;AAAA,OAChG;AAAA,IACJ;AACA,IAAA,IAAA,CAAK,YAAA,GAAe,WAAA;AAGpB,IAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,SAAA,CAAU,iBAAiB,GAAE,EAAG;AACxD,MAAA,QAAA,CAAS,gBAAgB,CAAA,CAAE,WAAA,EAAa,IAAI,CAAA;AAAA,IAChD;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,CAAC,UAAU,CAAA,CAAE,SAAA,EAA+B;AACxC,IAAA,IAAA,CAAK,QAAQ,KAAA,GAAQ,SAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,CAAC,sBAAsB,CAAA,CAAE,QAAA,EAA+B;AACpD,IAAA,IAAA,CAAK,UAAU,KAAA,GAAQ,QAAA;AAAA,EAC3B;AAAA,EAES,WAAW,aAAA,EAA8B;AAC9C,IAAA,IAAA,CAAK,SAAS,KAAA,GAAQ,aAAA;AAAA,EAC1B;AACJ;AAKO,SAAS,kBAAA,CAAmB,eAAA,GAAuC,EAAC,EAAkB;AACzF,EAAA,MAAM,YAA2B,EAAC;AAClC,EAAA,IAAI;AACA,IAAA,KAAA,MAAW,kBAAkB,eAAA,EAAiB;AAC1C,MAAA,SAAA,CAAU,IAAA,CAAK,IAAI,WAAA,CAAY,cAAA,EAAgB,wBAAwB,CAAC,CAAA;AAAA,IAC5E;AACA,IAAA,OAAO,SAAA;AAAA,EACX,SAAS,CAAA,EAAG;AAER,IAAA,OAAO,UAAU,MAAA,EAAQ;AACrB,MAAA,MAAM,KAAA,GAAQ,UAAU,GAAA,EAAI;AAC5B,MAAA,KAAA,EAAO,OAAA,EAAQ;AAAA,IACnB;AACA,IAAA,MAAM,IAAI,KAAA,CAAM,gCAAA,EAAkC,EAAE,KAAA,EAAO,GAAG,CAAA;AAAA,EAClE;AACJ;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"getAttributions.js","sources":["getAttributions.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Returns the attribution derived from the WMS service metadata (if any).\n *\n * @param capabilities Parsed service capabilities\n */\n/* oxlint-disable @typescript-eslint/no-explicit-any */\nexport function getAttributions(capabilities: Record<string, any>): string | undefined {\n const service = capabilities?.Service;\n if (!service) {\n return undefined;\n }\n\n const constraints = service.AccessConstraints;\n if (isSet(constraints)) {\n return constraints;\n }\n\n const fees = service.Fees;\n if (isSet(fees)) {\n return fees;\n }\n\n return undefined;\n}\n\nconst NONE = /none/i;\n\nfunction isSet(value: any): value is string {\n return typeof value === \"string\" && !!value && !NONE.test(value);\n}\n\n/* eslint-enable @typescript-eslint/no-explicit-any */\n"],"names":[],"mappings":"AASO,SAAS,gBAAgB,YAAA,EAAuD;AACnF,EAAA,MAAM,UAAU,YAAA,EAAc,OAAA;AAC9B,EAAA,IAAI,CAAC,OAAA,EAAS;AACV,IAAA,OAAO,MAAA;AAAA,EACX;AAEA,EAAA,MAAM,cAAc,OAAA,CAAQ,iBAAA;AAC5B,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACpB,IAAA,OAAO,WAAA;AAAA,EACX;AAEA,EAAA,MAAM,OAAO,OAAA,CAAQ,IAAA;AACrB,EAAA,IAAI,KAAA,CAAM,IAAI,CAAA,EAAG;AACb,IAAA,OAAO,IAAA;AAAA,EACX;AAEA,EAAA,OAAO,MAAA;AACX;AAEA,MAAM,IAAA,GAAO,OAAA;AAEb,SAAS,MAAM,KAAA,EAA6B;AACxC,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,CAAC,CAAC,KAAA,IAAS,CAAC,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AACnE;;;;"}
1
+ {"version":3,"file":"getAttributions.js","sources":["getAttributions.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Returns the attribution derived from the WMS service metadata (if any).\n *\n * @param capabilities Parsed service capabilities\n */\n/* oxlint-disable @typescript-eslint/no-explicit-any */\nexport function getAttributions(capabilities: Record<string, any>): string | undefined {\n const service = capabilities?.Service;\n if (!service) {\n return undefined;\n }\n\n const constraints = service.AccessConstraints;\n if (isSet(constraints)) {\n return constraints;\n }\n\n const fees = service.Fees;\n if (isSet(fees)) {\n return fees;\n }\n\n return undefined;\n}\n\nconst NONE = /none/i;\n\nfunction isSet(value: any): value is string {\n return typeof value === \"string\" && !!value && !NONE.test(value);\n}\n\n/* eslint-enable @typescript-eslint/no-explicit-any */\n"],"names":[],"mappings":"AASO,SAAS,gBAAgB,YAAA,EAAuD;AACnF,EAAA,MAAM,UAAU,YAAA,EAAc,OAAA;AAC9B,EAAA,IAAI,CAAC,OAAA,EAAS;AACV,IAAA,OAAO,MAAA;AAAA,EACX;AAEA,EAAA,MAAM,cAAc,OAAA,CAAQ,iBAAA;AAC5B,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACpB,IAAA,OAAO,WAAA;AAAA,EACX;AAEA,EAAA,MAAM,OAAO,OAAA,CAAQ,IAAA;AACrB,EAAA,IAAI,KAAA,CAAM,IAAI,CAAA,EAAG;AACb,IAAA,OAAO,IAAA;AAAA,EACX;AAEA,EAAA,OAAO,MAAA;AACX;AAEA,MAAM,IAAA,GAAO,OAAA;AAEb,SAAS,MAAM,KAAA,EAA6B;AACxC,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,CAAC,CAAC,KAAA,IAAS,CAAC,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AACnE;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"getLegendUrl.js","sources":["getLegendUrl.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\n\nimport { createLogger } from \"@open-pioneer/core\";\nimport { sourceId } from \"open-pioneer:source-info\";\n\nconst LOG = createLogger(sourceId);\n\n/**\n * Extracts the legend url from the service capabilities.\n **/\nexport function getLegendUrl(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n capabilities: Record<string, any>,\n layerName: string\n): string | undefined {\n const capabilitiesContent = capabilities?.Capability;\n const rootLayerCapabilities = capabilitiesContent?.Layer;\n let url: string | undefined = undefined;\n\n /** Recurse search for the current layer within the parsed capabilities service*/\n //oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const searchNestedLayer = (layer: Record<string, any>[]) => {\n for (const currentLayer of layer) {\n // spec. if, a layer has a <Name>, then it is a map layer\n if (currentLayer?.Name === layerName) {\n const activeLayer = currentLayer;\n const styles = activeLayer.Style;\n if (!styles || !styles.length) {\n LOG.debug(\"No style in WMS layer capabilities - giving up.\");\n return;\n }\n // by parsing of the service capabilities, every child inherits the parent's legend\n // therefore, extract the legendURL from the first style object in the array (its own legend)\n const activeStyle = styles[0];\n url = activeStyle.LegendURL?.[0]?.OnlineResource;\n } else if (currentLayer.Layer) {\n searchNestedLayer(currentLayer.Layer);\n }\n }\n };\n if (rootLayerCapabilities) {\n searchNestedLayer(rootLayerCapabilities.Layer);\n }\n return url;\n}\n"],"names":[],"mappings":";;;AAMA,MAAM,GAAA,GAAM,aAAa,QAAQ,CAAA;AAK1B,SAAS,YAAA,CAEZ,cACA,SAAA,EACkB;AAClB,EAAA,MAAM,sBAAsB,YAAA,EAAc,UAAA;AAC1C,EAAA,MAAM,wBAAwB,mBAAA,EAAqB,KAAA;AACnD,EAAA,IAAI,GAAA,GAA0B,MAAA;AAI9B,EAAA,MAAM,iBAAA,GAAoB,CAAC,KAAA,KAAiC;AACxD,IAAA,KAAA,MAAW,gBAAgB,KAAA,EAAO;AAE9B,MAAA,IAAI,YAAA,EAAc,SAAS,SAAA,EAAW;AAClC,QAAA,MAAM,WAAA,GAAc,YAAA;AACpB,QAAA,MAAM,SAAS,WAAA,CAAY,KAAA;AAC3B,QAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,CAAO,MAAA,EAAQ;AAC3B,UAAA,GAAA,CAAI,MAAM,iDAAiD,CAAA;AAC3D,UAAA;AAAA,QACJ;AAGA,QAAA,MAAM,WAAA,GAAc,OAAO,CAAC,CAAA;AAC5B,QAAA,GAAA,GAAM,WAAA,CAAY,SAAA,GAAY,CAAC,CAAA,EAAG,cAAA;AAAA,MACtC,CAAA,MAAA,IAAW,aAAa,KAAA,EAAO;AAC3B,QAAA,iBAAA,CAAkB,aAAa,KAAK,CAAA;AAAA,MACxC;AAAA,IACJ;AAAA,EACJ,CAAA;AACA,EAAA,IAAI,qBAAA,EAAuB;AACvB,IAAA,iBAAA,CAAkB,sBAAsB,KAAK,CAAA;AAAA,EACjD;AACA,EAAA,OAAO,GAAA;AACX;;;;"}
1
+ {"version":3,"file":"getLegendUrl.js","sources":["getLegendUrl.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\n\nimport { createLogger } from \"@open-pioneer/core\";\nimport { sourceId } from \"open-pioneer:source-info\";\n\nconst LOG = createLogger(sourceId);\n\n/**\n * Extracts the legend url from the service capabilities.\n **/\nexport function getLegendUrl(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n capabilities: Record<string, any>,\n layerName: string\n): string | undefined {\n const capabilitiesContent = capabilities?.Capability;\n const rootLayerCapabilities = capabilitiesContent?.Layer;\n let url: string | undefined = undefined;\n\n /** Recurse search for the current layer within the parsed capabilities service*/\n //oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const searchNestedLayer = (layer: Record<string, any>[]) => {\n for (const currentLayer of layer) {\n // spec. if, a layer has a <Name>, then it is a map layer\n if (currentLayer?.Name === layerName) {\n const activeLayer = currentLayer;\n const styles = activeLayer.Style;\n if (!styles || !styles.length) {\n LOG.debug(\"No style in WMS layer capabilities - giving up.\");\n return;\n }\n // by parsing of the service capabilities, every child inherits the parent's legend\n // therefore, extract the legendURL from the first style object in the array (its own legend)\n const activeStyle = styles[0];\n url = activeStyle.LegendURL?.[0]?.OnlineResource;\n } else if (currentLayer.Layer) {\n searchNestedLayer(currentLayer.Layer);\n }\n }\n };\n if (rootLayerCapabilities) {\n searchNestedLayer(rootLayerCapabilities.Layer);\n }\n return url;\n}\n"],"names":[],"mappings":";;;AAMA,MAAM,GAAA,GAAM,aAAa,QAAQ,CAAA;AAK1B,SAAS,YAAA,CAEZ,cACA,SAAA,EACkB;AAClB,EAAA,MAAM,sBAAsB,YAAA,EAAc,UAAA;AAC1C,EAAA,MAAM,wBAAwB,mBAAA,EAAqB,KAAA;AACnD,EAAA,IAAI,GAAA,GAA0B,MAAA;AAI9B,EAAA,MAAM,iBAAA,GAAoB,CAAC,KAAA,KAAiC;AACxD,IAAA,KAAA,MAAW,gBAAgB,KAAA,EAAO;AAE9B,MAAA,IAAI,YAAA,EAAc,SAAS,SAAA,EAAW;AAClC,QAAA,MAAM,WAAA,GAAc,YAAA;AACpB,QAAA,MAAM,SAAS,WAAA,CAAY,KAAA;AAC3B,QAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,CAAO,MAAA,EAAQ;AAC3B,UAAA,GAAA,CAAI,MAAM,iDAAiD,CAAA;AAC3D,UAAA;AAAA,QACJ;AAGA,QAAA,MAAM,WAAA,GAAc,OAAO,CAAC,CAAA;AAC5B,QAAA,GAAA,GAAM,WAAA,CAAY,SAAA,GAAY,CAAC,CAAA,EAAG,cAAA;AAAA,MACtC,CAAA,MAAA,IAAW,aAAa,KAAA,EAAO;AAC3B,QAAA,iBAAA,CAAkB,aAAa,KAAK,CAAA;AAAA,MACxC;AAAA,IACJ;AAAA,EACJ,CAAA;AACA,EAAA,IAAI,qBAAA,EAAuB;AACvB,IAAA,iBAAA,CAAkB,sBAAsB,KAAK,CAAA;AAAA,EACjD;AACA,EAAA,OAAO,GAAA;AACX;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"getAttributions.js","sources":["getAttributions.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Returns the attribution derived from the WMTS service metadata (if any).\n *\n * @param capabilities Parsed service capabilities\n */\n/* oxlint-disable @typescript-eslint/no-explicit-any */\nexport function getAttributions(capabilities: Record<string, any>): string | undefined {\n const service = capabilities?.ServiceIdentification;\n if (!service) {\n return undefined;\n }\n\n const constraints = service.AccessConstraints;\n if (isSet(constraints)) {\n return constraints;\n }\n\n const fees = service.Fees;\n if (isSet(fees)) {\n return fees;\n }\n\n return undefined;\n}\n\nconst NONE = /none/i;\n\nfunction isSet(value: any): value is string {\n return typeof value === \"string\" && !!value && !NONE.test(value);\n}\n\n/* eslint-enable @typescript-eslint/no-explicit-any */\n"],"names":[],"mappings":"AASO,SAAS,gBAAgB,YAAA,EAAuD;AACnF,EAAA,MAAM,UAAU,YAAA,EAAc,qBAAA;AAC9B,EAAA,IAAI,CAAC,OAAA,EAAS;AACV,IAAA,OAAO,MAAA;AAAA,EACX;AAEA,EAAA,MAAM,cAAc,OAAA,CAAQ,iBAAA;AAC5B,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACpB,IAAA,OAAO,WAAA;AAAA,EACX;AAEA,EAAA,MAAM,OAAO,OAAA,CAAQ,IAAA;AACrB,EAAA,IAAI,KAAA,CAAM,IAAI,CAAA,EAAG;AACb,IAAA,OAAO,IAAA;AAAA,EACX;AAEA,EAAA,OAAO,MAAA;AACX;AAEA,MAAM,IAAA,GAAO,OAAA;AAEb,SAAS,MAAM,KAAA,EAA6B;AACxC,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,CAAC,CAAC,KAAA,IAAS,CAAC,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AACnE;;;;"}
1
+ {"version":3,"file":"getAttributions.js","sources":["getAttributions.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Returns the attribution derived from the WMTS service metadata (if any).\n *\n * @param capabilities Parsed service capabilities\n */\n/* oxlint-disable @typescript-eslint/no-explicit-any */\nexport function getAttributions(capabilities: Record<string, any>): string | undefined {\n const service = capabilities?.ServiceIdentification;\n if (!service) {\n return undefined;\n }\n\n const constraints = service.AccessConstraints;\n if (isSet(constraints)) {\n return constraints;\n }\n\n const fees = service.Fees;\n if (isSet(fees)) {\n return fees;\n }\n\n return undefined;\n}\n\nconst NONE = /none/i;\n\nfunction isSet(value: any): value is string {\n return typeof value === \"string\" && !!value && !NONE.test(value);\n}\n\n/* eslint-enable @typescript-eslint/no-explicit-any */\n"],"names":[],"mappings":"AASO,SAAS,gBAAgB,YAAA,EAAuD;AACnF,EAAA,MAAM,UAAU,YAAA,EAAc,qBAAA;AAC9B,EAAA,IAAI,CAAC,OAAA,EAAS;AACV,IAAA,OAAO,MAAA;AAAA,EACX;AAEA,EAAA,MAAM,cAAc,OAAA,CAAQ,iBAAA;AAC5B,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACpB,IAAA,OAAO,WAAA;AAAA,EACX;AAEA,EAAA,MAAM,OAAO,OAAA,CAAQ,IAAA;AACrB,EAAA,IAAI,KAAA,CAAM,IAAI,CAAA,EAAG;AACb,IAAA,OAAO,IAAA;AAAA,EACX;AAEA,EAAA,OAAO,MAAA;AACX;AAEA,MAAM,IAAA,GAAO,OAAA;AAEb,SAAS,MAAM,KAAA,EAA6B;AACxC,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,CAAC,CAAC,KAAA,IAAS,CAAC,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AACnE;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"getLegendUrl.js","sources":["getLegendUrl.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\n\nimport { createLogger } from \"@open-pioneer/core\";\nimport { sourceId } from \"open-pioneer:source-info\";\n\nconst LOG = createLogger(sourceId);\n\n/* oxlint-disable @typescript-eslint/no-explicit-any */\nexport function getLegendUrl(\n capabilities: Record<string, any>,\n activeLayerId: string | undefined,\n activeStyleId: string | undefined\n): string | undefined {\n const content = capabilities?.Contents;\n const layers = content?.Layer;\n\n let activeLayer = layers?.find((layer: any) => layer?.Identifier === activeLayerId);\n if (!activeLayer) {\n LOG.debug(\"Failed to find the active layer in WMTS layer capabilities.\");\n activeLayer = layers?.[0];\n if (!activeLayer) {\n LOG.debug(\"No layer in WMTS capabilities - giving up.\");\n return undefined;\n }\n }\n\n const styles = activeLayer.Style;\n let activeStyle = styles?.find((style: any) => style?.Identifier === activeStyleId);\n if (!activeStyle) {\n LOG.debug(\"Failed to find active style in WMTS layer.\");\n activeStyle = styles?.[0];\n if (!activeStyle) {\n LOG.debug(\"No style in WMTS layer capabilities - giving up.\");\n return undefined;\n }\n }\n\n const legendUrl = activeStyle.LegendURL?.[0]?.href;\n return legendUrl as string | undefined;\n}\n/* eslint-enable @typescript-eslint/no-explicit-any */\n"],"names":[],"mappings":";;;AAMA,MAAM,GAAA,GAAM,aAAa,QAAQ,CAAA;AAG1B,SAAS,YAAA,CACZ,YAAA,EACA,aAAA,EACA,aAAA,EACkB;AAClB,EAAA,MAAM,UAAU,YAAA,EAAc,QAAA;AAC9B,EAAA,MAAM,SAAS,OAAA,EAAS,KAAA;AAExB,EAAA,IAAI,cAAc,MAAA,EAAQ,IAAA,CAAK,CAAC,KAAA,KAAe,KAAA,EAAO,eAAe,aAAa,CAAA;AAClF,EAAA,IAAI,CAAC,WAAA,EAAa;AACd,IAAA,GAAA,CAAI,MAAM,6DAA6D,CAAA;AACvE,IAAA,WAAA,GAAc,SAAS,CAAC,CAAA;AACxB,IAAA,IAAI,CAAC,WAAA,EAAa;AACd,MAAA,GAAA,CAAI,MAAM,4CAA4C,CAAA;AACtD,MAAA,OAAO,MAAA;AAAA,IACX;AAAA,EACJ;AAEA,EAAA,MAAM,SAAS,WAAA,CAAY,KAAA;AAC3B,EAAA,IAAI,cAAc,MAAA,EAAQ,IAAA,CAAK,CAAC,KAAA,KAAe,KAAA,EAAO,eAAe,aAAa,CAAA;AAClF,EAAA,IAAI,CAAC,WAAA,EAAa;AACd,IAAA,GAAA,CAAI,MAAM,4CAA4C,CAAA;AACtD,IAAA,WAAA,GAAc,SAAS,CAAC,CAAA;AACxB,IAAA,IAAI,CAAC,WAAA,EAAa;AACd,MAAA,GAAA,CAAI,MAAM,kDAAkD,CAAA;AAC5D,MAAA,OAAO,MAAA;AAAA,IACX;AAAA,EACJ;AAEA,EAAA,MAAM,SAAA,GAAY,WAAA,CAAY,SAAA,GAAY,CAAC,CAAA,EAAG,IAAA;AAC9C,EAAA,OAAO,SAAA;AACX;;;;"}
1
+ {"version":3,"file":"getLegendUrl.js","sources":["getLegendUrl.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\n\nimport { createLogger } from \"@open-pioneer/core\";\nimport { sourceId } from \"open-pioneer:source-info\";\n\nconst LOG = createLogger(sourceId);\n\n/* oxlint-disable @typescript-eslint/no-explicit-any */\nexport function getLegendUrl(\n capabilities: Record<string, any>,\n activeLayerId: string | undefined,\n activeStyleId: string | undefined\n): string | undefined {\n const content = capabilities?.Contents;\n const layers = content?.Layer;\n\n let activeLayer = layers?.find((layer: any) => layer?.Identifier === activeLayerId);\n if (!activeLayer) {\n LOG.debug(\"Failed to find the active layer in WMTS layer capabilities.\");\n activeLayer = layers?.[0];\n if (!activeLayer) {\n LOG.debug(\"No layer in WMTS capabilities - giving up.\");\n return undefined;\n }\n }\n\n const styles = activeLayer.Style;\n let activeStyle = styles?.find((style: any) => style?.Identifier === activeStyleId);\n if (!activeStyle) {\n LOG.debug(\"Failed to find active style in WMTS layer.\");\n activeStyle = styles?.[0];\n if (!activeStyle) {\n LOG.debug(\"No style in WMTS layer capabilities - giving up.\");\n return undefined;\n }\n }\n\n const legendUrl = activeStyle.LegendURL?.[0]?.href;\n return legendUrl as string | undefined;\n}\n/* eslint-enable @typescript-eslint/no-explicit-any */\n"],"names":[],"mappings":";;;AAMA,MAAM,GAAA,GAAM,aAAa,QAAQ,CAAA;AAG1B,SAAS,YAAA,CACZ,YAAA,EACA,aAAA,EACA,aAAA,EACkB;AAClB,EAAA,MAAM,UAAU,YAAA,EAAc,QAAA;AAC9B,EAAA,MAAM,SAAS,OAAA,EAAS,KAAA;AAExB,EAAA,IAAI,cAAc,MAAA,EAAQ,IAAA,CAAK,CAAC,KAAA,KAAe,KAAA,EAAO,eAAe,aAAa,CAAA;AAClF,EAAA,IAAI,CAAC,WAAA,EAAa;AACd,IAAA,GAAA,CAAI,MAAM,6DAA6D,CAAA;AACvE,IAAA,WAAA,GAAc,SAAS,CAAC,CAAA;AACxB,IAAA,IAAI,CAAC,WAAA,EAAa;AACd,MAAA,GAAA,CAAI,MAAM,4CAA4C,CAAA;AACtD,MAAA,OAAO,MAAA;AAAA,IACX;AAAA,EACJ;AAEA,EAAA,MAAM,SAAS,WAAA,CAAY,KAAA;AAC3B,EAAA,IAAI,cAAc,MAAA,EAAQ,IAAA,CAAK,CAAC,KAAA,KAAe,KAAA,EAAO,eAAe,aAAa,CAAA;AAClF,EAAA,IAAI,CAAC,WAAA,EAAa;AACd,IAAA,GAAA,CAAI,MAAM,4CAA4C,CAAA;AACtD,IAAA,WAAA,GAAc,SAAS,CAAC,CAAA;AACxB,IAAA,IAAI,CAAC,WAAA,EAAa;AACd,MAAA,GAAA,CAAI,MAAM,kDAAkD,CAAA;AAC5D,MAAA,OAAO,MAAA;AAAA,IACX;AAAA,EACJ;AAEA,EAAA,MAAM,SAAA,GAAY,WAAA,CAAY,SAAA,GAAY,CAAC,CAAA,EAAG,IAAA;AAC9C,EAAA,OAAO,SAAA;AACX;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"Highlights.js","sources":["Highlights.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Resource } from \"@open-pioneer/core\";\nimport { Feature } from \"ol\";\nimport { FeatureLike } from \"ol/Feature\";\nimport { Geometry } from \"ol/geom\";\nimport { Type } from \"ol/geom/Geometry\";\nimport VectorLayer from \"ol/layer/Vector\";\nimport VectorSource from \"ol/source/Vector\";\nimport { Fill, Icon, Stroke, Style } from \"ol/style\";\nimport { StyleLike, toFunction as toStyleFunction } from \"ol/style/Style\";\nimport mapMarkerUrl from \"../assets/images/mapMarker.png?url\";\nimport { LayerDependencies } from \"../layers/shared/internals\";\nimport { SimpleLayer } from \"../layers/SimpleLayer\";\nimport { INTERNAL_CONSTRUCTOR_TAG } from \"../utils/InternalConstructorTag\";\nimport { getGeometries } from \"./getGeometries\";\nimport { DisplayTarget, MapModel, ZoomOptions } from \"./MapModel\";\n\nexport const DESTROY_HIGHLIGHTS = Symbol(\"DESTROY_HIGHLIGHTS\");\nexport const GET_HIGHLIGHT_LAYER = Symbol(\"GET_HIGHLIGHT_LAYER\");\n\n/**\n * Style options supported when creating a new {@link Highlight}.\n *\n * @group Map Model\n **/\nexport interface HighlightOptions {\n /**\n * Optional styles to override the default styles.\n */\n highlightStyle?: HighlightStyle;\n}\n\n/**\n * Options supported by the map model's {@link MapModel.highlightAndZoom | highlightAndZoom} method.\n *\n * @group Map Model\n **/\nexport interface HighlightZoomOptions extends HighlightOptions, ZoomOptions {}\n\n/**\n * Custom styles when creating a new {@link Highlight}.\n *\n * @group Map Model\n */\nexport type HighlightStyle = {\n Point?: StyleLike;\n LineString?: StyleLike;\n Polygon?: StyleLike;\n MultiPolygon?: StyleLike;\n MultiPoint?: StyleLike;\n MultiLineString?: StyleLike;\n};\n\n/**\n * Represents the additional graphical representations of objects.\n *\n * See also {@link MapModel.highlight}.\n *\n * @group Map Model\n */\nexport interface Highlight extends Resource {\n /** Returns `true` if the highlight has not been destroyed yet. */\n readonly isActive: boolean;\n\n /** Updates the style of the highlight. Use `undefined` to revert to the default style. */\n setStyle(style: HighlightStyle | undefined): void;\n}\n\ntype HighlightStyleType = keyof HighlightStyle;\n\n/**\n * Manages highlights on the map.\n *\n * @group Map Model\n */\nexport class Highlights {\n #map: MapModel;\n\n #olLayer: VectorLayer<VectorSource, Feature>;\n #layer: SimpleLayer;\n #olSource: VectorSource<Feature<Geometry>>;\n #activeHighlights: Set<Highlight>;\n\n constructor(map: MapModel, layerDeps: LayerDependencies) {\n this.#map = map;\n this.#olSource = new VectorSource({\n features: undefined\n });\n this.#olLayer = new VectorLayer({\n className: \"highlight-layer\",\n source: this.#olSource,\n style: function (feature, resolution) {\n return resolveStyle(feature, resolution);\n }\n });\n this.#layer = new SimpleLayer(\n {\n title: \"highlight-layer\",\n internal: true,\n olLayer: this.#olLayer\n },\n layerDeps,\n INTERNAL_CONSTRUCTOR_TAG\n );\n map.layers.addLayer(this.#layer, { at: \"topmost\" });\n\n this.#activeHighlights = new Set();\n }\n\n [DESTROY_HIGHLIGHTS]() {\n this.clear();\n }\n\n /**\n * Creates a highlight at the given targets.\n *\n * A highlight is a temporary graphic on the map that calls attention to a point or an area.\n *\n * Call `destroy()` on the returned highlight object to remove the highlight.\n */\n add(displayTargets: DisplayTarget[], options?: HighlightOptions | undefined): Highlight {\n const geometries = getGeometries(displayTargets);\n if (geometries.length === 0) {\n return {\n get isActive() {\n return false;\n },\n destroy() {},\n setStyle() {}\n };\n }\n\n const features = geometries.map((geometry) => {\n const type = geometry.getType();\n const feature = new Feature({\n type: type,\n geometry: geometry\n });\n feature.setStyle(getOwnStyle(type, options?.highlightStyle));\n return feature;\n });\n\n const source = this.#olSource;\n const highlights = this.#activeHighlights;\n const highlight: Highlight = {\n get isActive() {\n return highlights.has(highlight);\n },\n destroy() {\n if (!this.isActive) {\n return;\n }\n\n for (const feature of features) {\n source.removeFeature(feature);\n }\n highlights.delete(highlight);\n },\n setStyle(style: HighlightStyle | undefined) {\n for (const feature of features) {\n const geometry = feature.getGeometry();\n if (geometry) {\n feature.setStyle(getOwnStyle(geometry.getType(), style));\n }\n }\n }\n };\n\n source.addFeatures(features);\n this.#activeHighlights.add(highlight);\n return highlight;\n }\n\n /**\n * Creates a highlight and zooms to the given targets.\n *\n * See also {@link add} and {@link MapModel.zoom}.\n */\n addAndZoom(\n displayTarget: DisplayTarget[],\n options?: HighlightZoomOptions | undefined\n ): Highlight {\n const result = this.add(displayTarget, options);\n this.#map.zoom(displayTarget, options);\n return result;\n }\n\n /**\n * This method destroys all active Highlights.\n */\n clear() {\n for (const highlight of this.#activeHighlights) {\n highlight.destroy();\n }\n }\n\n /**\n * Returns the layer used for highlights.\n */\n [GET_HIGHLIGHT_LAYER]() {\n return this.#olLayer;\n }\n}\n\n/**\n * Returns the appropriate style from the user's highlightStyle or falls back to the default style\n */\nfunction resolveStyle(feature: FeatureLike, resolution: number) {\n const type: keyof typeof defaultHighlightStyle = feature.get(\"type\");\n const style = toStyleFunction(getDefaultStyle(type));\n return style(feature, resolution);\n}\n\n/**\n * This method creates styling for a highlight based on the optional style information or the default style\n */\nfunction getOwnStyle(type: Type, highlightStyle: HighlightStyle | undefined) {\n if (highlightStyle && type in highlightStyle) {\n const supportedType = type as HighlightStyleType;\n const ownStyle = highlightStyle[supportedType];\n return ownStyle ? ownStyle : getDefaultStyle(type);\n } else {\n return getDefaultStyle(type);\n }\n}\n\n/**\n * This returns default styling for a highlight\n */\nfunction getDefaultStyle(type: Type) {\n if (type in defaultHighlightStyle) {\n const supportedType = type as HighlightStyleType;\n return defaultHighlightStyle[supportedType];\n } else {\n return defaultHighlightStyle.Polygon;\n }\n}\n\n/**\n * Default styling for highlights\n */\nconst defaultHighlightStyle = {\n \"Point\": new Style({\n image: new Icon({\n anchor: [0.5, 1],\n src: mapMarkerUrl\n })\n }),\n \"MultiPoint\": new Style({\n image: new Icon({\n anchor: [0.5, 1],\n src: mapMarkerUrl\n })\n }),\n \"LineString\": [\n new Style({\n stroke: new Stroke({\n color: \"#fff\",\n width: 5\n })\n }),\n new Style({\n stroke: new Stroke({\n color: \"#00ffff\",\n width: 3\n })\n })\n ],\n \"MultiLineString\": [\n new Style({\n stroke: new Stroke({\n color: \"#fff\",\n width: 5\n })\n }),\n new Style({\n stroke: new Stroke({\n color: \"#00ffff\",\n width: 3\n })\n })\n ],\n \"Polygon\": [\n new Style({\n stroke: new Stroke({\n color: \"#fff\",\n width: 5\n })\n }),\n new Style({\n stroke: new Stroke({\n color: \"#00ffff\",\n width: 3\n }),\n fill: new Fill({\n color: \"rgba(224,255,255,0.35)\"\n })\n })\n ],\n \"MultiPolygon\": [\n new Style({\n stroke: new Stroke({\n color: \"#fff\",\n width: 5\n })\n }),\n new Style({\n stroke: new Stroke({\n color: \"#00ffff\",\n width: 3\n }),\n fill: new Fill({\n color: \"rgba(224,255,255,0.35)\"\n })\n })\n ]\n};\n"],"names":["toStyleFunction"],"mappings":"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"}
1
+ {"version":3,"file":"Highlights.js","sources":["Highlights.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Resource } from \"@open-pioneer/core\";\nimport { Feature } from \"ol\";\nimport { FeatureLike } from \"ol/Feature\";\nimport { Geometry } from \"ol/geom\";\nimport { Type } from \"ol/geom/Geometry\";\nimport VectorLayer from \"ol/layer/Vector\";\nimport VectorSource from \"ol/source/Vector\";\nimport { Fill, Icon, Stroke, Style } from \"ol/style\";\nimport { StyleLike, toFunction as toStyleFunction } from \"ol/style/Style\";\nimport mapMarkerUrl from \"../assets/images/mapMarker.png?url\";\nimport { LayerDependencies } from \"../layers/shared/internals\";\nimport { SimpleLayer } from \"../layers/SimpleLayer\";\nimport { INTERNAL_CONSTRUCTOR_TAG } from \"../utils/InternalConstructorTag\";\nimport { getGeometries } from \"./getGeometries\";\nimport { DisplayTarget, MapModel, ZoomOptions } from \"./MapModel\";\n\nexport const DESTROY_HIGHLIGHTS = Symbol(\"DESTROY_HIGHLIGHTS\");\nexport const GET_HIGHLIGHT_LAYER = Symbol(\"GET_HIGHLIGHT_LAYER\");\n\n/**\n * Style options supported when creating a new {@link Highlight}.\n *\n * @group Map Model\n **/\nexport interface HighlightOptions {\n /**\n * Optional styles to override the default styles.\n */\n highlightStyle?: HighlightStyle;\n}\n\n/**\n * Options supported by the map model's {@link MapModel.highlightAndZoom | highlightAndZoom} method.\n *\n * @group Map Model\n **/\nexport interface HighlightZoomOptions extends HighlightOptions, ZoomOptions {}\n\n/**\n * Custom styles when creating a new {@link Highlight}.\n *\n * @group Map Model\n */\nexport type HighlightStyle = {\n Point?: StyleLike;\n LineString?: StyleLike;\n Polygon?: StyleLike;\n MultiPolygon?: StyleLike;\n MultiPoint?: StyleLike;\n MultiLineString?: StyleLike;\n};\n\n/**\n * Represents the additional graphical representations of objects.\n *\n * See also {@link MapModel.highlight}.\n *\n * @group Map Model\n */\nexport interface Highlight extends Resource {\n /** Returns `true` if the highlight has not been destroyed yet. */\n readonly isActive: boolean;\n\n /** Updates the style of the highlight. Use `undefined` to revert to the default style. */\n setStyle(style: HighlightStyle | undefined): void;\n}\n\ntype HighlightStyleType = keyof HighlightStyle;\n\n/**\n * Manages highlights on the map.\n *\n * @group Map Model\n */\nexport class Highlights {\n #map: MapModel;\n\n #olLayer: VectorLayer<VectorSource, Feature>;\n #layer: SimpleLayer;\n #olSource: VectorSource<Feature<Geometry>>;\n #activeHighlights: Set<Highlight>;\n\n constructor(map: MapModel, layerDeps: LayerDependencies) {\n this.#map = map;\n this.#olSource = new VectorSource({\n features: undefined\n });\n this.#olLayer = new VectorLayer({\n className: \"highlight-layer\",\n source: this.#olSource,\n style: function (feature, resolution) {\n return resolveStyle(feature, resolution);\n }\n });\n this.#layer = new SimpleLayer(\n {\n title: \"highlight-layer\",\n internal: true,\n olLayer: this.#olLayer\n },\n layerDeps,\n INTERNAL_CONSTRUCTOR_TAG\n );\n map.layers.addLayer(this.#layer, { at: \"topmost\" });\n\n this.#activeHighlights = new Set();\n }\n\n [DESTROY_HIGHLIGHTS]() {\n this.clear();\n }\n\n /**\n * Creates a highlight at the given targets.\n *\n * A highlight is a temporary graphic on the map that calls attention to a point or an area.\n *\n * Call `destroy()` on the returned highlight object to remove the highlight.\n */\n add(displayTargets: DisplayTarget[], options?: HighlightOptions | undefined): Highlight {\n const geometries = getGeometries(displayTargets);\n if (geometries.length === 0) {\n return {\n get isActive() {\n return false;\n },\n destroy() {},\n setStyle() {}\n };\n }\n\n const features = geometries.map((geometry) => {\n const type = geometry.getType();\n const feature = new Feature({\n type: type,\n geometry: geometry\n });\n feature.setStyle(getOwnStyle(type, options?.highlightStyle));\n return feature;\n });\n\n const source = this.#olSource;\n const highlights = this.#activeHighlights;\n const highlight: Highlight = {\n get isActive() {\n return highlights.has(highlight);\n },\n destroy() {\n if (!this.isActive) {\n return;\n }\n\n for (const feature of features) {\n source.removeFeature(feature);\n }\n highlights.delete(highlight);\n },\n setStyle(style: HighlightStyle | undefined) {\n for (const feature of features) {\n const geometry = feature.getGeometry();\n if (geometry) {\n feature.setStyle(getOwnStyle(geometry.getType(), style));\n }\n }\n }\n };\n\n source.addFeatures(features);\n this.#activeHighlights.add(highlight);\n return highlight;\n }\n\n /**\n * Creates a highlight and zooms to the given targets.\n *\n * See also {@link add} and {@link MapModel.zoom}.\n */\n addAndZoom(\n displayTarget: DisplayTarget[],\n options?: HighlightZoomOptions | undefined\n ): Highlight {\n const result = this.add(displayTarget, options);\n this.#map.zoom(displayTarget, options);\n return result;\n }\n\n /**\n * This method destroys all active Highlights.\n */\n clear() {\n for (const highlight of this.#activeHighlights) {\n highlight.destroy();\n }\n }\n\n /**\n * Returns the layer used for highlights.\n */\n [GET_HIGHLIGHT_LAYER]() {\n return this.#olLayer;\n }\n}\n\n/**\n * Returns the appropriate style from the user's highlightStyle or falls back to the default style\n */\nfunction resolveStyle(feature: FeatureLike, resolution: number) {\n const type: keyof typeof defaultHighlightStyle = feature.get(\"type\");\n const style = toStyleFunction(getDefaultStyle(type));\n return style(feature, resolution);\n}\n\n/**\n * This method creates styling for a highlight based on the optional style information or the default style\n */\nfunction getOwnStyle(type: Type, highlightStyle: HighlightStyle | undefined) {\n if (highlightStyle && type in highlightStyle) {\n const supportedType = type as HighlightStyleType;\n const ownStyle = highlightStyle[supportedType];\n return ownStyle ? ownStyle : getDefaultStyle(type);\n } else {\n return getDefaultStyle(type);\n }\n}\n\n/**\n * This returns default styling for a highlight\n */\nfunction getDefaultStyle(type: Type) {\n if (type in defaultHighlightStyle) {\n const supportedType = type as HighlightStyleType;\n return defaultHighlightStyle[supportedType];\n } else {\n return defaultHighlightStyle.Polygon;\n }\n}\n\n/**\n * Default styling for highlights\n */\nconst defaultHighlightStyle = {\n \"Point\": new Style({\n image: new Icon({\n anchor: [0.5, 1],\n src: mapMarkerUrl\n })\n }),\n \"MultiPoint\": new Style({\n image: new Icon({\n anchor: [0.5, 1],\n src: mapMarkerUrl\n })\n }),\n \"LineString\": [\n new Style({\n stroke: new Stroke({\n color: \"#fff\",\n width: 5\n })\n }),\n new Style({\n stroke: new Stroke({\n color: \"#00ffff\",\n width: 3\n })\n })\n ],\n \"MultiLineString\": [\n new Style({\n stroke: new Stroke({\n color: \"#fff\",\n width: 5\n })\n }),\n new Style({\n stroke: new Stroke({\n color: \"#00ffff\",\n width: 3\n })\n })\n ],\n \"Polygon\": [\n new Style({\n stroke: new Stroke({\n color: \"#fff\",\n width: 5\n })\n }),\n new Style({\n stroke: new Stroke({\n color: \"#00ffff\",\n width: 3\n }),\n fill: new Fill({\n color: \"rgba(224,255,255,0.35)\"\n })\n })\n ],\n \"MultiPolygon\": [\n new Style({\n stroke: new Stroke({\n color: \"#fff\",\n width: 5\n })\n }),\n new Style({\n stroke: new Stroke({\n color: \"#00ffff\",\n width: 3\n }),\n fill: new Fill({\n color: \"rgba(224,255,255,0.35)\"\n })\n })\n ]\n};\n"],"names":["toStyleFunction"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"LayerCollection.js","sources":["LayerCollection.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n batch,\n effect,\n reactive,\n ReactiveArray,\n reactiveArray,\n reactiveMap,\n reactiveSet\n} from \"@conterra/reactivity-core\";\nimport { createLogger, Resource } from \"@open-pioneer/core\";\nimport OlBaseLayer from \"ol/layer/Base\";\nimport { sourceId } from \"open-pioneer:source-info\";\nimport { AbstractLayer } from \"../layers/AbstractLayer\";\nimport { AbstractLayerBase } from \"../layers/AbstractLayerBase\";\nimport type { AddLayerOptions } from \"../layers/shared/AddLayerOptions\";\nimport { getRecursiveLayers } from \"../layers/shared/getRecursiveLayers\";\nimport {\n ATTACH_TO_MAP,\n DECLARED_AS_BASE_LAYER,\n DETACH_FROM_MAP,\n GET_RAW_LAYERS,\n GET_RAW_SUBLAYERS,\n SET_VISIBLE\n} from \"../layers/shared/internals\";\nimport type {\n LayerRetrievalOptions,\n RecursiveRetrievalOptions\n} from \"../layers/shared/LayerRetrievalOptions\";\nimport { AnyLayer, Layer, Sublayer } from \"../layers/unions\";\nimport { assertInternalConstructor, InternalConstructorTag } from \"../utils/InternalConstructorTag\";\nimport { MapModel } from \"./MapModel\";\n\nconst LOG = createLogger(sourceId);\n\ntype LayerType = AbstractLayer & Layer;\ntype LayerBaseType = (AbstractLayerBase & Layer) | (AbstractLayerBase & Sublayer);\n\ninterface LayerPos {\n which: \"normal\" | \"topmost\" | \"base\";\n index: number;\n}\n\n/**\n * Contains the layers contained in a {@link MapModel}.\n *\n * @group Map Model\n */\nexport class LayerCollection {\n #map: MapModel;\n\n /** Top level layers (base layers, operational layers). No sublayers. */\n #topLevelLayers = reactiveSet<LayerType>();\n\n /** Index of _all_ layer instances, including sublayers. */\n #layersById = reactiveMap<string, LayerBaseType>();\n\n /** Reverse index of _all_ layers that have an associated OpenLayers layer. */\n #layersByOlLayer: WeakMap<OlBaseLayer, LayerType> = new WeakMap();\n\n /** Currently active base layer. */\n #activeBaseLayer = reactive<LayerType>();\n\n /**\n * Defines the relative order of operational layers.\n * Lower index -> layer is below its successors.\n * Excluding {@link #topMostOperationalLayers}\n */\n #operationalLayerOrder = reactiveArray<LayerType>();\n\n /** Operational layers that are always displayed at the top above all other layers (e.g. a highlight layer) */\n #topMostOperationalLayers = reactiveArray<LayerType>();\n\n /** All base layers */\n #baseLayers = reactiveArray<LayerType>();\n\n #syncHandle: Resource | undefined;\n\n /** @internal */\n constructor(map: MapModel, tag: InternalConstructorTag) {\n assertInternalConstructor(tag);\n\n this.#map = map;\n this.#syncHandle = effect(() => {\n // Contains base layers, normal operational layers, topmost layers in bottom-to-top order.\n const orderedLayers = this.getLayers({\n sortByDisplayOrder: true,\n includeInternalLayers: true\n });\n\n // Simply reassign all z-indices whenever the order changes.\n let index = 0;\n for (const layer of orderedLayers) {\n LOG.isDebug() && LOG.debug(\"Assigning z-index\", layer.id, index);\n layer.olLayer.setZIndex(index);\n index++;\n }\n });\n }\n\n destroy() {\n for (const layer of this.#layersById.values()) {\n layer.destroy();\n }\n this.#topLevelLayers.clear();\n this.#layersById.clear();\n this.#operationalLayerOrder.splice(0, this.#operationalLayerOrder.length);\n this.#activeBaseLayer.value = undefined;\n this.#syncHandle?.destroy();\n this.#syncHandle = undefined;\n }\n\n /**\n * Adds a new layer to the map.\n *\n * The new layer is automatically registered with this collection.\n *\n * ### Display order\n *\n * By default, the new layer will be shown on _top_ of all normal operational layers.\n * Use the `options` parameter to control the insertion point.\n *\n * ### Ownership\n *\n * The map model takes ownership of the new layer.\n * This means that the layer will be destroyed if the map model is destroyed.\n */\n addLayer(layer: Layer, options?: AddLayerOptions): void {\n batch(() => {\n checkLayerInstance(layer);\n checkIncorrectAddLayerOptions(layer, options);\n\n if (layer[DECLARED_AS_BASE_LAYER]) {\n options = options ? { ...options, at: \"base\" } : { at: \"base\" };\n }\n\n layer[ATTACH_TO_MAP](this.#map);\n this.#addLayer(layer, options);\n });\n }\n\n /**\n * Returns all configured base layers.\n */\n getBaseLayers(): Layer[] {\n return Array.from(this.#baseLayers);\n }\n\n /**\n * Returns the currently active base layer.\n */\n getActiveBaseLayer(): Layer | undefined {\n return this.#activeBaseLayer.value;\n }\n\n /**\n * Activates the base layer with the given id.\n * `undefined` can be used to hide all base layers.\n *\n * The associated layer is made visible and all other base layers are hidden.\n *\n * Returns true if the given layer has been successfully activated.\n */\n activateBaseLayer(id: string | undefined): boolean {\n let newBaseLayer = undefined;\n if (id != null) {\n newBaseLayer = this.#layersById.get(id);\n if (!newBaseLayer) {\n LOG.warn(`Cannot activate base layer '${id}': layer is unknown.`);\n return false;\n }\n if (!(newBaseLayer instanceof AbstractLayer)) {\n LOG.warn(`Cannot activate base layer '${id}: layer has an invalid type.'`);\n return false;\n }\n if (!newBaseLayer.isBaseLayer) {\n LOG.warn(`Cannot activate base layer '${id}': layer is not a base layer.`);\n return false;\n }\n }\n\n this.#updateBaseLayer(newBaseLayer);\n return true;\n }\n\n /**\n * Returns a list of operational layers, starting from the root of the map's layer hierarchy.\n * The returned list includes top level layers only. Use {@link getRecursiveLayers()} to retrieve (nested) child layers.\n */\n getOperationalLayers(options?: LayerRetrievalOptions): Layer[] {\n return this.getLayers(options).filter((layer) => !this.#baseLayers.includes(layer));\n }\n\n /**\n * Returns a list of layers known to this collection. This includes base layers and operational layers.\n * The returned list includes top level layers only. Use {@link getRecursiveLayers()} to retrieve (nested) child layers.\n */\n getLayers(options?: LayerRetrievalOptions): Layer[] {\n let allLayers: Layer[];\n\n if (options?.sortByDisplayOrder) {\n const baseLayers = this.getBaseLayers();\n const order = Array.from(this.#operationalLayerOrder);\n const topMost = Array.from(this.#topMostOperationalLayers);\n allLayers = [...baseLayers, ...order, ...topMost];\n } else {\n allLayers = Array.from(this.#topLevelLayers.values());\n }\n\n if (!options?.includeInternalLayers) {\n allLayers = allLayers.filter((l) => !l.internal);\n }\n return allLayers;\n }\n\n /**\n * Returns a list of layers known to this collection. This includes base layers and operational layers.\n * The returned list includes top level layers only. Use {@link getRecursiveLayers()} to retrieve (nested) child layers.\n *\n * @deprecated Use {@link getLayers()}, {@link getOperationalLayers()} or {@link getRecursiveLayers()} instead.\n * This method name is misleading since it does not recurse into child layers.\n */\n getAllLayers(options?: LayerRetrievalOptions): Layer[] {\n return this.getLayers(options);\n }\n\n /**\n * Returns a list of all layers in this 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 layer hierarchy is deeply nested, this function could potentially be expensive.\n */\n getRecursiveLayers({\n filter,\n sortByDisplayOrder,\n includeInternalLayers\n }: Omit<RecursiveRetrievalOptions, \"filter\"> & {\n filter?: \"base\" | \"operational\" | ((layer: AnyLayer) => boolean);\n } = {}): AnyLayer[] {\n let filterFunc;\n if (typeof filter === \"function\") {\n filterFunc = filter;\n } else if (typeof filter === \"string\") {\n const filterType = filter;\n const topLevelFilter = (layer: Layer) => {\n return filterType === \"base\" ? layer.isBaseLayer : !layer.isBaseLayer;\n };\n filterFunc = (layer: AnyLayer) => {\n if (!layer.parent && \"isBaseLayer\" in layer) {\n return topLevelFilter(layer);\n }\n // For nested children, include them all.\n return true;\n };\n }\n\n return getRecursiveLayers({\n from: this,\n filter: filterFunc,\n sortByDisplayOrder,\n includeInternalLayers\n });\n }\n\n getItems(options?: LayerRetrievalOptions): Layer[] {\n return this.getLayers(options);\n }\n\n /**\n * Returns the layer identified by the `id` or undefined, if no such layer exists.\n */\n getLayerById(id: string): AnyLayer | undefined {\n return this.#layersById.get(id);\n }\n\n /**\n * Removes a layer identified by the `id` from the map.\n *\n * NOTE: The current implementation only supports removal of _top level_ layers.\n *\n * ### Ownership\n *\n * This function _destroys_ the layer instance and all its children.\n *\n * @deprecated Use {@link removeLayer} instead.\n */\n removeLayerById(id: string): void {\n batch(() => {\n const layer = this.#layersById.get(id);\n if (!layer) {\n LOG.isDebug() && LOG.debug(`Cannot remove layer '${id}': layer is unknown.`);\n return;\n }\n\n checkLayerInstance(layer);\n if (!this.#topLevelLayers.has(layer)) {\n LOG.warn(\n `Cannot remove layer '${layer.id}': only top level layers can be removed at this time.`\n );\n return;\n }\n\n this.#removeLayer(layer);\n layer.destroy();\n });\n }\n\n /**\n * Removes the given top level layer from the map.\n *\n * The layer can be specified directly (as an object) or by an id.\n *\n * Returns the layer instance on success, or `undefined` if the layer was not found.\n *\n * ### Ownership\n *\n * The map releases ownership of this layer.\n * The caller can destroy it or store it for later reuse.\n */\n removeLayer(layer: string | Layer): Layer | undefined {\n return batch(() => {\n let actualLayer;\n if (typeof layer === \"string\") {\n actualLayer = this.#layersById.get(layer);\n if (!actualLayer) {\n return undefined;\n }\n } else {\n actualLayer = layer;\n }\n\n checkLayerInstance(actualLayer);\n if (!this.#topLevelLayers.has(actualLayer)) {\n return undefined;\n }\n\n this.#removeLayer(actualLayer);\n actualLayer[DETACH_FROM_MAP]();\n return actualLayer;\n });\n }\n\n /**\n * Given a raw OpenLayers layer instance, returns the associated {@link Layer} - or undefined\n * if the layer is unknown to this collection.\n */\n getLayerByRawInstance(layer: OlBaseLayer): Layer | undefined {\n return this.#layersByOlLayer?.get(layer);\n }\n\n /**\n * Adds the given layer to the map and all relevant indices.\n */\n #addLayer(layer: LayerType, options: AddLayerOptions | undefined) {\n // Throws; do this before manipulating the data structures\n const pos = this.#getInsertionPos(layer, options);\n this.#indexLayer(layer);\n\n // Everything below this line should not fail.\n if (pos.which === \"base\") {\n if (!this.#activeBaseLayer.value && layer.visible) {\n this.#updateBaseLayer(layer);\n } else {\n layer[SET_VISIBLE](false);\n }\n } else {\n layer[SET_VISIBLE](layer.visible);\n }\n\n const layerList = this.#getLayerList(pos);\n layerList.splice(pos.index, 0, layer); // insert new layer at insertion index\n this.#topLevelLayers.add(layer);\n this.#map.olMap.addLayer(layer.olLayer);\n }\n\n #getInsertionPos(layer: LayerType, options: AddLayerOptions | undefined): LayerPos {\n switch (options?.at) {\n case undefined:\n case null:\n case \"top\":\n return { which: \"normal\", index: this.#operationalLayerOrder.length };\n case \"topmost\":\n return { which: \"topmost\", index: this.#topMostOperationalLayers.length };\n case \"base\":\n return { which: \"base\", index: this.#baseLayers.length };\n case \"bottom\":\n return { which: \"normal\", index: 0 };\n case \"above\":\n case \"below\": {\n const reference = this.#getReference(options.reference);\n const pos = this.#findLayerPos(reference);\n if (!pos || pos.which === \"base\") {\n // reference is not a top level operational layer -> throw error\n const errorMessage = this.#getInsertErrorMessage(layer, reference);\n throw new Error(errorMessage);\n }\n\n if (options.at === \"above\") {\n pos.index++;\n }\n return pos;\n }\n }\n assertNever(options);\n }\n\n #getReference(reference: Layer | string): LayerType {\n let layer: AnyLayer;\n if (typeof reference === \"string\") {\n const refLayer = this.getLayerById(reference);\n if (!refLayer) {\n throw new Error(`Unknown reference layer '${reference}'.`);\n }\n layer = refLayer;\n } else {\n layer = reference;\n }\n checkLayerInstance(layer);\n return layer;\n }\n\n /**\n * Removes the given top level layer from the map and all relevant indices.\n */\n #removeLayer(layer: LayerType) {\n this.#map.olMap.removeLayer(layer.olLayer);\n this.#topLevelLayers.delete(layer);\n const pos = this.#findLayerPos(layer);\n if (!pos) {\n throw new Error(`Internal error: layer '${layer.id}' not found.`);\n }\n const layerList = this.#getLayerList(pos);\n layerList.splice(pos.index, 1);\n\n this.#unIndexLayer(layer);\n if (this.#activeBaseLayer.value === layer) {\n const newBaseLayer = this.getBaseLayers()[0];\n if (newBaseLayer) {\n checkLayerInstance(newBaseLayer);\n }\n this.#updateBaseLayer(newBaseLayer);\n }\n }\n\n #updateBaseLayer(layer: LayerType | undefined) {\n if (this.#activeBaseLayer.value === layer) {\n return;\n }\n\n if (LOG.isDebug()) {\n const getId = (layer: AbstractLayer | undefined) => {\n return layer ? `'${layer.id}'` : undefined;\n };\n\n LOG.debug(\n `Switching active base layer from ${getId(this.#activeBaseLayer.value)} to ${getId(layer)}`\n );\n }\n\n batch(() => {\n this.#activeBaseLayer.value?.[SET_VISIBLE](false);\n this.#activeBaseLayer.value = layer;\n layer?.[SET_VISIBLE](true);\n });\n }\n\n /**\n * Index the layer and all its children.\n */\n #indexLayer(layer: LayerType) {\n // layer id -> layer (or sublayer)\n const registrations: [string, OlBaseLayer | undefined][] = [];\n const visit = (layer: LayerType | (AbstractLayerBase & Sublayer)) => {\n const id = layer.id;\n const olLayer = \"olLayer\" in layer ? layer.olLayer : undefined;\n if (this.#layersById.has(id)) {\n throw new Error(\n `Layer id '${id}' is not unique. Either assign a unique id yourself ` +\n `or skip configuring 'id' for an automatically generated id.`\n );\n }\n if (olLayer && this.#layersByOlLayer.has(olLayer)) {\n throw new Error(`OlLayer used by layer '${id}' has already been used in map.`);\n }\n\n // Register this layer with the map.\n this.#layersById.set(id, layer);\n if (olLayer) {\n this.#layersByOlLayer.set(olLayer, layer as LayerType); // ol is present --> not a sublayer\n }\n registrations.push([id, olLayer]);\n\n // Recurse into nested children.\n for (const childLayer of layer.layers?.[GET_RAW_LAYERS]() ?? []) {\n visit(childLayer);\n }\n for (const sublayer of layer.sublayers?.[GET_RAW_SUBLAYERS]() ?? []) {\n visit(sublayer);\n }\n };\n\n try {\n visit(layer);\n } catch (e) {\n // If any error happens, undo the indexing.\n // This way we don't leave a partially indexed layer tree behind.\n for (const [id, olLayer] of registrations) {\n this.#layersById.delete(id);\n if (olLayer) {\n this.#layersByOlLayer.delete(olLayer);\n }\n }\n throw e;\n }\n }\n\n /**\n * Removes index entries for the given layer and all its children.\n */\n #unIndexLayer(layer: AbstractLayer) {\n const visit = (layer: AbstractLayer | AbstractLayerBase) => {\n if (\"olLayer\" in layer) {\n this.#layersByOlLayer.delete(layer.olLayer);\n }\n this.#layersById.delete(layer.id);\n\n for (const childLayer of layer.layers?.[GET_RAW_LAYERS]() ?? []) {\n visit(childLayer);\n }\n\n for (const sublayer of layer.sublayers?.[GET_RAW_SUBLAYERS]() ?? []) {\n visit(sublayer);\n }\n };\n visit(layer);\n }\n\n #getLayerList(pos: LayerPos): ReactiveArray<LayerType> {\n switch (pos.which) {\n case \"topmost\":\n return this.#topMostOperationalLayers;\n case \"normal\":\n return this.#operationalLayerOrder;\n case \"base\":\n return this.#baseLayers;\n }\n }\n\n #findLayerPos(layer: LayerType): LayerPos | undefined {\n let index = this.#operationalLayerOrder.indexOf(layer);\n if (index !== -1) {\n return { which: \"normal\", index };\n }\n\n index = this.#topMostOperationalLayers.indexOf(layer);\n if (index !== -1) {\n return { which: \"topmost\", index };\n }\n\n index = this.#baseLayers.indexOf(layer);\n if (index !== -1) {\n return { which: \"base\", index };\n }\n\n return undefined;\n }\n\n #getInsertErrorMessage(layer: LayerType, reference: LayerType) {\n let message: string = `Cannot add layer '${layer.id}'. Reference layer '${reference.id}' is not a top level operational layer.`;\n\n if (reference.isBaseLayer) {\n //is base layer\n message += \" Reference layer is a base layer.\";\n } else if (reference.parent) {\n //is child layer\n message += \" Reference layer is child layer of a group.\";\n }\n\n return message;\n }\n}\n\nfunction checkIncorrectAddLayerOptions(layer: Layer, options: AddLayerOptions | undefined) {\n if (layer[DECLARED_AS_BASE_LAYER]) {\n if (options?.at === \"topmost\") {\n throw new Error(`Cannot add base layer '${layer.id}' as a topmost layer.`);\n } else if (options?.at && options.at !== \"base\") {\n throw new Error(\n `Cannot add base layer '${layer.id}' at a specific position: only operational layers can be added at a specific position.`\n );\n }\n }\n}\n\nfunction checkLayerInstance(object: AnyLayer): asserts object is Layer & AbstractLayer {\n if (!(object instanceof AbstractLayer)) {\n throw new Error(\n `Layer is not a valid layer instance. Use one of the classes provided by the map package instead.`\n );\n }\n}\n\nfunction assertNever(_arg: never): never {\n throw new Error(`Internal error: unhandled option.`);\n}\n"],"names":["layer"],"mappings":"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"}
1
+ {"version":3,"file":"LayerCollection.js","sources":["LayerCollection.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n batch,\n effect,\n reactive,\n ReactiveArray,\n reactiveArray,\n reactiveMap,\n reactiveSet\n} from \"@conterra/reactivity-core\";\nimport { createLogger, Resource } from \"@open-pioneer/core\";\nimport OlBaseLayer from \"ol/layer/Base\";\nimport { sourceId } from \"open-pioneer:source-info\";\nimport { AbstractLayer } from \"../layers/AbstractLayer\";\nimport { AbstractLayerBase } from \"../layers/AbstractLayerBase\";\nimport type { AddLayerOptions } from \"../layers/shared/AddLayerOptions\";\nimport { getRecursiveLayers } from \"../layers/shared/getRecursiveLayers\";\nimport {\n ATTACH_TO_MAP,\n DECLARED_AS_BASE_LAYER,\n DETACH_FROM_MAP,\n GET_RAW_LAYERS,\n GET_RAW_SUBLAYERS,\n SET_VISIBLE\n} from \"../layers/shared/internals\";\nimport type {\n LayerRetrievalOptions,\n RecursiveRetrievalOptions\n} from \"../layers/shared/LayerRetrievalOptions\";\nimport { AnyLayer, Layer, Sublayer } from \"../layers/unions\";\nimport { assertInternalConstructor, InternalConstructorTag } from \"../utils/InternalConstructorTag\";\nimport { MapModel } from \"./MapModel\";\n\nconst LOG = createLogger(sourceId);\n\ntype LayerType = AbstractLayer & Layer;\ntype LayerBaseType = (AbstractLayerBase & Layer) | (AbstractLayerBase & Sublayer);\n\ninterface LayerPos {\n which: \"normal\" | \"topmost\" | \"base\";\n index: number;\n}\n\n/**\n * Contains the layers contained in a {@link MapModel}.\n *\n * @group Map Model\n */\nexport class LayerCollection {\n #map: MapModel;\n\n /** Top level layers (base layers, operational layers). No sublayers. */\n #topLevelLayers = reactiveSet<LayerType>();\n\n /** Index of _all_ layer instances, including sublayers. */\n #layersById = reactiveMap<string, LayerBaseType>();\n\n /** Reverse index of _all_ layers that have an associated OpenLayers layer. */\n #layersByOlLayer: WeakMap<OlBaseLayer, LayerType> = new WeakMap();\n\n /** Currently active base layer. */\n #activeBaseLayer = reactive<LayerType>();\n\n /**\n * Defines the relative order of operational layers.\n * Lower index -> layer is below its successors.\n * Excluding {@link #topMostOperationalLayers}\n */\n #operationalLayerOrder = reactiveArray<LayerType>();\n\n /** Operational layers that are always displayed at the top above all other layers (e.g. a highlight layer) */\n #topMostOperationalLayers = reactiveArray<LayerType>();\n\n /** All base layers */\n #baseLayers = reactiveArray<LayerType>();\n\n #syncHandle: Resource | undefined;\n\n /** @internal */\n constructor(map: MapModel, tag: InternalConstructorTag) {\n assertInternalConstructor(tag);\n\n this.#map = map;\n this.#syncHandle = effect(() => {\n // Contains base layers, normal operational layers, topmost layers in bottom-to-top order.\n const orderedLayers = this.getLayers({\n sortByDisplayOrder: true,\n includeInternalLayers: true\n });\n\n // Simply reassign all z-indices whenever the order changes.\n let index = 0;\n for (const layer of orderedLayers) {\n LOG.isDebug() && LOG.debug(\"Assigning z-index\", layer.id, index);\n layer.olLayer.setZIndex(index);\n index++;\n }\n });\n }\n\n destroy() {\n for (const layer of this.#layersById.values()) {\n layer.destroy();\n }\n this.#topLevelLayers.clear();\n this.#layersById.clear();\n this.#operationalLayerOrder.splice(0, this.#operationalLayerOrder.length);\n this.#activeBaseLayer.value = undefined;\n this.#syncHandle?.destroy();\n this.#syncHandle = undefined;\n }\n\n /**\n * Adds a new layer to the map.\n *\n * The new layer is automatically registered with this collection.\n *\n * ### Display order\n *\n * By default, the new layer will be shown on _top_ of all normal operational layers.\n * Use the `options` parameter to control the insertion point.\n *\n * ### Ownership\n *\n * The map model takes ownership of the new layer.\n * This means that the layer will be destroyed if the map model is destroyed.\n */\n addLayer(layer: Layer, options?: AddLayerOptions): void {\n batch(() => {\n checkLayerInstance(layer);\n checkIncorrectAddLayerOptions(layer, options);\n\n if (layer[DECLARED_AS_BASE_LAYER]) {\n options = options ? { ...options, at: \"base\" } : { at: \"base\" };\n }\n\n layer[ATTACH_TO_MAP](this.#map);\n this.#addLayer(layer, options);\n });\n }\n\n /**\n * Returns all configured base layers.\n */\n getBaseLayers(): Layer[] {\n return Array.from(this.#baseLayers);\n }\n\n /**\n * Returns the currently active base layer.\n */\n getActiveBaseLayer(): Layer | undefined {\n return this.#activeBaseLayer.value;\n }\n\n /**\n * Activates the base layer with the given id.\n * `undefined` can be used to hide all base layers.\n *\n * The associated layer is made visible and all other base layers are hidden.\n *\n * Returns true if the given layer has been successfully activated.\n */\n activateBaseLayer(id: string | undefined): boolean {\n let newBaseLayer = undefined;\n if (id != null) {\n newBaseLayer = this.#layersById.get(id);\n if (!newBaseLayer) {\n LOG.warn(`Cannot activate base layer '${id}': layer is unknown.`);\n return false;\n }\n if (!(newBaseLayer instanceof AbstractLayer)) {\n LOG.warn(`Cannot activate base layer '${id}: layer has an invalid type.'`);\n return false;\n }\n if (!newBaseLayer.isBaseLayer) {\n LOG.warn(`Cannot activate base layer '${id}': layer is not a base layer.`);\n return false;\n }\n }\n\n this.#updateBaseLayer(newBaseLayer);\n return true;\n }\n\n /**\n * Returns a list of operational layers, starting from the root of the map's layer hierarchy.\n * The returned list includes top level layers only. Use {@link getRecursiveLayers()} to retrieve (nested) child layers.\n */\n getOperationalLayers(options?: LayerRetrievalOptions): Layer[] {\n return this.getLayers(options).filter((layer) => !this.#baseLayers.includes(layer));\n }\n\n /**\n * Returns a list of layers known to this collection. This includes base layers and operational layers.\n * The returned list includes top level layers only. Use {@link getRecursiveLayers()} to retrieve (nested) child layers.\n */\n getLayers(options?: LayerRetrievalOptions): Layer[] {\n let allLayers: Layer[];\n\n if (options?.sortByDisplayOrder) {\n const baseLayers = this.getBaseLayers();\n const order = Array.from(this.#operationalLayerOrder);\n const topMost = Array.from(this.#topMostOperationalLayers);\n allLayers = [...baseLayers, ...order, ...topMost];\n } else {\n allLayers = Array.from(this.#topLevelLayers.values());\n }\n\n if (!options?.includeInternalLayers) {\n allLayers = allLayers.filter((l) => !l.internal);\n }\n return allLayers;\n }\n\n /**\n * Returns a list of layers known to this collection. This includes base layers and operational layers.\n * The returned list includes top level layers only. Use {@link getRecursiveLayers()} to retrieve (nested) child layers.\n *\n * @deprecated Use {@link getLayers()}, {@link getOperationalLayers()} or {@link getRecursiveLayers()} instead.\n * This method name is misleading since it does not recurse into child layers.\n */\n getAllLayers(options?: LayerRetrievalOptions): Layer[] {\n return this.getLayers(options);\n }\n\n /**\n * Returns a list of all layers in this 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 layer hierarchy is deeply nested, this function could potentially be expensive.\n */\n getRecursiveLayers({\n filter,\n sortByDisplayOrder,\n includeInternalLayers\n }: Omit<RecursiveRetrievalOptions, \"filter\"> & {\n filter?: \"base\" | \"operational\" | ((layer: AnyLayer) => boolean);\n } = {}): AnyLayer[] {\n let filterFunc;\n if (typeof filter === \"function\") {\n filterFunc = filter;\n } else if (typeof filter === \"string\") {\n const filterType = filter;\n const topLevelFilter = (layer: Layer) => {\n return filterType === \"base\" ? layer.isBaseLayer : !layer.isBaseLayer;\n };\n filterFunc = (layer: AnyLayer) => {\n if (!layer.parent && \"isBaseLayer\" in layer) {\n return topLevelFilter(layer);\n }\n // For nested children, include them all.\n return true;\n };\n }\n\n return getRecursiveLayers({\n from: this,\n filter: filterFunc,\n sortByDisplayOrder,\n includeInternalLayers\n });\n }\n\n getItems(options?: LayerRetrievalOptions): Layer[] {\n return this.getLayers(options);\n }\n\n /**\n * Returns the layer identified by the `id` or undefined, if no such layer exists.\n */\n getLayerById(id: string): AnyLayer | undefined {\n return this.#layersById.get(id);\n }\n\n /**\n * Removes a layer identified by the `id` from the map.\n *\n * NOTE: The current implementation only supports removal of _top level_ layers.\n *\n * ### Ownership\n *\n * This function _destroys_ the layer instance and all its children.\n *\n * @deprecated Use {@link removeLayer} instead.\n */\n removeLayerById(id: string): void {\n batch(() => {\n const layer = this.#layersById.get(id);\n if (!layer) {\n LOG.isDebug() && LOG.debug(`Cannot remove layer '${id}': layer is unknown.`);\n return;\n }\n\n checkLayerInstance(layer);\n if (!this.#topLevelLayers.has(layer)) {\n LOG.warn(\n `Cannot remove layer '${layer.id}': only top level layers can be removed at this time.`\n );\n return;\n }\n\n this.#removeLayer(layer);\n layer.destroy();\n });\n }\n\n /**\n * Removes the given top level layer from the map.\n *\n * The layer can be specified directly (as an object) or by an id.\n *\n * Returns the layer instance on success, or `undefined` if the layer was not found.\n *\n * ### Ownership\n *\n * The map releases ownership of this layer.\n * The caller can destroy it or store it for later reuse.\n */\n removeLayer(layer: string | Layer): Layer | undefined {\n return batch(() => {\n let actualLayer;\n if (typeof layer === \"string\") {\n actualLayer = this.#layersById.get(layer);\n if (!actualLayer) {\n return undefined;\n }\n } else {\n actualLayer = layer;\n }\n\n checkLayerInstance(actualLayer);\n if (!this.#topLevelLayers.has(actualLayer)) {\n return undefined;\n }\n\n this.#removeLayer(actualLayer);\n actualLayer[DETACH_FROM_MAP]();\n return actualLayer;\n });\n }\n\n /**\n * Given a raw OpenLayers layer instance, returns the associated {@link Layer} - or undefined\n * if the layer is unknown to this collection.\n */\n getLayerByRawInstance(layer: OlBaseLayer): Layer | undefined {\n return this.#layersByOlLayer?.get(layer);\n }\n\n /**\n * Adds the given layer to the map and all relevant indices.\n */\n #addLayer(layer: LayerType, options: AddLayerOptions | undefined) {\n // Throws; do this before manipulating the data structures\n const pos = this.#getInsertionPos(layer, options);\n this.#indexLayer(layer);\n\n // Everything below this line should not fail.\n if (pos.which === \"base\") {\n if (!this.#activeBaseLayer.value && layer.visible) {\n this.#updateBaseLayer(layer);\n } else {\n layer[SET_VISIBLE](false);\n }\n } else {\n layer[SET_VISIBLE](layer.visible);\n }\n\n const layerList = this.#getLayerList(pos);\n layerList.splice(pos.index, 0, layer); // insert new layer at insertion index\n this.#topLevelLayers.add(layer);\n this.#map.olMap.addLayer(layer.olLayer);\n }\n\n #getInsertionPos(layer: LayerType, options: AddLayerOptions | undefined): LayerPos {\n switch (options?.at) {\n case undefined:\n case null:\n case \"top\":\n return { which: \"normal\", index: this.#operationalLayerOrder.length };\n case \"topmost\":\n return { which: \"topmost\", index: this.#topMostOperationalLayers.length };\n case \"base\":\n return { which: \"base\", index: this.#baseLayers.length };\n case \"bottom\":\n return { which: \"normal\", index: 0 };\n case \"above\":\n case \"below\": {\n const reference = this.#getReference(options.reference);\n const pos = this.#findLayerPos(reference);\n if (!pos || pos.which === \"base\") {\n // reference is not a top level operational layer -> throw error\n const errorMessage = this.#getInsertErrorMessage(layer, reference);\n throw new Error(errorMessage);\n }\n\n if (options.at === \"above\") {\n pos.index++;\n }\n return pos;\n }\n }\n assertNever(options);\n }\n\n #getReference(reference: Layer | string): LayerType {\n let layer: AnyLayer;\n if (typeof reference === \"string\") {\n const refLayer = this.getLayerById(reference);\n if (!refLayer) {\n throw new Error(`Unknown reference layer '${reference}'.`);\n }\n layer = refLayer;\n } else {\n layer = reference;\n }\n checkLayerInstance(layer);\n return layer;\n }\n\n /**\n * Removes the given top level layer from the map and all relevant indices.\n */\n #removeLayer(layer: LayerType) {\n this.#map.olMap.removeLayer(layer.olLayer);\n this.#topLevelLayers.delete(layer);\n const pos = this.#findLayerPos(layer);\n if (!pos) {\n throw new Error(`Internal error: layer '${layer.id}' not found.`);\n }\n const layerList = this.#getLayerList(pos);\n layerList.splice(pos.index, 1);\n\n this.#unIndexLayer(layer);\n if (this.#activeBaseLayer.value === layer) {\n const newBaseLayer = this.getBaseLayers()[0];\n if (newBaseLayer) {\n checkLayerInstance(newBaseLayer);\n }\n this.#updateBaseLayer(newBaseLayer);\n }\n }\n\n #updateBaseLayer(layer: LayerType | undefined) {\n if (this.#activeBaseLayer.value === layer) {\n return;\n }\n\n if (LOG.isDebug()) {\n const getId = (layer: AbstractLayer | undefined) => {\n return layer ? `'${layer.id}'` : undefined;\n };\n\n LOG.debug(\n `Switching active base layer from ${getId(this.#activeBaseLayer.value)} to ${getId(layer)}`\n );\n }\n\n batch(() => {\n this.#activeBaseLayer.value?.[SET_VISIBLE](false);\n this.#activeBaseLayer.value = layer;\n layer?.[SET_VISIBLE](true);\n });\n }\n\n /**\n * Index the layer and all its children.\n */\n #indexLayer(layer: LayerType) {\n // layer id -> layer (or sublayer)\n const registrations: [string, OlBaseLayer | undefined][] = [];\n const visit = (layer: LayerType | (AbstractLayerBase & Sublayer)) => {\n const id = layer.id;\n const olLayer = \"olLayer\" in layer ? layer.olLayer : undefined;\n if (this.#layersById.has(id)) {\n throw new Error(\n `Layer id '${id}' is not unique. Either assign a unique id yourself ` +\n `or skip configuring 'id' for an automatically generated id.`\n );\n }\n if (olLayer && this.#layersByOlLayer.has(olLayer)) {\n throw new Error(`OlLayer used by layer '${id}' has already been used in map.`);\n }\n\n // Register this layer with the map.\n this.#layersById.set(id, layer);\n if (olLayer) {\n this.#layersByOlLayer.set(olLayer, layer as LayerType); // ol is present --> not a sublayer\n }\n registrations.push([id, olLayer]);\n\n // Recurse into nested children.\n for (const childLayer of layer.layers?.[GET_RAW_LAYERS]() ?? []) {\n visit(childLayer);\n }\n for (const sublayer of layer.sublayers?.[GET_RAW_SUBLAYERS]() ?? []) {\n visit(sublayer);\n }\n };\n\n try {\n visit(layer);\n } catch (e) {\n // If any error happens, undo the indexing.\n // This way we don't leave a partially indexed layer tree behind.\n for (const [id, olLayer] of registrations) {\n this.#layersById.delete(id);\n if (olLayer) {\n this.#layersByOlLayer.delete(olLayer);\n }\n }\n throw e;\n }\n }\n\n /**\n * Removes index entries for the given layer and all its children.\n */\n #unIndexLayer(layer: AbstractLayer) {\n const visit = (layer: AbstractLayer | AbstractLayerBase) => {\n if (\"olLayer\" in layer) {\n this.#layersByOlLayer.delete(layer.olLayer);\n }\n this.#layersById.delete(layer.id);\n\n for (const childLayer of layer.layers?.[GET_RAW_LAYERS]() ?? []) {\n visit(childLayer);\n }\n\n for (const sublayer of layer.sublayers?.[GET_RAW_SUBLAYERS]() ?? []) {\n visit(sublayer);\n }\n };\n visit(layer);\n }\n\n #getLayerList(pos: LayerPos): ReactiveArray<LayerType> {\n switch (pos.which) {\n case \"topmost\":\n return this.#topMostOperationalLayers;\n case \"normal\":\n return this.#operationalLayerOrder;\n case \"base\":\n return this.#baseLayers;\n }\n }\n\n #findLayerPos(layer: LayerType): LayerPos | undefined {\n let index = this.#operationalLayerOrder.indexOf(layer);\n if (index !== -1) {\n return { which: \"normal\", index };\n }\n\n index = this.#topMostOperationalLayers.indexOf(layer);\n if (index !== -1) {\n return { which: \"topmost\", index };\n }\n\n index = this.#baseLayers.indexOf(layer);\n if (index !== -1) {\n return { which: \"base\", index };\n }\n\n return undefined;\n }\n\n #getInsertErrorMessage(layer: LayerType, reference: LayerType) {\n let message: string = `Cannot add layer '${layer.id}'. Reference layer '${reference.id}' is not a top level operational layer.`;\n\n if (reference.isBaseLayer) {\n //is base layer\n message += \" Reference layer is a base layer.\";\n } else if (reference.parent) {\n //is child layer\n message += \" Reference layer is child layer of a group.\";\n }\n\n return message;\n }\n}\n\nfunction checkIncorrectAddLayerOptions(layer: Layer, options: AddLayerOptions | undefined) {\n if (layer[DECLARED_AS_BASE_LAYER]) {\n if (options?.at === \"topmost\") {\n throw new Error(`Cannot add base layer '${layer.id}' as a topmost layer.`);\n } else if (options?.at && options.at !== \"base\") {\n throw new Error(\n `Cannot add base layer '${layer.id}' at a specific position: only operational layers can be added at a specific position.`\n );\n }\n }\n}\n\nfunction checkLayerInstance(object: AnyLayer): asserts object is Layer & AbstractLayer {\n if (!(object instanceof AbstractLayer)) {\n throw new Error(\n `Layer is not a valid layer instance. Use one of the classes provided by the map package instead.`\n );\n }\n}\n\nfunction assertNever(_arg: never): never {\n throw new Error(`Internal error: unhandled option.`);\n}\n"],"names":["layer"],"mappings":";;;;;;;;AAmCA,MAAM,GAAA,GAAM,aAAa,QAAQ,CAAA;AAe1B,MAAM,eAAA,CAAgB;AAAA,EACzB,IAAA;AAAA;AAAA,EAGA,kBAAkB,WAAA,EAAuB;AAAA;AAAA,EAGzC,cAAc,WAAA,EAAmC;AAAA;AAAA,EAGjD,gBAAA,uBAAwD,OAAA,EAAQ;AAAA;AAAA,EAGhE,mBAAmB,QAAA,EAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOvC,yBAAyB,aAAA,EAAyB;AAAA;AAAA,EAGlD,4BAA4B,aAAA,EAAyB;AAAA;AAAA,EAGrD,cAAc,aAAA,EAAyB;AAAA,EAEvC,WAAA;AAAA;AAAA,EAGA,WAAA,CAAY,KAAe,GAAA,EAA6B;AACpD,IAAA,yBAAA,CAA0B,GAAG,CAAA;AAE7B,IAAA,IAAA,CAAK,IAAA,GAAO,GAAA;AACZ,IAAA,IAAA,CAAK,WAAA,GAAc,OAAO,MAAM;AAE5B,MAAA,MAAM,aAAA,GAAgB,KAAK,SAAA,CAAU;AAAA,QACjC,kBAAA,EAAoB,IAAA;AAAA,QACpB,qBAAA,EAAuB;AAAA,OAC1B,CAAA;AAGD,MAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,MAAA,KAAA,MAAW,SAAS,aAAA,EAAe;AAC/B,QAAA,GAAA,CAAI,SAAQ,IAAK,GAAA,CAAI,MAAM,mBAAA,EAAqB,KAAA,CAAM,IAAI,KAAK,CAAA;AAC/D,QAAA,KAAA,CAAM,OAAA,CAAQ,UAAU,KAAK,CAAA;AAC7B,QAAA,KAAA,EAAA;AAAA,MACJ;AAAA,IACJ,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,OAAA,GAAU;AACN,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,WAAA,CAAY,MAAA,EAAO,EAAG;AAC3C,MAAA,KAAA,CAAM,OAAA,EAAQ;AAAA,IAClB;AACA,IAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAC3B,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,IAAA,IAAA,CAAK,sBAAA,CAAuB,MAAA,CAAO,CAAA,EAAG,IAAA,CAAK,uBAAuB,MAAM,CAAA;AACxE,IAAA,IAAA,CAAK,iBAAiB,KAAA,GAAQ,MAAA;AAC9B,IAAA,IAAA,CAAK,aAAa,OAAA,EAAQ;AAC1B,IAAA,IAAA,CAAK,WAAA,GAAc,MAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,QAAA,CAAS,OAAc,OAAA,EAAiC;AACpD,IAAA,KAAA,CAAM,MAAM;AACR,MAAA,kBAAA,CAAmB,KAAK,CAAA;AACxB,MAAA,6BAAA,CAA8B,OAAO,OAAO,CAAA;AAE5C,MAAA,IAAI,KAAA,CAAM,sBAAsB,CAAA,EAAG;AAC/B,QAAA,OAAA,GAAU,OAAA,GAAU,EAAE,GAAG,OAAA,EAAS,IAAI,MAAA,EAAO,GAAI,EAAE,EAAA,EAAI,MAAA,EAAO;AAAA,MAClE;AAEA,MAAA,KAAA,CAAM,aAAa,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAC9B,MAAA,IAAA,CAAK,SAAA,CAAU,OAAO,OAAO,CAAA;AAAA,IACjC,CAAC,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAyB;AACrB,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,WAAW,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAA,GAAwC;AACpC,IAAA,OAAO,KAAK,gBAAA,CAAiB,KAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,kBAAkB,EAAA,EAAiC;AAC/C,IAAA,IAAI,YAAA,GAAe,MAAA;AACnB,IAAA,IAAI,MAAM,IAAA,EAAM;AACZ,MAAA,YAAA,GAAe,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA;AACtC,MAAA,IAAI,CAAC,YAAA,EAAc;AACf,QAAA,GAAA,CAAI,IAAA,CAAK,CAAA,4BAAA,EAA+B,EAAE,CAAA,oBAAA,CAAsB,CAAA;AAChE,QAAA,OAAO,KAAA;AAAA,MACX;AACA,MAAA,IAAI,EAAE,wBAAwB,aAAA,CAAA,EAAgB;AAC1C,QAAA,GAAA,CAAI,IAAA,CAAK,CAAA,4BAAA,EAA+B,EAAE,CAAA,6BAAA,CAA+B,CAAA;AACzE,QAAA,OAAO,KAAA;AAAA,MACX;AACA,MAAA,IAAI,CAAC,aAAa,WAAA,EAAa;AAC3B,QAAA,GAAA,CAAI,IAAA,CAAK,CAAA,4BAAA,EAA+B,EAAE,CAAA,6BAAA,CAA+B,CAAA;AACzE,QAAA,OAAO,KAAA;AAAA,MACX;AAAA,IACJ;AAEA,IAAA,IAAA,CAAK,iBAAiB,YAAY,CAAA;AAClC,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,qBAAqB,OAAA,EAA0C;AAC3D,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA,CAAE,MAAA,CAAO,CAAC,KAAA,KAAU,CAAC,IAAA,CAAK,WAAA,CAAY,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,EACtF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,OAAA,EAA0C;AAChD,IAAA,IAAI,SAAA;AAEJ,IAAA,IAAI,SAAS,kBAAA,EAAoB;AAC7B,MAAA,MAAM,UAAA,GAAa,KAAK,aAAA,EAAc;AACtC,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,sBAAsB,CAAA;AACpD,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,yBAAyB,CAAA;AACzD,MAAA,SAAA,GAAY,CAAC,GAAG,UAAA,EAAY,GAAG,KAAA,EAAO,GAAG,OAAO,CAAA;AAAA,IACpD,CAAA,MAAO;AACH,MAAA,SAAA,GAAY,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,eAAA,CAAgB,QAAQ,CAAA;AAAA,IACxD;AAEA,IAAA,IAAI,CAAC,SAAS,qBAAA,EAAuB;AACjC,MAAA,SAAA,GAAY,UAAU,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,EAAE,QAAQ,CAAA;AAAA,IACnD;AACA,IAAA,OAAO,SAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,aAAa,OAAA,EAA0C;AACnD,IAAA,OAAO,IAAA,CAAK,UAAU,OAAO,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,kBAAA,CAAmB;AAAA,IACf,MAAA;AAAA,IACA,kBAAA;AAAA,IACA;AAAA,GACJ,GAEI,EAAC,EAAe;AAChB,IAAA,IAAI,UAAA;AACJ,IAAA,IAAI,OAAO,WAAW,UAAA,EAAY;AAC9B,MAAA,UAAA,GAAa,MAAA;AAAA,IACjB,CAAA,MAAA,IAAW,OAAO,MAAA,KAAW,QAAA,EAAU;AACnC,MAAA,MAAM,UAAA,GAAa,MAAA;AACnB,MAAA,MAAM,cAAA,GAAiB,CAAC,KAAA,KAAiB;AACrC,QAAA,OAAO,UAAA,KAAe,MAAA,GAAS,KAAA,CAAM,WAAA,GAAc,CAAC,KAAA,CAAM,WAAA;AAAA,MAC9D,CAAA;AACA,MAAA,UAAA,GAAa,CAAC,KAAA,KAAoB;AAC9B,QAAA,IAAI,CAAC,KAAA,CAAM,MAAA,IAAU,aAAA,IAAiB,KAAA,EAAO;AACzC,UAAA,OAAO,eAAe,KAAK,CAAA;AAAA,QAC/B;AAEA,QAAA,OAAO,IAAA;AAAA,MACX,CAAA;AAAA,IACJ;AAEA,IAAA,OAAO,kBAAA,CAAmB;AAAA,MACtB,IAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAQ,UAAA;AAAA,MACR,kBAAA;AAAA,MACA;AAAA,KACH,CAAA;AAAA,EACL;AAAA,EAEA,SAAS,OAAA,EAA0C;AAC/C,IAAA,OAAO,IAAA,CAAK,UAAU,OAAO,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,EAAA,EAAkC;AAC3C,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,gBAAgB,EAAA,EAAkB;AAC9B,IAAA,KAAA,CAAM,MAAM;AACR,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA;AACrC,MAAA,IAAI,CAAC,KAAA,EAAO;AACR,QAAA,GAAA,CAAI,SAAQ,IAAK,GAAA,CAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,EAAE,CAAA,oBAAA,CAAsB,CAAA;AAC3E,QAAA;AAAA,MACJ;AAEA,MAAA,kBAAA,CAAmB,KAAK,CAAA;AACxB,MAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,KAAK,CAAA,EAAG;AAClC,QAAA,GAAA,CAAI,IAAA;AAAA,UACA,CAAA,qBAAA,EAAwB,MAAM,EAAE,CAAA,qDAAA;AAAA,SACpC;AACA,QAAA;AAAA,MACJ;AAEA,MAAA,IAAA,CAAK,aAAa,KAAK,CAAA;AACvB,MAAA,KAAA,CAAM,OAAA,EAAQ;AAAA,IAClB,CAAC,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,YAAY,KAAA,EAA0C;AAClD,IAAA,OAAO,MAAM,MAAM;AACf,MAAA,IAAI,WAAA;AACJ,MAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC3B,QAAA,WAAA,GAAc,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,KAAK,CAAA;AACxC,QAAA,IAAI,CAAC,WAAA,EAAa;AACd,UAAA,OAAO,MAAA;AAAA,QACX;AAAA,MACJ,CAAA,MAAO;AACH,QAAA,WAAA,GAAc,KAAA;AAAA,MAClB;AAEA,MAAA,kBAAA,CAAmB,WAAW,CAAA;AAC9B,MAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,WAAW,CAAA,EAAG;AACxC,QAAA,OAAO,MAAA;AAAA,MACX;AAEA,MAAA,IAAA,CAAK,aAAa,WAAW,CAAA;AAC7B,MAAA,WAAA,CAAY,eAAe,CAAA,EAAE;AAC7B,MAAA,OAAO,WAAA;AAAA,IACX,CAAC,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,sBAAsB,KAAA,EAAuC;AACzD,IAAA,OAAO,IAAA,CAAK,gBAAA,EAAkB,GAAA,CAAI,KAAK,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,CAAU,OAAkB,OAAA,EAAsC;AAE9D,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,gBAAA,CAAiB,KAAA,EAAO,OAAO,CAAA;AAChD,IAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AAGtB,IAAA,IAAI,GAAA,CAAI,UAAU,MAAA,EAAQ;AACtB,MAAA,IAAI,CAAC,IAAA,CAAK,gBAAA,CAAiB,KAAA,IAAS,MAAM,OAAA,EAAS;AAC/C,QAAA,IAAA,CAAK,iBAAiB,KAAK,CAAA;AAAA,MAC/B,CAAA,MAAO;AACH,QAAA,KAAA,CAAM,WAAW,EAAE,KAAK,CAAA;AAAA,MAC5B;AAAA,IACJ,CAAA,MAAO;AACH,MAAA,KAAA,CAAM,WAAW,CAAA,CAAE,KAAA,CAAM,OAAO,CAAA;AAAA,IACpC;AAEA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,aAAA,CAAc,GAAG,CAAA;AACxC,IAAA,SAAA,CAAU,MAAA,CAAO,GAAA,CAAI,KAAA,EAAO,CAAA,EAAG,KAAK,CAAA;AACpC,IAAA,IAAA,CAAK,eAAA,CAAgB,IAAI,KAAK,CAAA;AAC9B,IAAA,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,OAAO,CAAA;AAAA,EAC1C;AAAA,EAEA,gBAAA,CAAiB,OAAkB,OAAA,EAAgD;AAC/E,IAAA,QAAQ,SAAS,EAAA;AAAI,MACjB,KAAK,MAAA;AAAA,MACL,KAAK,IAAA;AAAA,MACL,KAAK,KAAA;AACD,QAAA,OAAO,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,IAAA,CAAK,uBAAuB,MAAA,EAAO;AAAA,MACxE,KAAK,SAAA;AACD,QAAA,OAAO,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,IAAA,CAAK,0BAA0B,MAAA,EAAO;AAAA,MAC5E,KAAK,MAAA;AACD,QAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,IAAA,CAAK,YAAY,MAAA,EAAO;AAAA,MAC3D,KAAK,QAAA;AACD,QAAA,OAAO,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,CAAA,EAAE;AAAA,MACvC,KAAK,OAAA;AAAA,MACL,KAAK,OAAA,EAAS;AACV,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,SAAS,CAAA;AACtD,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,aAAA,CAAc,SAAS,CAAA;AACxC,QAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,KAAA,KAAU,MAAA,EAAQ;AAE9B,UAAA,MAAM,YAAA,GAAe,IAAA,CAAK,sBAAA,CAAuB,KAAA,EAAO,SAAS,CAAA;AACjE,UAAA,MAAM,IAAI,MAAM,YAAY,CAAA;AAAA,QAChC;AAEA,QAAA,IAAI,OAAA,CAAQ,OAAO,OAAA,EAAS;AACxB,UAAA,GAAA,CAAI,KAAA,EAAA;AAAA,QACR;AACA,QAAA,OAAO,GAAA;AAAA,MACX;AAAA;AAEJ,IAAA,WAAA,CAAmB,CAAA;AAAA,EACvB;AAAA,EAEA,cAAc,SAAA,EAAsC;AAChD,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI,OAAO,cAAc,QAAA,EAAU;AAC/B,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,YAAA,CAAa,SAAS,CAAA;AAC5C,MAAA,IAAI,CAAC,QAAA,EAAU;AACX,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,SAAS,CAAA,EAAA,CAAI,CAAA;AAAA,MAC7D;AACA,MAAA,KAAA,GAAQ,QAAA;AAAA,IACZ,CAAA,MAAO;AACH,MAAA,KAAA,GAAQ,SAAA;AAAA,IACZ;AACA,IAAA,kBAAA,CAAmB,KAAK,CAAA;AACxB,IAAA,OAAO,KAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,KAAA,EAAkB;AAC3B,IAAA,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,KAAA,CAAM,OAAO,CAAA;AACzC,IAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,KAAK,CAAA;AACjC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,aAAA,CAAc,KAAK,CAAA;AACpC,IAAA,IAAI,CAAC,GAAA,EAAK;AACN,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,KAAA,CAAM,EAAE,CAAA,YAAA,CAAc,CAAA;AAAA,IACpE;AACA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,aAAA,CAAc,GAAG,CAAA;AACxC,IAAA,SAAA,CAAU,MAAA,CAAO,GAAA,CAAI,KAAA,EAAO,CAAC,CAAA;AAE7B,IAAA,IAAA,CAAK,cAAc,KAAK,CAAA;AACxB,IAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,KAAA,KAAU,KAAA,EAAO;AACvC,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,aAAA,EAAc,CAAE,CAAC,CAAA;AAC3C,MAAA,IAAI,YAAA,EAAc;AACd,QAAA,kBAAA,CAAmB,YAAY,CAAA;AAAA,MACnC;AACA,MAAA,IAAA,CAAK,iBAAiB,YAAY,CAAA;AAAA,IACtC;AAAA,EACJ;AAAA,EAEA,iBAAiB,KAAA,EAA8B;AAC3C,IAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,KAAA,KAAU,KAAA,EAAO;AACvC,MAAA;AAAA,IACJ;AAEA,IAAA,IAAI,GAAA,CAAI,SAAQ,EAAG;AACf,MAAA,MAAM,KAAA,GAAQ,CAACA,MAAAA,KAAqC;AAChD,QAAA,OAAOA,MAAAA,GAAQ,CAAA,CAAA,EAAIA,MAAAA,CAAM,EAAE,CAAA,CAAA,CAAA,GAAM,MAAA;AAAA,MACrC,CAAA;AAEA,MAAA,GAAA,CAAI,KAAA;AAAA,QACA,CAAA,iCAAA,EAAoC,MAAM,IAAA,CAAK,gBAAA,CAAiB,KAAK,CAAC,CAAA,IAAA,EAAO,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,OAC7F;AAAA,IACJ;AAEA,IAAA,KAAA,CAAM,MAAM;AACR,MAAA,IAAA,CAAK,gBAAA,CAAiB,KAAA,GAAQ,WAAW,CAAA,CAAE,KAAK,CAAA;AAChD,MAAA,IAAA,CAAK,iBAAiB,KAAA,GAAQ,KAAA;AAC9B,MAAA,KAAA,GAAQ,WAAW,EAAE,IAAI,CAAA;AAAA,IAC7B,CAAC,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,KAAA,EAAkB;AAE1B,IAAA,MAAM,gBAAqD,EAAC;AAC5D,IAAA,MAAM,KAAA,GAAQ,CAACA,MAAAA,KAAsD;AACjE,MAAA,MAAM,KAAKA,MAAAA,CAAM,EAAA;AACjB,MAAA,MAAM,OAAA,GAAU,SAAA,IAAaA,MAAAA,GAAQA,MAAAA,CAAM,OAAA,GAAU,MAAA;AACrD,MAAA,IAAI,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA,EAAG;AAC1B,QAAA,MAAM,IAAI,KAAA;AAAA,UACN,aAAa,EAAE,CAAA,+GAAA;AAAA,SAEnB;AAAA,MACJ;AACA,MAAA,IAAI,OAAA,IAAW,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,OAAO,CAAA,EAAG;AAC/C,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,EAAE,CAAA,+BAAA,CAAiC,CAAA;AAAA,MACjF;AAGA,MAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,EAAA,EAAIA,MAAK,CAAA;AAC9B,MAAA,IAAI,OAAA,EAAS;AACT,QAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,OAAA,EAASA,MAAkB,CAAA;AAAA,MACzD;AACA,MAAA,aAAA,CAAc,IAAA,CAAK,CAAC,EAAA,EAAI,OAAO,CAAC,CAAA;AAGhC,MAAA,KAAA,MAAW,cAAcA,MAAAA,CAAM,MAAA,GAAS,cAAc,CAAA,EAAE,IAAK,EAAC,EAAG;AAC7D,QAAA,KAAA,CAAM,UAAU,CAAA;AAAA,MACpB;AACA,MAAA,KAAA,MAAW,YAAYA,MAAAA,CAAM,SAAA,GAAY,iBAAiB,CAAA,EAAE,IAAK,EAAC,EAAG;AACjE,QAAA,KAAA,CAAM,QAAQ,CAAA;AAAA,MAClB;AAAA,IACJ,CAAA;AAEA,IAAA,IAAI;AACA,MAAA,KAAA,CAAM,KAAK,CAAA;AAAA,IACf,SAAS,CAAA,EAAG;AAGR,MAAA,KAAA,MAAW,CAAC,EAAA,EAAI,OAAO,CAAA,IAAK,aAAA,EAAe;AACvC,QAAA,IAAA,CAAK,WAAA,CAAY,OAAO,EAAE,CAAA;AAC1B,QAAA,IAAI,OAAA,EAAS;AACT,UAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,OAAO,CAAA;AAAA,QACxC;AAAA,MACJ;AACA,MAAA,MAAM,CAAA;AAAA,IACV;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,KAAA,EAAsB;AAChC,IAAA,MAAM,KAAA,GAAQ,CAACA,MAAAA,KAA6C;AACxD,MAAA,IAAI,aAAaA,MAAAA,EAAO;AACpB,QAAA,IAAA,CAAK,gBAAA,CAAiB,MAAA,CAAOA,MAAAA,CAAM,OAAO,CAAA;AAAA,MAC9C;AACA,MAAA,IAAA,CAAK,WAAA,CAAY,MAAA,CAAOA,MAAAA,CAAM,EAAE,CAAA;AAEhC,MAAA,KAAA,MAAW,cAAcA,MAAAA,CAAM,MAAA,GAAS,cAAc,CAAA,EAAE,IAAK,EAAC,EAAG;AAC7D,QAAA,KAAA,CAAM,UAAU,CAAA;AAAA,MACpB;AAEA,MAAA,KAAA,MAAW,YAAYA,MAAAA,CAAM,SAAA,GAAY,iBAAiB,CAAA,EAAE,IAAK,EAAC,EAAG;AACjE,QAAA,KAAA,CAAM,QAAQ,CAAA;AAAA,MAClB;AAAA,IACJ,CAAA;AACA,IAAA,KAAA,CAAM,KAAK,CAAA;AAAA,EACf;AAAA,EAEA,cAAc,GAAA,EAAyC;AACnD,IAAA,QAAQ,IAAI,KAAA;AAAO,MACf,KAAK,SAAA;AACD,QAAA,OAAO,IAAA,CAAK,yBAAA;AAAA,MAChB,KAAK,QAAA;AACD,QAAA,OAAO,IAAA,CAAK,sBAAA;AAAA,MAChB,KAAK,MAAA;AACD,QAAA,OAAO,IAAA,CAAK,WAAA;AAAA;AACpB,EACJ;AAAA,EAEA,cAAc,KAAA,EAAwC;AAClD,IAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,sBAAA,CAAuB,OAAA,CAAQ,KAAK,CAAA;AACrD,IAAA,IAAI,UAAU,EAAA,EAAI;AACd,MAAA,OAAO,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAM;AAAA,IACpC;AAEA,IAAA,KAAA,GAAQ,IAAA,CAAK,yBAAA,CAA0B,OAAA,CAAQ,KAAK,CAAA;AACpD,IAAA,IAAI,UAAU,EAAA,EAAI;AACd,MAAA,OAAO,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAM;AAAA,IACrC;AAEA,IAAA,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,KAAK,CAAA;AACtC,IAAA,IAAI,UAAU,EAAA,EAAI;AACd,MAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAM;AAAA,IAClC;AAEA,IAAA,OAAO,MAAA;AAAA,EACX;AAAA,EAEA,sBAAA,CAAuB,OAAkB,SAAA,EAAsB;AAC3D,IAAA,IAAI,UAAkB,CAAA,kBAAA,EAAqB,KAAA,CAAM,EAAE,CAAA,oBAAA,EAAuB,UAAU,EAAE,CAAA,uCAAA,CAAA;AAEtF,IAAA,IAAI,UAAU,WAAA,EAAa;AAEvB,MAAA,OAAA,IAAW,mCAAA;AAAA,IACf,CAAA,MAAA,IAAW,UAAU,MAAA,EAAQ;AAEzB,MAAA,OAAA,IAAW,6CAAA;AAAA,IACf;AAEA,IAAA,OAAO,OAAA;AAAA,EACX;AACJ;AAEA,SAAS,6BAAA,CAA8B,OAAc,OAAA,EAAsC;AACvF,EAAA,IAAI,KAAA,CAAM,sBAAsB,CAAA,EAAG;AAC/B,IAAA,IAAI,OAAA,EAAS,OAAO,SAAA,EAAW;AAC3B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,KAAA,CAAM,EAAE,CAAA,qBAAA,CAAuB,CAAA;AAAA,IAC7E,CAAA,MAAA,IAAW,OAAA,EAAS,EAAA,IAAM,OAAA,CAAQ,OAAO,MAAA,EAAQ;AAC7C,MAAA,MAAM,IAAI,KAAA;AAAA,QACN,CAAA,uBAAA,EAA0B,MAAM,EAAE,CAAA,sFAAA;AAAA,OACtC;AAAA,IACJ;AAAA,EACJ;AACJ;AAEA,SAAS,mBAAmB,MAAA,EAA2D;AACnF,EAAA,IAAI,EAAE,kBAAkB,aAAA,CAAA,EAAgB;AACpC,IAAA,MAAM,IAAI,KAAA;AAAA,MACN,CAAA,gGAAA;AAAA,KACJ;AAAA,EACJ;AACJ;AAEA,SAAS,YAAY,IAAA,EAAoB;AACrC,EAAA,MAAM,IAAI,MAAM,CAAA,iCAAA,CAAmC,CAAA;AACvD;;"}