why-hydration 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkCDNKC2LD_cjs = require('./chunk-CDNKC2LD.cjs');
3
+ var chunkAN3N7274_cjs = require('./chunk-AN3N7274.cjs');
4
4
  var chunkOGQEPU7G_cjs = require('./chunk-OGQEPU7G.cjs');
5
5
  var React2 = require('react');
6
6
 
@@ -31,8 +31,8 @@ function installConsoleInterceptor(onMessage) {
31
31
  const original = console.error.bind(console);
32
32
  const patched = (...args) => {
33
33
  try {
34
- const message = chunkCDNKC2LD_cjs.formatConsoleArgs(args);
35
- if (message && chunkCDNKC2LD_cjs.isHydrationMessage(message)) {
34
+ const message = chunkAN3N7274_cjs.formatConsoleArgs(args);
35
+ if (message && chunkAN3N7274_cjs.isHydrationMessage(message)) {
36
36
  onMessage(message, args);
37
37
  }
38
38
  } catch {
@@ -55,7 +55,11 @@ function createConsoleReporter() {
55
55
  console.log("%cServer:%c", "color:#fb7185", "", report.server ?? "(none)");
56
56
  console.log("%cClient:%c", "color:#4ade80", "", report.client ?? "(none)");
57
57
  if (report.component) {
58
- console.log("%cComponent:%c", DIM, "", report.component);
58
+ console.log("%cComponent:%c", DIM, "", `<${report.component}>`);
59
+ }
60
+ if (report.location?.file) {
61
+ const loc = report.location.line ? `${report.location.file}:${report.location.line}` : report.location.file;
62
+ console.log("%cSource:%c", DIM, "", loc);
59
63
  }
60
64
  console.log("%cWhy:%c", DIM, "", report.cause.explanation);
61
65
  console.log("%cFix:%c", "color:#86efac", "", report.cause.suggestion);
@@ -81,6 +85,7 @@ var CATEGORY_LABELS = {
81
85
  "invalid-html-nesting": "Invalid HTML nesting",
82
86
  "whitespace-minification": "Whitespace / minification",
83
87
  "third-party-dom-mutation": "Third-party DOM mutation",
88
+ "attribute-mismatch": "Attribute mismatch",
84
89
  unknown: "Unknown"
85
90
  };
86
91
  var STYLES = `
@@ -132,8 +137,10 @@ var STYLES = `
132
137
  }
133
138
  .wh-conf { margin-left: auto; font-size: 11px; color: #6b7280; }
134
139
  .wh-body { padding: 0 10px 10px; }
135
- .wh-where { font-size: 11px; color: #9ca3af; word-break: break-all; margin-bottom: 8px; }
140
+ .wh-where { font-size: 11px; color: #9ca3af; word-break: break-all; margin-bottom: 4px; }
136
141
  .wh-where code { color: #93c5fd; }
142
+ .wh-comp { color: #f3f4f6; font-weight: 600; }
143
+ .wh-loc { font-size: 11px; color: #7dd3fc; word-break: break-all; margin-bottom: 8px; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; }
137
144
  .wh-diff { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; margin-bottom: 8px; }
138
145
  .wh-side { border-radius: 8px; padding: 6px 8px; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 11px; word-break: break-word; }
139
146
  .wh-server { background: rgba(244,63,94,.08); border: 1px solid rgba(244,63,94,.35); }
@@ -160,6 +167,15 @@ function el(tag, className, text) {
160
167
  if (text != null) node.textContent = text;
161
168
  return node;
162
169
  }
170
+ function shortenPath(file) {
171
+ const normalized = file.replace(/\\/g, "/");
172
+ const marker = normalized.match(/(?:^|\/)(?:src|app|pages|components)\//);
173
+ if (marker && marker.index != null) {
174
+ return normalized.slice(marker.index).replace(/^\//, "");
175
+ }
176
+ const parts = normalized.split("/");
177
+ return parts.slice(-2).join("/");
178
+ }
163
179
  function renderValue(value) {
164
180
  if (value == null || value === "") {
165
181
  return el("span", "wh-empty-value", value === "" ? "(empty)" : "(none)");
@@ -180,8 +196,12 @@ function renderCard(report) {
180
196
  card.appendChild(head);
181
197
  const body = el("div", "wh-body");
182
198
  const where = el("div", "wh-where");
183
- const label = report.component ? `${report.component} \xB7 ` : report.node.tagName ? `<${report.node.tagName.toLowerCase()}> \xB7 ` : "";
184
- where.append(label);
199
+ if (report.component) {
200
+ where.appendChild(el("strong", "wh-comp", `<${report.component}>`));
201
+ where.append(" \xB7 ");
202
+ } else if (report.node.tagName) {
203
+ where.append(`<${report.node.tagName.toLowerCase()}> \xB7 `);
204
+ }
185
205
  const code = el("code");
186
206
  code.textContent = report.node.path;
187
207
  where.appendChild(code);
@@ -189,6 +209,12 @@ function renderCard(report) {
189
209
  where.append(` \xB7 @${report.node.attribute}`);
190
210
  }
191
211
  body.appendChild(where);
212
+ if (report.location?.file) {
213
+ const loc = el("div", "wh-loc");
214
+ const file = shortenPath(report.location.file);
215
+ loc.textContent = report.location.line ? `${file}:${report.location.line}` : file;
216
+ body.appendChild(loc);
217
+ }
192
218
  const diff = el("div", "wh-diff");
193
219
  const server = el("div", "wh-side wh-server");
194
220
  server.appendChild(el("span", "wh-label", "Server"));
@@ -269,6 +295,61 @@ function createOverlay(options = {}) {
269
295
  return { push, destroy };
270
296
  }
271
297
 
298
+ // src/react/fiber.ts
299
+ function getFiber(node) {
300
+ for (const key in node) {
301
+ if (key.startsWith("__reactFiber$") || key.startsWith("__reactInternalInstance$")) {
302
+ return node[key] ?? null;
303
+ }
304
+ }
305
+ return null;
306
+ }
307
+ function componentName(type) {
308
+ if (!type || typeof type === "string") return void 0;
309
+ if (typeof type === "function") {
310
+ const fn = type;
311
+ return fn.displayName || fn.name || void 0;
312
+ }
313
+ if (typeof type === "object") {
314
+ const obj = type;
315
+ if (obj.displayName) return obj.displayName;
316
+ if (obj.render) return obj.render.displayName || obj.render.name;
317
+ if (obj.type) return componentName(obj.type);
318
+ }
319
+ return void 0;
320
+ }
321
+ function resolveReactSource(node) {
322
+ if (!node) return {};
323
+ try {
324
+ let fiber = getFiber(node);
325
+ let component;
326
+ let location;
327
+ let hops = 0;
328
+ while (fiber && hops < 80) {
329
+ if (!component) {
330
+ const name = componentName(fiber.type);
331
+ if (name && !/^[a-z]/.test(name)) component = name;
332
+ }
333
+ if (!location && fiber._debugSource?.fileName) {
334
+ location = {
335
+ file: fiber._debugSource.fileName,
336
+ line: fiber._debugSource.lineNumber,
337
+ column: fiber._debugSource.columnNumber
338
+ };
339
+ }
340
+ if (component && location) break;
341
+ fiber = fiber.return ?? null;
342
+ hops += 1;
343
+ }
344
+ const result = {};
345
+ if (component) result.component = component;
346
+ if (location) result.location = location;
347
+ return result;
348
+ } catch {
349
+ return {};
350
+ }
351
+ }
352
+
272
353
  // src/react/controller.ts
273
354
  function buildIgnore(ignore) {
274
355
  if (!ignore || ignore.length === 0) return void 0;
@@ -293,8 +374,9 @@ var InspectorController = class {
293
374
  this.started = false;
294
375
  this.pendingContext = {};
295
376
  this.messageReported = false;
377
+ this.settlingTimers = [];
296
378
  this.onRecoverableError = (error, info) => {
297
- if (!chunkCDNKC2LD_cjs.isDev) return;
379
+ if (!chunkAN3N7274_cjs.isDev) return;
298
380
  this.mergeContext({
299
381
  componentStack: info?.componentStack,
300
382
  component: firstComponentFromStack(info?.componentStack),
@@ -303,14 +385,14 @@ var InspectorController = class {
303
385
  this.scheduleInspect();
304
386
  };
305
387
  this.options = options;
306
- this.collector = new chunkCDNKC2LD_cjs.ReportCollector({
388
+ this.collector = new chunkAN3N7274_cjs.ReportCollector({
307
389
  maxReports: options.maxReports,
308
390
  extra: options.classify,
309
391
  ignore: buildIgnore(options.ignore)
310
392
  });
311
393
  }
312
394
  start() {
313
- if (this.started || !chunkCDNKC2LD_cjs.isDev || typeof window === "undefined") return;
395
+ if (this.started || !chunkAN3N7274_cjs.isDev || typeof window === "undefined") return;
314
396
  this.started = true;
315
397
  this.pendingContext = {};
316
398
  this.messageReported = false;
@@ -329,7 +411,19 @@ var InspectorController = class {
329
411
  this.scheduleInspect();
330
412
  });
331
413
  this.cleanups.push(restore);
414
+ this.scheduleSettlingInspections();
415
+ }
416
+ // React applies client values to mismatched subtrees via a client re-render a
417
+ // few hundred ms after the initial hydration commit. We diff once per frame
418
+ // and then across this short "settling window" to catch that, deduped. This
419
+ // is a bounded, one-shot window — NOT a standing observer — so DOM changes
420
+ // from later app state are never mistaken for hydration mismatches.
421
+ scheduleSettlingInspections() {
332
422
  this.scheduleInspect();
423
+ for (const delay of [80, 250, 700, 1500]) {
424
+ const timer = setTimeout(() => this.inspectAllRoots(), delay);
425
+ this.settlingTimers.push(timer);
426
+ }
333
427
  }
334
428
  mergeContext(ctx) {
335
429
  this.pendingContext = {
@@ -340,6 +434,7 @@ var InspectorController = class {
340
434
  };
341
435
  }
342
436
  stop() {
437
+ for (const timer of this.settlingTimers.splice(0)) clearTimeout(timer);
343
438
  for (const cleanup of this.cleanups.splice(0)) cleanup();
344
439
  this.started = false;
345
440
  }
@@ -360,11 +455,16 @@ var InspectorController = class {
360
455
  const root = document.querySelector(selector);
361
456
  if (!root || seen.has(root)) continue;
362
457
  seen.add(root);
363
- chunkCDNKC2LD_cjs.inspectRoot(root, this.collector, this.pendingContext);
458
+ chunkAN3N7274_cjs.inspectRoot(
459
+ root,
460
+ this.collector,
461
+ this.pendingContext,
462
+ (divergence) => resolveReactSource(divergence.element ?? null)
463
+ );
364
464
  }
365
465
  if (this.collector.getReports().length === 0 && this.pendingContext.reactMessage && !this.messageReported) {
366
466
  this.messageReported = true;
367
- chunkCDNKC2LD_cjs.reportFromMessage(
467
+ chunkAN3N7274_cjs.reportFromMessage(
368
468
  this.pendingContext.reactMessage,
369
469
  this.collector,
370
470
  this.pendingContext
@@ -437,5 +537,5 @@ function createHydrationInspector(options = {}) {
437
537
 
438
538
  exports.HydrationInspector = HydrationInspector;
439
539
  exports.createHydrationInspector = createHydrationInspector;
440
- //# sourceMappingURL=chunk-VUGHOMMU.cjs.map
441
- //# sourceMappingURL=chunk-VUGHOMMU.cjs.map
540
+ //# sourceMappingURL=chunk-I45YRDCA.cjs.map
541
+ //# sourceMappingURL=chunk-I45YRDCA.cjs.map
@@ -0,0 +1 @@
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-I45YRDCA.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 { overflow-y: auto; padding: 8px; display: flex; flex-direction: column; gap: 8px; }\n.wh-card { 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@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 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 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 destroy(): void {\n host?.remove();\n host = null;\n listEl = null;\n countEl = 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 }\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 messageReported = false;\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.messageReported = false;\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.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 this.mergeContext({\n componentStack: info?.componentStack,\n component: firstComponentFromStack(info?.componentStack),\n reactMessage: error instanceof Error ? error.message : String(error),\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.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 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 // Message fallback for mismatches the DOM diff can't locate (no snapshot,\n // or invalid nesting the browser silently repaired). Double-reporting with\n // a later precise DOM report is prevented by value-based dedup in the\n // collector (same server/client values collapse regardless of path).\n if (\n this.collector.getReports().length === 0 &&\n this.pendingContext.reactMessage &&\n !this.messageReported\n ) {\n this.messageReported = true;\n reportFromMessage(\n this.pendingContext.reactMessage,\n this.collector,\n this.pendingContext,\n );\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,4 +1,4 @@
1
- import { isDev, ReportCollector, inspectRoot, reportFromMessage, formatConsoleArgs, isHydrationMessage } from './chunk-WJ3ZOW4D.js';
1
+ import { isDev, ReportCollector, inspectRoot, reportFromMessage, formatConsoleArgs, isHydrationMessage } from './chunk-HRNL75RP.js';
2
2
  import { readSnapshot, DEFAULT_SNAPSHOT_SELECTORS } from './chunk-FV3PEJQE.js';
3
3
  import * as React2 from 'react';
4
4
 
@@ -33,7 +33,11 @@ function createConsoleReporter() {
33
33
  console.log("%cServer:%c", "color:#fb7185", "", report.server ?? "(none)");
34
34
  console.log("%cClient:%c", "color:#4ade80", "", report.client ?? "(none)");
35
35
  if (report.component) {
36
- console.log("%cComponent:%c", DIM, "", report.component);
36
+ console.log("%cComponent:%c", DIM, "", `<${report.component}>`);
37
+ }
38
+ if (report.location?.file) {
39
+ const loc = report.location.line ? `${report.location.file}:${report.location.line}` : report.location.file;
40
+ console.log("%cSource:%c", DIM, "", loc);
37
41
  }
38
42
  console.log("%cWhy:%c", DIM, "", report.cause.explanation);
39
43
  console.log("%cFix:%c", "color:#86efac", "", report.cause.suggestion);
@@ -59,6 +63,7 @@ var CATEGORY_LABELS = {
59
63
  "invalid-html-nesting": "Invalid HTML nesting",
60
64
  "whitespace-minification": "Whitespace / minification",
61
65
  "third-party-dom-mutation": "Third-party DOM mutation",
66
+ "attribute-mismatch": "Attribute mismatch",
62
67
  unknown: "Unknown"
63
68
  };
64
69
  var STYLES = `
@@ -110,8 +115,10 @@ var STYLES = `
110
115
  }
111
116
  .wh-conf { margin-left: auto; font-size: 11px; color: #6b7280; }
112
117
  .wh-body { padding: 0 10px 10px; }
113
- .wh-where { font-size: 11px; color: #9ca3af; word-break: break-all; margin-bottom: 8px; }
118
+ .wh-where { font-size: 11px; color: #9ca3af; word-break: break-all; margin-bottom: 4px; }
114
119
  .wh-where code { color: #93c5fd; }
120
+ .wh-comp { color: #f3f4f6; font-weight: 600; }
121
+ .wh-loc { font-size: 11px; color: #7dd3fc; word-break: break-all; margin-bottom: 8px; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; }
115
122
  .wh-diff { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; margin-bottom: 8px; }
116
123
  .wh-side { border-radius: 8px; padding: 6px 8px; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 11px; word-break: break-word; }
117
124
  .wh-server { background: rgba(244,63,94,.08); border: 1px solid rgba(244,63,94,.35); }
@@ -138,6 +145,15 @@ function el(tag, className, text) {
138
145
  if (text != null) node.textContent = text;
139
146
  return node;
140
147
  }
148
+ function shortenPath(file) {
149
+ const normalized = file.replace(/\\/g, "/");
150
+ const marker = normalized.match(/(?:^|\/)(?:src|app|pages|components)\//);
151
+ if (marker && marker.index != null) {
152
+ return normalized.slice(marker.index).replace(/^\//, "");
153
+ }
154
+ const parts = normalized.split("/");
155
+ return parts.slice(-2).join("/");
156
+ }
141
157
  function renderValue(value) {
142
158
  if (value == null || value === "") {
143
159
  return el("span", "wh-empty-value", value === "" ? "(empty)" : "(none)");
@@ -158,8 +174,12 @@ function renderCard(report) {
158
174
  card.appendChild(head);
159
175
  const body = el("div", "wh-body");
160
176
  const where = el("div", "wh-where");
161
- const label = report.component ? `${report.component} \xB7 ` : report.node.tagName ? `<${report.node.tagName.toLowerCase()}> \xB7 ` : "";
162
- where.append(label);
177
+ if (report.component) {
178
+ where.appendChild(el("strong", "wh-comp", `<${report.component}>`));
179
+ where.append(" \xB7 ");
180
+ } else if (report.node.tagName) {
181
+ where.append(`<${report.node.tagName.toLowerCase()}> \xB7 `);
182
+ }
163
183
  const code = el("code");
164
184
  code.textContent = report.node.path;
165
185
  where.appendChild(code);
@@ -167,6 +187,12 @@ function renderCard(report) {
167
187
  where.append(` \xB7 @${report.node.attribute}`);
168
188
  }
169
189
  body.appendChild(where);
190
+ if (report.location?.file) {
191
+ const loc = el("div", "wh-loc");
192
+ const file = shortenPath(report.location.file);
193
+ loc.textContent = report.location.line ? `${file}:${report.location.line}` : file;
194
+ body.appendChild(loc);
195
+ }
170
196
  const diff = el("div", "wh-diff");
171
197
  const server = el("div", "wh-side wh-server");
172
198
  server.appendChild(el("span", "wh-label", "Server"));
@@ -247,6 +273,61 @@ function createOverlay(options = {}) {
247
273
  return { push, destroy };
248
274
  }
249
275
 
276
+ // src/react/fiber.ts
277
+ function getFiber(node) {
278
+ for (const key in node) {
279
+ if (key.startsWith("__reactFiber$") || key.startsWith("__reactInternalInstance$")) {
280
+ return node[key] ?? null;
281
+ }
282
+ }
283
+ return null;
284
+ }
285
+ function componentName(type) {
286
+ if (!type || typeof type === "string") return void 0;
287
+ if (typeof type === "function") {
288
+ const fn = type;
289
+ return fn.displayName || fn.name || void 0;
290
+ }
291
+ if (typeof type === "object") {
292
+ const obj = type;
293
+ if (obj.displayName) return obj.displayName;
294
+ if (obj.render) return obj.render.displayName || obj.render.name;
295
+ if (obj.type) return componentName(obj.type);
296
+ }
297
+ return void 0;
298
+ }
299
+ function resolveReactSource(node) {
300
+ if (!node) return {};
301
+ try {
302
+ let fiber = getFiber(node);
303
+ let component;
304
+ let location;
305
+ let hops = 0;
306
+ while (fiber && hops < 80) {
307
+ if (!component) {
308
+ const name = componentName(fiber.type);
309
+ if (name && !/^[a-z]/.test(name)) component = name;
310
+ }
311
+ if (!location && fiber._debugSource?.fileName) {
312
+ location = {
313
+ file: fiber._debugSource.fileName,
314
+ line: fiber._debugSource.lineNumber,
315
+ column: fiber._debugSource.columnNumber
316
+ };
317
+ }
318
+ if (component && location) break;
319
+ fiber = fiber.return ?? null;
320
+ hops += 1;
321
+ }
322
+ const result = {};
323
+ if (component) result.component = component;
324
+ if (location) result.location = location;
325
+ return result;
326
+ } catch {
327
+ return {};
328
+ }
329
+ }
330
+
250
331
  // src/react/controller.ts
251
332
  function buildIgnore(ignore) {
252
333
  if (!ignore || ignore.length === 0) return void 0;
@@ -271,6 +352,7 @@ var InspectorController = class {
271
352
  this.started = false;
272
353
  this.pendingContext = {};
273
354
  this.messageReported = false;
355
+ this.settlingTimers = [];
274
356
  this.onRecoverableError = (error, info) => {
275
357
  if (!isDev) return;
276
358
  this.mergeContext({
@@ -307,7 +389,19 @@ var InspectorController = class {
307
389
  this.scheduleInspect();
308
390
  });
309
391
  this.cleanups.push(restore);
392
+ this.scheduleSettlingInspections();
393
+ }
394
+ // React applies client values to mismatched subtrees via a client re-render a
395
+ // few hundred ms after the initial hydration commit. We diff once per frame
396
+ // and then across this short "settling window" to catch that, deduped. This
397
+ // is a bounded, one-shot window — NOT a standing observer — so DOM changes
398
+ // from later app state are never mistaken for hydration mismatches.
399
+ scheduleSettlingInspections() {
310
400
  this.scheduleInspect();
401
+ for (const delay of [80, 250, 700, 1500]) {
402
+ const timer = setTimeout(() => this.inspectAllRoots(), delay);
403
+ this.settlingTimers.push(timer);
404
+ }
311
405
  }
312
406
  mergeContext(ctx) {
313
407
  this.pendingContext = {
@@ -318,6 +412,7 @@ var InspectorController = class {
318
412
  };
319
413
  }
320
414
  stop() {
415
+ for (const timer of this.settlingTimers.splice(0)) clearTimeout(timer);
321
416
  for (const cleanup of this.cleanups.splice(0)) cleanup();
322
417
  this.started = false;
323
418
  }
@@ -338,7 +433,12 @@ var InspectorController = class {
338
433
  const root = document.querySelector(selector);
339
434
  if (!root || seen.has(root)) continue;
340
435
  seen.add(root);
341
- inspectRoot(root, this.collector, this.pendingContext);
436
+ inspectRoot(
437
+ root,
438
+ this.collector,
439
+ this.pendingContext,
440
+ (divergence) => resolveReactSource(divergence.element ?? null)
441
+ );
342
442
  }
343
443
  if (this.collector.getReports().length === 0 && this.pendingContext.reactMessage && !this.messageReported) {
344
444
  this.messageReported = true;
@@ -414,5 +514,5 @@ function createHydrationInspector(options = {}) {
414
514
  }
415
515
 
416
516
  export { HydrationInspector, createHydrationInspector };
417
- //# sourceMappingURL=chunk-ZMAUNJJR.js.map
418
- //# sourceMappingURL=chunk-ZMAUNJJR.js.map
517
+ //# sourceMappingURL=chunk-QYZQHTZS.js.map
518
+ //# sourceMappingURL=chunk-QYZQHTZS.js.map
@@ -0,0 +1 @@
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-QYZQHTZS.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 { overflow-y: auto; padding: 8px; display: flex; flex-direction: column; gap: 8px; }\n.wh-card { 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@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 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 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 destroy(): void {\n host?.remove();\n host = null;\n listEl = null;\n countEl = 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 }\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 messageReported = false;\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.messageReported = false;\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.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 this.mergeContext({\n componentStack: info?.componentStack,\n component: firstComponentFromStack(info?.componentStack),\n reactMessage: error instanceof Error ? error.message : String(error),\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.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 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 // Message fallback for mismatches the DOM diff can't locate (no snapshot,\n // or invalid nesting the browser silently repaired). Double-reporting with\n // a later precise DOM report is prevented by value-based dedup in the\n // collector (same server/client values collapse regardless of path).\n if (\n this.collector.getReports().length === 0 &&\n this.pendingContext.reactMessage &&\n !this.messageReported\n ) {\n this.messageReported = true;\n reportFromMessage(\n this.pendingContext.reactMessage,\n this.collector,\n this.pendingContext,\n );\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"]}