@india-boundary-corrector/layer-configs 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -131,7 +131,9 @@ var configs_default = [
131
131
  id: "open-topo",
132
132
  tileUrlTemplates: [
133
133
  "https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png",
134
- "https://tile.opentopomap.org/{z}/{x}/{y}.png"
134
+ "https://tile.opentopomap.org/{z}/{x}/{y}.png",
135
+ "https://{s}.tile.top-o-map.de/{z}/{x}/{y}.png",
136
+ "https://tile.top-o-map.de/{z}/{x}/{y}.png"
135
137
  ],
136
138
  lineWidthStops: { "4": 0.75, "5": 1, "6": 1.25, "7": 1.5, "8": 1.75, "9": 1.25, "10": 1.25, "13": 1.5 },
137
139
  lineStyles: [
@@ -151,9 +153,8 @@ var configs_default = [
151
153
  "https://tile.openstreetmap.org/{z}/{x}/{y}.png",
152
154
  "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
153
155
  ],
154
- lineWidthStops: { "1": 0.5, "2": 0.6, "3": 0.7, "4": 1, "10": 3.75 },
156
+ lineWidthStops: { "3": 0.7, "4": 1, "10": 3.75 },
155
157
  lineStyles: [
156
- { color: "rgb(200, 180, 200)", layerSuffix: "osm", startZoom: 1, endZoom: 3, delWidthFactor: 2.5, widthFraction: 1.5 },
157
158
  { color: "rgb(200, 180, 200)", layerSuffix: "osm", startZoom: 4, delWidthFactor: 1.5 },
158
159
  { color: "rgb(160, 120, 160)", layerSuffix: "osm", startZoom: 4, widthFraction: 0.333, dashArray: [30, 2, 8, 2], delWidthFactor: 0 },
159
160
  { color: "rgb(200, 180, 200)", layerSuffix: "osm-internal", startZoom: 4, widthFraction: 0.45 },
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.js","../src/configs.json","../src/layerconfig.js"],"sourcesContent":["import configsJson from './configs.json' with { type: 'json' };\nimport { LayerConfig, LineStyle, INFINITY, MIN_LINE_WIDTH, interpolateLineWidth } from './layerconfig.js';\n\nexport { LayerConfig, LineStyle, INFINITY, MIN_LINE_WIDTH, interpolateLineWidth } from './layerconfig.js';\n\n// Export raw configs for testing/inspection\nexport { configsJson };\n\n/**\n * Layer configuration registry\n */\nexport class LayerConfigRegistry {\n constructor() {\n this.registry = {};\n }\n\n /**\n * Get a layer config by id\n */\n get(id) {\n return this.registry[id];\n }\n\n /**\n * Register a new layer config\n */\n register(config) {\n this.registry[config.id] = config;\n }\n\n /**\n * Remove a layer config by id\n */\n remove(id) {\n if (!this.registry[id]) return false;\n delete this.registry[id];\n return true;\n }\n\n /**\n * Detect layer config from tile URL templates (with {z}/{x}/{y} placeholders)\n * @param {string | string[]} templates - Single template URL or array of template URLs\n */\n detectFromTemplates(templates) {\n if (!templates || (Array.isArray(templates) && templates.length === 0)) return undefined;\n \n for (const config of Object.values(this.registry)) {\n if (config.matchTemplate(templates)) {\n return config;\n }\n }\n \n return undefined;\n }\n\n /**\n * Detect layer config from actual tile URLs (with numeric coordinates)\n * @param {string | string[]} urls - Single tile URL or array of tile URLs\n */\n detectFromTileUrls(urls) {\n if (!urls || (Array.isArray(urls) && urls.length === 0)) return undefined;\n \n for (const config of Object.values(this.registry)) {\n if (config.matchTileUrl(urls)) {\n return config;\n }\n }\n \n return undefined;\n }\n\n /**\n * Get all available layer config ids\n */\n getAvailableIds() {\n return Object.keys(this.registry);\n }\n\n /**\n * Create a new registry with all configs from this registry plus extra configs.\n * @param {LayerConfig[]} extraLayerConfigs - Additional configs to add\n * @returns {LayerConfigRegistry} A new registry with merged configs\n */\n createMergedRegistry(extraLayerConfigs) {\n const registry = new LayerConfigRegistry();\n \n for (const id of this.getAvailableIds()) {\n registry.register(this.get(id));\n }\n \n if (extraLayerConfigs && extraLayerConfigs.length > 0) {\n for (const config of extraLayerConfigs) {\n registry.register(config);\n }\n }\n \n return registry;\n }\n\n /**\n * Parse a tile URL into its components: layer config and coordinates\n * @param {string} url - Tile URL to parse\n * @returns {{ layerConfig: LayerConfig, coords: { z: number, x: number, y: number } } | null}\n */\n parseTileUrl(url) {\n // Check if URL matches any layer config\n const layerConfig = this.detectFromTileUrls([url]);\n if (!layerConfig) return null;\n \n // Extract tile coordinates using the matched config\n const coords = layerConfig.extractCoords(url);\n if (!coords) return null;\n \n return { layerConfig, coords };\n }\n}\n\n// Default registry with built-in configs loaded from JSON\nexport const layerConfigs = new LayerConfigRegistry();\nfor (const configData of configsJson) {\n layerConfigs.register(new LayerConfig(configData));\n}\n\n","[\n {\n \"id\": \"cartodb-dark\",\n \"tileUrlTemplates\": [\n \"https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png\",\n \"https://basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png\",\n \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/dark_all/{z}/{x}/{y}.png\",\n \"https://{s}.basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}.png\",\n \"https://basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}.png\",\n \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/dark_nolabels/{z}/{x}/{y}.png\"\n ],\n \"lineWidthStops\": { \"0\": 1.0, \"2\": 1.0, \"3\": 1.0, \"10\": 2.0, \"12\": 2.0 },\n \"lineStyles\": [\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"ne\", \"endZoom\": 4 },\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"ne-disp\", \"endZoom\": 4 },\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"osm\", \"startZoom\": 5 },\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"osm-disp\", \"startZoom\": 5 },\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 5, \"widthFraction\": 0.3, \"dashArray\": [2, 2], \"delWidthFactor\": 2.0 },\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"ne-internal\", \"startZoom\": 4, \"endZoom\": 4, \"widthFraction\": 0.3, \"dashArray\": [2, 2], \"delWidthFactor\": 3.0 }\n ]\n },\n {\n \"id\": \"cartodb-dark-retina\",\n \"tileUrlTemplates\": [\n \"https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png\",\n \"https://basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png\",\n \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/dark_all/{z}/{x}/{y}{r}.png\",\n \"https://{s}.basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}{r}.png\",\n \"https://basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}{r}.png\",\n \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/dark_nolabels/{z}/{x}/{y}{r}.png\"\n ],\n \"lineWidthStops\": { \"0\": 1.5, \"2\": 1.5, \"3\": 1.5, \"6\": 2.5, \"10\": 3.0 },\n \"lineStyles\": [\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"ne\", \"endZoom\": 4 },\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"ne-disp\", \"endZoom\": 4 },\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"osm\", \"startZoom\": 5 },\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"osm-disp\", \"startZoom\": 5 },\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 5, \"widthFraction\": 0.3, \"dashArray\": [4, 4], \"delWidthFactor\": 2.0 },\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"ne-internal\", \"startZoom\": 4, \"endZoom\": 4, \"widthFraction\": 0.3, \"dashArray\": [4, 4], \"delWidthFactor\": 3.0 }\n ]\n },\n {\n \"id\": \"cartodb-light\",\n \"tileUrlTemplates\": [\n \"https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png\",\n \"https://basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png\",\n \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_all/{z}/{x}/{y}.png\",\n \"https://{s}.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}.png\",\n \"https://basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}.png\",\n \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_nolabels/{z}/{x}/{y}.png\",\n \"https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png\",\n \"https://basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png\",\n \"https://{s}.basemaps.cartocdn.com/rastertiles/voyager_nolabels/{z}/{x}/{y}.png\",\n \"https://basemaps.cartocdn.com/rastertiles/voyager_nolabels/{z}/{x}/{y}.png\",\n \"https://{s}.basemaps.cartocdn.com/rastertiles/voyager_labels_under/{z}/{x}/{y}.png\",\n \"https://basemaps.cartocdn.com/rastertiles/voyager_labels_under/{z}/{x}/{y}.png\"\n ],\n \"lineWidthStops\": { \"1\": 0.5, \"2\": 0.75, \"3\": 0.75, \"4\": 1.0, \"5\": 1.0, \"7\": 1.75, \"16\": 2.5 },\n \"lineStyles\": [\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"ne\", \"endZoom\": 4, \"lineExtensionFactor\": 0.1, \"delWidthFactor\": 2.5 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"ne-disp\", \"endZoom\": 4, \"delWidthFactor\": 0 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm\", \"alpha\": 0.1, \"startZoom\": 6, \"lineWidthStops\": { \"6\": 9, \"10\": 8, \"14\": 8 }, \"lineExtensionFactor\": 0.1 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm\", \"startZoom\": 5, \"lineExtensionFactor\": 0.1 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm-disp\", \"startZoom\": 5, \"delWidthFactor\": 0 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 5, \"widthFraction\": 0.5, \"dashArray\": [2, 2], \"delWidthFactor\": 2.0 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"ne-internal\", \"startZoom\": 4, \"endZoom\": 4, \"widthFraction\": 0.5, \"dashArray\": [2, 2], \"delWidthFactor\": 2.5 }\n ]\n },\n {\n \"id\": \"cartodb-light-retina\",\n \"tileUrlTemplates\": [\n \"https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}{r}.png\",\n \"https://basemaps.cartocdn.com/light_all/{z}/{x}/{y}{r}.png\",\n \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_all/{z}/{x}/{y}{r}.png\",\n \"https://{s}.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}{r}.png\",\n \"https://basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}{r}.png\",\n \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_nolabels/{z}/{x}/{y}{r}.png\",\n \"https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}{r}.png\",\n \"https://basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}{r}.png\",\n \"https://{s}.basemaps.cartocdn.com/rastertiles/voyager_nolabels/{z}/{x}/{y}{r}.png\",\n \"https://basemaps.cartocdn.com/rastertiles/voyager_nolabels/{z}/{x}/{y}{r}.png\",\n \"https://{s}.basemaps.cartocdn.com/rastertiles/voyager_labels_under/{z}/{x}/{y}{r}.png\",\n \"https://basemaps.cartocdn.com/rastertiles/voyager_labels_under/{z}/{x}/{y}{r}.png\"\n ],\n \"lineWidthStops\": { \"1\": 1.0, \"3\": 1.0, \"4\": 2.0, \"5\": 2.0, \"6\": 2.5, \"7\": 3.0, \"8\": 3.0, \"10\": 4.0, \"11\": 4.0, \"12\": 4.0 },\n \"lineStyles\": [\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"ne\", \"endZoom\": 4, \"lineExtensionFactor\": 0.1, \"delWidthFactor\": 2.5 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"ne-disp\", \"endZoom\": 4, \"delWidthFactor\": 0 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm\", \"alpha\": 0.1, \"startZoom\": 6, \"lineWidthStops\": { \"6\": 20, \"8\": 19, \"10\": 18, \"12\": 17 }, \"lineExtensionFactor\": 0.1 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm\", \"startZoom\": 5, \"lineExtensionFactor\": 0.1 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm-disp\", \"startZoom\": 5, \"delWidthFactor\": 0 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 5, \"widthFraction\": 0.5, \"dashArray\": [4, 4], \"delWidthFactor\": 2.0 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"ne-internal\", \"startZoom\": 4, \"endZoom\": 4, \"widthFraction\": 0.5, \"dashArray\": [4, 4], \"delWidthFactor\": 2.5 }\n ]\n },\n {\n \"id\": \"open-topo\",\n \"tileUrlTemplates\": [\n \"https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png\",\n \"https://tile.opentopomap.org/{z}/{x}/{y}.png\"\n ],\n \"lineWidthStops\": { \"4\": 0.75, \"5\": 1.0, \"6\": 1.25, \"7\": 1.5, \"8\": 1.75, \"9\": 1.25, \"10\": 1.25, \"13\": 1.5 },\n \"lineStyles\": [\n { \"color\": \"rgb(83, 83, 83)\", \"layerSuffix\": \"ne\", \"startZoom\": 4, \"endZoom\": 6 },\n { \"color\": \"rgb(173, 173, 173)\", \"layerSuffix\": \"osm\", \"startZoom\": 7, \"endZoom\": 8, \"alpha\": 0.5, \"widthFraction\": 4 },\n { \"color\": \"rgb(83, 83, 83)\", \"layerSuffix\": \"osm\", \"startZoom\": 7, \"endZoom\": 8 },\n { \"color\": \"rgb(83, 83, 83)\", \"layerSuffix\": \"osm-internal\", \"widthFraction\": 0.75, \"startZoom\": 7, \"endZoom\": 8 },\n { \"color\": \"rgb(199, 158, 204)\", \"layerSuffix\": \"osm\", \"startZoom\": 9, \"widthFraction\": 7, \"alpha\": 0.6, \"lineExtensionFactor\": 0.2 },\n { \"color\": \"rgb(175, 41, 203)\", \"layerSuffix\": \"osm\", \"startZoom\": 9, \"lineExtensionFactor\": 0.2 },\n { \"color\": \"rgb(199, 158, 204)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 9, \"widthFraction\": 2.25, \"alpha\": 0.6, \"lineExtensionFactor\": 0.2 },\n { \"color\": \"rgb(175, 41, 203)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 9, \"widthFactor\": 0.75, \"lineExtensionFactor\": 0.2 }\n ]\n },\n {\n \"id\": \"osm-carto\",\n \"tileUrlTemplates\": [\n \"https://tile.openstreetmap.org/{z}/{x}/{y}.png\",\n \"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\"\n ],\n \"lineWidthStops\": { \"1\": 0.5, \"2\": 0.6, \"3\": 0.7, \"4\": 1.0, \"10\": 3.75 },\n \"lineStyles\": [\n { \"color\": \"rgb(200, 180, 200)\", \"layerSuffix\": \"osm\", \"startZoom\": 1, \"endZoom\": 3, \"delWidthFactor\": 2.5, \"widthFraction\": 1.5 },\n { \"color\": \"rgb(200, 180, 200)\", \"layerSuffix\": \"osm\", \"startZoom\": 4, \"delWidthFactor\": 1.5 },\n { \"color\": \"rgb(160, 120, 160)\", \"layerSuffix\": \"osm\", \"startZoom\": 4, \"widthFraction\": 0.333, \"dashArray\": [30, 2, 8, 2], \"delWidthFactor\": 0 },\n { \"color\": \"rgb(200, 180, 200)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 4, \"widthFraction\": 0.45 },\n { \"color\": \"rgb(160, 120, 160)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 4, \"widthFraction\": 0.15, \"dashArray\": [10, 4, 2] }\n ]\n },\n {\n \"id\": \"osm-hot\",\n \"tileUrlTemplates\": [\n \"https://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png\",\n \"https://tile.openstreetmap.fr/hot/{z}/{x}/{y}.png\"\n ],\n \"lineWidthStops\": { \"2\": 3.0, \"3\": 3.0, \"7\": 3.0, \"8\": 3.5, \"9\": 3.5 },\n \"lineStyles\": [\n { \"color\": \"rgb(149, 175, 180)\", \"layerSuffix\": \"osm\", \"lineExtensionFactor\": 0.25, \"startZoom\": 2 },\n { \"color\": \"rgb(89, 117, 123)\", \"layerSuffix\": \"osm\", \"widthFraction\": 0.33, \"lineExtensionFactor\": 0.25, \"startZoom\": 2 },\n { \"color\": \"rgb(172, 163, 163)\", \"layerSuffix\": \"osm-internal\", \"widthFraction\": 0.33, \"startZoom\": 4, \"dashArray\": [7, 7] }\n ]\n }\n]\n","/**\n * Constant representing no zoom limit (used for endZoom).\n * Using -1 instead of Infinity for JSON serialization compatibility.\n */\nexport const INFINITY = -1;\n\n/**\n * Minimum line width used when extrapolating below the lowest zoom stop.\n */\nexport const MIN_LINE_WIDTH = 0.1;\n\n/**\n * Default fallback line width if interpolation fails.\n */\nconst DEFAULT_LINE_WIDTH = 1;\n\n/**\n * Interpolate or extrapolate line width for a given zoom level.\n * Uses a lineWidthStops map to calculate the appropriate width.\n * @param {number} zoom - Zoom level\n * @param {Object<number, number>} lineWidthStops - Map of zoom level to line width (at least 2 entries)\n * @returns {number}\n */\nexport function interpolateLineWidth(zoom, lineWidthStops) {\n const zooms = Object.keys(lineWidthStops).map(Number).sort((a, b) => a - b);\n \n // Exact match\n if (lineWidthStops[zoom] !== undefined) {\n return lineWidthStops[zoom];\n }\n \n // Below lowest zoom - extrapolate\n if (zoom < zooms[0]) {\n const z1 = zooms[0];\n const z2 = zooms[1];\n const w1 = lineWidthStops[z1];\n const w2 = lineWidthStops[z2];\n const slope = (w2 - w1) / (z2 - z1);\n return Math.max(MIN_LINE_WIDTH, w1 + slope * (zoom - z1));\n }\n \n // Above highest zoom - extrapolate\n if (zoom > zooms[zooms.length - 1]) {\n const z1 = zooms[zooms.length - 2];\n const z2 = zooms[zooms.length - 1];\n const w1 = lineWidthStops[z1];\n const w2 = lineWidthStops[z2];\n const slope = (w2 - w1) / (z2 - z1);\n return Math.max(MIN_LINE_WIDTH, w2 + slope * (zoom - z2));\n }\n \n // Interpolate between two stops\n for (let i = 0; i < zooms.length - 1; i++) {\n if (zoom > zooms[i] && zoom < zooms[i + 1]) {\n const z1 = zooms[i];\n const z2 = zooms[i + 1];\n const w1 = lineWidthStops[z1];\n const w2 = lineWidthStops[z2];\n const t = (zoom - z1) / (z2 - z1);\n return w1 + t * (w2 - w1);\n }\n }\n \n return DEFAULT_LINE_WIDTH; // fallback\n}\n\n/**\n * Convert a tile URL template to a regex pattern and capture group names.\n * Supports {z}, {x}, {y}, {s} (Leaflet subdomain), {a-c}/{1-4} (OpenLayers subdomain), and {r} (retina) placeholders.\n * @param {string} template - URL template like \"https://{s}.tile.example.com/{z}/{x}/{y}.png\"\n * @returns {{ pattern: RegExp, groups: string[] }}\n */\nfunction templateToRegex(template) {\n const groups = [];\n const hasRetina = template.includes('{r}');\n const hasExtension = /\\.(png|jpg|jpeg|webp|gif)$/i.test(template);\n \n // Escape regex special chars, then replace placeholders\n let pattern = template\n .replace(/[.*+?^${}()|[\\]\\\\]/g, (char) => {\n // Don't escape our placeholders\n if (char === '{' || char === '}') return char;\n return '\\\\' + char;\n })\n // Make protocol flexible (http/https)\n .replace(/^https:\\/\\//, 'https?://')\n .replace(/^http:\\/\\//, 'https?://')\n // Handle {a-c} or {1-4} etc (OpenLayers style subdomain)\n .replace(/\\{[a-z0-9]-[a-z0-9]\\}/gi, () => {\n groups.push('s');\n return '([a-z0-9]+)';\n })\n .replace(/\\{(z|x|y|s|r)\\}/gi, (_, name) => {\n const lowerName = name.toLowerCase();\n groups.push(lowerName);\n if (lowerName === 's') {\n // Subdomain: single letter or short string\n return '([a-z0-9]+)';\n }\n if (lowerName === 'r') {\n // Retina suffix: required @2x or similar (must be present for retina configs)\n return '(@\\\\d+x)';\n }\n // z, x, y: numeric\n return '(\\\\d+)';\n });\n \n // If template has no {r} placeholder, ensure we DON'T match retina URLs\n if (!hasRetina) {\n if (hasExtension) {\n // Insert negative lookahead before .png/.jpg/.webp etc\n pattern = pattern.replace(/(\\\\\\.(png|jpg|jpeg|webp|gif))/, '(?!@\\\\d+x)$1');\n } else {\n // No extension - add negative lookahead at the end (before query string)\n pattern = pattern + '(?!@\\\\d+x)';\n }\n }\n \n // Allow optional query string at end\n return { pattern: new RegExp('^' + pattern + '(\\\\?.*)?$', 'i'), groups };\n}\n\n/**\n * Convert a tile URL template to a regex that matches the template itself.\n * @param {string} template - URL template like \"https://{s}.tile.example.com/{z}/{x}/{y}.png\"\n * @returns {RegExp}\n */\nfunction templateToTemplateRegex(template) {\n const hasRetina = template.includes('{r}');\n const hasExtension = /\\.(png|jpg|jpeg|webp|gif)$/i.test(template);\n \n // Escape regex special chars, then replace placeholders with literal match\n let pattern = template\n .replace(/[.*+?^${}()|[\\]\\\\]/g, (char) => {\n if (char === '{' || char === '}') return char;\n return '\\\\' + char;\n })\n // Make protocol flexible (http/https)\n .replace(/^https:\\/\\//, 'https?://')\n .replace(/^http:\\/\\//, 'https?://')\n // Handle {a-c} or {1-4} (OpenLayers style subdomain)\n .replace(/\\{([a-z0-9])-([a-z0-9])\\}/gi, (_, start, end) => `(\\\\{${start}-${end}\\\\}|\\\\{s\\\\}|[a-z0-9]+)`)\n .replace(/\\{(z|x|y|s|r)\\}/gi, (_, name) => {\n const lowerName = name.toLowerCase();\n if (lowerName === 's') {\n // Match {s} placeholder, {a-c} style placeholder, or actual subdomain\n return '(\\\\{s\\\\}|\\\\{[a-z0-9]-[a-z0-9]\\\\}|[a-z0-9]+)';\n }\n if (lowerName === 'r') {\n // Match {r} placeholder or actual retina suffix (required for retina configs)\n return '(\\\\{r\\\\}|@\\\\d+x)';\n }\n // Match {z}, {x}, {y} placeholders\n return `\\\\{${lowerName}\\\\}`;\n });\n \n // If template has no {r} placeholder, ensure we DON'T match retina URLs/templates\n if (!hasRetina) {\n if (hasExtension) {\n // Insert negative lookahead before .png/.jpg/.webp etc to reject @2x and {r}\n pattern = pattern.replace(/(\\\\\\.(png|jpg|jpeg|webp|gif))/, '(?!@\\\\d+x|\\\\{r\\\\})$1');\n } else {\n // No extension - add negative lookahead at the end (before query string)\n pattern = pattern + '(?!@\\\\d+x|\\\\{r\\\\})';\n }\n }\n \n // Allow optional query string at end\n return new RegExp('^' + pattern + '(\\\\?.*)?$', 'i');\n}\n\n/**\n * Check if a string is a valid CSS color using the browser's CSS parser.\n * Falls back to a basic regex check in non-browser environments.\n * @param {string} color\n * @returns {boolean}\n */\nfunction isValidColor(color) {\n if (typeof color !== 'string' || !color.trim()) return false;\n \n // Use CSS.supports if available (modern browsers)\n if (typeof CSS !== 'undefined' && CSS.supports) {\n return CSS.supports('color', color);\n }\n \n // Fallback: basic validation for common formats\n const trimmed = color.trim().toLowerCase();\n // Hex colors\n if (/^#([0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/.test(trimmed)) return true;\n // rgb/rgba/hsl/hsla functions\n if (/^(rgb|hsl)a?\\(/.test(trimmed)) return true;\n // Named colors (just check it's alphabetic)\n if (/^[a-z]+$/.test(trimmed)) return true;\n return false;\n}\n\n/**\n * Validate lineWidthStops object.\n * @param {Object} lineWidthStops - The lineWidthStops to validate\n * @param {string} prefix - Error message prefix\n * @throws {Error} If validation fails\n */\nfunction validateLineWidthStops(lineWidthStops, prefix) {\n if (!lineWidthStops || typeof lineWidthStops !== 'object' || Array.isArray(lineWidthStops)) {\n throw new Error(`${prefix}: lineWidthStops must be an object`);\n }\n const stopKeys = Object.keys(lineWidthStops);\n if (stopKeys.length < 2) {\n throw new Error(`${prefix}: lineWidthStops must have at least 2 entries`);\n }\n for (const key of stopKeys) {\n const zoom = Number(key);\n if (!Number.isInteger(zoom) || zoom < 0) {\n throw new Error(`${prefix}: lineWidthStops keys must be non-negative integers, got \"${key}\"`);\n }\n if (typeof lineWidthStops[key] !== 'number' || lineWidthStops[key] <= 0) {\n throw new Error(`${prefix}: lineWidthStops values must be positive numbers`);\n }\n }\n}\n\n/**\n * Represents a line style for drawing boundaries.\n */\nexport class LineStyle {\n /**\n * Validate a LineStyle configuration object.\n * @param {Object} obj - The object to validate\n * @param {number} [index] - Optional index for error messages (when validating in an array)\n * @param {boolean} [requireLineWidthStops=false] - Whether lineWidthStops is required\n * @throws {Error} If validation fails\n */\n static validateJSON(obj, index, requireLineWidthStops = false) {\n const prefix = index !== undefined ? `lineStyles[${index}]` : 'LineStyle';\n \n if (!obj || typeof obj !== 'object') {\n throw new Error(`${prefix}: must be an object`);\n }\n \n if (!obj.color || typeof obj.color !== 'string') {\n throw new Error(`${prefix}: color must be a non-empty string`);\n }\n \n if (!isValidColor(obj.color)) {\n throw new Error(`${prefix}: color \"${obj.color}\" is not a valid CSS color`);\n }\n \n if (!obj.layerSuffix || typeof obj.layerSuffix !== 'string') {\n throw new Error(`${prefix}: layerSuffix must be a non-empty string`);\n }\n \n if (obj.widthFraction !== undefined && (typeof obj.widthFraction !== 'number' || obj.widthFraction <= 0)) {\n throw new Error(`${prefix}: widthFraction must be a positive number`);\n }\n \n if (obj.dashArray !== undefined && !Array.isArray(obj.dashArray)) {\n throw new Error(`${prefix}: dashArray must be an array`);\n }\n \n if (obj.alpha !== undefined && (typeof obj.alpha !== 'number' || obj.alpha < 0 || obj.alpha > 1)) {\n throw new Error(`${prefix}: alpha must be a number between 0 and 1`);\n }\n \n if (obj.startZoom !== undefined && (typeof obj.startZoom !== 'number' || obj.startZoom < 0)) {\n throw new Error(`${prefix}: startZoom must be a non-negative number`);\n }\n \n if (obj.endZoom !== undefined && (typeof obj.endZoom !== 'number' || (obj.endZoom < 0 && obj.endZoom !== INFINITY))) {\n throw new Error(`${prefix}: endZoom must be a non-negative number or INFINITY (${INFINITY})`);\n }\n \n if (obj.lineExtensionFactor !== undefined && (typeof obj.lineExtensionFactor !== 'number' || obj.lineExtensionFactor < 0)) {\n throw new Error(`${prefix}: lineExtensionFactor must be a non-negative number`);\n }\n \n if (obj.delWidthFactor !== undefined && (typeof obj.delWidthFactor !== 'number' || obj.delWidthFactor < 0)) {\n throw new Error(`${prefix}: delWidthFactor must be a non-negative number`);\n }\n \n if (requireLineWidthStops && obj.lineWidthStops === undefined) {\n throw new Error(`${prefix}: lineWidthStops is required`);\n }\n \n if (obj.lineWidthStops !== undefined) {\n validateLineWidthStops(obj.lineWidthStops, prefix);\n }\n }\n\n /**\n * @param {Object} options\n * @param {string} options.color - CSS color string\n * @param {string} options.layerSuffix - Layer suffix (e.g., 'osm', 'ne', 'osm-disp')\n * @param {Object<number, number>} options.lineWidthStops - Line width stops for this style\n * @param {number} [options.widthFraction=1.0] - Multiplier for base line width\n * @param {number[]} [options.dashArray] - Dash pattern for dashed lines\n * @param {number} [options.alpha=1.0] - Opacity (0-1)\n * @param {number} [options.startZoom=0] - Minimum zoom level for this style\n * @param {number} [options.endZoom=INFINITY] - Maximum zoom level for this style (INFINITY means no limit)\n * @param {number} [options.lineExtensionFactor=0.0] - Factor to extend lines by (multiplied by deletion line width)\n * @param {number} [options.delWidthFactor=1.5] - Factor to multiply line width for deletion blur\n */\n constructor({ color, layerSuffix, lineWidthStops, widthFraction = 1.0, dashArray, alpha = 1.0, startZoom = 0, endZoom = INFINITY, lineExtensionFactor = 0.0, delWidthFactor = 1.5 }) {\n this.color = color;\n this.layerSuffix = layerSuffix;\n this.lineWidthStops = lineWidthStops;\n this.widthFraction = widthFraction;\n this.dashArray = dashArray;\n this.alpha = alpha;\n this.startZoom = startZoom;\n this.endZoom = endZoom;\n this.lineExtensionFactor = lineExtensionFactor;\n this.delWidthFactor = delWidthFactor;\n }\n\n /**\n * Get base line width for this style at a given zoom level.\n * @param {number} zoom - Zoom level\n * @returns {number}\n */\n getLineWidth(zoom) {\n return interpolateLineWidth(zoom, this.lineWidthStops);\n }\n\n /**\n * Check if this style is active at the given zoom level.\n * @param {number} z - Zoom level\n * @returns {boolean}\n */\n isActiveAtZoom(z) {\n return z >= this.startZoom && (this.endZoom === INFINITY || z <= this.endZoom);\n }\n\n /**\n * Serialize to plain object.\n * @returns {Object}\n */\n toJSON() {\n return {\n color: this.color,\n layerSuffix: this.layerSuffix,\n lineWidthStops: this.lineWidthStops,\n widthFraction: this.widthFraction,\n dashArray: this.dashArray,\n alpha: this.alpha,\n startZoom: this.startZoom,\n endZoom: this.endZoom,\n lineExtensionFactor: this.lineExtensionFactor,\n delWidthFactor: this.delWidthFactor,\n };\n }\n\n /**\n * Create from plain object with validation.\n * @param {Object} obj\n * @param {number} [index] - Optional index for error messages\n * @returns {LineStyle}\n */\n static fromJSON(obj, index) {\n LineStyle.validateJSON(obj, index, true); // require lineWidthStops\n return new LineStyle(obj);\n }\n}\n\n/**\n * Base class for layer configurations\n * \n * Each lineStyle specifies which data layer to use via layerSuffix (e.g., 'osm', 'ne', 'osm-disp').\n * Layer names are derived as: to-add-{layerSuffix} and to-del-{layerSuffix}\n */\nexport class LayerConfig {\n /**\n * Validate a LayerConfig configuration object.\n * Also validates all lineStyles within the config.\n * @param {Object} obj - The object to validate\n * @throws {Error} If validation fails\n */\n static validateJSON(obj) {\n if (!obj || typeof obj !== 'object') {\n throw new Error('LayerConfig: must be an object');\n }\n \n // Validate id (required)\n if (!obj.id || typeof obj.id !== 'string') {\n throw new Error('LayerConfig: id must be a non-empty string');\n }\n if (obj.id.includes('/')) {\n throw new Error(`LayerConfig: id cannot contain slashes: \"${obj.id}\"`);\n }\n \n const id = obj.id;\n \n // Validate lineWidthStops (optional, but if provided must be valid)\n if (obj.lineWidthStops !== undefined) {\n if (!obj.lineWidthStops || typeof obj.lineWidthStops !== 'object' || Array.isArray(obj.lineWidthStops)) {\n throw new Error(`LayerConfig \"${id}\": lineWidthStops must be an object`);\n }\n const stopKeys = Object.keys(obj.lineWidthStops);\n if (stopKeys.length < 2) {\n throw new Error(`LayerConfig \"${id}\": lineWidthStops must have at least 2 entries`);\n }\n for (const key of stopKeys) {\n const zoom = Number(key);\n if (!Number.isInteger(zoom) || zoom < 0) {\n throw new Error(`LayerConfig \"${id}\": lineWidthStops keys must be non-negative integers, got \"${key}\"`);\n }\n if (typeof obj.lineWidthStops[key] !== 'number' || obj.lineWidthStops[key] <= 0) {\n throw new Error(`LayerConfig \"${id}\": lineWidthStops values must be positive numbers`);\n }\n }\n }\n \n // Validate lineStyles (required)\n if (!Array.isArray(obj.lineStyles) || obj.lineStyles.length === 0) {\n throw new Error(`LayerConfig \"${id}\": lineStyles must be a non-empty array`);\n }\n // Validate each lineStyle\n for (let i = 0; i < obj.lineStyles.length; i++) {\n LineStyle.validateJSON(obj.lineStyles[i], i);\n }\n }\n\n constructor({\n id,\n // Tile URL templates for matching (e.g., \"https://{s}.tile.example.com/{z}/{x}/{y}.png\")\n tileUrlTemplates = [],\n // Line width stops: map of zoom level to line width (at least 2 entries)\n // Note: interpolated/extrapolated line width is capped at a minimum of 0.5\n lineWidthStops = { 1: 0.5, 10: 2.5 },\n // Line styles array - each element describes a line to draw from a specific layer\n // { color: string, layerSuffix: string, widthFraction?: number, dashArray?: number[], \n // startZoom?: number, endZoom?: number, lineExtensionFactor?: number, delWidthFactor?: number }\n // Lines are drawn in array order. layerSuffix determines which PMTiles layer to use.\n lineStyles,\n }) {\n this.id = id;\n\n // Normalize to array\n const templates = Array.isArray(tileUrlTemplates) ? tileUrlTemplates : \n (tileUrlTemplates ? [tileUrlTemplates] : []);\n this.tileUrlTemplates = templates;\n \n // Pre-compile regex patterns for matching tile URLs (with actual coords)\n this._compiledPatterns = templates.map(t => templateToRegex(t));\n \n // Pre-compile regex patterns for matching template URLs (with {z}/{x}/{y} placeholders)\n this._templatePatterns = templates.map(t => templateToTemplateRegex(t));\n\n this.lineWidthStops = lineWidthStops;\n \n // Convert to LineStyle instances, inheriting lineWidthStops from config if not specified\n this.lineStyles = lineStyles.map(style => {\n if (style instanceof LineStyle) {\n return style;\n }\n // If style doesn't have lineWidthStops, use the config's lineWidthStops\n const styleWithStops = style.lineWidthStops ? style : { ...style, lineWidthStops };\n return new LineStyle(styleWithStops);\n });\n }\n\n /**\n * Get line styles active at a given zoom level\n * @param {number} z - Zoom level\n * @returns {LineStyle[]}\n */\n getLineStylesForZoom(z) {\n return this.lineStyles.filter(style => style.isActiveAtZoom(z));\n }\n\n /**\n * Get unique layer suffixes from styles active at a given zoom level\n * @param {number} z - Zoom level\n * @returns {string[]}\n */\n getLayerSuffixesForZoom(z) {\n const activeStyles = this.getLineStylesForZoom(z);\n return [...new Set(activeStyles.map(s => s.layerSuffix))];\n }\n\n /**\n * Check if this config matches the given template URLs (with {z}/{x}/{y} placeholders)\n * @param {string | string[]} templates - Single template URL or array of template URLs\n * @returns {boolean}\n */\n matchTemplate(templates) {\n if (this._templatePatterns.length === 0) return false;\n \n const urls = Array.isArray(templates) ? templates : [templates];\n if (urls.length === 0) return false;\n \n return urls.some(url => \n this._templatePatterns.some(pattern => pattern.test(url))\n );\n }\n\n /**\n * Check if this config matches the given tile URLs (with actual coordinates)\n * @param {string | string[]} tiles - Single tile URL or array of tile URLs\n * @returns {boolean}\n */\n matchTileUrl(tiles) {\n if (this._compiledPatterns.length === 0) return false;\n \n const urls = Array.isArray(tiles) ? tiles : [tiles];\n if (urls.length === 0) return false;\n \n return urls.some(url => \n this._compiledPatterns.some(({ pattern }) => pattern.test(url))\n );\n }\n\n /**\n * Extract tile coordinates (z, x, y) from a URL using this config's templates\n * @param {string} url - Tile URL to extract coordinates from\n * @returns {{ z: number, x: number, y: number } | null}\n */\n extractCoords(url) {\n for (const { pattern, groups } of this._compiledPatterns) {\n const match = url.match(pattern);\n if (match) {\n const result = {};\n for (let i = 0; i < groups.length; i++) {\n const name = groups[i];\n const value = match[i + 1];\n if (name === 'z' || name === 'x' || name === 'y') {\n result[name] = parseInt(value, 10);\n }\n }\n if ('z' in result && 'x' in result && 'y' in result) {\n return { z: result.z, x: result.x, y: result.y };\n }\n }\n }\n return null;\n }\n\n /**\n * Serialize the config to a plain object for postMessage\n * @returns {Object}\n */\n toJSON() {\n return {\n id: this.id,\n tileUrlTemplates: this.tileUrlTemplates,\n lineWidthStops: this.lineWidthStops,\n lineStyles: this.lineStyles.map(s => s.toJSON()),\n };\n }\n\n /**\n * Create a LayerConfig from a plain object with validation.\n * @param {Object} obj\n * @returns {LayerConfig}\n * @throws {Error} If validation fails\n */\n static fromJSON(obj) {\n LayerConfig.validateJSON(obj);\n return new LayerConfig(obj);\n }\n}\n\nexport default LayerConfig;\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.js","../src/configs.json","../src/layerconfig.js"],"sourcesContent":["import configsJson from './configs.json' with { type: 'json' };\nimport { LayerConfig, LineStyle, INFINITY, MIN_LINE_WIDTH, interpolateLineWidth } from './layerconfig.js';\n\nexport { LayerConfig, LineStyle, INFINITY, MIN_LINE_WIDTH, interpolateLineWidth } from './layerconfig.js';\n\n// Export raw configs for testing/inspection\nexport { configsJson };\n\n/**\n * Layer configuration registry\n */\nexport class LayerConfigRegistry {\n constructor() {\n this.registry = {};\n }\n\n /**\n * Get a layer config by id\n */\n get(id) {\n return this.registry[id];\n }\n\n /**\n * Register a new layer config\n */\n register(config) {\n this.registry[config.id] = config;\n }\n\n /**\n * Remove a layer config by id\n */\n remove(id) {\n if (!this.registry[id]) return false;\n delete this.registry[id];\n return true;\n }\n\n /**\n * Detect layer config from tile URL templates (with {z}/{x}/{y} placeholders)\n * @param {string | string[]} templates - Single template URL or array of template URLs\n */\n detectFromTemplates(templates) {\n if (!templates || (Array.isArray(templates) && templates.length === 0)) return undefined;\n \n for (const config of Object.values(this.registry)) {\n if (config.matchTemplate(templates)) {\n return config;\n }\n }\n \n return undefined;\n }\n\n /**\n * Detect layer config from actual tile URLs (with numeric coordinates)\n * @param {string | string[]} urls - Single tile URL or array of tile URLs\n */\n detectFromTileUrls(urls) {\n if (!urls || (Array.isArray(urls) && urls.length === 0)) return undefined;\n \n for (const config of Object.values(this.registry)) {\n if (config.matchTileUrl(urls)) {\n return config;\n }\n }\n \n return undefined;\n }\n\n /**\n * Get all available layer config ids\n */\n getAvailableIds() {\n return Object.keys(this.registry);\n }\n\n /**\n * Create a new registry with all configs from this registry plus extra configs.\n * @param {LayerConfig[]} extraLayerConfigs - Additional configs to add\n * @returns {LayerConfigRegistry} A new registry with merged configs\n */\n createMergedRegistry(extraLayerConfigs) {\n const registry = new LayerConfigRegistry();\n \n for (const id of this.getAvailableIds()) {\n registry.register(this.get(id));\n }\n \n if (extraLayerConfigs && extraLayerConfigs.length > 0) {\n for (const config of extraLayerConfigs) {\n registry.register(config);\n }\n }\n \n return registry;\n }\n\n /**\n * Parse a tile URL into its components: layer config and coordinates\n * @param {string} url - Tile URL to parse\n * @returns {{ layerConfig: LayerConfig, coords: { z: number, x: number, y: number } } | null}\n */\n parseTileUrl(url) {\n // Check if URL matches any layer config\n const layerConfig = this.detectFromTileUrls([url]);\n if (!layerConfig) return null;\n \n // Extract tile coordinates using the matched config\n const coords = layerConfig.extractCoords(url);\n if (!coords) return null;\n \n return { layerConfig, coords };\n }\n}\n\n// Default registry with built-in configs loaded from JSON\nexport const layerConfigs = new LayerConfigRegistry();\nfor (const configData of configsJson) {\n layerConfigs.register(new LayerConfig(configData));\n}\n\n","[\n {\n \"id\": \"cartodb-dark\",\n \"tileUrlTemplates\": [\n \"https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png\",\n \"https://basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png\",\n \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/dark_all/{z}/{x}/{y}.png\",\n \"https://{s}.basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}.png\",\n \"https://basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}.png\",\n \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/dark_nolabels/{z}/{x}/{y}.png\"\n ],\n \"lineWidthStops\": { \"0\": 1.0, \"2\": 1.0, \"3\": 1.0, \"10\": 2.0, \"12\": 2.0 },\n \"lineStyles\": [\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"ne\", \"endZoom\": 4 },\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"ne-disp\", \"endZoom\": 4 },\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"osm\", \"startZoom\": 5 },\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"osm-disp\", \"startZoom\": 5 },\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 5, \"widthFraction\": 0.3, \"dashArray\": [2, 2], \"delWidthFactor\": 2.0 },\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"ne-internal\", \"startZoom\": 4, \"endZoom\": 4, \"widthFraction\": 0.3, \"dashArray\": [2, 2], \"delWidthFactor\": 3.0 }\n ]\n },\n {\n \"id\": \"cartodb-dark-retina\",\n \"tileUrlTemplates\": [\n \"https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png\",\n \"https://basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png\",\n \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/dark_all/{z}/{x}/{y}{r}.png\",\n \"https://{s}.basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}{r}.png\",\n \"https://basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}{r}.png\",\n \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/dark_nolabels/{z}/{x}/{y}{r}.png\"\n ],\n \"lineWidthStops\": { \"0\": 1.5, \"2\": 1.5, \"3\": 1.5, \"6\": 2.5, \"10\": 3.0 },\n \"lineStyles\": [\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"ne\", \"endZoom\": 4 },\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"ne-disp\", \"endZoom\": 4 },\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"osm\", \"startZoom\": 5 },\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"osm-disp\", \"startZoom\": 5 },\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 5, \"widthFraction\": 0.3, \"dashArray\": [4, 4], \"delWidthFactor\": 2.0 },\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"ne-internal\", \"startZoom\": 4, \"endZoom\": 4, \"widthFraction\": 0.3, \"dashArray\": [4, 4], \"delWidthFactor\": 3.0 }\n ]\n },\n {\n \"id\": \"cartodb-light\",\n \"tileUrlTemplates\": [\n \"https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png\",\n \"https://basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png\",\n \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_all/{z}/{x}/{y}.png\",\n \"https://{s}.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}.png\",\n \"https://basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}.png\",\n \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_nolabels/{z}/{x}/{y}.png\",\n \"https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png\",\n \"https://basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png\",\n \"https://{s}.basemaps.cartocdn.com/rastertiles/voyager_nolabels/{z}/{x}/{y}.png\",\n \"https://basemaps.cartocdn.com/rastertiles/voyager_nolabels/{z}/{x}/{y}.png\",\n \"https://{s}.basemaps.cartocdn.com/rastertiles/voyager_labels_under/{z}/{x}/{y}.png\",\n \"https://basemaps.cartocdn.com/rastertiles/voyager_labels_under/{z}/{x}/{y}.png\"\n ],\n \"lineWidthStops\": { \"1\": 0.5, \"2\": 0.75, \"3\": 0.75, \"4\": 1.0, \"5\": 1.0, \"7\": 1.75, \"16\": 2.5 },\n \"lineStyles\": [\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"ne\", \"endZoom\": 4, \"lineExtensionFactor\": 0.1, \"delWidthFactor\": 2.5 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"ne-disp\", \"endZoom\": 4, \"delWidthFactor\": 0 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm\", \"alpha\": 0.1, \"startZoom\": 6, \"lineWidthStops\": { \"6\": 9, \"10\": 8, \"14\": 8 }, \"lineExtensionFactor\": 0.1 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm\", \"startZoom\": 5, \"lineExtensionFactor\": 0.1 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm-disp\", \"startZoom\": 5, \"delWidthFactor\": 0 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 5, \"widthFraction\": 0.5, \"dashArray\": [2, 2], \"delWidthFactor\": 2.0 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"ne-internal\", \"startZoom\": 4, \"endZoom\": 4, \"widthFraction\": 0.5, \"dashArray\": [2, 2], \"delWidthFactor\": 2.5 }\n ]\n },\n {\n \"id\": \"cartodb-light-retina\",\n \"tileUrlTemplates\": [\n \"https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}{r}.png\",\n \"https://basemaps.cartocdn.com/light_all/{z}/{x}/{y}{r}.png\",\n \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_all/{z}/{x}/{y}{r}.png\",\n \"https://{s}.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}{r}.png\",\n \"https://basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}{r}.png\",\n \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_nolabels/{z}/{x}/{y}{r}.png\",\n \"https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}{r}.png\",\n \"https://basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}{r}.png\",\n \"https://{s}.basemaps.cartocdn.com/rastertiles/voyager_nolabels/{z}/{x}/{y}{r}.png\",\n \"https://basemaps.cartocdn.com/rastertiles/voyager_nolabels/{z}/{x}/{y}{r}.png\",\n \"https://{s}.basemaps.cartocdn.com/rastertiles/voyager_labels_under/{z}/{x}/{y}{r}.png\",\n \"https://basemaps.cartocdn.com/rastertiles/voyager_labels_under/{z}/{x}/{y}{r}.png\"\n ],\n \"lineWidthStops\": { \"1\": 1.0, \"3\": 1.0, \"4\": 2.0, \"5\": 2.0, \"6\": 2.5, \"7\": 3.0, \"8\": 3.0, \"10\": 4.0, \"11\": 4.0, \"12\": 4.0 },\n \"lineStyles\": [\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"ne\", \"endZoom\": 4, \"lineExtensionFactor\": 0.1, \"delWidthFactor\": 2.5 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"ne-disp\", \"endZoom\": 4, \"delWidthFactor\": 0 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm\", \"alpha\": 0.1, \"startZoom\": 6, \"lineWidthStops\": { \"6\": 20, \"8\": 19, \"10\": 18, \"12\": 17 }, \"lineExtensionFactor\": 0.1 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm\", \"startZoom\": 5, \"lineExtensionFactor\": 0.1 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm-disp\", \"startZoom\": 5, \"delWidthFactor\": 0 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 5, \"widthFraction\": 0.5, \"dashArray\": [4, 4], \"delWidthFactor\": 2.0 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"ne-internal\", \"startZoom\": 4, \"endZoom\": 4, \"widthFraction\": 0.5, \"dashArray\": [4, 4], \"delWidthFactor\": 2.5 }\n ]\n },\n {\n \"id\": \"open-topo\",\n \"tileUrlTemplates\": [\n \"https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png\",\n \"https://tile.opentopomap.org/{z}/{x}/{y}.png\",\n \"https://{s}.tile.top-o-map.de/{z}/{x}/{y}.png\",\n \"https://tile.top-o-map.de/{z}/{x}/{y}.png\"\n ],\n \"lineWidthStops\": { \"4\": 0.75, \"5\": 1.0, \"6\": 1.25, \"7\": 1.5, \"8\": 1.75, \"9\": 1.25, \"10\": 1.25, \"13\": 1.5 },\n \"lineStyles\": [\n { \"color\": \"rgb(83, 83, 83)\", \"layerSuffix\": \"ne\", \"startZoom\": 4, \"endZoom\": 6 },\n { \"color\": \"rgb(173, 173, 173)\", \"layerSuffix\": \"osm\", \"startZoom\": 7, \"endZoom\": 8, \"alpha\": 0.5, \"widthFraction\": 4 },\n { \"color\": \"rgb(83, 83, 83)\", \"layerSuffix\": \"osm\", \"startZoom\": 7, \"endZoom\": 8 },\n { \"color\": \"rgb(83, 83, 83)\", \"layerSuffix\": \"osm-internal\", \"widthFraction\": 0.75, \"startZoom\": 7, \"endZoom\": 8 },\n { \"color\": \"rgb(199, 158, 204)\", \"layerSuffix\": \"osm\", \"startZoom\": 9, \"widthFraction\": 7, \"alpha\": 0.6, \"lineExtensionFactor\": 0.2 },\n { \"color\": \"rgb(175, 41, 203)\", \"layerSuffix\": \"osm\", \"startZoom\": 9, \"lineExtensionFactor\": 0.2 },\n { \"color\": \"rgb(199, 158, 204)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 9, \"widthFraction\": 2.25, \"alpha\": 0.6, \"lineExtensionFactor\": 0.2 },\n { \"color\": \"rgb(175, 41, 203)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 9, \"widthFactor\": 0.75, \"lineExtensionFactor\": 0.2 }\n ]\n },\n {\n \"id\": \"osm-carto\",\n \"tileUrlTemplates\": [\n \"https://tile.openstreetmap.org/{z}/{x}/{y}.png\",\n \"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\"\n ],\n \"lineWidthStops\": { \"3\": 0.7, \"4\": 1.0, \"10\": 3.75 },\n \"lineStyles\": [\n { \"color\": \"rgb(200, 180, 200)\", \"layerSuffix\": \"osm\", \"startZoom\": 4, \"delWidthFactor\": 1.5 },\n { \"color\": \"rgb(160, 120, 160)\", \"layerSuffix\": \"osm\", \"startZoom\": 4, \"widthFraction\": 0.333, \"dashArray\": [30, 2, 8, 2], \"delWidthFactor\": 0 },\n { \"color\": \"rgb(200, 180, 200)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 4, \"widthFraction\": 0.45 },\n { \"color\": \"rgb(160, 120, 160)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 4, \"widthFraction\": 0.15, \"dashArray\": [10, 4, 2] }\n ]\n },\n {\n \"id\": \"osm-hot\",\n \"tileUrlTemplates\": [\n \"https://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png\",\n \"https://tile.openstreetmap.fr/hot/{z}/{x}/{y}.png\"\n ],\n \"lineWidthStops\": { \"2\": 3.0, \"3\": 3.0, \"7\": 3.0, \"8\": 3.5, \"9\": 3.5 },\n \"lineStyles\": [\n { \"color\": \"rgb(149, 175, 180)\", \"layerSuffix\": \"osm\", \"lineExtensionFactor\": 0.25, \"startZoom\": 2 },\n { \"color\": \"rgb(89, 117, 123)\", \"layerSuffix\": \"osm\", \"widthFraction\": 0.33, \"lineExtensionFactor\": 0.25, \"startZoom\": 2 },\n { \"color\": \"rgb(172, 163, 163)\", \"layerSuffix\": \"osm-internal\", \"widthFraction\": 0.33, \"startZoom\": 4, \"dashArray\": [7, 7] }\n ]\n }\n]\n","/**\n * Constant representing no zoom limit (used for endZoom).\n * Using -1 instead of Infinity for JSON serialization compatibility.\n */\nexport const INFINITY = -1;\n\n/**\n * Minimum line width used when extrapolating below the lowest zoom stop.\n */\nexport const MIN_LINE_WIDTH = 0.1;\n\n/**\n * Default fallback line width if interpolation fails.\n */\nconst DEFAULT_LINE_WIDTH = 1;\n\n/**\n * Interpolate or extrapolate line width for a given zoom level.\n * Uses a lineWidthStops map to calculate the appropriate width.\n * @param {number} zoom - Zoom level\n * @param {Object<number, number>} lineWidthStops - Map of zoom level to line width (at least 2 entries)\n * @returns {number}\n */\nexport function interpolateLineWidth(zoom, lineWidthStops) {\n const zooms = Object.keys(lineWidthStops).map(Number).sort((a, b) => a - b);\n \n // Exact match\n if (lineWidthStops[zoom] !== undefined) {\n return lineWidthStops[zoom];\n }\n \n // Below lowest zoom - extrapolate\n if (zoom < zooms[0]) {\n const z1 = zooms[0];\n const z2 = zooms[1];\n const w1 = lineWidthStops[z1];\n const w2 = lineWidthStops[z2];\n const slope = (w2 - w1) / (z2 - z1);\n return Math.max(MIN_LINE_WIDTH, w1 + slope * (zoom - z1));\n }\n \n // Above highest zoom - extrapolate\n if (zoom > zooms[zooms.length - 1]) {\n const z1 = zooms[zooms.length - 2];\n const z2 = zooms[zooms.length - 1];\n const w1 = lineWidthStops[z1];\n const w2 = lineWidthStops[z2];\n const slope = (w2 - w1) / (z2 - z1);\n return Math.max(MIN_LINE_WIDTH, w2 + slope * (zoom - z2));\n }\n \n // Interpolate between two stops\n for (let i = 0; i < zooms.length - 1; i++) {\n if (zoom > zooms[i] && zoom < zooms[i + 1]) {\n const z1 = zooms[i];\n const z2 = zooms[i + 1];\n const w1 = lineWidthStops[z1];\n const w2 = lineWidthStops[z2];\n const t = (zoom - z1) / (z2 - z1);\n return w1 + t * (w2 - w1);\n }\n }\n \n return DEFAULT_LINE_WIDTH; // fallback\n}\n\n/**\n * Convert a tile URL template to a regex pattern and capture group names.\n * Supports {z}, {x}, {y}, {s} (Leaflet subdomain), {a-c}/{1-4} (OpenLayers subdomain), and {r} (retina) placeholders.\n * @param {string} template - URL template like \"https://{s}.tile.example.com/{z}/{x}/{y}.png\"\n * @returns {{ pattern: RegExp, groups: string[] }}\n */\nfunction templateToRegex(template) {\n const groups = [];\n const hasRetina = template.includes('{r}');\n const hasExtension = /\\.(png|jpg|jpeg|webp|gif)$/i.test(template);\n \n // Escape regex special chars, then replace placeholders\n let pattern = template\n .replace(/[.*+?^${}()|[\\]\\\\]/g, (char) => {\n // Don't escape our placeholders\n if (char === '{' || char === '}') return char;\n return '\\\\' + char;\n })\n // Make protocol flexible (http/https)\n .replace(/^https:\\/\\//, 'https?://')\n .replace(/^http:\\/\\//, 'https?://')\n // Handle {a-c} or {1-4} etc (OpenLayers style subdomain)\n .replace(/\\{[a-z0-9]-[a-z0-9]\\}/gi, () => {\n groups.push('s');\n return '([a-z0-9]+)';\n })\n .replace(/\\{(z|x|y|s|r)\\}/gi, (_, name) => {\n const lowerName = name.toLowerCase();\n groups.push(lowerName);\n if (lowerName === 's') {\n // Subdomain: single letter or short string\n return '([a-z0-9]+)';\n }\n if (lowerName === 'r') {\n // Retina suffix: required @2x or similar (must be present for retina configs)\n return '(@\\\\d+x)';\n }\n // z, x, y: numeric\n return '(\\\\d+)';\n });\n \n // If template has no {r} placeholder, ensure we DON'T match retina URLs\n if (!hasRetina) {\n if (hasExtension) {\n // Insert negative lookahead before .png/.jpg/.webp etc\n pattern = pattern.replace(/(\\\\\\.(png|jpg|jpeg|webp|gif))/, '(?!@\\\\d+x)$1');\n } else {\n // No extension - add negative lookahead at the end (before query string)\n pattern = pattern + '(?!@\\\\d+x)';\n }\n }\n \n // Allow optional query string at end\n return { pattern: new RegExp('^' + pattern + '(\\\\?.*)?$', 'i'), groups };\n}\n\n/**\n * Convert a tile URL template to a regex that matches the template itself.\n * @param {string} template - URL template like \"https://{s}.tile.example.com/{z}/{x}/{y}.png\"\n * @returns {RegExp}\n */\nfunction templateToTemplateRegex(template) {\n const hasRetina = template.includes('{r}');\n const hasExtension = /\\.(png|jpg|jpeg|webp|gif)$/i.test(template);\n \n // Escape regex special chars, then replace placeholders with literal match\n let pattern = template\n .replace(/[.*+?^${}()|[\\]\\\\]/g, (char) => {\n if (char === '{' || char === '}') return char;\n return '\\\\' + char;\n })\n // Make protocol flexible (http/https)\n .replace(/^https:\\/\\//, 'https?://')\n .replace(/^http:\\/\\//, 'https?://')\n // Handle {a-c} or {1-4} (OpenLayers style subdomain)\n .replace(/\\{([a-z0-9])-([a-z0-9])\\}/gi, (_, start, end) => `(\\\\{${start}-${end}\\\\}|\\\\{s\\\\}|[a-z0-9]+)`)\n .replace(/\\{(z|x|y|s|r)\\}/gi, (_, name) => {\n const lowerName = name.toLowerCase();\n if (lowerName === 's') {\n // Match {s} placeholder, {a-c} style placeholder, or actual subdomain\n return '(\\\\{s\\\\}|\\\\{[a-z0-9]-[a-z0-9]\\\\}|[a-z0-9]+)';\n }\n if (lowerName === 'r') {\n // Match {r} placeholder or actual retina suffix (required for retina configs)\n return '(\\\\{r\\\\}|@\\\\d+x)';\n }\n // Match {z}, {x}, {y} placeholders\n return `\\\\{${lowerName}\\\\}`;\n });\n \n // If template has no {r} placeholder, ensure we DON'T match retina URLs/templates\n if (!hasRetina) {\n if (hasExtension) {\n // Insert negative lookahead before .png/.jpg/.webp etc to reject @2x and {r}\n pattern = pattern.replace(/(\\\\\\.(png|jpg|jpeg|webp|gif))/, '(?!@\\\\d+x|\\\\{r\\\\})$1');\n } else {\n // No extension - add negative lookahead at the end (before query string)\n pattern = pattern + '(?!@\\\\d+x|\\\\{r\\\\})';\n }\n }\n \n // Allow optional query string at end\n return new RegExp('^' + pattern + '(\\\\?.*)?$', 'i');\n}\n\n/**\n * Check if a string is a valid CSS color using the browser's CSS parser.\n * Falls back to a basic regex check in non-browser environments.\n * @param {string} color\n * @returns {boolean}\n */\nfunction isValidColor(color) {\n if (typeof color !== 'string' || !color.trim()) return false;\n \n // Use CSS.supports if available (modern browsers)\n if (typeof CSS !== 'undefined' && CSS.supports) {\n return CSS.supports('color', color);\n }\n \n // Fallback: basic validation for common formats\n const trimmed = color.trim().toLowerCase();\n // Hex colors\n if (/^#([0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/.test(trimmed)) return true;\n // rgb/rgba/hsl/hsla functions\n if (/^(rgb|hsl)a?\\(/.test(trimmed)) return true;\n // Named colors (just check it's alphabetic)\n if (/^[a-z]+$/.test(trimmed)) return true;\n return false;\n}\n\n/**\n * Validate lineWidthStops object.\n * @param {Object} lineWidthStops - The lineWidthStops to validate\n * @param {string} prefix - Error message prefix\n * @throws {Error} If validation fails\n */\nfunction validateLineWidthStops(lineWidthStops, prefix) {\n if (!lineWidthStops || typeof lineWidthStops !== 'object' || Array.isArray(lineWidthStops)) {\n throw new Error(`${prefix}: lineWidthStops must be an object`);\n }\n const stopKeys = Object.keys(lineWidthStops);\n if (stopKeys.length < 2) {\n throw new Error(`${prefix}: lineWidthStops must have at least 2 entries`);\n }\n for (const key of stopKeys) {\n const zoom = Number(key);\n if (!Number.isInteger(zoom) || zoom < 0) {\n throw new Error(`${prefix}: lineWidthStops keys must be non-negative integers, got \"${key}\"`);\n }\n if (typeof lineWidthStops[key] !== 'number' || lineWidthStops[key] <= 0) {\n throw new Error(`${prefix}: lineWidthStops values must be positive numbers`);\n }\n }\n}\n\n/**\n * Represents a line style for drawing boundaries.\n */\nexport class LineStyle {\n /**\n * Validate a LineStyle configuration object.\n * @param {Object} obj - The object to validate\n * @param {number} [index] - Optional index for error messages (when validating in an array)\n * @param {boolean} [requireLineWidthStops=false] - Whether lineWidthStops is required\n * @throws {Error} If validation fails\n */\n static validateJSON(obj, index, requireLineWidthStops = false) {\n const prefix = index !== undefined ? `lineStyles[${index}]` : 'LineStyle';\n \n if (!obj || typeof obj !== 'object') {\n throw new Error(`${prefix}: must be an object`);\n }\n \n if (!obj.color || typeof obj.color !== 'string') {\n throw new Error(`${prefix}: color must be a non-empty string`);\n }\n \n if (!isValidColor(obj.color)) {\n throw new Error(`${prefix}: color \"${obj.color}\" is not a valid CSS color`);\n }\n \n if (!obj.layerSuffix || typeof obj.layerSuffix !== 'string') {\n throw new Error(`${prefix}: layerSuffix must be a non-empty string`);\n }\n \n if (obj.widthFraction !== undefined && (typeof obj.widthFraction !== 'number' || obj.widthFraction <= 0)) {\n throw new Error(`${prefix}: widthFraction must be a positive number`);\n }\n \n if (obj.dashArray !== undefined && !Array.isArray(obj.dashArray)) {\n throw new Error(`${prefix}: dashArray must be an array`);\n }\n \n if (obj.alpha !== undefined && (typeof obj.alpha !== 'number' || obj.alpha < 0 || obj.alpha > 1)) {\n throw new Error(`${prefix}: alpha must be a number between 0 and 1`);\n }\n \n if (obj.startZoom !== undefined && (typeof obj.startZoom !== 'number' || obj.startZoom < 0)) {\n throw new Error(`${prefix}: startZoom must be a non-negative number`);\n }\n \n if (obj.endZoom !== undefined && (typeof obj.endZoom !== 'number' || (obj.endZoom < 0 && obj.endZoom !== INFINITY))) {\n throw new Error(`${prefix}: endZoom must be a non-negative number or INFINITY (${INFINITY})`);\n }\n \n if (obj.lineExtensionFactor !== undefined && (typeof obj.lineExtensionFactor !== 'number' || obj.lineExtensionFactor < 0)) {\n throw new Error(`${prefix}: lineExtensionFactor must be a non-negative number`);\n }\n \n if (obj.delWidthFactor !== undefined && (typeof obj.delWidthFactor !== 'number' || obj.delWidthFactor < 0)) {\n throw new Error(`${prefix}: delWidthFactor must be a non-negative number`);\n }\n \n if (requireLineWidthStops && obj.lineWidthStops === undefined) {\n throw new Error(`${prefix}: lineWidthStops is required`);\n }\n \n if (obj.lineWidthStops !== undefined) {\n validateLineWidthStops(obj.lineWidthStops, prefix);\n }\n }\n\n /**\n * @param {Object} options\n * @param {string} options.color - CSS color string\n * @param {string} options.layerSuffix - Layer suffix (e.g., 'osm', 'ne', 'osm-disp')\n * @param {Object<number, number>} options.lineWidthStops - Line width stops for this style\n * @param {number} [options.widthFraction=1.0] - Multiplier for base line width\n * @param {number[]} [options.dashArray] - Dash pattern for dashed lines\n * @param {number} [options.alpha=1.0] - Opacity (0-1)\n * @param {number} [options.startZoom=0] - Minimum zoom level for this style\n * @param {number} [options.endZoom=INFINITY] - Maximum zoom level for this style (INFINITY means no limit)\n * @param {number} [options.lineExtensionFactor=0.0] - Factor to extend lines by (multiplied by deletion line width)\n * @param {number} [options.delWidthFactor=1.5] - Factor to multiply line width for deletion blur\n */\n constructor({ color, layerSuffix, lineWidthStops, widthFraction = 1.0, dashArray, alpha = 1.0, startZoom = 0, endZoom = INFINITY, lineExtensionFactor = 0.0, delWidthFactor = 1.5 }) {\n this.color = color;\n this.layerSuffix = layerSuffix;\n this.lineWidthStops = lineWidthStops;\n this.widthFraction = widthFraction;\n this.dashArray = dashArray;\n this.alpha = alpha;\n this.startZoom = startZoom;\n this.endZoom = endZoom;\n this.lineExtensionFactor = lineExtensionFactor;\n this.delWidthFactor = delWidthFactor;\n }\n\n /**\n * Get base line width for this style at a given zoom level.\n * @param {number} zoom - Zoom level\n * @returns {number}\n */\n getLineWidth(zoom) {\n return interpolateLineWidth(zoom, this.lineWidthStops);\n }\n\n /**\n * Check if this style is active at the given zoom level.\n * @param {number} z - Zoom level\n * @returns {boolean}\n */\n isActiveAtZoom(z) {\n return z >= this.startZoom && (this.endZoom === INFINITY || z <= this.endZoom);\n }\n\n /**\n * Serialize to plain object.\n * @returns {Object}\n */\n toJSON() {\n return {\n color: this.color,\n layerSuffix: this.layerSuffix,\n lineWidthStops: this.lineWidthStops,\n widthFraction: this.widthFraction,\n dashArray: this.dashArray,\n alpha: this.alpha,\n startZoom: this.startZoom,\n endZoom: this.endZoom,\n lineExtensionFactor: this.lineExtensionFactor,\n delWidthFactor: this.delWidthFactor,\n };\n }\n\n /**\n * Create from plain object with validation.\n * @param {Object} obj\n * @param {number} [index] - Optional index for error messages\n * @returns {LineStyle}\n */\n static fromJSON(obj, index) {\n LineStyle.validateJSON(obj, index, true); // require lineWidthStops\n return new LineStyle(obj);\n }\n}\n\n/**\n * Base class for layer configurations\n * \n * Each lineStyle specifies which data layer to use via layerSuffix (e.g., 'osm', 'ne', 'osm-disp').\n * Layer names are derived as: to-add-{layerSuffix} and to-del-{layerSuffix}\n */\nexport class LayerConfig {\n /**\n * Validate a LayerConfig configuration object.\n * Also validates all lineStyles within the config.\n * @param {Object} obj - The object to validate\n * @throws {Error} If validation fails\n */\n static validateJSON(obj) {\n if (!obj || typeof obj !== 'object') {\n throw new Error('LayerConfig: must be an object');\n }\n \n // Validate id (required)\n if (!obj.id || typeof obj.id !== 'string') {\n throw new Error('LayerConfig: id must be a non-empty string');\n }\n if (obj.id.includes('/')) {\n throw new Error(`LayerConfig: id cannot contain slashes: \"${obj.id}\"`);\n }\n \n const id = obj.id;\n \n // Validate lineWidthStops (optional, but if provided must be valid)\n if (obj.lineWidthStops !== undefined) {\n if (!obj.lineWidthStops || typeof obj.lineWidthStops !== 'object' || Array.isArray(obj.lineWidthStops)) {\n throw new Error(`LayerConfig \"${id}\": lineWidthStops must be an object`);\n }\n const stopKeys = Object.keys(obj.lineWidthStops);\n if (stopKeys.length < 2) {\n throw new Error(`LayerConfig \"${id}\": lineWidthStops must have at least 2 entries`);\n }\n for (const key of stopKeys) {\n const zoom = Number(key);\n if (!Number.isInteger(zoom) || zoom < 0) {\n throw new Error(`LayerConfig \"${id}\": lineWidthStops keys must be non-negative integers, got \"${key}\"`);\n }\n if (typeof obj.lineWidthStops[key] !== 'number' || obj.lineWidthStops[key] <= 0) {\n throw new Error(`LayerConfig \"${id}\": lineWidthStops values must be positive numbers`);\n }\n }\n }\n \n // Validate lineStyles (required)\n if (!Array.isArray(obj.lineStyles) || obj.lineStyles.length === 0) {\n throw new Error(`LayerConfig \"${id}\": lineStyles must be a non-empty array`);\n }\n // Validate each lineStyle\n for (let i = 0; i < obj.lineStyles.length; i++) {\n LineStyle.validateJSON(obj.lineStyles[i], i);\n }\n }\n\n constructor({\n id,\n // Tile URL templates for matching (e.g., \"https://{s}.tile.example.com/{z}/{x}/{y}.png\")\n tileUrlTemplates = [],\n // Line width stops: map of zoom level to line width (at least 2 entries)\n // Note: interpolated/extrapolated line width is capped at a minimum of 0.5\n lineWidthStops = { 1: 0.5, 10: 2.5 },\n // Line styles array - each element describes a line to draw from a specific layer\n // { color: string, layerSuffix: string, widthFraction?: number, dashArray?: number[], \n // startZoom?: number, endZoom?: number, lineExtensionFactor?: number, delWidthFactor?: number }\n // Lines are drawn in array order. layerSuffix determines which PMTiles layer to use.\n lineStyles,\n }) {\n this.id = id;\n\n // Normalize to array\n const templates = Array.isArray(tileUrlTemplates) ? tileUrlTemplates : \n (tileUrlTemplates ? [tileUrlTemplates] : []);\n this.tileUrlTemplates = templates;\n \n // Pre-compile regex patterns for matching tile URLs (with actual coords)\n this._compiledPatterns = templates.map(t => templateToRegex(t));\n \n // Pre-compile regex patterns for matching template URLs (with {z}/{x}/{y} placeholders)\n this._templatePatterns = templates.map(t => templateToTemplateRegex(t));\n\n this.lineWidthStops = lineWidthStops;\n \n // Convert to LineStyle instances, inheriting lineWidthStops from config if not specified\n this.lineStyles = lineStyles.map(style => {\n if (style instanceof LineStyle) {\n return style;\n }\n // If style doesn't have lineWidthStops, use the config's lineWidthStops\n const styleWithStops = style.lineWidthStops ? style : { ...style, lineWidthStops };\n return new LineStyle(styleWithStops);\n });\n }\n\n /**\n * Get line styles active at a given zoom level\n * @param {number} z - Zoom level\n * @returns {LineStyle[]}\n */\n getLineStylesForZoom(z) {\n return this.lineStyles.filter(style => style.isActiveAtZoom(z));\n }\n\n /**\n * Get unique layer suffixes from styles active at a given zoom level\n * @param {number} z - Zoom level\n * @returns {string[]}\n */\n getLayerSuffixesForZoom(z) {\n const activeStyles = this.getLineStylesForZoom(z);\n return [...new Set(activeStyles.map(s => s.layerSuffix))];\n }\n\n /**\n * Check if this config matches the given template URLs (with {z}/{x}/{y} placeholders)\n * @param {string | string[]} templates - Single template URL or array of template URLs\n * @returns {boolean}\n */\n matchTemplate(templates) {\n if (this._templatePatterns.length === 0) return false;\n \n const urls = Array.isArray(templates) ? templates : [templates];\n if (urls.length === 0) return false;\n \n return urls.some(url => \n this._templatePatterns.some(pattern => pattern.test(url))\n );\n }\n\n /**\n * Check if this config matches the given tile URLs (with actual coordinates)\n * @param {string | string[]} tiles - Single tile URL or array of tile URLs\n * @returns {boolean}\n */\n matchTileUrl(tiles) {\n if (this._compiledPatterns.length === 0) return false;\n \n const urls = Array.isArray(tiles) ? tiles : [tiles];\n if (urls.length === 0) return false;\n \n return urls.some(url => \n this._compiledPatterns.some(({ pattern }) => pattern.test(url))\n );\n }\n\n /**\n * Extract tile coordinates (z, x, y) from a URL using this config's templates\n * @param {string} url - Tile URL to extract coordinates from\n * @returns {{ z: number, x: number, y: number } | null}\n */\n extractCoords(url) {\n for (const { pattern, groups } of this._compiledPatterns) {\n const match = url.match(pattern);\n if (match) {\n const result = {};\n for (let i = 0; i < groups.length; i++) {\n const name = groups[i];\n const value = match[i + 1];\n if (name === 'z' || name === 'x' || name === 'y') {\n result[name] = parseInt(value, 10);\n }\n }\n if ('z' in result && 'x' in result && 'y' in result) {\n return { z: result.z, x: result.x, y: result.y };\n }\n }\n }\n return null;\n }\n\n /**\n * Serialize the config to a plain object for postMessage\n * @returns {Object}\n */\n toJSON() {\n return {\n id: this.id,\n tileUrlTemplates: this.tileUrlTemplates,\n lineWidthStops: this.lineWidthStops,\n lineStyles: this.lineStyles.map(s => s.toJSON()),\n };\n }\n\n /**\n * Create a LayerConfig from a plain object with validation.\n * @param {Object} obj\n * @returns {LayerConfig}\n * @throws {Error} If validation fails\n */\n static fromJSON(obj) {\n LayerConfig.validateJSON(obj);\n return new LayerConfig(obj);\n }\n}\n\nexport default LayerConfig;\n"],"mappings":"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","names":[]}
package/dist/index.js CHANGED
@@ -98,7 +98,9 @@ var configs_default = [
98
98
  id: "open-topo",
99
99
  tileUrlTemplates: [
100
100
  "https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png",
101
- "https://tile.opentopomap.org/{z}/{x}/{y}.png"
101
+ "https://tile.opentopomap.org/{z}/{x}/{y}.png",
102
+ "https://{s}.tile.top-o-map.de/{z}/{x}/{y}.png",
103
+ "https://tile.top-o-map.de/{z}/{x}/{y}.png"
102
104
  ],
103
105
  lineWidthStops: { "4": 0.75, "5": 1, "6": 1.25, "7": 1.5, "8": 1.75, "9": 1.25, "10": 1.25, "13": 1.5 },
104
106
  lineStyles: [
@@ -118,9 +120,8 @@ var configs_default = [
118
120
  "https://tile.openstreetmap.org/{z}/{x}/{y}.png",
119
121
  "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
120
122
  ],
121
- lineWidthStops: { "1": 0.5, "2": 0.6, "3": 0.7, "4": 1, "10": 3.75 },
123
+ lineWidthStops: { "3": 0.7, "4": 1, "10": 3.75 },
122
124
  lineStyles: [
123
- { color: "rgb(200, 180, 200)", layerSuffix: "osm", startZoom: 1, endZoom: 3, delWidthFactor: 2.5, widthFraction: 1.5 },
124
125
  { color: "rgb(200, 180, 200)", layerSuffix: "osm", startZoom: 4, delWidthFactor: 1.5 },
125
126
  { color: "rgb(160, 120, 160)", layerSuffix: "osm", startZoom: 4, widthFraction: 0.333, dashArray: [30, 2, 8, 2], delWidthFactor: 0 },
126
127
  { color: "rgb(200, 180, 200)", layerSuffix: "osm-internal", startZoom: 4, widthFraction: 0.45 },
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/configs.json","../src/layerconfig.js","../src/index.js"],"sourcesContent":["[\n {\n \"id\": \"cartodb-dark\",\n \"tileUrlTemplates\": [\n \"https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png\",\n \"https://basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png\",\n \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/dark_all/{z}/{x}/{y}.png\",\n \"https://{s}.basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}.png\",\n \"https://basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}.png\",\n \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/dark_nolabels/{z}/{x}/{y}.png\"\n ],\n \"lineWidthStops\": { \"0\": 1.0, \"2\": 1.0, \"3\": 1.0, \"10\": 2.0, \"12\": 2.0 },\n \"lineStyles\": [\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"ne\", \"endZoom\": 4 },\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"ne-disp\", \"endZoom\": 4 },\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"osm\", \"startZoom\": 5 },\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"osm-disp\", \"startZoom\": 5 },\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 5, \"widthFraction\": 0.3, \"dashArray\": [2, 2], \"delWidthFactor\": 2.0 },\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"ne-internal\", \"startZoom\": 4, \"endZoom\": 4, \"widthFraction\": 0.3, \"dashArray\": [2, 2], \"delWidthFactor\": 3.0 }\n ]\n },\n {\n \"id\": \"cartodb-dark-retina\",\n \"tileUrlTemplates\": [\n \"https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png\",\n \"https://basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png\",\n \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/dark_all/{z}/{x}/{y}{r}.png\",\n \"https://{s}.basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}{r}.png\",\n \"https://basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}{r}.png\",\n \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/dark_nolabels/{z}/{x}/{y}{r}.png\"\n ],\n \"lineWidthStops\": { \"0\": 1.5, \"2\": 1.5, \"3\": 1.5, \"6\": 2.5, \"10\": 3.0 },\n \"lineStyles\": [\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"ne\", \"endZoom\": 4 },\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"ne-disp\", \"endZoom\": 4 },\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"osm\", \"startZoom\": 5 },\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"osm-disp\", \"startZoom\": 5 },\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 5, \"widthFraction\": 0.3, \"dashArray\": [4, 4], \"delWidthFactor\": 2.0 },\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"ne-internal\", \"startZoom\": 4, \"endZoom\": 4, \"widthFraction\": 0.3, \"dashArray\": [4, 4], \"delWidthFactor\": 3.0 }\n ]\n },\n {\n \"id\": \"cartodb-light\",\n \"tileUrlTemplates\": [\n \"https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png\",\n \"https://basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png\",\n \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_all/{z}/{x}/{y}.png\",\n \"https://{s}.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}.png\",\n \"https://basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}.png\",\n \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_nolabels/{z}/{x}/{y}.png\",\n \"https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png\",\n \"https://basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png\",\n \"https://{s}.basemaps.cartocdn.com/rastertiles/voyager_nolabels/{z}/{x}/{y}.png\",\n \"https://basemaps.cartocdn.com/rastertiles/voyager_nolabels/{z}/{x}/{y}.png\",\n \"https://{s}.basemaps.cartocdn.com/rastertiles/voyager_labels_under/{z}/{x}/{y}.png\",\n \"https://basemaps.cartocdn.com/rastertiles/voyager_labels_under/{z}/{x}/{y}.png\"\n ],\n \"lineWidthStops\": { \"1\": 0.5, \"2\": 0.75, \"3\": 0.75, \"4\": 1.0, \"5\": 1.0, \"7\": 1.75, \"16\": 2.5 },\n \"lineStyles\": [\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"ne\", \"endZoom\": 4, \"lineExtensionFactor\": 0.1, \"delWidthFactor\": 2.5 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"ne-disp\", \"endZoom\": 4, \"delWidthFactor\": 0 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm\", \"alpha\": 0.1, \"startZoom\": 6, \"lineWidthStops\": { \"6\": 9, \"10\": 8, \"14\": 8 }, \"lineExtensionFactor\": 0.1 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm\", \"startZoom\": 5, \"lineExtensionFactor\": 0.1 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm-disp\", \"startZoom\": 5, \"delWidthFactor\": 0 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 5, \"widthFraction\": 0.5, \"dashArray\": [2, 2], \"delWidthFactor\": 2.0 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"ne-internal\", \"startZoom\": 4, \"endZoom\": 4, \"widthFraction\": 0.5, \"dashArray\": [2, 2], \"delWidthFactor\": 2.5 }\n ]\n },\n {\n \"id\": \"cartodb-light-retina\",\n \"tileUrlTemplates\": [\n \"https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}{r}.png\",\n \"https://basemaps.cartocdn.com/light_all/{z}/{x}/{y}{r}.png\",\n \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_all/{z}/{x}/{y}{r}.png\",\n \"https://{s}.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}{r}.png\",\n \"https://basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}{r}.png\",\n \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_nolabels/{z}/{x}/{y}{r}.png\",\n \"https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}{r}.png\",\n \"https://basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}{r}.png\",\n \"https://{s}.basemaps.cartocdn.com/rastertiles/voyager_nolabels/{z}/{x}/{y}{r}.png\",\n \"https://basemaps.cartocdn.com/rastertiles/voyager_nolabels/{z}/{x}/{y}{r}.png\",\n \"https://{s}.basemaps.cartocdn.com/rastertiles/voyager_labels_under/{z}/{x}/{y}{r}.png\",\n \"https://basemaps.cartocdn.com/rastertiles/voyager_labels_under/{z}/{x}/{y}{r}.png\"\n ],\n \"lineWidthStops\": { \"1\": 1.0, \"3\": 1.0, \"4\": 2.0, \"5\": 2.0, \"6\": 2.5, \"7\": 3.0, \"8\": 3.0, \"10\": 4.0, \"11\": 4.0, \"12\": 4.0 },\n \"lineStyles\": [\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"ne\", \"endZoom\": 4, \"lineExtensionFactor\": 0.1, \"delWidthFactor\": 2.5 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"ne-disp\", \"endZoom\": 4, \"delWidthFactor\": 0 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm\", \"alpha\": 0.1, \"startZoom\": 6, \"lineWidthStops\": { \"6\": 20, \"8\": 19, \"10\": 18, \"12\": 17 }, \"lineExtensionFactor\": 0.1 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm\", \"startZoom\": 5, \"lineExtensionFactor\": 0.1 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm-disp\", \"startZoom\": 5, \"delWidthFactor\": 0 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 5, \"widthFraction\": 0.5, \"dashArray\": [4, 4], \"delWidthFactor\": 2.0 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"ne-internal\", \"startZoom\": 4, \"endZoom\": 4, \"widthFraction\": 0.5, \"dashArray\": [4, 4], \"delWidthFactor\": 2.5 }\n ]\n },\n {\n \"id\": \"open-topo\",\n \"tileUrlTemplates\": [\n \"https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png\",\n \"https://tile.opentopomap.org/{z}/{x}/{y}.png\"\n ],\n \"lineWidthStops\": { \"4\": 0.75, \"5\": 1.0, \"6\": 1.25, \"7\": 1.5, \"8\": 1.75, \"9\": 1.25, \"10\": 1.25, \"13\": 1.5 },\n \"lineStyles\": [\n { \"color\": \"rgb(83, 83, 83)\", \"layerSuffix\": \"ne\", \"startZoom\": 4, \"endZoom\": 6 },\n { \"color\": \"rgb(173, 173, 173)\", \"layerSuffix\": \"osm\", \"startZoom\": 7, \"endZoom\": 8, \"alpha\": 0.5, \"widthFraction\": 4 },\n { \"color\": \"rgb(83, 83, 83)\", \"layerSuffix\": \"osm\", \"startZoom\": 7, \"endZoom\": 8 },\n { \"color\": \"rgb(83, 83, 83)\", \"layerSuffix\": \"osm-internal\", \"widthFraction\": 0.75, \"startZoom\": 7, \"endZoom\": 8 },\n { \"color\": \"rgb(199, 158, 204)\", \"layerSuffix\": \"osm\", \"startZoom\": 9, \"widthFraction\": 7, \"alpha\": 0.6, \"lineExtensionFactor\": 0.2 },\n { \"color\": \"rgb(175, 41, 203)\", \"layerSuffix\": \"osm\", \"startZoom\": 9, \"lineExtensionFactor\": 0.2 },\n { \"color\": \"rgb(199, 158, 204)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 9, \"widthFraction\": 2.25, \"alpha\": 0.6, \"lineExtensionFactor\": 0.2 },\n { \"color\": \"rgb(175, 41, 203)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 9, \"widthFactor\": 0.75, \"lineExtensionFactor\": 0.2 }\n ]\n },\n {\n \"id\": \"osm-carto\",\n \"tileUrlTemplates\": [\n \"https://tile.openstreetmap.org/{z}/{x}/{y}.png\",\n \"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\"\n ],\n \"lineWidthStops\": { \"1\": 0.5, \"2\": 0.6, \"3\": 0.7, \"4\": 1.0, \"10\": 3.75 },\n \"lineStyles\": [\n { \"color\": \"rgb(200, 180, 200)\", \"layerSuffix\": \"osm\", \"startZoom\": 1, \"endZoom\": 3, \"delWidthFactor\": 2.5, \"widthFraction\": 1.5 },\n { \"color\": \"rgb(200, 180, 200)\", \"layerSuffix\": \"osm\", \"startZoom\": 4, \"delWidthFactor\": 1.5 },\n { \"color\": \"rgb(160, 120, 160)\", \"layerSuffix\": \"osm\", \"startZoom\": 4, \"widthFraction\": 0.333, \"dashArray\": [30, 2, 8, 2], \"delWidthFactor\": 0 },\n { \"color\": \"rgb(200, 180, 200)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 4, \"widthFraction\": 0.45 },\n { \"color\": \"rgb(160, 120, 160)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 4, \"widthFraction\": 0.15, \"dashArray\": [10, 4, 2] }\n ]\n },\n {\n \"id\": \"osm-hot\",\n \"tileUrlTemplates\": [\n \"https://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png\",\n \"https://tile.openstreetmap.fr/hot/{z}/{x}/{y}.png\"\n ],\n \"lineWidthStops\": { \"2\": 3.0, \"3\": 3.0, \"7\": 3.0, \"8\": 3.5, \"9\": 3.5 },\n \"lineStyles\": [\n { \"color\": \"rgb(149, 175, 180)\", \"layerSuffix\": \"osm\", \"lineExtensionFactor\": 0.25, \"startZoom\": 2 },\n { \"color\": \"rgb(89, 117, 123)\", \"layerSuffix\": \"osm\", \"widthFraction\": 0.33, \"lineExtensionFactor\": 0.25, \"startZoom\": 2 },\n { \"color\": \"rgb(172, 163, 163)\", \"layerSuffix\": \"osm-internal\", \"widthFraction\": 0.33, \"startZoom\": 4, \"dashArray\": [7, 7] }\n ]\n }\n]\n","/**\n * Constant representing no zoom limit (used for endZoom).\n * Using -1 instead of Infinity for JSON serialization compatibility.\n */\nexport const INFINITY = -1;\n\n/**\n * Minimum line width used when extrapolating below the lowest zoom stop.\n */\nexport const MIN_LINE_WIDTH = 0.1;\n\n/**\n * Default fallback line width if interpolation fails.\n */\nconst DEFAULT_LINE_WIDTH = 1;\n\n/**\n * Interpolate or extrapolate line width for a given zoom level.\n * Uses a lineWidthStops map to calculate the appropriate width.\n * @param {number} zoom - Zoom level\n * @param {Object<number, number>} lineWidthStops - Map of zoom level to line width (at least 2 entries)\n * @returns {number}\n */\nexport function interpolateLineWidth(zoom, lineWidthStops) {\n const zooms = Object.keys(lineWidthStops).map(Number).sort((a, b) => a - b);\n \n // Exact match\n if (lineWidthStops[zoom] !== undefined) {\n return lineWidthStops[zoom];\n }\n \n // Below lowest zoom - extrapolate\n if (zoom < zooms[0]) {\n const z1 = zooms[0];\n const z2 = zooms[1];\n const w1 = lineWidthStops[z1];\n const w2 = lineWidthStops[z2];\n const slope = (w2 - w1) / (z2 - z1);\n return Math.max(MIN_LINE_WIDTH, w1 + slope * (zoom - z1));\n }\n \n // Above highest zoom - extrapolate\n if (zoom > zooms[zooms.length - 1]) {\n const z1 = zooms[zooms.length - 2];\n const z2 = zooms[zooms.length - 1];\n const w1 = lineWidthStops[z1];\n const w2 = lineWidthStops[z2];\n const slope = (w2 - w1) / (z2 - z1);\n return Math.max(MIN_LINE_WIDTH, w2 + slope * (zoom - z2));\n }\n \n // Interpolate between two stops\n for (let i = 0; i < zooms.length - 1; i++) {\n if (zoom > zooms[i] && zoom < zooms[i + 1]) {\n const z1 = zooms[i];\n const z2 = zooms[i + 1];\n const w1 = lineWidthStops[z1];\n const w2 = lineWidthStops[z2];\n const t = (zoom - z1) / (z2 - z1);\n return w1 + t * (w2 - w1);\n }\n }\n \n return DEFAULT_LINE_WIDTH; // fallback\n}\n\n/**\n * Convert a tile URL template to a regex pattern and capture group names.\n * Supports {z}, {x}, {y}, {s} (Leaflet subdomain), {a-c}/{1-4} (OpenLayers subdomain), and {r} (retina) placeholders.\n * @param {string} template - URL template like \"https://{s}.tile.example.com/{z}/{x}/{y}.png\"\n * @returns {{ pattern: RegExp, groups: string[] }}\n */\nfunction templateToRegex(template) {\n const groups = [];\n const hasRetina = template.includes('{r}');\n const hasExtension = /\\.(png|jpg|jpeg|webp|gif)$/i.test(template);\n \n // Escape regex special chars, then replace placeholders\n let pattern = template\n .replace(/[.*+?^${}()|[\\]\\\\]/g, (char) => {\n // Don't escape our placeholders\n if (char === '{' || char === '}') return char;\n return '\\\\' + char;\n })\n // Make protocol flexible (http/https)\n .replace(/^https:\\/\\//, 'https?://')\n .replace(/^http:\\/\\//, 'https?://')\n // Handle {a-c} or {1-4} etc (OpenLayers style subdomain)\n .replace(/\\{[a-z0-9]-[a-z0-9]\\}/gi, () => {\n groups.push('s');\n return '([a-z0-9]+)';\n })\n .replace(/\\{(z|x|y|s|r)\\}/gi, (_, name) => {\n const lowerName = name.toLowerCase();\n groups.push(lowerName);\n if (lowerName === 's') {\n // Subdomain: single letter or short string\n return '([a-z0-9]+)';\n }\n if (lowerName === 'r') {\n // Retina suffix: required @2x or similar (must be present for retina configs)\n return '(@\\\\d+x)';\n }\n // z, x, y: numeric\n return '(\\\\d+)';\n });\n \n // If template has no {r} placeholder, ensure we DON'T match retina URLs\n if (!hasRetina) {\n if (hasExtension) {\n // Insert negative lookahead before .png/.jpg/.webp etc\n pattern = pattern.replace(/(\\\\\\.(png|jpg|jpeg|webp|gif))/, '(?!@\\\\d+x)$1');\n } else {\n // No extension - add negative lookahead at the end (before query string)\n pattern = pattern + '(?!@\\\\d+x)';\n }\n }\n \n // Allow optional query string at end\n return { pattern: new RegExp('^' + pattern + '(\\\\?.*)?$', 'i'), groups };\n}\n\n/**\n * Convert a tile URL template to a regex that matches the template itself.\n * @param {string} template - URL template like \"https://{s}.tile.example.com/{z}/{x}/{y}.png\"\n * @returns {RegExp}\n */\nfunction templateToTemplateRegex(template) {\n const hasRetina = template.includes('{r}');\n const hasExtension = /\\.(png|jpg|jpeg|webp|gif)$/i.test(template);\n \n // Escape regex special chars, then replace placeholders with literal match\n let pattern = template\n .replace(/[.*+?^${}()|[\\]\\\\]/g, (char) => {\n if (char === '{' || char === '}') return char;\n return '\\\\' + char;\n })\n // Make protocol flexible (http/https)\n .replace(/^https:\\/\\//, 'https?://')\n .replace(/^http:\\/\\//, 'https?://')\n // Handle {a-c} or {1-4} (OpenLayers style subdomain)\n .replace(/\\{([a-z0-9])-([a-z0-9])\\}/gi, (_, start, end) => `(\\\\{${start}-${end}\\\\}|\\\\{s\\\\}|[a-z0-9]+)`)\n .replace(/\\{(z|x|y|s|r)\\}/gi, (_, name) => {\n const lowerName = name.toLowerCase();\n if (lowerName === 's') {\n // Match {s} placeholder, {a-c} style placeholder, or actual subdomain\n return '(\\\\{s\\\\}|\\\\{[a-z0-9]-[a-z0-9]\\\\}|[a-z0-9]+)';\n }\n if (lowerName === 'r') {\n // Match {r} placeholder or actual retina suffix (required for retina configs)\n return '(\\\\{r\\\\}|@\\\\d+x)';\n }\n // Match {z}, {x}, {y} placeholders\n return `\\\\{${lowerName}\\\\}`;\n });\n \n // If template has no {r} placeholder, ensure we DON'T match retina URLs/templates\n if (!hasRetina) {\n if (hasExtension) {\n // Insert negative lookahead before .png/.jpg/.webp etc to reject @2x and {r}\n pattern = pattern.replace(/(\\\\\\.(png|jpg|jpeg|webp|gif))/, '(?!@\\\\d+x|\\\\{r\\\\})$1');\n } else {\n // No extension - add negative lookahead at the end (before query string)\n pattern = pattern + '(?!@\\\\d+x|\\\\{r\\\\})';\n }\n }\n \n // Allow optional query string at end\n return new RegExp('^' + pattern + '(\\\\?.*)?$', 'i');\n}\n\n/**\n * Check if a string is a valid CSS color using the browser's CSS parser.\n * Falls back to a basic regex check in non-browser environments.\n * @param {string} color\n * @returns {boolean}\n */\nfunction isValidColor(color) {\n if (typeof color !== 'string' || !color.trim()) return false;\n \n // Use CSS.supports if available (modern browsers)\n if (typeof CSS !== 'undefined' && CSS.supports) {\n return CSS.supports('color', color);\n }\n \n // Fallback: basic validation for common formats\n const trimmed = color.trim().toLowerCase();\n // Hex colors\n if (/^#([0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/.test(trimmed)) return true;\n // rgb/rgba/hsl/hsla functions\n if (/^(rgb|hsl)a?\\(/.test(trimmed)) return true;\n // Named colors (just check it's alphabetic)\n if (/^[a-z]+$/.test(trimmed)) return true;\n return false;\n}\n\n/**\n * Validate lineWidthStops object.\n * @param {Object} lineWidthStops - The lineWidthStops to validate\n * @param {string} prefix - Error message prefix\n * @throws {Error} If validation fails\n */\nfunction validateLineWidthStops(lineWidthStops, prefix) {\n if (!lineWidthStops || typeof lineWidthStops !== 'object' || Array.isArray(lineWidthStops)) {\n throw new Error(`${prefix}: lineWidthStops must be an object`);\n }\n const stopKeys = Object.keys(lineWidthStops);\n if (stopKeys.length < 2) {\n throw new Error(`${prefix}: lineWidthStops must have at least 2 entries`);\n }\n for (const key of stopKeys) {\n const zoom = Number(key);\n if (!Number.isInteger(zoom) || zoom < 0) {\n throw new Error(`${prefix}: lineWidthStops keys must be non-negative integers, got \"${key}\"`);\n }\n if (typeof lineWidthStops[key] !== 'number' || lineWidthStops[key] <= 0) {\n throw new Error(`${prefix}: lineWidthStops values must be positive numbers`);\n }\n }\n}\n\n/**\n * Represents a line style for drawing boundaries.\n */\nexport class LineStyle {\n /**\n * Validate a LineStyle configuration object.\n * @param {Object} obj - The object to validate\n * @param {number} [index] - Optional index for error messages (when validating in an array)\n * @param {boolean} [requireLineWidthStops=false] - Whether lineWidthStops is required\n * @throws {Error} If validation fails\n */\n static validateJSON(obj, index, requireLineWidthStops = false) {\n const prefix = index !== undefined ? `lineStyles[${index}]` : 'LineStyle';\n \n if (!obj || typeof obj !== 'object') {\n throw new Error(`${prefix}: must be an object`);\n }\n \n if (!obj.color || typeof obj.color !== 'string') {\n throw new Error(`${prefix}: color must be a non-empty string`);\n }\n \n if (!isValidColor(obj.color)) {\n throw new Error(`${prefix}: color \"${obj.color}\" is not a valid CSS color`);\n }\n \n if (!obj.layerSuffix || typeof obj.layerSuffix !== 'string') {\n throw new Error(`${prefix}: layerSuffix must be a non-empty string`);\n }\n \n if (obj.widthFraction !== undefined && (typeof obj.widthFraction !== 'number' || obj.widthFraction <= 0)) {\n throw new Error(`${prefix}: widthFraction must be a positive number`);\n }\n \n if (obj.dashArray !== undefined && !Array.isArray(obj.dashArray)) {\n throw new Error(`${prefix}: dashArray must be an array`);\n }\n \n if (obj.alpha !== undefined && (typeof obj.alpha !== 'number' || obj.alpha < 0 || obj.alpha > 1)) {\n throw new Error(`${prefix}: alpha must be a number between 0 and 1`);\n }\n \n if (obj.startZoom !== undefined && (typeof obj.startZoom !== 'number' || obj.startZoom < 0)) {\n throw new Error(`${prefix}: startZoom must be a non-negative number`);\n }\n \n if (obj.endZoom !== undefined && (typeof obj.endZoom !== 'number' || (obj.endZoom < 0 && obj.endZoom !== INFINITY))) {\n throw new Error(`${prefix}: endZoom must be a non-negative number or INFINITY (${INFINITY})`);\n }\n \n if (obj.lineExtensionFactor !== undefined && (typeof obj.lineExtensionFactor !== 'number' || obj.lineExtensionFactor < 0)) {\n throw new Error(`${prefix}: lineExtensionFactor must be a non-negative number`);\n }\n \n if (obj.delWidthFactor !== undefined && (typeof obj.delWidthFactor !== 'number' || obj.delWidthFactor < 0)) {\n throw new Error(`${prefix}: delWidthFactor must be a non-negative number`);\n }\n \n if (requireLineWidthStops && obj.lineWidthStops === undefined) {\n throw new Error(`${prefix}: lineWidthStops is required`);\n }\n \n if (obj.lineWidthStops !== undefined) {\n validateLineWidthStops(obj.lineWidthStops, prefix);\n }\n }\n\n /**\n * @param {Object} options\n * @param {string} options.color - CSS color string\n * @param {string} options.layerSuffix - Layer suffix (e.g., 'osm', 'ne', 'osm-disp')\n * @param {Object<number, number>} options.lineWidthStops - Line width stops for this style\n * @param {number} [options.widthFraction=1.0] - Multiplier for base line width\n * @param {number[]} [options.dashArray] - Dash pattern for dashed lines\n * @param {number} [options.alpha=1.0] - Opacity (0-1)\n * @param {number} [options.startZoom=0] - Minimum zoom level for this style\n * @param {number} [options.endZoom=INFINITY] - Maximum zoom level for this style (INFINITY means no limit)\n * @param {number} [options.lineExtensionFactor=0.0] - Factor to extend lines by (multiplied by deletion line width)\n * @param {number} [options.delWidthFactor=1.5] - Factor to multiply line width for deletion blur\n */\n constructor({ color, layerSuffix, lineWidthStops, widthFraction = 1.0, dashArray, alpha = 1.0, startZoom = 0, endZoom = INFINITY, lineExtensionFactor = 0.0, delWidthFactor = 1.5 }) {\n this.color = color;\n this.layerSuffix = layerSuffix;\n this.lineWidthStops = lineWidthStops;\n this.widthFraction = widthFraction;\n this.dashArray = dashArray;\n this.alpha = alpha;\n this.startZoom = startZoom;\n this.endZoom = endZoom;\n this.lineExtensionFactor = lineExtensionFactor;\n this.delWidthFactor = delWidthFactor;\n }\n\n /**\n * Get base line width for this style at a given zoom level.\n * @param {number} zoom - Zoom level\n * @returns {number}\n */\n getLineWidth(zoom) {\n return interpolateLineWidth(zoom, this.lineWidthStops);\n }\n\n /**\n * Check if this style is active at the given zoom level.\n * @param {number} z - Zoom level\n * @returns {boolean}\n */\n isActiveAtZoom(z) {\n return z >= this.startZoom && (this.endZoom === INFINITY || z <= this.endZoom);\n }\n\n /**\n * Serialize to plain object.\n * @returns {Object}\n */\n toJSON() {\n return {\n color: this.color,\n layerSuffix: this.layerSuffix,\n lineWidthStops: this.lineWidthStops,\n widthFraction: this.widthFraction,\n dashArray: this.dashArray,\n alpha: this.alpha,\n startZoom: this.startZoom,\n endZoom: this.endZoom,\n lineExtensionFactor: this.lineExtensionFactor,\n delWidthFactor: this.delWidthFactor,\n };\n }\n\n /**\n * Create from plain object with validation.\n * @param {Object} obj\n * @param {number} [index] - Optional index for error messages\n * @returns {LineStyle}\n */\n static fromJSON(obj, index) {\n LineStyle.validateJSON(obj, index, true); // require lineWidthStops\n return new LineStyle(obj);\n }\n}\n\n/**\n * Base class for layer configurations\n * \n * Each lineStyle specifies which data layer to use via layerSuffix (e.g., 'osm', 'ne', 'osm-disp').\n * Layer names are derived as: to-add-{layerSuffix} and to-del-{layerSuffix}\n */\nexport class LayerConfig {\n /**\n * Validate a LayerConfig configuration object.\n * Also validates all lineStyles within the config.\n * @param {Object} obj - The object to validate\n * @throws {Error} If validation fails\n */\n static validateJSON(obj) {\n if (!obj || typeof obj !== 'object') {\n throw new Error('LayerConfig: must be an object');\n }\n \n // Validate id (required)\n if (!obj.id || typeof obj.id !== 'string') {\n throw new Error('LayerConfig: id must be a non-empty string');\n }\n if (obj.id.includes('/')) {\n throw new Error(`LayerConfig: id cannot contain slashes: \"${obj.id}\"`);\n }\n \n const id = obj.id;\n \n // Validate lineWidthStops (optional, but if provided must be valid)\n if (obj.lineWidthStops !== undefined) {\n if (!obj.lineWidthStops || typeof obj.lineWidthStops !== 'object' || Array.isArray(obj.lineWidthStops)) {\n throw new Error(`LayerConfig \"${id}\": lineWidthStops must be an object`);\n }\n const stopKeys = Object.keys(obj.lineWidthStops);\n if (stopKeys.length < 2) {\n throw new Error(`LayerConfig \"${id}\": lineWidthStops must have at least 2 entries`);\n }\n for (const key of stopKeys) {\n const zoom = Number(key);\n if (!Number.isInteger(zoom) || zoom < 0) {\n throw new Error(`LayerConfig \"${id}\": lineWidthStops keys must be non-negative integers, got \"${key}\"`);\n }\n if (typeof obj.lineWidthStops[key] !== 'number' || obj.lineWidthStops[key] <= 0) {\n throw new Error(`LayerConfig \"${id}\": lineWidthStops values must be positive numbers`);\n }\n }\n }\n \n // Validate lineStyles (required)\n if (!Array.isArray(obj.lineStyles) || obj.lineStyles.length === 0) {\n throw new Error(`LayerConfig \"${id}\": lineStyles must be a non-empty array`);\n }\n // Validate each lineStyle\n for (let i = 0; i < obj.lineStyles.length; i++) {\n LineStyle.validateJSON(obj.lineStyles[i], i);\n }\n }\n\n constructor({\n id,\n // Tile URL templates for matching (e.g., \"https://{s}.tile.example.com/{z}/{x}/{y}.png\")\n tileUrlTemplates = [],\n // Line width stops: map of zoom level to line width (at least 2 entries)\n // Note: interpolated/extrapolated line width is capped at a minimum of 0.5\n lineWidthStops = { 1: 0.5, 10: 2.5 },\n // Line styles array - each element describes a line to draw from a specific layer\n // { color: string, layerSuffix: string, widthFraction?: number, dashArray?: number[], \n // startZoom?: number, endZoom?: number, lineExtensionFactor?: number, delWidthFactor?: number }\n // Lines are drawn in array order. layerSuffix determines which PMTiles layer to use.\n lineStyles,\n }) {\n this.id = id;\n\n // Normalize to array\n const templates = Array.isArray(tileUrlTemplates) ? tileUrlTemplates : \n (tileUrlTemplates ? [tileUrlTemplates] : []);\n this.tileUrlTemplates = templates;\n \n // Pre-compile regex patterns for matching tile URLs (with actual coords)\n this._compiledPatterns = templates.map(t => templateToRegex(t));\n \n // Pre-compile regex patterns for matching template URLs (with {z}/{x}/{y} placeholders)\n this._templatePatterns = templates.map(t => templateToTemplateRegex(t));\n\n this.lineWidthStops = lineWidthStops;\n \n // Convert to LineStyle instances, inheriting lineWidthStops from config if not specified\n this.lineStyles = lineStyles.map(style => {\n if (style instanceof LineStyle) {\n return style;\n }\n // If style doesn't have lineWidthStops, use the config's lineWidthStops\n const styleWithStops = style.lineWidthStops ? style : { ...style, lineWidthStops };\n return new LineStyle(styleWithStops);\n });\n }\n\n /**\n * Get line styles active at a given zoom level\n * @param {number} z - Zoom level\n * @returns {LineStyle[]}\n */\n getLineStylesForZoom(z) {\n return this.lineStyles.filter(style => style.isActiveAtZoom(z));\n }\n\n /**\n * Get unique layer suffixes from styles active at a given zoom level\n * @param {number} z - Zoom level\n * @returns {string[]}\n */\n getLayerSuffixesForZoom(z) {\n const activeStyles = this.getLineStylesForZoom(z);\n return [...new Set(activeStyles.map(s => s.layerSuffix))];\n }\n\n /**\n * Check if this config matches the given template URLs (with {z}/{x}/{y} placeholders)\n * @param {string | string[]} templates - Single template URL or array of template URLs\n * @returns {boolean}\n */\n matchTemplate(templates) {\n if (this._templatePatterns.length === 0) return false;\n \n const urls = Array.isArray(templates) ? templates : [templates];\n if (urls.length === 0) return false;\n \n return urls.some(url => \n this._templatePatterns.some(pattern => pattern.test(url))\n );\n }\n\n /**\n * Check if this config matches the given tile URLs (with actual coordinates)\n * @param {string | string[]} tiles - Single tile URL or array of tile URLs\n * @returns {boolean}\n */\n matchTileUrl(tiles) {\n if (this._compiledPatterns.length === 0) return false;\n \n const urls = Array.isArray(tiles) ? tiles : [tiles];\n if (urls.length === 0) return false;\n \n return urls.some(url => \n this._compiledPatterns.some(({ pattern }) => pattern.test(url))\n );\n }\n\n /**\n * Extract tile coordinates (z, x, y) from a URL using this config's templates\n * @param {string} url - Tile URL to extract coordinates from\n * @returns {{ z: number, x: number, y: number } | null}\n */\n extractCoords(url) {\n for (const { pattern, groups } of this._compiledPatterns) {\n const match = url.match(pattern);\n if (match) {\n const result = {};\n for (let i = 0; i < groups.length; i++) {\n const name = groups[i];\n const value = match[i + 1];\n if (name === 'z' || name === 'x' || name === 'y') {\n result[name] = parseInt(value, 10);\n }\n }\n if ('z' in result && 'x' in result && 'y' in result) {\n return { z: result.z, x: result.x, y: result.y };\n }\n }\n }\n return null;\n }\n\n /**\n * Serialize the config to a plain object for postMessage\n * @returns {Object}\n */\n toJSON() {\n return {\n id: this.id,\n tileUrlTemplates: this.tileUrlTemplates,\n lineWidthStops: this.lineWidthStops,\n lineStyles: this.lineStyles.map(s => s.toJSON()),\n };\n }\n\n /**\n * Create a LayerConfig from a plain object with validation.\n * @param {Object} obj\n * @returns {LayerConfig}\n * @throws {Error} If validation fails\n */\n static fromJSON(obj) {\n LayerConfig.validateJSON(obj);\n return new LayerConfig(obj);\n }\n}\n\nexport default LayerConfig;\n","import configsJson from './configs.json' with { type: 'json' };\nimport { LayerConfig, LineStyle, INFINITY, MIN_LINE_WIDTH, interpolateLineWidth } from './layerconfig.js';\n\nexport { LayerConfig, LineStyle, INFINITY, MIN_LINE_WIDTH, interpolateLineWidth } from './layerconfig.js';\n\n// Export raw configs for testing/inspection\nexport { configsJson };\n\n/**\n * Layer configuration registry\n */\nexport class LayerConfigRegistry {\n constructor() {\n this.registry = {};\n }\n\n /**\n * Get a layer config by id\n */\n get(id) {\n return this.registry[id];\n }\n\n /**\n * Register a new layer config\n */\n register(config) {\n this.registry[config.id] = config;\n }\n\n /**\n * Remove a layer config by id\n */\n remove(id) {\n if (!this.registry[id]) return false;\n delete this.registry[id];\n return true;\n }\n\n /**\n * Detect layer config from tile URL templates (with {z}/{x}/{y} placeholders)\n * @param {string | string[]} templates - Single template URL or array of template URLs\n */\n detectFromTemplates(templates) {\n if (!templates || (Array.isArray(templates) && templates.length === 0)) return undefined;\n \n for (const config of Object.values(this.registry)) {\n if (config.matchTemplate(templates)) {\n return config;\n }\n }\n \n return undefined;\n }\n\n /**\n * Detect layer config from actual tile URLs (with numeric coordinates)\n * @param {string | string[]} urls - Single tile URL or array of tile URLs\n */\n detectFromTileUrls(urls) {\n if (!urls || (Array.isArray(urls) && urls.length === 0)) return undefined;\n \n for (const config of Object.values(this.registry)) {\n if (config.matchTileUrl(urls)) {\n return config;\n }\n }\n \n return undefined;\n }\n\n /**\n * Get all available layer config ids\n */\n getAvailableIds() {\n return Object.keys(this.registry);\n }\n\n /**\n * Create a new registry with all configs from this registry plus extra configs.\n * @param {LayerConfig[]} extraLayerConfigs - Additional configs to add\n * @returns {LayerConfigRegistry} A new registry with merged configs\n */\n createMergedRegistry(extraLayerConfigs) {\n const registry = new LayerConfigRegistry();\n \n for (const id of this.getAvailableIds()) {\n registry.register(this.get(id));\n }\n \n if (extraLayerConfigs && extraLayerConfigs.length > 0) {\n for (const config of extraLayerConfigs) {\n registry.register(config);\n }\n }\n \n return registry;\n }\n\n /**\n * Parse a tile URL into its components: layer config and coordinates\n * @param {string} url - Tile URL to parse\n * @returns {{ layerConfig: LayerConfig, coords: { z: number, x: number, y: number } } | null}\n */\n parseTileUrl(url) {\n // Check if URL matches any layer config\n const layerConfig = this.detectFromTileUrls([url]);\n if (!layerConfig) return null;\n \n // Extract tile coordinates using the matched config\n const coords = layerConfig.extractCoords(url);\n if (!coords) return null;\n \n return { layerConfig, coords };\n }\n}\n\n// Default registry with built-in configs loaded from JSON\nexport const layerConfigs = new LayerConfigRegistry();\nfor (const configData of configsJson) {\n layerConfigs.register(new LayerConfig(configData));\n}\n\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/configs.json","../src/layerconfig.js","../src/index.js"],"sourcesContent":["[\n {\n \"id\": \"cartodb-dark\",\n \"tileUrlTemplates\": [\n \"https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png\",\n \"https://basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png\",\n \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/dark_all/{z}/{x}/{y}.png\",\n \"https://{s}.basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}.png\",\n \"https://basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}.png\",\n \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/dark_nolabels/{z}/{x}/{y}.png\"\n ],\n \"lineWidthStops\": { \"0\": 1.0, \"2\": 1.0, \"3\": 1.0, \"10\": 2.0, \"12\": 2.0 },\n \"lineStyles\": [\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"ne\", \"endZoom\": 4 },\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"ne-disp\", \"endZoom\": 4 },\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"osm\", \"startZoom\": 5 },\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"osm-disp\", \"startZoom\": 5 },\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 5, \"widthFraction\": 0.3, \"dashArray\": [2, 2], \"delWidthFactor\": 2.0 },\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"ne-internal\", \"startZoom\": 4, \"endZoom\": 4, \"widthFraction\": 0.3, \"dashArray\": [2, 2], \"delWidthFactor\": 3.0 }\n ]\n },\n {\n \"id\": \"cartodb-dark-retina\",\n \"tileUrlTemplates\": [\n \"https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png\",\n \"https://basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png\",\n \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/dark_all/{z}/{x}/{y}{r}.png\",\n \"https://{s}.basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}{r}.png\",\n \"https://basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}{r}.png\",\n \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/dark_nolabels/{z}/{x}/{y}{r}.png\"\n ],\n \"lineWidthStops\": { \"0\": 1.5, \"2\": 1.5, \"3\": 1.5, \"6\": 2.5, \"10\": 3.0 },\n \"lineStyles\": [\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"ne\", \"endZoom\": 4 },\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"ne-disp\", \"endZoom\": 4 },\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"osm\", \"startZoom\": 5 },\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"osm-disp\", \"startZoom\": 5 },\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 5, \"widthFraction\": 0.3, \"dashArray\": [4, 4], \"delWidthFactor\": 2.0 },\n { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"ne-internal\", \"startZoom\": 4, \"endZoom\": 4, \"widthFraction\": 0.3, \"dashArray\": [4, 4], \"delWidthFactor\": 3.0 }\n ]\n },\n {\n \"id\": \"cartodb-light\",\n \"tileUrlTemplates\": [\n \"https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png\",\n \"https://basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png\",\n \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_all/{z}/{x}/{y}.png\",\n \"https://{s}.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}.png\",\n \"https://basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}.png\",\n \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_nolabels/{z}/{x}/{y}.png\",\n \"https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png\",\n \"https://basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png\",\n \"https://{s}.basemaps.cartocdn.com/rastertiles/voyager_nolabels/{z}/{x}/{y}.png\",\n \"https://basemaps.cartocdn.com/rastertiles/voyager_nolabels/{z}/{x}/{y}.png\",\n \"https://{s}.basemaps.cartocdn.com/rastertiles/voyager_labels_under/{z}/{x}/{y}.png\",\n \"https://basemaps.cartocdn.com/rastertiles/voyager_labels_under/{z}/{x}/{y}.png\"\n ],\n \"lineWidthStops\": { \"1\": 0.5, \"2\": 0.75, \"3\": 0.75, \"4\": 1.0, \"5\": 1.0, \"7\": 1.75, \"16\": 2.5 },\n \"lineStyles\": [\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"ne\", \"endZoom\": 4, \"lineExtensionFactor\": 0.1, \"delWidthFactor\": 2.5 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"ne-disp\", \"endZoom\": 4, \"delWidthFactor\": 0 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm\", \"alpha\": 0.1, \"startZoom\": 6, \"lineWidthStops\": { \"6\": 9, \"10\": 8, \"14\": 8 }, \"lineExtensionFactor\": 0.1 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm\", \"startZoom\": 5, \"lineExtensionFactor\": 0.1 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm-disp\", \"startZoom\": 5, \"delWidthFactor\": 0 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 5, \"widthFraction\": 0.5, \"dashArray\": [2, 2], \"delWidthFactor\": 2.0 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"ne-internal\", \"startZoom\": 4, \"endZoom\": 4, \"widthFraction\": 0.5, \"dashArray\": [2, 2], \"delWidthFactor\": 2.5 }\n ]\n },\n {\n \"id\": \"cartodb-light-retina\",\n \"tileUrlTemplates\": [\n \"https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}{r}.png\",\n \"https://basemaps.cartocdn.com/light_all/{z}/{x}/{y}{r}.png\",\n \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_all/{z}/{x}/{y}{r}.png\",\n \"https://{s}.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}{r}.png\",\n \"https://basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}{r}.png\",\n \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_nolabels/{z}/{x}/{y}{r}.png\",\n \"https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}{r}.png\",\n \"https://basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}{r}.png\",\n \"https://{s}.basemaps.cartocdn.com/rastertiles/voyager_nolabels/{z}/{x}/{y}{r}.png\",\n \"https://basemaps.cartocdn.com/rastertiles/voyager_nolabels/{z}/{x}/{y}{r}.png\",\n \"https://{s}.basemaps.cartocdn.com/rastertiles/voyager_labels_under/{z}/{x}/{y}{r}.png\",\n \"https://basemaps.cartocdn.com/rastertiles/voyager_labels_under/{z}/{x}/{y}{r}.png\"\n ],\n \"lineWidthStops\": { \"1\": 1.0, \"3\": 1.0, \"4\": 2.0, \"5\": 2.0, \"6\": 2.5, \"7\": 3.0, \"8\": 3.0, \"10\": 4.0, \"11\": 4.0, \"12\": 4.0 },\n \"lineStyles\": [\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"ne\", \"endZoom\": 4, \"lineExtensionFactor\": 0.1, \"delWidthFactor\": 2.5 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"ne-disp\", \"endZoom\": 4, \"delWidthFactor\": 0 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm\", \"alpha\": 0.1, \"startZoom\": 6, \"lineWidthStops\": { \"6\": 20, \"8\": 19, \"10\": 18, \"12\": 17 }, \"lineExtensionFactor\": 0.1 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm\", \"startZoom\": 5, \"lineExtensionFactor\": 0.1 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm-disp\", \"startZoom\": 5, \"delWidthFactor\": 0 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 5, \"widthFraction\": 0.5, \"dashArray\": [4, 4], \"delWidthFactor\": 2.0 },\n { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"ne-internal\", \"startZoom\": 4, \"endZoom\": 4, \"widthFraction\": 0.5, \"dashArray\": [4, 4], \"delWidthFactor\": 2.5 }\n ]\n },\n {\n \"id\": \"open-topo\",\n \"tileUrlTemplates\": [\n \"https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png\",\n \"https://tile.opentopomap.org/{z}/{x}/{y}.png\",\n \"https://{s}.tile.top-o-map.de/{z}/{x}/{y}.png\",\n \"https://tile.top-o-map.de/{z}/{x}/{y}.png\"\n ],\n \"lineWidthStops\": { \"4\": 0.75, \"5\": 1.0, \"6\": 1.25, \"7\": 1.5, \"8\": 1.75, \"9\": 1.25, \"10\": 1.25, \"13\": 1.5 },\n \"lineStyles\": [\n { \"color\": \"rgb(83, 83, 83)\", \"layerSuffix\": \"ne\", \"startZoom\": 4, \"endZoom\": 6 },\n { \"color\": \"rgb(173, 173, 173)\", \"layerSuffix\": \"osm\", \"startZoom\": 7, \"endZoom\": 8, \"alpha\": 0.5, \"widthFraction\": 4 },\n { \"color\": \"rgb(83, 83, 83)\", \"layerSuffix\": \"osm\", \"startZoom\": 7, \"endZoom\": 8 },\n { \"color\": \"rgb(83, 83, 83)\", \"layerSuffix\": \"osm-internal\", \"widthFraction\": 0.75, \"startZoom\": 7, \"endZoom\": 8 },\n { \"color\": \"rgb(199, 158, 204)\", \"layerSuffix\": \"osm\", \"startZoom\": 9, \"widthFraction\": 7, \"alpha\": 0.6, \"lineExtensionFactor\": 0.2 },\n { \"color\": \"rgb(175, 41, 203)\", \"layerSuffix\": \"osm\", \"startZoom\": 9, \"lineExtensionFactor\": 0.2 },\n { \"color\": \"rgb(199, 158, 204)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 9, \"widthFraction\": 2.25, \"alpha\": 0.6, \"lineExtensionFactor\": 0.2 },\n { \"color\": \"rgb(175, 41, 203)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 9, \"widthFactor\": 0.75, \"lineExtensionFactor\": 0.2 }\n ]\n },\n {\n \"id\": \"osm-carto\",\n \"tileUrlTemplates\": [\n \"https://tile.openstreetmap.org/{z}/{x}/{y}.png\",\n \"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\"\n ],\n \"lineWidthStops\": { \"3\": 0.7, \"4\": 1.0, \"10\": 3.75 },\n \"lineStyles\": [\n { \"color\": \"rgb(200, 180, 200)\", \"layerSuffix\": \"osm\", \"startZoom\": 4, \"delWidthFactor\": 1.5 },\n { \"color\": \"rgb(160, 120, 160)\", \"layerSuffix\": \"osm\", \"startZoom\": 4, \"widthFraction\": 0.333, \"dashArray\": [30, 2, 8, 2], \"delWidthFactor\": 0 },\n { \"color\": \"rgb(200, 180, 200)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 4, \"widthFraction\": 0.45 },\n { \"color\": \"rgb(160, 120, 160)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 4, \"widthFraction\": 0.15, \"dashArray\": [10, 4, 2] }\n ]\n },\n {\n \"id\": \"osm-hot\",\n \"tileUrlTemplates\": [\n \"https://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png\",\n \"https://tile.openstreetmap.fr/hot/{z}/{x}/{y}.png\"\n ],\n \"lineWidthStops\": { \"2\": 3.0, \"3\": 3.0, \"7\": 3.0, \"8\": 3.5, \"9\": 3.5 },\n \"lineStyles\": [\n { \"color\": \"rgb(149, 175, 180)\", \"layerSuffix\": \"osm\", \"lineExtensionFactor\": 0.25, \"startZoom\": 2 },\n { \"color\": \"rgb(89, 117, 123)\", \"layerSuffix\": \"osm\", \"widthFraction\": 0.33, \"lineExtensionFactor\": 0.25, \"startZoom\": 2 },\n { \"color\": \"rgb(172, 163, 163)\", \"layerSuffix\": \"osm-internal\", \"widthFraction\": 0.33, \"startZoom\": 4, \"dashArray\": [7, 7] }\n ]\n }\n]\n","/**\n * Constant representing no zoom limit (used for endZoom).\n * Using -1 instead of Infinity for JSON serialization compatibility.\n */\nexport const INFINITY = -1;\n\n/**\n * Minimum line width used when extrapolating below the lowest zoom stop.\n */\nexport const MIN_LINE_WIDTH = 0.1;\n\n/**\n * Default fallback line width if interpolation fails.\n */\nconst DEFAULT_LINE_WIDTH = 1;\n\n/**\n * Interpolate or extrapolate line width for a given zoom level.\n * Uses a lineWidthStops map to calculate the appropriate width.\n * @param {number} zoom - Zoom level\n * @param {Object<number, number>} lineWidthStops - Map of zoom level to line width (at least 2 entries)\n * @returns {number}\n */\nexport function interpolateLineWidth(zoom, lineWidthStops) {\n const zooms = Object.keys(lineWidthStops).map(Number).sort((a, b) => a - b);\n \n // Exact match\n if (lineWidthStops[zoom] !== undefined) {\n return lineWidthStops[zoom];\n }\n \n // Below lowest zoom - extrapolate\n if (zoom < zooms[0]) {\n const z1 = zooms[0];\n const z2 = zooms[1];\n const w1 = lineWidthStops[z1];\n const w2 = lineWidthStops[z2];\n const slope = (w2 - w1) / (z2 - z1);\n return Math.max(MIN_LINE_WIDTH, w1 + slope * (zoom - z1));\n }\n \n // Above highest zoom - extrapolate\n if (zoom > zooms[zooms.length - 1]) {\n const z1 = zooms[zooms.length - 2];\n const z2 = zooms[zooms.length - 1];\n const w1 = lineWidthStops[z1];\n const w2 = lineWidthStops[z2];\n const slope = (w2 - w1) / (z2 - z1);\n return Math.max(MIN_LINE_WIDTH, w2 + slope * (zoom - z2));\n }\n \n // Interpolate between two stops\n for (let i = 0; i < zooms.length - 1; i++) {\n if (zoom > zooms[i] && zoom < zooms[i + 1]) {\n const z1 = zooms[i];\n const z2 = zooms[i + 1];\n const w1 = lineWidthStops[z1];\n const w2 = lineWidthStops[z2];\n const t = (zoom - z1) / (z2 - z1);\n return w1 + t * (w2 - w1);\n }\n }\n \n return DEFAULT_LINE_WIDTH; // fallback\n}\n\n/**\n * Convert a tile URL template to a regex pattern and capture group names.\n * Supports {z}, {x}, {y}, {s} (Leaflet subdomain), {a-c}/{1-4} (OpenLayers subdomain), and {r} (retina) placeholders.\n * @param {string} template - URL template like \"https://{s}.tile.example.com/{z}/{x}/{y}.png\"\n * @returns {{ pattern: RegExp, groups: string[] }}\n */\nfunction templateToRegex(template) {\n const groups = [];\n const hasRetina = template.includes('{r}');\n const hasExtension = /\\.(png|jpg|jpeg|webp|gif)$/i.test(template);\n \n // Escape regex special chars, then replace placeholders\n let pattern = template\n .replace(/[.*+?^${}()|[\\]\\\\]/g, (char) => {\n // Don't escape our placeholders\n if (char === '{' || char === '}') return char;\n return '\\\\' + char;\n })\n // Make protocol flexible (http/https)\n .replace(/^https:\\/\\//, 'https?://')\n .replace(/^http:\\/\\//, 'https?://')\n // Handle {a-c} or {1-4} etc (OpenLayers style subdomain)\n .replace(/\\{[a-z0-9]-[a-z0-9]\\}/gi, () => {\n groups.push('s');\n return '([a-z0-9]+)';\n })\n .replace(/\\{(z|x|y|s|r)\\}/gi, (_, name) => {\n const lowerName = name.toLowerCase();\n groups.push(lowerName);\n if (lowerName === 's') {\n // Subdomain: single letter or short string\n return '([a-z0-9]+)';\n }\n if (lowerName === 'r') {\n // Retina suffix: required @2x or similar (must be present for retina configs)\n return '(@\\\\d+x)';\n }\n // z, x, y: numeric\n return '(\\\\d+)';\n });\n \n // If template has no {r} placeholder, ensure we DON'T match retina URLs\n if (!hasRetina) {\n if (hasExtension) {\n // Insert negative lookahead before .png/.jpg/.webp etc\n pattern = pattern.replace(/(\\\\\\.(png|jpg|jpeg|webp|gif))/, '(?!@\\\\d+x)$1');\n } else {\n // No extension - add negative lookahead at the end (before query string)\n pattern = pattern + '(?!@\\\\d+x)';\n }\n }\n \n // Allow optional query string at end\n return { pattern: new RegExp('^' + pattern + '(\\\\?.*)?$', 'i'), groups };\n}\n\n/**\n * Convert a tile URL template to a regex that matches the template itself.\n * @param {string} template - URL template like \"https://{s}.tile.example.com/{z}/{x}/{y}.png\"\n * @returns {RegExp}\n */\nfunction templateToTemplateRegex(template) {\n const hasRetina = template.includes('{r}');\n const hasExtension = /\\.(png|jpg|jpeg|webp|gif)$/i.test(template);\n \n // Escape regex special chars, then replace placeholders with literal match\n let pattern = template\n .replace(/[.*+?^${}()|[\\]\\\\]/g, (char) => {\n if (char === '{' || char === '}') return char;\n return '\\\\' + char;\n })\n // Make protocol flexible (http/https)\n .replace(/^https:\\/\\//, 'https?://')\n .replace(/^http:\\/\\//, 'https?://')\n // Handle {a-c} or {1-4} (OpenLayers style subdomain)\n .replace(/\\{([a-z0-9])-([a-z0-9])\\}/gi, (_, start, end) => `(\\\\{${start}-${end}\\\\}|\\\\{s\\\\}|[a-z0-9]+)`)\n .replace(/\\{(z|x|y|s|r)\\}/gi, (_, name) => {\n const lowerName = name.toLowerCase();\n if (lowerName === 's') {\n // Match {s} placeholder, {a-c} style placeholder, or actual subdomain\n return '(\\\\{s\\\\}|\\\\{[a-z0-9]-[a-z0-9]\\\\}|[a-z0-9]+)';\n }\n if (lowerName === 'r') {\n // Match {r} placeholder or actual retina suffix (required for retina configs)\n return '(\\\\{r\\\\}|@\\\\d+x)';\n }\n // Match {z}, {x}, {y} placeholders\n return `\\\\{${lowerName}\\\\}`;\n });\n \n // If template has no {r} placeholder, ensure we DON'T match retina URLs/templates\n if (!hasRetina) {\n if (hasExtension) {\n // Insert negative lookahead before .png/.jpg/.webp etc to reject @2x and {r}\n pattern = pattern.replace(/(\\\\\\.(png|jpg|jpeg|webp|gif))/, '(?!@\\\\d+x|\\\\{r\\\\})$1');\n } else {\n // No extension - add negative lookahead at the end (before query string)\n pattern = pattern + '(?!@\\\\d+x|\\\\{r\\\\})';\n }\n }\n \n // Allow optional query string at end\n return new RegExp('^' + pattern + '(\\\\?.*)?$', 'i');\n}\n\n/**\n * Check if a string is a valid CSS color using the browser's CSS parser.\n * Falls back to a basic regex check in non-browser environments.\n * @param {string} color\n * @returns {boolean}\n */\nfunction isValidColor(color) {\n if (typeof color !== 'string' || !color.trim()) return false;\n \n // Use CSS.supports if available (modern browsers)\n if (typeof CSS !== 'undefined' && CSS.supports) {\n return CSS.supports('color', color);\n }\n \n // Fallback: basic validation for common formats\n const trimmed = color.trim().toLowerCase();\n // Hex colors\n if (/^#([0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/.test(trimmed)) return true;\n // rgb/rgba/hsl/hsla functions\n if (/^(rgb|hsl)a?\\(/.test(trimmed)) return true;\n // Named colors (just check it's alphabetic)\n if (/^[a-z]+$/.test(trimmed)) return true;\n return false;\n}\n\n/**\n * Validate lineWidthStops object.\n * @param {Object} lineWidthStops - The lineWidthStops to validate\n * @param {string} prefix - Error message prefix\n * @throws {Error} If validation fails\n */\nfunction validateLineWidthStops(lineWidthStops, prefix) {\n if (!lineWidthStops || typeof lineWidthStops !== 'object' || Array.isArray(lineWidthStops)) {\n throw new Error(`${prefix}: lineWidthStops must be an object`);\n }\n const stopKeys = Object.keys(lineWidthStops);\n if (stopKeys.length < 2) {\n throw new Error(`${prefix}: lineWidthStops must have at least 2 entries`);\n }\n for (const key of stopKeys) {\n const zoom = Number(key);\n if (!Number.isInteger(zoom) || zoom < 0) {\n throw new Error(`${prefix}: lineWidthStops keys must be non-negative integers, got \"${key}\"`);\n }\n if (typeof lineWidthStops[key] !== 'number' || lineWidthStops[key] <= 0) {\n throw new Error(`${prefix}: lineWidthStops values must be positive numbers`);\n }\n }\n}\n\n/**\n * Represents a line style for drawing boundaries.\n */\nexport class LineStyle {\n /**\n * Validate a LineStyle configuration object.\n * @param {Object} obj - The object to validate\n * @param {number} [index] - Optional index for error messages (when validating in an array)\n * @param {boolean} [requireLineWidthStops=false] - Whether lineWidthStops is required\n * @throws {Error} If validation fails\n */\n static validateJSON(obj, index, requireLineWidthStops = false) {\n const prefix = index !== undefined ? `lineStyles[${index}]` : 'LineStyle';\n \n if (!obj || typeof obj !== 'object') {\n throw new Error(`${prefix}: must be an object`);\n }\n \n if (!obj.color || typeof obj.color !== 'string') {\n throw new Error(`${prefix}: color must be a non-empty string`);\n }\n \n if (!isValidColor(obj.color)) {\n throw new Error(`${prefix}: color \"${obj.color}\" is not a valid CSS color`);\n }\n \n if (!obj.layerSuffix || typeof obj.layerSuffix !== 'string') {\n throw new Error(`${prefix}: layerSuffix must be a non-empty string`);\n }\n \n if (obj.widthFraction !== undefined && (typeof obj.widthFraction !== 'number' || obj.widthFraction <= 0)) {\n throw new Error(`${prefix}: widthFraction must be a positive number`);\n }\n \n if (obj.dashArray !== undefined && !Array.isArray(obj.dashArray)) {\n throw new Error(`${prefix}: dashArray must be an array`);\n }\n \n if (obj.alpha !== undefined && (typeof obj.alpha !== 'number' || obj.alpha < 0 || obj.alpha > 1)) {\n throw new Error(`${prefix}: alpha must be a number between 0 and 1`);\n }\n \n if (obj.startZoom !== undefined && (typeof obj.startZoom !== 'number' || obj.startZoom < 0)) {\n throw new Error(`${prefix}: startZoom must be a non-negative number`);\n }\n \n if (obj.endZoom !== undefined && (typeof obj.endZoom !== 'number' || (obj.endZoom < 0 && obj.endZoom !== INFINITY))) {\n throw new Error(`${prefix}: endZoom must be a non-negative number or INFINITY (${INFINITY})`);\n }\n \n if (obj.lineExtensionFactor !== undefined && (typeof obj.lineExtensionFactor !== 'number' || obj.lineExtensionFactor < 0)) {\n throw new Error(`${prefix}: lineExtensionFactor must be a non-negative number`);\n }\n \n if (obj.delWidthFactor !== undefined && (typeof obj.delWidthFactor !== 'number' || obj.delWidthFactor < 0)) {\n throw new Error(`${prefix}: delWidthFactor must be a non-negative number`);\n }\n \n if (requireLineWidthStops && obj.lineWidthStops === undefined) {\n throw new Error(`${prefix}: lineWidthStops is required`);\n }\n \n if (obj.lineWidthStops !== undefined) {\n validateLineWidthStops(obj.lineWidthStops, prefix);\n }\n }\n\n /**\n * @param {Object} options\n * @param {string} options.color - CSS color string\n * @param {string} options.layerSuffix - Layer suffix (e.g., 'osm', 'ne', 'osm-disp')\n * @param {Object<number, number>} options.lineWidthStops - Line width stops for this style\n * @param {number} [options.widthFraction=1.0] - Multiplier for base line width\n * @param {number[]} [options.dashArray] - Dash pattern for dashed lines\n * @param {number} [options.alpha=1.0] - Opacity (0-1)\n * @param {number} [options.startZoom=0] - Minimum zoom level for this style\n * @param {number} [options.endZoom=INFINITY] - Maximum zoom level for this style (INFINITY means no limit)\n * @param {number} [options.lineExtensionFactor=0.0] - Factor to extend lines by (multiplied by deletion line width)\n * @param {number} [options.delWidthFactor=1.5] - Factor to multiply line width for deletion blur\n */\n constructor({ color, layerSuffix, lineWidthStops, widthFraction = 1.0, dashArray, alpha = 1.0, startZoom = 0, endZoom = INFINITY, lineExtensionFactor = 0.0, delWidthFactor = 1.5 }) {\n this.color = color;\n this.layerSuffix = layerSuffix;\n this.lineWidthStops = lineWidthStops;\n this.widthFraction = widthFraction;\n this.dashArray = dashArray;\n this.alpha = alpha;\n this.startZoom = startZoom;\n this.endZoom = endZoom;\n this.lineExtensionFactor = lineExtensionFactor;\n this.delWidthFactor = delWidthFactor;\n }\n\n /**\n * Get base line width for this style at a given zoom level.\n * @param {number} zoom - Zoom level\n * @returns {number}\n */\n getLineWidth(zoom) {\n return interpolateLineWidth(zoom, this.lineWidthStops);\n }\n\n /**\n * Check if this style is active at the given zoom level.\n * @param {number} z - Zoom level\n * @returns {boolean}\n */\n isActiveAtZoom(z) {\n return z >= this.startZoom && (this.endZoom === INFINITY || z <= this.endZoom);\n }\n\n /**\n * Serialize to plain object.\n * @returns {Object}\n */\n toJSON() {\n return {\n color: this.color,\n layerSuffix: this.layerSuffix,\n lineWidthStops: this.lineWidthStops,\n widthFraction: this.widthFraction,\n dashArray: this.dashArray,\n alpha: this.alpha,\n startZoom: this.startZoom,\n endZoom: this.endZoom,\n lineExtensionFactor: this.lineExtensionFactor,\n delWidthFactor: this.delWidthFactor,\n };\n }\n\n /**\n * Create from plain object with validation.\n * @param {Object} obj\n * @param {number} [index] - Optional index for error messages\n * @returns {LineStyle}\n */\n static fromJSON(obj, index) {\n LineStyle.validateJSON(obj, index, true); // require lineWidthStops\n return new LineStyle(obj);\n }\n}\n\n/**\n * Base class for layer configurations\n * \n * Each lineStyle specifies which data layer to use via layerSuffix (e.g., 'osm', 'ne', 'osm-disp').\n * Layer names are derived as: to-add-{layerSuffix} and to-del-{layerSuffix}\n */\nexport class LayerConfig {\n /**\n * Validate a LayerConfig configuration object.\n * Also validates all lineStyles within the config.\n * @param {Object} obj - The object to validate\n * @throws {Error} If validation fails\n */\n static validateJSON(obj) {\n if (!obj || typeof obj !== 'object') {\n throw new Error('LayerConfig: must be an object');\n }\n \n // Validate id (required)\n if (!obj.id || typeof obj.id !== 'string') {\n throw new Error('LayerConfig: id must be a non-empty string');\n }\n if (obj.id.includes('/')) {\n throw new Error(`LayerConfig: id cannot contain slashes: \"${obj.id}\"`);\n }\n \n const id = obj.id;\n \n // Validate lineWidthStops (optional, but if provided must be valid)\n if (obj.lineWidthStops !== undefined) {\n if (!obj.lineWidthStops || typeof obj.lineWidthStops !== 'object' || Array.isArray(obj.lineWidthStops)) {\n throw new Error(`LayerConfig \"${id}\": lineWidthStops must be an object`);\n }\n const stopKeys = Object.keys(obj.lineWidthStops);\n if (stopKeys.length < 2) {\n throw new Error(`LayerConfig \"${id}\": lineWidthStops must have at least 2 entries`);\n }\n for (const key of stopKeys) {\n const zoom = Number(key);\n if (!Number.isInteger(zoom) || zoom < 0) {\n throw new Error(`LayerConfig \"${id}\": lineWidthStops keys must be non-negative integers, got \"${key}\"`);\n }\n if (typeof obj.lineWidthStops[key] !== 'number' || obj.lineWidthStops[key] <= 0) {\n throw new Error(`LayerConfig \"${id}\": lineWidthStops values must be positive numbers`);\n }\n }\n }\n \n // Validate lineStyles (required)\n if (!Array.isArray(obj.lineStyles) || obj.lineStyles.length === 0) {\n throw new Error(`LayerConfig \"${id}\": lineStyles must be a non-empty array`);\n }\n // Validate each lineStyle\n for (let i = 0; i < obj.lineStyles.length; i++) {\n LineStyle.validateJSON(obj.lineStyles[i], i);\n }\n }\n\n constructor({\n id,\n // Tile URL templates for matching (e.g., \"https://{s}.tile.example.com/{z}/{x}/{y}.png\")\n tileUrlTemplates = [],\n // Line width stops: map of zoom level to line width (at least 2 entries)\n // Note: interpolated/extrapolated line width is capped at a minimum of 0.5\n lineWidthStops = { 1: 0.5, 10: 2.5 },\n // Line styles array - each element describes a line to draw from a specific layer\n // { color: string, layerSuffix: string, widthFraction?: number, dashArray?: number[], \n // startZoom?: number, endZoom?: number, lineExtensionFactor?: number, delWidthFactor?: number }\n // Lines are drawn in array order. layerSuffix determines which PMTiles layer to use.\n lineStyles,\n }) {\n this.id = id;\n\n // Normalize to array\n const templates = Array.isArray(tileUrlTemplates) ? tileUrlTemplates : \n (tileUrlTemplates ? [tileUrlTemplates] : []);\n this.tileUrlTemplates = templates;\n \n // Pre-compile regex patterns for matching tile URLs (with actual coords)\n this._compiledPatterns = templates.map(t => templateToRegex(t));\n \n // Pre-compile regex patterns for matching template URLs (with {z}/{x}/{y} placeholders)\n this._templatePatterns = templates.map(t => templateToTemplateRegex(t));\n\n this.lineWidthStops = lineWidthStops;\n \n // Convert to LineStyle instances, inheriting lineWidthStops from config if not specified\n this.lineStyles = lineStyles.map(style => {\n if (style instanceof LineStyle) {\n return style;\n }\n // If style doesn't have lineWidthStops, use the config's lineWidthStops\n const styleWithStops = style.lineWidthStops ? style : { ...style, lineWidthStops };\n return new LineStyle(styleWithStops);\n });\n }\n\n /**\n * Get line styles active at a given zoom level\n * @param {number} z - Zoom level\n * @returns {LineStyle[]}\n */\n getLineStylesForZoom(z) {\n return this.lineStyles.filter(style => style.isActiveAtZoom(z));\n }\n\n /**\n * Get unique layer suffixes from styles active at a given zoom level\n * @param {number} z - Zoom level\n * @returns {string[]}\n */\n getLayerSuffixesForZoom(z) {\n const activeStyles = this.getLineStylesForZoom(z);\n return [...new Set(activeStyles.map(s => s.layerSuffix))];\n }\n\n /**\n * Check if this config matches the given template URLs (with {z}/{x}/{y} placeholders)\n * @param {string | string[]} templates - Single template URL or array of template URLs\n * @returns {boolean}\n */\n matchTemplate(templates) {\n if (this._templatePatterns.length === 0) return false;\n \n const urls = Array.isArray(templates) ? templates : [templates];\n if (urls.length === 0) return false;\n \n return urls.some(url => \n this._templatePatterns.some(pattern => pattern.test(url))\n );\n }\n\n /**\n * Check if this config matches the given tile URLs (with actual coordinates)\n * @param {string | string[]} tiles - Single tile URL or array of tile URLs\n * @returns {boolean}\n */\n matchTileUrl(tiles) {\n if (this._compiledPatterns.length === 0) return false;\n \n const urls = Array.isArray(tiles) ? tiles : [tiles];\n if (urls.length === 0) return false;\n \n return urls.some(url => \n this._compiledPatterns.some(({ pattern }) => pattern.test(url))\n );\n }\n\n /**\n * Extract tile coordinates (z, x, y) from a URL using this config's templates\n * @param {string} url - Tile URL to extract coordinates from\n * @returns {{ z: number, x: number, y: number } | null}\n */\n extractCoords(url) {\n for (const { pattern, groups } of this._compiledPatterns) {\n const match = url.match(pattern);\n if (match) {\n const result = {};\n for (let i = 0; i < groups.length; i++) {\n const name = groups[i];\n const value = match[i + 1];\n if (name === 'z' || name === 'x' || name === 'y') {\n result[name] = parseInt(value, 10);\n }\n }\n if ('z' in result && 'x' in result && 'y' in result) {\n return { z: result.z, x: result.x, y: result.y };\n }\n }\n }\n return null;\n }\n\n /**\n * Serialize the config to a plain object for postMessage\n * @returns {Object}\n */\n toJSON() {\n return {\n id: this.id,\n tileUrlTemplates: this.tileUrlTemplates,\n lineWidthStops: this.lineWidthStops,\n lineStyles: this.lineStyles.map(s => s.toJSON()),\n };\n }\n\n /**\n * Create a LayerConfig from a plain object with validation.\n * @param {Object} obj\n * @returns {LayerConfig}\n * @throws {Error} If validation fails\n */\n static fromJSON(obj) {\n LayerConfig.validateJSON(obj);\n return new LayerConfig(obj);\n }\n}\n\nexport default LayerConfig;\n","import configsJson from './configs.json' with { type: 'json' };\nimport { LayerConfig, LineStyle, INFINITY, MIN_LINE_WIDTH, interpolateLineWidth } from './layerconfig.js';\n\nexport { LayerConfig, LineStyle, INFINITY, MIN_LINE_WIDTH, interpolateLineWidth } from './layerconfig.js';\n\n// Export raw configs for testing/inspection\nexport { configsJson };\n\n/**\n * Layer configuration registry\n */\nexport class LayerConfigRegistry {\n constructor() {\n this.registry = {};\n }\n\n /**\n * Get a layer config by id\n */\n get(id) {\n return this.registry[id];\n }\n\n /**\n * Register a new layer config\n */\n register(config) {\n this.registry[config.id] = config;\n }\n\n /**\n * Remove a layer config by id\n */\n remove(id) {\n if (!this.registry[id]) return false;\n delete this.registry[id];\n return true;\n }\n\n /**\n * Detect layer config from tile URL templates (with {z}/{x}/{y} placeholders)\n * @param {string | string[]} templates - Single template URL or array of template URLs\n */\n detectFromTemplates(templates) {\n if (!templates || (Array.isArray(templates) && templates.length === 0)) return undefined;\n \n for (const config of Object.values(this.registry)) {\n if (config.matchTemplate(templates)) {\n return config;\n }\n }\n \n return undefined;\n }\n\n /**\n * Detect layer config from actual tile URLs (with numeric coordinates)\n * @param {string | string[]} urls - Single tile URL or array of tile URLs\n */\n detectFromTileUrls(urls) {\n if (!urls || (Array.isArray(urls) && urls.length === 0)) return undefined;\n \n for (const config of Object.values(this.registry)) {\n if (config.matchTileUrl(urls)) {\n return config;\n }\n }\n \n return undefined;\n }\n\n /**\n * Get all available layer config ids\n */\n getAvailableIds() {\n return Object.keys(this.registry);\n }\n\n /**\n * Create a new registry with all configs from this registry plus extra configs.\n * @param {LayerConfig[]} extraLayerConfigs - Additional configs to add\n * @returns {LayerConfigRegistry} A new registry with merged configs\n */\n createMergedRegistry(extraLayerConfigs) {\n const registry = new LayerConfigRegistry();\n \n for (const id of this.getAvailableIds()) {\n registry.register(this.get(id));\n }\n \n if (extraLayerConfigs && extraLayerConfigs.length > 0) {\n for (const config of extraLayerConfigs) {\n registry.register(config);\n }\n }\n \n return registry;\n }\n\n /**\n * Parse a tile URL into its components: layer config and coordinates\n * @param {string} url - Tile URL to parse\n * @returns {{ layerConfig: LayerConfig, coords: { z: number, x: number, y: number } } | null}\n */\n parseTileUrl(url) {\n // Check if URL matches any layer config\n const layerConfig = this.detectFromTileUrls([url]);\n if (!layerConfig) return null;\n \n // Extract tile coordinates using the matched config\n const coords = layerConfig.extractCoords(url);\n if (!coords) return null;\n \n return { layerConfig, coords };\n }\n}\n\n// Default registry with built-in configs loaded from JSON\nexport const layerConfigs = new LayerConfigRegistry();\nfor (const configData of configsJson) {\n layerConfigs.register(new LayerConfig(configData));\n}\n\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@india-boundary-corrector/layer-configs",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "description": "Pre-built layer configurations for India boundary corrections",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
package/src/configs.json CHANGED
@@ -97,7 +97,9 @@
97
97
  "id": "open-topo",
98
98
  "tileUrlTemplates": [
99
99
  "https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png",
100
- "https://tile.opentopomap.org/{z}/{x}/{y}.png"
100
+ "https://tile.opentopomap.org/{z}/{x}/{y}.png",
101
+ "https://{s}.tile.top-o-map.de/{z}/{x}/{y}.png",
102
+ "https://tile.top-o-map.de/{z}/{x}/{y}.png"
101
103
  ],
102
104
  "lineWidthStops": { "4": 0.75, "5": 1.0, "6": 1.25, "7": 1.5, "8": 1.75, "9": 1.25, "10": 1.25, "13": 1.5 },
103
105
  "lineStyles": [
@@ -117,9 +119,8 @@
117
119
  "https://tile.openstreetmap.org/{z}/{x}/{y}.png",
118
120
  "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
119
121
  ],
120
- "lineWidthStops": { "1": 0.5, "2": 0.6, "3": 0.7, "4": 1.0, "10": 3.75 },
122
+ "lineWidthStops": { "3": 0.7, "4": 1.0, "10": 3.75 },
121
123
  "lineStyles": [
122
- { "color": "rgb(200, 180, 200)", "layerSuffix": "osm", "startZoom": 1, "endZoom": 3, "delWidthFactor": 2.5, "widthFraction": 1.5 },
123
124
  { "color": "rgb(200, 180, 200)", "layerSuffix": "osm", "startZoom": 4, "delWidthFactor": 1.5 },
124
125
  { "color": "rgb(160, 120, 160)", "layerSuffix": "osm", "startZoom": 4, "widthFraction": 0.333, "dashArray": [30, 2, 8, 2], "delWidthFactor": 0 },
125
126
  { "color": "rgb(200, 180, 200)", "layerSuffix": "osm-internal", "startZoom": 4, "widthFraction": 0.45 },