rerender-lens 0.5.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +50 -1
- package/README.md +23 -4
- package/dist/{budget-CRswn-nC.d.cts → budget-CA1MS7lB.d.cts} +1 -1
- package/dist/{budget-BnJlYwrV.d.ts → budget-ok1VDJ4t.d.ts} +1 -1
- package/dist/cli.cjs +78 -26
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +78 -26
- package/dist/cli.js.map +1 -1
- package/dist/{devtools-BYWat7nQ.d.ts → devtools-Cl5n_52v.d.ts} +11 -2
- package/dist/{devtools-DJi_6AfJ.d.cts → devtools-UwQx2VYS.d.cts} +11 -2
- package/dist/index.cjs +99 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +13 -7
- package/dist/index.d.ts +13 -7
- package/dist/index.js +99 -10
- package/dist/index.js.map +1 -1
- package/dist/jest-setup.cjs +20 -3
- package/dist/jest-setup.cjs.map +1 -1
- package/dist/jest-setup.d.cts +4 -4
- package/dist/jest-setup.d.ts +4 -4
- package/dist/jest-setup.js +20 -3
- package/dist/jest-setup.js.map +1 -1
- package/dist/jest.cjs +20 -3
- package/dist/jest.cjs.map +1 -1
- package/dist/jest.d.cts +4 -4
- package/dist/jest.d.ts +4 -4
- package/dist/jest.js +20 -3
- package/dist/jest.js.map +1 -1
- package/dist/{notifiers-DwKlvv4H.d.cts → notifiers-B5poAEvE.d.cts} +2 -2
- package/dist/{notifiers-FNzKHs0a.d.ts → notifiers-CqQW0Eum.d.ts} +2 -2
- package/dist/playwright.d.cts +4 -4
- package/dist/playwright.d.ts +4 -4
- package/dist/relay.cjs +65 -21
- package/dist/relay.cjs.map +1 -1
- package/dist/relay.d.cts +25 -3
- package/dist/relay.d.ts +25 -3
- package/dist/relay.js +65 -21
- package/dist/relay.js.map +1 -1
- package/dist/rerender-lens.iife.js +105 -12
- package/dist/{runner-report-CW8X5RwK.d.ts → runner-report-Bvqoe89M.d.ts} +2 -2
- package/dist/{runner-report-B8Sc3FZO.d.cts → runner-report-CvpDg2zt.d.cts} +2 -2
- package/dist/setup.cjs +98 -9
- package/dist/setup.cjs.map +1 -1
- package/dist/setup.js +98 -9
- package/dist/setup.js.map +1 -1
- package/dist/{types-DW5-N2XH.d.cts → types-DwNN5cWe.d.cts} +28 -1
- package/dist/{types-DW5-N2XH.d.ts → types-DwNN5cWe.d.ts} +28 -1
- package/dist/vite.d.cts +1 -1
- package/dist/vite.d.ts +1 -1
- package/dist/vitest-setup.cjs +20 -3
- package/dist/vitest-setup.cjs.map +1 -1
- package/dist/vitest-setup.d.cts +4 -4
- package/dist/vitest-setup.d.ts +4 -4
- package/dist/vitest-setup.js +20 -3
- package/dist/vitest-setup.js.map +1 -1
- package/dist/vitest.cjs +20 -3
- package/dist/vitest.cjs.map +1 -1
- package/dist/vitest.d.cts +5 -5
- package/dist/vitest.d.ts +5 -5
- package/dist/vitest.js +20 -3
- package/dist/vitest.js.map +1 -1
- package/package.json +3 -2
- package/panel/panel.css +48 -0
- package/panel/panel.js +348 -20
package/dist/cli.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../node_modules/tsup/assets/cjs_shims.js","../src/diff.ts","../src/causes.ts","../src/fixes.ts","../src/sessions.ts","../src/budget.ts","../src/relay.ts","../src/cli.ts"],"names":["dirname","fileURLToPath","join","existsSync","createServer","readFileSync","writeFileSync"],"mappings":"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","file":"cli.cjs","sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","import type { Change, ChangeKind } from './types';\n\nconst REACT_ELEMENT = Symbol.for('react.element');\nconst REACT_TRANSITIONAL_ELEMENT = Symbol.for('react.transitional.element');\n\nexport function isReactElement(v: unknown): v is { type: unknown; props: Record<string, unknown>; key: unknown } {\n if (typeof v !== 'object' || v === null) return false;\n const t = (v as { $$typeof?: unknown }).$$typeof;\n return t === REACT_ELEMENT || t === REACT_TRANSITIONAL_ELEMENT;\n}\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n if (typeof v !== 'object' || v === null) return false;\n const proto = Object.getPrototypeOf(v);\n return proto === Object.prototype || proto === null;\n}\n\ntype Seen = Map<object, Set<object>>;\n\nfunction remember(seen: Seen, a: object, b: object): boolean {\n let set = seen.get(a);\n if (!set) {\n set = new Set();\n seen.set(a, set);\n }\n if (set.has(b)) return true;\n set.add(b);\n return false;\n}\n\n/**\n * Bounds the work of one comparison scope (a commit, or one public `deepEqual` call): pairs already\n * compared are memoized, so a large value shared by many components is walked once per commit, and\n * a visit budget turns a huge structure into \"different\" instead of freezing the page.\n */\ninterface DiffScope {\n cache: WeakMap<object, WeakMap<object, boolean>>;\n remaining: number;\n exhausted: boolean;\n}\nlet scope: DiffScope | null = null;\n/** Object visits allowed for one public `deepEqual` call. */\nexport const DEFAULT_DIFF_BUDGET = 50_000;\n\n/** Start a scope (`onCommit` does this per commit); call the returned function to end it. */\nexport function beginDiffScope(budget = 200_000): () => void {\n const previous = scope;\n scope = { cache: new WeakMap(), remaining: budget, exhausted: false };\n return () => {\n scope = previous;\n };\n}\n\n/** True when the current scope gave up on a value because it was too large to walk. */\nexport function diffBudgetExhausted(): boolean {\n return scope?.exhausted === true;\n}\n\n/**\n * Structural equality that understands Map, Set, Date, RegExp, typed arrays,\n * React elements and cyclic references. Functions are equal only by reference.\n */\nexport function deepEqual(a: unknown, b: unknown, seen: Seen = new Map()): boolean {\n if (Object.is(a, b)) return true;\n if (typeof a !== typeof b) return false;\n if (typeof a !== 'object' || a === null || b === null) return false;\n if (!scope) {\n const end = beginDiffScope(DEFAULT_DIFF_BUDGET);\n try {\n return deepEqual(a, b, seen);\n } finally {\n end();\n }\n }\n const sc = scope;\n const objA = a as object;\n const objB = b as object;\n const hit = sc.cache.get(objA)?.get(objB);\n if (hit !== undefined) return hit;\n if (--sc.remaining < 0) {\n sc.exhausted = true;\n return false;\n }\n const result = deepEqualObjects(objA, objB, seen);\n let m = sc.cache.get(objA);\n if (!m) {\n m = new WeakMap();\n sc.cache.set(objA, m);\n }\n m.set(objB, result);\n return result;\n}\n\nfunction deepEqualObjects(a: object, b: object, seen: Seen): boolean {\n const objA = a;\n const objB = b;\n if (remember(seen, objA, objB)) return true; // cycle: assume equal on this branch\n\n if (a instanceof Date) return b instanceof Date && a.getTime() === b.getTime();\n if (a instanceof RegExp) return b instanceof RegExp && a.source === b.source && a.flags === b.flags;\n\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) if (!deepEqual(a[i], b[i], seen)) return false;\n return true;\n }\n if (Array.isArray(b)) return false;\n\n if (ArrayBuffer.isView(a)) {\n if (!ArrayBuffer.isView(b) || a.constructor !== b.constructor) return false;\n const ta = a as unknown as ArrayLike<number>;\n const tb = b as unknown as ArrayLike<number>;\n if (ta.length !== tb.length) return false;\n for (let i = 0; i < ta.length; i++) if (ta[i] !== tb[i]) return false;\n return true;\n }\n\n if (a instanceof Map) {\n if (!(b instanceof Map) || a.size !== b.size) return false;\n for (const [k, v] of a) {\n if (!b.has(k) || !deepEqual(v, b.get(k), seen)) return false;\n }\n return true;\n }\n if (a instanceof Set) {\n if (!(b instanceof Set) || a.size !== b.size) return false;\n if (a.size > 50) {\n // Members that are equal-but-not-identical would need O(n²) work; large sets compare by identity.\n for (const v of a) if (!b.has(v)) return false;\n return true;\n }\n outer: for (const v of a) {\n if (b.has(v)) continue;\n for (const w of b) if (deepEqual(v, w, seen)) continue outer;\n return false;\n }\n return true;\n }\n\n if (isReactElement(a)) {\n if (!isReactElement(b)) return false;\n return a.type === b.type && a.key === b.key && deepEqual(a.props, b.props, seen);\n }\n\n if (isPlainObject(a) && isPlainObject(b)) {\n const ka = Object.keys(a);\n const kb = Object.keys(b);\n if (ka.length !== kb.length) return false;\n const rb = b as Record<string, unknown>;\n for (const k of ka) {\n if (!Object.prototype.hasOwnProperty.call(b, k)) return false;\n if (!deepEqual((a as Record<string, unknown>)[k], rb[k], seen)) return false;\n }\n return true;\n }\n\n // Class instances, DOM nodes, promises, etc.: reference equality only.\n return false;\n}\n\n/** Change kinds that mean \"new reference, same contents\": the ones a fix removes. */\nexport const AVOIDABLE_KINDS: ReadonlySet<string> = new Set<ChangeKind>(['deep-equal', 'function', 'element']);\n\n/** Classify why two values differ. Assumes `!Object.is(prev, next)`. */\nexport function classify(prev: unknown, next: unknown): ChangeKind {\n if (typeof prev === 'function' && typeof next === 'function') {\n return prev.name === next.name && prev.toString() === next.toString() ? 'function' : 'different';\n }\n if (isReactElement(prev) && isReactElement(next)) {\n return deepEqual(prev, next) ? 'element' : 'different';\n }\n return deepEqual(prev, next) ? 'deep-equal' : 'different';\n}\n\nfunction joinPath(base: string, key: string | number): string {\n if (typeof key === 'number') return `${base}[${key}]`;\n if (base === '') return key;\n return /^[A-Za-z_$][\\w$]*$/.test(key) ? `${base}.${key}` : `${base}[${JSON.stringify(key)}]`;\n}\n\n/**\n * Shallow-diff two records. Every changed key produces exactly one Change;\n * for `different` values that are plain objects/arrays, the nested path that\n * actually differs is reported in `path` to make the console output actionable.\n */\nexport function diffRecords(\n prev: Record<string, unknown> | undefined | null,\n next: Record<string, unknown> | undefined | null,\n basePath = '',\n): Change[] {\n const p = prev ?? {};\n const n = next ?? {};\n const changes: Change[] = [];\n const keys = new Set([...Object.keys(p), ...Object.keys(n)]);\n for (const key of keys) {\n const inPrev = Object.prototype.hasOwnProperty.call(p, key);\n const inNext = Object.prototype.hasOwnProperty.call(n, key);\n const path = joinPath(basePath, key);\n if (inPrev && !inNext) {\n changes.push({ path, kind: 'removed', prev: p[key], next: undefined });\n continue;\n }\n if (!inPrev && inNext) {\n changes.push({ path, kind: 'added', prev: undefined, next: n[key] });\n continue;\n }\n const a = p[key];\n const b = n[key];\n if (Object.is(a, b)) continue;\n const kind = classify(a, b);\n if (kind === 'different') {\n // Once the budget is gone the nested walk would only burn more time; report the top-level key.\n changes.push({ path: diffBudgetExhausted() ? path : (firstDifferentPath(a, b, path) ?? path), kind, prev: a, next: b });\n } else {\n changes.push({ path, kind, prev: a, next: b });\n }\n }\n return changes;\n}\n\n/**\n * Walk plain objects/arrays to find the deepest path where the values first differ, e.g. `style.color`\n * or `items[2].id`; null when they are deep-equal. Two different values with no path to descend into\n * (primitives at the root) give `(value)`. Works on live values and on the panel's serialized ones.\n */\nexport function firstDifferentPath(a: unknown, b: unknown, path = '', depth = 0): string | null {\n if (depth > 8) return path || '(value)';\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return path ? `${path}.length` : 'length';\n for (let i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], b[i])) return firstDifferentPath(a[i], b[i], joinPath(path, i), depth + 1);\n }\n return null;\n }\n if (isPlainObject(a) && isPlainObject(b)) {\n const keys = new Set([...Object.keys(a), ...Object.keys(b)]);\n for (const k of keys) {\n if (!deepEqual(a[k], b[k])) return firstDifferentPath(a[k], b[k], joinPath(path, k), depth + 1);\n }\n return null;\n }\n return deepEqual(a, b) ? null : path || '(value)';\n}\n\nexport interface Leaf {\n path: string;\n prev: unknown;\n next: unknown;\n}\n\n/** Every leaf at which two values differ, at most `limit` of them (the panel's diff view of `different` changes). */\nexport function diffLeaves(a: unknown, b: unknown, limit = 20, path = '', out: Leaf[] = []): Leaf[] {\n if (out.length >= limit || Object.is(a, b)) return out;\n if (Array.isArray(a) && Array.isArray(b)) {\n const n = Math.max(a.length, b.length);\n for (let i = 0; i < n && out.length < limit; i++) diffLeaves(a[i], b[i], limit, joinPath(path, i), out);\n return out;\n }\n if (isPlainObject(a) && isPlainObject(b)) {\n for (const k of new Set([...Object.keys(a), ...Object.keys(b)])) {\n if (out.length >= limit) break;\n diffLeaves(a[k], b[k], limit, joinPath(path, k), out);\n }\n return out;\n }\n if (!deepEqual(a, b)) out.push({ path: path || '(value)', prev: a, next: b });\n return out;\n}\n","/**\n * Commit and root-cause analysis: which component's own change started each render cascade, which\n * contexts fanned out to how many consumers, and a nested view of one commit. Reports carry a\n * `commitId` (every report from one React commit shares it) and `parent` links (the nearest ancestor\n * that rendered in the same commit); following those links inside a commit finds the root cause.\n * One implementation for the library (the CLI, the Vitest reporter, `formatFixes`) and the DevTools\n * panel, which adds its own per-commit memoization on top. Typed over `ReportLike`. Pure.\n */\nimport { AVOIDABLE_KINDS } from './diff';\nimport type { RenderReport, ReportLike } from './types';\n\nexport interface RootCause {\n name: string;\n trigger: string;\n /** Avoidable re-renders in the commit that trace back to this component. */\n count: number;\n components: Map<string, number>;\n}\n\nexport interface ContextStat {\n name: string;\n consumers: number;\n avoidable: number;\n components: Map<string, number>;\n commits: Set<number>;\n /** Components rendering the Provider (usually one). */\n providers: Map<string, number>;\n /** Keys that changed in object values, and the largest key count seen. */\n changedKeys: Set<string>;\n totalKeys: number;\n}\n\nexport interface CommitAnalysis<R extends ReportLike = RenderReport> {\n /** The commit id (`commitId` of its reports), 0 when the reports carry none. */\n id: number;\n total: number;\n avoidable: number;\n /** Sum of `selfDuration` over the avoidable reports, in ms. */\n wasted: number;\n roots: RootCause[];\n /** Root cause name of every avoidable report (what `roots` was aggregated from). */\n rootByReport: Map<R, string>;\n contexts: ContextStat[];\n reports: R[];\n}\n\nexport interface CascadeNode<R extends ReportLike = RenderReport> {\n name: string;\n children: Map<string, CascadeNode<R>>;\n report: R | null;\n count?: number;\n avoidable?: number;\n}\n\nexport interface RootSummary<R extends ReportLike = RenderReport, A extends CommitAnalysis<R> = CommitAnalysis<R>> {\n name: string;\n trigger: string;\n /** Newest first. */\n commits: { key: number; analysis: A; count: number; components: Map<string, number> }[];\n /** Avoidable re-renders across every commit. */\n total: number;\n components: Map<string, number>;\n /** The avoidable reports that trace back to this root cause. */\n affected: R[];\n}\n\n/** One root cause across a whole run: how many commits it started and what those cost. */\nexport interface RankedRootCause {\n name: string;\n trigger: string;\n commits: number;\n /** Avoidable re-renders it caused. */\n count: number;\n components: Map<string, number>;\n}\n\nconst isAncestorReport = (anc: ReportLike, r: ReportLike): boolean =>\n anc.path.length < r.path.length && r.path[anc.path.length] === anc.component && anc.path.every((p, i) => r.path[i] === p);\n\nconst bump = (m: Map<string, number>, key: string, n = 1): void => void m.set(key, (m.get(key) || 0) + n);\n\n/** One commit's reports grouped by component name, so a parent lookup is O(same-named reports) instead of O(commit). */\nexport function indexByComponent<R extends ReportLike>(reports: readonly R[]): Map<string, R[]> {\n const index = new Map<string, R[]>();\n for (const r of reports) {\n const list = index.get(r.component);\n if (list) list.push(r);\n else index.set(r.component, [r]);\n }\n return index;\n}\n\n/**\n * Walk `parent` links inside one commit up to the component whose own change started the cascade.\n * Null when `r` started it itself; `report` is null when the root is an ancestor that is not in the\n * commit (untracked), in which case `name`/`trigger` come from the last `parent` link.\n */\nexport function rootCauseOf<R extends ReportLike>(r: R, commitReports: readonly R[], index: Map<string, R[]> = indexByComponent(commitReports)): { name: string; trigger: string; report: R | null } | null {\n let cur = r;\n const seen = new Set<R>([r]);\n while (cur.trigger === 'parent' && cur.parent) {\n const parent = cur.parent;\n const candidates = index.get(parent.name);\n const p = candidates && candidates.find((x) => isAncestorReport(x, cur));\n if (!p || seen.has(p)) return { name: parent.name, trigger: parent.trigger, report: null };\n seen.add(p);\n cur = p;\n }\n return cur === r ? null : { name: cur.component, trigger: cur.trigger, report: cur };\n}\n\n/** Root causes of one commit's avoidable reports, most re-renders first. */\nfunction rootCausesOf<R extends ReportLike>(reports: readonly R[]): Pick<CommitAnalysis<R>, 'roots' | 'rootByReport' | 'avoidable' | 'wasted'> {\n const roots = new Map<string, RootCause>();\n const rootByReport = new Map<R, string>();\n const index = indexByComponent(reports);\n let avoidable = 0;\n let wasted = 0;\n for (const r of reports) {\n if (!r.avoidable) continue;\n avoidable++;\n if (typeof r.selfDuration === 'number') wasted += r.selfDuration;\n const root = rootCauseOf(r, reports, index);\n const name = root ? root.name : (r.parent && r.parent.name) || '(unknown)';\n const trigger = root ? root.trigger : (r.parent && r.parent.trigger) || 'parent';\n rootByReport.set(r, name);\n let agg = roots.get(name);\n if (!agg) {\n agg = { name, trigger, count: 0, components: new Map() };\n roots.set(name, agg);\n }\n agg.count++;\n bump(agg.components, r.component);\n }\n return { roots: [...roots.values()].sort((a, b) => b.count - a.count), rootByReport, avoidable, wasted };\n}\n\n/** Analyze the reports of one commit: what started the cascade, which contexts changed, what it cost. */\nexport function analyzeCommit<R extends ReportLike>(reports: R[]): CommitAnalysis<R> {\n const first = reports[0];\n return {\n id: first && typeof first.commitId === 'number' ? first.commitId : 0,\n total: reports.length,\n ...rootCausesOf(reports),\n contexts: contextAttribution(reports),\n reports,\n };\n}\n\n/** Which contexts changed and how many consumers re-rendered because of them. */\nexport function contextAttribution(reports: readonly ReportLike[]): ContextStat[] {\n const byCtx = new Map<string, ContextStat>();\n for (const r of reports) {\n for (const c of r.hookChanges || []) {\n if (c.hook !== 'useContext' && !/^useContext/.test(c.path)) continue;\n const m = /useContext\\((.*)\\)/.exec(c.path);\n const name = m && m[1] ? m[1] : c.path;\n let agg = byCtx.get(name);\n if (!agg) {\n agg = { name, consumers: 0, avoidable: 0, components: new Map(), commits: new Set(), providers: new Map(), changedKeys: new Set(), totalKeys: 0 };\n byCtx.set(name, agg);\n }\n agg.consumers++;\n if (AVOIDABLE_KINDS.has(c.kind)) agg.avoidable++;\n bump(agg.components, r.component);\n agg.commits.add(typeof r.commitId === 'number' ? r.commitId : 0);\n if (c.provider && c.provider.component) bump(agg.providers, c.provider.component);\n if (c.changedKeys) for (const k of c.changedKeys) agg.changedKeys.add(k);\n if (typeof c.totalKeys === 'number') agg.totalKeys = Math.max(agg.totalKeys, c.totalKeys);\n }\n }\n return [...byCtx.values()].sort((a, b) => b.consumers - a.consumers);\n}\n\n/** Nested cascade for one commit: every report placed under its ancestors (untracked ancestors appear as plain names). */\nexport function cascadeTree<R extends ReportLike>(reports: readonly R[]): CascadeNode<R> {\n const root: CascadeNode<R> = { name: '', children: new Map(), report: null };\n for (const r of reports) {\n let node = root;\n for (const seg of r.path.concat([r.component])) {\n let next = node.children.get(seg);\n if (!next) {\n next = { name: seg, children: new Map(), report: null };\n node.children.set(seg, next);\n }\n node = next;\n }\n if (!node.report || r.avoidable) node.report = r;\n node.count = (node.count || 0) + 1;\n if (r.avoidable) node.avoidable = (node.avoidable || 0) + 1;\n }\n return root;\n}\n\n/**\n * Every commit a component started (as the root cause), across the whole session.\n * `analyze` lets a caller (the panel) pass its per-commit memoized analysis.\n */\nexport function rootCauseSummary<R extends ReportLike>(name: string, commits: Iterable<[number, R[]]>): RootSummary<R>;\nexport function rootCauseSummary<R extends ReportLike, A extends CommitAnalysis<R>>(name: string, commits: Iterable<[number, R[]]>, analyze: (key: number, reports: R[]) => A): RootSummary<R, A>;\nexport function rootCauseSummary<R extends ReportLike, A extends CommitAnalysis<R>>(name: string, commits: Iterable<[number, R[]]>, analyze?: (key: number, reports: R[]) => A): RootSummary<R, A> {\n const analyzeFn = analyze || ((_: number, reports: R[]): A => analyzeCommit(reports) as A);\n const out: RootSummary<R, A> = { name, trigger: 'parent', commits: [], total: 0, components: new Map(), affected: [] };\n for (const [key, reports] of commits) {\n const analysis = analyzeFn(key, reports);\n const root = analysis.roots.find((x) => x.name === name);\n if (!root) continue;\n out.trigger = root.trigger;\n out.commits.push({ key, analysis, count: root.count, components: root.components });\n out.total += root.count;\n for (const [c, n] of root.components) bump(out.components, c, n);\n for (const r of reports) if (r.avoidable && analysis.rootByReport.get(r) === name) out.affected.push(r);\n }\n out.commits.reverse();\n return out;\n}\n\n/** Reports grouped by `commitId` in first-seen order. Reports without one (`useWhyRerender`, protocol 1) are left out. */\nexport function groupByCommit<R extends ReportLike>(reports: readonly R[]): Map<number, R[]> {\n const out = new Map<number, R[]>();\n for (const r of reports) {\n if (typeof r.commitId !== 'number' || r.commitId <= 0) continue;\n const list = out.get(r.commitId);\n if (list) list.push(r);\n else out.set(r.commitId, [r]);\n }\n return out;\n}\n\n/** Root causes across every commit in `reports`, most avoidable re-renders caused first. */\nexport function rankRootCauses(reports: readonly ReportLike[]): RankedRootCause[] {\n const byName = new Map<string, RankedRootCause>();\n for (const commit of groupByCommit(reports).values()) {\n for (const root of rootCausesOf(commit).roots) {\n let agg = byName.get(root.name);\n if (!agg) {\n agg = { name: root.name, trigger: root.trigger, commits: 0, count: 0, components: new Map() };\n byName.set(root.name, agg);\n }\n agg.commits++;\n agg.count += root.count;\n for (const [c, n] of root.components) bump(agg.components, c, n);\n }\n }\n return [...byName.values()].sort((a, b) => b.count - a.count || b.commits - a.commits || a.name.localeCompare(b.name));\n}\n\nconst plural = (n: number, word: string): string => `${n} ${word}${n === 1 ? '' : 's'}`;\n\n/**\n * Multi-line root-cause table for a test failure or a CI log, one line per root cause:\n * `<Page> (state) started 3 commits, 12 avoidable re-renders (<Row> x10, <Toolbar> x2)`.\n * Empty when nothing is avoidable or the reports carry no `commitId`.\n */\nexport function formatRootCauses(reports: readonly ReportLike[], limit = 5): string {\n const ranked = rankRootCauses(reports);\n const lines = ranked\n .slice(0, limit)\n .map((root, i) => `${String(i + 1).padStart(2)}. <${root.name}> (${root.trigger}) started ${plural(root.commits, 'commit')}, ${plural(root.count, 'avoidable re-render')} (${[...root.components].map(([c, n]) => `<${c}>${n > 1 ? ' x' + n : ''}`).join(', ')})`);\n if (ranked.length > limit) lines.push(` … ${ranked.length - limit} more`);\n return lines.join('\\n');\n}\n","/**\n * Concrete fixes derived from reports, ranked by how many avoidable re-renders each one removes.\n * One implementation for the library (tests, CI budgets, the CLI, typed on `RenderReport`) and the\n * DevTools panel (serialized reports): everything here reads only `ReportLike`. Pure.\n */\nimport type { ChangeLike, RenderReport, ReportLike } from './types';\nimport { AVOIDABLE_KINDS } from './diff';\nimport { formatRootCauses } from './causes';\n\nexport { AVOIDABLE_KINDS };\n\nexport type FixKind = 'memo' | 'useCallback' | 'useMemo' | 'useMemoElement' | 'children' | 'contextValue' | 'splitContext' | 'storeSnapshot' | 'bailout';\n\nexport interface Fix {\n kind: FixKind;\n /** Where the change goes (the component that must be edited, or `<Ctx>.Provider`). */\n owner: string;\n /** The component whose re-render this removes. */\n target: string;\n prop: string | null;\n label: string;\n detail: string;\n /** Code sketch of the fix, `// <owner>` on the first line. */\n snippet: string;\n}\n\nexport interface RankedFix<R extends ReportLike = RenderReport> extends Fix {\n key: string;\n /** Avoidable re-renders this fix removes. */\n count: number;\n components: Record<string, number>;\n /** The first (at most 50) reports the fix applies to. */\n reports: R[];\n}\n\nconst MAX_FIX_REPORTS = 50;\nconst rootOf = (path: string): string => path.split(/[.[]/)[0] || path;\nconst identifier = (name: string): string => (/^[A-Za-z_$][\\w$]*$/.test(name) ? name : 'value');\n\n/** `JSON.stringify` cut to `max` characters, for snippets and markdown; never throws. */\nexport function shortValue(v: unknown, max = 60): string {\n let s: string | undefined;\n try {\n s = JSON.stringify(v);\n } catch {\n s = String(v);\n }\n if (s === undefined) s = String(v);\n return s.length > max ? s.slice(0, max - 3) + '...' : s;\n}\n\n/** The concrete fixes one report suggests, each attributed to the component (file) that must change. */\nexport function fixesFor(r: ReportLike): Fix[] {\n const out: Fix[] = [];\n const ownerName = r.owner || (r.parent && r.parent.name) || null;\n const propChanges = r.propChanges || [];\n const changes: ChangeLike[] = [...propChanges, ...(r.stateChanges || []), ...(r.hookChanges || [])];\n // Not memoized: props alone will never stop the re-render, so React.memo comes first (in addition to\n // any prop fixes below). Reports from protocol-1 libraries have no `memoized`; assume memoized then.\n if (r.avoidable && (changes.length === 0 || r.memoized === false)) {\n const identical = changes.length === 0;\n out.push({\n kind: 'memo',\n owner: r.component,\n target: r.component,\n prop: null,\n label: `Wrap <${r.component}> in React.memo`,\n detail: identical\n ? `<${r.component}> re-rendered with identical props because <${(r.parent && r.parent.name) || 'its parent'}> re-rendered.`\n : `<${r.component}> is not memoized: fixing its props alone will not stop the re-render.`,\n snippet: `// ${r.component}\\nimport { memo } from 'react';\\n\\nexport const ${r.component} = memo(function ${r.component}(props) {\\n // ...\\n});\\n// class components: extend PureComponent instead`,\n });\n }\n for (const c of propChanges) {\n if (!AVOIDABLE_KINDS.has(c.kind)) continue;\n const owner = ownerName || '?';\n const root = rootOf(c.path);\n const id = identifier(root);\n if (root === 'children' && (c.kind === 'element' || c.kind === 'deep-equal')) {\n out.push({\n kind: 'children',\n owner,\n target: r.component,\n prop: 'children',\n label: `memoize children of <${r.component}> in <${owner}>`,\n detail: `<${owner}> re-creates the children of <${r.component}> on every render; they have the same types and props each time.`,\n snippet:\n `// ${owner}\\nimport { useMemo } from 'react';\\n\\nconst children = useMemo(() => (\\n <>{/* the same elements */}</>\\n), [/* deps */]);\\n\\n<${r.component}>{children}</${r.component}>\\n\\n` +\n `// static children: hoist them to module scope\\nconst STATIC = <em>hi</em>;`,\n });\n } else if (c.kind === 'function') {\n out.push({\n kind: 'useCallback',\n owner,\n target: r.component,\n prop: root,\n label: `useCallback(${root}) in <${owner}>`,\n detail: `prop \"${c.path}\" of <${r.component}> is a new function on every render of <${owner}>.`,\n snippet: `// ${owner}\\nimport { useCallback } from 'react';\\n\\nconst ${id} = useCallback((/* args */) => {\\n // ...\\n}, [/* deps */]);\\n\\n<${r.component} ${root}={${id}} />`,\n });\n } else if (c.kind === 'element') {\n out.push({\n kind: 'useMemoElement',\n owner,\n target: r.component,\n prop: root,\n label: `memoize element prop ${root} in <${owner}>`,\n detail: `prop \"${c.path}\" of <${r.component}> is a new element with the same type and props on every render of <${owner}>.`,\n snippet: `// ${owner}\\nimport { useMemo } from 'react';\\n\\nconst ${id} = useMemo(() => ${shortValue(c.next, 40)}, [/* deps */]);\\n// or pass it as children from a component that does not re-render`,\n });\n } else {\n const isArray = Array.isArray(c.next);\n out.push({\n kind: 'useMemo',\n owner,\n target: r.component,\n prop: root,\n label: `useMemo(${root}) in <${owner}>`,\n detail: `prop \"${c.path}\" of <${r.component}> is a new ${isArray ? 'array' : 'object'} with the same contents on every render of <${owner}>.`,\n snippet:\n `// ${owner}\\nimport { useMemo } from 'react';\\n\\nconst ${id} = useMemo(() => (${shortValue(c.next, 80)}), [/* deps */]);\\n\\n` +\n `// or, when it never changes, hoist it to module scope:\\nconst ${id.toUpperCase()} = ${shortValue(c.next, 80)};`,\n });\n }\n }\n for (const c of [...(r.stateChanges || []), ...(r.hookChanges || [])]) {\n const isContext = c.hook === 'useContext' || /^useContext/.test(c.path);\n const ctxName = isContext ? (/useContext\\((.*)\\)/.exec(c.path) || [])[1] || 'Context' : '';\n const providerOwner = isContext && c.provider && c.provider.component ? c.provider.component : null;\n // A genuine change of a few keys in an object context still re-renders every consumer.\n if (isContext && c.kind === 'different' && c.changedKeys && typeof c.totalKeys === 'number' && c.changedKeys.length > 0 && c.changedKeys.length < c.totalKeys) {\n out.push({\n kind: 'splitContext',\n owner: providerOwner || `${ctxName}.Provider`,\n target: r.component,\n prop: ctxName,\n label: `split ${ctxName}${providerOwner ? ` in <${providerOwner}>` : ''}: only ${c.changedKeys.join(', ')} changed`,\n detail: `${c.changedKeys.map((k) => `\"${k}\"`).join(', ')} of ${c.totalKeys} keys changed in ${ctxName}, yet every consumer (like <${r.component}>) re-rendered. Consumers that read the other keys re-render for nothing.`,\n snippet:\n `// ${providerOwner || 'Provider'}\\n// one context per independently-changing slice\\nconst ${identifier(ctxName)}Static = createContext(...);\\nconst ${identifier(ctxName)}${c.changedKeys.map((k) => k[0]!.toUpperCase() + k.slice(1)).join('')} = createContext(...);\\n\\n` +\n `// or keep one context and let consumers select a slice:\\nconst ${c.changedKeys[0]} = useContextSelector(${ctxName}, (v) => v.${c.changedKeys[0]});`,\n });\n continue;\n }\n if (!AVOIDABLE_KINDS.has(c.kind)) continue;\n if (isContext) {\n out.push({\n kind: 'contextValue',\n owner: providerOwner || `${ctxName}.Provider`,\n target: r.component,\n prop: ctxName,\n label: `memoize the ${ctxName} provider value${providerOwner ? ` in <${providerOwner}>` : ''}`,\n detail: `<${r.component}> re-rendered because ${ctxName} produced a new value that is deep-equal to the previous one${providerOwner ? ` (Provider rendered by <${providerOwner}>)` : ''}.`,\n snippet: `// ${providerOwner || `where <${ctxName}.Provider> is rendered`}\\nconst value = useMemo(() => ({ /* ... */ }), [/* deps */]);\\n<${ctxName}.Provider value={value}>`,\n });\n } else if (c.hook === 'useSyncExternalStore') {\n const chain = c.custom || [];\n const redux = chain.some((n) => /^use(App)?Selector$/.test(n));\n const zustand = !redux && chain.some((n) => /^use[A-Z]\\w*Store$/.test(n) || n === 'useStore' || n === 'useBoundStore');\n const via = chain.length ? ` via ${chain.join(' › ')}` : '';\n out.push({\n kind: 'storeSnapshot',\n owner: r.component,\n target: r.component,\n prop: c.path,\n label: redux ? `memoize the selector in <${r.component}>` : zustand ? `useShallow in <${r.component}>` : `stable getSnapshot in <${r.component}>`,\n detail: redux\n ? `the selector${via} returns a new object on every call, so the component re-renders on every store change.`\n : zustand\n ? `the store selector${via} returns a new object on every call, so the component re-renders on every store change.`\n : `${c.path}${via} returned a new reference with the same contents; getSnapshot must return a cached value.`,\n snippet: redux\n ? `// ${r.component}\\nimport { shallowEqual } from 'react-redux';\\nconst slice = useSelector(selectSlice, shallowEqual);\\n// or memoize: const selectSlice = createSelector([selectA, selectB], (a, b) => ({ a, b }));`\n : zustand\n ? `// ${r.component}\\nimport { useShallow } from 'zustand/react/shallow';\\nconst { a, b } = useStore(useShallow((s) => ({ a: s.a, b: s.b })));\\n// or select a primitive: const a = useStore((s) => s.a);`\n : `// ${r.component}\\n// getSnapshot must return the same reference while the data is unchanged\\nconst snapshot = useSyncExternalStore(subscribe, store.getSnapshot /* cached */);`,\n });\n } else {\n out.push({\n kind: 'bailout',\n owner: r.component,\n target: r.component,\n prop: c.path,\n label: `bail out before setting ${c.path} in <${r.component}>`,\n detail: `${c.path} was set to a value deep-equal to the current one (new reference).`,\n snippet: `// ${r.component}\\nsetState((prev) => (deepEqual(prev, next) ? prev : next));`,\n });\n }\n }\n return out;\n}\n\nexport const fixKey = (f: Fix): string => `${f.kind}|${f.owner}|${f.prop || f.target}`;\n\n/** Every fix across `reports`, most avoidable re-renders removed first. */\nexport function rankFixes<R extends ReportLike>(reports: readonly R[]): RankedFix<R>[] {\n const byKey = new Map<string, RankedFix<R>>();\n for (const r of reports) {\n if (!r.avoidable) continue;\n for (const f of fixesFor(r)) {\n const key = fixKey(f);\n let agg = byKey.get(key);\n if (!agg) {\n agg = { ...f, key, count: 0, components: {}, reports: [] };\n byKey.set(key, agg);\n }\n agg.count++;\n agg.components[r.component] = (agg.components[r.component] || 0) + 1;\n if (agg.reports.length < MAX_FIX_REPORTS) agg.reports.push(r);\n }\n }\n return [...byKey.values()].sort((a, b) => b.count - a.count || a.label.localeCompare(b.label));\n}\n\n/**\n * Multi-line text for a test failure or a CI log: the ranked fixes, then (when the reports carry\n * `commitId`) a \"Root causes\" section naming the components whose own changes started the cascades.\n */\nexport function formatFixes(reports: readonly ReportLike[], limit = 10): string {\n const ranked = rankFixes(reports);\n if (!ranked.length) return 'No avoidable re-renders.';\n const lines = ranked.slice(0, limit).map((f, i) => `${String(i + 1).padStart(2)}. ${f.label} (removes ${f.count}: ${Object.entries(f.components).map(([c, n]) => `<${c}>${n > 1 ? ' x' + n : ''}`).join(', ')})`);\n if (ranked.length > limit) lines.push(` … ${ranked.length - limit} more`);\n const roots = formatRootCauses(reports, 5);\n if (roots) lines.push('', 'Root causes:', roots);\n return lines.join('\\n');\n}\n","/**\n * Session summaries and before/after comparison, the same shape the extension records and exports,\n * so a session file committed next to the code can be compared in CI or with the CLI. Pure.\n */\nimport type { RenderReport, ReportLike } from './types';\nimport { rankFixes } from './fixes';\n\nexport interface SessionSummary {\n id: string;\n name: string;\n startedAt: number;\n endedAt: number | null;\n total: number;\n avoidable: number;\n wasted: number;\n byComponent: Record<string, { total: number; avoidable: number; wasted: number }>;\n fixes: { key: string; label: string; count: number }[];\n}\n\nexport interface CompareRow {\n component: string;\n before: number;\n after: number;\n delta: number;\n}\n\nexport interface Comparison {\n before: SessionSummary;\n after: SessionSummary;\n rows: CompareRow[];\n total: { before: number; after: number; delta: number };\n avoidable: { before: number; after: number; delta: number };\n wasted: { before: number; after: number; delta: number };\n resolvedFixes: SessionSummary['fixes'];\n newFixes: SessionSummary['fixes'];\n /** Components whose avoidable re-renders went up. */\n regressions: CompareRow[];\n}\n\nexport function summarizeReports(reports: readonly ReportLike[], meta: Partial<Pick<SessionSummary, 'id' | 'name' | 'startedAt' | 'endedAt'>> = {}): SessionSummary {\n const byComponent: SessionSummary['byComponent'] = {};\n let avoidable = 0;\n let wasted = 0;\n for (const r of reports) {\n const c = (byComponent[r.component] ||= { total: 0, avoidable: 0, wasted: 0 });\n c.total++;\n if (r.avoidable) {\n c.avoidable++;\n avoidable++;\n if (typeof r.selfDuration === 'number') {\n c.wasted += r.selfDuration;\n wasted += r.selfDuration;\n }\n }\n }\n return {\n id: meta.id ?? `s${Date.now().toString(36)}`,\n name: meta.name ?? 'session',\n startedAt: meta.startedAt ?? (reports[0]?.time ?? 0),\n endedAt: meta.endedAt ?? (reports[reports.length - 1]?.time ?? null),\n total: reports.length,\n avoidable,\n wasted,\n byComponent,\n fixes: rankFixes(reports).map((f) => ({ key: f.key, label: f.label, count: f.count })),\n };\n}\n\nexport function compareSummaries(before: SessionSummary, after: SessionSummary): Comparison {\n const names = new Set([...Object.keys(before.byComponent), ...Object.keys(after.byComponent)]);\n const rows: CompareRow[] = [];\n for (const component of names) {\n const b = before.byComponent[component]?.avoidable || 0;\n const a = after.byComponent[component]?.avoidable || 0;\n if (b || a) rows.push({ component, before: b, after: a, delta: a - b });\n }\n rows.sort((x, y) => x.delta - y.delta || y.before - x.before || x.component.localeCompare(y.component));\n const afterKeys = new Set(after.fixes.map((f) => f.key));\n const beforeKeys = new Set(before.fixes.map((f) => f.key));\n return {\n before,\n after,\n rows,\n total: { before: before.total, after: after.total, delta: after.total - before.total },\n avoidable: { before: before.avoidable, after: after.avoidable, delta: after.avoidable - before.avoidable },\n wasted: { before: before.wasted, after: after.wasted, delta: after.wasted - before.wasted },\n resolvedFixes: before.fixes.filter((f) => !afterKeys.has(f.key)),\n newFixes: after.fixes.filter((f) => !beforeKeys.has(f.key)),\n regressions: rows.filter((r) => r.delta > 0),\n };\n}\n\n/** The panel's spelling: summarize a recorded session (`id`/`name`/`startedAt`/`endedAt` come from the session). */\nexport const summarizeSession = (session: Pick<SessionSummary, 'id' | 'name' | 'startedAt' | 'endedAt'>, reports: readonly ReportLike[]): SessionSummary => summarizeReports(reports, session);\n\n/** Alias of `compareSummaries` (the panel's name). */\nexport const compareSessions = compareSummaries;\n\n/** Plain-text table of a comparison (CLI, CI logs). */\nexport function formatComparison(c: Comparison): string {\n const w = Math.max(14, ...c.rows.map((r) => r.component.length + 2));\n const line = (label: string, b: string | number, a: string | number, d: string): string => `${label.padEnd(w)} ${String(b).padStart(8)} ${String(a).padStart(8)} ${d.padStart(8)}`;\n const delta = (n: number, suffix = ''): string => (n === 0 ? '±0' : `${n > 0 ? '+' : ''}${Number.isInteger(n) ? n : n.toFixed(1)}${suffix}`);\n const out = [line('avoidable', c.before.name.slice(0, 8), c.after.name.slice(0, 8), 'Δ'), line('all components', c.avoidable.before, c.avoidable.after, delta(c.avoidable.delta))];\n if (c.wasted.before || c.wasted.after) out.push(line('wasted ms', c.wasted.before.toFixed(1), c.wasted.after.toFixed(1), delta(Number(c.wasted.delta.toFixed(1)))));\n for (const r of c.rows) out.push(line(`<${r.component}>`, r.before, r.after, delta(r.delta)));\n if (c.resolvedFixes.length) out.push('', 'no longer needed:', ...c.resolvedFixes.map((f) => ` - ${f.label}`));\n if (c.newFixes.length) out.push('', 'new:', ...c.newFixes.map((f) => ` - ${f.label}`));\n return out.join('\\n');\n}\n\n/** Reports from a panel export (`{ rerenderLens: true, reports }`), a bare array, or a session summary file. */\nexport function parseExport(data: unknown): { reports: RenderReport[]; sessions: SessionSummary[]; summary: SessionSummary | null } {\n if (Array.isArray(data)) return { reports: data as RenderReport[], sessions: [], summary: null };\n if (data && typeof data === 'object') {\n const d = data as { reports?: unknown; sessions?: unknown; byComponent?: unknown };\n if (Array.isArray(d.reports)) return { reports: d.reports as RenderReport[], sessions: Array.isArray(d.sessions) ? (d.sessions as SessionSummary[]) : [], summary: null };\n if (d.byComponent && typeof d.byComponent === 'object') return { reports: [], sessions: [], summary: data as SessionSummary };\n }\n throw new Error('not a rerender-lens export or session summary');\n}\n","/**\n * Re-render budgets for CI: a JSON baseline of allowed avoidable re-renders per component, checked\n * against a collector's reports (like a bundle-size budget). Pure; reading and writing the file is\n * up to the test runner (`fs`), so this works in Node and in the browser.\n */\nimport type { RenderReport } from './types';\nimport { formatFixes } from './fixes';\n\n/** `{ \"*\": 0, \"ProductRow\": 3 }`: max avoidable re-renders per component; `*` is the default. */\nexport type Budget = Record<string, number>;\n\nexport interface BudgetViolation {\n component: string;\n avoidable: number;\n allowed: number;\n}\n\nexport interface BudgetResult {\n ok: boolean;\n violations: BudgetViolation[];\n /** Components with headroom left, so budgets can be tightened. */\n slack: { component: string; avoidable: number; allowed: number }[];\n counts: Record<string, number>;\n}\n\nexport function avoidableCounts(reports: RenderReport[]): Record<string, number> {\n const counts: Record<string, number> = {};\n for (const r of reports) if (r.avoidable) counts[r.component] = (counts[r.component] || 0) + 1;\n return counts;\n}\n\nexport function checkBudget(reports: RenderReport[], budget: Budget | number): BudgetResult {\n const b: Budget = typeof budget === 'number' ? { '*': budget } : budget;\n const fallback = typeof b['*'] === 'number' ? b['*'] : 0;\n const counts = avoidableCounts(reports);\n const violations: BudgetViolation[] = [];\n const slack: BudgetResult['slack'] = [];\n const names = new Set([...Object.keys(counts), ...Object.keys(b).filter((k) => k !== '*')]);\n for (const component of names) {\n const allowed = typeof b[component] === 'number' ? b[component]! : fallback;\n const avoidable = counts[component] || 0;\n if (avoidable > allowed) violations.push({ component, avoidable, allowed });\n else if (avoidable < allowed) slack.push({ component, avoidable, allowed });\n }\n violations.sort((x, y) => y.avoidable - y.allowed - (x.avoidable - x.allowed));\n return { ok: violations.length === 0, violations, slack, counts };\n}\n\n/** A budget that exactly matches the current counts (the baseline to commit). */\nexport function toBudget(reports: RenderReport[]): Budget {\n return { '*': 0, ...avoidableCounts(reports) };\n}\n\n/** Throws with the violations and the ranked fixes; use it from a test. */\nexport function assertWithinBudget(reports: RenderReport[], budget: Budget | number): BudgetResult {\n const result = checkBudget(reports, budget);\n if (result.ok) return result;\n const lines = result.violations.map((v) => ` <${v.component}>: ${v.avoidable} avoidable re-render${v.avoidable === 1 ? '' : 's'} (budget ${v.allowed})`);\n throw new Error(`Re-render budget exceeded:\\n${lines.join('\\n')}\\n\\nFixes, most impact first:\\n${formatFixes(reports)}`);\n}\n","/**\n * A tiny local relay (`npx rerender-lens panel`): serves the panel and forwards messages between\n * app pages and panel pages over Server-Sent Events + POST, so any app (Next.js, Webpack, a\n * production-like build) gets the panel without the extension and without a same-origin channel.\n *\n * GET / redirect to /panel.html?relay=<this server>\n * GET /panel.(html|js|css) the panel page\n * GET /events?role=app SSE: commands from panels\n * GET /events?role=panel SSE: hello / report / clear from apps, replies to commands\n * POST /message one message or an array; `{ __rerenderLens }` and replies go to\n * panels, `{ __rerenderLensCmd }` goes to apps\n *\n * Dependency-free (node:http). CORS is open: the relay is a local dev tool, bind it to 127.0.0.1.\n */\nimport { createServer, type IncomingMessage, type Server, type ServerResponse } from 'node:http';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport interface RelayOptions {\n port?: number;\n host?: string;\n /** Directory with panel.html/js/css; found automatically in the package. */\n panelDir?: string | null;\n /** Milliseconds between SSE keep-alive comments. Default 15000. */\n keepAliveMs?: number;\n}\n\nexport interface RelayServer {\n server: Server;\n /** `http://127.0.0.1:4141` once listening. */\n url: string;\n port: number;\n close(): Promise<void>;\n /** Connected app and panel streams. */\n counts(): { apps: number; panels: number };\n}\n\nconst MIME: Record<string, string> = { '.html': 'text/html; charset=utf-8', '.js': 'text/javascript; charset=utf-8', '.css': 'text/css; charset=utf-8' };\n\nexport function findPanelDir(): string | null {\n const here = dirname(fileURLToPath(import.meta.url));\n for (const dir of [join(here, '..', 'panel'), join(here, '..', 'extension'), join(here, '..', '..', 'extension')]) {\n if (existsSync(join(dir, 'panel.html')) && existsSync(join(dir, 'panel.js'))) return dir;\n }\n return null;\n}\n\nconst cors = (res: ServerResponse): void => {\n res.setHeader('Access-Control-Allow-Origin', '*');\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type');\n};\n\nfunction readBody(req: IncomingMessage, limit = 8 * 1024 * 1024): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n let size = 0;\n req.on('data', (c: Buffer) => {\n size += c.length;\n if (size > limit) {\n reject(new Error('body too large'));\n req.destroy();\n return;\n }\n chunks.push(c);\n });\n req.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));\n req.on('error', reject);\n });\n}\n\nexport function createRelayServer(options: RelayOptions = {}): Promise<RelayServer> {\n const host = options.host ?? '127.0.0.1';\n const panelDir = options.panelDir === undefined ? findPanelDir() : options.panelDir;\n const keepAliveMs = options.keepAliveMs ?? 15_000;\n const apps = new Set<ServerResponse>();\n const panels = new Set<ServerResponse>();\n let url = '';\n\n const send = (targets: Set<ServerResponse>, message: unknown): void => {\n const line = `data: ${JSON.stringify(message)}\\n\\n`;\n for (const res of targets) {\n try {\n res.write(line);\n } catch {\n targets.delete(res);\n }\n }\n };\n\n const route = (message: unknown): void => {\n if (!message || typeof message !== 'object') return;\n const m = message as Record<string, unknown>;\n if (m.__rerenderLensCmd === true) send(apps, m);\n else if (m.__rerenderLens === true || m.__rerenderLensReply === true) send(panels, m);\n };\n\n const server = createServer(async (req, res) => {\n cors(res);\n const u = new URL(req.url || '/', 'http://relay');\n if (req.method === 'OPTIONS') {\n res.statusCode = 204;\n res.end();\n return;\n }\n if (u.pathname === '/' && req.method === 'GET') {\n res.statusCode = 302;\n res.setHeader('Location', `/panel.html?relay=${encodeURIComponent(url)}`);\n res.end();\n return;\n }\n if (u.pathname === '/events' && req.method === 'GET') {\n const role = u.searchParams.get('role') === 'app' ? apps : panels;\n res.statusCode = 200;\n res.setHeader('Content-Type', 'text/event-stream');\n res.setHeader('Cache-Control', 'no-store');\n res.setHeader('Connection', 'keep-alive');\n res.write(': connected\\n\\n');\n role.add(res);\n const ping = setInterval(() => {\n try {\n res.write(': ping\\n\\n');\n } catch {\n /* closed */\n }\n }, keepAliveMs);\n req.on('close', () => {\n clearInterval(ping);\n role.delete(res);\n });\n // Panels learn the app count as soon as their stream is open (that first message is also how a\n // panel knows it is safe to send commands: replies only reach panels that are already connected),\n // and again whenever an app comes or goes, so they show \"disconnected\" instead of waiting.\n const count = (): unknown => ({ __rerenderLens: true, version: 2, type: 'relay', payload: { apps: apps.size } });\n if (role === apps) {\n send(panels, count());\n req.on('close', () => send(panels, count()));\n } else {\n send(new Set([res]), count());\n }\n return;\n }\n if (u.pathname === '/favicon.ico') {\n res.statusCode = 204;\n res.end();\n return;\n }\n if (u.pathname === '/message' && req.method === 'POST') {\n try {\n const parsed = JSON.parse((await readBody(req)) || 'null') as unknown;\n for (const m of Array.isArray(parsed) ? parsed : [parsed]) route(m);\n res.statusCode = 204;\n res.end();\n } catch (e) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'text/plain');\n res.end(String((e as Error).message || e));\n }\n return;\n }\n if (u.pathname === '/status' && req.method === 'GET') {\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ ok: true, apps: apps.size, panels: panels.size }));\n return;\n }\n const file = u.pathname.replace(/^\\//, '');\n if (/^panel\\.(html|js|css)$/.test(file) && req.method === 'GET') {\n if (!panelDir) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'text/plain');\n res.end('rerender-lens: panel files not found (is the package built?)');\n return;\n }\n res.statusCode = 200;\n res.setHeader('Content-Type', MIME[file.slice(file.lastIndexOf('.'))] || 'application/octet-stream');\n res.setHeader('Cache-Control', 'no-store');\n res.end(readFileSync(join(panelDir, file)));\n return;\n }\n res.statusCode = 404;\n res.setHeader('Content-Type', 'text/plain');\n res.end('not found');\n });\n\n return new Promise((resolve, reject) => {\n server.once('error', reject);\n server.listen(options.port ?? 4141, host, () => {\n const addr = server.address();\n const port = typeof addr === 'object' && addr ? addr.port : options.port ?? 4141;\n url = `http://${host === '0.0.0.0' || host === '::' ? 'localhost' : host}:${port}`;\n resolve({\n server,\n url,\n port,\n counts: () => ({ apps: apps.size, panels: panels.size }),\n close: () =>\n new Promise<void>((done) => {\n for (const res of [...apps, ...panels]) res.end();\n apps.clear();\n panels.clear();\n server.close(() => done());\n }),\n });\n });\n });\n}\n","#!/usr/bin/env node\n/**\n * rerender-lens CLI: work with panel exports and session files from a terminal or CI.\n *\n * rerender-lens fixes <export.json> ranked fixes for the reports in an export\n * rerender-lens causes <export.json> root causes: which component started each commit's cascade\n * rerender-lens summary <export.json> [--out s.json] session summary of an export (commit it as a baseline)\n * rerender-lens compare <before.json> <after.json> before/after table; exit 1 on regressions\n * rerender-lens budget <export.json> <budget.json> check avoidable re-renders per component; exit 1 on violations\n * rerender-lens budget <export.json> --init print a budget matching the export\n * rerender-lens panel [--port 4141] [--host 127.0.0.1] serve the panel and relay reports from any app\n */\nimport { readFileSync, writeFileSync } from 'node:fs';\nimport { formatFixes } from './fixes';\nimport { formatRootCauses } from './causes';\nimport { compareSummaries, formatComparison, parseExport, summarizeReports, type SessionSummary } from './sessions';\nimport { checkBudget, toBudget, type Budget } from './budget';\nimport { createRelayServer } from './relay';\n\nconst read = (file: string): unknown => JSON.parse(readFileSync(file, 'utf8'));\n\nfunction summaryOf(file: string): SessionSummary {\n const parsed = parseExport(read(file));\n if (parsed.summary) return parsed.summary;\n if (parsed.sessions.length && !parsed.reports.length) return parsed.sessions[parsed.sessions.length - 1]!;\n return summarizeReports(parsed.reports, { name: file.replace(/^.*[\\\\/]/, '').replace(/\\.json$/, '') });\n}\n\n/** `rerender-lens panel`: start the relay and keep running until it closes. */\nasync function panelCommand(args: string[]): Promise<number> {\n const flag = (name: string): string | null => {\n const i = args.indexOf(name);\n return i >= 0 ? (args[i + 1] ?? '') : null;\n };\n const relay = await createRelayServer({ port: Number(flag('--port') || 4141), host: flag('--host') || '127.0.0.1' });\n console.log(`rerender-lens panel: ${relay.url}/`);\n console.log(`in the app: createDevtoolsNotifier({ relay: '${relay.url}' }) or window.__RERENDER_LENS_RELAY__ = '${relay.url}'`);\n console.log('Ctrl+C to stop.');\n return new Promise((resolve) => {\n const stop = (): void => void relay.close().then(() => resolve(0));\n process.once('SIGINT', stop);\n process.once('SIGTERM', stop);\n relay.server.once('close', () => resolve(0));\n });\n}\n\nexport function main(argv: string[]): number | Promise<number> {\n const [cmd, ...args] = argv;\n if (cmd === 'panel') return panelCommand(args).catch((e: Error) => (console.error(e.message), 1));\n const flag = (name: string): string | null => {\n const i = args.indexOf(name);\n return i >= 0 ? (args[i + 1] ?? '') : null;\n };\n const positional = args.filter((a, i) => !a.startsWith('--') && !(i > 0 && args[i - 1]!.startsWith('--') && args[i - 1] !== '--init'));\n try {\n switch (cmd) {\n case 'fixes': {\n const file = positional[0];\n if (!file) throw new Error('usage: rerender-lens fixes <export.json>');\n const { reports } = parseExport(read(file));\n console.log(formatFixes(reports, Number(flag('--limit') || 20)));\n return 0;\n }\n case 'causes': {\n const file = positional[0];\n if (!file) throw new Error('usage: rerender-lens causes <export.json> [--limit N]');\n const { reports } = parseExport(read(file));\n console.log(formatRootCauses(reports, Number(flag('--limit') || 10)) || 'No root causes: no avoidable re-renders, or the reports carry no commit ids.');\n return 0;\n }\n case 'summary': {\n const file = positional[0];\n if (!file) throw new Error('usage: rerender-lens summary <export.json> [--out summary.json]');\n const summary = summaryOf(file);\n const out = flag('--out');\n if (out) {\n writeFileSync(out, JSON.stringify(summary, null, 2) + '\\n');\n console.log(`${out}: ${summary.total} renders, ${summary.avoidable} avoidable`);\n } else console.log(JSON.stringify(summary, null, 2));\n return 0;\n }\n case 'compare': {\n const [a, b] = positional;\n if (!a || !b) throw new Error('usage: rerender-lens compare <before.json> <after.json>');\n const cmp = compareSummaries(summaryOf(a), summaryOf(b));\n console.log(formatComparison(cmp));\n if (cmp.regressions.length) {\n console.error(`\\n${cmp.regressions.length} component${cmp.regressions.length === 1 ? '' : 's'} regressed.`);\n return 1;\n }\n return 0;\n }\n case 'budget': {\n const file = positional[0];\n if (!file) throw new Error('usage: rerender-lens budget <export.json> <budget.json> | --init');\n const { reports } = parseExport(read(file));\n if (args.includes('--init')) {\n console.log(JSON.stringify(toBudget(reports), null, 2));\n return 0;\n }\n const budgetFile = positional[1];\n if (!budgetFile) throw new Error('usage: rerender-lens budget <export.json> <budget.json>');\n const result = checkBudget(reports, read(budgetFile) as Budget);\n if (result.ok) {\n console.log(`Within budget (${Object.keys(result.counts).length} components with avoidable re-renders).`);\n return 0;\n }\n for (const v of result.violations) console.error(`<${v.component}>: ${v.avoidable} avoidable (budget ${v.allowed})`);\n console.error('\\n' + formatFixes(reports));\n return 1;\n }\n default:\n console.error('usage: rerender-lens <panel|fixes|causes|summary|compare|budget> ...');\n return cmd ? 1 : 0;\n }\n } catch (e) {\n console.error((e as Error).message);\n return 1;\n }\n}\n\nconst isMain = typeof process !== 'undefined' && Array.isArray(process.argv) && /rerender-lens(\\.c?js)?$|cli\\.c?js$/.test(process.argv[1] || '');\nif (isMain) void Promise.resolve(main(process.argv.slice(2))).then((code) => process.exit(code));\n"]}
|
|
1
|
+
{"version":3,"sources":["../node_modules/tsup/assets/cjs_shims.js","../src/diff.ts","../src/causes.ts","../src/fixes.ts","../src/sessions.ts","../src/budget.ts","../src/relay.ts","../src/cli.ts"],"names":["dirname","fileURLToPath","join","existsSync","createServer","readFileSync","randomBytes","writeFileSync"],"mappings":"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","file":"cli.cjs","sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","import type { Change, ChangeKind } from './types';\n\nconst REACT_ELEMENT = Symbol.for('react.element');\nconst REACT_TRANSITIONAL_ELEMENT = Symbol.for('react.transitional.element');\n\nexport function isReactElement(v: unknown): v is { type: unknown; props: Record<string, unknown>; key: unknown } {\n if (typeof v !== 'object' || v === null) return false;\n const t = (v as { $$typeof?: unknown }).$$typeof;\n return t === REACT_ELEMENT || t === REACT_TRANSITIONAL_ELEMENT;\n}\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n if (typeof v !== 'object' || v === null) return false;\n const proto = Object.getPrototypeOf(v);\n return proto === Object.prototype || proto === null;\n}\n\ntype Seen = Map<object, Set<object>>;\n\nfunction remember(seen: Seen, a: object, b: object): boolean {\n let set = seen.get(a);\n if (!set) {\n set = new Set();\n seen.set(a, set);\n }\n if (set.has(b)) return true;\n set.add(b);\n return false;\n}\n\n/**\n * Bounds the work of one comparison scope (a commit, or one public `deepEqual` call): pairs already\n * compared are memoized, so a large value shared by many components is walked once per commit, and\n * a visit budget turns a huge structure into \"different\" instead of freezing the page.\n */\ninterface DiffScope {\n cache: WeakMap<object, WeakMap<object, boolean>>;\n remaining: number;\n exhausted: boolean;\n}\nlet scope: DiffScope | null = null;\n/** Object visits allowed for one public `deepEqual` call. */\nexport const DEFAULT_DIFF_BUDGET = 50_000;\n\n/** Start a scope (`onCommit` does this per commit); call the returned function to end it. */\nexport function beginDiffScope(budget = 200_000): () => void {\n const previous = scope;\n scope = { cache: new WeakMap(), remaining: budget, exhausted: false };\n return () => {\n scope = previous;\n };\n}\n\n/** True when the current scope gave up on a value because it was too large to walk. */\nexport function diffBudgetExhausted(): boolean {\n return scope?.exhausted === true;\n}\n\n/**\n * Structural equality that understands Map, Set, Date, RegExp, typed arrays,\n * React elements and cyclic references. Functions are equal only by reference.\n */\nexport function deepEqual(a: unknown, b: unknown, seen: Seen = new Map()): boolean {\n if (Object.is(a, b)) return true;\n if (typeof a !== typeof b) return false;\n if (typeof a !== 'object' || a === null || b === null) return false;\n if (!scope) {\n const end = beginDiffScope(DEFAULT_DIFF_BUDGET);\n try {\n return deepEqual(a, b, seen);\n } finally {\n end();\n }\n }\n const sc = scope;\n const objA = a as object;\n const objB = b as object;\n const hit = sc.cache.get(objA)?.get(objB);\n if (hit !== undefined) return hit;\n if (--sc.remaining < 0) {\n sc.exhausted = true;\n return false;\n }\n const result = deepEqualObjects(objA, objB, seen);\n let m = sc.cache.get(objA);\n if (!m) {\n m = new WeakMap();\n sc.cache.set(objA, m);\n }\n m.set(objB, result);\n return result;\n}\n\nfunction deepEqualObjects(a: object, b: object, seen: Seen): boolean {\n const objA = a;\n const objB = b;\n if (remember(seen, objA, objB)) return true; // cycle: assume equal on this branch\n\n if (a instanceof Date) return b instanceof Date && a.getTime() === b.getTime();\n if (a instanceof RegExp) return b instanceof RegExp && a.source === b.source && a.flags === b.flags;\n\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) if (!deepEqual(a[i], b[i], seen)) return false;\n return true;\n }\n if (Array.isArray(b)) return false;\n\n if (ArrayBuffer.isView(a)) {\n if (!ArrayBuffer.isView(b) || a.constructor !== b.constructor) return false;\n const ta = a as unknown as ArrayLike<number>;\n const tb = b as unknown as ArrayLike<number>;\n if (ta.length !== tb.length) return false;\n for (let i = 0; i < ta.length; i++) if (ta[i] !== tb[i]) return false;\n return true;\n }\n\n if (a instanceof Map) {\n if (!(b instanceof Map) || a.size !== b.size) return false;\n for (const [k, v] of a) {\n if (!b.has(k) || !deepEqual(v, b.get(k), seen)) return false;\n }\n return true;\n }\n if (a instanceof Set) {\n if (!(b instanceof Set) || a.size !== b.size) return false;\n if (a.size > 50) {\n // Members that are equal-but-not-identical would need O(n²) work; large sets compare by identity.\n for (const v of a) if (!b.has(v)) return false;\n return true;\n }\n outer: for (const v of a) {\n if (b.has(v)) continue;\n for (const w of b) if (deepEqual(v, w, seen)) continue outer;\n return false;\n }\n return true;\n }\n\n if (isReactElement(a)) {\n if (!isReactElement(b)) return false;\n return a.type === b.type && a.key === b.key && deepEqual(a.props, b.props, seen);\n }\n\n if (isPlainObject(a) && isPlainObject(b)) {\n const ka = Object.keys(a);\n const kb = Object.keys(b);\n if (ka.length !== kb.length) return false;\n const rb = b as Record<string, unknown>;\n for (const k of ka) {\n if (!Object.prototype.hasOwnProperty.call(b, k)) return false;\n if (!deepEqual((a as Record<string, unknown>)[k], rb[k], seen)) return false;\n }\n return true;\n }\n\n // Class instances, DOM nodes, promises, etc.: reference equality only.\n return false;\n}\n\n/** Change kinds that mean \"new reference, same contents\": the ones a fix removes. */\nexport const AVOIDABLE_KINDS: ReadonlySet<string> = new Set<ChangeKind>(['deep-equal', 'function', 'element']);\n\n/** Classify why two values differ. Assumes `!Object.is(prev, next)`. */\nexport function classify(prev: unknown, next: unknown): ChangeKind {\n if (typeof prev === 'function' && typeof next === 'function') {\n return prev.name === next.name && prev.toString() === next.toString() ? 'function' : 'different';\n }\n if (isReactElement(prev) && isReactElement(next)) {\n return deepEqual(prev, next) ? 'element' : 'different';\n }\n return deepEqual(prev, next) ? 'deep-equal' : 'different';\n}\n\nfunction joinPath(base: string, key: string | number): string {\n if (typeof key === 'number') return `${base}[${key}]`;\n if (base === '') return key;\n return /^[A-Za-z_$][\\w$]*$/.test(key) ? `${base}.${key}` : `${base}[${JSON.stringify(key)}]`;\n}\n\n/**\n * Shallow-diff two records. Every changed key produces exactly one Change;\n * for `different` values that are plain objects/arrays, the nested path that\n * actually differs is reported in `path` to make the console output actionable.\n */\nexport function diffRecords(\n prev: Record<string, unknown> | undefined | null,\n next: Record<string, unknown> | undefined | null,\n basePath = '',\n): Change[] {\n const p = prev ?? {};\n const n = next ?? {};\n const changes: Change[] = [];\n const keys = new Set([...Object.keys(p), ...Object.keys(n)]);\n for (const key of keys) {\n const inPrev = Object.prototype.hasOwnProperty.call(p, key);\n const inNext = Object.prototype.hasOwnProperty.call(n, key);\n const path = joinPath(basePath, key);\n if (inPrev && !inNext) {\n changes.push({ path, kind: 'removed', prev: p[key], next: undefined });\n continue;\n }\n if (!inPrev && inNext) {\n changes.push({ path, kind: 'added', prev: undefined, next: n[key] });\n continue;\n }\n const a = p[key];\n const b = n[key];\n if (Object.is(a, b)) continue;\n const kind = classify(a, b);\n if (kind === 'different') {\n // Once the budget is gone the nested walk would only burn more time; report the top-level key.\n changes.push({ path: diffBudgetExhausted() ? path : (firstDifferentPath(a, b, path) ?? path), kind, prev: a, next: b });\n } else {\n changes.push({ path, kind, prev: a, next: b });\n }\n }\n return changes;\n}\n\n/**\n * Walk plain objects/arrays to find the deepest path where the values first differ, e.g. `style.color`\n * or `items[2].id`; null when they are deep-equal. Two different values with no path to descend into\n * (primitives at the root) give `(value)`. Works on live values and on the panel's serialized ones.\n */\nexport function firstDifferentPath(a: unknown, b: unknown, path = '', depth = 0): string | null {\n if (depth > 8) return path || '(value)';\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return path ? `${path}.length` : 'length';\n for (let i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], b[i])) return firstDifferentPath(a[i], b[i], joinPath(path, i), depth + 1);\n }\n return null;\n }\n if (isPlainObject(a) && isPlainObject(b)) {\n const keys = new Set([...Object.keys(a), ...Object.keys(b)]);\n for (const k of keys) {\n if (!deepEqual(a[k], b[k])) return firstDifferentPath(a[k], b[k], joinPath(path, k), depth + 1);\n }\n return null;\n }\n return deepEqual(a, b) ? null : path || '(value)';\n}\n\nexport interface Leaf {\n path: string;\n prev: unknown;\n next: unknown;\n}\n\n/** Every leaf at which two values differ, at most `limit` of them (the panel's diff view of `different` changes). */\nexport function diffLeaves(a: unknown, b: unknown, limit = 20, path = '', out: Leaf[] = []): Leaf[] {\n if (out.length >= limit || Object.is(a, b)) return out;\n if (Array.isArray(a) && Array.isArray(b)) {\n const n = Math.max(a.length, b.length);\n for (let i = 0; i < n && out.length < limit; i++) diffLeaves(a[i], b[i], limit, joinPath(path, i), out);\n return out;\n }\n if (isPlainObject(a) && isPlainObject(b)) {\n for (const k of new Set([...Object.keys(a), ...Object.keys(b)])) {\n if (out.length >= limit) break;\n diffLeaves(a[k], b[k], limit, joinPath(path, k), out);\n }\n return out;\n }\n if (!deepEqual(a, b)) out.push({ path: path || '(value)', prev: a, next: b });\n return out;\n}\n","/**\n * Commit and root-cause analysis: which component's own change started each render cascade, which\n * contexts fanned out to how many consumers, and a nested view of one commit. Reports carry a\n * `commitId` (every report from one React commit shares it) and `parent` links (the nearest ancestor\n * that rendered in the same commit); following those links inside a commit finds the root cause.\n * One implementation for the library (the CLI, the Vitest reporter, `formatFixes`) and the DevTools\n * panel, which adds its own per-commit memoization on top. Typed over `ReportLike`. Pure.\n */\nimport { AVOIDABLE_KINDS } from './diff';\nimport type { RenderReport, ReportLike } from './types';\n\nexport interface RootCause {\n name: string;\n trigger: string;\n /** Avoidable re-renders in the commit that trace back to this component. */\n count: number;\n components: Map<string, number>;\n}\n\nexport interface ContextStat {\n name: string;\n consumers: number;\n avoidable: number;\n components: Map<string, number>;\n commits: Set<number>;\n /** Components rendering the Provider (usually one). */\n providers: Map<string, number>;\n /** Keys that changed in object values, and the largest key count seen. */\n changedKeys: Set<string>;\n totalKeys: number;\n}\n\nexport interface CommitAnalysis<R extends ReportLike = RenderReport> {\n /** The commit id (`commitId` of its reports), 0 when the reports carry none. */\n id: number;\n total: number;\n avoidable: number;\n /** Sum of `selfDuration` over the avoidable reports, in ms. */\n wasted: number;\n roots: RootCause[];\n /** Root cause name of every avoidable report (what `roots` was aggregated from). */\n rootByReport: Map<R, string>;\n contexts: ContextStat[];\n reports: R[];\n}\n\nexport interface CascadeNode<R extends ReportLike = RenderReport> {\n name: string;\n children: Map<string, CascadeNode<R>>;\n report: R | null;\n count?: number;\n avoidable?: number;\n}\n\nexport interface RootSummary<R extends ReportLike = RenderReport, A extends CommitAnalysis<R> = CommitAnalysis<R>> {\n name: string;\n trigger: string;\n /** Newest first. */\n commits: { key: number; analysis: A; count: number; components: Map<string, number> }[];\n /** Avoidable re-renders across every commit. */\n total: number;\n components: Map<string, number>;\n /** The avoidable reports that trace back to this root cause. */\n affected: R[];\n}\n\n/** One root cause across a whole run: how many commits it started and what those cost. */\nexport interface RankedRootCause {\n name: string;\n trigger: string;\n commits: number;\n /** Avoidable re-renders it caused. */\n count: number;\n components: Map<string, number>;\n}\n\nconst isAncestorReport = (anc: ReportLike, r: ReportLike): boolean =>\n anc.path.length < r.path.length && r.path[anc.path.length] === anc.component && anc.path.every((p, i) => r.path[i] === p);\n\nconst bump = (m: Map<string, number>, key: string, n = 1): void => void m.set(key, (m.get(key) || 0) + n);\n\n/** One commit's reports grouped by component name, so a parent lookup is O(same-named reports) instead of O(commit). */\nexport function indexByComponent<R extends ReportLike>(reports: readonly R[]): Map<string, R[]> {\n const index = new Map<string, R[]>();\n for (const r of reports) {\n const list = index.get(r.component);\n if (list) list.push(r);\n else index.set(r.component, [r]);\n }\n return index;\n}\n\n/**\n * Walk `parent` links inside one commit up to the component whose own change started the cascade.\n * Null when `r` started it itself; `report` is null when the root is an ancestor that is not in the\n * commit (untracked), in which case `name`/`trigger` come from the last `parent` link.\n */\nexport function rootCauseOf<R extends ReportLike>(r: R, commitReports: readonly R[], index: Map<string, R[]> = indexByComponent(commitReports)): { name: string; trigger: string; report: R | null } | null {\n let cur = r;\n const seen = new Set<R>([r]);\n while (cur.trigger === 'parent' && cur.parent) {\n const parent = cur.parent;\n const candidates = index.get(parent.name);\n const p = candidates && candidates.find((x) => isAncestorReport(x, cur));\n if (!p || seen.has(p)) return { name: parent.name, trigger: parent.trigger, report: null };\n seen.add(p);\n cur = p;\n }\n return cur === r ? null : { name: cur.component, trigger: cur.trigger, report: cur };\n}\n\n/** Root causes of one commit's avoidable reports, most re-renders first. */\nfunction rootCausesOf<R extends ReportLike>(reports: readonly R[]): Pick<CommitAnalysis<R>, 'roots' | 'rootByReport' | 'avoidable' | 'wasted'> {\n const roots = new Map<string, RootCause>();\n const rootByReport = new Map<R, string>();\n const index = indexByComponent(reports);\n let avoidable = 0;\n let wasted = 0;\n for (const r of reports) {\n if (!r.avoidable) continue;\n avoidable++;\n if (typeof r.selfDuration === 'number') wasted += r.selfDuration;\n const root = rootCauseOf(r, reports, index);\n const name = root ? root.name : (r.parent && r.parent.name) || '(unknown)';\n const trigger = root ? root.trigger : (r.parent && r.parent.trigger) || 'parent';\n rootByReport.set(r, name);\n let agg = roots.get(name);\n if (!agg) {\n agg = { name, trigger, count: 0, components: new Map() };\n roots.set(name, agg);\n }\n agg.count++;\n bump(agg.components, r.component);\n }\n return { roots: [...roots.values()].sort((a, b) => b.count - a.count), rootByReport, avoidable, wasted };\n}\n\n/** Analyze the reports of one commit: what started the cascade, which contexts changed, what it cost. */\nexport function analyzeCommit<R extends ReportLike>(reports: R[]): CommitAnalysis<R> {\n const first = reports[0];\n return {\n id: first && typeof first.commitId === 'number' ? first.commitId : 0,\n total: reports.length,\n ...rootCausesOf(reports),\n contexts: contextAttribution(reports),\n reports,\n };\n}\n\n/** Which contexts changed and how many consumers re-rendered because of them. */\nexport function contextAttribution(reports: readonly ReportLike[]): ContextStat[] {\n const byCtx = new Map<string, ContextStat>();\n for (const r of reports) {\n for (const c of r.hookChanges || []) {\n if (c.hook !== 'useContext' && !/^useContext/.test(c.path)) continue;\n const m = /useContext\\((.*)\\)/.exec(c.path);\n const name = m && m[1] ? m[1] : c.path;\n let agg = byCtx.get(name);\n if (!agg) {\n agg = { name, consumers: 0, avoidable: 0, components: new Map(), commits: new Set(), providers: new Map(), changedKeys: new Set(), totalKeys: 0 };\n byCtx.set(name, agg);\n }\n agg.consumers++;\n if (AVOIDABLE_KINDS.has(c.kind)) agg.avoidable++;\n bump(agg.components, r.component);\n agg.commits.add(typeof r.commitId === 'number' ? r.commitId : 0);\n if (c.provider && c.provider.component) bump(agg.providers, c.provider.component);\n if (c.changedKeys) for (const k of c.changedKeys) agg.changedKeys.add(k);\n if (typeof c.totalKeys === 'number') agg.totalKeys = Math.max(agg.totalKeys, c.totalKeys);\n }\n }\n return [...byCtx.values()].sort((a, b) => b.consumers - a.consumers);\n}\n\n/** Nested cascade for one commit: every report placed under its ancestors (untracked ancestors appear as plain names). */\nexport function cascadeTree<R extends ReportLike>(reports: readonly R[]): CascadeNode<R> {\n const root: CascadeNode<R> = { name: '', children: new Map(), report: null };\n for (const r of reports) {\n let node = root;\n for (const seg of r.path.concat([r.component])) {\n let next = node.children.get(seg);\n if (!next) {\n next = { name: seg, children: new Map(), report: null };\n node.children.set(seg, next);\n }\n node = next;\n }\n if (!node.report || r.avoidable) node.report = r;\n node.count = (node.count || 0) + 1;\n if (r.avoidable) node.avoidable = (node.avoidable || 0) + 1;\n }\n return root;\n}\n\n/**\n * Every commit a component started (as the root cause), across the whole session.\n * `analyze` lets a caller (the panel) pass its per-commit memoized analysis.\n */\nexport function rootCauseSummary<R extends ReportLike>(name: string, commits: Iterable<[number, R[]]>): RootSummary<R>;\nexport function rootCauseSummary<R extends ReportLike, A extends CommitAnalysis<R>>(name: string, commits: Iterable<[number, R[]]>, analyze: (key: number, reports: R[]) => A): RootSummary<R, A>;\nexport function rootCauseSummary<R extends ReportLike, A extends CommitAnalysis<R>>(name: string, commits: Iterable<[number, R[]]>, analyze?: (key: number, reports: R[]) => A): RootSummary<R, A> {\n const analyzeFn = analyze || ((_: number, reports: R[]): A => analyzeCommit(reports) as A);\n const out: RootSummary<R, A> = { name, trigger: 'parent', commits: [], total: 0, components: new Map(), affected: [] };\n for (const [key, reports] of commits) {\n const analysis = analyzeFn(key, reports);\n const root = analysis.roots.find((x) => x.name === name);\n if (!root) continue;\n out.trigger = root.trigger;\n out.commits.push({ key, analysis, count: root.count, components: root.components });\n out.total += root.count;\n for (const [c, n] of root.components) bump(out.components, c, n);\n for (const r of reports) if (r.avoidable && analysis.rootByReport.get(r) === name) out.affected.push(r);\n }\n out.commits.reverse();\n return out;\n}\n\n/** Reports grouped by `commitId` in first-seen order. Reports without one (`useWhyRerender`, protocol 1) are left out. */\nexport function groupByCommit<R extends ReportLike>(reports: readonly R[]): Map<number, R[]> {\n const out = new Map<number, R[]>();\n for (const r of reports) {\n if (typeof r.commitId !== 'number' || r.commitId <= 0) continue;\n const list = out.get(r.commitId);\n if (list) list.push(r);\n else out.set(r.commitId, [r]);\n }\n return out;\n}\n\n/** Root causes across every commit in `reports`, most avoidable re-renders caused first. */\nexport function rankRootCauses(reports: readonly ReportLike[]): RankedRootCause[] {\n const byName = new Map<string, RankedRootCause>();\n for (const commit of groupByCommit(reports).values()) {\n for (const root of rootCausesOf(commit).roots) {\n let agg = byName.get(root.name);\n if (!agg) {\n agg = { name: root.name, trigger: root.trigger, commits: 0, count: 0, components: new Map() };\n byName.set(root.name, agg);\n }\n agg.commits++;\n agg.count += root.count;\n for (const [c, n] of root.components) bump(agg.components, c, n);\n }\n }\n return [...byName.values()].sort((a, b) => b.count - a.count || b.commits - a.commits || a.name.localeCompare(b.name));\n}\n\nconst plural = (n: number, word: string): string => `${n} ${word}${n === 1 ? '' : 's'}`;\n\n/**\n * Multi-line root-cause table for a test failure or a CI log, one line per root cause:\n * `<Page> (state) started 3 commits, 12 avoidable re-renders (<Row> x10, <Toolbar> x2)`.\n * Empty when nothing is avoidable or the reports carry no `commitId`.\n */\nexport function formatRootCauses(reports: readonly ReportLike[], limit = 5): string {\n const ranked = rankRootCauses(reports);\n const lines = ranked\n .slice(0, limit)\n .map((root, i) => `${String(i + 1).padStart(2)}. <${root.name}> (${root.trigger}) started ${plural(root.commits, 'commit')}, ${plural(root.count, 'avoidable re-render')} (${[...root.components].map(([c, n]) => `<${c}>${n > 1 ? ' x' + n : ''}`).join(', ')})`);\n if (ranked.length > limit) lines.push(` … ${ranked.length - limit} more`);\n return lines.join('\\n');\n}\n","/**\n * Concrete fixes derived from reports, ranked by how many avoidable re-renders each one removes.\n * One implementation for the library (tests, CI budgets, the CLI, typed on `RenderReport`) and the\n * DevTools panel (serialized reports): everything here reads only `ReportLike`. Pure.\n */\nimport type { ChangeLike, RenderReport, ReportLike } from './types';\nimport { AVOIDABLE_KINDS } from './diff';\nimport { formatRootCauses } from './causes';\n\nexport { AVOIDABLE_KINDS };\n\nexport type FixKind = 'memo' | 'useCallback' | 'useMemo' | 'useMemoElement' | 'children' | 'contextValue' | 'splitContext' | 'storeSnapshot' | 'bailout';\n\nexport interface Fix {\n kind: FixKind;\n /** Where the change goes (the component that must be edited, or `<Ctx>.Provider`). */\n owner: string;\n /** The component whose re-render this removes. */\n target: string;\n prop: string | null;\n label: string;\n detail: string;\n /** Code sketch of the fix, `// <owner>` on the first line. */\n snippet: string;\n}\n\nexport interface RankedFix<R extends ReportLike = RenderReport> extends Fix {\n key: string;\n /** Avoidable re-renders this fix removes. */\n count: number;\n components: Record<string, number>;\n /** The first (at most 50) reports the fix applies to. */\n reports: R[];\n}\n\nconst MAX_FIX_REPORTS = 50;\nconst rootOf = (path: string): string => path.split(/[.[]/)[0] || path;\nconst identifier = (name: string): string => (/^[A-Za-z_$][\\w$]*$/.test(name) ? name : 'value');\n\n/** `JSON.stringify` cut to `max` characters, for snippets and markdown; never throws. */\nexport function shortValue(v: unknown, max = 60): string {\n let s: string | undefined;\n try {\n s = JSON.stringify(v);\n } catch {\n s = String(v);\n }\n if (s === undefined) s = String(v);\n return s.length > max ? s.slice(0, max - 3) + '...' : s;\n}\n\n/** The concrete fixes one report suggests, each attributed to the component (file) that must change. */\nexport function fixesFor(r: ReportLike): Fix[] {\n const out: Fix[] = [];\n const ownerName = r.owner || (r.parent && r.parent.name) || null;\n const propChanges = r.propChanges || [];\n const changes: ChangeLike[] = [...propChanges, ...(r.stateChanges || []), ...(r.hookChanges || [])];\n // Not memoized: props alone will never stop the re-render, so React.memo comes first (in addition to\n // any prop fixes below). Reports from protocol-1 libraries have no `memoized`; assume memoized then.\n if (r.avoidable && (changes.length === 0 || r.memoized === false)) {\n const identical = changes.length === 0;\n out.push({\n kind: 'memo',\n owner: r.component,\n target: r.component,\n prop: null,\n label: `Wrap <${r.component}> in React.memo`,\n detail: identical\n ? `<${r.component}> re-rendered with identical props because <${(r.parent && r.parent.name) || 'its parent'}> re-rendered.`\n : `<${r.component}> is not memoized: fixing its props alone will not stop the re-render.`,\n snippet: `// ${r.component}\\nimport { memo } from 'react';\\n\\nexport const ${r.component} = memo(function ${r.component}(props) {\\n // ...\\n});\\n// class components: extend PureComponent instead`,\n });\n }\n for (const c of propChanges) {\n if (!AVOIDABLE_KINDS.has(c.kind)) continue;\n const owner = ownerName || '?';\n const root = rootOf(c.path);\n const id = identifier(root);\n if (root === 'children' && (c.kind === 'element' || c.kind === 'deep-equal')) {\n out.push({\n kind: 'children',\n owner,\n target: r.component,\n prop: 'children',\n label: `memoize children of <${r.component}> in <${owner}>`,\n detail: `<${owner}> re-creates the children of <${r.component}> on every render; they have the same types and props each time.`,\n snippet:\n `// ${owner}\\nimport { useMemo } from 'react';\\n\\nconst children = useMemo(() => (\\n <>{/* the same elements */}</>\\n), [/* deps */]);\\n\\n<${r.component}>{children}</${r.component}>\\n\\n` +\n `// static children: hoist them to module scope\\nconst STATIC = <em>hi</em>;`,\n });\n } else if (c.kind === 'function') {\n out.push({\n kind: 'useCallback',\n owner,\n target: r.component,\n prop: root,\n label: `useCallback(${root}) in <${owner}>`,\n detail: `prop \"${c.path}\" of <${r.component}> is a new function on every render of <${owner}>.`,\n snippet: `// ${owner}\\nimport { useCallback } from 'react';\\n\\nconst ${id} = useCallback((/* args */) => {\\n // ...\\n}, [/* deps */]);\\n\\n<${r.component} ${root}={${id}} />`,\n });\n } else if (c.kind === 'element') {\n out.push({\n kind: 'useMemoElement',\n owner,\n target: r.component,\n prop: root,\n label: `memoize element prop ${root} in <${owner}>`,\n detail: `prop \"${c.path}\" of <${r.component}> is a new element with the same type and props on every render of <${owner}>.`,\n snippet: `// ${owner}\\nimport { useMemo } from 'react';\\n\\nconst ${id} = useMemo(() => ${shortValue(c.next, 40)}, [/* deps */]);\\n// or pass it as children from a component that does not re-render`,\n });\n } else {\n const isArray = Array.isArray(c.next);\n out.push({\n kind: 'useMemo',\n owner,\n target: r.component,\n prop: root,\n label: `useMemo(${root}) in <${owner}>`,\n detail: `prop \"${c.path}\" of <${r.component}> is a new ${isArray ? 'array' : 'object'} with the same contents on every render of <${owner}>.`,\n snippet:\n `// ${owner}\\nimport { useMemo } from 'react';\\n\\nconst ${id} = useMemo(() => (${shortValue(c.next, 80)}), [/* deps */]);\\n\\n` +\n `// or, when it never changes, hoist it to module scope:\\nconst ${id.toUpperCase()} = ${shortValue(c.next, 80)};`,\n });\n }\n }\n for (const c of [...(r.stateChanges || []), ...(r.hookChanges || [])]) {\n const isContext = c.hook === 'useContext' || /^useContext/.test(c.path);\n const ctxName = isContext ? (/useContext\\((.*)\\)/.exec(c.path) || [])[1] || 'Context' : '';\n const providerOwner = isContext && c.provider && c.provider.component ? c.provider.component : null;\n // A genuine change of a few keys in an object context still re-renders every consumer.\n if (isContext && c.kind === 'different' && c.changedKeys && typeof c.totalKeys === 'number' && c.changedKeys.length > 0 && c.changedKeys.length < c.totalKeys) {\n out.push({\n kind: 'splitContext',\n owner: providerOwner || `${ctxName}.Provider`,\n target: r.component,\n prop: ctxName,\n label: `split ${ctxName}${providerOwner ? ` in <${providerOwner}>` : ''}: only ${c.changedKeys.join(', ')} changed`,\n detail: `${c.changedKeys.map((k) => `\"${k}\"`).join(', ')} of ${c.totalKeys} keys changed in ${ctxName}, yet every consumer (like <${r.component}>) re-rendered. Consumers that read the other keys re-render for nothing.`,\n snippet:\n `// ${providerOwner || 'Provider'}\\n// one context per independently-changing slice\\nconst ${identifier(ctxName)}Static = createContext(...);\\nconst ${identifier(ctxName)}${c.changedKeys.map((k) => k[0]!.toUpperCase() + k.slice(1)).join('')} = createContext(...);\\n\\n` +\n `// or keep one context and let consumers select a slice:\\nconst ${c.changedKeys[0]} = useContextSelector(${ctxName}, (v) => v.${c.changedKeys[0]});`,\n });\n continue;\n }\n if (!AVOIDABLE_KINDS.has(c.kind)) continue;\n if (isContext) {\n out.push({\n kind: 'contextValue',\n owner: providerOwner || `${ctxName}.Provider`,\n target: r.component,\n prop: ctxName,\n label: `memoize the ${ctxName} provider value${providerOwner ? ` in <${providerOwner}>` : ''}`,\n detail: `<${r.component}> re-rendered because ${ctxName} produced a new value that is deep-equal to the previous one${providerOwner ? ` (Provider rendered by <${providerOwner}>)` : ''}.`,\n snippet: `// ${providerOwner || `where <${ctxName}.Provider> is rendered`}\\nconst value = useMemo(() => ({ /* ... */ }), [/* deps */]);\\n<${ctxName}.Provider value={value}>`,\n });\n } else if (c.hook === 'useSyncExternalStore') {\n const chain = c.custom || [];\n const redux = chain.some((n) => /^use(App)?Selector$/.test(n));\n const zustand = !redux && chain.some((n) => /^use[A-Z]\\w*Store$/.test(n) || n === 'useStore' || n === 'useBoundStore');\n const via = chain.length ? ` via ${chain.join(' › ')}` : '';\n out.push({\n kind: 'storeSnapshot',\n owner: r.component,\n target: r.component,\n prop: c.path,\n label: redux ? `memoize the selector in <${r.component}>` : zustand ? `useShallow in <${r.component}>` : `stable getSnapshot in <${r.component}>`,\n detail: redux\n ? `the selector${via} returns a new object on every call, so the component re-renders on every store change.`\n : zustand\n ? `the store selector${via} returns a new object on every call, so the component re-renders on every store change.`\n : `${c.path}${via} returned a new reference with the same contents; getSnapshot must return a cached value.`,\n snippet: redux\n ? `// ${r.component}\\nimport { shallowEqual } from 'react-redux';\\nconst slice = useSelector(selectSlice, shallowEqual);\\n// or memoize: const selectSlice = createSelector([selectA, selectB], (a, b) => ({ a, b }));`\n : zustand\n ? `// ${r.component}\\nimport { useShallow } from 'zustand/react/shallow';\\nconst { a, b } = useStore(useShallow((s) => ({ a: s.a, b: s.b })));\\n// or select a primitive: const a = useStore((s) => s.a);`\n : `// ${r.component}\\n// getSnapshot must return the same reference while the data is unchanged\\nconst snapshot = useSyncExternalStore(subscribe, store.getSnapshot /* cached */);`,\n });\n } else {\n out.push({\n kind: 'bailout',\n owner: r.component,\n target: r.component,\n prop: c.path,\n label: `bail out before setting ${c.path} in <${r.component}>`,\n detail: `${c.path} was set to a value deep-equal to the current one (new reference).`,\n snippet: `// ${r.component}\\nsetState((prev) => (deepEqual(prev, next) ? prev : next));`,\n });\n }\n }\n return out;\n}\n\nexport const fixKey = (f: Fix): string => `${f.kind}|${f.owner}|${f.prop || f.target}`;\n\n/** Every fix across `reports`, most avoidable re-renders removed first. */\nexport function rankFixes<R extends ReportLike>(reports: readonly R[]): RankedFix<R>[] {\n const byKey = new Map<string, RankedFix<R>>();\n for (const r of reports) {\n if (!r.avoidable) continue;\n for (const f of fixesFor(r)) {\n const key = fixKey(f);\n let agg = byKey.get(key);\n if (!agg) {\n agg = { ...f, key, count: 0, components: {}, reports: [] };\n byKey.set(key, agg);\n }\n agg.count++;\n agg.components[r.component] = (agg.components[r.component] || 0) + 1;\n if (agg.reports.length < MAX_FIX_REPORTS) agg.reports.push(r);\n }\n }\n return [...byKey.values()].sort((a, b) => b.count - a.count || a.label.localeCompare(b.label));\n}\n\n/**\n * Multi-line text for a test failure or a CI log: the ranked fixes, then (when the reports carry\n * `commitId`) a \"Root causes\" section naming the components whose own changes started the cascades.\n */\nexport function formatFixes(reports: readonly ReportLike[], limit = 10): string {\n const ranked = rankFixes(reports);\n if (!ranked.length) return 'No avoidable re-renders.';\n const lines = ranked.slice(0, limit).map((f, i) => `${String(i + 1).padStart(2)}. ${f.label} (removes ${f.count}: ${Object.entries(f.components).map(([c, n]) => `<${c}>${n > 1 ? ' x' + n : ''}`).join(', ')})`);\n if (ranked.length > limit) lines.push(` … ${ranked.length - limit} more`);\n const roots = formatRootCauses(reports, 5);\n if (roots) lines.push('', 'Root causes:', roots);\n return lines.join('\\n');\n}\n","/**\n * Session summaries and before/after comparison, the same shape the extension records and exports,\n * so a session file committed next to the code can be compared in CI or with the CLI. Pure.\n */\nimport type { RenderReport, ReportLike } from './types';\nimport { rankFixes } from './fixes';\n\nexport interface SessionSummary {\n id: string;\n name: string;\n startedAt: number;\n endedAt: number | null;\n total: number;\n avoidable: number;\n wasted: number;\n byComponent: Record<string, { total: number; avoidable: number; wasted: number }>;\n fixes: { key: string; label: string; count: number }[];\n}\n\nexport interface CompareRow {\n component: string;\n before: number;\n after: number;\n delta: number;\n}\n\nexport interface Comparison {\n before: SessionSummary;\n after: SessionSummary;\n rows: CompareRow[];\n total: { before: number; after: number; delta: number };\n avoidable: { before: number; after: number; delta: number };\n wasted: { before: number; after: number; delta: number };\n resolvedFixes: SessionSummary['fixes'];\n newFixes: SessionSummary['fixes'];\n /** Components whose avoidable re-renders went up. */\n regressions: CompareRow[];\n}\n\nexport function summarizeReports(reports: readonly ReportLike[], meta: Partial<Pick<SessionSummary, 'id' | 'name' | 'startedAt' | 'endedAt'>> = {}): SessionSummary {\n const byComponent: SessionSummary['byComponent'] = {};\n let avoidable = 0;\n let wasted = 0;\n for (const r of reports) {\n const c = (byComponent[r.component] ||= { total: 0, avoidable: 0, wasted: 0 });\n c.total++;\n if (r.avoidable) {\n c.avoidable++;\n avoidable++;\n if (typeof r.selfDuration === 'number') {\n c.wasted += r.selfDuration;\n wasted += r.selfDuration;\n }\n }\n }\n return {\n id: meta.id ?? `s${Date.now().toString(36)}`,\n name: meta.name ?? 'session',\n startedAt: meta.startedAt ?? (reports[0]?.time ?? 0),\n endedAt: meta.endedAt ?? (reports[reports.length - 1]?.time ?? null),\n total: reports.length,\n avoidable,\n wasted,\n byComponent,\n fixes: rankFixes(reports).map((f) => ({ key: f.key, label: f.label, count: f.count })),\n };\n}\n\nexport function compareSummaries(before: SessionSummary, after: SessionSummary): Comparison {\n const names = new Set([...Object.keys(before.byComponent), ...Object.keys(after.byComponent)]);\n const rows: CompareRow[] = [];\n for (const component of names) {\n const b = before.byComponent[component]?.avoidable || 0;\n const a = after.byComponent[component]?.avoidable || 0;\n if (b || a) rows.push({ component, before: b, after: a, delta: a - b });\n }\n rows.sort((x, y) => x.delta - y.delta || y.before - x.before || x.component.localeCompare(y.component));\n const afterKeys = new Set(after.fixes.map((f) => f.key));\n const beforeKeys = new Set(before.fixes.map((f) => f.key));\n return {\n before,\n after,\n rows,\n total: { before: before.total, after: after.total, delta: after.total - before.total },\n avoidable: { before: before.avoidable, after: after.avoidable, delta: after.avoidable - before.avoidable },\n wasted: { before: before.wasted, after: after.wasted, delta: after.wasted - before.wasted },\n resolvedFixes: before.fixes.filter((f) => !afterKeys.has(f.key)),\n newFixes: after.fixes.filter((f) => !beforeKeys.has(f.key)),\n regressions: rows.filter((r) => r.delta > 0),\n };\n}\n\n/** The panel's spelling: summarize a recorded session (`id`/`name`/`startedAt`/`endedAt` come from the session). */\nexport const summarizeSession = (session: Pick<SessionSummary, 'id' | 'name' | 'startedAt' | 'endedAt'>, reports: readonly ReportLike[]): SessionSummary => summarizeReports(reports, session);\n\n/** Alias of `compareSummaries` (the panel's name). */\nexport const compareSessions = compareSummaries;\n\n/** Plain-text table of a comparison (CLI, CI logs). */\nexport function formatComparison(c: Comparison): string {\n const w = Math.max(14, ...c.rows.map((r) => r.component.length + 2));\n const line = (label: string, b: string | number, a: string | number, d: string): string => `${label.padEnd(w)} ${String(b).padStart(8)} ${String(a).padStart(8)} ${d.padStart(8)}`;\n const delta = (n: number, suffix = ''): string => (n === 0 ? '±0' : `${n > 0 ? '+' : ''}${Number.isInteger(n) ? n : n.toFixed(1)}${suffix}`);\n const out = [line('avoidable', c.before.name.slice(0, 8), c.after.name.slice(0, 8), 'Δ'), line('all components', c.avoidable.before, c.avoidable.after, delta(c.avoidable.delta))];\n if (c.wasted.before || c.wasted.after) out.push(line('wasted ms', c.wasted.before.toFixed(1), c.wasted.after.toFixed(1), delta(Number(c.wasted.delta.toFixed(1)))));\n for (const r of c.rows) out.push(line(`<${r.component}>`, r.before, r.after, delta(r.delta)));\n if (c.resolvedFixes.length) out.push('', 'no longer needed:', ...c.resolvedFixes.map((f) => ` - ${f.label}`));\n if (c.newFixes.length) out.push('', 'new:', ...c.newFixes.map((f) => ` - ${f.label}`));\n return out.join('\\n');\n}\n\n/** Reports from a panel export (`{ rerenderLens: true, reports }`), a bare array, or a session summary file. */\nexport function parseExport(data: unknown): { reports: RenderReport[]; sessions: SessionSummary[]; summary: SessionSummary | null } {\n if (Array.isArray(data)) return { reports: data as RenderReport[], sessions: [], summary: null };\n if (data && typeof data === 'object') {\n const d = data as { reports?: unknown; sessions?: unknown; byComponent?: unknown };\n if (Array.isArray(d.reports)) return { reports: d.reports as RenderReport[], sessions: Array.isArray(d.sessions) ? (d.sessions as SessionSummary[]) : [], summary: null };\n if (d.byComponent && typeof d.byComponent === 'object') return { reports: [], sessions: [], summary: data as SessionSummary };\n }\n throw new Error('not a rerender-lens export or session summary');\n}\n","/**\n * Re-render budgets for CI: a JSON baseline of allowed avoidable re-renders per component, checked\n * against a collector's reports (like a bundle-size budget). Pure; reading and writing the file is\n * up to the test runner (`fs`), so this works in Node and in the browser.\n */\nimport type { RenderReport } from './types';\nimport { formatFixes } from './fixes';\n\n/** `{ \"*\": 0, \"ProductRow\": 3 }`: max avoidable re-renders per component; `*` is the default. */\nexport type Budget = Record<string, number>;\n\nexport interface BudgetViolation {\n component: string;\n avoidable: number;\n allowed: number;\n}\n\nexport interface BudgetResult {\n ok: boolean;\n violations: BudgetViolation[];\n /** Components with headroom left, so budgets can be tightened. */\n slack: { component: string; avoidable: number; allowed: number }[];\n counts: Record<string, number>;\n}\n\nexport function avoidableCounts(reports: RenderReport[]): Record<string, number> {\n const counts: Record<string, number> = {};\n for (const r of reports) if (r.avoidable) counts[r.component] = (counts[r.component] || 0) + 1;\n return counts;\n}\n\nexport function checkBudget(reports: RenderReport[], budget: Budget | number): BudgetResult {\n const b: Budget = typeof budget === 'number' ? { '*': budget } : budget;\n const fallback = typeof b['*'] === 'number' ? b['*'] : 0;\n const counts = avoidableCounts(reports);\n const violations: BudgetViolation[] = [];\n const slack: BudgetResult['slack'] = [];\n const names = new Set([...Object.keys(counts), ...Object.keys(b).filter((k) => k !== '*')]);\n for (const component of names) {\n const allowed = typeof b[component] === 'number' ? b[component]! : fallback;\n const avoidable = counts[component] || 0;\n if (avoidable > allowed) violations.push({ component, avoidable, allowed });\n else if (avoidable < allowed) slack.push({ component, avoidable, allowed });\n }\n violations.sort((x, y) => y.avoidable - y.allowed - (x.avoidable - x.allowed));\n return { ok: violations.length === 0, violations, slack, counts };\n}\n\n/** A budget that exactly matches the current counts (the baseline to commit). */\nexport function toBudget(reports: RenderReport[]): Budget {\n return { '*': 0, ...avoidableCounts(reports) };\n}\n\n/** Throws with the violations and the ranked fixes; use it from a test. */\nexport function assertWithinBudget(reports: RenderReport[], budget: Budget | number): BudgetResult {\n const result = checkBudget(reports, budget);\n if (result.ok) return result;\n const lines = result.violations.map((v) => ` <${v.component}>: ${v.avoidable} avoidable re-render${v.avoidable === 1 ? '' : 's'} (budget ${v.allowed})`);\n throw new Error(`Re-render budget exceeded:\\n${lines.join('\\n')}\\n\\nFixes, most impact first:\\n${formatFixes(reports)}`);\n}\n","/**\n * A tiny local relay (`npx rerender-lens panel`): serves the panel and forwards messages between\n * app pages and panel pages over Server-Sent Events + POST, so any app (Next.js, Webpack, a\n * production-like build) gets the panel without the extension and without a same-origin channel.\n *\n * GET / redirect to /panel.html?relay=<this server>\n * GET /panel.(html|js|css) the panel page\n * GET /events?role=app SSE: commands from panels (first message: this app's id)\n * GET /events?role=panel SSE: hello / report / clear from apps, replies to commands\n * POST /message one message or an array; `{ __rerenderLens }` and replies go to\n * panels, `{ __rerenderLensCmd }` goes to apps\n *\n * Several apps can share one relay. Each app connection gets an id; the relay tells the app its id,\n * stamps `app` on everything that app sends, and sends panels the roster whenever it changes. A\n * command carrying `app` goes to that one app, a command without it goes to all of them, so a panel\n * or a library that knows nothing about ids behaves exactly as before.\n *\n * Dependency-free (node:http). Bound to 127.0.0.1 by default, where CORS is open and no token is\n * needed. On any other host `rerender-lens panel` generates a token: `/events`, `/message` and\n * `/status` then require it (`?token=` or the `x-rerender-lens-token` header) and the URL it prints\n * carries it, because reports contain the app's prop, state and context values.\n */\nimport { createServer, type IncomingMessage, type Server, type ServerResponse } from 'node:http';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport interface RelayOptions {\n port?: number;\n host?: string;\n /** Directory with panel.html/js/css; found automatically in the package. */\n panelDir?: string | null;\n /** Milliseconds between SSE keep-alive comments. Default 15000. */\n keepAliveMs?: number;\n /**\n * Require this token on `/events`, `/message` and `/status`. `rerender-lens panel` generates one\n * whenever it binds to anything but loopback; the URL it prints carries it as `?token=`.\n */\n token?: string;\n}\n\n/** One connected app page. `label` is what the panel's app chooser shows. */\nexport interface RelayApp {\n id: string;\n label: string;\n}\n\nexport interface RelayServer {\n server: Server;\n /** `http://127.0.0.1:4141` once listening. */\n url: string;\n /** The URL to hand to a panel or an app: `url`, plus `?token=` when one is required. */\n connectUrl: string;\n port: number;\n close(): Promise<void>;\n /** Connected app and panel streams. */\n counts(): { apps: number; panels: number };\n /** The connected apps, in connection order. */\n appList(): RelayApp[];\n}\n\n/** Same marker and protocol the library and the panel use (`src/devtools.ts`); kept literal so the relay stays dependency-free. */\nconst MARKER = '__rerenderLens';\nconst PROTOCOL = 2;\n\nconst MIME: Record<string, string> = { '.html': 'text/html; charset=utf-8', '.js': 'text/javascript; charset=utf-8', '.css': 'text/css; charset=utf-8' };\n\nexport function findPanelDir(): string | null {\n const here = dirname(fileURLToPath(import.meta.url));\n for (const dir of [join(here, '..', 'panel'), join(here, '..', 'extension'), join(here, '..', '..', 'extension')]) {\n if (existsSync(join(dir, 'panel.html')) && existsSync(join(dir, 'panel.js'))) return dir;\n }\n return null;\n}\n\nconst cors = (res: ServerResponse): void => {\n res.setHeader('Access-Control-Allow-Origin', '*');\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type');\n};\n\nfunction readBody(req: IncomingMessage, limit = 8 * 1024 * 1024): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n let size = 0;\n req.on('data', (c: Buffer) => {\n size += c.length;\n if (size > limit) {\n reject(new Error('body too large'));\n req.destroy();\n return;\n }\n chunks.push(c);\n });\n req.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));\n req.on('error', reject);\n });\n}\n\nexport function createRelayServer(options: RelayOptions = {}): Promise<RelayServer> {\n const host = options.host ?? '127.0.0.1';\n const panelDir = options.panelDir === undefined ? findPanelDir() : options.panelDir;\n const keepAliveMs = options.keepAliveMs ?? 15_000;\n const token = options.token || null;\n const apps = new Map<ServerResponse, RelayApp>();\n const panels = new Set<ServerResponse>();\n let url = '';\n let nextAppId = 1;\n const connectUrl = (): string => (token ? `${url}?token=${encodeURIComponent(token)}` : url);\n\n const line = (message: unknown): string => `data: ${JSON.stringify(message)}\\n\\n`;\n const sendTo = (res: ServerResponse, message: unknown): void => {\n try {\n res.write(line(message));\n } catch {\n apps.delete(res);\n panels.delete(res);\n }\n };\n const send = (targets: Iterable<ServerResponse>, message: unknown): void => {\n const text = line(message);\n for (const res of [...targets]) {\n try {\n res.write(text);\n } catch {\n apps.delete(res);\n panels.delete(res);\n }\n }\n };\n\n const appList = (): RelayApp[] => [...apps.values()];\n const roster = (): unknown => ({ [MARKER]: true, version: PROTOCOL, type: 'relay', payload: { apps: apps.size, list: appList() } });\n const streamOf = (id: string): ServerResponse | null => {\n for (const [res, app] of apps) if (app.id === id) return res;\n return null;\n };\n\n const route = (message: unknown, from?: RelayApp): void => {\n if (!message || typeof message !== 'object') return;\n const m = message as Record<string, unknown>;\n if (m.__rerenderLensCmd === true) {\n // A command names its app when the panel is watching one of several; otherwise every app answers.\n const target = typeof m.app === 'string' ? streamOf(m.app) : null;\n if (target) sendTo(target, m);\n else send(apps.keys(), m);\n } else if (m.__rerenderLens === true || m.__rerenderLensReply === true) {\n send(panels, from ? { ...m, app: from.id } : m);\n }\n };\n\n /** With a token set, everything that carries data needs it; the static panel files do not. */\n const authorized = (req: IncomingMessage, u: URL): boolean => {\n if (!token) return true;\n const given = u.searchParams.get('token') || (typeof req.headers['x-rerender-lens-token'] === 'string' ? req.headers['x-rerender-lens-token'] : '');\n return given === token;\n };\n\n const server = createServer(async (req, res) => {\n cors(res);\n const u = new URL(req.url || '/', 'http://relay');\n if (req.method === 'OPTIONS') {\n res.statusCode = 204;\n res.end();\n return;\n }\n if (u.pathname === '/' && req.method === 'GET') {\n res.statusCode = 302;\n res.setHeader('Location', `/panel.html?relay=${encodeURIComponent(connectUrl())}`);\n res.end();\n return;\n }\n if (/^\\/(events|message|status)$/.test(u.pathname) && !authorized(req, u)) {\n res.statusCode = 401;\n res.setHeader('Content-Type', 'text/plain');\n res.end('rerender-lens relay: this relay needs the token from the URL it printed (?token=...)');\n return;\n }\n if (u.pathname === '/events' && req.method === 'GET') {\n const isApp = u.searchParams.get('role') === 'app';\n res.statusCode = 200;\n res.setHeader('Content-Type', 'text/event-stream');\n res.setHeader('Cache-Control', 'no-store');\n res.setHeader('Connection', 'keep-alive');\n res.write(': connected\\n\\n');\n const app: RelayApp | null = isApp ? { id: `a${nextAppId++}`, label: (u.searchParams.get('label') || req.headers.origin || '').slice(0, 120) || `app ${nextAppId - 1}` } : null;\n if (app) apps.set(res, app);\n else panels.add(res);\n const ping = setInterval(() => {\n try {\n res.write(': ping\\n\\n');\n } catch {\n /* closed */\n }\n }, keepAliveMs);\n req.on('close', () => {\n clearInterval(ping);\n apps.delete(res);\n panels.delete(res);\n });\n // Panels learn the roster as soon as their stream is open (that first message is also how a\n // panel knows it is safe to send commands: replies only reach panels that are already connected),\n // and again whenever an app comes or goes, so they show \"disconnected\" instead of waiting.\n if (app) {\n sendTo(res, { __rerenderLensRelay: true, version: PROTOCOL, app: app.id }); // the app stamps this on what it sends\n send(panels, roster());\n req.on('close', () => send(panels, roster()));\n } else {\n sendTo(res, roster());\n }\n return;\n }\n if (u.pathname === '/favicon.ico') {\n res.statusCode = 204;\n res.end();\n return;\n }\n if (u.pathname === '/message' && req.method === 'POST') {\n try {\n const parsed = JSON.parse((await readBody(req)) || 'null') as unknown;\n const sender = u.searchParams.get('app');\n const from = sender ? (appList().find((a) => a.id === sender) ?? undefined) : undefined;\n for (const m of Array.isArray(parsed) ? parsed : [parsed]) route(m, from);\n res.statusCode = 204;\n res.end();\n } catch (e) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'text/plain');\n res.end(String((e as Error).message || e));\n }\n return;\n }\n if (u.pathname === '/status' && req.method === 'GET') {\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ ok: true, apps: apps.size, panels: panels.size, list: appList() }));\n return;\n }\n const file = u.pathname.replace(/^\\//, '');\n if (/^panel\\.(html|js|css)$/.test(file) && req.method === 'GET') {\n if (!panelDir) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'text/plain');\n res.end('rerender-lens: panel files not found (is the package built?)');\n return;\n }\n res.statusCode = 200;\n res.setHeader('Content-Type', MIME[file.slice(file.lastIndexOf('.'))] || 'application/octet-stream');\n res.setHeader('Cache-Control', 'no-store');\n res.end(readFileSync(join(panelDir, file)));\n return;\n }\n res.statusCode = 404;\n res.setHeader('Content-Type', 'text/plain');\n res.end('not found');\n });\n\n return new Promise((resolve, reject) => {\n server.once('error', reject);\n server.listen(options.port ?? 4141, host, () => {\n const addr = server.address();\n const port = typeof addr === 'object' && addr ? addr.port : options.port ?? 4141;\n url = `http://${host === '0.0.0.0' || host === '::' ? 'localhost' : host}:${port}`;\n resolve({\n server,\n url,\n connectUrl: connectUrl(),\n port,\n counts: () => ({ apps: apps.size, panels: panels.size }),\n appList,\n close: () =>\n new Promise<void>((done) => {\n for (const res of [...apps.keys(), ...panels]) res.end();\n apps.clear();\n panels.clear();\n server.close(() => done());\n }),\n });\n });\n });\n}\n","#!/usr/bin/env node\n/**\n * rerender-lens CLI: work with panel exports and session files from a terminal or CI.\n *\n * rerender-lens fixes <export.json> ranked fixes for the reports in an export\n * rerender-lens causes <export.json> root causes: which component started each commit's cascade\n * rerender-lens summary <export.json> [--out s.json] session summary of an export (commit it as a baseline)\n * rerender-lens compare <before.json> <after.json> before/after table; exit 1 on regressions\n * rerender-lens budget <export.json> <budget.json> check avoidable re-renders per component; exit 1 on violations\n * rerender-lens budget <export.json> --init print a budget matching the export\n * rerender-lens panel [--port 4141] [--host 127.0.0.1] [--token X | --no-token]\n * serve the panel and relay reports from any app\n */\nimport { readFileSync, writeFileSync } from 'node:fs';\nimport { formatFixes } from './fixes';\nimport { formatRootCauses } from './causes';\nimport { compareSummaries, formatComparison, parseExport, summarizeReports, type SessionSummary } from './sessions';\nimport { checkBudget, toBudget, type Budget } from './budget';\nimport { createRelayServer } from './relay';\nimport { randomBytes } from 'node:crypto';\n\nconst read = (file: string): unknown => JSON.parse(readFileSync(file, 'utf8'));\n\nfunction summaryOf(file: string): SessionSummary {\n const parsed = parseExport(read(file));\n if (parsed.summary) return parsed.summary;\n if (parsed.sessions.length && !parsed.reports.length) return parsed.sessions[parsed.sessions.length - 1]!;\n return summarizeReports(parsed.reports, { name: file.replace(/^.*[\\\\/]/, '').replace(/\\.json$/, '') });\n}\n\n/** Loopback needs no token; anything else is reachable by other machines, and reports carry app data. */\nconst isLoopback = (host: string): boolean => host === '127.0.0.1' || host === 'localhost' || host === '::1';\n\n/** `rerender-lens panel`: start the relay and keep running until it closes. */\nasync function panelCommand(args: string[]): Promise<number> {\n const flag = (name: string): string | null => {\n const i = args.indexOf(name);\n return i >= 0 ? (args[i + 1] ?? '') : null;\n };\n const host = flag('--host') || '127.0.0.1';\n const given = flag('--token');\n const token = args.includes('--no-token') ? null : given || (isLoopback(host) ? null : randomToken());\n const relay = await createRelayServer({ port: Number(flag('--port') || 4141), host, token: token ?? undefined });\n console.log(`rerender-lens panel: ${relay.connectUrl}/`);\n console.log(`in the app: createDevtoolsNotifier({ relay: '${relay.connectUrl}' }) or window.__RERENDER_LENS_RELAY__ = '${relay.connectUrl}'`);\n if (token) console.log('The token in that URL is required: reports carry your app\\'s prop, state and context values.');\n else if (!isLoopback(host)) console.log(`WARNING: ${host} is reachable by other machines and --no-token was given: anyone who can reach this port can read every report.`);\n console.log('Ctrl+C to stop.');\n return new Promise((resolve) => {\n const stop = (): void => void relay.close().then(() => resolve(0));\n process.once('SIGINT', stop);\n process.once('SIGTERM', stop);\n relay.server.once('close', () => resolve(0));\n });\n}\n\n/** 128 bits, URL-safe: enough for a dev-time shared secret. */\nfunction randomToken(): string {\n return randomBytes(16).toString('base64url');\n}\n\nexport function main(argv: string[]): number | Promise<number> {\n const [cmd, ...args] = argv;\n if (cmd === 'panel') return panelCommand(args).catch((e: Error) => (console.error(e.message), 1));\n const flag = (name: string): string | null => {\n const i = args.indexOf(name);\n return i >= 0 ? (args[i + 1] ?? '') : null;\n };\n const positional = args.filter((a, i) => !a.startsWith('--') && !(i > 0 && args[i - 1]!.startsWith('--') && args[i - 1] !== '--init'));\n try {\n switch (cmd) {\n case 'fixes': {\n const file = positional[0];\n if (!file) throw new Error('usage: rerender-lens fixes <export.json>');\n const { reports } = parseExport(read(file));\n console.log(formatFixes(reports, Number(flag('--limit') || 20)));\n return 0;\n }\n case 'causes': {\n const file = positional[0];\n if (!file) throw new Error('usage: rerender-lens causes <export.json> [--limit N]');\n const { reports } = parseExport(read(file));\n console.log(formatRootCauses(reports, Number(flag('--limit') || 10)) || 'No root causes: no avoidable re-renders, or the reports carry no commit ids.');\n return 0;\n }\n case 'summary': {\n const file = positional[0];\n if (!file) throw new Error('usage: rerender-lens summary <export.json> [--out summary.json]');\n const summary = summaryOf(file);\n const out = flag('--out');\n if (out) {\n writeFileSync(out, JSON.stringify(summary, null, 2) + '\\n');\n console.log(`${out}: ${summary.total} renders, ${summary.avoidable} avoidable`);\n } else console.log(JSON.stringify(summary, null, 2));\n return 0;\n }\n case 'compare': {\n const [a, b] = positional;\n if (!a || !b) throw new Error('usage: rerender-lens compare <before.json> <after.json>');\n const cmp = compareSummaries(summaryOf(a), summaryOf(b));\n console.log(formatComparison(cmp));\n if (cmp.regressions.length) {\n console.error(`\\n${cmp.regressions.length} component${cmp.regressions.length === 1 ? '' : 's'} regressed.`);\n return 1;\n }\n return 0;\n }\n case 'budget': {\n const file = positional[0];\n if (!file) throw new Error('usage: rerender-lens budget <export.json> <budget.json> | --init');\n const { reports } = parseExport(read(file));\n if (args.includes('--init')) {\n console.log(JSON.stringify(toBudget(reports), null, 2));\n return 0;\n }\n const budgetFile = positional[1];\n if (!budgetFile) throw new Error('usage: rerender-lens budget <export.json> <budget.json>');\n const result = checkBudget(reports, read(budgetFile) as Budget);\n if (result.ok) {\n console.log(`Within budget (${Object.keys(result.counts).length} components with avoidable re-renders).`);\n return 0;\n }\n for (const v of result.violations) console.error(`<${v.component}>: ${v.avoidable} avoidable (budget ${v.allowed})`);\n console.error('\\n' + formatFixes(reports));\n return 1;\n }\n default:\n console.error('usage: rerender-lens <panel|fixes|causes|summary|compare|budget> ...');\n return cmd ? 1 : 0;\n }\n } catch (e) {\n console.error((e as Error).message);\n return 1;\n }\n}\n\nconst isMain = typeof process !== 'undefined' && Array.isArray(process.argv) && /rerender-lens(\\.c?js)?$|cli\\.c?js$/.test(process.argv[1] || '');\nif (isMain) void Promise.resolve(main(process.argv.slice(2))).then((code) => process.exit(code));\n"]}
|