rerender-lens 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +41 -1
- package/README.md +14 -5
- package/dist/{devtools-DmhWiWcN.d.cts → devtools-BkCct3cJ.d.cts} +10 -2
- package/dist/{devtools-BHGUUo-p.d.ts → devtools-CZebzpF6.d.ts} +10 -2
- package/dist/index.cjs +199 -71
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +199 -71
- package/dist/index.js.map +1 -1
- package/dist/playwright.cjs +5 -2
- package/dist/playwright.cjs.map +1 -1
- package/dist/playwright.d.cts +5 -3
- package/dist/playwright.d.ts +5 -3
- package/dist/playwright.js +5 -3
- package/dist/playwright.js.map +1 -1
- package/dist/rerender-lens.iife.js +768 -307
- package/dist/setup.cjs +199 -71
- package/dist/setup.cjs.map +1 -1
- package/dist/setup.js +199 -71
- package/dist/setup.js.map +1 -1
- package/dist/vitest-setup.cjs +117 -48
- package/dist/vitest-setup.cjs.map +1 -1
- package/dist/vitest-setup.js +117 -48
- package/dist/vitest-setup.js.map +1 -1
- package/dist/vitest.cjs +117 -48
- package/dist/vitest.cjs.map +1 -1
- package/dist/vitest.js +117 -48
- package/dist/vitest.js.map +1 -1
- package/package.json +2 -2
- package/panel/panel.css +0 -34
- package/panel/panel.js +400 -438
|
@@ -1,10 +1,37 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
/* rerender-lens 0.4.0 — rerender-lens.core.js: types, version, diff, report, state, overlay. Built by scripts/build-vendor.mjs; do not edit. */
|
|
2
|
+
(() => {
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __export = (target, all) => {
|
|
5
|
+
for (var name in all)
|
|
6
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
7
|
+
};
|
|
3
8
|
|
|
4
9
|
// src/types.ts
|
|
10
|
+
var types_exports = {};
|
|
11
|
+
__export(types_exports, {
|
|
12
|
+
MARKER: () => MARKER
|
|
13
|
+
});
|
|
5
14
|
var MARKER = "rerenderLens";
|
|
6
15
|
|
|
16
|
+
// src/version.ts
|
|
17
|
+
var version_exports = {};
|
|
18
|
+
__export(version_exports, {
|
|
19
|
+
VERSION: () => VERSION
|
|
20
|
+
});
|
|
21
|
+
var VERSION = true ? "0.4.0" : "dev";
|
|
22
|
+
|
|
7
23
|
// src/diff.ts
|
|
24
|
+
var diff_exports = {};
|
|
25
|
+
__export(diff_exports, {
|
|
26
|
+
DEFAULT_DIFF_BUDGET: () => DEFAULT_DIFF_BUDGET,
|
|
27
|
+
beginDiffScope: () => beginDiffScope,
|
|
28
|
+
classify: () => classify,
|
|
29
|
+
deepEqual: () => deepEqual,
|
|
30
|
+
diffBudgetExhausted: () => diffBudgetExhausted,
|
|
31
|
+
diffRecords: () => diffRecords,
|
|
32
|
+
firstDifferentPath: () => firstDifferentPath,
|
|
33
|
+
isReactElement: () => isReactElement
|
|
34
|
+
});
|
|
8
35
|
var REACT_ELEMENT = /* @__PURE__ */ Symbol.for("react.element");
|
|
9
36
|
var REACT_TRANSITIONAL_ELEMENT = /* @__PURE__ */ Symbol.for("react.transitional.element");
|
|
10
37
|
function isReactElement(v) {
|
|
@@ -27,10 +54,49 @@ var RerenderLens = (function (exports) {
|
|
|
27
54
|
set.add(b);
|
|
28
55
|
return false;
|
|
29
56
|
}
|
|
57
|
+
var scope = null;
|
|
58
|
+
var DEFAULT_DIFF_BUDGET = 5e4;
|
|
59
|
+
function beginDiffScope(budget = 2e5) {
|
|
60
|
+
const previous = scope;
|
|
61
|
+
scope = { cache: /* @__PURE__ */ new WeakMap(), remaining: budget, exhausted: false };
|
|
62
|
+
return () => {
|
|
63
|
+
scope = previous;
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function diffBudgetExhausted() {
|
|
67
|
+
return scope?.exhausted === true;
|
|
68
|
+
}
|
|
30
69
|
function deepEqual(a, b, seen = /* @__PURE__ */ new Map()) {
|
|
31
70
|
if (Object.is(a, b)) return true;
|
|
32
71
|
if (typeof a !== typeof b) return false;
|
|
33
72
|
if (typeof a !== "object" || a === null || b === null) return false;
|
|
73
|
+
if (!scope) {
|
|
74
|
+
const end = beginDiffScope(DEFAULT_DIFF_BUDGET);
|
|
75
|
+
try {
|
|
76
|
+
return deepEqual(a, b, seen);
|
|
77
|
+
} finally {
|
|
78
|
+
end();
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const sc = scope;
|
|
82
|
+
const objA = a;
|
|
83
|
+
const objB = b;
|
|
84
|
+
const hit = sc.cache.get(objA)?.get(objB);
|
|
85
|
+
if (hit !== void 0) return hit;
|
|
86
|
+
if (--sc.remaining < 0) {
|
|
87
|
+
sc.exhausted = true;
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
const result = deepEqualObjects(objA, objB, seen);
|
|
91
|
+
let m = sc.cache.get(objA);
|
|
92
|
+
if (!m) {
|
|
93
|
+
m = /* @__PURE__ */ new WeakMap();
|
|
94
|
+
sc.cache.set(objA, m);
|
|
95
|
+
}
|
|
96
|
+
m.set(objB, result);
|
|
97
|
+
return result;
|
|
98
|
+
}
|
|
99
|
+
function deepEqualObjects(a, b, seen) {
|
|
34
100
|
const objA = a;
|
|
35
101
|
const objB = b;
|
|
36
102
|
if (remember(seen, objA, objB)) return true;
|
|
@@ -59,6 +125,10 @@ var RerenderLens = (function (exports) {
|
|
|
59
125
|
}
|
|
60
126
|
if (a instanceof Set) {
|
|
61
127
|
if (!(b instanceof Set) || a.size !== b.size) return false;
|
|
128
|
+
if (a.size > 50) {
|
|
129
|
+
for (const v of a) if (!b.has(v)) return false;
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
62
132
|
outer: for (const v of a) {
|
|
63
133
|
if (b.has(v)) continue;
|
|
64
134
|
for (const w of b) if (deepEqual(v, w, seen)) continue outer;
|
|
@@ -74,9 +144,10 @@ var RerenderLens = (function (exports) {
|
|
|
74
144
|
const ka = Object.keys(a);
|
|
75
145
|
const kb = Object.keys(b);
|
|
76
146
|
if (ka.length !== kb.length) return false;
|
|
147
|
+
const rb = b;
|
|
77
148
|
for (const k of ka) {
|
|
78
149
|
if (!Object.prototype.hasOwnProperty.call(b, k)) return false;
|
|
79
|
-
if (!deepEqual(a[k],
|
|
150
|
+
if (!deepEqual(a[k], rb[k], seen)) return false;
|
|
80
151
|
}
|
|
81
152
|
return true;
|
|
82
153
|
}
|
|
@@ -118,7 +189,7 @@ var RerenderLens = (function (exports) {
|
|
|
118
189
|
if (Object.is(a, b)) continue;
|
|
119
190
|
const kind = classify(a, b);
|
|
120
191
|
if (kind === "different") {
|
|
121
|
-
changes.push({ path: firstDifferentPath(a, b, path), kind, prev: a, next: b });
|
|
192
|
+
changes.push({ path: diffBudgetExhausted() ? path : firstDifferentPath(a, b, path), kind, prev: a, next: b });
|
|
122
193
|
} else {
|
|
123
194
|
changes.push({ path, kind, prev: a, next: b });
|
|
124
195
|
}
|
|
@@ -145,6 +216,15 @@ var RerenderLens = (function (exports) {
|
|
|
145
216
|
}
|
|
146
217
|
|
|
147
218
|
// src/report.ts
|
|
219
|
+
var report_exports = {};
|
|
220
|
+
__export(report_exports, {
|
|
221
|
+
buildReport: () => buildReport,
|
|
222
|
+
fixFor: () => fixFor,
|
|
223
|
+
hookLabel: () => hookLabel,
|
|
224
|
+
printReport: () => printReport,
|
|
225
|
+
storeAdvice: () => storeAdvice,
|
|
226
|
+
summarize: () => summarize
|
|
227
|
+
});
|
|
148
228
|
var now = () => typeof performance !== "undefined" && typeof performance.now === "function" ? performance.now() : Date.now();
|
|
149
229
|
var hookLabel = (c) => c.custom && c.custom.length ? `${c.custom.join(" \u203A ")} \u203A ${c.hook}#${c.index}` : `${c.hook} #${c.index}`;
|
|
150
230
|
function storeAdvice(custom) {
|
|
@@ -298,13 +378,13 @@ var RerenderLens = (function (exports) {
|
|
|
298
378
|
removed: "removed"
|
|
299
379
|
};
|
|
300
380
|
function summarize(report) {
|
|
301
|
-
const
|
|
381
|
+
const counts = /* @__PURE__ */ new Map();
|
|
302
382
|
for (const c of [...report.propChanges, ...report.stateChanges, ...report.hookChanges]) {
|
|
303
|
-
|
|
383
|
+
counts.set(c.kind, (counts.get(c.kind) ?? 0) + 1);
|
|
304
384
|
}
|
|
305
|
-
const
|
|
306
|
-
if (
|
|
307
|
-
return
|
|
385
|
+
const parts2 = [...counts].map(([kind, n]) => `${n} ${KIND_LABEL[kind]}`);
|
|
386
|
+
if (parts2.length === 0) parts2.push("no changes");
|
|
387
|
+
return parts2.join(", ");
|
|
308
388
|
}
|
|
309
389
|
function printReport(report, options) {
|
|
310
390
|
const c = options.console ?? console;
|
|
@@ -324,12 +404,18 @@ var RerenderLens = (function (exports) {
|
|
|
324
404
|
}
|
|
325
405
|
|
|
326
406
|
// src/state.ts
|
|
407
|
+
var state_exports = {};
|
|
408
|
+
__export(state_exports, {
|
|
409
|
+
dispatch: () => dispatch,
|
|
410
|
+
getState: () => getState,
|
|
411
|
+
warnOnce: () => warnOnce
|
|
412
|
+
});
|
|
327
413
|
var KEY = /* @__PURE__ */ Symbol.for("rerender-lens.state");
|
|
328
414
|
function getState() {
|
|
329
415
|
const g = globalThis;
|
|
330
416
|
let s = g[KEY];
|
|
331
417
|
if (!s) {
|
|
332
|
-
s = { options: {}, enabled: false, printed: /* @__PURE__ */ new Map(), detach: null, nextInstanceId: 1, nextCommitId: 1, warnedOnce: /* @__PURE__ */ new Set(), scheduled: 0, commits: 0, overheadMs: 0, maxCommitMs: 0 };
|
|
418
|
+
s = { options: {}, enabled: false, printed: /* @__PURE__ */ new Map(), detach: null, nextInstanceId: 1, nextCommitId: 1, warnedOnce: /* @__PURE__ */ new Set(), scheduled: 0, commits: 0, overheadMs: 0, maxCommitMs: 0, truncated: 0 };
|
|
333
419
|
g[KEY] = s;
|
|
334
420
|
}
|
|
335
421
|
return s;
|
|
@@ -342,7 +428,7 @@ var RerenderLens = (function (exports) {
|
|
|
342
428
|
}
|
|
343
429
|
function dispatch(report, override) {
|
|
344
430
|
const s = getState();
|
|
345
|
-
const options = s.options;
|
|
431
|
+
const options = override ? { ...s.options, ...override } : s.options;
|
|
346
432
|
if (!options.silent && (report.avoidable || options.logAll)) {
|
|
347
433
|
const max = options.maxReportsPerComponent ?? 0;
|
|
348
434
|
const n = (s.printed.get(report.component) ?? 0) + 1;
|
|
@@ -359,12 +445,346 @@ var RerenderLens = (function (exports) {
|
|
|
359
445
|
try {
|
|
360
446
|
options.notifier(report);
|
|
361
447
|
} catch (err) {
|
|
362
|
-
(
|
|
448
|
+
warnOnce("notifier", `notifier threw: ${String(err)}`);
|
|
363
449
|
}
|
|
364
450
|
}
|
|
365
451
|
}
|
|
366
452
|
|
|
453
|
+
// src/overlay.ts
|
|
454
|
+
var overlay_exports = {};
|
|
455
|
+
__export(overlay_exports, {
|
|
456
|
+
clearHighlight: () => clearHighlight,
|
|
457
|
+
destroyOverlay: () => destroyOverlay,
|
|
458
|
+
flash: () => flash,
|
|
459
|
+
highlight: () => highlight
|
|
460
|
+
});
|
|
461
|
+
var ROOT_ID = "rerender-lens-overlay";
|
|
462
|
+
var layer = null;
|
|
463
|
+
function ensureLayer() {
|
|
464
|
+
if (typeof document === "undefined" || !document.body) return null;
|
|
465
|
+
if (layer && layer.root.isConnected) return layer;
|
|
466
|
+
let root = document.getElementById(ROOT_ID);
|
|
467
|
+
if (!root) {
|
|
468
|
+
root = document.createElement("div");
|
|
469
|
+
root.id = ROOT_ID;
|
|
470
|
+
root.setAttribute("aria-hidden", "true");
|
|
471
|
+
Object.assign(root.style, {
|
|
472
|
+
position: "fixed",
|
|
473
|
+
inset: "0",
|
|
474
|
+
pointerEvents: "none",
|
|
475
|
+
zIndex: "2147483647",
|
|
476
|
+
overflow: "visible"
|
|
477
|
+
});
|
|
478
|
+
document.body.appendChild(root);
|
|
479
|
+
}
|
|
480
|
+
layer = { root, sticky: [] };
|
|
481
|
+
return layer;
|
|
482
|
+
}
|
|
483
|
+
function box(rect, color, fill, label) {
|
|
484
|
+
const b = document.createElement("div");
|
|
485
|
+
Object.assign(b.style, {
|
|
486
|
+
position: "absolute",
|
|
487
|
+
left: `${rect.left}px`,
|
|
488
|
+
top: `${rect.top}px`,
|
|
489
|
+
width: `${Math.max(rect.width, 2)}px`,
|
|
490
|
+
height: `${Math.max(rect.height, 2)}px`,
|
|
491
|
+
boxSizing: "border-box",
|
|
492
|
+
border: `2px solid ${color}`,
|
|
493
|
+
background: fill,
|
|
494
|
+
borderRadius: "2px"
|
|
495
|
+
});
|
|
496
|
+
if (label) {
|
|
497
|
+
const tag = document.createElement("span");
|
|
498
|
+
tag.textContent = label;
|
|
499
|
+
Object.assign(tag.style, {
|
|
500
|
+
position: "absolute",
|
|
501
|
+
left: "-2px",
|
|
502
|
+
top: rect.top > 20 ? "-20px" : "100%",
|
|
503
|
+
font: "11px/16px system-ui, sans-serif",
|
|
504
|
+
color: "#fff",
|
|
505
|
+
background: color,
|
|
506
|
+
padding: "1px 5px",
|
|
507
|
+
borderRadius: "2px",
|
|
508
|
+
whiteSpace: "nowrap"
|
|
509
|
+
});
|
|
510
|
+
b.appendChild(tag);
|
|
511
|
+
}
|
|
512
|
+
return b;
|
|
513
|
+
}
|
|
514
|
+
function highlight(target) {
|
|
515
|
+
const l = ensureLayer();
|
|
516
|
+
if (!l) return;
|
|
517
|
+
for (const s of l.sticky) s.remove();
|
|
518
|
+
l.sticky = [];
|
|
519
|
+
if (!target) return;
|
|
520
|
+
const frag = document.createDocumentFragment();
|
|
521
|
+
for (const rect of measure(target.nodes)) {
|
|
522
|
+
const b = box(rect, "#1a73e8", "rgba(26, 115, 232, 0.12)", target.label);
|
|
523
|
+
frag.appendChild(b);
|
|
524
|
+
l.sticky.push(b);
|
|
525
|
+
}
|
|
526
|
+
l.root.appendChild(frag);
|
|
527
|
+
}
|
|
528
|
+
var MAX_BOXES = 100;
|
|
529
|
+
function measure(nodes) {
|
|
530
|
+
const rects = [];
|
|
531
|
+
for (const node of nodes) {
|
|
532
|
+
if (rects.length >= MAX_BOXES) break;
|
|
533
|
+
const rect = node.getBoundingClientRect();
|
|
534
|
+
if (rect.width === 0 && rect.height === 0) continue;
|
|
535
|
+
rects.push(rect);
|
|
536
|
+
}
|
|
537
|
+
return rects;
|
|
538
|
+
}
|
|
539
|
+
function clearHighlight() {
|
|
540
|
+
highlight(null);
|
|
541
|
+
}
|
|
542
|
+
function flash(target, duration = 500) {
|
|
543
|
+
const l = ensureLayer();
|
|
544
|
+
if (!l) return;
|
|
545
|
+
const frag = document.createDocumentFragment();
|
|
546
|
+
const boxes = [];
|
|
547
|
+
for (const rect of measure(target.nodes)) {
|
|
548
|
+
const b = box(rect, "#d93025", "rgba(217, 48, 37, 0.15)");
|
|
549
|
+
b.style.transition = `opacity ${duration}ms ease-out`;
|
|
550
|
+
frag.appendChild(b);
|
|
551
|
+
boxes.push(b);
|
|
552
|
+
}
|
|
553
|
+
if (!boxes.length) return;
|
|
554
|
+
l.root.appendChild(frag);
|
|
555
|
+
requestAnimationFrame(() => {
|
|
556
|
+
for (const b of boxes) b.style.opacity = "0";
|
|
557
|
+
});
|
|
558
|
+
setTimeout(() => {
|
|
559
|
+
for (const b of boxes) b.remove();
|
|
560
|
+
}, duration + 50);
|
|
561
|
+
}
|
|
562
|
+
function destroyOverlay() {
|
|
563
|
+
if (layer) layer.root.remove();
|
|
564
|
+
layer = null;
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
// vendor-rerender-lens.core.js
|
|
568
|
+
var parts = globalThis.__RERENDER_LENS_PARTS__ = globalThis.__RERENDER_LENS_PARTS__ || {};
|
|
569
|
+
parts["types"] = types_exports;
|
|
570
|
+
parts["version"] = version_exports;
|
|
571
|
+
parts["diff"] = diff_exports;
|
|
572
|
+
parts["report"] = report_exports;
|
|
573
|
+
parts["state"] = state_exports;
|
|
574
|
+
parts["overlay"] = overlay_exports;
|
|
575
|
+
})();
|
|
576
|
+
|
|
577
|
+
;
|
|
578
|
+
/* rerender-lens 0.4.0 — rerender-lens.engine.js: fiber, tracker, hookNames. Built by scripts/build-vendor.mjs; do not edit. */
|
|
579
|
+
(() => {
|
|
580
|
+
var __create = Object.create;
|
|
581
|
+
var __defProp = Object.defineProperty;
|
|
582
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
583
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
584
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
585
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
586
|
+
var __commonJS = (cb, mod) => function __require() {
|
|
587
|
+
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
588
|
+
};
|
|
589
|
+
var __export = (target, all) => {
|
|
590
|
+
for (var name in all)
|
|
591
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
592
|
+
};
|
|
593
|
+
var __copyProps = (to, from, except, desc) => {
|
|
594
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
595
|
+
for (let key of __getOwnPropNames(from))
|
|
596
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
597
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
598
|
+
}
|
|
599
|
+
return to;
|
|
600
|
+
};
|
|
601
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
602
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
603
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
604
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
605
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
606
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
607
|
+
mod
|
|
608
|
+
));
|
|
609
|
+
|
|
610
|
+
// rerender-lens-part:diff
|
|
611
|
+
var require_diff = __commonJS({
|
|
612
|
+
"rerender-lens-part:diff"(exports, module) {
|
|
613
|
+
var p = globalThis.__RERENDER_LENS_PARTS__;
|
|
614
|
+
if (!p || !p["diff"]) throw new Error("rerender-lens: load vendor/rerender-lens.core.js and vendor/rerender-lens.engine.js before vendor/rerender-lens.js");
|
|
615
|
+
module.exports = p["diff"];
|
|
616
|
+
}
|
|
617
|
+
});
|
|
618
|
+
|
|
619
|
+
// rerender-lens-part:report
|
|
620
|
+
var require_report = __commonJS({
|
|
621
|
+
"rerender-lens-part:report"(exports, module) {
|
|
622
|
+
var p = globalThis.__RERENDER_LENS_PARTS__;
|
|
623
|
+
if (!p || !p["report"]) throw new Error("rerender-lens: load vendor/rerender-lens.core.js and vendor/rerender-lens.engine.js before vendor/rerender-lens.js");
|
|
624
|
+
module.exports = p["report"];
|
|
625
|
+
}
|
|
626
|
+
});
|
|
627
|
+
|
|
628
|
+
// rerender-lens-part:state
|
|
629
|
+
var require_state = __commonJS({
|
|
630
|
+
"rerender-lens-part:state"(exports, module) {
|
|
631
|
+
var p = globalThis.__RERENDER_LENS_PARTS__;
|
|
632
|
+
if (!p || !p["state"]) throw new Error("rerender-lens: load vendor/rerender-lens.core.js and vendor/rerender-lens.engine.js before vendor/rerender-lens.js");
|
|
633
|
+
module.exports = p["state"];
|
|
634
|
+
}
|
|
635
|
+
});
|
|
636
|
+
|
|
637
|
+
// rerender-lens-part:types
|
|
638
|
+
var require_types = __commonJS({
|
|
639
|
+
"rerender-lens-part:types"(exports, module) {
|
|
640
|
+
var p = globalThis.__RERENDER_LENS_PARTS__;
|
|
641
|
+
if (!p || !p["types"]) throw new Error("rerender-lens: load vendor/rerender-lens.core.js and vendor/rerender-lens.engine.js before vendor/rerender-lens.js");
|
|
642
|
+
module.exports = p["types"];
|
|
643
|
+
}
|
|
644
|
+
});
|
|
645
|
+
|
|
646
|
+
// src/fiber.ts
|
|
647
|
+
var fiber_exports = {};
|
|
648
|
+
__export(fiber_exports, {
|
|
649
|
+
COMMIT_TIME_BUDGET_MS: () => COMMIT_TIME_BUDGET_MS,
|
|
650
|
+
MAX_REPORTS_PER_COMMIT: () => MAX_REPORTS_PER_COMMIT,
|
|
651
|
+
attach: () => attach,
|
|
652
|
+
durationsOf: () => durationsOf,
|
|
653
|
+
ensureDevtoolsHook: () => ensureDevtoolsHook,
|
|
654
|
+
fiberById: () => fiberById,
|
|
655
|
+
fiberForNode: () => fiberForNode,
|
|
656
|
+
fiberName: () => fiberName,
|
|
657
|
+
fiberType: () => fiberType,
|
|
658
|
+
findProvider: () => findProvider,
|
|
659
|
+
getDispatcherRef: () => getDispatcherRef,
|
|
660
|
+
getRenderers: () => getRenderers,
|
|
661
|
+
hostNodesOf: () => hostNodesOf,
|
|
662
|
+
instanceIdOf: () => instanceIdOf,
|
|
663
|
+
isMemoizedFiber: () => isMemoizedFiber,
|
|
664
|
+
isProductionReact: () => isProductionReact,
|
|
665
|
+
nearestComponent: () => nearestComponent,
|
|
666
|
+
onCommit: () => onCommit,
|
|
667
|
+
parseStackLocation: () => parseStackLocation,
|
|
668
|
+
priorityLabel: () => priorityLabel,
|
|
669
|
+
snapshotContexts: () => snapshotContexts,
|
|
670
|
+
snapshotHooks: () => snapshotHooks,
|
|
671
|
+
sourceOf: () => sourceOf
|
|
672
|
+
});
|
|
673
|
+
var import_diff = __toESM(require_diff(), 1);
|
|
674
|
+
var import_report = __toESM(require_report(), 1);
|
|
675
|
+
var import_state2 = __toESM(require_state(), 1);
|
|
676
|
+
|
|
677
|
+
// src/tracker.ts
|
|
678
|
+
var tracker_exports = {};
|
|
679
|
+
__export(tracker_exports, {
|
|
680
|
+
configure: () => configure,
|
|
681
|
+
disable: () => disable,
|
|
682
|
+
getDisplayName: () => getDisplayName,
|
|
683
|
+
init: () => init,
|
|
684
|
+
isEnabled: () => isEnabled,
|
|
685
|
+
shouldTrack: () => shouldTrack,
|
|
686
|
+
track: () => track
|
|
687
|
+
});
|
|
688
|
+
var import_types = __toESM(require_types(), 1);
|
|
689
|
+
var import_state = __toESM(require_state(), 1);
|
|
690
|
+
var MEMO = /* @__PURE__ */ Symbol.for("react.memo");
|
|
691
|
+
var FORWARD_REF = /* @__PURE__ */ Symbol.for("react.forward_ref");
|
|
692
|
+
var isMemo = (t) => typeof t === "object" && t !== null && t.$$typeof === MEMO;
|
|
693
|
+
var isForwardRef = (t) => typeof t === "object" && t !== null && t.$$typeof === FORWARD_REF;
|
|
694
|
+
var isClass = (t) => typeof t === "function" && !!t.prototype?.isReactComponent;
|
|
695
|
+
var isPureClass = (t) => isClass(t) && !!t.prototype.isPureReactComponent;
|
|
696
|
+
var isComponentLike = (t) => typeof t === "function" || isMemo(t) || isForwardRef(t);
|
|
697
|
+
function getDisplayName(type) {
|
|
698
|
+
if (typeof type === "string") return type;
|
|
699
|
+
if (isMemo(type)) return type.displayName ?? getDisplayName(type.type);
|
|
700
|
+
if (isForwardRef(type)) return type.displayName ?? getDisplayName(type.render);
|
|
701
|
+
if (typeof type === "function") {
|
|
702
|
+
const t = type;
|
|
703
|
+
return t.displayName ?? (t.name || "Anonymous");
|
|
704
|
+
}
|
|
705
|
+
return "Anonymous";
|
|
706
|
+
}
|
|
707
|
+
function hasMarker(type) {
|
|
708
|
+
if (type === null || typeof type !== "function" && typeof type !== "object") return false;
|
|
709
|
+
if (type[import_types.MARKER] === true) return true;
|
|
710
|
+
if (isMemo(type)) return hasMarker(type.type);
|
|
711
|
+
if (isForwardRef(type)) return hasMarker(type.render);
|
|
712
|
+
return false;
|
|
713
|
+
}
|
|
714
|
+
function matches(m, name) {
|
|
715
|
+
if (typeof m === "string") return m === name;
|
|
716
|
+
if (m instanceof RegExp) return m.test(name);
|
|
717
|
+
return m(name);
|
|
718
|
+
}
|
|
719
|
+
function shouldTrack(type, o) {
|
|
720
|
+
if (!isComponentLike(type)) return false;
|
|
721
|
+
const name = getDisplayName(type);
|
|
722
|
+
if (o.exclude?.some((m) => matches(m, name))) return false;
|
|
723
|
+
if (hasMarker(type)) return true;
|
|
724
|
+
if (o.include?.some((m) => matches(m, name))) return true;
|
|
725
|
+
if (o.trackAllComponents) return true;
|
|
726
|
+
if (o.trackAllMemoized) return isMemo(type) || isPureClass(type);
|
|
727
|
+
return false;
|
|
728
|
+
}
|
|
729
|
+
function init(options = {}) {
|
|
730
|
+
const s = (0, import_state.getState)();
|
|
731
|
+
s.options = { ...options };
|
|
732
|
+
s.printed.clear();
|
|
733
|
+
if (!s.enabled) {
|
|
734
|
+
s.detach = attach();
|
|
735
|
+
s.enabled = true;
|
|
736
|
+
}
|
|
737
|
+
return disable;
|
|
738
|
+
}
|
|
739
|
+
function configure(options) {
|
|
740
|
+
const s = (0, import_state.getState)();
|
|
741
|
+
s.options = { ...s.options, ...options };
|
|
742
|
+
}
|
|
743
|
+
function disable() {
|
|
744
|
+
const s = (0, import_state.getState)();
|
|
745
|
+
if (!s.enabled) return;
|
|
746
|
+
s.detach?.();
|
|
747
|
+
s.detach = null;
|
|
748
|
+
s.enabled = false;
|
|
749
|
+
}
|
|
750
|
+
function isEnabled() {
|
|
751
|
+
return (0, import_state.getState)().enabled;
|
|
752
|
+
}
|
|
753
|
+
function track(component, name) {
|
|
754
|
+
const t = component;
|
|
755
|
+
t[import_types.MARKER] = true;
|
|
756
|
+
if (name) t.displayName = name;
|
|
757
|
+
return component;
|
|
758
|
+
}
|
|
759
|
+
|
|
367
760
|
// src/hookNames.ts
|
|
761
|
+
var hookNames_exports = {};
|
|
762
|
+
__export(hookNames_exports, {
|
|
763
|
+
HOOK_NODE_COUNT: () => NODE_COUNT,
|
|
764
|
+
clearHookNameCache: () => clearHookNameCache,
|
|
765
|
+
customHooksFromStack: () => customHooksFromStack,
|
|
766
|
+
resolveHookNames: () => resolveHookNames
|
|
767
|
+
});
|
|
768
|
+
var NODE_COUNT = {
|
|
769
|
+
useState: 1,
|
|
770
|
+
useReducer: 1,
|
|
771
|
+
useRef: 1,
|
|
772
|
+
useMemo: 1,
|
|
773
|
+
useCallback: 1,
|
|
774
|
+
useEffect: 1,
|
|
775
|
+
useLayoutEffect: 1,
|
|
776
|
+
useInsertionEffect: 1,
|
|
777
|
+
useImperativeHandle: 1,
|
|
778
|
+
useSyncExternalStore: 2,
|
|
779
|
+
useTransition: 2,
|
|
780
|
+
useDeferredValue: 1,
|
|
781
|
+
useId: 1,
|
|
782
|
+
useOptimistic: 1,
|
|
783
|
+
useActionState: 3,
|
|
784
|
+
useFormState: 3,
|
|
785
|
+
useEffectEvent: 1,
|
|
786
|
+
useCacheRefresh: 1
|
|
787
|
+
};
|
|
368
788
|
var noop = () => {
|
|
369
789
|
};
|
|
370
790
|
function customHooksFromStack(stack, componentName, marker) {
|
|
@@ -528,6 +948,8 @@ var RerenderLens = (function (exports) {
|
|
|
528
948
|
}
|
|
529
949
|
return result.byNode;
|
|
530
950
|
}
|
|
951
|
+
function clearHookNameCache() {
|
|
952
|
+
}
|
|
531
953
|
|
|
532
954
|
// src/fiber.ts
|
|
533
955
|
var FunctionComponent = 0;
|
|
@@ -616,10 +1038,10 @@ var RerenderLens = (function (exports) {
|
|
|
616
1038
|
try {
|
|
617
1039
|
onCommit(root, priorityLabel(priority));
|
|
618
1040
|
} catch (err) {
|
|
619
|
-
warnOnce("commit", `failed to inspect a commit: ${String(err)}`);
|
|
1041
|
+
(0, import_state2.warnOnce)("commit", `failed to inspect a commit: ${String(err)}`);
|
|
620
1042
|
} finally {
|
|
621
1043
|
const spent = nowMs() - started;
|
|
622
|
-
const s = getState();
|
|
1044
|
+
const s = (0, import_state2.getState)();
|
|
623
1045
|
s.overheadMs += spent;
|
|
624
1046
|
if (spent > s.maxCommitMs) s.maxCommitMs = spent;
|
|
625
1047
|
}
|
|
@@ -628,7 +1050,7 @@ var RerenderLens = (function (exports) {
|
|
|
628
1050
|
hook.onCommitFiberRoot = patched;
|
|
629
1051
|
const previousSchedule = hook.onScheduleFiberRoot;
|
|
630
1052
|
const patchedSchedule = function(id, root, children) {
|
|
631
|
-
getState().scheduled++;
|
|
1053
|
+
(0, import_state2.getState)().scheduled++;
|
|
632
1054
|
if (typeof previousSchedule === "function") return previousSchedule.call(this, id, root, children);
|
|
633
1055
|
};
|
|
634
1056
|
hook.onScheduleFiberRoot = patchedSchedule;
|
|
@@ -702,11 +1124,14 @@ var RerenderLens = (function (exports) {
|
|
|
702
1124
|
var ids = /* @__PURE__ */ new WeakMap();
|
|
703
1125
|
var fibersById = /* @__PURE__ */ new Map();
|
|
704
1126
|
var hasWeakRef = typeof WeakRef === "function";
|
|
705
|
-
|
|
1127
|
+
var pruneAt = 5e3;
|
|
1128
|
+
function remember(id, fiber) {
|
|
706
1129
|
if (!hasWeakRef) return;
|
|
1130
|
+
if (fibersById.get(id)?.deref() === fiber) return;
|
|
707
1131
|
fibersById.set(id, new WeakRef(fiber));
|
|
708
|
-
if (fibersById.size >
|
|
1132
|
+
if (fibersById.size > pruneAt) {
|
|
709
1133
|
for (const [k, ref] of fibersById) if (!ref.deref()) fibersById.delete(k);
|
|
1134
|
+
pruneAt = Math.max(5e3, fibersById.size * 2);
|
|
710
1135
|
}
|
|
711
1136
|
}
|
|
712
1137
|
function instanceIdOf(fiber) {
|
|
@@ -723,13 +1148,13 @@ var RerenderLens = (function (exports) {
|
|
|
723
1148
|
const existing = instanceIdOf(fiber);
|
|
724
1149
|
if (existing !== void 0) {
|
|
725
1150
|
ids.set(fiber, existing);
|
|
726
|
-
|
|
1151
|
+
remember(existing, fiber);
|
|
727
1152
|
return existing;
|
|
728
1153
|
}
|
|
729
|
-
const s = getState();
|
|
1154
|
+
const s = (0, import_state2.getState)();
|
|
730
1155
|
const id = s.nextInstanceId++;
|
|
731
1156
|
ids.set(fiber, id);
|
|
732
|
-
|
|
1157
|
+
remember(id, fiber);
|
|
733
1158
|
return id;
|
|
734
1159
|
}
|
|
735
1160
|
function hostNodesOf(fiber, limit = 50) {
|
|
@@ -761,7 +1186,7 @@ var RerenderLens = (function (exports) {
|
|
|
761
1186
|
}
|
|
762
1187
|
var INTERNAL_FRAME = /react-dom|react_jsx|jsx-(dev-)?runtime|\/react\/|node_modules\/react|react-stack-bottom-frame|react_stack_bottom_frame|scheduler/;
|
|
763
1188
|
function parseStackLocation(stack) {
|
|
764
|
-
for (const line of stack.split("\n")) {
|
|
1189
|
+
for (const line of stack.split("\n", 24)) {
|
|
765
1190
|
const m = /(?:at\s+(?:.*?\s+)?\(?|@)?((?:https?|file|webpack|vite|blob):[^\s()]+?):(\d+):(\d+)\)?\s*$/.exec(line.trim());
|
|
766
1191
|
if (!m || !m[1] || INTERNAL_FRAME.test(m[1])) continue;
|
|
767
1192
|
return { fileName: m[1], lineNumber: Number(m[2]), columnNumber: Number(m[3]) };
|
|
@@ -777,9 +1202,16 @@ var RerenderLens = (function (exports) {
|
|
|
777
1202
|
return out;
|
|
778
1203
|
}
|
|
779
1204
|
const st = fiber._debugStack;
|
|
780
|
-
|
|
781
|
-
|
|
1205
|
+
if (st && typeof st === "object") {
|
|
1206
|
+
if (sourceCache.has(st)) return sourceCache.get(st);
|
|
1207
|
+
const text = typeof st.stack === "string" ? st.stack : null;
|
|
1208
|
+
const out = text ? parseStackLocation(text) : void 0;
|
|
1209
|
+
sourceCache.set(st, out);
|
|
1210
|
+
return out;
|
|
1211
|
+
}
|
|
1212
|
+
return typeof st === "string" ? parseStackLocation(st) : void 0;
|
|
782
1213
|
}
|
|
1214
|
+
var sourceCache = /* @__PURE__ */ new WeakMap();
|
|
783
1215
|
function bumpCount(fiber) {
|
|
784
1216
|
const prev = counts.get(fiber) ?? (fiber.alternate ? counts.get(fiber.alternate) : void 0) ?? 0;
|
|
785
1217
|
const n = prev + 1;
|
|
@@ -803,7 +1235,7 @@ var RerenderLens = (function (exports) {
|
|
|
803
1235
|
}
|
|
804
1236
|
var isStateNode = (n) => !!n.queue && typeof n.queue.lastRenderedReducer === "function";
|
|
805
1237
|
var isStoreNode = (n) => !!n.queue && typeof n.queue.getSnapshot === "function";
|
|
806
|
-
function
|
|
1238
|
+
function hookLabel(node) {
|
|
807
1239
|
if (isStoreNode(node)) return "useSyncExternalStore";
|
|
808
1240
|
if (isStateNode(node)) {
|
|
809
1241
|
const r = node.queue.lastRenderedReducer;
|
|
@@ -828,7 +1260,7 @@ var RerenderLens = (function (exports) {
|
|
|
828
1260
|
let i = 0;
|
|
829
1261
|
for (let n = first; n; n = n.next, i++) {
|
|
830
1262
|
if (!isStateNode(n) && !isStoreNode(n)) continue;
|
|
831
|
-
const hook = labels?.[i] ??
|
|
1263
|
+
const hook = labels?.[i] ?? hookLabel(n);
|
|
832
1264
|
out.push({ path: `${hook}#${i}`, hook, index: i, value: n.memoizedState });
|
|
833
1265
|
}
|
|
834
1266
|
return out;
|
|
@@ -848,12 +1280,12 @@ var RerenderLens = (function (exports) {
|
|
|
848
1280
|
let i = 0;
|
|
849
1281
|
while (a && b) {
|
|
850
1282
|
if ((isStateNode(b) || isStoreNode(b)) && !Object.is(a.memoizedState, b.memoizedState)) {
|
|
851
|
-
const hook = labels?.[i] ??
|
|
1283
|
+
const hook = labels?.[i] ?? hookLabel(b);
|
|
852
1284
|
out.push({
|
|
853
1285
|
path: `${hook}#${i}`,
|
|
854
1286
|
hook,
|
|
855
1287
|
index: i,
|
|
856
|
-
kind: classify(a.memoizedState, b.memoizedState),
|
|
1288
|
+
kind: (0, import_diff.classify)(a.memoizedState, b.memoizedState),
|
|
857
1289
|
prev: a.memoizedState,
|
|
858
1290
|
next: b.memoizedState
|
|
859
1291
|
});
|
|
@@ -875,7 +1307,7 @@ var RerenderLens = (function (exports) {
|
|
|
875
1307
|
}
|
|
876
1308
|
return null;
|
|
877
1309
|
}
|
|
878
|
-
var
|
|
1310
|
+
var isPlainObject = (v) => typeof v === "object" && v !== null && !Array.isArray(v) && Object.getPrototypeOf(v) === Object.prototype;
|
|
879
1311
|
function diffContexts(fiber, alt) {
|
|
880
1312
|
const out = [];
|
|
881
1313
|
let a = alt.dependencies?.firstContext ?? null;
|
|
@@ -888,7 +1320,7 @@ var RerenderLens = (function (exports) {
|
|
|
888
1320
|
path: `useContext(${name})`,
|
|
889
1321
|
hook: "useContext",
|
|
890
1322
|
index: i,
|
|
891
|
-
kind: classify(a.memoizedValue, b.memoizedValue),
|
|
1323
|
+
kind: (0, import_diff.classify)(a.memoizedValue, b.memoizedValue),
|
|
892
1324
|
prev: a.memoizedValue,
|
|
893
1325
|
next: b.memoizedValue
|
|
894
1326
|
};
|
|
@@ -897,7 +1329,7 @@ var RerenderLens = (function (exports) {
|
|
|
897
1329
|
const path = componentPath(provider);
|
|
898
1330
|
change.provider = { component: path[path.length - 1] ?? null, path };
|
|
899
1331
|
}
|
|
900
|
-
if (
|
|
1332
|
+
if (isPlainObject(a.memoizedValue) && isPlainObject(b.memoizedValue)) {
|
|
901
1333
|
const prev = a.memoizedValue;
|
|
902
1334
|
const next = b.memoizedValue;
|
|
903
1335
|
const keys = /* @__PURE__ */ new Set([...Object.keys(prev), ...Object.keys(next)]);
|
|
@@ -912,16 +1344,16 @@ var RerenderLens = (function (exports) {
|
|
|
912
1344
|
}
|
|
913
1345
|
return out;
|
|
914
1346
|
}
|
|
915
|
-
var
|
|
1347
|
+
var isGenuine = (c) => c.kind === "different" || c.kind === "added" || c.kind === "removed";
|
|
916
1348
|
function analyze(fiber, alt, trackHooks) {
|
|
917
1349
|
const prevProps = alt.memoizedProps ?? {};
|
|
918
1350
|
const nextProps = fiber.memoizedProps ?? {};
|
|
919
|
-
const propChanges = prevProps === nextProps ? [] : diffRecords(prevProps, nextProps);
|
|
1351
|
+
const propChanges = prevProps === nextProps ? [] : (0, import_diff.diffRecords)(prevProps, nextProps);
|
|
920
1352
|
let stateChanges = [];
|
|
921
1353
|
let hookChanges = [];
|
|
922
1354
|
if (fiber.tag === ClassComponent) {
|
|
923
1355
|
if (alt.memoizedState !== fiber.memoizedState) {
|
|
924
|
-
stateChanges = diffRecords(
|
|
1356
|
+
stateChanges = (0, import_diff.diffRecords)(
|
|
925
1357
|
alt.memoizedState ?? {},
|
|
926
1358
|
fiber.memoizedState ?? {}
|
|
927
1359
|
);
|
|
@@ -931,9 +1363,9 @@ var RerenderLens = (function (exports) {
|
|
|
931
1363
|
}
|
|
932
1364
|
const isStateHook = (h) => h.hook !== "useContext" && h.hook !== "useSyncExternalStore";
|
|
933
1365
|
const causes = [];
|
|
934
|
-
if (propChanges.some(
|
|
935
|
-
if (stateChanges.some(
|
|
936
|
-
if (hookChanges.some((h) => !isStateHook(h) &&
|
|
1366
|
+
if (propChanges.some(isGenuine)) causes.push("props");
|
|
1367
|
+
if (stateChanges.some(isGenuine) || hookChanges.some((h) => isStateHook(h) && isGenuine(h))) causes.push("state");
|
|
1368
|
+
if (hookChanges.some((h) => !isStateHook(h) && isGenuine(h))) causes.push("hooks");
|
|
937
1369
|
const trigger = causes.length === 0 ? "parent" : causes.length === 1 ? causes[0] : "mixed";
|
|
938
1370
|
return { propChanges, stateChanges, hookChanges, trigger };
|
|
939
1371
|
}
|
|
@@ -967,8 +1399,10 @@ var RerenderLens = (function (exports) {
|
|
|
967
1399
|
}
|
|
968
1400
|
var lastCommit = null;
|
|
969
1401
|
var EFFECT_LOOP_WINDOW_MS = 50;
|
|
1402
|
+
var MAX_REPORTS_PER_COMMIT = 200;
|
|
1403
|
+
var COMMIT_TIME_BUDGET_MS = 25;
|
|
970
1404
|
function onCommit(root, commitPriority) {
|
|
971
|
-
const s = getState();
|
|
1405
|
+
const s = (0, import_state2.getState)();
|
|
972
1406
|
if (!s.enabled) return;
|
|
973
1407
|
s.commits++;
|
|
974
1408
|
const o = s.options;
|
|
@@ -997,7 +1431,8 @@ var RerenderLens = (function (exports) {
|
|
|
997
1431
|
const updaters = updatersOf(root);
|
|
998
1432
|
let commitCause;
|
|
999
1433
|
let afterCommit;
|
|
1000
|
-
|
|
1434
|
+
const inputDriven = commitPriority === "immediate" || commitPriority === "user-blocking";
|
|
1435
|
+
if (!inputDriven && lastCommit && at - lastCommit.at < EFFECT_LOOP_WINDOW_MS && updaters.some((u) => lastCommit.rendered.has(u))) {
|
|
1001
1436
|
commitCause = "effect-after-commit";
|
|
1002
1437
|
afterCommit = lastCommit.id;
|
|
1003
1438
|
} else if (suspenseResolved) commitCause = "suspense-resolved";
|
|
@@ -1009,122 +1444,212 @@ var RerenderLens = (function (exports) {
|
|
|
1009
1444
|
lastCommit = { id: commitId, at, rendered: renderedNames };
|
|
1010
1445
|
const dispatcherRef = o.resolveHookNames ? getDispatcherRef() : null;
|
|
1011
1446
|
const parentCache = /* @__PURE__ */ new Map();
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1447
|
+
const endDiffScope = (0, import_diff.beginDiffScope)();
|
|
1448
|
+
const deadline = at + COMMIT_TIME_BUDGET_MS;
|
|
1449
|
+
try {
|
|
1450
|
+
for (let i = 0; i < rendered.length; i++) {
|
|
1451
|
+
if (i >= MAX_REPORTS_PER_COMMIT || (i & 15) === 15 && nowMs() > deadline) {
|
|
1452
|
+
s.truncated += rendered.length - i;
|
|
1453
|
+
(0, import_state2.warnOnce)("truncated", `a commit rendered ${rendered.length} tracked components; only ${i} were reported (see info().truncated). Narrow \`include\` or turn off includeState.`);
|
|
1454
|
+
break;
|
|
1455
|
+
}
|
|
1456
|
+
const fiber = rendered[i];
|
|
1457
|
+
const alt = fiber.alternate;
|
|
1458
|
+
const a = analyze(fiber, alt, trackHooks);
|
|
1459
|
+
const durations = durationsOf(fiber);
|
|
1460
|
+
let hookState = o.includeState !== false && trackHooks ? snapshotHooks(fiber) : void 0;
|
|
1461
|
+
if (dispatcherRef && fiber.tag !== ClassComponent && (a.hookChanges.length || hookState && hookState.length)) {
|
|
1462
|
+
const names = resolveHookNames(fiber, dispatcherRef);
|
|
1463
|
+
if (names.size) {
|
|
1464
|
+
for (const c of a.hookChanges) if (c.hook !== "useContext" && names.has(c.index)) c.custom = names.get(c.index);
|
|
1465
|
+
if (hookState) hookState = hookState.map((h) => names.has(h.index) ? { ...h, custom: names.get(h.index) } : h);
|
|
1466
|
+
}
|
|
1022
1467
|
}
|
|
1468
|
+
const report = (0, import_report.buildReport)({
|
|
1469
|
+
component: fiberName(fiber),
|
|
1470
|
+
instanceId: instanceId(fiber),
|
|
1471
|
+
renderCount: bumpCount(fiber),
|
|
1472
|
+
prevProps: alt.memoizedProps ?? {},
|
|
1473
|
+
nextProps: fiber.memoizedProps ?? {},
|
|
1474
|
+
propChanges: a.propChanges,
|
|
1475
|
+
stateChanges: a.stateChanges,
|
|
1476
|
+
hookChanges: a.hookChanges,
|
|
1477
|
+
...o.includeState !== false ? {
|
|
1478
|
+
hookState,
|
|
1479
|
+
contexts: trackHooks ? snapshotContexts(fiber) : void 0,
|
|
1480
|
+
state: fiber.tag === ClassComponent && fiber.memoizedState && typeof fiber.memoizedState === "object" ? fiber.memoizedState : void 0
|
|
1481
|
+
} : {},
|
|
1482
|
+
updaters,
|
|
1483
|
+
commitCause,
|
|
1484
|
+
afterCommit,
|
|
1485
|
+
key: fiber.key === null || fiber.key === void 0 ? null : String(fiber.key),
|
|
1486
|
+
parent: a.trigger === "parent" ? nearestRenderedAncestor(fiber, parentCache, trackHooks) : null,
|
|
1487
|
+
owner: ownerName(fiber),
|
|
1488
|
+
path: componentPath(fiber),
|
|
1489
|
+
memoized: isMemoizedFiber(fiber),
|
|
1490
|
+
selfDuration: durations ? durations.self : void 0,
|
|
1491
|
+
treeDuration: durations ? durations.tree : void 0,
|
|
1492
|
+
commitId,
|
|
1493
|
+
commitPriority,
|
|
1494
|
+
source: sourceOf(fiber)
|
|
1495
|
+
});
|
|
1496
|
+
(0, import_state2.dispatch)(report);
|
|
1023
1497
|
}
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
instanceId: instanceId(fiber),
|
|
1027
|
-
renderCount: bumpCount(fiber),
|
|
1028
|
-
prevProps: alt.memoizedProps ?? {},
|
|
1029
|
-
nextProps: fiber.memoizedProps ?? {},
|
|
1030
|
-
propChanges: a.propChanges,
|
|
1031
|
-
stateChanges: a.stateChanges,
|
|
1032
|
-
hookChanges: a.hookChanges,
|
|
1033
|
-
...o.includeState !== false ? {
|
|
1034
|
-
hookState,
|
|
1035
|
-
contexts: trackHooks ? snapshotContexts(fiber) : void 0,
|
|
1036
|
-
state: fiber.tag === ClassComponent && fiber.memoizedState && typeof fiber.memoizedState === "object" ? fiber.memoizedState : void 0
|
|
1037
|
-
} : {},
|
|
1038
|
-
updaters,
|
|
1039
|
-
commitCause,
|
|
1040
|
-
afterCommit,
|
|
1041
|
-
key: fiber.key === null || fiber.key === void 0 ? null : String(fiber.key),
|
|
1042
|
-
parent: a.trigger === "parent" ? nearestRenderedAncestor(fiber, parentCache, trackHooks) : null,
|
|
1043
|
-
owner: ownerName(fiber),
|
|
1044
|
-
path: componentPath(fiber),
|
|
1045
|
-
memoized: isMemoizedFiber(fiber),
|
|
1046
|
-
selfDuration: durations ? durations.self : void 0,
|
|
1047
|
-
treeDuration: durations ? durations.tree : void 0,
|
|
1048
|
-
commitId,
|
|
1049
|
-
commitPriority,
|
|
1050
|
-
source: sourceOf(fiber)
|
|
1051
|
-
});
|
|
1052
|
-
dispatch(report);
|
|
1498
|
+
} finally {
|
|
1499
|
+
endDiffScope();
|
|
1053
1500
|
}
|
|
1054
1501
|
}
|
|
1055
1502
|
|
|
1056
|
-
//
|
|
1057
|
-
var
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
}
|
|
1086
|
-
function shouldTrack(type, o) {
|
|
1087
|
-
if (!isComponentLike(type)) return false;
|
|
1088
|
-
const name = getDisplayName(type);
|
|
1089
|
-
if (o.exclude?.some((m) => matches(m, name))) return false;
|
|
1090
|
-
if (hasMarker(type)) return true;
|
|
1091
|
-
if (o.include?.some((m) => matches(m, name))) return true;
|
|
1092
|
-
if (o.trackAllComponents) return true;
|
|
1093
|
-
if (o.trackAllMemoized) return isMemo(type) || isPureClass(type);
|
|
1094
|
-
return false;
|
|
1095
|
-
}
|
|
1096
|
-
function init(options = {}) {
|
|
1097
|
-
const s = getState();
|
|
1098
|
-
s.options = { ...options };
|
|
1099
|
-
s.printed.clear();
|
|
1100
|
-
if (!s.enabled) {
|
|
1101
|
-
s.detach = attach();
|
|
1102
|
-
s.enabled = true;
|
|
1503
|
+
// vendor-rerender-lens.engine.js
|
|
1504
|
+
var parts = globalThis.__RERENDER_LENS_PARTS__ = globalThis.__RERENDER_LENS_PARTS__ || {};
|
|
1505
|
+
parts["fiber"] = fiber_exports;
|
|
1506
|
+
parts["tracker"] = tracker_exports;
|
|
1507
|
+
parts["hookNames"] = hookNames_exports;
|
|
1508
|
+
})();
|
|
1509
|
+
|
|
1510
|
+
;
|
|
1511
|
+
/* rerender-lens 0.4.0 — rerender-lens.js: devtools bridge + notifiers (window.RerenderLens). Built by scripts/build-vendor.mjs; do not edit. */
|
|
1512
|
+
"use strict";
|
|
1513
|
+
var RerenderLens = (() => {
|
|
1514
|
+
var __create = Object.create;
|
|
1515
|
+
var __defProp = Object.defineProperty;
|
|
1516
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
1517
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
1518
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
1519
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
1520
|
+
var __commonJS = (cb, mod) => function __require() {
|
|
1521
|
+
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
1522
|
+
};
|
|
1523
|
+
var __export = (target, all) => {
|
|
1524
|
+
for (var name in all)
|
|
1525
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
1526
|
+
};
|
|
1527
|
+
var __copyProps = (to, from, except, desc) => {
|
|
1528
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
1529
|
+
for (let key of __getOwnPropNames(from))
|
|
1530
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
1531
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
1103
1532
|
}
|
|
1104
|
-
return
|
|
1105
|
-
}
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1533
|
+
return to;
|
|
1534
|
+
};
|
|
1535
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
1536
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
1537
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
1538
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
1539
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
1540
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
1541
|
+
mod
|
|
1542
|
+
));
|
|
1543
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
1544
|
+
|
|
1545
|
+
// rerender-lens-part:types
|
|
1546
|
+
var require_types = __commonJS({
|
|
1547
|
+
"rerender-lens-part:types"(exports, module) {
|
|
1548
|
+
var p = globalThis.__RERENDER_LENS_PARTS__;
|
|
1549
|
+
if (!p || !p["types"]) throw new Error("rerender-lens: load vendor/rerender-lens.core.js and vendor/rerender-lens.engine.js before vendor/rerender-lens.js");
|
|
1550
|
+
module.exports = p["types"];
|
|
1551
|
+
}
|
|
1552
|
+
});
|
|
1553
|
+
|
|
1554
|
+
// rerender-lens-part:tracker
|
|
1555
|
+
var require_tracker = __commonJS({
|
|
1556
|
+
"rerender-lens-part:tracker"(exports, module) {
|
|
1557
|
+
var p = globalThis.__RERENDER_LENS_PARTS__;
|
|
1558
|
+
if (!p || !p["tracker"]) throw new Error("rerender-lens: load vendor/rerender-lens.core.js and vendor/rerender-lens.engine.js before vendor/rerender-lens.js");
|
|
1559
|
+
module.exports = p["tracker"];
|
|
1560
|
+
}
|
|
1561
|
+
});
|
|
1562
|
+
|
|
1563
|
+
// rerender-lens-part:fiber
|
|
1564
|
+
var require_fiber = __commonJS({
|
|
1565
|
+
"rerender-lens-part:fiber"(exports, module) {
|
|
1566
|
+
var p = globalThis.__RERENDER_LENS_PARTS__;
|
|
1567
|
+
if (!p || !p["fiber"]) throw new Error("rerender-lens: load vendor/rerender-lens.core.js and vendor/rerender-lens.engine.js before vendor/rerender-lens.js");
|
|
1568
|
+
module.exports = p["fiber"];
|
|
1569
|
+
}
|
|
1570
|
+
});
|
|
1571
|
+
|
|
1572
|
+
// rerender-lens-part:diff
|
|
1573
|
+
var require_diff = __commonJS({
|
|
1574
|
+
"rerender-lens-part:diff"(exports, module) {
|
|
1575
|
+
var p = globalThis.__RERENDER_LENS_PARTS__;
|
|
1576
|
+
if (!p || !p["diff"]) throw new Error("rerender-lens: load vendor/rerender-lens.core.js and vendor/rerender-lens.engine.js before vendor/rerender-lens.js");
|
|
1577
|
+
module.exports = p["diff"];
|
|
1578
|
+
}
|
|
1579
|
+
});
|
|
1580
|
+
|
|
1581
|
+
// rerender-lens-part:report
|
|
1582
|
+
var require_report = __commonJS({
|
|
1583
|
+
"rerender-lens-part:report"(exports, module) {
|
|
1584
|
+
var p = globalThis.__RERENDER_LENS_PARTS__;
|
|
1585
|
+
if (!p || !p["report"]) throw new Error("rerender-lens: load vendor/rerender-lens.core.js and vendor/rerender-lens.engine.js before vendor/rerender-lens.js");
|
|
1586
|
+
module.exports = p["report"];
|
|
1587
|
+
}
|
|
1588
|
+
});
|
|
1589
|
+
|
|
1590
|
+
// rerender-lens-part:state
|
|
1591
|
+
var require_state = __commonJS({
|
|
1592
|
+
"rerender-lens-part:state"(exports, module) {
|
|
1593
|
+
var p = globalThis.__RERENDER_LENS_PARTS__;
|
|
1594
|
+
if (!p || !p["state"]) throw new Error("rerender-lens: load vendor/rerender-lens.core.js and vendor/rerender-lens.engine.js before vendor/rerender-lens.js");
|
|
1595
|
+
module.exports = p["state"];
|
|
1596
|
+
}
|
|
1597
|
+
});
|
|
1598
|
+
|
|
1599
|
+
// rerender-lens-part:overlay
|
|
1600
|
+
var require_overlay = __commonJS({
|
|
1601
|
+
"rerender-lens-part:overlay"(exports, module) {
|
|
1602
|
+
var p = globalThis.__RERENDER_LENS_PARTS__;
|
|
1603
|
+
if (!p || !p["overlay"]) throw new Error("rerender-lens: load vendor/rerender-lens.core.js and vendor/rerender-lens.engine.js before vendor/rerender-lens.js");
|
|
1604
|
+
module.exports = p["overlay"];
|
|
1605
|
+
}
|
|
1606
|
+
});
|
|
1607
|
+
|
|
1608
|
+
// rerender-lens-part:version
|
|
1609
|
+
var require_version = __commonJS({
|
|
1610
|
+
"rerender-lens-part:version"(exports, module) {
|
|
1611
|
+
var p = globalThis.__RERENDER_LENS_PARTS__;
|
|
1612
|
+
if (!p || !p["version"]) throw new Error("rerender-lens: load vendor/rerender-lens.core.js and vendor/rerender-lens.engine.js before vendor/rerender-lens.js");
|
|
1613
|
+
module.exports = p["version"];
|
|
1614
|
+
}
|
|
1615
|
+
});
|
|
1616
|
+
|
|
1617
|
+
// src/inject.ts
|
|
1618
|
+
var inject_exports = {};
|
|
1619
|
+
__export(inject_exports, {
|
|
1620
|
+
DEVTOOLS_MARKER: () => DEVTOOLS_MARKER,
|
|
1621
|
+
MARKER: () => import_types.MARKER,
|
|
1622
|
+
PROTOCOL_VERSION: () => PROTOCOL_VERSION,
|
|
1623
|
+
VERSION: () => import_version2.VERSION,
|
|
1624
|
+
buildReport: () => import_report2.buildReport,
|
|
1625
|
+
classify: () => import_diff2.classify,
|
|
1626
|
+
combineNotifiers: () => combineNotifiers,
|
|
1627
|
+
configure: () => import_tracker2.configure,
|
|
1628
|
+
createCollector: () => createCollector,
|
|
1629
|
+
createDevtoolsNotifier: () => createDevtoolsNotifier,
|
|
1630
|
+
deepEqual: () => import_diff2.deepEqual,
|
|
1631
|
+
diffRecords: () => import_diff2.diffRecords,
|
|
1632
|
+
disable: () => import_tracker2.disable,
|
|
1633
|
+
ensureDevtoolsHook: () => import_fiber2.ensureDevtoolsHook,
|
|
1634
|
+
getDisplayName: () => import_tracker2.getDisplayName,
|
|
1635
|
+
getRenderers: () => import_fiber2.getRenderers,
|
|
1636
|
+
init: () => import_tracker2.init,
|
|
1637
|
+
isEnabled: () => import_tracker2.isEnabled,
|
|
1638
|
+
isProductionReact: () => import_fiber2.isProductionReact,
|
|
1639
|
+
printReport: () => import_report2.printReport,
|
|
1640
|
+
serialize: () => serialize,
|
|
1641
|
+
shouldTrack: () => import_tracker2.shouldTrack,
|
|
1642
|
+
summarize: () => import_report2.summarize,
|
|
1643
|
+
track: () => import_tracker2.track
|
|
1644
|
+
});
|
|
1645
|
+
var import_types = __toESM(require_types(), 1);
|
|
1646
|
+
var import_tracker2 = __toESM(require_tracker(), 1);
|
|
1647
|
+
var import_fiber2 = __toESM(require_fiber(), 1);
|
|
1648
|
+
var import_diff2 = __toESM(require_diff(), 1);
|
|
1649
|
+
var import_report2 = __toESM(require_report(), 1);
|
|
1126
1650
|
|
|
1127
1651
|
// src/fixes.ts
|
|
1652
|
+
var import_report = __toESM(require_report(), 1);
|
|
1128
1653
|
var AVOIDABLE = /* @__PURE__ */ new Set(["deep-equal", "function", "element"]);
|
|
1129
1654
|
var rootOf = (path) => path.split(/[.[]/)[0] || path;
|
|
1130
1655
|
function fixesFor(r) {
|
|
@@ -1176,7 +1701,7 @@ var RerenderLens = (function (exports) {
|
|
|
1176
1701
|
const chain = c.custom || [];
|
|
1177
1702
|
const redux = chain.some((n) => /^use(App)?Selector$/.test(n));
|
|
1178
1703
|
const zustand = !redux && chain.some((n) => /^use[A-Z]\w*Store$/.test(n) || n === "useStore" || n === "useBoundStore");
|
|
1179
|
-
out.push({ kind: "storeSnapshot", owner: r.component, target: r.component, prop: c.path, label: redux ? `memoize the selector in <${r.component}>` : zustand ? `useShallow in <${r.component}>` : `stable getSnapshot in <${r.component}>`, detail: storeAdvice(c.custom) });
|
|
1704
|
+
out.push({ kind: "storeSnapshot", owner: r.component, target: r.component, prop: c.path, label: redux ? `memoize the selector in <${r.component}>` : zustand ? `useShallow in <${r.component}>` : `stable getSnapshot in <${r.component}>`, detail: (0, import_report.storeAdvice)(c.custom) });
|
|
1180
1705
|
} else {
|
|
1181
1706
|
out.push({ kind: "bailout", owner: r.component, target: r.component, prop: c.path, label: `bail out before setting ${c.path} in <${r.component}>`, detail: `${c.path} was set to a value deep-equal to the current one (new reference).` });
|
|
1182
1707
|
}
|
|
@@ -1242,25 +1767,25 @@ var RerenderLens = (function (exports) {
|
|
|
1242
1767
|
|
|
1243
1768
|
// src/budget.ts
|
|
1244
1769
|
function avoidableCounts(reports) {
|
|
1245
|
-
const
|
|
1246
|
-
for (const r of reports) if (r.avoidable)
|
|
1247
|
-
return
|
|
1770
|
+
const counts = {};
|
|
1771
|
+
for (const r of reports) if (r.avoidable) counts[r.component] = (counts[r.component] || 0) + 1;
|
|
1772
|
+
return counts;
|
|
1248
1773
|
}
|
|
1249
1774
|
function checkBudget(reports, budget) {
|
|
1250
1775
|
const b = typeof budget === "number" ? { "*": budget } : budget;
|
|
1251
1776
|
const fallback = typeof b["*"] === "number" ? b["*"] : 0;
|
|
1252
|
-
const
|
|
1777
|
+
const counts = avoidableCounts(reports);
|
|
1253
1778
|
const violations = [];
|
|
1254
1779
|
const slack = [];
|
|
1255
|
-
const names = /* @__PURE__ */ new Set([...Object.keys(
|
|
1780
|
+
const names = /* @__PURE__ */ new Set([...Object.keys(counts), ...Object.keys(b).filter((k) => k !== "*")]);
|
|
1256
1781
|
for (const component of names) {
|
|
1257
1782
|
const allowed = typeof b[component] === "number" ? b[component] : fallback;
|
|
1258
|
-
const avoidable =
|
|
1783
|
+
const avoidable = counts[component] || 0;
|
|
1259
1784
|
if (avoidable > allowed) violations.push({ component, avoidable, allowed });
|
|
1260
1785
|
else if (avoidable < allowed) slack.push({ component, avoidable, allowed });
|
|
1261
1786
|
}
|
|
1262
1787
|
violations.sort((x, y) => y.avoidable - y.allowed - (x.avoidable - x.allowed));
|
|
1263
|
-
return { ok: violations.length === 0, violations, slack, counts
|
|
1788
|
+
return { ok: violations.length === 0, violations, slack, counts };
|
|
1264
1789
|
}
|
|
1265
1790
|
function assertWithinBudget(reports, budget) {
|
|
1266
1791
|
const result = checkBudget(reports, budget);
|
|
@@ -1310,101 +1835,19 @@ ${formatFixes(reports)}`);
|
|
|
1310
1835
|
};
|
|
1311
1836
|
}
|
|
1312
1837
|
|
|
1313
|
-
// src/overlay.ts
|
|
1314
|
-
var ROOT_ID = "rerender-lens-overlay";
|
|
1315
|
-
var layer = null;
|
|
1316
|
-
function ensureLayer() {
|
|
1317
|
-
if (typeof document === "undefined" || !document.body) return null;
|
|
1318
|
-
if (layer && layer.root.isConnected) return layer;
|
|
1319
|
-
let root = document.getElementById(ROOT_ID);
|
|
1320
|
-
if (!root) {
|
|
1321
|
-
root = document.createElement("div");
|
|
1322
|
-
root.id = ROOT_ID;
|
|
1323
|
-
root.setAttribute("aria-hidden", "true");
|
|
1324
|
-
Object.assign(root.style, {
|
|
1325
|
-
position: "fixed",
|
|
1326
|
-
inset: "0",
|
|
1327
|
-
pointerEvents: "none",
|
|
1328
|
-
zIndex: "2147483647",
|
|
1329
|
-
overflow: "visible"
|
|
1330
|
-
});
|
|
1331
|
-
document.body.appendChild(root);
|
|
1332
|
-
}
|
|
1333
|
-
layer = { root, sticky: [] };
|
|
1334
|
-
return layer;
|
|
1335
|
-
}
|
|
1336
|
-
function box(rect, color, fill, label) {
|
|
1337
|
-
const b = document.createElement("div");
|
|
1338
|
-
Object.assign(b.style, {
|
|
1339
|
-
position: "absolute",
|
|
1340
|
-
left: `${rect.left}px`,
|
|
1341
|
-
top: `${rect.top}px`,
|
|
1342
|
-
width: `${Math.max(rect.width, 2)}px`,
|
|
1343
|
-
height: `${Math.max(rect.height, 2)}px`,
|
|
1344
|
-
boxSizing: "border-box",
|
|
1345
|
-
border: `2px solid ${color}`,
|
|
1346
|
-
background: fill,
|
|
1347
|
-
borderRadius: "2px"
|
|
1348
|
-
});
|
|
1349
|
-
if (label) {
|
|
1350
|
-
const tag = document.createElement("span");
|
|
1351
|
-
tag.textContent = label;
|
|
1352
|
-
Object.assign(tag.style, {
|
|
1353
|
-
position: "absolute",
|
|
1354
|
-
left: "-2px",
|
|
1355
|
-
top: rect.top > 20 ? "-20px" : "100%",
|
|
1356
|
-
font: "11px/16px system-ui, sans-serif",
|
|
1357
|
-
color: "#fff",
|
|
1358
|
-
background: color,
|
|
1359
|
-
padding: "1px 5px",
|
|
1360
|
-
borderRadius: "2px",
|
|
1361
|
-
whiteSpace: "nowrap"
|
|
1362
|
-
});
|
|
1363
|
-
b.appendChild(tag);
|
|
1364
|
-
}
|
|
1365
|
-
return b;
|
|
1366
|
-
}
|
|
1367
|
-
function highlight(target) {
|
|
1368
|
-
const l = ensureLayer();
|
|
1369
|
-
if (!l) return;
|
|
1370
|
-
for (const s of l.sticky) s.remove();
|
|
1371
|
-
l.sticky = [];
|
|
1372
|
-
if (!target) return;
|
|
1373
|
-
for (const node of target.nodes) {
|
|
1374
|
-
const rect = node.getBoundingClientRect();
|
|
1375
|
-
if (rect.width === 0 && rect.height === 0) continue;
|
|
1376
|
-
const b = box(rect, "#1a73e8", "rgba(26, 115, 232, 0.12)", target.label);
|
|
1377
|
-
l.root.appendChild(b);
|
|
1378
|
-
l.sticky.push(b);
|
|
1379
|
-
}
|
|
1380
|
-
}
|
|
1381
|
-
function clearHighlight() {
|
|
1382
|
-
highlight(null);
|
|
1383
|
-
}
|
|
1384
|
-
function flash(target, duration = 500) {
|
|
1385
|
-
const l = ensureLayer();
|
|
1386
|
-
if (!l) return;
|
|
1387
|
-
for (const node of target.nodes) {
|
|
1388
|
-
const rect = node.getBoundingClientRect();
|
|
1389
|
-
if (rect.width === 0 && rect.height === 0) continue;
|
|
1390
|
-
const b = box(rect, "#d93025", "rgba(217, 48, 37, 0.15)");
|
|
1391
|
-
b.style.transition = `opacity ${duration}ms ease-out`;
|
|
1392
|
-
l.root.appendChild(b);
|
|
1393
|
-
requestAnimationFrame(() => {
|
|
1394
|
-
b.style.opacity = "0";
|
|
1395
|
-
});
|
|
1396
|
-
setTimeout(() => b.remove(), duration + 50);
|
|
1397
|
-
}
|
|
1398
|
-
}
|
|
1399
|
-
|
|
1400
|
-
// src/version.ts
|
|
1401
|
-
var VERSION = "0.3.0" ;
|
|
1402
|
-
|
|
1403
1838
|
// src/devtools.ts
|
|
1839
|
+
var import_diff = __toESM(require_diff(), 1);
|
|
1840
|
+
var import_tracker = __toESM(require_tracker(), 1);
|
|
1841
|
+
var import_state = __toESM(require_state(), 1);
|
|
1842
|
+
var import_fiber = __toESM(require_fiber(), 1);
|
|
1843
|
+
var import_overlay = __toESM(require_overlay(), 1);
|
|
1844
|
+
var import_version = __toESM(require_version(), 1);
|
|
1404
1845
|
var DEVTOOLS_MARKER = "__rerenderLens";
|
|
1405
1846
|
var PROTOCOL_VERSION = 2;
|
|
1406
1847
|
var DEFAULT_CHANNEL = "rerender-lens";
|
|
1407
|
-
|
|
1848
|
+
var SERIALIZE_MAX_ENTRIES = 100;
|
|
1849
|
+
var SERIALIZE_MAX_NODES = 2e4;
|
|
1850
|
+
function serialize(value, maxDepth = 4, seen = /* @__PURE__ */ new WeakSet(), depth = 0, budget = { nodes: SERIALIZE_MAX_NODES }) {
|
|
1408
1851
|
if (value === null || value === void 0) return value;
|
|
1409
1852
|
const t = typeof value;
|
|
1410
1853
|
if (t === "string" || t === "boolean") return value;
|
|
@@ -1415,24 +1858,56 @@ ${formatFixes(reports)}`);
|
|
|
1415
1858
|
const obj = value;
|
|
1416
1859
|
if (seen.has(obj)) return "[Circular]";
|
|
1417
1860
|
if (depth >= maxDepth) return "[\u2026]";
|
|
1861
|
+
if (--budget.nodes < 0) return "[\u2026]";
|
|
1862
|
+
const next = (v) => serialize(v, maxDepth, seen, depth + 1, budget);
|
|
1418
1863
|
seen.add(obj);
|
|
1419
1864
|
try {
|
|
1420
|
-
if (isReactElement(obj)) {
|
|
1421
|
-
const out2 = { $type: "element", name: getDisplayName(obj.type) };
|
|
1865
|
+
if ((0, import_diff.isReactElement)(obj)) {
|
|
1866
|
+
const out2 = { $type: "element", name: (0, import_tracker.getDisplayName)(obj.type) };
|
|
1422
1867
|
if (obj.key !== null && obj.key !== void 0) out2.key = String(obj.key);
|
|
1423
|
-
out2.props =
|
|
1868
|
+
out2.props = next(obj.props);
|
|
1424
1869
|
return out2;
|
|
1425
1870
|
}
|
|
1426
1871
|
if (obj instanceof Date) return { $type: "Date", value: obj.toISOString() };
|
|
1427
1872
|
if (obj instanceof RegExp) return { $type: "RegExp", value: String(obj) };
|
|
1873
|
+
if (ArrayBuffer.isView(obj) || obj instanceof ArrayBuffer) {
|
|
1874
|
+
const bin = obj;
|
|
1875
|
+
return { $type: bin.constructor?.name || "ArrayBuffer", length: typeof bin.length === "number" ? bin.length : bin.byteLength };
|
|
1876
|
+
}
|
|
1877
|
+
if (obj instanceof Promise) return "[Promise]";
|
|
1878
|
+
if (typeof Node !== "undefined" && obj instanceof Node) return typeof Element !== "undefined" && obj instanceof Element ? `<${obj.tagName.toLowerCase()}>` : `[${obj.nodeName}]`;
|
|
1879
|
+
if (obj === globalThis) return "[Window]";
|
|
1428
1880
|
if (obj instanceof Map) {
|
|
1429
|
-
|
|
1881
|
+
const entries = [];
|
|
1882
|
+
for (const [k, v] of obj) {
|
|
1883
|
+
if (entries.length >= SERIALIZE_MAX_ENTRIES) {
|
|
1884
|
+
entries.push(["\u2026", `+${obj.size - SERIALIZE_MAX_ENTRIES} more`]);
|
|
1885
|
+
break;
|
|
1886
|
+
}
|
|
1887
|
+
entries.push([next(k), next(v)]);
|
|
1888
|
+
}
|
|
1889
|
+
return { $type: "Map", entries };
|
|
1890
|
+
}
|
|
1891
|
+
if (obj instanceof Set) {
|
|
1892
|
+
const values = [];
|
|
1893
|
+
for (const v of obj) {
|
|
1894
|
+
if (values.length >= SERIALIZE_MAX_ENTRIES) {
|
|
1895
|
+
values.push(`\u2026+${obj.size - SERIALIZE_MAX_ENTRIES} more`);
|
|
1896
|
+
break;
|
|
1897
|
+
}
|
|
1898
|
+
values.push(next(v));
|
|
1899
|
+
}
|
|
1900
|
+
return { $type: "Set", values };
|
|
1901
|
+
}
|
|
1902
|
+
if (Array.isArray(obj)) {
|
|
1903
|
+
const out2 = obj.slice(0, SERIALIZE_MAX_ENTRIES).map(next);
|
|
1904
|
+
if (obj.length > SERIALIZE_MAX_ENTRIES) out2.push(`\u2026+${obj.length - SERIALIZE_MAX_ENTRIES} more`);
|
|
1905
|
+
return out2;
|
|
1430
1906
|
}
|
|
1431
|
-
if (obj instanceof Set) return { $type: "Set", values: [...obj].map((v) => serialize(v, maxDepth, seen, depth + 1)) };
|
|
1432
|
-
if (Array.isArray(obj)) return obj.map((v) => serialize(v, maxDepth, seen, depth + 1));
|
|
1433
|
-
if (typeof Element !== "undefined" && obj instanceof Element) return `<${obj.tagName.toLowerCase()}>`;
|
|
1434
1907
|
const out = {};
|
|
1435
|
-
|
|
1908
|
+
const keys = Object.keys(obj);
|
|
1909
|
+
for (const k of keys.slice(0, SERIALIZE_MAX_ENTRIES)) out[k] = next(obj[k]);
|
|
1910
|
+
if (keys.length > SERIALIZE_MAX_ENTRIES) out["\u2026"] = `+${keys.length - SERIALIZE_MAX_ENTRIES} more`;
|
|
1436
1911
|
const proto = Object.getPrototypeOf(obj);
|
|
1437
1912
|
if (proto && proto !== Object.prototype && proto.constructor?.name) out.$type = proto.constructor.name;
|
|
1438
1913
|
return out;
|
|
@@ -1472,33 +1947,42 @@ ${formatFixes(reports)}`);
|
|
|
1472
1947
|
}
|
|
1473
1948
|
function createDevtoolsNotifier(options = {}) {
|
|
1474
1949
|
const bufferSize = options.bufferSize ?? 300;
|
|
1475
|
-
const maxDepth = options.maxDepth ??
|
|
1950
|
+
const maxDepth = options.maxDepth ?? 4;
|
|
1476
1951
|
const target = options.target ?? (typeof window !== "undefined" ? window : void 0);
|
|
1477
1952
|
const buffer = [];
|
|
1478
1953
|
let seq = 0;
|
|
1479
1954
|
let flashOn = options.flashAvoidable ?? false;
|
|
1955
|
+
let live = !target || typeof target.addEventListener !== "function";
|
|
1956
|
+
if (!live) {
|
|
1957
|
+
target.addEventListener("message", (event) => {
|
|
1958
|
+
const data = event.data;
|
|
1959
|
+
if ((event.source === target || !event.source) && data && data.__rerenderLensReady === true) live = true;
|
|
1960
|
+
});
|
|
1961
|
+
}
|
|
1480
1962
|
const post = (type, payload) => {
|
|
1481
|
-
if (!target) return;
|
|
1963
|
+
if (!target || type === "report" && !live) return;
|
|
1482
1964
|
const msg = { [DEVTOOLS_MARKER]: true, version: PROTOCOL_VERSION, type, payload };
|
|
1483
1965
|
target.postMessage(msg, "*");
|
|
1484
1966
|
};
|
|
1485
1967
|
const source = options.source ?? "page";
|
|
1486
1968
|
const info = () => ({
|
|
1487
1969
|
count: buffer.length,
|
|
1488
|
-
library: VERSION,
|
|
1970
|
+
library: import_version.VERSION,
|
|
1489
1971
|
protocol: PROTOCOL_VERSION,
|
|
1490
|
-
react: getRenderers(),
|
|
1491
|
-
production: isProductionReact(),
|
|
1492
|
-
enabled: isEnabled(),
|
|
1493
|
-
options: serializeOptions(getState().options),
|
|
1972
|
+
react: (0, import_fiber.getRenderers)(),
|
|
1973
|
+
production: (0, import_fiber.isProductionReact)(),
|
|
1974
|
+
enabled: (0, import_tracker.isEnabled)(),
|
|
1975
|
+
options: serializeOptions((0, import_state.getState)().options),
|
|
1494
1976
|
source,
|
|
1495
1977
|
injected: typeof window !== "undefined" && typeof window.__RERENDER_LENS_INJECTED__ === "string",
|
|
1496
|
-
scheduled: getState().scheduled,
|
|
1497
|
-
commits: getState().commits,
|
|
1498
|
-
overhead: { totalMs: getState().overheadMs, maxCommitMs: getState().maxCommitMs }
|
|
1978
|
+
scheduled: (0, import_state.getState)().scheduled,
|
|
1979
|
+
commits: (0, import_state.getState)().commits,
|
|
1980
|
+
overhead: { totalMs: (0, import_state.getState)().overheadMs, maxCommitMs: (0, import_state.getState)().maxCommitMs },
|
|
1981
|
+
truncated: (0, import_state.getState)().truncated
|
|
1499
1982
|
});
|
|
1500
1983
|
const bridge = {
|
|
1501
1984
|
replay: () => {
|
|
1985
|
+
live = true;
|
|
1502
1986
|
post("hello", info());
|
|
1503
1987
|
for (const e of buffer) post("report", e.payload);
|
|
1504
1988
|
},
|
|
@@ -1510,7 +1994,7 @@ ${formatFixes(reports)}`);
|
|
|
1510
1994
|
return buffer.length;
|
|
1511
1995
|
},
|
|
1512
1996
|
version: PROTOCOL_VERSION,
|
|
1513
|
-
library: VERSION,
|
|
1997
|
+
library: import_version.VERSION,
|
|
1514
1998
|
info,
|
|
1515
1999
|
pull: (since = 0) => {
|
|
1516
2000
|
const first = buffer[0];
|
|
@@ -1519,41 +2003,41 @@ ${formatFixes(reports)}`);
|
|
|
1519
2003
|
return { seq, reports, dropped };
|
|
1520
2004
|
},
|
|
1521
2005
|
configure: (next) => {
|
|
1522
|
-
configure(deserializeOptions(next ?? {}));
|
|
1523
|
-
return serializeOptions(getState().options);
|
|
2006
|
+
(0, import_tracker.configure)(deserializeOptions(next ?? {}));
|
|
2007
|
+
return serializeOptions((0, import_state.getState)().options);
|
|
1524
2008
|
},
|
|
1525
|
-
getOptions: () => serializeOptions(getState().options),
|
|
2009
|
+
getOptions: () => serializeOptions((0, import_state.getState)().options),
|
|
1526
2010
|
highlight: (id) => {
|
|
1527
2011
|
if (id === null || id === void 0) {
|
|
1528
|
-
clearHighlight();
|
|
2012
|
+
(0, import_overlay.clearHighlight)();
|
|
1529
2013
|
return true;
|
|
1530
2014
|
}
|
|
1531
|
-
const fiber = fiberById(id);
|
|
2015
|
+
const fiber = (0, import_fiber.fiberById)(id);
|
|
1532
2016
|
if (!fiber) {
|
|
1533
|
-
clearHighlight();
|
|
2017
|
+
(0, import_overlay.clearHighlight)();
|
|
1534
2018
|
return false;
|
|
1535
2019
|
}
|
|
1536
|
-
const nodes = hostNodesOf(fiber);
|
|
1537
|
-
highlight({ nodes, label: fiberName(fiber) });
|
|
2020
|
+
const nodes = (0, import_fiber.hostNodesOf)(fiber);
|
|
2021
|
+
(0, import_overlay.highlight)({ nodes, label: (0, import_fiber.fiberName)(fiber) });
|
|
1538
2022
|
return nodes.length > 0;
|
|
1539
2023
|
},
|
|
1540
2024
|
flashAvoidable: (on) => {
|
|
1541
2025
|
flashOn = !!on;
|
|
1542
2026
|
},
|
|
1543
2027
|
inspect: (node) => {
|
|
1544
|
-
const comp = nearestComponent(fiberForNode(node));
|
|
2028
|
+
const comp = (0, import_fiber.nearestComponent)((0, import_fiber.fiberForNode)(node));
|
|
1545
2029
|
if (!comp) return null;
|
|
1546
|
-
const id = instanceIdOf(comp) ?? null;
|
|
2030
|
+
const id = (0, import_fiber.instanceIdOf)(comp) ?? null;
|
|
1547
2031
|
const path = [];
|
|
1548
2032
|
let f = comp.return;
|
|
1549
2033
|
while (f) {
|
|
1550
|
-
if (f.tag === 0 || f.tag === 1 || f.tag === 11 || f.tag === 14 || f.tag === 15) path.unshift(fiberName(f));
|
|
2034
|
+
if (f.tag === 0 || f.tag === 1 || f.tag === 11 || f.tag === 14 || f.tag === 15) path.unshift((0, import_fiber.fiberName)(f));
|
|
1551
2035
|
f = f.return;
|
|
1552
2036
|
}
|
|
1553
2037
|
return {
|
|
1554
|
-
component: fiberName(comp),
|
|
2038
|
+
component: (0, import_fiber.fiberName)(comp),
|
|
1555
2039
|
instanceId: id,
|
|
1556
|
-
tracked: shouldTrack(fiberType(comp), getState().options),
|
|
2040
|
+
tracked: (0, import_tracker.shouldTrack)((0, import_fiber.fiberType)(comp), (0, import_state.getState)().options),
|
|
1557
2041
|
path,
|
|
1558
2042
|
reports: id === null ? [] : buffer.filter((e) => e.instanceId === id).slice(-20).map((e) => e.payload)
|
|
1559
2043
|
};
|
|
@@ -1681,37 +2165,14 @@ ${formatFixes(reports)}`);
|
|
|
1681
2165
|
if (buffer.length > bufferSize) buffer.splice(0, buffer.length - bufferSize);
|
|
1682
2166
|
postAll("report", payload);
|
|
1683
2167
|
if (flashOn && report.avoidable && report.instanceId) {
|
|
1684
|
-
const fiber = fiberById(report.instanceId);
|
|
1685
|
-
if (fiber) flash({ nodes: hostNodesOf(fiber), label: report.component });
|
|
2168
|
+
const fiber = (0, import_fiber.fiberById)(report.instanceId);
|
|
2169
|
+
if (fiber) (0, import_overlay.flash)({ nodes: (0, import_fiber.hostNodesOf)(fiber), label: report.component });
|
|
1686
2170
|
}
|
|
1687
2171
|
};
|
|
1688
2172
|
}
|
|
1689
2173
|
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
exports.classify = classify;
|
|
1696
|
-
exports.combineNotifiers = combineNotifiers;
|
|
1697
|
-
exports.configure = configure;
|
|
1698
|
-
exports.createCollector = createCollector;
|
|
1699
|
-
exports.createDevtoolsNotifier = createDevtoolsNotifier;
|
|
1700
|
-
exports.deepEqual = deepEqual;
|
|
1701
|
-
exports.diffRecords = diffRecords;
|
|
1702
|
-
exports.disable = disable;
|
|
1703
|
-
exports.ensureDevtoolsHook = ensureDevtoolsHook;
|
|
1704
|
-
exports.getDisplayName = getDisplayName;
|
|
1705
|
-
exports.getRenderers = getRenderers;
|
|
1706
|
-
exports.init = init;
|
|
1707
|
-
exports.isEnabled = isEnabled;
|
|
1708
|
-
exports.isProductionReact = isProductionReact;
|
|
1709
|
-
exports.printReport = printReport;
|
|
1710
|
-
exports.serialize = serialize;
|
|
1711
|
-
exports.shouldTrack = shouldTrack;
|
|
1712
|
-
exports.summarize = summarize;
|
|
1713
|
-
exports.track = track;
|
|
1714
|
-
|
|
1715
|
-
return exports;
|
|
1716
|
-
|
|
1717
|
-
})({});
|
|
2174
|
+
// src/inject.ts
|
|
2175
|
+
var import_version2 = __toESM(require_version(), 1);
|
|
2176
|
+
return __toCommonJS(inject_exports);
|
|
2177
|
+
})();
|
|
2178
|
+
globalThis.RerenderLens = RerenderLens;
|