@maplibre-yaml/core 0.1.1 → 0.1.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/schemas/content.schema.ts","../src/schemas/base.schema.ts","../src/schemas/source.schema.ts","../src/schemas/layer.schema.ts","../src/schemas/map.schema.ts","../src/schemas/scrollytelling.schema.ts","../src/schemas/page.schema.ts","../src/parser/yaml-parser.ts","../src/data/memory-cache.ts","../src/data/retry-manager.ts","../src/data/data-fetcher.ts","../src/data/polling-manager.ts","../src/utils/event-emitter.ts","../src/data/streaming/base-connection.ts","../src/data/streaming/sse-connection.ts","../src/data/streaming/websocket-connection.ts","../src/data/streaming/stream-manager.ts","../src/data/merge/data-merger.ts","../src/ui/loading-manager.ts","../src/renderer/layer-manager.ts","../src/renderer/popup-builder.ts","../src/renderer/event-handler.ts","../src/renderer/legend-builder.ts","../src/renderer/controls-manager.ts","../src/renderer/map-renderer.ts","../src/components/ml-map.ts","../src/register.ts"],"names":["z","parseYAML","result","removed","maplibregl"],"mappings":"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","file":"register.js","sourcesContent":["/**\n * @file Content schemas for maplibre-yaml\n * @module @maplibre-yaml/core/schemas/content\n *\n * @description\n * Zod schemas for non-map content blocks including text, images, iframes,\n * and other HTML elements with dynamic property interpolation.\n *\n * @example\n * ```typescript\n * import { ContentBlockSchema } from '@maplibre-yaml/core/schemas';\n * ```\n */\n\nimport { z } from \"zod\";\n\n/**\n * Valid HTML tag names for content elements.\n *\n * @remarks\n * Supports common HTML elements for rich content rendering.\n * Use semantic tags for better accessibility and SEO.\n *\n * **Heading Tags:** h1, h2, h3, h4, h5, h6\n * **Text Tags:** p, span, div, strong, em, code, pre\n * **Link Tag:** a\n * **Media Tags:** img, iframe\n * **List Tags:** ul, ol, li\n * **Other Tags:** blockquote, hr, br\n */\nexport const ValidTagNames = [\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"p\",\n \"span\",\n \"div\",\n \"a\",\n \"strong\",\n \"em\",\n \"code\",\n \"pre\",\n \"img\",\n \"iframe\",\n \"ul\",\n \"ol\",\n \"li\",\n \"blockquote\",\n \"hr\",\n \"br\",\n] as const;\n\n/**\n * Content element with styling and dynamic properties.\n *\n * @remarks\n * Defines a single element within content. Supports both static and\n * dynamic values via property interpolation.\n *\n * **Core Properties:**\n * - `str` - Static text string\n * - `property` - Feature/context property name\n * - `else` - Fallback value if property is missing\n *\n * **Styling:**\n * - `classList` - CSS class names (space-separated or array)\n * - `id` - Element ID\n * - `style` - Inline CSS styles\n *\n * **Links (a tag):**\n * - `href` - URL\n * - `target` - Link target (_blank, _self, etc.)\n *\n * **Media (img, iframe):**\n * - `src` - Source URL\n * - `alt` - Alternative text (img)\n * - `width` - Width (pixels or %)\n * - `height` - Height (pixels or %)\n *\n * @example Static Text\n * ```yaml\n * - str: \"Welcome to our site\"\n * ```\n *\n * @example Dynamic Property\n * ```yaml\n * - property: \"userName\"\n * else: \"Guest\"\n * ```\n *\n * @example Styled Element\n * ```yaml\n * - str: \"Important\"\n * classList: \"text-bold text-red\"\n * style: \"font-size: 18px;\"\n * ```\n *\n * @example Link\n * ```yaml\n * - str: \"Learn more\"\n * href: \"https://example.com\"\n * target: \"_blank\"\n * ```\n *\n * @example Image\n * ```yaml\n * - src: \"https://example.com/photo.jpg\"\n * alt: \"Photo description\"\n * width: \"100%\"\n * ```\n */\nexport const ContentElementSchema = z\n .object({\n // Content\n str: z.string().optional().describe(\"Static text string\"),\n property: z.string().optional().describe(\"Dynamic property from context\"),\n else: z.string().optional().describe(\"Fallback value if property missing\"),\n\n // Styling\n classList: z\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe(\"CSS class names (space-separated string or array)\"),\n id: z.string().optional().describe(\"Element ID attribute\"),\n style: z.string().optional().describe(\"Inline CSS styles\"),\n\n // Links\n href: z.string().url().optional().describe(\"Link URL\"),\n target: z\n .string()\n .optional()\n .describe(\"Link target (_blank, _self, _parent, _top)\"),\n\n // Media\n src: z.string().url().optional().describe(\"Source URL for img or iframe\"),\n alt: z.string().optional().describe(\"Alternative text for images\"),\n width: z\n .union([z.string(), z.number()])\n .optional()\n .describe(\"Width (pixels or %)\"),\n height: z\n .union([z.string(), z.number()])\n .optional()\n .describe(\"Height (pixels or %)\"),\n })\n .passthrough()\n .describe(\"Content element with styling and properties\");\n\n/** Inferred type for content element. */\nexport type ContentElement = z.infer<typeof ContentElementSchema>;\n\n/**\n * Content item mapping tag name to element array.\n *\n * @remarks\n * Each content item is a record where the key is an HTML tag name\n * and the value is an array of content elements to render inside that tag.\n *\n * @example\n * ```yaml\n * - h1:\n * - str: \"Page Title\"\n * - p:\n * - str: \"Welcome, \"\n * - property: \"userName\"\n * else: \"Guest\"\n * ```\n */\nexport const ContentItemSchema = z\n .record(z.enum(ValidTagNames), z.array(ContentElementSchema))\n .describe(\"Content item mapping tag to elements\");\n\n/** Inferred type for content item. */\nexport type ContentItem = z.infer<typeof ContentItemSchema>;\n\n/**\n * Content block for rich text and media.\n *\n * @remarks\n * Content blocks allow you to add non-map content to your pages.\n * They render as HTML with support for dynamic property interpolation.\n *\n * **Use Cases:**\n * - Introductory text\n * - Explanatory sections\n * - Embedded images and videos\n * - Interactive elements\n * - Mixed content layouts\n *\n * **Properties are resolved from:**\n * 1. Page-level context (passed to renderer)\n * 2. Global configuration\n * 3. URL query parameters (if configured)\n *\n * @example Basic Text Content\n * ```yaml\n * type: content\n * id: intro\n * content:\n * - h1:\n * - str: \"Welcome\"\n * - p:\n * - str: \"This is a simple text block.\"\n * ```\n *\n * @example Dynamic Content\n * ```yaml\n * type: content\n * id: user-info\n * className: user-section\n * content:\n * - h2:\n * - str: \"User Profile\"\n * - p:\n * - str: \"Name: \"\n * - property: \"userName\"\n * else: \"Unknown\"\n * - p:\n * - str: \"Location: \"\n * - property: \"userCity\"\n * else: \"Not specified\"\n * ```\n *\n * @example Rich Content with Media\n * ```yaml\n * type: content\n * id: article\n * content:\n * - h1:\n * - str: \"Article Title\"\n * - img:\n * - src: \"https://example.com/header.jpg\"\n * alt: \"Header image\"\n * width: \"100%\"\n * - p:\n * - str: \"Article text goes here...\"\n * - blockquote:\n * - str: \"An inspiring quote.\"\n * - a:\n * - str: \"Read more\"\n * href: \"https://example.com/full-article\"\n * target: \"_blank\"\n * ```\n *\n * @example Styled Content\n * ```yaml\n * type: content\n * id: styled\n * className: \"card shadow\"\n * style: \"padding: 20px; background: #f5f5f5;\"\n * content:\n * - h3:\n * - str: \"Card Title\"\n * classList: \"text-primary\"\n * - p:\n * - str: \"Card content\"\n * ```\n *\n * @example List Content\n * ```yaml\n * type: content\n * id: features\n * content:\n * - h2:\n * - str: \"Features\"\n * - ul:\n * - li:\n * - str: \"Fast rendering\"\n * - li:\n * - str: \"Easy configuration\"\n * - li:\n * - str: \"Fully customizable\"\n * ```\n *\n * @example Embedded Content\n * ```yaml\n * type: content\n * id: video\n * content:\n * - h2:\n * - str: \"Tutorial Video\"\n * - iframe:\n * - src: \"https://www.youtube.com/embed/VIDEO_ID\"\n * width: \"560\"\n * height: \"315\"\n * ```\n */\nexport const ContentBlockSchema = z\n .object({\n type: z.literal(\"content\").describe(\"Block type\"),\n id: z.string().optional().describe(\"Unique block identifier\"),\n className: z\n .string()\n .optional()\n .describe(\"CSS class name for the block container\"),\n style: z\n .string()\n .optional()\n .describe(\"Inline CSS styles for the block container\"),\n content: z\n .array(ContentItemSchema)\n .describe(\"Array of content items to render\"),\n })\n .describe(\"Content block for rich text and media\");\n\n/** Inferred type for content block. */\nexport type ContentBlock = z.infer<typeof ContentBlockSchema>;\n","/**\n * @file Base schemas for maplibre-yaml\n * @module @maplibre-yaml/core/schemas/base\n *\n * @description\n * Foundational Zod schemas for coordinates, colors, expressions, and other\n * primitive types used throughout the library.\n *\n * @example\n * ```typescript\n * import { LngLatSchema, ColorSchema } from '@maplibre-yaml/core/schemas';\n * ```\n */\n\nimport { z } from \"zod\";\n\n/**\n * Longitude value in degrees.\n *\n * @remarks\n * Valid range: -180 to 180 (inclusive)\n *\n * @example\n * ```typescript\n * const lng = LongitudeSchema.parse(-74.006);\n * ```\n */\nexport const LongitudeSchema = z\n .number()\n .min(-180, \"Longitude must be >= -180\")\n .max(180, \"Longitude must be <= 180\")\n .describe(\"Longitude in degrees (-180 to 180)\");\n\n/**\n * Latitude value in degrees.\n *\n * @remarks\n * Valid range: -90 to 90 (inclusive)\n *\n * @example\n * ```typescript\n * const lat = LatitudeSchema.parse(40.7128);\n * ```\n */\nexport const LatitudeSchema = z\n .number()\n .min(-90, \"Latitude must be >= -90\")\n .max(90, \"Latitude must be <= 90\")\n .describe(\"Latitude in degrees (-90 to 90)\");\n\n/**\n * Geographic coordinates as [longitude, latitude].\n *\n * @remarks\n * **Validation Rules:**\n * - Longitude: -180 to 180\n * - Latitude: -90 to 90\n * - Must be a 2-element tuple\n *\n * Follows GeoJSON convention (lng, lat), not (lat, lng).\n *\n * **Common Values:**\n * - `[0, 0]` - Null Island (Gulf of Guinea)\n * - `[-74.006, 40.7128]` - New York City\n * - `[139.6917, 35.6895]` - Tokyo\n *\n * @example YAML\n * ```yaml\n * center: [-74.006, 40.7128]\n * ```\n *\n * @example TypeScript\n * ```typescript\n * const coords = LngLatSchema.parse([-74.006, 40.7128]);\n * ```\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc7946#section-3.1.1 | GeoJSON Position}\n */\nexport const LngLatSchema = z\n .tuple([LongitudeSchema, LatitudeSchema])\n .describe(\"Geographic coordinates as [longitude, latitude]\");\n\n/** Inferred type for geographic coordinates. */\nexport type LngLat = z.infer<typeof LngLatSchema>;\n\n/**\n * Bounding box as [west, south, east, north].\n *\n * @remarks\n * Defines a rectangular geographic area. Corner order:\n * 1. West (min longitude)\n * 2. South (min latitude)\n * 3. East (max longitude)\n * 4. North (max latitude)\n *\n * @example YAML\n * ```yaml\n * maxBounds: [-74.3, 40.5, -73.7, 40.9]\n * ```\n *\n * @example TypeScript\n * ```typescript\n * // NYC bounding box\n * const bounds = LngLatBoundsSchema.parse([-74.3, 40.5, -73.7, 40.9]);\n * ```\n */\nexport const LngLatBoundsSchema = z\n .tuple([\n LongitudeSchema, // west\n LatitudeSchema, // south\n LongitudeSchema, // east\n LatitudeSchema, // north\n ])\n .describe(\"Bounding box as [west, south, east, north]\");\n\n/** Inferred type for bounding box. */\nexport type LngLatBounds = z.infer<typeof LngLatBoundsSchema>;\n\n/**\n * CSS color value.\n *\n * @remarks\n * Supports multiple color formats:\n * - Hex: `#rgb`, `#rrggbb`, `#rrggbbaa`\n * - RGB: `rgb(255, 0, 0)`\n * - RGBA: `rgba(255, 0, 0, 0.5)`\n * - HSL: `hsl(0, 100%, 50%)`\n * - HSLA: `hsla(0, 100%, 50%, 0.5)`\n * - Named: `red`, `blue`, `transparent`, etc.\n *\n * @example YAML\n * ```yaml\n * paint:\n * circle-color: \"#ff0000\"\n * fill-color: \"rgba(255, 0, 0, 0.5)\"\n * line-color: \"hsl(120, 100%, 50%)\"\n * text-color: \"blue\"\n * ```\n *\n * @example TypeScript\n * ```typescript\n * const hex = ColorSchema.parse(\"#ff0000\");\n * const rgba = ColorSchema.parse(\"rgba(255, 0, 0, 0.5)\");\n * const named = ColorSchema.parse(\"red\");\n * ```\n */\nexport const ColorSchema = z\n .string()\n .refine(\n (val) => {\n // Hex color (#rgb, #rrggbb, #rrggbbaa)\n if (val.startsWith(\"#\")) {\n return /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/.test(val);\n }\n // rgb/rgba\n if (val.startsWith(\"rgb\")) {\n return /^rgba?\\s*\\([^)]+\\)$/.test(val);\n }\n // hsl/hsla\n if (val.startsWith(\"hsl\")) {\n return /^hsla?\\s*\\([^)]+\\)$/.test(val);\n }\n // Named colors (accept any other string, browser will validate)\n return true;\n },\n {\n message:\n \"Invalid color format. Use hex (#rgb, #rrggbb), rgb(), rgba(), hsl(), hsla(), or named colors.\",\n }\n )\n .describe(\"CSS color value\");\n\n/** Inferred type for color values. */\nexport type Color = z.infer<typeof ColorSchema>;\n\n/**\n * MapLibre expression for data-driven styling.\n *\n * @remarks\n * MapLibre expressions provide powerful data-driven styling capabilities.\n * An expression is an array where the first element is the operator name.\n *\n * **Common Operators:**\n * - `get` - Get feature property\n * - `interpolate` - Interpolate between values\n * - `match` - Match values\n * - `case` - Conditional logic\n * - `step` - Step function\n *\n * This schema provides basic validation (array starting with string).\n * Full expression syntax is validated by MapLibre at runtime.\n *\n * @example Get Property\n * ```yaml\n * text-field: [\"get\", \"name\"]\n * ```\n *\n * @example Interpolate by Zoom\n * ```yaml\n * circle-radius:\n * - interpolate\n * - [\"linear\"]\n * - [\"zoom\"]\n * - 5\n * - 2\n * - 15\n * - 10\n * ```\n *\n * @example Match Values\n * ```yaml\n * circle-color:\n * - match\n * - [\"get\", \"type\"]\n * - \"park\"\n * - \"#228B22\"\n * - \"water\"\n * - \"#4169E1\"\n * - \"#808080\"\n * ```\n *\n * @see {@link https://maplibre.org/maplibre-style-spec/expressions/ | MapLibre Expressions}\n */\nexport const ExpressionSchema: z.ZodType<any[]> = z\n .array(z.any())\n .refine((val) => val.length > 0 && typeof val[0] === \"string\", {\n message:\n 'Expression must be an array starting with a string operator (e.g., [\"get\", \"property\"])',\n })\n .describe(\"MapLibre expression for data-driven styling\");\n\n/** Inferred type for expressions. */\nexport type Expression = z.infer<typeof ExpressionSchema>;\n\n/**\n * Number value or MapLibre expression.\n *\n * @remarks\n * Accepts either a static number or a dynamic expression.\n * Use expressions for data-driven or zoom-dependent values.\n *\n * @example Static Value\n * ```yaml\n * circle-radius: 8\n * ```\n *\n * @example Expression\n * ```yaml\n * circle-radius:\n * - interpolate\n * - [\"linear\"]\n * - [\"get\", \"magnitude\"]\n * - 0\n * - 4\n * - 10\n * - 20\n * ```\n */\nexport const NumberOrExpressionSchema = z\n .union([z.number(), ExpressionSchema])\n .describe(\"Number value or MapLibre expression\");\n\n/** Inferred type for number or expression. */\nexport type NumberOrExpression = z.infer<typeof NumberOrExpressionSchema>;\n\n/**\n * Color value or MapLibre expression.\n *\n * @remarks\n * Accepts either a static color or a dynamic expression.\n * Use expressions for data-driven colors.\n *\n * @example Static Color\n * ```yaml\n * circle-color: \"#ff0000\"\n * ```\n *\n * @example Expression\n * ```yaml\n * circle-color:\n * - match\n * - [\"get\", \"severity\"]\n * - \"high\"\n * - \"#ff0000\"\n * - \"medium\"\n * - \"#ffaa00\"\n * - \"low\"\n * - \"#00ff00\"\n * - \"#808080\"\n * ```\n */\nexport const ColorOrExpressionSchema = z\n .union([ColorSchema, ExpressionSchema])\n .describe(\"Color value or MapLibre expression\");\n\n/** Inferred type for color or expression. */\nexport type ColorOrExpression = z.infer<typeof ColorOrExpressionSchema>;\n\n/**\n * Map zoom level.\n *\n * @remarks\n * Valid range: 0 to 24\n *\n * **Common Values:**\n * - 0 - Whole world\n * - 5 - Continent\n * - 10 - City\n * - 15 - Streets\n * - 20 - Buildings\n *\n * @example\n * ```yaml\n * zoom: 12\n * minZoom: 8\n * maxZoom: 18\n * ```\n */\nexport const ZoomLevelSchema = z\n .number()\n .min(0, \"Zoom level must be >= 0\")\n .max(24, \"Zoom level must be <= 24\")\n .describe(\"Map zoom level (0-24)\");\n\n/** Inferred type for zoom level. */\nexport type ZoomLevel = z.infer<typeof ZoomLevelSchema>;\n","/**\n * @file Source schemas for maplibre-yaml\n * @module @maplibre-yaml/core/schemas/source\n *\n * @description\n * Zod schemas for all MapLibre data source types with runtime-first defaults.\n * Supports GeoJSON, vector, raster, image, and video sources with dynamic data loading.\n *\n * @example\n * ```typescript\n * import { GeoJSONSourceSchema, LayerSourceSchema } from '@maplibre-yaml/core/schemas';\n * ```\n */\n\nimport { z } from \"zod\";\nimport { LngLatSchema } from \"./base.schema\";\n\n/**\n * WebSocket or Server-Sent Events streaming configuration.\n *\n * @remarks\n * Enables real-time data updates via WebSocket or SSE connections.\n *\n * **Connection Types:**\n * - `websocket` - Bidirectional WebSocket connection\n * - `sse` - Server-Sent Events (unidirectional)\n *\n * @example WebSocket\n * ```yaml\n * stream:\n * type: websocket\n * url: \"wss://api.example.com/live-data\"\n * reconnect: true\n * reconnectMaxAttempts: 10\n * protocols: [\"json\", \"v1\"]\n * ```\n *\n * @example Server-Sent Events\n * ```yaml\n * stream:\n * type: sse\n * url: \"https://api.example.com/events\"\n * eventTypes: [\"update\", \"delete\"]\n * ```\n */\nexport const StreamConfigSchema = z.object({\n type: z.enum([\"websocket\", \"sse\"]).describe(\"Streaming connection type\"),\n url: z.string().url().optional().describe(\"WebSocket or SSE endpoint URL\"),\n reconnect: z\n .boolean()\n .default(true)\n .describe(\"Automatically reconnect on disconnect\"),\n reconnectMaxAttempts: z\n .number()\n .min(0)\n .default(10)\n .describe(\"Maximum number of reconnection attempts\"),\n reconnectDelay: z\n .number()\n .min(100)\n .default(1000)\n .describe(\"Initial delay in milliseconds before reconnecting\"),\n reconnectMaxDelay: z\n .number()\n .min(1000)\n .default(30000)\n .describe(\"Maximum delay in milliseconds for exponential backoff\"),\n eventTypes: z\n .array(z.string())\n .optional()\n .describe(\"Event types to listen for (SSE only)\"),\n protocols: z\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe(\"WebSocket sub-protocols (WebSocket only)\"),\n});\n\n/** Inferred type for stream configuration. */\nexport type StreamConfig = z.infer<typeof StreamConfigSchema>;\n\n/**\n * Loading UI configuration for data fetching.\n *\n * @remarks\n * Controls the loading experience while data is being fetched.\n *\n * @example\n * ```yaml\n * loading:\n * enabled: true\n * message: \"Loading earthquake data...\"\n * showErrorOverlay: true\n * ```\n */\nexport const LoadingConfigSchema = z.object({\n enabled: z.boolean().default(false).describe(\"Enable loading UI overlays\"),\n message: z.string().optional().describe(\"Custom loading message to display\"),\n showErrorOverlay: z\n .boolean()\n .default(true)\n .describe(\"Show error overlay on fetch failure\"),\n});\n\n/** Inferred type for loading configuration. */\nexport type LoadingConfig = z.infer<typeof LoadingConfigSchema>;\n\n/**\n * Cache configuration for data fetching.\n *\n * @remarks\n * Controls HTTP caching behavior for fetched data.\n *\n * @example\n * ```yaml\n * cache:\n * enabled: true\n * ttl: 300000 # 5 minutes\n * ```\n */\nexport const CacheConfigSchema = z.object({\n enabled: z.boolean().default(true).describe(\"Enable HTTP caching\"),\n ttl: z\n .number()\n .positive()\n .optional()\n .describe(\"Cache TTL in milliseconds (overrides default)\"),\n});\n\n/** Inferred type for cache configuration. */\nexport type CacheConfig = z.infer<typeof CacheConfigSchema>;\n\n/**\n * Refresh configuration for polling updates.\n *\n * @remarks\n * Configures periodic data refresh with merge strategies.\n *\n * @example Replace Strategy\n * ```yaml\n * refresh:\n * refreshInterval: 5000\n * updateStrategy: replace\n * ```\n *\n * @example Merge Strategy\n * ```yaml\n * refresh:\n * refreshInterval: 10000\n * updateStrategy: merge\n * updateKey: \"vehicleId\"\n * ```\n *\n * @example Append-Window Strategy\n * ```yaml\n * refresh:\n * refreshInterval: 15000\n * updateStrategy: append-window\n * windowSize: 100\n * windowDuration: 3600000 # 1 hour\n * timestampField: \"timestamp\"\n * ```\n */\nexport const RefreshConfigSchema = z\n .object({\n refreshInterval: z\n .number()\n .min(1000)\n .optional()\n .describe(\"Polling interval in milliseconds (minimum 1000ms)\"),\n updateStrategy: z\n .enum([\"replace\", \"merge\", \"append-window\"])\n .default(\"replace\")\n .describe(\"How to merge incoming data with existing data\"),\n updateKey: z\n .string()\n .optional()\n .describe(\"Property key for merge strategy (required for merge)\"),\n windowSize: z\n .number()\n .positive()\n .optional()\n .describe(\"Maximum features to keep (append-window)\"),\n windowDuration: z\n .number()\n .positive()\n .optional()\n .describe(\"Maximum age in milliseconds (append-window)\"),\n timestampField: z\n .string()\n .optional()\n .describe(\"Property field containing timestamp (append-window)\"),\n })\n .refine((data) => !(data.updateStrategy === \"merge\" && !data.updateKey), {\n message: \"updateKey is required when updateStrategy is 'merge'\",\n });\n\n/** Inferred type for refresh configuration. */\nexport type RefreshConfig = z.infer<typeof RefreshConfigSchema>;\n\n/**\n * GeoJSON data source configuration.\n *\n * @remarks\n * The primary data source type for maplibre-yaml. Supports multiple data\n * loading strategies:\n *\n * **Data Sources (one required):**\n * - `url` - Fetch GeoJSON from URL at runtime\n * - `data` - Inline GeoJSON object\n * - `stream` - Real-time WebSocket or SSE connection\n *\n * **Fetch Strategy:**\n * - `runtime` (default) - Fetch when map loads, keeps bundle small\n * - `build` - Fetch at build time, bundle with app\n * - `hybrid` - Build-time with runtime refresh\n *\n * **Real-time Updates:**\n * - Use `refreshInterval` for polling (minimum 1000ms)\n * - Use `stream` for WebSocket/SSE\n * - Configure `updateStrategy` for merge vs replace\n *\n * @example Basic URL Source\n * ```yaml\n * source:\n * type: geojson\n * url: \"https://example.com/data.geojson\"\n * ```\n *\n * @example Inline Data\n * ```yaml\n * source:\n * type: geojson\n * data:\n * type: FeatureCollection\n * features:\n * - type: Feature\n * geometry:\n * type: Point\n * coordinates: [-74.006, 40.7128]\n * properties:\n * name: \"New York\"\n * ```\n *\n * @example Polling Updates\n * ```yaml\n * source:\n * type: geojson\n * url: \"https://api.example.com/live-data\"\n * refreshInterval: 15000\n * loading:\n * message: \"Loading live data...\"\n * ```\n *\n * @example WebSocket Streaming\n * ```yaml\n * source:\n * type: geojson\n * stream:\n * type: websocket\n * url: \"wss://api.example.com/stream\"\n * updateStrategy: merge\n * updateKey: \"id\"\n * ```\n *\n * @example Clustered Points\n * ```yaml\n * source:\n * type: geojson\n * url: \"https://example.com/points.geojson\"\n * cluster: true\n * clusterRadius: 50\n * clusterMaxZoom: 14\n * ```\n *\n * @see {@link StreamConfigSchema} for streaming options\n * @see {@link LoadingConfigSchema} for loading UI options\n * @see {@link https://maplibre.org/maplibre-style-spec/sources/#geojson | MapLibre GeoJSON Source}\n */\nexport const GeoJSONSourceSchema = z\n .object({\n type: z.literal(\"geojson\").describe(\"Source type\"),\n url: z.string().url().optional().describe(\"URL to fetch GeoJSON data\"),\n data: z.any().optional().describe(\"Inline GeoJSON object\"),\n prefetchedData: z\n .any()\n .optional()\n .describe(\"Pre-fetched data from build time\"),\n fetchStrategy: z\n .enum([\"runtime\", \"build\", \"hybrid\"])\n .default(\"runtime\")\n .describe(\"When to fetch data: runtime (default), build, or hybrid\"),\n stream: StreamConfigSchema.optional().describe(\n \"WebSocket/SSE streaming configuration\"\n ),\n refresh: RefreshConfigSchema.optional().describe(\n \"Polling refresh configuration\"\n ),\n // Legacy support for direct refresh properties\n refreshInterval: z\n .number()\n .min(1000)\n .optional()\n .describe(\n \"Polling interval in milliseconds (legacy, use refresh.refreshInterval)\"\n ),\n updateStrategy: z\n .enum([\"replace\", \"merge\", \"append-window\"])\n .optional()\n .describe(\"Update strategy (legacy, use refresh.updateStrategy)\"),\n updateKey: z\n .string()\n .optional()\n .describe(\"Update key (legacy, use refresh.updateKey)\"),\n loading: LoadingConfigSchema.optional().describe(\n \"Loading UI configuration\"\n ),\n cache: CacheConfigSchema.optional().describe(\"Cache configuration\"),\n // MapLibre clustering options\n cluster: z.boolean().optional().describe(\"Enable point clustering\"),\n clusterRadius: z\n .number()\n .int()\n .min(0)\n .optional()\n .describe(\"Cluster radius in pixels (default: 50)\"),\n clusterMaxZoom: z\n .number()\n .min(0)\n .max(24)\n .optional()\n .describe(\"Maximum zoom level to cluster points\"),\n clusterMinPoints: z\n .number()\n .int()\n .min(2)\n .optional()\n .describe(\"Minimum points to form a cluster\"),\n clusterProperties: z\n .record(z.any())\n .optional()\n .describe(\"Aggregate cluster properties\"),\n // Additional MapLibre options (passthrough)\n tolerance: z.number().optional(),\n buffer: z.number().optional(),\n lineMetrics: z.boolean().optional(),\n generateId: z.boolean().optional(),\n promoteId: z.union([z.string(), z.record(z.string())]).optional(),\n attribution: z.string().optional(),\n })\n .passthrough()\n .refine((data) => data.url || data.data || data.prefetchedData, {\n message:\n \"GeoJSON source requires at least one of: url, data, or prefetchedData. \" +\n 'Use \"url\" to fetch from an endpoint, \"data\" for inline GeoJSON, ' +\n 'or \"prefetchedData\" for build-time fetched data.',\n });\n\n/** Inferred type for GeoJSON source. */\nexport type GeoJSONSource = z.infer<typeof GeoJSONSourceSchema>;\n\n/**\n * Vector tile source configuration.\n *\n * @remarks\n * Vector tiles provide efficient rendering of large datasets.\n * Requires either a TileJSON URL or a tiles URL array.\n *\n * @example TileJSON URL\n * ```yaml\n * source:\n * type: vector\n * url: \"https://api.maptiler.com/tiles/v3/tiles.json?key=YOUR_KEY\"\n * ```\n *\n * @example Tiles Array\n * ```yaml\n * source:\n * type: vector\n * tiles:\n * - \"https://tile.example.com/{z}/{x}/{y}.pbf\"\n * minzoom: 0\n * maxzoom: 14\n * ```\n *\n * @see {@link https://maplibre.org/maplibre-style-spec/sources/#vector | MapLibre Vector Source}\n */\nexport const VectorSourceSchema = z\n .object({\n type: z.literal(\"vector\").describe(\"Source type\"),\n url: z.string().url().optional().describe(\"TileJSON URL\"),\n tiles: z\n .array(z.string().url())\n .optional()\n .describe(\"Tile URL template array\"),\n minzoom: z\n .number()\n .min(0)\n .max(24)\n .optional()\n .describe(\"Minimum zoom level\"),\n maxzoom: z\n .number()\n .min(0)\n .max(24)\n .optional()\n .describe(\"Maximum zoom level\"),\n bounds: z\n .tuple([z.number(), z.number(), z.number(), z.number()])\n .optional()\n .describe(\"Bounding box [west, south, east, north]\"),\n scheme: z\n .enum([\"xyz\", \"tms\"])\n .optional()\n .describe(\"Tile coordinate scheme\"),\n attribution: z.string().optional().describe(\"Attribution text\"),\n promoteId: z.union([z.string(), z.record(z.string())]).optional(),\n volatile: z.boolean().optional(),\n })\n .passthrough()\n .refine((data) => data.url || data.tiles, {\n message:\n 'Vector source requires either \"url\" (TileJSON) or \"tiles\" (tile URL array). ' +\n \"Provide at least one of these properties.\",\n });\n\n/** Inferred type for vector source. */\nexport type VectorSource = z.infer<typeof VectorSourceSchema>;\n\n/**\n * Raster tile source configuration.\n *\n * @remarks\n * Raster tiles for satellite imagery, hillshading, or other bitmap data.\n *\n * @example\n * ```yaml\n * source:\n * type: raster\n * tiles:\n * - \"https://tile.openstreetmap.org/{z}/{x}/{y}.png\"\n * tileSize: 256\n * maxzoom: 19\n * attribution: \"© OpenStreetMap contributors\"\n * ```\n *\n * @see {@link https://maplibre.org/maplibre-style-spec/sources/#raster | MapLibre Raster Source}\n */\nexport const RasterSourceSchema = z\n .object({\n type: z.literal(\"raster\").describe(\"Source type\"),\n url: z.string().url().optional().describe(\"TileJSON URL\"),\n tiles: z\n .array(z.string().url())\n .optional()\n .describe(\"Tile URL template array\"),\n tileSize: z\n .number()\n .int()\n .min(1)\n .default(512)\n .describe(\"Tile size in pixels\"),\n minzoom: z\n .number()\n .min(0)\n .max(24)\n .optional()\n .describe(\"Minimum zoom level\"),\n maxzoom: z\n .number()\n .min(0)\n .max(24)\n .optional()\n .describe(\"Maximum zoom level\"),\n bounds: z\n .tuple([z.number(), z.number(), z.number(), z.number()])\n .optional()\n .describe(\"Bounding box [west, south, east, north]\"),\n scheme: z\n .enum([\"xyz\", \"tms\"])\n .optional()\n .describe(\"Tile coordinate scheme\"),\n attribution: z.string().optional().describe(\"Attribution text\"),\n volatile: z.boolean().optional(),\n })\n .passthrough()\n .refine((data) => data.url || data.tiles, {\n message:\n 'Raster source requires either \"url\" (TileJSON) or \"tiles\" (tile URL array). ' +\n \"Provide at least one of these properties.\",\n });\n\n/** Inferred type for raster source. */\nexport type RasterSource = z.infer<typeof RasterSourceSchema>;\n\n/**\n * Image source configuration.\n *\n * @remarks\n * Display a single image on the map anchored to geographic coordinates.\n * Useful for overlaying maps, floor plans, or custom imagery.\n *\n * **Coordinate Order:**\n * Four corners must be specified clockwise starting from top-left:\n * 1. Top-left\n * 2. Top-right\n * 3. Bottom-right\n * 4. Bottom-left\n *\n * @example\n * ```yaml\n * source:\n * type: image\n * url: \"https://example.com/overlay.png\"\n * coordinates:\n * - [-80.425, 46.437] # top-left\n * - [-71.516, 46.437] # top-right\n * - [-71.516, 37.936] # bottom-right\n * - [-80.425, 37.936] # bottom-left\n * ```\n *\n * @see {@link https://maplibre.org/maplibre-style-spec/sources/#image | MapLibre Image Source}\n */\nexport const ImageSourceSchema = z\n .object({\n type: z.literal(\"image\").describe(\"Source type\"),\n url: z.string().url().describe(\"Image URL\"),\n coordinates: z\n .tuple([LngLatSchema, LngLatSchema, LngLatSchema, LngLatSchema])\n .describe(\n \"Four corner coordinates [topLeft, topRight, bottomRight, bottomLeft]\"\n ),\n })\n .passthrough();\n\n/** Inferred type for image source. */\nexport type ImageSource = z.infer<typeof ImageSourceSchema>;\n\n/**\n * Video source configuration.\n *\n * @remarks\n * Display video content on the map anchored to geographic coordinates.\n * Multiple URLs can be provided for browser compatibility.\n *\n * @example\n * ```yaml\n * source:\n * type: video\n * urls:\n * - \"https://example.com/video.mp4\"\n * - \"https://example.com/video.webm\"\n * coordinates:\n * - [-122.51596391201019, 37.56238816766053]\n * - [-122.51467645168304, 37.56410183312965]\n * - [-122.51309394836426, 37.563391708549425]\n * - [-122.51423120498657, 37.56161849366671]\n * ```\n *\n * @see {@link https://maplibre.org/maplibre-style-spec/sources/#video | MapLibre Video Source}\n */\nexport const VideoSourceSchema = z\n .object({\n type: z.literal(\"video\").describe(\"Source type\"),\n urls: z\n .array(z.string().url())\n .min(1)\n .describe(\"Array of video URLs for browser compatibility\"),\n coordinates: z\n .tuple([LngLatSchema, LngLatSchema, LngLatSchema, LngLatSchema])\n .describe(\n \"Four corner coordinates [topLeft, topRight, bottomRight, bottomLeft]\"\n ),\n })\n .passthrough();\n\n/** Inferred type for video source. */\nexport type VideoSource = z.infer<typeof VideoSourceSchema>;\n\n/**\n * Union of all layer source types.\n *\n * @remarks\n * Use the `type` field to determine which source type is being used.\n *\n * @example\n * ```typescript\n * const source: LayerSource = {\n * type: 'geojson',\n * url: 'https://example.com/data.geojson'\n * };\n *\n * // TypeScript knows the available fields based on type\n * if (source.type === 'geojson') {\n * console.log(source.refreshInterval); // OK\n * }\n * ```\n */\nexport const LayerSourceSchema = z.union([\n GeoJSONSourceSchema,\n VectorSourceSchema,\n RasterSourceSchema,\n ImageSourceSchema,\n VideoSourceSchema,\n]);\n\n/** Inferred type for any layer source. */\nexport type LayerSource = z.infer<typeof LayerSourceSchema>;\n","/**\n * @file Layer schemas for maplibre-yaml\n * @module @maplibre-yaml/core/schemas/layer\n *\n * @description\n * Zod schemas for all MapLibre layer types with paint/layout properties,\n * interactive events, popups, and legends.\n *\n * @example\n * ```typescript\n * import { LayerSchema, CircleLayerSchema } from '@maplibre-yaml/core/schemas';\n * ```\n */\n\nimport { z } from \"zod\";\nimport {\n ColorOrExpressionSchema,\n NumberOrExpressionSchema,\n ExpressionSchema,\n ZoomLevelSchema,\n} from \"./base.schema\";\nimport { LayerSourceSchema } from \"./source.schema\";\n\n/**\n * Content item for popup or dynamic text rendering.\n *\n * @remarks\n * Supports static strings, dynamic property interpolation, and fallback values.\n *\n * **Properties:**\n * - `str` - Static text string\n * - `property` - Feature property name to interpolate\n * - `else` - Fallback value if property is missing\n * - `format` - Number format string (e.g., \",.0f\" for thousands separator)\n * - `href` - Link URL (for anchor tags)\n * - `text` - Link text\n * - `src` - Image/iframe source URL\n * - `alt` - Image alt text\n *\n * @example Static Text\n * ```yaml\n * - str: \"Population: \"\n * ```\n *\n * @example Dynamic Property\n * ```yaml\n * - property: name\n * else: \"Unknown\"\n * ```\n *\n * @example Formatted Number\n * ```yaml\n * - property: population\n * format: \",.0f\"\n * ```\n */\nexport const PopupContentItemSchema = z\n .object({\n str: z.string().optional().describe(\"Static text string\"),\n property: z.string().optional().describe(\"Feature property name\"),\n else: z.string().optional().describe(\"Fallback value if property missing\"),\n format: z\n .string()\n .optional()\n .describe('Number format string (e.g., \",.0f\")'),\n href: z.string().url().optional().describe(\"Link URL\"),\n text: z.string().optional().describe(\"Link text\"),\n src: z.string().url().optional().describe(\"Image/iframe source\"),\n alt: z.string().optional().describe(\"Image alt text\"),\n })\n .passthrough()\n .describe(\"Popup content item with static or dynamic values\");\n\n/** Inferred type for popup content item. */\nexport type PopupContentItem = z.infer<typeof PopupContentItemSchema>;\n\n/**\n * Popup content structure.\n *\n * @remarks\n * Array of HTML elements where each element is `{ tagName: [items] }`.\n * Elements are rendered in order to build popup HTML.\n *\n * **Supported Tags:**\n * h1, h2, h3, h4, h5, h6, p, span, div, strong, em, code, pre,\n * a, img, iframe, ul, ol, li, blockquote, hr, br\n *\n * @example\n * ```yaml\n * popup:\n * - h3:\n * - property: name\n * else: \"Unknown\"\n * - p:\n * - str: \"Population: \"\n * - property: population\n * format: \",.0f\"\n * - a:\n * - href: \"https://example.com\"\n * text: \"Learn more\"\n * ```\n *\n * **Output for `{ name: \"NYC\", population: 8336817 }`:**\n * ```html\n * <h3>NYC</h3>\n * <p>Population: 8,336,817</p>\n * <a href=\"https://example.com\">Learn more</a>\n * ```\n */\nexport const PopupContentSchema = z\n .array(z.record(z.array(PopupContentItemSchema)))\n .describe(\"Popup content structure as array of HTML elements\");\n\n/** Inferred type for popup content. */\nexport type PopupContent = z.infer<typeof PopupContentSchema>;\n\n/**\n * Interactive event configuration for layers.\n *\n * @remarks\n * Defines hover and click behaviors for map features.\n *\n * **Events:**\n * - `hover` - Cursor and highlight on mouseover\n * - `click` - Popup, actions, or navigation on click\n * - `mouseenter` - Custom action on mouse enter\n * - `mouseleave` - Custom action on mouse leave\n *\n * @example Hover Cursor\n * ```yaml\n * interactive:\n * hover:\n * cursor: pointer\n * ```\n *\n * @example Click Popup\n * ```yaml\n * interactive:\n * click:\n * popup:\n * - h3:\n * - property: name\n * - p:\n * - property: description\n * ```\n *\n * @example Click with FlyTo\n * ```yaml\n * interactive:\n * click:\n * flyTo:\n * zoom: 15\n * duration: 1000\n * ```\n */\nexport const InteractiveConfigSchema = z\n .object({\n hover: z\n .object({\n cursor: z\n .string()\n .optional()\n .describe('CSS cursor style (e.g., \"pointer\")'),\n highlight: z\n .boolean()\n .optional()\n .describe(\"Highlight feature on hover\"),\n })\n .optional()\n .describe(\"Hover behavior\"),\n click: z\n .object({\n popup: PopupContentSchema.optional().describe(\n \"Popup content to display\"\n ),\n action: z.string().optional().describe(\"Custom action name to trigger\"),\n flyTo: z\n .object({\n center: z.tuple([z.number(), z.number()]).optional(),\n zoom: ZoomLevelSchema.optional(),\n duration: z.number().optional(),\n })\n .optional()\n .describe(\"Fly to location on click\"),\n })\n .optional()\n .describe(\"Click behavior\"),\n mouseenter: z\n .object({\n action: z.string().optional().describe(\"Custom action on mouse enter\"),\n })\n .optional(),\n mouseleave: z\n .object({\n action: z.string().optional().describe(\"Custom action on mouse leave\"),\n })\n .optional(),\n })\n .optional()\n .describe(\"Interactive event configuration\");\n\n/** Inferred type for interactive config. */\nexport type InteractiveConfig = z.infer<typeof InteractiveConfigSchema>;\n\n/**\n * Legend item for a layer.\n *\n * @remarks\n * Defines how the layer appears in the map legend.\n *\n * **Shape Options:**\n * - `circle` - Circular symbol\n * - `square` - Square symbol\n * - `line` - Line symbol\n * - `icon` - Custom icon\n *\n * @example\n * ```yaml\n * legend:\n * color: \"#ff0000\"\n * label: \"Earthquakes\"\n * shape: circle\n * ```\n */\nexport const LegendItemSchema = z\n .object({\n color: z.string().describe(\"CSS color value\"),\n label: z.string().describe(\"Legend label text\"),\n shape: z\n .enum([\"circle\", \"square\", \"line\", \"icon\"])\n .default(\"square\")\n .describe(\"Symbol shape\"),\n icon: z.string().optional().describe(\"Icon name or URL (for shape: icon)\"),\n })\n .describe(\"Legend item configuration\");\n\n/** Inferred type for legend item. */\nexport type LegendItem = z.infer<typeof LegendItemSchema>;\n\n/**\n * Base properties shared by all layer types.\n *\n * @remarks\n * Common configuration that applies to every layer regardless of type.\n */\nexport const BaseLayerPropertiesSchema = z.object({\n id: z.string().describe(\"Unique layer identifier\"),\n label: z.string().optional().describe(\"Human-readable layer label\"),\n source: z\n .union([LayerSourceSchema, z.string()])\n .describe(\"Layer source (inline definition or source ID reference)\"),\n \"source-layer\": z\n .string()\n .optional()\n .describe(\"Source layer name (for vector sources)\"),\n minzoom: ZoomLevelSchema.optional().describe(\n \"Minimum zoom level to show layer\"\n ),\n maxzoom: ZoomLevelSchema.optional().describe(\n \"Maximum zoom level to show layer\"\n ),\n filter: ExpressionSchema.optional().describe(\"MapLibre filter expression\"),\n visible: z.boolean().default(true).describe(\"Initial visibility state\"),\n toggleable: z\n .boolean()\n .default(true)\n .describe(\"Allow users to toggle visibility\"),\n before: z\n .string()\n .optional()\n .describe(\"Layer ID to insert this layer before\"),\n interactive: InteractiveConfigSchema.describe(\n \"Interactive event configuration\"\n ),\n legend: LegendItemSchema.optional().describe(\"Legend configuration\"),\n metadata: z.record(z.any()).optional().describe(\"Custom metadata\"),\n});\n\n/**\n * Circle layer for point data.\n *\n * @remarks\n * Renders points as circles. Supports data-driven styling via\n * MapLibre expressions for all paint properties.\n *\n * **Common Paint Properties:**\n * - `circle-radius` - Size in pixels\n * - `circle-color` - Fill color\n * - `circle-opacity` - Fill opacity (0-1)\n * - `circle-stroke-width` - Border width\n * - `circle-stroke-color` - Border color\n *\n * @example Basic Circle\n * ```yaml\n * - id: points\n * type: circle\n * source:\n * type: geojson\n * url: \"https://example.com/points.geojson\"\n * paint:\n * circle-radius: 8\n * circle-color: \"#ff0000\"\n * ```\n *\n * @example Data-Driven Radius\n * ```yaml\n * paint:\n * circle-radius:\n * - interpolate\n * - [\"linear\"]\n * - [\"get\", \"magnitude\"]\n * - 0\n * - 4\n * - 10\n * - 20\n * ```\n *\n * @see {@link https://maplibre.org/maplibre-style-spec/layers/#circle | MapLibre Circle Layer}\n */\nexport const CircleLayerSchema = BaseLayerPropertiesSchema.extend({\n type: z.literal(\"circle\").describe(\"Layer type\"),\n paint: z\n .object({\n \"circle-radius\": NumberOrExpressionSchema.optional(),\n \"circle-color\": ColorOrExpressionSchema.optional(),\n \"circle-blur\": NumberOrExpressionSchema.optional(),\n \"circle-opacity\": NumberOrExpressionSchema.optional(),\n \"circle-stroke-width\": NumberOrExpressionSchema.optional(),\n \"circle-stroke-color\": ColorOrExpressionSchema.optional(),\n \"circle-stroke-opacity\": NumberOrExpressionSchema.optional(),\n \"circle-pitch-scale\": z.enum([\"map\", \"viewport\"]).optional(),\n \"circle-pitch-alignment\": z.enum([\"map\", \"viewport\"]).optional(),\n \"circle-translate\": z.tuple([z.number(), z.number()]).optional(),\n \"circle-translate-anchor\": z.enum([\"map\", \"viewport\"]).optional(),\n })\n .passthrough()\n .optional()\n .describe(\"Circle paint properties\"),\n layout: z\n .object({})\n .passthrough()\n .optional()\n .describe(\"Circle layout properties\"),\n}).passthrough();\n\n/** Inferred type for circle layer. */\nexport type CircleLayer = z.infer<typeof CircleLayerSchema>;\n\n/**\n * Line layer for linear features.\n *\n * @remarks\n * Renders lines from LineString or Polygon geometries.\n * Supports dash patterns, gradients, and data-driven styling.\n *\n * @example Basic Line\n * ```yaml\n * - id: roads\n * type: line\n * source:\n * type: geojson\n * url: \"https://example.com/roads.geojson\"\n * paint:\n * line-color: \"#333333\"\n * line-width: 2\n * ```\n *\n * @example Dashed Line\n * ```yaml\n * paint:\n * line-color: \"#0000ff\"\n * line-width: 3\n * line-dasharray: [2, 1]\n * ```\n *\n * @see {@link https://maplibre.org/maplibre-style-spec/layers/#line | MapLibre Line Layer}\n */\nexport const LineLayerSchema = BaseLayerPropertiesSchema.extend({\n type: z.literal(\"line\").describe(\"Layer type\"),\n paint: z\n .object({\n \"line-opacity\": NumberOrExpressionSchema.optional(),\n \"line-color\": ColorOrExpressionSchema.optional(),\n \"line-width\": NumberOrExpressionSchema.optional(),\n \"line-gap-width\": NumberOrExpressionSchema.optional(),\n \"line-offset\": NumberOrExpressionSchema.optional(),\n \"line-blur\": NumberOrExpressionSchema.optional(),\n \"line-dasharray\": z.array(z.number()).optional(),\n \"line-pattern\": z.string().optional(),\n \"line-gradient\": ColorOrExpressionSchema.optional(),\n \"line-translate\": z.tuple([z.number(), z.number()]).optional(),\n \"line-translate-anchor\": z.enum([\"map\", \"viewport\"]).optional(),\n })\n .passthrough()\n .optional()\n .describe(\"Line paint properties\"),\n layout: z\n .object({\n \"line-cap\": z.enum([\"butt\", \"round\", \"square\"]).optional(),\n \"line-join\": z.enum([\"bevel\", \"round\", \"miter\"]).optional(),\n \"line-miter-limit\": z.number().optional(),\n \"line-round-limit\": z.number().optional(),\n \"line-sort-key\": NumberOrExpressionSchema.optional(),\n })\n .passthrough()\n .optional()\n .describe(\"Line layout properties\"),\n}).passthrough();\n\n/** Inferred type for line layer. */\nexport type LineLayer = z.infer<typeof LineLayerSchema>;\n\n/**\n * Fill layer for polygon data.\n *\n * @remarks\n * Renders filled polygons with optional outlines.\n *\n * @example Basic Fill\n * ```yaml\n * - id: parks\n * type: fill\n * source:\n * type: geojson\n * url: \"https://example.com/parks.geojson\"\n * paint:\n * fill-color: \"#228B22\"\n * fill-opacity: 0.5\n * fill-outline-color: \"#006400\"\n * ```\n *\n * @see {@link https://maplibre.org/maplibre-style-spec/layers/#fill | MapLibre Fill Layer}\n */\nexport const FillLayerSchema = BaseLayerPropertiesSchema.extend({\n type: z.literal(\"fill\").describe(\"Layer type\"),\n paint: z\n .object({\n \"fill-antialias\": z.boolean().optional(),\n \"fill-opacity\": NumberOrExpressionSchema.optional(),\n \"fill-color\": ColorOrExpressionSchema.optional(),\n \"fill-outline-color\": ColorOrExpressionSchema.optional(),\n \"fill-translate\": z.tuple([z.number(), z.number()]).optional(),\n \"fill-translate-anchor\": z.enum([\"map\", \"viewport\"]).optional(),\n \"fill-pattern\": z.string().optional(),\n })\n .passthrough()\n .optional()\n .describe(\"Fill paint properties\"),\n layout: z\n .object({\n \"fill-sort-key\": NumberOrExpressionSchema.optional(),\n })\n .passthrough()\n .optional()\n .describe(\"Fill layout properties\"),\n}).passthrough();\n\n/** Inferred type for fill layer. */\nexport type FillLayer = z.infer<typeof FillLayerSchema>;\n\n/**\n * Symbol layer for icons and text.\n *\n * @remarks\n * Renders icons, text labels, or both. Most complex layer type with\n * extensive styling options for typography and icon placement.\n *\n * @example Icon\n * ```yaml\n * - id: markers\n * type: symbol\n * source:\n * type: geojson\n * url: \"https://example.com/markers.geojson\"\n * layout:\n * icon-image: \"marker-15\"\n * icon-size: 1.5\n * ```\n *\n * @example Text Label\n * ```yaml\n * layout:\n * text-field: [\"get\", \"name\"]\n * text-size: 12\n * text-anchor: top\n * paint:\n * text-color: \"#000000\"\n * text-halo-color: \"#ffffff\"\n * text-halo-width: 2\n * ```\n *\n * @see {@link https://maplibre.org/maplibre-style-spec/layers/#symbol | MapLibre Symbol Layer}\n */\nexport const SymbolLayerSchema = BaseLayerPropertiesSchema.extend({\n type: z.literal(\"symbol\").describe(\"Layer type\"),\n layout: z\n .object({\n \"symbol-placement\": z.enum([\"point\", \"line\", \"line-center\"]).optional(),\n \"symbol-spacing\": z.number().optional(),\n \"symbol-avoid-edges\": z.boolean().optional(),\n \"symbol-sort-key\": NumberOrExpressionSchema.optional(),\n \"symbol-z-order\": z.enum([\"auto\", \"viewport-y\", \"source\"]).optional(),\n \"icon-allow-overlap\": z.boolean().optional(),\n \"icon-ignore-placement\": z.boolean().optional(),\n \"icon-optional\": z.boolean().optional(),\n \"icon-rotation-alignment\": z.enum([\"map\", \"viewport\", \"auto\"]).optional(),\n \"icon-size\": NumberOrExpressionSchema.optional(),\n \"icon-text-fit\": z.enum([\"none\", \"width\", \"height\", \"both\"]).optional(),\n \"icon-text-fit-padding\": z\n .tuple([z.number(), z.number(), z.number(), z.number()])\n .optional(),\n \"icon-image\": z.union([z.string(), ExpressionSchema]).optional(),\n \"icon-rotate\": NumberOrExpressionSchema.optional(),\n \"icon-padding\": z.number().optional(),\n \"icon-keep-upright\": z.boolean().optional(),\n \"icon-offset\": z.tuple([z.number(), z.number()]).optional(),\n \"icon-anchor\": z\n .enum([\n \"center\",\n \"left\",\n \"right\",\n \"top\",\n \"bottom\",\n \"top-left\",\n \"top-right\",\n \"bottom-left\",\n \"bottom-right\",\n ])\n .optional(),\n \"icon-pitch-alignment\": z.enum([\"map\", \"viewport\", \"auto\"]).optional(),\n \"text-pitch-alignment\": z.enum([\"map\", \"viewport\", \"auto\"]).optional(),\n \"text-rotation-alignment\": z.enum([\"map\", \"viewport\", \"auto\"]).optional(),\n \"text-field\": z.union([z.string(), ExpressionSchema]).optional(),\n \"text-font\": z.array(z.string()).optional(),\n \"text-size\": NumberOrExpressionSchema.optional(),\n \"text-max-width\": NumberOrExpressionSchema.optional(),\n \"text-line-height\": z.number().optional(),\n \"text-letter-spacing\": z.number().optional(),\n \"text-justify\": z.enum([\"auto\", \"left\", \"center\", \"right\"]).optional(),\n \"text-radial-offset\": z.number().optional(),\n \"text-variable-anchor\": z\n .array(\n z.enum([\n \"center\",\n \"left\",\n \"right\",\n \"top\",\n \"bottom\",\n \"top-left\",\n \"top-right\",\n \"bottom-left\",\n \"bottom-right\",\n ])\n )\n .optional(),\n \"text-anchor\": z\n .enum([\n \"center\",\n \"left\",\n \"right\",\n \"top\",\n \"bottom\",\n \"top-left\",\n \"top-right\",\n \"bottom-left\",\n \"bottom-right\",\n ])\n .optional(),\n \"text-max-angle\": z.number().optional(),\n \"text-rotate\": NumberOrExpressionSchema.optional(),\n \"text-padding\": z.number().optional(),\n \"text-keep-upright\": z.boolean().optional(),\n \"text-transform\": z.enum([\"none\", \"uppercase\", \"lowercase\"]).optional(),\n \"text-offset\": z.tuple([z.number(), z.number()]).optional(),\n \"text-allow-overlap\": z.boolean().optional(),\n \"text-ignore-placement\": z.boolean().optional(),\n \"text-optional\": z.boolean().optional(),\n })\n .passthrough()\n .optional()\n .describe(\"Symbol layout properties\"),\n paint: z\n .object({\n \"icon-opacity\": NumberOrExpressionSchema.optional(),\n \"icon-color\": ColorOrExpressionSchema.optional(),\n \"icon-halo-color\": ColorOrExpressionSchema.optional(),\n \"icon-halo-width\": NumberOrExpressionSchema.optional(),\n \"icon-halo-blur\": NumberOrExpressionSchema.optional(),\n \"icon-translate\": z.tuple([z.number(), z.number()]).optional(),\n \"icon-translate-anchor\": z.enum([\"map\", \"viewport\"]).optional(),\n \"text-opacity\": NumberOrExpressionSchema.optional(),\n \"text-color\": ColorOrExpressionSchema.optional(),\n \"text-halo-color\": ColorOrExpressionSchema.optional(),\n \"text-halo-width\": NumberOrExpressionSchema.optional(),\n \"text-halo-blur\": NumberOrExpressionSchema.optional(),\n \"text-translate\": z.tuple([z.number(), z.number()]).optional(),\n \"text-translate-anchor\": z.enum([\"map\", \"viewport\"]).optional(),\n })\n .passthrough()\n .optional()\n .describe(\"Symbol paint properties\"),\n}).passthrough();\n\n/** Inferred type for symbol layer. */\nexport type SymbolLayer = z.infer<typeof SymbolLayerSchema>;\n\n/**\n * Raster layer for raster tiles or images.\n *\n * @remarks\n * Renders raster imagery with opacity and blending controls.\n *\n * @example\n * ```yaml\n * - id: satellite\n * type: raster\n * source:\n * type: raster\n * tiles: [\"https://tile.example.com/{z}/{x}/{y}.png\"]\n * paint:\n * raster-opacity: 0.8\n * ```\n *\n * @see {@link https://maplibre.org/maplibre-style-spec/layers/#raster | MapLibre Raster Layer}\n */\nexport const RasterLayerSchema = BaseLayerPropertiesSchema.extend({\n type: z.literal(\"raster\").describe(\"Layer type\"),\n paint: z\n .object({\n \"raster-opacity\": NumberOrExpressionSchema.optional(),\n \"raster-hue-rotate\": NumberOrExpressionSchema.optional(),\n \"raster-brightness-min\": NumberOrExpressionSchema.optional(),\n \"raster-brightness-max\": NumberOrExpressionSchema.optional(),\n \"raster-saturation\": NumberOrExpressionSchema.optional(),\n \"raster-contrast\": NumberOrExpressionSchema.optional(),\n \"raster-resampling\": z.enum([\"linear\", \"nearest\"]).optional(),\n \"raster-fade-duration\": z.number().optional(),\n })\n .passthrough()\n .optional()\n .describe(\"Raster paint properties\"),\n layout: z\n .object({})\n .passthrough()\n .optional()\n .describe(\"Raster layout properties\"),\n}).passthrough();\n\n/** Inferred type for raster layer. */\nexport type RasterLayer = z.infer<typeof RasterLayerSchema>;\n\n/**\n * Fill extrusion layer for 3D buildings and structures.\n *\n * @remarks\n * Renders filled polygons extruded in 3D space.\n *\n * @example 3D Buildings\n * ```yaml\n * - id: buildings\n * type: fill-extrusion\n * source:\n * type: vector\n * url: \"https://example.com/buildings.json\"\n * source-layer: buildings\n * paint:\n * fill-extrusion-color: \"#aaaaaa\"\n * fill-extrusion-height: [\"get\", \"height\"]\n * fill-extrusion-base: [\"get\", \"min_height\"]\n * fill-extrusion-opacity: 0.8\n * ```\n *\n * @see {@link https://maplibre.org/maplibre-style-spec/layers/#fill-extrusion | MapLibre Fill Extrusion Layer}\n */\nexport const FillExtrusionLayerSchema = BaseLayerPropertiesSchema.extend({\n type: z.literal(\"fill-extrusion\").describe(\"Layer type\"),\n paint: z\n .object({\n \"fill-extrusion-opacity\": NumberOrExpressionSchema.optional(),\n \"fill-extrusion-color\": ColorOrExpressionSchema.optional(),\n \"fill-extrusion-translate\": z.tuple([z.number(), z.number()]).optional(),\n \"fill-extrusion-translate-anchor\": z.enum([\"map\", \"viewport\"]).optional(),\n \"fill-extrusion-pattern\": z.string().optional(),\n \"fill-extrusion-height\": NumberOrExpressionSchema.optional(),\n \"fill-extrusion-base\": NumberOrExpressionSchema.optional(),\n \"fill-extrusion-vertical-gradient\": z.boolean().optional(),\n })\n .passthrough()\n .optional()\n .describe(\"Fill extrusion paint properties\"),\n layout: z\n .object({})\n .passthrough()\n .optional()\n .describe(\"Fill extrusion layout properties\"),\n}).passthrough();\n\n/** Inferred type for fill extrusion layer. */\nexport type FillExtrusionLayer = z.infer<typeof FillExtrusionLayerSchema>;\n\n/**\n * Heatmap layer for point density visualization.\n *\n * @remarks\n * Renders point data as a smooth heatmap with color gradients.\n *\n * @example\n * ```yaml\n * - id: earthquakes-heat\n * type: heatmap\n * source:\n * type: geojson\n * url: \"https://example.com/earthquakes.geojson\"\n * paint:\n * heatmap-intensity: 1\n * heatmap-radius: 20\n * heatmap-color:\n * - interpolate\n * - [\"linear\"]\n * - [\"heatmap-density\"]\n * - 0\n * - \"rgba(0,0,255,0)\"\n * - 0.5\n * - \"yellow\"\n * - 1\n * - \"red\"\n * ```\n *\n * @see {@link https://maplibre.org/maplibre-style-spec/layers/#heatmap | MapLibre Heatmap Layer}\n */\nexport const HeatmapLayerSchema = BaseLayerPropertiesSchema.extend({\n type: z.literal(\"heatmap\").describe(\"Layer type\"),\n paint: z\n .object({\n \"heatmap-radius\": NumberOrExpressionSchema.optional(),\n \"heatmap-weight\": NumberOrExpressionSchema.optional(),\n \"heatmap-intensity\": NumberOrExpressionSchema.optional(),\n \"heatmap-color\": ColorOrExpressionSchema.optional(),\n \"heatmap-opacity\": NumberOrExpressionSchema.optional(),\n })\n .passthrough()\n .optional()\n .describe(\"Heatmap paint properties\"),\n layout: z\n .object({})\n .passthrough()\n .optional()\n .describe(\"Heatmap layout properties\"),\n}).passthrough();\n\n/** Inferred type for heatmap layer. */\nexport type HeatmapLayer = z.infer<typeof HeatmapLayerSchema>;\n\n/**\n * Hillshade layer for terrain visualization.\n *\n * @remarks\n * Renders raster DEM data as hillshading.\n *\n * @example\n * ```yaml\n * - id: hillshade\n * type: hillshade\n * source:\n * type: raster-dem\n * url: \"https://example.com/terrain.json\"\n * paint:\n * hillshade-illumination-direction: 315\n * hillshade-exaggeration: 0.5\n * ```\n *\n * @see {@link https://maplibre.org/maplibre-style-spec/layers/#hillshade | MapLibre Hillshade Layer}\n */\nexport const HillshadeLayerSchema = BaseLayerPropertiesSchema.extend({\n type: z.literal(\"hillshade\").describe(\"Layer type\"),\n paint: z\n .object({\n \"hillshade-illumination-direction\": z.number().optional(),\n \"hillshade-illumination-anchor\": z.enum([\"map\", \"viewport\"]).optional(),\n \"hillshade-exaggeration\": NumberOrExpressionSchema.optional(),\n \"hillshade-shadow-color\": ColorOrExpressionSchema.optional(),\n \"hillshade-highlight-color\": ColorOrExpressionSchema.optional(),\n \"hillshade-accent-color\": ColorOrExpressionSchema.optional(),\n })\n .passthrough()\n .optional()\n .describe(\"Hillshade paint properties\"),\n layout: z\n .object({})\n .passthrough()\n .optional()\n .describe(\"Hillshade layout properties\"),\n}).passthrough();\n\n/** Inferred type for hillshade layer. */\nexport type HillshadeLayer = z.infer<typeof HillshadeLayerSchema>;\n\n/**\n * Background layer for solid color backgrounds.\n *\n * @remarks\n * Renders a solid color or pattern as the map background.\n * Only one background layer is typically used per style.\n *\n * @example\n * ```yaml\n * - id: background\n * type: background\n * paint:\n * background-color: \"#f0f0f0\"\n * ```\n *\n * @see {@link https://maplibre.org/maplibre-style-spec/layers/#background | MapLibre Background Layer}\n */\nexport const BackgroundLayerSchema = z\n .object({\n id: z.string().describe(\"Unique layer identifier\"),\n type: z.literal(\"background\").describe(\"Layer type\"),\n paint: z\n .object({\n \"background-color\": ColorOrExpressionSchema.optional(),\n \"background-pattern\": z.string().optional(),\n \"background-opacity\": NumberOrExpressionSchema.optional(),\n })\n .passthrough()\n .optional()\n .describe(\"Background paint properties\"),\n layout: z\n .object({})\n .passthrough()\n .optional()\n .describe(\"Background layout properties\"),\n metadata: z.record(z.any()).optional().describe(\"Custom metadata\"),\n })\n .passthrough();\n\n/** Inferred type for background layer. */\nexport type BackgroundLayer = z.infer<typeof BackgroundLayerSchema>;\n\n/**\n * Union of all layer types.\n *\n * @remarks\n * Use the `type` field to determine which layer type is being used.\n *\n * @example\n * ```typescript\n * const layer: Layer = {\n * id: 'my-layer',\n * type: 'circle',\n * source: { type: 'geojson', url: '...' },\n * paint: { 'circle-radius': 8 }\n * };\n * ```\n */\nexport const LayerSchema = z.union([\n CircleLayerSchema,\n LineLayerSchema,\n FillLayerSchema,\n SymbolLayerSchema,\n RasterLayerSchema,\n FillExtrusionLayerSchema,\n HeatmapLayerSchema,\n HillshadeLayerSchema,\n BackgroundLayerSchema,\n]);\n\n/** Inferred type for any layer. */\nexport type Layer = z.infer<typeof LayerSchema>;\n\n/**\n * Layer reference for reusing global layer definitions.\n *\n * @remarks\n * References a layer defined in the global `layers` object using\n * JSON Pointer-like syntax: `#/layers/layerName`\n *\n * @example\n * ```yaml\n * # Global definition\n * layers:\n * bikeLayer:\n * id: bikes\n * type: line\n * # ...\n *\n * # Reference in map\n * pages:\n * - blocks:\n * - layers:\n * - $ref: \"#/layers/bikeLayer\"\n * ```\n */\nexport const LayerReferenceSchema = z\n .object({\n $ref: z\n .string()\n .describe('Reference to global layer (e.g., \"#/layers/bikeLayer\")'),\n })\n .describe(\"Layer reference\");\n\n/** Inferred type for layer reference. */\nexport type LayerReference = z.infer<typeof LayerReferenceSchema>;\n\n/**\n * Union of layer or layer reference.\n *\n * @remarks\n * Layers can be defined inline or referenced from global definitions.\n */\nexport const LayerOrReferenceSchema = z.union([\n LayerSchema,\n LayerReferenceSchema,\n]);\n\n/** Inferred type for layer or reference. */\nexport type LayerOrReference = z.infer<typeof LayerOrReferenceSchema>;\n","/**\n * @file Map block schemas for maplibre-yaml\n * @module @maplibre-yaml/core/schemas/map\n *\n * @description\n * Zod schemas for map configuration, controls, legends, and map blocks.\n *\n * @example\n * ```typescript\n * import { MapConfigSchema, MapBlockSchema } from '@maplibre-yaml/core/schemas';\n * ```\n */\n\nimport { z } from \"zod\";\nimport {\n LngLatSchema,\n LngLatBoundsSchema,\n ZoomLevelSchema,\n} from \"./base.schema\";\nimport { LayerOrReferenceSchema } from \"./layer.schema\";\n\n/**\n * Control position on the map.\n *\n * @remarks\n * Controls can be positioned in any of the four corners.\n */\nexport const ControlPositionSchema = z.enum([\n \"top-left\",\n \"top-right\",\n \"bottom-left\",\n \"bottom-right\",\n]);\n\n/** Inferred type for control position. */\nexport type ControlPosition = z.infer<typeof ControlPositionSchema>;\n\n/**\n * Individual control configuration.\n *\n * @remarks\n * Can be a boolean (uses default position) or an object with position.\n */\nconst ControlConfigSchema = z.union([\n z.boolean(),\n z.object({\n enabled: z.boolean().describe(\"Whether control is enabled\"),\n position: ControlPositionSchema.optional().describe(\"Control position\"),\n }),\n]);\n\n/**\n * Map controls configuration.\n *\n * @remarks\n * Configure which controls are displayed and their positions.\n *\n * **Available Controls:**\n * - `navigation` - Zoom and rotation controls (default: top-right)\n * - `geolocate` - User geolocation (default: top-right)\n * - `scale` - Distance scale (default: bottom-left)\n * - `fullscreen` - Fullscreen toggle (default: top-right)\n * - `attribution` - Attribution text (default: bottom-right)\n *\n * @example Enable All Controls\n * ```yaml\n * controls:\n * navigation: true\n * geolocate: true\n * scale: true\n * fullscreen: true\n * ```\n *\n * @example Custom Positions\n * ```yaml\n * controls:\n * navigation:\n * enabled: true\n * position: top-left\n * scale:\n * enabled: true\n * position: bottom-right\n * ```\n */\nexport const ControlsConfigSchema = z\n .object({\n navigation: ControlConfigSchema.optional().describe(\n \"Navigation controls (zoom, rotation)\"\n ),\n geolocate: ControlConfigSchema.optional().describe(\"Geolocation control\"),\n scale: ControlConfigSchema.optional().describe(\"Scale control\"),\n fullscreen: ControlConfigSchema.optional().describe(\"Fullscreen control\"),\n attribution: ControlConfigSchema.optional().describe(\"Attribution control\"),\n })\n .describe(\"Map controls configuration\");\n\n/** Inferred type for controls config. */\nexport type ControlsConfig = z.infer<typeof ControlsConfigSchema>;\n\n/**\n * Legend configuration.\n *\n * @remarks\n * The legend displays layer information and can be positioned anywhere.\n * If `items` is not provided, legend items are automatically extracted\n * from layers with `legend` configuration.\n *\n * @example Automatic Legend\n * ```yaml\n * legend:\n * title: \"Map Legend\"\n * position: top-left\n * ```\n *\n * @example Custom Legend Items\n * ```yaml\n * legend:\n * title: \"Features\"\n * position: top-left\n * collapsed: false\n * items:\n * - color: \"#ff0000\"\n * label: \"High Priority\"\n * shape: circle\n * - color: \"#00ff00\"\n * label: \"Low Priority\"\n * shape: circle\n * ```\n */\nexport const LegendConfigSchema = z\n .object({\n position:\n ControlPositionSchema.default(\"top-left\").describe(\"Legend position\"),\n title: z.string().optional().describe(\"Legend title\"),\n collapsed: z.boolean().default(false).describe(\"Start collapsed\"),\n items: z\n .array(\n z.object({\n color: z.string().describe(\"Item color\"),\n label: z.string().describe(\"Item label\"),\n shape: z\n .enum([\"circle\", \"square\", \"line\", \"icon\"])\n .default(\"square\")\n .describe(\"Symbol shape\"),\n icon: z\n .string()\n .optional()\n .describe(\"Icon name/URL (for shape: icon)\"),\n })\n )\n .optional()\n .describe(\"Custom legend items (overrides layer legends)\"),\n })\n .describe(\"Legend configuration\");\n\n/** Inferred type for legend config. */\nexport type LegendConfig = z.infer<typeof LegendConfigSchema>;\n\n/**\n * Map configuration with MapLibre options.\n *\n * @remarks\n * Core map configuration including initial view, style, and interaction settings.\n * Uses `.passthrough()` to allow any MapLibre GL JS options.\n *\n * **Required:**\n * - `center` - Initial map center [lng, lat]\n * - `zoom` - Initial zoom level (0-24)\n * - `mapStyle` - MapLibre style URL or object\n *\n * **View Options:**\n * - `pitch` - Camera tilt angle (0-85)\n * - `bearing` - Camera rotation (0-360)\n * - `bounds` - Fit to bounds\n * - `minZoom`, `maxZoom` - Zoom constraints\n * - `minPitch`, `maxPitch` - Pitch constraints\n * - `maxBounds` - Geographic bounds constraint\n *\n * **Interaction:**\n * - `interactive` - Enable/disable all interactions\n * - `scrollZoom`, `boxZoom`, `dragRotate`, `dragPan` - Individual controls\n * - `keyboard`, `doubleClickZoom`, `touchZoomRotate`, `touchPitch`\n *\n * @example Basic Map\n * ```yaml\n * config:\n * center: [-74.006, 40.7128]\n * zoom: 12\n * mapStyle: \"https://demotiles.maplibre.org/style.json\"\n * ```\n *\n * @example 3D View\n * ```yaml\n * config:\n * center: [-122.4194, 37.7749]\n * zoom: 15\n * pitch: 60\n * bearing: 30\n * mapStyle: \"https://demotiles.maplibre.org/style.json\"\n * ```\n *\n * @example Constrained Map\n * ```yaml\n * config:\n * center: [-74.006, 40.7128]\n * zoom: 12\n * minZoom: 8\n * maxZoom: 18\n * maxBounds: [-74.3, 40.5, -73.7, 40.9]\n * mapStyle: \"https://demotiles.maplibre.org/style.json\"\n * ```\n *\n * @example Non-Interactive Map\n * ```yaml\n * config:\n * center: [-74.006, 40.7128]\n * zoom: 12\n * interactive: false\n * mapStyle: \"https://demotiles.maplibre.org/style.json\"\n * ```\n *\n * @see {@link https://maplibre.org/maplibre-gl-js/docs/API/type-aliases/MapOptions/ | MapLibre Map Options}\n */\nexport const MapConfigSchema = z\n .object({\n // Required\n center: LngLatSchema.describe(\"Initial map center [longitude, latitude]\"),\n zoom: ZoomLevelSchema.describe(\"Initial zoom level (0-24)\"),\n mapStyle: z\n .union([z.string().url(), z.any()])\n .describe(\"MapLibre style URL or style object\"),\n\n // View\n pitch: z\n .number()\n .min(0)\n .max(85)\n .default(0)\n .describe(\"Camera pitch angle in degrees (0-85)\"),\n bearing: z\n .number()\n .min(-180)\n .max(180)\n .default(0)\n .describe(\"Camera bearing (rotation) in degrees (-180 to 180)\"),\n bounds: z\n .union([LngLatBoundsSchema, z.array(z.number())])\n .optional()\n .describe(\"Fit map to bounds\"),\n\n // Constraints\n minZoom: ZoomLevelSchema.optional().describe(\"Minimum zoom level\"),\n maxZoom: ZoomLevelSchema.optional().describe(\"Maximum zoom level\"),\n minPitch: z.number().min(0).max(85).optional().describe(\"Minimum pitch\"),\n maxPitch: z.number().min(0).max(85).optional().describe(\"Maximum pitch\"),\n maxBounds: LngLatBoundsSchema.optional().describe(\n \"Maximum geographic bounds\"\n ),\n\n // Interaction\n interactive: z.boolean().default(true).describe(\"Enable map interaction\"),\n scrollZoom: z.boolean().optional().describe(\"Enable scroll to zoom\"),\n boxZoom: z.boolean().optional().describe(\"Enable box zoom (shift+drag)\"),\n dragRotate: z.boolean().optional().describe(\"Enable drag to rotate\"),\n dragPan: z.boolean().optional().describe(\"Enable drag to pan\"),\n keyboard: z.boolean().optional().describe(\"Enable keyboard shortcuts\"),\n doubleClickZoom: z\n .boolean()\n .optional()\n .describe(\"Enable double-click zoom\"),\n touchZoomRotate: z\n .boolean()\n .optional()\n .describe(\"Enable touch zoom/rotate\"),\n touchPitch: z.boolean().optional().describe(\"Enable touch pitch\"),\n\n // Display\n hash: z.boolean().optional().describe(\"Sync map state with URL hash\"),\n attributionControl: z\n .boolean()\n .optional()\n .describe(\"Show attribution control\"),\n logoPosition: ControlPositionSchema.optional().describe(\n \"MapLibre logo position\"\n ),\n fadeDuration: z\n .number()\n .optional()\n .describe(\"Fade duration in milliseconds\"),\n crossSourceCollisions: z\n .boolean()\n .optional()\n .describe(\"Check for cross-source collisions\"),\n\n // Rendering\n antialias: z.boolean().optional().describe(\"Enable antialiasing\"),\n refreshExpiredTiles: z\n .boolean()\n .optional()\n .describe(\"Refresh expired tiles\"),\n renderWorldCopies: z\n .boolean()\n .optional()\n .describe(\"Render multiple world copies\"),\n locale: z.record(z.string()).optional().describe(\"Localization strings\"),\n\n // Performance\n maxTileCacheSize: z.number().optional().describe(\"Maximum tiles to cache\"),\n localIdeographFontFamily: z\n .string()\n .optional()\n .describe(\"Font for CJK characters\"),\n trackResize: z.boolean().optional().describe(\"Track container resize\"),\n preserveDrawingBuffer: z\n .boolean()\n .optional()\n .describe(\"Preserve drawing buffer\"),\n failIfMajorPerformanceCaveat: z\n .boolean()\n .optional()\n .describe(\"Fail if major performance caveat\"),\n })\n .passthrough()\n .describe(\"Map configuration with MapLibre options\");\n\n/** Inferred type for map config. */\nexport type MapConfig = z.infer<typeof MapConfigSchema>;\n\n/**\n * Standard map block.\n *\n * @remarks\n * Creates a map within a page layout. Can be sized using CSS via\n * `className` and `style` properties.\n *\n * @example Basic Map Block\n * ```yaml\n * - type: map\n * id: main-map\n * config:\n * center: [-74.006, 40.7128]\n * zoom: 12\n * mapStyle: \"https://demotiles.maplibre.org/style.json\"\n * layers:\n * - id: points\n * type: circle\n * source:\n * type: geojson\n * url: \"https://example.com/points.geojson\"\n * paint:\n * circle-radius: 8\n * circle-color: \"#ff0000\"\n * ```\n *\n * @example Map with Controls and Legend\n * ```yaml\n * - type: map\n * id: interactive-map\n * config:\n * center: [-74.006, 40.7128]\n * zoom: 12\n * mapStyle: \"https://demotiles.maplibre.org/style.json\"\n * layers:\n * - $ref: \"#/layers/bikeLayer\"\n * - $ref: \"#/layers/parkLayer\"\n * controls:\n * navigation: true\n * scale: true\n * legend:\n * title: \"Map Features\"\n * position: top-left\n * ```\n *\n * @example Sized Map\n * ```yaml\n * - type: map\n * id: small-map\n * className: \"map-container\"\n * style: \"height: 400px; width: 100%;\"\n * config:\n * center: [0, 0]\n * zoom: 2\n * mapStyle: \"https://demotiles.maplibre.org/style.json\"\n * ```\n */\nexport const MapBlockSchema: z.ZodObject<any> = z\n .object({\n type: z.literal(\"map\").describe(\"Block type\"),\n id: z.string().describe(\"Unique block identifier\"),\n className: z.string().optional().describe(\"CSS class name for container\"),\n style: z.string().optional().describe(\"Inline CSS styles for container\"),\n config: MapConfigSchema.describe(\"Map configuration\"),\n layers: z.array(LayerOrReferenceSchema).default([]).describe(\"Map layers\"),\n controls: ControlsConfigSchema.optional().describe(\"Map controls\"),\n legend: LegendConfigSchema.optional().describe(\"Legend configuration\"),\n })\n .describe(\"Standard map block\");\n\n/** Inferred type for map block. */\nexport type MapBlock = z.infer<typeof MapBlockSchema>;\n\n/**\n * Full-page map block.\n *\n * @remarks\n * Creates a map that fills the entire viewport. Automatically handles\n * viewport sizing and positioning. Ideal for map-focused pages.\n *\n * @example Full-Page Map\n * ```yaml\n * - type: map-fullpage\n * id: fullpage-map\n * config:\n * center: [-122.4194, 37.7749]\n * zoom: 13\n * pitch: 45\n * mapStyle: \"https://demotiles.maplibre.org/style.json\"\n * layers:\n * - id: buildings\n * type: fill-extrusion\n * source:\n * type: vector\n * url: \"https://example.com/buildings.json\"\n * source-layer: buildings\n * paint:\n * fill-extrusion-color: \"#aaa\"\n * fill-extrusion-height: [\"get\", \"height\"]\n * controls:\n * navigation: true\n * fullscreen: true\n * ```\n */\nexport const MapFullPageBlockSchema: z.ZodObject<any> = z\n .object({\n type: z.literal(\"map-fullpage\").describe(\"Block type\"),\n id: z.string().describe(\"Unique block identifier\"),\n className: z.string().optional().describe(\"CSS class name for container\"),\n style: z.string().optional().describe(\"Inline CSS styles for container\"),\n config: MapConfigSchema.describe(\"Map configuration\"),\n layers: z.array(LayerOrReferenceSchema).default([]).describe(\"Map layers\"),\n controls: ControlsConfigSchema.optional().describe(\"Map controls\"),\n legend: LegendConfigSchema.optional().describe(\"Legend configuration\"),\n })\n .describe(\"Full-page map block\");\n\n/** Inferred type for full-page map block. */\nexport type MapFullPageBlock = z.infer<typeof MapFullPageBlockSchema>;\n","/**\n * @file Scrollytelling schemas for maplibre-yaml\n * @module @maplibre-yaml/core/schemas/scrollytelling\n *\n * @description\n * Zod schemas for narrative scrollytelling maps with chapters, animations,\n * and layer transitions.\n *\n * @example\n * ```typescript\n * import { ScrollytellingBlockSchema, ChapterSchema } from '@maplibre-yaml/core/schemas';\n * ```\n */\n\nimport { z } from \"zod\";\nimport { LngLatSchema, ExpressionSchema } from \"./base.schema\";\nimport { MapConfigSchema } from \"./map.schema\";\nimport { LayerOrReferenceSchema } from \"./layer.schema\";\n\n/**\n * Chapter action for map state changes.\n *\n * @remarks\n * Actions are triggered when entering or exiting a chapter.\n * They can modify layer properties, filters, or trigger animations.\n *\n * **Action Types:**\n * - `setFilter` - Update layer filter\n * - `setPaintProperty` - Update layer paint property\n * - `setLayoutProperty` - Update layer layout property\n * - `flyTo` - Fly to location (handled by chapter config)\n * - `easeTo` - Ease to location (handled by chapter config)\n * - `fitBounds` - Fit to bounds\n * - `custom` - Custom action (handled by application)\n *\n * @example Set Filter\n * ```yaml\n * onChapterEnter:\n * - action: setFilter\n * layer: earthquakes\n * filter: [\">=\", [\"get\", \"magnitude\"], 5]\n * ```\n *\n * @example Set Paint Property\n * ```yaml\n * onChapterEnter:\n * - action: setPaintProperty\n * layer: buildings\n * property: fill-extrusion-height\n * value: [\"get\", \"height\"]\n * ```\n *\n * @example Fit Bounds\n * ```yaml\n * onChapterEnter:\n * - action: fitBounds\n * bounds: [-74.3, 40.5, -73.7, 40.9]\n * options:\n * padding: 50\n * duration: 1000\n * ```\n */\nexport const ChapterActionSchema = z\n .object({\n action: z\n .enum([\n \"setFilter\",\n \"setPaintProperty\",\n \"setLayoutProperty\",\n \"flyTo\",\n \"easeTo\",\n \"fitBounds\",\n \"custom\",\n ])\n .describe(\"Action type\"),\n layer: z.string().optional().describe(\"Target layer ID\"),\n property: z\n .string()\n .optional()\n .describe(\"Property name (for setPaintProperty/setLayoutProperty)\"),\n value: z.any().optional().describe(\"Property value\"),\n filter: ExpressionSchema.nullable()\n .optional()\n .describe(\"Filter expression (for setFilter, null to clear)\"),\n bounds: z\n .array(z.number())\n .optional()\n .describe(\"Bounds array (for fitBounds)\"),\n options: z.record(z.any()).optional().describe(\"Additional options\"),\n })\n .describe(\"Chapter action for map state changes\");\n\n/** Inferred type for chapter action. */\nexport type ChapterAction = z.infer<typeof ChapterActionSchema>;\n\n/**\n * Chapter layer visibility configuration.\n *\n * @remarks\n * Controls which layers are visible during this chapter.\n *\n * @example\n * ```yaml\n * layers:\n * show:\n * - earthquakes\n * - fault-lines\n * hide:\n * - buildings\n * ```\n */\nexport const ChapterLayersSchema = z\n .object({\n show: z.array(z.string()).default([]).describe(\"Layer IDs to show\"),\n hide: z.array(z.string()).default([]).describe(\"Layer IDs to hide\"),\n })\n .describe(\"Chapter layer visibility configuration\");\n\n/** Inferred type for chapter layers. */\nexport type ChapterLayers = z.infer<typeof ChapterLayersSchema>;\n\n/**\n * Scrollytelling chapter.\n *\n * @remarks\n * A chapter represents one section of the scrollytelling narrative.\n * As the user scrolls, the map transitions between chapters with\n * camera animations and layer changes.\n *\n * **Required:**\n * - `id` - Unique chapter identifier\n * - `title` - Chapter title\n * - `center` - Map center for this chapter\n * - `zoom` - Zoom level for this chapter\n *\n * **Content:**\n * - `description` - HTML description (supports markdown)\n * - `image` - Hero image URL\n * - `video` - Video URL\n *\n * **Camera:**\n * - `pitch` - Camera tilt (0-85)\n * - `bearing` - Camera rotation (-180 to 180)\n * - `animation` - Animation type (flyTo, easeTo, jumpTo)\n * - `speed`, `curve` - Animation parameters\n *\n * **Layout:**\n * - `alignment` - Content position (left, right, center, full)\n * - `hidden` - Hide chapter content (map-only)\n *\n * **Interactivity:**\n * - `layers` - Show/hide layers\n * - `onChapterEnter`, `onChapterExit` - Actions\n *\n * @example Basic Chapter\n * ```yaml\n * - id: intro\n * title: \"Welcome\"\n * description: \"This is the introduction.\"\n * center: [-74.006, 40.7128]\n * zoom: 12\n * ```\n *\n * @example Chapter with 3D View\n * ```yaml\n * - id: downtown\n * title: \"Downtown\"\n * description: \"Explore the city center in 3D.\"\n * center: [-74.006, 40.7128]\n * zoom: 16\n * pitch: 60\n * bearing: 30\n * ```\n *\n * @example Chapter with Media\n * ```yaml\n * - id: overview\n * title: \"City Overview\"\n * description: \"A bird's eye view of the city.\"\n * image: \"https://example.com/overview.jpg\"\n * center: [-74.006, 40.7128]\n * zoom: 10\n * ```\n *\n * @example Chapter with Layer Control\n * ```yaml\n * - id: earthquakes\n * title: \"Recent Earthquakes\"\n * description: \"Major earthquakes in the last month.\"\n * center: [-120, 35]\n * zoom: 6\n * layers:\n * show:\n * - earthquakes\n * - fault-lines\n * hide:\n * - cities\n * ```\n *\n * @example Chapter with Actions\n * ```yaml\n * - id: filtered\n * title: \"High Magnitude Events\"\n * center: [-120, 35]\n * zoom: 6\n * onChapterEnter:\n * - action: setFilter\n * layer: earthquakes\n * filter: [\">=\", [\"get\", \"magnitude\"], 5]\n * onChapterExit:\n * - action: setFilter\n * layer: earthquakes\n * filter: null\n * ```\n *\n * @example Full-Width Chapter\n * ```yaml\n * - id: fullwidth\n * title: \"Immersive View\"\n * alignment: full\n * center: [-74.006, 40.7128]\n * zoom: 14\n * pitch: 45\n * ```\n */\nexport const ChapterSchema = z\n .object({\n // Required\n id: z.string().describe(\"Unique chapter identifier\"),\n title: z.string().describe(\"Chapter title\"),\n center: LngLatSchema.describe(\"Map center [longitude, latitude]\"),\n zoom: z.number().describe(\"Zoom level\"),\n\n // Content\n description: z\n .string()\n .optional()\n .describe(\"Chapter description (HTML/markdown supported)\"),\n image: z.string().url().optional().describe(\"Hero image URL\"),\n video: z.string().url().optional().describe(\"Video URL\"),\n\n // Camera\n pitch: z\n .number()\n .min(0)\n .max(85)\n .default(0)\n .describe(\"Camera pitch angle (0-85)\"),\n bearing: z\n .number()\n .min(-180)\n .max(180)\n .default(0)\n .describe(\"Camera bearing (-180 to 180)\"),\n speed: z\n .number()\n .min(0)\n .max(2)\n .default(0.6)\n .describe(\"Animation speed multiplier (0-2)\"),\n curve: z\n .number()\n .min(0)\n .max(2)\n .default(1)\n .describe(\"Animation curve (0=linear, 1=default, 2=steep)\"),\n animation: z\n .enum([\"flyTo\", \"easeTo\", \"jumpTo\"])\n .default(\"flyTo\")\n .describe(\"Animation type\"),\n\n // Rotation animation\n rotateAnimation: z\n .boolean()\n .optional()\n .describe(\"Enable continuous rotation animation\"),\n spinGlobe: z\n .boolean()\n .optional()\n .describe(\"Spin globe animation (for low zoom levels)\"),\n\n // Layout\n alignment: z\n .enum([\"left\", \"right\", \"center\", \"full\"])\n .default(\"center\")\n .describe(\"Content alignment\"),\n hidden: z\n .boolean()\n .default(false)\n .describe(\"Hide chapter content (map-only)\"),\n\n // Layers\n layers: ChapterLayersSchema.optional().describe(\"Layer visibility control\"),\n\n // Actions\n onChapterEnter: z\n .array(ChapterActionSchema)\n .default([])\n .describe(\"Actions when entering chapter\"),\n onChapterExit: z\n .array(ChapterActionSchema)\n .default([])\n .describe(\"Actions when exiting chapter\"),\n\n // Custom\n callback: z.string().optional().describe(\"Custom callback function name\"),\n })\n .describe(\"Scrollytelling chapter\");\n\n/** Inferred type for chapter. */\nexport type Chapter = z.infer<typeof ChapterSchema>;\n\n/**\n * Scrollytelling block for narrative map stories.\n *\n * @remarks\n * Creates an immersive scrollytelling experience where the map\n * transitions between chapters as the user scrolls through content.\n *\n * **Features:**\n * - Smooth camera transitions\n * - Layer show/hide animations\n * - Dynamic property updates\n * - Chapter-based narrative structure\n * - Customizable themes and markers\n *\n * **Structure:**\n * 1. Base map configuration (persistent)\n * 2. Persistent layers (visible throughout)\n * 3. Chapters (individual story sections)\n * 4. Optional footer\n *\n * @example Basic Scrollytelling\n * ```yaml\n * - type: scrollytelling\n * id: story\n * config:\n * center: [-74.006, 40.7128]\n * zoom: 12\n * mapStyle: \"https://demotiles.maplibre.org/style.json\"\n * chapters:\n * - id: intro\n * title: \"Introduction\"\n * description: \"Welcome to our story.\"\n * center: [-74.006, 40.7128]\n * zoom: 12\n * - id: detail\n * title: \"A Closer Look\"\n * description: \"Let's zoom in.\"\n * center: [-74.006, 40.7128]\n * zoom: 16\n * ```\n *\n * @example Themed Scrollytelling\n * ```yaml\n * - type: scrollytelling\n * id: dark-story\n * theme: dark\n * showMarkers: true\n * markerColor: \"#ff0000\"\n * config:\n * center: [0, 0]\n * zoom: 2\n * mapStyle: \"https://demotiles.maplibre.org/style.json\"\n * chapters:\n * - id: chapter1\n * title: \"Chapter 1\"\n * center: [0, 0]\n * zoom: 3\n * ```\n *\n * @example With Persistent Layers\n * ```yaml\n * - type: scrollytelling\n * id: earthquake-story\n * config:\n * center: [-120, 35]\n * zoom: 5\n * mapStyle: \"https://demotiles.maplibre.org/style.json\"\n * layers:\n * - id: base-layer\n * type: circle\n * source:\n * type: geojson\n * url: \"https://example.com/data.geojson\"\n * paint:\n * circle-radius: 6\n * circle-color: \"#888888\"\n * chapters:\n * - id: overview\n * title: \"Overview\"\n * center: [-120, 35]\n * zoom: 5\n * - id: detail\n * title: \"Major Event\"\n * center: [-118, 34]\n * zoom: 10\n * layers:\n * show:\n * - base-layer\n * ```\n *\n * @example With Footer\n * ```yaml\n * - type: scrollytelling\n * id: story\n * config:\n * center: [0, 0]\n * zoom: 2\n * mapStyle: \"https://demotiles.maplibre.org/style.json\"\n * chapters:\n * - id: chapter1\n * title: \"Chapter 1\"\n * center: [0, 0]\n * zoom: 3\n * footer: |\n * <p>Data sources: ...</p>\n * <p>Created with maplibre-yaml</p>\n * ```\n */\nexport const ScrollytellingBlockSchema: z.ZodObject<any> = z\n .object({\n type: z.literal(\"scrollytelling\").describe(\"Block type\"),\n id: z.string().describe(\"Unique block identifier\"),\n className: z.string().optional().describe(\"CSS class name for container\"),\n style: z.string().optional().describe(\"Inline CSS styles for container\"),\n\n // Base config\n config: MapConfigSchema.describe(\"Base map configuration\"),\n\n // Theme\n theme: z.enum([\"light\", \"dark\"]).default(\"light\").describe(\"Visual theme\"),\n\n // Markers\n showMarkers: z\n .boolean()\n .default(false)\n .describe(\"Show chapter markers on map\"),\n markerColor: z.string().default(\"#3FB1CE\").describe(\"Chapter marker color\"),\n\n // Layers (persistent across all chapters)\n layers: z\n .array(LayerOrReferenceSchema)\n .default([])\n .describe(\"Persistent layers (visible throughout story)\"),\n\n // Chapters\n chapters: z\n .array(ChapterSchema)\n .min(1, \"At least one chapter is required for scrollytelling\")\n .describe(\"Story chapters\"),\n\n // Footer\n footer: z.string().optional().describe(\"Footer content (HTML)\"),\n })\n .describe(\"Scrollytelling block for narrative map stories\");\n\n/** Inferred type for scrollytelling block. */\nexport type ScrollytellingBlock = z.infer<typeof ScrollytellingBlockSchema>;\n","/**\n * @file Page and root configuration schemas for maplibre-yaml\n * @module @maplibre-yaml/core/schemas/page\n *\n * @description\n * Zod schemas for pages, global configuration, and the root schema.\n * Includes recursive MixedBlock for complex layouts.\n *\n * @example\n * ```typescript\n * import { RootSchema, PageSchema } from '@maplibre-yaml/core/schemas';\n * ```\n */\n\nimport { z } from \"zod\";\nimport { ContentBlockSchema } from \"./content.schema\";\nimport { MapBlockSchema, MapFullPageBlockSchema } from \"./map.schema\";\nimport { ScrollytellingBlockSchema } from \"./scrollytelling.schema\";\nimport { LayerSchema } from \"./layer.schema\";\nimport { LayerSourceSchema } from \"./source.schema\";\n/**\n * Mixed block for combining multiple block types.\n *\n * @remarks\n * MixedBlock allows you to create complex layouts by combining\n * content, map, and scrollytelling blocks. Uses z.lazy() for recursion.\n *\n * **Layout Options:**\n * - `row` - Horizontal layout (default)\n * - `column` - Vertical layout\n * - `grid` - CSS Grid layout\n *\n * @example Row Layout\n * ```yaml\n * - type: mixed\n * layout: row\n * blocks:\n * - type: content\n * content:\n * - h2: [{ str: \"Left Column\" }]\n * - type: map\n * id: side-map\n * config:\n * center: [0, 0]\n * zoom: 2\n * mapStyle: \"...\"\n * ```\n *\n * @example Grid Layout\n * ```yaml\n * - type: mixed\n * layout: grid\n * style: \"grid-template-columns: repeat(2, 1fr); gap: 20px;\"\n * blocks:\n * - type: content\n * content: [...]\n * - type: content\n * content: [...]\n * - type: map\n * id: map1\n * config: {...}\n * - type: map\n * id: map2\n * config: {...}\n * ```\n *\n * @example Nested Mixed Blocks\n * ```yaml\n * - type: mixed\n * layout: column\n * blocks:\n * - type: content\n * content: [...]\n * - type: mixed\n * layout: row\n * blocks:\n * - type: map\n * id: left-map\n * config: {...}\n * - type: map\n * id: right-map\n * config: {...}\n * ```\n */\nexport const MixedBlockSchema: z.ZodType<any> = z.lazy(() =>\n z\n .object({\n type: z.literal(\"mixed\").describe(\"Block type\"),\n id: z.string().optional().describe(\"Unique block identifier\"),\n className: z.string().optional().describe(\"CSS class name for container\"),\n style: z.string().optional().describe(\"Inline CSS styles for container\"),\n layout: z\n .enum([\"row\", \"column\", \"grid\"])\n .default(\"row\")\n .describe(\"Layout direction\"),\n gap: z\n .string()\n .optional()\n .describe(\"Gap between blocks (CSS gap property)\"),\n blocks: z.array(BlockSchema).describe(\"Child blocks\"),\n })\n .describe(\"Mixed block for combining multiple block types\")\n);\n\n/** Inferred type for mixed block. */\nexport type MixedBlock = {\n type: \"mixed\";\n id?: string;\n className?: string;\n style?: string;\n layout?: \"row\" | \"column\" | \"grid\";\n gap?: string;\n blocks: Block[];\n};\n\n/**\n * Union of all block types.\n *\n * @remarks\n * Blocks are the building blocks of pages. Each page contains an\n * array of blocks that are rendered in order.\n *\n * **Block Types:**\n * - `content` - Rich text and media\n * - `map` - Standard map\n * - `map-fullpage` - Full viewport map\n * - `scrollytelling` - Narrative map story\n * - `mixed` - Layout container for other blocks\n */\nexport const BlockSchema: z.ZodType<any> = z.union([\n ContentBlockSchema,\n MapBlockSchema,\n MapFullPageBlockSchema,\n ScrollytellingBlockSchema,\n MixedBlockSchema,\n]);\n\n/** Inferred type for any block. */\nexport type Block = z.infer<typeof BlockSchema>;\n\n/**\n * Page configuration.\n *\n * @remarks\n * A page represents a single route/URL in your application.\n * Pages contain blocks that define the content and maps.\n *\n * **Required:**\n * - `path` - URL path (e.g., \"/\", \"/about\", \"/map\")\n * - `title` - Page title (used for browser tab and SEO)\n * - `blocks` - Array of content/map blocks\n *\n * **Optional:**\n * - `description` - Meta description for SEO\n *\n * @example Home Page\n * ```yaml\n * - path: \"/\"\n * title: \"Home\"\n * description: \"Welcome to our mapping application\"\n * blocks:\n * - type: content\n * content:\n * - h1: [{ str: \"Welcome\" }]\n * - type: map\n * id: home-map\n * config:\n * center: [0, 0]\n * zoom: 2\n * mapStyle: \"...\"\n * ```\n *\n * @example Story Page\n * ```yaml\n * - path: \"/story\"\n * title: \"Our Story\"\n * description: \"An interactive map story\"\n * blocks:\n * - type: scrollytelling\n * id: main-story\n * config: {...}\n * chapters: [...]\n * ```\n *\n * @example Complex Layout\n * ```yaml\n * - path: \"/dashboard\"\n * title: \"Dashboard\"\n * blocks:\n * - type: content\n * content:\n * - h1: [{ str: \"Dashboard\" }]\n * - type: mixed\n * layout: row\n * blocks:\n * - type: map\n * id: map1\n * config: {...}\n * - type: map\n * id: map2\n * config: {...}\n * ```\n */\nexport const PageSchema = z\n .object({\n path: z.string().describe('URL path (e.g., \"/\", \"/about\")'),\n title: z.string().describe(\"Page title\"),\n description: z.string().optional().describe(\"Page description for SEO\"),\n blocks: z.array(BlockSchema).describe(\"Page content blocks\"),\n })\n .describe(\"Page configuration\");\n\n/** Inferred type for page. */\nexport type Page = z.infer<typeof PageSchema>;\n\n/**\n * Global configuration.\n *\n * @remarks\n * Global settings that apply across all pages.\n *\n * **General:**\n * - `title` - Application title\n * - `description` - Application description\n * - `defaultMapStyle` - Default map style for all maps\n * - `theme` - Default theme (light/dark)\n *\n * **Data Fetching:**\n * - `defaultStrategy` - Default fetch strategy (runtime, build, hybrid)\n * - `timeout` - Default fetch timeout\n * - `retryAttempts` - Default retry attempts\n *\n * @example Basic Config\n * ```yaml\n * config:\n * title: \"My Map App\"\n * description: \"Interactive maps and stories\"\n * defaultMapStyle: \"https://demotiles.maplibre.org/style.json\"\n * ```\n *\n * @example With Data Fetching\n * ```yaml\n * config:\n * title: \"My Map App\"\n * defaultMapStyle: \"https://demotiles.maplibre.org/style.json\"\n * theme: dark\n * dataFetching:\n * defaultStrategy: build\n * timeout: 15000\n * retryAttempts: 5\n * ```\n */\nexport const GlobalConfigSchema = z\n .object({\n title: z.string().optional().describe(\"Application title\"),\n description: z.string().optional().describe(\"Application description\"),\n defaultMapStyle: z\n .string()\n .url()\n .optional()\n .describe(\"Default map style URL\"),\n theme: z.enum([\"light\", \"dark\"]).default(\"light\").describe(\"Default theme\"),\n dataFetching: z\n .object({\n defaultStrategy: z\n .enum([\"runtime\", \"build\", \"hybrid\"])\n .default(\"runtime\")\n .describe(\"Default fetch strategy\"),\n timeout: z\n .number()\n .min(1000)\n .default(30000)\n .describe(\"Default timeout in milliseconds\"),\n retryAttempts: z\n .number()\n .int()\n .min(0)\n .default(3)\n .describe(\"Default retry attempts\"),\n })\n .optional()\n .describe(\"Data fetching configuration\"),\n })\n .describe(\"Global configuration\");\n\n/** Inferred type for global config. */\nexport type GlobalConfig = z.infer<typeof GlobalConfigSchema>;\n\n/**\n * Root configuration schema.\n *\n * @remarks\n * The root schema represents the entire maplibre-yaml configuration.\n * This is the top-level structure for YAML files.\n *\n * **Structure:**\n * 1. `config` - Global settings (optional)\n * 2. `layers` - Named layer definitions for reuse (optional)\n * 3. `sources` - Named source definitions for reuse (optional)\n * 4. `pages` - Page definitions (required, minimum 1)\n *\n * **Global Layers and Sources:**\n * Define layers and sources once, reference them anywhere using `$ref`.\n *\n * @example Minimal Configuration\n * ```yaml\n * pages:\n * - path: \"/\"\n * title: \"Home\"\n * blocks:\n * - type: map\n * id: main-map\n * config:\n * center: [0, 0]\n * zoom: 2\n * mapStyle: \"https://demotiles.maplibre.org/style.json\"\n * ```\n *\n * @example With Global Config\n * ```yaml\n * config:\n * title: \"My App\"\n * defaultMapStyle: \"https://demotiles.maplibre.org/style.json\"\n *\n * pages:\n * - path: \"/\"\n * title: \"Home\"\n * blocks:\n * - type: map\n * id: main-map\n * config:\n * center: [0, 0]\n * zoom: 2\n * ```\n *\n * @example With Global Layers\n * ```yaml\n * config:\n * defaultMapStyle: \"https://demotiles.maplibre.org/style.json\"\n *\n * layers:\n * bikeLayer:\n * id: bikes\n * type: line\n * source:\n * type: geojson\n * url: \"https://example.com/bikes.geojson\"\n * paint:\n * line-color: \"#00ff00\"\n * line-width: 2\n *\n * parkLayer:\n * id: parks\n * type: fill\n * source:\n * type: geojson\n * url: \"https://example.com/parks.geojson\"\n * paint:\n * fill-color: \"#228B22\"\n * fill-opacity: 0.5\n *\n * pages:\n * - path: \"/\"\n * title: \"Home\"\n * blocks:\n * - type: map\n * id: main-map\n * config:\n * center: [-74.006, 40.7128]\n * zoom: 12\n * layers:\n * - $ref: \"#/layers/bikeLayer\"\n * - $ref: \"#/layers/parkLayer\"\n * ```\n *\n * @example With Global Sources\n * ```yaml\n * sources:\n * earthquakeSource:\n * type: geojson\n * url: \"https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_day.geojson\"\n * refreshInterval: 60000\n *\n * layers:\n * earthquakes:\n * id: earthquakes\n * type: circle\n * source: earthquakeSource\n * paint:\n * circle-radius: 8\n * circle-color: \"#ff0000\"\n *\n * pages:\n * - path: \"/\"\n * title: \"Earthquakes\"\n * blocks:\n * - type: map\n * id: quake-map\n * config:\n * center: [0, 0]\n * zoom: 2\n * mapStyle: \"...\"\n * layers:\n * - $ref: \"#/layers/earthquakes\"\n * ```\n *\n * @example Multi-Page Application\n * ```yaml\n * config:\n * title: \"Multi-Page Map App\"\n * defaultMapStyle: \"https://demotiles.maplibre.org/style.json\"\n *\n * pages:\n * - path: \"/\"\n * title: \"Home\"\n * blocks:\n * - type: content\n * content:\n * - h1: [{ str: \"Welcome\" }]\n *\n * - path: \"/map\"\n * title: \"Interactive Map\"\n * blocks:\n * - type: map\n * id: main-map\n * config:\n * center: [0, 0]\n * zoom: 2\n *\n * - path: \"/story\"\n * title: \"Our Story\"\n * blocks:\n * - type: scrollytelling\n * id: story\n * config:\n * center: [0, 0]\n * zoom: 2\n * chapters:\n * - id: intro\n * title: \"Introduction\"\n * center: [0, 0]\n * zoom: 3\n * ```\n */\nexport const RootSchema: z.ZodType<any> = z\n .object({\n config: GlobalConfigSchema.optional().describe(\"Global configuration\"),\n layers: z\n .record(LayerSchema)\n .optional()\n .describe(\"Named layer definitions for reuse\"),\n sources: z\n .record(LayerSourceSchema)\n .optional()\n .describe(\"Named source definitions for reuse\"),\n pages: z\n .array(PageSchema)\n .min(1, \"At least one page is required\")\n .describe(\"Page definitions\"),\n })\n .describe(\"Root configuration schema\");\n\n/** Inferred type for root configuration. */\nexport type RootConfig = z.infer<typeof RootSchema>;\n","/**\n * @file YAML parser for MapLibre configuration files\n * @module @maplibre-yaml/core/parser\n *\n * @description\n * This module provides YAML parsing, schema validation, and reference resolution\n * for MapLibre YAML configuration files. It converts YAML strings into validated\n * TypeScript objects ready for rendering.\n *\n * ## Features\n *\n * - **YAML Parsing**: Converts YAML strings to JavaScript objects\n * - **Schema Validation**: Validates against Zod schemas with detailed error messages\n * - **Reference Resolution**: Resolves `$ref` pointers to global layers and sources\n * - **Error Formatting**: Transforms Zod errors into user-friendly messages with paths\n *\n * @example\n * Basic parsing\n * ```typescript\n * import { YAMLParser } from '@maplibre-yaml/core/parser';\n *\n * const yaml = `\n * pages:\n * - path: \"/\"\n * title: \"My Map\"\n * blocks:\n * - type: map\n * id: main\n * config:\n * center: [0, 0]\n * zoom: 2\n * mapStyle: \"https://example.com/style.json\"\n * `;\n *\n * const config = YAMLParser.parse(yaml);\n * ```\n *\n * @example\n * Safe parsing with error handling\n * ```typescript\n * const result = YAMLParser.safeParse(yaml);\n * if (result.success) {\n * console.log('Valid config:', result.data);\n * } else {\n * result.errors.forEach(err => {\n * console.error(`${err.path}: ${err.message}`);\n * });\n * }\n * ```\n *\n * @example\n * Reference resolution\n * ```typescript\n * const yaml = `\n * layers:\n * myLayer:\n * id: shared\n * type: circle\n * source: { type: geojson, data: {...} }\n *\n * pages:\n * - path: \"/\"\n * blocks:\n * - type: map\n * layers:\n * - $ref: \"#/layers/myLayer\"\n * `;\n *\n * const config = YAMLParser.parse(yaml);\n * // References are automatically resolved\n * ```\n */\n\nimport { parse as parseYAML } from \"yaml\";\nimport { ZodError } from \"zod\";\nimport { RootSchema } from \"../schemas/page.schema\";\nimport { MapBlockSchema } from \"../schemas/map.schema\";\nimport type { z } from \"zod\";\n\n/**\n * Type alias for the root configuration object\n *\n * @remarks\n * Inferred from the RootSchema Zod schema\n */\nexport type RootConfig = z.infer<typeof RootSchema>;\n\n/**\n * Type alias for a single map block\n *\n * @remarks\n * Inferred from the MapBlockSchema Zod schema\n */\nexport type MapBlock = z.infer<typeof MapBlockSchema>;\n\n/**\n * Error information for a single validation or parsing error\n *\n * @property path - JSON path to the error location (e.g., \"pages[0].blocks[1].config.center\")\n * @property message - Human-readable error description\n * @property line - Optional line number in the YAML file where error occurred\n * @property column - Optional column number in the YAML file where error occurred\n */\nexport interface ParseError {\n path: string;\n message: string;\n line?: number;\n column?: number;\n}\n\n/**\n * Result object returned by safeParse operations\n *\n * @property success - Whether parsing and validation succeeded\n * @property data - Validated configuration object (only present if success is true)\n * @property errors - Array of errors (only present if success is false)\n */\nexport interface ParseResult<T = RootConfig> {\n success: boolean;\n data?: T;\n errors: ParseError[];\n}\n\n/**\n * YAML parser with schema validation and reference resolution\n *\n * @remarks\n * This class provides static methods for parsing YAML configuration files,\n * validating them against schemas, and resolving references between configuration\n * sections. All methods are static as the parser maintains no internal state.\n *\n * @example\n * Parse and validate YAML (throws on error)\n * ```typescript\n * const config = YAMLParser.parse(yamlString);\n * ```\n *\n * @example\n * Safe parse (returns result object)\n * ```typescript\n * const result = YAMLParser.safeParse(yamlString);\n * if (!result.success) {\n * console.error('Validation errors:', result.errors);\n * }\n * ```\n */\nexport class YAMLParser {\n /**\n * Parse YAML string and validate against schema\n *\n * @param yaml - YAML string to parse\n * @returns Validated configuration object\n * @throws {Error} If YAML syntax is invalid\n * @throws {ZodError} If validation fails\n *\n * @remarks\n * This method parses the YAML, validates it against the RootSchema,\n * resolves all references, and returns the validated config. If any\n * step fails, it throws an error.\n *\n * @example\n * ```typescript\n * try {\n * const config = YAMLParser.parse(yamlString);\n * console.log('Valid config:', config);\n * } catch (error) {\n * console.error('Parse error:', error.message);\n * }\n * ```\n */\n static parse(yaml: string): RootConfig {\n // Parse YAML string to JavaScript object\n let parsed: unknown;\n try {\n parsed = parseYAML(yaml);\n } catch (error) {\n throw new Error(\n `YAML syntax error: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n\n // Validate against schema\n const validated = RootSchema.parse(parsed);\n\n // Resolve references\n return this.resolveReferences(validated);\n }\n\n /**\n * Parse YAML string and validate, returning a result object\n *\n * @param yaml - YAML string to parse\n * @returns Result object with success flag and either data or errors\n *\n * @remarks\n * This is the non-throwing version of {@link parse}. Instead of throwing\n * errors, it returns a result object that indicates success or failure.\n * Use this when you want to handle errors gracefully without try/catch.\n *\n * @example\n * ```typescript\n * const result = YAMLParser.safeParse(yamlString);\n * if (result.success) {\n * console.log('Config:', result.data);\n * } else {\n * result.errors.forEach(err => {\n * console.error(`Error at ${err.path}: ${err.message}`);\n * });\n * }\n * ```\n */\n static safeParse(yaml: string): ParseResult {\n try {\n const data = this.parse(yaml);\n return {\n success: true,\n data,\n errors: [],\n };\n } catch (error) {\n // Handle Zod validation errors\n if (error instanceof ZodError) {\n return {\n success: false,\n errors: this.formatZodErrors(error),\n };\n }\n\n // Handle other errors (YAML syntax, reference errors, etc.)\n return {\n success: false,\n errors: [\n {\n path: \"\",\n message: error instanceof Error ? error.message : String(error),\n },\n ],\n };\n }\n }\n\n /**\n * Validate a JavaScript object against the schema\n *\n * @param config - JavaScript object to validate\n * @returns Validated configuration object\n * @throws {ZodError} If validation fails\n *\n * @remarks\n * This method bypasses YAML parsing and directly validates a JavaScript object.\n * Useful when you already have a parsed object (e.g., from JSON.parse) and just\n * want to validate and resolve references.\n *\n * @example\n * ```typescript\n * const jsConfig = JSON.parse(jsonString);\n * const validated = YAMLParser.validate(jsConfig);\n * ```\n */\n static validate(config: unknown): RootConfig {\n const validated = RootSchema.parse(config);\n return this.resolveReferences(validated);\n }\n\n /**\n * Parse YAML string for a single map block and validate against MapBlockSchema\n *\n * @param yaml - YAML string to parse (should be a map block, not a full document)\n * @returns Validated map block object\n * @throws {Error} If YAML syntax is invalid\n * @throws {ZodError} If validation fails\n *\n * @remarks\n * This method is specifically for parsing individual map blocks (e.g., in documentation\n * or component usage). Unlike {@link parse}, it validates against MapBlockSchema rather\n * than RootSchema, so it expects a single map configuration without the pages array wrapper.\n *\n * @example\n * ```typescript\n * const yaml = `\n * type: map\n * id: example\n * config:\n * center: [0, 0]\n * zoom: 2\n * mapStyle: \"https://example.com/style.json\"\n * layers:\n * - id: points\n * type: circle\n * source:\n * type: geojson\n * data: { type: \"FeatureCollection\", features: [] }\n * `;\n *\n * const mapBlock = YAMLParser.parseMapBlock(yaml);\n * ```\n */\n static parseMapBlock(yaml: string): MapBlock {\n // Parse YAML string to JavaScript object\n let parsed: unknown;\n try {\n parsed = parseYAML(yaml);\n } catch (error) {\n throw new Error(\n `YAML syntax error: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n\n // Validate against MapBlockSchema\n return MapBlockSchema.parse(parsed);\n }\n\n /**\n * Parse YAML string for a single map block, returning a result object\n *\n * @param yaml - YAML string to parse (should be a map block, not a full document)\n * @returns Result object with success flag and either data or errors\n *\n * @remarks\n * This is the non-throwing version of {@link parseMapBlock}. Instead of throwing\n * errors, it returns a result object that indicates success or failure.\n * Use this when you want to handle errors gracefully without try/catch.\n *\n * @example\n * ```typescript\n * const result = YAMLParser.safeParseMapBlock(yamlString);\n * if (result.success) {\n * console.log('Map config:', result.data);\n * } else {\n * result.errors.forEach(err => {\n * console.error(`Error at ${err.path}: ${err.message}`);\n * });\n * }\n * ```\n */\n static safeParseMapBlock(yaml: string): ParseResult<MapBlock> {\n try {\n const data = this.parseMapBlock(yaml);\n return {\n success: true,\n data,\n errors: [],\n };\n } catch (error) {\n // Handle Zod validation errors\n if (error instanceof ZodError) {\n return {\n success: false,\n errors: this.formatZodErrors(error),\n };\n }\n\n // Handle other errors (YAML syntax, etc.)\n return {\n success: false,\n errors: [\n {\n path: \"\",\n message: error instanceof Error ? error.message : String(error),\n },\n ],\n };\n }\n }\n\n /**\n * Resolve $ref references to global layers and sources\n *\n * @param config - Configuration object with potential references\n * @returns Configuration with all references resolved\n * @throws {Error} If a reference cannot be resolved\n *\n * @remarks\n * References use JSON Pointer-like syntax: `#/layers/layerName` or `#/sources/sourceName`.\n * This method walks the configuration tree, finds all objects with a `$ref` property,\n * looks up the referenced item in `config.layers` or `config.sources`, and replaces\n * the reference object with the actual item.\n *\n * ## Reference Syntax\n *\n * - `#/layers/myLayer` - Reference to a layer in the global `layers` section\n * - `#/sources/mySource` - Reference to a source in the global `sources` section\n *\n * @example\n * ```typescript\n * const config = {\n * layers: {\n * myLayer: { id: 'layer1', type: 'circle', ... }\n * },\n * pages: [{\n * blocks: [{\n * type: 'map',\n * layers: [{ $ref: '#/layers/myLayer' }]\n * }]\n * }]\n * };\n *\n * const resolved = YAMLParser.resolveReferences(config);\n * // resolved.pages[0].blocks[0].layers[0] now contains the full layer object\n * ```\n */\n static resolveReferences(config: RootConfig): RootConfig {\n /**\n * Recursively walk an object and resolve references\n */\n const resolveInObject = (obj: any): any => {\n // Handle null/undefined\n if (obj == null) return obj;\n\n // Handle arrays\n if (Array.isArray(obj)) {\n return obj.map((item) => resolveInObject(item));\n }\n\n // Handle objects\n if (typeof obj === \"object\") {\n // Check if this is a reference object\n if (\"$ref\" in obj && typeof obj.$ref === \"string\") {\n const ref = obj.$ref;\n\n // Parse reference: #/layers/layerName or #/sources/sourceName\n const match = ref.match(/^#\\/(layers|sources)\\/(.+)$/);\n if (!match) {\n throw new Error(\n `Invalid reference format: ${ref}. Expected #/layers/name or #/sources/name`\n );\n }\n\n const [, section, name] = match;\n\n // Look up the referenced item\n if (section === \"layers\") {\n if (!config.layers || !(name in config.layers)) {\n throw new Error(`Layer reference not found: ${ref}`);\n }\n return config.layers[name];\n } else if (section === \"sources\") {\n if (!config.sources || !(name in config.sources)) {\n throw new Error(`Source reference not found: ${ref}`);\n }\n return config.sources[name];\n }\n }\n\n // Recursively process all properties\n const resolved: any = {};\n for (const [key, value] of Object.entries(obj)) {\n resolved[key] = resolveInObject(value);\n }\n return resolved;\n }\n\n // Primitives\n return obj;\n };\n\n return resolveInObject(config);\n }\n\n /**\n * Format Zod validation errors into user-friendly messages\n *\n * @param error - Zod validation error\n * @returns Array of formatted error objects\n *\n * @remarks\n * This method transforms Zod's internal error format into human-readable\n * messages with clear paths and descriptions. It handles various Zod error\n * types and provides appropriate messages for each.\n *\n * ## Error Type Handling\n *\n * - `invalid_type`: Type mismatch (e.g., expected number, got string)\n * - `invalid_union_discriminator`: Invalid discriminator for union types\n * - `invalid_union`: None of the union options matched\n * - `too_small`: Value below minimum (arrays, strings, numbers)\n * - `too_big`: Value above maximum\n * - `invalid_string`: String format validation failed\n * - `custom`: Custom validation refinement failed\n *\n * @example\n * ```typescript\n * try {\n * RootSchema.parse(invalidConfig);\n * } catch (error) {\n * if (error instanceof ZodError) {\n * const formatted = YAMLParser.formatZodErrors(error);\n * formatted.forEach(err => {\n * console.error(`${err.path}: ${err.message}`);\n * });\n * }\n * }\n * ```\n */\n private static formatZodErrors(error: ZodError): ParseError[] {\n return error.errors.map((err) => {\n const path = err.path.join(\".\");\n\n let message: string;\n switch (err.code) {\n case \"invalid_type\":\n message = `Expected ${err.expected}, got ${err.received}`;\n break;\n\n case \"invalid_union_discriminator\":\n message = `Invalid type. Expected one of: ${err.options.join(\", \")}`;\n break;\n\n case \"invalid_union\":\n message = \"Value does not match any of the expected formats\";\n break;\n\n case \"too_small\":\n if (err.type === \"array\") {\n message = `Array must have at least ${err.minimum} element(s)`;\n } else if (err.type === \"string\") {\n message = `String must have at least ${err.minimum} character(s)`;\n } else {\n message = `Value must be >= ${err.minimum}`;\n }\n break;\n\n case \"too_big\":\n if (err.type === \"array\") {\n message = `Array must have at most ${err.maximum} element(s)`;\n } else if (err.type === \"string\") {\n message = `String must have at most ${err.maximum} character(s)`;\n } else {\n message = `Value must be <= ${err.maximum}`;\n }\n break;\n\n case \"invalid_string\":\n if (err.validation === \"url\") {\n message = \"Invalid URL format\";\n } else if (err.validation === \"email\") {\n message = \"Invalid email format\";\n } else {\n message = `Invalid string format: ${err.validation}`;\n }\n break;\n\n case \"custom\":\n message = err.message || \"Validation failed\";\n break;\n\n default:\n message = err.message || \"Validation error\";\n }\n\n return {\n path,\n message,\n };\n });\n }\n}\n\n/**\n * Convenience function to parse YAML config\n *\n * @param yaml - YAML string to parse\n * @returns Validated configuration object\n * @throws {Error} If parsing or validation fails\n *\n * @remarks\n * This is an alias for {@link YAMLParser.parse} for convenient imports.\n *\n * @example\n * ```typescript\n * import { parseYAMLConfig } from '@maplibre-yaml/core/parser';\n * const config = parseYAMLConfig(yamlString);\n * ```\n */\nexport const parseYAMLConfig = YAMLParser.parse.bind(YAMLParser);\n\n/**\n * Convenience function to safely parse YAML config\n *\n * @param yaml - YAML string to parse\n * @returns Result object with success flag and data or errors\n *\n * @remarks\n * This is an alias for {@link YAMLParser.safeParse} for convenient imports.\n *\n * @example\n * ```typescript\n * import { safeParseYAMLConfig } from '@maplibre-yaml/core/parser';\n * const result = safeParseYAMLConfig(yamlString);\n * if (result.success) {\n * console.log(result.data);\n * }\n * ```\n */\nexport const safeParseYAMLConfig = YAMLParser.safeParse.bind(YAMLParser);\n","/**\n * @file TTL-based in-memory cache for fetched data\n * @module @maplibre-yaml/core/data\n */\n\n/**\n * Configuration options for MemoryCache\n */\nexport interface CacheConfig {\n /**\n * Maximum number of entries to store\n * @default 100\n */\n maxSize: number;\n\n /**\n * Default time-to-live in milliseconds\n * @default 300000 (5 minutes)\n */\n defaultTTL: number;\n\n /**\n * Whether to use conditional requests with ETag/Last-Modified headers\n * @default true\n */\n useConditionalRequests: boolean;\n}\n\n/**\n * Cache entry containing data and metadata\n */\nexport interface CacheEntry<T = unknown> {\n /** Cached data */\n data: T;\n\n /** Timestamp when cached (milliseconds) */\n timestamp: number;\n\n /** Time-to-live for this entry in milliseconds (overrides default) */\n ttl?: number;\n\n /** ETag header from HTTP response */\n etag?: string;\n\n /** Last-Modified header from HTTP response */\n lastModified?: string;\n}\n\n/**\n * Cache statistics\n */\nexport interface CacheStats {\n /** Number of entries currently in cache */\n size: number;\n\n /** Total number of cache hits */\n hits: number;\n\n /** Total number of cache misses */\n misses: number;\n\n /** Hit rate as percentage (0-100) */\n hitRate: number;\n}\n\n/**\n * TTL-based in-memory cache with LRU eviction.\n *\n * @remarks\n * Features:\n * - LRU (Least Recently Used) eviction when at capacity\n * - Respects HTTP cache headers (ETag, Last-Modified)\n * - Configurable per-entry TTL\n * - Support for conditional requests (If-None-Match, If-Modified-Since)\n * - Automatic expiration checking on get operations\n *\n * @example\n * ```typescript\n * const cache = new MemoryCache<GeoJSON.FeatureCollection>({\n * maxSize: 100,\n * defaultTTL: 300000, // 5 minutes\n * });\n *\n * // Store data with ETag\n * cache.set('https://example.com/data.json', {\n * data: geojsonData,\n * timestamp: Date.now(),\n * etag: '\"abc123\"',\n * });\n *\n * // Retrieve (returns null if expired or missing)\n * const entry = cache.get('https://example.com/data.json');\n * if (entry) {\n * console.log('Cache hit:', entry.data);\n * }\n *\n * // Get conditional headers for HTTP request\n * const headers = cache.getConditionalHeaders('https://example.com/data.json');\n * // headers = { 'If-None-Match': '\"abc123\"' }\n * ```\n *\n * @typeParam T - Type of cached data\n */\nexport class MemoryCache<T = unknown> {\n private static readonly DEFAULT_CONFIG: CacheConfig = {\n maxSize: 100,\n defaultTTL: 300000, // 5 minutes\n useConditionalRequests: true,\n };\n\n private config: CacheConfig;\n private cache = new Map<string, CacheEntry<T>>();\n private accessOrder: string[] = [];\n private stats = { hits: 0, misses: 0 };\n\n /**\n * Create a new MemoryCache instance\n *\n * @param config - Cache configuration options\n */\n constructor(config?: Partial<CacheConfig>) {\n this.config = { ...MemoryCache.DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Retrieve a cache entry\n *\n * @remarks\n * - Returns null if key doesn't exist\n * - Returns null if entry has expired (and removes it)\n * - Updates access order for LRU\n * - Updates cache statistics\n *\n * @param key - Cache key (typically a URL)\n * @returns Cache entry or null if not found/expired\n */\n get(key: string): CacheEntry<T> | null {\n const entry = this.cache.get(key);\n\n if (!entry) {\n this.stats.misses++;\n return null;\n }\n\n const ttl = entry.ttl ?? this.config.defaultTTL;\n const age = Date.now() - entry.timestamp;\n\n if (age > ttl) {\n this.cache.delete(key);\n this.removeFromAccessOrder(key);\n this.stats.misses++;\n return null;\n }\n\n this.updateAccessOrder(key);\n this.stats.hits++;\n return entry;\n }\n\n /**\n * Check if a key exists in cache (without checking expiration)\n *\n * @param key - Cache key\n * @returns True if key exists in cache\n */\n has(key: string): boolean {\n return this.cache.has(key);\n }\n\n /**\n * Store a cache entry\n *\n * @remarks\n * - Evicts least recently used entries if at capacity\n * - Updates access order\n *\n * @param key - Cache key (typically a URL)\n * @param entry - Cache entry to store\n */\n set(key: string, entry: CacheEntry<T>): void {\n // Evict oldest entries if at capacity\n while (this.cache.size >= this.config.maxSize && !this.cache.has(key)) {\n const oldest = this.accessOrder.shift();\n if (oldest) {\n this.cache.delete(oldest);\n }\n }\n\n this.cache.set(key, entry);\n this.updateAccessOrder(key);\n }\n\n /**\n * Delete a cache entry\n *\n * @param key - Cache key\n * @returns True if entry was deleted, false if it didn't exist\n */\n delete(key: string): boolean {\n const existed = this.cache.delete(key);\n if (existed) {\n this.removeFromAccessOrder(key);\n }\n return existed;\n }\n\n /**\n * Clear all cache entries and reset statistics\n */\n clear(): void {\n this.cache.clear();\n this.accessOrder = [];\n this.stats = { hits: 0, misses: 0 };\n }\n\n /**\n * Remove expired entries from cache\n *\n * @remarks\n * Iterates through all entries and removes those that have exceeded their TTL.\n * This is useful for periodic cleanup.\n *\n * @returns Number of entries removed\n */\n prune(): number {\n let removed = 0;\n const now = Date.now();\n\n for (const [key, entry] of this.cache.entries()) {\n const ttl = entry.ttl ?? this.config.defaultTTL;\n const age = now - entry.timestamp;\n\n if (age > ttl) {\n this.cache.delete(key);\n this.removeFromAccessOrder(key);\n removed++;\n }\n }\n\n return removed;\n }\n\n /**\n * Get cache statistics\n *\n * @returns Current cache statistics including hit rate\n */\n getStats(): CacheStats {\n const total = this.stats.hits + this.stats.misses;\n const hitRate = total > 0 ? (this.stats.hits / total) * 100 : 0;\n\n return {\n size: this.cache.size,\n hits: this.stats.hits,\n misses: this.stats.misses,\n hitRate: Math.round(hitRate * 100) / 100, // Round to 2 decimal places\n };\n }\n\n /**\n * Get conditional request headers for HTTP caching\n *\n * @remarks\n * Returns appropriate If-None-Match and/or If-Modified-Since headers\n * based on cached entry metadata. Returns empty object if:\n * - Key doesn't exist in cache\n * - Entry has expired\n * - useConditionalRequests is false\n *\n * @param key - Cache key\n * @returns Object with conditional headers (may be empty)\n *\n * @example\n * ```typescript\n * const headers = cache.getConditionalHeaders(url);\n * const response = await fetch(url, { headers });\n * if (response.status === 304) {\n * // Use cached data\n * }\n * ```\n */\n getConditionalHeaders(key: string): Record<string, string> {\n if (!this.config.useConditionalRequests) {\n return {};\n }\n\n const entry = this.get(key);\n if (!entry) {\n return {};\n }\n\n const headers: Record<string, string> = {};\n\n if (entry.etag) {\n headers[\"If-None-Match\"] = entry.etag;\n }\n\n if (entry.lastModified) {\n headers[\"If-Modified-Since\"] = entry.lastModified;\n }\n\n return headers;\n }\n\n /**\n * Update the last access time for an entry\n *\n * @remarks\n * Useful for keeping an entry \"fresh\" without modifying its data.\n * Updates the access order for LRU.\n *\n * @param key - Cache key\n */\n touch(key: string): void {\n if (this.cache.has(key)) {\n this.updateAccessOrder(key);\n }\n }\n\n /**\n * Update access order for LRU tracking\n *\n * @param key - Cache key\n */\n private updateAccessOrder(key: string): void {\n // Remove from current position\n this.removeFromAccessOrder(key);\n // Add to end (most recently used)\n this.accessOrder.push(key);\n }\n\n /**\n * Remove a key from access order array\n *\n * @param key - Cache key\n */\n private removeFromAccessOrder(key: string): void {\n const index = this.accessOrder.indexOf(key);\n if (index !== -1) {\n this.accessOrder.splice(index, 1);\n }\n }\n}\n","/**\n * @file Exponential backoff retry manager\n * @module @maplibre-yaml/core/data\n */\n\n/**\n * Configuration options for retry behavior\n */\nexport interface RetryConfig {\n /**\n * Maximum number of retry attempts\n * @default 10\n */\n maxRetries: number;\n\n /**\n * Initial delay in milliseconds before first retry\n * @default 1000\n */\n initialDelay: number;\n\n /**\n * Maximum delay in milliseconds between retries\n * @default 30000\n */\n maxDelay: number;\n\n /**\n * Backoff multiplier for exponential backoff\n * @default 2\n */\n backoffFactor: number;\n\n /**\n * Whether to apply random jitter to delays\n * @default true\n */\n jitter: boolean;\n\n /**\n * Jitter factor (percentage of delay to randomize)\n * @default 0.25\n */\n jitterFactor: number;\n}\n\n/**\n * Callbacks for retry lifecycle events\n */\nexport interface RetryCallbacks {\n /**\n * Called before each retry attempt\n *\n * @param attempt - Current attempt number (1-indexed)\n * @param delay - Delay in milliseconds before this retry\n * @param error - Error that triggered the retry\n */\n onRetry?: (attempt: number, delay: number, error: Error) => void;\n\n /**\n * Called when all retry attempts are exhausted\n *\n * @param attempts - Total number of attempts made\n * @param lastError - The final error\n */\n onExhausted?: (attempts: number, lastError: Error) => void;\n\n /**\n * Called when operation succeeds\n *\n * @param attempts - Number of attempts before success (1 = first try)\n */\n onSuccess?: (attempts: number) => void;\n\n /**\n * Predicate to determine if an error is retryable\n *\n * @param error - Error to check\n * @returns True if the error should trigger a retry\n *\n * @default All errors are retryable\n */\n isRetryable?: (error: Error) => boolean;\n}\n\n/**\n * Error thrown when maximum retry attempts are exceeded\n */\nexport class MaxRetriesExceededError extends Error {\n /**\n * Create a MaxRetriesExceededError\n *\n * @param lastError - The error from the final attempt\n * @param attempts - Number of attempts made\n */\n constructor(public lastError: Error, public attempts: number) {\n super(\n `Maximum retry attempts (${attempts}) exceeded. Last error: ${lastError.message}`\n );\n this.name = \"MaxRetriesExceededError\";\n\n // Maintain proper prototype chain\n Object.setPrototypeOf(this, MaxRetriesExceededError.prototype);\n }\n}\n\n/**\n * Retry manager with exponential backoff and jitter.\n *\n * @remarks\n * Implements exponential backoff with the formula:\n * ```\n * delay = min(initialDelay * (backoffFactor ^ (attempt - 1)), maxDelay)\n * ```\n *\n * With jitter applied as:\n * ```\n * delay = delay + (random(-1, 1) * delay * jitterFactor)\n * ```\n *\n * Jitter helps prevent thundering herd problems when multiple clients\n * retry simultaneously.\n *\n * @example\n * ```typescript\n * const retry = new RetryManager({\n * maxRetries: 5,\n * initialDelay: 1000,\n * backoffFactor: 2,\n * });\n *\n * try {\n * const result = await retry.execute(\n * async () => {\n * const response = await fetch('https://api.example.com/data');\n * if (!response.ok) throw new Error('Request failed');\n * return response.json();\n * },\n * {\n * onRetry: (attempt, delay, error) => {\n * console.log(`Retry ${attempt} in ${delay}ms: ${error.message}`);\n * },\n * }\n * );\n * console.log('Success:', result);\n * } catch (error) {\n * console.error('All retries failed:', error);\n * }\n * ```\n */\nexport class RetryManager {\n private static readonly DEFAULT_CONFIG: RetryConfig = {\n maxRetries: 10,\n initialDelay: 1000,\n maxDelay: 30000,\n backoffFactor: 2,\n jitter: true,\n jitterFactor: 0.25,\n };\n\n private config: RetryConfig;\n\n /**\n * Create a new RetryManager instance\n *\n * @param config - Retry configuration options\n */\n constructor(config?: Partial<RetryConfig>) {\n this.config = { ...RetryManager.DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Execute a function with retry logic\n *\n * @typeParam T - Return type of the function\n * @param fn - Async function to execute with retries\n * @param callbacks - Optional lifecycle callbacks\n * @returns Promise that resolves with the function's result\n * @throws {MaxRetriesExceededError} When all retry attempts fail\n *\n * @example\n * ```typescript\n * const data = await retry.execute(\n * () => fetchData(url),\n * {\n * isRetryable: (error) => {\n * // Don't retry 4xx errors except 429 (rate limit)\n * if (error.message.includes('429')) return true;\n * if (error.message.match(/4\\d\\d/)) return false;\n * return true;\n * },\n * }\n * );\n * ```\n */\n async execute<T>(\n fn: () => Promise<T>,\n callbacks?: RetryCallbacks\n ): Promise<T> {\n let lastError: Error | null = null;\n let attempt = 0;\n\n while (attempt <= this.config.maxRetries) {\n attempt++;\n\n try {\n const result = await fn();\n callbacks?.onSuccess?.(attempt);\n return result;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n // Check if error is retryable\n if (callbacks?.isRetryable && !callbacks.isRetryable(lastError)) {\n throw lastError;\n }\n\n // If we've exhausted retries, throw\n if (attempt > this.config.maxRetries) {\n callbacks?.onExhausted?.(attempt, lastError);\n throw new MaxRetriesExceededError(lastError, attempt);\n }\n\n // Calculate delay and wait before retry\n const delay = this.calculateDelay(attempt);\n callbacks?.onRetry?.(attempt, delay, lastError);\n\n await this.sleep(delay);\n }\n }\n\n // This should never be reached due to throw above, but TypeScript needs it\n throw new MaxRetriesExceededError(\n lastError || new Error(\"Unknown error\"),\n attempt\n );\n }\n\n /**\n * Calculate delay for a given attempt using exponential backoff\n *\n * @param attempt - Current attempt number (1-indexed)\n * @returns Delay in milliseconds\n *\n * @example\n * ```typescript\n * const retry = new RetryManager({ initialDelay: 1000, backoffFactor: 2 });\n * console.log(retry.calculateDelay(1)); // ~1000ms\n * console.log(retry.calculateDelay(2)); // ~2000ms\n * console.log(retry.calculateDelay(3)); // ~4000ms\n * ```\n */\n calculateDelay(attempt: number): number {\n // Calculate base delay with exponential backoff\n let delay =\n this.config.initialDelay *\n Math.pow(this.config.backoffFactor, attempt - 1);\n\n // Cap at max delay\n delay = Math.min(delay, this.config.maxDelay);\n\n // Apply jitter if enabled\n if (this.config.jitter) {\n const jitterRange = delay * this.config.jitterFactor;\n // Random value between -jitterRange and +jitterRange\n const jitterOffset = (Math.random() * 2 - 1) * jitterRange;\n delay = delay + jitterOffset;\n }\n\n // Ensure non-negative and round to integer\n return Math.max(0, Math.round(delay));\n }\n\n /**\n * Reset internal state\n *\n * @remarks\n * Currently this class is stateless, but this method is provided\n * for API consistency and future extensibility.\n */\n reset(): void {\n // Currently stateless, but provided for API consistency\n }\n\n /**\n * Sleep for specified milliseconds\n *\n * @param ms - Milliseconds to sleep\n * @returns Promise that resolves after the delay\n */\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","/**\n * @file HTTP data fetcher with caching and retry support\n * @module @maplibre-yaml/core/data\n */\n\nimport { MemoryCache, type CacheEntry, type CacheStats } from \"./memory-cache\";\nimport { RetryManager } from \"./retry-manager\";\nimport type { FeatureCollection } from \"geojson\";\n\n/**\n * Configuration for DataFetcher\n */\nexport interface FetcherConfig {\n /**\n * Cache configuration\n */\n cache: {\n /** Whether caching is enabled */\n enabled: boolean;\n /** Default TTL in milliseconds */\n defaultTTL: number;\n /** Maximum number of cached entries */\n maxSize: number;\n };\n\n /**\n * Retry configuration\n */\n retry: {\n /** Whether retry is enabled */\n enabled: boolean;\n /** Maximum number of retry attempts */\n maxRetries: number;\n /** Initial delay in milliseconds */\n initialDelay: number;\n /** Maximum delay in milliseconds */\n maxDelay: number;\n };\n\n /**\n * Request timeout in milliseconds\n * @default 30000\n */\n timeout: number;\n\n /**\n * Default headers to include in all requests\n */\n defaultHeaders: Record<string, string>;\n}\n\n/**\n * Options for individual fetch requests\n */\nexport interface FetchOptions {\n /**\n * Custom TTL for this request (overrides default)\n */\n ttl?: number;\n\n /**\n * Skip cache and force fresh fetch\n * @default false\n */\n skipCache?: boolean;\n\n /**\n * AbortSignal for request cancellation\n */\n signal?: AbortSignal;\n\n /**\n * Additional headers for this request\n */\n headers?: Record<string, string>;\n\n /**\n * Callback before each retry attempt\n */\n onRetry?: (attempt: number, delay: number, error: Error) => void;\n\n /**\n * Callback when fetch starts\n */\n onStart?: () => void;\n\n /**\n * Callback when fetch completes successfully\n */\n onComplete?: (data: FeatureCollection, fromCache: boolean) => void;\n\n /**\n * Callback when fetch fails\n */\n onError?: (error: Error) => void;\n}\n\n/**\n * Result of a fetch operation\n */\nexport interface FetchResult {\n /** The fetched GeoJSON data */\n data: FeatureCollection;\n\n /** Whether data came from cache */\n fromCache: boolean;\n\n /** Number of features in the collection */\n featureCount: number;\n\n /** Duration of fetch operation in milliseconds */\n duration: number;\n}\n\n/**\n * HTTP data fetcher with caching and retry support.\n *\n * @remarks\n * Features:\n * - In-memory caching with TTL\n * - Conditional requests (If-None-Match, If-Modified-Since)\n * - Automatic retry with exponential backoff\n * - Request timeout and cancellation\n * - GeoJSON validation\n * - Lifecycle callbacks\n *\n * @example\n * ```typescript\n * const fetcher = new DataFetcher({\n * cache: { enabled: true, defaultTTL: 300000, maxSize: 100 },\n * retry: { enabled: true, maxRetries: 3, initialDelay: 1000, maxDelay: 10000 },\n * timeout: 30000,\n * });\n *\n * // Fetch with caching\n * const result = await fetcher.fetch('https://example.com/data.geojson');\n * console.log(`Fetched ${result.featureCount} features in ${result.duration}ms`);\n *\n * // Prefetch for later use\n * await fetcher.prefetch('https://example.com/data2.geojson');\n *\n * // Force fresh fetch\n * const fresh = await fetcher.fetch(url, { skipCache: true });\n * ```\n */\nexport class DataFetcher {\n private static readonly DEFAULT_CONFIG: FetcherConfig = {\n cache: {\n enabled: true,\n defaultTTL: 300000, // 5 minutes\n maxSize: 100,\n },\n retry: {\n enabled: true,\n maxRetries: 3,\n initialDelay: 1000,\n maxDelay: 10000,\n },\n timeout: 30000,\n defaultHeaders: {\n Accept: \"application/geo+json,application/json\",\n },\n };\n\n private config: FetcherConfig;\n private cache: MemoryCache<FeatureCollection>;\n private retryManager: RetryManager;\n private activeRequests = new Map<string, AbortController>();\n\n /**\n * Create a new DataFetcher instance\n *\n * @param config - Fetcher configuration\n */\n constructor(config?: Partial<FetcherConfig>) {\n this.config = this.mergeConfig(config);\n\n this.cache = new MemoryCache<FeatureCollection>({\n maxSize: this.config.cache.maxSize,\n defaultTTL: this.config.cache.defaultTTL,\n useConditionalRequests: true,\n });\n\n this.retryManager = new RetryManager({\n maxRetries: this.config.retry.maxRetries,\n initialDelay: this.config.retry.initialDelay,\n maxDelay: this.config.retry.maxDelay,\n });\n }\n\n /**\n * Fetch GeoJSON data from a URL\n *\n * @param url - URL to fetch from\n * @param options - Fetch options\n * @returns Fetch result with data and metadata\n * @throws {Error} On network error, timeout, invalid JSON, or non-GeoJSON response\n *\n * @example\n * ```typescript\n * const result = await fetcher.fetch(\n * 'https://example.com/data.geojson',\n * {\n * ttl: 60000, // 1 minute cache\n * onRetry: (attempt, delay, error) => {\n * console.log(`Retry ${attempt} in ${delay}ms: ${error.message}`);\n * },\n * }\n * );\n * ```\n */\n async fetch(url: string, options: FetchOptions = {}): Promise<FetchResult> {\n const startTime = Date.now();\n\n options.onStart?.();\n\n try {\n // Check cache first (unless skipCache is true)\n if (this.config.cache.enabled && !options.skipCache) {\n const cached = this.cache.get(url);\n if (cached) {\n const result: FetchResult = {\n data: cached.data,\n fromCache: true,\n featureCount: cached.data.features.length,\n duration: Date.now() - startTime,\n };\n options.onComplete?.(cached.data, true);\n return result;\n }\n }\n\n // Fetch fresh data\n const data = await this.fetchWithRetry(url, options);\n\n // Cache the result\n if (this.config.cache.enabled && !options.skipCache) {\n const cacheEntry: CacheEntry<FeatureCollection> = {\n data,\n timestamp: Date.now(),\n ttl: options.ttl,\n };\n this.cache.set(url, cacheEntry);\n }\n\n const result: FetchResult = {\n data,\n fromCache: false,\n featureCount: data.features.length,\n duration: Date.now() - startTime,\n };\n\n options.onComplete?.(data, false);\n return result;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n options.onError?.(err);\n throw err;\n }\n }\n\n /**\n * Prefetch data and store in cache\n *\n * @remarks\n * Useful for preloading data that will be needed soon.\n * Does not return the data.\n *\n * @param url - URL to prefetch\n * @param ttl - Optional custom TTL for cached entry\n *\n * @example\n * ```typescript\n * // Prefetch data for quick access later\n * await fetcher.prefetch('https://example.com/data.geojson', 600000);\n * ```\n */\n async prefetch(url: string, ttl?: number): Promise<void> {\n await this.fetch(url, { ttl, skipCache: false });\n }\n\n /**\n * Invalidate cached entry for a URL\n *\n * @param url - URL to invalidate\n *\n * @example\n * ```typescript\n * // Force next fetch to get fresh data\n * fetcher.invalidate('https://example.com/data.geojson');\n * ```\n */\n invalidate(url: string): void {\n this.cache.delete(url);\n }\n\n /**\n * Clear all cached entries\n */\n clearCache(): void {\n this.cache.clear();\n }\n\n /**\n * Get cache statistics\n *\n * @returns Cache stats including size, hits, misses, and hit rate\n */\n getCacheStats(): CacheStats {\n return this.cache.getStats();\n }\n\n /**\n * Abort all active requests\n */\n abortAll(): void {\n for (const controller of this.activeRequests.values()) {\n controller.abort();\n }\n this.activeRequests.clear();\n }\n\n /**\n * Fetch with retry logic\n */\n private async fetchWithRetry(\n url: string,\n options: FetchOptions\n ): Promise<FeatureCollection> {\n if (!this.config.retry.enabled) {\n return this.performFetch(url, options);\n }\n\n return this.retryManager.execute(\n () => this.performFetch(url, options),\n {\n onRetry: options.onRetry,\n isRetryable: (error) => this.isRetryableError(error),\n }\n );\n }\n\n /**\n * Perform the actual HTTP fetch\n */\n private async performFetch(\n url: string,\n options: FetchOptions\n ): Promise<FeatureCollection> {\n // Create abort controller with timeout\n const controller = options.signal\n ? new AbortController()\n : new AbortController();\n\n // Link external signal if provided\n if (options.signal) {\n options.signal.addEventListener(\"abort\", () => controller.abort());\n }\n\n // Set timeout\n const timeoutId = setTimeout(() => {\n controller.abort();\n }, this.config.timeout);\n\n this.activeRequests.set(url, controller);\n\n try {\n // Prepare headers\n const headers = {\n ...this.config.defaultHeaders,\n ...options.headers,\n };\n\n // Add conditional headers if we have cached entry\n if (this.config.cache.enabled && this.cache.has(url)) {\n const conditionalHeaders = this.cache.getConditionalHeaders(url);\n Object.assign(headers, conditionalHeaders);\n }\n\n // Perform fetch\n const response = await fetch(url, {\n signal: controller.signal,\n headers,\n });\n\n // Handle 304 Not Modified\n if (response.status === 304) {\n const cached = this.cache.get(url);\n if (cached) {\n // Touch to update access order\n this.cache.touch(url);\n return cached.data;\n }\n // Fallback: shouldn't happen, but handle gracefully\n throw new Error(\"304 Not Modified but no cached data available\");\n }\n\n // Handle HTTP errors\n if (!response.ok) {\n throw new Error(\n `HTTP ${response.status}: ${response.statusText} for ${url}`\n );\n }\n\n // Parse JSON\n let data: unknown;\n try {\n data = await response.json();\n } catch (error) {\n throw new Error(`Invalid JSON response from ${url}`);\n }\n\n // Validate GeoJSON\n if (!this.isValidGeoJSON(data)) {\n throw new Error(`Response from ${url} is not valid GeoJSON`);\n }\n\n // Update cache metadata with response headers\n if (this.config.cache.enabled) {\n const etag = response.headers.get(\"etag\");\n const lastModified = response.headers.get(\"last-modified\");\n\n if (etag || lastModified) {\n const cached = this.cache.get(url);\n if (cached) {\n // Update existing cache entry with new headers\n this.cache.set(url, {\n ...cached,\n etag: etag || cached.etag,\n lastModified: lastModified || cached.lastModified,\n });\n }\n }\n }\n\n return data as FeatureCollection;\n } finally {\n clearTimeout(timeoutId);\n this.activeRequests.delete(url);\n }\n }\n\n /**\n * Check if an error should trigger a retry\n */\n private isRetryableError(error: Error): boolean {\n const message = error.message.toLowerCase();\n\n // Don't retry on client errors (except 429 rate limit)\n if (message.includes(\"http 4\") && !message.includes(\"429\")) {\n return false;\n }\n\n // Don't retry on invalid JSON or GeoJSON\n if (\n message.includes(\"invalid json\") ||\n message.includes(\"not valid geojson\")\n ) {\n return false;\n }\n\n // Retry on network errors, timeouts, and server errors\n return true;\n }\n\n /**\n * Validate that data is a GeoJSON FeatureCollection\n */\n private isValidGeoJSON(data: unknown): data is FeatureCollection {\n if (typeof data !== \"object\" || data === null) {\n return false;\n }\n\n const obj = data as Record<string, unknown>;\n\n return (\n obj.type === \"FeatureCollection\" && Array.isArray(obj.features)\n );\n }\n\n /**\n * Merge partial config with defaults\n */\n private mergeConfig(partial?: Partial<FetcherConfig>): FetcherConfig {\n if (!partial) return DataFetcher.DEFAULT_CONFIG;\n\n return {\n cache: { ...DataFetcher.DEFAULT_CONFIG.cache, ...partial.cache },\n retry: { ...DataFetcher.DEFAULT_CONFIG.retry, ...partial.retry },\n timeout: partial.timeout ?? DataFetcher.DEFAULT_CONFIG.timeout,\n defaultHeaders: {\n ...DataFetcher.DEFAULT_CONFIG.defaultHeaders,\n ...partial.defaultHeaders,\n },\n };\n }\n}\n","/**\n * @file Polling manager for periodic data refresh\n * @module @maplibre-yaml/core/data\n */\n\n/**\n * Configuration for a polling subscription.\n *\n * @remarks\n * The polling manager ensures non-overlapping execution by waiting for each\n * tick to complete before scheduling the next one. This prevents concurrent\n * execution of the same polling task.\n *\n * @example\n * ```typescript\n * const polling = new PollingManager();\n *\n * polling.start('vehicles', {\n * interval: 5000,\n * onTick: async () => {\n * const data = await fetch('/api/vehicles');\n * updateMap(data);\n * },\n * onError: (error) => console.error(error),\n * immediate: true,\n * pauseWhenHidden: true,\n * });\n * ```\n */\nexport interface PollingConfig {\n /** Polling interval in milliseconds (minimum 1000ms) */\n interval: number;\n\n /** Function to execute on each tick */\n onTick: () => Promise<void>;\n\n /** Error handler for tick failures */\n onError?: (error: Error) => void;\n\n /** Execute immediately on start (default: false) */\n immediate?: boolean;\n\n /** Pause polling when document is hidden (default: true) */\n pauseWhenHidden?: boolean;\n}\n\n/**\n * Current state of a polling subscription.\n */\nexport interface PollingState {\n /** Whether polling is active */\n isActive: boolean;\n\n /** Whether polling is paused */\n isPaused: boolean;\n\n /** Timestamp of last successful tick */\n lastTick: number | null;\n\n /** Timestamp of next scheduled tick */\n nextTick: number | null;\n\n /** Total number of successful ticks */\n tickCount: number;\n\n /** Total number of errors */\n errorCount: number;\n}\n\n/**\n * Internal subscription data.\n */\ninterface Subscription {\n config: PollingConfig;\n state: PollingState;\n timerId: ReturnType<typeof setTimeout> | null;\n isExecuting: boolean;\n pausedByVisibility: boolean;\n}\n\n/**\n * Manages polling intervals for data refresh.\n *\n * @remarks\n * Features:\n * - Independent intervals per subscription\n * - Visibility-aware (pause when tab hidden)\n * - Tracks tick count and error count\n * - Non-overlapping execution (waits for tick to complete)\n * - Pause/resume functionality\n * - Manual trigger support\n *\n * The polling manager automatically pauses polling when the document becomes\n * hidden (unless `pauseWhenHidden` is false) and resumes when visible again.\n *\n * @example\n * ```typescript\n * const polling = new PollingManager();\n *\n * // Start polling\n * polling.start('data-refresh', {\n * interval: 10000,\n * onTick: async () => {\n * await fetchAndUpdateData();\n * },\n * immediate: true,\n * });\n *\n * // Pause temporarily\n * polling.pause('data-refresh');\n *\n * // Resume\n * polling.resume('data-refresh');\n *\n * // Trigger immediately\n * await polling.triggerNow('data-refresh');\n *\n * // Stop completely\n * polling.stop('data-refresh');\n * ```\n */\nexport class PollingManager {\n private subscriptions = new Map<string, Subscription>();\n private visibilityListener: (() => void) | null = null;\n\n constructor() {\n this.setupVisibilityListener();\n }\n\n /**\n * Start a new polling subscription.\n *\n * @param id - Unique identifier for the subscription\n * @param config - Polling configuration\n * @throws Error if a subscription with the same ID already exists\n *\n * @example\n * ```typescript\n * polling.start('layer-1', {\n * interval: 5000,\n * onTick: async () => {\n * await updateLayerData();\n * },\n * });\n * ```\n */\n start(id: string, config: PollingConfig): void {\n if (this.subscriptions.has(id)) {\n throw new Error(`Polling subscription with id \"${id}\" already exists`);\n }\n\n const subscription: Subscription = {\n config,\n state: {\n isActive: true,\n isPaused: false,\n lastTick: null,\n nextTick: null,\n tickCount: 0,\n errorCount: 0,\n },\n timerId: null,\n isExecuting: false,\n pausedByVisibility: false,\n };\n\n this.subscriptions.set(id, subscription);\n\n // Execute immediately if requested\n if (config.immediate) {\n this.executeTick(id);\n } else {\n this.scheduleNextTick(id);\n }\n }\n\n /**\n * Stop a polling subscription and clean up resources.\n *\n * @param id - Subscription identifier\n *\n * @example\n * ```typescript\n * polling.stop('layer-1');\n * ```\n */\n stop(id: string): void {\n const subscription = this.subscriptions.get(id);\n if (!subscription) return;\n\n if (subscription.timerId !== null) {\n clearTimeout(subscription.timerId);\n }\n\n subscription.state.isActive = false;\n this.subscriptions.delete(id);\n }\n\n /**\n * Stop all polling subscriptions.\n *\n * @example\n * ```typescript\n * polling.stopAll();\n * ```\n */\n stopAll(): void {\n for (const id of this.subscriptions.keys()) {\n this.stop(id);\n }\n }\n\n /**\n * Pause a polling subscription without stopping it.\n *\n * @param id - Subscription identifier\n *\n * @remarks\n * Paused subscriptions can be resumed with {@link resume}.\n * The subscription maintains its state while paused.\n *\n * @example\n * ```typescript\n * polling.pause('layer-1');\n * ```\n */\n pause(id: string): void {\n const subscription = this.subscriptions.get(id);\n if (!subscription || subscription.state.isPaused) return;\n\n if (subscription.timerId !== null) {\n clearTimeout(subscription.timerId);\n subscription.timerId = null;\n }\n\n subscription.state.isPaused = true;\n subscription.state.nextTick = null;\n }\n\n /**\n * Pause all active polling subscriptions.\n *\n * @example\n * ```typescript\n * polling.pauseAll();\n * ```\n */\n pauseAll(): void {\n for (const id of this.subscriptions.keys()) {\n this.pause(id);\n }\n }\n\n /**\n * Resume a paused polling subscription.\n *\n * @param id - Subscription identifier\n *\n * @example\n * ```typescript\n * polling.resume('layer-1');\n * ```\n */\n resume(id: string): void {\n const subscription = this.subscriptions.get(id);\n if (!subscription || !subscription.state.isPaused) return;\n\n subscription.state.isPaused = false;\n subscription.pausedByVisibility = false;\n this.scheduleNextTick(id);\n }\n\n /**\n * Resume all paused polling subscriptions.\n *\n * @example\n * ```typescript\n * polling.resumeAll();\n * ```\n */\n resumeAll(): void {\n for (const id of this.subscriptions.keys()) {\n this.resume(id);\n }\n }\n\n /**\n * Trigger an immediate execution of the polling tick.\n *\n * @param id - Subscription identifier\n * @returns Promise that resolves when the tick completes\n * @throws Error if the subscription doesn't exist\n *\n * @remarks\n * This does not affect the regular polling schedule. The next scheduled\n * tick will still occur at the expected time.\n *\n * @example\n * ```typescript\n * await polling.triggerNow('layer-1');\n * ```\n */\n async triggerNow(id: string): Promise<void> {\n const subscription = this.subscriptions.get(id);\n if (!subscription) {\n throw new Error(`Polling subscription \"${id}\" not found`);\n }\n\n await this.executeTick(id);\n }\n\n /**\n * Get the current state of a polling subscription.\n *\n * @param id - Subscription identifier\n * @returns Current state or null if not found\n *\n * @example\n * ```typescript\n * const state = polling.getState('layer-1');\n * if (state) {\n * console.log(`Ticks: ${state.tickCount}, Errors: ${state.errorCount}`);\n * }\n * ```\n */\n getState(id: string): PollingState | null {\n const subscription = this.subscriptions.get(id);\n return subscription ? { ...subscription.state } : null;\n }\n\n /**\n * Get all active polling subscription IDs.\n *\n * @returns Array of subscription IDs\n *\n * @example\n * ```typescript\n * const ids = polling.getActiveIds();\n * console.log(`Active pollers: ${ids.join(', ')}`);\n * ```\n */\n getActiveIds(): string[] {\n return Array.from(this.subscriptions.keys());\n }\n\n /**\n * Check if a polling subscription exists.\n *\n * @param id - Subscription identifier\n * @returns True if the subscription exists\n *\n * @example\n * ```typescript\n * if (polling.has('layer-1')) {\n * polling.pause('layer-1');\n * }\n * ```\n */\n has(id: string): boolean {\n return this.subscriptions.has(id);\n }\n\n /**\n * Update the interval for an active polling subscription.\n *\n * @param id - Subscription identifier\n * @param interval - New interval in milliseconds (minimum 1000ms)\n * @throws Error if the subscription doesn't exist\n *\n * @remarks\n * The new interval takes effect after the current tick completes.\n *\n * @example\n * ```typescript\n * polling.setInterval('layer-1', 10000);\n * ```\n */\n setInterval(id: string, interval: number): void {\n const subscription = this.subscriptions.get(id);\n if (!subscription) {\n throw new Error(`Polling subscription \"${id}\" not found`);\n }\n\n if (interval < 1000) {\n throw new Error(\"Interval must be at least 1000ms\");\n }\n\n subscription.config.interval = interval;\n\n // Reschedule if active and not paused\n if (\n !subscription.state.isPaused &&\n !subscription.isExecuting &&\n subscription.timerId !== null\n ) {\n clearTimeout(subscription.timerId);\n this.scheduleNextTick(id);\n }\n }\n\n /**\n * Clean up all resources and stop all polling.\n *\n * @remarks\n * Should be called when the polling manager is no longer needed.\n * After calling destroy, the polling manager should not be used.\n *\n * @example\n * ```typescript\n * polling.destroy();\n * ```\n */\n destroy(): void {\n this.stopAll();\n this.teardownVisibilityListener();\n }\n\n /**\n * Execute a single tick for a subscription.\n */\n private async executeTick(id: string): Promise<void> {\n const subscription = this.subscriptions.get(id);\n if (!subscription || subscription.isExecuting) return;\n\n subscription.isExecuting = true;\n\n try {\n await subscription.config.onTick();\n subscription.state.tickCount++;\n subscription.state.lastTick = Date.now();\n } catch (error) {\n subscription.state.errorCount++;\n const err = error instanceof Error ? error : new Error(String(error));\n subscription.config.onError?.(err);\n } finally {\n subscription.isExecuting = false;\n\n // Schedule next tick if still active and not paused\n if (\n this.subscriptions.has(id) &&\n subscription.state.isActive &&\n !subscription.state.isPaused\n ) {\n this.scheduleNextTick(id);\n }\n }\n }\n\n /**\n * Schedule the next tick for a subscription.\n */\n private scheduleNextTick(id: string): void {\n const subscription = this.subscriptions.get(id);\n if (!subscription) return;\n\n const nextTime = Date.now() + subscription.config.interval;\n subscription.state.nextTick = nextTime;\n\n subscription.timerId = setTimeout(() => {\n this.executeTick(id);\n }, subscription.config.interval);\n }\n\n /**\n * Setup document visibility listener for automatic pause/resume.\n */\n private setupVisibilityListener(): void {\n if (typeof document === \"undefined\") return;\n\n this.visibilityListener = () => {\n if (document.hidden) {\n this.handleVisibilityChange(true);\n } else {\n this.handleVisibilityChange(false);\n }\n };\n\n document.addEventListener(\"visibilitychange\", this.visibilityListener);\n }\n\n /**\n * Handle document visibility changes.\n */\n private handleVisibilityChange(hidden: boolean): void {\n for (const [id, subscription] of this.subscriptions) {\n const pauseEnabled = subscription.config.pauseWhenHidden !== false;\n\n if (hidden && pauseEnabled && !subscription.state.isPaused) {\n // Pause due to visibility\n subscription.pausedByVisibility = true;\n this.pause(id);\n } else if (!hidden && pauseEnabled && subscription.pausedByVisibility) {\n // Resume from visibility pause\n this.resume(id);\n }\n }\n }\n\n /**\n * Remove document visibility listener.\n */\n private teardownVisibilityListener(): void {\n if (this.visibilityListener && typeof document !== \"undefined\") {\n document.removeEventListener(\"visibilitychange\", this.visibilityListener);\n this.visibilityListener = null;\n }\n }\n}\n","/**\n * @file Type-safe event emitter utility\n * @module @maplibre-yaml/core/utils\n */\n\n/**\n * Event handler function type\n */\nexport type EventHandler<T> = (data: T) => void;\n\n/**\n * Type-safe event emitter with strongly-typed event names and payloads\n *\n * @remarks\n * This class provides a type-safe event emitter pattern where event names\n * and their payload types are strictly enforced. It's designed to be extended\n * by classes that need event emission capabilities.\n *\n * @example\n * ```typescript\n * interface MyEvents {\n * connect: void;\n * message: { text: string };\n * error: { error: Error };\n * }\n *\n * class MyEmitter extends EventEmitter<MyEvents> {\n * connect() {\n * this.emit('connect', undefined);\n * }\n *\n * sendMessage(text: string) {\n * this.emit('message', { text });\n * }\n * }\n *\n * const emitter = new MyEmitter();\n * emitter.on('message', (data) => {\n * console.log(data.text); // Strongly typed!\n * });\n * ```\n *\n * @typeParam Events - Record of event names to payload types\n */\nexport class EventEmitter<Events extends Record<string, unknown>> {\n private handlers = new Map<keyof Events, Set<EventHandler<any>>>();\n\n /**\n * Register an event handler\n *\n * @param event - Event name to listen for\n * @param handler - Callback function to invoke when event is emitted\n * @returns Unsubscribe function that removes this specific handler\n *\n * @example\n * ```typescript\n * const unsubscribe = emitter.on('message', (data) => {\n * console.log(data.text);\n * });\n *\n * // Later, to unsubscribe:\n * unsubscribe();\n * ```\n */\n on<K extends keyof Events>(\n event: K,\n handler: EventHandler<Events[K]>\n ): () => void {\n if (!this.handlers.has(event)) {\n this.handlers.set(event, new Set());\n }\n\n this.handlers.get(event)!.add(handler);\n\n // Return unsubscribe function\n return () => this.off(event, handler);\n }\n\n /**\n * Register a one-time event handler\n *\n * @remarks\n * The handler will be automatically removed after being invoked once.\n *\n * @param event - Event name to listen for\n * @param handler - Callback function to invoke once\n *\n * @example\n * ```typescript\n * emitter.once('connect', () => {\n * console.log('Connected!');\n * });\n * ```\n */\n once<K extends keyof Events>(\n event: K,\n handler: EventHandler<Events[K]>\n ): void {\n const onceWrapper: EventHandler<Events[K]> = (data) => {\n this.off(event, onceWrapper);\n handler(data);\n };\n\n this.on(event, onceWrapper);\n }\n\n /**\n * Remove an event handler\n *\n * @param event - Event name\n * @param handler - Handler function to remove\n *\n * @example\n * ```typescript\n * const handler = (data) => console.log(data);\n * emitter.on('message', handler);\n * emitter.off('message', handler);\n * ```\n */\n off<K extends keyof Events>(\n event: K,\n handler: EventHandler<Events[K]>\n ): void {\n const handlers = this.handlers.get(event);\n if (handlers) {\n handlers.delete(handler);\n if (handlers.size === 0) {\n this.handlers.delete(event);\n }\n }\n }\n\n /**\n * Emit an event to all registered handlers\n *\n * @remarks\n * This method is protected to ensure only the extending class can emit events.\n * All handlers are invoked synchronously in the order they were registered.\n *\n * @param event - Event name to emit\n * @param data - Event payload data\n *\n * @example\n * ```typescript\n * class MyEmitter extends EventEmitter<MyEvents> {\n * doSomething() {\n * this.emit('something-happened', { value: 42 });\n * }\n * }\n * ```\n */\n protected emit<K extends keyof Events>(event: K, data: Events[K]): void {\n const handlers = this.handlers.get(event);\n if (handlers) {\n for (const handler of handlers) {\n handler(data);\n }\n }\n }\n\n /**\n * Remove all handlers for an event, or all handlers for all events\n *\n * @param event - Optional event name. If omitted, removes all handlers for all events.\n *\n * @example\n * ```typescript\n * // Remove all handlers for 'message' event\n * emitter.removeAllListeners('message');\n *\n * // Remove all handlers for all events\n * emitter.removeAllListeners();\n * ```\n */\n removeAllListeners<K extends keyof Events>(event?: K): void {\n if (event) {\n this.handlers.delete(event);\n } else {\n this.handlers.clear();\n }\n }\n\n /**\n * Get the number of handlers registered for an event\n *\n * @param event - Event name\n * @returns Number of registered handlers\n *\n * @example\n * ```typescript\n * const count = emitter.listenerCount('message');\n * console.log(`${count} handlers registered`);\n * ```\n */\n listenerCount<K extends keyof Events>(event: K): number {\n const handlers = this.handlers.get(event);\n return handlers ? handlers.size : 0;\n }\n\n /**\n * Get all event names that have registered handlers\n *\n * @returns Array of event names\n *\n * @example\n * ```typescript\n * const events = emitter.eventNames();\n * console.log('Events with handlers:', events);\n * ```\n */\n eventNames(): Array<keyof Events> {\n return Array.from(this.handlers.keys());\n }\n\n /**\n * Check if an event has any registered handlers\n *\n * @param event - Event name\n * @returns True if the event has at least one handler\n *\n * @example\n * ```typescript\n * if (emitter.hasListeners('message')) {\n * emitter.emit('message', { text: 'Hello' });\n * }\n * ```\n */\n hasListeners<K extends keyof Events>(event: K): boolean {\n return this.listenerCount(event) > 0;\n }\n}\n","/**\n * @file Base connection class for streaming connections\n * @module @maplibre-yaml/core/data/streaming\n */\n\nimport { EventEmitter } from \"../../utils/event-emitter\";\nimport { RetryManager } from \"../retry-manager\";\nimport type { RetryConfig } from \"../retry-manager\";\n\n/**\n * Connection state enum.\n *\n * @remarks\n * State transitions:\n * - disconnected → connecting → connected\n * - connected → disconnected (on manual disconnect)\n * - connected → reconnecting → connected (on connection loss with reconnect enabled)\n * - reconnecting → failed (after max reconnect attempts)\n */\nexport type ConnectionState =\n | \"disconnected\"\n | \"connecting\"\n | \"connected\"\n | \"reconnecting\"\n | \"failed\";\n\n/**\n * Events emitted by streaming connections.\n *\n * @remarks\n * All connections emit these events to allow consumers to react to\n * connection lifecycle changes and incoming messages.\n */\nexport interface ConnectionEvents extends Record<string, unknown> {\n /** Emitted when connection is established */\n connect: void;\n\n /** Emitted when connection is closed */\n disconnect: { reason: string };\n\n /** Emitted when a message is received */\n message: { data: unknown };\n\n /** Emitted when an error occurs */\n error: { error: Error };\n\n /** Emitted when attempting to reconnect */\n reconnecting: { attempt: number; delay: number };\n\n /** Emitted when reconnection succeeds */\n reconnected: { attempts: number };\n\n /** Emitted when reconnection fails after max attempts */\n failed: { attempts: number; lastError: Error };\n\n /** Emitted whenever connection state changes */\n stateChange: { from: ConnectionState; to: ConnectionState };\n}\n\n/**\n * Base configuration for all connection types.\n */\nexport interface ConnectionConfig {\n /** Connection URL */\n url: string;\n\n /** Enable automatic reconnection on disconnect (default: true) */\n reconnect?: boolean;\n\n /** Reconnection retry configuration */\n reconnectConfig?: Partial<RetryConfig>;\n}\n\n/**\n * Abstract base class for streaming connections.\n *\n * @remarks\n * Provides common functionality for all streaming connection types:\n * - Connection state management\n * - Event emission via EventEmitter\n * - Automatic reconnection with exponential backoff\n * - State change tracking\n *\n * Subclasses must implement:\n * - `connect()`: Establish the connection\n * - `disconnect()`: Close the connection\n *\n * @example\n * ```typescript\n * class MyConnection extends BaseConnection {\n * async connect(): Promise<void> {\n * this.setState('connecting');\n * // ... connection logic\n * this.setState('connected');\n * this.emit('connect', undefined);\n * }\n *\n * disconnect(): void {\n * // ... disconnection logic\n * this.handleDisconnect('Manual disconnect');\n * }\n * }\n * ```\n */\nexport abstract class BaseConnection extends EventEmitter<ConnectionEvents> {\n protected state: ConnectionState = \"disconnected\";\n protected config: Required<ConnectionConfig>;\n protected retryManager: RetryManager;\n protected reconnectAttempts = 0;\n protected manualDisconnect = false;\n\n /**\n * Create a new base connection.\n *\n * @param config - Connection configuration\n */\n constructor(config: ConnectionConfig) {\n super();\n\n this.config = {\n reconnect: true,\n reconnectConfig: {},\n ...config,\n };\n\n // Setup retry manager for reconnection\n this.retryManager = new RetryManager({\n maxRetries: 10,\n initialDelay: 1000,\n maxDelay: 30000,\n backoffFactor: 2,\n jitter: true,\n jitterFactor: 0.25,\n ...this.config.reconnectConfig,\n });\n }\n\n /**\n * Establish connection to the server.\n *\n * @remarks\n * Must be implemented by subclasses. Should:\n * 1. Set state to 'connecting'\n * 2. Establish the connection\n * 3. Set state to 'connected'\n * 4. Emit 'connect' event\n *\n * @throws Error if connection fails\n */\n abstract connect(): Promise<void>;\n\n /**\n * Close the connection.\n *\n * @remarks\n * Must be implemented by subclasses. Should:\n * 1. Close the underlying connection\n * 2. Call handleDisconnect() with reason\n */\n abstract disconnect(): void;\n\n /**\n * Get current connection state.\n *\n * @returns Current state\n *\n * @example\n * ```typescript\n * const state = connection.getState();\n * if (state === 'connected') {\n * // Connection is ready\n * }\n * ```\n */\n getState(): ConnectionState {\n return this.state;\n }\n\n /**\n * Check if connection is currently connected.\n *\n * @returns True if connected\n *\n * @example\n * ```typescript\n * if (connection.isConnected()) {\n * connection.send(data);\n * }\n * ```\n */\n isConnected(): boolean {\n return this.state === \"connected\";\n }\n\n /**\n * Get the number of reconnection attempts.\n *\n * @returns Number of reconnect attempts\n */\n getReconnectAttempts(): number {\n return this.reconnectAttempts;\n }\n\n /**\n * Update connection state and emit state change event.\n *\n * @param newState - New connection state\n *\n * @remarks\n * Automatically emits 'stateChange' event when state changes.\n * Subclasses should call this method instead of setting state directly.\n *\n * @example\n * ```typescript\n * protected async connect() {\n * this.setState('connecting');\n * await this.establishConnection();\n * this.setState('connected');\n * }\n * ```\n */\n protected setState(newState: ConnectionState): void {\n if (this.state === newState) return;\n\n const oldState = this.state;\n this.state = newState;\n\n this.emit(\"stateChange\", { from: oldState, to: newState });\n }\n\n /**\n * Handle disconnection and optionally attempt reconnection.\n *\n * @param reason - Reason for disconnection\n *\n * @remarks\n * This method should be called by subclasses when the connection is lost.\n * It will:\n * 1. Emit 'disconnect' event\n * 2. Attempt reconnection if enabled and not manually disconnected\n * 3. Emit 'reconnecting', 'reconnected', or 'failed' events as appropriate\n *\n * @example\n * ```typescript\n * ws.onclose = () => {\n * this.handleDisconnect('Connection closed');\n * };\n * ```\n */\n protected async handleDisconnect(reason: string): Promise<void> {\n // Set state before emitting disconnect event\n const wasConnected = this.state === \"connected\";\n this.setState(\"disconnected\");\n\n // Emit disconnect event\n this.emit(\"disconnect\", { reason });\n\n // Only attempt reconnection if:\n // 1. Reconnect is enabled\n // 2. Not manually disconnected\n // 3. Was previously connected (not a failed initial connection)\n if (!this.config.reconnect || this.manualDisconnect || !wasConnected) {\n return;\n }\n\n // Attempt reconnection with exponential backoff\n await this.attemptReconnection();\n }\n\n /**\n * Attempt to reconnect with exponential backoff.\n */\n private async attemptReconnection(): Promise<void> {\n this.setState(\"reconnecting\");\n this.reconnectAttempts = 0;\n\n try {\n await this.retryManager.execute(\n async () => {\n this.reconnectAttempts++;\n await this.connect();\n },\n {\n onRetry: (attempt, delay) => {\n this.emit(\"reconnecting\", { attempt, delay });\n },\n onSuccess: (attempts) => {\n this.reconnectAttempts = 0;\n this.emit(\"reconnected\", { attempts });\n },\n }\n );\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n this.setState(\"failed\");\n this.emit(\"failed\", {\n attempts: this.reconnectAttempts,\n lastError: error,\n });\n }\n }\n\n /**\n * Mark disconnection as manual to prevent reconnection.\n *\n * @remarks\n * Should be called by subclasses in their disconnect() implementation\n * before closing the connection.\n *\n * @example\n * ```typescript\n * disconnect(): void {\n * this.setManualDisconnect();\n * this.ws.close();\n * }\n * ```\n */\n protected setManualDisconnect(): void {\n this.manualDisconnect = true;\n }\n\n /**\n * Reset manual disconnect flag.\n *\n * @remarks\n * Should be called when establishing a new connection to allow\n * automatic reconnection for subsequent disconnections.\n */\n protected resetManualDisconnect(): void {\n this.manualDisconnect = false;\n }\n}\n","/**\n * @file Server-Sent Events connection implementation\n * @module @maplibre-yaml/core/data/streaming\n */\n\nimport { BaseConnection } from \"./base-connection\";\nimport type { ConnectionConfig } from \"./base-connection\";\n\n/**\n * Configuration for SSE connections.\n *\n * @remarks\n * Server-Sent Events (SSE) is a server push technology enabling a client\n * to receive automatic updates from a server via an HTTP connection.\n *\n * SSE is unidirectional (server to client only) and automatically handles\n * reconnection when the connection is lost.\n */\nexport interface SSEConfig extends ConnectionConfig {\n /**\n * Event types to listen for (default: ['message'])\n *\n * @remarks\n * The EventSource API can listen for custom event types sent by the server.\n * By default, it listens to the 'message' event type.\n *\n * @example\n * ```typescript\n * eventTypes: ['update', 'delete', 'create']\n * ```\n */\n eventTypes?: string[];\n\n /**\n * Include credentials in CORS requests (default: false)\n *\n * @remarks\n * When true, the EventSource will include credentials (cookies, authorization\n * headers, etc.) when making cross-origin requests.\n */\n withCredentials?: boolean;\n}\n\n/**\n * Server-Sent Events connection.\n *\n * @remarks\n * Primary streaming mechanism for real-time updates. Uses the native\n * EventSource API for robust, automatic reconnection handling.\n *\n * Features:\n * - Automatic reconnection by the browser\n * - Event-based message streaming\n * - JSON message parsing with error handling\n * - Multiple event type support\n * - Last event ID tracking for resume\n *\n * @example\n * ```typescript\n * const sse = new SSEConnection({\n * url: 'https://api.example.com/events',\n * eventTypes: ['update', 'delete'],\n * });\n *\n * sse.on('message', ({ data }) => {\n * console.log('Received:', data);\n * });\n *\n * sse.on('error', ({ error }) => {\n * console.error('Error:', error);\n * });\n *\n * await sse.connect();\n * ```\n */\nexport class SSEConnection extends BaseConnection {\n private eventSource: EventSource | null = null;\n private lastEventId: string | null = null;\n private readonly sseConfig: Required<SSEConfig>;\n\n /**\n * Create a new SSE connection.\n *\n * @param config - SSE configuration\n *\n * @example\n * ```typescript\n * const connection = new SSEConnection({\n * url: 'https://api.example.com/stream',\n * eventTypes: ['message', 'update'],\n * withCredentials: true,\n * });\n * ```\n */\n constructor(config: SSEConfig) {\n super(config);\n\n this.sseConfig = {\n ...this.config,\n eventTypes: config.eventTypes ?? [\"message\"],\n withCredentials: config.withCredentials ?? false,\n };\n }\n\n /**\n * Establish SSE connection.\n *\n * @remarks\n * Creates an EventSource and sets up event listeners for:\n * - Connection open\n * - Message events (for each configured event type)\n * - Error events\n *\n * The EventSource API handles reconnection automatically when the\n * connection is lost, unless explicitly closed.\n *\n * @throws Error if EventSource is not supported or connection fails\n *\n * @example\n * ```typescript\n * await connection.connect();\n * console.log('Connected to SSE stream');\n * ```\n */\n async connect(): Promise<void> {\n if (this.eventSource !== null) {\n throw new Error(\"Connection already exists\");\n }\n\n this.setState(\"connecting\");\n\n try {\n // Create EventSource with configuration\n this.eventSource = new EventSource(this.sseConfig.url, {\n withCredentials: this.sseConfig.withCredentials,\n });\n\n // Wait for connection to open\n await new Promise<void>((resolve, reject) => {\n if (!this.eventSource) {\n reject(new Error(\"EventSource not created\"));\n return;\n }\n\n const onOpen = () => {\n cleanup();\n this.setState(\"connected\");\n this.resetManualDisconnect();\n this.emit(\"connect\", undefined);\n resolve();\n };\n\n const onError = () => {\n cleanup();\n const error = new Error(\"Failed to connect to SSE stream\");\n this.emit(\"error\", { error });\n reject(error);\n };\n\n const cleanup = () => {\n this.eventSource?.removeEventListener(\"open\", onOpen);\n this.eventSource?.removeEventListener(\"error\", onError);\n };\n\n this.eventSource.addEventListener(\"open\", onOpen);\n this.eventSource.addEventListener(\"error\", onError);\n });\n\n // Setup message listeners for each event type\n this.setupEventListeners();\n } catch (error) {\n this.closeEventSource();\n throw error;\n }\n }\n\n /**\n * Close SSE connection.\n *\n * @remarks\n * Closes the EventSource and cleans up all event listeners.\n * Sets the manual disconnect flag to prevent automatic reconnection.\n *\n * @example\n * ```typescript\n * connection.disconnect();\n * console.log('Disconnected from SSE stream');\n * ```\n */\n disconnect(): void {\n this.setManualDisconnect();\n this.closeEventSource();\n this.handleDisconnect(\"Manual disconnect\");\n }\n\n /**\n * Get the last event ID received from the server.\n *\n * @returns Last event ID or null if none received\n *\n * @remarks\n * The event ID is used by the EventSource API to resume the stream\n * from the last received event after a reconnection. The browser\n * automatically sends this ID in the `Last-Event-ID` header.\n *\n * @example\n * ```typescript\n * const lastId = connection.getLastEventId();\n * if (lastId) {\n * console.log(`Last event: ${lastId}`);\n * }\n * ```\n */\n getLastEventId(): string | null {\n return this.lastEventId;\n }\n\n /**\n * Setup event listeners for configured event types.\n */\n private setupEventListeners(): void {\n if (!this.eventSource) return;\n\n // Add listener for each configured event type\n for (const eventType of this.sseConfig.eventTypes) {\n this.eventSource.addEventListener(eventType, (event: MessageEvent) => {\n this.handleMessage(event);\n });\n }\n\n // Add error listener for connection issues\n this.eventSource.addEventListener(\"error\", () => {\n this.handleError();\n });\n }\n\n /**\n * Handle incoming message event.\n */\n private handleMessage(event: MessageEvent): void {\n // Update last event ID if provided\n if (event.lastEventId) {\n this.lastEventId = event.lastEventId;\n }\n\n try {\n // Try to parse as JSON\n const data = JSON.parse(event.data);\n this.emit(\"message\", { data });\n } catch (error) {\n // If parsing fails, emit error but don't disconnect\n const parseError = new Error(\n `Failed to parse SSE message as JSON: ${event.data}`\n );\n this.emit(\"error\", { error: parseError });\n }\n }\n\n /**\n * Handle error event from EventSource.\n */\n private handleError(): void {\n // Only handle errors when connected (ignore reconnection attempts)\n if (this.state === \"connected\") {\n const error = new Error(\"SSE connection error\");\n this.emit(\"error\", { error });\n\n // Check if EventSource is closed\n if (this.eventSource?.readyState === EventSource.CLOSED) {\n this.closeEventSource();\n this.handleDisconnect(\"Connection closed by server\");\n }\n }\n }\n\n /**\n * Close EventSource and clean up.\n */\n private closeEventSource(): void {\n if (this.eventSource) {\n this.eventSource.close();\n this.eventSource = null;\n }\n }\n}\n","/**\n * @file WebSocket connection implementation\n * @module @maplibre-yaml/core/data/streaming\n */\n\nimport { BaseConnection } from \"./base-connection\";\nimport type { ConnectionConfig } from \"./base-connection\";\n\n/**\n * Configuration for WebSocket connections.\n *\n * @remarks\n * WebSocket provides full-duplex communication over a single TCP connection,\n * enabling bidirectional data flow between client and server.\n */\nexport interface WebSocketConfig extends ConnectionConfig {\n /**\n * WebSocket sub-protocols to use\n *\n * @remarks\n * Sub-protocols allow the client and server to agree on a specific\n * protocol on top of WebSocket. Can be a single string or array of strings.\n *\n * @example\n * ```typescript\n * protocols: 'json'\n * protocols: ['json', 'msgpack']\n * ```\n */\n protocols?: string | string[];\n}\n\n/**\n * WebSocket connection for bidirectional streaming.\n *\n * @remarks\n * Provides real-time bidirectional communication with automatic reconnection.\n * Unlike SSE, WebSocket supports sending data from client to server.\n *\n * Features:\n * - Full-duplex communication\n * - JSON message parsing with text fallback\n * - Manual reconnection with exponential backoff\n * - Sub-protocol support\n * - Send capability with connection validation\n *\n * @example\n * ```typescript\n * const ws = new WebSocketConnection({\n * url: 'wss://api.example.com/stream',\n * protocols: 'json',\n * });\n *\n * ws.on('message', ({ data }) => {\n * console.log('Received:', data);\n * });\n *\n * await ws.connect();\n * ws.send({ type: 'subscribe', channel: 'updates' });\n * ```\n */\nexport class WebSocketConnection extends BaseConnection {\n private ws: WebSocket | null = null;\n private readonly wsConfig: WebSocketConfig;\n\n /**\n * Create a new WebSocket connection.\n *\n * @param config - WebSocket configuration\n *\n * @example\n * ```typescript\n * const connection = new WebSocketConnection({\n * url: 'wss://api.example.com/stream',\n * protocols: ['json', 'v1'],\n * });\n * ```\n */\n constructor(config: WebSocketConfig) {\n super(config);\n\n this.wsConfig = {\n ...this.config,\n protocols: config.protocols,\n };\n }\n\n /**\n * Establish WebSocket connection.\n *\n * @remarks\n * Creates a WebSocket and sets up event listeners for:\n * - Connection open\n * - Message reception\n * - Connection close\n * - Errors\n *\n * Unlike EventSource, WebSocket does not have built-in reconnection,\n * so reconnection is handled manually via the BaseConnection.\n *\n * @throws Error if WebSocket is not supported or connection fails\n *\n * @example\n * ```typescript\n * await connection.connect();\n * console.log('Connected to WebSocket');\n * ```\n */\n async connect(): Promise<void> {\n if (this.ws !== null) {\n throw new Error(\"Connection already exists\");\n }\n\n this.setState(\"connecting\");\n\n try {\n // Create WebSocket with optional protocols\n this.ws = this.wsConfig.protocols\n ? new WebSocket(this.wsConfig.url, this.wsConfig.protocols)\n : new WebSocket(this.wsConfig.url);\n\n // Wait for connection to open\n await new Promise<void>((resolve, reject) => {\n if (!this.ws) {\n reject(new Error(\"WebSocket not created\"));\n return;\n }\n\n const onOpen = () => {\n cleanup();\n this.setState(\"connected\");\n this.resetManualDisconnect();\n this.emit(\"connect\", undefined);\n resolve();\n };\n\n const onError = () => {\n cleanup();\n const error = new Error(\"Failed to connect to WebSocket\");\n this.emit(\"error\", { error });\n reject(error);\n };\n\n const cleanup = () => {\n if (this.ws) {\n this.ws.removeEventListener(\"open\", onOpen);\n this.ws.removeEventListener(\"error\", onError);\n }\n };\n\n this.ws.addEventListener(\"open\", onOpen);\n this.ws.addEventListener(\"error\", onError);\n });\n\n // Setup message and close listeners\n this.setupEventListeners();\n } catch (error) {\n this.closeWebSocket();\n throw error;\n }\n }\n\n /**\n * Close WebSocket connection.\n *\n * @remarks\n * Closes the WebSocket with a normal closure code (1000).\n * Sets the manual disconnect flag to prevent automatic reconnection.\n *\n * @example\n * ```typescript\n * connection.disconnect();\n * console.log('Disconnected from WebSocket');\n * ```\n */\n disconnect(): void {\n this.setManualDisconnect();\n this.closeWebSocket();\n this.handleDisconnect(\"Manual disconnect\");\n }\n\n /**\n * Send data through WebSocket.\n *\n * @param data - Data to send (will be JSON stringified)\n * @throws Error if not connected\n *\n * @remarks\n * The data is automatically converted to JSON before sending.\n * Throws an error if called when the connection is not established.\n *\n * @example\n * ```typescript\n * connection.send({ type: 'ping' });\n * connection.send({ type: 'subscribe', channel: 'updates' });\n * ```\n */\n send(data: unknown): void {\n if (!this.isConnected() || !this.ws) {\n throw new Error(\"Cannot send: not connected\");\n }\n\n const message = JSON.stringify(data);\n this.ws.send(message);\n }\n\n /**\n * Setup WebSocket event listeners.\n */\n private setupEventListeners(): void {\n if (!this.ws) return;\n\n // Message listener\n this.ws.addEventListener(\"message\", (event: MessageEvent) => {\n this.handleMessage(event);\n });\n\n // Close listener\n this.ws.addEventListener(\"close\", (event: CloseEvent) => {\n this.handleClose(event);\n });\n\n // Error listener\n this.ws.addEventListener(\"error\", () => {\n this.handleError();\n });\n }\n\n /**\n * Handle incoming message event.\n */\n private handleMessage(event: MessageEvent): void {\n try {\n // Try to parse as JSON\n const data = JSON.parse(event.data);\n this.emit(\"message\", { data });\n } catch {\n // If parsing fails, emit raw text data\n this.emit(\"message\", { data: event.data });\n }\n }\n\n /**\n * Handle close event from WebSocket.\n */\n private handleClose(event: CloseEvent): void {\n this.closeWebSocket();\n\n const reason = event.reason || `WebSocket closed (code: ${event.code})`;\n this.handleDisconnect(reason);\n }\n\n /**\n * Handle error event from WebSocket.\n */\n private handleError(): void {\n if (this.state === \"connecting\" || this.state === \"connected\") {\n const error = new Error(\"WebSocket connection error\");\n this.emit(\"error\", { error });\n }\n }\n\n /**\n * Close WebSocket and clean up.\n */\n private closeWebSocket(): void {\n if (this.ws) {\n // Use normal closure code (1000)\n if (this.ws.readyState === WebSocket.OPEN) {\n this.ws.close(1000, \"Normal closure\");\n }\n this.ws = null;\n }\n }\n}\n","import type { FeatureCollection } from \"geojson\";\nimport type { ConnectionState } from \"./base-connection\";\nimport { SSEConnection } from \"./sse-connection\";\nimport { WebSocketConnection } from \"./websocket-connection\";\nimport type { SSEConfig } from \"./sse-connection\";\nimport type { WebSocketConfig } from \"./websocket-connection\";\n\n/**\n * Configuration for a streaming connection.\n *\n * @example\n * ```typescript\n * const config: StreamConfig = {\n * type: 'sse',\n * url: 'https://api.example.com/events',\n * onData: (data) => console.log('Received:', data),\n * reconnect: { enabled: true, maxRetries: 10 }\n * };\n * ```\n */\nexport interface StreamConfig {\n /** Type of streaming connection */\n type: \"websocket\" | \"sse\";\n\n /** URL for the streaming connection */\n url: string;\n\n /** Callback for incoming data */\n onData: (data: FeatureCollection) => void;\n\n /** Callback for connection state changes */\n onStateChange?: (state: ConnectionState) => void;\n\n /** Callback for errors */\n onError?: (error: Error) => void;\n\n /** Reconnection configuration */\n reconnect?: {\n enabled?: boolean;\n maxRetries?: number;\n initialDelay?: number;\n maxDelay?: number;\n };\n\n /** Event types to listen for (SSE only) */\n eventTypes?: string[];\n\n /** WebSocket protocols (WebSocket only) */\n protocols?: string | string[];\n}\n\n/**\n * State of a streaming connection.\n */\nexport interface StreamState {\n /** Current connection state */\n connectionState: ConnectionState;\n\n /** Number of messages received */\n messageCount: number;\n\n /** Timestamp of last message (milliseconds) */\n lastMessage: number | null;\n\n /** Number of reconnection attempts */\n reconnectAttempts: number;\n}\n\n/**\n * Internal stream subscription.\n */\ninterface StreamSubscription {\n config: StreamConfig;\n connection: SSEConnection | WebSocketConnection;\n state: StreamState;\n}\n\n/**\n * Manages streaming connections (SSE and WebSocket).\n *\n * @remarks\n * Provides a unified interface for managing multiple streaming connections,\n * handling connection lifecycle, automatic reconnection, and message routing.\n *\n * Features:\n * - Multiple concurrent connections\n * - Automatic reconnection with exponential backoff\n * - Connection state tracking\n * - Message counting and statistics\n * - Type-safe callbacks\n *\n * @example\n * ```typescript\n * const manager = new StreamManager();\n *\n * // Connect to SSE stream\n * await manager.connect('earthquake-feed', {\n * type: 'sse',\n * url: 'https://earthquake.usgs.gov/events',\n * onData: (data) => updateMap(data),\n * reconnect: { enabled: true }\n * });\n *\n * // Connect to WebSocket stream\n * await manager.connect('vehicle-updates', {\n * type: 'websocket',\n * url: 'wss://transit.example.com/vehicles',\n * onData: (data) => updateVehicles(data),\n * protocols: ['json']\n * });\n *\n * // Send data via WebSocket\n * manager.send('vehicle-updates', { type: 'subscribe', channel: 'all' });\n *\n * // Check connection state\n * const state = manager.getState('earthquake-feed');\n * console.log(`Messages received: ${state?.messageCount}`);\n *\n * // Disconnect when done\n * manager.disconnect('earthquake-feed');\n * manager.disconnectAll();\n * ```\n */\nexport class StreamManager {\n private subscriptions = new Map<string, StreamSubscription>();\n\n /**\n * Connect to a streaming source.\n *\n * @param id - Unique identifier for this connection\n * @param config - Stream configuration\n * @throws {Error} If a connection with the given id already exists\n *\n * @example\n * ```typescript\n * await manager.connect('updates', {\n * type: 'sse',\n * url: 'https://api.example.com/stream',\n * onData: (data) => console.log(data)\n * });\n * ```\n */\n async connect(id: string, config: StreamConfig): Promise<void> {\n if (this.subscriptions.has(id)) {\n throw new Error(`Stream with id \"${id}\" already exists`);\n }\n\n // Create connection based on type\n const connection = this.createConnection(config);\n\n // Initialize state\n const state: StreamState = {\n connectionState: \"disconnected\",\n messageCount: 0,\n lastMessage: null,\n reconnectAttempts: 0,\n };\n\n // Store subscription\n this.subscriptions.set(id, { config, connection, state });\n\n // Setup event handlers\n this.setupEventHandlers(connection, config, state);\n\n // Connect\n await connection.connect();\n }\n\n /**\n * Disconnect a specific stream.\n *\n * @param id - Stream identifier\n *\n * @example\n * ```typescript\n * manager.disconnect('updates');\n * ```\n */\n disconnect(id: string): void {\n const subscription = this.subscriptions.get(id);\n if (!subscription) {\n return;\n }\n\n subscription.connection.disconnect();\n this.subscriptions.delete(id);\n }\n\n /**\n * Disconnect all active streams.\n *\n * @example\n * ```typescript\n * manager.disconnectAll();\n * ```\n */\n disconnectAll(): void {\n for (const id of this.subscriptions.keys()) {\n this.disconnect(id);\n }\n }\n\n /**\n * Get the current state of a stream.\n *\n * @param id - Stream identifier\n * @returns Stream state or null if not found\n *\n * @example\n * ```typescript\n * const state = manager.getState('updates');\n * if (state) {\n * console.log(`State: ${state.connectionState}`);\n * console.log(`Messages: ${state.messageCount}`);\n * }\n * ```\n */\n getState(id: string): StreamState | null {\n const subscription = this.subscriptions.get(id);\n return subscription ? { ...subscription.state } : null;\n }\n\n /**\n * Check if a stream is currently connected.\n *\n * @param id - Stream identifier\n * @returns True if connected, false otherwise\n *\n * @example\n * ```typescript\n * if (manager.isConnected('updates')) {\n * console.log('Stream is active');\n * }\n * ```\n */\n isConnected(id: string): boolean {\n const subscription = this.subscriptions.get(id);\n return subscription ? subscription.connection.isConnected() : false;\n }\n\n /**\n * Get all active stream IDs.\n *\n * @returns Array of active stream identifiers\n *\n * @example\n * ```typescript\n * const activeStreams = manager.getActiveIds();\n * console.log(`Active streams: ${activeStreams.join(', ')}`);\n * ```\n */\n getActiveIds(): string[] {\n return Array.from(this.subscriptions.keys());\n }\n\n /**\n * Send data to a WebSocket connection.\n *\n * @param id - Stream identifier\n * @param data - Data to send (will be JSON stringified)\n * @throws {Error} If stream is not a WebSocket connection or not connected\n *\n * @example\n * ```typescript\n * manager.send('ws-updates', {\n * type: 'subscribe',\n * channels: ['news', 'sports']\n * });\n * ```\n */\n send(id: string, data: unknown): void {\n const subscription = this.subscriptions.get(id);\n if (!subscription) {\n throw new Error(`Stream \"${id}\" not found`);\n }\n\n if (!(subscription.connection instanceof WebSocketConnection)) {\n throw new Error(`Stream \"${id}\" is not a WebSocket connection`);\n }\n\n subscription.connection.send(data);\n }\n\n /**\n * Clean up all resources.\n *\n * @example\n * ```typescript\n * manager.destroy();\n * ```\n */\n destroy(): void {\n this.disconnectAll();\n }\n\n /**\n * Create a connection instance based on config type.\n */\n private createConnection(\n config: StreamConfig\n ): SSEConnection | WebSocketConnection {\n const reconnectConfig =\n config.reconnect?.enabled !== false\n ? {\n reconnect: true,\n retryConfig: {\n maxRetries: config.reconnect?.maxRetries ?? 10,\n initialDelay: config.reconnect?.initialDelay ?? 1000,\n maxDelay: config.reconnect?.maxDelay ?? 30000,\n },\n }\n : { reconnect: false };\n\n if (config.type === \"sse\") {\n const sseConfig: SSEConfig = {\n url: config.url,\n ...reconnectConfig,\n eventTypes: config.eventTypes,\n };\n return new SSEConnection(sseConfig);\n } else {\n const wsConfig: WebSocketConfig = {\n url: config.url,\n ...reconnectConfig,\n protocols: config.protocols,\n };\n return new WebSocketConnection(wsConfig);\n }\n }\n\n /**\n * Setup event handlers for a connection.\n */\n private setupEventHandlers(\n connection: SSEConnection | WebSocketConnection,\n config: StreamConfig,\n state: StreamState\n ): void {\n // State change handler\n connection.on(\"stateChange\", ({ to }) => {\n state.connectionState = to;\n config.onStateChange?.(to);\n });\n\n // Message handler\n connection.on(\"message\", ({ data }) => {\n state.messageCount++;\n state.lastMessage = Date.now();\n\n // Validate data is a FeatureCollection\n if (this.isFeatureCollection(data)) {\n config.onData(data);\n } else {\n const error = new Error(\n \"Received data is not a valid GeoJSON FeatureCollection\"\n );\n config.onError?.(error);\n }\n });\n\n // Error handler\n connection.on(\"error\", ({ error }) => {\n config.onError?.(error);\n });\n\n // Reconnection tracking\n connection.on(\"reconnecting\", () => {\n state.reconnectAttempts++;\n });\n\n // Reset attempts on successful reconnection\n connection.on(\"reconnected\", () => {\n state.reconnectAttempts = 0;\n });\n\n // Failed connection\n connection.on(\"failed\", ({ lastError }) => {\n config.onError?.(lastError);\n });\n }\n\n /**\n * Type guard to check if data is a FeatureCollection.\n */\n private isFeatureCollection(data: unknown): data is FeatureCollection {\n return (\n typeof data === \"object\" &&\n data !== null &&\n \"type\" in data &&\n data.type === \"FeatureCollection\" &&\n \"features\" in data &&\n Array.isArray(data.features)\n );\n }\n}\n","import type { FeatureCollection, Feature } from \"geojson\";\n\n/**\n * Strategy for merging data.\n */\nexport type MergeStrategy = \"replace\" | \"merge\" | \"append-window\";\n\n/**\n * Options for merging data.\n *\n * @example\n * ```typescript\n * // Replace strategy\n * const replaceOptions: MergeOptions = {\n * strategy: 'replace'\n * };\n *\n * // Merge strategy with update key\n * const mergeOptions: MergeOptions = {\n * strategy: 'merge',\n * updateKey: 'id'\n * };\n *\n * // Append-window with size and time limits\n * const windowOptions: MergeOptions = {\n * strategy: 'append-window',\n * windowSize: 100,\n * windowDuration: 3600000, // 1 hour\n * timestampField: 'timestamp'\n * };\n * ```\n */\nexport interface MergeOptions {\n /** Merge strategy to use */\n strategy: MergeStrategy;\n\n /** Property key used to identify features for merge strategy */\n updateKey?: string;\n\n /** Maximum number of features to keep (append-window) */\n windowSize?: number;\n\n /** Maximum age of features in milliseconds (append-window) */\n windowDuration?: number;\n\n /** Property field containing timestamp (append-window) */\n timestampField?: string;\n}\n\n/**\n * Result of a merge operation.\n */\nexport interface MergeResult {\n /** Merged feature collection */\n data: FeatureCollection;\n\n /** Number of features added */\n added: number;\n\n /** Number of features updated */\n updated: number;\n\n /** Number of features removed */\n removed: number;\n\n /** Total number of features in result */\n total: number;\n}\n\n/**\n * Merges GeoJSON FeatureCollections using configurable strategies.\n *\n * @remarks\n * Supports three merge strategies:\n *\n * **replace**: Complete replacement of existing data\n * - Replaces all existing features with incoming features\n * - Simple and efficient for full updates\n *\n * **merge**: Update by key, keep unmatched\n * - Updates existing features by matching on a key property\n * - Adds new features that don't match existing keys\n * - Preserves existing features not in the update\n * - Requires `updateKey` option\n *\n * **append-window**: Add with time/size limits\n * - Appends incoming features to existing features\n * - Applies size limit (keeps most recent N features)\n * - Applies time limit (removes features older than duration)\n * - Requires `timestampField` for time-based filtering\n *\n * @example\n * ```typescript\n * const merger = new DataMerger();\n *\n * // Replace all data\n * const result = merger.merge(existing, incoming, {\n * strategy: 'replace'\n * });\n *\n * // Merge by vehicle ID\n * const result = merger.merge(existing, incoming, {\n * strategy: 'merge',\n * updateKey: 'vehicleId'\n * });\n *\n * // Append with 100 feature limit and 1 hour window\n * const result = merger.merge(existing, incoming, {\n * strategy: 'append-window',\n * windowSize: 100,\n * windowDuration: 3600000,\n * timestampField: 'timestamp'\n * });\n * ```\n */\nexport class DataMerger {\n /**\n * Merge two FeatureCollections using the specified strategy.\n *\n * @param existing - Existing feature collection\n * @param incoming - Incoming feature collection to merge\n * @param options - Merge options including strategy\n * @returns Merge result with statistics\n * @throws {Error} If merge strategy requires missing options\n *\n * @example\n * ```typescript\n * const merger = new DataMerger();\n *\n * const result = merger.merge(existingData, newData, {\n * strategy: 'merge',\n * updateKey: 'id'\n * });\n *\n * console.log(`Added: ${result.added}, Updated: ${result.updated}`);\n * console.log(`Total features: ${result.total}`);\n * ```\n */\n merge(\n existing: FeatureCollection,\n incoming: FeatureCollection,\n options: MergeOptions\n ): MergeResult {\n switch (options.strategy) {\n case \"replace\":\n return this.mergeReplace(existing, incoming);\n case \"merge\":\n return this.mergeMerge(existing, incoming, options);\n case \"append-window\":\n return this.mergeAppendWindow(existing, incoming, options);\n default:\n throw new Error(\n `Unknown merge strategy: ${options.strategy as string}`\n );\n }\n }\n\n /**\n * Replace strategy: Complete replacement of existing data.\n */\n private mergeReplace(\n existing: FeatureCollection,\n incoming: FeatureCollection\n ): MergeResult {\n return {\n data: incoming,\n added: incoming.features.length,\n updated: 0,\n removed: existing.features.length,\n total: incoming.features.length,\n };\n }\n\n /**\n * Merge strategy: Update by key, keep unmatched features.\n */\n private mergeMerge(\n existing: FeatureCollection,\n incoming: FeatureCollection,\n options: MergeOptions\n ): MergeResult {\n if (!options.updateKey) {\n throw new Error(\"updateKey is required for merge strategy\");\n }\n\n const updateKey = options.updateKey;\n let added = 0;\n let updated = 0;\n\n // Create a map of existing features by their key\n const existingMap = new Map<unknown, Feature>();\n for (const feature of existing.features) {\n const key = feature.properties?.[updateKey];\n if (key !== undefined && key !== null) {\n existingMap.set(key, feature);\n }\n }\n\n // Process incoming features\n for (const feature of incoming.features) {\n const key = feature.properties?.[updateKey];\n if (key !== undefined && key !== null) {\n if (existingMap.has(key)) {\n updated++;\n } else {\n added++;\n }\n existingMap.set(key, feature);\n }\n }\n\n // Convert map back to features array\n const features = Array.from(existingMap.values());\n\n return {\n data: {\n type: \"FeatureCollection\",\n features,\n },\n added,\n updated,\n removed: 0,\n total: features.length,\n };\n }\n\n /**\n * Append-window strategy: Add with time/size limits.\n */\n private mergeAppendWindow(\n existing: FeatureCollection,\n incoming: FeatureCollection,\n options: MergeOptions\n ): MergeResult {\n const initialCount = existing.features.length;\n\n // Combine existing and incoming features\n let features = [...existing.features, ...incoming.features];\n\n // Apply time window if configured\n if (options.windowDuration && options.timestampField) {\n const cutoffTime = Date.now() - options.windowDuration;\n\n features = features.filter((feature) => {\n const timestamp = feature.properties?.[options.timestampField!];\n if (typeof timestamp === \"number\") {\n return timestamp >= cutoffTime;\n }\n // Keep features without timestamp (safer than removing)\n return true;\n });\n\n // Sort by timestamp descending (most recent first)\n features.sort((a, b) => {\n const timeA = a.properties?.[options.timestampField!] ?? 0;\n const timeB = b.properties?.[options.timestampField!] ?? 0;\n return (timeB as number) - (timeA as number);\n });\n\n // Apply size window if configured\n if (options.windowSize && features.length > options.windowSize) {\n features = features.slice(0, options.windowSize);\n }\n\n const removed = initialCount + incoming.features.length - features.length;\n\n return {\n data: {\n type: \"FeatureCollection\",\n features,\n },\n added: incoming.features.length,\n updated: 0,\n removed,\n total: features.length,\n };\n }\n\n // Apply size window only if no time window\n if (options.windowSize) {\n // For size-only window, keep most recent features\n // If timestampField is provided, sort by it; otherwise keep insertion order\n if (options.timestampField) {\n features.sort((a, b) => {\n const timeA = a.properties?.[options.timestampField!] ?? 0;\n const timeB = b.properties?.[options.timestampField!] ?? 0;\n return (timeB as number) - (timeA as number);\n });\n }\n\n if (features.length > options.windowSize) {\n features = features.slice(0, options.windowSize);\n }\n }\n\n const removed = initialCount + incoming.features.length - features.length;\n\n return {\n data: {\n type: \"FeatureCollection\",\n features,\n },\n added: incoming.features.length,\n updated: 0,\n removed,\n total: features.length,\n };\n }\n}\n","import { EventEmitter } from \"../utils/event-emitter\";\n\n/**\n * Configuration for the loading manager.\n */\nexport interface LoadingConfig {\n /** Whether to show loading UI overlays (default: false) */\n showUI: boolean;\n\n /** Custom messages for loading states */\n messages?: {\n loading?: string;\n error?: string;\n retry?: string;\n };\n\n /** Spinner style (default: 'circle') */\n spinnerStyle?: \"circle\" | \"dots\";\n\n /** Minimum time to display loading UI in milliseconds (default: 300) */\n minDisplayTime?: number;\n}\n\n/**\n * Events emitted by the loading manager.\n */\nexport interface LoadingEvents extends Record<string, unknown> {\n \"loading:start\": { layerId: string; message?: string };\n \"loading:progress\": { layerId: string; loaded: number; total?: number };\n \"loading:complete\": {\n layerId: string;\n duration: number;\n fromCache: boolean;\n };\n \"loading:error\": { layerId: string; error: Error; retrying: boolean };\n \"loading:retry\": { layerId: string; attempt: number; delay: number };\n}\n\n/**\n * State of a loading operation.\n */\nexport interface LoadingState {\n /** Whether currently loading */\n isLoading: boolean;\n\n /** When loading started (timestamp) */\n startTime: number | null;\n\n /** Custom loading message */\n message?: string;\n\n /** Current error if any */\n error?: Error;\n\n /** Current retry attempt number */\n retryAttempt?: number;\n}\n\n/**\n * Internal loading subscription with UI elements.\n */\ninterface LoadingSubscription {\n state: LoadingState;\n container: HTMLElement | null;\n overlay: HTMLElement | null;\n minDisplayTimer: number | null;\n}\n\n/**\n * Manages loading states and optional UI overlays.\n *\n * @remarks\n * Provides centralized loading state management with optional visual feedback.\n * Emits events for all loading state changes, allowing external UI integration.\n * Can optionally show built-in loading overlays with spinners and error messages.\n *\n * Features:\n * - Event-driven state changes\n * - Optional loading UI overlays\n * - Customizable messages and spinner styles\n * - Minimum display time to prevent flashing\n * - Retry support with visual feedback\n * - Multiple concurrent loading operations\n *\n * @example\n * ```typescript\n * const manager = new LoadingManager({\n * showUI: true,\n * minDisplayTime: 300\n * });\n *\n * // Listen to loading events\n * manager.on('loading:start', ({ layerId }) => {\n * console.log(`Loading ${layerId}...`);\n * });\n *\n * // Show loading state\n * const container = document.getElementById('map-container');\n * manager.showLoading('vehicles', container, 'Loading vehicle data...');\n *\n * // Hide when complete\n * manager.hideLoading('vehicles', { fromCache: false });\n *\n * // Show error with retry\n * manager.showError('vehicles', container, new Error('Failed'), () => {\n * // Retry logic\n * });\n * ```\n */\nexport class LoadingManager extends EventEmitter<LoadingEvents> {\n private config: Required<LoadingConfig>;\n private subscriptions = new Map<string, LoadingSubscription>();\n\n private static readonly DEFAULT_CONFIG: Required<LoadingConfig> = {\n showUI: false,\n messages: {\n loading: \"Loading...\",\n error: \"Failed to load data\",\n retry: \"Retrying...\",\n },\n spinnerStyle: \"circle\",\n minDisplayTime: 300,\n };\n\n /**\n * Create a new LoadingManager.\n *\n * @param config - Loading manager configuration\n *\n * @example\n * ```typescript\n * const manager = new LoadingManager({\n * showUI: true,\n * messages: {\n * loading: 'Fetching data...',\n * error: 'Could not load data'\n * },\n * spinnerStyle: 'dots',\n * minDisplayTime: 500\n * });\n * ```\n */\n constructor(config?: Partial<LoadingConfig>) {\n super();\n\n this.config = {\n ...LoadingManager.DEFAULT_CONFIG,\n ...config,\n messages: {\n ...LoadingManager.DEFAULT_CONFIG.messages,\n ...config?.messages,\n },\n };\n }\n\n /**\n * Show loading state for a layer.\n *\n * @param layerId - Layer identifier\n * @param container - Container element for UI overlay\n * @param message - Custom loading message\n *\n * @example\n * ```typescript\n * const container = document.getElementById('map');\n * manager.showLoading('earthquakes', container, 'Loading earthquake data...');\n * ```\n */\n showLoading(layerId: string, container: HTMLElement, message?: string): void {\n const existingSub = this.subscriptions.get(layerId);\n if (existingSub?.state.isLoading) {\n return; // Already loading\n }\n\n const state: LoadingState = {\n isLoading: true,\n startTime: Date.now(),\n message: message || this.config.messages.loading,\n };\n\n let overlay: HTMLElement | null = null;\n if (this.config.showUI) {\n overlay = this.createLoadingOverlay(\n state.message || this.config.messages.loading || \"Loading...\"\n );\n container.style.position = \"relative\";\n container.appendChild(overlay);\n }\n\n this.subscriptions.set(layerId, {\n state,\n container,\n overlay,\n minDisplayTimer: null,\n });\n\n this.emit(\"loading:start\", { layerId, message: state.message });\n }\n\n /**\n * Hide loading state for a layer.\n *\n * @param layerId - Layer identifier\n * @param result - Optional result information\n *\n * @example\n * ```typescript\n * manager.hideLoading('earthquakes', { fromCache: true });\n * ```\n */\n hideLoading(layerId: string, result?: { fromCache: boolean }): void {\n const subscription = this.subscriptions.get(layerId);\n if (!subscription?.state.isLoading) {\n return;\n }\n\n const duration = Date.now() - (subscription.state.startTime || Date.now());\n const timeRemaining = Math.max(0, this.config.minDisplayTime - duration);\n\n const cleanup = () => {\n if (subscription.overlay) {\n subscription.overlay.remove();\n }\n subscription.state.isLoading = false;\n subscription.state.startTime = null;\n subscription.state.error = undefined;\n subscription.state.retryAttempt = undefined;\n\n this.emit(\"loading:complete\", {\n layerId,\n duration,\n fromCache: result?.fromCache ?? false,\n });\n };\n\n if (timeRemaining > 0 && subscription.overlay) {\n // Wait for minimum display time\n subscription.minDisplayTimer = window.setTimeout(cleanup, timeRemaining);\n } else {\n cleanup();\n }\n }\n\n /**\n * Show error state for a layer.\n *\n * @param layerId - Layer identifier\n * @param container - Container element for UI overlay\n * @param error - Error that occurred\n * @param onRetry - Optional retry callback\n *\n * @example\n * ```typescript\n * manager.showError('earthquakes', container, error, () => {\n * // Retry loading\n * fetchData();\n * });\n * ```\n */\n showError(\n layerId: string,\n container: HTMLElement,\n error: Error,\n onRetry?: () => void\n ): void {\n const subscription = this.subscriptions.get(layerId);\n const state: LoadingState = subscription?.state || {\n isLoading: false,\n startTime: null,\n };\n\n state.error = error;\n state.isLoading = false;\n\n // Remove loading overlay if present\n if (subscription?.overlay) {\n subscription.overlay.remove();\n }\n\n let overlay: HTMLElement | null = null;\n if (this.config.showUI) {\n overlay = this.createErrorOverlay(\n error.message || this.config.messages.error || \"An error occurred\",\n onRetry\n );\n container.style.position = \"relative\";\n container.appendChild(overlay);\n }\n\n this.subscriptions.set(layerId, {\n state,\n container,\n overlay,\n minDisplayTimer: null,\n });\n\n this.emit(\"loading:error\", {\n layerId,\n error,\n retrying: !!onRetry,\n });\n }\n\n /**\n * Show retrying state for a layer.\n *\n * @param layerId - Layer identifier\n * @param attempt - Current retry attempt number\n * @param delay - Delay before retry in milliseconds\n *\n * @example\n * ```typescript\n * manager.showRetrying('earthquakes', 2, 2000);\n * ```\n */\n showRetrying(layerId: string, attempt: number, delay: number): void {\n const subscription = this.subscriptions.get(layerId);\n if (subscription) {\n subscription.state.retryAttempt = attempt;\n\n if (subscription.overlay && this.config.showUI) {\n const message = `${this.config.messages.retry} (attempt ${attempt})`;\n const newOverlay = this.createLoadingOverlay(message);\n subscription.overlay.replaceWith(newOverlay);\n subscription.overlay = newOverlay;\n }\n }\n\n this.emit(\"loading:retry\", { layerId, attempt, delay });\n }\n\n /**\n * Get loading state for a layer.\n *\n * @param layerId - Layer identifier\n * @returns Loading state or null if not found\n *\n * @example\n * ```typescript\n * const state = manager.getState('earthquakes');\n * if (state?.isLoading) {\n * console.log('Still loading...');\n * }\n * ```\n */\n getState(layerId: string): LoadingState | null {\n const subscription = this.subscriptions.get(layerId);\n return subscription ? { ...subscription.state } : null;\n }\n\n /**\n * Check if a layer is currently loading.\n *\n * @param layerId - Layer identifier\n * @returns True if loading, false otherwise\n *\n * @example\n * ```typescript\n * if (manager.isLoading('earthquakes')) {\n * console.log('Loading in progress');\n * }\n * ```\n */\n isLoading(layerId: string): boolean {\n return this.subscriptions.get(layerId)?.state.isLoading ?? false;\n }\n\n /**\n * Clear all loading states and UI.\n *\n * @example\n * ```typescript\n * manager.clearAll();\n * ```\n */\n clearAll(): void {\n for (const [layerId, subscription] of this.subscriptions.entries()) {\n if (subscription.minDisplayTimer) {\n clearTimeout(subscription.minDisplayTimer);\n }\n if (subscription.overlay) {\n subscription.overlay.remove();\n }\n this.subscriptions.delete(layerId);\n }\n }\n\n /**\n * Clean up all resources.\n *\n * @example\n * ```typescript\n * manager.destroy();\n * ```\n */\n destroy(): void {\n this.clearAll();\n this.removeAllListeners();\n }\n\n /**\n * Create loading overlay element.\n */\n private createLoadingOverlay(message: string): HTMLElement {\n const overlay = document.createElement(\"div\");\n overlay.className = \"mly-loading-overlay\";\n\n const content = document.createElement(\"div\");\n content.className = \"mly-loading-content\";\n\n const spinner = document.createElement(\"div\");\n spinner.className = `mly-spinner mly-spinner--${this.config.spinnerStyle}`;\n\n const text = document.createElement(\"div\");\n text.className = \"mly-loading-text\";\n text.textContent = message;\n\n content.appendChild(spinner);\n content.appendChild(text);\n overlay.appendChild(content);\n\n return overlay;\n }\n\n /**\n * Create error overlay element.\n */\n private createErrorOverlay(\n message: string,\n onRetry?: () => void\n ): HTMLElement {\n const overlay = document.createElement(\"div\");\n overlay.className = \"mly-loading-overlay mly-loading-overlay--error\";\n\n const content = document.createElement(\"div\");\n content.className = \"mly-error-content\";\n\n const icon = document.createElement(\"div\");\n icon.className = \"mly-error-icon\";\n icon.textContent = \"⚠\";\n\n const text = document.createElement(\"div\");\n text.className = \"mly-error-text\";\n text.textContent = message;\n\n content.appendChild(icon);\n content.appendChild(text);\n\n if (onRetry) {\n const button = document.createElement(\"button\");\n button.className = \"mly-retry-button\";\n button.textContent = \"Retry\";\n button.onclick = () => {\n overlay.remove();\n onRetry();\n };\n content.appendChild(button);\n }\n\n overlay.appendChild(content);\n\n return overlay;\n }\n}\n","/**\n * @file Layer manager for MapLibre map layers\n * @module @maplibre-yaml/core/renderer\n */\n\nimport type { Map as MapLibreMap, GeoJSONSource } from \"maplibre-gl\";\nimport type { z } from \"zod\";\nimport type { FeatureCollection } from \"geojson\";\nimport {\n LayerSchema,\n GeoJSONSourceSchema,\n VectorSourceSchema,\n RasterSourceSchema,\n ImageSourceSchema,\n VideoSourceSchema,\n} from \"../schemas\";\nimport { DataFetcher } from \"../data/data-fetcher\";\nimport { PollingManager } from \"../data/polling-manager\";\nimport { StreamManager } from \"../data/streaming/stream-manager\";\nimport { DataMerger } from \"../data/merge/data-merger\";\nimport { LoadingManager } from \"../ui/loading-manager\";\nimport type { MergeStrategy } from \"../data/merge/data-merger\";\n\ntype Layer = z.infer<typeof LayerSchema>;\ntype GeoJSONSourceConfig = z.infer<typeof GeoJSONSourceSchema>;\ntype VectorSourceConfig = z.infer<typeof VectorSourceSchema>;\ntype RasterSourceConfig = z.infer<typeof RasterSourceSchema>;\ntype ImageSourceConfig = z.infer<typeof ImageSourceSchema>;\ntype VideoSourceConfig = z.infer<typeof VideoSourceSchema>;\n\n/**\n * Callbacks for layer data loading events\n */\nexport interface LayerManagerCallbacks {\n onDataLoading?: (layerId: string) => void;\n onDataLoaded?: (layerId: string, featureCount: number) => void;\n onDataError?: (layerId: string, error: Error) => void;\n}\n\n/**\n * Manages map layers and their data sources\n */\nexport class LayerManager {\n private map: MapLibreMap;\n private callbacks: LayerManagerCallbacks;\n private dataFetcher: DataFetcher;\n private pollingManager: PollingManager;\n private streamManager: StreamManager;\n private dataMerger: DataMerger;\n private loadingManager: LoadingManager;\n private sourceData: Map<string, FeatureCollection>;\n private layerToSource: Map<string, string>;\n\n // Legacy support (deprecated)\n private refreshIntervals: Map<string, NodeJS.Timeout>;\n private abortControllers: Map<string, AbortController>;\n\n constructor(map: MapLibreMap, callbacks?: LayerManagerCallbacks) {\n this.map = map;\n this.callbacks = callbacks || {};\n this.dataFetcher = new DataFetcher();\n this.pollingManager = new PollingManager();\n this.streamManager = new StreamManager();\n this.dataMerger = new DataMerger();\n this.loadingManager = new LoadingManager({ showUI: false });\n this.sourceData = new Map();\n this.layerToSource = new Map();\n\n // Legacy support\n this.refreshIntervals = new Map();\n this.abortControllers = new Map();\n }\n\n async addLayer(layer: Layer): Promise<void> {\n const sourceId = `${layer.id}-source`;\n this.layerToSource.set(layer.id, sourceId);\n await this.addSource(sourceId, layer);\n\n const layerSpec: any = {\n id: layer.id,\n type: layer.type,\n source: sourceId,\n };\n\n if (\"paint\" in layer && layer.paint) layerSpec.paint = layer.paint;\n if (\"layout\" in layer && layer.layout) layerSpec.layout = layer.layout;\n if (\"source-layer\" in layer && layer[\"source-layer\"])\n layerSpec[\"source-layer\"] = layer[\"source-layer\"];\n if (layer.minzoom !== undefined) layerSpec.minzoom = layer.minzoom;\n if (layer.maxzoom !== undefined) layerSpec.maxzoom = layer.maxzoom;\n if (layer.filter) layerSpec.filter = layer.filter;\n\n if (layer.visible === false) {\n layerSpec.layout = layerSpec.layout || {};\n layerSpec.layout.visibility = \"none\";\n }\n\n this.map.addLayer(layerSpec, layer.before as string | undefined);\n\n // Check if this is a GeoJSON source with refresh interval (legacy or new config)\n if (typeof layer.source === \"object\" && layer.source !== null) {\n const sourceObj = layer.source as GeoJSONSourceConfig;\n if (sourceObj.type === \"geojson\") {\n // Use new refresh config if available, otherwise fall back to legacy\n if (sourceObj.refresh || sourceObj.refreshInterval) {\n await this.setupDataUpdates(layer.id, sourceId, sourceObj);\n }\n }\n }\n }\n\n private async addSource(sourceId: string, layer: Layer): Promise<void> {\n // Handle source reference (string ID)\n if (typeof layer.source === \"string\") {\n if (!this.map.getSource(layer.source)) {\n throw new Error(`Source reference '${layer.source}' not found`);\n }\n return;\n }\n\n // layer.source is now guaranteed to be an object\n const source = layer.source as { type: string };\n\n if (source.type === \"geojson\") {\n const geojsonSource = source as unknown as GeoJSONSourceConfig;\n\n if (geojsonSource.url) {\n await this.addGeoJSONSourceFromURL(sourceId, layer.id, geojsonSource);\n } else if (geojsonSource.data) {\n const sourceSpec: any = {\n type: \"geojson\",\n data: geojsonSource.data,\n };\n\n // Only add clustering properties if they are defined\n if (geojsonSource.cluster !== undefined) sourceSpec.cluster = geojsonSource.cluster;\n if (geojsonSource.clusterRadius !== undefined) sourceSpec.clusterRadius = geojsonSource.clusterRadius;\n if (geojsonSource.clusterMaxZoom !== undefined) sourceSpec.clusterMaxZoom = geojsonSource.clusterMaxZoom;\n if (geojsonSource.clusterMinPoints !== undefined) sourceSpec.clusterMinPoints = geojsonSource.clusterMinPoints;\n if (geojsonSource.clusterProperties !== undefined) sourceSpec.clusterProperties = geojsonSource.clusterProperties;\n\n this.map.addSource(sourceId, sourceSpec);\n } else if (geojsonSource.stream) {\n this.map.addSource(sourceId, {\n type: \"geojson\",\n data: { type: \"FeatureCollection\", features: [] },\n });\n }\n } else if (source.type === \"vector\") {\n const vectorSource = source as unknown as VectorSourceConfig;\n const vectorSpec: any = { type: \"vector\" };\n if (vectorSource.url) vectorSpec.url = vectorSource.url;\n if (vectorSource.tiles) vectorSpec.tiles = vectorSource.tiles;\n if (vectorSource.minzoom !== undefined)\n vectorSpec.minzoom = vectorSource.minzoom;\n if (vectorSource.maxzoom !== undefined)\n vectorSpec.maxzoom = vectorSource.maxzoom;\n if (vectorSource.bounds) vectorSpec.bounds = vectorSource.bounds;\n if (vectorSource.attribution)\n vectorSpec.attribution = vectorSource.attribution;\n this.map.addSource(sourceId, vectorSpec);\n } else if (source.type === \"raster\") {\n const rasterSource = source as unknown as RasterSourceConfig;\n const rasterSpec: any = { type: \"raster\" };\n if (rasterSource.url) rasterSpec.url = rasterSource.url;\n if (rasterSource.tiles) rasterSpec.tiles = rasterSource.tiles;\n if (rasterSource.tileSize !== undefined)\n rasterSpec.tileSize = rasterSource.tileSize;\n if (rasterSource.minzoom !== undefined)\n rasterSpec.minzoom = rasterSource.minzoom;\n if (rasterSource.maxzoom !== undefined)\n rasterSpec.maxzoom = rasterSource.maxzoom;\n if (rasterSource.bounds) rasterSpec.bounds = rasterSource.bounds;\n if (rasterSource.attribution)\n rasterSpec.attribution = rasterSource.attribution;\n this.map.addSource(sourceId, rasterSpec);\n } else if (source.type === \"image\") {\n const imageSource = source as unknown as ImageSourceConfig;\n this.map.addSource(sourceId, {\n type: \"image\",\n url: imageSource.url,\n coordinates: imageSource.coordinates,\n });\n } else if (source.type === \"video\") {\n const videoSource = source as unknown as VideoSourceConfig;\n this.map.addSource(sourceId, {\n type: \"video\",\n urls: videoSource.urls,\n coordinates: videoSource.coordinates,\n });\n }\n }\n\n private async addGeoJSONSourceFromURL(\n sourceId: string,\n layerId: string,\n config: GeoJSONSourceConfig\n ): Promise<void> {\n // Determine initial data source\n let initialData: FeatureCollection = {\n type: \"FeatureCollection\",\n features: [],\n };\n\n if (config.prefetchedData) {\n initialData = config.prefetchedData as FeatureCollection;\n } else if (config.data) {\n initialData = config.data as FeatureCollection;\n }\n\n // Add source with initial data - only include clustering properties if defined\n const sourceSpec: any = {\n type: \"geojson\",\n data: initialData,\n };\n\n // Only add clustering properties if they are defined\n if (config.cluster !== undefined) sourceSpec.cluster = config.cluster;\n if (config.clusterRadius !== undefined) sourceSpec.clusterRadius = config.clusterRadius;\n if (config.clusterMaxZoom !== undefined) sourceSpec.clusterMaxZoom = config.clusterMaxZoom;\n if (config.clusterMinPoints !== undefined) sourceSpec.clusterMinPoints = config.clusterMinPoints;\n if (config.clusterProperties !== undefined) sourceSpec.clusterProperties = config.clusterProperties;\n\n this.map.addSource(sourceId, sourceSpec);\n\n this.sourceData.set(sourceId, initialData);\n\n // Fetch from URL if needed\n if (config.url && !config.prefetchedData) {\n this.callbacks.onDataLoading?.(layerId);\n\n try {\n const cacheEnabled = config.cache?.enabled ?? true;\n const cacheTTL = config.cache?.ttl;\n\n const result = await this.dataFetcher.fetch(config.url, {\n skipCache: !cacheEnabled,\n ttl: cacheTTL,\n });\n\n const data = result.data as FeatureCollection;\n this.sourceData.set(sourceId, data);\n\n const source = this.map.getSource(sourceId) as GeoJSONSource;\n if (source?.setData) {\n source.setData(data);\n }\n\n this.callbacks.onDataLoaded?.(layerId, data.features.length);\n } catch (error: any) {\n this.callbacks.onDataError?.(layerId, error);\n }\n } else if (config.prefetchedData) {\n // Emit loaded event for prefetched data\n this.callbacks.onDataLoaded?.(layerId, initialData.features.length);\n }\n }\n\n /**\n * Setup polling and/or streaming for a GeoJSON source\n */\n private async setupDataUpdates(\n layerId: string,\n sourceId: string,\n config: GeoJSONSourceConfig\n ): Promise<void> {\n // Setup streaming if configured\n if (config.stream) {\n const streamConfig = config.stream;\n await this.streamManager.connect(layerId, {\n type: streamConfig.type,\n url: streamConfig.url || config.url!,\n onData: (data) => {\n this.handleDataUpdate(sourceId, layerId, data, {\n strategy:\n config.refresh?.updateStrategy ||\n config.updateStrategy ||\n \"replace\",\n updateKey: config.refresh?.updateKey || config.updateKey,\n windowSize: config.refresh?.windowSize,\n windowDuration: config.refresh?.windowDuration,\n timestampField: config.refresh?.timestampField,\n });\n },\n onError: (error) => {\n this.callbacks.onDataError?.(layerId, error);\n },\n reconnect: {\n enabled: streamConfig.reconnect !== false,\n maxRetries: streamConfig.reconnectMaxAttempts,\n initialDelay: streamConfig.reconnectDelay,\n maxDelay: streamConfig.reconnectMaxDelay,\n },\n eventTypes: streamConfig.eventTypes,\n protocols: streamConfig.protocols,\n });\n }\n\n // Setup polling if configured (new refresh config or legacy refreshInterval)\n const refreshInterval =\n config.refresh?.refreshInterval || config.refreshInterval;\n if (refreshInterval && config.url) {\n const url = config.url;\n const cacheEnabled = config.cache?.enabled ?? true;\n const cacheTTL = config.cache?.ttl;\n\n await this.pollingManager.start(layerId, {\n interval: refreshInterval,\n onTick: async () => {\n const result = await this.dataFetcher.fetch(url, {\n skipCache: !cacheEnabled,\n ttl: cacheTTL,\n });\n this.handleDataUpdate(sourceId, layerId, result.data as FeatureCollection, {\n strategy:\n config.refresh?.updateStrategy ||\n config.updateStrategy ||\n \"replace\",\n updateKey: config.refresh?.updateKey || config.updateKey,\n windowSize: config.refresh?.windowSize,\n windowDuration: config.refresh?.windowDuration,\n timestampField: config.refresh?.timestampField,\n });\n },\n onError: (error) => {\n this.callbacks.onDataError?.(layerId, error);\n },\n });\n }\n }\n\n /**\n * Handle incoming data updates with merge strategy\n */\n private handleDataUpdate(\n sourceId: string,\n layerId: string,\n incoming: FeatureCollection,\n options: {\n strategy: MergeStrategy;\n updateKey?: string;\n windowSize?: number;\n windowDuration?: number;\n timestampField?: string;\n }\n ): void {\n const existing =\n this.sourceData.get(sourceId) || {\n type: \"FeatureCollection\" as const,\n features: [],\n };\n\n const mergeResult = this.dataMerger.merge(existing, incoming, options);\n this.sourceData.set(sourceId, mergeResult.data);\n\n const source = this.map.getSource(sourceId) as GeoJSONSource;\n if (source?.setData) {\n source.setData(mergeResult.data);\n }\n\n this.callbacks.onDataLoaded?.(layerId, mergeResult.total);\n }\n\n /**\n * Pause data refresh for a layer (polling)\n */\n pauseRefresh(layerId: string): void {\n this.pollingManager.pause(layerId);\n }\n\n /**\n * Resume data refresh for a layer (polling)\n */\n resumeRefresh(layerId: string): void {\n this.pollingManager.resume(layerId);\n }\n\n /**\n * Force immediate refresh for a layer (polling)\n */\n async refreshNow(layerId: string): Promise<void> {\n await this.pollingManager.triggerNow(layerId);\n }\n\n /**\n * Disconnect streaming connection for a layer\n */\n disconnectStream(layerId: string): void {\n this.streamManager.disconnect(layerId);\n }\n\n removeLayer(layerId: string): void {\n // Stop all data updates\n this.pollingManager.stop(layerId);\n this.streamManager.disconnect(layerId);\n this.loadingManager.hideLoading(layerId);\n\n // Legacy support\n this.stopRefreshInterval(layerId);\n\n const controller = this.abortControllers.get(layerId);\n if (controller) {\n controller.abort();\n this.abortControllers.delete(layerId);\n }\n\n if (this.map.getLayer(layerId)) this.map.removeLayer(layerId);\n\n const sourceId = this.layerToSource.get(layerId) || `${layerId}-source`;\n if (this.map.getSource(sourceId)) this.map.removeSource(sourceId);\n\n // Clean up data references\n this.sourceData.delete(sourceId);\n this.layerToSource.delete(layerId);\n }\n\n setVisibility(layerId: string, visible: boolean): void {\n if (!this.map.getLayer(layerId)) return;\n this.map.setLayoutProperty(\n layerId,\n \"visibility\",\n visible ? \"visible\" : \"none\"\n );\n }\n\n updateData(layerId: string, data: GeoJSON.GeoJSON): void {\n const sourceId = `${layerId}-source`;\n const source = this.map.getSource(sourceId) as GeoJSONSource;\n if (source && source.setData) source.setData(data as any);\n }\n\n /**\n * @deprecated Legacy refresh method - use PollingManager instead\n */\n startRefreshInterval(layer: Layer): void {\n // Legacy method kept for backward compatibility\n // New code should use setupDataUpdates() which is called automatically from addLayer\n if (typeof layer.source !== \"object\" || layer.source === null) {\n return;\n }\n\n const sourceObj = layer.source as {\n type: string;\n url?: string;\n refreshInterval?: number;\n };\n if (\n sourceObj.type !== \"geojson\" ||\n !sourceObj.url ||\n !sourceObj.refreshInterval\n ) {\n return;\n }\n\n const geojsonSource = layer.source as unknown as GeoJSONSourceConfig;\n const interval = setInterval(async () => {\n const sourceId = `${layer.id}-source`;\n try {\n const cacheEnabled = geojsonSource.cache?.enabled ?? true;\n const cacheTTL = geojsonSource.cache?.ttl;\n\n const result = await this.dataFetcher.fetch(geojsonSource.url!, {\n skipCache: !cacheEnabled,\n ttl: cacheTTL,\n });\n const data = result.data as FeatureCollection;\n this.sourceData.set(sourceId, data);\n\n const source = this.map.getSource(sourceId) as GeoJSONSource;\n if (source?.setData) {\n source.setData(data);\n }\n this.callbacks.onDataLoaded?.(layer.id, data.features.length);\n } catch (error: any) {\n this.callbacks.onDataError?.(layer.id, error);\n }\n }, geojsonSource.refreshInterval!);\n\n this.refreshIntervals.set(layer.id, interval);\n }\n\n stopRefreshInterval(layerId: string): void {\n const interval = this.refreshIntervals.get(layerId);\n if (interval) {\n clearInterval(interval);\n this.refreshIntervals.delete(layerId);\n }\n }\n\n clearAllIntervals(): void {\n for (const interval of this.refreshIntervals.values())\n clearInterval(interval);\n this.refreshIntervals.clear();\n }\n\n destroy(): void {\n // Clean up all data management components\n this.pollingManager.destroy();\n this.streamManager.destroy();\n this.loadingManager.destroy();\n\n // Clear data references\n this.sourceData.clear();\n this.layerToSource.clear();\n\n // Legacy cleanup\n this.clearAllIntervals();\n for (const controller of this.abortControllers.values()) controller.abort();\n this.abortControllers.clear();\n }\n}\n","/**\n * @file Popup HTML builder for map features\n * @module @maplibre-yaml/core/renderer\n */\n\nimport type { z } from \"zod\";\nimport { PopupContentSchema, PopupContentItemSchema } from \"../schemas\";\n\ntype PopupContent = z.infer<typeof PopupContentSchema>;\ntype PopupContentItem = z.infer<typeof PopupContentItemSchema>;\n\n/**\n * Builds popup HTML from configuration and feature properties\n */\nexport class PopupBuilder {\n /**\n * Build HTML string from popup content config and feature properties\n */\n build(content: PopupContent, properties: Record<string, any>): string {\n return content\n .map((item) => {\n const entries = Object.entries(item);\n if (entries.length === 0) return \"\";\n const entry = entries[0];\n if (!entry) return \"\";\n const [tag, items] = entry;\n if (!Array.isArray(items)) return \"\";\n const innerHTML = items\n .map((i: PopupContentItem) => this.buildItem(i, properties))\n .join(\"\");\n return `<${tag}>${innerHTML}</${tag}>`;\n })\n .join(\"\");\n }\n\n /**\n * Build a single content item\n */\n private buildItem(\n item: PopupContentItem,\n properties: Record<string, any>\n ): string {\n // Static string\n if (item.str) {\n return this.escapeHtml(item.str);\n }\n\n // Dynamic property\n if (item.property) {\n const value = properties[item.property];\n if (value !== undefined && value !== null) {\n // Apply format if specified\n if (item.format && typeof value === \"number\") {\n return this.formatNumber(value, item.format);\n }\n return this.escapeHtml(String(value));\n }\n // Use fallback\n return item.else ? this.escapeHtml(item.else) : \"\";\n }\n\n // Link\n if (item.href) {\n const text = (item as any).text || item.href;\n const target = (item as any).target || \"_blank\";\n return `<a href=\"${this.escapeHtml(\n item.href\n )}\" target=\"${target}\">${this.escapeHtml(text)}</a>`;\n }\n\n // Image\n if (item.src) {\n const alt = (item as any).alt || \"\";\n return `<img src=\"${this.escapeHtml(item.src)}\" alt=\"${this.escapeHtml(\n alt\n )}\" />`;\n }\n\n return \"\";\n }\n\n /**\n * Format a number according to format string\n */\n private formatNumber(value: number, format: string): string {\n // Simple number formatting\n // Format strings like \",.0f\" or \".2f\"\n\n // Check for thousands separator\n const useThousands = format.includes(\",\");\n\n // Extract decimal places\n const decimalMatch = format.match(/\\.(\\d+)/);\n const decimals =\n decimalMatch && decimalMatch[1] ? parseInt(decimalMatch[1]) : 0;\n\n // Format the number\n let result = value.toFixed(decimals);\n\n // Add thousands separators if requested\n if (useThousands) {\n const parts = result.split(\".\");\n if (parts[0]) {\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n }\n result = parts.join(\".\");\n }\n\n return result;\n }\n\n /**\n * Escape HTML to prevent XSS\n */\n private escapeHtml(str: string): string {\n return str\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#039;\");\n }\n}\n","/**\n * @file Event handler for map layer interactions\n * @module @maplibre-yaml/core/renderer\n */\n\nimport maplibregl, {\n type Map as MapLibreMap,\n type MapMouseEvent,\n type Popup,\n type LngLat,\n} from \"maplibre-gl\";\nimport type { z } from \"zod\";\nimport { LayerSchema, PopupContentSchema } from \"../schemas\";\nimport { PopupBuilder } from \"./popup-builder\";\n\ntype Layer = z.infer<typeof LayerSchema>;\ntype PopupContent = z.infer<typeof PopupContentSchema>;\n\n/**\n * Callbacks for interactive events\n */\nexport interface EventHandlerCallbacks {\n onClick?: (layerId: string, feature: any, lngLat: LngLat) => void;\n onHover?: (layerId: string, feature: any, lngLat: LngLat) => void;\n}\n\n/**\n * Handles click, hover, and other interactive events on layers\n */\nexport class EventHandler {\n private map: MapLibreMap;\n private callbacks: EventHandlerCallbacks;\n private popupBuilder: PopupBuilder;\n private activePopup: Popup | null;\n private attachedLayers: Set<string>;\n private boundHandlers: Map<\n string,\n { click?: Function; mouseenter?: Function; mouseleave?: Function }\n >;\n\n constructor(map: MapLibreMap, callbacks?: EventHandlerCallbacks) {\n this.map = map;\n this.callbacks = callbacks || {};\n this.popupBuilder = new PopupBuilder();\n this.activePopup = null;\n this.attachedLayers = new Set();\n this.boundHandlers = new Map();\n }\n\n /**\n * Attach events for a layer based on its interactive config\n */\n attachEvents(layer: Layer): void {\n if (!layer.interactive) return;\n\n // Type guard: interactive is defined, cast to proper type\n const interactive = layer.interactive as { hover?: any; click?: any };\n const { hover, click } = interactive;\n const handlers: any = {};\n\n // Hover handling\n if (hover) {\n handlers.mouseenter = (e: MapMouseEvent & { features?: any[] }) => {\n if (hover.cursor) {\n this.map.getCanvas().style.cursor = hover.cursor;\n }\n if (e.features?.[0]) {\n this.callbacks.onHover?.(layer.id, e.features[0], e.lngLat);\n }\n };\n\n handlers.mouseleave = () => {\n this.map.getCanvas().style.cursor = \"\";\n };\n\n this.map.on(\"mouseenter\", layer.id, handlers.mouseenter);\n this.map.on(\"mouseleave\", layer.id, handlers.mouseleave);\n }\n\n // Click handling\n if (click) {\n handlers.click = (e: MapMouseEvent & { features?: any[] }) => {\n const feature = e.features?.[0];\n if (!feature) return;\n\n if (click.popup) {\n this.showPopup(click.popup, feature, e.lngLat);\n }\n\n this.callbacks.onClick?.(layer.id, feature, e.lngLat);\n };\n\n this.map.on(\"click\", layer.id, handlers.click);\n }\n\n this.boundHandlers.set(layer.id, handlers);\n this.attachedLayers.add(layer.id);\n }\n\n /**\n * Show a popup with content\n */\n private showPopup(content: PopupContent, feature: any, lngLat: LngLat): void {\n this.activePopup?.remove();\n\n const html = this.popupBuilder.build(content, feature.properties);\n\n this.activePopup = new maplibregl.Popup()\n .setLngLat(lngLat)\n .setHTML(html)\n .addTo(this.map);\n }\n\n /**\n * Detach events for a layer\n */\n detachEvents(layerId: string): void {\n const handlers = this.boundHandlers.get(layerId);\n if (!handlers) return;\n\n if (handlers.click) {\n this.map.off(\"click\", layerId, handlers.click as any);\n }\n if (handlers.mouseenter) {\n this.map.off(\"mouseenter\", layerId, handlers.mouseenter as any);\n }\n if (handlers.mouseleave) {\n this.map.off(\"mouseleave\", layerId, handlers.mouseleave as any);\n }\n\n this.boundHandlers.delete(layerId);\n this.attachedLayers.delete(layerId);\n }\n\n /**\n * Clean up all event handlers\n */\n destroy(): void {\n for (const layerId of this.attachedLayers) {\n this.detachEvents(layerId);\n }\n this.activePopup?.remove();\n this.activePopup = null;\n }\n}\n","/**\n * @file Legend builder for map layers\n * @module @maplibre-yaml/core/renderer\n */\n\nimport type { z } from 'zod';\nimport { LayerSchema, LegendConfigSchema, LegendItemSchema } from '../schemas';\n\ntype Layer = z.infer<typeof LayerSchema>;\ntype LegendConfig = z.infer<typeof LegendConfigSchema>;\ntype LegendItem = z.infer<typeof LegendItemSchema>;\n\n/**\n * Builds legend HTML from layer configurations\n */\nexport class LegendBuilder {\n /**\n * Build legend in container from layers\n */\n build(container: string | HTMLElement, layers: Layer[], config?: Partial<LegendConfig>): void {\n const el = typeof container === 'string' ? document.getElementById(container) : container;\n if (!el) return;\n\n const items = config?.items || this.extractItems(layers);\n\n let html = '<div class=\"maplibre-legend\">';\n if (config?.title) {\n html += `<div class=\"legend-title\">${this.escapeHtml(config.title)}</div>`;\n }\n html += '<div class=\"legend-items\">';\n for (const item of items) {\n html += this.renderItem(item);\n }\n html += '</div></div>';\n\n el.innerHTML = html;\n }\n\n /**\n * Render a single legend item\n */\n private renderItem(item: LegendItem): string {\n const shape = item.shape || 'square';\n let symbol = '';\n\n switch (shape) {\n case 'circle':\n symbol = `<span class=\"legend-symbol circle\" style=\"background:${this.escapeHtml(item.color)}\"></span>`;\n break;\n case 'line':\n symbol = `<span class=\"legend-symbol line\" style=\"background:${this.escapeHtml(item.color)}\"></span>`;\n break;\n case 'icon':\n if (item.icon) {\n symbol = `<span class=\"legend-symbol icon\">${this.escapeHtml(item.icon)}</span>`;\n } else {\n symbol = `<span class=\"legend-symbol square\" style=\"background:${this.escapeHtml(item.color)}\"></span>`;\n }\n break;\n default:\n symbol = `<span class=\"legend-symbol square\" style=\"background:${this.escapeHtml(item.color)}\"></span>`;\n }\n\n return `<div class=\"legend-item\">${symbol}<span class=\"legend-label\">${this.escapeHtml(item.label)}</span></div>`;\n }\n\n /**\n * Extract legend items from layers\n */\n private extractItems(layers: Layer[]): LegendItem[] {\n return layers\n .filter((l) => l.legend && typeof l.legend === 'object')\n .map((l) => l.legend as LegendItem);\n }\n\n /**\n * Escape HTML to prevent XSS\n */\n private escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;');\n }\n}\n","/**\n * @file Controls manager for map controls\n * @module @maplibre-yaml/core/renderer\n */\n\nimport maplibregl, {\n type Map as MapLibreMap,\n type IControl,\n} from \"maplibre-gl\";\nimport type { z } from \"zod\";\nimport { ControlsConfigSchema } from \"../schemas\";\n\ntype ControlsConfig = z.infer<typeof ControlsConfigSchema>;\n\n/**\n * Manages MapLibre map controls (navigation, geolocate, scale, etc.)\n */\nexport class ControlsManager {\n private map: MapLibreMap;\n private addedControls: IControl[];\n\n constructor(map: MapLibreMap) {\n this.map = map;\n this.addedControls = [];\n }\n\n /**\n * Add controls to the map based on configuration\n */\n addControls(config: ControlsConfig): void {\n if (!config) return;\n\n if (config.navigation) {\n const options =\n typeof config.navigation === \"object\" ? config.navigation : {};\n const position = (options as any).position || \"top-right\";\n const control = new maplibregl.NavigationControl();\n this.map.addControl(control, position as any);\n this.addedControls.push(control);\n }\n\n if (config.geolocate) {\n const options =\n typeof config.geolocate === \"object\" ? config.geolocate : {};\n const position = (options as any).position || \"top-right\";\n const control = new maplibregl.GeolocateControl({\n positionOptions: { enableHighAccuracy: true },\n trackUserLocation: true,\n });\n this.map.addControl(control, position as any);\n this.addedControls.push(control);\n }\n\n if (config.scale) {\n const options = typeof config.scale === \"object\" ? config.scale : {};\n const position = (options as any).position || \"bottom-left\";\n const control = new maplibregl.ScaleControl();\n this.map.addControl(control, position as any);\n this.addedControls.push(control);\n }\n\n if (config.fullscreen) {\n const options =\n typeof config.fullscreen === \"object\" ? config.fullscreen : {};\n const position = (options as any).position || \"top-right\";\n const control = new maplibregl.FullscreenControl();\n this.map.addControl(control, position as any);\n this.addedControls.push(control);\n }\n }\n\n /**\n * Remove all controls from the map\n */\n removeAllControls(): void {\n for (const control of this.addedControls) {\n this.map.removeControl(control);\n }\n this.addedControls = [];\n }\n}\n","/**\n * @file Main map renderer for MapLibre YAML\n * @module @maplibre-yaml/core/renderer\n */\n\nimport maplibregl, { type Map as MapLibreMap } from 'maplibre-gl';\nimport type { z } from 'zod';\nimport { MapConfigSchema, LayerSchema, ControlsConfigSchema, LegendConfigSchema } from '../schemas';\nimport { LayerManager, type LayerManagerCallbacks } from './layer-manager';\nimport { EventHandler, type EventHandlerCallbacks } from './event-handler';\nimport { LegendBuilder } from './legend-builder';\nimport { ControlsManager } from './controls-manager';\n\ntype MapConfig = z.infer<typeof MapConfigSchema>;\ntype Layer = z.infer<typeof LayerSchema>;\ntype ControlsConfig = z.infer<typeof ControlsConfigSchema>;\ntype LegendConfig = z.infer<typeof LegendConfigSchema>;\n\n/**\n * Options for MapRenderer\n */\nexport interface MapRendererOptions {\n onLoad?: () => void;\n onError?: (error: Error) => void;\n}\n\n/**\n * Events emitted by MapRenderer\n */\nexport interface MapRendererEvents {\n load: void;\n 'layer:added': { layerId: string };\n 'layer:removed': { layerId: string };\n 'layer:data-loading': { layerId: string };\n 'layer:data-loaded': { layerId: string; featureCount: number };\n 'layer:data-error': { layerId: string; error: Error };\n 'layer:click': { layerId: string; feature: any; lngLat: maplibregl.LngLat };\n 'layer:hover': { layerId: string; feature: any; lngLat: maplibregl.LngLat };\n}\n\n/**\n * Main class for rendering maps from configuration\n */\nexport class MapRenderer {\n private map: MapLibreMap;\n private layerManager: LayerManager;\n private eventHandler: EventHandler;\n private legendBuilder: LegendBuilder;\n private controlsManager: ControlsManager;\n private eventListeners: Map<string, Set<Function>>;\n private isLoaded: boolean;\n\n constructor(container: string | HTMLElement, config: MapConfig, layers: Layer[] = [], options: MapRendererOptions = {}) {\n this.eventListeners = new Map();\n this.isLoaded = false;\n\n // Initialize MapLibre map\n this.map = new maplibregl.Map({\n ...config,\n container: typeof container === 'string' ? container : container,\n style: config.mapStyle as any,\n center: config.center as [number, number],\n zoom: config.zoom,\n pitch: config.pitch ?? 0,\n bearing: config.bearing ?? 0,\n interactive: config.interactive ?? true,\n } as any);\n\n // Initialize managers\n const layerCallbacks: LayerManagerCallbacks = {\n onDataLoading: (layerId) => this.emit('layer:data-loading', { layerId }),\n onDataLoaded: (layerId, featureCount) => this.emit('layer:data-loaded', { layerId, featureCount }),\n onDataError: (layerId, error) => this.emit('layer:data-error', { layerId, error }),\n };\n\n const eventCallbacks: EventHandlerCallbacks = {\n onClick: (layerId, feature, lngLat) => this.emit('layer:click', { layerId, feature, lngLat }),\n onHover: (layerId, feature, lngLat) => this.emit('layer:hover', { layerId, feature, lngLat }),\n };\n\n this.layerManager = new LayerManager(this.map, layerCallbacks);\n this.eventHandler = new EventHandler(this.map, eventCallbacks);\n this.legendBuilder = new LegendBuilder();\n this.controlsManager = new ControlsManager(this.map);\n\n // Set up load handler\n this.map.on('load', () => {\n this.isLoaded = true;\n\n // Add layers\n Promise.all(layers.map((layer) => this.addLayer(layer)))\n .then(() => {\n this.emit('load', undefined);\n options.onLoad?.();\n })\n .catch((error) => {\n options.onError?.(error);\n });\n });\n\n // Handle errors\n this.map.on('error', (e) => {\n options.onError?.(e.error);\n });\n }\n\n /**\n * Get the underlying MapLibre map instance\n */\n getMap(): MapLibreMap {\n return this.map;\n }\n\n /**\n * Check if map is loaded\n */\n isMapLoaded(): boolean {\n return this.isLoaded;\n }\n\n /**\n * Add a layer to the map\n */\n async addLayer(layer: Layer): Promise<void> {\n await this.layerManager.addLayer(layer);\n this.eventHandler.attachEvents(layer);\n this.emit('layer:added', { layerId: layer.id });\n }\n\n /**\n * Remove a layer from the map\n */\n removeLayer(layerId: string): void {\n this.eventHandler.detachEvents(layerId);\n this.layerManager.removeLayer(layerId);\n this.emit('layer:removed', { layerId });\n }\n\n /**\n * Set layer visibility\n */\n setLayerVisibility(layerId: string, visible: boolean): void {\n this.layerManager.setVisibility(layerId, visible);\n }\n\n /**\n * Update layer data\n */\n updateLayerData(layerId: string, data: GeoJSON.GeoJSON): void {\n this.layerManager.updateData(layerId, data);\n }\n\n /**\n * Add controls to the map\n */\n addControls(config: ControlsConfig): void {\n this.controlsManager.addControls(config);\n }\n\n /**\n * Build legend in container\n */\n buildLegend(container: string | HTMLElement, layers: Layer[], config?: LegendConfig): void {\n this.legendBuilder.build(container, layers, config);\n }\n\n /**\n * Get the legend builder instance\n */\n getLegendBuilder(): LegendBuilder {\n return this.legendBuilder;\n }\n\n /**\n * Register an event listener\n */\n on<K extends keyof MapRendererEvents>(event: K, callback: (data: MapRendererEvents[K]) => void): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n this.eventListeners.get(event)!.add(callback);\n }\n\n /**\n * Unregister an event listener\n */\n off<K extends keyof MapRendererEvents>(event: K, callback: Function): void {\n const listeners = this.eventListeners.get(event);\n if (listeners) {\n listeners.delete(callback);\n }\n }\n\n /**\n * Emit an event\n */\n private emit<K extends keyof MapRendererEvents>(event: K, data: MapRendererEvents[K]): void {\n const listeners = this.eventListeners.get(event);\n if (listeners) {\n for (const callback of listeners) {\n callback(data);\n }\n }\n }\n\n /**\n * Destroy the map and clean up resources\n */\n destroy(): void {\n this.eventHandler.destroy();\n this.layerManager.destroy();\n this.controlsManager.removeAllControls();\n this.eventListeners.clear();\n this.map.remove();\n }\n}\n","/**\n * @file Unified MLMap web component for maplibre-yaml\n * @module @maplibre-yaml/core/components/ml-map\n *\n * @description\n * The `<ml-map>` component is the primary way to embed MapLibre maps configured\n * with YAML. It supports multiple configuration methods to fit any use case.\n *\n * ## Configuration Methods (in priority order)\n *\n * ### 1. External YAML File (Recommended)\n * ```html\n * <ml-map src=\"/configs/my-map.yaml\"></ml-map>\n * ```\n *\n * ### 2. Inline YAML via Script Tag\n * ```html\n * <ml-map>\n * <script type=\"text/yaml\">\n * type: map\n * id: my-map\n * config:\n * center: [-74.006, 40.7128]\n * zoom: 12\n * mapStyle: \"https://demotiles.maplibre.org/style.json\"\n * layers: []\n * </script>\n * </ml-map>\n * ```\n *\n * ### 3. JSON Config Attribute (Programmatic)\n * ```html\n * <ml-map config='{\"type\":\"map\",...}'></ml-map>\n * ```\n */\n\nimport type { Map as MapLibreMap } from \"maplibre-gl\";\nimport {\n YAMLParser,\n type MapBlock,\n type ParseError,\n} from \"../parser/yaml-parser.js\";\nimport { MapRenderer } from \"../renderer/map-renderer.js\";\n\n/**\n * MLMap custom element for rendering MapLibre maps from YAML/JSON configuration.\n *\n * @fires ml-map:load - Map loaded and ready for interaction\n * @fires ml-map:error - Error during initialization or runtime\n * @fires ml-map:loading - Loading configuration from URL\n * @fires ml-map:layer-added - Layer was added to the map\n * @fires ml-map:layer-removed - Layer was removed from the map\n * @fires ml-map:layer-data-loading - Layer data is being fetched\n * @fires ml-map:layer-data-loaded - Layer data loaded successfully\n * @fires ml-map:layer-data-error - Layer data failed to load\n * @fires ml-map:layer-click - User clicked on a layer feature\n * @fires ml-map:layer-hover - User hovered over a layer feature\n */\nexport class MLMap extends HTMLElement {\n /** Internal MapRenderer instance */\n private renderer: MapRenderer | null = null;\n\n /** Whether the component has been initialized */\n private initialized = false;\n\n /** Container element for the map */\n private mapContainer: HTMLDivElement | null = null;\n\n /** Parsed and validated configuration */\n private _config: MapBlock | null = null;\n\n /**\n * Observed attributes that trigger attributeChangedCallback\n */\n static get observedAttributes(): string[] {\n return [\"src\", \"config\"];\n }\n\n /**\n * Get the current map configuration\n */\n get config(): MapBlock | null {\n return this._config;\n }\n\n /**\n * Set the map configuration programmatically\n */\n set config(value: MapBlock | string | null) {\n if (value === null) {\n this._config = null;\n return;\n }\n\n let parsed: MapBlock;\n\n if (typeof value === \"string\") {\n try {\n parsed = JSON.parse(value);\n } catch (e) {\n this.handleError([\n { path: \"\", message: \"Invalid JSON in config property\" },\n ]);\n return;\n }\n } else {\n parsed = value;\n }\n\n this._config = parsed;\n\n // If already initialized, render with new config\n if (this.initialized) {\n this.renderMap(parsed);\n }\n }\n\n /**\n * Called when the element is added to the DOM\n */\n connectedCallback(): void {\n // Create internal map container\n this.mapContainer = document.createElement(\"div\");\n this.mapContainer.style.cssText = \"width: 100%; height: 100%;\";\n\n // Ensure the component has display: block (custom elements default to inline)\n if (!this.style.display || this.style.display === \"inline\") {\n this.style.display = \"block\";\n }\n\n // Initialize configuration loading\n this.initialize();\n }\n\n /**\n * Called when the element is removed from the DOM\n */\n disconnectedCallback(): void {\n this.destroy();\n }\n\n /**\n * Called when an observed attribute changes\n */\n attributeChangedCallback(\n name: string,\n oldValue: string | null,\n newValue: string | null\n ): void {\n // Skip if value hasn't actually changed\n if (oldValue === newValue) return;\n\n // Only process changes after initialization\n if (!this.initialized) return;\n\n if (name === \"src\" && newValue) {\n this.loadFromURL(newValue);\n } else if (name === \"config\" && newValue) {\n this.loadFromJSONAttribute(newValue);\n }\n }\n\n /**\n * Initialize the component by detecting and loading configuration\n */\n private async initialize(): Promise<void> {\n this.initialized = true;\n\n // Priority 1: Script tag with YAML\n const yamlScript = this.querySelector('script[type=\"text/yaml\"]');\n if (yamlScript?.textContent) {\n this.loadFromScriptTag(yamlScript.textContent);\n return;\n }\n\n // Priority 2: External YAML file\n const srcAttr = this.getAttribute(\"src\");\n if (srcAttr) {\n await this.loadFromURL(srcAttr);\n return;\n }\n\n // Priority 3: JSON config attribute\n const configAttr = this.getAttribute(\"config\");\n if (configAttr) {\n this.loadFromJSONAttribute(configAttr);\n return;\n }\n\n // No configuration provided - show helpful error\n this.handleError(\n [\n {\n path: \"\",\n message: \"No configuration provided.\",\n },\n ],\n true\n );\n }\n\n /**\n * Load and parse YAML from a script tag's text content\n */\n private loadFromScriptTag(yamlContent: string): void {\n const result = YAMLParser.safeParseMapBlock(yamlContent);\n\n if (result.success && result.data) {\n this._config = result.data;\n this.renderMap(result.data);\n } else {\n this.handleError(result.errors);\n }\n }\n\n /**\n * Load and parse YAML from an external URL\n */\n private async loadFromURL(url: string): Promise<void> {\n // Emit loading event\n this.dispatchEvent(\n new CustomEvent(\"ml-map:loading\", {\n bubbles: true,\n detail: { url },\n })\n );\n\n try {\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch ${url}: ${response.status} ${response.statusText}`\n );\n }\n\n const yamlContent = await response.text();\n const result = YAMLParser.safeParseMapBlock(yamlContent);\n\n if (result.success && result.data) {\n this._config = result.data;\n this.renderMap(result.data);\n } else {\n this.handleError(result.errors);\n }\n } catch (error) {\n this.handleError([\n {\n path: \"\",\n message: error instanceof Error ? error.message : String(error),\n },\n ]);\n }\n }\n\n /**\n * Parse and validate JSON from the config attribute\n */\n private loadFromJSONAttribute(jsonString: string): void {\n try {\n const parsed = JSON.parse(jsonString);\n this._config = parsed;\n this.renderMap(parsed);\n } catch (error) {\n this.handleError([\n {\n path: \"\",\n message: `Invalid JSON in config attribute: ${\n error instanceof Error ? error.message : String(error)\n }`,\n },\n ]);\n }\n }\n\n /**\n * Render the map with the given configuration\n */\n private renderMap(mapBlock: MapBlock): void {\n // Destroy existing renderer\n if (this.renderer) {\n this.renderer.destroy();\n this.renderer = null;\n }\n\n // Clear content and set up container\n this.innerHTML = \"\";\n\n if (!this.mapContainer) {\n this.mapContainer = document.createElement(\"div\");\n this.mapContainer.style.cssText = \"width: 100%; height: 100%;\";\n }\n\n this.appendChild(this.mapContainer);\n\n try {\n // Extract config and layers from MapBlock\n const { config, layers = [] } = mapBlock;\n\n // Create renderer with config and layers\n this.renderer = new MapRenderer(this.mapContainer, config, layers, {\n onLoad: () => {\n // Load event is also emitted via the event system\n },\n onError: (error) => {\n this.dispatchEvent(\n new CustomEvent(\"ml-map:error\", {\n bubbles: true,\n detail: { error },\n })\n );\n },\n });\n\n // Set up event forwarding\n this.setupEventForwarding();\n } catch (error) {\n this.handleError([\n {\n path: \"\",\n message: `Failed to create map: ${\n error instanceof Error ? error.message : String(error)\n }`,\n },\n ]);\n }\n }\n\n /**\n * Forward MapRenderer events to custom element events\n */\n private setupEventForwarding(): void {\n if (!this.renderer) return;\n\n // Map load event\n this.renderer.on(\"load\", () => {\n this.dispatchEvent(\n new CustomEvent(\"ml-map:load\", {\n bubbles: true,\n detail: {},\n })\n );\n });\n\n // Layer added\n this.renderer.on(\"layer:added\", ({ layerId }) => {\n this.dispatchEvent(\n new CustomEvent(\"ml-map:layer-added\", {\n bubbles: true,\n detail: { layerId },\n })\n );\n });\n\n // Layer removed\n this.renderer.on(\"layer:removed\", ({ layerId }) => {\n this.dispatchEvent(\n new CustomEvent(\"ml-map:layer-removed\", {\n bubbles: true,\n detail: { layerId },\n })\n );\n });\n\n // Layer data loading\n this.renderer.on(\"layer:data-loading\", ({ layerId }) => {\n this.dispatchEvent(\n new CustomEvent(\"ml-map:layer-data-loading\", {\n bubbles: true,\n detail: { layerId },\n })\n );\n });\n\n // Layer data loaded\n this.renderer.on(\"layer:data-loaded\", ({ layerId, featureCount }) => {\n this.dispatchEvent(\n new CustomEvent(\"ml-map:layer-data-loaded\", {\n bubbles: true,\n detail: { layerId, featureCount },\n })\n );\n });\n\n // Layer data error\n this.renderer.on(\"layer:data-error\", ({ layerId, error }) => {\n this.dispatchEvent(\n new CustomEvent(\"ml-map:layer-data-error\", {\n bubbles: true,\n detail: { layerId, error },\n })\n );\n });\n\n // Layer click\n this.renderer.on(\"layer:click\", ({ layerId, feature, lngLat }) => {\n this.dispatchEvent(\n new CustomEvent(\"ml-map:layer-click\", {\n bubbles: true,\n detail: { layerId, feature, lngLat },\n })\n );\n });\n\n // Layer hover\n this.renderer.on(\"layer:hover\", ({ layerId, feature, lngLat }) => {\n this.dispatchEvent(\n new CustomEvent(\"ml-map:layer-hover\", {\n bubbles: true,\n detail: { layerId, feature, lngLat },\n })\n );\n });\n }\n\n /**\n * Handle and display errors\n */\n private handleError(errors: ParseError[], showHelp = false): void {\n // Dispatch error event\n this.dispatchEvent(\n new CustomEvent(\"ml-map:error\", {\n bubbles: true,\n detail: { errors },\n })\n );\n\n // Build error UI\n const helpSection = showHelp\n ? `\n <div style=\"margin-top: 16px; padding: 16px; background: #fef3c7; border-radius: 6px; color: #92400e;\">\n <strong style=\"display: block; margin-bottom: 8px;\">How to configure:</strong>\n <div style=\"font-family: monospace; font-size: 12px; line-height: 1.6;\">\n <div style=\"margin-bottom: 8px;\">\n <strong>1. External file (recommended):</strong><br>\n &lt;ml-map src=\"/path/to/config.yaml\"&gt;&lt;/ml-map&gt;\n </div>\n <div style=\"margin-bottom: 8px;\">\n <strong>2. Inline YAML:</strong><br>\n &lt;ml-map&gt;<br>\n &nbsp;&nbsp;&lt;script type=\"text/yaml\"&gt;<br>\n &nbsp;&nbsp;type: map<br>\n &nbsp;&nbsp;id: my-map<br>\n &nbsp;&nbsp;...<br>\n &nbsp;&nbsp;&lt;/script&gt;<br>\n &lt;/ml-map&gt;\n </div>\n <div>\n <strong>3. JSON attribute:</strong><br>\n &lt;ml-map config='{\"type\":\"map\",...}'&gt;&lt;/ml-map&gt;\n </div>\n </div>\n </div>\n `\n : \"\";\n\n const errorItems = errors\n .map(\n (err) => `\n <div style=\"margin-bottom: 8px; padding: 8px; background: #fee2e2; border-radius: 4px;\">\n ${\n err.path\n ? `<strong style=\"color: #991b1b;\">${this.escapeHtml(\n err.path\n )}</strong>: `\n : \"\"\n }\n ${this.escapeHtml(err.message)}\n </div>\n `\n )\n .join(\"\");\n\n this.innerHTML = `\n <div class=\"ml-map-error\" style=\"\n padding: 20px;\n background: #fef2f2;\n border: 1px solid #fecaca;\n border-radius: 8px;\n color: #dc2626;\n font-family: system-ui, -apple-system, sans-serif;\n height: 100%;\n box-sizing: border-box;\n overflow: auto;\n \">\n <div style=\"font-weight: 600; margin-bottom: 12px; display: flex; align-items: center; gap: 8px;\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fill-rule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7 4a1 1 0 11-2 0 1 1 0 012 0zm-1-9a1 1 0 00-1 1v4a1 1 0 102 0V6a1 1 0 00-1-1z\" clip-rule=\"evenodd\"/>\n </svg>\n Configuration Error\n </div>\n <div style=\"font-size: 14px;\">\n ${errorItems}\n </div>\n ${helpSection}\n </div>\n `;\n }\n\n /**\n * Escape HTML special characters for safe innerHTML usage\n */\n private escapeHtml(text: string): string {\n const div = document.createElement(\"div\");\n div.textContent = text;\n return div.innerHTML;\n }\n\n /**\n * Clean up resources when component is removed\n */\n private destroy(): void {\n if (this.renderer) {\n this.renderer.destroy();\n this.renderer = null;\n }\n this._config = null;\n this.initialized = false;\n }\n\n // ============================================================\n // Public API\n // ============================================================\n\n /**\n * Get the underlying MapLibre GL map instance\n *\n * @returns The MapLibre GL map instance, or null if not initialized\n *\n * @example\n * ```javascript\n * const mapEl = document.querySelector('ml-map');\n *\n * mapEl.addEventListener('ml-map:load', () => {\n * const map = mapEl.getMap();\n * map.flyTo({ center: [-122.4, 37.8], zoom: 14 });\n * });\n * ```\n */\n getMap(): MapLibreMap | null {\n return this.renderer?.getMap() ?? null;\n }\n\n /**\n * Get the MapRenderer instance\n *\n * @returns The MapRenderer instance, or null if not initialized\n */\n getRenderer(): MapRenderer | null {\n return this.renderer;\n }\n\n /**\n * Check if the map is loaded\n *\n * @returns True if the map has finished loading\n */\n isLoaded(): boolean {\n return this.renderer?.isMapLoaded() ?? false;\n }\n\n /**\n * Add a layer to the map\n *\n * @param layer - Layer configuration object\n * @returns Promise that resolves when the layer is added\n *\n * @example\n * ```javascript\n * await mapEl.addLayer({\n * id: 'new-layer',\n * type: 'circle',\n * source: {\n * type: 'geojson',\n * data: { type: 'FeatureCollection', features: [] }\n * },\n * paint: { 'circle-radius': 6, 'circle-color': '#ff0000' }\n * });\n * ```\n */\n async addLayer(layer: any): Promise<void> {\n await this.renderer?.addLayer(layer);\n }\n\n /**\n * Remove a layer from the map\n *\n * @param layerId - ID of the layer to remove\n */\n removeLayer(layerId: string): void {\n this.renderer?.removeLayer(layerId);\n }\n\n /**\n * Set layer visibility\n *\n * @param layerId - ID of the layer\n * @param visible - Whether the layer should be visible\n */\n setLayerVisibility(layerId: string, visible: boolean): void {\n this.renderer?.setLayerVisibility(layerId, visible);\n }\n\n /**\n * Update layer data\n *\n * @param layerId - ID of the layer\n * @param data - New GeoJSON data\n */\n updateLayerData(layerId: string, data: GeoJSON.GeoJSON): void {\n this.renderer?.updateLayerData(layerId, data);\n }\n\n /**\n * Reload configuration from the current source\n *\n * @returns Promise that resolves when reload is complete\n */\n async reload(): Promise<void> {\n const src = this.getAttribute(\"src\");\n\n if (src) {\n await this.loadFromURL(src);\n } else {\n const yamlScript = this.querySelector('script[type=\"text/yaml\"]');\n if (yamlScript?.textContent) {\n this.loadFromScriptTag(yamlScript.textContent);\n }\n }\n }\n}\n\n/**\n * Register the ml-map custom element\n */\nexport function registerMLMap(): void {\n if (typeof window !== \"undefined\" && !customElements.get(\"ml-map\")) {\n customElements.define(\"ml-map\", MLMap);\n }\n}\n","/**\n * @file Auto-registration for maplibre-yaml web components\n * @module @maplibre-yaml/core/register\n *\n * @description\n * Import this module to automatically register the `<ml-map>` web component.\n *\n * ## Usage\n *\n * ```javascript\n * import '@maplibre-yaml/core/register';\n * import 'maplibre-gl/dist/maplibre-gl.css';\n * ```\n *\n * After importing, the `<ml-map>` element is available in your HTML.\n *\n * @example\n * External YAML file (recommended)\n * ```html\n * <ml-map src=\"/configs/my-map.yaml\" style=\"height: 400px;\"></ml-map>\n * ```\n *\n * @example\n * Inline YAML via script tag\n * ```html\n * <ml-map style=\"height: 400px;\">\n * <script type=\"text/yaml\">\n * type: map\n * id: my-map\n * config:\n * center: [-74.006, 40.7128]\n * zoom: 12\n * mapStyle: \"https://demotiles.maplibre.org/style.json\"\n * layers: []\n * </script>\n * </ml-map>\n * ```\n *\n * @example\n * JSON config attribute (programmatic)\n * ```html\n * <ml-map config='{\"type\":\"map\",\"id\":\"demo\",...}'></ml-map>\n * ```\n */\n\nimport { MLMap, registerMLMap } from \"./components/ml-map.js\";\n\n// Export for manual use if needed\nexport { MLMap, registerMLMap };\n\n// Auto-register when imported in browser context\nif (typeof window !== \"undefined\") {\n registerMLMap();\n}\n"]}
1
+ {"version":3,"sources":["../src/schemas/content.schema.ts","../src/schemas/base.schema.ts","../src/schemas/source.schema.ts","../src/schemas/layer.schema.ts","../src/schemas/map.schema.ts","../src/schemas/scrollytelling.schema.ts","../src/schemas/page.schema.ts","../src/parser/yaml-parser.ts","../src/data/memory-cache.ts","../src/data/retry-manager.ts","../src/data/data-fetcher.ts","../src/data/polling-manager.ts","../src/utils/event-emitter.ts","../src/data/streaming/base-connection.ts","../src/data/streaming/sse-connection.ts","../src/data/streaming/websocket-connection.ts","../src/data/streaming/stream-manager.ts","../src/data/merge/data-merger.ts","../src/ui/loading-manager.ts","../src/renderer/layer-manager.ts","../src/renderer/popup-builder.ts","../src/renderer/event-handler.ts","../src/renderer/legend-builder.ts","../src/renderer/controls-manager.ts","../src/renderer/map-renderer.ts","../src/components/ml-map.ts","../src/register.ts"],"names":["z","parseYAML","result","removed","maplibregl"],"mappings":"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","file":"register.js","sourcesContent":["/**\n * @file Content schemas for maplibre-yaml\n * @module @maplibre-yaml/core/schemas/content\n *\n * @description\n * Zod schemas for non-map content blocks including text, images, iframes,\n * and other HTML elements with dynamic property interpolation.\n *\n * @example\n * ```typescript\n * import { ContentBlockSchema } from '@maplibre-yaml/core/schemas';\n * ```\n */\n\nimport { z } from \"zod\";\n\n/**\n * Valid HTML tag names for content elements.\n *\n * @remarks\n * Supports common HTML elements for rich content rendering.\n * Use semantic tags for better accessibility and SEO.\n *\n * **Heading Tags:** h1, h2, h3, h4, h5, h6\n * **Text Tags:** p, span, div, strong, em, code, pre\n * **Link Tag:** a\n * **Media Tags:** img, iframe\n * **List Tags:** ul, ol, li\n * **Other Tags:** blockquote, hr, br\n */\nexport const ValidTagNames = [\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"p\",\n \"span\",\n \"div\",\n \"a\",\n \"strong\",\n \"em\",\n \"code\",\n \"pre\",\n \"img\",\n \"iframe\",\n \"ul\",\n \"ol\",\n \"li\",\n \"blockquote\",\n \"hr\",\n \"br\",\n] as const;\n\n/**\n * Content element with styling and dynamic properties.\n *\n * @remarks\n * Defines a single element within content. Supports both static and\n * dynamic values via property interpolation.\n *\n * **Core Properties:**\n * - `str` - Static text string\n * - `property` - Feature/context property name\n * - `else` - Fallback value if property is missing\n *\n * **Styling:**\n * - `classList` - CSS class names (space-separated or array)\n * - `id` - Element ID\n * - `style` - Inline CSS styles\n *\n * **Links (a tag):**\n * - `href` - URL\n * - `target` - Link target (_blank, _self, etc.)\n *\n * **Media (img, iframe):**\n * - `src` - Source URL\n * - `alt` - Alternative text (img)\n * - `width` - Width (pixels or %)\n * - `height` - Height (pixels or %)\n *\n * @example Static Text\n * ```yaml\n * - str: \"Welcome to our site\"\n * ```\n *\n * @example Dynamic Property\n * ```yaml\n * - property: \"userName\"\n * else: \"Guest\"\n * ```\n *\n * @example Styled Element\n * ```yaml\n * - str: \"Important\"\n * classList: \"text-bold text-red\"\n * style: \"font-size: 18px;\"\n * ```\n *\n * @example Link\n * ```yaml\n * - str: \"Learn more\"\n * href: \"https://example.com\"\n * target: \"_blank\"\n * ```\n *\n * @example Image\n * ```yaml\n * - src: \"https://example.com/photo.jpg\"\n * alt: \"Photo description\"\n * width: \"100%\"\n * ```\n */\nexport const ContentElementSchema = z\n .object({\n // Content\n str: z.string().optional().describe(\"Static text string\"),\n property: z.string().optional().describe(\"Dynamic property from context\"),\n else: z.string().optional().describe(\"Fallback value if property missing\"),\n\n // Styling\n classList: z\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe(\"CSS class names (space-separated string or array)\"),\n id: z.string().optional().describe(\"Element ID attribute\"),\n style: z.string().optional().describe(\"Inline CSS styles\"),\n\n // Links\n href: z.string().url().optional().describe(\"Link URL\"),\n target: z\n .string()\n .optional()\n .describe(\"Link target (_blank, _self, _parent, _top)\"),\n\n // Media\n src: z.string().url().optional().describe(\"Source URL for img or iframe\"),\n alt: z.string().optional().describe(\"Alternative text for images\"),\n width: z\n .union([z.string(), z.number()])\n .optional()\n .describe(\"Width (pixels or %)\"),\n height: z\n .union([z.string(), z.number()])\n .optional()\n .describe(\"Height (pixels or %)\"),\n })\n .passthrough()\n .describe(\"Content element with styling and properties\");\n\n/** Inferred type for content element. */\nexport type ContentElement = z.infer<typeof ContentElementSchema>;\n\n/**\n * Content item mapping tag name to element array.\n *\n * @remarks\n * Each content item is a record where the key is an HTML tag name\n * and the value is an array of content elements to render inside that tag.\n *\n * @example\n * ```yaml\n * - h1:\n * - str: \"Page Title\"\n * - p:\n * - str: \"Welcome, \"\n * - property: \"userName\"\n * else: \"Guest\"\n * ```\n */\nexport const ContentItemSchema = z\n .record(z.enum(ValidTagNames), z.array(ContentElementSchema))\n .describe(\"Content item mapping tag to elements\");\n\n/** Inferred type for content item. */\nexport type ContentItem = z.infer<typeof ContentItemSchema>;\n\n/**\n * Content block for rich text and media.\n *\n * @remarks\n * Content blocks allow you to add non-map content to your pages.\n * They render as HTML with support for dynamic property interpolation.\n *\n * **Use Cases:**\n * - Introductory text\n * - Explanatory sections\n * - Embedded images and videos\n * - Interactive elements\n * - Mixed content layouts\n *\n * **Properties are resolved from:**\n * 1. Page-level context (passed to renderer)\n * 2. Global configuration\n * 3. URL query parameters (if configured)\n *\n * @example Basic Text Content\n * ```yaml\n * type: content\n * id: intro\n * content:\n * - h1:\n * - str: \"Welcome\"\n * - p:\n * - str: \"This is a simple text block.\"\n * ```\n *\n * @example Dynamic Content\n * ```yaml\n * type: content\n * id: user-info\n * className: user-section\n * content:\n * - h2:\n * - str: \"User Profile\"\n * - p:\n * - str: \"Name: \"\n * - property: \"userName\"\n * else: \"Unknown\"\n * - p:\n * - str: \"Location: \"\n * - property: \"userCity\"\n * else: \"Not specified\"\n * ```\n *\n * @example Rich Content with Media\n * ```yaml\n * type: content\n * id: article\n * content:\n * - h1:\n * - str: \"Article Title\"\n * - img:\n * - src: \"https://example.com/header.jpg\"\n * alt: \"Header image\"\n * width: \"100%\"\n * - p:\n * - str: \"Article text goes here...\"\n * - blockquote:\n * - str: \"An inspiring quote.\"\n * - a:\n * - str: \"Read more\"\n * href: \"https://example.com/full-article\"\n * target: \"_blank\"\n * ```\n *\n * @example Styled Content\n * ```yaml\n * type: content\n * id: styled\n * className: \"card shadow\"\n * style: \"padding: 20px; background: #f5f5f5;\"\n * content:\n * - h3:\n * - str: \"Card Title\"\n * classList: \"text-primary\"\n * - p:\n * - str: \"Card content\"\n * ```\n *\n * @example List Content\n * ```yaml\n * type: content\n * id: features\n * content:\n * - h2:\n * - str: \"Features\"\n * - ul:\n * - li:\n * - str: \"Fast rendering\"\n * - li:\n * - str: \"Easy configuration\"\n * - li:\n * - str: \"Fully customizable\"\n * ```\n *\n * @example Embedded Content\n * ```yaml\n * type: content\n * id: video\n * content:\n * - h2:\n * - str: \"Tutorial Video\"\n * - iframe:\n * - src: \"https://www.youtube.com/embed/VIDEO_ID\"\n * width: \"560\"\n * height: \"315\"\n * ```\n */\nexport const ContentBlockSchema = z\n .object({\n type: z.literal(\"content\").describe(\"Block type\"),\n id: z.string().optional().describe(\"Unique block identifier\"),\n className: z\n .string()\n .optional()\n .describe(\"CSS class name for the block container\"),\n style: z\n .string()\n .optional()\n .describe(\"Inline CSS styles for the block container\"),\n content: z\n .array(ContentItemSchema)\n .describe(\"Array of content items to render\"),\n })\n .describe(\"Content block for rich text and media\");\n\n/** Inferred type for content block. */\nexport type ContentBlock = z.infer<typeof ContentBlockSchema>;\n","/**\n * @file Base schemas for maplibre-yaml\n * @module @maplibre-yaml/core/schemas/base\n *\n * @description\n * Foundational Zod schemas for coordinates, colors, expressions, and other\n * primitive types used throughout the library.\n *\n * @example\n * ```typescript\n * import { LngLatSchema, ColorSchema } from '@maplibre-yaml/core/schemas';\n * ```\n */\n\nimport { z } from \"zod\";\n\n/**\n * Longitude value in degrees.\n *\n * @remarks\n * Valid range: -180 to 180 (inclusive)\n *\n * @example\n * ```typescript\n * const lng = LongitudeSchema.parse(-74.006);\n * ```\n */\nexport const LongitudeSchema = z\n .number()\n .min(-180, \"Longitude must be >= -180\")\n .max(180, \"Longitude must be <= 180\")\n .describe(\"Longitude in degrees (-180 to 180)\");\n\n/**\n * Latitude value in degrees.\n *\n * @remarks\n * Valid range: -90 to 90 (inclusive)\n *\n * @example\n * ```typescript\n * const lat = LatitudeSchema.parse(40.7128);\n * ```\n */\nexport const LatitudeSchema = z\n .number()\n .min(-90, \"Latitude must be >= -90\")\n .max(90, \"Latitude must be <= 90\")\n .describe(\"Latitude in degrees (-90 to 90)\");\n\n/**\n * Geographic coordinates as [longitude, latitude].\n *\n * @remarks\n * **Validation Rules:**\n * - Longitude: -180 to 180\n * - Latitude: -90 to 90\n * - Must be a 2-element tuple\n *\n * Follows GeoJSON convention (lng, lat), not (lat, lng).\n *\n * **Common Values:**\n * - `[0, 0]` - Null Island (Gulf of Guinea)\n * - `[-74.006, 40.7128]` - New York City\n * - `[139.6917, 35.6895]` - Tokyo\n *\n * @example YAML\n * ```yaml\n * center: [-74.006, 40.7128]\n * ```\n *\n * @example TypeScript\n * ```typescript\n * const coords = LngLatSchema.parse([-74.006, 40.7128]);\n * ```\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc7946#section-3.1.1 | GeoJSON Position}\n */\nexport const LngLatSchema = z\n .tuple([LongitudeSchema, LatitudeSchema])\n .describe(\"Geographic coordinates as [longitude, latitude]\");\n\n/** Inferred type for geographic coordinates. */\nexport type LngLat = z.infer<typeof LngLatSchema>;\n\n/**\n * Bounding box as [west, south, east, north].\n *\n * @remarks\n * Defines a rectangular geographic area. Corner order:\n * 1. West (min longitude)\n * 2. South (min latitude)\n * 3. East (max longitude)\n * 4. North (max latitude)\n *\n * @example YAML\n * ```yaml\n * maxBounds: [-74.3, 40.5, -73.7, 40.9]\n * ```\n *\n * @example TypeScript\n * ```typescript\n * // NYC bounding box\n * const bounds = LngLatBoundsSchema.parse([-74.3, 40.5, -73.7, 40.9]);\n * ```\n */\nexport const LngLatBoundsSchema = z\n .tuple([\n LongitudeSchema, // west\n LatitudeSchema, // south\n LongitudeSchema, // east\n LatitudeSchema, // north\n ])\n .describe(\"Bounding box as [west, south, east, north]\");\n\n/** Inferred type for bounding box. */\nexport type LngLatBounds = z.infer<typeof LngLatBoundsSchema>;\n\n/**\n * CSS color value.\n *\n * @remarks\n * Supports multiple color formats:\n * - Hex: `#rgb`, `#rrggbb`, `#rrggbbaa`\n * - RGB: `rgb(255, 0, 0)`\n * - RGBA: `rgba(255, 0, 0, 0.5)`\n * - HSL: `hsl(0, 100%, 50%)`\n * - HSLA: `hsla(0, 100%, 50%, 0.5)`\n * - Named: `red`, `blue`, `transparent`, etc.\n *\n * @example YAML\n * ```yaml\n * paint:\n * circle-color: \"#ff0000\"\n * fill-color: \"rgba(255, 0, 0, 0.5)\"\n * line-color: \"hsl(120, 100%, 50%)\"\n * text-color: \"blue\"\n * ```\n *\n * @example TypeScript\n * ```typescript\n * const hex = ColorSchema.parse(\"#ff0000\");\n * const rgba = ColorSchema.parse(\"rgba(255, 0, 0, 0.5)\");\n * const named = ColorSchema.parse(\"red\");\n * ```\n */\nexport const ColorSchema = z\n .string()\n .refine(\n (val) => {\n // Hex color (#rgb, #rrggbb, #rrggbbaa)\n if (val.startsWith(\"#\")) {\n return /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/.test(val);\n }\n // rgb/rgba\n if (val.startsWith(\"rgb\")) {\n return /^rgba?\\s*\\([^)]+\\)$/.test(val);\n }\n // hsl/hsla\n if (val.startsWith(\"hsl\")) {\n return /^hsla?\\s*\\([^)]+\\)$/.test(val);\n }\n // Named colors (accept any other string, browser will validate)\n return true;\n },\n {\n message:\n \"Invalid color format. Use hex (#rgb, #rrggbb), rgb(), rgba(), hsl(), hsla(), or named colors.\",\n }\n )\n .describe(\"CSS color value\");\n\n/** Inferred type for color values. */\nexport type Color = z.infer<typeof ColorSchema>;\n\n/**\n * MapLibre expression for data-driven styling.\n *\n * @remarks\n * MapLibre expressions provide powerful data-driven styling capabilities.\n * An expression is an array where the first element is the operator name.\n *\n * **Common Operators:**\n * - `get` - Get feature property\n * - `interpolate` - Interpolate between values\n * - `match` - Match values\n * - `case` - Conditional logic\n * - `step` - Step function\n *\n * This schema provides basic validation (array starting with string).\n * Full expression syntax is validated by MapLibre at runtime.\n *\n * @example Get Property\n * ```yaml\n * text-field: [\"get\", \"name\"]\n * ```\n *\n * @example Interpolate by Zoom\n * ```yaml\n * circle-radius:\n * - interpolate\n * - [\"linear\"]\n * - [\"zoom\"]\n * - 5\n * - 2\n * - 15\n * - 10\n * ```\n *\n * @example Match Values\n * ```yaml\n * circle-color:\n * - match\n * - [\"get\", \"type\"]\n * - \"park\"\n * - \"#228B22\"\n * - \"water\"\n * - \"#4169E1\"\n * - \"#808080\"\n * ```\n *\n * @see {@link https://maplibre.org/maplibre-style-spec/expressions/ | MapLibre Expressions}\n */\nexport const ExpressionSchema: z.ZodType<any[]> = z\n .array(z.any())\n .refine((val) => val.length > 0 && typeof val[0] === \"string\", {\n message:\n 'Expression must be an array starting with a string operator (e.g., [\"get\", \"property\"])',\n })\n .describe(\"MapLibre expression for data-driven styling\");\n\n/** Inferred type for expressions. */\nexport type Expression = z.infer<typeof ExpressionSchema>;\n\n/**\n * Number value or MapLibre expression.\n *\n * @remarks\n * Accepts either a static number or a dynamic expression.\n * Use expressions for data-driven or zoom-dependent values.\n *\n * @example Static Value\n * ```yaml\n * circle-radius: 8\n * ```\n *\n * @example Expression\n * ```yaml\n * circle-radius:\n * - interpolate\n * - [\"linear\"]\n * - [\"get\", \"magnitude\"]\n * - 0\n * - 4\n * - 10\n * - 20\n * ```\n */\nexport const NumberOrExpressionSchema = z\n .union([z.number(), ExpressionSchema])\n .describe(\"Number value or MapLibre expression\");\n\n/** Inferred type for number or expression. */\nexport type NumberOrExpression = z.infer<typeof NumberOrExpressionSchema>;\n\n/**\n * Color value or MapLibre expression.\n *\n * @remarks\n * Accepts either a static color or a dynamic expression.\n * Use expressions for data-driven colors.\n *\n * @example Static Color\n * ```yaml\n * circle-color: \"#ff0000\"\n * ```\n *\n * @example Expression\n * ```yaml\n * circle-color:\n * - match\n * - [\"get\", \"severity\"]\n * - \"high\"\n * - \"#ff0000\"\n * - \"medium\"\n * - \"#ffaa00\"\n * - \"low\"\n * - \"#00ff00\"\n * - \"#808080\"\n * ```\n */\nexport const ColorOrExpressionSchema = z\n .union([ColorSchema, ExpressionSchema])\n .describe(\"Color value or MapLibre expression\");\n\n/** Inferred type for color or expression. */\nexport type ColorOrExpression = z.infer<typeof ColorOrExpressionSchema>;\n\n/**\n * Map zoom level.\n *\n * @remarks\n * Valid range: 0 to 24\n *\n * **Common Values:**\n * - 0 - Whole world\n * - 5 - Continent\n * - 10 - City\n * - 15 - Streets\n * - 20 - Buildings\n *\n * @example\n * ```yaml\n * zoom: 12\n * minZoom: 8\n * maxZoom: 18\n * ```\n */\nexport const ZoomLevelSchema = z\n .number()\n .min(0, \"Zoom level must be >= 0\")\n .max(24, \"Zoom level must be <= 24\")\n .describe(\"Map zoom level (0-24)\");\n\n/** Inferred type for zoom level. */\nexport type ZoomLevel = z.infer<typeof ZoomLevelSchema>;\n","/**\n * @file Source schemas for maplibre-yaml\n * @module @maplibre-yaml/core/schemas/source\n *\n * @description\n * Zod schemas for all MapLibre data source types with runtime-first defaults.\n * Supports GeoJSON, vector, raster, image, and video sources with dynamic data loading.\n *\n * @example\n * ```typescript\n * import { GeoJSONSourceSchema, LayerSourceSchema } from '@maplibre-yaml/core/schemas';\n * ```\n */\n\nimport { z } from \"zod\";\nimport { LngLatSchema } from \"./base.schema\";\n\n/**\n * WebSocket or Server-Sent Events streaming configuration.\n *\n * @remarks\n * Enables real-time data updates via WebSocket or SSE connections.\n *\n * **Connection Types:**\n * - `websocket` - Bidirectional WebSocket connection\n * - `sse` - Server-Sent Events (unidirectional)\n *\n * @example WebSocket\n * ```yaml\n * stream:\n * type: websocket\n * url: \"wss://api.example.com/live-data\"\n * reconnect: true\n * reconnectMaxAttempts: 10\n * protocols: [\"json\", \"v1\"]\n * ```\n *\n * @example Server-Sent Events\n * ```yaml\n * stream:\n * type: sse\n * url: \"https://api.example.com/events\"\n * eventTypes: [\"update\", \"delete\"]\n * ```\n */\nexport const StreamConfigSchema = z.object({\n type: z.enum([\"websocket\", \"sse\"]).describe(\"Streaming connection type\"),\n url: z.string().url().optional().describe(\"WebSocket or SSE endpoint URL\"),\n reconnect: z\n .boolean()\n .default(true)\n .describe(\"Automatically reconnect on disconnect\"),\n reconnectMaxAttempts: z\n .number()\n .min(0)\n .default(10)\n .describe(\"Maximum number of reconnection attempts\"),\n reconnectDelay: z\n .number()\n .min(100)\n .default(1000)\n .describe(\"Initial delay in milliseconds before reconnecting\"),\n reconnectMaxDelay: z\n .number()\n .min(1000)\n .default(30000)\n .describe(\"Maximum delay in milliseconds for exponential backoff\"),\n eventTypes: z\n .array(z.string())\n .optional()\n .describe(\"Event types to listen for (SSE only)\"),\n protocols: z\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe(\"WebSocket sub-protocols (WebSocket only)\"),\n});\n\n/** Inferred type for stream configuration. */\nexport type StreamConfig = z.infer<typeof StreamConfigSchema>;\n\n/**\n * Loading UI configuration for data fetching.\n *\n * @remarks\n * Controls the loading experience while data is being fetched.\n *\n * @example\n * ```yaml\n * loading:\n * enabled: true\n * message: \"Loading earthquake data...\"\n * showErrorOverlay: true\n * ```\n */\nexport const LoadingConfigSchema = z.object({\n enabled: z.boolean().default(false).describe(\"Enable loading UI overlays\"),\n message: z.string().optional().describe(\"Custom loading message to display\"),\n showErrorOverlay: z\n .boolean()\n .default(true)\n .describe(\"Show error overlay on fetch failure\"),\n});\n\n/** Inferred type for loading configuration. */\nexport type LoadingConfig = z.infer<typeof LoadingConfigSchema>;\n\n/**\n * Cache configuration for data fetching.\n *\n * @remarks\n * Controls HTTP caching behavior for fetched data.\n *\n * @example\n * ```yaml\n * cache:\n * enabled: true\n * ttl: 300000 # 5 minutes\n * ```\n */\nexport const CacheConfigSchema = z.object({\n enabled: z.boolean().default(true).describe(\"Enable HTTP caching\"),\n ttl: z\n .number()\n .positive()\n .optional()\n .describe(\"Cache TTL in milliseconds (overrides default)\"),\n});\n\n/** Inferred type for cache configuration. */\nexport type CacheConfig = z.infer<typeof CacheConfigSchema>;\n\n/**\n * Refresh configuration for polling updates.\n *\n * @remarks\n * Configures periodic data refresh with merge strategies.\n *\n * @example Replace Strategy\n * ```yaml\n * refresh:\n * refreshInterval: 5000\n * updateStrategy: replace\n * ```\n *\n * @example Merge Strategy\n * ```yaml\n * refresh:\n * refreshInterval: 10000\n * updateStrategy: merge\n * updateKey: \"vehicleId\"\n * ```\n *\n * @example Append-Window Strategy\n * ```yaml\n * refresh:\n * refreshInterval: 15000\n * updateStrategy: append-window\n * windowSize: 100\n * windowDuration: 3600000 # 1 hour\n * timestampField: \"timestamp\"\n * ```\n */\nexport const RefreshConfigSchema = z\n .object({\n refreshInterval: z\n .number()\n .min(1000)\n .optional()\n .describe(\"Polling interval in milliseconds (minimum 1000ms)\"),\n updateStrategy: z\n .enum([\"replace\", \"merge\", \"append-window\"])\n .default(\"replace\")\n .describe(\"How to merge incoming data with existing data\"),\n updateKey: z\n .string()\n .optional()\n .describe(\"Property key for merge strategy (required for merge)\"),\n windowSize: z\n .number()\n .positive()\n .optional()\n .describe(\"Maximum features to keep (append-window)\"),\n windowDuration: z\n .number()\n .positive()\n .optional()\n .describe(\"Maximum age in milliseconds (append-window)\"),\n timestampField: z\n .string()\n .optional()\n .describe(\"Property field containing timestamp (append-window)\"),\n })\n .refine((data) => !(data.updateStrategy === \"merge\" && !data.updateKey), {\n message: \"updateKey is required when updateStrategy is 'merge'\",\n });\n\n/** Inferred type for refresh configuration. */\nexport type RefreshConfig = z.infer<typeof RefreshConfigSchema>;\n\n/**\n * GeoJSON data source configuration.\n *\n * @remarks\n * The primary data source type for maplibre-yaml. Supports multiple data\n * loading strategies:\n *\n * **Data Sources (one required):**\n * - `url` - Fetch GeoJSON from URL at runtime\n * - `data` - Inline GeoJSON object\n * - `stream` - Real-time WebSocket or SSE connection\n *\n * **Fetch Strategy:**\n * - `runtime` (default) - Fetch when map loads, keeps bundle small\n * - `build` - Fetch at build time, bundle with app\n * - `hybrid` - Build-time with runtime refresh\n *\n * **Real-time Updates:**\n * - Use `refreshInterval` for polling (minimum 1000ms)\n * - Use `stream` for WebSocket/SSE\n * - Configure `updateStrategy` for merge vs replace\n *\n * @example Basic URL Source\n * ```yaml\n * source:\n * type: geojson\n * url: \"https://example.com/data.geojson\"\n * ```\n *\n * @example Inline Data\n * ```yaml\n * source:\n * type: geojson\n * data:\n * type: FeatureCollection\n * features:\n * - type: Feature\n * geometry:\n * type: Point\n * coordinates: [-74.006, 40.7128]\n * properties:\n * name: \"New York\"\n * ```\n *\n * @example Polling Updates\n * ```yaml\n * source:\n * type: geojson\n * url: \"https://api.example.com/live-data\"\n * refreshInterval: 15000\n * loading:\n * message: \"Loading live data...\"\n * ```\n *\n * @example WebSocket Streaming\n * ```yaml\n * source:\n * type: geojson\n * stream:\n * type: websocket\n * url: \"wss://api.example.com/stream\"\n * updateStrategy: merge\n * updateKey: \"id\"\n * ```\n *\n * @example Clustered Points\n * ```yaml\n * source:\n * type: geojson\n * url: \"https://example.com/points.geojson\"\n * cluster: true\n * clusterRadius: 50\n * clusterMaxZoom: 14\n * ```\n *\n * @see {@link StreamConfigSchema} for streaming options\n * @see {@link LoadingConfigSchema} for loading UI options\n * @see {@link https://maplibre.org/maplibre-style-spec/sources/#geojson | MapLibre GeoJSON Source}\n */\nexport const GeoJSONSourceSchema = z\n .object({\n type: z.literal(\"geojson\").describe(\"Source type\"),\n url: z.string().url().optional().describe(\"URL to fetch GeoJSON data\"),\n data: z.any().optional().describe(\"Inline GeoJSON object\"),\n prefetchedData: z\n .any()\n .optional()\n .describe(\"Pre-fetched data from build time\"),\n fetchStrategy: z\n .enum([\"runtime\", \"build\", \"hybrid\"])\n .default(\"runtime\")\n .describe(\"When to fetch data: runtime (default), build, or hybrid\"),\n stream: StreamConfigSchema.optional().describe(\n \"WebSocket/SSE streaming configuration\"\n ),\n refresh: RefreshConfigSchema.optional().describe(\n \"Polling refresh configuration\"\n ),\n // Legacy support for direct refresh properties\n refreshInterval: z\n .number()\n .min(1000)\n .optional()\n .describe(\n \"Polling interval in milliseconds (legacy, use refresh.refreshInterval)\"\n ),\n updateStrategy: z\n .enum([\"replace\", \"merge\", \"append-window\"])\n .optional()\n .describe(\"Update strategy (legacy, use refresh.updateStrategy)\"),\n updateKey: z\n .string()\n .optional()\n .describe(\"Update key (legacy, use refresh.updateKey)\"),\n loading: LoadingConfigSchema.optional().describe(\n \"Loading UI configuration\"\n ),\n cache: CacheConfigSchema.optional().describe(\"Cache configuration\"),\n // MapLibre clustering options\n cluster: z.boolean().optional().describe(\"Enable point clustering\"),\n clusterRadius: z\n .number()\n .int()\n .min(0)\n .optional()\n .describe(\"Cluster radius in pixels (default: 50)\"),\n clusterMaxZoom: z\n .number()\n .min(0)\n .max(24)\n .optional()\n .describe(\"Maximum zoom level to cluster points\"),\n clusterMinPoints: z\n .number()\n .int()\n .min(2)\n .optional()\n .describe(\"Minimum points to form a cluster\"),\n clusterProperties: z\n .record(z.any())\n .optional()\n .describe(\"Aggregate cluster properties\"),\n // Additional MapLibre options (passthrough)\n tolerance: z.number().optional(),\n buffer: z.number().optional(),\n lineMetrics: z.boolean().optional(),\n generateId: z.boolean().optional(),\n promoteId: z.union([z.string(), z.record(z.string())]).optional(),\n attribution: z.string().optional(),\n })\n .passthrough()\n .refine((data) => data.url || data.data || data.prefetchedData, {\n message:\n \"GeoJSON source requires at least one of: url, data, or prefetchedData. \" +\n 'Use \"url\" to fetch from an endpoint, \"data\" for inline GeoJSON, ' +\n 'or \"prefetchedData\" for build-time fetched data.',\n });\n\n/** Inferred type for GeoJSON source. */\nexport type GeoJSONSource = z.infer<typeof GeoJSONSourceSchema>;\n\n/**\n * Vector tile source configuration.\n *\n * @remarks\n * Vector tiles provide efficient rendering of large datasets.\n * Requires either a TileJSON URL or a tiles URL array.\n *\n * @example TileJSON URL\n * ```yaml\n * source:\n * type: vector\n * url: \"https://api.maptiler.com/tiles/v3/tiles.json?key=YOUR_KEY\"\n * ```\n *\n * @example Tiles Array\n * ```yaml\n * source:\n * type: vector\n * tiles:\n * - \"https://tile.example.com/{z}/{x}/{y}.pbf\"\n * minzoom: 0\n * maxzoom: 14\n * ```\n *\n * @see {@link https://maplibre.org/maplibre-style-spec/sources/#vector | MapLibre Vector Source}\n */\nexport const VectorSourceSchema = z\n .object({\n type: z.literal(\"vector\").describe(\"Source type\"),\n url: z.string().url().optional().describe(\"TileJSON URL\"),\n tiles: z\n .array(z.string().url())\n .optional()\n .describe(\"Tile URL template array\"),\n minzoom: z\n .number()\n .min(0)\n .max(24)\n .optional()\n .describe(\"Minimum zoom level\"),\n maxzoom: z\n .number()\n .min(0)\n .max(24)\n .optional()\n .describe(\"Maximum zoom level\"),\n bounds: z\n .tuple([z.number(), z.number(), z.number(), z.number()])\n .optional()\n .describe(\"Bounding box [west, south, east, north]\"),\n scheme: z\n .enum([\"xyz\", \"tms\"])\n .optional()\n .describe(\"Tile coordinate scheme\"),\n attribution: z.string().optional().describe(\"Attribution text\"),\n promoteId: z.union([z.string(), z.record(z.string())]).optional(),\n volatile: z.boolean().optional(),\n })\n .passthrough()\n .refine((data) => data.url || data.tiles, {\n message:\n 'Vector source requires either \"url\" (TileJSON) or \"tiles\" (tile URL array). ' +\n \"Provide at least one of these properties.\",\n });\n\n/** Inferred type for vector source. */\nexport type VectorSource = z.infer<typeof VectorSourceSchema>;\n\n/**\n * Raster tile source configuration.\n *\n * @remarks\n * Raster tiles for satellite imagery, hillshading, or other bitmap data.\n *\n * @example\n * ```yaml\n * source:\n * type: raster\n * tiles:\n * - \"https://tile.openstreetmap.org/{z}/{x}/{y}.png\"\n * tileSize: 256\n * maxzoom: 19\n * attribution: \"© OpenStreetMap contributors\"\n * ```\n *\n * @see {@link https://maplibre.org/maplibre-style-spec/sources/#raster | MapLibre Raster Source}\n */\nexport const RasterSourceSchema = z\n .object({\n type: z.literal(\"raster\").describe(\"Source type\"),\n url: z.string().url().optional().describe(\"TileJSON URL\"),\n tiles: z\n .array(z.string().url())\n .optional()\n .describe(\"Tile URL template array\"),\n tileSize: z\n .number()\n .int()\n .min(1)\n .default(512)\n .describe(\"Tile size in pixels\"),\n minzoom: z\n .number()\n .min(0)\n .max(24)\n .optional()\n .describe(\"Minimum zoom level\"),\n maxzoom: z\n .number()\n .min(0)\n .max(24)\n .optional()\n .describe(\"Maximum zoom level\"),\n bounds: z\n .tuple([z.number(), z.number(), z.number(), z.number()])\n .optional()\n .describe(\"Bounding box [west, south, east, north]\"),\n scheme: z\n .enum([\"xyz\", \"tms\"])\n .optional()\n .describe(\"Tile coordinate scheme\"),\n attribution: z.string().optional().describe(\"Attribution text\"),\n volatile: z.boolean().optional(),\n })\n .passthrough()\n .refine((data) => data.url || data.tiles, {\n message:\n 'Raster source requires either \"url\" (TileJSON) or \"tiles\" (tile URL array). ' +\n \"Provide at least one of these properties.\",\n });\n\n/** Inferred type for raster source. */\nexport type RasterSource = z.infer<typeof RasterSourceSchema>;\n\n/**\n * Image source configuration.\n *\n * @remarks\n * Display a single image on the map anchored to geographic coordinates.\n * Useful for overlaying maps, floor plans, or custom imagery.\n *\n * **Coordinate Order:**\n * Four corners must be specified clockwise starting from top-left:\n * 1. Top-left\n * 2. Top-right\n * 3. Bottom-right\n * 4. Bottom-left\n *\n * @example\n * ```yaml\n * source:\n * type: image\n * url: \"https://example.com/overlay.png\"\n * coordinates:\n * - [-80.425, 46.437] # top-left\n * - [-71.516, 46.437] # top-right\n * - [-71.516, 37.936] # bottom-right\n * - [-80.425, 37.936] # bottom-left\n * ```\n *\n * @see {@link https://maplibre.org/maplibre-style-spec/sources/#image | MapLibre Image Source}\n */\nexport const ImageSourceSchema = z\n .object({\n type: z.literal(\"image\").describe(\"Source type\"),\n url: z.string().url().describe(\"Image URL\"),\n coordinates: z\n .tuple([LngLatSchema, LngLatSchema, LngLatSchema, LngLatSchema])\n .describe(\n \"Four corner coordinates [topLeft, topRight, bottomRight, bottomLeft]\"\n ),\n })\n .passthrough();\n\n/** Inferred type for image source. */\nexport type ImageSource = z.infer<typeof ImageSourceSchema>;\n\n/**\n * Video source configuration.\n *\n * @remarks\n * Display video content on the map anchored to geographic coordinates.\n * Multiple URLs can be provided for browser compatibility.\n *\n * @example\n * ```yaml\n * source:\n * type: video\n * urls:\n * - \"https://example.com/video.mp4\"\n * - \"https://example.com/video.webm\"\n * coordinates:\n * - [-122.51596391201019, 37.56238816766053]\n * - [-122.51467645168304, 37.56410183312965]\n * - [-122.51309394836426, 37.563391708549425]\n * - [-122.51423120498657, 37.56161849366671]\n * ```\n *\n * @see {@link https://maplibre.org/maplibre-style-spec/sources/#video | MapLibre Video Source}\n */\nexport const VideoSourceSchema = z\n .object({\n type: z.literal(\"video\").describe(\"Source type\"),\n urls: z\n .array(z.string().url())\n .min(1)\n .describe(\"Array of video URLs for browser compatibility\"),\n coordinates: z\n .tuple([LngLatSchema, LngLatSchema, LngLatSchema, LngLatSchema])\n .describe(\n \"Four corner coordinates [topLeft, topRight, bottomRight, bottomLeft]\"\n ),\n })\n .passthrough();\n\n/** Inferred type for video source. */\nexport type VideoSource = z.infer<typeof VideoSourceSchema>;\n\n/**\n * Union of all layer source types.\n *\n * @remarks\n * Use the `type` field to determine which source type is being used.\n *\n * @example\n * ```typescript\n * const source: LayerSource = {\n * type: 'geojson',\n * url: 'https://example.com/data.geojson'\n * };\n *\n * // TypeScript knows the available fields based on type\n * if (source.type === 'geojson') {\n * console.log(source.refreshInterval); // OK\n * }\n * ```\n */\nexport const LayerSourceSchema = z.union([\n GeoJSONSourceSchema,\n VectorSourceSchema,\n RasterSourceSchema,\n ImageSourceSchema,\n VideoSourceSchema,\n]);\n\n/** Inferred type for any layer source. */\nexport type LayerSource = z.infer<typeof LayerSourceSchema>;\n","/**\n * @file Layer schemas for maplibre-yaml\n * @module @maplibre-yaml/core/schemas/layer\n *\n * @description\n * Zod schemas for all MapLibre layer types with paint/layout properties,\n * interactive events, popups, and legends.\n *\n * @example\n * ```typescript\n * import { LayerSchema, CircleLayerSchema } from '@maplibre-yaml/core/schemas';\n * ```\n */\n\nimport { z } from \"zod\";\nimport {\n ColorOrExpressionSchema,\n NumberOrExpressionSchema,\n ExpressionSchema,\n ZoomLevelSchema,\n} from \"./base.schema\";\nimport { LayerSourceSchema } from \"./source.schema\";\n\n/**\n * Content item for popup or dynamic text rendering.\n *\n * @remarks\n * Supports static strings, dynamic property interpolation, and fallback values.\n *\n * **Properties:**\n * - `str` - Static text string\n * - `property` - Feature property name to interpolate\n * - `else` - Fallback value if property is missing\n * - `format` - Number format string (e.g., \",.0f\" for thousands separator)\n * - `href` - Link URL (for anchor tags)\n * - `text` - Link text\n * - `src` - Image/iframe source URL\n * - `alt` - Image alt text\n *\n * @example Static Text\n * ```yaml\n * - str: \"Population: \"\n * ```\n *\n * @example Dynamic Property\n * ```yaml\n * - property: name\n * else: \"Unknown\"\n * ```\n *\n * @example Formatted Number\n * ```yaml\n * - property: population\n * format: \",.0f\"\n * ```\n */\nexport const PopupContentItemSchema = z\n .object({\n str: z.string().optional().describe(\"Static text string\"),\n property: z.string().optional().describe(\"Feature property name\"),\n else: z.string().optional().describe(\"Fallback value if property missing\"),\n format: z\n .string()\n .optional()\n .describe('Number format string (e.g., \",.0f\")'),\n href: z.string().url().optional().describe(\"Link URL\"),\n text: z.string().optional().describe(\"Link text\"),\n src: z.string().url().optional().describe(\"Image/iframe source\"),\n alt: z.string().optional().describe(\"Image alt text\"),\n })\n .passthrough()\n .describe(\"Popup content item with static or dynamic values\");\n\n/** Inferred type for popup content item. */\nexport type PopupContentItem = z.infer<typeof PopupContentItemSchema>;\n\n/**\n * Popup content structure.\n *\n * @remarks\n * Array of HTML elements where each element is `{ tagName: [items] }`.\n * Elements are rendered in order to build popup HTML.\n *\n * **Supported Tags:**\n * h1, h2, h3, h4, h5, h6, p, span, div, strong, em, code, pre,\n * a, img, iframe, ul, ol, li, blockquote, hr, br\n *\n * @example\n * ```yaml\n * popup:\n * - h3:\n * - property: name\n * else: \"Unknown\"\n * - p:\n * - str: \"Population: \"\n * - property: population\n * format: \",.0f\"\n * - a:\n * - href: \"https://example.com\"\n * text: \"Learn more\"\n * ```\n *\n * **Output for `{ name: \"NYC\", population: 8336817 }`:**\n * ```html\n * <h3>NYC</h3>\n * <p>Population: 8,336,817</p>\n * <a href=\"https://example.com\">Learn more</a>\n * ```\n */\nexport const PopupContentSchema = z\n .array(z.record(z.array(PopupContentItemSchema)))\n .describe(\"Popup content structure as array of HTML elements\");\n\n/** Inferred type for popup content. */\nexport type PopupContent = z.infer<typeof PopupContentSchema>;\n\n/**\n * Interactive event configuration for layers.\n *\n * @remarks\n * Defines hover and click behaviors for map features.\n *\n * **Events:**\n * - `hover` - Cursor and highlight on mouseover\n * - `click` - Popup, actions, or navigation on click\n * - `mouseenter` - Custom action on mouse enter\n * - `mouseleave` - Custom action on mouse leave\n *\n * @example Hover Cursor\n * ```yaml\n * interactive:\n * hover:\n * cursor: pointer\n * ```\n *\n * @example Click Popup\n * ```yaml\n * interactive:\n * click:\n * popup:\n * - h3:\n * - property: name\n * - p:\n * - property: description\n * ```\n *\n * @example Click with FlyTo\n * ```yaml\n * interactive:\n * click:\n * flyTo:\n * zoom: 15\n * duration: 1000\n * ```\n */\nexport const InteractiveConfigSchema = z\n .object({\n hover: z\n .object({\n cursor: z\n .string()\n .optional()\n .describe('CSS cursor style (e.g., \"pointer\")'),\n highlight: z\n .boolean()\n .optional()\n .describe(\"Highlight feature on hover\"),\n })\n .optional()\n .describe(\"Hover behavior\"),\n click: z\n .object({\n popup: PopupContentSchema.optional().describe(\n \"Popup content to display\"\n ),\n action: z.string().optional().describe(\"Custom action name to trigger\"),\n flyTo: z\n .object({\n center: z.tuple([z.number(), z.number()]).optional(),\n zoom: ZoomLevelSchema.optional(),\n duration: z.number().optional(),\n })\n .optional()\n .describe(\"Fly to location on click\"),\n })\n .optional()\n .describe(\"Click behavior\"),\n mouseenter: z\n .object({\n action: z.string().optional().describe(\"Custom action on mouse enter\"),\n })\n .optional(),\n mouseleave: z\n .object({\n action: z.string().optional().describe(\"Custom action on mouse leave\"),\n })\n .optional(),\n })\n .optional()\n .describe(\"Interactive event configuration\");\n\n/** Inferred type for interactive config. */\nexport type InteractiveConfig = z.infer<typeof InteractiveConfigSchema>;\n\n/**\n * Legend item for a layer.\n *\n * @remarks\n * Defines how the layer appears in the map legend.\n *\n * **Shape Options:**\n * - `circle` - Circular symbol\n * - `square` - Square symbol\n * - `line` - Line symbol\n * - `icon` - Custom icon\n *\n * @example\n * ```yaml\n * legend:\n * color: \"#ff0000\"\n * label: \"Earthquakes\"\n * shape: circle\n * ```\n */\nexport const LegendItemSchema = z\n .object({\n color: z.string().describe(\"CSS color value\"),\n label: z.string().describe(\"Legend label text\"),\n shape: z\n .enum([\"circle\", \"square\", \"line\", \"icon\"])\n .default(\"square\")\n .describe(\"Symbol shape\"),\n icon: z.string().optional().describe(\"Icon name or URL (for shape: icon)\"),\n })\n .describe(\"Legend item configuration\");\n\n/** Inferred type for legend item. */\nexport type LegendItem = z.infer<typeof LegendItemSchema>;\n\n/**\n * Base properties shared by all layer types.\n *\n * @remarks\n * Common configuration that applies to every layer regardless of type.\n */\nexport const BaseLayerPropertiesSchema = z.object({\n id: z.string().describe(\"Unique layer identifier\"),\n label: z.string().optional().describe(\"Human-readable layer label\"),\n source: z\n .union([LayerSourceSchema, z.string()])\n .describe(\"Layer source (inline definition or source ID reference)\"),\n \"source-layer\": z\n .string()\n .optional()\n .describe(\"Source layer name (for vector sources)\"),\n minzoom: ZoomLevelSchema.optional().describe(\n \"Minimum zoom level to show layer\"\n ),\n maxzoom: ZoomLevelSchema.optional().describe(\n \"Maximum zoom level to show layer\"\n ),\n filter: ExpressionSchema.optional().describe(\"MapLibre filter expression\"),\n visible: z.boolean().default(true).describe(\"Initial visibility state\"),\n toggleable: z\n .boolean()\n .default(true)\n .describe(\"Allow users to toggle visibility\"),\n before: z\n .string()\n .optional()\n .describe(\"Layer ID to insert this layer before\"),\n interactive: InteractiveConfigSchema.describe(\n \"Interactive event configuration\"\n ),\n legend: LegendItemSchema.optional().describe(\"Legend configuration\"),\n metadata: z.record(z.any()).optional().describe(\"Custom metadata\"),\n});\n\n/**\n * Circle layer for point data.\n *\n * @remarks\n * Renders points as circles. Supports data-driven styling via\n * MapLibre expressions for all paint properties.\n *\n * **Common Paint Properties:**\n * - `circle-radius` - Size in pixels\n * - `circle-color` - Fill color\n * - `circle-opacity` - Fill opacity (0-1)\n * - `circle-stroke-width` - Border width\n * - `circle-stroke-color` - Border color\n *\n * @example Basic Circle\n * ```yaml\n * - id: points\n * type: circle\n * source:\n * type: geojson\n * url: \"https://example.com/points.geojson\"\n * paint:\n * circle-radius: 8\n * circle-color: \"#ff0000\"\n * ```\n *\n * @example Data-Driven Radius\n * ```yaml\n * paint:\n * circle-radius:\n * - interpolate\n * - [\"linear\"]\n * - [\"get\", \"magnitude\"]\n * - 0\n * - 4\n * - 10\n * - 20\n * ```\n *\n * @see {@link https://maplibre.org/maplibre-style-spec/layers/#circle | MapLibre Circle Layer}\n */\nexport const CircleLayerSchema = BaseLayerPropertiesSchema.extend({\n type: z.literal(\"circle\").describe(\"Layer type\"),\n paint: z\n .object({\n \"circle-radius\": NumberOrExpressionSchema.optional(),\n \"circle-color\": ColorOrExpressionSchema.optional(),\n \"circle-blur\": NumberOrExpressionSchema.optional(),\n \"circle-opacity\": NumberOrExpressionSchema.optional(),\n \"circle-stroke-width\": NumberOrExpressionSchema.optional(),\n \"circle-stroke-color\": ColorOrExpressionSchema.optional(),\n \"circle-stroke-opacity\": NumberOrExpressionSchema.optional(),\n \"circle-pitch-scale\": z.enum([\"map\", \"viewport\"]).optional(),\n \"circle-pitch-alignment\": z.enum([\"map\", \"viewport\"]).optional(),\n \"circle-translate\": z.tuple([z.number(), z.number()]).optional(),\n \"circle-translate-anchor\": z.enum([\"map\", \"viewport\"]).optional(),\n })\n .passthrough()\n .optional()\n .describe(\"Circle paint properties\"),\n layout: z\n .object({})\n .passthrough()\n .optional()\n .describe(\"Circle layout properties\"),\n}).passthrough();\n\n/** Inferred type for circle layer. */\nexport type CircleLayer = z.infer<typeof CircleLayerSchema>;\n\n/**\n * Line layer for linear features.\n *\n * @remarks\n * Renders lines from LineString or Polygon geometries.\n * Supports dash patterns, gradients, and data-driven styling.\n *\n * @example Basic Line\n * ```yaml\n * - id: roads\n * type: line\n * source:\n * type: geojson\n * url: \"https://example.com/roads.geojson\"\n * paint:\n * line-color: \"#333333\"\n * line-width: 2\n * ```\n *\n * @example Dashed Line\n * ```yaml\n * paint:\n * line-color: \"#0000ff\"\n * line-width: 3\n * line-dasharray: [2, 1]\n * ```\n *\n * @see {@link https://maplibre.org/maplibre-style-spec/layers/#line | MapLibre Line Layer}\n */\nexport const LineLayerSchema = BaseLayerPropertiesSchema.extend({\n type: z.literal(\"line\").describe(\"Layer type\"),\n paint: z\n .object({\n \"line-opacity\": NumberOrExpressionSchema.optional(),\n \"line-color\": ColorOrExpressionSchema.optional(),\n \"line-width\": NumberOrExpressionSchema.optional(),\n \"line-gap-width\": NumberOrExpressionSchema.optional(),\n \"line-offset\": NumberOrExpressionSchema.optional(),\n \"line-blur\": NumberOrExpressionSchema.optional(),\n \"line-dasharray\": z.array(z.number()).optional(),\n \"line-pattern\": z.string().optional(),\n \"line-gradient\": ColorOrExpressionSchema.optional(),\n \"line-translate\": z.tuple([z.number(), z.number()]).optional(),\n \"line-translate-anchor\": z.enum([\"map\", \"viewport\"]).optional(),\n })\n .passthrough()\n .optional()\n .describe(\"Line paint properties\"),\n layout: z\n .object({\n \"line-cap\": z.enum([\"butt\", \"round\", \"square\"]).optional(),\n \"line-join\": z.enum([\"bevel\", \"round\", \"miter\"]).optional(),\n \"line-miter-limit\": z.number().optional(),\n \"line-round-limit\": z.number().optional(),\n \"line-sort-key\": NumberOrExpressionSchema.optional(),\n })\n .passthrough()\n .optional()\n .describe(\"Line layout properties\"),\n}).passthrough();\n\n/** Inferred type for line layer. */\nexport type LineLayer = z.infer<typeof LineLayerSchema>;\n\n/**\n * Fill layer for polygon data.\n *\n * @remarks\n * Renders filled polygons with optional outlines.\n *\n * @example Basic Fill\n * ```yaml\n * - id: parks\n * type: fill\n * source:\n * type: geojson\n * url: \"https://example.com/parks.geojson\"\n * paint:\n * fill-color: \"#228B22\"\n * fill-opacity: 0.5\n * fill-outline-color: \"#006400\"\n * ```\n *\n * @see {@link https://maplibre.org/maplibre-style-spec/layers/#fill | MapLibre Fill Layer}\n */\nexport const FillLayerSchema = BaseLayerPropertiesSchema.extend({\n type: z.literal(\"fill\").describe(\"Layer type\"),\n paint: z\n .object({\n \"fill-antialias\": z.boolean().optional(),\n \"fill-opacity\": NumberOrExpressionSchema.optional(),\n \"fill-color\": ColorOrExpressionSchema.optional(),\n \"fill-outline-color\": ColorOrExpressionSchema.optional(),\n \"fill-translate\": z.tuple([z.number(), z.number()]).optional(),\n \"fill-translate-anchor\": z.enum([\"map\", \"viewport\"]).optional(),\n \"fill-pattern\": z.string().optional(),\n })\n .passthrough()\n .optional()\n .describe(\"Fill paint properties\"),\n layout: z\n .object({\n \"fill-sort-key\": NumberOrExpressionSchema.optional(),\n })\n .passthrough()\n .optional()\n .describe(\"Fill layout properties\"),\n}).passthrough();\n\n/** Inferred type for fill layer. */\nexport type FillLayer = z.infer<typeof FillLayerSchema>;\n\n/**\n * Symbol layer for icons and text.\n *\n * @remarks\n * Renders icons, text labels, or both. Most complex layer type with\n * extensive styling options for typography and icon placement.\n *\n * @example Icon\n * ```yaml\n * - id: markers\n * type: symbol\n * source:\n * type: geojson\n * url: \"https://example.com/markers.geojson\"\n * layout:\n * icon-image: \"marker-15\"\n * icon-size: 1.5\n * ```\n *\n * @example Text Label\n * ```yaml\n * layout:\n * text-field: [\"get\", \"name\"]\n * text-size: 12\n * text-anchor: top\n * paint:\n * text-color: \"#000000\"\n * text-halo-color: \"#ffffff\"\n * text-halo-width: 2\n * ```\n *\n * @see {@link https://maplibre.org/maplibre-style-spec/layers/#symbol | MapLibre Symbol Layer}\n */\nexport const SymbolLayerSchema = BaseLayerPropertiesSchema.extend({\n type: z.literal(\"symbol\").describe(\"Layer type\"),\n layout: z\n .object({\n \"symbol-placement\": z.enum([\"point\", \"line\", \"line-center\"]).optional(),\n \"symbol-spacing\": z.number().optional(),\n \"symbol-avoid-edges\": z.boolean().optional(),\n \"symbol-sort-key\": NumberOrExpressionSchema.optional(),\n \"symbol-z-order\": z.enum([\"auto\", \"viewport-y\", \"source\"]).optional(),\n \"icon-allow-overlap\": z.boolean().optional(),\n \"icon-ignore-placement\": z.boolean().optional(),\n \"icon-optional\": z.boolean().optional(),\n \"icon-rotation-alignment\": z.enum([\"map\", \"viewport\", \"auto\"]).optional(),\n \"icon-size\": NumberOrExpressionSchema.optional(),\n \"icon-text-fit\": z.enum([\"none\", \"width\", \"height\", \"both\"]).optional(),\n \"icon-text-fit-padding\": z\n .tuple([z.number(), z.number(), z.number(), z.number()])\n .optional(),\n \"icon-image\": z.union([z.string(), ExpressionSchema]).optional(),\n \"icon-rotate\": NumberOrExpressionSchema.optional(),\n \"icon-padding\": z.number().optional(),\n \"icon-keep-upright\": z.boolean().optional(),\n \"icon-offset\": z.tuple([z.number(), z.number()]).optional(),\n \"icon-anchor\": z\n .enum([\n \"center\",\n \"left\",\n \"right\",\n \"top\",\n \"bottom\",\n \"top-left\",\n \"top-right\",\n \"bottom-left\",\n \"bottom-right\",\n ])\n .optional(),\n \"icon-pitch-alignment\": z.enum([\"map\", \"viewport\", \"auto\"]).optional(),\n \"text-pitch-alignment\": z.enum([\"map\", \"viewport\", \"auto\"]).optional(),\n \"text-rotation-alignment\": z.enum([\"map\", \"viewport\", \"auto\"]).optional(),\n \"text-field\": z.union([z.string(), ExpressionSchema]).optional(),\n \"text-font\": z.array(z.string()).optional(),\n \"text-size\": NumberOrExpressionSchema.optional(),\n \"text-max-width\": NumberOrExpressionSchema.optional(),\n \"text-line-height\": z.number().optional(),\n \"text-letter-spacing\": z.number().optional(),\n \"text-justify\": z.enum([\"auto\", \"left\", \"center\", \"right\"]).optional(),\n \"text-radial-offset\": z.number().optional(),\n \"text-variable-anchor\": z\n .array(\n z.enum([\n \"center\",\n \"left\",\n \"right\",\n \"top\",\n \"bottom\",\n \"top-left\",\n \"top-right\",\n \"bottom-left\",\n \"bottom-right\",\n ])\n )\n .optional(),\n \"text-anchor\": z\n .enum([\n \"center\",\n \"left\",\n \"right\",\n \"top\",\n \"bottom\",\n \"top-left\",\n \"top-right\",\n \"bottom-left\",\n \"bottom-right\",\n ])\n .optional(),\n \"text-max-angle\": z.number().optional(),\n \"text-rotate\": NumberOrExpressionSchema.optional(),\n \"text-padding\": z.number().optional(),\n \"text-keep-upright\": z.boolean().optional(),\n \"text-transform\": z.enum([\"none\", \"uppercase\", \"lowercase\"]).optional(),\n \"text-offset\": z.tuple([z.number(), z.number()]).optional(),\n \"text-allow-overlap\": z.boolean().optional(),\n \"text-ignore-placement\": z.boolean().optional(),\n \"text-optional\": z.boolean().optional(),\n })\n .passthrough()\n .optional()\n .describe(\"Symbol layout properties\"),\n paint: z\n .object({\n \"icon-opacity\": NumberOrExpressionSchema.optional(),\n \"icon-color\": ColorOrExpressionSchema.optional(),\n \"icon-halo-color\": ColorOrExpressionSchema.optional(),\n \"icon-halo-width\": NumberOrExpressionSchema.optional(),\n \"icon-halo-blur\": NumberOrExpressionSchema.optional(),\n \"icon-translate\": z.tuple([z.number(), z.number()]).optional(),\n \"icon-translate-anchor\": z.enum([\"map\", \"viewport\"]).optional(),\n \"text-opacity\": NumberOrExpressionSchema.optional(),\n \"text-color\": ColorOrExpressionSchema.optional(),\n \"text-halo-color\": ColorOrExpressionSchema.optional(),\n \"text-halo-width\": NumberOrExpressionSchema.optional(),\n \"text-halo-blur\": NumberOrExpressionSchema.optional(),\n \"text-translate\": z.tuple([z.number(), z.number()]).optional(),\n \"text-translate-anchor\": z.enum([\"map\", \"viewport\"]).optional(),\n })\n .passthrough()\n .optional()\n .describe(\"Symbol paint properties\"),\n}).passthrough();\n\n/** Inferred type for symbol layer. */\nexport type SymbolLayer = z.infer<typeof SymbolLayerSchema>;\n\n/**\n * Raster layer for raster tiles or images.\n *\n * @remarks\n * Renders raster imagery with opacity and blending controls.\n *\n * @example\n * ```yaml\n * - id: satellite\n * type: raster\n * source:\n * type: raster\n * tiles: [\"https://tile.example.com/{z}/{x}/{y}.png\"]\n * paint:\n * raster-opacity: 0.8\n * ```\n *\n * @see {@link https://maplibre.org/maplibre-style-spec/layers/#raster | MapLibre Raster Layer}\n */\nexport const RasterLayerSchema = BaseLayerPropertiesSchema.extend({\n type: z.literal(\"raster\").describe(\"Layer type\"),\n paint: z\n .object({\n \"raster-opacity\": NumberOrExpressionSchema.optional(),\n \"raster-hue-rotate\": NumberOrExpressionSchema.optional(),\n \"raster-brightness-min\": NumberOrExpressionSchema.optional(),\n \"raster-brightness-max\": NumberOrExpressionSchema.optional(),\n \"raster-saturation\": NumberOrExpressionSchema.optional(),\n \"raster-contrast\": NumberOrExpressionSchema.optional(),\n \"raster-resampling\": z.enum([\"linear\", \"nearest\"]).optional(),\n \"raster-fade-duration\": z.number().optional(),\n })\n .passthrough()\n .optional()\n .describe(\"Raster paint properties\"),\n layout: z\n .object({})\n .passthrough()\n .optional()\n .describe(\"Raster layout properties\"),\n}).passthrough();\n\n/** Inferred type for raster layer. */\nexport type RasterLayer = z.infer<typeof RasterLayerSchema>;\n\n/**\n * Fill extrusion layer for 3D buildings and structures.\n *\n * @remarks\n * Renders filled polygons extruded in 3D space.\n *\n * @example 3D Buildings\n * ```yaml\n * - id: buildings\n * type: fill-extrusion\n * source:\n * type: vector\n * url: \"https://example.com/buildings.json\"\n * source-layer: buildings\n * paint:\n * fill-extrusion-color: \"#aaaaaa\"\n * fill-extrusion-height: [\"get\", \"height\"]\n * fill-extrusion-base: [\"get\", \"min_height\"]\n * fill-extrusion-opacity: 0.8\n * ```\n *\n * @see {@link https://maplibre.org/maplibre-style-spec/layers/#fill-extrusion | MapLibre Fill Extrusion Layer}\n */\nexport const FillExtrusionLayerSchema = BaseLayerPropertiesSchema.extend({\n type: z.literal(\"fill-extrusion\").describe(\"Layer type\"),\n paint: z\n .object({\n \"fill-extrusion-opacity\": NumberOrExpressionSchema.optional(),\n \"fill-extrusion-color\": ColorOrExpressionSchema.optional(),\n \"fill-extrusion-translate\": z.tuple([z.number(), z.number()]).optional(),\n \"fill-extrusion-translate-anchor\": z.enum([\"map\", \"viewport\"]).optional(),\n \"fill-extrusion-pattern\": z.string().optional(),\n \"fill-extrusion-height\": NumberOrExpressionSchema.optional(),\n \"fill-extrusion-base\": NumberOrExpressionSchema.optional(),\n \"fill-extrusion-vertical-gradient\": z.boolean().optional(),\n })\n .passthrough()\n .optional()\n .describe(\"Fill extrusion paint properties\"),\n layout: z\n .object({})\n .passthrough()\n .optional()\n .describe(\"Fill extrusion layout properties\"),\n}).passthrough();\n\n/** Inferred type for fill extrusion layer. */\nexport type FillExtrusionLayer = z.infer<typeof FillExtrusionLayerSchema>;\n\n/**\n * Heatmap layer for point density visualization.\n *\n * @remarks\n * Renders point data as a smooth heatmap with color gradients.\n *\n * @example\n * ```yaml\n * - id: earthquakes-heat\n * type: heatmap\n * source:\n * type: geojson\n * url: \"https://example.com/earthquakes.geojson\"\n * paint:\n * heatmap-intensity: 1\n * heatmap-radius: 20\n * heatmap-color:\n * - interpolate\n * - [\"linear\"]\n * - [\"heatmap-density\"]\n * - 0\n * - \"rgba(0,0,255,0)\"\n * - 0.5\n * - \"yellow\"\n * - 1\n * - \"red\"\n * ```\n *\n * @see {@link https://maplibre.org/maplibre-style-spec/layers/#heatmap | MapLibre Heatmap Layer}\n */\nexport const HeatmapLayerSchema = BaseLayerPropertiesSchema.extend({\n type: z.literal(\"heatmap\").describe(\"Layer type\"),\n paint: z\n .object({\n \"heatmap-radius\": NumberOrExpressionSchema.optional(),\n \"heatmap-weight\": NumberOrExpressionSchema.optional(),\n \"heatmap-intensity\": NumberOrExpressionSchema.optional(),\n \"heatmap-color\": ColorOrExpressionSchema.optional(),\n \"heatmap-opacity\": NumberOrExpressionSchema.optional(),\n })\n .passthrough()\n .optional()\n .describe(\"Heatmap paint properties\"),\n layout: z\n .object({})\n .passthrough()\n .optional()\n .describe(\"Heatmap layout properties\"),\n}).passthrough();\n\n/** Inferred type for heatmap layer. */\nexport type HeatmapLayer = z.infer<typeof HeatmapLayerSchema>;\n\n/**\n * Hillshade layer for terrain visualization.\n *\n * @remarks\n * Renders raster DEM data as hillshading.\n *\n * @example\n * ```yaml\n * - id: hillshade\n * type: hillshade\n * source:\n * type: raster-dem\n * url: \"https://example.com/terrain.json\"\n * paint:\n * hillshade-illumination-direction: 315\n * hillshade-exaggeration: 0.5\n * ```\n *\n * @see {@link https://maplibre.org/maplibre-style-spec/layers/#hillshade | MapLibre Hillshade Layer}\n */\nexport const HillshadeLayerSchema = BaseLayerPropertiesSchema.extend({\n type: z.literal(\"hillshade\").describe(\"Layer type\"),\n paint: z\n .object({\n \"hillshade-illumination-direction\": z.number().optional(),\n \"hillshade-illumination-anchor\": z.enum([\"map\", \"viewport\"]).optional(),\n \"hillshade-exaggeration\": NumberOrExpressionSchema.optional(),\n \"hillshade-shadow-color\": ColorOrExpressionSchema.optional(),\n \"hillshade-highlight-color\": ColorOrExpressionSchema.optional(),\n \"hillshade-accent-color\": ColorOrExpressionSchema.optional(),\n })\n .passthrough()\n .optional()\n .describe(\"Hillshade paint properties\"),\n layout: z\n .object({})\n .passthrough()\n .optional()\n .describe(\"Hillshade layout properties\"),\n}).passthrough();\n\n/** Inferred type for hillshade layer. */\nexport type HillshadeLayer = z.infer<typeof HillshadeLayerSchema>;\n\n/**\n * Background layer for solid color backgrounds.\n *\n * @remarks\n * Renders a solid color or pattern as the map background.\n * Only one background layer is typically used per style.\n *\n * @example\n * ```yaml\n * - id: background\n * type: background\n * paint:\n * background-color: \"#f0f0f0\"\n * ```\n *\n * @see {@link https://maplibre.org/maplibre-style-spec/layers/#background | MapLibre Background Layer}\n */\nexport const BackgroundLayerSchema = z\n .object({\n id: z.string().describe(\"Unique layer identifier\"),\n type: z.literal(\"background\").describe(\"Layer type\"),\n paint: z\n .object({\n \"background-color\": ColorOrExpressionSchema.optional(),\n \"background-pattern\": z.string().optional(),\n \"background-opacity\": NumberOrExpressionSchema.optional(),\n })\n .passthrough()\n .optional()\n .describe(\"Background paint properties\"),\n layout: z\n .object({})\n .passthrough()\n .optional()\n .describe(\"Background layout properties\"),\n metadata: z.record(z.any()).optional().describe(\"Custom metadata\"),\n })\n .passthrough();\n\n/** Inferred type for background layer. */\nexport type BackgroundLayer = z.infer<typeof BackgroundLayerSchema>;\n\n/**\n * Union of all layer types.\n *\n * @remarks\n * Use the `type` field to determine which layer type is being used.\n *\n * @example\n * ```typescript\n * const layer: Layer = {\n * id: 'my-layer',\n * type: 'circle',\n * source: { type: 'geojson', url: '...' },\n * paint: { 'circle-radius': 8 }\n * };\n * ```\n */\nexport const LayerSchema = z.union([\n CircleLayerSchema,\n LineLayerSchema,\n FillLayerSchema,\n SymbolLayerSchema,\n RasterLayerSchema,\n FillExtrusionLayerSchema,\n HeatmapLayerSchema,\n HillshadeLayerSchema,\n BackgroundLayerSchema,\n]);\n\n/** Inferred type for any layer. */\nexport type Layer = z.infer<typeof LayerSchema>;\n\n/**\n * Layer reference for reusing global layer definitions.\n *\n * @remarks\n * References a layer defined in the global `layers` object using\n * JSON Pointer-like syntax: `#/layers/layerName`\n *\n * @example\n * ```yaml\n * # Global definition\n * layers:\n * bikeLayer:\n * id: bikes\n * type: line\n * # ...\n *\n * # Reference in map\n * pages:\n * - blocks:\n * - layers:\n * - $ref: \"#/layers/bikeLayer\"\n * ```\n */\nexport const LayerReferenceSchema = z\n .object({\n $ref: z\n .string()\n .describe('Reference to global layer (e.g., \"#/layers/bikeLayer\")'),\n })\n .describe(\"Layer reference\");\n\n/** Inferred type for layer reference. */\nexport type LayerReference = z.infer<typeof LayerReferenceSchema>;\n\n/**\n * Union of layer or layer reference.\n *\n * @remarks\n * Layers can be defined inline or referenced from global definitions.\n */\nexport const LayerOrReferenceSchema = z.union([\n LayerSchema,\n LayerReferenceSchema,\n]);\n\n/** Inferred type for layer or reference. */\nexport type LayerOrReference = z.infer<typeof LayerOrReferenceSchema>;\n","/**\n * @file Map block schemas for maplibre-yaml\n * @module @maplibre-yaml/core/schemas/map\n *\n * @description\n * Zod schemas for map configuration, controls, legends, and map blocks.\n *\n * @example\n * ```typescript\n * import { MapConfigSchema, MapBlockSchema } from '@maplibre-yaml/core/schemas';\n * ```\n */\n\nimport { z } from \"zod\";\nimport {\n LngLatSchema,\n LngLatBoundsSchema,\n ZoomLevelSchema,\n} from \"./base.schema\";\nimport { LayerOrReferenceSchema } from \"./layer.schema\";\n\n/**\n * Control position on the map.\n *\n * @remarks\n * Controls can be positioned in any of the four corners.\n */\nexport const ControlPositionSchema = z.enum([\n \"top-left\",\n \"top-right\",\n \"bottom-left\",\n \"bottom-right\",\n]);\n\n/** Inferred type for control position. */\nexport type ControlPosition = z.infer<typeof ControlPositionSchema>;\n\n/**\n * Individual control configuration.\n *\n * @remarks\n * Can be a boolean (uses default position) or an object with position.\n */\nconst ControlConfigSchema = z.union([\n z.boolean(),\n z.object({\n enabled: z.boolean().describe(\"Whether control is enabled\"),\n position: ControlPositionSchema.optional().describe(\"Control position\"),\n }),\n]);\n\n/**\n * Map controls configuration.\n *\n * @remarks\n * Configure which controls are displayed and their positions.\n *\n * **Available Controls:**\n * - `navigation` - Zoom and rotation controls (default: top-right)\n * - `geolocate` - User geolocation (default: top-right)\n * - `scale` - Distance scale (default: bottom-left)\n * - `fullscreen` - Fullscreen toggle (default: top-right)\n * - `attribution` - Attribution text (default: bottom-right)\n *\n * @example Enable All Controls\n * ```yaml\n * controls:\n * navigation: true\n * geolocate: true\n * scale: true\n * fullscreen: true\n * ```\n *\n * @example Custom Positions\n * ```yaml\n * controls:\n * navigation:\n * enabled: true\n * position: top-left\n * scale:\n * enabled: true\n * position: bottom-right\n * ```\n */\nexport const ControlsConfigSchema = z\n .object({\n navigation: ControlConfigSchema.optional().describe(\n \"Navigation controls (zoom, rotation)\"\n ),\n geolocate: ControlConfigSchema.optional().describe(\"Geolocation control\"),\n scale: ControlConfigSchema.optional().describe(\"Scale control\"),\n fullscreen: ControlConfigSchema.optional().describe(\"Fullscreen control\"),\n attribution: ControlConfigSchema.optional().describe(\"Attribution control\"),\n })\n .describe(\"Map controls configuration\");\n\n/** Inferred type for controls config. */\nexport type ControlsConfig = z.infer<typeof ControlsConfigSchema>;\n\n/**\n * Legend configuration.\n *\n * @remarks\n * The legend displays layer information and can be positioned anywhere.\n * If `items` is not provided, legend items are automatically extracted\n * from layers with `legend` configuration.\n *\n * @example Automatic Legend\n * ```yaml\n * legend:\n * title: \"Map Legend\"\n * position: top-left\n * ```\n *\n * @example Custom Legend Items\n * ```yaml\n * legend:\n * title: \"Features\"\n * position: top-left\n * collapsed: false\n * items:\n * - color: \"#ff0000\"\n * label: \"High Priority\"\n * shape: circle\n * - color: \"#00ff00\"\n * label: \"Low Priority\"\n * shape: circle\n * ```\n */\nexport const LegendConfigSchema = z\n .object({\n position:\n ControlPositionSchema.default(\"top-left\").describe(\"Legend position\"),\n title: z.string().optional().describe(\"Legend title\"),\n collapsed: z.boolean().default(false).describe(\"Start collapsed\"),\n items: z\n .array(\n z.object({\n color: z.string().describe(\"Item color\"),\n label: z.string().describe(\"Item label\"),\n shape: z\n .enum([\"circle\", \"square\", \"line\", \"icon\"])\n .default(\"square\")\n .describe(\"Symbol shape\"),\n icon: z\n .string()\n .optional()\n .describe(\"Icon name/URL (for shape: icon)\"),\n })\n )\n .optional()\n .describe(\"Custom legend items (overrides layer legends)\"),\n })\n .describe(\"Legend configuration\");\n\n/** Inferred type for legend config. */\nexport type LegendConfig = z.infer<typeof LegendConfigSchema>;\n\n/**\n * Map configuration with MapLibre options.\n *\n * @remarks\n * Core map configuration including initial view, style, and interaction settings.\n * Uses `.passthrough()` to allow any MapLibre GL JS options.\n *\n * **Required:**\n * - `center` - Initial map center [lng, lat]\n * - `zoom` - Initial zoom level (0-24)\n * - `mapStyle` - MapLibre style URL or object\n *\n * **View Options:**\n * - `pitch` - Camera tilt angle (0-85)\n * - `bearing` - Camera rotation (0-360)\n * - `bounds` - Fit to bounds\n * - `minZoom`, `maxZoom` - Zoom constraints\n * - `minPitch`, `maxPitch` - Pitch constraints\n * - `maxBounds` - Geographic bounds constraint\n *\n * **Interaction:**\n * - `interactive` - Enable/disable all interactions\n * - `scrollZoom`, `boxZoom`, `dragRotate`, `dragPan` - Individual controls\n * - `keyboard`, `doubleClickZoom`, `touchZoomRotate`, `touchPitch`\n *\n * @example Basic Map\n * ```yaml\n * config:\n * center: [-74.006, 40.7128]\n * zoom: 12\n * mapStyle: \"https://demotiles.maplibre.org/style.json\"\n * ```\n *\n * @example 3D View\n * ```yaml\n * config:\n * center: [-122.4194, 37.7749]\n * zoom: 15\n * pitch: 60\n * bearing: 30\n * mapStyle: \"https://demotiles.maplibre.org/style.json\"\n * ```\n *\n * @example Constrained Map\n * ```yaml\n * config:\n * center: [-74.006, 40.7128]\n * zoom: 12\n * minZoom: 8\n * maxZoom: 18\n * maxBounds: [-74.3, 40.5, -73.7, 40.9]\n * mapStyle: \"https://demotiles.maplibre.org/style.json\"\n * ```\n *\n * @example Non-Interactive Map\n * ```yaml\n * config:\n * center: [-74.006, 40.7128]\n * zoom: 12\n * interactive: false\n * mapStyle: \"https://demotiles.maplibre.org/style.json\"\n * ```\n *\n * @see {@link https://maplibre.org/maplibre-gl-js/docs/API/type-aliases/MapOptions/ | MapLibre Map Options}\n */\nexport const MapConfigSchema = z\n .object({\n // Required\n center: LngLatSchema.describe(\"Initial map center [longitude, latitude]\"),\n zoom: ZoomLevelSchema.describe(\"Initial zoom level (0-24)\"),\n mapStyle: z\n .union([z.string().url(), z.any()])\n .describe(\"MapLibre style URL or style object\"),\n\n // View\n pitch: z\n .number()\n .min(0)\n .max(85)\n .default(0)\n .describe(\"Camera pitch angle in degrees (0-85)\"),\n bearing: z\n .number()\n .min(-180)\n .max(180)\n .default(0)\n .describe(\"Camera bearing (rotation) in degrees (-180 to 180)\"),\n bounds: z\n .union([LngLatBoundsSchema, z.array(z.number())])\n .optional()\n .describe(\"Fit map to bounds\"),\n\n // Constraints\n minZoom: ZoomLevelSchema.optional().describe(\"Minimum zoom level\"),\n maxZoom: ZoomLevelSchema.optional().describe(\"Maximum zoom level\"),\n minPitch: z.number().min(0).max(85).optional().describe(\"Minimum pitch\"),\n maxPitch: z.number().min(0).max(85).optional().describe(\"Maximum pitch\"),\n maxBounds: LngLatBoundsSchema.optional().describe(\n \"Maximum geographic bounds\"\n ),\n\n // Interaction\n interactive: z.boolean().default(true).describe(\"Enable map interaction\"),\n scrollZoom: z.boolean().optional().describe(\"Enable scroll to zoom\"),\n boxZoom: z.boolean().optional().describe(\"Enable box zoom (shift+drag)\"),\n dragRotate: z.boolean().optional().describe(\"Enable drag to rotate\"),\n dragPan: z.boolean().optional().describe(\"Enable drag to pan\"),\n keyboard: z.boolean().optional().describe(\"Enable keyboard shortcuts\"),\n doubleClickZoom: z\n .boolean()\n .optional()\n .describe(\"Enable double-click zoom\"),\n touchZoomRotate: z\n .boolean()\n .optional()\n .describe(\"Enable touch zoom/rotate\"),\n touchPitch: z.boolean().optional().describe(\"Enable touch pitch\"),\n\n // Display\n hash: z.boolean().optional().describe(\"Sync map state with URL hash\"),\n attributionControl: z\n .boolean()\n .optional()\n .describe(\"Show attribution control\"),\n logoPosition: ControlPositionSchema.optional().describe(\n \"MapLibre logo position\"\n ),\n fadeDuration: z\n .number()\n .optional()\n .describe(\"Fade duration in milliseconds\"),\n crossSourceCollisions: z\n .boolean()\n .optional()\n .describe(\"Check for cross-source collisions\"),\n\n // Rendering\n antialias: z.boolean().optional().describe(\"Enable antialiasing\"),\n refreshExpiredTiles: z\n .boolean()\n .optional()\n .describe(\"Refresh expired tiles\"),\n renderWorldCopies: z\n .boolean()\n .optional()\n .describe(\"Render multiple world copies\"),\n locale: z.record(z.string()).optional().describe(\"Localization strings\"),\n\n // Performance\n maxTileCacheSize: z.number().optional().describe(\"Maximum tiles to cache\"),\n localIdeographFontFamily: z\n .string()\n .optional()\n .describe(\"Font for CJK characters\"),\n trackResize: z.boolean().optional().describe(\"Track container resize\"),\n preserveDrawingBuffer: z\n .boolean()\n .optional()\n .describe(\"Preserve drawing buffer\"),\n failIfMajorPerformanceCaveat: z\n .boolean()\n .optional()\n .describe(\"Fail if major performance caveat\"),\n })\n .passthrough()\n .describe(\"Map configuration with MapLibre options\");\n\n/** Inferred type for map config. */\nexport type MapConfig = z.infer<typeof MapConfigSchema>;\n\n/**\n * Standard map block.\n *\n * @remarks\n * Creates a map within a page layout. Can be sized using CSS via\n * `className` and `style` properties.\n *\n * @example Basic Map Block\n * ```yaml\n * - type: map\n * id: main-map\n * config:\n * center: [-74.006, 40.7128]\n * zoom: 12\n * mapStyle: \"https://demotiles.maplibre.org/style.json\"\n * layers:\n * - id: points\n * type: circle\n * source:\n * type: geojson\n * url: \"https://example.com/points.geojson\"\n * paint:\n * circle-radius: 8\n * circle-color: \"#ff0000\"\n * ```\n *\n * @example Map with Controls and Legend\n * ```yaml\n * - type: map\n * id: interactive-map\n * config:\n * center: [-74.006, 40.7128]\n * zoom: 12\n * mapStyle: \"https://demotiles.maplibre.org/style.json\"\n * layers:\n * - $ref: \"#/layers/bikeLayer\"\n * - $ref: \"#/layers/parkLayer\"\n * controls:\n * navigation: true\n * scale: true\n * legend:\n * title: \"Map Features\"\n * position: top-left\n * ```\n *\n * @example Sized Map\n * ```yaml\n * - type: map\n * id: small-map\n * className: \"map-container\"\n * style: \"height: 400px; width: 100%;\"\n * config:\n * center: [0, 0]\n * zoom: 2\n * mapStyle: \"https://demotiles.maplibre.org/style.json\"\n * ```\n */\nexport const MapBlockSchema: z.ZodObject<any> = z\n .object({\n type: z.literal(\"map\").describe(\"Block type\"),\n id: z.string().describe(\"Unique block identifier\"),\n className: z.string().optional().describe(\"CSS class name for container\"),\n style: z.string().optional().describe(\"Inline CSS styles for container\"),\n config: MapConfigSchema.describe(\"Map configuration\"),\n layers: z.array(LayerOrReferenceSchema).default([]).describe(\"Map layers\"),\n controls: ControlsConfigSchema.optional().describe(\"Map controls\"),\n legend: LegendConfigSchema.optional().describe(\"Legend configuration\"),\n })\n .describe(\"Standard map block\");\n\n/** Inferred type for map block. */\nexport type MapBlock = z.infer<typeof MapBlockSchema>;\n\n/**\n * Full-page map block.\n *\n * @remarks\n * Creates a map that fills the entire viewport. Automatically handles\n * viewport sizing and positioning. Ideal for map-focused pages.\n *\n * @example Full-Page Map\n * ```yaml\n * - type: map-fullpage\n * id: fullpage-map\n * config:\n * center: [-122.4194, 37.7749]\n * zoom: 13\n * pitch: 45\n * mapStyle: \"https://demotiles.maplibre.org/style.json\"\n * layers:\n * - id: buildings\n * type: fill-extrusion\n * source:\n * type: vector\n * url: \"https://example.com/buildings.json\"\n * source-layer: buildings\n * paint:\n * fill-extrusion-color: \"#aaa\"\n * fill-extrusion-height: [\"get\", \"height\"]\n * controls:\n * navigation: true\n * fullscreen: true\n * ```\n */\nexport const MapFullPageBlockSchema: z.ZodObject<any> = z\n .object({\n type: z.literal(\"map-fullpage\").describe(\"Block type\"),\n id: z.string().describe(\"Unique block identifier\"),\n className: z.string().optional().describe(\"CSS class name for container\"),\n style: z.string().optional().describe(\"Inline CSS styles for container\"),\n config: MapConfigSchema.describe(\"Map configuration\"),\n layers: z.array(LayerOrReferenceSchema).default([]).describe(\"Map layers\"),\n controls: ControlsConfigSchema.optional().describe(\"Map controls\"),\n legend: LegendConfigSchema.optional().describe(\"Legend configuration\"),\n })\n .describe(\"Full-page map block\");\n\n/** Inferred type for full-page map block. */\nexport type MapFullPageBlock = z.infer<typeof MapFullPageBlockSchema>;\n","/**\n * @file Scrollytelling schemas for maplibre-yaml\n * @module @maplibre-yaml/core/schemas/scrollytelling\n *\n * @description\n * Zod schemas for narrative scrollytelling maps with chapters, animations,\n * and layer transitions.\n *\n * @example\n * ```typescript\n * import { ScrollytellingBlockSchema, ChapterSchema } from '@maplibre-yaml/core/schemas';\n * ```\n */\n\nimport { z } from \"zod\";\nimport { LngLatSchema, ExpressionSchema } from \"./base.schema\";\nimport { MapConfigSchema } from \"./map.schema\";\nimport { LayerOrReferenceSchema } from \"./layer.schema\";\n\n/**\n * Chapter action for map state changes.\n *\n * @remarks\n * Actions are triggered when entering or exiting a chapter.\n * They can modify layer properties, filters, or trigger animations.\n *\n * **Action Types:**\n * - `setFilter` - Update layer filter\n * - `setPaintProperty` - Update layer paint property\n * - `setLayoutProperty` - Update layer layout property\n * - `flyTo` - Fly to location (handled by chapter config)\n * - `easeTo` - Ease to location (handled by chapter config)\n * - `fitBounds` - Fit to bounds\n * - `custom` - Custom action (handled by application)\n *\n * @example Set Filter\n * ```yaml\n * onChapterEnter:\n * - action: setFilter\n * layer: earthquakes\n * filter: [\">=\", [\"get\", \"magnitude\"], 5]\n * ```\n *\n * @example Set Paint Property\n * ```yaml\n * onChapterEnter:\n * - action: setPaintProperty\n * layer: buildings\n * property: fill-extrusion-height\n * value: [\"get\", \"height\"]\n * ```\n *\n * @example Fit Bounds\n * ```yaml\n * onChapterEnter:\n * - action: fitBounds\n * bounds: [-74.3, 40.5, -73.7, 40.9]\n * options:\n * padding: 50\n * duration: 1000\n * ```\n */\nexport const ChapterActionSchema = z\n .object({\n action: z\n .enum([\n \"setFilter\",\n \"setPaintProperty\",\n \"setLayoutProperty\",\n \"flyTo\",\n \"easeTo\",\n \"fitBounds\",\n \"custom\",\n ])\n .describe(\"Action type\"),\n layer: z.string().optional().describe(\"Target layer ID\"),\n property: z\n .string()\n .optional()\n .describe(\"Property name (for setPaintProperty/setLayoutProperty)\"),\n value: z.any().optional().describe(\"Property value\"),\n filter: ExpressionSchema.nullable()\n .optional()\n .describe(\"Filter expression (for setFilter, null to clear)\"),\n bounds: z\n .array(z.number())\n .optional()\n .describe(\"Bounds array (for fitBounds)\"),\n options: z.record(z.any()).optional().describe(\"Additional options\"),\n })\n .describe(\"Chapter action for map state changes\");\n\n/** Inferred type for chapter action. */\nexport type ChapterAction = z.infer<typeof ChapterActionSchema>;\n\n/**\n * Chapter layer visibility configuration.\n *\n * @remarks\n * Controls which layers are visible during this chapter.\n *\n * @example\n * ```yaml\n * layers:\n * show:\n * - earthquakes\n * - fault-lines\n * hide:\n * - buildings\n * ```\n */\nexport const ChapterLayersSchema = z\n .object({\n show: z.array(z.string()).default([]).describe(\"Layer IDs to show\"),\n hide: z.array(z.string()).default([]).describe(\"Layer IDs to hide\"),\n })\n .describe(\"Chapter layer visibility configuration\");\n\n/** Inferred type for chapter layers. */\nexport type ChapterLayers = z.infer<typeof ChapterLayersSchema>;\n\n/**\n * Scrollytelling chapter.\n *\n * @remarks\n * A chapter represents one section of the scrollytelling narrative.\n * As the user scrolls, the map transitions between chapters with\n * camera animations and layer changes.\n *\n * **Required:**\n * - `id` - Unique chapter identifier\n * - `title` - Chapter title\n * - `center` - Map center for this chapter\n * - `zoom` - Zoom level for this chapter\n *\n * **Content:**\n * - `description` - HTML description (supports markdown)\n * - `image` - Hero image URL\n * - `video` - Video URL\n *\n * **Camera:**\n * - `pitch` - Camera tilt (0-85)\n * - `bearing` - Camera rotation (-180 to 180)\n * - `animation` - Animation type (flyTo, easeTo, jumpTo)\n * - `speed`, `curve` - Animation parameters\n *\n * **Layout:**\n * - `alignment` - Content position (left, right, center, full)\n * - `hidden` - Hide chapter content (map-only)\n *\n * **Interactivity:**\n * - `layers` - Show/hide layers\n * - `onChapterEnter`, `onChapterExit` - Actions\n *\n * @example Basic Chapter\n * ```yaml\n * - id: intro\n * title: \"Welcome\"\n * description: \"This is the introduction.\"\n * center: [-74.006, 40.7128]\n * zoom: 12\n * ```\n *\n * @example Chapter with 3D View\n * ```yaml\n * - id: downtown\n * title: \"Downtown\"\n * description: \"Explore the city center in 3D.\"\n * center: [-74.006, 40.7128]\n * zoom: 16\n * pitch: 60\n * bearing: 30\n * ```\n *\n * @example Chapter with Media\n * ```yaml\n * - id: overview\n * title: \"City Overview\"\n * description: \"A bird's eye view of the city.\"\n * image: \"https://example.com/overview.jpg\"\n * center: [-74.006, 40.7128]\n * zoom: 10\n * ```\n *\n * @example Chapter with Layer Control\n * ```yaml\n * - id: earthquakes\n * title: \"Recent Earthquakes\"\n * description: \"Major earthquakes in the last month.\"\n * center: [-120, 35]\n * zoom: 6\n * layers:\n * show:\n * - earthquakes\n * - fault-lines\n * hide:\n * - cities\n * ```\n *\n * @example Chapter with Actions\n * ```yaml\n * - id: filtered\n * title: \"High Magnitude Events\"\n * center: [-120, 35]\n * zoom: 6\n * onChapterEnter:\n * - action: setFilter\n * layer: earthquakes\n * filter: [\">=\", [\"get\", \"magnitude\"], 5]\n * onChapterExit:\n * - action: setFilter\n * layer: earthquakes\n * filter: null\n * ```\n *\n * @example Full-Width Chapter\n * ```yaml\n * - id: fullwidth\n * title: \"Immersive View\"\n * alignment: full\n * center: [-74.006, 40.7128]\n * zoom: 14\n * pitch: 45\n * ```\n */\nexport const ChapterSchema = z\n .object({\n // Required\n id: z.string().describe(\"Unique chapter identifier\"),\n title: z.string().describe(\"Chapter title\"),\n center: LngLatSchema.describe(\"Map center [longitude, latitude]\"),\n zoom: z.number().describe(\"Zoom level\"),\n\n // Content\n description: z\n .string()\n .optional()\n .describe(\"Chapter description (HTML/markdown supported)\"),\n image: z.string().url().optional().describe(\"Hero image URL\"),\n video: z.string().url().optional().describe(\"Video URL\"),\n\n // Camera\n pitch: z\n .number()\n .min(0)\n .max(85)\n .default(0)\n .describe(\"Camera pitch angle (0-85)\"),\n bearing: z\n .number()\n .min(-180)\n .max(180)\n .default(0)\n .describe(\"Camera bearing (-180 to 180)\"),\n speed: z\n .number()\n .min(0)\n .max(2)\n .default(0.6)\n .describe(\"Animation speed multiplier (0-2)\"),\n curve: z\n .number()\n .min(0)\n .max(2)\n .default(1)\n .describe(\"Animation curve (0=linear, 1=default, 2=steep)\"),\n animation: z\n .enum([\"flyTo\", \"easeTo\", \"jumpTo\"])\n .default(\"flyTo\")\n .describe(\"Animation type\"),\n\n // Rotation animation\n rotateAnimation: z\n .boolean()\n .optional()\n .describe(\"Enable continuous rotation animation\"),\n spinGlobe: z\n .boolean()\n .optional()\n .describe(\"Spin globe animation (for low zoom levels)\"),\n\n // Layout\n alignment: z\n .enum([\"left\", \"right\", \"center\", \"full\"])\n .default(\"center\")\n .describe(\"Content alignment\"),\n hidden: z\n .boolean()\n .default(false)\n .describe(\"Hide chapter content (map-only)\"),\n\n // Layers\n layers: ChapterLayersSchema.optional().describe(\"Layer visibility control\"),\n\n // Actions\n onChapterEnter: z\n .array(ChapterActionSchema)\n .default([])\n .describe(\"Actions when entering chapter\"),\n onChapterExit: z\n .array(ChapterActionSchema)\n .default([])\n .describe(\"Actions when exiting chapter\"),\n\n // Custom\n callback: z.string().optional().describe(\"Custom callback function name\"),\n })\n .describe(\"Scrollytelling chapter\");\n\n/** Inferred type for chapter. */\nexport type Chapter = z.infer<typeof ChapterSchema>;\n\n/**\n * Scrollytelling block for narrative map stories.\n *\n * @remarks\n * Creates an immersive scrollytelling experience where the map\n * transitions between chapters as the user scrolls through content.\n *\n * **Features:**\n * - Smooth camera transitions\n * - Layer show/hide animations\n * - Dynamic property updates\n * - Chapter-based narrative structure\n * - Customizable themes and markers\n *\n * **Structure:**\n * 1. Base map configuration (persistent)\n * 2. Persistent layers (visible throughout)\n * 3. Chapters (individual story sections)\n * 4. Optional footer\n *\n * @example Basic Scrollytelling\n * ```yaml\n * - type: scrollytelling\n * id: story\n * config:\n * center: [-74.006, 40.7128]\n * zoom: 12\n * mapStyle: \"https://demotiles.maplibre.org/style.json\"\n * chapters:\n * - id: intro\n * title: \"Introduction\"\n * description: \"Welcome to our story.\"\n * center: [-74.006, 40.7128]\n * zoom: 12\n * - id: detail\n * title: \"A Closer Look\"\n * description: \"Let's zoom in.\"\n * center: [-74.006, 40.7128]\n * zoom: 16\n * ```\n *\n * @example Themed Scrollytelling\n * ```yaml\n * - type: scrollytelling\n * id: dark-story\n * theme: dark\n * showMarkers: true\n * markerColor: \"#ff0000\"\n * config:\n * center: [0, 0]\n * zoom: 2\n * mapStyle: \"https://demotiles.maplibre.org/style.json\"\n * chapters:\n * - id: chapter1\n * title: \"Chapter 1\"\n * center: [0, 0]\n * zoom: 3\n * ```\n *\n * @example With Persistent Layers\n * ```yaml\n * - type: scrollytelling\n * id: earthquake-story\n * config:\n * center: [-120, 35]\n * zoom: 5\n * mapStyle: \"https://demotiles.maplibre.org/style.json\"\n * layers:\n * - id: base-layer\n * type: circle\n * source:\n * type: geojson\n * url: \"https://example.com/data.geojson\"\n * paint:\n * circle-radius: 6\n * circle-color: \"#888888\"\n * chapters:\n * - id: overview\n * title: \"Overview\"\n * center: [-120, 35]\n * zoom: 5\n * - id: detail\n * title: \"Major Event\"\n * center: [-118, 34]\n * zoom: 10\n * layers:\n * show:\n * - base-layer\n * ```\n *\n * @example With Footer\n * ```yaml\n * - type: scrollytelling\n * id: story\n * config:\n * center: [0, 0]\n * zoom: 2\n * mapStyle: \"https://demotiles.maplibre.org/style.json\"\n * chapters:\n * - id: chapter1\n * title: \"Chapter 1\"\n * center: [0, 0]\n * zoom: 3\n * footer: |\n * <p>Data sources: ...</p>\n * <p>Created with maplibre-yaml</p>\n * ```\n */\nexport const ScrollytellingBlockSchema: z.ZodObject<any> = z\n .object({\n type: z.literal(\"scrollytelling\").describe(\"Block type\"),\n id: z.string().describe(\"Unique block identifier\"),\n className: z.string().optional().describe(\"CSS class name for container\"),\n style: z.string().optional().describe(\"Inline CSS styles for container\"),\n\n // Base config\n config: MapConfigSchema.describe(\"Base map configuration\"),\n\n // Theme\n theme: z.enum([\"light\", \"dark\"]).default(\"light\").describe(\"Visual theme\"),\n\n // Markers\n showMarkers: z\n .boolean()\n .default(false)\n .describe(\"Show chapter markers on map\"),\n markerColor: z.string().default(\"#3FB1CE\").describe(\"Chapter marker color\"),\n\n // Layers (persistent across all chapters)\n layers: z\n .array(LayerOrReferenceSchema)\n .default([])\n .describe(\"Persistent layers (visible throughout story)\"),\n\n // Chapters\n chapters: z\n .array(ChapterSchema)\n .min(1, \"At least one chapter is required for scrollytelling\")\n .describe(\"Story chapters\"),\n\n // Footer\n footer: z.string().optional().describe(\"Footer content (HTML)\"),\n })\n .describe(\"Scrollytelling block for narrative map stories\");\n\n/** Inferred type for scrollytelling block. */\nexport type ScrollytellingBlock = z.infer<typeof ScrollytellingBlockSchema>;\n","/**\n * @file Page and root configuration schemas for maplibre-yaml\n * @module @maplibre-yaml/core/schemas/page\n *\n * @description\n * Zod schemas for pages, global configuration, and the root schema.\n * Includes recursive MixedBlock for complex layouts.\n *\n * @example\n * ```typescript\n * import { RootSchema, PageSchema } from '@maplibre-yaml/core/schemas';\n * ```\n */\n\nimport { z } from \"zod\";\nimport { ContentBlockSchema } from \"./content.schema\";\nimport { MapBlockSchema, MapFullPageBlockSchema } from \"./map.schema\";\nimport { ScrollytellingBlockSchema } from \"./scrollytelling.schema\";\nimport { LayerSchema } from \"./layer.schema\";\nimport { LayerSourceSchema } from \"./source.schema\";\n/**\n * Mixed block for combining multiple block types.\n *\n * @remarks\n * MixedBlock allows you to create complex layouts by combining\n * content, map, and scrollytelling blocks. Uses z.lazy() for recursion.\n *\n * **Layout Options:**\n * - `row` - Horizontal layout (default)\n * - `column` - Vertical layout\n * - `grid` - CSS Grid layout\n *\n * @example Row Layout\n * ```yaml\n * - type: mixed\n * layout: row\n * blocks:\n * - type: content\n * content:\n * - h2: [{ str: \"Left Column\" }]\n * - type: map\n * id: side-map\n * config:\n * center: [0, 0]\n * zoom: 2\n * mapStyle: \"...\"\n * ```\n *\n * @example Grid Layout\n * ```yaml\n * - type: mixed\n * layout: grid\n * style: \"grid-template-columns: repeat(2, 1fr); gap: 20px;\"\n * blocks:\n * - type: content\n * content: [...]\n * - type: content\n * content: [...]\n * - type: map\n * id: map1\n * config: {...}\n * - type: map\n * id: map2\n * config: {...}\n * ```\n *\n * @example Nested Mixed Blocks\n * ```yaml\n * - type: mixed\n * layout: column\n * blocks:\n * - type: content\n * content: [...]\n * - type: mixed\n * layout: row\n * blocks:\n * - type: map\n * id: left-map\n * config: {...}\n * - type: map\n * id: right-map\n * config: {...}\n * ```\n */\nexport const MixedBlockSchema: z.ZodType<any> = z.lazy(() =>\n z\n .object({\n type: z.literal(\"mixed\").describe(\"Block type\"),\n id: z.string().optional().describe(\"Unique block identifier\"),\n className: z.string().optional().describe(\"CSS class name for container\"),\n style: z.string().optional().describe(\"Inline CSS styles for container\"),\n layout: z\n .enum([\"row\", \"column\", \"grid\"])\n .default(\"row\")\n .describe(\"Layout direction\"),\n gap: z\n .string()\n .optional()\n .describe(\"Gap between blocks (CSS gap property)\"),\n blocks: z.array(BlockSchema).describe(\"Child blocks\"),\n })\n .describe(\"Mixed block for combining multiple block types\")\n);\n\n/** Inferred type for mixed block. */\nexport type MixedBlock = {\n type: \"mixed\";\n id?: string;\n className?: string;\n style?: string;\n layout?: \"row\" | \"column\" | \"grid\";\n gap?: string;\n blocks: Block[];\n};\n\n/**\n * Union of all block types.\n *\n * @remarks\n * Blocks are the building blocks of pages. Each page contains an\n * array of blocks that are rendered in order.\n *\n * **Block Types:**\n * - `content` - Rich text and media\n * - `map` - Standard map\n * - `map-fullpage` - Full viewport map\n * - `scrollytelling` - Narrative map story\n * - `mixed` - Layout container for other blocks\n */\nexport const BlockSchema: z.ZodType<any> = z.union([\n ContentBlockSchema,\n MapBlockSchema,\n MapFullPageBlockSchema,\n ScrollytellingBlockSchema,\n MixedBlockSchema,\n]);\n\n/** Inferred type for any block. */\nexport type Block = z.infer<typeof BlockSchema>;\n\n/**\n * Page configuration.\n *\n * @remarks\n * A page represents a single route/URL in your application.\n * Pages contain blocks that define the content and maps.\n *\n * **Required:**\n * - `path` - URL path (e.g., \"/\", \"/about\", \"/map\")\n * - `title` - Page title (used for browser tab and SEO)\n * - `blocks` - Array of content/map blocks\n *\n * **Optional:**\n * - `description` - Meta description for SEO\n *\n * @example Home Page\n * ```yaml\n * - path: \"/\"\n * title: \"Home\"\n * description: \"Welcome to our mapping application\"\n * blocks:\n * - type: content\n * content:\n * - h1: [{ str: \"Welcome\" }]\n * - type: map\n * id: home-map\n * config:\n * center: [0, 0]\n * zoom: 2\n * mapStyle: \"...\"\n * ```\n *\n * @example Story Page\n * ```yaml\n * - path: \"/story\"\n * title: \"Our Story\"\n * description: \"An interactive map story\"\n * blocks:\n * - type: scrollytelling\n * id: main-story\n * config: {...}\n * chapters: [...]\n * ```\n *\n * @example Complex Layout\n * ```yaml\n * - path: \"/dashboard\"\n * title: \"Dashboard\"\n * blocks:\n * - type: content\n * content:\n * - h1: [{ str: \"Dashboard\" }]\n * - type: mixed\n * layout: row\n * blocks:\n * - type: map\n * id: map1\n * config: {...}\n * - type: map\n * id: map2\n * config: {...}\n * ```\n */\nexport const PageSchema = z\n .object({\n path: z.string().describe('URL path (e.g., \"/\", \"/about\")'),\n title: z.string().describe(\"Page title\"),\n description: z.string().optional().describe(\"Page description for SEO\"),\n blocks: z.array(BlockSchema).describe(\"Page content blocks\"),\n })\n .describe(\"Page configuration\");\n\n/** Inferred type for page. */\nexport type Page = z.infer<typeof PageSchema>;\n\n/**\n * Global configuration.\n *\n * @remarks\n * Global settings that apply across all pages.\n *\n * **General:**\n * - `title` - Application title\n * - `description` - Application description\n * - `defaultMapStyle` - Default map style for all maps\n * - `theme` - Default theme (light/dark)\n *\n * **Data Fetching:**\n * - `defaultStrategy` - Default fetch strategy (runtime, build, hybrid)\n * - `timeout` - Default fetch timeout\n * - `retryAttempts` - Default retry attempts\n *\n * @example Basic Config\n * ```yaml\n * config:\n * title: \"My Map App\"\n * description: \"Interactive maps and stories\"\n * defaultMapStyle: \"https://demotiles.maplibre.org/style.json\"\n * ```\n *\n * @example With Data Fetching\n * ```yaml\n * config:\n * title: \"My Map App\"\n * defaultMapStyle: \"https://demotiles.maplibre.org/style.json\"\n * theme: dark\n * dataFetching:\n * defaultStrategy: build\n * timeout: 15000\n * retryAttempts: 5\n * ```\n */\nexport const GlobalConfigSchema = z\n .object({\n title: z.string().optional().describe(\"Application title\"),\n description: z.string().optional().describe(\"Application description\"),\n defaultMapStyle: z\n .string()\n .url()\n .optional()\n .describe(\"Default map style URL\"),\n theme: z.enum([\"light\", \"dark\"]).default(\"light\").describe(\"Default theme\"),\n dataFetching: z\n .object({\n defaultStrategy: z\n .enum([\"runtime\", \"build\", \"hybrid\"])\n .default(\"runtime\")\n .describe(\"Default fetch strategy\"),\n timeout: z\n .number()\n .min(1000)\n .default(30000)\n .describe(\"Default timeout in milliseconds\"),\n retryAttempts: z\n .number()\n .int()\n .min(0)\n .default(3)\n .describe(\"Default retry attempts\"),\n })\n .optional()\n .describe(\"Data fetching configuration\"),\n })\n .describe(\"Global configuration\");\n\n/** Inferred type for global config. */\nexport type GlobalConfig = z.infer<typeof GlobalConfigSchema>;\n\n/**\n * Root configuration schema.\n *\n * @remarks\n * The root schema represents the entire maplibre-yaml configuration.\n * This is the top-level structure for YAML files.\n *\n * **Structure:**\n * 1. `config` - Global settings (optional)\n * 2. `layers` - Named layer definitions for reuse (optional)\n * 3. `sources` - Named source definitions for reuse (optional)\n * 4. `pages` - Page definitions (required, minimum 1)\n *\n * **Global Layers and Sources:**\n * Define layers and sources once, reference them anywhere using `$ref`.\n *\n * @example Minimal Configuration\n * ```yaml\n * pages:\n * - path: \"/\"\n * title: \"Home\"\n * blocks:\n * - type: map\n * id: main-map\n * config:\n * center: [0, 0]\n * zoom: 2\n * mapStyle: \"https://demotiles.maplibre.org/style.json\"\n * ```\n *\n * @example With Global Config\n * ```yaml\n * config:\n * title: \"My App\"\n * defaultMapStyle: \"https://demotiles.maplibre.org/style.json\"\n *\n * pages:\n * - path: \"/\"\n * title: \"Home\"\n * blocks:\n * - type: map\n * id: main-map\n * config:\n * center: [0, 0]\n * zoom: 2\n * ```\n *\n * @example With Global Layers\n * ```yaml\n * config:\n * defaultMapStyle: \"https://demotiles.maplibre.org/style.json\"\n *\n * layers:\n * bikeLayer:\n * id: bikes\n * type: line\n * source:\n * type: geojson\n * url: \"https://example.com/bikes.geojson\"\n * paint:\n * line-color: \"#00ff00\"\n * line-width: 2\n *\n * parkLayer:\n * id: parks\n * type: fill\n * source:\n * type: geojson\n * url: \"https://example.com/parks.geojson\"\n * paint:\n * fill-color: \"#228B22\"\n * fill-opacity: 0.5\n *\n * pages:\n * - path: \"/\"\n * title: \"Home\"\n * blocks:\n * - type: map\n * id: main-map\n * config:\n * center: [-74.006, 40.7128]\n * zoom: 12\n * layers:\n * - $ref: \"#/layers/bikeLayer\"\n * - $ref: \"#/layers/parkLayer\"\n * ```\n *\n * @example With Global Sources\n * ```yaml\n * sources:\n * earthquakeSource:\n * type: geojson\n * url: \"https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_day.geojson\"\n * refreshInterval: 60000\n *\n * layers:\n * earthquakes:\n * id: earthquakes\n * type: circle\n * source: earthquakeSource\n * paint:\n * circle-radius: 8\n * circle-color: \"#ff0000\"\n *\n * pages:\n * - path: \"/\"\n * title: \"Earthquakes\"\n * blocks:\n * - type: map\n * id: quake-map\n * config:\n * center: [0, 0]\n * zoom: 2\n * mapStyle: \"...\"\n * layers:\n * - $ref: \"#/layers/earthquakes\"\n * ```\n *\n * @example Multi-Page Application\n * ```yaml\n * config:\n * title: \"Multi-Page Map App\"\n * defaultMapStyle: \"https://demotiles.maplibre.org/style.json\"\n *\n * pages:\n * - path: \"/\"\n * title: \"Home\"\n * blocks:\n * - type: content\n * content:\n * - h1: [{ str: \"Welcome\" }]\n *\n * - path: \"/map\"\n * title: \"Interactive Map\"\n * blocks:\n * - type: map\n * id: main-map\n * config:\n * center: [0, 0]\n * zoom: 2\n *\n * - path: \"/story\"\n * title: \"Our Story\"\n * blocks:\n * - type: scrollytelling\n * id: story\n * config:\n * center: [0, 0]\n * zoom: 2\n * chapters:\n * - id: intro\n * title: \"Introduction\"\n * center: [0, 0]\n * zoom: 3\n * ```\n */\nexport const RootSchema: z.ZodType<any> = z\n .object({\n config: GlobalConfigSchema.optional().describe(\"Global configuration\"),\n layers: z\n .record(LayerSchema)\n .optional()\n .describe(\"Named layer definitions for reuse\"),\n sources: z\n .record(LayerSourceSchema)\n .optional()\n .describe(\"Named source definitions for reuse\"),\n pages: z\n .array(PageSchema)\n .min(1, \"At least one page is required\")\n .describe(\"Page definitions\"),\n })\n .describe(\"Root configuration schema\");\n\n/** Inferred type for root configuration. */\nexport type RootConfig = z.infer<typeof RootSchema>;\n","/**\n * @file YAML parser for MapLibre configuration files\n * @module @maplibre-yaml/core/parser\n *\n * @description\n * This module provides YAML parsing, schema validation, and reference resolution\n * for MapLibre YAML configuration files. It converts YAML strings into validated\n * TypeScript objects ready for rendering.\n *\n * ## Features\n *\n * - **YAML Parsing**: Converts YAML strings to JavaScript objects\n * - **Schema Validation**: Validates against Zod schemas with detailed error messages\n * - **Reference Resolution**: Resolves `$ref` pointers to global layers and sources\n * - **Error Formatting**: Transforms Zod errors into user-friendly messages with paths\n *\n * @example\n * Basic parsing\n * ```typescript\n * import { YAMLParser } from '@maplibre-yaml/core/parser';\n *\n * const yaml = `\n * pages:\n * - path: \"/\"\n * title: \"My Map\"\n * blocks:\n * - type: map\n * id: main\n * config:\n * center: [0, 0]\n * zoom: 2\n * mapStyle: \"https://example.com/style.json\"\n * `;\n *\n * const config = YAMLParser.parse(yaml);\n * ```\n *\n * @example\n * Safe parsing with error handling\n * ```typescript\n * const result = YAMLParser.safeParse(yaml);\n * if (result.success) {\n * console.log('Valid config:', result.data);\n * } else {\n * result.errors.forEach(err => {\n * console.error(`${err.path}: ${err.message}`);\n * });\n * }\n * ```\n *\n * @example\n * Reference resolution\n * ```typescript\n * const yaml = `\n * layers:\n * myLayer:\n * id: shared\n * type: circle\n * source: { type: geojson, data: {...} }\n *\n * pages:\n * - path: \"/\"\n * blocks:\n * - type: map\n * layers:\n * - $ref: \"#/layers/myLayer\"\n * `;\n *\n * const config = YAMLParser.parse(yaml);\n * // References are automatically resolved\n * ```\n */\n\nimport { parse as parseYAML } from \"yaml\";\nimport { ZodError } from \"zod\";\nimport { RootSchema } from \"../schemas/page.schema\";\nimport { MapBlockSchema } from \"../schemas/map.schema\";\nimport type { z } from \"zod\";\n\n/**\n * Type alias for the root configuration object\n *\n * @remarks\n * Inferred from the RootSchema Zod schema\n */\nexport type RootConfig = z.infer<typeof RootSchema>;\n\n/**\n * Type alias for a single map block\n *\n * @remarks\n * Inferred from the MapBlockSchema Zod schema\n */\nexport type MapBlock = z.infer<typeof MapBlockSchema>;\n\n/**\n * Error information for a single validation or parsing error\n *\n * @property path - JSON path to the error location (e.g., \"pages[0].blocks[1].config.center\")\n * @property message - Human-readable error description\n * @property line - Optional line number in the YAML file where error occurred\n * @property column - Optional column number in the YAML file where error occurred\n */\nexport interface ParseError {\n path: string;\n message: string;\n line?: number;\n column?: number;\n}\n\n/**\n * Result object returned by safeParse operations\n *\n * @property success - Whether parsing and validation succeeded\n * @property data - Validated configuration object (only present if success is true)\n * @property errors - Array of errors (only present if success is false)\n */\nexport interface ParseResult<T = RootConfig> {\n success: boolean;\n data?: T;\n errors: ParseError[];\n}\n\n/**\n * YAML parser with schema validation and reference resolution\n *\n * @remarks\n * This class provides static methods for parsing YAML configuration files,\n * validating them against schemas, and resolving references between configuration\n * sections. All methods are static as the parser maintains no internal state.\n *\n * @example\n * Parse and validate YAML (throws on error)\n * ```typescript\n * const config = YAMLParser.parse(yamlString);\n * ```\n *\n * @example\n * Safe parse (returns result object)\n * ```typescript\n * const result = YAMLParser.safeParse(yamlString);\n * if (!result.success) {\n * console.error('Validation errors:', result.errors);\n * }\n * ```\n */\nexport class YAMLParser {\n /**\n * Parse YAML string and validate against schema\n *\n * @param yaml - YAML string to parse\n * @returns Validated configuration object\n * @throws {Error} If YAML syntax is invalid\n * @throws {ZodError} If validation fails\n *\n * @remarks\n * This method parses the YAML, validates it against the RootSchema,\n * resolves all references, and returns the validated config. If any\n * step fails, it throws an error.\n *\n * @example\n * ```typescript\n * try {\n * const config = YAMLParser.parse(yamlString);\n * console.log('Valid config:', config);\n * } catch (error) {\n * console.error('Parse error:', error.message);\n * }\n * ```\n */\n static parse(yaml: string): RootConfig {\n // Parse YAML string to JavaScript object\n let parsed: unknown;\n try {\n parsed = parseYAML(yaml);\n } catch (error) {\n throw new Error(\n `YAML syntax error: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n\n // Validate against schema\n const validated = RootSchema.parse(parsed);\n\n // Resolve references\n return this.resolveReferences(validated);\n }\n\n /**\n * Parse YAML string and validate, returning a result object\n *\n * @param yaml - YAML string to parse\n * @returns Result object with success flag and either data or errors\n *\n * @remarks\n * This is the non-throwing version of {@link parse}. Instead of throwing\n * errors, it returns a result object that indicates success or failure.\n * Use this when you want to handle errors gracefully without try/catch.\n *\n * @example\n * ```typescript\n * const result = YAMLParser.safeParse(yamlString);\n * if (result.success) {\n * console.log('Config:', result.data);\n * } else {\n * result.errors.forEach(err => {\n * console.error(`Error at ${err.path}: ${err.message}`);\n * });\n * }\n * ```\n */\n static safeParse(yaml: string): ParseResult {\n try {\n const data = this.parse(yaml);\n return {\n success: true,\n data,\n errors: [],\n };\n } catch (error) {\n // Handle Zod validation errors\n if (error instanceof ZodError) {\n return {\n success: false,\n errors: this.formatZodErrors(error),\n };\n }\n\n // Handle other errors (YAML syntax, reference errors, etc.)\n return {\n success: false,\n errors: [\n {\n path: \"\",\n message: error instanceof Error ? error.message : String(error),\n },\n ],\n };\n }\n }\n\n /**\n * Validate a JavaScript object against the schema\n *\n * @param config - JavaScript object to validate\n * @returns Validated configuration object\n * @throws {ZodError} If validation fails\n *\n * @remarks\n * This method bypasses YAML parsing and directly validates a JavaScript object.\n * Useful when you already have a parsed object (e.g., from JSON.parse) and just\n * want to validate and resolve references.\n *\n * @example\n * ```typescript\n * const jsConfig = JSON.parse(jsonString);\n * const validated = YAMLParser.validate(jsConfig);\n * ```\n */\n static validate(config: unknown): RootConfig {\n const validated = RootSchema.parse(config);\n return this.resolveReferences(validated);\n }\n\n /**\n * Parse YAML string for a single map block and validate against MapBlockSchema\n *\n * @param yaml - YAML string to parse (should be a map block, not a full document)\n * @returns Validated map block object\n * @throws {Error} If YAML syntax is invalid\n * @throws {ZodError} If validation fails\n *\n * @remarks\n * This method is specifically for parsing individual map blocks (e.g., in documentation\n * or component usage). Unlike {@link parse}, it validates against MapBlockSchema rather\n * than RootSchema, so it expects a single map configuration without the pages array wrapper.\n *\n * @example\n * ```typescript\n * const yaml = `\n * type: map\n * id: example\n * config:\n * center: [0, 0]\n * zoom: 2\n * mapStyle: \"https://example.com/style.json\"\n * layers:\n * - id: points\n * type: circle\n * source:\n * type: geojson\n * data: { type: \"FeatureCollection\", features: [] }\n * `;\n *\n * const mapBlock = YAMLParser.parseMapBlock(yaml);\n * ```\n */\n static parseMapBlock(yaml: string): MapBlock {\n // Parse YAML string to JavaScript object\n let parsed: unknown;\n try {\n parsed = parseYAML(yaml);\n } catch (error) {\n throw new Error(\n `YAML syntax error: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n\n // Validate against MapBlockSchema\n return MapBlockSchema.parse(parsed);\n }\n\n /**\n * Parse YAML string for a single map block, returning a result object\n *\n * @param yaml - YAML string to parse (should be a map block, not a full document)\n * @returns Result object with success flag and either data or errors\n *\n * @remarks\n * This is the non-throwing version of {@link parseMapBlock}. Instead of throwing\n * errors, it returns a result object that indicates success or failure.\n * Use this when you want to handle errors gracefully without try/catch.\n *\n * @example\n * ```typescript\n * const result = YAMLParser.safeParseMapBlock(yamlString);\n * if (result.success) {\n * console.log('Map config:', result.data);\n * } else {\n * result.errors.forEach(err => {\n * console.error(`Error at ${err.path}: ${err.message}`);\n * });\n * }\n * ```\n */\n static safeParseMapBlock(yaml: string): ParseResult<MapBlock> {\n try {\n const data = this.parseMapBlock(yaml);\n return {\n success: true,\n data,\n errors: [],\n };\n } catch (error) {\n // Handle Zod validation errors\n if (error instanceof ZodError) {\n return {\n success: false,\n errors: this.formatZodErrors(error),\n };\n }\n\n // Handle other errors (YAML syntax, etc.)\n return {\n success: false,\n errors: [\n {\n path: \"\",\n message: error instanceof Error ? error.message : String(error),\n },\n ],\n };\n }\n }\n\n /**\n * Resolve $ref references to global layers and sources\n *\n * @param config - Configuration object with potential references\n * @returns Configuration with all references resolved\n * @throws {Error} If a reference cannot be resolved\n *\n * @remarks\n * References use JSON Pointer-like syntax: `#/layers/layerName` or `#/sources/sourceName`.\n * This method walks the configuration tree, finds all objects with a `$ref` property,\n * looks up the referenced item in `config.layers` or `config.sources`, and replaces\n * the reference object with the actual item.\n *\n * ## Reference Syntax\n *\n * - `#/layers/myLayer` - Reference to a layer in the global `layers` section\n * - `#/sources/mySource` - Reference to a source in the global `sources` section\n *\n * @example\n * ```typescript\n * const config = {\n * layers: {\n * myLayer: { id: 'layer1', type: 'circle', ... }\n * },\n * pages: [{\n * blocks: [{\n * type: 'map',\n * layers: [{ $ref: '#/layers/myLayer' }]\n * }]\n * }]\n * };\n *\n * const resolved = YAMLParser.resolveReferences(config);\n * // resolved.pages[0].blocks[0].layers[0] now contains the full layer object\n * ```\n */\n static resolveReferences(config: RootConfig): RootConfig {\n /**\n * Recursively walk an object and resolve references\n */\n const resolveInObject = (obj: any): any => {\n // Handle null/undefined\n if (obj == null) return obj;\n\n // Handle arrays\n if (Array.isArray(obj)) {\n return obj.map((item) => resolveInObject(item));\n }\n\n // Handle objects\n if (typeof obj === \"object\") {\n // Check if this is a reference object\n if (\"$ref\" in obj && typeof obj.$ref === \"string\") {\n const ref = obj.$ref;\n\n // Parse reference: #/layers/layerName or #/sources/sourceName\n const match = ref.match(/^#\\/(layers|sources)\\/(.+)$/);\n if (!match) {\n throw new Error(\n `Invalid reference format: ${ref}. Expected #/layers/name or #/sources/name`\n );\n }\n\n const [, section, name] = match;\n\n // Look up the referenced item\n if (section === \"layers\") {\n if (!config.layers || !(name in config.layers)) {\n throw new Error(`Layer reference not found: ${ref}`);\n }\n return config.layers[name];\n } else if (section === \"sources\") {\n if (!config.sources || !(name in config.sources)) {\n throw new Error(`Source reference not found: ${ref}`);\n }\n return config.sources[name];\n }\n }\n\n // Recursively process all properties\n const resolved: any = {};\n for (const [key, value] of Object.entries(obj)) {\n resolved[key] = resolveInObject(value);\n }\n return resolved;\n }\n\n // Primitives\n return obj;\n };\n\n return resolveInObject(config);\n }\n\n /**\n * Format Zod validation errors into user-friendly messages\n *\n * @param error - Zod validation error\n * @returns Array of formatted error objects\n *\n * @remarks\n * This method transforms Zod's internal error format into human-readable\n * messages with clear paths and descriptions. It handles various Zod error\n * types and provides appropriate messages for each.\n *\n * ## Error Type Handling\n *\n * - `invalid_type`: Type mismatch (e.g., expected number, got string)\n * - `invalid_union_discriminator`: Invalid discriminator for union types\n * - `invalid_union`: None of the union options matched\n * - `too_small`: Value below minimum (arrays, strings, numbers)\n * - `too_big`: Value above maximum\n * - `invalid_string`: String format validation failed\n * - `custom`: Custom validation refinement failed\n *\n * @example\n * ```typescript\n * try {\n * RootSchema.parse(invalidConfig);\n * } catch (error) {\n * if (error instanceof ZodError) {\n * const formatted = YAMLParser.formatZodErrors(error);\n * formatted.forEach(err => {\n * console.error(`${err.path}: ${err.message}`);\n * });\n * }\n * }\n * ```\n */\n private static formatZodErrors(error: ZodError): ParseError[] {\n return error.errors.map((err) => {\n const path = err.path.join(\".\");\n\n let message: string;\n switch (err.code) {\n case \"invalid_type\":\n message = `Expected ${err.expected}, got ${err.received}`;\n break;\n\n case \"invalid_union_discriminator\":\n message = `Invalid type. Expected one of: ${err.options.join(\", \")}`;\n break;\n\n case \"invalid_union\":\n message = \"Value does not match any of the expected formats\";\n break;\n\n case \"too_small\":\n if (err.type === \"array\") {\n message = `Array must have at least ${err.minimum} element(s)`;\n } else if (err.type === \"string\") {\n message = `String must have at least ${err.minimum} character(s)`;\n } else {\n message = `Value must be >= ${err.minimum}`;\n }\n break;\n\n case \"too_big\":\n if (err.type === \"array\") {\n message = `Array must have at most ${err.maximum} element(s)`;\n } else if (err.type === \"string\") {\n message = `String must have at most ${err.maximum} character(s)`;\n } else {\n message = `Value must be <= ${err.maximum}`;\n }\n break;\n\n case \"invalid_string\":\n if (err.validation === \"url\") {\n message = \"Invalid URL format\";\n } else if (err.validation === \"email\") {\n message = \"Invalid email format\";\n } else {\n message = `Invalid string format: ${err.validation}`;\n }\n break;\n\n case \"custom\":\n message = err.message || \"Validation failed\";\n break;\n\n default:\n message = err.message || \"Validation error\";\n }\n\n return {\n path,\n message,\n };\n });\n }\n}\n\n/**\n * Convenience function to parse YAML config\n *\n * @param yaml - YAML string to parse\n * @returns Validated configuration object\n * @throws {Error} If parsing or validation fails\n *\n * @remarks\n * This is an alias for {@link YAMLParser.parse} for convenient imports.\n *\n * @example\n * ```typescript\n * import { parseYAMLConfig } from '@maplibre-yaml/core/parser';\n * const config = parseYAMLConfig(yamlString);\n * ```\n */\nexport const parseYAMLConfig = YAMLParser.parse.bind(YAMLParser);\n\n/**\n * Convenience function to safely parse YAML config\n *\n * @param yaml - YAML string to parse\n * @returns Result object with success flag and data or errors\n *\n * @remarks\n * This is an alias for {@link YAMLParser.safeParse} for convenient imports.\n *\n * @example\n * ```typescript\n * import { safeParseYAMLConfig } from '@maplibre-yaml/core/parser';\n * const result = safeParseYAMLConfig(yamlString);\n * if (result.success) {\n * console.log(result.data);\n * }\n * ```\n */\nexport const safeParseYAMLConfig = YAMLParser.safeParse.bind(YAMLParser);\n","/**\n * @file TTL-based in-memory cache for fetched data\n * @module @maplibre-yaml/core/data\n */\n\n/**\n * Configuration options for MemoryCache\n */\nexport interface CacheConfig {\n /**\n * Maximum number of entries to store\n * @default 100\n */\n maxSize: number;\n\n /**\n * Default time-to-live in milliseconds\n * @default 300000 (5 minutes)\n */\n defaultTTL: number;\n\n /**\n * Whether to use conditional requests with ETag/Last-Modified headers\n * @default true\n */\n useConditionalRequests: boolean;\n}\n\n/**\n * Cache entry containing data and metadata\n */\nexport interface CacheEntry<T = unknown> {\n /** Cached data */\n data: T;\n\n /** Timestamp when cached (milliseconds) */\n timestamp: number;\n\n /** Time-to-live for this entry in milliseconds (overrides default) */\n ttl?: number;\n\n /** ETag header from HTTP response */\n etag?: string;\n\n /** Last-Modified header from HTTP response */\n lastModified?: string;\n}\n\n/**\n * Cache statistics\n */\nexport interface CacheStats {\n /** Number of entries currently in cache */\n size: number;\n\n /** Total number of cache hits */\n hits: number;\n\n /** Total number of cache misses */\n misses: number;\n\n /** Hit rate as percentage (0-100) */\n hitRate: number;\n}\n\n/**\n * TTL-based in-memory cache with LRU eviction.\n *\n * @remarks\n * Features:\n * - LRU (Least Recently Used) eviction when at capacity\n * - Respects HTTP cache headers (ETag, Last-Modified)\n * - Configurable per-entry TTL\n * - Support for conditional requests (If-None-Match, If-Modified-Since)\n * - Automatic expiration checking on get operations\n *\n * @example\n * ```typescript\n * const cache = new MemoryCache<GeoJSON.FeatureCollection>({\n * maxSize: 100,\n * defaultTTL: 300000, // 5 minutes\n * });\n *\n * // Store data with ETag\n * cache.set('https://example.com/data.json', {\n * data: geojsonData,\n * timestamp: Date.now(),\n * etag: '\"abc123\"',\n * });\n *\n * // Retrieve (returns null if expired or missing)\n * const entry = cache.get('https://example.com/data.json');\n * if (entry) {\n * console.log('Cache hit:', entry.data);\n * }\n *\n * // Get conditional headers for HTTP request\n * const headers = cache.getConditionalHeaders('https://example.com/data.json');\n * // headers = { 'If-None-Match': '\"abc123\"' }\n * ```\n *\n * @typeParam T - Type of cached data\n */\nexport class MemoryCache<T = unknown> {\n private static readonly DEFAULT_CONFIG: CacheConfig = {\n maxSize: 100,\n defaultTTL: 300000, // 5 minutes\n useConditionalRequests: true,\n };\n\n private config: CacheConfig;\n private cache = new Map<string, CacheEntry<T>>();\n private accessOrder: string[] = [];\n private stats = { hits: 0, misses: 0 };\n\n /**\n * Create a new MemoryCache instance\n *\n * @param config - Cache configuration options\n */\n constructor(config?: Partial<CacheConfig>) {\n this.config = { ...MemoryCache.DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Retrieve a cache entry\n *\n * @remarks\n * - Returns null if key doesn't exist\n * - Returns null if entry has expired (and removes it)\n * - Updates access order for LRU\n * - Updates cache statistics\n *\n * @param key - Cache key (typically a URL)\n * @returns Cache entry or null if not found/expired\n */\n get(key: string): CacheEntry<T> | null {\n const entry = this.cache.get(key);\n\n if (!entry) {\n this.stats.misses++;\n return null;\n }\n\n const ttl = entry.ttl ?? this.config.defaultTTL;\n const age = Date.now() - entry.timestamp;\n\n if (age > ttl) {\n this.cache.delete(key);\n this.removeFromAccessOrder(key);\n this.stats.misses++;\n return null;\n }\n\n this.updateAccessOrder(key);\n this.stats.hits++;\n return entry;\n }\n\n /**\n * Check if a key exists in cache (without checking expiration)\n *\n * @param key - Cache key\n * @returns True if key exists in cache\n */\n has(key: string): boolean {\n return this.cache.has(key);\n }\n\n /**\n * Store a cache entry\n *\n * @remarks\n * - Evicts least recently used entries if at capacity\n * - Updates access order\n *\n * @param key - Cache key (typically a URL)\n * @param entry - Cache entry to store\n */\n set(key: string, entry: CacheEntry<T>): void {\n // Evict oldest entries if at capacity\n while (this.cache.size >= this.config.maxSize && !this.cache.has(key)) {\n const oldest = this.accessOrder.shift();\n if (oldest) {\n this.cache.delete(oldest);\n }\n }\n\n this.cache.set(key, entry);\n this.updateAccessOrder(key);\n }\n\n /**\n * Delete a cache entry\n *\n * @param key - Cache key\n * @returns True if entry was deleted, false if it didn't exist\n */\n delete(key: string): boolean {\n const existed = this.cache.delete(key);\n if (existed) {\n this.removeFromAccessOrder(key);\n }\n return existed;\n }\n\n /**\n * Clear all cache entries and reset statistics\n */\n clear(): void {\n this.cache.clear();\n this.accessOrder = [];\n this.stats = { hits: 0, misses: 0 };\n }\n\n /**\n * Remove expired entries from cache\n *\n * @remarks\n * Iterates through all entries and removes those that have exceeded their TTL.\n * This is useful for periodic cleanup.\n *\n * @returns Number of entries removed\n */\n prune(): number {\n let removed = 0;\n const now = Date.now();\n\n for (const [key, entry] of this.cache.entries()) {\n const ttl = entry.ttl ?? this.config.defaultTTL;\n const age = now - entry.timestamp;\n\n if (age > ttl) {\n this.cache.delete(key);\n this.removeFromAccessOrder(key);\n removed++;\n }\n }\n\n return removed;\n }\n\n /**\n * Get cache statistics\n *\n * @returns Current cache statistics including hit rate\n */\n getStats(): CacheStats {\n const total = this.stats.hits + this.stats.misses;\n const hitRate = total > 0 ? (this.stats.hits / total) * 100 : 0;\n\n return {\n size: this.cache.size,\n hits: this.stats.hits,\n misses: this.stats.misses,\n hitRate: Math.round(hitRate * 100) / 100, // Round to 2 decimal places\n };\n }\n\n /**\n * Get conditional request headers for HTTP caching\n *\n * @remarks\n * Returns appropriate If-None-Match and/or If-Modified-Since headers\n * based on cached entry metadata. Returns empty object if:\n * - Key doesn't exist in cache\n * - Entry has expired\n * - useConditionalRequests is false\n *\n * @param key - Cache key\n * @returns Object with conditional headers (may be empty)\n *\n * @example\n * ```typescript\n * const headers = cache.getConditionalHeaders(url);\n * const response = await fetch(url, { headers });\n * if (response.status === 304) {\n * // Use cached data\n * }\n * ```\n */\n getConditionalHeaders(key: string): Record<string, string> {\n if (!this.config.useConditionalRequests) {\n return {};\n }\n\n const entry = this.get(key);\n if (!entry) {\n return {};\n }\n\n const headers: Record<string, string> = {};\n\n if (entry.etag) {\n headers[\"If-None-Match\"] = entry.etag;\n }\n\n if (entry.lastModified) {\n headers[\"If-Modified-Since\"] = entry.lastModified;\n }\n\n return headers;\n }\n\n /**\n * Update the last access time for an entry\n *\n * @remarks\n * Useful for keeping an entry \"fresh\" without modifying its data.\n * Updates the access order for LRU.\n *\n * @param key - Cache key\n */\n touch(key: string): void {\n if (this.cache.has(key)) {\n this.updateAccessOrder(key);\n }\n }\n\n /**\n * Update access order for LRU tracking\n *\n * @param key - Cache key\n */\n private updateAccessOrder(key: string): void {\n // Remove from current position\n this.removeFromAccessOrder(key);\n // Add to end (most recently used)\n this.accessOrder.push(key);\n }\n\n /**\n * Remove a key from access order array\n *\n * @param key - Cache key\n */\n private removeFromAccessOrder(key: string): void {\n const index = this.accessOrder.indexOf(key);\n if (index !== -1) {\n this.accessOrder.splice(index, 1);\n }\n }\n}\n","/**\n * @file Exponential backoff retry manager\n * @module @maplibre-yaml/core/data\n */\n\n/**\n * Configuration options for retry behavior\n */\nexport interface RetryConfig {\n /**\n * Maximum number of retry attempts\n * @default 10\n */\n maxRetries: number;\n\n /**\n * Initial delay in milliseconds before first retry\n * @default 1000\n */\n initialDelay: number;\n\n /**\n * Maximum delay in milliseconds between retries\n * @default 30000\n */\n maxDelay: number;\n\n /**\n * Backoff multiplier for exponential backoff\n * @default 2\n */\n backoffFactor: number;\n\n /**\n * Whether to apply random jitter to delays\n * @default true\n */\n jitter: boolean;\n\n /**\n * Jitter factor (percentage of delay to randomize)\n * @default 0.25\n */\n jitterFactor: number;\n}\n\n/**\n * Callbacks for retry lifecycle events\n */\nexport interface RetryCallbacks {\n /**\n * Called before each retry attempt\n *\n * @param attempt - Current attempt number (1-indexed)\n * @param delay - Delay in milliseconds before this retry\n * @param error - Error that triggered the retry\n */\n onRetry?: (attempt: number, delay: number, error: Error) => void;\n\n /**\n * Called when all retry attempts are exhausted\n *\n * @param attempts - Total number of attempts made\n * @param lastError - The final error\n */\n onExhausted?: (attempts: number, lastError: Error) => void;\n\n /**\n * Called when operation succeeds\n *\n * @param attempts - Number of attempts before success (1 = first try)\n */\n onSuccess?: (attempts: number) => void;\n\n /**\n * Predicate to determine if an error is retryable\n *\n * @param error - Error to check\n * @returns True if the error should trigger a retry\n *\n * @default All errors are retryable\n */\n isRetryable?: (error: Error) => boolean;\n}\n\n/**\n * Error thrown when maximum retry attempts are exceeded\n */\nexport class MaxRetriesExceededError extends Error {\n /**\n * Create a MaxRetriesExceededError\n *\n * @param lastError - The error from the final attempt\n * @param attempts - Number of attempts made\n */\n constructor(public lastError: Error, public attempts: number) {\n super(\n `Maximum retry attempts (${attempts}) exceeded. Last error: ${lastError.message}`\n );\n this.name = \"MaxRetriesExceededError\";\n\n // Maintain proper prototype chain\n Object.setPrototypeOf(this, MaxRetriesExceededError.prototype);\n }\n}\n\n/**\n * Retry manager with exponential backoff and jitter.\n *\n * @remarks\n * Implements exponential backoff with the formula:\n * ```\n * delay = min(initialDelay * (backoffFactor ^ (attempt - 1)), maxDelay)\n * ```\n *\n * With jitter applied as:\n * ```\n * delay = delay + (random(-1, 1) * delay * jitterFactor)\n * ```\n *\n * Jitter helps prevent thundering herd problems when multiple clients\n * retry simultaneously.\n *\n * @example\n * ```typescript\n * const retry = new RetryManager({\n * maxRetries: 5,\n * initialDelay: 1000,\n * backoffFactor: 2,\n * });\n *\n * try {\n * const result = await retry.execute(\n * async () => {\n * const response = await fetch('https://api.example.com/data');\n * if (!response.ok) throw new Error('Request failed');\n * return response.json();\n * },\n * {\n * onRetry: (attempt, delay, error) => {\n * console.log(`Retry ${attempt} in ${delay}ms: ${error.message}`);\n * },\n * }\n * );\n * console.log('Success:', result);\n * } catch (error) {\n * console.error('All retries failed:', error);\n * }\n * ```\n */\nexport class RetryManager {\n private static readonly DEFAULT_CONFIG: RetryConfig = {\n maxRetries: 10,\n initialDelay: 1000,\n maxDelay: 30000,\n backoffFactor: 2,\n jitter: true,\n jitterFactor: 0.25,\n };\n\n private config: RetryConfig;\n\n /**\n * Create a new RetryManager instance\n *\n * @param config - Retry configuration options\n */\n constructor(config?: Partial<RetryConfig>) {\n this.config = { ...RetryManager.DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Execute a function with retry logic\n *\n * @typeParam T - Return type of the function\n * @param fn - Async function to execute with retries\n * @param callbacks - Optional lifecycle callbacks\n * @returns Promise that resolves with the function's result\n * @throws {MaxRetriesExceededError} When all retry attempts fail\n *\n * @example\n * ```typescript\n * const data = await retry.execute(\n * () => fetchData(url),\n * {\n * isRetryable: (error) => {\n * // Don't retry 4xx errors except 429 (rate limit)\n * if (error.message.includes('429')) return true;\n * if (error.message.match(/4\\d\\d/)) return false;\n * return true;\n * },\n * }\n * );\n * ```\n */\n async execute<T>(\n fn: () => Promise<T>,\n callbacks?: RetryCallbacks\n ): Promise<T> {\n let lastError: Error | null = null;\n let attempt = 0;\n\n while (attempt <= this.config.maxRetries) {\n attempt++;\n\n try {\n const result = await fn();\n callbacks?.onSuccess?.(attempt);\n return result;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n // Check if error is retryable\n if (callbacks?.isRetryable && !callbacks.isRetryable(lastError)) {\n throw lastError;\n }\n\n // If we've exhausted retries, throw\n if (attempt > this.config.maxRetries) {\n callbacks?.onExhausted?.(attempt, lastError);\n throw new MaxRetriesExceededError(lastError, attempt);\n }\n\n // Calculate delay and wait before retry\n const delay = this.calculateDelay(attempt);\n callbacks?.onRetry?.(attempt, delay, lastError);\n\n await this.sleep(delay);\n }\n }\n\n // This should never be reached due to throw above, but TypeScript needs it\n throw new MaxRetriesExceededError(\n lastError || new Error(\"Unknown error\"),\n attempt\n );\n }\n\n /**\n * Calculate delay for a given attempt using exponential backoff\n *\n * @param attempt - Current attempt number (1-indexed)\n * @returns Delay in milliseconds\n *\n * @example\n * ```typescript\n * const retry = new RetryManager({ initialDelay: 1000, backoffFactor: 2 });\n * console.log(retry.calculateDelay(1)); // ~1000ms\n * console.log(retry.calculateDelay(2)); // ~2000ms\n * console.log(retry.calculateDelay(3)); // ~4000ms\n * ```\n */\n calculateDelay(attempt: number): number {\n // Calculate base delay with exponential backoff\n let delay =\n this.config.initialDelay *\n Math.pow(this.config.backoffFactor, attempt - 1);\n\n // Cap at max delay\n delay = Math.min(delay, this.config.maxDelay);\n\n // Apply jitter if enabled\n if (this.config.jitter) {\n const jitterRange = delay * this.config.jitterFactor;\n // Random value between -jitterRange and +jitterRange\n const jitterOffset = (Math.random() * 2 - 1) * jitterRange;\n delay = delay + jitterOffset;\n }\n\n // Ensure non-negative and round to integer\n return Math.max(0, Math.round(delay));\n }\n\n /**\n * Reset internal state\n *\n * @remarks\n * Currently this class is stateless, but this method is provided\n * for API consistency and future extensibility.\n */\n reset(): void {\n // Currently stateless, but provided for API consistency\n }\n\n /**\n * Sleep for specified milliseconds\n *\n * @param ms - Milliseconds to sleep\n * @returns Promise that resolves after the delay\n */\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","/**\n * @file HTTP data fetcher with caching and retry support\n * @module @maplibre-yaml/core/data\n */\n\nimport { MemoryCache, type CacheEntry, type CacheStats } from \"./memory-cache\";\nimport { RetryManager } from \"./retry-manager\";\nimport type { FeatureCollection } from \"geojson\";\n\n/**\n * Configuration for DataFetcher\n */\nexport interface FetcherConfig {\n /**\n * Cache configuration\n */\n cache: {\n /** Whether caching is enabled */\n enabled: boolean;\n /** Default TTL in milliseconds */\n defaultTTL: number;\n /** Maximum number of cached entries */\n maxSize: number;\n };\n\n /**\n * Retry configuration\n */\n retry: {\n /** Whether retry is enabled */\n enabled: boolean;\n /** Maximum number of retry attempts */\n maxRetries: number;\n /** Initial delay in milliseconds */\n initialDelay: number;\n /** Maximum delay in milliseconds */\n maxDelay: number;\n };\n\n /**\n * Request timeout in milliseconds\n * @default 30000\n */\n timeout: number;\n\n /**\n * Default headers to include in all requests\n */\n defaultHeaders: Record<string, string>;\n}\n\n/**\n * Options for individual fetch requests\n */\nexport interface FetchOptions {\n /**\n * Custom TTL for this request (overrides default)\n */\n ttl?: number;\n\n /**\n * Skip cache and force fresh fetch\n * @default false\n */\n skipCache?: boolean;\n\n /**\n * AbortSignal for request cancellation\n */\n signal?: AbortSignal;\n\n /**\n * Additional headers for this request\n */\n headers?: Record<string, string>;\n\n /**\n * Callback before each retry attempt\n */\n onRetry?: (attempt: number, delay: number, error: Error) => void;\n\n /**\n * Callback when fetch starts\n */\n onStart?: () => void;\n\n /**\n * Callback when fetch completes successfully\n */\n onComplete?: (data: FeatureCollection, fromCache: boolean) => void;\n\n /**\n * Callback when fetch fails\n */\n onError?: (error: Error) => void;\n}\n\n/**\n * Result of a fetch operation\n */\nexport interface FetchResult {\n /** The fetched GeoJSON data */\n data: FeatureCollection;\n\n /** Whether data came from cache */\n fromCache: boolean;\n\n /** Number of features in the collection */\n featureCount: number;\n\n /** Duration of fetch operation in milliseconds */\n duration: number;\n}\n\n/**\n * HTTP data fetcher with caching and retry support.\n *\n * @remarks\n * Features:\n * - In-memory caching with TTL\n * - Conditional requests (If-None-Match, If-Modified-Since)\n * - Automatic retry with exponential backoff\n * - Request timeout and cancellation\n * - GeoJSON validation\n * - Lifecycle callbacks\n *\n * @example\n * ```typescript\n * const fetcher = new DataFetcher({\n * cache: { enabled: true, defaultTTL: 300000, maxSize: 100 },\n * retry: { enabled: true, maxRetries: 3, initialDelay: 1000, maxDelay: 10000 },\n * timeout: 30000,\n * });\n *\n * // Fetch with caching\n * const result = await fetcher.fetch('https://example.com/data.geojson');\n * console.log(`Fetched ${result.featureCount} features in ${result.duration}ms`);\n *\n * // Prefetch for later use\n * await fetcher.prefetch('https://example.com/data2.geojson');\n *\n * // Force fresh fetch\n * const fresh = await fetcher.fetch(url, { skipCache: true });\n * ```\n */\nexport class DataFetcher {\n private static readonly DEFAULT_CONFIG: FetcherConfig = {\n cache: {\n enabled: true,\n defaultTTL: 300000, // 5 minutes\n maxSize: 100,\n },\n retry: {\n enabled: true,\n maxRetries: 3,\n initialDelay: 1000,\n maxDelay: 10000,\n },\n timeout: 30000,\n defaultHeaders: {\n Accept: \"application/geo+json,application/json\",\n },\n };\n\n private config: FetcherConfig;\n private cache: MemoryCache<FeatureCollection>;\n private retryManager: RetryManager;\n private activeRequests = new Map<string, AbortController>();\n\n /**\n * Create a new DataFetcher instance\n *\n * @param config - Fetcher configuration\n */\n constructor(config?: Partial<FetcherConfig>) {\n this.config = this.mergeConfig(config);\n\n this.cache = new MemoryCache<FeatureCollection>({\n maxSize: this.config.cache.maxSize,\n defaultTTL: this.config.cache.defaultTTL,\n useConditionalRequests: true,\n });\n\n this.retryManager = new RetryManager({\n maxRetries: this.config.retry.maxRetries,\n initialDelay: this.config.retry.initialDelay,\n maxDelay: this.config.retry.maxDelay,\n });\n }\n\n /**\n * Fetch GeoJSON data from a URL\n *\n * @param url - URL to fetch from\n * @param options - Fetch options\n * @returns Fetch result with data and metadata\n * @throws {Error} On network error, timeout, invalid JSON, or non-GeoJSON response\n *\n * @example\n * ```typescript\n * const result = await fetcher.fetch(\n * 'https://example.com/data.geojson',\n * {\n * ttl: 60000, // 1 minute cache\n * onRetry: (attempt, delay, error) => {\n * console.log(`Retry ${attempt} in ${delay}ms: ${error.message}`);\n * },\n * }\n * );\n * ```\n */\n async fetch(url: string, options: FetchOptions = {}): Promise<FetchResult> {\n const startTime = Date.now();\n\n options.onStart?.();\n\n try {\n // Check cache first (unless skipCache is true)\n if (this.config.cache.enabled && !options.skipCache) {\n const cached = this.cache.get(url);\n if (cached) {\n const result: FetchResult = {\n data: cached.data,\n fromCache: true,\n featureCount: cached.data.features.length,\n duration: Date.now() - startTime,\n };\n options.onComplete?.(cached.data, true);\n return result;\n }\n }\n\n // Fetch fresh data\n const data = await this.fetchWithRetry(url, options);\n\n // Cache the result\n if (this.config.cache.enabled && !options.skipCache) {\n const cacheEntry: CacheEntry<FeatureCollection> = {\n data,\n timestamp: Date.now(),\n ttl: options.ttl,\n };\n this.cache.set(url, cacheEntry);\n }\n\n const result: FetchResult = {\n data,\n fromCache: false,\n featureCount: data.features.length,\n duration: Date.now() - startTime,\n };\n\n options.onComplete?.(data, false);\n return result;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n options.onError?.(err);\n throw err;\n }\n }\n\n /**\n * Prefetch data and store in cache\n *\n * @remarks\n * Useful for preloading data that will be needed soon.\n * Does not return the data.\n *\n * @param url - URL to prefetch\n * @param ttl - Optional custom TTL for cached entry\n *\n * @example\n * ```typescript\n * // Prefetch data for quick access later\n * await fetcher.prefetch('https://example.com/data.geojson', 600000);\n * ```\n */\n async prefetch(url: string, ttl?: number): Promise<void> {\n await this.fetch(url, { ttl, skipCache: false });\n }\n\n /**\n * Invalidate cached entry for a URL\n *\n * @param url - URL to invalidate\n *\n * @example\n * ```typescript\n * // Force next fetch to get fresh data\n * fetcher.invalidate('https://example.com/data.geojson');\n * ```\n */\n invalidate(url: string): void {\n this.cache.delete(url);\n }\n\n /**\n * Clear all cached entries\n */\n clearCache(): void {\n this.cache.clear();\n }\n\n /**\n * Get cache statistics\n *\n * @returns Cache stats including size, hits, misses, and hit rate\n */\n getCacheStats(): CacheStats {\n return this.cache.getStats();\n }\n\n /**\n * Abort all active requests\n */\n abortAll(): void {\n for (const controller of this.activeRequests.values()) {\n controller.abort();\n }\n this.activeRequests.clear();\n }\n\n /**\n * Fetch with retry logic\n */\n private async fetchWithRetry(\n url: string,\n options: FetchOptions\n ): Promise<FeatureCollection> {\n if (!this.config.retry.enabled) {\n return this.performFetch(url, options);\n }\n\n return this.retryManager.execute(\n () => this.performFetch(url, options),\n {\n onRetry: options.onRetry,\n isRetryable: (error) => this.isRetryableError(error),\n }\n );\n }\n\n /**\n * Perform the actual HTTP fetch\n */\n private async performFetch(\n url: string,\n options: FetchOptions\n ): Promise<FeatureCollection> {\n // Create abort controller with timeout\n const controller = options.signal\n ? new AbortController()\n : new AbortController();\n\n // Link external signal if provided\n if (options.signal) {\n options.signal.addEventListener(\"abort\", () => controller.abort());\n }\n\n // Set timeout\n const timeoutId = setTimeout(() => {\n controller.abort();\n }, this.config.timeout);\n\n this.activeRequests.set(url, controller);\n\n try {\n // Prepare headers\n const headers = {\n ...this.config.defaultHeaders,\n ...options.headers,\n };\n\n // Add conditional headers if we have cached entry\n if (this.config.cache.enabled && this.cache.has(url)) {\n const conditionalHeaders = this.cache.getConditionalHeaders(url);\n Object.assign(headers, conditionalHeaders);\n }\n\n // Perform fetch\n const response = await fetch(url, {\n signal: controller.signal,\n headers,\n });\n\n // Handle 304 Not Modified\n if (response.status === 304) {\n const cached = this.cache.get(url);\n if (cached) {\n // Touch to update access order\n this.cache.touch(url);\n return cached.data;\n }\n // Fallback: shouldn't happen, but handle gracefully\n throw new Error(\"304 Not Modified but no cached data available\");\n }\n\n // Handle HTTP errors\n if (!response.ok) {\n throw new Error(\n `HTTP ${response.status}: ${response.statusText} for ${url}`\n );\n }\n\n // Parse JSON\n let data: unknown;\n try {\n data = await response.json();\n } catch (error) {\n throw new Error(`Invalid JSON response from ${url}`);\n }\n\n // Validate GeoJSON\n if (!this.isValidGeoJSON(data)) {\n throw new Error(`Response from ${url} is not valid GeoJSON`);\n }\n\n // Update cache metadata with response headers\n if (this.config.cache.enabled) {\n const etag = response.headers.get(\"etag\");\n const lastModified = response.headers.get(\"last-modified\");\n\n if (etag || lastModified) {\n const cached = this.cache.get(url);\n if (cached) {\n // Update existing cache entry with new headers\n this.cache.set(url, {\n ...cached,\n etag: etag || cached.etag,\n lastModified: lastModified || cached.lastModified,\n });\n }\n }\n }\n\n return data as FeatureCollection;\n } finally {\n clearTimeout(timeoutId);\n this.activeRequests.delete(url);\n }\n }\n\n /**\n * Check if an error should trigger a retry\n */\n private isRetryableError(error: Error): boolean {\n const message = error.message.toLowerCase();\n\n // Don't retry on client errors (except 429 rate limit)\n if (message.includes(\"http 4\") && !message.includes(\"429\")) {\n return false;\n }\n\n // Don't retry on invalid JSON or GeoJSON\n if (\n message.includes(\"invalid json\") ||\n message.includes(\"not valid geojson\")\n ) {\n return false;\n }\n\n // Retry on network errors, timeouts, and server errors\n return true;\n }\n\n /**\n * Validate that data is a GeoJSON FeatureCollection\n */\n private isValidGeoJSON(data: unknown): data is FeatureCollection {\n if (typeof data !== \"object\" || data === null) {\n return false;\n }\n\n const obj = data as Record<string, unknown>;\n\n return (\n obj.type === \"FeatureCollection\" && Array.isArray(obj.features)\n );\n }\n\n /**\n * Merge partial config with defaults\n */\n private mergeConfig(partial?: Partial<FetcherConfig>): FetcherConfig {\n if (!partial) return DataFetcher.DEFAULT_CONFIG;\n\n return {\n cache: { ...DataFetcher.DEFAULT_CONFIG.cache, ...partial.cache },\n retry: { ...DataFetcher.DEFAULT_CONFIG.retry, ...partial.retry },\n timeout: partial.timeout ?? DataFetcher.DEFAULT_CONFIG.timeout,\n defaultHeaders: {\n ...DataFetcher.DEFAULT_CONFIG.defaultHeaders,\n ...partial.defaultHeaders,\n },\n };\n }\n}\n","/**\n * @file Polling manager for periodic data refresh\n * @module @maplibre-yaml/core/data\n */\n\n/**\n * Configuration for a polling subscription.\n *\n * @remarks\n * The polling manager ensures non-overlapping execution by waiting for each\n * tick to complete before scheduling the next one. This prevents concurrent\n * execution of the same polling task.\n *\n * @example\n * ```typescript\n * const polling = new PollingManager();\n *\n * polling.start('vehicles', {\n * interval: 5000,\n * onTick: async () => {\n * const data = await fetch('/api/vehicles');\n * updateMap(data);\n * },\n * onError: (error) => console.error(error),\n * immediate: true,\n * pauseWhenHidden: true,\n * });\n * ```\n */\nexport interface PollingConfig {\n /** Polling interval in milliseconds (minimum 1000ms) */\n interval: number;\n\n /** Function to execute on each tick */\n onTick: () => Promise<void>;\n\n /** Error handler for tick failures */\n onError?: (error: Error) => void;\n\n /** Execute immediately on start (default: false) */\n immediate?: boolean;\n\n /** Pause polling when document is hidden (default: true) */\n pauseWhenHidden?: boolean;\n}\n\n/**\n * Current state of a polling subscription.\n */\nexport interface PollingState {\n /** Whether polling is active */\n isActive: boolean;\n\n /** Whether polling is paused */\n isPaused: boolean;\n\n /** Timestamp of last successful tick */\n lastTick: number | null;\n\n /** Timestamp of next scheduled tick */\n nextTick: number | null;\n\n /** Total number of successful ticks */\n tickCount: number;\n\n /** Total number of errors */\n errorCount: number;\n}\n\n/**\n * Internal subscription data.\n */\ninterface Subscription {\n config: PollingConfig;\n state: PollingState;\n timerId: ReturnType<typeof setTimeout> | null;\n isExecuting: boolean;\n pausedByVisibility: boolean;\n}\n\n/**\n * Manages polling intervals for data refresh.\n *\n * @remarks\n * Features:\n * - Independent intervals per subscription\n * - Visibility-aware (pause when tab hidden)\n * - Tracks tick count and error count\n * - Non-overlapping execution (waits for tick to complete)\n * - Pause/resume functionality\n * - Manual trigger support\n *\n * The polling manager automatically pauses polling when the document becomes\n * hidden (unless `pauseWhenHidden` is false) and resumes when visible again.\n *\n * @example\n * ```typescript\n * const polling = new PollingManager();\n *\n * // Start polling\n * polling.start('data-refresh', {\n * interval: 10000,\n * onTick: async () => {\n * await fetchAndUpdateData();\n * },\n * immediate: true,\n * });\n *\n * // Pause temporarily\n * polling.pause('data-refresh');\n *\n * // Resume\n * polling.resume('data-refresh');\n *\n * // Trigger immediately\n * await polling.triggerNow('data-refresh');\n *\n * // Stop completely\n * polling.stop('data-refresh');\n * ```\n */\nexport class PollingManager {\n private subscriptions = new Map<string, Subscription>();\n private visibilityListener: (() => void) | null = null;\n\n constructor() {\n this.setupVisibilityListener();\n }\n\n /**\n * Start a new polling subscription.\n *\n * @param id - Unique identifier for the subscription\n * @param config - Polling configuration\n * @throws Error if a subscription with the same ID already exists\n *\n * @example\n * ```typescript\n * polling.start('layer-1', {\n * interval: 5000,\n * onTick: async () => {\n * await updateLayerData();\n * },\n * });\n * ```\n */\n start(id: string, config: PollingConfig): void {\n if (this.subscriptions.has(id)) {\n throw new Error(`Polling subscription with id \"${id}\" already exists`);\n }\n\n const subscription: Subscription = {\n config,\n state: {\n isActive: true,\n isPaused: false,\n lastTick: null,\n nextTick: null,\n tickCount: 0,\n errorCount: 0,\n },\n timerId: null,\n isExecuting: false,\n pausedByVisibility: false,\n };\n\n this.subscriptions.set(id, subscription);\n\n // Execute immediately if requested\n if (config.immediate) {\n this.executeTick(id);\n } else {\n this.scheduleNextTick(id);\n }\n }\n\n /**\n * Stop a polling subscription and clean up resources.\n *\n * @param id - Subscription identifier\n *\n * @example\n * ```typescript\n * polling.stop('layer-1');\n * ```\n */\n stop(id: string): void {\n const subscription = this.subscriptions.get(id);\n if (!subscription) return;\n\n if (subscription.timerId !== null) {\n clearTimeout(subscription.timerId);\n }\n\n subscription.state.isActive = false;\n this.subscriptions.delete(id);\n }\n\n /**\n * Stop all polling subscriptions.\n *\n * @example\n * ```typescript\n * polling.stopAll();\n * ```\n */\n stopAll(): void {\n for (const id of this.subscriptions.keys()) {\n this.stop(id);\n }\n }\n\n /**\n * Pause a polling subscription without stopping it.\n *\n * @param id - Subscription identifier\n *\n * @remarks\n * Paused subscriptions can be resumed with {@link resume}.\n * The subscription maintains its state while paused.\n *\n * @example\n * ```typescript\n * polling.pause('layer-1');\n * ```\n */\n pause(id: string): void {\n const subscription = this.subscriptions.get(id);\n if (!subscription || subscription.state.isPaused) return;\n\n if (subscription.timerId !== null) {\n clearTimeout(subscription.timerId);\n subscription.timerId = null;\n }\n\n subscription.state.isPaused = true;\n subscription.state.nextTick = null;\n }\n\n /**\n * Pause all active polling subscriptions.\n *\n * @example\n * ```typescript\n * polling.pauseAll();\n * ```\n */\n pauseAll(): void {\n for (const id of this.subscriptions.keys()) {\n this.pause(id);\n }\n }\n\n /**\n * Resume a paused polling subscription.\n *\n * @param id - Subscription identifier\n *\n * @example\n * ```typescript\n * polling.resume('layer-1');\n * ```\n */\n resume(id: string): void {\n const subscription = this.subscriptions.get(id);\n if (!subscription || !subscription.state.isPaused) return;\n\n subscription.state.isPaused = false;\n subscription.pausedByVisibility = false;\n this.scheduleNextTick(id);\n }\n\n /**\n * Resume all paused polling subscriptions.\n *\n * @example\n * ```typescript\n * polling.resumeAll();\n * ```\n */\n resumeAll(): void {\n for (const id of this.subscriptions.keys()) {\n this.resume(id);\n }\n }\n\n /**\n * Trigger an immediate execution of the polling tick.\n *\n * @param id - Subscription identifier\n * @returns Promise that resolves when the tick completes\n * @throws Error if the subscription doesn't exist\n *\n * @remarks\n * This does not affect the regular polling schedule. The next scheduled\n * tick will still occur at the expected time.\n *\n * @example\n * ```typescript\n * await polling.triggerNow('layer-1');\n * ```\n */\n async triggerNow(id: string): Promise<void> {\n const subscription = this.subscriptions.get(id);\n if (!subscription) {\n throw new Error(`Polling subscription \"${id}\" not found`);\n }\n\n await this.executeTick(id);\n }\n\n /**\n * Get the current state of a polling subscription.\n *\n * @param id - Subscription identifier\n * @returns Current state or null if not found\n *\n * @example\n * ```typescript\n * const state = polling.getState('layer-1');\n * if (state) {\n * console.log(`Ticks: ${state.tickCount}, Errors: ${state.errorCount}`);\n * }\n * ```\n */\n getState(id: string): PollingState | null {\n const subscription = this.subscriptions.get(id);\n return subscription ? { ...subscription.state } : null;\n }\n\n /**\n * Get all active polling subscription IDs.\n *\n * @returns Array of subscription IDs\n *\n * @example\n * ```typescript\n * const ids = polling.getActiveIds();\n * console.log(`Active pollers: ${ids.join(', ')}`);\n * ```\n */\n getActiveIds(): string[] {\n return Array.from(this.subscriptions.keys());\n }\n\n /**\n * Check if a polling subscription exists.\n *\n * @param id - Subscription identifier\n * @returns True if the subscription exists\n *\n * @example\n * ```typescript\n * if (polling.has('layer-1')) {\n * polling.pause('layer-1');\n * }\n * ```\n */\n has(id: string): boolean {\n return this.subscriptions.has(id);\n }\n\n /**\n * Update the interval for an active polling subscription.\n *\n * @param id - Subscription identifier\n * @param interval - New interval in milliseconds (minimum 1000ms)\n * @throws Error if the subscription doesn't exist\n *\n * @remarks\n * The new interval takes effect after the current tick completes.\n *\n * @example\n * ```typescript\n * polling.setInterval('layer-1', 10000);\n * ```\n */\n setInterval(id: string, interval: number): void {\n const subscription = this.subscriptions.get(id);\n if (!subscription) {\n throw new Error(`Polling subscription \"${id}\" not found`);\n }\n\n if (interval < 1000) {\n throw new Error(\"Interval must be at least 1000ms\");\n }\n\n subscription.config.interval = interval;\n\n // Reschedule if active and not paused\n if (\n !subscription.state.isPaused &&\n !subscription.isExecuting &&\n subscription.timerId !== null\n ) {\n clearTimeout(subscription.timerId);\n this.scheduleNextTick(id);\n }\n }\n\n /**\n * Clean up all resources and stop all polling.\n *\n * @remarks\n * Should be called when the polling manager is no longer needed.\n * After calling destroy, the polling manager should not be used.\n *\n * @example\n * ```typescript\n * polling.destroy();\n * ```\n */\n destroy(): void {\n this.stopAll();\n this.teardownVisibilityListener();\n }\n\n /**\n * Execute a single tick for a subscription.\n */\n private async executeTick(id: string): Promise<void> {\n const subscription = this.subscriptions.get(id);\n if (!subscription || subscription.isExecuting) return;\n\n subscription.isExecuting = true;\n\n try {\n await subscription.config.onTick();\n subscription.state.tickCount++;\n subscription.state.lastTick = Date.now();\n } catch (error) {\n subscription.state.errorCount++;\n const err = error instanceof Error ? error : new Error(String(error));\n subscription.config.onError?.(err);\n } finally {\n subscription.isExecuting = false;\n\n // Schedule next tick if still active and not paused\n if (\n this.subscriptions.has(id) &&\n subscription.state.isActive &&\n !subscription.state.isPaused\n ) {\n this.scheduleNextTick(id);\n }\n }\n }\n\n /**\n * Schedule the next tick for a subscription.\n */\n private scheduleNextTick(id: string): void {\n const subscription = this.subscriptions.get(id);\n if (!subscription) return;\n\n const nextTime = Date.now() + subscription.config.interval;\n subscription.state.nextTick = nextTime;\n\n subscription.timerId = setTimeout(() => {\n this.executeTick(id);\n }, subscription.config.interval);\n }\n\n /**\n * Setup document visibility listener for automatic pause/resume.\n */\n private setupVisibilityListener(): void {\n if (typeof document === \"undefined\") return;\n\n this.visibilityListener = () => {\n if (document.hidden) {\n this.handleVisibilityChange(true);\n } else {\n this.handleVisibilityChange(false);\n }\n };\n\n document.addEventListener(\"visibilitychange\", this.visibilityListener);\n }\n\n /**\n * Handle document visibility changes.\n */\n private handleVisibilityChange(hidden: boolean): void {\n for (const [id, subscription] of this.subscriptions) {\n const pauseEnabled = subscription.config.pauseWhenHidden !== false;\n\n if (hidden && pauseEnabled && !subscription.state.isPaused) {\n // Pause due to visibility\n subscription.pausedByVisibility = true;\n this.pause(id);\n } else if (!hidden && pauseEnabled && subscription.pausedByVisibility) {\n // Resume from visibility pause\n this.resume(id);\n }\n }\n }\n\n /**\n * Remove document visibility listener.\n */\n private teardownVisibilityListener(): void {\n if (this.visibilityListener && typeof document !== \"undefined\") {\n document.removeEventListener(\"visibilitychange\", this.visibilityListener);\n this.visibilityListener = null;\n }\n }\n}\n","/**\n * @file Type-safe event emitter utility\n * @module @maplibre-yaml/core/utils\n */\n\n/**\n * Event handler function type\n */\nexport type EventHandler<T> = (data: T) => void;\n\n/**\n * Type-safe event emitter with strongly-typed event names and payloads\n *\n * @remarks\n * This class provides a type-safe event emitter pattern where event names\n * and their payload types are strictly enforced. It's designed to be extended\n * by classes that need event emission capabilities.\n *\n * @example\n * ```typescript\n * interface MyEvents {\n * connect: void;\n * message: { text: string };\n * error: { error: Error };\n * }\n *\n * class MyEmitter extends EventEmitter<MyEvents> {\n * connect() {\n * this.emit('connect', undefined);\n * }\n *\n * sendMessage(text: string) {\n * this.emit('message', { text });\n * }\n * }\n *\n * const emitter = new MyEmitter();\n * emitter.on('message', (data) => {\n * console.log(data.text); // Strongly typed!\n * });\n * ```\n *\n * @typeParam Events - Record of event names to payload types\n */\nexport class EventEmitter<Events extends Record<string, unknown>> {\n private handlers = new Map<keyof Events, Set<EventHandler<any>>>();\n\n /**\n * Register an event handler\n *\n * @param event - Event name to listen for\n * @param handler - Callback function to invoke when event is emitted\n * @returns Unsubscribe function that removes this specific handler\n *\n * @example\n * ```typescript\n * const unsubscribe = emitter.on('message', (data) => {\n * console.log(data.text);\n * });\n *\n * // Later, to unsubscribe:\n * unsubscribe();\n * ```\n */\n on<K extends keyof Events>(\n event: K,\n handler: EventHandler<Events[K]>\n ): () => void {\n if (!this.handlers.has(event)) {\n this.handlers.set(event, new Set());\n }\n\n this.handlers.get(event)!.add(handler);\n\n // Return unsubscribe function\n return () => this.off(event, handler);\n }\n\n /**\n * Register a one-time event handler\n *\n * @remarks\n * The handler will be automatically removed after being invoked once.\n *\n * @param event - Event name to listen for\n * @param handler - Callback function to invoke once\n *\n * @example\n * ```typescript\n * emitter.once('connect', () => {\n * console.log('Connected!');\n * });\n * ```\n */\n once<K extends keyof Events>(\n event: K,\n handler: EventHandler<Events[K]>\n ): void {\n const onceWrapper: EventHandler<Events[K]> = (data) => {\n this.off(event, onceWrapper);\n handler(data);\n };\n\n this.on(event, onceWrapper);\n }\n\n /**\n * Remove an event handler\n *\n * @param event - Event name\n * @param handler - Handler function to remove\n *\n * @example\n * ```typescript\n * const handler = (data) => console.log(data);\n * emitter.on('message', handler);\n * emitter.off('message', handler);\n * ```\n */\n off<K extends keyof Events>(\n event: K,\n handler: EventHandler<Events[K]>\n ): void {\n const handlers = this.handlers.get(event);\n if (handlers) {\n handlers.delete(handler);\n if (handlers.size === 0) {\n this.handlers.delete(event);\n }\n }\n }\n\n /**\n * Emit an event to all registered handlers\n *\n * @remarks\n * This method is protected to ensure only the extending class can emit events.\n * All handlers are invoked synchronously in the order they were registered.\n *\n * @param event - Event name to emit\n * @param data - Event payload data\n *\n * @example\n * ```typescript\n * class MyEmitter extends EventEmitter<MyEvents> {\n * doSomething() {\n * this.emit('something-happened', { value: 42 });\n * }\n * }\n * ```\n */\n protected emit<K extends keyof Events>(event: K, data: Events[K]): void {\n const handlers = this.handlers.get(event);\n if (handlers) {\n for (const handler of handlers) {\n handler(data);\n }\n }\n }\n\n /**\n * Remove all handlers for an event, or all handlers for all events\n *\n * @param event - Optional event name. If omitted, removes all handlers for all events.\n *\n * @example\n * ```typescript\n * // Remove all handlers for 'message' event\n * emitter.removeAllListeners('message');\n *\n * // Remove all handlers for all events\n * emitter.removeAllListeners();\n * ```\n */\n removeAllListeners<K extends keyof Events>(event?: K): void {\n if (event) {\n this.handlers.delete(event);\n } else {\n this.handlers.clear();\n }\n }\n\n /**\n * Get the number of handlers registered for an event\n *\n * @param event - Event name\n * @returns Number of registered handlers\n *\n * @example\n * ```typescript\n * const count = emitter.listenerCount('message');\n * console.log(`${count} handlers registered`);\n * ```\n */\n listenerCount<K extends keyof Events>(event: K): number {\n const handlers = this.handlers.get(event);\n return handlers ? handlers.size : 0;\n }\n\n /**\n * Get all event names that have registered handlers\n *\n * @returns Array of event names\n *\n * @example\n * ```typescript\n * const events = emitter.eventNames();\n * console.log('Events with handlers:', events);\n * ```\n */\n eventNames(): Array<keyof Events> {\n return Array.from(this.handlers.keys());\n }\n\n /**\n * Check if an event has any registered handlers\n *\n * @param event - Event name\n * @returns True if the event has at least one handler\n *\n * @example\n * ```typescript\n * if (emitter.hasListeners('message')) {\n * emitter.emit('message', { text: 'Hello' });\n * }\n * ```\n */\n hasListeners<K extends keyof Events>(event: K): boolean {\n return this.listenerCount(event) > 0;\n }\n}\n","/**\n * @file Base connection class for streaming connections\n * @module @maplibre-yaml/core/data/streaming\n */\n\nimport { EventEmitter } from \"../../utils/event-emitter\";\nimport { RetryManager } from \"../retry-manager\";\nimport type { RetryConfig } from \"../retry-manager\";\n\n/**\n * Connection state enum.\n *\n * @remarks\n * State transitions:\n * - disconnected → connecting → connected\n * - connected → disconnected (on manual disconnect)\n * - connected → reconnecting → connected (on connection loss with reconnect enabled)\n * - reconnecting → failed (after max reconnect attempts)\n */\nexport type ConnectionState =\n | \"disconnected\"\n | \"connecting\"\n | \"connected\"\n | \"reconnecting\"\n | \"failed\";\n\n/**\n * Events emitted by streaming connections.\n *\n * @remarks\n * All connections emit these events to allow consumers to react to\n * connection lifecycle changes and incoming messages.\n */\nexport interface ConnectionEvents extends Record<string, unknown> {\n /** Emitted when connection is established */\n connect: void;\n\n /** Emitted when connection is closed */\n disconnect: { reason: string };\n\n /** Emitted when a message is received */\n message: { data: unknown };\n\n /** Emitted when an error occurs */\n error: { error: Error };\n\n /** Emitted when attempting to reconnect */\n reconnecting: { attempt: number; delay: number };\n\n /** Emitted when reconnection succeeds */\n reconnected: { attempts: number };\n\n /** Emitted when reconnection fails after max attempts */\n failed: { attempts: number; lastError: Error };\n\n /** Emitted whenever connection state changes */\n stateChange: { from: ConnectionState; to: ConnectionState };\n}\n\n/**\n * Base configuration for all connection types.\n */\nexport interface ConnectionConfig {\n /** Connection URL */\n url: string;\n\n /** Enable automatic reconnection on disconnect (default: true) */\n reconnect?: boolean;\n\n /** Reconnection retry configuration */\n reconnectConfig?: Partial<RetryConfig>;\n}\n\n/**\n * Abstract base class for streaming connections.\n *\n * @remarks\n * Provides common functionality for all streaming connection types:\n * - Connection state management\n * - Event emission via EventEmitter\n * - Automatic reconnection with exponential backoff\n * - State change tracking\n *\n * Subclasses must implement:\n * - `connect()`: Establish the connection\n * - `disconnect()`: Close the connection\n *\n * @example\n * ```typescript\n * class MyConnection extends BaseConnection {\n * async connect(): Promise<void> {\n * this.setState('connecting');\n * // ... connection logic\n * this.setState('connected');\n * this.emit('connect', undefined);\n * }\n *\n * disconnect(): void {\n * // ... disconnection logic\n * this.handleDisconnect('Manual disconnect');\n * }\n * }\n * ```\n */\nexport abstract class BaseConnection extends EventEmitter<ConnectionEvents> {\n protected state: ConnectionState = \"disconnected\";\n protected config: Required<ConnectionConfig>;\n protected retryManager: RetryManager;\n protected reconnectAttempts = 0;\n protected manualDisconnect = false;\n\n /**\n * Create a new base connection.\n *\n * @param config - Connection configuration\n */\n constructor(config: ConnectionConfig) {\n super();\n\n this.config = {\n reconnect: true,\n reconnectConfig: {},\n ...config,\n };\n\n // Setup retry manager for reconnection\n this.retryManager = new RetryManager({\n maxRetries: 10,\n initialDelay: 1000,\n maxDelay: 30000,\n backoffFactor: 2,\n jitter: true,\n jitterFactor: 0.25,\n ...this.config.reconnectConfig,\n });\n }\n\n /**\n * Establish connection to the server.\n *\n * @remarks\n * Must be implemented by subclasses. Should:\n * 1. Set state to 'connecting'\n * 2. Establish the connection\n * 3. Set state to 'connected'\n * 4. Emit 'connect' event\n *\n * @throws Error if connection fails\n */\n abstract connect(): Promise<void>;\n\n /**\n * Close the connection.\n *\n * @remarks\n * Must be implemented by subclasses. Should:\n * 1. Close the underlying connection\n * 2. Call handleDisconnect() with reason\n */\n abstract disconnect(): void;\n\n /**\n * Get current connection state.\n *\n * @returns Current state\n *\n * @example\n * ```typescript\n * const state = connection.getState();\n * if (state === 'connected') {\n * // Connection is ready\n * }\n * ```\n */\n getState(): ConnectionState {\n return this.state;\n }\n\n /**\n * Check if connection is currently connected.\n *\n * @returns True if connected\n *\n * @example\n * ```typescript\n * if (connection.isConnected()) {\n * connection.send(data);\n * }\n * ```\n */\n isConnected(): boolean {\n return this.state === \"connected\";\n }\n\n /**\n * Get the number of reconnection attempts.\n *\n * @returns Number of reconnect attempts\n */\n getReconnectAttempts(): number {\n return this.reconnectAttempts;\n }\n\n /**\n * Update connection state and emit state change event.\n *\n * @param newState - New connection state\n *\n * @remarks\n * Automatically emits 'stateChange' event when state changes.\n * Subclasses should call this method instead of setting state directly.\n *\n * @example\n * ```typescript\n * protected async connect() {\n * this.setState('connecting');\n * await this.establishConnection();\n * this.setState('connected');\n * }\n * ```\n */\n protected setState(newState: ConnectionState): void {\n if (this.state === newState) return;\n\n const oldState = this.state;\n this.state = newState;\n\n this.emit(\"stateChange\", { from: oldState, to: newState });\n }\n\n /**\n * Handle disconnection and optionally attempt reconnection.\n *\n * @param reason - Reason for disconnection\n *\n * @remarks\n * This method should be called by subclasses when the connection is lost.\n * It will:\n * 1. Emit 'disconnect' event\n * 2. Attempt reconnection if enabled and not manually disconnected\n * 3. Emit 'reconnecting', 'reconnected', or 'failed' events as appropriate\n *\n * @example\n * ```typescript\n * ws.onclose = () => {\n * this.handleDisconnect('Connection closed');\n * };\n * ```\n */\n protected async handleDisconnect(reason: string): Promise<void> {\n // Set state before emitting disconnect event\n const wasConnected = this.state === \"connected\";\n this.setState(\"disconnected\");\n\n // Emit disconnect event\n this.emit(\"disconnect\", { reason });\n\n // Only attempt reconnection if:\n // 1. Reconnect is enabled\n // 2. Not manually disconnected\n // 3. Was previously connected (not a failed initial connection)\n if (!this.config.reconnect || this.manualDisconnect || !wasConnected) {\n return;\n }\n\n // Attempt reconnection with exponential backoff\n await this.attemptReconnection();\n }\n\n /**\n * Attempt to reconnect with exponential backoff.\n */\n private async attemptReconnection(): Promise<void> {\n this.setState(\"reconnecting\");\n this.reconnectAttempts = 0;\n\n try {\n await this.retryManager.execute(\n async () => {\n this.reconnectAttempts++;\n await this.connect();\n },\n {\n onRetry: (attempt, delay) => {\n this.emit(\"reconnecting\", { attempt, delay });\n },\n onSuccess: (attempts) => {\n this.reconnectAttempts = 0;\n this.emit(\"reconnected\", { attempts });\n },\n }\n );\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n this.setState(\"failed\");\n this.emit(\"failed\", {\n attempts: this.reconnectAttempts,\n lastError: error,\n });\n }\n }\n\n /**\n * Mark disconnection as manual to prevent reconnection.\n *\n * @remarks\n * Should be called by subclasses in their disconnect() implementation\n * before closing the connection.\n *\n * @example\n * ```typescript\n * disconnect(): void {\n * this.setManualDisconnect();\n * this.ws.close();\n * }\n * ```\n */\n protected setManualDisconnect(): void {\n this.manualDisconnect = true;\n }\n\n /**\n * Reset manual disconnect flag.\n *\n * @remarks\n * Should be called when establishing a new connection to allow\n * automatic reconnection for subsequent disconnections.\n */\n protected resetManualDisconnect(): void {\n this.manualDisconnect = false;\n }\n}\n","/**\n * @file Server-Sent Events connection implementation\n * @module @maplibre-yaml/core/data/streaming\n */\n\nimport { BaseConnection } from \"./base-connection\";\nimport type { ConnectionConfig } from \"./base-connection\";\n\n/**\n * Configuration for SSE connections.\n *\n * @remarks\n * Server-Sent Events (SSE) is a server push technology enabling a client\n * to receive automatic updates from a server via an HTTP connection.\n *\n * SSE is unidirectional (server to client only) and automatically handles\n * reconnection when the connection is lost.\n */\nexport interface SSEConfig extends ConnectionConfig {\n /**\n * Event types to listen for (default: ['message'])\n *\n * @remarks\n * The EventSource API can listen for custom event types sent by the server.\n * By default, it listens to the 'message' event type.\n *\n * @example\n * ```typescript\n * eventTypes: ['update', 'delete', 'create']\n * ```\n */\n eventTypes?: string[];\n\n /**\n * Include credentials in CORS requests (default: false)\n *\n * @remarks\n * When true, the EventSource will include credentials (cookies, authorization\n * headers, etc.) when making cross-origin requests.\n */\n withCredentials?: boolean;\n}\n\n/**\n * Server-Sent Events connection.\n *\n * @remarks\n * Primary streaming mechanism for real-time updates. Uses the native\n * EventSource API for robust, automatic reconnection handling.\n *\n * Features:\n * - Automatic reconnection by the browser\n * - Event-based message streaming\n * - JSON message parsing with error handling\n * - Multiple event type support\n * - Last event ID tracking for resume\n *\n * @example\n * ```typescript\n * const sse = new SSEConnection({\n * url: 'https://api.example.com/events',\n * eventTypes: ['update', 'delete'],\n * });\n *\n * sse.on('message', ({ data }) => {\n * console.log('Received:', data);\n * });\n *\n * sse.on('error', ({ error }) => {\n * console.error('Error:', error);\n * });\n *\n * await sse.connect();\n * ```\n */\nexport class SSEConnection extends BaseConnection {\n private eventSource: EventSource | null = null;\n private lastEventId: string | null = null;\n private readonly sseConfig: Required<SSEConfig>;\n\n /**\n * Create a new SSE connection.\n *\n * @param config - SSE configuration\n *\n * @example\n * ```typescript\n * const connection = new SSEConnection({\n * url: 'https://api.example.com/stream',\n * eventTypes: ['message', 'update'],\n * withCredentials: true,\n * });\n * ```\n */\n constructor(config: SSEConfig) {\n super(config);\n\n this.sseConfig = {\n ...this.config,\n eventTypes: config.eventTypes ?? [\"message\"],\n withCredentials: config.withCredentials ?? false,\n };\n }\n\n /**\n * Establish SSE connection.\n *\n * @remarks\n * Creates an EventSource and sets up event listeners for:\n * - Connection open\n * - Message events (for each configured event type)\n * - Error events\n *\n * The EventSource API handles reconnection automatically when the\n * connection is lost, unless explicitly closed.\n *\n * @throws Error if EventSource is not supported or connection fails\n *\n * @example\n * ```typescript\n * await connection.connect();\n * console.log('Connected to SSE stream');\n * ```\n */\n async connect(): Promise<void> {\n if (this.eventSource !== null) {\n throw new Error(\"Connection already exists\");\n }\n\n this.setState(\"connecting\");\n\n try {\n // Create EventSource with configuration\n this.eventSource = new EventSource(this.sseConfig.url, {\n withCredentials: this.sseConfig.withCredentials,\n });\n\n // Wait for connection to open\n await new Promise<void>((resolve, reject) => {\n if (!this.eventSource) {\n reject(new Error(\"EventSource not created\"));\n return;\n }\n\n const onOpen = () => {\n cleanup();\n this.setState(\"connected\");\n this.resetManualDisconnect();\n this.emit(\"connect\", undefined);\n resolve();\n };\n\n const onError = () => {\n cleanup();\n const error = new Error(\"Failed to connect to SSE stream\");\n this.emit(\"error\", { error });\n reject(error);\n };\n\n const cleanup = () => {\n this.eventSource?.removeEventListener(\"open\", onOpen);\n this.eventSource?.removeEventListener(\"error\", onError);\n };\n\n this.eventSource.addEventListener(\"open\", onOpen);\n this.eventSource.addEventListener(\"error\", onError);\n });\n\n // Setup message listeners for each event type\n this.setupEventListeners();\n } catch (error) {\n this.closeEventSource();\n throw error;\n }\n }\n\n /**\n * Close SSE connection.\n *\n * @remarks\n * Closes the EventSource and cleans up all event listeners.\n * Sets the manual disconnect flag to prevent automatic reconnection.\n *\n * @example\n * ```typescript\n * connection.disconnect();\n * console.log('Disconnected from SSE stream');\n * ```\n */\n disconnect(): void {\n this.setManualDisconnect();\n this.closeEventSource();\n this.handleDisconnect(\"Manual disconnect\");\n }\n\n /**\n * Get the last event ID received from the server.\n *\n * @returns Last event ID or null if none received\n *\n * @remarks\n * The event ID is used by the EventSource API to resume the stream\n * from the last received event after a reconnection. The browser\n * automatically sends this ID in the `Last-Event-ID` header.\n *\n * @example\n * ```typescript\n * const lastId = connection.getLastEventId();\n * if (lastId) {\n * console.log(`Last event: ${lastId}`);\n * }\n * ```\n */\n getLastEventId(): string | null {\n return this.lastEventId;\n }\n\n /**\n * Setup event listeners for configured event types.\n */\n private setupEventListeners(): void {\n if (!this.eventSource) return;\n\n // Add listener for each configured event type\n for (const eventType of this.sseConfig.eventTypes) {\n this.eventSource.addEventListener(eventType, (event: MessageEvent) => {\n this.handleMessage(event);\n });\n }\n\n // Add error listener for connection issues\n this.eventSource.addEventListener(\"error\", () => {\n this.handleError();\n });\n }\n\n /**\n * Handle incoming message event.\n */\n private handleMessage(event: MessageEvent): void {\n // Update last event ID if provided\n if (event.lastEventId) {\n this.lastEventId = event.lastEventId;\n }\n\n try {\n // Try to parse as JSON\n const data = JSON.parse(event.data);\n this.emit(\"message\", { data });\n } catch (error) {\n // If parsing fails, emit error but don't disconnect\n const parseError = new Error(\n `Failed to parse SSE message as JSON: ${event.data}`\n );\n this.emit(\"error\", { error: parseError });\n }\n }\n\n /**\n * Handle error event from EventSource.\n */\n private handleError(): void {\n // Only handle errors when connected (ignore reconnection attempts)\n if (this.state === \"connected\") {\n const error = new Error(\"SSE connection error\");\n this.emit(\"error\", { error });\n\n // Check if EventSource is closed\n if (this.eventSource?.readyState === EventSource.CLOSED) {\n this.closeEventSource();\n this.handleDisconnect(\"Connection closed by server\");\n }\n }\n }\n\n /**\n * Close EventSource and clean up.\n */\n private closeEventSource(): void {\n if (this.eventSource) {\n this.eventSource.close();\n this.eventSource = null;\n }\n }\n}\n","/**\n * @file WebSocket connection implementation\n * @module @maplibre-yaml/core/data/streaming\n */\n\nimport { BaseConnection } from \"./base-connection\";\nimport type { ConnectionConfig } from \"./base-connection\";\n\n/**\n * Configuration for WebSocket connections.\n *\n * @remarks\n * WebSocket provides full-duplex communication over a single TCP connection,\n * enabling bidirectional data flow between client and server.\n */\nexport interface WebSocketConfig extends ConnectionConfig {\n /**\n * WebSocket sub-protocols to use\n *\n * @remarks\n * Sub-protocols allow the client and server to agree on a specific\n * protocol on top of WebSocket. Can be a single string or array of strings.\n *\n * @example\n * ```typescript\n * protocols: 'json'\n * protocols: ['json', 'msgpack']\n * ```\n */\n protocols?: string | string[];\n}\n\n/**\n * WebSocket connection for bidirectional streaming.\n *\n * @remarks\n * Provides real-time bidirectional communication with automatic reconnection.\n * Unlike SSE, WebSocket supports sending data from client to server.\n *\n * Features:\n * - Full-duplex communication\n * - JSON message parsing with text fallback\n * - Manual reconnection with exponential backoff\n * - Sub-protocol support\n * - Send capability with connection validation\n *\n * @example\n * ```typescript\n * const ws = new WebSocketConnection({\n * url: 'wss://api.example.com/stream',\n * protocols: 'json',\n * });\n *\n * ws.on('message', ({ data }) => {\n * console.log('Received:', data);\n * });\n *\n * await ws.connect();\n * ws.send({ type: 'subscribe', channel: 'updates' });\n * ```\n */\nexport class WebSocketConnection extends BaseConnection {\n private ws: WebSocket | null = null;\n private readonly wsConfig: WebSocketConfig;\n\n /**\n * Create a new WebSocket connection.\n *\n * @param config - WebSocket configuration\n *\n * @example\n * ```typescript\n * const connection = new WebSocketConnection({\n * url: 'wss://api.example.com/stream',\n * protocols: ['json', 'v1'],\n * });\n * ```\n */\n constructor(config: WebSocketConfig) {\n super(config);\n\n this.wsConfig = {\n ...this.config,\n protocols: config.protocols,\n };\n }\n\n /**\n * Establish WebSocket connection.\n *\n * @remarks\n * Creates a WebSocket and sets up event listeners for:\n * - Connection open\n * - Message reception\n * - Connection close\n * - Errors\n *\n * Unlike EventSource, WebSocket does not have built-in reconnection,\n * so reconnection is handled manually via the BaseConnection.\n *\n * @throws Error if WebSocket is not supported or connection fails\n *\n * @example\n * ```typescript\n * await connection.connect();\n * console.log('Connected to WebSocket');\n * ```\n */\n async connect(): Promise<void> {\n if (this.ws !== null) {\n throw new Error(\"Connection already exists\");\n }\n\n this.setState(\"connecting\");\n\n try {\n // Create WebSocket with optional protocols\n this.ws = this.wsConfig.protocols\n ? new WebSocket(this.wsConfig.url, this.wsConfig.protocols)\n : new WebSocket(this.wsConfig.url);\n\n // Wait for connection to open\n await new Promise<void>((resolve, reject) => {\n if (!this.ws) {\n reject(new Error(\"WebSocket not created\"));\n return;\n }\n\n const onOpen = () => {\n cleanup();\n this.setState(\"connected\");\n this.resetManualDisconnect();\n this.emit(\"connect\", undefined);\n resolve();\n };\n\n const onError = () => {\n cleanup();\n const error = new Error(\"Failed to connect to WebSocket\");\n this.emit(\"error\", { error });\n reject(error);\n };\n\n const cleanup = () => {\n if (this.ws) {\n this.ws.removeEventListener(\"open\", onOpen);\n this.ws.removeEventListener(\"error\", onError);\n }\n };\n\n this.ws.addEventListener(\"open\", onOpen);\n this.ws.addEventListener(\"error\", onError);\n });\n\n // Setup message and close listeners\n this.setupEventListeners();\n } catch (error) {\n this.closeWebSocket();\n throw error;\n }\n }\n\n /**\n * Close WebSocket connection.\n *\n * @remarks\n * Closes the WebSocket with a normal closure code (1000).\n * Sets the manual disconnect flag to prevent automatic reconnection.\n *\n * @example\n * ```typescript\n * connection.disconnect();\n * console.log('Disconnected from WebSocket');\n * ```\n */\n disconnect(): void {\n this.setManualDisconnect();\n this.closeWebSocket();\n this.handleDisconnect(\"Manual disconnect\");\n }\n\n /**\n * Send data through WebSocket.\n *\n * @param data - Data to send (will be JSON stringified)\n * @throws Error if not connected\n *\n * @remarks\n * The data is automatically converted to JSON before sending.\n * Throws an error if called when the connection is not established.\n *\n * @example\n * ```typescript\n * connection.send({ type: 'ping' });\n * connection.send({ type: 'subscribe', channel: 'updates' });\n * ```\n */\n send(data: unknown): void {\n if (!this.isConnected() || !this.ws) {\n throw new Error(\"Cannot send: not connected\");\n }\n\n const message = JSON.stringify(data);\n this.ws.send(message);\n }\n\n /**\n * Setup WebSocket event listeners.\n */\n private setupEventListeners(): void {\n if (!this.ws) return;\n\n // Message listener\n this.ws.addEventListener(\"message\", (event: MessageEvent) => {\n this.handleMessage(event);\n });\n\n // Close listener\n this.ws.addEventListener(\"close\", (event: CloseEvent) => {\n this.handleClose(event);\n });\n\n // Error listener\n this.ws.addEventListener(\"error\", () => {\n this.handleError();\n });\n }\n\n /**\n * Handle incoming message event.\n */\n private handleMessage(event: MessageEvent): void {\n try {\n // Try to parse as JSON\n const data = JSON.parse(event.data);\n this.emit(\"message\", { data });\n } catch {\n // If parsing fails, emit raw text data\n this.emit(\"message\", { data: event.data });\n }\n }\n\n /**\n * Handle close event from WebSocket.\n */\n private handleClose(event: CloseEvent): void {\n this.closeWebSocket();\n\n const reason = event.reason || `WebSocket closed (code: ${event.code})`;\n this.handleDisconnect(reason);\n }\n\n /**\n * Handle error event from WebSocket.\n */\n private handleError(): void {\n if (this.state === \"connecting\" || this.state === \"connected\") {\n const error = new Error(\"WebSocket connection error\");\n this.emit(\"error\", { error });\n }\n }\n\n /**\n * Close WebSocket and clean up.\n */\n private closeWebSocket(): void {\n if (this.ws) {\n // Use normal closure code (1000)\n if (this.ws.readyState === WebSocket.OPEN) {\n this.ws.close(1000, \"Normal closure\");\n }\n this.ws = null;\n }\n }\n}\n","import type { FeatureCollection } from \"geojson\";\nimport type { ConnectionState } from \"./base-connection\";\nimport { SSEConnection } from \"./sse-connection\";\nimport { WebSocketConnection } from \"./websocket-connection\";\nimport type { SSEConfig } from \"./sse-connection\";\nimport type { WebSocketConfig } from \"./websocket-connection\";\n\n/**\n * Configuration for a streaming connection.\n *\n * @example\n * ```typescript\n * const config: StreamConfig = {\n * type: 'sse',\n * url: 'https://api.example.com/events',\n * onData: (data) => console.log('Received:', data),\n * reconnect: { enabled: true, maxRetries: 10 }\n * };\n * ```\n */\nexport interface StreamConfig {\n /** Type of streaming connection */\n type: \"websocket\" | \"sse\";\n\n /** URL for the streaming connection */\n url: string;\n\n /** Callback for incoming data */\n onData: (data: FeatureCollection) => void;\n\n /** Callback for connection state changes */\n onStateChange?: (state: ConnectionState) => void;\n\n /** Callback for errors */\n onError?: (error: Error) => void;\n\n /** Reconnection configuration */\n reconnect?: {\n enabled?: boolean;\n maxRetries?: number;\n initialDelay?: number;\n maxDelay?: number;\n };\n\n /** Event types to listen for (SSE only) */\n eventTypes?: string[];\n\n /** WebSocket protocols (WebSocket only) */\n protocols?: string | string[];\n}\n\n/**\n * State of a streaming connection.\n */\nexport interface StreamState {\n /** Current connection state */\n connectionState: ConnectionState;\n\n /** Number of messages received */\n messageCount: number;\n\n /** Timestamp of last message (milliseconds) */\n lastMessage: number | null;\n\n /** Number of reconnection attempts */\n reconnectAttempts: number;\n}\n\n/**\n * Internal stream subscription.\n */\ninterface StreamSubscription {\n config: StreamConfig;\n connection: SSEConnection | WebSocketConnection;\n state: StreamState;\n}\n\n/**\n * Manages streaming connections (SSE and WebSocket).\n *\n * @remarks\n * Provides a unified interface for managing multiple streaming connections,\n * handling connection lifecycle, automatic reconnection, and message routing.\n *\n * Features:\n * - Multiple concurrent connections\n * - Automatic reconnection with exponential backoff\n * - Connection state tracking\n * - Message counting and statistics\n * - Type-safe callbacks\n *\n * @example\n * ```typescript\n * const manager = new StreamManager();\n *\n * // Connect to SSE stream\n * await manager.connect('earthquake-feed', {\n * type: 'sse',\n * url: 'https://earthquake.usgs.gov/events',\n * onData: (data) => updateMap(data),\n * reconnect: { enabled: true }\n * });\n *\n * // Connect to WebSocket stream\n * await manager.connect('vehicle-updates', {\n * type: 'websocket',\n * url: 'wss://transit.example.com/vehicles',\n * onData: (data) => updateVehicles(data),\n * protocols: ['json']\n * });\n *\n * // Send data via WebSocket\n * manager.send('vehicle-updates', { type: 'subscribe', channel: 'all' });\n *\n * // Check connection state\n * const state = manager.getState('earthquake-feed');\n * console.log(`Messages received: ${state?.messageCount}`);\n *\n * // Disconnect when done\n * manager.disconnect('earthquake-feed');\n * manager.disconnectAll();\n * ```\n */\nexport class StreamManager {\n private subscriptions = new Map<string, StreamSubscription>();\n\n /**\n * Connect to a streaming source.\n *\n * @param id - Unique identifier for this connection\n * @param config - Stream configuration\n * @throws {Error} If a connection with the given id already exists\n *\n * @example\n * ```typescript\n * await manager.connect('updates', {\n * type: 'sse',\n * url: 'https://api.example.com/stream',\n * onData: (data) => console.log(data)\n * });\n * ```\n */\n async connect(id: string, config: StreamConfig): Promise<void> {\n if (this.subscriptions.has(id)) {\n throw new Error(`Stream with id \"${id}\" already exists`);\n }\n\n // Create connection based on type\n const connection = this.createConnection(config);\n\n // Initialize state\n const state: StreamState = {\n connectionState: \"disconnected\",\n messageCount: 0,\n lastMessage: null,\n reconnectAttempts: 0,\n };\n\n // Store subscription\n this.subscriptions.set(id, { config, connection, state });\n\n // Setup event handlers\n this.setupEventHandlers(connection, config, state);\n\n // Connect\n await connection.connect();\n }\n\n /**\n * Disconnect a specific stream.\n *\n * @param id - Stream identifier\n *\n * @example\n * ```typescript\n * manager.disconnect('updates');\n * ```\n */\n disconnect(id: string): void {\n const subscription = this.subscriptions.get(id);\n if (!subscription) {\n return;\n }\n\n subscription.connection.disconnect();\n this.subscriptions.delete(id);\n }\n\n /**\n * Disconnect all active streams.\n *\n * @example\n * ```typescript\n * manager.disconnectAll();\n * ```\n */\n disconnectAll(): void {\n for (const id of this.subscriptions.keys()) {\n this.disconnect(id);\n }\n }\n\n /**\n * Get the current state of a stream.\n *\n * @param id - Stream identifier\n * @returns Stream state or null if not found\n *\n * @example\n * ```typescript\n * const state = manager.getState('updates');\n * if (state) {\n * console.log(`State: ${state.connectionState}`);\n * console.log(`Messages: ${state.messageCount}`);\n * }\n * ```\n */\n getState(id: string): StreamState | null {\n const subscription = this.subscriptions.get(id);\n return subscription ? { ...subscription.state } : null;\n }\n\n /**\n * Check if a stream is currently connected.\n *\n * @param id - Stream identifier\n * @returns True if connected, false otherwise\n *\n * @example\n * ```typescript\n * if (manager.isConnected('updates')) {\n * console.log('Stream is active');\n * }\n * ```\n */\n isConnected(id: string): boolean {\n const subscription = this.subscriptions.get(id);\n return subscription ? subscription.connection.isConnected() : false;\n }\n\n /**\n * Get all active stream IDs.\n *\n * @returns Array of active stream identifiers\n *\n * @example\n * ```typescript\n * const activeStreams = manager.getActiveIds();\n * console.log(`Active streams: ${activeStreams.join(', ')}`);\n * ```\n */\n getActiveIds(): string[] {\n return Array.from(this.subscriptions.keys());\n }\n\n /**\n * Send data to a WebSocket connection.\n *\n * @param id - Stream identifier\n * @param data - Data to send (will be JSON stringified)\n * @throws {Error} If stream is not a WebSocket connection or not connected\n *\n * @example\n * ```typescript\n * manager.send('ws-updates', {\n * type: 'subscribe',\n * channels: ['news', 'sports']\n * });\n * ```\n */\n send(id: string, data: unknown): void {\n const subscription = this.subscriptions.get(id);\n if (!subscription) {\n throw new Error(`Stream \"${id}\" not found`);\n }\n\n if (!(subscription.connection instanceof WebSocketConnection)) {\n throw new Error(`Stream \"${id}\" is not a WebSocket connection`);\n }\n\n subscription.connection.send(data);\n }\n\n /**\n * Clean up all resources.\n *\n * @example\n * ```typescript\n * manager.destroy();\n * ```\n */\n destroy(): void {\n this.disconnectAll();\n }\n\n /**\n * Create a connection instance based on config type.\n */\n private createConnection(\n config: StreamConfig\n ): SSEConnection | WebSocketConnection {\n const reconnectConfig =\n config.reconnect?.enabled !== false\n ? {\n reconnect: true,\n retryConfig: {\n maxRetries: config.reconnect?.maxRetries ?? 10,\n initialDelay: config.reconnect?.initialDelay ?? 1000,\n maxDelay: config.reconnect?.maxDelay ?? 30000,\n },\n }\n : { reconnect: false };\n\n if (config.type === \"sse\") {\n const sseConfig: SSEConfig = {\n url: config.url,\n ...reconnectConfig,\n eventTypes: config.eventTypes,\n };\n return new SSEConnection(sseConfig);\n } else {\n const wsConfig: WebSocketConfig = {\n url: config.url,\n ...reconnectConfig,\n protocols: config.protocols,\n };\n return new WebSocketConnection(wsConfig);\n }\n }\n\n /**\n * Setup event handlers for a connection.\n */\n private setupEventHandlers(\n connection: SSEConnection | WebSocketConnection,\n config: StreamConfig,\n state: StreamState\n ): void {\n // State change handler\n connection.on(\"stateChange\", ({ to }) => {\n state.connectionState = to;\n config.onStateChange?.(to);\n });\n\n // Message handler\n connection.on(\"message\", ({ data }) => {\n state.messageCount++;\n state.lastMessage = Date.now();\n\n // Validate data is a FeatureCollection\n if (this.isFeatureCollection(data)) {\n config.onData(data);\n } else {\n const error = new Error(\n \"Received data is not a valid GeoJSON FeatureCollection\"\n );\n config.onError?.(error);\n }\n });\n\n // Error handler\n connection.on(\"error\", ({ error }) => {\n config.onError?.(error);\n });\n\n // Reconnection tracking\n connection.on(\"reconnecting\", () => {\n state.reconnectAttempts++;\n });\n\n // Reset attempts on successful reconnection\n connection.on(\"reconnected\", () => {\n state.reconnectAttempts = 0;\n });\n\n // Failed connection\n connection.on(\"failed\", ({ lastError }) => {\n config.onError?.(lastError);\n });\n }\n\n /**\n * Type guard to check if data is a FeatureCollection.\n */\n private isFeatureCollection(data: unknown): data is FeatureCollection {\n return (\n typeof data === \"object\" &&\n data !== null &&\n \"type\" in data &&\n data.type === \"FeatureCollection\" &&\n \"features\" in data &&\n Array.isArray(data.features)\n );\n }\n}\n","import type { FeatureCollection, Feature } from \"geojson\";\n\n/**\n * Strategy for merging data.\n */\nexport type MergeStrategy = \"replace\" | \"merge\" | \"append-window\";\n\n/**\n * Options for merging data.\n *\n * @example\n * ```typescript\n * // Replace strategy\n * const replaceOptions: MergeOptions = {\n * strategy: 'replace'\n * };\n *\n * // Merge strategy with update key\n * const mergeOptions: MergeOptions = {\n * strategy: 'merge',\n * updateKey: 'id'\n * };\n *\n * // Append-window with size and time limits\n * const windowOptions: MergeOptions = {\n * strategy: 'append-window',\n * windowSize: 100,\n * windowDuration: 3600000, // 1 hour\n * timestampField: 'timestamp'\n * };\n * ```\n */\nexport interface MergeOptions {\n /** Merge strategy to use */\n strategy: MergeStrategy;\n\n /** Property key used to identify features for merge strategy */\n updateKey?: string;\n\n /** Maximum number of features to keep (append-window) */\n windowSize?: number;\n\n /** Maximum age of features in milliseconds (append-window) */\n windowDuration?: number;\n\n /** Property field containing timestamp (append-window) */\n timestampField?: string;\n}\n\n/**\n * Result of a merge operation.\n */\nexport interface MergeResult {\n /** Merged feature collection */\n data: FeatureCollection;\n\n /** Number of features added */\n added: number;\n\n /** Number of features updated */\n updated: number;\n\n /** Number of features removed */\n removed: number;\n\n /** Total number of features in result */\n total: number;\n}\n\n/**\n * Merges GeoJSON FeatureCollections using configurable strategies.\n *\n * @remarks\n * Supports three merge strategies:\n *\n * **replace**: Complete replacement of existing data\n * - Replaces all existing features with incoming features\n * - Simple and efficient for full updates\n *\n * **merge**: Update by key, keep unmatched\n * - Updates existing features by matching on a key property\n * - Adds new features that don't match existing keys\n * - Preserves existing features not in the update\n * - Requires `updateKey` option\n *\n * **append-window**: Add with time/size limits\n * - Appends incoming features to existing features\n * - Applies size limit (keeps most recent N features)\n * - Applies time limit (removes features older than duration)\n * - Requires `timestampField` for time-based filtering\n *\n * @example\n * ```typescript\n * const merger = new DataMerger();\n *\n * // Replace all data\n * const result = merger.merge(existing, incoming, {\n * strategy: 'replace'\n * });\n *\n * // Merge by vehicle ID\n * const result = merger.merge(existing, incoming, {\n * strategy: 'merge',\n * updateKey: 'vehicleId'\n * });\n *\n * // Append with 100 feature limit and 1 hour window\n * const result = merger.merge(existing, incoming, {\n * strategy: 'append-window',\n * windowSize: 100,\n * windowDuration: 3600000,\n * timestampField: 'timestamp'\n * });\n * ```\n */\nexport class DataMerger {\n /**\n * Merge two FeatureCollections using the specified strategy.\n *\n * @param existing - Existing feature collection\n * @param incoming - Incoming feature collection to merge\n * @param options - Merge options including strategy\n * @returns Merge result with statistics\n * @throws {Error} If merge strategy requires missing options\n *\n * @example\n * ```typescript\n * const merger = new DataMerger();\n *\n * const result = merger.merge(existingData, newData, {\n * strategy: 'merge',\n * updateKey: 'id'\n * });\n *\n * console.log(`Added: ${result.added}, Updated: ${result.updated}`);\n * console.log(`Total features: ${result.total}`);\n * ```\n */\n merge(\n existing: FeatureCollection,\n incoming: FeatureCollection,\n options: MergeOptions\n ): MergeResult {\n switch (options.strategy) {\n case \"replace\":\n return this.mergeReplace(existing, incoming);\n case \"merge\":\n return this.mergeMerge(existing, incoming, options);\n case \"append-window\":\n return this.mergeAppendWindow(existing, incoming, options);\n default:\n throw new Error(\n `Unknown merge strategy: ${options.strategy as string}`\n );\n }\n }\n\n /**\n * Replace strategy: Complete replacement of existing data.\n */\n private mergeReplace(\n existing: FeatureCollection,\n incoming: FeatureCollection\n ): MergeResult {\n return {\n data: incoming,\n added: incoming.features.length,\n updated: 0,\n removed: existing.features.length,\n total: incoming.features.length,\n };\n }\n\n /**\n * Merge strategy: Update by key, keep unmatched features.\n */\n private mergeMerge(\n existing: FeatureCollection,\n incoming: FeatureCollection,\n options: MergeOptions\n ): MergeResult {\n if (!options.updateKey) {\n throw new Error(\"updateKey is required for merge strategy\");\n }\n\n const updateKey = options.updateKey;\n let added = 0;\n let updated = 0;\n\n // Create a map of existing features by their key\n const existingMap = new Map<unknown, Feature>();\n for (const feature of existing.features) {\n const key = feature.properties?.[updateKey];\n if (key !== undefined && key !== null) {\n existingMap.set(key, feature);\n }\n }\n\n // Process incoming features\n for (const feature of incoming.features) {\n const key = feature.properties?.[updateKey];\n if (key !== undefined && key !== null) {\n if (existingMap.has(key)) {\n updated++;\n } else {\n added++;\n }\n existingMap.set(key, feature);\n }\n }\n\n // Convert map back to features array\n const features = Array.from(existingMap.values());\n\n return {\n data: {\n type: \"FeatureCollection\",\n features,\n },\n added,\n updated,\n removed: 0,\n total: features.length,\n };\n }\n\n /**\n * Append-window strategy: Add with time/size limits.\n */\n private mergeAppendWindow(\n existing: FeatureCollection,\n incoming: FeatureCollection,\n options: MergeOptions\n ): MergeResult {\n const initialCount = existing.features.length;\n\n // Combine existing and incoming features\n let features = [...existing.features, ...incoming.features];\n\n // Apply time window if configured\n if (options.windowDuration && options.timestampField) {\n const cutoffTime = Date.now() - options.windowDuration;\n\n features = features.filter((feature) => {\n const timestamp = feature.properties?.[options.timestampField!];\n if (typeof timestamp === \"number\") {\n return timestamp >= cutoffTime;\n }\n // Keep features without timestamp (safer than removing)\n return true;\n });\n\n // Sort by timestamp descending (most recent first)\n features.sort((a, b) => {\n const timeA = a.properties?.[options.timestampField!] ?? 0;\n const timeB = b.properties?.[options.timestampField!] ?? 0;\n return (timeB as number) - (timeA as number);\n });\n\n // Apply size window if configured\n if (options.windowSize && features.length > options.windowSize) {\n features = features.slice(0, options.windowSize);\n }\n\n const removed = initialCount + incoming.features.length - features.length;\n\n return {\n data: {\n type: \"FeatureCollection\",\n features,\n },\n added: incoming.features.length,\n updated: 0,\n removed,\n total: features.length,\n };\n }\n\n // Apply size window only if no time window\n if (options.windowSize) {\n // For size-only window, keep most recent features\n // If timestampField is provided, sort by it; otherwise keep insertion order\n if (options.timestampField) {\n features.sort((a, b) => {\n const timeA = a.properties?.[options.timestampField!] ?? 0;\n const timeB = b.properties?.[options.timestampField!] ?? 0;\n return (timeB as number) - (timeA as number);\n });\n }\n\n if (features.length > options.windowSize) {\n features = features.slice(0, options.windowSize);\n }\n }\n\n const removed = initialCount + incoming.features.length - features.length;\n\n return {\n data: {\n type: \"FeatureCollection\",\n features,\n },\n added: incoming.features.length,\n updated: 0,\n removed,\n total: features.length,\n };\n }\n}\n","import { EventEmitter } from \"../utils/event-emitter\";\n\n/**\n * Configuration for the loading manager.\n */\nexport interface LoadingConfig {\n /** Whether to show loading UI overlays (default: false) */\n showUI: boolean;\n\n /** Custom messages for loading states */\n messages?: {\n loading?: string;\n error?: string;\n retry?: string;\n };\n\n /** Spinner style (default: 'circle') */\n spinnerStyle?: \"circle\" | \"dots\";\n\n /** Minimum time to display loading UI in milliseconds (default: 300) */\n minDisplayTime?: number;\n}\n\n/**\n * Events emitted by the loading manager.\n */\nexport interface LoadingEvents extends Record<string, unknown> {\n \"loading:start\": { layerId: string; message?: string };\n \"loading:progress\": { layerId: string; loaded: number; total?: number };\n \"loading:complete\": {\n layerId: string;\n duration: number;\n fromCache: boolean;\n };\n \"loading:error\": { layerId: string; error: Error; retrying: boolean };\n \"loading:retry\": { layerId: string; attempt: number; delay: number };\n}\n\n/**\n * State of a loading operation.\n */\nexport interface LoadingState {\n /** Whether currently loading */\n isLoading: boolean;\n\n /** When loading started (timestamp) */\n startTime: number | null;\n\n /** Custom loading message */\n message?: string;\n\n /** Current error if any */\n error?: Error;\n\n /** Current retry attempt number */\n retryAttempt?: number;\n}\n\n/**\n * Internal loading subscription with UI elements.\n */\ninterface LoadingSubscription {\n state: LoadingState;\n container: HTMLElement | null;\n overlay: HTMLElement | null;\n minDisplayTimer: number | null;\n}\n\n/**\n * Manages loading states and optional UI overlays.\n *\n * @remarks\n * Provides centralized loading state management with optional visual feedback.\n * Emits events for all loading state changes, allowing external UI integration.\n * Can optionally show built-in loading overlays with spinners and error messages.\n *\n * Features:\n * - Event-driven state changes\n * - Optional loading UI overlays\n * - Customizable messages and spinner styles\n * - Minimum display time to prevent flashing\n * - Retry support with visual feedback\n * - Multiple concurrent loading operations\n *\n * @example\n * ```typescript\n * const manager = new LoadingManager({\n * showUI: true,\n * minDisplayTime: 300\n * });\n *\n * // Listen to loading events\n * manager.on('loading:start', ({ layerId }) => {\n * console.log(`Loading ${layerId}...`);\n * });\n *\n * // Show loading state\n * const container = document.getElementById('map-container');\n * manager.showLoading('vehicles', container, 'Loading vehicle data...');\n *\n * // Hide when complete\n * manager.hideLoading('vehicles', { fromCache: false });\n *\n * // Show error with retry\n * manager.showError('vehicles', container, new Error('Failed'), () => {\n * // Retry logic\n * });\n * ```\n */\nexport class LoadingManager extends EventEmitter<LoadingEvents> {\n private config: Required<LoadingConfig>;\n private subscriptions = new Map<string, LoadingSubscription>();\n\n private static readonly DEFAULT_CONFIG: Required<LoadingConfig> = {\n showUI: false,\n messages: {\n loading: \"Loading...\",\n error: \"Failed to load data\",\n retry: \"Retrying...\",\n },\n spinnerStyle: \"circle\",\n minDisplayTime: 300,\n };\n\n /**\n * Create a new LoadingManager.\n *\n * @param config - Loading manager configuration\n *\n * @example\n * ```typescript\n * const manager = new LoadingManager({\n * showUI: true,\n * messages: {\n * loading: 'Fetching data...',\n * error: 'Could not load data'\n * },\n * spinnerStyle: 'dots',\n * minDisplayTime: 500\n * });\n * ```\n */\n constructor(config?: Partial<LoadingConfig>) {\n super();\n\n this.config = {\n ...LoadingManager.DEFAULT_CONFIG,\n ...config,\n messages: {\n ...LoadingManager.DEFAULT_CONFIG.messages,\n ...config?.messages,\n },\n };\n }\n\n /**\n * Show loading state for a layer.\n *\n * @param layerId - Layer identifier\n * @param container - Container element for UI overlay\n * @param message - Custom loading message\n *\n * @example\n * ```typescript\n * const container = document.getElementById('map');\n * manager.showLoading('earthquakes', container, 'Loading earthquake data...');\n * ```\n */\n showLoading(layerId: string, container: HTMLElement, message?: string): void {\n const existingSub = this.subscriptions.get(layerId);\n if (existingSub?.state.isLoading) {\n return; // Already loading\n }\n\n const state: LoadingState = {\n isLoading: true,\n startTime: Date.now(),\n message: message || this.config.messages.loading,\n };\n\n let overlay: HTMLElement | null = null;\n if (this.config.showUI) {\n overlay = this.createLoadingOverlay(\n state.message || this.config.messages.loading || \"Loading...\"\n );\n container.style.position = \"relative\";\n container.appendChild(overlay);\n }\n\n this.subscriptions.set(layerId, {\n state,\n container,\n overlay,\n minDisplayTimer: null,\n });\n\n this.emit(\"loading:start\", { layerId, message: state.message });\n }\n\n /**\n * Hide loading state for a layer.\n *\n * @param layerId - Layer identifier\n * @param result - Optional result information\n *\n * @example\n * ```typescript\n * manager.hideLoading('earthquakes', { fromCache: true });\n * ```\n */\n hideLoading(layerId: string, result?: { fromCache: boolean }): void {\n const subscription = this.subscriptions.get(layerId);\n if (!subscription?.state.isLoading) {\n return;\n }\n\n const duration = Date.now() - (subscription.state.startTime || Date.now());\n const timeRemaining = Math.max(0, this.config.minDisplayTime - duration);\n\n const cleanup = () => {\n if (subscription.overlay) {\n subscription.overlay.remove();\n }\n subscription.state.isLoading = false;\n subscription.state.startTime = null;\n subscription.state.error = undefined;\n subscription.state.retryAttempt = undefined;\n\n this.emit(\"loading:complete\", {\n layerId,\n duration,\n fromCache: result?.fromCache ?? false,\n });\n };\n\n if (timeRemaining > 0 && subscription.overlay) {\n // Wait for minimum display time\n subscription.minDisplayTimer = window.setTimeout(cleanup, timeRemaining);\n } else {\n cleanup();\n }\n }\n\n /**\n * Show error state for a layer.\n *\n * @param layerId - Layer identifier\n * @param container - Container element for UI overlay\n * @param error - Error that occurred\n * @param onRetry - Optional retry callback\n *\n * @example\n * ```typescript\n * manager.showError('earthquakes', container, error, () => {\n * // Retry loading\n * fetchData();\n * });\n * ```\n */\n showError(\n layerId: string,\n container: HTMLElement,\n error: Error,\n onRetry?: () => void\n ): void {\n const subscription = this.subscriptions.get(layerId);\n const state: LoadingState = subscription?.state || {\n isLoading: false,\n startTime: null,\n };\n\n state.error = error;\n state.isLoading = false;\n\n // Remove loading overlay if present\n if (subscription?.overlay) {\n subscription.overlay.remove();\n }\n\n let overlay: HTMLElement | null = null;\n if (this.config.showUI) {\n overlay = this.createErrorOverlay(\n error.message || this.config.messages.error || \"An error occurred\",\n onRetry\n );\n container.style.position = \"relative\";\n container.appendChild(overlay);\n }\n\n this.subscriptions.set(layerId, {\n state,\n container,\n overlay,\n minDisplayTimer: null,\n });\n\n this.emit(\"loading:error\", {\n layerId,\n error,\n retrying: !!onRetry,\n });\n }\n\n /**\n * Show retrying state for a layer.\n *\n * @param layerId - Layer identifier\n * @param attempt - Current retry attempt number\n * @param delay - Delay before retry in milliseconds\n *\n * @example\n * ```typescript\n * manager.showRetrying('earthquakes', 2, 2000);\n * ```\n */\n showRetrying(layerId: string, attempt: number, delay: number): void {\n const subscription = this.subscriptions.get(layerId);\n if (subscription) {\n subscription.state.retryAttempt = attempt;\n\n if (subscription.overlay && this.config.showUI) {\n const message = `${this.config.messages.retry} (attempt ${attempt})`;\n const newOverlay = this.createLoadingOverlay(message);\n subscription.overlay.replaceWith(newOverlay);\n subscription.overlay = newOverlay;\n }\n }\n\n this.emit(\"loading:retry\", { layerId, attempt, delay });\n }\n\n /**\n * Get loading state for a layer.\n *\n * @param layerId - Layer identifier\n * @returns Loading state or null if not found\n *\n * @example\n * ```typescript\n * const state = manager.getState('earthquakes');\n * if (state?.isLoading) {\n * console.log('Still loading...');\n * }\n * ```\n */\n getState(layerId: string): LoadingState | null {\n const subscription = this.subscriptions.get(layerId);\n return subscription ? { ...subscription.state } : null;\n }\n\n /**\n * Check if a layer is currently loading.\n *\n * @param layerId - Layer identifier\n * @returns True if loading, false otherwise\n *\n * @example\n * ```typescript\n * if (manager.isLoading('earthquakes')) {\n * console.log('Loading in progress');\n * }\n * ```\n */\n isLoading(layerId: string): boolean {\n return this.subscriptions.get(layerId)?.state.isLoading ?? false;\n }\n\n /**\n * Clear all loading states and UI.\n *\n * @example\n * ```typescript\n * manager.clearAll();\n * ```\n */\n clearAll(): void {\n for (const [layerId, subscription] of this.subscriptions.entries()) {\n if (subscription.minDisplayTimer) {\n clearTimeout(subscription.minDisplayTimer);\n }\n if (subscription.overlay) {\n subscription.overlay.remove();\n }\n this.subscriptions.delete(layerId);\n }\n }\n\n /**\n * Clean up all resources.\n *\n * @example\n * ```typescript\n * manager.destroy();\n * ```\n */\n destroy(): void {\n this.clearAll();\n this.removeAllListeners();\n }\n\n /**\n * Create loading overlay element.\n */\n private createLoadingOverlay(message: string): HTMLElement {\n const overlay = document.createElement(\"div\");\n overlay.className = \"mly-loading-overlay\";\n\n const content = document.createElement(\"div\");\n content.className = \"mly-loading-content\";\n\n const spinner = document.createElement(\"div\");\n spinner.className = `mly-spinner mly-spinner--${this.config.spinnerStyle}`;\n\n const text = document.createElement(\"div\");\n text.className = \"mly-loading-text\";\n text.textContent = message;\n\n content.appendChild(spinner);\n content.appendChild(text);\n overlay.appendChild(content);\n\n return overlay;\n }\n\n /**\n * Create error overlay element.\n */\n private createErrorOverlay(\n message: string,\n onRetry?: () => void\n ): HTMLElement {\n const overlay = document.createElement(\"div\");\n overlay.className = \"mly-loading-overlay mly-loading-overlay--error\";\n\n const content = document.createElement(\"div\");\n content.className = \"mly-error-content\";\n\n const icon = document.createElement(\"div\");\n icon.className = \"mly-error-icon\";\n icon.textContent = \"⚠\";\n\n const text = document.createElement(\"div\");\n text.className = \"mly-error-text\";\n text.textContent = message;\n\n content.appendChild(icon);\n content.appendChild(text);\n\n if (onRetry) {\n const button = document.createElement(\"button\");\n button.className = \"mly-retry-button\";\n button.textContent = \"Retry\";\n button.onclick = () => {\n overlay.remove();\n onRetry();\n };\n content.appendChild(button);\n }\n\n overlay.appendChild(content);\n\n return overlay;\n }\n}\n","/**\n * @file Layer manager for MapLibre map layers\n * @module @maplibre-yaml/core/renderer\n */\n\nimport type { Map as MapLibreMap, GeoJSONSource } from \"maplibre-gl\";\nimport type { z } from \"zod\";\nimport type { FeatureCollection } from \"geojson\";\nimport {\n LayerSchema,\n GeoJSONSourceSchema,\n VectorSourceSchema,\n RasterSourceSchema,\n ImageSourceSchema,\n VideoSourceSchema,\n} from \"../schemas\";\nimport { DataFetcher } from \"../data/data-fetcher\";\nimport { PollingManager } from \"../data/polling-manager\";\nimport { StreamManager } from \"../data/streaming/stream-manager\";\nimport { DataMerger } from \"../data/merge/data-merger\";\nimport { LoadingManager } from \"../ui/loading-manager\";\nimport type { MergeStrategy } from \"../data/merge/data-merger\";\n\ntype Layer = z.infer<typeof LayerSchema>;\ntype GeoJSONSourceConfig = z.infer<typeof GeoJSONSourceSchema>;\ntype VectorSourceConfig = z.infer<typeof VectorSourceSchema>;\ntype RasterSourceConfig = z.infer<typeof RasterSourceSchema>;\ntype ImageSourceConfig = z.infer<typeof ImageSourceSchema>;\ntype VideoSourceConfig = z.infer<typeof VideoSourceSchema>;\n\n/**\n * Callbacks for layer data loading events\n */\nexport interface LayerManagerCallbacks {\n onDataLoading?: (layerId: string) => void;\n onDataLoaded?: (layerId: string, featureCount: number) => void;\n onDataError?: (layerId: string, error: Error) => void;\n}\n\n/**\n * Manages map layers and their data sources\n */\nexport class LayerManager {\n private map: MapLibreMap;\n private callbacks: LayerManagerCallbacks;\n private dataFetcher: DataFetcher;\n private pollingManager: PollingManager;\n private streamManager: StreamManager;\n private dataMerger: DataMerger;\n private loadingManager: LoadingManager;\n private sourceData: Map<string, FeatureCollection>;\n private layerToSource: Map<string, string>;\n\n // Legacy support (deprecated)\n private refreshIntervals: Map<string, NodeJS.Timeout>;\n private abortControllers: Map<string, AbortController>;\n\n constructor(map: MapLibreMap, callbacks?: LayerManagerCallbacks) {\n this.map = map;\n this.callbacks = callbacks || {};\n this.dataFetcher = new DataFetcher();\n this.pollingManager = new PollingManager();\n this.streamManager = new StreamManager();\n this.dataMerger = new DataMerger();\n this.loadingManager = new LoadingManager({ showUI: false });\n this.sourceData = new Map();\n this.layerToSource = new Map();\n\n // Legacy support\n this.refreshIntervals = new Map();\n this.abortControllers = new Map();\n }\n\n async addLayer(layer: Layer): Promise<void> {\n const sourceId = `${layer.id}-source`;\n this.layerToSource.set(layer.id, sourceId);\n await this.addSource(sourceId, layer);\n\n const layerSpec: any = {\n id: layer.id,\n type: layer.type,\n source: sourceId,\n };\n\n if (\"paint\" in layer && layer.paint) layerSpec.paint = layer.paint;\n if (\"layout\" in layer && layer.layout) layerSpec.layout = layer.layout;\n if (\"source-layer\" in layer && layer[\"source-layer\"])\n layerSpec[\"source-layer\"] = layer[\"source-layer\"];\n if (layer.minzoom !== undefined) layerSpec.minzoom = layer.minzoom;\n if (layer.maxzoom !== undefined) layerSpec.maxzoom = layer.maxzoom;\n if (layer.filter) layerSpec.filter = layer.filter;\n\n if (layer.visible === false) {\n layerSpec.layout = layerSpec.layout || {};\n layerSpec.layout.visibility = \"none\";\n }\n\n this.map.addLayer(layerSpec, layer.before as string | undefined);\n\n // Check if this is a GeoJSON source with refresh interval (legacy or new config)\n if (typeof layer.source === \"object\" && layer.source !== null) {\n const sourceObj = layer.source as GeoJSONSourceConfig;\n if (sourceObj.type === \"geojson\") {\n // Use new refresh config if available, otherwise fall back to legacy\n if (sourceObj.refresh || sourceObj.refreshInterval) {\n await this.setupDataUpdates(layer.id, sourceId, sourceObj);\n }\n }\n }\n }\n\n private async addSource(sourceId: string, layer: Layer): Promise<void> {\n // Handle source reference (string ID)\n if (typeof layer.source === \"string\") {\n if (!this.map.getSource(layer.source)) {\n throw new Error(`Source reference '${layer.source}' not found`);\n }\n return;\n }\n\n // layer.source is now guaranteed to be an object\n const source = layer.source as { type: string };\n\n if (source.type === \"geojson\") {\n const geojsonSource = source as unknown as GeoJSONSourceConfig;\n\n if (geojsonSource.url) {\n await this.addGeoJSONSourceFromURL(sourceId, layer.id, geojsonSource);\n } else if (geojsonSource.data) {\n const sourceSpec: any = {\n type: \"geojson\",\n data: geojsonSource.data,\n };\n\n // Only add clustering properties if they are defined\n if (geojsonSource.cluster !== undefined) sourceSpec.cluster = geojsonSource.cluster;\n if (geojsonSource.clusterRadius !== undefined) sourceSpec.clusterRadius = geojsonSource.clusterRadius;\n if (geojsonSource.clusterMaxZoom !== undefined) sourceSpec.clusterMaxZoom = geojsonSource.clusterMaxZoom;\n if (geojsonSource.clusterMinPoints !== undefined) sourceSpec.clusterMinPoints = geojsonSource.clusterMinPoints;\n if (geojsonSource.clusterProperties !== undefined) sourceSpec.clusterProperties = geojsonSource.clusterProperties;\n\n this.map.addSource(sourceId, sourceSpec);\n } else if (geojsonSource.stream) {\n this.map.addSource(sourceId, {\n type: \"geojson\",\n data: { type: \"FeatureCollection\", features: [] },\n });\n }\n } else if (source.type === \"vector\") {\n const vectorSource = source as unknown as VectorSourceConfig;\n const vectorSpec: any = { type: \"vector\" };\n if (vectorSource.url) vectorSpec.url = vectorSource.url;\n if (vectorSource.tiles) vectorSpec.tiles = vectorSource.tiles;\n if (vectorSource.minzoom !== undefined)\n vectorSpec.minzoom = vectorSource.minzoom;\n if (vectorSource.maxzoom !== undefined)\n vectorSpec.maxzoom = vectorSource.maxzoom;\n if (vectorSource.bounds) vectorSpec.bounds = vectorSource.bounds;\n if (vectorSource.attribution)\n vectorSpec.attribution = vectorSource.attribution;\n this.map.addSource(sourceId, vectorSpec);\n } else if (source.type === \"raster\") {\n const rasterSource = source as unknown as RasterSourceConfig;\n const rasterSpec: any = { type: \"raster\" };\n if (rasterSource.url) rasterSpec.url = rasterSource.url;\n if (rasterSource.tiles) rasterSpec.tiles = rasterSource.tiles;\n if (rasterSource.tileSize !== undefined)\n rasterSpec.tileSize = rasterSource.tileSize;\n if (rasterSource.minzoom !== undefined)\n rasterSpec.minzoom = rasterSource.minzoom;\n if (rasterSource.maxzoom !== undefined)\n rasterSpec.maxzoom = rasterSource.maxzoom;\n if (rasterSource.bounds) rasterSpec.bounds = rasterSource.bounds;\n if (rasterSource.attribution)\n rasterSpec.attribution = rasterSource.attribution;\n this.map.addSource(sourceId, rasterSpec);\n } else if (source.type === \"image\") {\n const imageSource = source as unknown as ImageSourceConfig;\n this.map.addSource(sourceId, {\n type: \"image\",\n url: imageSource.url,\n coordinates: imageSource.coordinates,\n });\n } else if (source.type === \"video\") {\n const videoSource = source as unknown as VideoSourceConfig;\n this.map.addSource(sourceId, {\n type: \"video\",\n urls: videoSource.urls,\n coordinates: videoSource.coordinates,\n });\n }\n }\n\n private async addGeoJSONSourceFromURL(\n sourceId: string,\n layerId: string,\n config: GeoJSONSourceConfig\n ): Promise<void> {\n // Determine initial data source\n let initialData: FeatureCollection = {\n type: \"FeatureCollection\",\n features: [],\n };\n\n if (config.prefetchedData) {\n initialData = config.prefetchedData as FeatureCollection;\n } else if (config.data) {\n initialData = config.data as FeatureCollection;\n }\n\n // Add source with initial data - only include clustering properties if defined\n const sourceSpec: any = {\n type: \"geojson\",\n data: initialData,\n };\n\n // Only add clustering properties if they are defined\n if (config.cluster !== undefined) sourceSpec.cluster = config.cluster;\n if (config.clusterRadius !== undefined) sourceSpec.clusterRadius = config.clusterRadius;\n if (config.clusterMaxZoom !== undefined) sourceSpec.clusterMaxZoom = config.clusterMaxZoom;\n if (config.clusterMinPoints !== undefined) sourceSpec.clusterMinPoints = config.clusterMinPoints;\n if (config.clusterProperties !== undefined) sourceSpec.clusterProperties = config.clusterProperties;\n\n this.map.addSource(sourceId, sourceSpec);\n\n this.sourceData.set(sourceId, initialData);\n\n // Fetch from URL if needed\n if (config.url && !config.prefetchedData) {\n this.callbacks.onDataLoading?.(layerId);\n\n try {\n const cacheEnabled = config.cache?.enabled ?? true;\n const cacheTTL = config.cache?.ttl;\n\n const result = await this.dataFetcher.fetch(config.url, {\n skipCache: !cacheEnabled,\n ttl: cacheTTL,\n });\n\n const data = result.data as FeatureCollection;\n this.sourceData.set(sourceId, data);\n\n const source = this.map.getSource(sourceId) as GeoJSONSource;\n if (source?.setData) {\n source.setData(data);\n }\n\n this.callbacks.onDataLoaded?.(layerId, data.features.length);\n } catch (error: any) {\n this.callbacks.onDataError?.(layerId, error);\n }\n } else if (config.prefetchedData) {\n // Emit loaded event for prefetched data\n this.callbacks.onDataLoaded?.(layerId, initialData.features.length);\n }\n }\n\n /**\n * Setup polling and/or streaming for a GeoJSON source\n */\n private async setupDataUpdates(\n layerId: string,\n sourceId: string,\n config: GeoJSONSourceConfig\n ): Promise<void> {\n // Setup streaming if configured\n if (config.stream) {\n const streamConfig = config.stream;\n await this.streamManager.connect(layerId, {\n type: streamConfig.type,\n url: streamConfig.url || config.url!,\n onData: (data) => {\n this.handleDataUpdate(sourceId, layerId, data, {\n strategy:\n config.refresh?.updateStrategy ||\n config.updateStrategy ||\n \"replace\",\n updateKey: config.refresh?.updateKey || config.updateKey,\n windowSize: config.refresh?.windowSize,\n windowDuration: config.refresh?.windowDuration,\n timestampField: config.refresh?.timestampField,\n });\n },\n onError: (error) => {\n this.callbacks.onDataError?.(layerId, error);\n },\n reconnect: {\n enabled: streamConfig.reconnect !== false,\n maxRetries: streamConfig.reconnectMaxAttempts,\n initialDelay: streamConfig.reconnectDelay,\n maxDelay: streamConfig.reconnectMaxDelay,\n },\n eventTypes: streamConfig.eventTypes,\n protocols: streamConfig.protocols,\n });\n }\n\n // Setup polling if configured (new refresh config or legacy refreshInterval)\n const refreshInterval =\n config.refresh?.refreshInterval || config.refreshInterval;\n if (refreshInterval && config.url) {\n const url = config.url;\n const cacheEnabled = config.cache?.enabled ?? true;\n const cacheTTL = config.cache?.ttl;\n\n await this.pollingManager.start(layerId, {\n interval: refreshInterval,\n onTick: async () => {\n const result = await this.dataFetcher.fetch(url, {\n skipCache: !cacheEnabled,\n ttl: cacheTTL,\n });\n this.handleDataUpdate(sourceId, layerId, result.data as FeatureCollection, {\n strategy:\n config.refresh?.updateStrategy ||\n config.updateStrategy ||\n \"replace\",\n updateKey: config.refresh?.updateKey || config.updateKey,\n windowSize: config.refresh?.windowSize,\n windowDuration: config.refresh?.windowDuration,\n timestampField: config.refresh?.timestampField,\n });\n },\n onError: (error) => {\n this.callbacks.onDataError?.(layerId, error);\n },\n });\n }\n }\n\n /**\n * Handle incoming data updates with merge strategy\n */\n private handleDataUpdate(\n sourceId: string,\n layerId: string,\n incoming: FeatureCollection,\n options: {\n strategy: MergeStrategy;\n updateKey?: string;\n windowSize?: number;\n windowDuration?: number;\n timestampField?: string;\n }\n ): void {\n const existing =\n this.sourceData.get(sourceId) || {\n type: \"FeatureCollection\" as const,\n features: [],\n };\n\n const mergeResult = this.dataMerger.merge(existing, incoming, options);\n this.sourceData.set(sourceId, mergeResult.data);\n\n const source = this.map.getSource(sourceId) as GeoJSONSource;\n if (source?.setData) {\n source.setData(mergeResult.data);\n }\n\n this.callbacks.onDataLoaded?.(layerId, mergeResult.total);\n }\n\n /**\n * Pause data refresh for a layer (polling)\n */\n pauseRefresh(layerId: string): void {\n this.pollingManager.pause(layerId);\n }\n\n /**\n * Resume data refresh for a layer (polling)\n */\n resumeRefresh(layerId: string): void {\n this.pollingManager.resume(layerId);\n }\n\n /**\n * Force immediate refresh for a layer (polling)\n */\n async refreshNow(layerId: string): Promise<void> {\n await this.pollingManager.triggerNow(layerId);\n }\n\n /**\n * Disconnect streaming connection for a layer\n */\n disconnectStream(layerId: string): void {\n this.streamManager.disconnect(layerId);\n }\n\n removeLayer(layerId: string): void {\n // Stop all data updates\n this.pollingManager.stop(layerId);\n this.streamManager.disconnect(layerId);\n this.loadingManager.hideLoading(layerId);\n\n // Legacy support\n this.stopRefreshInterval(layerId);\n\n const controller = this.abortControllers.get(layerId);\n if (controller) {\n controller.abort();\n this.abortControllers.delete(layerId);\n }\n\n if (this.map.getLayer(layerId)) this.map.removeLayer(layerId);\n\n const sourceId = this.layerToSource.get(layerId) || `${layerId}-source`;\n if (this.map.getSource(sourceId)) this.map.removeSource(sourceId);\n\n // Clean up data references\n this.sourceData.delete(sourceId);\n this.layerToSource.delete(layerId);\n }\n\n setVisibility(layerId: string, visible: boolean): void {\n if (!this.map.getLayer(layerId)) return;\n this.map.setLayoutProperty(\n layerId,\n \"visibility\",\n visible ? \"visible\" : \"none\"\n );\n }\n\n updateData(layerId: string, data: GeoJSON.GeoJSON): void {\n const sourceId = `${layerId}-source`;\n const source = this.map.getSource(sourceId) as GeoJSONSource;\n if (source && source.setData) source.setData(data as any);\n }\n\n /**\n * @deprecated Legacy refresh method - use PollingManager instead\n */\n startRefreshInterval(layer: Layer): void {\n // Legacy method kept for backward compatibility\n // New code should use setupDataUpdates() which is called automatically from addLayer\n if (typeof layer.source !== \"object\" || layer.source === null) {\n return;\n }\n\n const sourceObj = layer.source as {\n type: string;\n url?: string;\n refreshInterval?: number;\n };\n if (\n sourceObj.type !== \"geojson\" ||\n !sourceObj.url ||\n !sourceObj.refreshInterval\n ) {\n return;\n }\n\n const geojsonSource = layer.source as unknown as GeoJSONSourceConfig;\n const interval = setInterval(async () => {\n const sourceId = `${layer.id}-source`;\n try {\n const cacheEnabled = geojsonSource.cache?.enabled ?? true;\n const cacheTTL = geojsonSource.cache?.ttl;\n\n const result = await this.dataFetcher.fetch(geojsonSource.url!, {\n skipCache: !cacheEnabled,\n ttl: cacheTTL,\n });\n const data = result.data as FeatureCollection;\n this.sourceData.set(sourceId, data);\n\n const source = this.map.getSource(sourceId) as GeoJSONSource;\n if (source?.setData) {\n source.setData(data);\n }\n this.callbacks.onDataLoaded?.(layer.id, data.features.length);\n } catch (error: any) {\n this.callbacks.onDataError?.(layer.id, error);\n }\n }, geojsonSource.refreshInterval!);\n\n this.refreshIntervals.set(layer.id, interval);\n }\n\n stopRefreshInterval(layerId: string): void {\n const interval = this.refreshIntervals.get(layerId);\n if (interval) {\n clearInterval(interval);\n this.refreshIntervals.delete(layerId);\n }\n }\n\n clearAllIntervals(): void {\n for (const interval of this.refreshIntervals.values())\n clearInterval(interval);\n this.refreshIntervals.clear();\n }\n\n destroy(): void {\n // Clean up all data management components\n this.pollingManager.destroy();\n this.streamManager.destroy();\n this.loadingManager.destroy();\n\n // Clear data references\n this.sourceData.clear();\n this.layerToSource.clear();\n\n // Legacy cleanup\n this.clearAllIntervals();\n for (const controller of this.abortControllers.values()) controller.abort();\n this.abortControllers.clear();\n }\n}\n","/**\n * @file Popup HTML builder for map features\n * @module @maplibre-yaml/core/renderer\n */\n\nimport type { z } from \"zod\";\nimport { PopupContentSchema, PopupContentItemSchema } from \"../schemas\";\n\ntype PopupContent = z.infer<typeof PopupContentSchema>;\ntype PopupContentItem = z.infer<typeof PopupContentItemSchema>;\n\n/**\n * Builds popup HTML from configuration and feature properties\n */\nexport class PopupBuilder {\n /**\n * Build HTML string from popup content config and feature properties\n */\n build(content: PopupContent, properties: Record<string, any>): string {\n return content\n .map((item) => {\n const entries = Object.entries(item);\n if (entries.length === 0) return \"\";\n const entry = entries[0];\n if (!entry) return \"\";\n const [tag, items] = entry;\n if (!Array.isArray(items)) return \"\";\n const innerHTML = items\n .map((i: PopupContentItem) => this.buildItem(i, properties))\n .join(\"\");\n return `<${tag}>${innerHTML}</${tag}>`;\n })\n .join(\"\");\n }\n\n /**\n * Build a single content item\n */\n private buildItem(\n item: PopupContentItem,\n properties: Record<string, any>\n ): string {\n // Static string\n if (item.str) {\n return this.escapeHtml(item.str);\n }\n\n // Dynamic property\n if (item.property) {\n const value = properties[item.property];\n if (value !== undefined && value !== null) {\n // Apply format if specified\n if (item.format && typeof value === \"number\") {\n return this.formatNumber(value, item.format);\n }\n return this.escapeHtml(String(value));\n }\n // Use fallback\n return item.else ? this.escapeHtml(item.else) : \"\";\n }\n\n // Link\n if (item.href) {\n const text = (item as any).text || item.href;\n const target = (item as any).target || \"_blank\";\n return `<a href=\"${this.escapeHtml(\n item.href\n )}\" target=\"${target}\">${this.escapeHtml(text)}</a>`;\n }\n\n // Image\n if (item.src) {\n const alt = (item as any).alt || \"\";\n return `<img src=\"${this.escapeHtml(item.src)}\" alt=\"${this.escapeHtml(\n alt\n )}\" />`;\n }\n\n return \"\";\n }\n\n /**\n * Format a number according to format string\n */\n private formatNumber(value: number, format: string): string {\n // Simple number formatting\n // Format strings like \",.0f\" or \".2f\"\n\n // Check for thousands separator\n const useThousands = format.includes(\",\");\n\n // Extract decimal places\n const decimalMatch = format.match(/\\.(\\d+)/);\n const decimals =\n decimalMatch && decimalMatch[1] ? parseInt(decimalMatch[1]) : 0;\n\n // Format the number\n let result = value.toFixed(decimals);\n\n // Add thousands separators if requested\n if (useThousands) {\n const parts = result.split(\".\");\n if (parts[0]) {\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n }\n result = parts.join(\".\");\n }\n\n return result;\n }\n\n /**\n * Escape HTML to prevent XSS\n */\n private escapeHtml(str: string): string {\n return str\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#039;\");\n }\n}\n","/**\n * @file Event handler for map layer interactions\n * @module @maplibre-yaml/core/renderer\n */\n\nimport maplibregl, {\n type Map as MapLibreMap,\n type MapMouseEvent,\n type Popup,\n type LngLat,\n} from \"maplibre-gl\";\nimport type { z } from \"zod\";\nimport { LayerSchema, PopupContentSchema } from \"../schemas\";\nimport { PopupBuilder } from \"./popup-builder\";\n\ntype Layer = z.infer<typeof LayerSchema>;\ntype PopupContent = z.infer<typeof PopupContentSchema>;\n\n/**\n * Callbacks for interactive events\n */\nexport interface EventHandlerCallbacks {\n onClick?: (layerId: string, feature: any, lngLat: LngLat) => void;\n onHover?: (layerId: string, feature: any, lngLat: LngLat) => void;\n}\n\n/**\n * Handles click, hover, and other interactive events on layers\n */\nexport class EventHandler {\n private map: MapLibreMap;\n private callbacks: EventHandlerCallbacks;\n private popupBuilder: PopupBuilder;\n private activePopup: Popup | null;\n private attachedLayers: Set<string>;\n private boundHandlers: Map<\n string,\n { click?: Function; mouseenter?: Function; mouseleave?: Function }\n >;\n\n constructor(map: MapLibreMap, callbacks?: EventHandlerCallbacks) {\n this.map = map;\n this.callbacks = callbacks || {};\n this.popupBuilder = new PopupBuilder();\n this.activePopup = null;\n this.attachedLayers = new Set();\n this.boundHandlers = new Map();\n }\n\n /**\n * Attach events for a layer based on its interactive config\n */\n attachEvents(layer: Layer): void {\n if (!layer.interactive) return;\n\n // Type guard: interactive is defined, cast to proper type\n const interactive = layer.interactive as { hover?: any; click?: any };\n const { hover, click } = interactive;\n const handlers: any = {};\n\n // Hover handling\n if (hover) {\n handlers.mouseenter = (e: MapMouseEvent & { features?: any[] }) => {\n if (hover.cursor) {\n this.map.getCanvas().style.cursor = hover.cursor;\n }\n if (e.features?.[0]) {\n this.callbacks.onHover?.(layer.id, e.features[0], e.lngLat);\n }\n };\n\n handlers.mouseleave = () => {\n this.map.getCanvas().style.cursor = \"\";\n };\n\n this.map.on(\"mouseenter\", layer.id, handlers.mouseenter);\n this.map.on(\"mouseleave\", layer.id, handlers.mouseleave);\n }\n\n // Click handling\n if (click) {\n handlers.click = (e: MapMouseEvent & { features?: any[] }) => {\n const feature = e.features?.[0];\n if (!feature) return;\n\n if (click.popup) {\n this.showPopup(click.popup, feature, e.lngLat);\n }\n\n this.callbacks.onClick?.(layer.id, feature, e.lngLat);\n };\n\n this.map.on(\"click\", layer.id, handlers.click);\n }\n\n this.boundHandlers.set(layer.id, handlers);\n this.attachedLayers.add(layer.id);\n }\n\n /**\n * Show a popup with content\n */\n private showPopup(content: PopupContent, feature: any, lngLat: LngLat): void {\n this.activePopup?.remove();\n\n const html = this.popupBuilder.build(content, feature.properties);\n\n this.activePopup = new maplibregl.Popup()\n .setLngLat(lngLat)\n .setHTML(html)\n .addTo(this.map);\n }\n\n /**\n * Detach events for a layer\n */\n detachEvents(layerId: string): void {\n const handlers = this.boundHandlers.get(layerId);\n if (!handlers) return;\n\n if (handlers.click) {\n this.map.off(\"click\", layerId, handlers.click as any);\n }\n if (handlers.mouseenter) {\n this.map.off(\"mouseenter\", layerId, handlers.mouseenter as any);\n }\n if (handlers.mouseleave) {\n this.map.off(\"mouseleave\", layerId, handlers.mouseleave as any);\n }\n\n this.boundHandlers.delete(layerId);\n this.attachedLayers.delete(layerId);\n }\n\n /**\n * Clean up all event handlers\n */\n destroy(): void {\n for (const layerId of this.attachedLayers) {\n this.detachEvents(layerId);\n }\n this.activePopup?.remove();\n this.activePopup = null;\n }\n}\n","/**\n * @file Legend builder for map layers\n * @module @maplibre-yaml/core/renderer\n */\n\nimport type { z } from 'zod';\nimport { LayerSchema, LegendConfigSchema, LegendItemSchema } from '../schemas';\n\ntype Layer = z.infer<typeof LayerSchema>;\ntype LegendConfig = z.infer<typeof LegendConfigSchema>;\ntype LegendItem = z.infer<typeof LegendItemSchema>;\n\n/**\n * Builds legend HTML from layer configurations\n */\nexport class LegendBuilder {\n /**\n * Build legend in container from layers\n */\n build(container: string | HTMLElement, layers: Layer[], config?: Partial<LegendConfig>): void {\n const el = typeof container === 'string' ? document.getElementById(container) : container;\n if (!el) return;\n\n const items = config?.items || this.extractItems(layers);\n\n let html = '<div class=\"maplibre-legend\">';\n if (config?.title) {\n html += `<div class=\"legend-title\">${this.escapeHtml(config.title)}</div>`;\n }\n html += '<div class=\"legend-items\">';\n for (const item of items) {\n html += this.renderItem(item);\n }\n html += '</div></div>';\n\n el.innerHTML = html;\n }\n\n /**\n * Render a single legend item\n */\n private renderItem(item: LegendItem): string {\n const shape = item.shape || 'square';\n let symbol = '';\n\n switch (shape) {\n case 'circle':\n symbol = `<span class=\"legend-symbol circle\" style=\"background:${this.escapeHtml(item.color)}\"></span>`;\n break;\n case 'line':\n symbol = `<span class=\"legend-symbol line\" style=\"background:${this.escapeHtml(item.color)}\"></span>`;\n break;\n case 'icon':\n if (item.icon) {\n symbol = `<span class=\"legend-symbol icon\">${this.escapeHtml(item.icon)}</span>`;\n } else {\n symbol = `<span class=\"legend-symbol square\" style=\"background:${this.escapeHtml(item.color)}\"></span>`;\n }\n break;\n default:\n symbol = `<span class=\"legend-symbol square\" style=\"background:${this.escapeHtml(item.color)}\"></span>`;\n }\n\n return `<div class=\"legend-item\">${symbol}<span class=\"legend-label\">${this.escapeHtml(item.label)}</span></div>`;\n }\n\n /**\n * Extract legend items from layers\n */\n private extractItems(layers: Layer[]): LegendItem[] {\n return layers\n .filter((l) => l.legend && typeof l.legend === 'object')\n .map((l) => l.legend as LegendItem);\n }\n\n /**\n * Escape HTML to prevent XSS\n */\n private escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;');\n }\n}\n","/**\n * @file Controls manager for map controls\n * @module @maplibre-yaml/core/renderer\n */\n\nimport maplibregl, {\n type Map as MapLibreMap,\n type IControl,\n} from \"maplibre-gl\";\nimport type { z } from \"zod\";\nimport { ControlsConfigSchema } from \"../schemas\";\n\ntype ControlsConfig = z.infer<typeof ControlsConfigSchema>;\n\n/**\n * Manages MapLibre map controls (navigation, geolocate, scale, etc.)\n */\nexport class ControlsManager {\n private map: MapLibreMap;\n private addedControls: IControl[];\n\n constructor(map: MapLibreMap) {\n this.map = map;\n this.addedControls = [];\n }\n\n /**\n * Add controls to the map based on configuration\n */\n addControls(config: ControlsConfig): void {\n if (!config) return;\n\n if (config.navigation) {\n const options =\n typeof config.navigation === \"object\" ? config.navigation : {};\n const position = (options as any).position || \"top-right\";\n const control = new maplibregl.NavigationControl();\n this.map.addControl(control, position as any);\n this.addedControls.push(control);\n }\n\n if (config.geolocate) {\n const options =\n typeof config.geolocate === \"object\" ? config.geolocate : {};\n const position = (options as any).position || \"top-right\";\n const control = new maplibregl.GeolocateControl({\n positionOptions: { enableHighAccuracy: true },\n trackUserLocation: true,\n });\n this.map.addControl(control, position as any);\n this.addedControls.push(control);\n }\n\n if (config.scale) {\n const options = typeof config.scale === \"object\" ? config.scale : {};\n const position = (options as any).position || \"bottom-left\";\n const control = new maplibregl.ScaleControl();\n this.map.addControl(control, position as any);\n this.addedControls.push(control);\n }\n\n if (config.fullscreen) {\n const options =\n typeof config.fullscreen === \"object\" ? config.fullscreen : {};\n const position = (options as any).position || \"top-right\";\n const control = new maplibregl.FullscreenControl();\n this.map.addControl(control, position as any);\n this.addedControls.push(control);\n }\n }\n\n /**\n * Remove all controls from the map\n */\n removeAllControls(): void {\n for (const control of this.addedControls) {\n this.map.removeControl(control);\n }\n this.addedControls = [];\n }\n}\n","/**\n * @file Main map renderer for MapLibre YAML\n * @module @maplibre-yaml/core/renderer\n */\n\nimport maplibregl, { type Map as MapLibreMap } from 'maplibre-gl';\nimport type { z } from 'zod';\nimport { MapConfigSchema, LayerSchema, ControlsConfigSchema, LegendConfigSchema } from '../schemas';\nimport { LayerManager, type LayerManagerCallbacks } from './layer-manager';\nimport { EventHandler, type EventHandlerCallbacks } from './event-handler';\nimport { LegendBuilder } from './legend-builder';\nimport { ControlsManager } from './controls-manager';\n\ntype MapConfig = z.infer<typeof MapConfigSchema>;\ntype Layer = z.infer<typeof LayerSchema>;\ntype ControlsConfig = z.infer<typeof ControlsConfigSchema>;\ntype LegendConfig = z.infer<typeof LegendConfigSchema>;\n\n/**\n * Options for MapRenderer\n */\nexport interface MapRendererOptions {\n onLoad?: () => void;\n onError?: (error: Error) => void;\n}\n\n/**\n * Events emitted by MapRenderer\n */\nexport interface MapRendererEvents {\n load: void;\n 'layer:added': { layerId: string };\n 'layer:removed': { layerId: string };\n 'layer:data-loading': { layerId: string };\n 'layer:data-loaded': { layerId: string; featureCount: number };\n 'layer:data-error': { layerId: string; error: Error };\n 'layer:click': { layerId: string; feature: any; lngLat: maplibregl.LngLat };\n 'layer:hover': { layerId: string; feature: any; lngLat: maplibregl.LngLat };\n}\n\n/**\n * Main class for rendering maps from configuration\n */\nexport class MapRenderer {\n private map: MapLibreMap;\n private layerManager: LayerManager;\n private eventHandler: EventHandler;\n private legendBuilder: LegendBuilder;\n private controlsManager: ControlsManager;\n private eventListeners: Map<string, Set<Function>>;\n private isLoaded: boolean;\n\n constructor(container: string | HTMLElement, config: MapConfig, layers: Layer[] = [], options: MapRendererOptions = {}) {\n this.eventListeners = new Map();\n this.isLoaded = false;\n\n // Initialize MapLibre map\n this.map = new maplibregl.Map({\n ...config,\n container: typeof container === 'string' ? container : container,\n style: config.mapStyle as any,\n center: config.center as [number, number],\n zoom: config.zoom,\n pitch: config.pitch ?? 0,\n bearing: config.bearing ?? 0,\n interactive: config.interactive ?? true,\n } as any);\n\n // Initialize managers\n const layerCallbacks: LayerManagerCallbacks = {\n onDataLoading: (layerId) => this.emit('layer:data-loading', { layerId }),\n onDataLoaded: (layerId, featureCount) => this.emit('layer:data-loaded', { layerId, featureCount }),\n onDataError: (layerId, error) => this.emit('layer:data-error', { layerId, error }),\n };\n\n const eventCallbacks: EventHandlerCallbacks = {\n onClick: (layerId, feature, lngLat) => this.emit('layer:click', { layerId, feature, lngLat }),\n onHover: (layerId, feature, lngLat) => this.emit('layer:hover', { layerId, feature, lngLat }),\n };\n\n this.layerManager = new LayerManager(this.map, layerCallbacks);\n this.eventHandler = new EventHandler(this.map, eventCallbacks);\n this.legendBuilder = new LegendBuilder();\n this.controlsManager = new ControlsManager(this.map);\n\n // Set up load handler\n this.map.on('load', () => {\n this.isLoaded = true;\n\n // Add layers\n Promise.all(layers.map((layer) => this.addLayer(layer)))\n .then(() => {\n this.emit('load', undefined);\n options.onLoad?.();\n })\n .catch((error) => {\n options.onError?.(error);\n });\n });\n\n // Handle errors\n this.map.on('error', (e) => {\n options.onError?.(e.error);\n });\n }\n\n /**\n * Get the underlying MapLibre map instance\n */\n getMap(): MapLibreMap {\n return this.map;\n }\n\n /**\n * Check if map is loaded\n */\n isMapLoaded(): boolean {\n return this.isLoaded;\n }\n\n /**\n * Add a layer to the map\n */\n async addLayer(layer: Layer): Promise<void> {\n await this.layerManager.addLayer(layer);\n this.eventHandler.attachEvents(layer);\n this.emit('layer:added', { layerId: layer.id });\n }\n\n /**\n * Remove a layer from the map\n */\n removeLayer(layerId: string): void {\n this.eventHandler.detachEvents(layerId);\n this.layerManager.removeLayer(layerId);\n this.emit('layer:removed', { layerId });\n }\n\n /**\n * Set layer visibility\n */\n setLayerVisibility(layerId: string, visible: boolean): void {\n this.layerManager.setVisibility(layerId, visible);\n }\n\n /**\n * Update layer data\n */\n updateLayerData(layerId: string, data: GeoJSON.GeoJSON): void {\n this.layerManager.updateData(layerId, data);\n }\n\n /**\n * Add controls to the map\n */\n addControls(config: ControlsConfig): void {\n this.controlsManager.addControls(config);\n }\n\n /**\n * Build legend in container\n */\n buildLegend(container: string | HTMLElement, layers: Layer[], config?: LegendConfig): void {\n this.legendBuilder.build(container, layers, config);\n }\n\n /**\n * Get the legend builder instance\n */\n getLegendBuilder(): LegendBuilder {\n return this.legendBuilder;\n }\n\n /**\n * Register an event listener\n */\n on<K extends keyof MapRendererEvents>(event: K, callback: (data: MapRendererEvents[K]) => void): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n this.eventListeners.get(event)!.add(callback);\n }\n\n /**\n * Unregister an event listener\n */\n off<K extends keyof MapRendererEvents>(event: K, callback: Function): void {\n const listeners = this.eventListeners.get(event);\n if (listeners) {\n listeners.delete(callback);\n }\n }\n\n /**\n * Emit an event\n */\n private emit<K extends keyof MapRendererEvents>(event: K, data: MapRendererEvents[K]): void {\n const listeners = this.eventListeners.get(event);\n if (listeners) {\n for (const callback of listeners) {\n callback(data);\n }\n }\n }\n\n /**\n * Destroy the map and clean up resources\n */\n destroy(): void {\n this.eventHandler.destroy();\n this.layerManager.destroy();\n this.controlsManager.removeAllControls();\n this.eventListeners.clear();\n this.map.remove();\n }\n}\n","/**\n * @file Unified MLMap web component for maplibre-yaml\n * @module @maplibre-yaml/core/components/ml-map\n *\n * @description\n * The `<ml-map>` component is the primary way to embed MapLibre maps configured\n * with YAML. It supports multiple configuration methods to fit any use case.\n *\n * ## Configuration Methods (in priority order)\n *\n * ### 1. External YAML File (Recommended)\n * ```html\n * <ml-map src=\"/configs/my-map.yaml\"></ml-map>\n * ```\n *\n * ### 2. Inline YAML via Script Tag\n * ```html\n * <ml-map>\n * <script type=\"text/yaml\">\n * type: map\n * id: my-map\n * config:\n * center: [-74.006, 40.7128]\n * zoom: 12\n * mapStyle: \"https://demotiles.maplibre.org/style.json\"\n * layers: []\n * </script>\n * </ml-map>\n * ```\n *\n * ### 3. JSON Config Attribute (Programmatic)\n * ```html\n * <ml-map config='{\"type\":\"map\",...}'></ml-map>\n * ```\n */\n\nimport type { Map as MapLibreMap } from \"maplibre-gl\";\nimport {\n YAMLParser,\n type MapBlock,\n type ParseError,\n} from \"../parser/yaml-parser.js\";\nimport { MapRenderer } from \"../renderer/map-renderer.js\";\n\n/**\n * MLMap custom element for rendering MapLibre maps from YAML/JSON configuration.\n *\n * @fires ml-map:load - Map loaded and ready for interaction\n * @fires ml-map:error - Error during initialization or runtime\n * @fires ml-map:loading - Loading configuration from URL\n * @fires ml-map:layer-added - Layer was added to the map\n * @fires ml-map:layer-removed - Layer was removed from the map\n * @fires ml-map:layer-data-loading - Layer data is being fetched\n * @fires ml-map:layer-data-loaded - Layer data loaded successfully\n * @fires ml-map:layer-data-error - Layer data failed to load\n * @fires ml-map:layer-click - User clicked on a layer feature\n * @fires ml-map:layer-hover - User hovered over a layer feature\n */\nexport class MLMap extends HTMLElement {\n /** Internal MapRenderer instance */\n private renderer: MapRenderer | null = null;\n\n /** Whether the component has been initialized */\n private initialized = false;\n\n /** Container element for the map */\n private mapContainer: HTMLDivElement | null = null;\n\n /** Parsed and validated configuration */\n private _config: MapBlock | null = null;\n\n /**\n * Observed attributes that trigger attributeChangedCallback\n */\n static get observedAttributes(): string[] {\n return [\"src\", \"config\"];\n }\n\n /**\n * Get the current map configuration\n */\n get config(): MapBlock | null {\n return this._config;\n }\n\n /**\n * Set the map configuration programmatically\n */\n set config(value: MapBlock | string | null) {\n if (value === null) {\n this._config = null;\n return;\n }\n\n let parsed: MapBlock;\n\n if (typeof value === \"string\") {\n try {\n parsed = JSON.parse(value);\n } catch (e) {\n this.handleError([\n { path: \"\", message: \"Invalid JSON in config property\" },\n ]);\n return;\n }\n } else {\n parsed = value;\n }\n\n this._config = parsed;\n\n // If already initialized, render with new config\n if (this.initialized) {\n this.renderMap(parsed);\n }\n }\n\n /**\n * Called when the element is added to the DOM\n */\n connectedCallback(): void {\n // Create internal map container\n this.mapContainer = document.createElement(\"div\");\n this.mapContainer.style.cssText = \"width: 100%; height: 100%;\";\n\n // Ensure the component has display: block (custom elements default to inline)\n if (!this.style.display || this.style.display === \"inline\") {\n this.style.display = \"block\";\n }\n\n // Initialize configuration loading\n this.initialize();\n }\n\n /**\n * Called when the element is removed from the DOM\n */\n disconnectedCallback(): void {\n this.destroy();\n }\n\n /**\n * Called when an observed attribute changes\n */\n attributeChangedCallback(\n name: string,\n oldValue: string | null,\n newValue: string | null\n ): void {\n // Skip if value hasn't actually changed\n if (oldValue === newValue) return;\n\n // Only process changes after initialization\n if (!this.initialized) return;\n\n if (name === \"src\" && newValue) {\n this.loadFromURL(newValue);\n } else if (name === \"config\" && newValue) {\n this.loadFromJSONAttribute(newValue);\n }\n }\n\n /**\n * Initialize the component by detecting and loading configuration\n */\n private async initialize(): Promise<void> {\n this.initialized = true;\n\n // Priority 1: Programmatically set config property\n if (this._config) {\n this.renderMap(this._config);\n return;\n }\n\n // Priority 2: Script tag with YAML\n const yamlScript = this.querySelector('script[type=\"text/yaml\"]');\n if (yamlScript?.textContent) {\n this.loadFromScriptTag(yamlScript.textContent);\n return;\n }\n\n // Priority 3: External YAML file\n const srcAttr = this.getAttribute(\"src\");\n if (srcAttr) {\n await this.loadFromURL(srcAttr);\n return;\n }\n\n // Priority 4: JSON config attribute\n const configAttr = this.getAttribute(\"config\");\n if (configAttr) {\n this.loadFromJSONAttribute(configAttr);\n return;\n }\n\n // No configuration provided - show helpful error\n this.handleError(\n [\n {\n path: \"\",\n message: \"No configuration provided.\",\n },\n ],\n true\n );\n }\n\n /**\n * Load and parse YAML from a script tag's text content\n */\n private loadFromScriptTag(yamlContent: string): void {\n const result = YAMLParser.safeParseMapBlock(yamlContent);\n\n if (result.success && result.data) {\n this._config = result.data;\n this.renderMap(result.data);\n } else {\n this.handleError(result.errors);\n }\n }\n\n /**\n * Load and parse YAML from an external URL\n */\n private async loadFromURL(url: string): Promise<void> {\n // Emit loading event\n this.dispatchEvent(\n new CustomEvent(\"ml-map:loading\", {\n bubbles: true,\n detail: { url },\n })\n );\n\n try {\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch ${url}: ${response.status} ${response.statusText}`\n );\n }\n\n const yamlContent = await response.text();\n const result = YAMLParser.safeParseMapBlock(yamlContent);\n\n if (result.success && result.data) {\n this._config = result.data;\n this.renderMap(result.data);\n } else {\n this.handleError(result.errors);\n }\n } catch (error) {\n this.handleError([\n {\n path: \"\",\n message: error instanceof Error ? error.message : String(error),\n },\n ]);\n }\n }\n\n /**\n * Parse and validate JSON from the config attribute\n */\n private loadFromJSONAttribute(jsonString: string): void {\n try {\n const parsed = JSON.parse(jsonString);\n this._config = parsed;\n this.renderMap(parsed);\n } catch (error) {\n this.handleError([\n {\n path: \"\",\n message: `Invalid JSON in config attribute: ${\n error instanceof Error ? error.message : String(error)\n }`,\n },\n ]);\n }\n }\n\n /**\n * Render the map with the given configuration\n */\n private renderMap(mapBlock: MapBlock): void {\n // Destroy existing renderer\n if (this.renderer) {\n this.renderer.destroy();\n this.renderer = null;\n }\n\n // Clear content and set up container\n this.innerHTML = \"\";\n\n if (!this.mapContainer) {\n this.mapContainer = document.createElement(\"div\");\n this.mapContainer.style.cssText = \"width: 100%; height: 100%;\";\n }\n\n this.appendChild(this.mapContainer);\n\n try {\n // Extract config and layers from MapBlock\n const { config, layers = [] } = mapBlock;\n\n // Create renderer with config and layers\n this.renderer = new MapRenderer(this.mapContainer, config, layers, {\n onLoad: () => {\n // Load event is also emitted via the event system\n },\n onError: (error) => {\n this.dispatchEvent(\n new CustomEvent(\"ml-map:error\", {\n bubbles: true,\n detail: { error },\n })\n );\n },\n });\n\n // Set up event forwarding\n this.setupEventForwarding();\n } catch (error) {\n this.handleError([\n {\n path: \"\",\n message: `Failed to create map: ${\n error instanceof Error ? error.message : String(error)\n }`,\n },\n ]);\n }\n }\n\n /**\n * Forward MapRenderer events to custom element events\n */\n private setupEventForwarding(): void {\n if (!this.renderer) return;\n\n // Map load event\n this.renderer.on(\"load\", () => {\n this.dispatchEvent(\n new CustomEvent(\"ml-map:load\", {\n bubbles: true,\n detail: {},\n })\n );\n });\n\n // Layer added\n this.renderer.on(\"layer:added\", ({ layerId }) => {\n this.dispatchEvent(\n new CustomEvent(\"ml-map:layer-added\", {\n bubbles: true,\n detail: { layerId },\n })\n );\n });\n\n // Layer removed\n this.renderer.on(\"layer:removed\", ({ layerId }) => {\n this.dispatchEvent(\n new CustomEvent(\"ml-map:layer-removed\", {\n bubbles: true,\n detail: { layerId },\n })\n );\n });\n\n // Layer data loading\n this.renderer.on(\"layer:data-loading\", ({ layerId }) => {\n this.dispatchEvent(\n new CustomEvent(\"ml-map:layer-data-loading\", {\n bubbles: true,\n detail: { layerId },\n })\n );\n });\n\n // Layer data loaded\n this.renderer.on(\"layer:data-loaded\", ({ layerId, featureCount }) => {\n this.dispatchEvent(\n new CustomEvent(\"ml-map:layer-data-loaded\", {\n bubbles: true,\n detail: { layerId, featureCount },\n })\n );\n });\n\n // Layer data error\n this.renderer.on(\"layer:data-error\", ({ layerId, error }) => {\n this.dispatchEvent(\n new CustomEvent(\"ml-map:layer-data-error\", {\n bubbles: true,\n detail: { layerId, error },\n })\n );\n });\n\n // Layer click\n this.renderer.on(\"layer:click\", ({ layerId, feature, lngLat }) => {\n this.dispatchEvent(\n new CustomEvent(\"ml-map:layer-click\", {\n bubbles: true,\n detail: { layerId, feature, lngLat },\n })\n );\n });\n\n // Layer hover\n this.renderer.on(\"layer:hover\", ({ layerId, feature, lngLat }) => {\n this.dispatchEvent(\n new CustomEvent(\"ml-map:layer-hover\", {\n bubbles: true,\n detail: { layerId, feature, lngLat },\n })\n );\n });\n }\n\n /**\n * Handle and display errors\n */\n private handleError(errors: ParseError[], showHelp = false): void {\n // Dispatch error event\n this.dispatchEvent(\n new CustomEvent(\"ml-map:error\", {\n bubbles: true,\n detail: { errors },\n })\n );\n\n // Build error UI\n const helpSection = showHelp\n ? `\n <div style=\"margin-top: 16px; padding: 16px; background: #fef3c7; border-radius: 6px; color: #92400e;\">\n <strong style=\"display: block; margin-bottom: 8px;\">How to configure:</strong>\n <div style=\"font-family: monospace; font-size: 12px; line-height: 1.6;\">\n <div style=\"margin-bottom: 8px;\">\n <strong>1. External file (recommended):</strong><br>\n &lt;ml-map src=\"/path/to/config.yaml\"&gt;&lt;/ml-map&gt;\n </div>\n <div style=\"margin-bottom: 8px;\">\n <strong>2. Inline YAML:</strong><br>\n &lt;ml-map&gt;<br>\n &nbsp;&nbsp;&lt;script type=\"text/yaml\"&gt;<br>\n &nbsp;&nbsp;type: map<br>\n &nbsp;&nbsp;id: my-map<br>\n &nbsp;&nbsp;...<br>\n &nbsp;&nbsp;&lt;/script&gt;<br>\n &lt;/ml-map&gt;\n </div>\n <div>\n <strong>3. JSON attribute:</strong><br>\n &lt;ml-map config='{\"type\":\"map\",...}'&gt;&lt;/ml-map&gt;\n </div>\n </div>\n </div>\n `\n : \"\";\n\n const errorItems = errors\n .map(\n (err) => `\n <div style=\"margin-bottom: 8px; padding: 8px; background: #fee2e2; border-radius: 4px;\">\n ${\n err.path\n ? `<strong style=\"color: #991b1b;\">${this.escapeHtml(\n err.path\n )}</strong>: `\n : \"\"\n }\n ${this.escapeHtml(err.message)}\n </div>\n `\n )\n .join(\"\");\n\n this.innerHTML = `\n <div class=\"ml-map-error\" style=\"\n padding: 20px;\n background: #fef2f2;\n border: 1px solid #fecaca;\n border-radius: 8px;\n color: #dc2626;\n font-family: system-ui, -apple-system, sans-serif;\n height: 100%;\n box-sizing: border-box;\n overflow: auto;\n \">\n <div style=\"font-weight: 600; margin-bottom: 12px; display: flex; align-items: center; gap: 8px;\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fill-rule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7 4a1 1 0 11-2 0 1 1 0 012 0zm-1-9a1 1 0 00-1 1v4a1 1 0 102 0V6a1 1 0 00-1-1z\" clip-rule=\"evenodd\"/>\n </svg>\n Configuration Error\n </div>\n <div style=\"font-size: 14px;\">\n ${errorItems}\n </div>\n ${helpSection}\n </div>\n `;\n }\n\n /**\n * Escape HTML special characters for safe innerHTML usage\n */\n private escapeHtml(text: string): string {\n const div = document.createElement(\"div\");\n div.textContent = text;\n return div.innerHTML;\n }\n\n /**\n * Clean up resources when component is removed\n */\n private destroy(): void {\n if (this.renderer) {\n this.renderer.destroy();\n this.renderer = null;\n }\n this._config = null;\n this.initialized = false;\n }\n\n // ============================================================\n // Public API\n // ============================================================\n\n /**\n * Get the underlying MapLibre GL map instance\n *\n * @returns The MapLibre GL map instance, or null if not initialized\n *\n * @example\n * ```javascript\n * const mapEl = document.querySelector('ml-map');\n *\n * mapEl.addEventListener('ml-map:load', () => {\n * const map = mapEl.getMap();\n * map.flyTo({ center: [-122.4, 37.8], zoom: 14 });\n * });\n * ```\n */\n getMap(): MapLibreMap | null {\n return this.renderer?.getMap() ?? null;\n }\n\n /**\n * Get the MapRenderer instance\n *\n * @returns The MapRenderer instance, or null if not initialized\n */\n getRenderer(): MapRenderer | null {\n return this.renderer;\n }\n\n /**\n * Check if the map is loaded\n *\n * @returns True if the map has finished loading\n */\n isLoaded(): boolean {\n return this.renderer?.isMapLoaded() ?? false;\n }\n\n /**\n * Add a layer to the map\n *\n * @param layer - Layer configuration object\n * @returns Promise that resolves when the layer is added\n *\n * @example\n * ```javascript\n * await mapEl.addLayer({\n * id: 'new-layer',\n * type: 'circle',\n * source: {\n * type: 'geojson',\n * data: { type: 'FeatureCollection', features: [] }\n * },\n * paint: { 'circle-radius': 6, 'circle-color': '#ff0000' }\n * });\n * ```\n */\n async addLayer(layer: any): Promise<void> {\n await this.renderer?.addLayer(layer);\n }\n\n /**\n * Remove a layer from the map\n *\n * @param layerId - ID of the layer to remove\n */\n removeLayer(layerId: string): void {\n this.renderer?.removeLayer(layerId);\n }\n\n /**\n * Set layer visibility\n *\n * @param layerId - ID of the layer\n * @param visible - Whether the layer should be visible\n */\n setLayerVisibility(layerId: string, visible: boolean): void {\n this.renderer?.setLayerVisibility(layerId, visible);\n }\n\n /**\n * Update layer data\n *\n * @param layerId - ID of the layer\n * @param data - New GeoJSON data\n */\n updateLayerData(layerId: string, data: GeoJSON.GeoJSON): void {\n this.renderer?.updateLayerData(layerId, data);\n }\n\n /**\n * Reload configuration from the current source\n *\n * @returns Promise that resolves when reload is complete\n */\n async reload(): Promise<void> {\n const src = this.getAttribute(\"src\");\n\n if (src) {\n await this.loadFromURL(src);\n } else {\n const yamlScript = this.querySelector('script[type=\"text/yaml\"]');\n if (yamlScript?.textContent) {\n this.loadFromScriptTag(yamlScript.textContent);\n }\n }\n }\n}\n\n/**\n * Register the ml-map custom element\n */\nexport function registerMLMap(): void {\n if (typeof window !== \"undefined\" && !customElements.get(\"ml-map\")) {\n customElements.define(\"ml-map\", MLMap);\n }\n}\n","/**\n * @file Auto-registration for maplibre-yaml web components\n * @module @maplibre-yaml/core/register\n *\n * @description\n * Import this module to automatically register the `<ml-map>` web component.\n *\n * ## Usage\n *\n * ```javascript\n * import '@maplibre-yaml/core/register';\n * import 'maplibre-gl/dist/maplibre-gl.css';\n * ```\n *\n * After importing, the `<ml-map>` element is available in your HTML.\n *\n * @example\n * External YAML file (recommended)\n * ```html\n * <ml-map src=\"/configs/my-map.yaml\" style=\"height: 400px;\"></ml-map>\n * ```\n *\n * @example\n * Inline YAML via script tag\n * ```html\n * <ml-map style=\"height: 400px;\">\n * <script type=\"text/yaml\">\n * type: map\n * id: my-map\n * config:\n * center: [-74.006, 40.7128]\n * zoom: 12\n * mapStyle: \"https://demotiles.maplibre.org/style.json\"\n * layers: []\n * </script>\n * </ml-map>\n * ```\n *\n * @example\n * JSON config attribute (programmatic)\n * ```html\n * <ml-map config='{\"type\":\"map\",\"id\":\"demo\",...}'></ml-map>\n * ```\n */\n\nimport { MLMap, registerMLMap } from \"./components/ml-map.js\";\n\n// Export for manual use if needed\nexport { MLMap, registerMLMap };\n\n// Auto-register when imported in browser context\nif (typeof window !== \"undefined\") {\n registerMLMap();\n}\n"]}