react-native-ai-debugger 1.4.39 → 1.4.41
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/build/__tests__/unit/executor.test.js +63 -1
- package/build/__tests__/unit/executor.test.js.map +1 -1
- package/build/core/appDetection.d.ts +5 -0
- package/build/core/appDetection.d.ts.map +1 -1
- package/build/core/appDetection.js +33 -2
- package/build/core/appDetection.js.map +1 -1
- package/build/core/executor.d.ts +6 -0
- package/build/core/executor.d.ts.map +1 -1
- package/build/core/executor.js +111 -18
- package/build/core/executor.js.map +1 -1
- package/build/core/index.d.ts +1 -1
- package/build/core/index.d.ts.map +1 -1
- package/build/core/index.js +1 -1
- package/build/core/index.js.map +1 -1
- package/build/core/ios.d.ts.map +1 -1
- package/build/core/ios.js +2 -1
- package/build/core/ios.js.map +1 -1
- package/build/core/types.d.ts +1 -0
- package/build/core/types.d.ts.map +1 -1
- package/build/index.js +13 -8
- package/build/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect } from "@jest/globals";
|
|
2
|
-
import { containsProblematicUnicode, stripLeadingComments, validateAndPreprocessExpression, } from "../../core/executor.js";
|
|
2
|
+
import { containsProblematicUnicode, stripLeadingComments, validateAndPreprocessExpression, formatScreenLayoutTree, } from "../../core/executor.js";
|
|
3
3
|
describe("containsProblematicUnicode", () => {
|
|
4
4
|
it("returns false for ASCII text", () => {
|
|
5
5
|
expect(containsProblematicUnicode("hello world")).toBe(false);
|
|
@@ -76,4 +76,66 @@ describe("validateAndPreprocessExpression", () => {
|
|
|
76
76
|
expect(result.valid).toBe(true);
|
|
77
77
|
});
|
|
78
78
|
});
|
|
79
|
+
describe("formatScreenLayoutTree off-screen summary", () => {
|
|
80
|
+
const stubElement = {
|
|
81
|
+
component: "App",
|
|
82
|
+
path: "App",
|
|
83
|
+
frame: { x: 0, y: 0, width: 100, height: 100 },
|
|
84
|
+
originalIndex: 0,
|
|
85
|
+
parentIndex: -1,
|
|
86
|
+
depth: 0,
|
|
87
|
+
};
|
|
88
|
+
it("omits the summary lines when both arrays are empty", () => {
|
|
89
|
+
const out = formatScreenLayoutTree([stubElement], false, {
|
|
90
|
+
offScreenBelow: [],
|
|
91
|
+
offScreenAbove: [],
|
|
92
|
+
});
|
|
93
|
+
expect(out).not.toContain("below fold");
|
|
94
|
+
expect(out).not.toContain("above fold");
|
|
95
|
+
});
|
|
96
|
+
it("omits the summary when `offScreen` is undefined", () => {
|
|
97
|
+
const out = formatScreenLayoutTree([stubElement]);
|
|
98
|
+
expect(out).not.toContain("below fold");
|
|
99
|
+
expect(out).not.toContain("above fold");
|
|
100
|
+
});
|
|
101
|
+
it("emits a single-name line for one below-fold component", () => {
|
|
102
|
+
const out = formatScreenLayoutTree([stubElement], false, {
|
|
103
|
+
offScreenBelow: ["DayComponent"],
|
|
104
|
+
});
|
|
105
|
+
expect(out).toContain("[... 1 component below fold: DayComponent]");
|
|
106
|
+
});
|
|
107
|
+
it("emits a multi-name line without truncation for <= 10 components", () => {
|
|
108
|
+
const names = ["A", "B", "C", "D", "E"];
|
|
109
|
+
const out = formatScreenLayoutTree([stubElement], false, {
|
|
110
|
+
offScreenBelow: names,
|
|
111
|
+
});
|
|
112
|
+
expect(out).toContain("[... 5 components below fold: A, B, C, D, E]");
|
|
113
|
+
});
|
|
114
|
+
it("truncates at 10 names with a +N-more tail", () => {
|
|
115
|
+
const names = Array.from({ length: 14 }, (_, i) => `C${i + 1}`);
|
|
116
|
+
const out = formatScreenLayoutTree([stubElement], false, {
|
|
117
|
+
offScreenBelow: names,
|
|
118
|
+
});
|
|
119
|
+
expect(out).toContain("[... 14 components below fold: C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, ... +4 more]");
|
|
120
|
+
});
|
|
121
|
+
it("emits above and below lines in that order when both are present", () => {
|
|
122
|
+
const out = formatScreenLayoutTree([stubElement], false, {
|
|
123
|
+
offScreenAbove: ["TopHeader"],
|
|
124
|
+
offScreenBelow: ["FooterBanner"],
|
|
125
|
+
});
|
|
126
|
+
const aboveIdx = out.indexOf("above fold");
|
|
127
|
+
const belowIdx = out.indexOf("below fold");
|
|
128
|
+
expect(aboveIdx).toBeGreaterThan(-1);
|
|
129
|
+
expect(belowIdx).toBeGreaterThan(aboveIdx);
|
|
130
|
+
});
|
|
131
|
+
it("separates the tree from the summary with a blank line", () => {
|
|
132
|
+
const out = formatScreenLayoutTree([stubElement], false, {
|
|
133
|
+
offScreenBelow: ["X"],
|
|
134
|
+
});
|
|
135
|
+
expect(out.split("\n").length).toBeGreaterThanOrEqual(3);
|
|
136
|
+
const lines = out.split("\n");
|
|
137
|
+
const summaryLineIdx = lines.findIndex((l) => l.includes("below fold"));
|
|
138
|
+
expect(lines[summaryLineIdx - 1]).toBe("");
|
|
139
|
+
});
|
|
140
|
+
});
|
|
79
141
|
//# sourceMappingURL=executor.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/executor.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EACH,0BAA0B,EAC1B,oBAAoB,EACpB,+BAA+B,
|
|
1
|
+
{"version":3,"file":"executor.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/executor.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,11 @@ import type { ConnectedApp } from "./types.js";
|
|
|
3
3
|
* Detect app characteristics via Runtime.evaluate CDP command.
|
|
4
4
|
* Fire-and-forget — does not block connection flow.
|
|
5
5
|
* Stores result on the ConnectedApp object.
|
|
6
|
+
*
|
|
7
|
+
* Emits a presumptive `app_detected` event immediately from DeviceInfo so the
|
|
8
|
+
* RN signal is recorded even when the Runtime.evaluate probe later times out
|
|
9
|
+
* or returns a partial result. The probe still runs and upgrades the stored
|
|
10
|
+
* result when it succeeds.
|
|
6
11
|
*/
|
|
7
12
|
export declare function scheduleAppDetection(app: ConnectedApp): void;
|
|
8
13
|
//# sourceMappingURL=appDetection.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appDetection.d.ts","sourceRoot":"","sources":["../../src/core/appDetection.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAsB,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"appDetection.d.ts","sourceRoot":"","sources":["../../src/core/appDetection.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAsB,YAAY,EAAE,MAAM,YAAY,CAAC;AA2EnE;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAgC5D"}
|
|
@@ -42,21 +42,52 @@ function parseDetectionResult(raw, platform) {
|
|
|
42
42
|
...(raw.expoSdk ? { expoSdkVersion: raw.expoSdk } : {}),
|
|
43
43
|
};
|
|
44
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* Presumptive detection from Metro /json DeviceInfo — no JS eval required.
|
|
47
|
+
* Metro's inspector endpoint only lists RN JS runtimes, so the very fact that
|
|
48
|
+
* a device appears there is proof of an RN app. Description/title strings
|
|
49
|
+
* reliably identify Bridgeless (new arch) and Hermes setups.
|
|
50
|
+
*/
|
|
51
|
+
function inferPresumptiveDetection(app) {
|
|
52
|
+
const desc = app.deviceInfo.description || "";
|
|
53
|
+
const title = app.deviceInfo.title || "";
|
|
54
|
+
return {
|
|
55
|
+
reactNativeVersion: "unknown",
|
|
56
|
+
architecture: desc.includes("Bridgeless") ? "new" : "old",
|
|
57
|
+
jsEngine: title.includes("Hermes") ? "hermes" : "jsc",
|
|
58
|
+
appPlatform: app.platform,
|
|
59
|
+
osVersion: "unknown",
|
|
60
|
+
detectionSource: "device-info",
|
|
61
|
+
};
|
|
62
|
+
}
|
|
45
63
|
/**
|
|
46
64
|
* Detect app characteristics via Runtime.evaluate CDP command.
|
|
47
65
|
* Fire-and-forget — does not block connection flow.
|
|
48
66
|
* Stores result on the ConnectedApp object.
|
|
67
|
+
*
|
|
68
|
+
* Emits a presumptive `app_detected` event immediately from DeviceInfo so the
|
|
69
|
+
* RN signal is recorded even when the Runtime.evaluate probe later times out
|
|
70
|
+
* or returns a partial result. The probe still runs and upgrades the stored
|
|
71
|
+
* result when it succeeds.
|
|
49
72
|
*/
|
|
50
73
|
export function scheduleAppDetection(app) {
|
|
51
|
-
//
|
|
52
|
-
if (app.appDetection)
|
|
74
|
+
// Probe already succeeded — nothing to do.
|
|
75
|
+
if (app.appDetection?.detectionSource === "probe")
|
|
53
76
|
return;
|
|
77
|
+
// Fire presumptive event once per ConnectedApp so the user is classified as
|
|
78
|
+
// RN at the moment of connect, independent of probe success.
|
|
79
|
+
if (!app.appDetection) {
|
|
80
|
+
const presumptive = inferPresumptiveDetection(app);
|
|
81
|
+
app.appDetection = presumptive;
|
|
82
|
+
trackAppDetection(presumptive);
|
|
83
|
+
}
|
|
54
84
|
setTimeout(async () => {
|
|
55
85
|
try {
|
|
56
86
|
const result = await detectApp(app.ws);
|
|
57
87
|
if (result) {
|
|
58
88
|
const parsed = parseDetectionResult(result, app.platform);
|
|
59
89
|
if (parsed) {
|
|
90
|
+
parsed.detectionSource = "probe";
|
|
60
91
|
app.appDetection = parsed;
|
|
61
92
|
trackAppDetection(parsed);
|
|
62
93
|
const versionStr = parsed.reactNativeVersion !== "unknown"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appDetection.js","sourceRoot":"","sources":["../../src/core/appDetection.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,IAAI,CAAC;AAC3B,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGnD,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAClC,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAE/B,iGAAiG;AACjG,8FAA8F;AAC9F,wCAAwC;AACxC,iEAAiE;AACjE,4DAA4D;AAC5D,sFAAsF;AACtF,6DAA6D;AAC7D,+DAA+D;AAC/D,MAAM,oBAAoB,GAAG;;;;;;;;;;;aAWhB,CAAC;AAEd,SAAS,aAAa,CAAC,CAAkD;IACrE,OAAO,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;AAC9C,CAAC;AAED,SAAS,oBAAoB,CACzB,GAOQ,EACR,QAA2B;IAE3B,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,uEAAuE;IACvE,8EAA8E;IAC9E,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,GAAG,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAEzF,OAAO;QACH,kBAAkB,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;QAC5E,YAAY,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK;QACzC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK;QACvC,WAAW,EAAE,QAAQ;QACrB,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,SAAS;QACrC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1D,CAAC;AACN,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"appDetection.js","sourceRoot":"","sources":["../../src/core/appDetection.ts"],"names":[],"mappings":"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"}
|
package/build/core/executor.d.ts
CHANGED
|
@@ -39,6 +39,10 @@ interface ScreenElement {
|
|
|
39
39
|
parentIndex?: number;
|
|
40
40
|
originalIndex?: number;
|
|
41
41
|
}
|
|
42
|
+
export declare function formatScreenLayoutTree(elements: ScreenElement[], extended?: boolean, offScreen?: {
|
|
43
|
+
offScreenBelow?: string[];
|
|
44
|
+
offScreenAbove?: string[];
|
|
45
|
+
}): string;
|
|
42
46
|
/**
|
|
43
47
|
* Get the React component tree from the running app.
|
|
44
48
|
* This traverses the fiber tree to extract component hierarchy with names.
|
|
@@ -73,6 +77,8 @@ export declare function getScreenLayout(options?: {
|
|
|
73
77
|
width: number;
|
|
74
78
|
height: number;
|
|
75
79
|
};
|
|
80
|
+
offScreenBelow?: string[];
|
|
81
|
+
offScreenAbove?: string[];
|
|
76
82
|
}>;
|
|
77
83
|
interface PressableElement {
|
|
78
84
|
component: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/core/executor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAc7D,MAAM,WAAW,oBAAoB;IACjC,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAK/D;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CA2B/D;AAED;;;GAGG;AACH,wBAAgB,+BAA+B,CAAC,UAAU,EAAE,MAAM,GAAG,oBAAoB,CAsDxF;AAsOD,wBAAsB,YAAY,CAC9B,UAAU,EAAE,MAAM,EAClB,YAAY,GAAE,OAAc,EAC5B,OAAO,GAAE,cAAmB,EAC5B,MAAM,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,eAAe,CAAC,CA2G1B;AAGD,wBAAsB,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAkBhF;AAGD,wBAAsB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAsBjG;AAMD,wBAAsB,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAqJzE;AA8DD,UAAU,aAAa;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B;
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/core/executor.ts"],"names":[],"mappings":"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"}
|
package/build/core/executor.js
CHANGED
|
@@ -761,8 +761,8 @@ function formatLayoutTree(elements, renderLine) {
|
|
|
761
761
|
}
|
|
762
762
|
return lines.join("\n");
|
|
763
763
|
}
|
|
764
|
-
function formatScreenLayoutTree(elements, extended = false) {
|
|
765
|
-
|
|
764
|
+
export function formatScreenLayoutTree(elements, extended = false, offScreen) {
|
|
765
|
+
const tree = formatLayoutTree(elements, (el, indent, isLeaf) => {
|
|
766
766
|
const prefix = " ".repeat(indent);
|
|
767
767
|
const frame = el.frame
|
|
768
768
|
? ` (${Math.round(el.frame.x)},${Math.round(el.frame.y)} ${Math.round(el.frame.width)}x${Math.round(el.frame.height)})`
|
|
@@ -775,6 +775,23 @@ function formatScreenLayoutTree(elements, extended = false) {
|
|
|
775
775
|
: "";
|
|
776
776
|
return `${prefix}${el.component}${frame}${idStr}${textStr}${layoutStr}`;
|
|
777
777
|
});
|
|
778
|
+
const suffix = [];
|
|
779
|
+
if (offScreen?.offScreenAbove?.length) {
|
|
780
|
+
suffix.push(formatOffScreenLine(offScreen.offScreenAbove, "above fold"));
|
|
781
|
+
}
|
|
782
|
+
if (offScreen?.offScreenBelow?.length) {
|
|
783
|
+
suffix.push(formatOffScreenLine(offScreen.offScreenBelow, "below fold"));
|
|
784
|
+
}
|
|
785
|
+
return suffix.length > 0 ? `${tree}\n\n${suffix.join("\n")}` : tree;
|
|
786
|
+
}
|
|
787
|
+
function formatOffScreenLine(names, position) {
|
|
788
|
+
const total = names.length;
|
|
789
|
+
const CAP = 10;
|
|
790
|
+
if (total <= CAP) {
|
|
791
|
+
return `[... ${total} component${total === 1 ? "" : "s"} ${position}: ${names.join(", ")}]`;
|
|
792
|
+
}
|
|
793
|
+
const shown = names.slice(0, CAP).join(", ");
|
|
794
|
+
return `[... ${total} components ${position}: ${shown}, ... +${total - CAP} more]`;
|
|
778
795
|
}
|
|
779
796
|
function formatFoundComponentsToTonl(components) {
|
|
780
797
|
const lines = ["#found{component,path,depth,key,layout}"];
|
|
@@ -1086,7 +1103,7 @@ export async function getScreenLayout(options = {}) {
|
|
|
1086
1103
|
// RN internals and primitives — skip these when looking for meaningful component names
|
|
1087
1104
|
// Only filter internal components that can't be written as JSX.
|
|
1088
1105
|
// Keep all user-facing components (View, Text, ScrollView, Modal, etc.)
|
|
1089
|
-
var RN_PRIMITIVES = /^(Animated\\(.*|withAnimated.*|AnimatedComponent.*|ForwardRef.*|memo\\(.*|Context\\.Consumer|Context\\.Provider|RCT.*|RNS.*|RNC.*|ViewManagerAdapter_.*|VirtualizedList.*|CellRenderer.*|FrameSizeProvider.*|MaybeScreenContainer|MaybeScreen|Navigation.*|Screen$|ScreenStack|ScreenContainer|ScreenContentWrapper|SceneView|DelayedFreeze|Freeze|Suspender|DebugContainer|StaticContainer|SafeAreaProvider.*|SafeAreaFrameContext|SafeAreaInsetsContext|ExpoRoot|ExpoRootComponent|GestureHandler.*|NativeViewGestureHandler|GestureDetector|PanGestureHandler|Reanimated.*|BottomTabNavigator|TabLayout|RouteNode|Route$|KeyboardProvider|PortalProviderComponent|BottomSheetModalProviderWrapper|ThemeContext|ThemeProvider|TextAncestorContext|PressabilityDebugView|TouchableHighlightImpl|StatusBarOverlay|BottomSheetHostingContainerComponent|BottomSheetGestureHandlersProvider|BottomSheetBackdropContainerComponent|BottomSheetContainerComponent|BottomSheetDraggableViewComponent|BottomSheetHandleContainerComponent|BottomSheetBackgroundContainerComponent|DebuggingOverlay|InspectorDeferred|Inspector|InspectorOverlay|InspectorPanel|StyleInspector|BoxInspector|BoxContainer|ElementBox|BorderBox|InspectorPanelButton)$/;
|
|
1106
|
+
var RN_PRIMITIVES = /^(Animated\\(.*|withAnimated.*|AnimatedComponent.*|ForwardRef.*|memo\\(.*|Context\\.Consumer|Context\\.Provider|ScrollViewContext(Base)?|VirtualizedListContext(Resetter)?|TextInputContext|KeyboardAvoidingViewContext|RCT.*|RNS.*|RNC.*|ViewManagerAdapter_.*|VirtualizedList.*|CellRenderer.*|FrameSizeProvider.*|MaybeScreenContainer|MaybeScreen|Navigation.*|Screen$|ScreenStack|ScreenContainer|ScreenContentWrapper|SceneView|DelayedFreeze|Freeze|Suspender|DebugContainer|StaticContainer|SafeAreaProvider.*|SafeAreaFrameContext|SafeAreaInsetsContext|ExpoRoot|ExpoRootComponent|GestureHandler.*|NativeViewGestureHandler|GestureDetector|PanGestureHandler|Reanimated.*|BottomTabNavigator|TabLayout|RouteNode|Route$|KeyboardProvider|PortalProviderComponent|BottomSheetModalProviderWrapper|ThemeContext|ThemeProvider|TextAncestorContext|PressabilityDebugView|TouchableHighlightImpl|StatusBarOverlay|BottomSheetHostingContainerComponent|BottomSheetGestureHandlersProvider|BottomSheetBackdropContainerComponent|BottomSheetContainerComponent|BottomSheetDraggableViewComponent|BottomSheetHandleContainerComponent|BottomSheetBackgroundContainerComponent|DebuggingOverlay|InspectorDeferred|Inspector|InspectorOverlay|InspectorPanel|StyleInspector|BoxInspector|BoxContainer|ElementBox|BorderBox|InspectorPanelButton)$/;
|
|
1090
1107
|
|
|
1091
1108
|
function getComponentName(fiber) {
|
|
1092
1109
|
if (!fiber || !fiber.type) return null;
|
|
@@ -1141,7 +1158,7 @@ export async function getScreenLayout(options = {}) {
|
|
|
1141
1158
|
if (componentsOnlyMode) {
|
|
1142
1159
|
// componentsOnly: walk tree looking for meaningful custom components,
|
|
1143
1160
|
// measure their first host child, track parent for tree output
|
|
1144
|
-
function walkComponents(fiber, depth, path, parentIdx) {
|
|
1161
|
+
function walkComponents(fiber, depth, path, parentIdx, ancestors) {
|
|
1145
1162
|
if (!fiber || depth > ${maxDepth}) return;
|
|
1146
1163
|
var name = getComponentName(fiber);
|
|
1147
1164
|
var isHost = typeof fiber.type === 'string';
|
|
@@ -1156,6 +1173,7 @@ export async function getScreenLayout(options = {}) {
|
|
|
1156
1173
|
var isMeaningful = name && !isHost && !RN_PRIMITIVES.test(name);
|
|
1157
1174
|
|
|
1158
1175
|
var myIdx = parentIdx;
|
|
1176
|
+
var nextAncestors = ancestors;
|
|
1159
1177
|
if (isMeaningful) {
|
|
1160
1178
|
var host = findFirstHost(fiber, 0);
|
|
1161
1179
|
if (host) {
|
|
@@ -1169,19 +1187,24 @@ export async function getScreenLayout(options = {}) {
|
|
|
1169
1187
|
depth: depth,
|
|
1170
1188
|
path: path.concat([name]),
|
|
1171
1189
|
parentIndex: parentIdx,
|
|
1190
|
+
ancestorIndices: ancestors.slice(),
|
|
1172
1191
|
text: text ? text.slice(0, 80) : null
|
|
1173
1192
|
});
|
|
1193
|
+
// Build the ancestor chain for descendants: [myIdx, ...previous ancestors]
|
|
1194
|
+
nextAncestors = [myIdx].concat(ancestors);
|
|
1174
1195
|
}
|
|
1175
1196
|
}
|
|
1176
1197
|
|
|
1177
1198
|
var child = fiber.child;
|
|
1178
1199
|
while (child) {
|
|
1179
1200
|
var childName = getComponentName(child);
|
|
1180
|
-
walkComponents(child, depth + 1, childName ? path.concat([childName]) : path, myIdx);
|
|
1201
|
+
walkComponents(child, depth + 1, childName ? path.concat([childName]) : path, myIdx, nextAncestors);
|
|
1181
1202
|
child = child.sibling;
|
|
1182
1203
|
}
|
|
1183
1204
|
}
|
|
1184
|
-
|
|
1205
|
+
for (var ri = 0; ri < roots.length; ri++) {
|
|
1206
|
+
walkComponents(roots[ri].current, 0, [], -1, []);
|
|
1207
|
+
}
|
|
1185
1208
|
} else {
|
|
1186
1209
|
// Default mode: collect all host fibers with ancestor info
|
|
1187
1210
|
function walkFibers(fiber, depth, path) {
|
|
@@ -1231,7 +1254,9 @@ export async function getScreenLayout(options = {}) {
|
|
|
1231
1254
|
child = child.sibling;
|
|
1232
1255
|
}
|
|
1233
1256
|
}
|
|
1234
|
-
|
|
1257
|
+
for (var ri = 0; ri < roots.length; ri++) {
|
|
1258
|
+
walkFibers(roots[ri].current, 0, []);
|
|
1259
|
+
}
|
|
1235
1260
|
}
|
|
1236
1261
|
|
|
1237
1262
|
if (hostFibers.length === 0) return { error: 'No measurable host components found.' };
|
|
@@ -1343,15 +1368,29 @@ export async function getScreenLayout(options = {}) {
|
|
|
1343
1368
|
}
|
|
1344
1369
|
|
|
1345
1370
|
var elements = [];
|
|
1371
|
+
var offScreenBelow = [];
|
|
1372
|
+
var offScreenAbove = [];
|
|
1346
1373
|
|
|
1347
1374
|
for (var i = 0; i < measurements.length; i++) {
|
|
1348
1375
|
var m = measurements[i];
|
|
1349
1376
|
if (!m) continue;
|
|
1350
1377
|
|
|
1351
|
-
// Filter:
|
|
1378
|
+
// Filter: zero-size
|
|
1352
1379
|
if (m.width <= 0 || m.height <= 0) continue;
|
|
1353
|
-
|
|
1354
|
-
|
|
1380
|
+
|
|
1381
|
+
// Vertical: track off-screen above/below for the summary line
|
|
1382
|
+
if (m.y + m.height < 0) {
|
|
1383
|
+
if (meta[i] && meta[i].customName) offScreenAbove.push({ idx: i, y: m.y });
|
|
1384
|
+
continue;
|
|
1385
|
+
}
|
|
1386
|
+
if (m.y > viewportH) {
|
|
1387
|
+
if (meta[i] && meta[i].customName) offScreenBelow.push({ idx: i, y: m.y });
|
|
1388
|
+
continue;
|
|
1389
|
+
}
|
|
1390
|
+
|
|
1391
|
+
// Horizontal: center must be inside the viewport (drops phantom slides at x=-411 etc.)
|
|
1392
|
+
var centerX = m.x + m.width / 2;
|
|
1393
|
+
if (centerX < 0 || centerX > viewportW) continue;
|
|
1355
1394
|
|
|
1356
1395
|
var fiber = fibers[i];
|
|
1357
1396
|
var info = meta[i];
|
|
@@ -1427,6 +1466,26 @@ export async function getScreenLayout(options = {}) {
|
|
|
1427
1466
|
}
|
|
1428
1467
|
}
|
|
1429
1468
|
elements = filtered;
|
|
1469
|
+
|
|
1470
|
+
// Second pass: rewrite orphans whose parentIndex points at a non-surviving element.
|
|
1471
|
+
// This happens when an intermediate ancestor was dropped by the viewport filter
|
|
1472
|
+
// (not the full-screen wrapper path). Walk ancestorIndices to the nearest survivor.
|
|
1473
|
+
var surviving = {};
|
|
1474
|
+
for (var si = 0; si < elements.length; si++) {
|
|
1475
|
+
surviving[elements[si].originalIndex] = true;
|
|
1476
|
+
}
|
|
1477
|
+
for (var oi = 0; oi < elements.length; oi++) {
|
|
1478
|
+
var e2 = elements[oi];
|
|
1479
|
+
if (e2.parentIndex === -1 || e2.parentIndex === undefined) continue;
|
|
1480
|
+
if (surviving[e2.parentIndex]) continue;
|
|
1481
|
+
var anc = meta[e2.originalIndex] && meta[e2.originalIndex].ancestorIndices;
|
|
1482
|
+
if (!anc) { e2.parentIndex = -1; continue; }
|
|
1483
|
+
var found = -1;
|
|
1484
|
+
for (var ai = 0; ai < anc.length; ai++) {
|
|
1485
|
+
if (surviving[anc[ai]]) { found = anc[ai]; break; }
|
|
1486
|
+
}
|
|
1487
|
+
e2.parentIndex = found;
|
|
1488
|
+
}
|
|
1430
1489
|
}
|
|
1431
1490
|
|
|
1432
1491
|
if (summaryMode) {
|
|
@@ -1447,7 +1506,25 @@ export async function getScreenLayout(options = {}) {
|
|
|
1447
1506
|
return {
|
|
1448
1507
|
viewport: { width: viewportW, height: viewportH },
|
|
1449
1508
|
totalElements: elements.length,
|
|
1450
|
-
elements: elements
|
|
1509
|
+
elements: elements,
|
|
1510
|
+
offScreenBelow: (function() {
|
|
1511
|
+
var seen = {}, out = [];
|
|
1512
|
+
offScreenBelow.sort(function(a, b) { return a.y - b.y; });
|
|
1513
|
+
for (var k = 0; k < offScreenBelow.length; k++) {
|
|
1514
|
+
var n = meta[offScreenBelow[k].idx].customName;
|
|
1515
|
+
if (n && !seen[n]) { seen[n] = true; out.push(n); }
|
|
1516
|
+
}
|
|
1517
|
+
return out;
|
|
1518
|
+
})(),
|
|
1519
|
+
offScreenAbove: (function() {
|
|
1520
|
+
var seen = {}, out = [];
|
|
1521
|
+
offScreenAbove.sort(function(a, b) { return b.y - a.y; });
|
|
1522
|
+
for (var k = 0; k < offScreenAbove.length; k++) {
|
|
1523
|
+
var n = meta[offScreenAbove[k].idx].customName;
|
|
1524
|
+
if (n && !seen[n]) { seen[n] = true; out.push(n); }
|
|
1525
|
+
}
|
|
1526
|
+
return out;
|
|
1527
|
+
})()
|
|
1451
1528
|
};
|
|
1452
1529
|
})()
|
|
1453
1530
|
`;
|
|
@@ -1467,10 +1544,15 @@ export async function getScreenLayout(options = {}) {
|
|
|
1467
1544
|
success: true,
|
|
1468
1545
|
result: result.result,
|
|
1469
1546
|
parsedElements: parsed.elements,
|
|
1470
|
-
viewport: parsed.viewport
|
|
1547
|
+
viewport: parsed.viewport,
|
|
1548
|
+
offScreenBelow: Array.isArray(parsed.offScreenBelow) ? parsed.offScreenBelow : [],
|
|
1549
|
+
offScreenAbove: Array.isArray(parsed.offScreenAbove) ? parsed.offScreenAbove : []
|
|
1471
1550
|
};
|
|
1472
1551
|
}
|
|
1473
|
-
const tree = formatScreenLayoutTree(parsed.elements, extended
|
|
1552
|
+
const tree = formatScreenLayoutTree(parsed.elements, extended, {
|
|
1553
|
+
offScreenBelow: Array.isArray(parsed.offScreenBelow) ? parsed.offScreenBelow : [],
|
|
1554
|
+
offScreenAbove: Array.isArray(parsed.offScreenAbove) ? parsed.offScreenAbove : []
|
|
1555
|
+
});
|
|
1474
1556
|
return { success: true, result: tree };
|
|
1475
1557
|
}
|
|
1476
1558
|
}
|
|
@@ -1574,7 +1656,7 @@ export async function getPressableElements(options = {}) {
|
|
|
1574
1656
|
return fiber.type.displayName || fiber.type.name || null;
|
|
1575
1657
|
}
|
|
1576
1658
|
|
|
1577
|
-
var RN_PRIMITIVES = /^(Animated\\(.*|withAnimated.*|AnimatedComponent.*|ForwardRef.*|memo\\(.*|Context\\.Consumer|Context\\.Provider|RCT.*|RNS.*|RNC.*|ViewManagerAdapter_.*|VirtualizedList.*|CellRenderer.*|FrameSizeProvider.*|MaybeScreenContainer|MaybeScreen|Navigation.*|Screen$|ScreenStack|ScreenContainer|ScreenContentWrapper|SceneView|DelayedFreeze|Freeze|Suspender|DebugContainer|StaticContainer|SafeAreaProvider.*|SafeAreaFrameContext|SafeAreaInsetsContext|ExpoRoot|ExpoRootComponent|GestureHandler.*|NativeViewGestureHandler|GestureDetector|PanGestureHandler|Reanimated.*|BottomTabNavigator|TabLayout|RouteNode|Route$|KeyboardProvider|PortalProviderComponent|BottomSheetModalProviderWrapper|ThemeContext|ThemeProvider|TextAncestorContext|PressabilityDebugView|TouchableHighlightImpl|StatusBarOverlay|BottomSheetHostingContainerComponent|BottomSheetGestureHandlersProvider|BottomSheetBackdropContainerComponent|BottomSheetContainerComponent|BottomSheetDraggableViewComponent|BottomSheetHandleContainerComponent|BottomSheetBackgroundContainerComponent|DebuggingOverlay|InspectorDeferred|Inspector|InspectorOverlay|InspectorPanel|StyleInspector|BoxInspector|BoxContainer|ElementBox|BorderBox|InspectorPanelButton)$/;
|
|
1659
|
+
var RN_PRIMITIVES = /^(Animated\\(.*|withAnimated.*|AnimatedComponent.*|ForwardRef.*|memo\\(.*|Context\\.Consumer|Context\\.Provider|ScrollViewContext(Base)?|VirtualizedListContext(Resetter)?|TextInputContext|KeyboardAvoidingViewContext|RCT.*|RNS.*|RNC.*|ViewManagerAdapter_.*|VirtualizedList.*|CellRenderer.*|FrameSizeProvider.*|MaybeScreenContainer|MaybeScreen|Navigation.*|Screen$|ScreenStack|ScreenContainer|ScreenContentWrapper|SceneView|DelayedFreeze|Freeze|Suspender|DebugContainer|StaticContainer|SafeAreaProvider.*|SafeAreaFrameContext|SafeAreaInsetsContext|ExpoRoot|ExpoRootComponent|GestureHandler.*|NativeViewGestureHandler|GestureDetector|PanGestureHandler|Reanimated.*|BottomTabNavigator|TabLayout|RouteNode|Route$|KeyboardProvider|PortalProviderComponent|BottomSheetModalProviderWrapper|ThemeContext|ThemeProvider|TextAncestorContext|PressabilityDebugView|TouchableHighlightImpl|StatusBarOverlay|BottomSheetHostingContainerComponent|BottomSheetGestureHandlersProvider|BottomSheetBackdropContainerComponent|BottomSheetContainerComponent|BottomSheetDraggableViewComponent|BottomSheetHandleContainerComponent|BottomSheetBackgroundContainerComponent|DebuggingOverlay|InspectorDeferred|Inspector|InspectorOverlay|InspectorPanel|StyleInspector|BoxInspector|BoxContainer|ElementBox|BorderBox|InspectorPanelButton)$/;
|
|
1578
1660
|
|
|
1579
1661
|
var hostFibers = [];
|
|
1580
1662
|
var fiberMeta = [];
|
|
@@ -1914,8 +1996,8 @@ export async function getPressableElements(options = {}) {
|
|
|
1914
1996
|
* Format enriched elements as an indented tree with tap coordinates in pixels.
|
|
1915
1997
|
* Same tree structure as get_screen_layout but with tap:(x,y) per node.
|
|
1916
1998
|
*/
|
|
1917
|
-
function formatEnrichedLayoutTree(elements) {
|
|
1918
|
-
|
|
1999
|
+
function formatEnrichedLayoutTree(elements, offScreen) {
|
|
2000
|
+
const tree = formatLayoutTree(elements, (el, indent, isLeaf) => {
|
|
1919
2001
|
const prefix = " ".repeat(indent);
|
|
1920
2002
|
const frame = `(${Math.round(el.frame.x)},${Math.round(el.frame.y)} ${Math.round(el.frame.width)}x${Math.round(el.frame.height)})`;
|
|
1921
2003
|
const tap = ` tap:(${el.tapX},${el.tapY})`;
|
|
@@ -1924,6 +2006,14 @@ function formatEnrichedLayoutTree(elements) {
|
|
|
1924
2006
|
const textStr = el.text && isLeaf ? ` "${el.text}"` : "";
|
|
1925
2007
|
return `${prefix}${el.component} ${frame}${tap}${idStr}${textStr}`;
|
|
1926
2008
|
});
|
|
2009
|
+
const suffix = [];
|
|
2010
|
+
if (offScreen?.offScreenAbove?.length) {
|
|
2011
|
+
suffix.push(formatOffScreenLine(offScreen.offScreenAbove, "above fold"));
|
|
2012
|
+
}
|
|
2013
|
+
if (offScreen?.offScreenBelow?.length) {
|
|
2014
|
+
suffix.push(formatOffScreenLine(offScreen.offScreenBelow, "below fold"));
|
|
2015
|
+
}
|
|
2016
|
+
return suffix.length > 0 ? `${tree}\n\n${suffix.join("\n")}` : tree;
|
|
1927
2017
|
}
|
|
1928
2018
|
/**
|
|
1929
2019
|
* Enrich screen layout data with tap-ready pixel coordinates for bundling with screenshots.
|
|
@@ -1969,7 +2059,10 @@ export async function enrichScreenshotWithLayout(pixelRatio, screenshotScaleFact
|
|
|
1969
2059
|
path: el.path,
|
|
1970
2060
|
};
|
|
1971
2061
|
});
|
|
1972
|
-
return formatEnrichedLayoutTree(elements
|
|
2062
|
+
return formatEnrichedLayoutTree(elements, {
|
|
2063
|
+
offScreenBelow: result.offScreenBelow,
|
|
2064
|
+
offScreenAbove: result.offScreenAbove,
|
|
2065
|
+
});
|
|
1973
2066
|
}
|
|
1974
2067
|
catch {
|
|
1975
2068
|
return null; // Non-fatal: screenshot works without layout
|
|
@@ -2446,7 +2539,7 @@ export async function pressElement(options) {
|
|
|
2446
2539
|
return null;
|
|
2447
2540
|
}
|
|
2448
2541
|
|
|
2449
|
-
var RN_PRIMITIVES = /^(Animated\\(.*|withAnimated.*|AnimatedComponent.*|ForwardRef.*|memo\\(.*|Context\\.Consumer|Context\\.Provider|RCT.*|RNS.*|RNC.*|ViewManagerAdapter_.*|VirtualizedList.*|CellRenderer.*|FrameSizeProvider.*|MaybeScreenContainer|MaybeScreen|Navigation.*|Screen$|ScreenStack|ScreenContainer|ScreenContentWrapper|SceneView|DelayedFreeze|Freeze|Suspender|DebugContainer|StaticContainer|SafeAreaProvider.*|SafeAreaFrameContext|SafeAreaInsetsContext|ExpoRoot|ExpoRootComponent|GestureHandler.*|NativeViewGestureHandler|GestureDetector|PanGestureHandler|Reanimated.*|BottomTabNavigator|TabLayout|RouteNode|Route$|KeyboardProvider|PortalProviderComponent|BottomSheetModalProviderWrapper|ThemeContext|ThemeProvider|TextAncestorContext|PressabilityDebugView|TouchableHighlightImpl|StatusBarOverlay|BottomSheetHostingContainerComponent|BottomSheetGestureHandlersProvider|BottomSheetBackdropContainerComponent|BottomSheetContainerComponent|BottomSheetDraggableViewComponent|BottomSheetHandleContainerComponent|BottomSheetBackgroundContainerComponent|DebuggingOverlay|InspectorDeferred|Inspector|InspectorOverlay|InspectorPanel|StyleInspector|BoxInspector|BoxContainer|ElementBox|BorderBox|InspectorPanelButton)$/;
|
|
2542
|
+
var RN_PRIMITIVES = /^(Animated\\(.*|withAnimated.*|AnimatedComponent.*|ForwardRef.*|memo\\(.*|Context\\.Consumer|Context\\.Provider|ScrollViewContext(Base)?|VirtualizedListContext(Resetter)?|TextInputContext|KeyboardAvoidingViewContext|RCT.*|RNS.*|RNC.*|ViewManagerAdapter_.*|VirtualizedList.*|CellRenderer.*|FrameSizeProvider.*|MaybeScreenContainer|MaybeScreen|Navigation.*|Screen$|ScreenStack|ScreenContainer|ScreenContentWrapper|SceneView|DelayedFreeze|Freeze|Suspender|DebugContainer|StaticContainer|SafeAreaProvider.*|SafeAreaFrameContext|SafeAreaInsetsContext|ExpoRoot|ExpoRootComponent|GestureHandler.*|NativeViewGestureHandler|GestureDetector|PanGestureHandler|Reanimated.*|BottomTabNavigator|TabLayout|RouteNode|Route$|KeyboardProvider|PortalProviderComponent|BottomSheetModalProviderWrapper|ThemeContext|ThemeProvider|TextAncestorContext|PressabilityDebugView|TouchableHighlightImpl|StatusBarOverlay|BottomSheetHostingContainerComponent|BottomSheetGestureHandlersProvider|BottomSheetBackdropContainerComponent|BottomSheetContainerComponent|BottomSheetDraggableViewComponent|BottomSheetHandleContainerComponent|BottomSheetBackgroundContainerComponent|DebuggingOverlay|InspectorDeferred|Inspector|InspectorOverlay|InspectorPanel|StyleInspector|BoxInspector|BoxContainer|ElementBox|BorderBox|InspectorPanelButton)$/;
|
|
2450
2543
|
|
|
2451
2544
|
function isScreenHidden(name, props) {
|
|
2452
2545
|
if (!props) return false;
|