rerender-lens 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types.ts","../src/diff.ts","../src/report.ts","../src/state.ts","../src/tracker.ts"],"names":[],"mappings":"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","file":"chunk-DOYB4MKH.cjs","sourcesContent":["import type * as ReactNS from 'react';\n\n/** Why a single prop/state/hook value differs between two renders. */\nexport type ChangeKind =\n /** New reference, but deep-equal to the previous value. Avoidable. */\n | 'deep-equal'\n /** A new function with the same name/body shape. Almost always avoidable. */\n | 'function'\n /** A new React element that renders the same type with deep-equal props. Avoidable. */\n | 'element'\n /** The value genuinely changed. */\n | 'different'\n /** Key was added. */\n | 'added'\n /** Key was removed. */\n | 'removed';\n\nexport interface Change {\n /** Dot path from the root, e.g. `style.color` or `items[2]`. */\n path: string;\n kind: ChangeKind;\n prev: unknown;\n next: unknown;\n}\n\n/** What caused a re-render. */\nexport type RenderTrigger =\n /** At least one prop genuinely changed. */\n | 'props'\n /** Props are equal by value, but the parent re-rendered. Wrap in React.memo. */\n | 'parent'\n /** Own state (useState/useReducer/this.setState) changed. */\n | 'state'\n /** A non-state hook value (useContext, useSyncExternalStore) changed. */\n | 'hooks'\n /** More than one of the above. */\n | 'mixed';\n\nexport interface HookChange extends Change {\n /** `useState`, `useReducer`, `useContext`, ... */\n hook: string;\n /** Position of the hook in call order (0-based). */\n index: number;\n}\n\nexport interface RenderReport {\n /** Display name of the tracked component. */\n component: string;\n /** Monotonic per-component render count (1 = first update, mount is never reported). */\n renderCount: number;\n trigger: RenderTrigger;\n /** True when the re-render produced no genuine change in props, state, or hooks. */\n avoidable: boolean;\n props: { prev: Record<string, unknown>; next: Record<string, unknown> };\n propChanges: Change[];\n /** Class components only. */\n stateChanges: Change[];\n /** Function components only, when `trackHooks` is on. */\n hookChanges: HookChange[];\n /** Human-readable explanations and suggested fixes. */\n reasons: string[];\n /** `performance.now()` (or `Date.now()`) when the report was produced. */\n time: number;\n}\n\nexport type Notifier = (report: RenderReport) => void;\n\nexport type ComponentMatcher = string | RegExp | ((displayName: string) => boolean);\n\nexport interface Options {\n /** Track every `React.memo`-wrapped component and every `PureComponent`. Default false. */\n trackAllMemoized?: boolean;\n /** Track every component, memoized or not. Noisy. Default false. */\n trackAllComponents?: boolean;\n /** Components to track by display name (string = exact match). */\n include?: ComponentMatcher[];\n /** Components never to track, even when marked. */\n exclude?: ComponentMatcher[];\n /** Capture `useState`/`useReducer`/`useContext` values and diff them. Default true. */\n trackHooks?: boolean;\n /** Report re-renders caused by genuine changes too, not only avoidable ones. Default false. */\n logAll?: boolean;\n /** Do not print to the console. Reports still reach `notifier`. Default false. */\n silent?: boolean;\n /** Receive every report. Combine several with `combineNotifiers`. */\n notifier?: Notifier;\n /** Use `console.groupCollapsed` instead of `console.group`. Default true. */\n collapse?: boolean;\n /** Console-like sink used for printing. Default `console`. */\n console?: Pick<Console, 'log' | 'group' | 'groupCollapsed' | 'groupEnd' | 'warn'>;\n}\n\n/**\n * The React object to patch. Structural so that both `import React from 'react'`\n * and `import * as React from 'react'` type-check.\n */\nexport type ReactLike = Pick<typeof ReactNS, 'createElement' | 'memo' | 'forwardRef' | 'useRef'> &\n Partial<Pick<typeof ReactNS, 'useState' | 'useReducer' | 'useContext' | 'useSyncExternalStore'>>;\n\n/** Marker static: `MyComponent.rerenderLens = true` opts a component in. */\nexport const MARKER = 'rerenderLens' as const;\n\nexport interface TrackableStatics {\n [MARKER]?: boolean;\n displayName?: string;\n name?: string;\n}\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 * 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 const objA = a as object;\n const objB = b as object;\n\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 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 for (const k of ka) {\n if (!Object.prototype.hasOwnProperty.call(b, k)) return false;\n if (!deepEqual(a[k], (b as Record<string, unknown>)[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/** 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 changes.push({ path: firstDifferentPath(a, b, 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/** Walk plain objects/arrays to find the deepest path where the values first differ. */\nexport function firstDifferentPath(a: unknown, b: unknown, path: string, depth = 0): string {\n if (depth > 8) return path;\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return `${path}.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 path;\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 path;\n }\n return path;\n}\n","import type { Change, HookChange, Options, RenderReport, RenderTrigger } from './types';\n\nconst now = (): number =>\n typeof performance !== 'undefined' && typeof performance.now === 'function' ? performance.now() : Date.now();\n\nexport interface BuildInput {\n component: string;\n renderCount: number;\n prevProps: Record<string, unknown>;\n nextProps: Record<string, unknown>;\n propChanges: Change[];\n stateChanges?: Change[];\n hookChanges?: HookChange[];\n}\n\nconst isGenuine = (c: Change): boolean => c.kind === 'different' || c.kind === 'added' || c.kind === 'removed';\n\nexport function fixFor(change: Change): string {\n switch (change.kind) {\n case 'function':\n return `wrap it in useCallback (or hoist it out of the parent's render)`;\n case 'element':\n return `memoize the element with useMemo, or pass it as children from a stable parent`;\n case 'deep-equal':\n return Array.isArray(change.next)\n ? `memoize the array with useMemo (same items, new reference)`\n : `memoize the object with useMemo, or hoist it to module scope if it is constant`;\n default:\n return '';\n }\n}\n\nfunction describe(change: Change): string {\n switch (change.kind) {\n case 'deep-equal':\n return `prop \"${change.path}\" is a new reference but deep-equal to the previous value`;\n case 'function':\n return `prop \"${change.path}\" is a new function instance on every render`;\n case 'element':\n return `prop \"${change.path}\" is a new React element with the same type and props`;\n case 'different':\n return `prop \"${change.path}\" changed`;\n case 'added':\n return `prop \"${change.path}\" was added`;\n case 'removed':\n return `prop \"${change.path}\" was removed`;\n }\n}\n\nexport function buildReport(input: BuildInput): RenderReport {\n const stateChanges = input.stateChanges ?? [];\n const hookChanges = input.hookChanges ?? [];\n const isStateHook = (h: HookChange): boolean => h.hook === 'useState' || h.hook === 'useReducer';\n const genuineProps = input.propChanges.some(isGenuine);\n const genuineState = stateChanges.some(isGenuine) || hookChanges.some((h) => isStateHook(h) && isGenuine(h));\n const genuineHooks = hookChanges.some((h) => !isStateHook(h) && isGenuine(h));\n const causes = [genuineProps && 'props', genuineState && 'state', genuineHooks && 'hooks'].filter(Boolean) as RenderTrigger[];\n\n let trigger: RenderTrigger;\n if (causes.length === 0) trigger = 'parent';\n else if (causes.length === 1) trigger = causes[0]!;\n else trigger = 'mixed';\n\n const avoidable = trigger === 'parent';\n const reasons: string[] = [];\n\n if (avoidable && input.propChanges.length === 0 && stateChanges.length === 0 && hookChanges.length === 0) {\n reasons.push(\n `re-rendered with identical props because its parent re-rendered. Wrap \"${input.component}\" in React.memo (or extend PureComponent).`,\n );\n }\n for (const c of input.propChanges) {\n const fix = fixFor(c);\n reasons.push(fix ? `${describe(c)}: ${fix}.` : `${describe(c)}.`);\n }\n for (const c of stateChanges) {\n if (isGenuine(c)) reasons.push(`state \"${c.path}\" changed.`);\n else reasons.push(`setState was called with a value deep-equal to the current \"${c.path}\" (new reference, same contents).`);\n }\n for (const c of hookChanges) {\n if (isGenuine(c)) reasons.push(`${c.hook} #${c.index} changed.`);\n else if (isStateHook(c))\n reasons.push(`${c.hook} #${c.index} was set to a value deep-equal to the current one (new reference, same contents): reuse the existing object or bail out before calling the setter.`);\n else reasons.push(`${c.hook} #${c.index} returned a new reference that is deep-equal to the previous value: memoize the context/store value where it is produced.`);\n }\n\n return {\n component: input.component,\n renderCount: input.renderCount,\n trigger,\n avoidable,\n props: { prev: input.prevProps, next: input.nextProps },\n propChanges: input.propChanges,\n stateChanges,\n hookChanges,\n reasons,\n time: now(),\n };\n}\n\nconst KIND_LABEL: Record<Change['kind'], string> = {\n 'deep-equal': 'equal by value',\n function: 'new function',\n element: 'equal element',\n different: 'changed',\n added: 'added',\n removed: 'removed',\n};\n\nexport function summarize(report: RenderReport): string {\n const counts = new Map<string, number>();\n for (const c of [...report.propChanges, ...report.stateChanges, ...report.hookChanges]) {\n counts.set(c.kind, (counts.get(c.kind) ?? 0) + 1);\n }\n const parts = [...counts].map(([kind, n]) => `${n} ${KIND_LABEL[kind as Change['kind']]}`);\n if (parts.length === 0) parts.push('no changes');\n return parts.join(', ');\n}\n\n/** Default notifier: prints a console group per report. */\nexport function printReport(report: RenderReport, options: Options): void {\n const c = options.console ?? console;\n const open = options.collapse === false ? c.group : c.groupCollapsed;\n const verdict = report.avoidable ? 'avoidable re-render' : `re-render (${report.trigger})`;\n open.call(c, `[rerender-lens] <${report.component}> ${verdict}: ${summarize(report)}`);\n for (const r of report.reasons) c.log(`- ${r}`);\n for (const ch of [...report.propChanges, ...report.stateChanges, ...report.hookChanges]) {\n c.log(`${ch.path} (${KIND_LABEL[ch.kind]})`, { prev: ch.prev, next: ch.next });\n }\n c.log('props', report.props);\n c.groupEnd();\n}\n","import type { Options, ReactLike, RenderReport } from './types';\nimport { printReport } from './report';\n\nexport interface HookSample {\n hook: string;\n value: unknown;\n}\n\ntype PatchableKey = 'createElement' | 'useState' | 'useReducer' | 'useContext' | 'useSyncExternalStore';\n\nexport interface LensState {\n React: ReactLike | null;\n options: Options;\n /** Bumped by configure(); invalidates cached track/no-track decisions. */\n generation: number;\n decisions: WeakMap<object, { generation: number; tracked: boolean }>;\n wrappers: WeakMap<object, object>;\n wrapperSet: WeakSet<object>;\n originals: Partial<Record<PatchableKey, (...args: unknown[]) => unknown>>;\n /** Hook samples for the tracked component currently rendering, if any. */\n capture: HookSample[] | null;\n patched: boolean;\n}\n\nconst KEY = Symbol.for('rerender-lens.state');\n\n/**\n * State lives on globalThis so that the ESM and CJS builds, and the main and\n * jsx-runtime entries, always share one instance.\n */\nexport function getState(): LensState {\n const g = globalThis as unknown as Record<symbol, LensState | undefined>;\n let s = g[KEY];\n if (!s) {\n s = {\n React: null,\n options: {},\n generation: 0,\n decisions: new WeakMap(),\n wrappers: new WeakMap(),\n wrapperSet: new WeakSet(),\n originals: {},\n capture: null,\n patched: false,\n };\n g[KEY] = s;\n }\n return s;\n}\n\n/** Print (unless silent / not avoidable) and forward to the notifier. */\nexport function dispatch(report: RenderReport, override?: Options): void {\n const options: Options = override ? { ...getState().options, ...override } : getState().options;\n if (!options.silent && (report.avoidable || options.logAll)) {\n printReport(report, options);\n }\n if (options.notifier) {\n try {\n options.notifier(report);\n } catch (err) {\n (options.console ?? console).warn('[rerender-lens] notifier threw', err);\n }\n }\n}\n","import type * as React from 'react';\nimport type { Change, ComponentMatcher, HookChange, Options, ReactLike, TrackableStatics } from './types';\nimport { MARKER } from './types';\nimport { classify, diffRecords } from './diff';\nimport { buildReport } from './report';\nimport { dispatch, getState, type HookSample } from './state';\n\nconst MEMO = Symbol.for('react.memo');\nconst FORWARD_REF = Symbol.for('react.forward_ref');\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyType = any;\n\ninterface MemoType {\n $$typeof: symbol;\n type: AnyType;\n compare: ((a: AnyType, b: AnyType) => boolean) | null;\n displayName?: string;\n}\ninterface ForwardRefType {\n $$typeof: symbol;\n render: (props: AnyType, ref: AnyType) => AnyType;\n displayName?: string;\n}\n\nconst isMemo = (t: unknown): t is MemoType =>\n typeof t === 'object' && t !== null && (t as MemoType).$$typeof === MEMO;\nconst isForwardRef = (t: unknown): t is ForwardRefType =>\n typeof t === 'object' && t !== null && (t as ForwardRefType).$$typeof === FORWARD_REF;\nconst isClass = (t: unknown): t is new (...args: AnyType[]) => React.Component =>\n typeof t === 'function' && !!(t.prototype as { isReactComponent?: unknown } | undefined)?.isReactComponent;\nconst isPureClass = (t: unknown): boolean =>\n isClass(t) && !!(t.prototype as { isPureReactComponent?: unknown }).isPureReactComponent;\nconst isComponentLike = (t: unknown): boolean => typeof t === 'function' || isMemo(t) || isForwardRef(t);\n\nexport function getDisplayName(type: unknown): string {\n if (typeof type === 'string') return type;\n if (isMemo(type)) return type.displayName ?? getDisplayName(type.type);\n if (isForwardRef(type)) return type.displayName ?? getDisplayName(type.render);\n if (typeof type === 'function') {\n const t = type as TrackableStatics;\n return t.displayName ?? (t.name || 'Anonymous');\n }\n return 'Anonymous';\n}\n\nfunction hasMarker(type: unknown): boolean {\n if (type === null || (typeof type !== 'function' && typeof type !== 'object')) return false;\n if ((type as TrackableStatics)[MARKER] === true) return true;\n if (isMemo(type)) return hasMarker(type.type);\n if (isForwardRef(type)) return hasMarker(type.render);\n return false;\n}\n\nfunction matches(m: ComponentMatcher, name: string): boolean {\n if (typeof m === 'string') return m === name;\n if (m instanceof RegExp) return m.test(name);\n return m(name);\n}\n\nexport function shouldTrack(type: unknown, o: Options): boolean {\n if (!isComponentLike(type)) return false;\n const name = getDisplayName(type);\n if (o.exclude?.some((m) => matches(m, name))) return false;\n if (hasMarker(type)) return true;\n if (o.include?.some((m) => matches(m, name))) return true;\n if (o.trackAllComponents) return true;\n if (o.trackAllMemoized) return isMemo(type) || isPureClass(type);\n return false;\n}\n\nconst SKIP_STATICS = new Set(['length', 'name', 'prototype', 'arguments', 'caller', '$$typeof', 'render', 'type', 'compare']);\n\nfunction hoistStatics(from: object, to: object): void {\n for (const key of Object.getOwnPropertyNames(from)) {\n if (SKIP_STATICS.has(key)) continue;\n const desc = Object.getOwnPropertyDescriptor(from, key);\n if (desc) {\n try {\n Object.defineProperty(to, key, desc);\n } catch {\n /* non-configurable target key; ignore */\n }\n }\n }\n}\n\nfunction sameHookRefs(prev: HookSample[] | null, next: HookSample[] | null): boolean {\n if (!prev || !next) return true; // no information: treat as unchanged\n if (prev.length !== next.length) return false;\n for (let i = 0; i < prev.length; i++) if (!Object.is(prev[i]!.value, next[i]!.value)) return false;\n return true;\n}\n\nfunction diffHooks(prev: HookSample[] | null, next: HookSample[] | null): HookChange[] {\n if (!prev || !next) return [];\n const out: HookChange[] = [];\n const len = Math.max(prev.length, next.length);\n for (let i = 0; i < len; i++) {\n const a = prev[i];\n const b = next[i];\n if (!a || !b) continue;\n if (Object.is(a.value, b.value)) continue;\n out.push({ path: `${b.hook}#${i}`, hook: b.hook, index: i, kind: classify(a.value, b.value), prev: a.value, next: b.value });\n }\n return out;\n}\n\ninterface Store {\n props: Record<string, unknown>;\n hooks: HookSample[] | null;\n count: number;\n}\n\nfunction wrapRender(\n R: ReactLike,\n render: (props: AnyType, second?: AnyType) => AnyType,\n name: string,\n): (props: AnyType, second?: AnyType) => AnyType {\n const Wrapped = function (props: Record<string, unknown>, second?: unknown) {\n const s = getState();\n const store = R.useRef<Store | null>(null);\n const capture: HookSample[] | null = s.options.trackHooks === false ? null : [];\n const outer = s.capture;\n s.capture = capture;\n let result: unknown;\n try {\n result = render(props, second);\n } finally {\n s.capture = outer;\n }\n const prev = store.current;\n if (!prev || !s.patched) {\n store.current = { props, hooks: capture, count: prev?.count ?? 0 };\n return result;\n }\n // Same props object and same hook values means React re-invoked the render\n // function without a real update (StrictMode double render). Skip silently.\n const sameProps = prev.props === props;\n if (sameProps && sameHookRefs(prev.hooks, capture)) {\n store.current = { props, hooks: capture, count: prev.count };\n return result;\n }\n const count = prev.count + 1;\n store.current = { props, hooks: capture, count };\n dispatch(\n buildReport({\n component: name,\n renderCount: count,\n prevProps: prev.props,\n nextProps: props,\n propChanges: sameProps ? [] : diffRecords(prev.props, props),\n hookChanges: diffHooks(prev.hooks, capture),\n }),\n );\n return result;\n };\n hoistStatics(render, Wrapped);\n Object.defineProperty(Wrapped, 'name', { value: name, configurable: true });\n (Wrapped as TrackableStatics).displayName = name;\n return Wrapped;\n}\n\nconst COUNT = Symbol.for('rerender-lens.count');\n\nfunction wrapClass(Original: new (...args: AnyType[]) => React.Component, name: string): typeof Original {\n class Tracked extends Original {\n static displayName = name;\n override componentDidUpdate(prevProps: AnyType, prevState: AnyType, snapshot?: AnyType): void {\n const s = getState();\n if (s.patched) {\n const self = this as unknown as Record<symbol, number | undefined>;\n const count = (self[COUNT] = (self[COUNT] ?? 0) + 1);\n const propChanges: Change[] = prevProps === this.props ? [] : diffRecords(prevProps, this.props as Record<string, unknown>);\n const stateChanges: Change[] =\n prevState === this.state ? [] : diffRecords(prevState ?? {}, (this.state as Record<string, unknown>) ?? {});\n dispatch(\n buildReport({\n component: name,\n renderCount: count,\n prevProps,\n nextProps: this.props as Record<string, unknown>,\n propChanges,\n stateChanges,\n }),\n );\n }\n const superDidUpdate = Original.prototype.componentDidUpdate as\n | ((this: React.Component, p: AnyType, st: AnyType, sn?: AnyType) => void)\n | undefined;\n if (superDidUpdate) superDidUpdate.call(this, prevProps, prevState, snapshot);\n }\n }\n return Tracked;\n}\n\nfunction createWrapper(R: ReactLike, type: AnyType): AnyType | null {\n const name = getDisplayName(type);\n if (isMemo(type)) {\n const inner = createWrapper(R, type.type);\n if (!inner) return null;\n const wrapped = R.memo(inner, type.compare ?? undefined) as unknown as MemoType;\n hoistStatics(type, wrapped);\n wrapped.displayName = name;\n return wrapped;\n }\n if (isForwardRef(type)) {\n const wrapped = R.forwardRef(wrapRender(R, type.render, name) as React.ForwardRefRenderFunction<unknown, AnyType>) as unknown as ForwardRefType;\n hoistStatics(type, wrapped);\n wrapped.displayName = name;\n return wrapped;\n }\n if (isClass(type)) return wrapClass(type, name);\n if (typeof type === 'function') return wrapRender(R, type, name);\n return null;\n}\n\n/** Map an element type to its tracked wrapper (or return it unchanged). */\nexport function resolveType(type: AnyType): AnyType {\n const s = getState();\n if (!s.patched || !s.React) return type;\n if (type === null || (typeof type !== 'function' && typeof type !== 'object')) return type;\n if (s.wrapperSet.has(type)) return type;\n\n let tracked: boolean;\n const d = s.decisions.get(type);\n if (d && d.generation === s.generation) {\n tracked = d.tracked;\n } else {\n tracked = shouldTrack(type, s.options);\n s.decisions.set(type, { generation: s.generation, tracked });\n }\n if (!tracked) return type;\n\n let w = s.wrappers.get(type);\n if (!w) {\n const created = createWrapper(s.React, type);\n if (!created) return type;\n w = created as object;\n s.wrappers.set(type, w);\n s.wrapperSet.add(w);\n }\n return w;\n}\n\nconst HOOK_KEYS = ['useState', 'useReducer', 'useContext', 'useSyncExternalStore'] as const;\n\nfunction assign(target: object, key: string, value: unknown): void {\n try {\n (target as Record<string, unknown>)[key] = value;\n } catch {\n /* fallthrough */\n }\n if ((target as Record<string, unknown>)[key] !== value) {\n throw new Error(\n `[rerender-lens] Cannot patch React.${key}. Pass the default import (\\`import React from 'react'\\`), not a namespace import.`,\n );\n }\n}\n\n/**\n * Patch `React.createElement` (and the state hooks) so tracked components report\n * their re-renders. Returns a function that undoes the patch.\n */\nexport function init(R: ReactLike, options: Options = {}): () => void {\n const s = getState();\n if (s.patched) {\n configure(options);\n return disable;\n }\n s.React = R;\n s.options = { ...options };\n s.generation++;\n\n const origCreateElement = R.createElement as (...args: unknown[]) => unknown;\n s.originals.createElement = origCreateElement;\n assign(R, 'createElement', function createElement(this: unknown, ...args: unknown[]) {\n args[0] = resolveType(args[0]);\n return origCreateElement.apply(R, args);\n });\n\n for (const key of HOOK_KEYS) {\n const orig = (R as unknown as Record<string, unknown>)[key] as ((...a: unknown[]) => unknown) | undefined;\n if (typeof orig !== 'function') continue;\n s.originals[key] = orig;\n const patched = function (this: unknown, ...args: unknown[]) {\n const r = orig.apply(this, args);\n const cap = getState().capture;\n if (cap) cap.push({ hook: key, value: key === 'useState' || key === 'useReducer' ? (r as unknown[])[0] : r });\n return r;\n };\n Object.defineProperty(patched, 'name', { value: key, configurable: true });\n assign(R, key, patched);\n }\n\n s.patched = true;\n return disable;\n}\n\n/** Update options at runtime. Include/exclude changes apply to elements created afterwards. */\nexport function configure(options: Options): void {\n const s = getState();\n s.options = { ...s.options, ...options };\n s.generation++;\n}\n\n/** Restore the original React functions. Already-created wrappers keep working but stop reporting. */\nexport function disable(): void {\n const s = getState();\n if (!s.patched || !s.React) return;\n const R = s.React as unknown as Record<string, unknown>;\n for (const [key, orig] of Object.entries(s.originals)) {\n if (orig) R[key] = orig;\n }\n s.originals = {};\n s.patched = false;\n s.React = null;\n s.capture = null;\n}\n\nexport function isEnabled(): boolean {\n return getState().patched;\n}\n\n/**\n * Opt a component in, with types preserved: `export default track(MyComponent)`.\n * Pass `name` for anonymous arrow functions, which have no inferable name.\n */\nexport function track<T>(component: T, name?: string): T {\n const t = component as unknown as TrackableStatics;\n t[MARKER] = true;\n if (name) t.displayName = name;\n return component;\n}\n"]}
package/dist/index.cjs ADDED
@@ -0,0 +1,197 @@
1
+ 'use strict';
2
+
3
+ var chunkDOYB4MKH_cjs = require('./chunk-DOYB4MKH.cjs');
4
+ var react = require('react');
5
+
6
+ function useWhyRerender(name, values, options) {
7
+ const ref = react.useRef({
8
+ committed: null,
9
+ reported: false,
10
+ count: 0
11
+ });
12
+ const st = ref.current;
13
+ if (st.committed && !st.reported) {
14
+ st.reported = true;
15
+ st.count++;
16
+ const propChanges = chunkDOYB4MKH_cjs.diffRecords(st.committed, values);
17
+ chunkDOYB4MKH_cjs.dispatch(
18
+ chunkDOYB4MKH_cjs.buildReport({
19
+ component: name,
20
+ renderCount: st.count,
21
+ prevProps: st.committed,
22
+ nextProps: values,
23
+ propChanges
24
+ }),
25
+ options ? { ...chunkDOYB4MKH_cjs.getState().options, ...options } : void 0
26
+ );
27
+ }
28
+ react.useEffect(() => {
29
+ st.committed = values;
30
+ st.reported = false;
31
+ });
32
+ }
33
+
34
+ // src/notifiers.ts
35
+ function createCollector() {
36
+ const reports = [];
37
+ return {
38
+ reports,
39
+ get avoidable() {
40
+ return reports.filter((r) => r.avoidable);
41
+ },
42
+ notifier: (r) => {
43
+ reports.push(r);
44
+ },
45
+ clear: () => {
46
+ reports.length = 0;
47
+ },
48
+ assertNoAvoidable() {
49
+ const bad = reports.filter((r) => r.avoidable);
50
+ if (bad.length === 0) return;
51
+ const lines = bad.map((r) => ` <${r.component}> render #${r.renderCount}:
52
+ ${r.reasons.map((x) => ` - ${x}`).join("\n")}`);
53
+ throw new Error(`${bad.length} avoidable re-render${bad.length === 1 ? "" : "s"} detected:
54
+ ${lines.join("\n")}`);
55
+ }
56
+ };
57
+ }
58
+ function combineNotifiers(...notifiers) {
59
+ const list = notifiers.filter((n) => typeof n === "function");
60
+ return (report) => {
61
+ for (const n of list) n(report);
62
+ };
63
+ }
64
+
65
+ // src/devtools.ts
66
+ var DEVTOOLS_MARKER = "__rerenderLens";
67
+ var PROTOCOL_VERSION = 1;
68
+ function serialize(value, maxDepth = 6, seen = /* @__PURE__ */ new WeakSet(), depth = 0) {
69
+ if (value === null || value === void 0) return value;
70
+ const t = typeof value;
71
+ if (t === "string" || t === "boolean") return value;
72
+ if (t === "number") return Number.isFinite(value) ? value : String(value);
73
+ if (t === "bigint") return `${String(value)}n`;
74
+ if (t === "symbol") return String(value);
75
+ if (t === "function") return `\u0192 ${value.name || "anonymous"}`;
76
+ const obj = value;
77
+ if (seen.has(obj)) return "[Circular]";
78
+ if (depth >= maxDepth) return "[\u2026]";
79
+ seen.add(obj);
80
+ try {
81
+ if (chunkDOYB4MKH_cjs.isReactElement(obj)) return `<${chunkDOYB4MKH_cjs.getDisplayName(obj.type)}>`;
82
+ if (obj instanceof Date) return { $type: "Date", value: obj.toISOString() };
83
+ if (obj instanceof RegExp) return { $type: "RegExp", value: String(obj) };
84
+ if (obj instanceof Map) {
85
+ return { $type: "Map", entries: [...obj].map(([k, v]) => [serialize(k, maxDepth, seen, depth + 1), serialize(v, maxDepth, seen, depth + 1)]) };
86
+ }
87
+ if (obj instanceof Set) return { $type: "Set", values: [...obj].map((v) => serialize(v, maxDepth, seen, depth + 1)) };
88
+ if (Array.isArray(obj)) return obj.map((v) => serialize(v, maxDepth, seen, depth + 1));
89
+ if (typeof Element !== "undefined" && obj instanceof Element) return `<${obj.tagName.toLowerCase()}>`;
90
+ const out = {};
91
+ for (const k of Object.keys(obj)) out[k] = serialize(obj[k], maxDepth, seen, depth + 1);
92
+ const proto = Object.getPrototypeOf(obj);
93
+ if (proto && proto !== Object.prototype && proto.constructor?.name) out.$type = proto.constructor.name;
94
+ return out;
95
+ } finally {
96
+ seen.delete(obj);
97
+ }
98
+ }
99
+ function createDevtoolsNotifier(options = {}) {
100
+ const bufferSize = options.bufferSize ?? 300;
101
+ const maxDepth = options.maxDepth ?? 6;
102
+ const target = options.target ?? (typeof window !== "undefined" ? window : void 0);
103
+ const buffer = [];
104
+ const post = (type, payload) => {
105
+ if (!target) return;
106
+ const msg = { [DEVTOOLS_MARKER]: true, version: PROTOCOL_VERSION, type, payload };
107
+ target.postMessage(msg, "*");
108
+ };
109
+ const bridge = {
110
+ replay: () => {
111
+ post("hello", { count: buffer.length });
112
+ for (const p of buffer) post("report", p);
113
+ },
114
+ clear: () => {
115
+ buffer.length = 0;
116
+ post("clear");
117
+ },
118
+ get size() {
119
+ return buffer.length;
120
+ },
121
+ version: PROTOCOL_VERSION
122
+ };
123
+ if (typeof window !== "undefined") window.__RERENDER_LENS_DEVTOOLS__ = bridge;
124
+ post("hello", { count: 0 });
125
+ return (report) => {
126
+ const payload = serialize(report, maxDepth);
127
+ buffer.push(payload);
128
+ if (buffer.length > bufferSize) buffer.splice(0, buffer.length - bufferSize);
129
+ post("report", payload);
130
+ };
131
+ }
132
+
133
+ Object.defineProperty(exports, "MARKER", {
134
+ enumerable: true,
135
+ get: function () { return chunkDOYB4MKH_cjs.MARKER; }
136
+ });
137
+ Object.defineProperty(exports, "buildReport", {
138
+ enumerable: true,
139
+ get: function () { return chunkDOYB4MKH_cjs.buildReport; }
140
+ });
141
+ Object.defineProperty(exports, "classify", {
142
+ enumerable: true,
143
+ get: function () { return chunkDOYB4MKH_cjs.classify; }
144
+ });
145
+ Object.defineProperty(exports, "configure", {
146
+ enumerable: true,
147
+ get: function () { return chunkDOYB4MKH_cjs.configure; }
148
+ });
149
+ Object.defineProperty(exports, "deepEqual", {
150
+ enumerable: true,
151
+ get: function () { return chunkDOYB4MKH_cjs.deepEqual; }
152
+ });
153
+ Object.defineProperty(exports, "diffRecords", {
154
+ enumerable: true,
155
+ get: function () { return chunkDOYB4MKH_cjs.diffRecords; }
156
+ });
157
+ Object.defineProperty(exports, "disable", {
158
+ enumerable: true,
159
+ get: function () { return chunkDOYB4MKH_cjs.disable; }
160
+ });
161
+ Object.defineProperty(exports, "getDisplayName", {
162
+ enumerable: true,
163
+ get: function () { return chunkDOYB4MKH_cjs.getDisplayName; }
164
+ });
165
+ Object.defineProperty(exports, "init", {
166
+ enumerable: true,
167
+ get: function () { return chunkDOYB4MKH_cjs.init; }
168
+ });
169
+ Object.defineProperty(exports, "isEnabled", {
170
+ enumerable: true,
171
+ get: function () { return chunkDOYB4MKH_cjs.isEnabled; }
172
+ });
173
+ Object.defineProperty(exports, "printReport", {
174
+ enumerable: true,
175
+ get: function () { return chunkDOYB4MKH_cjs.printReport; }
176
+ });
177
+ Object.defineProperty(exports, "resolveType", {
178
+ enumerable: true,
179
+ get: function () { return chunkDOYB4MKH_cjs.resolveType; }
180
+ });
181
+ Object.defineProperty(exports, "summarize", {
182
+ enumerable: true,
183
+ get: function () { return chunkDOYB4MKH_cjs.summarize; }
184
+ });
185
+ Object.defineProperty(exports, "track", {
186
+ enumerable: true,
187
+ get: function () { return chunkDOYB4MKH_cjs.track; }
188
+ });
189
+ exports.DEVTOOLS_MARKER = DEVTOOLS_MARKER;
190
+ exports.PROTOCOL_VERSION = PROTOCOL_VERSION;
191
+ exports.combineNotifiers = combineNotifiers;
192
+ exports.createCollector = createCollector;
193
+ exports.createDevtoolsNotifier = createDevtoolsNotifier;
194
+ exports.serialize = serialize;
195
+ exports.useWhyRerender = useWhyRerender;
196
+ //# sourceMappingURL=index.cjs.map
197
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hook.ts","../src/notifiers.ts","../src/devtools.ts"],"names":["useRef","diffRecords","dispatch","buildReport","getState","useEffect","isReactElement","getDisplayName"],"mappings":"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","file":"index.cjs","sourcesContent":["import { useEffect, useRef } from 'react';\nimport type { Options } from './types';\nimport { diffRecords } from './diff';\nimport { buildReport } from './report';\nimport { dispatch, getState } from './state';\n\ntype HookOptions = Pick<Options, 'notifier' | 'silent' | 'console' | 'collapse' | 'logAll'>;\n\n/**\n * Track one component from the inside, without patching React:\n *\n * ```ts\n * function Row(props) {\n * useWhyRerender('Row', props);\n * ...\n * }\n * ```\n *\n * Pass any object of values you care about (props, selected state, context values).\n * Reports go to the console and to the notifier configured via `init`, or to\n * `options.notifier` when given.\n */\nexport function useWhyRerender(name: string, values: Record<string, unknown>, options?: HookOptions): void {\n const ref = useRef<{ committed: Record<string, unknown> | null; reported: boolean; count: number }>({\n committed: null,\n reported: false,\n count: 0,\n });\n const st = ref.current;\n // Compare against the last *committed* values. StrictMode renders twice before a\n // commit; `reported` makes sure the second pass does not produce a duplicate.\n if (st.committed && !st.reported) {\n st.reported = true;\n st.count++;\n const propChanges = diffRecords(st.committed, values);\n dispatch(\n buildReport({\n component: name,\n renderCount: st.count,\n prevProps: st.committed,\n nextProps: values,\n propChanges,\n }),\n options ? { ...getState().options, ...options } : undefined,\n );\n }\n useEffect(() => {\n st.committed = values;\n st.reported = false;\n });\n}\n","import type { Notifier, RenderReport } from './types';\n\nexport interface Collector {\n /** Every report received, in order. */\n readonly reports: RenderReport[];\n /** Reports where `avoidable` is true. */\n readonly avoidable: RenderReport[];\n /** Pass this to `init({ notifier })`. */\n readonly notifier: Notifier;\n clear(): void;\n /** Throws with a readable message if any avoidable re-render was recorded. */\n assertNoAvoidable(): void;\n}\n\n/** Collect reports in memory. Meant for tests. */\nexport function createCollector(): Collector {\n const reports: RenderReport[] = [];\n return {\n reports,\n get avoidable() {\n return reports.filter((r) => r.avoidable);\n },\n notifier: (r) => {\n reports.push(r);\n },\n clear: () => {\n reports.length = 0;\n },\n assertNoAvoidable() {\n const bad = reports.filter((r) => r.avoidable);\n if (bad.length === 0) return;\n const lines = bad.map((r) => ` <${r.component}> render #${r.renderCount}:\\n${r.reasons.map((x) => ` - ${x}`).join('\\n')}`);\n throw new Error(`${bad.length} avoidable re-render${bad.length === 1 ? '' : 's'} detected:\\n${lines.join('\\n')}`);\n },\n };\n}\n\nexport function combineNotifiers(...notifiers: Array<Notifier | undefined | null | false>): Notifier {\n const list = notifiers.filter((n): n is Notifier => typeof n === 'function');\n return (report) => {\n for (const n of list) n(report);\n };\n}\n","import type { Notifier, RenderReport } from './types';\nimport { isReactElement } from './diff';\nimport { getDisplayName } from './tracker';\n\nexport const DEVTOOLS_MARKER = '__rerenderLens' as const;\nexport const PROTOCOL_VERSION = 1;\n\nexport interface DevtoolsMessage {\n [DEVTOOLS_MARKER]: true;\n version: number;\n type: 'report' | 'clear' | 'hello';\n payload?: unknown;\n}\n\nexport interface DevtoolsNotifierOptions {\n /** How many reports to keep for `replay()`. Default 300. */\n bufferSize?: number;\n /** Where to post. Default `window`. */\n target?: Pick<Window, 'postMessage'>;\n /** Max serialization depth. Default 6. */\n maxDepth?: number;\n}\n\nexport interface DevtoolsBridge {\n /** Re-post every buffered report (a panel that opened late calls this). */\n replay(): void;\n clear(): void;\n readonly size: number;\n readonly version: number;\n}\n\ndeclare global {\n interface Window {\n __RERENDER_LENS_DEVTOOLS__?: DevtoolsBridge;\n }\n}\n\n/** Convert a report into a structured-clone-safe value (functions, elements, cycles removed). */\nexport function serialize(value: unknown, maxDepth = 6, seen: WeakSet<object> = new WeakSet(), depth = 0): unknown {\n if (value === null || value === undefined) return value;\n const t = typeof value;\n if (t === 'string' || t === 'boolean') return value;\n if (t === 'number') return Number.isFinite(value as number) ? value : String(value);\n if (t === 'bigint') return `${String(value)}n`;\n if (t === 'symbol') return String(value);\n if (t === 'function') return `ƒ ${(value as { name?: string }).name || 'anonymous'}`;\n const obj = value as object;\n if (seen.has(obj)) return '[Circular]';\n if (depth >= maxDepth) return '[…]';\n seen.add(obj);\n try {\n if (isReactElement(obj)) return `<${getDisplayName(obj.type)}>`;\n if (obj instanceof Date) return { $type: 'Date', value: obj.toISOString() };\n if (obj instanceof RegExp) return { $type: 'RegExp', value: String(obj) };\n if (obj instanceof Map) {\n return { $type: 'Map', entries: [...obj].map(([k, v]) => [serialize(k, maxDepth, seen, depth + 1), serialize(v, maxDepth, seen, depth + 1)]) };\n }\n if (obj instanceof Set) return { $type: 'Set', values: [...obj].map((v) => serialize(v, maxDepth, seen, depth + 1)) };\n if (Array.isArray(obj)) return obj.map((v) => serialize(v, maxDepth, seen, depth + 1));\n if (typeof Element !== 'undefined' && obj instanceof Element) return `<${obj.tagName.toLowerCase()}>`;\n const out: Record<string, unknown> = {};\n for (const k of Object.keys(obj)) out[k] = serialize((obj as Record<string, unknown>)[k], maxDepth, seen, depth + 1);\n const proto = Object.getPrototypeOf(obj) as { constructor?: { name?: string } } | null;\n if (proto && proto !== Object.prototype && proto.constructor?.name) out.$type = proto.constructor.name;\n return out;\n } finally {\n seen.delete(obj);\n }\n}\n\n/**\n * A notifier that posts every report on `window` for a DevTools extension to pick up.\n * Also installs `window.__RERENDER_LENS_DEVTOOLS__` with `replay()` / `clear()`.\n */\nexport function createDevtoolsNotifier(options: DevtoolsNotifierOptions = {}): Notifier {\n const bufferSize = options.bufferSize ?? 300;\n const maxDepth = options.maxDepth ?? 6;\n const target = options.target ?? (typeof window !== 'undefined' ? window : undefined);\n const buffer: unknown[] = [];\n\n const post = (type: DevtoolsMessage['type'], payload?: unknown): void => {\n if (!target) return;\n const msg: DevtoolsMessage = { [DEVTOOLS_MARKER]: true, version: PROTOCOL_VERSION, type, payload };\n target.postMessage(msg, '*');\n };\n\n const bridge: DevtoolsBridge = {\n replay: () => {\n post('hello', { count: buffer.length });\n for (const p of buffer) post('report', p);\n },\n clear: () => {\n buffer.length = 0;\n post('clear');\n },\n get size() {\n return buffer.length;\n },\n version: PROTOCOL_VERSION,\n };\n if (typeof window !== 'undefined') window.__RERENDER_LENS_DEVTOOLS__ = bridge;\n post('hello', { count: 0 });\n\n return (report: RenderReport) => {\n const payload = serialize(report, maxDepth);\n buffer.push(payload);\n if (buffer.length > bufferSize) buffer.splice(0, buffer.length - bufferSize);\n post('report', payload);\n };\n}\n"]}
@@ -0,0 +1,213 @@
1
+ import * as ReactNS from 'react';
2
+
3
+ /** Why a single prop/state/hook value differs between two renders. */
4
+ type ChangeKind =
5
+ /** New reference, but deep-equal to the previous value. Avoidable. */
6
+ 'deep-equal'
7
+ /** A new function with the same name/body shape. Almost always avoidable. */
8
+ | 'function'
9
+ /** A new React element that renders the same type with deep-equal props. Avoidable. */
10
+ | 'element'
11
+ /** The value genuinely changed. */
12
+ | 'different'
13
+ /** Key was added. */
14
+ | 'added'
15
+ /** Key was removed. */
16
+ | 'removed';
17
+ interface Change {
18
+ /** Dot path from the root, e.g. `style.color` or `items[2]`. */
19
+ path: string;
20
+ kind: ChangeKind;
21
+ prev: unknown;
22
+ next: unknown;
23
+ }
24
+ /** What caused a re-render. */
25
+ type RenderTrigger =
26
+ /** At least one prop genuinely changed. */
27
+ 'props'
28
+ /** Props are equal by value, but the parent re-rendered. Wrap in React.memo. */
29
+ | 'parent'
30
+ /** Own state (useState/useReducer/this.setState) changed. */
31
+ | 'state'
32
+ /** A non-state hook value (useContext, useSyncExternalStore) changed. */
33
+ | 'hooks'
34
+ /** More than one of the above. */
35
+ | 'mixed';
36
+ interface HookChange extends Change {
37
+ /** `useState`, `useReducer`, `useContext`, ... */
38
+ hook: string;
39
+ /** Position of the hook in call order (0-based). */
40
+ index: number;
41
+ }
42
+ interface RenderReport {
43
+ /** Display name of the tracked component. */
44
+ component: string;
45
+ /** Monotonic per-component render count (1 = first update, mount is never reported). */
46
+ renderCount: number;
47
+ trigger: RenderTrigger;
48
+ /** True when the re-render produced no genuine change in props, state, or hooks. */
49
+ avoidable: boolean;
50
+ props: {
51
+ prev: Record<string, unknown>;
52
+ next: Record<string, unknown>;
53
+ };
54
+ propChanges: Change[];
55
+ /** Class components only. */
56
+ stateChanges: Change[];
57
+ /** Function components only, when `trackHooks` is on. */
58
+ hookChanges: HookChange[];
59
+ /** Human-readable explanations and suggested fixes. */
60
+ reasons: string[];
61
+ /** `performance.now()` (or `Date.now()`) when the report was produced. */
62
+ time: number;
63
+ }
64
+ type Notifier = (report: RenderReport) => void;
65
+ type ComponentMatcher = string | RegExp | ((displayName: string) => boolean);
66
+ interface Options {
67
+ /** Track every `React.memo`-wrapped component and every `PureComponent`. Default false. */
68
+ trackAllMemoized?: boolean;
69
+ /** Track every component, memoized or not. Noisy. Default false. */
70
+ trackAllComponents?: boolean;
71
+ /** Components to track by display name (string = exact match). */
72
+ include?: ComponentMatcher[];
73
+ /** Components never to track, even when marked. */
74
+ exclude?: ComponentMatcher[];
75
+ /** Capture `useState`/`useReducer`/`useContext` values and diff them. Default true. */
76
+ trackHooks?: boolean;
77
+ /** Report re-renders caused by genuine changes too, not only avoidable ones. Default false. */
78
+ logAll?: boolean;
79
+ /** Do not print to the console. Reports still reach `notifier`. Default false. */
80
+ silent?: boolean;
81
+ /** Receive every report. Combine several with `combineNotifiers`. */
82
+ notifier?: Notifier;
83
+ /** Use `console.groupCollapsed` instead of `console.group`. Default true. */
84
+ collapse?: boolean;
85
+ /** Console-like sink used for printing. Default `console`. */
86
+ console?: Pick<Console, 'log' | 'group' | 'groupCollapsed' | 'groupEnd' | 'warn'>;
87
+ }
88
+ /**
89
+ * The React object to patch. Structural so that both `import React from 'react'`
90
+ * and `import * as React from 'react'` type-check.
91
+ */
92
+ type ReactLike = Pick<typeof ReactNS, 'createElement' | 'memo' | 'forwardRef' | 'useRef'> & Partial<Pick<typeof ReactNS, 'useState' | 'useReducer' | 'useContext' | 'useSyncExternalStore'>>;
93
+ /** Marker static: `MyComponent.rerenderLens = true` opts a component in. */
94
+ declare const MARKER: "rerenderLens";
95
+
96
+ type AnyType = any;
97
+ declare function getDisplayName(type: unknown): string;
98
+ /** Map an element type to its tracked wrapper (or return it unchanged). */
99
+ declare function resolveType(type: AnyType): AnyType;
100
+ /**
101
+ * Patch `React.createElement` (and the state hooks) so tracked components report
102
+ * their re-renders. Returns a function that undoes the patch.
103
+ */
104
+ declare function init(R: ReactLike, options?: Options): () => void;
105
+ /** Update options at runtime. Include/exclude changes apply to elements created afterwards. */
106
+ declare function configure(options: Options): void;
107
+ /** Restore the original React functions. Already-created wrappers keep working but stop reporting. */
108
+ declare function disable(): void;
109
+ declare function isEnabled(): boolean;
110
+ /**
111
+ * Opt a component in, with types preserved: `export default track(MyComponent)`.
112
+ * Pass `name` for anonymous arrow functions, which have no inferable name.
113
+ */
114
+ declare function track<T>(component: T, name?: string): T;
115
+
116
+ type HookOptions = Pick<Options, 'notifier' | 'silent' | 'console' | 'collapse' | 'logAll'>;
117
+ /**
118
+ * Track one component from the inside, without patching React:
119
+ *
120
+ * ```ts
121
+ * function Row(props) {
122
+ * useWhyRerender('Row', props);
123
+ * ...
124
+ * }
125
+ * ```
126
+ *
127
+ * Pass any object of values you care about (props, selected state, context values).
128
+ * Reports go to the console and to the notifier configured via `init`, or to
129
+ * `options.notifier` when given.
130
+ */
131
+ declare function useWhyRerender(name: string, values: Record<string, unknown>, options?: HookOptions): void;
132
+
133
+ type Seen = Map<object, Set<object>>;
134
+ /**
135
+ * Structural equality that understands Map, Set, Date, RegExp, typed arrays,
136
+ * React elements and cyclic references. Functions are equal only by reference.
137
+ */
138
+ declare function deepEqual(a: unknown, b: unknown, seen?: Seen): boolean;
139
+ /** Classify why two values differ. Assumes `!Object.is(prev, next)`. */
140
+ declare function classify(prev: unknown, next: unknown): ChangeKind;
141
+ /**
142
+ * Shallow-diff two records. Every changed key produces exactly one Change;
143
+ * for `different` values that are plain objects/arrays, the nested path that
144
+ * actually differs is reported in `path` to make the console output actionable.
145
+ */
146
+ declare function diffRecords(prev: Record<string, unknown> | undefined | null, next: Record<string, unknown> | undefined | null, basePath?: string): Change[];
147
+
148
+ interface BuildInput {
149
+ component: string;
150
+ renderCount: number;
151
+ prevProps: Record<string, unknown>;
152
+ nextProps: Record<string, unknown>;
153
+ propChanges: Change[];
154
+ stateChanges?: Change[];
155
+ hookChanges?: HookChange[];
156
+ }
157
+ declare function buildReport(input: BuildInput): RenderReport;
158
+ declare function summarize(report: RenderReport): string;
159
+ /** Default notifier: prints a console group per report. */
160
+ declare function printReport(report: RenderReport, options: Options): void;
161
+
162
+ interface Collector {
163
+ /** Every report received, in order. */
164
+ readonly reports: RenderReport[];
165
+ /** Reports where `avoidable` is true. */
166
+ readonly avoidable: RenderReport[];
167
+ /** Pass this to `init({ notifier })`. */
168
+ readonly notifier: Notifier;
169
+ clear(): void;
170
+ /** Throws with a readable message if any avoidable re-render was recorded. */
171
+ assertNoAvoidable(): void;
172
+ }
173
+ /** Collect reports in memory. Meant for tests. */
174
+ declare function createCollector(): Collector;
175
+ declare function combineNotifiers(...notifiers: Array<Notifier | undefined | null | false>): Notifier;
176
+
177
+ declare const DEVTOOLS_MARKER: "__rerenderLens";
178
+ declare const PROTOCOL_VERSION = 1;
179
+ interface DevtoolsMessage {
180
+ [DEVTOOLS_MARKER]: true;
181
+ version: number;
182
+ type: 'report' | 'clear' | 'hello';
183
+ payload?: unknown;
184
+ }
185
+ interface DevtoolsNotifierOptions {
186
+ /** How many reports to keep for `replay()`. Default 300. */
187
+ bufferSize?: number;
188
+ /** Where to post. Default `window`. */
189
+ target?: Pick<Window, 'postMessage'>;
190
+ /** Max serialization depth. Default 6. */
191
+ maxDepth?: number;
192
+ }
193
+ interface DevtoolsBridge {
194
+ /** Re-post every buffered report (a panel that opened late calls this). */
195
+ replay(): void;
196
+ clear(): void;
197
+ readonly size: number;
198
+ readonly version: number;
199
+ }
200
+ declare global {
201
+ interface Window {
202
+ __RERENDER_LENS_DEVTOOLS__?: DevtoolsBridge;
203
+ }
204
+ }
205
+ /** Convert a report into a structured-clone-safe value (functions, elements, cycles removed). */
206
+ declare function serialize(value: unknown, maxDepth?: number, seen?: WeakSet<object>, depth?: number): unknown;
207
+ /**
208
+ * A notifier that posts every report on `window` for a DevTools extension to pick up.
209
+ * Also installs `window.__RERENDER_LENS_DEVTOOLS__` with `replay()` / `clear()`.
210
+ */
211
+ declare function createDevtoolsNotifier(options?: DevtoolsNotifierOptions): Notifier;
212
+
213
+ export { type Change, type ChangeKind, type Collector, type ComponentMatcher, DEVTOOLS_MARKER, type DevtoolsBridge, type DevtoolsMessage, type DevtoolsNotifierOptions, type HookChange, MARKER, type Notifier, type Options, PROTOCOL_VERSION, type RenderReport, type RenderTrigger, buildReport, classify, combineNotifiers, configure, createCollector, createDevtoolsNotifier, deepEqual, diffRecords, disable, getDisplayName, init, isEnabled, printReport, resolveType, serialize, summarize, track, useWhyRerender };