why-hydration 0.1.3 → 0.1.5

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/overlay.ts","../src/react/fiber.ts","../src/react/controller.ts","../src/react/inspector.tsx","../src/react/index.tsx"],"names":["formatConsoleArgs","isHydrationMessage","isDev","ReportCollector","inspectRoot","reportFromMessage","readSnapshot","DEFAULT_SNAPSHOT_SELECTORS","React","React2"],"mappings":"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","file":"chunk-MTAU6G26.cjs","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.bind(console) as ErrorFn;\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 original(...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 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 { all: initial; }\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}\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 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 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 }\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 { DEFAULT_SNAPSHOT_SELECTORS, readSnapshot } from '../core/snapshot';\nimport { isDev } from '../core/env';\nimport type {\n Classifier,\n DetectionContext,\n Divergence,\n HydrationReport,\n} from '../core/types';\nimport { createConsoleReporter, installConsoleInterceptor } from './console';\nimport { createOverlay, type OverlayOptions } from './overlay';\nimport { resolveReactSource } from './fiber';\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 settlingTimers: Array<ReturnType<typeof setTimeout>> = [];\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 this.pendingContext = {};\n this.messages.clear();\n\n if (this.options.onReport) {\n this.collector.addSink(this.options.onReport);\n }\n 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 this.collector.addSink(handle.push);\n this.cleanups.push(() => handle.destroy());\n }\n\n const restore = installConsoleInterceptor((message) => {\n this.messages.add(message);\n this.mergeContext({ reactMessage: message });\n this.scheduleInspect();\n });\n this.cleanups.push(restore);\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.messages.add(message);\n this.mergeContext({\n componentStack: info?.componentStack,\n component: firstComponentFromStack(info?.componentStack),\n reactMessage: message,\n });\n this.scheduleInspect();\n };\n\n private mergeContext(ctx: DetectionContext): void {\n this.pendingContext = {\n componentStack: this.pendingContext.componentStack ?? ctx.componentStack,\n component: this.pendingContext.component ?? ctx.component,\n location: this.pendingContext.location ?? ctx.location,\n reactMessage: this.pendingContext.reactMessage ?? ctx.reactMessage,\n };\n }\n\n stop(): void {\n for (const timer of this.settlingTimers.splice(0)) clearTimeout(timer);\n for (const cleanup of this.cleanups.splice(0)) cleanup();\n this.messages.clear();\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 selectors = this.options.roots ?? snapshotSelectors();\n const seen = new Set<Element>();\n for (const selector of selectors) {\n const root = document.querySelector(selector);\n if (!root || seen.has(root)) continue;\n seen.add(root);\n inspectRoot(root, this.collector, this.pendingContext, (divergence) =>\n resolveReactSource(divergence.element ?? null),\n );\n }\n\n // 2) React's own messages — the ONLY source for class/style mismatches\n // (React doesn't patch attributes into the DOM) and for cases with no\n // snapshot. Value-based dedup means this never double-reports a mismatch\n // the DOM diff already found.\n for (const message of this.messages) {\n reportFromMessage(message, this.collector, this.pendingContext);\n }\n }\n\n private scheduleInspect(): void {\n const run = () => this.inspectAllRoots();\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(run);\n } else {\n Promise.resolve().then(run);\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 { InspectorController } 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 const controllerRef = React.useRef<InspectorController | null>(null);\n if (controllerRef.current === null) {\n controllerRef.current = new InspectorController({\n overlay,\n onReport,\n ignore,\n classify,\n maxReports,\n });\n controllerRef.current.start();\n }\n\n React.useEffect(() => {\n const controller = controllerRef.current;\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: {\n children?: React.ReactNode;\n }): React.ReactElement {\n React.useEffect(() => () => controller.stop(), []);\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/react/console.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-NQX4TBV5.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.bind(console) as ErrorFn;\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 original(...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 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 { all: initial; }\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}\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 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 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 }\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 { DEFAULT_SNAPSHOT_SELECTORS, readSnapshot } from '../core/snapshot';\nimport { isDev } from '../core/env';\nimport type {\n Classifier,\n DetectionContext,\n Divergence,\n HydrationReport,\n} from '../core/types';\nimport { createConsoleReporter, installConsoleInterceptor } from './console';\nimport { createOverlay, type OverlayOptions } from './overlay';\nimport { resolveReactSource } from './fiber';\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 settlingTimers: Array<ReturnType<typeof setTimeout>> = [];\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 this.pendingContext = {};\n this.messages.clear();\n\n if (this.options.onReport) {\n this.collector.addSink(this.options.onReport);\n }\n 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 this.collector.addSink(handle.push);\n this.cleanups.push(() => handle.destroy());\n }\n\n const restore = installConsoleInterceptor((message) => {\n this.messages.add(message);\n this.mergeContext({ reactMessage: message });\n this.scheduleInspect();\n });\n this.cleanups.push(restore);\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.messages.add(message);\n this.mergeContext({\n componentStack: info?.componentStack,\n component: firstComponentFromStack(info?.componentStack),\n reactMessage: message,\n });\n this.scheduleInspect();\n };\n\n private mergeContext(ctx: DetectionContext): void {\n this.pendingContext = {\n componentStack: this.pendingContext.componentStack ?? ctx.componentStack,\n component: this.pendingContext.component ?? ctx.component,\n location: this.pendingContext.location ?? ctx.location,\n reactMessage: this.pendingContext.reactMessage ?? ctx.reactMessage,\n };\n }\n\n stop(): void {\n for (const timer of this.settlingTimers.splice(0)) clearTimeout(timer);\n for (const cleanup of this.cleanups.splice(0)) cleanup();\n this.messages.clear();\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 selectors = this.options.roots ?? snapshotSelectors();\n const seen = new Set<Element>();\n for (const selector of selectors) {\n const root = document.querySelector(selector);\n if (!root || seen.has(root)) continue;\n seen.add(root);\n inspectRoot(root, this.collector, this.pendingContext, (divergence) =>\n resolveReactSource(divergence.element ?? null),\n );\n }\n\n // 2) React's own messages — the ONLY source for class/style mismatches\n // (React doesn't patch attributes into the DOM) and for cases with no\n // snapshot. Value-based dedup means this never double-reports a mismatch\n // the DOM diff already found.\n for (const message of this.messages) {\n reportFromMessage(message, this.collector, this.pendingContext);\n }\n }\n\n private scheduleInspect(): void {\n const run = () => this.inspectAllRoots();\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(run);\n } else {\n Promise.resolve().then(run);\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 { InspectorController } 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 const controllerRef = React.useRef<InspectorController | null>(null);\n if (controllerRef.current === null) {\n controllerRef.current = new InspectorController({\n overlay,\n onReport,\n ignore,\n classify,\n maxReports,\n });\n controllerRef.current.start();\n }\n\n React.useEffect(() => {\n const controller = controllerRef.current;\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: {\n children?: React.ReactNode;\n }): React.ReactElement {\n React.useEffect(() => () => controller.stop(), []);\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/snapshot.ts"],"names":[],"mappings":";;;AAAO,IAAM,0BAAA,GAA6B,CAAC,OAAA,EAAS,SAAA,EAAW,MAAM;AAE9D,IAAM,YAAA,GAAe;AAcrB,SAAS,uBAAA,CACd,YAA+B,0BAAA,EACvB;AACR,EAAA,MAAM,aAAa,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA,CAAE,OAAA,CAAQ,MAAM,SAAS,CAAA;AACpE,EAAA,OAAO,qBAAqB,IAAA,CAAK,SAAA,CAAU,YAAY,CAAC,2DAA2D,UAAU,CAAA,8YAAA,CAAA;AAC/H;AAEO,SAAS,YAAA,GAAqC;AACnD,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,MAAA;AAC1C,EAAA,OAAO,OAAO,YAAY,CAAA;AAC5B;AAEO,SAAS,qBAAqB,IAAA,EAAmC;AACtE,EAAA,MAAM,WAAW,YAAA,EAAa;AAC9B,EAAA,IAAI,CAAC,UAAU,OAAO,MAAA;AACtB,EAAA,KAAA,MAAW,QAAA,IAAY,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,EAAG;AAClD,IAAA,IAAI;AACF,MAAA,IAAI,IAAA,CAAK,QAAQ,QAAQ,CAAA,IAAK,SAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA,EAAG;AACvE,QAAA,OAAO,QAAA,CAAS,MAAM,QAAQ,CAAA;AAAA,MAChC;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,kBAAA,CACd,YAA+B,0BAAA,EACT;AACtB,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,aAAa,WAAA,EAAa;AACpE,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,MAAA,CAAO,YAAY,CAAA,EAAG,OAAO,OAAO,YAAY,CAAA;AACpD,EAAA,MAAM,QAAgC,EAAC;AACvC,EAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC1C,IAAA,IAAI,EAAA,EAAI,KAAA,CAAM,QAAQ,CAAA,GAAI,EAAA,CAAG,SAAA;AAAA,EAC/B;AACA,EAAA,MAAM,QAAA,GAAqB,EAAE,OAAA,EAAS,CAAA,EAAG,YAAY,IAAA,CAAK,GAAA,IAAO,KAAA,EAAM;AACvE,EAAA,MAAA,CAAO,YAAY,CAAA,GAAI,QAAA;AACvB,EAAA,OAAO,QAAA;AACT","file":"chunk-OGQEPU7G.cjs","sourcesContent":["export const DEFAULT_SNAPSHOT_SELECTORS = ['#root', '#__next', 'body'];\n\nexport const SNAPSHOT_KEY = '__WHY_HYDRATION_SNAPSHOT__';\n\nexport interface Snapshot {\n version: 1;\n capturedAt: number;\n roots: Record<string, string>;\n}\n\ndeclare global {\n interface Window {\n [SNAPSHOT_KEY]?: Snapshot;\n }\n}\n\nexport function getSnapshotScriptSource(\n selectors: readonly string[] = DEFAULT_SNAPSHOT_SELECTORS,\n): string {\n const serialized = JSON.stringify(selectors).replace(/</g, '\\\\u003c');\n return `(function(){var K=${JSON.stringify(SNAPSHOT_KEY)};if(typeof window===\"undefined\"||window[K])return;var S=${serialized};function cap(){if(window[K])return;var r={};for(var i=0;i<S.length;i++){var el=document.querySelector(S[i]);if(el)r[S[i]]=el.innerHTML;}window[K]={version:1,capturedAt:Date.now(),roots:r};}if(document.readyState!==\"loading\"){cap();}else{document.addEventListener(\"readystatechange\",function(){if(document.readyState===\"interactive\")cap();});document.addEventListener(\"DOMContentLoaded\",cap);}})();`;\n}\n\nexport function readSnapshot(): Snapshot | undefined {\n if (typeof window === 'undefined') return undefined;\n return window[SNAPSHOT_KEY];\n}\n\nexport function getServerHtmlForRoot(root: Element): string | undefined {\n const snapshot = readSnapshot();\n if (!snapshot) return undefined;\n for (const selector of Object.keys(snapshot.roots)) {\n try {\n if (root.matches(selector) || root === document.querySelector(selector)) {\n return snapshot.roots[selector];\n }\n } catch {\n /* invalid selector */\n }\n }\n return undefined;\n}\n\nexport function captureSnapshotNow(\n selectors: readonly string[] = DEFAULT_SNAPSHOT_SELECTORS,\n): Snapshot | undefined {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return undefined;\n }\n if (window[SNAPSHOT_KEY]) return window[SNAPSHOT_KEY];\n const roots: Record<string, string> = {};\n for (const selector of selectors) {\n const el = document.querySelector(selector);\n if (el) roots[selector] = el.innerHTML;\n }\n const snapshot: Snapshot = { version: 1, capturedAt: Date.now(), roots };\n window[SNAPSHOT_KEY] = snapshot;\n return snapshot;\n}\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-WQLUD25W.js","sourcesContent":["export const isDev: boolean =\n typeof process !== 'undefined' &&\n process.env != null &&\n process.env.NODE_ENV !== 'production';\n","import type { Divergence } from './types';\n\nconst IGNORED_ATTRIBUTES = new Set<string>(['data-reactroot']);\n\nexport function parseServerHtml(html: string, rootTagName: string): Element {\n const container = document.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\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(value.trim());\n}\n\nexport function toTimestamp(value: string): number | null {\n const v = value.trim();\n if (!v) return null;\n if (/^\\d{10,13}$/.test(v)) {\n const n = Number(v);\n return v.length === 10 ? n * 1000 : n;\n }\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 = a.trim();\n const bt = 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 return (hasSep(at) || hasSep(bt)) && at !== bt;\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\nexport function isSameDateDifferentOrder(a: string, b: string): boolean {\n const partsA = a.trim().match(/^(\\d{1,4})[/.-](\\d{1,2})[/.-](\\d{1,4})$/);\n const partsB = b.trim().match(/^(\\d{1,4})[/.-](\\d{1,2})[/.-](\\d{1,4})$/);\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 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 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 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 const atRoot = /^(html|body)\\b/.test(d.path) && d.server == null;\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 return value.length > max ? `${value.slice(0, max)}…` : value;\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 addSink(sink: ReportSink): () => void {\n this.sinks.add(sink);\n return () => this.sinks.delete(sink);\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) {\n try {\n sink(report);\n } catch {\n /* a failing sink must not stop the others */\n }\n }\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 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) {\n const single = parseHydrationMessage(message);\n return single ? [single] : [];\n }\n\n const out: Divergence[] = [];\n const attrMinus = minus.filter((m) => ATTR_RE.test(m));\n const usedMinus = new Set<number>();\n\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 idx = attrMinus.findIndex((m, k) => {\n if (usedMinus.has(k)) return false;\n const parsed = ATTR_RE.exec(m);\n return parsed?.[1] === name;\n });\n if (idx >= 0) {\n usedMinus.add(idx);\n const parsed = ATTR_RE.exec(attrMinus[idx]!);\n out.push({\n kind: 'attribute',\n path: 'body',\n attribute: name,\n server: parsed ? (parsed[2] ?? parsed[3] ?? '') : '',\n client: clientValue,\n reactMessage: message,\n });\n }\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({ kind: 'text', path: 'body', server, client, reactMessage: message });\n }\n }\n\n return out.length ? out : (parseHydrationMessage(message) ? [parseHydrationMessage(message)!] : []);\n}\n","import { collectSnapshotAgainstDom } 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.\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 = collectSnapshotAgainstDom(serverHtml, root);\n let reported = 0;\n for (const divergence of divergences) {\n if (context.reactMessage && !divergence.reactMessage) {\n divergence.reactMessage = context.reactMessage;\n }\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// 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, { ...context, component, reactMessage: message }) !=\n null\n ) {\n reported += 1;\n }\n }\n return reported;\n}\n"]}