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,544 @@
1
+ // src/types.ts
2
+ var MARKER = "rerenderLens";
3
+
4
+ // src/diff.ts
5
+ var REACT_ELEMENT = /* @__PURE__ */ Symbol.for("react.element");
6
+ var REACT_TRANSITIONAL_ELEMENT = /* @__PURE__ */ Symbol.for("react.transitional.element");
7
+ function isReactElement(v) {
8
+ if (typeof v !== "object" || v === null) return false;
9
+ const t = v.$$typeof;
10
+ return t === REACT_ELEMENT || t === REACT_TRANSITIONAL_ELEMENT;
11
+ }
12
+ function isPlainObject(v) {
13
+ if (typeof v !== "object" || v === null) return false;
14
+ const proto = Object.getPrototypeOf(v);
15
+ return proto === Object.prototype || proto === null;
16
+ }
17
+ function remember(seen, a, b) {
18
+ let set = seen.get(a);
19
+ if (!set) {
20
+ set = /* @__PURE__ */ new Set();
21
+ seen.set(a, set);
22
+ }
23
+ if (set.has(b)) return true;
24
+ set.add(b);
25
+ return false;
26
+ }
27
+ function deepEqual(a, b, seen = /* @__PURE__ */ new Map()) {
28
+ if (Object.is(a, b)) return true;
29
+ if (typeof a !== typeof b) return false;
30
+ if (typeof a !== "object" || a === null || b === null) return false;
31
+ const objA = a;
32
+ const objB = b;
33
+ if (remember(seen, objA, objB)) return true;
34
+ if (a instanceof Date) return b instanceof Date && a.getTime() === b.getTime();
35
+ if (a instanceof RegExp) return b instanceof RegExp && a.source === b.source && a.flags === b.flags;
36
+ if (Array.isArray(a)) {
37
+ if (!Array.isArray(b) || a.length !== b.length) return false;
38
+ for (let i = 0; i < a.length; i++) if (!deepEqual(a[i], b[i], seen)) return false;
39
+ return true;
40
+ }
41
+ if (Array.isArray(b)) return false;
42
+ if (ArrayBuffer.isView(a)) {
43
+ if (!ArrayBuffer.isView(b) || a.constructor !== b.constructor) return false;
44
+ const ta = a;
45
+ const tb = b;
46
+ if (ta.length !== tb.length) return false;
47
+ for (let i = 0; i < ta.length; i++) if (ta[i] !== tb[i]) return false;
48
+ return true;
49
+ }
50
+ if (a instanceof Map) {
51
+ if (!(b instanceof Map) || a.size !== b.size) return false;
52
+ for (const [k, v] of a) {
53
+ if (!b.has(k) || !deepEqual(v, b.get(k), seen)) return false;
54
+ }
55
+ return true;
56
+ }
57
+ if (a instanceof Set) {
58
+ if (!(b instanceof Set) || a.size !== b.size) return false;
59
+ outer: for (const v of a) {
60
+ if (b.has(v)) continue;
61
+ for (const w of b) if (deepEqual(v, w, seen)) continue outer;
62
+ return false;
63
+ }
64
+ return true;
65
+ }
66
+ if (isReactElement(a)) {
67
+ if (!isReactElement(b)) return false;
68
+ return a.type === b.type && a.key === b.key && deepEqual(a.props, b.props, seen);
69
+ }
70
+ if (isPlainObject(a) && isPlainObject(b)) {
71
+ const ka = Object.keys(a);
72
+ const kb = Object.keys(b);
73
+ if (ka.length !== kb.length) return false;
74
+ for (const k of ka) {
75
+ if (!Object.prototype.hasOwnProperty.call(b, k)) return false;
76
+ if (!deepEqual(a[k], b[k], seen)) return false;
77
+ }
78
+ return true;
79
+ }
80
+ return false;
81
+ }
82
+ function classify(prev, next) {
83
+ if (typeof prev === "function" && typeof next === "function") {
84
+ return prev.name === next.name && prev.toString() === next.toString() ? "function" : "different";
85
+ }
86
+ if (isReactElement(prev) && isReactElement(next)) {
87
+ return deepEqual(prev, next) ? "element" : "different";
88
+ }
89
+ return deepEqual(prev, next) ? "deep-equal" : "different";
90
+ }
91
+ function joinPath(base, key) {
92
+ if (typeof key === "number") return `${base}[${key}]`;
93
+ if (base === "") return key;
94
+ return /^[A-Za-z_$][\w$]*$/.test(key) ? `${base}.${key}` : `${base}[${JSON.stringify(key)}]`;
95
+ }
96
+ function diffRecords(prev, next, basePath = "") {
97
+ const p = prev ?? {};
98
+ const n = next ?? {};
99
+ const changes = [];
100
+ const keys = /* @__PURE__ */ new Set([...Object.keys(p), ...Object.keys(n)]);
101
+ for (const key of keys) {
102
+ const inPrev = Object.prototype.hasOwnProperty.call(p, key);
103
+ const inNext = Object.prototype.hasOwnProperty.call(n, key);
104
+ const path = joinPath(basePath, key);
105
+ if (inPrev && !inNext) {
106
+ changes.push({ path, kind: "removed", prev: p[key], next: void 0 });
107
+ continue;
108
+ }
109
+ if (!inPrev && inNext) {
110
+ changes.push({ path, kind: "added", prev: void 0, next: n[key] });
111
+ continue;
112
+ }
113
+ const a = p[key];
114
+ const b = n[key];
115
+ if (Object.is(a, b)) continue;
116
+ const kind = classify(a, b);
117
+ if (kind === "different") {
118
+ changes.push({ path: firstDifferentPath(a, b, path), kind, prev: a, next: b });
119
+ } else {
120
+ changes.push({ path, kind, prev: a, next: b });
121
+ }
122
+ }
123
+ return changes;
124
+ }
125
+ function firstDifferentPath(a, b, path, depth = 0) {
126
+ if (depth > 8) return path;
127
+ if (Array.isArray(a) && Array.isArray(b)) {
128
+ if (a.length !== b.length) return `${path}.length`;
129
+ for (let i = 0; i < a.length; i++) {
130
+ if (!deepEqual(a[i], b[i])) return firstDifferentPath(a[i], b[i], joinPath(path, i), depth + 1);
131
+ }
132
+ return path;
133
+ }
134
+ if (isPlainObject(a) && isPlainObject(b)) {
135
+ const keys = /* @__PURE__ */ new Set([...Object.keys(a), ...Object.keys(b)]);
136
+ for (const k of keys) {
137
+ if (!deepEqual(a[k], b[k])) return firstDifferentPath(a[k], b[k], joinPath(path, k), depth + 1);
138
+ }
139
+ return path;
140
+ }
141
+ return path;
142
+ }
143
+
144
+ // src/report.ts
145
+ var now = () => typeof performance !== "undefined" && typeof performance.now === "function" ? performance.now() : Date.now();
146
+ var isGenuine = (c) => c.kind === "different" || c.kind === "added" || c.kind === "removed";
147
+ function fixFor(change) {
148
+ switch (change.kind) {
149
+ case "function":
150
+ return `wrap it in useCallback (or hoist it out of the parent's render)`;
151
+ case "element":
152
+ return `memoize the element with useMemo, or pass it as children from a stable parent`;
153
+ case "deep-equal":
154
+ return Array.isArray(change.next) ? `memoize the array with useMemo (same items, new reference)` : `memoize the object with useMemo, or hoist it to module scope if it is constant`;
155
+ default:
156
+ return "";
157
+ }
158
+ }
159
+ function describe(change) {
160
+ switch (change.kind) {
161
+ case "deep-equal":
162
+ return `prop "${change.path}" is a new reference but deep-equal to the previous value`;
163
+ case "function":
164
+ return `prop "${change.path}" is a new function instance on every render`;
165
+ case "element":
166
+ return `prop "${change.path}" is a new React element with the same type and props`;
167
+ case "different":
168
+ return `prop "${change.path}" changed`;
169
+ case "added":
170
+ return `prop "${change.path}" was added`;
171
+ case "removed":
172
+ return `prop "${change.path}" was removed`;
173
+ }
174
+ }
175
+ function buildReport(input) {
176
+ const stateChanges = input.stateChanges ?? [];
177
+ const hookChanges = input.hookChanges ?? [];
178
+ const isStateHook = (h) => h.hook === "useState" || h.hook === "useReducer";
179
+ const genuineProps = input.propChanges.some(isGenuine);
180
+ const genuineState = stateChanges.some(isGenuine) || hookChanges.some((h) => isStateHook(h) && isGenuine(h));
181
+ const genuineHooks = hookChanges.some((h) => !isStateHook(h) && isGenuine(h));
182
+ const causes = [genuineProps && "props", genuineState && "state", genuineHooks && "hooks"].filter(Boolean);
183
+ let trigger;
184
+ if (causes.length === 0) trigger = "parent";
185
+ else if (causes.length === 1) trigger = causes[0];
186
+ else trigger = "mixed";
187
+ const avoidable = trigger === "parent";
188
+ const reasons = [];
189
+ if (avoidable && input.propChanges.length === 0 && stateChanges.length === 0 && hookChanges.length === 0) {
190
+ reasons.push(
191
+ `re-rendered with identical props because its parent re-rendered. Wrap "${input.component}" in React.memo (or extend PureComponent).`
192
+ );
193
+ }
194
+ for (const c of input.propChanges) {
195
+ const fix = fixFor(c);
196
+ reasons.push(fix ? `${describe(c)}: ${fix}.` : `${describe(c)}.`);
197
+ }
198
+ for (const c of stateChanges) {
199
+ if (isGenuine(c)) reasons.push(`state "${c.path}" changed.`);
200
+ else reasons.push(`setState was called with a value deep-equal to the current "${c.path}" (new reference, same contents).`);
201
+ }
202
+ for (const c of hookChanges) {
203
+ if (isGenuine(c)) reasons.push(`${c.hook} #${c.index} changed.`);
204
+ else if (isStateHook(c))
205
+ 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.`);
206
+ 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.`);
207
+ }
208
+ return {
209
+ component: input.component,
210
+ renderCount: input.renderCount,
211
+ trigger,
212
+ avoidable,
213
+ props: { prev: input.prevProps, next: input.nextProps },
214
+ propChanges: input.propChanges,
215
+ stateChanges,
216
+ hookChanges,
217
+ reasons,
218
+ time: now()
219
+ };
220
+ }
221
+ var KIND_LABEL = {
222
+ "deep-equal": "equal by value",
223
+ function: "new function",
224
+ element: "equal element",
225
+ different: "changed",
226
+ added: "added",
227
+ removed: "removed"
228
+ };
229
+ function summarize(report) {
230
+ const counts = /* @__PURE__ */ new Map();
231
+ for (const c of [...report.propChanges, ...report.stateChanges, ...report.hookChanges]) {
232
+ counts.set(c.kind, (counts.get(c.kind) ?? 0) + 1);
233
+ }
234
+ const parts = [...counts].map(([kind, n]) => `${n} ${KIND_LABEL[kind]}`);
235
+ if (parts.length === 0) parts.push("no changes");
236
+ return parts.join(", ");
237
+ }
238
+ function printReport(report, options) {
239
+ const c = options.console ?? console;
240
+ const open = options.collapse === false ? c.group : c.groupCollapsed;
241
+ const verdict = report.avoidable ? "avoidable re-render" : `re-render (${report.trigger})`;
242
+ open.call(c, `[rerender-lens] <${report.component}> ${verdict}: ${summarize(report)}`);
243
+ for (const r of report.reasons) c.log(`- ${r}`);
244
+ for (const ch of [...report.propChanges, ...report.stateChanges, ...report.hookChanges]) {
245
+ c.log(`${ch.path} (${KIND_LABEL[ch.kind]})`, { prev: ch.prev, next: ch.next });
246
+ }
247
+ c.log("props", report.props);
248
+ c.groupEnd();
249
+ }
250
+
251
+ // src/state.ts
252
+ var KEY = /* @__PURE__ */ Symbol.for("rerender-lens.state");
253
+ function getState() {
254
+ const g = globalThis;
255
+ let s = g[KEY];
256
+ if (!s) {
257
+ s = {
258
+ React: null,
259
+ options: {},
260
+ generation: 0,
261
+ decisions: /* @__PURE__ */ new WeakMap(),
262
+ wrappers: /* @__PURE__ */ new WeakMap(),
263
+ wrapperSet: /* @__PURE__ */ new WeakSet(),
264
+ originals: {},
265
+ capture: null,
266
+ patched: false
267
+ };
268
+ g[KEY] = s;
269
+ }
270
+ return s;
271
+ }
272
+ function dispatch(report, override) {
273
+ const options = override ? { ...getState().options, ...override } : getState().options;
274
+ if (!options.silent && (report.avoidable || options.logAll)) {
275
+ printReport(report, options);
276
+ }
277
+ if (options.notifier) {
278
+ try {
279
+ options.notifier(report);
280
+ } catch (err) {
281
+ (options.console ?? console).warn("[rerender-lens] notifier threw", err);
282
+ }
283
+ }
284
+ }
285
+
286
+ // src/tracker.ts
287
+ var MEMO = /* @__PURE__ */ Symbol.for("react.memo");
288
+ var FORWARD_REF = /* @__PURE__ */ Symbol.for("react.forward_ref");
289
+ var isMemo = (t) => typeof t === "object" && t !== null && t.$$typeof === MEMO;
290
+ var isForwardRef = (t) => typeof t === "object" && t !== null && t.$$typeof === FORWARD_REF;
291
+ var isClass = (t) => typeof t === "function" && !!t.prototype?.isReactComponent;
292
+ var isPureClass = (t) => isClass(t) && !!t.prototype.isPureReactComponent;
293
+ var isComponentLike = (t) => typeof t === "function" || isMemo(t) || isForwardRef(t);
294
+ function getDisplayName(type) {
295
+ if (typeof type === "string") return type;
296
+ if (isMemo(type)) return type.displayName ?? getDisplayName(type.type);
297
+ if (isForwardRef(type)) return type.displayName ?? getDisplayName(type.render);
298
+ if (typeof type === "function") {
299
+ const t = type;
300
+ return t.displayName ?? (t.name || "Anonymous");
301
+ }
302
+ return "Anonymous";
303
+ }
304
+ function hasMarker(type) {
305
+ if (type === null || typeof type !== "function" && typeof type !== "object") return false;
306
+ if (type[MARKER] === true) return true;
307
+ if (isMemo(type)) return hasMarker(type.type);
308
+ if (isForwardRef(type)) return hasMarker(type.render);
309
+ return false;
310
+ }
311
+ function matches(m, name) {
312
+ if (typeof m === "string") return m === name;
313
+ if (m instanceof RegExp) return m.test(name);
314
+ return m(name);
315
+ }
316
+ function shouldTrack(type, o) {
317
+ if (!isComponentLike(type)) return false;
318
+ const name = getDisplayName(type);
319
+ if (o.exclude?.some((m) => matches(m, name))) return false;
320
+ if (hasMarker(type)) return true;
321
+ if (o.include?.some((m) => matches(m, name))) return true;
322
+ if (o.trackAllComponents) return true;
323
+ if (o.trackAllMemoized) return isMemo(type) || isPureClass(type);
324
+ return false;
325
+ }
326
+ var SKIP_STATICS = /* @__PURE__ */ new Set(["length", "name", "prototype", "arguments", "caller", "$$typeof", "render", "type", "compare"]);
327
+ function hoistStatics(from, to) {
328
+ for (const key of Object.getOwnPropertyNames(from)) {
329
+ if (SKIP_STATICS.has(key)) continue;
330
+ const desc = Object.getOwnPropertyDescriptor(from, key);
331
+ if (desc) {
332
+ try {
333
+ Object.defineProperty(to, key, desc);
334
+ } catch {
335
+ }
336
+ }
337
+ }
338
+ }
339
+ function sameHookRefs(prev, next) {
340
+ if (!prev || !next) return true;
341
+ if (prev.length !== next.length) return false;
342
+ for (let i = 0; i < prev.length; i++) if (!Object.is(prev[i].value, next[i].value)) return false;
343
+ return true;
344
+ }
345
+ function diffHooks(prev, next) {
346
+ if (!prev || !next) return [];
347
+ const out = [];
348
+ const len = Math.max(prev.length, next.length);
349
+ for (let i = 0; i < len; i++) {
350
+ const a = prev[i];
351
+ const b = next[i];
352
+ if (!a || !b) continue;
353
+ if (Object.is(a.value, b.value)) continue;
354
+ out.push({ path: `${b.hook}#${i}`, hook: b.hook, index: i, kind: classify(a.value, b.value), prev: a.value, next: b.value });
355
+ }
356
+ return out;
357
+ }
358
+ function wrapRender(R, render, name) {
359
+ const Wrapped = function(props, second) {
360
+ const s = getState();
361
+ const store = R.useRef(null);
362
+ const capture = s.options.trackHooks === false ? null : [];
363
+ const outer = s.capture;
364
+ s.capture = capture;
365
+ let result;
366
+ try {
367
+ result = render(props, second);
368
+ } finally {
369
+ s.capture = outer;
370
+ }
371
+ const prev = store.current;
372
+ if (!prev || !s.patched) {
373
+ store.current = { props, hooks: capture, count: prev?.count ?? 0 };
374
+ return result;
375
+ }
376
+ const sameProps = prev.props === props;
377
+ if (sameProps && sameHookRefs(prev.hooks, capture)) {
378
+ store.current = { props, hooks: capture, count: prev.count };
379
+ return result;
380
+ }
381
+ const count = prev.count + 1;
382
+ store.current = { props, hooks: capture, count };
383
+ dispatch(
384
+ buildReport({
385
+ component: name,
386
+ renderCount: count,
387
+ prevProps: prev.props,
388
+ nextProps: props,
389
+ propChanges: sameProps ? [] : diffRecords(prev.props, props),
390
+ hookChanges: diffHooks(prev.hooks, capture)
391
+ })
392
+ );
393
+ return result;
394
+ };
395
+ hoistStatics(render, Wrapped);
396
+ Object.defineProperty(Wrapped, "name", { value: name, configurable: true });
397
+ Wrapped.displayName = name;
398
+ return Wrapped;
399
+ }
400
+ var COUNT = /* @__PURE__ */ Symbol.for("rerender-lens.count");
401
+ function wrapClass(Original, name) {
402
+ class Tracked extends Original {
403
+ componentDidUpdate(prevProps, prevState, snapshot) {
404
+ const s = getState();
405
+ if (s.patched) {
406
+ const self = this;
407
+ const count = self[COUNT] = (self[COUNT] ?? 0) + 1;
408
+ const propChanges = prevProps === this.props ? [] : diffRecords(prevProps, this.props);
409
+ const stateChanges = prevState === this.state ? [] : diffRecords(prevState ?? {}, this.state ?? {});
410
+ dispatch(
411
+ buildReport({
412
+ component: name,
413
+ renderCount: count,
414
+ prevProps,
415
+ nextProps: this.props,
416
+ propChanges,
417
+ stateChanges
418
+ })
419
+ );
420
+ }
421
+ const superDidUpdate = Original.prototype.componentDidUpdate;
422
+ if (superDidUpdate) superDidUpdate.call(this, prevProps, prevState, snapshot);
423
+ }
424
+ }
425
+ Tracked.displayName = name;
426
+ return Tracked;
427
+ }
428
+ function createWrapper(R, type) {
429
+ const name = getDisplayName(type);
430
+ if (isMemo(type)) {
431
+ const inner = createWrapper(R, type.type);
432
+ if (!inner) return null;
433
+ const wrapped = R.memo(inner, type.compare ?? void 0);
434
+ hoistStatics(type, wrapped);
435
+ wrapped.displayName = name;
436
+ return wrapped;
437
+ }
438
+ if (isForwardRef(type)) {
439
+ const wrapped = R.forwardRef(wrapRender(R, type.render, name));
440
+ hoistStatics(type, wrapped);
441
+ wrapped.displayName = name;
442
+ return wrapped;
443
+ }
444
+ if (isClass(type)) return wrapClass(type, name);
445
+ if (typeof type === "function") return wrapRender(R, type, name);
446
+ return null;
447
+ }
448
+ function resolveType(type) {
449
+ const s = getState();
450
+ if (!s.patched || !s.React) return type;
451
+ if (type === null || typeof type !== "function" && typeof type !== "object") return type;
452
+ if (s.wrapperSet.has(type)) return type;
453
+ let tracked;
454
+ const d = s.decisions.get(type);
455
+ if (d && d.generation === s.generation) {
456
+ tracked = d.tracked;
457
+ } else {
458
+ tracked = shouldTrack(type, s.options);
459
+ s.decisions.set(type, { generation: s.generation, tracked });
460
+ }
461
+ if (!tracked) return type;
462
+ let w = s.wrappers.get(type);
463
+ if (!w) {
464
+ const created = createWrapper(s.React, type);
465
+ if (!created) return type;
466
+ w = created;
467
+ s.wrappers.set(type, w);
468
+ s.wrapperSet.add(w);
469
+ }
470
+ return w;
471
+ }
472
+ var HOOK_KEYS = ["useState", "useReducer", "useContext", "useSyncExternalStore"];
473
+ function assign(target, key, value) {
474
+ try {
475
+ target[key] = value;
476
+ } catch {
477
+ }
478
+ if (target[key] !== value) {
479
+ throw new Error(
480
+ `[rerender-lens] Cannot patch React.${key}. Pass the default import (\`import React from 'react'\`), not a namespace import.`
481
+ );
482
+ }
483
+ }
484
+ function init(R, options = {}) {
485
+ const s = getState();
486
+ if (s.patched) {
487
+ configure(options);
488
+ return disable;
489
+ }
490
+ s.React = R;
491
+ s.options = { ...options };
492
+ s.generation++;
493
+ const origCreateElement = R.createElement;
494
+ s.originals.createElement = origCreateElement;
495
+ assign(R, "createElement", function createElement(...args) {
496
+ args[0] = resolveType(args[0]);
497
+ return origCreateElement.apply(R, args);
498
+ });
499
+ for (const key of HOOK_KEYS) {
500
+ const orig = R[key];
501
+ if (typeof orig !== "function") continue;
502
+ s.originals[key] = orig;
503
+ const patched = function(...args) {
504
+ const r = orig.apply(this, args);
505
+ const cap = getState().capture;
506
+ if (cap) cap.push({ hook: key, value: key === "useState" || key === "useReducer" ? r[0] : r });
507
+ return r;
508
+ };
509
+ Object.defineProperty(patched, "name", { value: key, configurable: true });
510
+ assign(R, key, patched);
511
+ }
512
+ s.patched = true;
513
+ return disable;
514
+ }
515
+ function configure(options) {
516
+ const s = getState();
517
+ s.options = { ...s.options, ...options };
518
+ s.generation++;
519
+ }
520
+ function disable() {
521
+ const s = getState();
522
+ if (!s.patched || !s.React) return;
523
+ const R = s.React;
524
+ for (const [key, orig] of Object.entries(s.originals)) {
525
+ if (orig) R[key] = orig;
526
+ }
527
+ s.originals = {};
528
+ s.patched = false;
529
+ s.React = null;
530
+ s.capture = null;
531
+ }
532
+ function isEnabled() {
533
+ return getState().patched;
534
+ }
535
+ function track(component, name) {
536
+ const t = component;
537
+ t[MARKER] = true;
538
+ if (name) t.displayName = name;
539
+ return component;
540
+ }
541
+
542
+ export { MARKER, buildReport, classify, configure, deepEqual, diffRecords, disable, dispatch, getDisplayName, getState, init, isEnabled, isReactElement, printReport, resolveType, summarize, track };
543
+ //# sourceMappingURL=chunk-3YHI7BCU.js.map
544
+ //# sourceMappingURL=chunk-3YHI7BCU.js.map
@@ -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-3YHI7BCU.js","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"]}