@coherent.js/client 1.0.0-rc.2 → 1.0.0-rc.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/events/registry.js", "../src/events/wrapper.js", "../src/events/delegation.js", "../src/hydration/state-serializer.js", "../src/hydration/mismatch-detector.js", "../src/hydrate.js", "../src/hmr/cleanup-tracker.js", "../src/hmr/state-capturer.js", "../src/hmr/overlay.js", "../src/hmr/indicator.js", "../src/hmr/module-tracker.js", "../src/hmr/client.js"],
4
- "sourcesContent": ["/**\n * Handler Registry for Coherent.js Event Delegation\n *\n * Maps handler IDs to their corresponding functions and component context.\n * Handlers are identified by ID (from data-coherent-{event} attributes) rather\n * than by element reference, allowing them to survive DOM updates.\n */\n\n/**\n * HandlerRegistry class\n * Stores handler functions with their associated component context\n */\nexport class HandlerRegistry {\n constructor() {\n /** @type {Map<string, {handler: Function, componentRef: object|null}>} */\n this.handlers = new Map();\n }\n\n /**\n * Register a handler with optional component context\n * @param {string} handlerId - Unique identifier for the handler\n * @param {Function} handler - The event handler function\n * @param {object|null} componentRef - Optional component reference with state/setState\n */\n register(handlerId, handler, componentRef = null) {\n if (typeof handler !== 'function') {\n throw new Error(`Handler must be a function, received: ${typeof handler}`);\n }\n this.handlers.set(handlerId, { handler, componentRef });\n }\n\n /**\n * Unregister a handler by ID\n * @param {string} handlerId - The handler ID to remove\n * @returns {boolean} True if handler was removed, false if not found\n */\n unregister(handlerId) {\n return this.handlers.delete(handlerId);\n }\n\n /**\n * Get a handler entry by ID\n * @param {string} handlerId - The handler ID to look up\n * @returns {{handler: Function, componentRef: object|null}|undefined} Handler entry or undefined\n */\n get(handlerId) {\n return this.handlers.get(handlerId);\n }\n\n /**\n * Check if a handler is registered\n * @param {string} handlerId - The handler ID to check\n * @returns {boolean} True if handler exists\n */\n has(handlerId) {\n return this.handlers.has(handlerId);\n }\n\n /**\n * Clear all registered handlers\n */\n clear() {\n this.handlers.clear();\n }\n\n /**\n * Get all handler IDs registered for a specific component\n * @param {object} componentRef - The component reference to search for\n * @returns {string[]} Array of handler IDs belonging to this component\n */\n getByComponent(componentRef) {\n if (!componentRef) {\n return [];\n }\n\n const handlerIds = [];\n for (const [handlerId, entry] of this.handlers) {\n if (entry.componentRef === componentRef) {\n handlerIds.push(handlerId);\n }\n }\n return handlerIds;\n }\n\n /**\n * Get the number of registered handlers\n * @returns {number} Count of registered handlers\n */\n get size() {\n return this.handlers.size;\n }\n}\n\n/**\n * Singleton handler registry instance\n * Use this for global event delegation\n */\nexport const handlerRegistry = new HandlerRegistry();\n", "/**\n * Event Wrapper for Coherent.js\n *\n * Wraps native DOM events with component context, providing handlers\n * access to component state, setState, and props.\n */\n\n/**\n * @typedef {object} CoherentEvent\n * @property {Event} originalEvent - The native DOM event\n * @property {Element} target - The element with the data-coherent-* attribute\n * @property {function(): void} preventDefault - Delegates to originalEvent.preventDefault()\n * @property {function(): void} stopPropagation - Delegates to originalEvent.stopPropagation()\n * @property {function|null} component - The component function (if available)\n * @property {object|null} state - Current component state (if available)\n * @property {function|null} setState - State setter function (if available)\n * @property {object|null} props - Component props (if available)\n */\n\n/**\n * Wrap a native DOM event with component context\n *\n * @param {Event} originalEvent - The native DOM event\n * @param {Element} target - The element that matched the data attribute selector\n * @param {object|null} componentRef - Optional component reference object\n * @param {function} [componentRef.component] - The component function\n * @param {object} [componentRef.state] - Current component state\n * @param {function} [componentRef.setState] - State setter function\n * @param {object} [componentRef.props] - Component props\n * @returns {CoherentEvent} Wrapped event with component context\n */\nexport function wrapEvent(originalEvent, target, componentRef = null) {\n return {\n // Native event access\n originalEvent,\n target,\n\n // Delegate common methods\n preventDefault() {\n originalEvent.preventDefault();\n },\n\n stopPropagation() {\n originalEvent.stopPropagation();\n },\n\n // Component context (null if no componentRef provided)\n component: componentRef?.component ?? null,\n state: componentRef?.state ?? null,\n setState: componentRef?.setState ?? null,\n props: componentRef?.props ?? null,\n };\n}\n", "/**\n * Event Delegation for Coherent.js\n *\n * Document-level event delegation that routes events to handlers via\n * data-coherent-{eventType} attributes. This ensures event handlers\n * survive DOM updates since they're registered by ID, not by element.\n */\n\nimport { handlerRegistry as defaultRegistry } from './registry.js';\nimport { wrapEvent } from './wrapper.js';\n\n/**\n * EventDelegation class\n * Manages document-level event listeners and routes to registered handlers\n */\nexport class EventDelegation {\n /**\n * @param {import('./registry.js').HandlerRegistry} [registry] - Handler registry instance\n */\n constructor(registry = defaultRegistry) {\n this.registry = registry;\n this.initialized = false;\n this.root = null;\n this.boundHandlers = new Map();\n\n /**\n * Event types to delegate\n * Focus/blur use capture phase because they don't bubble\n */\n this.eventTypes = [\n 'click',\n 'change',\n 'input',\n 'submit',\n 'focus',\n 'blur',\n 'keydown',\n 'keyup',\n 'keypress',\n ];\n }\n\n /**\n * Initialize event delegation by attaching listeners to the root element\n * @param {Document|Element} [root=document] - Root element for event delegation\n */\n initialize(root = typeof document !== 'undefined' ? document : null) {\n if (this.initialized) {\n return;\n }\n\n if (!root) {\n // No DOM available (SSR context)\n return;\n }\n\n this.root = root;\n\n for (const eventType of this.eventTypes) {\n const handler = (event) => this.handleEvent(event, eventType);\n\n // Focus and blur don't bubble - must use capture phase\n const useCapture = eventType === 'focus' || eventType === 'blur';\n\n // Submit needs preventDefault capability, others can be passive\n const options = {\n capture: useCapture,\n passive: eventType !== 'submit',\n };\n\n root.addEventListener(eventType, handler, options);\n this.boundHandlers.set(eventType, { handler, options });\n }\n\n this.initialized = true;\n }\n\n /**\n * Handle a delegated event\n * @param {Event} event - The DOM event\n * @param {string} eventType - The type of event (click, change, etc.)\n */\n handleEvent(event, eventType) {\n const target = event.target;\n if (!target || typeof target.closest !== 'function') {\n return;\n }\n\n // Find the nearest element with the appropriate data attribute\n const attrName = `data-coherent-${eventType}`;\n const delegateTarget = target.closest(`[${attrName}]`);\n\n if (!delegateTarget) {\n return;\n }\n\n // Get the handler ID from the attribute\n const handlerId = delegateTarget.getAttribute(attrName);\n if (!handlerId) {\n return;\n }\n\n // Look up the handler in the registry\n const entry = this.registry.get(handlerId);\n if (!entry) {\n return;\n }\n\n // Wrap the event with component context and call the handler\n const wrappedEvent = wrapEvent(event, delegateTarget, entry.componentRef);\n entry.handler(wrappedEvent);\n }\n\n /**\n * Destroy the event delegation system\n * Removes all listeners and clears the registry\n */\n destroy() {\n if (!this.initialized || !this.root) {\n return;\n }\n\n // Remove all event listeners\n for (const [eventType, { handler, options }] of this.boundHandlers) {\n this.root.removeEventListener(eventType, handler, options);\n }\n\n this.boundHandlers.clear();\n this.registry.clear();\n this.initialized = false;\n this.root = null;\n }\n\n /**\n * Check if the delegation system is initialized\n * @returns {boolean} True if initialized\n */\n isInitialized() {\n return this.initialized;\n }\n}\n\n/**\n * Singleton event delegation instance\n * Use this for global event delegation\n */\nexport const eventDelegation = new EventDelegation();\n", "/**\n * State serialization utilities for Coherent.js hydration\n *\n * Uses base64 encoding to safely embed state in data attributes\n * without escaping issues.\n */\n\n/**\n * Serialize component state to base64-encoded JSON string\n *\n * @param {Object} state - Component state object\n * @returns {string|null} - Base64 encoded state or null if empty/invalid\n */\nexport function serializeState(state) {\n if (!state || typeof state !== 'object') return null;\n\n // Filter out non-serializable values (functions, symbols, undefined)\n const serializable = {};\n let hasSerializable = false;\n\n for (const [key, value] of Object.entries(state)) {\n if (isSerializable(value)) {\n serializable[key] = value;\n hasSerializable = true;\n }\n // Silently omit functions, symbols, undefined - they reconstruct on hydrate\n }\n\n if (!hasSerializable) return null;\n\n try {\n const json = JSON.stringify(serializable);\n // Use encodeURIComponent to handle unicode, then btoa for base64\n return btoa(encodeURIComponent(json));\n } catch (e) {\n console.warn('[Coherent.js] Failed to serialize state:', e);\n return null;\n }\n}\n\n/**\n * Deserialize state from base64-encoded JSON string\n *\n * @param {string} encoded - Base64 encoded state string\n * @returns {Object|null} - Deserialized state or null if invalid\n */\nexport function deserializeState(encoded) {\n if (!encoded || typeof encoded !== 'string') return null;\n\n try {\n const json = decodeURIComponent(atob(encoded));\n return JSON.parse(json);\n } catch (e) {\n console.warn('[Coherent.js] Failed to deserialize state:', e);\n return null;\n }\n}\n\n/**\n * Extract state from a DOM element's data-state attribute\n *\n * @param {HTMLElement} element - DOM element to extract state from\n * @returns {Object|null} - Extracted state or null\n */\nexport function extractState(element) {\n if (!element || typeof element.getAttribute !== 'function') {\n return null;\n }\n\n const encoded = element.getAttribute('data-state');\n return deserializeState(encoded);\n}\n\n/**\n * Check if a value is serializable to JSON\n * @private\n */\nfunction isSerializable(value) {\n if (value === undefined) return false;\n if (value === null) return true;\n if (typeof value === 'function') return false;\n if (typeof value === 'symbol') return false;\n if (typeof value === 'bigint') return false; // BigInt not JSON serializable\n\n // Arrays and objects need recursive check\n if (Array.isArray(value)) {\n return value.every(isSerializable);\n }\n\n if (typeof value === 'object') {\n // Check for circular references would be expensive here\n // JSON.stringify will catch them in serializeState\n return true;\n }\n\n return true; // primitives (string, number, boolean)\n}\n\n/**\n * Size warning threshold (bytes)\n * Warn if serialized state exceeds this\n */\nconst STATE_SIZE_WARNING_THRESHOLD = 10 * 1024; // 10KB\n\n/**\n * Serialize state with size warning\n *\n * @param {Object} state - Component state\n * @param {string} componentName - Component name for warning message\n * @returns {string|null} - Serialized state\n */\nexport function serializeStateWithWarning(state, componentName = 'Unknown') {\n const encoded = serializeState(state);\n\n if (encoded && encoded.length > STATE_SIZE_WARNING_THRESHOLD) {\n console.warn(\n `[Coherent.js] Large state detected for component \"${componentName}\": ` +\n `${Math.round(encoded.length / 1024)}KB. Consider using a state management ` +\n `solution for large datasets.`\n );\n }\n\n return encoded;\n}\n", "/**\n * Mismatch detection for Coherent.js hydration\n *\n * Compares server-rendered DOM against client virtual DOM to detect\n * hydration mismatches in development mode.\n */\n\n/**\n * Format path segments into readable string\n * @param {Array} segments - Path segments\n * @returns {string} - Formatted path\n */\nexport function formatPath(segments) {\n if (!segments || segments.length === 0) return 'root';\n return segments.join('.');\n}\n\n/**\n * Get children from virtual node\n * @private\n */\nfunction getVNodeChildren(vNode) {\n if (!vNode || typeof vNode !== 'object' || Array.isArray(vNode)) {\n return [];\n }\n const tagName = Object.keys(vNode)[0];\n const props = vNode[tagName];\n if (!props || typeof props !== 'object') {\n return [];\n }\n if (props.children) {\n return Array.isArray(props.children) ? props.children : [props.children];\n }\n if (props.text !== undefined) {\n return [String(props.text)];\n }\n return [];\n}\n\n/**\n * Detect mismatches between DOM and virtual DOM\n *\n * @param {Element} domElement - Real DOM element\n * @param {Object|string|number} virtualNode - Virtual DOM node\n * @param {Array} path - Current path for error reporting\n * @returns {Array} - Array of mismatch objects\n */\nexport function detectMismatch(domElement, virtualNode, path = []) {\n const mismatches = [];\n\n // Handle null/undefined virtual node\n if (virtualNode === null || virtualNode === undefined) {\n return mismatches;\n }\n\n // Handle text nodes (string or number in virtual DOM)\n if (typeof virtualNode === 'string' || typeof virtualNode === 'number') {\n const expectedText = String(virtualNode).trim();\n\n // DOM might be a text node or element containing text\n let actualText;\n if (domElement.nodeType === 3) { // Node.TEXT_NODE\n actualText = domElement.textContent?.trim() || '';\n } else {\n // For element nodes, get direct text content\n actualText = domElement.textContent?.trim() || '';\n }\n\n if (actualText !== expectedText) {\n mismatches.push({\n path: formatPath(path),\n type: 'text',\n expected: expectedText,\n actual: actualText,\n domPath: getDOMPath(domElement)\n });\n }\n return mismatches;\n }\n\n // Handle arrays\n if (Array.isArray(virtualNode)) {\n virtualNode.forEach((child, index) => {\n const domChild = getDOMChildAtIndex(domElement, index);\n if (domChild) {\n const childMismatches = detectMismatch(\n domChild,\n child,\n [...path, `[${index}]`]\n );\n mismatches.push(...childMismatches);\n } else {\n mismatches.push({\n path: formatPath([...path, `[${index}]`]),\n type: 'missing_element',\n expected: describeVNode(child),\n actual: null,\n domPath: `${getDOMPath(domElement)} > child[${index}]`\n });\n }\n });\n return mismatches;\n }\n\n // Handle element nodes\n if (typeof virtualNode !== 'object') {\n return mismatches;\n }\n\n const tagName = Object.keys(virtualNode)[0];\n const props = virtualNode[tagName] || {};\n\n // Check tag name\n const domTagName = domElement.tagName?.toLowerCase();\n if (domTagName !== tagName.toLowerCase()) {\n mismatches.push({\n path: formatPath(path),\n type: 'tagName',\n expected: tagName,\n actual: domTagName,\n domPath: getDOMPath(domElement)\n });\n // Can't continue comparing if tag is different\n return mismatches;\n }\n\n // Check critical attributes\n const attributeChecks = [\n { virtual: 'className', dom: 'class' },\n { virtual: 'id', dom: 'id' },\n { virtual: 'type', dom: 'type' },\n { virtual: 'value', dom: 'value' },\n { virtual: 'checked', dom: 'checked' },\n { virtual: 'disabled', dom: 'disabled' },\n { virtual: 'href', dom: 'href' },\n { virtual: 'src', dom: 'src' }\n ];\n\n attributeChecks.forEach(({ virtual, dom }) => {\n const expectedValue = props[virtual];\n if (expectedValue === undefined) return;\n\n const actualValue = domElement.getAttribute(dom);\n const expectedStr = String(expectedValue);\n\n // Handle boolean attributes\n if (typeof expectedValue === 'boolean') {\n const actualBool = actualValue !== null;\n if (expectedValue !== actualBool) {\n mismatches.push({\n path: formatPath([...path, `@${dom}`]),\n type: 'attribute',\n expected: expectedValue,\n actual: actualBool,\n domPath: getDOMPath(domElement)\n });\n }\n return;\n }\n\n if (expectedStr !== actualValue) {\n mismatches.push({\n path: formatPath([...path, `@${dom}`]),\n type: 'attribute',\n expected: expectedStr,\n actual: actualValue,\n domPath: getDOMPath(domElement)\n });\n }\n });\n\n // Recursively check children\n const vChildren = getVNodeChildren({ [tagName]: props });\n const dChildren = getSignificantDOMChildren(domElement);\n\n // Check for child count mismatch\n if (vChildren.length !== dChildren.length) {\n mismatches.push({\n path: formatPath([...path, 'children']),\n type: 'children_count',\n expected: vChildren.length,\n actual: dChildren.length,\n domPath: getDOMPath(domElement)\n });\n }\n\n // Compare each child\n const maxChildren = Math.max(vChildren.length, dChildren.length);\n for (let i = 0; i < maxChildren; i++) {\n const vChild = vChildren[i];\n const dChild = dChildren[i];\n\n if (vChild && dChild) {\n const childMismatches = detectMismatch(\n dChild,\n vChild,\n [...path, `children[${i}]`]\n );\n mismatches.push(...childMismatches);\n } else if (vChild && !dChild) {\n mismatches.push({\n path: formatPath([...path, `children[${i}]`]),\n type: 'missing_dom_child',\n expected: describeVNode(vChild),\n actual: null,\n domPath: getDOMPath(domElement)\n });\n } else if (!vChild && dChild) {\n mismatches.push({\n path: formatPath([...path, `children[${i}]`]),\n type: 'extra_dom_child',\n expected: null,\n actual: describeNode(dChild),\n domPath: getDOMPath(domElement)\n });\n }\n }\n\n return mismatches;\n}\n\n/**\n * Report mismatches to console with detailed information\n *\n * @param {Array} mismatches - Array of mismatch objects\n * @param {Object} options - Reporting options\n */\nexport function reportMismatches(mismatches, options = {}) {\n if (!mismatches || mismatches.length === 0) return;\n\n const { componentName = 'Unknown', strict = false } = options;\n\n const header = `[Coherent.js] Hydration mismatch detected in \"${componentName}\"!\\n` +\n `Found ${mismatches.length} difference(s) between server and client:\\n`;\n\n const details = mismatches.map((m, i) => {\n return `\\n${i + 1}. ${m.type} at ${m.path}\\n` +\n ` DOM path: ${m.domPath}\\n` +\n ` Expected: ${JSON.stringify(m.expected)}\\n` +\n ` Actual: ${JSON.stringify(m.actual)}`;\n }).join('');\n\n const advice = '\\n\\nThis usually happens when:\\n' +\n ' - Server renders with different data than client\\n' +\n ' - Using Date.now(), Math.random(), or browser-only APIs during render\\n' +\n ' - Component is not pure (has side effects during render)\\n';\n\n console.warn(header + details + advice);\n\n if (strict) {\n throw new Error(`Hydration failed: ${mismatches.length} mismatch(es) found. See console for details.`);\n }\n}\n\n/**\n * Get significant DOM children (elements and non-empty text nodes)\n * @private\n */\nfunction getSignificantDOMChildren(element) {\n if (!element || !element.childNodes) return [];\n\n return Array.from(element.childNodes).filter(node => {\n if (node.nodeType === 1) return true; // Element node\n if (node.nodeType === 3) { // Text node\n return node.textContent && node.textContent.trim().length > 0;\n }\n return false;\n });\n}\n\n/**\n * Get DOM child at specific index (considering only significant children)\n * @private\n */\nfunction getDOMChildAtIndex(parent, index) {\n const children = getSignificantDOMChildren(parent);\n return children[index] || null;\n}\n\n/**\n * Get a readable DOM path for debugging\n * @private\n */\nfunction getDOMPath(element) {\n if (!element || !element.tagName) return '(unknown)';\n\n const parts = [];\n let current = element;\n\n while (current && current.tagName) {\n let selector = current.tagName.toLowerCase();\n\n if (current.id) {\n selector += `#${current.id}`;\n } else if (current.className && typeof current.className === 'string') {\n const classes = current.className.trim().split(/\\s+/).slice(0, 2);\n if (classes.length > 0 && classes[0]) {\n selector += `.${classes.join('.')}`;\n }\n }\n\n parts.unshift(selector);\n current = current.parentElement;\n\n // Limit depth\n if (parts.length > 5) {\n parts.unshift('...');\n break;\n }\n }\n\n return parts.join(' > ');\n}\n\n/**\n * Describe a virtual node for error messages\n * @private\n */\nfunction describeVNode(vNode) {\n if (typeof vNode === 'string' || typeof vNode === 'number') {\n return `text: \"${String(vNode).substring(0, 50)}\"`;\n }\n if (Array.isArray(vNode)) {\n return `array[${vNode.length}]`;\n }\n if (typeof vNode === 'object' && vNode !== null) {\n const tagName = Object.keys(vNode)[0];\n return `<${tagName}>`;\n }\n return String(vNode);\n}\n\n/**\n * Describe a DOM node for error messages\n * @private\n */\nfunction describeNode(node) {\n if (!node) return '(null)';\n if (node.nodeType === 3) { // Text node\n return `text: \"${(node.textContent || '').substring(0, 50)}\"`;\n }\n if (node.nodeType === 1) { // Element\n return `<${node.tagName.toLowerCase()}>`;\n }\n return `node(type=${node.nodeType})`;\n}\n", "/**\n * Clean hydrate() API for Coherent.js\n *\n * Integrates event delegation, state serialization, and mismatch detection\n * into a simple function: hydrate(component, container, options)\n *\n * @module @coherent.js/client/hydrate\n */\n\nimport { eventDelegation, handlerRegistry } from './events/index.js';\nimport { extractState, serializeState } from './hydration/index.js';\nimport { detectMismatch, reportMismatches } from './hydration/index.js';\n\n/**\n * Hydrate a server-rendered component\n *\n * @param {Function} component - Component function that returns virtual DOM\n * @param {HTMLElement} container - DOM element containing server-rendered HTML\n * @param {Object} [options] - Hydration options\n * @param {Object} [options.initialState] - Initial state to override extracted state\n * @param {boolean} [options.detectMismatch=true] - Enable mismatch detection (dev mode)\n * @param {boolean} [options.strict=false] - Throw on mismatch instead of warning\n * @param {Function} [options.onMismatch] - Custom mismatch handler\n * @param {Object} [options.props] - Additional props to pass to component\n * @returns {Object} Control object with unmount(), rerender(), getState(), setState()\n */\nexport function hydrate(component, container, options = {}) {\n // Validate inputs\n if (typeof component !== 'function') {\n throw new Error(\n `hydrate() requires a component function, received: ${typeof component}`\n );\n }\n\n if (!container || typeof container.getAttribute !== 'function') {\n throw new Error(\n `hydrate() requires a valid DOM element as container, received: ${\n container === null ? 'null' : typeof container\n }`\n );\n }\n\n // Initialize event delegation (idempotent)\n eventDelegation.initialize();\n\n // Extract options with defaults\n const {\n initialState: providedState,\n detectMismatch: shouldDetectMismatch = process.env.NODE_ENV !== 'production',\n strict = false,\n onMismatch,\n props: additionalProps = {},\n } = options;\n\n // Extract state from DOM data-state attribute, or use provided initial state\n let state = providedState ?? extractState(container) ?? {};\n\n // Store event listeners for cleanup\n const eventListeners = [];\n\n // Track registered handler IDs for cleanup\n const registeredHandlerIds = new Set();\n\n // Create component reference for handler registry\n const componentRef = {\n getState: () => state,\n setState: (newState) => {\n if (typeof newState === 'function') {\n state = { ...state, ...newState(state) };\n } else {\n state = { ...state, ...newState };\n }\n // Re-render on state change\n doRerender();\n },\n };\n\n // Generate virtual DOM from component\n const componentProps = { ...additionalProps, ...state };\n let virtualDOM = component(componentProps);\n\n // Detect mismatches if enabled\n if (shouldDetectMismatch) {\n const mismatches = detectMismatch(container, virtualDOM);\n\n if (mismatches.length > 0) {\n if (onMismatch) {\n onMismatch(mismatches);\n } else {\n reportMismatches(mismatches, {\n componentName: component.name || 'Anonymous',\n strict,\n });\n }\n }\n }\n\n // Walk virtual DOM and register event handlers\n registerEventHandlers(container, virtualDOM, componentRef, registeredHandlerIds);\n\n /**\n * Re-render the component with current state\n */\n function doRerender() {\n const newProps = { ...additionalProps, ...state };\n virtualDOM = component(newProps);\n\n // Update DOM with new virtual DOM\n // For now, we do a simple patch - just update text content and attributes\n // Full reconciliation would be in a separate module\n patchDOM(container, virtualDOM);\n\n // Re-register event handlers after DOM update\n registerEventHandlers(container, virtualDOM, componentRef, registeredHandlerIds);\n }\n\n /**\n * Unmount the component and clean up\n */\n function unmount() {\n // Remove registered event handlers\n for (const handlerId of registeredHandlerIds) {\n handlerRegistry.unregister(handlerId);\n }\n registeredHandlerIds.clear();\n\n // Remove direct event listeners\n for (const { element, event, handler, options } of eventListeners) {\n element.removeEventListener(event, handler, options);\n }\n eventListeners.length = 0;\n\n // Clear container's hydration marker\n container.removeAttribute('data-coherent-hydrated');\n }\n\n /**\n * Force re-render with optional new props\n * @param {Object} [newProps] - New props to merge\n */\n function rerender(newProps) {\n if (newProps) {\n Object.assign(additionalProps, newProps);\n }\n doRerender();\n }\n\n /**\n * Get current state\n * @returns {Object} Current state\n */\n function getState() {\n return { ...state };\n }\n\n /**\n * Set state and trigger re-render\n * @param {Object|Function} newState - New state or updater function\n */\n function setState(newState) {\n componentRef.setState(newState);\n }\n\n // Mark container as hydrated\n container.setAttribute('data-coherent-hydrated', 'true');\n\n // Return control object\n return {\n unmount,\n rerender,\n getState,\n setState,\n };\n}\n\n/**\n * Walk virtual DOM tree and register event handlers\n * @private\n */\nfunction registerEventHandlers(domElement, vNode, componentRef, handlerIds) {\n if (!vNode || typeof vNode !== 'object' || Array.isArray(vNode)) {\n return;\n }\n\n const tagName = Object.keys(vNode)[0];\n const props = vNode[tagName];\n\n if (!props || typeof props !== 'object') {\n return;\n }\n\n // Look for event handler props (on* functions)\n const eventProps = Object.keys(props).filter(\n (key) => key.startsWith('on') && typeof props[key] === 'function'\n );\n\n for (const eventProp of eventProps) {\n const eventType = eventProp.slice(2).toLowerCase(); // onClick -> click\n const handler = props[eventProp];\n\n // Generate unique handler ID\n const handlerId = `${tagName}-${eventType}-${Math.random().toString(36).slice(2, 9)}`;\n\n // Register handler\n handlerRegistry.register(handlerId, handler, componentRef);\n handlerIds.add(handlerId);\n\n // Set data attribute on DOM element for delegation\n const attrName = `data-coherent-${eventType}`;\n if (domElement.setAttribute) {\n domElement.setAttribute(attrName, handlerId);\n }\n }\n\n // Recursively process children\n const children = getVNodeChildren(props);\n const domChildren = getSignificantDOMChildren(domElement);\n\n children.forEach((child, index) => {\n if (child && typeof child === 'object' && !Array.isArray(child) && domChildren[index]) {\n registerEventHandlers(domChildren[index], child, componentRef, handlerIds);\n }\n });\n}\n\n/**\n * Simple DOM patching for re-renders\n * @private\n */\nfunction patchDOM(domElement, vNode) {\n if (!vNode || !domElement) {\n return;\n }\n\n // Handle text/number\n if (typeof vNode === 'string' || typeof vNode === 'number') {\n if (domElement.textContent !== String(vNode)) {\n domElement.textContent = String(vNode);\n }\n return;\n }\n\n // Handle arrays\n if (Array.isArray(vNode)) {\n return; // Array patching would need reconciliation\n }\n\n if (typeof vNode !== 'object') {\n return;\n }\n\n const tagName = Object.keys(vNode)[0];\n const props = vNode[tagName] || {};\n\n // Update attributes\n const attributeMap = {\n className: 'class',\n htmlFor: 'for',\n };\n\n for (const [key, value] of Object.entries(props)) {\n if (key === 'children' || key === 'text' || key.startsWith('on')) {\n continue;\n }\n\n const attrName = attributeMap[key] || key;\n\n if (value === true) {\n domElement.setAttribute(attrName, '');\n } else if (value === false || value === null || value === undefined) {\n domElement.removeAttribute(attrName);\n } else if (domElement.getAttribute(attrName) !== String(value)) {\n domElement.setAttribute(attrName, String(value));\n }\n }\n\n // Handle text content\n if (props.text !== undefined) {\n const textContent = String(props.text);\n if (domElement.textContent !== textContent) {\n domElement.textContent = textContent;\n }\n return;\n }\n\n // Recursively patch children\n const children = getVNodeChildren(props);\n const domChildren = getSignificantDOMChildren(domElement);\n\n children.forEach((child, index) => {\n if (domChildren[index]) {\n patchDOM(domChildren[index], child);\n }\n });\n}\n\n/**\n * Get children from virtual node props\n * @private\n */\nfunction getVNodeChildren(props) {\n if (!props) return [];\n if (props.children) {\n return Array.isArray(props.children) ? props.children : [props.children];\n }\n return [];\n}\n\n/**\n * Get significant DOM children (elements and non-whitespace text)\n * @private\n */\nfunction getSignificantDOMChildren(element) {\n if (!element || !element.childNodes) return [];\n\n return Array.from(element.childNodes).filter((node) => {\n if (node.nodeType === 1) return true; // Element\n if (node.nodeType === 3) {\n // Text node\n return node.textContent && node.textContent.trim().length > 0;\n }\n return false;\n });\n}\n\nexport default hydrate;\n", "/**\n * CleanupTracker - Tracks and automatically cleans up module resources during HMR\n *\n * Prevents memory leaks by tracking timers, intervals, event listeners, and fetch\n * requests created by modules. When a module is disposed during HMR, all its\n * tracked resources are automatically cleaned up.\n *\n * @module @coherent.js/client/hmr/cleanup-tracker\n */\n\n/**\n * Tracks module resources for cleanup during HMR\n */\nexport class CleanupTracker {\n constructor() {\n /**\n * Per-module resource tracking\n * @type {Map<string, { timers: Set<number>, intervals: Set<number>, listeners: Array, abortControllers: Set<AbortController> }>}\n */\n this.moduleResources = new Map();\n }\n\n /**\n * Create a tracked context for a module\n *\n * Returns an object with tracked versions of setTimeout, setInterval,\n * addEventListener, and fetch that automatically clean up on module disposal.\n *\n * @param {string} moduleId - Unique identifier for the module\n * @returns {Object} Tracked context with setTimeout, setInterval, etc.\n */\n createContext(moduleId) {\n const resources = {\n timers: new Set(),\n intervals: new Set(),\n listeners: [],\n abortControllers: new Set(),\n };\n\n this.moduleResources.set(moduleId, resources);\n\n const context = {\n /**\n * Tracked setTimeout - auto-removes from tracking on completion\n * @param {Function} callback - Function to execute\n * @param {number} delay - Delay in milliseconds\n * @param {...*} args - Additional arguments to pass to callback\n * @returns {number} Timer ID\n */\n setTimeout: (callback, delay, ...args) => {\n const id = setTimeout(\n (...a) => {\n resources.timers.delete(id);\n callback(...a);\n },\n delay,\n ...args\n );\n resources.timers.add(id);\n return id;\n },\n\n /**\n * Tracked setInterval - stores in intervals set until cleared\n * @param {Function} callback - Function to execute\n * @param {number} delay - Interval in milliseconds\n * @param {...*} args - Additional arguments to pass to callback\n * @returns {number} Interval ID\n */\n setInterval: (callback, delay, ...args) => {\n const id = setInterval(callback, delay, ...args);\n resources.intervals.add(id);\n return id;\n },\n\n /**\n * Clear a tracked timeout\n * @param {number} id - Timer ID to clear\n */\n clearTimeout: (id) => {\n resources.timers.delete(id);\n clearTimeout(id);\n },\n\n /**\n * Clear a tracked interval\n * @param {number} id - Interval ID to clear\n */\n clearInterval: (id) => {\n resources.intervals.delete(id);\n clearInterval(id);\n },\n\n /**\n * Tracked addEventListener - stores listener info for removal on cleanup\n * @param {EventTarget} target - Element or object to attach listener to\n * @param {string} event - Event type\n * @param {Function} handler - Event handler function\n * @param {Object|boolean} [options] - Listener options\n */\n addEventListener: (target, event, handler, options) => {\n target.addEventListener(event, handler, options);\n resources.listeners.push({ target, event, handler, options });\n },\n\n /**\n * Create a tracked AbortController\n * @returns {AbortController} Tracked AbortController\n */\n createAbortController: () => {\n const controller = new AbortController();\n resources.abortControllers.add(controller);\n return controller;\n },\n\n /**\n * Tracked fetch - creates AbortController automatically, cleans up on completion\n * @param {string|URL} url - URL to fetch\n * @param {Object} [options] - Fetch options\n * @returns {Promise<Response>} Fetch promise\n */\n fetch: (url, options = {}) => {\n const controller = new AbortController();\n resources.abortControllers.add(controller);\n\n // Merge signals if one was provided\n const mergedOptions = {\n ...options,\n signal: controller.signal,\n };\n\n return fetch(url, mergedOptions).finally(() => {\n resources.abortControllers.delete(controller);\n });\n },\n };\n\n return context;\n }\n\n /**\n * Cleanup all resources for a module\n *\n * Called during HMR module disposal. Clears all timers, intervals,\n * removes all event listeners, and aborts all pending fetch requests.\n *\n * @param {string} moduleId - Module identifier to clean up\n */\n cleanup(moduleId) {\n const resources = this.moduleResources.get(moduleId);\n if (!resources) return;\n\n // Clear all timers\n for (const id of resources.timers) {\n clearTimeout(id);\n }\n resources.timers.clear();\n\n // Clear all intervals\n for (const id of resources.intervals) {\n clearInterval(id);\n }\n resources.intervals.clear();\n\n // Remove all event listeners\n for (const { target, event, handler, options } of resources.listeners) {\n try {\n target.removeEventListener(event, handler, options);\n } catch {\n // Target may no longer exist\n }\n }\n resources.listeners.length = 0;\n\n // Abort all pending fetches\n for (const controller of resources.abortControllers) {\n try {\n controller.abort();\n } catch {\n // Ignore abort errors\n }\n }\n resources.abortControllers.clear();\n\n this.moduleResources.delete(moduleId);\n }\n\n /**\n * Check for potential resource leaks (for development mode)\n *\n * Logs warnings if resources weren't cleaned up before module disposal.\n * Call this before cleanup() to detect potential leaks.\n *\n * @param {string} moduleId - Module identifier to check\n */\n checkForLeaks(moduleId) {\n const resources = this.moduleResources.get(moduleId);\n if (!resources) return;\n\n const warnings = [];\n\n if (resources.timers.size > 0) {\n warnings.push(`${resources.timers.size} timer(s) not cleaned up`);\n }\n if (resources.intervals.size > 0) {\n warnings.push(`${resources.intervals.size} interval(s) not cleaned up`);\n }\n if (resources.listeners.length > 0) {\n warnings.push(`${resources.listeners.length} listener(s) not cleaned up`);\n }\n if (resources.abortControllers.size > 0) {\n warnings.push(\n `${resources.abortControllers.size} pending fetch(es) not aborted`\n );\n }\n\n if (warnings.length > 0) {\n console.warn(`[HMR] Potential leak in module ${moduleId}: ${warnings.join(', ')}`);\n }\n }\n\n /**\n * Check if a module has tracked resources\n * @param {string} moduleId - Module identifier\n * @returns {boolean} True if module has resources\n */\n hasResources(moduleId) {\n return this.moduleResources.has(moduleId);\n }\n\n /**\n * Get resource counts for a module (for testing/debugging)\n * @param {string} moduleId - Module identifier\n * @returns {Object|null} Resource counts or null if module not tracked\n */\n getResourceCounts(moduleId) {\n const resources = this.moduleResources.get(moduleId);\n if (!resources) return null;\n\n return {\n timers: resources.timers.size,\n intervals: resources.intervals.size,\n listeners: resources.listeners.length,\n abortControllers: resources.abortControllers.size,\n };\n }\n}\n\n/**\n * Singleton cleanup tracker instance\n * @type {CleanupTracker}\n */\nexport const cleanupTracker = new CleanupTracker();\n", "/**\n * StateCapturer - Captures and restores form input state and scroll positions during HMR\n *\n * Preserves user input and scroll positions across hot module replacement updates,\n * providing a seamless development experience. Only restores scroll position if\n * the page layout hasn't changed significantly.\n *\n * @module @coherent.js/client/hmr/state-capturer\n */\n\n/**\n * Captures and restores form/scroll state during HMR\n */\nexport class StateCapturer {\n constructor() {\n /**\n * Captured form input states\n * @type {Map<string, { value: string, type: string, selectionStart?: number, selectionEnd?: number, checked?: boolean }>}\n */\n this.capturedInputs = new Map();\n\n /**\n * Captured scroll positions\n * @type {Map<string, { top: number, left: number }>}\n */\n this.scrollPositions = new Map();\n\n /**\n * Layout snapshot for change detection\n * @type {Object|null}\n */\n this.layoutSnapshot = null;\n }\n\n /**\n * Generate a stable key for an input element\n *\n * Uses multiple factors to identify inputs across HMR updates:\n * 1. ID (most stable)\n * 2. Name + type\n * 3. Form context\n * 4. DOM path (fallback)\n *\n * @param {HTMLInputElement|HTMLTextAreaElement|HTMLSelectElement} input - Input element\n * @returns {string} Stable key for the input\n */\n getInputKey(input) {\n const parts = [];\n\n // ID is most stable\n if (input.id) {\n parts.push(`#${input.id}`);\n return parts.join(':');\n }\n\n // Name + type combination\n if (input.name) {\n parts.push(`[name=\"${input.name}\"]`);\n }\n\n if (input.type) {\n parts.push(`[type=\"${input.type}\"]`);\n }\n\n // Form context if available\n if (input.form?.id) {\n parts.push(`form#${input.form.id}`);\n }\n\n // Fallback: DOM path\n if (parts.length === 0) {\n parts.push(this.getElementPath(input));\n }\n\n return parts.join(':');\n }\n\n /**\n * Build a CSS-like path for an element\n *\n * @param {HTMLElement} element - Element to build path for\n * @returns {string} CSS-like path (e.g., \"form > div:nth-of-type(2) > input\")\n */\n getElementPath(element) {\n const path = [];\n let current = element;\n\n while (current && current !== document.body && path.length < 10) {\n let selector = current.tagName.toLowerCase();\n\n // Add class names (limited to avoid overly long selectors)\n if (current.className && typeof current.className === 'string') {\n const classes = current.className.trim().split(/\\s+/).slice(0, 2);\n if (classes.length > 0 && classes[0]) {\n selector += `.${classes.join('.')}`;\n }\n }\n\n // Add nth-of-type for disambiguation\n if (current.parentElement) {\n const siblings = current.parentElement.querySelectorAll(\n `:scope > ${current.tagName.toLowerCase()}`\n );\n if (siblings.length > 1) {\n const index = Array.from(siblings).indexOf(current);\n selector += `:nth-of-type(${index + 1})`;\n }\n }\n\n path.unshift(selector);\n current = current.parentElement;\n }\n\n return path.join(' > ');\n }\n\n /**\n * Capture all form input states\n *\n * Iterates through all input, textarea, and select elements,\n * capturing their values, selection state, and checked state.\n *\n * @returns {Map<string, Object>} Map of input keys to their captured state\n */\n captureFormState() {\n this.capturedInputs.clear();\n\n const inputs = document.querySelectorAll('input, textarea, select');\n\n for (const input of inputs) {\n const key = this.getInputKey(input);\n const state = {\n value: input.value,\n type: input.type || input.tagName.toLowerCase(),\n };\n\n // Capture selection for text-like inputs\n if (\n typeof input.selectionStart === 'number' &&\n (input.type === 'text' ||\n input.type === 'search' ||\n input.type === 'url' ||\n input.type === 'tel' ||\n input.type === 'password' ||\n input.tagName.toLowerCase() === 'textarea')\n ) {\n state.selectionStart = input.selectionStart;\n state.selectionEnd = input.selectionEnd;\n }\n\n // Capture checked state for checkboxes/radios\n if (input.type === 'checkbox' || input.type === 'radio') {\n state.checked = input.checked;\n }\n\n this.capturedInputs.set(key, state);\n }\n\n return this.capturedInputs;\n }\n\n /**\n * Restore form input states after HMR update\n *\n * Finds inputs by their captured keys and restores their values,\n * only if the input type matches (to avoid corrupting data).\n */\n restoreFormState() {\n for (const [key, state] of this.capturedInputs) {\n const inputs = this.findInputsByKey(key);\n\n for (const input of inputs) {\n // Only restore if type matches\n const currentType = input.type || input.tagName.toLowerCase();\n if (currentType !== state.type) {\n continue;\n }\n\n // Restore checkbox/radio checked state\n if (state.checked !== undefined) {\n input.checked = state.checked;\n continue;\n }\n\n // Restore value\n input.value = state.value;\n\n // Restore selection if applicable and input is not focused\n if (\n state.selectionStart !== undefined &&\n document.activeElement !== input\n ) {\n try {\n input.setSelectionRange(state.selectionStart, state.selectionEnd);\n } catch {\n // Some input types don't support setSelectionRange\n }\n }\n }\n }\n }\n\n /**\n * Find inputs matching a captured key\n *\n * @param {string} key - Captured input key\n * @returns {HTMLElement[]} Array of matching input elements\n */\n findInputsByKey(key) {\n // ID-based key\n if (key.startsWith('#')) {\n const id = key.slice(1);\n const el = document.getElementById(id);\n return el ? [el] : [];\n }\n\n // Name-based key\n const nameMatch = key.match(/\\[name=\"([^\"]+)\"\\]/);\n if (nameMatch) {\n const name = nameMatch[1];\n const typeMatch = key.match(/\\[type=\"([^\"]+)\"\\]/);\n const type = typeMatch ? typeMatch[1] : null;\n\n let selector = `[name=\"${name}\"]`;\n if (type) {\n selector += `[type=\"${type}\"]`;\n }\n\n return Array.from(document.querySelectorAll(selector));\n }\n\n // Path-based key - try to query directly\n try {\n const el = document.querySelector(key);\n return el ? [el] : [];\n } catch {\n return [];\n }\n }\n\n /**\n * Capture scroll positions for window and scrollable containers\n *\n * Captures scroll positions for:\n * - Window (scrollX/scrollY)\n * - Elements with [data-coherent-scroll-preserve] attribute\n * - Elements with overflow that have actual scrolling\n */\n captureScrollPositions() {\n this.scrollPositions.clear();\n\n // Window scroll\n this.scrollPositions.set('window', {\n top: window.scrollY,\n left: window.scrollX,\n });\n\n // Find scrollable containers with explicit marker\n const markedScrollables = document.querySelectorAll(\n '[data-coherent-scroll-preserve]'\n );\n for (const el of markedScrollables) {\n const key = this.getScrollableKey(el);\n this.scrollPositions.set(key, {\n top: el.scrollTop,\n left: el.scrollLeft,\n });\n }\n\n // Find elements with overflow that have actual scroll content\n const overflowElements = document.querySelectorAll(\n '[style*=\"overflow\"], [class]'\n );\n for (const el of overflowElements) {\n const style = window.getComputedStyle(el);\n const hasOverflow =\n style.overflow === 'auto' ||\n style.overflow === 'scroll' ||\n style.overflowY === 'auto' ||\n style.overflowY === 'scroll' ||\n style.overflowX === 'auto' ||\n style.overflowX === 'scroll';\n\n if (\n hasOverflow &&\n (el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth)\n ) {\n const key = this.getScrollableKey(el);\n if (!this.scrollPositions.has(key)) {\n this.scrollPositions.set(key, {\n top: el.scrollTop,\n left: el.scrollLeft,\n });\n }\n }\n }\n\n return this.scrollPositions;\n }\n\n /**\n * Generate a stable key for a scrollable element\n *\n * @param {HTMLElement} el - Scrollable element\n * @returns {string} Key for the element\n */\n getScrollableKey(el) {\n if (el.id) {\n return `#${el.id}`;\n }\n\n const component = el.getAttribute('data-coherent-component');\n if (component) {\n return `[data-coherent-component=\"${component}\"]`;\n }\n\n return this.getElementPath(el);\n }\n\n /**\n * Capture layout snapshot for change detection\n *\n * Captures body dimensions and positions of anchor elements\n * (elements with data-coherent-component attribute).\n */\n captureLayout() {\n this.layoutSnapshot = {\n bodyHeight: document.body.scrollHeight,\n bodyWidth: document.body.scrollWidth,\n anchors: new Map(),\n };\n\n // Capture positions of component elements as anchors\n const components = document.querySelectorAll('[data-coherent-component]');\n for (const el of components) {\n const rect = el.getBoundingClientRect();\n const key = this.getScrollableKey(el);\n this.layoutSnapshot.anchors.set(key, {\n top: rect.top,\n left: rect.left,\n width: rect.width,\n height: rect.height,\n });\n }\n }\n\n /**\n * Check if layout changed significantly (>50px shift)\n *\n * Returns true if:\n * - Body dimensions changed by more than 50px\n * - Any anchor element position shifted by more than 50px\n *\n * @returns {boolean} True if layout changed significantly\n */\n layoutChangedSignificantly() {\n if (!this.layoutSnapshot) {\n return false;\n }\n\n const THRESHOLD = 50; // pixels\n\n // Check body dimensions\n const heightDiff = Math.abs(\n document.body.scrollHeight - this.layoutSnapshot.bodyHeight\n );\n const widthDiff = Math.abs(\n document.body.scrollWidth - this.layoutSnapshot.bodyWidth\n );\n\n if (heightDiff > THRESHOLD || widthDiff > THRESHOLD) {\n return true;\n }\n\n // Check anchor element positions\n for (const [key, oldRect] of this.layoutSnapshot.anchors) {\n const el = this.findElementByKey(key);\n if (!el) {\n continue;\n }\n\n const newRect = el.getBoundingClientRect();\n const topDiff = Math.abs(newRect.top - oldRect.top);\n const leftDiff = Math.abs(newRect.left - oldRect.left);\n\n if (topDiff > THRESHOLD || leftDiff > THRESHOLD) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Find an element by its scrollable key\n *\n * @param {string} key - Element key\n * @returns {HTMLElement|null} Found element or null\n */\n findElementByKey(key) {\n if (key === 'window') {\n return null;\n }\n\n if (key.startsWith('#')) {\n return document.getElementById(key.slice(1));\n }\n\n try {\n return document.querySelector(key);\n } catch {\n return null;\n }\n }\n\n /**\n * Restore scroll positions if layout hasn't changed significantly\n *\n * Logs a message if scroll restoration is skipped due to layout changes.\n */\n restoreScrollPositions() {\n if (this.layoutChangedSignificantly()) {\n console.log('[HMR] Layout changed significantly, not restoring scroll');\n return;\n }\n\n // Restore window scroll\n const windowPos = this.scrollPositions.get('window');\n if (windowPos) {\n window.scrollTo(windowPos.left, windowPos.top);\n }\n\n // Restore container scrolls\n for (const [key, pos] of this.scrollPositions) {\n if (key === 'window') {\n continue;\n }\n\n const el = this.findElementByKey(key);\n if (el) {\n el.scrollTop = pos.top;\n el.scrollLeft = pos.left;\n }\n }\n }\n\n /**\n * Capture all state (form + scroll + layout)\n *\n * Convenience method that calls all capture methods.\n */\n captureAll() {\n this.captureFormState();\n this.captureScrollPositions();\n this.captureLayout();\n }\n\n /**\n * Restore all state (form + scroll)\n *\n * Convenience method that calls all restore methods.\n */\n restoreAll() {\n this.restoreFormState();\n this.restoreScrollPositions();\n }\n\n /**\n * Clear all captured state\n */\n clear() {\n this.capturedInputs.clear();\n this.scrollPositions.clear();\n this.layoutSnapshot = null;\n }\n}\n\n/**\n * Singleton state capturer instance\n * @type {StateCapturer}\n */\nexport const stateCapturer = new StateCapturer();\n", "/**\n * HMR Error Overlay\n *\n * Displays error information in a full-screen overlay with Shadow DOM isolation.\n * Provides click-to-open editor support and keyboard/click dismissal.\n *\n * @module @coherent.js/client/hmr/overlay\n */\n\n/**\n * Escape HTML special characters to prevent XSS.\n * @param {string} str - String to escape\n * @returns {string} Escaped string\n */\nexport function escapeHtml(str) {\n return String(str)\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\n}\n\n/**\n * Format code frame with line numbers and highlight.\n * @param {string} frame - Code frame content\n * @param {number} highlightLine - Line number to highlight (1-based)\n * @param {number} [startLine=1] - Starting line number for the frame\n * @returns {string} Formatted HTML string\n */\nexport function formatCodeFrame(frame, highlightLine, startLine = 1) {\n if (!frame) return '';\n\n const lines = frame.split('\\n');\n return lines.map((content, i) => {\n const lineNum = startLine + i;\n const isHighlight = lineNum === highlightLine;\n return `<div class=\"line${isHighlight ? ' highlight' : ''}\">\n <span class=\"line-number\">${lineNum}</span>\n <span class=\"line-content\">${escapeHtml(content)}</span>\n </div>`;\n }).join('');\n}\n\n/**\n * Editor URL scheme map for click-to-open functionality.\n */\nconst EDITOR_URLS = {\n vscode: (file, line) => `vscode://file/${file}:${line}`,\n cursor: (file, line) => `cursor://file/${file}:${line}`,\n 'vscode-insiders': (file, line) => `vscode-insiders://file/${file}:${line}`,\n atom: (file, line) => `atom://core/open/file?filename=${file}&line=${line}`,\n sublime: (file, line) => `subl://open?url=file://${file}&line=${line}`,\n webstorm: (file, line) => `webstorm://open?file=${file}&line=${line}`,\n idea: (file, line) => `idea://open?file=${file}&line=${line}`\n};\n\n/**\n * CSS styles for the error overlay (Dracula-inspired color scheme).\n */\nconst OVERLAY_STYLES = `\n :host {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 99999;\n --bg: #181818;\n --text: #f8f8f2;\n --red: #ff5555;\n --yellow: #f1fa8c;\n --purple: #bd93f9;\n --cyan: #8be9fd;\n --code-bg: #282a36;\n --line-num: #6272a4;\n }\n .backdrop {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba(0, 0, 0, 0.66);\n }\n .container {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: min(800px, 90vw);\n max-height: 90vh;\n overflow: auto;\n background: var(--bg);\n border-radius: 8px;\n box-shadow: 0 20px 40px rgba(0, 0, 0, 0.5);\n font-family: 'SF Mono', Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace;\n }\n .header {\n padding: 16px 20px;\n background: var(--red);\n color: white;\n display: flex;\n justify-content: space-between;\n align-items: center;\n border-radius: 8px 8px 0 0;\n }\n .title {\n font-weight: bold;\n font-size: 16px;\n }\n .close-btn {\n background: none;\n border: none;\n color: white;\n font-size: 24px;\n cursor: pointer;\n padding: 0 8px;\n line-height: 1;\n }\n .close-btn:hover {\n opacity: 0.8;\n }\n .content {\n padding: 20px;\n color: var(--text);\n }\n .message {\n font-size: 18px;\n color: var(--red);\n margin-bottom: 20px;\n word-break: break-word;\n }\n .file {\n color: var(--cyan);\n margin-bottom: 16px;\n cursor: pointer;\n text-decoration: underline;\n }\n .file:hover {\n color: var(--purple);\n }\n .code-frame {\n background: var(--code-bg);\n padding: 16px;\n border-radius: 4px;\n overflow-x: auto;\n font-size: 14px;\n line-height: 1.5;\n margin-bottom: 16px;\n }\n .line {\n display: flex;\n }\n .line-number {\n width: 50px;\n color: var(--line-num);\n text-align: right;\n padding-right: 16px;\n user-select: none;\n flex-shrink: 0;\n }\n .line-content {\n flex: 1;\n white-space: pre;\n }\n .line.highlight {\n background: rgba(255, 85, 85, 0.2);\n }\n .line.highlight .line-content {\n color: var(--red);\n }\n .stack {\n margin-top: 20px;\n font-size: 12px;\n color: var(--line-num);\n white-space: pre-wrap;\n max-height: 200px;\n overflow-y: auto;\n }\n .tip {\n margin-top: 16px;\n padding: 12px;\n background: rgba(189, 147, 249, 0.1);\n border-left: 3px solid var(--purple);\n font-size: 13px;\n color: var(--text);\n }\n .tip strong {\n color: var(--purple);\n }\n`;\n\n/**\n * Error overlay class for HMR error display.\n * Uses Shadow DOM for complete style isolation.\n */\nexport class ErrorOverlay {\n constructor() {\n /** @type {{ host: HTMLElement, shadow: ShadowRoot } | null} */\n this.overlay = null;\n /** @type {string} */\n this.editor = this._getStoredEditor();\n /** @type {((e: KeyboardEvent) => void) | null} */\n this.escapeHandler = null;\n }\n\n /**\n * Get stored editor preference from localStorage.\n * @returns {string} Editor name\n * @private\n */\n _getStoredEditor() {\n try {\n return localStorage.getItem('coherent-editor') || 'vscode';\n } catch {\n return 'vscode';\n }\n }\n\n /**\n * Create the overlay element with Shadow DOM.\n * @returns {{ host: HTMLElement, shadow: ShadowRoot }} Overlay elements\n */\n createOverlay() {\n if (this.overlay) return this.overlay;\n\n const host = document.createElement('div');\n host.id = 'coherent-error-overlay';\n const shadow = host.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = OVERLAY_STYLES;\n shadow.appendChild(style);\n\n this.overlay = { host, shadow };\n return this.overlay;\n }\n\n /**\n * Show the error overlay with error details.\n * @param {Object} error - Error details\n * @param {string} error.message - Error message\n * @param {string} [error.file] - File path\n * @param {number} [error.line] - Line number\n * @param {number} [error.column] - Column number\n * @param {string} [error.frame] - Code frame with context\n * @param {string} [error.stack] - Stack trace\n */\n show(error) {\n const { host, shadow } = this.createOverlay();\n\n // Clear previous content (but keep styles)\n const existingWrapper = shadow.querySelector('.wrapper');\n if (existingWrapper) existingWrapper.remove();\n\n // Calculate start line for code frame (center on error line)\n const frameLines = error.frame ? error.frame.split('\\n').length : 0;\n const startLine = error.line ? Math.max(1, error.line - Math.floor(frameLines / 2)) : 1;\n\n const wrapper = document.createElement('div');\n wrapper.className = 'wrapper';\n wrapper.innerHTML = `\n <div class=\"backdrop\"></div>\n <div class=\"container\">\n <div class=\"header\">\n <span class=\"title\">HMR Error</span>\n <button class=\"close-btn\" title=\"Close (Escape)\">&times;</button>\n </div>\n <div class=\"content\">\n <div class=\"message\">${escapeHtml(error.message || 'Unknown error')}</div>\n ${error.file ? `\n <div class=\"file\" data-file=\"${escapeHtml(error.file)}\" data-line=\"${error.line || 1}\">\n ${escapeHtml(error.file)}${error.line ? `:${error.line}` : ''}${error.column ? `:${error.column}` : ''}\n </div>\n ` : ''}\n ${error.frame ? `\n <div class=\"code-frame\">${formatCodeFrame(error.frame, error.line, startLine)}</div>\n ` : ''}\n ${error.stack ? `\n <div class=\"stack\">${escapeHtml(error.stack)}</div>\n ` : ''}\n <div class=\"tip\">\n Press <strong>Escape</strong> or click the X to dismiss.\n ${error.file ? ` Click the file path to open in ${this.editor}.` : ''}\n </div>\n </div>\n </div>\n `;\n\n shadow.appendChild(wrapper);\n\n // Event handlers\n const closeBtn = wrapper.querySelector('.close-btn');\n const backdrop = wrapper.querySelector('.backdrop');\n const fileLink = wrapper.querySelector('.file');\n\n closeBtn?.addEventListener('click', () => this.hide());\n backdrop?.addEventListener('click', () => this.hide());\n fileLink?.addEventListener('click', (e) => {\n const target = e.target;\n const file = target.dataset.file;\n const line = parseInt(target.dataset.line, 10) || 1;\n this.openInEditor(file, line);\n });\n\n // Escape key handler\n this.escapeHandler = (e) => {\n if (e.key === 'Escape') this.hide();\n };\n document.addEventListener('keydown', this.escapeHandler);\n\n // Add to DOM if not already\n if (!host.parentNode) {\n document.body.appendChild(host);\n }\n }\n\n /**\n * Hide and remove the error overlay.\n */\n hide() {\n if (this.overlay?.host.parentNode) {\n this.overlay.host.parentNode.removeChild(this.overlay.host);\n }\n if (this.escapeHandler) {\n document.removeEventListener('keydown', this.escapeHandler);\n this.escapeHandler = null;\n }\n // Reset overlay reference so it can be recreated\n this.overlay = null;\n }\n\n /**\n * Open file in configured editor.\n * @param {string} file - File path\n * @param {number} [line=1] - Line number\n */\n openInEditor(file, line = 1) {\n const urlGenerator = EDITOR_URLS[this.editor] || EDITOR_URLS.vscode;\n const url = urlGenerator(file, line);\n window.open(url, '_self');\n }\n\n /**\n * Set preferred editor and store in localStorage.\n * @param {string} editor - Editor name (vscode, cursor, vscode-insiders, atom, sublime, webstorm, idea)\n */\n setEditor(editor) {\n this.editor = editor;\n try {\n localStorage.setItem('coherent-editor', editor);\n } catch {\n // Ignore localStorage errors\n }\n }\n}\n\n/**\n * Singleton instance of ErrorOverlay.\n */\nexport const errorOverlay = new ErrorOverlay();\n", "/**\n * HMR Connection Status Indicator\n *\n * Displays a small colored dot in the bottom-right corner indicating\n * WebSocket connection status. Unobtrusive design per CONTEXT.md decision.\n *\n * @module @coherent.js/client/hmr/indicator\n */\n\n/**\n * Status color mapping for connection states.\n */\nconst STATUS_COLORS = {\n connected: '#10b981', // Green\n disconnected: '#ef4444', // Red\n reconnecting: '#f59e0b', // Yellow/amber\n error: '#ef4444' // Red\n};\n\n/**\n * Status title mapping for accessibility.\n */\nconst STATUS_TITLES = {\n connected: 'HMR: Connected',\n disconnected: 'HMR: Disconnected',\n reconnecting: 'HMR: Reconnecting...',\n error: 'HMR: Error'\n};\n\n/**\n * Default/initial color before status is set.\n */\nconst DEFAULT_COLOR = '#666';\n\n/**\n * Connection status indicator class.\n * Shows an 8px colored dot in the bottom-right corner of the viewport.\n */\nexport class ConnectionIndicator {\n constructor() {\n /** @type {HTMLElement | null} */\n this.indicator = null;\n }\n\n /**\n * Create the indicator element if it doesn't exist.\n * Uses inline styles to avoid external CSS dependencies.\n */\n create() {\n if (this.indicator) return;\n\n const el = document.createElement('div');\n el.id = 'coherent-hmr-indicator';\n el.style.cssText = `\n position: fixed;\n bottom: 8px;\n right: 8px;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: ${DEFAULT_COLOR};\n z-index: 99998;\n pointer-events: none;\n transition: background 0.3s ease;\n `;\n el.title = 'HMR: Initializing';\n\n document.body.appendChild(el);\n this.indicator = el;\n }\n\n /**\n * Update the indicator status.\n * Creates the element if it doesn't exist (lazy initialization).\n *\n * @param {string} status - Status string: 'connected', 'disconnected', 'reconnecting', or 'error'\n */\n update(status) {\n if (!this.indicator) {\n this.create();\n }\n\n const color = STATUS_COLORS[status] || STATUS_COLORS.disconnected;\n const title = STATUS_TITLES[status] || 'HMR: Unknown';\n\n this.indicator.style.background = color;\n this.indicator.title = title;\n }\n\n /**\n * Remove the indicator from the DOM.\n */\n destroy() {\n if (this.indicator?.parentNode) {\n this.indicator.parentNode.removeChild(this.indicator);\n }\n this.indicator = null;\n }\n}\n\n/**\n * Singleton instance of ConnectionIndicator.\n */\nexport const connectionIndicator = new ConnectionIndicator();\n", "/**\n * ModuleTracker - Tracks module graph and HMR boundaries\n *\n * Provides a Vite-compatible hot context API for modules to declare\n * how they should be handled during HMR updates. Tracks accept/dispose\n * handlers and persistent data that survives updates.\n *\n * @module @coherent.js/client/hmr/module-tracker\n */\n\n/**\n * Tracks module HMR registrations and provides hot context API\n */\nexport class ModuleTracker {\n constructor() {\n /**\n * Module registrations map\n * @type {Map<string, { accept: Function|null, acceptDeps: { deps: string[], callback: Function }|null, dispose: Function|null, prune: Function|null, data: Object }>}\n */\n this.modules = new Map();\n\n /**\n * WebSocket reference for invalidation messages\n * @type {WebSocket|null}\n */\n this.socket = null;\n }\n\n /**\n * Set WebSocket reference for invalidation messages\n * @param {WebSocket|null} socket - WebSocket connection\n */\n setSocket(socket) {\n this.socket = socket;\n }\n\n /**\n * Create a hot context for a module (Vite-compatible API)\n *\n * Returns an object with:\n * - data: Persistent object that survives HMR updates\n * - accept(callback): Register self-update handler\n * - acceptDeps(deps, callback): Register dependency update handler\n * - dispose(callback): Register cleanup handler called before replacement\n * - prune(callback): Register handler for when module is removed\n * - invalidate(message): Signal that module cannot hot-update\n *\n * @param {string} moduleId - Unique identifier for the module\n * @returns {Object} Hot context object\n */\n createHotContext(moduleId) {\n // Get or create module data, preserving existing data object\n let moduleData = this.modules.get(moduleId);\n if (!moduleData) {\n moduleData = {\n accept: null,\n acceptDeps: null,\n dispose: null,\n prune: null,\n data: {},\n };\n this.modules.set(moduleId, moduleData);\n }\n\n const tracker = this;\n\n return {\n /**\n * Persistent data object that survives HMR updates.\n * Use this to preserve state across module replacements.\n */\n get data() {\n return moduleData.data;\n },\n\n /**\n * Accept self updates.\n * Called when this module is updated and can handle its own replacement.\n *\n * @param {Function} [callback] - Optional callback receiving the new module\n */\n accept(callback) {\n moduleData.accept = callback || (() => {});\n },\n\n /**\n * Accept dependency updates.\n * Called when one of the specified dependencies is updated.\n *\n * @param {string|string[]} deps - Dependency module ID(s)\n * @param {Function} callback - Callback receiving updated dependencies\n */\n acceptDeps(deps, callback) {\n const depsArray = Array.isArray(deps) ? deps : [deps];\n moduleData.acceptDeps = { deps: depsArray, callback };\n },\n\n /**\n * Register disposal callback.\n * Called before the module is replaced, receives the data object\n * to allow saving state for the next version.\n *\n * @param {Function} callback - Cleanup handler, receives data object\n */\n dispose(callback) {\n moduleData.dispose = callback;\n },\n\n /**\n * Register prune callback.\n * Called when the module is completely removed from the module graph.\n *\n * @param {Function} callback - Prune handler\n */\n prune(callback) {\n moduleData.prune = callback;\n },\n\n /**\n * Invalidate this module.\n * Signals that the module cannot be hot-updated and should propagate\n * the update to its importers.\n *\n * @param {string} [message] - Optional message explaining why\n */\n invalidate(message) {\n const WS_OPEN = typeof WebSocket !== 'undefined' ? WebSocket.OPEN : 1;\n if (tracker.socket?.readyState === WS_OPEN) {\n tracker.socket.send(JSON.stringify({\n type: 'invalidate',\n moduleId,\n message,\n }));\n }\n // Log for debugging\n console.log(`[HMR] Module ${moduleId} invalidated${message ? `: ${message}` : ''}`);\n },\n };\n }\n\n /**\n * Check if a module can be hot-updated\n *\n * Returns true if the module has registered an accept handler.\n *\n * @param {string} moduleId - Module identifier\n * @returns {boolean} True if module accepts HMR updates\n */\n canHotUpdate(moduleId) {\n const moduleData = this.modules.get(moduleId);\n return !!(moduleData?.accept || moduleData?.acceptDeps);\n }\n\n /**\n * Check if a module is an HMR boundary\n *\n * A module is considered a boundary if:\n * - It has an accept handler registered\n * - It exports __hmrBoundary = true\n * - It is associated with a data-coherent-component element\n *\n * @param {string} moduleId - Module identifier\n * @param {Object} [moduleExports] - Optional module exports to check for __hmrBoundary\n * @returns {boolean} True if module is an HMR boundary\n */\n isHmrBoundary(moduleId, moduleExports) {\n // Check for accept handler\n if (this.canHotUpdate(moduleId)) {\n return true;\n }\n\n // Check for explicit __hmrBoundary export\n if (moduleExports?.__hmrBoundary === true) {\n return true;\n }\n\n // Check for coherent component presence (by convention)\n // Extract component name from module path\n const componentName = this.extractComponentName(moduleId);\n if (componentName && typeof document !== 'undefined') {\n const hasComponent = document.querySelector(\n `[data-coherent-component=\"${componentName}\"]`\n );\n if (hasComponent) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Extract a potential component name from module path\n *\n * @param {string} moduleId - Module path\n * @returns {string|null} Component name or null\n * @private\n */\n extractComponentName(moduleId) {\n // Extract filename without extension\n const match = moduleId.match(/\\/([^/]+?)(?:\\.[^.]+)?$/);\n if (match) {\n return match[1];\n }\n return null;\n }\n\n /**\n * Execute dispose callback for a module\n *\n * Calls the registered dispose handler with the data object,\n * allowing the module to save state for the next version.\n *\n * @param {string} moduleId - Module identifier\n * @returns {Object|null} The data object (for passing to next version)\n */\n executeDispose(moduleId) {\n const moduleData = this.modules.get(moduleId);\n if (!moduleData) {\n return null;\n }\n\n // Call dispose handler with data object\n if (typeof moduleData.dispose === 'function') {\n try {\n moduleData.dispose(moduleData.data);\n } catch (err) {\n console.error(`[HMR] Error in dispose handler for ${moduleId}:`, err);\n }\n }\n\n return moduleData.data;\n }\n\n /**\n * Execute accept callback for a module\n *\n * Calls the registered accept handler with the new module.\n *\n * @param {string} moduleId - Module identifier\n * @param {Object} [newModule] - The newly imported module\n * @returns {boolean} True if accept handler was called\n */\n executeAccept(moduleId, newModule) {\n const moduleData = this.modules.get(moduleId);\n if (!moduleData?.accept) {\n return false;\n }\n\n try {\n moduleData.accept(newModule);\n return true;\n } catch (err) {\n console.error(`[HMR] Error in accept handler for ${moduleId}:`, err);\n return false;\n }\n }\n\n /**\n * Execute acceptDeps callback for a module\n *\n * Calls the registered acceptDeps handler with the updated dependencies.\n *\n * @param {string} moduleId - Module identifier\n * @param {Object} updatedDeps - Map of dependency moduleId -> new module\n * @returns {boolean} True if acceptDeps handler was called\n */\n executeAcceptDeps(moduleId, updatedDeps) {\n const moduleData = this.modules.get(moduleId);\n if (!moduleData?.acceptDeps) {\n return false;\n }\n\n try {\n const { deps, callback } = moduleData.acceptDeps;\n // Build array of updated modules in same order as deps\n const modules = deps.map((dep) => updatedDeps[dep]);\n callback(modules);\n return true;\n } catch (err) {\n console.error(`[HMR] Error in acceptDeps handler for ${moduleId}:`, err);\n return false;\n }\n }\n\n /**\n * Execute prune callback for a module\n *\n * Called when a module is removed from the module graph.\n *\n * @param {string} moduleId - Module identifier\n */\n executePrune(moduleId) {\n const moduleData = this.modules.get(moduleId);\n if (!moduleData?.prune) {\n return;\n }\n\n try {\n moduleData.prune();\n } catch (err) {\n console.error(`[HMR] Error in prune handler for ${moduleId}:`, err);\n }\n\n // Remove module from tracking\n this.modules.delete(moduleId);\n }\n\n /**\n * Check if module is registered\n *\n * @param {string} moduleId - Module identifier\n * @returns {boolean} True if module is registered\n */\n hasModule(moduleId) {\n return this.modules.has(moduleId);\n }\n\n /**\n * Get module data (for testing/debugging)\n *\n * @param {string} moduleId - Module identifier\n * @returns {Object|null} Module data or null\n */\n getModuleData(moduleId) {\n return this.modules.get(moduleId) || null;\n }\n\n /**\n * Clear all module registrations (for testing)\n */\n clear() {\n this.modules.clear();\n }\n}\n\n/**\n * Singleton module tracker instance\n * @type {ModuleTracker}\n */\nexport const moduleTracker = new ModuleTracker();\n\n/**\n * Convenience function to create a hot context for a module\n *\n * @param {string} moduleId - Module identifier\n * @returns {Object} Hot context object\n */\nexport function createHotContext(moduleId) {\n return moduleTracker.createHotContext(moduleId);\n}\n", "/**\n * HMRClient - Orchestrates WebSocket connection and HMR updates\n *\n * Integrates all HMR modules (cleanup tracker, state capturer, error overlay,\n * connection indicator) to provide seamless hot module replacement with\n * state preservation.\n *\n * @module @coherent.js/client/hmr/client\n */\n\nimport { cleanupTracker } from './cleanup-tracker.js';\nimport { stateCapturer } from './state-capturer.js';\nimport { errorOverlay } from './overlay.js';\nimport { connectionIndicator } from './indicator.js';\nimport { moduleTracker } from './module-tracker.js';\n\n/**\n * Parse error stack to extract file/line info\n *\n * @param {Error} error - Error object\n * @returns {{ file: string|null, line: number|null, column: number|null }} Parsed location\n */\nfunction parseErrorLocation(error) {\n const result = { file: null, line: null, column: null };\n\n if (!error.stack) {\n return result;\n }\n\n // Match common stack trace formats:\n // Chrome/Node: \"at Function (file.js:10:5)\"\n // Firefox: \"Function@file.js:10:5\"\n // Safari: \"file.js:10:5\"\n const patterns = [\n /at\\s+.*?\\((.+?):(\\d+):(\\d+)\\)/, // Chrome/Node with parens\n /at\\s+(.+?):(\\d+):(\\d+)/, // Chrome/Node without parens\n /@(.+?):(\\d+):(\\d+)/, // Firefox\n /^(.+?):(\\d+):(\\d+)/, // Safari\n ];\n\n const lines = error.stack.split('\\n');\n for (const line of lines) {\n for (const pattern of patterns) {\n const match = line.match(pattern);\n if (match) {\n result.file = match[1];\n result.line = parseInt(match[2], 10);\n result.column = parseInt(match[3], 10);\n return result;\n }\n }\n }\n\n return result;\n}\n\n/**\n * HMR Client class - manages WebSocket connection and update orchestration\n */\nexport class HMRClient {\n constructor() {\n /**\n * WebSocket connection\n * @type {WebSocket|null}\n */\n this.socket = null;\n\n /**\n * Connection state\n * @type {boolean}\n */\n this.connected = false;\n\n /**\n * Reconnection attempt counter\n * @type {number}\n */\n this.reconnectAttempts = 0;\n\n /**\n * Maximum reconnection attempts\n * @type {number}\n */\n this.maxReconnectAttempts = 10;\n\n /**\n * Base reconnection delay in ms\n * @type {number}\n */\n this.reconnectDelay = 1000;\n\n /**\n * Whether we've had a disconnect (for reload detection)\n * @type {boolean}\n */\n this.hadDisconnect = false;\n\n /**\n * Reconnect timeout ID\n * @type {number|null}\n */\n this.reconnectTimeout = null;\n\n /**\n * Initialization flag\n * @type {boolean}\n */\n this.initialized = false;\n }\n\n /**\n * Connect to the dev server WebSocket\n *\n * Establishes WebSocket connection with automatic reconnection using\n * exponential backoff with jitter.\n *\n * @returns {void}\n */\n connect() {\n if (typeof window === 'undefined') {\n return;\n }\n\n // Clear any pending reconnect\n if (this.reconnectTimeout !== null) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n }\n\n try {\n const protocol = location.protocol === 'https:' ? 'wss' : 'ws';\n const wsUrl = `${protocol}://${location.host}`;\n this.socket = new WebSocket(wsUrl);\n\n // Share socket with module tracker for invalidation messages\n moduleTracker.setSocket(this.socket);\n\n this.socket.addEventListener('open', () => {\n console.log('[HMR] Connected');\n this.connected = true;\n this.reconnectAttempts = 0;\n connectionIndicator.update('connected');\n\n // Send connection acknowledgment\n this.socket.send(JSON.stringify({ type: 'connected' }));\n\n // If reconnecting after disconnect, reload (server may have restarted)\n if (this.hadDisconnect) {\n console.log('[HMR] Reconnected after disconnect, reloading page');\n setTimeout(() => location.reload(), 200);\n return;\n }\n });\n\n this.socket.addEventListener('close', () => {\n this.connected = false;\n this.hadDisconnect = true;\n connectionIndicator.update('disconnected');\n moduleTracker.setSocket(null);\n this.scheduleReconnect();\n });\n\n this.socket.addEventListener('error', (event) => {\n console.warn('[HMR] WebSocket error:', event);\n connectionIndicator.update('error');\n try {\n this.socket.close();\n } catch {\n // Ignore close errors\n }\n });\n\n this.socket.addEventListener('message', (event) => {\n this.handleMessage(event);\n });\n } catch (error) {\n console.warn('[HMR] Failed to connect:', error);\n this.scheduleReconnect();\n }\n }\n\n /**\n * Schedule a reconnection attempt with exponential backoff\n *\n * @private\n */\n scheduleReconnect() {\n if (this.reconnectAttempts >= this.maxReconnectAttempts) {\n console.warn('[HMR] Max reconnection attempts reached');\n connectionIndicator.update('disconnected');\n return;\n }\n\n connectionIndicator.update('reconnecting');\n\n // Exponential backoff with jitter\n const delay = Math.min(\n this.reconnectDelay * Math.pow(2, this.reconnectAttempts) + Math.random() * 1000,\n 30000\n );\n this.reconnectAttempts++;\n\n console.log(`[HMR] Reconnecting in ${Math.round(delay)}ms (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts})`);\n\n this.reconnectTimeout = setTimeout(() => {\n this.reconnectTimeout = null;\n this.connect();\n }, delay);\n }\n\n /**\n * Handle incoming WebSocket message\n *\n * @param {MessageEvent} event - WebSocket message event\n * @private\n */\n handleMessage(event) {\n let data;\n try {\n data = JSON.parse(event.data);\n } catch {\n return;\n }\n\n console.log('[HMR] message', data.type, data.filePath || data.webPath || '');\n\n switch (data.type) {\n case 'connected':\n // Connection acknowledged\n break;\n\n case 'hmr-full-reload':\n case 'reload':\n console.warn('[HMR] Server requested full reload');\n location.reload();\n break;\n\n case 'hmr-component-update':\n case 'hmr-update':\n this.handleUpdate(data);\n break;\n\n case 'hmr-error':\n this.showError(data.error || data);\n break;\n\n case 'preview-update':\n // No-op: used by dashboard for live preview panes\n break;\n\n default:\n // Unknown message type, ignore\n break;\n }\n }\n\n /**\n * Handle module update\n *\n * Orchestrates the full HMR update cycle:\n * 1. Capture form/scroll state\n * 2. Execute dispose handlers\n * 3. Clean up module resources\n * 4. Re-import module\n * 5. Execute accept handlers\n * 6. Restore state\n *\n * @param {Object} data - Update message data\n * @param {string} [data.filePath] - File path that changed\n * @param {string} [data.webPath] - Web-accessible path\n * @param {string} [data.updateType] - Type of update (component, style, etc.)\n */\n async handleUpdate(data) {\n const filePath = data.webPath || data.filePath || '';\n const moduleId = filePath;\n\n try {\n // 1. Capture current state\n stateCapturer.captureAll();\n\n // 2. Execute dispose handler if registered\n if (moduleTracker.hasModule(moduleId)) {\n moduleTracker.executeDispose(moduleId);\n }\n\n // 3. Clean up module resources\n if (cleanupTracker.hasResources(moduleId)) {\n cleanupTracker.checkForLeaks(moduleId);\n cleanupTracker.cleanup(moduleId);\n }\n\n // 4. Re-import module with cache bust\n const importPath = filePath.startsWith('/') ? filePath : `/${filePath}`;\n const newModule = await import(`${importPath}?t=${Date.now()}`);\n\n // 5. Execute accept handler if module can hot-update\n const accepted = moduleTracker.canHotUpdate(moduleId);\n if (accepted) {\n moduleTracker.executeAccept(moduleId, newModule);\n } else {\n // Fall back to autoHydrate for components without explicit accept\n await this.fallbackHydrate();\n }\n\n // 6. Restore state\n stateCapturer.restoreAll();\n\n // 7. Hide error overlay (in case previous error is now fixed)\n errorOverlay.hide();\n\n // 8. Log success\n console.log(`[HMR] Updated: ${data.updateType || 'module'} ${filePath}`);\n } catch (error) {\n this.handleUpdateError(error, filePath);\n }\n }\n\n /**\n * Fall back to autoHydrate for non-HMR-aware modules\n *\n * @private\n */\n async fallbackHydrate() {\n try {\n // Try to import autoHydrate from the hydration module\n const { autoHydrate } = await import('../hydration.js');\n\n // If examples register a component registry on window, prefer targeted hydrate\n if (typeof window !== 'undefined' && window.componentRegistry) {\n autoHydrate(window.componentRegistry);\n } else {\n autoHydrate();\n }\n } catch {\n // autoHydrate not available or failed\n console.warn('[HMR] autoHydrate not available, component may need manual refresh');\n }\n }\n\n /**\n * Handle update error\n *\n * @param {Error} error - Error that occurred\n * @param {string} filePath - File that was being updated\n * @private\n */\n handleUpdateError(error, filePath) {\n console.error('[HMR] Update failed:', error);\n\n // Parse error location from stack\n const location = parseErrorLocation(error);\n\n // Build error details for overlay\n const errorDetails = {\n message: error.message || 'Unknown error during HMR update',\n file: location.file || filePath,\n line: location.line,\n column: location.column,\n stack: error.stack,\n };\n\n this.showError(errorDetails);\n }\n\n /**\n * Show error overlay\n *\n * @param {Object} error - Error details\n */\n showError(error) {\n errorOverlay.show(error);\n }\n\n /**\n * Hide error overlay\n */\n hideError() {\n errorOverlay.hide();\n }\n\n /**\n * Initialize HMR client\n *\n * Guards against double initialization and connects to dev server.\n *\n * @returns {void}\n */\n initialize() {\n if (typeof window === 'undefined') {\n return;\n }\n\n // Guard against double initialization\n if (window.__coherent_hmr_initialized || this.initialized) {\n return;\n }\n\n window.__coherent_hmr_initialized = true;\n this.initialized = true;\n\n this.connect();\n }\n\n /**\n * Disconnect and clean up\n *\n * @returns {void}\n */\n disconnect() {\n if (this.reconnectTimeout !== null) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n }\n\n if (this.socket) {\n try {\n this.socket.close();\n } catch {\n // Ignore close errors\n }\n this.socket = null;\n }\n\n this.connected = false;\n moduleTracker.setSocket(null);\n connectionIndicator.destroy();\n }\n\n /**\n * Check if client is connected\n *\n * @returns {boolean} True if connected\n */\n isConnected() {\n return this.connected;\n }\n}\n\n/**\n * Singleton HMR client instance\n * @type {HMRClient}\n */\nexport const hmrClient = new HMRClient();\n"],
5
- "mappings": "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",
3
+ "sources": ["../src/hydration/state-serializer.js", "../src/hydration/mismatch-detector.js", "../src/hydrate.js", "../src/hmr/cleanup-tracker.js", "../src/hmr/state-capturer.js", "../src/hmr/overlay.js", "../src/hmr/indicator.js", "../src/hmr/module-tracker.js", "../src/hmr/client.js"],
4
+ "sourcesContent": ["/**\n * State serialization utilities for Coherent.js hydration\n *\n * Uses base64 encoding to safely embed state in data attributes\n * without escaping issues.\n */\n\n/**\n * Serialize component state to base64-encoded JSON string\n *\n * @param {Object} state - Component state object\n * @returns {string|null} - Base64 encoded state or null if empty/invalid\n */\nexport function serializeState(state) {\n if (!state || typeof state !== 'object') return null;\n\n // Filter out non-serializable values (functions, symbols, undefined)\n const serializable = {};\n let hasSerializable = false;\n\n for (const [key, value] of Object.entries(state)) {\n if (isSerializable(value)) {\n serializable[key] = value;\n hasSerializable = true;\n }\n // Silently omit functions, symbols, undefined - they reconstruct on hydrate\n }\n\n if (!hasSerializable) return null;\n\n try {\n const json = JSON.stringify(serializable);\n // Use encodeURIComponent to handle unicode, then btoa for base64\n return btoa(encodeURIComponent(json));\n } catch (e) {\n console.warn('[Coherent.js] Failed to serialize state:', e);\n return null;\n }\n}\n\n/**\n * Deserialize state from base64-encoded JSON string\n *\n * @param {string} encoded - Base64 encoded state string\n * @returns {Object|null} - Deserialized state or null if invalid\n */\nexport function deserializeState(encoded) {\n if (!encoded || typeof encoded !== 'string') return null;\n\n try {\n const json = decodeURIComponent(atob(encoded));\n return JSON.parse(json);\n } catch (e) {\n console.warn('[Coherent.js] Failed to deserialize state:', e);\n return null;\n }\n}\n\n/**\n * Extract state from a DOM element's data-state attribute\n *\n * @param {HTMLElement} element - DOM element to extract state from\n * @returns {Object|null} - Extracted state or null\n */\nexport function extractState(element) {\n if (!element || typeof element.getAttribute !== 'function') {\n return null;\n }\n\n const encoded = element.getAttribute('data-state');\n return deserializeState(encoded);\n}\n\n/**\n * Check if a value is serializable to JSON\n * @private\n */\nfunction isSerializable(value) {\n if (value === undefined) return false;\n if (value === null) return true;\n if (typeof value === 'function') return false;\n if (typeof value === 'symbol') return false;\n if (typeof value === 'bigint') return false; // BigInt not JSON serializable\n\n // Arrays and objects need recursive check\n if (Array.isArray(value)) {\n return value.every(isSerializable);\n }\n\n if (typeof value === 'object') {\n // Check for circular references would be expensive here\n // JSON.stringify will catch them in serializeState\n return true;\n }\n\n return true; // primitives (string, number, boolean)\n}\n\n/**\n * Size warning threshold (bytes)\n * Warn if serialized state exceeds this\n */\nconst STATE_SIZE_WARNING_THRESHOLD = 10 * 1024; // 10KB\n\n/**\n * Serialize state with size warning\n *\n * @param {Object} state - Component state\n * @param {string} componentName - Component name for warning message\n * @returns {string|null} - Serialized state\n */\nexport function serializeStateWithWarning(state, componentName = 'Unknown') {\n const encoded = serializeState(state);\n\n if (encoded && encoded.length > STATE_SIZE_WARNING_THRESHOLD) {\n console.warn(\n `[Coherent.js] Large state detected for component \"${componentName}\": ` +\n `${Math.round(encoded.length / 1024)}KB. Consider using a state management ` +\n `solution for large datasets.`\n );\n }\n\n return encoded;\n}\n", "/**\n * Mismatch detection for Coherent.js hydration\n *\n * Compares server-rendered DOM against client virtual DOM to detect\n * hydration mismatches in development mode.\n */\n\n/**\n * Format path segments into readable string\n * @param {Array} segments - Path segments\n * @returns {string} - Formatted path\n */\nexport function formatPath(segments) {\n if (!segments || segments.length === 0) return 'root';\n return segments.join('.');\n}\n\n/**\n * Get children from virtual node\n * @private\n */\nfunction getVNodeChildren(vNode) {\n if (!vNode || typeof vNode !== 'object' || Array.isArray(vNode)) {\n return [];\n }\n const tagName = Object.keys(vNode)[0];\n const props = vNode[tagName];\n if (!props || typeof props !== 'object') {\n return [];\n }\n if (props.children) {\n return Array.isArray(props.children) ? props.children : [props.children];\n }\n if (props.text !== undefined) {\n return [String(props.text)];\n }\n return [];\n}\n\n/**\n * Detect mismatches between DOM and virtual DOM\n *\n * @param {Element} domElement - Real DOM element\n * @param {Object|string|number} virtualNode - Virtual DOM node\n * @param {Array} path - Current path for error reporting\n * @returns {Array} - Array of mismatch objects\n */\nexport function detectMismatch(domElement, virtualNode, path = []) {\n const mismatches = [];\n\n // Handle null/undefined virtual node\n if (virtualNode === null || virtualNode === undefined) {\n return mismatches;\n }\n\n // Handle text nodes (string or number in virtual DOM)\n if (typeof virtualNode === 'string' || typeof virtualNode === 'number') {\n const expectedText = String(virtualNode).trim();\n\n // DOM might be a text node or element containing text\n let actualText;\n if (domElement.nodeType === 3) { // Node.TEXT_NODE\n actualText = domElement.textContent?.trim() || '';\n } else {\n // For element nodes, get direct text content\n actualText = domElement.textContent?.trim() || '';\n }\n\n if (actualText !== expectedText) {\n mismatches.push({\n path: formatPath(path),\n type: 'text',\n expected: expectedText,\n actual: actualText,\n domPath: getDOMPath(domElement)\n });\n }\n return mismatches;\n }\n\n // Handle arrays\n if (Array.isArray(virtualNode)) {\n virtualNode.forEach((child, index) => {\n const domChild = getDOMChildAtIndex(domElement, index);\n if (domChild) {\n const childMismatches = detectMismatch(\n domChild,\n child,\n [...path, `[${index}]`]\n );\n mismatches.push(...childMismatches);\n } else {\n mismatches.push({\n path: formatPath([...path, `[${index}]`]),\n type: 'missing_element',\n expected: describeVNode(child),\n actual: null,\n domPath: `${getDOMPath(domElement)} > child[${index}]`\n });\n }\n });\n return mismatches;\n }\n\n // Handle element nodes\n if (typeof virtualNode !== 'object') {\n return mismatches;\n }\n\n const tagName = Object.keys(virtualNode)[0];\n const props = virtualNode[tagName] || {};\n\n // Check tag name\n const domTagName = domElement.tagName?.toLowerCase();\n if (domTagName !== tagName.toLowerCase()) {\n mismatches.push({\n path: formatPath(path),\n type: 'tagName',\n expected: tagName,\n actual: domTagName,\n domPath: getDOMPath(domElement)\n });\n // Can't continue comparing if tag is different\n return mismatches;\n }\n\n // Check critical attributes\n const attributeChecks = [\n { virtual: 'className', dom: 'class' },\n { virtual: 'id', dom: 'id' },\n { virtual: 'type', dom: 'type' },\n { virtual: 'value', dom: 'value' },\n { virtual: 'checked', dom: 'checked' },\n { virtual: 'disabled', dom: 'disabled' },\n { virtual: 'href', dom: 'href' },\n { virtual: 'src', dom: 'src' }\n ];\n\n attributeChecks.forEach(({ virtual, dom }) => {\n const expectedValue = props[virtual];\n if (expectedValue === undefined) return;\n\n const actualValue = domElement.getAttribute(dom);\n const expectedStr = String(expectedValue);\n\n // Handle boolean attributes\n if (typeof expectedValue === 'boolean') {\n const actualBool = actualValue !== null;\n if (expectedValue !== actualBool) {\n mismatches.push({\n path: formatPath([...path, `@${dom}`]),\n type: 'attribute',\n expected: expectedValue,\n actual: actualBool,\n domPath: getDOMPath(domElement)\n });\n }\n return;\n }\n\n if (expectedStr !== actualValue) {\n mismatches.push({\n path: formatPath([...path, `@${dom}`]),\n type: 'attribute',\n expected: expectedStr,\n actual: actualValue,\n domPath: getDOMPath(domElement)\n });\n }\n });\n\n // Recursively check children\n const vChildren = getVNodeChildren({ [tagName]: props });\n const dChildren = getSignificantDOMChildren(domElement);\n\n // Check for child count mismatch\n if (vChildren.length !== dChildren.length) {\n mismatches.push({\n path: formatPath([...path, 'children']),\n type: 'children_count',\n expected: vChildren.length,\n actual: dChildren.length,\n domPath: getDOMPath(domElement)\n });\n }\n\n // Compare each child\n const maxChildren = Math.max(vChildren.length, dChildren.length);\n for (let i = 0; i < maxChildren; i++) {\n const vChild = vChildren[i];\n const dChild = dChildren[i];\n\n if (vChild && dChild) {\n const childMismatches = detectMismatch(\n dChild,\n vChild,\n [...path, `children[${i}]`]\n );\n mismatches.push(...childMismatches);\n } else if (vChild && !dChild) {\n mismatches.push({\n path: formatPath([...path, `children[${i}]`]),\n type: 'missing_dom_child',\n expected: describeVNode(vChild),\n actual: null,\n domPath: getDOMPath(domElement)\n });\n } else if (!vChild && dChild) {\n mismatches.push({\n path: formatPath([...path, `children[${i}]`]),\n type: 'extra_dom_child',\n expected: null,\n actual: describeNode(dChild),\n domPath: getDOMPath(domElement)\n });\n }\n }\n\n return mismatches;\n}\n\n/**\n * Report mismatches to console with detailed information\n *\n * @param {Array} mismatches - Array of mismatch objects\n * @param {Object} options - Reporting options\n */\nexport function reportMismatches(mismatches, options = {}) {\n if (!mismatches || mismatches.length === 0) return;\n\n const { componentName = 'Unknown', strict = false } = options;\n\n const header = `[Coherent.js] Hydration mismatch detected in \"${componentName}\"!\\n` +\n `Found ${mismatches.length} difference(s) between server and client:\\n`;\n\n const details = mismatches.map((m, i) => {\n return `\\n${i + 1}. ${m.type} at ${m.path}\\n` +\n ` DOM path: ${m.domPath}\\n` +\n ` Expected: ${JSON.stringify(m.expected)}\\n` +\n ` Actual: ${JSON.stringify(m.actual)}`;\n }).join('');\n\n const advice = '\\n\\nThis usually happens when:\\n' +\n ' - Server renders with different data than client\\n' +\n ' - Using Date.now(), Math.random(), or browser-only APIs during render\\n' +\n ' - Component is not pure (has side effects during render)\\n';\n\n console.warn(header + details + advice);\n\n if (strict) {\n throw new Error(`Hydration failed: ${mismatches.length} mismatch(es) found. See console for details.`);\n }\n}\n\n/**\n * Get significant DOM children (elements and non-empty text nodes)\n * @private\n */\nfunction getSignificantDOMChildren(element) {\n if (!element || !element.childNodes) return [];\n\n return Array.from(element.childNodes).filter(node => {\n if (node.nodeType === 1) return true; // Element node\n if (node.nodeType === 3) { // Text node\n return node.textContent && node.textContent.trim().length > 0;\n }\n return false;\n });\n}\n\n/**\n * Get DOM child at specific index (considering only significant children)\n * @private\n */\nfunction getDOMChildAtIndex(parent, index) {\n const children = getSignificantDOMChildren(parent);\n return children[index] || null;\n}\n\n/**\n * Get a readable DOM path for debugging\n * @private\n */\nfunction getDOMPath(element) {\n if (!element || !element.tagName) return '(unknown)';\n\n const parts = [];\n let current = element;\n\n while (current && current.tagName) {\n let selector = current.tagName.toLowerCase();\n\n if (current.id) {\n selector += `#${current.id}`;\n } else if (current.className && typeof current.className === 'string') {\n const classes = current.className.trim().split(/\\s+/).slice(0, 2);\n if (classes.length > 0 && classes[0]) {\n selector += `.${classes.join('.')}`;\n }\n }\n\n parts.unshift(selector);\n current = current.parentElement;\n\n // Limit depth\n if (parts.length > 5) {\n parts.unshift('...');\n break;\n }\n }\n\n return parts.join(' > ');\n}\n\n/**\n * Describe a virtual node for error messages\n * @private\n */\nfunction describeVNode(vNode) {\n if (typeof vNode === 'string' || typeof vNode === 'number') {\n return `text: \"${String(vNode).substring(0, 50)}\"`;\n }\n if (Array.isArray(vNode)) {\n return `array[${vNode.length}]`;\n }\n if (typeof vNode === 'object' && vNode !== null) {\n const tagName = Object.keys(vNode)[0];\n return `<${tagName}>`;\n }\n return String(vNode);\n}\n\n/**\n * Describe a DOM node for error messages\n * @private\n */\nfunction describeNode(node) {\n if (!node) return '(null)';\n if (node.nodeType === 3) { // Text node\n return `text: \"${(node.textContent || '').substring(0, 50)}\"`;\n }\n if (node.nodeType === 1) { // Element\n return `<${node.tagName.toLowerCase()}>`;\n }\n return `node(type=${node.nodeType})`;\n}\n", "/**\n * Clean hydrate() API for Coherent.js\n *\n * Integrates event delegation, state serialization, and mismatch detection\n * into a simple function: hydrate(component, container, options)\n *\n * @module @coherent.js/client/hydrate\n */\n\nimport { eventDelegation, handlerRegistry } from './events/index.js';\nimport { extractState, detectMismatch, reportMismatches } from './hydration/index.js';\n\n/**\n * Hydrate a server-rendered component\n *\n * @param {Function} component - Component function that returns virtual DOM\n * @param {HTMLElement} container - DOM element containing server-rendered HTML\n * @param {Object} [options] - Hydration options\n * @param {Object} [options.initialState] - Initial state to override extracted state\n * @param {boolean} [options.detectMismatch=true] - Enable mismatch detection (dev mode)\n * @param {boolean} [options.strict=false] - Throw on mismatch instead of warning\n * @param {Function} [options.onMismatch] - Custom mismatch handler\n * @param {Object} [options.props] - Additional props to pass to component\n * @returns {Object} Control object with unmount(), rerender(), getState(), setState()\n */\nexport function hydrate(component, container, options = {}) {\n // Validate inputs\n if (typeof component !== 'function') {\n throw new Error(\n `hydrate() requires a component function, received: ${typeof component}`\n );\n }\n\n if (!container || typeof container.getAttribute !== 'function') {\n throw new Error(\n `hydrate() requires a valid DOM element as container, received: ${\n container === null ? 'null' : typeof container\n }`\n );\n }\n\n // Initialize event delegation (idempotent)\n eventDelegation.initialize();\n\n // Extract options with defaults\n const {\n initialState: providedState,\n // eslint-disable-next-line no-restricted-globals -- statically replaced by esbuild `define` at build time\n detectMismatch: shouldDetectMismatch = process.env.NODE_ENV !== 'production',\n strict = false,\n onMismatch,\n props: additionalProps = {},\n } = options;\n\n // Extract state from DOM data-state attribute, or use provided initial state\n let state = providedState ?? extractState(container) ?? {};\n\n // Store event listeners for cleanup\n const eventListeners = [];\n\n // Track registered handler IDs for cleanup\n const registeredHandlerIds = new Set();\n\n // Create component reference for handler registry\n const componentRef = {\n getState: () => state,\n setState: (newState) => {\n if (typeof newState === 'function') {\n state = { ...state, ...newState(state) };\n } else {\n state = { ...state, ...newState };\n }\n // Re-render on state change\n doRerender();\n },\n };\n\n // Generate virtual DOM from component\n const componentProps = { ...additionalProps, ...state };\n let virtualDOM = component(componentProps);\n\n // Detect mismatches if enabled\n if (shouldDetectMismatch) {\n const mismatches = detectMismatch(container, virtualDOM);\n\n if (mismatches.length > 0) {\n if (onMismatch) {\n onMismatch(mismatches);\n } else {\n reportMismatches(mismatches, {\n componentName: component.name || 'Anonymous',\n strict,\n });\n }\n }\n }\n\n // Walk virtual DOM and register event handlers\n registerEventHandlers(container, virtualDOM, componentRef, registeredHandlerIds);\n\n /**\n * Re-render the component with current state\n */\n function doRerender() {\n const newProps = { ...additionalProps, ...state };\n virtualDOM = component(newProps);\n\n // Update DOM with new virtual DOM\n // For now, we do a simple patch - just update text content and attributes\n // Full reconciliation would be in a separate module\n patchDOM(container, virtualDOM);\n\n // Re-register event handlers after DOM update\n registerEventHandlers(container, virtualDOM, componentRef, registeredHandlerIds);\n }\n\n /**\n * Unmount the component and clean up\n */\n function unmount() {\n // Remove registered event handlers\n for (const handlerId of registeredHandlerIds) {\n handlerRegistry.unregister(handlerId);\n }\n registeredHandlerIds.clear();\n\n // Remove direct event listeners\n for (const { element, event, handler, options } of eventListeners) {\n element.removeEventListener(event, handler, options);\n }\n eventListeners.length = 0;\n\n // Clear container's hydration marker\n container.removeAttribute('data-coherent-hydrated');\n }\n\n /**\n * Force re-render with optional new props\n * @param {Object} [newProps] - New props to merge\n */\n function rerender(newProps) {\n if (newProps) {\n Object.assign(additionalProps, newProps);\n }\n doRerender();\n }\n\n /**\n * Get current state\n * @returns {Object} Current state\n */\n function getState() {\n return { ...state };\n }\n\n /**\n * Set state and trigger re-render\n * @param {Object|Function} newState - New state or updater function\n */\n function setState(newState) {\n componentRef.setState(newState);\n }\n\n // Mark container as hydrated\n container.setAttribute('data-coherent-hydrated', 'true');\n\n // Return control object\n return {\n unmount,\n rerender,\n getState,\n setState,\n };\n}\n\n/**\n * Walk virtual DOM tree and register event handlers\n * @private\n */\nfunction registerEventHandlers(domElement, vNode, componentRef, handlerIds) {\n if (!vNode || typeof vNode !== 'object' || Array.isArray(vNode)) {\n return;\n }\n\n const tagName = Object.keys(vNode)[0];\n const props = vNode[tagName];\n\n if (!props || typeof props !== 'object') {\n return;\n }\n\n // Look for event handler props (on* functions)\n const eventProps = Object.keys(props).filter(\n (key) => key.startsWith('on') && typeof props[key] === 'function'\n );\n\n for (const eventProp of eventProps) {\n const eventType = eventProp.slice(2).toLowerCase(); // onClick -> click\n const handler = props[eventProp];\n\n // Generate unique handler ID\n const handlerId = `${tagName}-${eventType}-${Math.random().toString(36).slice(2, 9)}`;\n\n // Register handler\n handlerRegistry.register(handlerId, handler, componentRef);\n handlerIds.add(handlerId);\n\n // Set data attribute on DOM element for delegation\n const attrName = `data-coherent-${eventType}`;\n if (domElement.setAttribute) {\n domElement.setAttribute(attrName, handlerId);\n }\n }\n\n // Recursively process children\n const children = getVNodeChildren(props);\n const domChildren = getSignificantDOMChildren(domElement);\n\n children.forEach((child, index) => {\n if (child && typeof child === 'object' && !Array.isArray(child) && domChildren[index]) {\n registerEventHandlers(domChildren[index], child, componentRef, handlerIds);\n }\n });\n}\n\n/**\n * Simple DOM patching for re-renders\n * @private\n */\nfunction patchDOM(domElement, vNode) {\n if (!vNode || !domElement) {\n return;\n }\n\n // Handle text/number\n if (typeof vNode === 'string' || typeof vNode === 'number') {\n if (domElement.textContent !== String(vNode)) {\n domElement.textContent = String(vNode);\n }\n return;\n }\n\n // Handle arrays\n if (Array.isArray(vNode)) {\n return; // Array patching would need reconciliation\n }\n\n if (typeof vNode !== 'object') {\n return;\n }\n\n const tagName = Object.keys(vNode)[0];\n const props = vNode[tagName] || {};\n\n // Update attributes\n const attributeMap = {\n className: 'class',\n htmlFor: 'for',\n };\n\n for (const [key, value] of Object.entries(props)) {\n if (key === 'children' || key === 'text' || key.startsWith('on')) {\n continue;\n }\n\n const attrName = attributeMap[key] || key;\n\n if (value === true) {\n domElement.setAttribute(attrName, '');\n } else if (value === false || value === null || value === undefined) {\n domElement.removeAttribute(attrName);\n } else if (domElement.getAttribute(attrName) !== String(value)) {\n domElement.setAttribute(attrName, String(value));\n }\n }\n\n // Handle text content\n if (props.text !== undefined) {\n const textContent = String(props.text);\n if (domElement.textContent !== textContent) {\n domElement.textContent = textContent;\n }\n return;\n }\n\n // Recursively patch children\n const children = getVNodeChildren(props);\n const domChildren = getSignificantDOMChildren(domElement);\n\n children.forEach((child, index) => {\n if (domChildren[index]) {\n patchDOM(domChildren[index], child);\n }\n });\n}\n\n/**\n * Get children from virtual node props\n * @private\n */\nfunction getVNodeChildren(props) {\n if (!props) return [];\n if (props.children) {\n return Array.isArray(props.children) ? props.children : [props.children];\n }\n return [];\n}\n\n/**\n * Get significant DOM children (elements and non-whitespace text)\n * @private\n */\nfunction getSignificantDOMChildren(element) {\n if (!element || !element.childNodes) return [];\n\n return Array.from(element.childNodes).filter((node) => {\n if (node.nodeType === 1) return true; // Element\n if (node.nodeType === 3) {\n // Text node\n return node.textContent && node.textContent.trim().length > 0;\n }\n return false;\n });\n}\n\nexport default hydrate;\n", "/**\n * CleanupTracker - Tracks and automatically cleans up module resources during HMR\n *\n * Prevents memory leaks by tracking timers, intervals, event listeners, and fetch\n * requests created by modules. When a module is disposed during HMR, all its\n * tracked resources are automatically cleaned up.\n *\n * @module @coherent.js/client/hmr/cleanup-tracker\n */\n\n/**\n * Tracks module resources for cleanup during HMR\n */\nexport class CleanupTracker {\n constructor() {\n /**\n * Per-module resource tracking\n * @type {Map<string, { timers: Set<number>, intervals: Set<number>, listeners: Array, abortControllers: Set<AbortController> }>}\n */\n this.moduleResources = new Map();\n }\n\n /**\n * Create a tracked context for a module\n *\n * Returns an object with tracked versions of setTimeout, setInterval,\n * addEventListener, and fetch that automatically clean up on module disposal.\n *\n * @param {string} moduleId - Unique identifier for the module\n * @returns {Object} Tracked context with setTimeout, setInterval, etc.\n */\n createContext(moduleId) {\n const resources = {\n timers: new Set(),\n intervals: new Set(),\n listeners: [],\n abortControllers: new Set(),\n };\n\n this.moduleResources.set(moduleId, resources);\n\n const context = {\n /**\n * Tracked setTimeout - auto-removes from tracking on completion\n * @param {Function} callback - Function to execute\n * @param {number} delay - Delay in milliseconds\n * @param {...*} args - Additional arguments to pass to callback\n * @returns {number} Timer ID\n */\n setTimeout: (callback, delay, ...args) => {\n const id = setTimeout(\n (...a) => {\n resources.timers.delete(id);\n callback(...a);\n },\n delay,\n ...args\n );\n resources.timers.add(id);\n return id;\n },\n\n /**\n * Tracked setInterval - stores in intervals set until cleared\n * @param {Function} callback - Function to execute\n * @param {number} delay - Interval in milliseconds\n * @param {...*} args - Additional arguments to pass to callback\n * @returns {number} Interval ID\n */\n setInterval: (callback, delay, ...args) => {\n const id = setInterval(callback, delay, ...args);\n resources.intervals.add(id);\n return id;\n },\n\n /**\n * Clear a tracked timeout\n * @param {number} id - Timer ID to clear\n */\n clearTimeout: (id) => {\n resources.timers.delete(id);\n clearTimeout(id);\n },\n\n /**\n * Clear a tracked interval\n * @param {number} id - Interval ID to clear\n */\n clearInterval: (id) => {\n resources.intervals.delete(id);\n clearInterval(id);\n },\n\n /**\n * Tracked addEventListener - stores listener info for removal on cleanup\n * @param {EventTarget} target - Element or object to attach listener to\n * @param {string} event - Event type\n * @param {Function} handler - Event handler function\n * @param {Object|boolean} [options] - Listener options\n */\n addEventListener: (target, event, handler, options) => {\n target.addEventListener(event, handler, options);\n resources.listeners.push({ target, event, handler, options });\n },\n\n /**\n * Create a tracked AbortController\n * @returns {AbortController} Tracked AbortController\n */\n createAbortController: () => {\n const controller = new AbortController();\n resources.abortControllers.add(controller);\n return controller;\n },\n\n /**\n * Tracked fetch - creates AbortController automatically, cleans up on completion\n * @param {string|URL} url - URL to fetch\n * @param {Object} [options] - Fetch options\n * @returns {Promise<Response>} Fetch promise\n */\n fetch: (url, options = {}) => {\n const controller = new AbortController();\n resources.abortControllers.add(controller);\n\n // Merge signals if one was provided\n const mergedOptions = {\n ...options,\n signal: controller.signal,\n };\n\n return fetch(url, mergedOptions).finally(() => {\n resources.abortControllers.delete(controller);\n });\n },\n };\n\n return context;\n }\n\n /**\n * Cleanup all resources for a module\n *\n * Called during HMR module disposal. Clears all timers, intervals,\n * removes all event listeners, and aborts all pending fetch requests.\n *\n * @param {string} moduleId - Module identifier to clean up\n */\n cleanup(moduleId) {\n const resources = this.moduleResources.get(moduleId);\n if (!resources) return;\n\n // Clear all timers\n for (const id of resources.timers) {\n clearTimeout(id);\n }\n resources.timers.clear();\n\n // Clear all intervals\n for (const id of resources.intervals) {\n clearInterval(id);\n }\n resources.intervals.clear();\n\n // Remove all event listeners\n for (const { target, event, handler, options } of resources.listeners) {\n try {\n target.removeEventListener(event, handler, options);\n } catch {\n // Target may no longer exist\n }\n }\n resources.listeners.length = 0;\n\n // Abort all pending fetches\n for (const controller of resources.abortControllers) {\n try {\n controller.abort();\n } catch {\n // Ignore abort errors\n }\n }\n resources.abortControllers.clear();\n\n this.moduleResources.delete(moduleId);\n }\n\n /**\n * Check for potential resource leaks (for development mode)\n *\n * Logs warnings if resources weren't cleaned up before module disposal.\n * Call this before cleanup() to detect potential leaks.\n *\n * @param {string} moduleId - Module identifier to check\n */\n checkForLeaks(moduleId) {\n const resources = this.moduleResources.get(moduleId);\n if (!resources) return;\n\n const warnings = [];\n\n if (resources.timers.size > 0) {\n warnings.push(`${resources.timers.size} timer(s) not cleaned up`);\n }\n if (resources.intervals.size > 0) {\n warnings.push(`${resources.intervals.size} interval(s) not cleaned up`);\n }\n if (resources.listeners.length > 0) {\n warnings.push(`${resources.listeners.length} listener(s) not cleaned up`);\n }\n if (resources.abortControllers.size > 0) {\n warnings.push(\n `${resources.abortControllers.size} pending fetch(es) not aborted`\n );\n }\n\n if (warnings.length > 0) {\n console.warn(`[HMR] Potential leak in module ${moduleId}: ${warnings.join(', ')}`);\n }\n }\n\n /**\n * Check if a module has tracked resources\n * @param {string} moduleId - Module identifier\n * @returns {boolean} True if module has resources\n */\n hasResources(moduleId) {\n return this.moduleResources.has(moduleId);\n }\n\n /**\n * Get resource counts for a module (for testing/debugging)\n * @param {string} moduleId - Module identifier\n * @returns {Object|null} Resource counts or null if module not tracked\n */\n getResourceCounts(moduleId) {\n const resources = this.moduleResources.get(moduleId);\n if (!resources) return null;\n\n return {\n timers: resources.timers.size,\n intervals: resources.intervals.size,\n listeners: resources.listeners.length,\n abortControllers: resources.abortControllers.size,\n };\n }\n}\n\n/**\n * Singleton cleanup tracker instance\n * @type {CleanupTracker}\n */\nexport const cleanupTracker = new CleanupTracker();\n", "/**\n * StateCapturer - Captures and restores form input state and scroll positions during HMR\n *\n * Preserves user input and scroll positions across hot module replacement updates,\n * providing a seamless development experience. Only restores scroll position if\n * the page layout hasn't changed significantly.\n *\n * @module @coherent.js/client/hmr/state-capturer\n */\n\n/**\n * Captures and restores form/scroll state during HMR\n */\nexport class StateCapturer {\n constructor() {\n /**\n * Captured form input states\n * @type {Map<string, { value: string, type: string, selectionStart?: number, selectionEnd?: number, checked?: boolean }>}\n */\n this.capturedInputs = new Map();\n\n /**\n * Captured scroll positions\n * @type {Map<string, { top: number, left: number }>}\n */\n this.scrollPositions = new Map();\n\n /**\n * Layout snapshot for change detection\n * @type {Object|null}\n */\n this.layoutSnapshot = null;\n }\n\n /**\n * Generate a stable key for an input element\n *\n * Uses multiple factors to identify inputs across HMR updates:\n * 1. ID (most stable)\n * 2. Name + type\n * 3. Form context\n * 4. DOM path (fallback)\n *\n * @param {HTMLInputElement|HTMLTextAreaElement|HTMLSelectElement} input - Input element\n * @returns {string} Stable key for the input\n */\n getInputKey(input) {\n const parts = [];\n\n // ID is most stable\n if (input.id) {\n parts.push(`#${input.id}`);\n return parts.join(':');\n }\n\n // Name + type combination\n if (input.name) {\n parts.push(`[name=\"${input.name}\"]`);\n }\n\n if (input.type) {\n parts.push(`[type=\"${input.type}\"]`);\n }\n\n // Form context if available\n if (input.form?.id) {\n parts.push(`form#${input.form.id}`);\n }\n\n // Fallback: DOM path\n if (parts.length === 0) {\n parts.push(this.getElementPath(input));\n }\n\n return parts.join(':');\n }\n\n /**\n * Build a CSS-like path for an element\n *\n * @param {HTMLElement} element - Element to build path for\n * @returns {string} CSS-like path (e.g., \"form > div:nth-of-type(2) > input\")\n */\n getElementPath(element) {\n const path = [];\n let current = element;\n\n while (current && current !== document.body && path.length < 10) {\n let selector = current.tagName.toLowerCase();\n\n // Add class names (limited to avoid overly long selectors)\n if (current.className && typeof current.className === 'string') {\n const classes = current.className.trim().split(/\\s+/).slice(0, 2);\n if (classes.length > 0 && classes[0]) {\n selector += `.${classes.join('.')}`;\n }\n }\n\n // Add nth-of-type for disambiguation\n if (current.parentElement) {\n const siblings = current.parentElement.querySelectorAll(\n `:scope > ${current.tagName.toLowerCase()}`\n );\n if (siblings.length > 1) {\n const index = Array.from(siblings).indexOf(current);\n selector += `:nth-of-type(${index + 1})`;\n }\n }\n\n path.unshift(selector);\n current = current.parentElement;\n }\n\n return path.join(' > ');\n }\n\n /**\n * Capture all form input states\n *\n * Iterates through all input, textarea, and select elements,\n * capturing their values, selection state, and checked state.\n *\n * @returns {Map<string, Object>} Map of input keys to their captured state\n */\n captureFormState() {\n this.capturedInputs.clear();\n\n const inputs = document.querySelectorAll('input, textarea, select');\n\n for (const input of inputs) {\n const key = this.getInputKey(input);\n const state = {\n value: input.value,\n type: input.type || input.tagName.toLowerCase(),\n };\n\n // Capture selection for text-like inputs\n if (\n typeof input.selectionStart === 'number' &&\n (input.type === 'text' ||\n input.type === 'search' ||\n input.type === 'url' ||\n input.type === 'tel' ||\n input.type === 'password' ||\n input.tagName.toLowerCase() === 'textarea')\n ) {\n state.selectionStart = input.selectionStart;\n state.selectionEnd = input.selectionEnd;\n }\n\n // Capture checked state for checkboxes/radios\n if (input.type === 'checkbox' || input.type === 'radio') {\n state.checked = input.checked;\n }\n\n this.capturedInputs.set(key, state);\n }\n\n return this.capturedInputs;\n }\n\n /**\n * Restore form input states after HMR update\n *\n * Finds inputs by their captured keys and restores their values,\n * only if the input type matches (to avoid corrupting data).\n */\n restoreFormState() {\n for (const [key, state] of this.capturedInputs) {\n const inputs = this.findInputsByKey(key);\n\n for (const input of inputs) {\n // Only restore if type matches\n const currentType = input.type || input.tagName.toLowerCase();\n if (currentType !== state.type) {\n continue;\n }\n\n // Restore checkbox/radio checked state\n if (state.checked !== undefined) {\n input.checked = state.checked;\n continue;\n }\n\n // Restore value\n input.value = state.value;\n\n // Restore selection if applicable and input is not focused\n if (\n state.selectionStart !== undefined &&\n document.activeElement !== input\n ) {\n try {\n input.setSelectionRange(state.selectionStart, state.selectionEnd);\n } catch {\n // Some input types don't support setSelectionRange\n }\n }\n }\n }\n }\n\n /**\n * Find inputs matching a captured key\n *\n * @param {string} key - Captured input key\n * @returns {HTMLElement[]} Array of matching input elements\n */\n findInputsByKey(key) {\n // ID-based key\n if (key.startsWith('#')) {\n const id = key.slice(1);\n const el = document.getElementById(id);\n return el ? [el] : [];\n }\n\n // Name-based key\n const nameMatch = key.match(/\\[name=\"([^\"]+)\"\\]/);\n if (nameMatch) {\n const name = nameMatch[1];\n const typeMatch = key.match(/\\[type=\"([^\"]+)\"\\]/);\n const type = typeMatch ? typeMatch[1] : null;\n\n let selector = `[name=\"${name}\"]`;\n if (type) {\n selector += `[type=\"${type}\"]`;\n }\n\n return Array.from(document.querySelectorAll(selector));\n }\n\n // Path-based key - try to query directly\n try {\n const el = document.querySelector(key);\n return el ? [el] : [];\n } catch {\n return [];\n }\n }\n\n /**\n * Capture scroll positions for window and scrollable containers\n *\n * Captures scroll positions for:\n * - Window (scrollX/scrollY)\n * - Elements with [data-coherent-scroll-preserve] attribute\n * - Elements with overflow that have actual scrolling\n */\n captureScrollPositions() {\n this.scrollPositions.clear();\n\n // Window scroll\n this.scrollPositions.set('window', {\n top: window.scrollY,\n left: window.scrollX,\n });\n\n // Find scrollable containers with explicit marker\n const markedScrollables = document.querySelectorAll(\n '[data-coherent-scroll-preserve]'\n );\n for (const el of markedScrollables) {\n const key = this.getScrollableKey(el);\n this.scrollPositions.set(key, {\n top: el.scrollTop,\n left: el.scrollLeft,\n });\n }\n\n // Find elements with overflow that have actual scroll content\n const overflowElements = document.querySelectorAll(\n '[style*=\"overflow\"], [class]'\n );\n for (const el of overflowElements) {\n const style = window.getComputedStyle(el);\n const hasOverflow =\n style.overflow === 'auto' ||\n style.overflow === 'scroll' ||\n style.overflowY === 'auto' ||\n style.overflowY === 'scroll' ||\n style.overflowX === 'auto' ||\n style.overflowX === 'scroll';\n\n if (\n hasOverflow &&\n (el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth)\n ) {\n const key = this.getScrollableKey(el);\n if (!this.scrollPositions.has(key)) {\n this.scrollPositions.set(key, {\n top: el.scrollTop,\n left: el.scrollLeft,\n });\n }\n }\n }\n\n return this.scrollPositions;\n }\n\n /**\n * Generate a stable key for a scrollable element\n *\n * @param {HTMLElement} el - Scrollable element\n * @returns {string} Key for the element\n */\n getScrollableKey(el) {\n if (el.id) {\n return `#${el.id}`;\n }\n\n const component = el.getAttribute('data-coherent-component');\n if (component) {\n return `[data-coherent-component=\"${component}\"]`;\n }\n\n return this.getElementPath(el);\n }\n\n /**\n * Capture layout snapshot for change detection\n *\n * Captures body dimensions and positions of anchor elements\n * (elements with data-coherent-component attribute).\n */\n captureLayout() {\n this.layoutSnapshot = {\n bodyHeight: document.body.scrollHeight,\n bodyWidth: document.body.scrollWidth,\n anchors: new Map(),\n };\n\n // Capture positions of component elements as anchors\n const components = document.querySelectorAll('[data-coherent-component]');\n for (const el of components) {\n const rect = el.getBoundingClientRect();\n const key = this.getScrollableKey(el);\n this.layoutSnapshot.anchors.set(key, {\n top: rect.top,\n left: rect.left,\n width: rect.width,\n height: rect.height,\n });\n }\n }\n\n /**\n * Check if layout changed significantly (>50px shift)\n *\n * Returns true if:\n * - Body dimensions changed by more than 50px\n * - Any anchor element position shifted by more than 50px\n *\n * @returns {boolean} True if layout changed significantly\n */\n layoutChangedSignificantly() {\n if (!this.layoutSnapshot) {\n return false;\n }\n\n const THRESHOLD = 50; // pixels\n\n // Check body dimensions\n const heightDiff = Math.abs(\n document.body.scrollHeight - this.layoutSnapshot.bodyHeight\n );\n const widthDiff = Math.abs(\n document.body.scrollWidth - this.layoutSnapshot.bodyWidth\n );\n\n if (heightDiff > THRESHOLD || widthDiff > THRESHOLD) {\n return true;\n }\n\n // Check anchor element positions\n for (const [key, oldRect] of this.layoutSnapshot.anchors) {\n const el = this.findElementByKey(key);\n if (!el) {\n continue;\n }\n\n const newRect = el.getBoundingClientRect();\n const topDiff = Math.abs(newRect.top - oldRect.top);\n const leftDiff = Math.abs(newRect.left - oldRect.left);\n\n if (topDiff > THRESHOLD || leftDiff > THRESHOLD) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Find an element by its scrollable key\n *\n * @param {string} key - Element key\n * @returns {HTMLElement|null} Found element or null\n */\n findElementByKey(key) {\n if (key === 'window') {\n return null;\n }\n\n if (key.startsWith('#')) {\n return document.getElementById(key.slice(1));\n }\n\n try {\n return document.querySelector(key);\n } catch {\n return null;\n }\n }\n\n /**\n * Restore scroll positions if layout hasn't changed significantly\n *\n * Logs a message if scroll restoration is skipped due to layout changes.\n */\n restoreScrollPositions() {\n if (this.layoutChangedSignificantly()) {\n console.log('[HMR] Layout changed significantly, not restoring scroll');\n return;\n }\n\n // Restore window scroll\n const windowPos = this.scrollPositions.get('window');\n if (windowPos) {\n window.scrollTo(windowPos.left, windowPos.top);\n }\n\n // Restore container scrolls\n for (const [key, pos] of this.scrollPositions) {\n if (key === 'window') {\n continue;\n }\n\n const el = this.findElementByKey(key);\n if (el) {\n el.scrollTop = pos.top;\n el.scrollLeft = pos.left;\n }\n }\n }\n\n /**\n * Capture all state (form + scroll + layout)\n *\n * Convenience method that calls all capture methods.\n */\n captureAll() {\n this.captureFormState();\n this.captureScrollPositions();\n this.captureLayout();\n }\n\n /**\n * Restore all state (form + scroll)\n *\n * Convenience method that calls all restore methods.\n */\n restoreAll() {\n this.restoreFormState();\n this.restoreScrollPositions();\n }\n\n /**\n * Clear all captured state\n */\n clear() {\n this.capturedInputs.clear();\n this.scrollPositions.clear();\n this.layoutSnapshot = null;\n }\n}\n\n/**\n * Singleton state capturer instance\n * @type {StateCapturer}\n */\nexport const stateCapturer = new StateCapturer();\n", "/**\n * HMR Error Overlay\n *\n * Displays error information in a full-screen overlay with Shadow DOM isolation.\n * Provides click-to-open editor support and keyboard/click dismissal.\n *\n * @module @coherent.js/client/hmr/overlay\n */\n\n/**\n * Escape HTML special characters to prevent XSS.\n * @param {string} str - String to escape\n * @returns {string} Escaped string\n */\nexport function escapeHtml(str) {\n return String(str)\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\n}\n\n/**\n * Format code frame with line numbers and highlight.\n * @param {string} frame - Code frame content\n * @param {number} highlightLine - Line number to highlight (1-based)\n * @param {number} [startLine=1] - Starting line number for the frame\n * @returns {string} Formatted HTML string\n */\nexport function formatCodeFrame(frame, highlightLine, startLine = 1) {\n if (!frame) return '';\n\n const lines = frame.split('\\n');\n return lines.map((content, i) => {\n const lineNum = startLine + i;\n const isHighlight = lineNum === highlightLine;\n return `<div class=\"line${isHighlight ? ' highlight' : ''}\">\n <span class=\"line-number\">${lineNum}</span>\n <span class=\"line-content\">${escapeHtml(content)}</span>\n </div>`;\n }).join('');\n}\n\n/**\n * Editor URL scheme map for click-to-open functionality.\n */\nconst EDITOR_URLS = {\n vscode: (file, line) => `vscode://file/${file}:${line}`,\n cursor: (file, line) => `cursor://file/${file}:${line}`,\n 'vscode-insiders': (file, line) => `vscode-insiders://file/${file}:${line}`,\n atom: (file, line) => `atom://core/open/file?filename=${file}&line=${line}`,\n sublime: (file, line) => `subl://open?url=file://${file}&line=${line}`,\n webstorm: (file, line) => `webstorm://open?file=${file}&line=${line}`,\n idea: (file, line) => `idea://open?file=${file}&line=${line}`\n};\n\n/**\n * CSS styles for the error overlay (Dracula-inspired color scheme).\n */\nconst OVERLAY_STYLES = `\n :host {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 99999;\n --bg: #181818;\n --text: #f8f8f2;\n --red: #ff5555;\n --yellow: #f1fa8c;\n --purple: #bd93f9;\n --cyan: #8be9fd;\n --code-bg: #282a36;\n --line-num: #6272a4;\n }\n .backdrop {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba(0, 0, 0, 0.66);\n }\n .container {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: min(800px, 90vw);\n max-height: 90vh;\n overflow: auto;\n background: var(--bg);\n border-radius: 8px;\n box-shadow: 0 20px 40px rgba(0, 0, 0, 0.5);\n font-family: 'SF Mono', Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace;\n }\n .header {\n padding: 16px 20px;\n background: var(--red);\n color: white;\n display: flex;\n justify-content: space-between;\n align-items: center;\n border-radius: 8px 8px 0 0;\n }\n .title {\n font-weight: bold;\n font-size: 16px;\n }\n .close-btn {\n background: none;\n border: none;\n color: white;\n font-size: 24px;\n cursor: pointer;\n padding: 0 8px;\n line-height: 1;\n }\n .close-btn:hover {\n opacity: 0.8;\n }\n .content {\n padding: 20px;\n color: var(--text);\n }\n .message {\n font-size: 18px;\n color: var(--red);\n margin-bottom: 20px;\n word-break: break-word;\n }\n .file {\n color: var(--cyan);\n margin-bottom: 16px;\n cursor: pointer;\n text-decoration: underline;\n }\n .file:hover {\n color: var(--purple);\n }\n .code-frame {\n background: var(--code-bg);\n padding: 16px;\n border-radius: 4px;\n overflow-x: auto;\n font-size: 14px;\n line-height: 1.5;\n margin-bottom: 16px;\n }\n .line {\n display: flex;\n }\n .line-number {\n width: 50px;\n color: var(--line-num);\n text-align: right;\n padding-right: 16px;\n user-select: none;\n flex-shrink: 0;\n }\n .line-content {\n flex: 1;\n white-space: pre;\n }\n .line.highlight {\n background: rgba(255, 85, 85, 0.2);\n }\n .line.highlight .line-content {\n color: var(--red);\n }\n .stack {\n margin-top: 20px;\n font-size: 12px;\n color: var(--line-num);\n white-space: pre-wrap;\n max-height: 200px;\n overflow-y: auto;\n }\n .tip {\n margin-top: 16px;\n padding: 12px;\n background: rgba(189, 147, 249, 0.1);\n border-left: 3px solid var(--purple);\n font-size: 13px;\n color: var(--text);\n }\n .tip strong {\n color: var(--purple);\n }\n`;\n\n/**\n * Error overlay class for HMR error display.\n * Uses Shadow DOM for complete style isolation.\n */\nexport class ErrorOverlay {\n constructor() {\n /** @type {{ host: HTMLElement, shadow: ShadowRoot } | null} */\n this.overlay = null;\n /** @type {string} */\n this.editor = this._getStoredEditor();\n /** @type {((e: KeyboardEvent) => void) | null} */\n this.escapeHandler = null;\n }\n\n /**\n * Get stored editor preference from localStorage.\n * @returns {string} Editor name\n * @private\n */\n _getStoredEditor() {\n try {\n return localStorage.getItem('coherent-editor') || 'vscode';\n } catch {\n return 'vscode';\n }\n }\n\n /**\n * Create the overlay element with Shadow DOM.\n * @returns {{ host: HTMLElement, shadow: ShadowRoot }} Overlay elements\n */\n createOverlay() {\n if (this.overlay) return this.overlay;\n\n const host = document.createElement('div');\n host.id = 'coherent-error-overlay';\n const shadow = host.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = OVERLAY_STYLES;\n shadow.appendChild(style);\n\n this.overlay = { host, shadow };\n return this.overlay;\n }\n\n /**\n * Show the error overlay with error details.\n * @param {Object} error - Error details\n * @param {string} error.message - Error message\n * @param {string} [error.file] - File path\n * @param {number} [error.line] - Line number\n * @param {number} [error.column] - Column number\n * @param {string} [error.frame] - Code frame with context\n * @param {string} [error.stack] - Stack trace\n */\n show(error) {\n const { host, shadow } = this.createOverlay();\n\n // Clear previous content (but keep styles)\n const existingWrapper = shadow.querySelector('.wrapper');\n if (existingWrapper) existingWrapper.remove();\n\n // Calculate start line for code frame (center on error line)\n const frameLines = error.frame ? error.frame.split('\\n').length : 0;\n const startLine = error.line ? Math.max(1, error.line - Math.floor(frameLines / 2)) : 1;\n\n const wrapper = document.createElement('div');\n wrapper.className = 'wrapper';\n wrapper.innerHTML = `\n <div class=\"backdrop\"></div>\n <div class=\"container\">\n <div class=\"header\">\n <span class=\"title\">HMR Error</span>\n <button class=\"close-btn\" title=\"Close (Escape)\">&times;</button>\n </div>\n <div class=\"content\">\n <div class=\"message\">${escapeHtml(error.message || 'Unknown error')}</div>\n ${error.file ? `\n <div class=\"file\" data-file=\"${escapeHtml(error.file)}\" data-line=\"${error.line || 1}\">\n ${escapeHtml(error.file)}${error.line ? `:${error.line}` : ''}${error.column ? `:${error.column}` : ''}\n </div>\n ` : ''}\n ${error.frame ? `\n <div class=\"code-frame\">${formatCodeFrame(error.frame, error.line, startLine)}</div>\n ` : ''}\n ${error.stack ? `\n <div class=\"stack\">${escapeHtml(error.stack)}</div>\n ` : ''}\n <div class=\"tip\">\n Press <strong>Escape</strong> or click the X to dismiss.\n ${error.file ? ` Click the file path to open in ${this.editor}.` : ''}\n </div>\n </div>\n </div>\n `;\n\n shadow.appendChild(wrapper);\n\n // Event handlers\n const closeBtn = wrapper.querySelector('.close-btn');\n const backdrop = wrapper.querySelector('.backdrop');\n const fileLink = wrapper.querySelector('.file');\n\n closeBtn?.addEventListener('click', () => this.hide());\n backdrop?.addEventListener('click', () => this.hide());\n fileLink?.addEventListener('click', (e) => {\n const target = e.target;\n const file = target.dataset.file;\n const line = parseInt(target.dataset.line, 10) || 1;\n this.openInEditor(file, line);\n });\n\n // Escape key handler\n this.escapeHandler = (e) => {\n if (e.key === 'Escape') this.hide();\n };\n document.addEventListener('keydown', this.escapeHandler);\n\n // Add to DOM if not already\n if (!host.parentNode) {\n document.body.appendChild(host);\n }\n }\n\n /**\n * Hide and remove the error overlay.\n */\n hide() {\n if (this.overlay?.host.parentNode) {\n this.overlay.host.parentNode.removeChild(this.overlay.host);\n }\n if (this.escapeHandler) {\n document.removeEventListener('keydown', this.escapeHandler);\n this.escapeHandler = null;\n }\n // Reset overlay reference so it can be recreated\n this.overlay = null;\n }\n\n /**\n * Open file in configured editor.\n * @param {string} file - File path\n * @param {number} [line=1] - Line number\n */\n openInEditor(file, line = 1) {\n const urlGenerator = EDITOR_URLS[this.editor] || EDITOR_URLS.vscode;\n const url = urlGenerator(file, line);\n window.open(url, '_self');\n }\n\n /**\n * Set preferred editor and store in localStorage.\n * @param {string} editor - Editor name (vscode, cursor, vscode-insiders, atom, sublime, webstorm, idea)\n */\n setEditor(editor) {\n this.editor = editor;\n try {\n localStorage.setItem('coherent-editor', editor);\n } catch {\n // Ignore localStorage errors\n }\n }\n}\n\n/**\n * Singleton instance of ErrorOverlay.\n */\nexport const errorOverlay = new ErrorOverlay();\n", "/**\n * HMR Connection Status Indicator\n *\n * Displays a small colored dot in the bottom-right corner indicating\n * WebSocket connection status. Unobtrusive design per CONTEXT.md decision.\n *\n * @module @coherent.js/client/hmr/indicator\n */\n\n/**\n * Status color mapping for connection states.\n */\nconst STATUS_COLORS = {\n connected: '#10b981', // Green\n disconnected: '#ef4444', // Red\n reconnecting: '#f59e0b', // Yellow/amber\n error: '#ef4444' // Red\n};\n\n/**\n * Status title mapping for accessibility.\n */\nconst STATUS_TITLES = {\n connected: 'HMR: Connected',\n disconnected: 'HMR: Disconnected',\n reconnecting: 'HMR: Reconnecting...',\n error: 'HMR: Error'\n};\n\n/**\n * Default/initial color before status is set.\n */\nconst DEFAULT_COLOR = '#666';\n\n/**\n * Connection status indicator class.\n * Shows an 8px colored dot in the bottom-right corner of the viewport.\n */\nexport class ConnectionIndicator {\n constructor() {\n /** @type {HTMLElement | null} */\n this.indicator = null;\n }\n\n /**\n * Create the indicator element if it doesn't exist.\n * Uses inline styles to avoid external CSS dependencies.\n */\n create() {\n if (this.indicator) return;\n\n const el = document.createElement('div');\n el.id = 'coherent-hmr-indicator';\n el.style.cssText = `\n position: fixed;\n bottom: 8px;\n right: 8px;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: ${DEFAULT_COLOR};\n z-index: 99998;\n pointer-events: none;\n transition: background 0.3s ease;\n `;\n el.title = 'HMR: Initializing';\n\n document.body.appendChild(el);\n this.indicator = el;\n }\n\n /**\n * Update the indicator status.\n * Creates the element if it doesn't exist (lazy initialization).\n *\n * @param {string} status - Status string: 'connected', 'disconnected', 'reconnecting', or 'error'\n */\n update(status) {\n if (!this.indicator) {\n this.create();\n }\n\n const color = STATUS_COLORS[status] || STATUS_COLORS.disconnected;\n const title = STATUS_TITLES[status] || 'HMR: Unknown';\n\n this.indicator.style.background = color;\n this.indicator.title = title;\n }\n\n /**\n * Remove the indicator from the DOM.\n */\n destroy() {\n if (this.indicator?.parentNode) {\n this.indicator.parentNode.removeChild(this.indicator);\n }\n this.indicator = null;\n }\n}\n\n/**\n * Singleton instance of ConnectionIndicator.\n */\nexport const connectionIndicator = new ConnectionIndicator();\n", "/**\n * ModuleTracker - Tracks module graph and HMR boundaries\n *\n * Provides a Vite-compatible hot context API for modules to declare\n * how they should be handled during HMR updates. Tracks accept/dispose\n * handlers and persistent data that survives updates.\n *\n * @module @coherent.js/client/hmr/module-tracker\n */\n\n/**\n * Tracks module HMR registrations and provides hot context API\n */\nexport class ModuleTracker {\n constructor() {\n /**\n * Module registrations map\n * @type {Map<string, { accept: Function|null, acceptDeps: { deps: string[], callback: Function }|null, dispose: Function|null, prune: Function|null, data: Object }>}\n */\n this.modules = new Map();\n\n /**\n * WebSocket reference for invalidation messages\n * @type {WebSocket|null}\n */\n this.socket = null;\n }\n\n /**\n * Set WebSocket reference for invalidation messages\n * @param {WebSocket|null} socket - WebSocket connection\n */\n setSocket(socket) {\n this.socket = socket;\n }\n\n /**\n * Create a hot context for a module (Vite-compatible API)\n *\n * Returns an object with:\n * - data: Persistent object that survives HMR updates\n * - accept(callback): Register self-update handler\n * - acceptDeps(deps, callback): Register dependency update handler\n * - dispose(callback): Register cleanup handler called before replacement\n * - prune(callback): Register handler for when module is removed\n * - invalidate(message): Signal that module cannot hot-update\n *\n * @param {string} moduleId - Unique identifier for the module\n * @returns {Object} Hot context object\n */\n createHotContext(moduleId) {\n // Get or create module data, preserving existing data object\n let moduleData = this.modules.get(moduleId);\n if (!moduleData) {\n moduleData = {\n accept: null,\n acceptDeps: null,\n dispose: null,\n prune: null,\n data: {},\n };\n this.modules.set(moduleId, moduleData);\n }\n\n const tracker = this;\n\n return {\n /**\n * Persistent data object that survives HMR updates.\n * Use this to preserve state across module replacements.\n */\n get data() {\n return moduleData.data;\n },\n\n /**\n * Accept self updates.\n * Called when this module is updated and can handle its own replacement.\n *\n * @param {Function} [callback] - Optional callback receiving the new module\n */\n accept(callback) {\n moduleData.accept = callback || (() => {});\n },\n\n /**\n * Accept dependency updates.\n * Called when one of the specified dependencies is updated.\n *\n * @param {string|string[]} deps - Dependency module ID(s)\n * @param {Function} callback - Callback receiving updated dependencies\n */\n acceptDeps(deps, callback) {\n const depsArray = Array.isArray(deps) ? deps : [deps];\n moduleData.acceptDeps = { deps: depsArray, callback };\n },\n\n /**\n * Register disposal callback.\n * Called before the module is replaced, receives the data object\n * to allow saving state for the next version.\n *\n * @param {Function} callback - Cleanup handler, receives data object\n */\n dispose(callback) {\n moduleData.dispose = callback;\n },\n\n /**\n * Register prune callback.\n * Called when the module is completely removed from the module graph.\n *\n * @param {Function} callback - Prune handler\n */\n prune(callback) {\n moduleData.prune = callback;\n },\n\n /**\n * Invalidate this module.\n * Signals that the module cannot be hot-updated and should propagate\n * the update to its importers.\n *\n * @param {string} [message] - Optional message explaining why\n */\n invalidate(message) {\n const WS_OPEN = typeof WebSocket !== 'undefined' ? WebSocket.OPEN : 1;\n if (tracker.socket?.readyState === WS_OPEN) {\n tracker.socket.send(JSON.stringify({\n type: 'invalidate',\n moduleId,\n message,\n }));\n }\n // Log for debugging\n console.log(`[HMR] Module ${moduleId} invalidated${message ? `: ${message}` : ''}`);\n },\n };\n }\n\n /**\n * Check if a module can be hot-updated\n *\n * Returns true if the module has registered an accept handler.\n *\n * @param {string} moduleId - Module identifier\n * @returns {boolean} True if module accepts HMR updates\n */\n canHotUpdate(moduleId) {\n const moduleData = this.modules.get(moduleId);\n return !!(moduleData?.accept || moduleData?.acceptDeps);\n }\n\n /**\n * Check if a module is an HMR boundary\n *\n * A module is considered a boundary if:\n * - It has an accept handler registered\n * - It exports __hmrBoundary = true\n * - It is associated with a data-coherent-component element\n *\n * @param {string} moduleId - Module identifier\n * @param {Object} [moduleExports] - Optional module exports to check for __hmrBoundary\n * @returns {boolean} True if module is an HMR boundary\n */\n isHmrBoundary(moduleId, moduleExports) {\n // Check for accept handler\n if (this.canHotUpdate(moduleId)) {\n return true;\n }\n\n // Check for explicit __hmrBoundary export\n if (moduleExports?.__hmrBoundary === true) {\n return true;\n }\n\n // Check for coherent component presence (by convention)\n // Extract component name from module path\n const componentName = this.extractComponentName(moduleId);\n if (componentName && typeof document !== 'undefined') {\n const hasComponent = document.querySelector(\n `[data-coherent-component=\"${componentName}\"]`\n );\n if (hasComponent) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Extract a potential component name from module path\n *\n * @param {string} moduleId - Module path\n * @returns {string|null} Component name or null\n * @private\n */\n extractComponentName(moduleId) {\n // Extract filename without extension\n const match = moduleId.match(/\\/([^/]+?)(?:\\.[^.]+)?$/);\n if (match) {\n return match[1];\n }\n return null;\n }\n\n /**\n * Execute dispose callback for a module\n *\n * Calls the registered dispose handler with the data object,\n * allowing the module to save state for the next version.\n *\n * @param {string} moduleId - Module identifier\n * @returns {Object|null} The data object (for passing to next version)\n */\n executeDispose(moduleId) {\n const moduleData = this.modules.get(moduleId);\n if (!moduleData) {\n return null;\n }\n\n // Call dispose handler with data object\n if (typeof moduleData.dispose === 'function') {\n try {\n moduleData.dispose(moduleData.data);\n } catch (err) {\n console.error(`[HMR] Error in dispose handler for ${moduleId}:`, err);\n }\n }\n\n return moduleData.data;\n }\n\n /**\n * Execute accept callback for a module\n *\n * Calls the registered accept handler with the new module.\n *\n * @param {string} moduleId - Module identifier\n * @param {Object} [newModule] - The newly imported module\n * @returns {boolean} True if accept handler was called\n */\n executeAccept(moduleId, newModule) {\n const moduleData = this.modules.get(moduleId);\n if (!moduleData?.accept) {\n return false;\n }\n\n try {\n moduleData.accept(newModule);\n return true;\n } catch (err) {\n console.error(`[HMR] Error in accept handler for ${moduleId}:`, err);\n return false;\n }\n }\n\n /**\n * Execute acceptDeps callback for a module\n *\n * Calls the registered acceptDeps handler with the updated dependencies.\n *\n * @param {string} moduleId - Module identifier\n * @param {Object} updatedDeps - Map of dependency moduleId -> new module\n * @returns {boolean} True if acceptDeps handler was called\n */\n executeAcceptDeps(moduleId, updatedDeps) {\n const moduleData = this.modules.get(moduleId);\n if (!moduleData?.acceptDeps) {\n return false;\n }\n\n try {\n const { deps, callback } = moduleData.acceptDeps;\n // Build array of updated modules in same order as deps\n const modules = deps.map((dep) => updatedDeps[dep]);\n callback(modules);\n return true;\n } catch (err) {\n console.error(`[HMR] Error in acceptDeps handler for ${moduleId}:`, err);\n return false;\n }\n }\n\n /**\n * Execute prune callback for a module\n *\n * Called when a module is removed from the module graph.\n *\n * @param {string} moduleId - Module identifier\n */\n executePrune(moduleId) {\n const moduleData = this.modules.get(moduleId);\n if (!moduleData?.prune) {\n return;\n }\n\n try {\n moduleData.prune();\n } catch (err) {\n console.error(`[HMR] Error in prune handler for ${moduleId}:`, err);\n }\n\n // Remove module from tracking\n this.modules.delete(moduleId);\n }\n\n /**\n * Check if module is registered\n *\n * @param {string} moduleId - Module identifier\n * @returns {boolean} True if module is registered\n */\n hasModule(moduleId) {\n return this.modules.has(moduleId);\n }\n\n /**\n * Get module data (for testing/debugging)\n *\n * @param {string} moduleId - Module identifier\n * @returns {Object|null} Module data or null\n */\n getModuleData(moduleId) {\n return this.modules.get(moduleId) || null;\n }\n\n /**\n * Clear all module registrations (for testing)\n */\n clear() {\n this.modules.clear();\n }\n}\n\n/**\n * Singleton module tracker instance\n * @type {ModuleTracker}\n */\nexport const moduleTracker = new ModuleTracker();\n\n/**\n * Convenience function to create a hot context for a module\n *\n * @param {string} moduleId - Module identifier\n * @returns {Object} Hot context object\n */\nexport function createHotContext(moduleId) {\n return moduleTracker.createHotContext(moduleId);\n}\n", "/**\n * HMRClient - Orchestrates WebSocket connection and HMR updates\n *\n * Integrates all HMR modules (cleanup tracker, state capturer, error overlay,\n * connection indicator) to provide seamless hot module replacement with\n * state preservation.\n *\n * @module @coherent.js/client/hmr/client\n */\n\nimport { cleanupTracker } from './cleanup-tracker.js';\nimport { stateCapturer } from './state-capturer.js';\nimport { errorOverlay } from './overlay.js';\nimport { connectionIndicator } from './indicator.js';\nimport { moduleTracker } from './module-tracker.js';\n\n/**\n * Parse error stack to extract file/line info\n *\n * @param {Error} error - Error object\n * @returns {{ file: string|null, line: number|null, column: number|null }} Parsed location\n */\nfunction parseErrorLocation(error) {\n const result = { file: null, line: null, column: null };\n\n if (!error.stack) {\n return result;\n }\n\n // Match common stack trace formats:\n // Chrome/Node: \"at Function (file.js:10:5)\"\n // Firefox: \"Function@file.js:10:5\"\n // Safari: \"file.js:10:5\"\n const patterns = [\n /at\\s+.*?\\((.+?):(\\d+):(\\d+)\\)/, // Chrome/Node with parens\n /at\\s+(.+?):(\\d+):(\\d+)/, // Chrome/Node without parens\n /@(.+?):(\\d+):(\\d+)/, // Firefox\n /^(.+?):(\\d+):(\\d+)/, // Safari\n ];\n\n const lines = error.stack.split('\\n');\n for (const line of lines) {\n for (const pattern of patterns) {\n const match = line.match(pattern);\n if (match) {\n result.file = match[1];\n result.line = parseInt(match[2], 10);\n result.column = parseInt(match[3], 10);\n return result;\n }\n }\n }\n\n return result;\n}\n\n/**\n * HMR Client class - manages WebSocket connection and update orchestration\n */\nexport class HMRClient {\n constructor() {\n /**\n * WebSocket connection\n * @type {WebSocket|null}\n */\n this.socket = null;\n\n /**\n * Connection state\n * @type {boolean}\n */\n this.connected = false;\n\n /**\n * Reconnection attempt counter\n * @type {number}\n */\n this.reconnectAttempts = 0;\n\n /**\n * Maximum reconnection attempts\n * @type {number}\n */\n this.maxReconnectAttempts = 10;\n\n /**\n * Base reconnection delay in ms\n * @type {number}\n */\n this.reconnectDelay = 1000;\n\n /**\n * Whether we've had a disconnect (for reload detection)\n * @type {boolean}\n */\n this.hadDisconnect = false;\n\n /**\n * Reconnect timeout ID\n * @type {number|null}\n */\n this.reconnectTimeout = null;\n\n /**\n * Initialization flag\n * @type {boolean}\n */\n this.initialized = false;\n }\n\n /**\n * Connect to the dev server WebSocket\n *\n * Establishes WebSocket connection with automatic reconnection using\n * exponential backoff with jitter.\n *\n * @returns {void}\n */\n connect() {\n if (typeof window === 'undefined') {\n return;\n }\n\n // Clear any pending reconnect\n if (this.reconnectTimeout !== null) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n }\n\n try {\n const protocol = location.protocol === 'https:' ? 'wss' : 'ws';\n const wsUrl = `${protocol}://${location.host}`;\n this.socket = new WebSocket(wsUrl);\n\n // Share socket with module tracker for invalidation messages\n moduleTracker.setSocket(this.socket);\n\n this.socket.addEventListener('open', () => {\n console.log('[HMR] Connected');\n this.connected = true;\n this.reconnectAttempts = 0;\n connectionIndicator.update('connected');\n\n // Send connection acknowledgment\n this.socket.send(JSON.stringify({ type: 'connected' }));\n\n // If reconnecting after disconnect, reload (server may have restarted)\n if (this.hadDisconnect) {\n console.log('[HMR] Reconnected after disconnect, reloading page');\n setTimeout(() => location.reload(), 200);\n return;\n }\n });\n\n this.socket.addEventListener('close', () => {\n this.connected = false;\n this.hadDisconnect = true;\n connectionIndicator.update('disconnected');\n moduleTracker.setSocket(null);\n this.scheduleReconnect();\n });\n\n this.socket.addEventListener('error', (event) => {\n console.warn('[HMR] WebSocket error:', event);\n connectionIndicator.update('error');\n try {\n this.socket.close();\n } catch {\n // Ignore close errors\n }\n });\n\n this.socket.addEventListener('message', (event) => {\n this.handleMessage(event);\n });\n } catch (error) {\n console.warn('[HMR] Failed to connect:', error);\n this.scheduleReconnect();\n }\n }\n\n /**\n * Schedule a reconnection attempt with exponential backoff\n *\n * @private\n */\n scheduleReconnect() {\n if (this.reconnectAttempts >= this.maxReconnectAttempts) {\n console.warn('[HMR] Max reconnection attempts reached');\n connectionIndicator.update('disconnected');\n return;\n }\n\n connectionIndicator.update('reconnecting');\n\n // Exponential backoff with jitter\n const delay = Math.min(\n this.reconnectDelay * Math.pow(2, this.reconnectAttempts) + Math.random() * 1000,\n 30000\n );\n this.reconnectAttempts++;\n\n console.log(`[HMR] Reconnecting in ${Math.round(delay)}ms (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts})`);\n\n this.reconnectTimeout = setTimeout(() => {\n this.reconnectTimeout = null;\n this.connect();\n }, delay);\n }\n\n /**\n * Handle incoming WebSocket message\n *\n * @param {MessageEvent} event - WebSocket message event\n * @private\n */\n handleMessage(event) {\n let data;\n try {\n data = JSON.parse(event.data);\n } catch {\n return;\n }\n\n console.log('[HMR] message', data.type, data.filePath || data.webPath || '');\n\n switch (data.type) {\n case 'connected':\n // Connection acknowledged\n break;\n\n case 'hmr-full-reload':\n case 'reload':\n console.warn('[HMR] Server requested full reload');\n location.reload();\n break;\n\n case 'hmr-component-update':\n case 'hmr-update':\n this.handleUpdate(data);\n break;\n\n case 'hmr-error':\n this.showError(data.error || data);\n break;\n\n case 'preview-update':\n // No-op: used by dashboard for live preview panes\n break;\n\n default:\n // Unknown message type, ignore\n break;\n }\n }\n\n /**\n * Handle module update\n *\n * Orchestrates the full HMR update cycle:\n * 1. Capture form/scroll state\n * 2. Execute dispose handlers\n * 3. Clean up module resources\n * 4. Re-import module\n * 5. Execute accept handlers\n * 6. Restore state\n *\n * @param {Object} data - Update message data\n * @param {string} [data.filePath] - File path that changed\n * @param {string} [data.webPath] - Web-accessible path\n * @param {string} [data.updateType] - Type of update (component, style, etc.)\n */\n async handleUpdate(data) {\n const filePath = data.webPath || data.filePath || '';\n const moduleId = filePath;\n\n try {\n // 1. Capture current state\n stateCapturer.captureAll();\n\n // 2. Execute dispose handler if registered\n if (moduleTracker.hasModule(moduleId)) {\n moduleTracker.executeDispose(moduleId);\n }\n\n // 3. Clean up module resources\n if (cleanupTracker.hasResources(moduleId)) {\n cleanupTracker.checkForLeaks(moduleId);\n cleanupTracker.cleanup(moduleId);\n }\n\n // 4. Re-import module with cache bust\n const importPath = filePath.startsWith('/') ? filePath : `/${filePath}`;\n const newModule = await import(`${importPath}?t=${Date.now()}`);\n\n // 5. Execute accept handler if module can hot-update\n const accepted = moduleTracker.canHotUpdate(moduleId);\n if (accepted) {\n moduleTracker.executeAccept(moduleId, newModule);\n } else {\n // Fall back to autoHydrate for components without explicit accept\n await this.fallbackHydrate();\n }\n\n // 6. Restore state\n stateCapturer.restoreAll();\n\n // 7. Hide error overlay (in case previous error is now fixed)\n errorOverlay.hide();\n\n // 8. Log success\n console.log(`[HMR] Updated: ${data.updateType || 'module'} ${filePath}`);\n } catch (error) {\n this.handleUpdateError(error, filePath);\n }\n }\n\n /**\n * Fall back to autoHydrate for non-HMR-aware modules\n *\n * @private\n */\n async fallbackHydrate() {\n try {\n // Try to import autoHydrate from the hydration module\n const { autoHydrate } = await import('../hydration.js');\n\n // If examples register a component registry on window, prefer targeted hydrate\n if (typeof window !== 'undefined' && window.componentRegistry) {\n autoHydrate(window.componentRegistry);\n } else {\n autoHydrate();\n }\n } catch {\n // autoHydrate not available or failed\n console.warn('[HMR] autoHydrate not available, component may need manual refresh');\n }\n }\n\n /**\n * Handle update error\n *\n * @param {Error} error - Error that occurred\n * @param {string} filePath - File that was being updated\n * @private\n */\n handleUpdateError(error, filePath) {\n console.error('[HMR] Update failed:', error);\n\n // Parse error location from stack\n const location = parseErrorLocation(error);\n\n // Build error details for overlay\n const errorDetails = {\n message: error.message || 'Unknown error during HMR update',\n file: location.file || filePath,\n line: location.line,\n column: location.column,\n stack: error.stack,\n };\n\n this.showError(errorDetails);\n }\n\n /**\n * Show error overlay\n *\n * @param {Object} error - Error details\n */\n showError(error) {\n errorOverlay.show(error);\n }\n\n /**\n * Hide error overlay\n */\n hideError() {\n errorOverlay.hide();\n }\n\n /**\n * Initialize HMR client\n *\n * Guards against double initialization and connects to dev server.\n *\n * @returns {void}\n */\n initialize() {\n if (typeof window === 'undefined') {\n return;\n }\n\n // Guard against double initialization\n if (window.__coherent_hmr_initialized || this.initialized) {\n return;\n }\n\n window.__coherent_hmr_initialized = true;\n this.initialized = true;\n\n this.connect();\n }\n\n /**\n * Disconnect and clean up\n *\n * @returns {void}\n */\n disconnect() {\n if (this.reconnectTimeout !== null) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n }\n\n if (this.socket) {\n try {\n this.socket.close();\n } catch {\n // Ignore close errors\n }\n this.socket = null;\n }\n\n this.connected = false;\n moduleTracker.setSocket(null);\n connectionIndicator.destroy();\n }\n\n /**\n * Check if client is connected\n *\n * @returns {boolean} True if connected\n */\n isConnected() {\n return this.connected;\n }\n}\n\n/**\n * Singleton HMR client instance\n * @type {HMRClient}\n */\nexport const hmrClient = new HMRClient();\n"],
5
+ "mappings": "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",
6
6
  "names": ["options", "getVNodeChildren", "getSignificantDOMChildren", "location"]
7
7
  }