why-hydration 0.1.5 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/react/console.ts","../src/react/capture.ts","../src/react/overlay.ts","../src/react/fiber.ts","../src/react/controller.ts","../src/react/inspector.tsx","../src/react/index.tsx"],"names":["React"],"mappings":"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","file":"chunk-3I6F4K4L.js","sourcesContent":["import { formatConsoleArgs, isHydrationMessage } from '../core/react-message';\nimport type { HydrationReport } from '../core/types';\nimport type { ReportSink } from '../core/report';\n\ntype ErrorFn = (...args: unknown[]) => void;\n\nexport function installConsoleInterceptor(\n onMessage: (message: string, args: readonly unknown[]) => void,\n): () => void {\n if (typeof console === 'undefined') return () => {};\n const original = console.error;\n const patched: ErrorFn = (...args: unknown[]) => {\n try {\n const message = formatConsoleArgs(args);\n if (message && isHydrationMessage(message)) {\n onMessage(message, args);\n }\n } catch {\n /* never let interception break normal logging */\n }\n // `apply` rather than a bound copy, so uninstalling can hand back the exact\n // function we replaced. Restoring a bound copy instead leaves a wrapper\n // behind on every install/uninstall cycle.\n original.apply(console, args);\n };\n console.error = patched as typeof console.error;\n\n return () => {\n if (console.error === (patched as typeof console.error)) {\n console.error = original as typeof console.error;\n }\n };\n}\n\nconst BADGE = 'color:#f59e0b;font-weight:bold';\nconst DIM = 'color:#9ca3af';\n\nexport function createConsoleReporter(): ReportSink {\n const sink: ReportSink = (report: HydrationReport) => {\n const title = `%c⬡ why-hydration%c ${report.cause.category} — ${report.node.path}`;\n console.group(title, BADGE, DIM);\n console.log('%cServer:%c', 'color:#fb7185', '', report.server ?? '(none)');\n console.log('%cClient:%c', 'color:#4ade80', '', report.client ?? '(none)');\n if (report.component) {\n console.log('%cComponent:%c', DIM, '', `<${report.component}>`);\n }\n if (report.location?.file) {\n const loc = report.location.line\n ? `${report.location.file}:${report.location.line}`\n : report.location.file;\n console.log('%cSource:%c', DIM, '', loc);\n }\n console.log('%cWhy:%c', DIM, '', report.cause.explanation);\n console.log('%cFix:%c', 'color:#86efac', '', report.cause.suggestion);\n if (report.cause.docsUrl) {\n console.log('%cDocs:%c', DIM, '', report.cause.docsUrl);\n }\n if (report.componentStack) {\n console.log('%cComponent stack:%c', DIM, '', report.componentStack);\n }\n console.groupEnd();\n };\n return sink;\n}\n","import { installConsoleInterceptor } from './console';\n\n/**\n * Module-scoped capture of React's hydration warnings.\n *\n * React logs a mismatch while it hydrates the tree *below* the inspector, which\n * is long before any effect runs — so interception has to begin during render.\n * Render is also the one place a component may be invoked more than once per\n * mount (Strict Mode renders twice, with fresh hook state each time), so the\n * state lives here rather than on an instance: a second call is then a genuine\n * no-op instead of a second interceptor that nobody owns and nobody removes.\n */\n\nexport type CaptureListener = (message: string) => void;\n\n// Hydration warnings are emitted once per page load; this only guards against\n// an app that logs matching messages in a loop. Past the cap a message is\n// dropped outright rather than recorded-but-forwarded — see `startCapture`.\nexport const MAX_CAPTURED = 50;\n\nconst captured = new Set<string>();\nconst listeners = new Set<CaptureListener>();\nlet uninstall: (() => void) | null = null;\n\n/** Start intercepting. Idempotent, and safe to call from render. */\nexport function startCapture(): void {\n if (uninstall || typeof window === 'undefined') return;\n uninstall = installConsoleInterceptor((message) => {\n // The cap gates the *notification*, not just the recording. Forwarding a\n // message we decline to record would defeat the dedup above at exactly the\n // point the cap exists to protect: every repeat past the cap would look\n // new, and each one costs a listener a full inspection pass.\n if (captured.has(message) || captured.size >= MAX_CAPTURED) return;\n captured.add(message);\n for (const listener of [...listeners]) listener(message);\n });\n}\n\n/**\n * Subscribe to hydration messages. Whatever was captured before subscribing is\n * replayed immediately, so a listener attached after hydration — or re-attached\n * across a Strict Mode stop/start cycle — still sees what React logged.\n */\nexport function subscribeCapture(listener: CaptureListener): () => void {\n startCapture();\n listeners.add(listener);\n for (const message of [...captured]) listener(message);\n\n return () => {\n if (!listeners.delete(listener)) return;\n // The backlog outlives the last subscriber on purpose: hydration happens\n // once per page, so a remounted inspector still needs those messages.\n // Only the console patch is handed back. The live set is the count — a\n // separate counter would drift the moment one listener subscribed twice\n // (`Set.add` dedupes, a counter does not) and strand the patch forever.\n if (listeners.size === 0 && uninstall) {\n uninstall();\n uninstall = null;\n }\n };\n}\n\n/** Drop the interceptor and the recorded backlog (tests, hot reload). */\nexport function resetCapture(): void {\n uninstall?.();\n uninstall = null;\n listeners.clear();\n captured.clear();\n}\n","import type { HydrationReport } from '../core/types';\n\nexport interface OverlayOptions {\n position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';\n}\n\nexport interface OverlayHandle {\n push: (report: HydrationReport) => void;\n destroy: () => void;\n}\n\nconst CONTAINER_ID = 'why-hydration-overlay';\n\nconst CATEGORY_LABELS: Record<string, string> = {\n 'non-deterministic-value': 'Non-deterministic value',\n 'date-time': 'Date / time',\n 'locale-format': 'Locale formatting',\n 'browser-only-api': 'Browser-only API',\n 'viewport-branching': 'Viewport branching',\n 'invalid-html-nesting': 'Invalid HTML nesting',\n 'whitespace-minification': 'Whitespace / minification',\n 'third-party-dom-mutation': 'Third-party DOM mutation',\n 'attribute-mismatch': 'Attribute mismatch',\n unknown: 'Unknown',\n};\n\nconst STYLES = `\n:host {\n all: initial;\n /* The \"all\" shorthand deliberately excludes direction/unicode-bidi (CSS spec),\n so a host page with <html dir=\"rtl\"> would otherwise leak direction:rtl\n into this shadow tree and flip flex/grid order + text alignment. Report\n content is English, so the overlay always renders left-to-right,\n independent of the host page's directionality. */\n direction: ltr;\n unicode-bidi: isolate;\n}\n* { box-sizing: border-box; }\n.wh-panel {\n position: fixed;\n z-index: 2147483647;\n width: min(420px, calc(100vw - 32px));\n max-height: min(70vh, 640px);\n display: flex;\n flex-direction: column;\n font: 13px/1.5 ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, sans-serif;\n color: #e5e7eb;\n background: #0b0f17;\n border: 1px solid #1f2937;\n border-radius: 12px;\n box-shadow: 0 12px 40px rgba(0,0,0,.5);\n overflow: hidden;\n direction: ltr;\n text-align: left;\n}\n.wh-bottom-right { bottom: 16px; right: 16px; }\n.wh-bottom-left { bottom: 16px; left: 16px; }\n.wh-top-right { top: 16px; right: 16px; }\n.wh-top-left { top: 16px; left: 16px; }\n.wh-header {\n display: flex; align-items: center; gap: 8px;\n padding: 10px 12px;\n background: linear-gradient(180deg, #151b26, #0d1220);\n border-bottom: 1px solid #1f2937;\n}\n.wh-dot { width: 8px; height: 8px; border-radius: 50%; background: #f59e0b; flex: none; }\n.wh-title { font-weight: 600; color: #f3f4f6; }\n.wh-count {\n margin-left: auto; font-size: 11px; color: #9ca3af;\n background: #111827; border: 1px solid #1f2937; border-radius: 999px;\n padding: 1px 8px;\n}\n.wh-btn {\n appearance: none; border: 1px solid #1f2937; background: #111827;\n color: #9ca3af; border-radius: 6px; cursor: pointer;\n font-size: 12px; padding: 3px 8px;\n}\n.wh-btn:hover { color: #f3f4f6; border-color: #374151; }\n.wh-list { flex: 1 1 auto; min-height: 0; overflow-y: auto; overscroll-behavior: contain; padding: 8px; display: flex; flex-direction: column; gap: 8px; }\n.wh-card { flex: 0 0 auto; border: 1px solid #1f2937; border-radius: 10px; background: #0f1521; overflow: hidden; }\n.wh-card-head { display: flex; align-items: center; gap: 8px; padding: 8px 10px; }\n.wh-cat {\n font-weight: 600; color: #fbbf24; font-size: 12px;\n}\n.wh-conf { margin-left: auto; font-size: 11px; color: #6b7280; }\n.wh-body { padding: 0 10px 10px; }\n.wh-where { font-size: 11px; color: #9ca3af; word-break: break-all; margin-bottom: 4px; }\n.wh-where code { color: #93c5fd; }\n.wh-comp { color: #f3f4f6; font-weight: 600; }\n.wh-loc { font-size: 11px; color: #7dd3fc; word-break: break-all; margin-bottom: 8px; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; }\n.wh-diff { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; margin-bottom: 8px; }\n.wh-side { border-radius: 8px; padding: 6px 8px; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 11px; word-break: break-word; }\n.wh-server { background: rgba(244,63,94,.08); border: 1px solid rgba(244,63,94,.35); }\n.wh-client { background: rgba(34,197,94,.08); border: 1px solid rgba(34,197,94,.35); }\n.wh-side .wh-label { display: block; font-family: inherit; font-size: 9px; text-transform: uppercase; letter-spacing: .04em; margin-bottom: 3px; }\n.wh-server .wh-label { color: #fb7185; }\n.wh-client .wh-label { color: #4ade80; }\n.wh-explain { color: #cbd5e1; margin-bottom: 8px; }\n.wh-fix { color: #e5e7eb; background: #111827; border-left: 3px solid #22c55e; border-radius: 4px; padding: 6px 8px; }\n.wh-fix strong { color: #86efac; }\n.wh-docs { display: inline-block; margin-top: 6px; color: #60a5fa; text-decoration: none; font-size: 11px; }\n.wh-docs:hover { text-decoration: underline; }\n.wh-empty-value { color: #6b7280; font-style: italic; }\n.wh-hint {\n display: none; align-items: center; gap: 8px;\n padding: 7px 12px; font-size: 11px; color: #cbd5e1;\n background: #0d1220; border-top: 1px solid #1f2937;\n animation: wh-fade .2s ease;\n}\n.wh-hint.wh-show { display: flex; }\n.wh-hint-text { flex: 1; }\n.wh-hint-x {\n appearance: none; border: 0; background: transparent; cursor: pointer;\n color: #9ca3af; font-size: 14px; line-height: 1; padding: 2px 4px;\n}\n.wh-hint-x:hover { color: #f3f4f6; }\n@keyframes wh-fade { from { opacity: 0 } to { opacity: 1 } }\n@media (max-width: 420px) {\n .wh-panel { width: auto; max-height: min(80vh, 640px); }\n .wh-bottom-right, .wh-bottom-left { left: 8px; right: 8px; }\n .wh-top-right, .wh-top-left { left: 8px; right: 8px; }\n .wh-diff { grid-template-columns: 1fr; }\n}\n`;\n\nfunction el<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n className?: string,\n text?: string,\n): HTMLElementTagNameMap[K] {\n const node = document.createElement(tag);\n if (className) node.className = className;\n if (text != null) node.textContent = text;\n return node;\n}\n\nfunction shortenPath(file: string): string {\n const normalized = file.replace(/\\\\/g, '/');\n const marker = normalized.match(/(?:^|\\/)(?:src|app|pages|components)\\//);\n if (marker && marker.index != null) {\n return normalized.slice(marker.index).replace(/^\\//, '');\n }\n const parts = normalized.split('/');\n return parts.slice(-2).join('/');\n}\n\nfunction renderValue(value: string | null): HTMLElement {\n if (value == null || value === '') {\n return el('span', 'wh-empty-value', value === '' ? '(empty)' : '(none)');\n }\n const span = document.createElement('span');\n span.textContent = value;\n return span;\n}\n\nfunction renderCard(report: HydrationReport): HTMLElement {\n const card = el('div', 'wh-card');\n\n const head = el('div', 'wh-card-head');\n head.appendChild(\n el('span', 'wh-cat', CATEGORY_LABELS[report.cause.category] ?? 'Mismatch'),\n );\n head.appendChild(\n el('span', 'wh-conf', `${Math.round(report.cause.confidence * 100)}%`),\n );\n card.appendChild(head);\n\n const body = el('div', 'wh-body');\n\n const where = el('div', 'wh-where');\n if (report.component) {\n where.appendChild(el('strong', 'wh-comp', `<${report.component}>`));\n where.append(' · ');\n } else if (report.node.tagName) {\n where.append(`<${report.node.tagName.toLowerCase()}> · `);\n }\n const code = el('code');\n code.textContent = report.node.path;\n where.appendChild(code);\n if (report.node.attribute) {\n where.append(` · @${report.node.attribute}`);\n }\n body.appendChild(where);\n\n if (report.location?.file) {\n const loc = el('div', 'wh-loc');\n const file = shortenPath(report.location.file);\n loc.textContent = report.location.line\n ? `${file}:${report.location.line}`\n : file;\n body.appendChild(loc);\n }\n\n const diff = el('div', 'wh-diff');\n const server = el('div', 'wh-side wh-server');\n server.appendChild(el('span', 'wh-label', 'Server'));\n server.appendChild(renderValue(report.server));\n const client = el('div', 'wh-side wh-client');\n client.appendChild(el('span', 'wh-label', 'Client'));\n client.appendChild(renderValue(report.client));\n diff.appendChild(server);\n diff.appendChild(client);\n body.appendChild(diff);\n\n body.appendChild(el('div', 'wh-explain', report.cause.explanation));\n\n const fix = el('div', 'wh-fix');\n const strong = el('strong');\n strong.textContent = 'Fix: ';\n fix.appendChild(strong);\n fix.append(report.cause.suggestion);\n body.appendChild(fix);\n\n if (report.cause.docsUrl && /^https?:\\/\\//i.test(report.cause.docsUrl)) {\n const a = el('a', 'wh-docs', 'Learn more →');\n a.href = report.cause.docsUrl;\n a.target = '_blank';\n a.rel = 'noreferrer noopener';\n body.appendChild(a);\n }\n\n card.appendChild(body);\n return card;\n}\n\nexport function createOverlay(options: OverlayOptions = {}): OverlayHandle {\n const position = options.position ?? 'bottom-right';\n let host: HTMLElement | null = null;\n let listEl: HTMLElement | null = null;\n let countEl: HTMLElement | null = null;\n let hintEl: HTMLElement | null = null;\n let hintTextEl: HTMLElement | null = null;\n let hintCheckTimer: ReturnType<typeof setTimeout> | null = null;\n let hintDismissed = false;\n let count = 0;\n\n function ensureMounted(): void {\n if (host) return;\n document.getElementById(CONTAINER_ID)?.remove();\n host = document.createElement('div');\n host.id = CONTAINER_ID;\n host.setAttribute('data-why-hydration', 'overlay');\n host.setAttribute('aria-hidden', 'false');\n // Belt and braces with the `:host { direction: ltr }` rule below: on an RTL\n // host page a stylesheet targeting the host element from the outer document\n // outranks `:host`, but the attribute still wins. Report content is\n // English, so the overlay stays LTR whatever the page direction.\n host.setAttribute('dir', 'ltr');\n const shadow = host.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = STYLES;\n shadow.appendChild(style);\n\n const panel = el('div', `wh-panel wh-${position}`);\n panel.setAttribute('role', 'dialog');\n panel.setAttribute('aria-label', 'Hydration mismatch diagnostics');\n\n const header = el('div', 'wh-header');\n header.appendChild(el('span', 'wh-dot'));\n header.appendChild(el('span', 'wh-title', 'Hydration mismatch'));\n countEl = el('span', 'wh-count', '0');\n header.appendChild(countEl);\n const close = el('button', 'wh-btn', 'Dismiss');\n close.setAttribute('aria-label', 'Dismiss diagnostics overlay');\n close.addEventListener('click', () => destroy());\n header.appendChild(close);\n panel.appendChild(header);\n\n listEl = el('div', 'wh-list');\n panel.appendChild(listEl);\n\n hintEl = el('div', 'wh-hint');\n hintTextEl = el('span', 'wh-hint-text');\n hintEl.appendChild(hintTextEl);\n const hintX = el('button', 'wh-hint-x', '✕');\n hintX.setAttribute('aria-label', 'Dismiss hint');\n hintX.addEventListener('click', () => dismissHint());\n hintEl.appendChild(hintX);\n panel.appendChild(hintEl);\n\n shadow.appendChild(panel);\n document.body.appendChild(host);\n\n host.addEventListener('keydown', (e) => {\n if ((e as KeyboardEvent).key === 'Escape') destroy();\n });\n }\n\n function dismissHint(): void {\n hintDismissed = true;\n hintEl?.classList.remove('wh-show');\n }\n\n // Show a persistent \"scroll for more\" hint once there are enough issues that\n // the panel is guaranteed to overflow (cards are ~150px+, panel caps at\n // ~640px, so 4+ always scroll). Count-based — no async layout measurement,\n // no timers — and only ever ADDS the class. It's removed only by its own ✕\n // button (dismissHint), which satisfies the \"close button\" requirement.\n function updateHint(): void {\n if (!hintEl || !hintTextEl || hintDismissed) return;\n hintTextEl.textContent = `↓ ${count} issues — scroll to see all`;\n if (count >= 4) hintEl.classList.add('wh-show');\n }\n\n // Tears the panel down to nothing — including the counters, which describe\n // the cards in the list rather than the reports ever seen. `push` re-mounts\n // an empty panel, so a stale count would have it claim \"14 issues — scroll to\n // see all\" above a single card that does not scroll.\n function destroy(): void {\n if (hintCheckTimer) clearTimeout(hintCheckTimer);\n hintCheckTimer = null;\n host?.remove();\n host = null;\n listEl = null;\n countEl = null;\n hintEl = null;\n hintTextEl = null;\n count = 0;\n hintDismissed = false;\n }\n\n function push(report: HydrationReport): void {\n ensureMounted();\n count += 1;\n if (countEl) countEl.textContent = String(count);\n listEl?.appendChild(renderCard(report));\n // Debounce: reports arrive in bursts across the settling window. Evaluate\n // the hint once things go quiet, after layout has settled, so the overflow\n // measurement is accurate.\n if (hintCheckTimer) clearTimeout(hintCheckTimer);\n hintCheckTimer = setTimeout(updateHint, 400);\n }\n\n return { push, destroy };\n}\n","import type { DetectionContext } from '../core/types';\n\n// Best-effort: walk the React fiber attached to a DOM node to recover the\n// owning component name and (in React 18 dev builds) its source file/line.\n// This is what turns a bare selector path into \"which component / file\".\n// Purely read-only, dev-only, and defensive — any failure returns {}.\n\ninterface Fiber {\n type?: unknown;\n return?: Fiber | null;\n _debugSource?: { fileName?: string; lineNumber?: number; columnNumber?: number };\n _debugOwner?: Fiber | null;\n}\n\nfunction getFiber(node: Node): Fiber | null {\n for (const key in node) {\n if (\n key.startsWith('__reactFiber$') ||\n key.startsWith('__reactInternalInstance$')\n ) {\n return (node as unknown as Record<string, Fiber>)[key] ?? null;\n }\n }\n return null;\n}\n\nfunction componentName(type: unknown): string | undefined {\n if (!type || typeof type === 'string') return undefined;\n if (typeof type === 'function') {\n const fn = type as { displayName?: string; name?: string };\n return fn.displayName || fn.name || undefined;\n }\n if (typeof type === 'object') {\n const obj = type as {\n displayName?: string;\n render?: { displayName?: string; name?: string };\n type?: unknown;\n };\n if (obj.displayName) return obj.displayName;\n if (obj.render) return obj.render.displayName || obj.render.name;\n if (obj.type) return componentName(obj.type);\n }\n return undefined;\n}\n\n/**\n * Resolve the component and source location responsible for a live DOM node.\n * Returns a {@link DetectionContext} fragment (`component`, `location`) that the\n * reporter merges into the report.\n */\nexport function resolveReactSource(node: Element | null): DetectionContext {\n if (!node) return {};\n try {\n let fiber: Fiber | null = getFiber(node);\n let component: string | undefined;\n let location: DetectionContext['location'];\n let hops = 0;\n while (fiber && hops < 80) {\n if (!component) {\n const name = componentName(fiber.type);\n // Skip built-in host components (div, span…) — we want the nearest\n // user component that owns this node.\n if (name && !/^[a-z]/.test(name)) component = name;\n }\n if (!location && fiber._debugSource?.fileName) {\n location = {\n file: fiber._debugSource.fileName,\n line: fiber._debugSource.lineNumber,\n column: fiber._debugSource.columnNumber,\n };\n }\n if (component && location) break;\n fiber = fiber.return ?? null;\n hops += 1;\n }\n const result: DetectionContext = {};\n if (component) result.component = component;\n if (location) result.location = location;\n return result;\n } catch {\n return {};\n }\n}\n","import { inspectRoot, reportFromMessage } from '../core/inspect';\nimport { ReportCollector } from '../core/report';\nimport {\n DEFAULT_SNAPSHOT_SELECTORS,\n getServerHtmlForRoot,\n readSnapshot,\n} from '../core/snapshot';\nimport { isDev } from '../core/env';\nimport type {\n Classifier,\n DetectionContext,\n Divergence,\n HydrationReport,\n} from '../core/types';\nimport { MAX_CAPTURED, subscribeCapture } from './capture';\nimport { createConsoleReporter } from './console';\nimport { createOverlay, type OverlayOptions } from './overlay';\nimport { resolveReactSource } from './fiber';\n\nconst INSPECT_FALLBACK_MS = 50;\n\nexport interface InspectorOptions {\n overlay?: boolean | OverlayOptions;\n onReport?: (report: HydrationReport) => void;\n ignore?: Array<string | ((node: Element) => boolean)>;\n classify?: Classifier[];\n maxReports?: number;\n roots?: string[];\n}\n\nfunction buildIgnore(\n ignore: InspectorOptions['ignore'],\n): ((d: Divergence) => boolean) | undefined {\n if (!ignore || ignore.length === 0) return undefined;\n return (divergence: Divergence): boolean => {\n const node = divergence.element ?? null;\n for (const rule of ignore) {\n if (typeof rule === 'function') {\n if (node && rule(node)) return true;\n } else if (node) {\n try {\n if (node.matches(rule) || node.closest(rule)) return true;\n } catch {\n /* invalid selector */\n }\n }\n }\n return false;\n };\n}\n\nexport class InspectorController {\n private readonly collector: ReportCollector;\n private readonly options: InspectorOptions;\n private readonly cleanups: Array<() => void> = [];\n private started = false;\n private pendingContext: DetectionContext = {};\n private readonly messages = new Set<string>();\n private readonly warnedRoots = new Set<string>();\n private settlingTimers: Array<ReturnType<typeof setTimeout>> = [];\n private inspectScheduled = false;\n private inspectTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(options: InspectorOptions = {}) {\n this.options = options;\n this.collector = new ReportCollector({\n maxReports: options.maxReports,\n extra: options.classify,\n ignore: buildIgnore(options?.ignore),\n });\n }\n\n start(): void {\n if (this.started || !isDev || typeof window === 'undefined') return;\n this.started = true;\n\n if (this.options.onReport) {\n this.cleanups.push(this.collector.addSink(this.options.onReport));\n }\n this.cleanups.push(this.collector.addSink(createConsoleReporter()));\n if (this.options.overlay !== false) {\n const overlayOpts: OverlayOptions =\n typeof this.options.overlay === 'object' ? this.options.overlay : {};\n const handle = createOverlay(overlayOpts);\n // Replay: a fresh overlay must show the reports collected before it.\n this.cleanups.push(\n this.collector.addSink(handle.push, { replay: true }),\n () => handle.destroy(),\n );\n }\n\n // Replays whatever React logged before this controller existed, which is\n // the normal case: the mismatch is reported while the tree hydrates.\n this.cleanups.push(\n subscribeCapture((message) => {\n this.rememberMessage(message);\n this.mergeContext({ reactMessage: message });\n this.scheduleInspect();\n }),\n );\n\n this.scheduleSettlingInspections();\n }\n\n // React applies client values to mismatched subtrees via a client re-render a\n // few hundred ms after the initial hydration commit. We diff once per frame\n // and then across this short \"settling window\" to catch that, deduped. This\n // is a bounded, one-shot window — NOT a standing observer — so DOM changes\n // from later app state are never mistaken for hydration mismatches.\n private scheduleSettlingInspections(): void {\n this.scheduleInspect();\n for (const delay of [80, 250, 700, 1500]) {\n const timer = setTimeout(() => this.inspectAllRoots(), delay);\n this.settlingTimers.push(timer);\n }\n }\n\n onRecoverableError = (\n error: unknown,\n info?: { componentStack?: string },\n ): void => {\n if (!isDev) return;\n const message = error instanceof Error ? error.message : String(error);\n this.rememberMessage(message);\n this.mergeContext({\n componentStack: info?.componentStack,\n component: firstComponentFromStack(info?.componentStack),\n reactMessage: message,\n });\n this.scheduleInspect();\n };\n\n private rememberMessage(message: string): void {\n if (this.messages.size >= MAX_CAPTURED && !this.messages.has(message)) {\n return;\n }\n this.messages.add(message);\n }\n\n private mergeContext(ctx: DetectionContext): void {\n this.pendingContext = {\n componentStack: ctx.componentStack ?? this.pendingContext.componentStack,\n component: ctx.component ?? this.pendingContext.component,\n location: ctx.location ?? this.pendingContext.location,\n reactMessage: ctx.reactMessage ?? this.pendingContext.reactMessage,\n };\n }\n\n private domContext(): DetectionContext {\n return {\n componentStack: this.pendingContext.componentStack,\n component: this.pendingContext.component,\n location: this.pendingContext.location,\n };\n }\n\n stop(): void {\n for (const timer of this.settlingTimers.splice(0)) clearTimeout(timer);\n this.clearScheduledInspect();\n for (const cleanup of this.cleanups.splice(0)) cleanup();\n this.started = false;\n }\n\n getReports(): readonly HydrationReport[] {\n return this.collector.getReports();\n }\n\n inspectNow(context: DetectionContext = {}): void {\n this.mergeContext(context);\n this.inspectAllRoots();\n }\n\n private inspectAllRoots(): void {\n if (\n !this.started ||\n typeof document === 'undefined' ||\n this.collector.isFull\n ) {\n return;\n }\n // 1) DOM diff — every visible mismatch (text/attribute/structure), precise\n // path + component/source from the fiber.\n const configured = this.options.roots;\n const selectors = configured ?? snapshotSelectors();\n const context = this.domContext();\n const seen = new Set<Element>();\n for (const selector of selectors) {\n let root: Element | null = null;\n try {\n root = document.querySelector(selector);\n } catch {\n this.warnRoot(selector, `\"${selector}\" is not a valid CSS selector.`);\n continue;\n }\n if (!root || seen.has(root)) continue;\n seen.add(root);\n if (configured && getServerHtmlForRoot(root) == null) {\n this.warnRoot(\n selector,\n `no server HTML was captured for \"${selector}\". Add it to the ` +\n '`selectors` prop of <HydrationSnapshotScript> so the server ' +\n 'markup for that root is snapshotted.',\n );\n continue;\n }\n inspectRoot(root, this.collector, context, (divergence) =>\n resolveReactSource(divergence.element ?? null),\n );\n }\n\n for (const message of this.messages) {\n reportFromMessage(message, this.collector, this.pendingContext);\n }\n }\n\n private warnRoot(selector: string, detail: string): void {\n if (this.warnedRoots.has(selector)) return;\n this.warnedRoots.add(selector);\n // eslint-disable-next-line no-console\n console.warn(`[why-hydration] Skipping root: ${detail}`);\n }\n\n private scheduleInspect(): void {\n if (this.inspectScheduled) return;\n this.inspectScheduled = true;\n const run = () => {\n if (!this.inspectScheduled) return;\n this.clearScheduledInspect();\n this.inspectAllRoots();\n };\n if (typeof requestAnimationFrame === 'function') requestAnimationFrame(run);\n this.inspectTimer = setTimeout(run, INSPECT_FALLBACK_MS);\n }\n\n private clearScheduledInspect(): void {\n this.inspectScheduled = false;\n if (this.inspectTimer != null) {\n clearTimeout(this.inspectTimer);\n this.inspectTimer = null;\n }\n }\n}\n\nfunction snapshotSelectors(): string[] {\n const snapshot = readSnapshot();\n const keys = snapshot ? Object.keys(snapshot.roots) : [];\n return keys.length > 0 ? keys : [...DEFAULT_SNAPSHOT_SELECTORS];\n}\n\nfunction firstComponentFromStack(stack?: string): string | undefined {\n if (!stack) return undefined;\n const match = /\\n?\\s*(?:at|in)\\s+([A-Za-z0-9_$]+)/.exec(stack);\n return match?.[1];\n}\n","import * as React from 'react';\nimport type { Classifier, HydrationReport } from '../core/types';\nimport { startCapture } from './capture';\nimport { InspectorController, type InspectorOptions } from './controller';\nimport type { OverlayOptions } from './overlay';\n\nexport interface HydrationInspectorProps {\n children: React.ReactNode;\n overlay?: boolean | OverlayOptions;\n onReport?: (report: HydrationReport) => void;\n ignore?: Array<string | ((node: Element) => boolean)>;\n classify?: Classifier[];\n maxReports?: number;\n}\n\nexport function InspectorImpl(\n props: HydrationInspectorProps,\n): React.ReactElement {\n const { children, overlay, onReport, ignore, classify, maxReports } = props;\n\n // The one thing that cannot wait for an effect: React logs the mismatch while\n // it hydrates the children below, and effects run after that. Capture is\n // module-scoped and idempotent, so Strict Mode — which renders twice with\n // fresh hook state — starts it once instead of leaving a stray interceptor.\n startCapture();\n\n const optionsRef = React.useRef<InspectorOptions>({});\n optionsRef.current = { overlay, onReport, ignore, classify, maxReports };\n\n React.useEffect(() => {\n // Everything stateful is owned by the effect so React controls its\n // lifetime. Strict Mode's setup → cleanup → setup then yields one live\n // controller, fully torn down and fully rebuilt, and the messages React\n // already logged are replayed to it from the capture backlog.\n const controller = new InspectorController(optionsRef.current);\n controller.start();\n return () => controller.stop();\n }, []);\n\n return React.createElement(React.Fragment, null, children);\n}\n","// NOTE: the `'use client'` directive for this entry is injected into the built\n// output by scripts/postbuild-use-client.mjs (esbuild strips source-level module\n// directives when bundling). This entry only exports client components.\nimport * as React from 'react';\nimport { InspectorController, type InspectorOptions } from './controller';\nimport { InspectorImpl, type HydrationInspectorProps } from './inspector';\n\nfunction PassThrough(props: {\n children?: React.ReactNode;\n}): React.ReactElement {\n return React.createElement(React.Fragment, null, props.children);\n}\n\n// The process.env.NODE_ENV checks are inline (not hoisted to a variable) so\n// production bundlers fold them and tree-shake the dev-only implementation.\nexport const HydrationInspector: (\n props: HydrationInspectorProps,\n) => React.ReactElement =\n process.env.NODE_ENV !== 'production' ? InspectorImpl : PassThrough;\n\nexport interface HydrationInspectorHandle {\n onRecoverableError: (\n error: unknown,\n info?: { componentStack?: string },\n ) => void;\n Provider: (props: { children?: React.ReactNode }) => React.ReactElement;\n}\n\nexport function createHydrationInspector(\n options: InspectorOptions = {},\n): HydrationInspectorHandle {\n if (process.env.NODE_ENV === 'production') {\n return {\n onRecoverableError: () => {},\n Provider: PassThrough,\n };\n }\n\n const controller = new InspectorController(options);\n controller.start();\n\n function Provider(props: { children?: React.ReactNode }): React.ReactElement {\n React.useEffect(() => {\n // The controller is started eagerly above, because the console has to be\n // intercepted before `hydrateRoot` runs. Strict Mode then plays this\n // effect setup → cleanup → setup, so a Provider that only stopped on\n // cleanup left the inspector dead for the rest of the session. `start()`\n // is idempotent and the controller is restartable, so re-starting here\n // yields exactly one live inspector either way.\n controller.start();\n return () => controller.stop();\n }, []);\n return React.createElement(React.Fragment, null, props.children);\n }\n\n return {\n onRecoverableError: controller.onRecoverableError,\n Provider,\n };\n}\n\nexport type { HydrationInspectorProps } from './inspector';\nexport type { InspectorOptions } from './controller';\nexport type { OverlayOptions } from './overlay';\nexport type {\n Cause,\n Classifier,\n DetectionContext,\n Divergence,\n HydrationCauseCategory,\n HydrationReport,\n} from '../core/types';\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/env.ts","../src/core/diff.ts","../src/core/classify/detectors.ts","../src/core/classify/rules.ts","../src/core/classify/index.ts","../src/core/report.ts","../src/core/react-message.ts","../src/core/inspect.ts"],"names":["path","pairs","i","j"],"mappings":"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","file":"chunk-AS5DZZHI.js","sourcesContent":["/**\n * Whether the dev-only detection machinery is allowed to run.\n *\n * Production is opt-OUT here, not opt-in, and that distinction matters. The\n * public entries already gate the entire dev implementation behind an inline\n * `process.env.NODE_ENV === 'production'` check that bundlers fold to a\n * constant and tree-shake, so a production build never reaches this module at\n * all — `npm run size` measures the result at 99 B.\n *\n * What is left is the browser case where a bundler substitutes\n * `process.env.NODE_ENV` but never defines `process` itself. Vite, Rollup and\n * esbuild all do exactly that, which compiled a `typeof process !== 'undefined'`\n * guard down to `false` and silently disabled the inspector for every one of\n * them — no overlay, no console output, no error. Treating a missing `process`\n * as \"not production\" is the only reading that keeps those setups working.\n */\nfunction readNodeEnv(): string | undefined {\n try {\n // Deliberately a plain member expression: bundlers that substitute\n // `process.env.NODE_ENV` only match this exact shape, so writing it any\n // other way (optional chaining, a destructure) would defeat the folding.\n return process.env.NODE_ENV;\n } catch {\n // `process` is not defined in this bundle. Absence is not evidence of\n // production.\n return undefined;\n }\n}\n\nexport const isDev: boolean = readNodeEnv() !== 'production';\n","import type { Divergence } from './types';\n\nconst IGNORED_ATTRIBUTES = new Set<string>(['data-reactroot']);\n\n/**\n * Parse captured server markup into a detached document, so re-materializing it\n * for the diff never fetches the images, iframes or media it references.\n * `rootTagName` preserves the HTML parsing context (e.g. rows in a `<tbody>`).\n */\nexport function parseServerHtml(html: string, rootTagName: string): Element {\n const doc = document.implementation.createHTMLDocument('');\n const container = doc.createElement(rootTagName || 'div');\n container.innerHTML = html;\n return container;\n}\n\n/**\n * Collect *every* divergence between the server snapshot and the live DOM, in a\n * deterministic order, deduped-by-value upstream. Children are aligned with an\n * LCS (by tag+id) so a node the client injects mid-tree (a portal, toast, ad,\n * or Suspense-resolved subtree) is treated as an insertion instead of shifting\n * every sibling and cascading into false positives.\n */\nexport function collectDivergences(\n serverRoot: Element,\n clientRoot: Element,\n limit = 60,\n): Divergence[] {\n const out: Divergence[] = [];\n collectChildren(serverRoot, clientRoot, tagPath(clientRoot), out, limit);\n return out;\n}\n\nexport function collectSnapshotAgainstDom(\n serverHtml: string,\n clientRoot: Element,\n limit = 60,\n): Divergence[] {\n const serverRoot = parseServerHtml(serverHtml, clientRoot.tagName);\n return collectDivergences(serverRoot, clientRoot, limit);\n}\n\n// Back-compat single-divergence helpers (used by tests / message-less paths).\nexport function diffTrees(\n serverRoot: Element,\n clientRoot: Element,\n): Divergence | null {\n return collectDivergences(serverRoot, clientRoot, 1)[0] ?? null;\n}\n\nexport function diffSnapshotAgainstDom(\n serverHtml: string,\n clientRoot: Element,\n): Divergence | null {\n return collectSnapshotAgainstDom(serverHtml, clientRoot, 1)[0] ?? null;\n}\n\nfunction collectChildren(\n serverParent: Node,\n clientParent: Node,\n parentPath: string,\n out: Divergence[],\n limit: number,\n): void {\n if (out.length >= limit) return;\n const serverChildren = meaningfulChildNodes(serverParent);\n const clientChildren = meaningfulChildNodes(clientParent);\n const parentPending = hasPendingSuspense(serverParent);\n const parentTag = elementTag(clientParent);\n const pairs = alignChildren(serverChildren, clientChildren);\n\n let index = 0;\n for (let k = 0; k < pairs.length; k++) {\n if (out.length >= limit) return;\n const [serverNode, clientNode] = pairs[k]!;\n\n // Coalesce an adjacent delete+insert into one `structure` swap (e.g. server\n // <b>, client <i> at the same slot), so one logical change isn't two reports.\n if (serverNode && !clientNode && k + 1 < pairs.length) {\n const [nextServer, nextClient] = pairs[k + 1]!;\n if (!nextServer && nextClient && !isInjectedContainer(nextClient)) {\n const path = childPath(parentPath, nextClient, index);\n index += 1;\n k += 1;\n out.push({\n kind: 'structure',\n path,\n tagName: elementTag(nextClient),\n parentTagName: parentTag,\n server: serialize(serverNode),\n client: serialize(nextClient),\n element: asElement(nextClient),\n });\n continue;\n }\n }\n\n const anchor = clientNode ?? serverNode;\n if (!anchor) continue;\n const path = childPath(parentPath, anchor, index);\n index += 1;\n\n if (serverNode && !clientNode) {\n // Server rendered a node the client dropped — a real structural mismatch.\n out.push({\n kind: 'node-removed',\n path,\n tagName: elementTag(serverNode),\n parentTagName: parentTag,\n server: serialize(serverNode),\n client: null,\n element: asElement(clientParent),\n });\n } else if (!serverNode && clientNode) {\n // Client rendered an extra node. Skip injections (portals, toasts, ads,\n // modals) and Suspense-resolved content — those are not the dev's bug.\n if (isInjectedContainer(clientNode)) continue;\n if (clientNode.nodeType === Node.ELEMENT_NODE && parentPending) continue;\n out.push({\n kind: 'node-added',\n path,\n tagName: elementTag(clientNode),\n parentTagName: parentTag,\n server: null,\n client: serialize(clientNode),\n element: asElement(clientNode),\n });\n } else if (serverNode && clientNode) {\n collectNode(serverNode, clientNode, path, parentTag, out, limit);\n }\n }\n}\n\nfunction collectNode(\n serverNode: Node,\n clientNode: Node,\n path: string,\n parentTag: string | undefined,\n out: Divergence[],\n limit: number,\n): void {\n if (serverNode.nodeType !== clientNode.nodeType) {\n out.push({\n kind: 'structure',\n path,\n tagName: elementTag(clientNode),\n parentTagName: parentTag,\n server: serialize(serverNode),\n client: serialize(clientNode),\n element: asElement(clientNode),\n });\n return;\n }\n\n if (\n serverNode.nodeType === Node.TEXT_NODE ||\n serverNode.nodeType === Node.COMMENT_NODE\n ) {\n const serverText = serverNode.textContent ?? '';\n const clientText = clientNode.textContent ?? '';\n if (serverText !== clientText) {\n out.push({\n kind: 'text',\n path,\n parentTagName: parentTag,\n server: serverText,\n client: clientText,\n element: asElement(clientNode.parentNode),\n });\n }\n return;\n }\n\n if (serverNode.nodeType === Node.ELEMENT_NODE) {\n const serverEl = serverNode as Element;\n const clientEl = clientNode as Element;\n\n if (serverEl.tagName !== clientEl.tagName) {\n out.push({\n kind: 'structure',\n path,\n tagName: clientEl.tagName,\n parentTagName: parentTag,\n server: serialize(serverEl),\n client: serialize(clientEl),\n element: clientEl,\n });\n return;\n }\n\n const attrDivergence = diffAttributes(serverEl, clientEl, path, parentTag);\n if (attrDivergence) out.push(attrDivergence);\n\n collectChildren(serverEl, clientEl, path, out, limit);\n }\n}\n\nfunction diffAttributes(\n serverEl: Element,\n clientEl: Element,\n path: string,\n parentTag: string | undefined,\n): Divergence | null {\n const names = new Set<string>();\n for (const a of Array.from(serverEl.attributes)) names.add(a.name);\n for (const a of Array.from(clientEl.attributes)) names.add(a.name);\n\n for (const name of names) {\n if (IGNORED_ATTRIBUTES.has(name)) continue;\n const serverValue = serverEl.getAttribute(name);\n const clientValue = clientEl.getAttribute(name);\n if (normalizeAttr(name, serverValue) === normalizeAttr(name, clientValue)) {\n continue;\n }\n return {\n kind: 'attribute',\n path,\n tagName: clientEl.tagName,\n parentTagName: parentTag,\n attribute: name,\n server: serverValue,\n client: clientValue,\n element: clientEl,\n };\n }\n return null;\n}\n\nfunction normalizeAttr(name: string, value: string | null): string | null {\n if (value == null) return null;\n if (name === 'class') {\n return value.trim().split(/\\s+/).filter(Boolean).sort().join(' ');\n }\n if (name === 'style') {\n return normalizeStyle(value);\n }\n return value;\n}\n\n// Canonicalize an inline style through the CSSOM so React's raw serialization\n// (`color:#0f172a`) compares equal to the browser-normalized live value\n// (`color: rgb(15, 23, 42);`), order-independent.\nfunction normalizeStyle(value: string): string {\n if (typeof document !== 'undefined') {\n try {\n const el = document.createElement('div');\n el.style.cssText = value;\n const decls: string[] = [];\n for (let i = 0; i < el.style.length; i++) {\n const prop = el.style.item(i);\n decls.push(`${prop}:${el.style.getPropertyValue(prop)}`);\n }\n return decls.sort().join(';');\n } catch {\n /* fall through to string normalization */\n }\n }\n return value\n .split(';')\n .map((s) => s.trim())\n .filter(Boolean)\n .sort()\n .join(';');\n}\n\n// ---- alignment ------------------------------------------------------------\n\nfunction nodeKey(node: Node): string {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as Element;\n return el.id ? `${el.tagName}#${el.id}` : el.tagName;\n }\n if (node.nodeType === Node.TEXT_NODE) return '#text';\n return '#other';\n}\n\n// Align two child lists by an LCS on their keys, so inserted/removed nodes are\n// identified rather than shifting the whole comparison. Falls back to index\n// pairing for very large lists (keeps it O(n) there).\nfunction alignChildren(\n server: Node[],\n client: Node[],\n): Array<[Node | null, Node | null]> {\n const m = server.length;\n const n = client.length;\n if (m === 0 || n === 0 || m > 200 || n > 200 || m * n > 10000) {\n const pairs: Array<[Node | null, Node | null]> = [];\n const max = Math.max(m, n);\n for (let i = 0; i < max; i++) {\n pairs.push([server[i] ?? null, client[i] ?? null]);\n }\n return pairs;\n }\n const sk = server.map(nodeKey);\n const ck = client.map(nodeKey);\n const dp: number[][] = Array.from({ length: m + 1 }, () =>\n new Array(n + 1).fill(0),\n );\n for (let i = m - 1; i >= 0; i--) {\n for (let j = n - 1; j >= 0; j--) {\n dp[i]![j] =\n sk[i] === ck[j]\n ? dp[i + 1]![j + 1]! + 1\n : Math.max(dp[i + 1]![j]!, dp[i]![j + 1]!);\n }\n }\n const pairs: Array<[Node | null, Node | null]> = [];\n let i = 0;\n let j = 0;\n while (i < m && j < n) {\n if (sk[i] === ck[j]) {\n pairs.push([server[i]!, client[j]!]);\n i++;\n j++;\n } else if (dp[i + 1]![j]! >= dp[i]![j + 1]!) {\n pairs.push([server[i]!, null]);\n i++;\n } else {\n pairs.push([null, client[j]!]);\n j++;\n }\n }\n while (i < m) pairs.push([server[i++]!, null]);\n while (j < n) pairs.push([null, client[j++]!]);\n return pairs;\n}\n\n// ---- noise / injection / suspense ----------------------------------------\n\nconst NOISE_TAGS = new Set<string>([\n 'SCRIPT',\n 'STYLE',\n 'LINK',\n 'TEMPLATE',\n 'NOSCRIPT',\n]);\n\nconst TRACKER_MARKER =\n /googlefc|adsbygoogle|google_ads|googletag|__tcfapi|onetrust|optanon|cookiebot|usercentrics|didomi|quantcast|grammarly|gtm|hotjar|fullstory|intercom|drift|zendesk|livechat|tawk|hubspot|turnstile|recaptcha/i;\n\n// Elements client-side scripts/libraries mount that the server never rendered:\n// toasts, modals, portals, overlays, tooltips, consent banners, chat widgets.\nconst INJECTED_MARKER =\n /toastify|toast|modal|portal|overlay|backdrop|drawer|dialog|popover|popper|tooltip|snackbar|notification|consent|gdpr|cookie-?(?:banner|consent)|intercom|drift|crisp|tawk|zendesk|onetrust|usercentrics/i;\n\nfunction isThirdPartyNoiseElement(el: Element): boolean {\n const identity = `${el.getAttribute('name') ?? ''} ${el.id} ${\n typeof el.className === 'string' ? el.className : ''\n }`;\n if (TRACKER_MARKER.test(identity)) return true;\n if (el.tagName === 'IFRAME') {\n const src = el.getAttribute('src') ?? '';\n const style = (el.getAttribute('style') ?? '').toLowerCase();\n const hidden =\n /display\\s*:\\s*none/.test(style) ||\n /visibility\\s*:\\s*hidden/.test(style) ||\n /(?:left|top)\\s*:\\s*-\\d{3,}px/.test(style) ||\n /(?:width|height)\\s*:\\s*0(?:px)?\\b/.test(style) ||\n el.hasAttribute('hidden') ||\n el.getAttribute('aria-hidden') === 'true';\n if (src === 'about:blank' || hidden) return true;\n }\n return false;\n}\n\n// A client-only node that is a portal / toast / overlay / third-party widget —\n// never part of the app's hydration, so it must not be reported.\nfunction isInjectedContainer(node: Node): boolean {\n if (node.nodeType !== Node.ELEMENT_NODE) return false;\n const el = node as Element;\n if (isNoiseElement(el)) return true;\n const cls = typeof el.className === 'string' ? el.className : '';\n if (INJECTED_MARKER.test(`${el.id} ${cls}`)) return true;\n if (el.hasAttribute('aria-live')) return true;\n const role = el.getAttribute('role');\n if (role && /^(dialog|alertdialog|tooltip|status|alert)$/.test(role.trim())) {\n return true;\n }\n if (el.tagName.includes('-PORTAL') || el.tagName.includes('-OVERLAY')) {\n return true;\n }\n for (const attr of Array.from(el.attributes)) {\n if (/portal|radix|headlessui|floating-ui/i.test(attr.name)) return true;\n }\n return false;\n}\n\nfunction isNoiseElement(node: Node): boolean {\n if (node.nodeType !== Node.ELEMENT_NODE) return false;\n const el = node as Element;\n if (el.hasAttribute('data-why-hydration')) return true;\n if (NOISE_TAGS.has(el.tagName)) return true;\n if (el.tagName.includes('-ROUTE-ANNOUNCER')) return true;\n if (isThirdPartyNoiseElement(el)) return true;\n return false;\n}\n\n// True when a parent's server children include a *pending* Suspense boundary\n// (`<!--$?-->`), i.e. the server streamed a fallback that the client resolves to\n// different content. Those differences are expected, not bugs.\nfunction hasPendingSuspense(parent: Node): boolean {\n for (const n of Array.from(parent.childNodes)) {\n if (n.nodeType === Node.COMMENT_NODE && (n.nodeValue ?? '').startsWith('$?')) {\n return true;\n }\n }\n return false;\n}\n\nfunction meaningfulChildNodes(parent: Node): Node[] {\n const raw = Array.from(parent.childNodes);\n const hasElement = raw.some(\n (n) => n.nodeType === Node.ELEMENT_NODE && !isNoiseElement(n),\n );\n const result: Node[] = [];\n const boundaryStack: string[] = [];\n for (const node of raw) {\n if (node.nodeType === Node.COMMENT_NODE) {\n const data = node.nodeValue ?? '';\n if (data === '$?' || data === '$' || data === '$!') boundaryStack.push(data);\n else if (data === '/$') boundaryStack.pop();\n continue; // React/RSC markers are never real content.\n }\n // Skip fallback content inside a pending Suspense boundary.\n if (boundaryStack.includes('$?')) continue;\n if (isNoiseElement(node)) continue;\n if (node.nodeType !== Node.TEXT_NODE) {\n result.push(node);\n continue;\n }\n const text = node.textContent ?? '';\n if (text.trim() !== '' || !hasElement) result.push(node);\n }\n return result;\n}\n\nfunction serialize(node: Node): string {\n if (node.nodeType === Node.ELEMENT_NODE) {\n return (node as Element).outerHTML;\n }\n return node.textContent ?? '';\n}\n\nfunction asElement(node: Node | null | undefined): Element | null {\n if (!node) return null;\n return node.nodeType === Node.ELEMENT_NODE ? (node as Element) : null;\n}\n\nfunction elementTag(node: Node): string | undefined {\n return node.nodeType === Node.ELEMENT_NODE\n ? (node as Element).tagName\n : undefined;\n}\n\nfunction tagPath(el: Element): string {\n return el.tagName.toLowerCase();\n}\n\nfunction childPath(parentPath: string, node: Node, index: number): string {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as Element;\n const tag = el.tagName.toLowerCase();\n const id = el.id ? `#${el.id}` : '';\n return `${parentPath} > ${tag}${id}:nth-child(${index + 1})`;\n }\n if (node.nodeType === Node.COMMENT_NODE) {\n return `${parentPath} > #comment[${index}]`;\n }\n return `${parentPath} > #text[${index}]`;\n}\n","const UUID_RE =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\nconst REACT_ID_RE = /^:[rR][0-9a-z]*:$/;\nconst HEX_TOKEN_RE = /^[0-9a-f]{16,}$/i;\nconst RANDOM_DECIMAL_RE = /^0?\\.\\d{6,}$/;\nconst NANOID_RE = /^[A-Za-z0-9_-]{10,}$/;\n\nconst ARABIC_INDIC_DIGITS = /[٠-٩۰-۹]/;\nconst LATIN_DIGITS = /[0-9]/;\n\n/**\n * Bidirectional control characters: LRM, RLM, ALM and the isolate family.\n *\n * `Intl` wraps numbers and date fields in these when formatting for an RTL\n * locale, and *which* ones it emits differs between ICU versions — so Node and\n * the browser routinely format the same date into strings that differ only by\n * invisible marks. That is a genuine hydration mismatch whose diff is literally\n * invisible, which is exactly the case a developer cannot debug by eye.\n */\nconst BIDI_CONTROLS = /[‎‏؜⁦-⁩]/g;\n\nexport function stripBidiControls(value: string): string {\n return value.replace(BIDI_CONTROLS, '');\n}\n\n/** True when two values render identically once the invisible marks are gone. */\nexport function differsOnlyByBidiControls(a: string, b: string): boolean {\n const sa = stripBidiControls(a);\n const sb = stripBidiControls(b);\n return a !== b && sa === sb && sa.trim() !== '';\n}\n\n/**\n * Fold Arabic-Indic (٠-٩) and Extended/Persian (۰-۹) digits, plus the Arabic\n * thousands (٬) and decimal (٫) separators, onto their Latin equivalents, and\n * drop bidi controls.\n *\n * Every numeric/date/time shape test below is written in terms of `\\d`, so\n * without this an app that renders Arabic-Indic digits on *both* sides gets no\n * classification at all — the script-mismatch rule only fires when the two\n * sides use different scripts. Normalisation is the identity function on Latin\n * input, so it leaves every existing LTR path byte-identical.\n */\nexport function normalizeNumerals(value: string): string {\n return stripBidiControls(value).replace(/[٠-٩۰-۹٫٬]/g, (ch) => {\n if (ch === '٫') return '.';\n if (ch === '٬') return ',';\n const code = ch.charCodeAt(0);\n const zero = code >= 0x06f0 ? 0x06f0 : 0x0660;\n return String(code - zero);\n });\n}\n\nexport function isRandomLike(value: string): boolean {\n const v = value.trim();\n if (!v) return false;\n if (UUID_RE.test(v)) return true;\n if (REACT_ID_RE.test(v)) return true;\n if (HEX_TOKEN_RE.test(v)) return true;\n if (RANDOM_DECIMAL_RE.test(v)) return true;\n if (NANOID_RE.test(v) && /[A-Za-z]/.test(v) && /[0-9]/.test(v)) return true;\n return false;\n}\n\nexport function looksLikeTime(value: string): boolean {\n return /\\b\\d{1,2}:\\d{2}(?::\\d{2})?(?:\\s?[AaPp][Mm])?\\b/.test(\n normalizeNumerals(value).trim(),\n );\n}\n\n/**\n * Structural date shapes.\n *\n * `Date.parse` cannot be used as a *detector*: V8 accepts almost anything.\n * `Date.parse('100')` is the year 100, `Date.parse('server-0')` is the year\n * 2000, and `Date.parse('item 5')` is a date in May. Trusting it meant ordinary\n * text and ordinary numbers — a price, a stock count, an id like `row-3` — were\n * diagnosed as \"the clock moved between server and client render\", which is\n * more misleading than no diagnosis at all. So a value must look like a date\n * *by shape* before `Date.parse` is consulted at all.\n */\nconst ISO_DATE = /^\\d{4}-\\d{1,2}(?:-\\d{1,2})?(?:[T ]\\d{1,2}:\\d{2}(?::\\d{2})?)?/;\nconst NUMERIC_DATE = /^\\d{1,4}[/.-]\\d{1,2}[/.-]\\d{1,4}$/;\nconst TIME_OF_DAY = /^\\d{1,2}:\\d{2}(?::\\d{2})?(?:\\s?[AaPp]\\.?[Mm]\\.?)?$/;\nconst MONTH_NAME =\n /\\b(?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)[a-z]*\\b/i;\n\nfunction looksLikeDate(v: string): boolean {\n return (\n ISO_DATE.test(v) ||\n NUMERIC_DATE.test(v) ||\n TIME_OF_DAY.test(v) ||\n (MONTH_NAME.test(v) && /\\d/.test(v))\n );\n}\n\nexport function toTimestamp(value: string): number | null {\n const v = value.trim();\n if (!v) return null;\n // Epoch seconds/millis are unambiguous and stay matched explicitly.\n if (/^\\d{10,13}$/.test(v)) {\n const n = Number(v);\n return v.length === 10 ? n * 1000 : n;\n }\n if (!looksLikeDate(v)) return null;\n const parsed = Date.parse(v);\n if (!Number.isNaN(parsed)) return parsed;\n if (looksLikeTime(v)) {\n const anchored = Date.parse(`1970-01-01 ${v}`);\n if (!Number.isNaN(anchored)) return anchored;\n }\n return null;\n}\n\nexport function hasArabicIndicDigits(value: string): boolean {\n return ARABIC_INDIC_DIGITS.test(value);\n}\n\nexport function hasLatinDigits(value: string): boolean {\n return LATIN_DIGITS.test(value);\n}\n\n// A value made only of digits, separators and an optional sign \\u2014 i.e. it\n// actually looks like a formatted number. Guards against class lists, ids, and\n// arbitrary text that merely contain digits (e.g. \"radius-8 border p-8\").\nconst NUMERIC_LIKE = /^[+-]?[\\d.,\\s\\u00a0\\u2009]+$/;\n\nexport function isSameNumberDifferentSeparators(a: string, b: string): boolean {\n const at = normalizeNumerals(a).trim();\n const bt = normalizeNumerals(b).trim();\n if (!NUMERIC_LIKE.test(at) || !NUMERIC_LIKE.test(bt)) return false;\n const digitsOnly = (s: string) => s.replace(/\\D/g, '');\n const da = digitsOnly(at);\n const db = digitsOnly(bt);\n if (!da || da !== db) return false;\n const hasSep = (s: string) => /[.,\\s\\u00a0\\u2009]/.test(s);\n // The \"actually different\" test is on the RAW values: `\\u0661\\u0662\\u0663\\u0664\\u066b\\u0665\\u0666` and\n // `\\u0661\\u0662\\u0663\\u0664.\\u0665\\u0666` fold to the same string but are two different renderings of the\n // same number, which is precisely the mismatch being classified.\n return (hasSep(at) || hasSep(bt)) && a.trim() !== b.trim();\n}\n\n// Attributes whose value is human-facing content that can carry locale/date/\n// random formatting. Structural attributes (class, style, id, href\\u2026) are not.\nconst CONTENT_ATTRIBUTES = new Set<string>([\n 'value',\n 'placeholder',\n 'title',\n 'alt',\n 'label',\n 'aria-label',\n 'aria-valuetext',\n 'content',\n 'datetime',\n]);\n\nexport function isContentAttribute(name: string): boolean {\n return CONTENT_ATTRIBUTES.has(name.toLowerCase());\n}\n\n// Markers of third-party scripts / consent / analytics / chat widgets that\n// inject nodes after the server render (not part of the app's hydration).\nconst THIRD_PARTY_MARKERS =\n /googlefc|adsbygoogle|google_ads|googletag|__tcfapi|onetrust|optanon|cookiebot|usercentrics|iubenda|didomi|quantcast|grammarly|data-gramm|gtm-|_hjsettings|hotjar|fullstory|intercom|drift|zendesk|livechat|tawk|hubspot|turnstile|recaptcha/i;\n\n// True when a *node-added / node-removed* divergence is almost certainly a\n// third-party injection rather than the developer's own hydration mismatch.\nexport function looksLikeThirdPartyNode(\n html: string | null,\n tagName: string | undefined,\n): boolean {\n const tag = (tagName ?? '').toUpperCase();\n if (tag === 'IFRAME' || tag === 'EMBED' || tag === 'OBJECT') return true;\n const h = (html ?? '').toLowerCase();\n if (!h) return false;\n return THIRD_PARTY_MARKERS.test(h) || h.includes('about:blank');\n}\n\nconst DATE_PARTS_RE = /^(\\d{1,4})[/.-](\\d{1,2})[/.-](\\d{1,4})$/;\n\nexport function isSameDateDifferentOrder(a: string, b: string): boolean {\n const partsA = normalizeNumerals(a).trim().match(DATE_PARTS_RE);\n const partsB = normalizeNumerals(b).trim().match(DATE_PARTS_RE);\n if (!partsA || !partsB) return false;\n const setA = [partsA[1], partsA[2], partsA[3]].sort().join('|');\n const setB = [partsB[1], partsB[2], partsB[3]].sort().join('|');\n return setA === setB && a.trim() !== b.trim();\n}\n\nexport const EXTENSION_ATTRIBUTES = new Set<string>([\n 'cz-shortcut-listen',\n 'data-gramm',\n 'data-gramm_editor',\n 'data-gramm_id',\n 'data-gr-c-s-loaded',\n 'data-lt-installed',\n 'data-new-gr-c-s-check-loaded',\n 'data-new-gr-c-s-loaded',\n 'spellcheck-extension',\n 'bis_register',\n '__processed_by_react_dev_tools',\n]);\n\nexport function isExtensionAttribute(name: string): boolean {\n const n = name.toLowerCase();\n if (EXTENSION_ATTRIBUTES.has(n)) return true;\n return (\n n.startsWith('data-gr-') ||\n n.startsWith('data-gramm') ||\n n.startsWith('__bis') ||\n n.startsWith('bis_')\n );\n}\n\nconst BLOCK_TAGS = new Set([\n 'DIV',\n 'P',\n 'SECTION',\n 'ARTICLE',\n 'UL',\n 'OL',\n 'LI',\n 'TABLE',\n 'HEADER',\n 'FOOTER',\n 'MAIN',\n 'ASIDE',\n 'NAV',\n 'H1',\n 'H2',\n 'H3',\n 'H4',\n 'H5',\n 'H6',\n 'FORM',\n 'BLOCKQUOTE',\n 'PRE',\n 'HR',\n]);\n\nexport function isInvalidNesting(\n parentTag: string | undefined,\n childTag: string | undefined,\n): boolean {\n if (!parentTag || !childTag) return false;\n const p = parentTag.toUpperCase();\n const c = childTag.toUpperCase();\n if (p === 'P' && BLOCK_TAGS.has(c)) return true;\n if (p === 'A' && c === 'A') return true;\n if (p === 'BUTTON' && (c === 'BUTTON' || c === 'A')) return true;\n if ((p === 'TABLE' || p === 'THEAD' || p === 'TBODY') && c === 'DIV') {\n return true;\n }\n return false;\n}\n\nexport function messageIndicatesInvalidNesting(message?: string): boolean {\n if (!message) return false;\n return (\n /validateDOMNesting/i.test(message) ||\n /cannot (?:be a|contain).*(?:descendant|child)/i.test(message) ||\n /cannot appear as a (?:child|descendant)/i.test(message)\n );\n}\n","import type { Cause, Classifier, Divergence } from '../types';\nimport {\n differsOnlyByBidiControls,\n hasArabicIndicDigits,\n hasLatinDigits,\n isContentAttribute,\n isExtensionAttribute,\n isInvalidNesting,\n isRandomLike,\n isSameDateDifferentOrder,\n isSameNumberDifferentSeparators,\n looksLikeThirdPartyNode,\n looksLikeTime,\n messageIndicatesInvalidNesting,\n toTimestamp,\n} from './detectors';\n\nexport const DOCS_BASE =\n 'https://github.com/razan-aboushi/why-hydration#cause-';\n\nfunction docs(category: string): string {\n return `${DOCS_BASE}${category}`;\n}\n\nfunction bothDiffer(d: Divergence): d is Divergence & {\n server: string;\n client: string;\n} {\n return (\n d.server != null && d.client != null && d.server.trim() !== d.client.trim()\n );\n}\n\n// The value-formatting rules (random / date / locale) only make sense for\n// human-facing text: text nodes and content-like attributes. Applied to\n// `class`/`style`/`id`/etc. they false-match (e.g. a class list with digits\n// looks like \"the same number with different separators\").\nfunction isValueDivergence(d: Divergence): boolean {\n if (d.kind === 'text') return true;\n if (d.kind === 'attribute' && d.attribute) {\n return isContentAttribute(d.attribute);\n }\n return false;\n}\n\nconst nonDeterministic: Classifier = (d) => {\n if (!isValueDivergence(d)) return null;\n if (!bothDiffer(d)) return null;\n if (!isRandomLike(d.server) || !isRandomLike(d.client)) return null;\n return {\n category: 'non-deterministic-value',\n confidence: 0.9,\n explanation:\n 'The server and client rendered different random-looking values ' +\n '(an id, token, or Math.random() output). Anything non-deterministic ' +\n 'in render produces a different value on each side.',\n suggestion:\n 'Use React `useId()` for ids. For random values, generate them after ' +\n 'mount (in `useEffect`) or pass a value down from the server so both ' +\n 'sides agree. Never call `Math.random()`/`crypto` during render.',\n docsUrl: docs('non-deterministic-value'),\n };\n};\n\nconst dateTime: Classifier = (d) => {\n if (!isValueDivergence(d)) return null;\n if (!bothDiffer(d)) return null;\n const serverTs = toTimestamp(d.server);\n const clientTs = toTimestamp(d.client);\n const bothTimes = looksLikeTime(d.server) && looksLikeTime(d.client);\n if (serverTs == null || clientTs == null) {\n if (!bothTimes) return null;\n }\n const delta =\n serverTs != null && clientTs != null ? Math.abs(serverTs - clientTs) : 0;\n const smallDelta = delta > 0 && delta < 24 * 60 * 60 * 1000;\n return {\n category: 'date-time',\n confidence: smallDelta || bothTimes ? 0.85 : 0.7,\n explanation:\n 'The values are dates/times that differ between server render and ' +\n 'client render — the clock moved (or the timezone differs) between the ' +\n 'two environments.',\n suggestion:\n 'Render the current time after mount, or pass a single server ' +\n 'timestamp down and format it identically on both sides. Pin an ' +\n 'explicit timezone when formatting.',\n docsUrl: docs('date-time'),\n };\n};\n\nconst localeFormat: Classifier = (d) => {\n if (!isValueDivergence(d)) return null;\n if (!bothDiffer(d)) return null;\n const { server, client } = d;\n\n // Checked first: the two values look identical in the console and in the\n // overlay, so nothing further down could explain the diff to the developer.\n if (differsOnlyByBidiControls(server, client)) {\n return {\n category: 'locale-format',\n confidence: 0.88,\n explanation:\n 'The values differ only by invisible bidirectional control marks ' +\n '(LRM/RLM/isolates). `Intl` adds these around numbers and dates in ' +\n 'RTL locales, and different ICU versions — Node vs the browser — ' +\n 'emit different ones for the same input.',\n suggestion:\n 'Format the value in one place and pass the string down, or pin the ' +\n 'same locale and timezone on both sides. If the marks are harmless, ' +\n 'add `suppressHydrationWarning` to the element.',\n docsUrl: docs('locale-format'),\n };\n }\n\n const scriptMismatch =\n (hasArabicIndicDigits(server) && hasLatinDigits(client)) ||\n (hasLatinDigits(server) && hasArabicIndicDigits(client));\n if (scriptMismatch) {\n return {\n category: 'locale-format',\n confidence: 0.92,\n explanation:\n 'The same value was formatted with different digit scripts ' +\n '(Arabic-Indic ٠١٢ vs Latin 012). The server and client resolved to ' +\n 'different locales.',\n suggestion:\n 'Pass an explicit `locale` (and timezone) to `Intl.NumberFormat` / ' +\n '`toLocaleString` on both server and client, or format the value ' +\n 'after mount so only the client locale is ever used.',\n docsUrl: docs('locale-format'),\n };\n }\n\n if (isSameNumberDifferentSeparators(server, client)) {\n return {\n category: 'locale-format',\n confidence: 0.82,\n explanation:\n 'The same number was formatted with different grouping/decimal ' +\n 'separators between server and client (e.g. 1,234.56 vs 1.234,56).',\n suggestion:\n 'Pass an explicit locale to `Intl.NumberFormat`/`toLocaleString` on ' +\n 'both sides so the separators match.',\n docsUrl: docs('locale-format'),\n };\n }\n\n if (isSameDateDifferentOrder(server, client)) {\n return {\n category: 'locale-format',\n confidence: 0.75,\n explanation:\n 'The same date was rendered in a different field order ' +\n '(MM/DD vs DD/MM) between server and client.',\n suggestion:\n 'Format dates with an explicit locale and timezone via `Intl` on ' +\n 'both sides.',\n docsUrl: docs('locale-format'),\n };\n }\n return null;\n};\n\nconst browserOnlyApi: Classifier = (d) => {\n const serverEmpty = d.server == null || d.server.trim() === '';\n const clientHasContent = d.client != null && d.client.trim() !== '';\n const shape =\n (d.kind === 'text' || d.kind === 'node-added') &&\n serverEmpty &&\n clientHasContent;\n if (!shape) return null;\n return {\n category: 'browser-only-api',\n confidence: 0.75,\n explanation:\n 'The client rendered content the server left empty — the signature of ' +\n 'reading a browser-only API (`window`, `document`, `localStorage`, ' +\n '`navigator`, `matchMedia`) during render.',\n suggestion:\n 'Gate browser-only reads behind a mounted flag or `useEffect`, or use ' +\n '`useSyncExternalStore` with a server snapshot so the first client ' +\n 'render matches the server.',\n docsUrl: docs('browser-only-api'),\n };\n};\n\nconst viewportBranching: Classifier = (d) => {\n const structural =\n d.kind === 'structure' ||\n d.kind === 'node-added' ||\n d.kind === 'node-removed';\n if (!structural) return null;\n if (\n isInvalidNesting(d.parentTagName, d.tagName) ||\n messageIndicatesInvalidNesting(d.reactMessage)\n ) {\n return null;\n }\n // A bare \"hydration failed\" message parses to a structure divergence with no\n // values and no tags. There is nothing there to attribute to a viewport\n // branch, so leave it unknown rather than inventing a 60%-confident cause.\n if (d.server == null && d.client == null && !d.tagName) return null;\n return {\n category: 'viewport-branching',\n confidence: 0.6,\n explanation:\n 'A whole subtree was added, removed, or swapped between server and ' +\n 'client — typically a JavaScript width/viewport check that branches ' +\n 'the tree at first render.',\n suggestion:\n 'Render both branches and switch between them with CSS media queries at ' +\n 'first paint instead of branching in JavaScript, or defer the ' +\n 'JS-driven branch until after mount.',\n docsUrl: docs('viewport-branching'),\n };\n};\n\nconst invalidNesting: Classifier = (d) => {\n const byMessage = messageIndicatesInvalidNesting(d.reactMessage);\n const byShape = isInvalidNesting(d.parentTagName, d.tagName);\n if (!byMessage && !byShape) return null;\n return {\n category: 'invalid-html-nesting',\n confidence: byMessage ? 0.9 : 0.72,\n explanation:\n 'A node was moved or ejected because the markup is invalid HTML ' +\n '(e.g. a `<div>` inside a `<p>`, or nested `<a>`). The browser repairs ' +\n 'the server DOM, so it no longer matches what React expects.',\n suggestion:\n 'Fix the markup validity: block elements cannot live inside `<p>`, ' +\n 'anchors cannot nest, etc. Replace the invalid parent with a `<div>` or ' +\n 'restructure the tree.',\n docsUrl: docs('invalid-html-nesting'),\n };\n};\n\nconst whitespaceMinification: Classifier = (d) => {\n if (d.kind !== 'text') return null;\n if (d.server == null || d.client == null) return null;\n if (d.server === d.client) return null;\n const collapse = (s: string) => s.replace(/\\s+/g, ' ').trim();\n if (collapse(d.server) !== collapse(d.client)) return null;\n return {\n category: 'whitespace-minification',\n confidence: 0.7,\n explanation:\n 'The mismatch is whitespace-only — the text is identical apart from ' +\n 'spaces/newlines. An HTML minifier likely collapsed whitespace around ' +\n 'the hydration root differently from React.',\n suggestion:\n 'Check your HTML minifier settings (e.g. `conservativeCollapse`) around ' +\n 'the app root, or avoid minifying whitespace inside hydrated markup.',\n docsUrl: docs('whitespace-minification'),\n };\n};\n\nconst thirdPartyDomMutation: Classifier = (d) => {\n if (d.kind === 'attribute' && d.attribute) {\n if (isExtensionAttribute(d.attribute)) {\n return {\n category: 'third-party-dom-mutation',\n confidence: 0.88,\n explanation:\n `The attribute \\`${d.attribute}\\` was injected by a browser ` +\n 'extension or third-party script (e.g. Grammarly, ColorZilla) ' +\n 'before hydration, so the client DOM no longer matches the server.',\n suggestion:\n 'This is usually harmless. Add `suppressHydrationWarning` to the ' +\n 'affected element, or defer third-party script init until after ' +\n 'hydration.',\n docsUrl: docs('third-party-dom-mutation'),\n };\n }\n // Only when the diff actually resolved the <html>/<body> element. A\n // divergence parsed from a React message carries `body` as a placeholder\n // path, not a real location, so it must not be pinned to the root — every\n // client-only attribute anywhere on the page would look third-party.\n const el = d.element;\n const atRoot =\n d.server == null && el != null && /^(?:HTML|BODY)$/.test(el.tagName);\n if (atRoot) {\n return {\n category: 'third-party-dom-mutation',\n confidence: 0.6,\n explanation:\n `An attribute (\\`${d.attribute}\\`) appeared on a root element that ` +\n 'the server never sent — a hallmark of an extension or early ' +\n 'third-party script mutating the DOM.',\n suggestion:\n 'Add `suppressHydrationWarning` to the root element, or defer the ' +\n 'third-party script until after hydration.',\n docsUrl: docs('third-party-dom-mutation'),\n };\n }\n }\n\n // An injected node (iframe/embed, or a known ads/consent/analytics/chat\n // marker) the server never rendered — not part of the app's hydration.\n if (\n (d.kind === 'node-added' || d.kind === 'node-removed') &&\n looksLikeThirdPartyNode(d.client ?? d.server, d.tagName)\n ) {\n const tag = (d.tagName ?? 'element').toLowerCase();\n return {\n category: 'third-party-dom-mutation',\n confidence: 0.7,\n explanation:\n `A <${tag}> was injected by a third-party script or browser extension ` +\n '(ads, consent, analytics, chat) after the server render. It is not ' +\n \"part of your app's hydration, so this is usually harmless noise.\",\n suggestion:\n 'If React warns about it, add `suppressHydrationWarning` to the ' +\n 'nearest server-rendered wrapper, or load the third-party script after ' +\n 'hydration (e.g. Next.js `<Script strategy=\"afterInteractive\">`).',\n docsUrl: docs('third-party-dom-mutation'),\n };\n }\n return null;\n};\n\n// Class / style / generic attribute mismatch that no value rule explained.\n// This is where the `forceHide` class-toggle case lands, with the exact tokens.\nconst attributeMismatch: Classifier = (d) => {\n if (d.kind !== 'attribute' || !d.attribute) return null;\n const attr = d.attribute.toLowerCase();\n const server = d.server ?? '';\n const client = d.client ?? '';\n\n if (attr === 'class' || attr === 'classname') {\n const serverSet = new Set(server.split(/\\s+/).filter(Boolean));\n const clientSet = new Set(client.split(/\\s+/).filter(Boolean));\n const added = [...clientSet].filter((c) => !serverSet.has(c));\n const removed = [...serverSet].filter((c) => !clientSet.has(c));\n const parts: string[] = [];\n if (added.length) parts.push(`added on client: ${added.join(', ')}`);\n if (removed.length) parts.push(`removed on client: ${removed.join(', ')}`);\n const detail = parts.length ? ` (${parts.join('; ')})` : '';\n return {\n category: 'attribute-mismatch',\n confidence: 0.8,\n explanation:\n `The \\`class\\` differs between server and client${detail}. A class was ` +\n 'applied conditionally on the client — commonly a viewport, media-query, ' +\n 'theme, or feature-flag check that runs during the first render.',\n suggestion:\n 'Render the same className on the server and the first client paint. ' +\n 'Move client-only conditions into `useEffect`/a mounted flag, or drive ' +\n 'the visual change with CSS media queries instead of a JS class toggle.',\n docsUrl: docs('attribute-mismatch'),\n };\n }\n\n if (attr === 'style') {\n return {\n category: 'attribute-mismatch',\n confidence: 0.75,\n explanation:\n 'The inline `style` differs between server and client — an inline ' +\n 'style was computed from client-only state (viewport size, theme, ' +\n 'scroll position) during render.',\n suggestion:\n 'Compute the style after mount (`useEffect`) so the first client render ' +\n 'matches the server, or move it to a CSS class / media query.',\n docsUrl: docs('attribute-mismatch'),\n };\n }\n\n return {\n category: 'attribute-mismatch',\n confidence: 0.6,\n explanation:\n `The \\`${d.attribute}\\` attribute differs between server (\\`${server}\\`) ` +\n `and client (\\`${client}\\`) — its value was derived from something that ` +\n 'differs between the server and the first client render.',\n suggestion:\n 'Make the attribute deterministic across server and client, or set it ' +\n 'after mount so the first client render matches the server HTML.',\n docsUrl: docs('attribute-mismatch'),\n };\n};\n\nexport const BUILT_IN_RULES: readonly Classifier[] = [\n nonDeterministic,\n dateTime,\n localeFormat,\n // Third-party runs before browser-only/viewport so an injected iframe is\n // labelled correctly instead of \"browser-only API\" or \"viewport branching\".\n thirdPartyDomMutation,\n browserOnlyApi,\n viewportBranching,\n invalidNesting,\n whitespaceMinification,\n // Catch-all for class/style/generic attribute diffs — after the specific\n // rules so extension attributes and content values are handled first.\n attributeMismatch,\n];\n\nexport const UNKNOWN_CAUSE: Cause = {\n category: 'unknown',\n confidence: 0,\n explanation:\n 'A hydration mismatch was detected but could not be matched to a known ' +\n 'cause. Inspect the server vs client values above.',\n suggestion:\n 'Compare the server and client values. Common causes are ' +\n 'non-deterministic values, dates/locales, and browser-only APIs used ' +\n 'during render.',\n docsUrl: docs('unknown'),\n};\n","import type { Cause, Classifier, Divergence } from '../types';\nimport { BUILT_IN_RULES, UNKNOWN_CAUSE } from './rules';\n\nexport const CONFIDENCE_THRESHOLD = 0.5;\n\nexport interface ClassifyOptions {\n extra?: readonly Classifier[];\n threshold?: number;\n}\n\nexport function classify(\n divergence: Divergence,\n options: ClassifyOptions = {},\n): Cause {\n const threshold = options.threshold ?? CONFIDENCE_THRESHOLD;\n const rules: readonly Classifier[] = [\n ...(options.extra ?? []),\n ...BUILT_IN_RULES,\n ];\n\n for (const rule of rules) {\n let result: Cause | null = null;\n try {\n result = rule(divergence);\n } catch {\n result = null;\n }\n if (result && result.confidence >= threshold) {\n return result;\n }\n }\n return UNKNOWN_CAUSE;\n}\n\nexport { BUILT_IN_RULES, UNKNOWN_CAUSE } from './rules';\n","import { classify, type ClassifyOptions } from './classify';\nimport type {\n Cause,\n DetectionContext,\n Divergence,\n HydrationReport,\n} from './types';\n\nexport type ReportSink = (report: HydrationReport) => void;\n\nlet counter = 0;\n\nfunction nextId(): string {\n counter += 1;\n return `wh_${Date.now().toString(36)}_${counter}`;\n}\n\nfunction truncate(value: string | null, max = 300): string | null {\n if (value == null) return null;\n if (value.length <= max) return value;\n // Never cut between the halves of a surrogate pair. A lone surrogate is not\n // valid text: it renders as a replacement character in the overlay and can\n // break JSON round-tripping in a user's `onReport` sink. Arabic itself is\n // BMP, but emoji in product copy is not.\n const last = value.charCodeAt(max - 1);\n const end = last >= 0xd800 && last <= 0xdbff ? max - 1 : max;\n return `${value.slice(0, end)}…`;\n}\n\nexport function buildReport(\n divergence: Divergence,\n cause: Cause,\n context: DetectionContext = {},\n): HydrationReport {\n return {\n id: nextId(),\n timestamp: Date.now(),\n component: context.component,\n componentStack: context.componentStack,\n location: context.location,\n node: {\n path: divergence.path,\n tagName: divergence.tagName,\n attribute: divergence.attribute,\n kind: divergence.kind,\n },\n server: truncate(divergence.server),\n client: truncate(divergence.client),\n cause,\n raw: context.reactMessage\n ? { reactMessage: context.reactMessage }\n : undefined,\n };\n}\n\n// Deduplicate by the *values* of the mismatch, not the DOM path. The same\n// mismatch is often reported twice — once from React's console message (path\n// `body`) and once from the DOM diff (a precise selector path) — and those must\n// collapse into one report.\nexport function signatureOf(report: HydrationReport): string {\n return [\n report.node.kind,\n report.node.attribute ?? '',\n report.cause.category,\n report.server ?? '',\n report.client ?? '',\n ].join('|');\n}\n\nexport interface CollectorOptions extends ClassifyOptions {\n maxReports?: number;\n ignore?: (divergence: Divergence) => boolean;\n}\n\nexport class ReportCollector {\n private readonly seen = new Set<string>();\n private readonly sinks = new Set<ReportSink>();\n private readonly reports: HydrationReport[] = [];\n private readonly maxReports: number;\n private readonly options: CollectorOptions;\n\n constructor(options: CollectorOptions = {}) {\n this.options = options;\n this.maxReports = options.maxReports ?? 25;\n }\n\n /**\n * Register a sink. Pass `replay` for sinks that render *state* (the overlay)\n * rather than react to *events* (`onReport`, the console): they need the\n * reports collected before they were attached, which matters when a sink is\n * re-attached after a stop/start cycle.\n */\n addSink(sink: ReportSink, options: { replay?: boolean } = {}): () => void {\n this.sinks.add(sink);\n if (options.replay) {\n for (const report of this.reports) this.emit(sink, report);\n }\n return () => this.sinks.delete(sink);\n }\n\n private emit(sink: ReportSink, report: HydrationReport): void {\n try {\n sink(report);\n } catch {\n /* a failing sink must not stop the others */\n }\n }\n\n getReports(): readonly HydrationReport[] {\n return this.reports;\n }\n\n get isFull(): boolean {\n return this.reports.length >= this.maxReports;\n }\n\n report(\n divergence: Divergence,\n context: DetectionContext = {},\n ): HydrationReport | null {\n if (this.isFull) return null;\n if (this.options.ignore?.(divergence)) return null;\n\n const cause = classify(divergence, {\n extra: this.options.extra,\n threshold: this.options.threshold,\n });\n const report = buildReport(divergence, cause, context);\n const signature = signatureOf(report);\n if (this.seen.has(signature)) return null;\n\n this.seen.add(signature);\n this.reports.push(report);\n for (const sink of this.sinks) this.emit(sink, report);\n return report;\n }\n\n reset(): void {\n this.seen.clear();\n this.reports.length = 0;\n }\n}\n","import type { Divergence } from './types';\n\nexport function isHydrationMessage(message: string): boolean {\n return (\n /hydrat/i.test(message) ||\n /did(?:n't| not) match/i.test(message) ||\n /won't be patched up/i.test(message) ||\n /hydration-mismatch/i.test(message) ||\n /server (?:HTML|rendered)/i.test(message) ||\n /validateDOMNesting/i.test(message) ||\n /Text content does not match/i.test(message)\n );\n}\n\nfunction stringify(v: unknown): string {\n return typeof v === 'string' ? v : String(v);\n}\n\nexport function formatConsoleArgs(args: readonly unknown[]): string {\n if (args.length === 0) return '';\n const [first, ...rest] = args;\n if (typeof first === 'string' && /%[sco]/.test(first)) {\n let i = 0;\n const expanded = first.replace(/%[sco]/g, () => stringify(rest[i++] ?? ''));\n const leftover = rest.slice(i).map(stringify).filter(Boolean);\n return [expanded, ...leftover].join('\\n').trim();\n }\n return args.map(stringify).join(' ');\n}\n\n// Next.js / React internal components we never want to name as the culprit.\nfunction isInternalComponent(name: string): boolean {\n return (\n /^(Inner|Outer|Segment|Client|Server|Redirect|Error|Loading|HTTPAccess|RenderFrom|ScrollAndFocus|Metadata|Outlet|ViewTransition|NotFound|Hot|DevRoot|App)$/.test(\n name,\n ) ||\n /^(Inner|Outer|Segment|Client|Server|Redirect|Error|Loading|HTTPAccess|RenderFrom|ScrollAndFocus|Metadata|Outlet|ViewTransition|NotFound|Hot|DevRoot)[A-Z]/.test(\n name,\n ) ||\n /(Boundary|Router|Handler|Provider|Context|Root|Node)$/.test(name) ||\n name === 'Fragment' ||\n name === 'Suspense'\n );\n}\n\n/** The nearest user component named in a React hydration diff tree. */\nexport function extractComponentFromMessage(\n message: string,\n): string | undefined {\n const names: string[] = [];\n const re = /<([A-Z][A-Za-z0-9_]*)\\b/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(message)) !== null) {\n const name = m[1];\n if (name && !isInternalComponent(name)) names.push(name);\n }\n return names.length ? names[names.length - 1] : undefined;\n}\n\nconst ATTR_RE = /^([\\w:-]+)=(?:\"([\\s\\S]*)\"|\\{([\\s\\S]*)\\})$/;\n\n/**\n * Modern React (18.3+/19) prints hydration mismatches as a JSX diff tree with\n * `+` (client) and `-` (server) lines. This extracts the changed attribute or\n * text and both values.\n */\nfunction parseModernDiff(message: string): Divergence | null {\n const plus: string[] = [];\n const minus: string[] = [];\n for (const raw of message.split('\\n')) {\n const line = raw.trim();\n const p = /^\\+\\s+(.+)$/.exec(line);\n const mn = /^-\\s+(.+)$/.exec(line);\n if (p && p[1]) plus.push(p[1].trim());\n else if (mn && mn[1]) minus.push(mn[1].trim());\n }\n if (plus.length === 0 && minus.length === 0) return null;\n\n // Prefer a matching attribute pair (same attribute on + and -).\n for (const p of plus) {\n const pm = ATTR_RE.exec(p);\n if (!pm) continue;\n const name = pm[1];\n const clientValue = pm[2] ?? pm[3] ?? '';\n const matched = minus.find((mm) => {\n const parsed = ATTR_RE.exec(mm);\n return parsed && parsed[1] === name;\n });\n if (matched) {\n const parsed = ATTR_RE.exec(matched);\n const serverValue = parsed ? (parsed[2] ?? parsed[3] ?? '') : '';\n return {\n kind: 'attribute',\n path: 'body',\n attribute: name,\n server: serverValue,\n client: clientValue,\n reactMessage: message,\n };\n }\n }\n\n // Otherwise a text/content change: pick the non-attribute lines.\n const client = plus.find((p) => !ATTR_RE.test(p)) ?? null;\n const server = minus.find((m) => !ATTR_RE.test(m)) ?? null;\n if (client !== null || server !== null) {\n return {\n kind: 'text',\n path: 'body',\n server,\n client,\n reactMessage: message,\n };\n }\n return null;\n}\n\nexport function parseHydrationMessage(message: string): Divergence | null {\n if (!isHydrationMessage(message)) return null;\n\n // Invalid nesting is reported as its own message in every React version.\n const nesting =\n /<(\\w+)>\\s*cannot (?:appear as a|be a|contain a) (?:child|descendant)/i.exec(\n message,\n );\n if (nesting || /validateDOMNesting/i.test(message)) {\n const pair =\n /<(\\w+)>\\s*cannot (?:appear as a|be a) (?:child|descendant) of <?(\\w+)>?/i.exec(\n message,\n );\n return {\n kind: 'structure',\n path: 'body',\n tagName: pair ? pair[1]?.toUpperCase() : undefined,\n parentTagName: pair ? pair[2]?.toUpperCase() : undefined,\n server: null,\n client: null,\n reactMessage: message,\n };\n }\n\n // Modern diff-tree format (React 18.3+/19).\n const modern = parseModernDiff(message);\n if (modern) return modern;\n\n // Legacy explicit formats (React <18.3).\n const text =\n /Text content (?:did not match|does not match)[^:]*Server:\\s*\"?(.*?)\"?\\s+Client:\\s*\"?(.*?)\"?\\s*$/i.exec(\n message,\n );\n if (text) {\n return {\n kind: 'text',\n path: 'body',\n server: text[1] ?? null,\n client: text[2] ?? null,\n reactMessage: message,\n };\n }\n\n const prop =\n /Prop [`'\"]([^`'\"]+)[`'\"] did not match\\.?\\s*Server:\\s*\"?(.*?)\"?\\s+Client:\\s*\"?(.*?)\"?\\s*$/i.exec(\n message,\n );\n if (prop) {\n return {\n kind: 'attribute',\n path: 'body',\n attribute: prop[1],\n server: prop[2] ?? null,\n client: prop[3] ?? null,\n reactMessage: message,\n };\n }\n\n const expected =\n /Expected server HTML to contain a matching <(\\w+)>(?: in <(\\w+)>)?/i.exec(\n message,\n );\n if (expected) {\n return {\n kind: 'node-added',\n path: 'body',\n tagName: expected[1]?.toUpperCase(),\n parentTagName: expected[2]?.toUpperCase(),\n server: null,\n client: `<${expected[1]?.toLowerCase()}>`,\n reactMessage: message,\n };\n }\n const notExpected =\n /Did not expect server HTML to contain(?: the text node)?(?: a)? <?(\\w+)>?/i.exec(\n message,\n );\n if (notExpected) {\n return {\n kind: 'node-removed',\n path: 'body',\n tagName: notExpected[1]?.toUpperCase(),\n server: `<${notExpected[1]?.toLowerCase()}>`,\n client: null,\n reactMessage: message,\n };\n }\n\n return {\n kind: 'structure',\n path: 'body',\n server: null,\n client: null,\n reactMessage: message,\n };\n}\n\n/**\n * Extract EVERY divergence a single React hydration message describes. A modern\n * diff tree can list several changed attributes/text nodes at once; class/style\n * mismatches are only visible here (React doesn't patch attributes into the DOM),\n * so we must not stop at the first.\n */\nexport function parseAllHydrationDivergences(message: string): Divergence[] {\n if (!isHydrationMessage(message)) return [];\n\n const fallback = (): Divergence[] => {\n const single = parseHydrationMessage(message);\n return single ? [single] : [];\n };\n\n const plus: string[] = [];\n const minus: string[] = [];\n for (const raw of message.split('\\n')) {\n const line = raw.trim();\n const p = /^\\+\\s+(.+)$/.exec(line);\n const mn = /^-\\s+(.+)$/.exec(line);\n if (p && p[1]) plus.push(p[1].trim());\n else if (mn && mn[1]) minus.push(mn[1].trim());\n }\n if (plus.length === 0 && minus.length === 0) return fallback();\n\n const out: Divergence[] = [];\n const attrPlus = plus.filter((p) => ATTR_RE.test(p));\n const attrMinus = minus.filter((m) => ATTR_RE.test(m));\n const usedMinus = new Set<number>();\n\n const attribute = (\n name: string,\n server: string | null,\n client: string | null,\n ): Divergence => ({\n kind: 'attribute',\n path: 'body',\n attribute: name,\n server,\n client,\n reactMessage: message,\n });\n\n for (const line of attrPlus) {\n const name = attrName(line);\n if (!name) continue;\n const idx = attrMinus.findIndex(\n (m, k) => !usedMinus.has(k) && attrName(m) === name,\n );\n if (idx >= 0) usedMinus.add(idx);\n // No `-` counterpart means the server never rendered the attribute at all.\n const server = idx >= 0 ? attrValue(attrMinus[idx]!) : null;\n out.push(attribute(name, server, attrValue(line)));\n }\n\n // `-` lines left unpaired: the attribute exists only in the server HTML.\n // Without this they would be dropped entirely — the text pass below filters\n // attribute lines out, so nothing else would ever report them.\n attrMinus.forEach((line, k) => {\n if (usedMinus.has(k)) return;\n const name = attrName(line);\n if (name) out.push(attribute(name, attrValue(line), null));\n });\n\n const textPlus = plus.filter((p) => !ATTR_RE.test(p));\n const textMinus = minus.filter((m) => !ATTR_RE.test(m));\n const len = Math.max(textPlus.length, textMinus.length);\n for (let i = 0; i < len; i++) {\n const client = textPlus[i] ?? null;\n const server = textMinus[i] ?? null;\n if (client !== null || server !== null) {\n out.push({\n kind: 'text',\n path: 'body',\n server,\n client,\n reactMessage: message,\n });\n }\n }\n\n return out.length ? out : fallback();\n}\n\nfunction attrName(line: string): string | undefined {\n return ATTR_RE.exec(line)?.[1];\n}\n\nfunction attrValue(line: string): string {\n const parsed = ATTR_RE.exec(line);\n return parsed ? (parsed[2] ?? parsed[3] ?? '') : '';\n}\n","import { collectDivergences, parseServerHtml } from './diff';\nimport {\n extractComponentFromMessage,\n parseAllHydrationDivergences,\n} from './react-message';\nimport { getServerHtmlForRoot } from './snapshot';\nimport type { DetectionContext, Divergence } from './types';\nimport type { ReportCollector } from './report';\n\n// Diff the server snapshot against a live root and report EVERY divergence\n// (deduped by value in the collector). Returns how many new reports were made.\n//\n// A divergence found here is classified purely on its own shape. React's\n// console message describes ONE node, so copying it onto every node the diff\n// finds would let an unrelated warning (say a `validateDOMNesting` complaint\n// elsewhere on the page) drive their classification.\nexport function inspectRoot(\n root: Element,\n collector: ReportCollector,\n context: DetectionContext = {},\n enrich?: (divergence: Divergence) => DetectionContext,\n): number {\n const serverHtml = getServerHtmlForRoot(root);\n if (serverHtml == null) return 0;\n const divergences = collectDivergences(serverTreeFor(root, serverHtml), root);\n let reported = 0;\n for (const divergence of divergences) {\n const enriched = enrich ? enrich(divergence) : {};\n if (collector.report(divergence, { ...context, ...enriched }) != null) {\n reported += 1;\n }\n }\n return reported;\n}\n\n/**\n * Re-materialising the captured markup is the expensive half of a diff pass —\n * it is a full HTML parse of the server render — and the settling window runs\n * several passes against markup that by definition never changes. Cache the\n * parsed tree per root; the diff only ever reads it, so one detached copy can\n * serve every pass instead of allocating (and discarding) one each time.\n *\n * Keyed on the HTML too, so a re-captured snapshot re-parses rather than\n * silently diffing against stale markup. The WeakMap lets a root that leaves\n * the document take its parsed tree with it.\n */\nconst serverTrees = new WeakMap<Element, { html: string; tree: Element }>();\n\nfunction serverTreeFor(root: Element, html: string): Element {\n const cached = serverTrees.get(root);\n if (cached && cached.html === html) return cached.tree;\n const tree = parseServerHtml(html, root.tagName);\n serverTrees.set(root, { html, tree });\n return tree;\n}\n\n// Report every divergence a React hydration message describes. Deduped by value\n// in the collector, so it's safe to call alongside the DOM diff and repeatedly.\nexport function reportFromMessage(\n message: string,\n collector: ReportCollector,\n context: DetectionContext = {},\n): number {\n const divergences = parseAllHydrationDivergences(message);\n const component = extractComponentFromMessage(message) ?? context.component;\n let reported = 0;\n for (const divergence of divergences) {\n if (\n collector.report(divergence, {\n ...context,\n component,\n reactMessage: message,\n }) != null\n ) {\n reported += 1;\n }\n }\n return reported;\n}\n"]}