react-native-grab 0.0.0 → 0.0.2

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.
Files changed (74) hide show
  1. package/README.md +92 -0
  2. package/dist/cjs/metro/index.js +6 -0
  3. package/dist/cjs/metro/index.js.map +1 -0
  4. package/dist/cjs/metro/withReactNativeGrab.js +180 -0
  5. package/dist/cjs/metro/withReactNativeGrab.js.map +1 -0
  6. package/dist/cjs/react-native/copy-payload.js +340 -0
  7. package/dist/cjs/react-native/copy-payload.js.map +1 -0
  8. package/dist/cjs/react-native/dom-traversal.js +210 -0
  9. package/dist/cjs/react-native/dom-traversal.js.map +1 -0
  10. package/dist/cjs/react-native/fiber.js +142 -0
  11. package/dist/cjs/react-native/fiber.js.map +1 -0
  12. package/dist/cjs/react-native/index.js +452 -0
  13. package/dist/cjs/react-native/index.js.map +1 -0
  14. package/dist/cjs/react-native/pointer-events.js +117 -0
  15. package/dist/cjs/react-native/pointer-events.js.map +1 -0
  16. package/dist/cjs/react-native/selection-trigger.js +19 -0
  17. package/dist/cjs/react-native/selection-trigger.js.map +1 -0
  18. package/dist/cjs/react-native/settings.js +101 -0
  19. package/dist/cjs/react-native/settings.js.map +1 -0
  20. package/dist/cjs/react-native/symbolicate.js +15 -0
  21. package/dist/cjs/react-native/symbolicate.js.map +1 -0
  22. package/dist/cjs/react-native/types.js +7 -0
  23. package/dist/cjs/react-native/types.js.map +1 -0
  24. package/dist/cjs/react-native/z-index.js +47 -0
  25. package/dist/cjs/react-native/z-index.js.map +1 -0
  26. package/dist/esm/metro/index.js +2 -0
  27. package/dist/esm/metro/index.js.map +1 -0
  28. package/dist/esm/metro/withReactNativeGrab.js +177 -0
  29. package/dist/esm/metro/withReactNativeGrab.js.map +1 -0
  30. package/dist/esm/react-native/copy-payload.js +333 -0
  31. package/dist/esm/react-native/copy-payload.js.map +1 -0
  32. package/dist/esm/react-native/dom-traversal.js +201 -0
  33. package/dist/esm/react-native/dom-traversal.js.map +1 -0
  34. package/dist/esm/react-native/fiber.js +133 -0
  35. package/dist/esm/react-native/fiber.js.map +1 -0
  36. package/dist/esm/react-native/index.js +445 -0
  37. package/dist/esm/react-native/index.js.map +1 -0
  38. package/dist/esm/react-native/pointer-events.js +109 -0
  39. package/dist/esm/react-native/pointer-events.js.map +1 -0
  40. package/dist/esm/react-native/selection-trigger.js +14 -0
  41. package/dist/esm/react-native/selection-trigger.js.map +1 -0
  42. package/dist/esm/react-native/settings.js +91 -0
  43. package/dist/esm/react-native/settings.js.map +1 -0
  44. package/dist/esm/react-native/symbolicate.js +8 -0
  45. package/dist/esm/react-native/symbolicate.js.map +1 -0
  46. package/dist/esm/react-native/types.js +6 -0
  47. package/dist/esm/react-native/types.js.map +1 -0
  48. package/dist/esm/react-native/z-index.js +43 -0
  49. package/dist/esm/react-native/z-index.js.map +1 -0
  50. package/dist/types/metro/index.d.ts +2 -0
  51. package/dist/types/metro/index.d.ts.map +1 -0
  52. package/dist/types/metro/withReactNativeGrab.d.ts +2 -0
  53. package/dist/types/metro/withReactNativeGrab.d.ts.map +1 -0
  54. package/dist/types/react-native/copy-payload.d.ts +22 -0
  55. package/dist/types/react-native/copy-payload.d.ts.map +1 -0
  56. package/dist/types/react-native/dom-traversal.d.ts +8 -0
  57. package/dist/types/react-native/dom-traversal.d.ts.map +1 -0
  58. package/dist/types/react-native/fiber.d.ts +22 -0
  59. package/dist/types/react-native/fiber.d.ts.map +1 -0
  60. package/dist/types/react-native/index.d.ts +2 -0
  61. package/dist/types/react-native/index.d.ts.map +1 -0
  62. package/dist/types/react-native/pointer-events.d.ts +13 -0
  63. package/dist/types/react-native/pointer-events.d.ts.map +1 -0
  64. package/dist/types/react-native/selection-trigger.d.ts +3 -0
  65. package/dist/types/react-native/selection-trigger.d.ts.map +1 -0
  66. package/dist/types/react-native/settings.d.ts +8 -0
  67. package/dist/types/react-native/settings.d.ts.map +1 -0
  68. package/dist/types/react-native/symbolicate.d.ts +3 -0
  69. package/dist/types/react-native/symbolicate.d.ts.map +1 -0
  70. package/dist/types/react-native/types.d.ts +53 -0
  71. package/dist/types/react-native/types.d.ts.map +1 -0
  72. package/dist/types/react-native/z-index.d.ts +3 -0
  73. package/dist/types/react-native/z-index.d.ts.map +1 -0
  74. package/package.json +62 -8
package/README.md ADDED
@@ -0,0 +1,92 @@
1
+ # react-native-grab
2
+
3
+ React Grab equivalent for React Native.
4
+
5
+ `react-native-grab` brings the same core idea to mobile dev workflows: point at the exact UI element you want to change, copy precise context, and hand it to your coding agent.
6
+
7
+ ## Why this is useful
8
+
9
+ React Grab’s main value on web is removing the "search phase" for AI edits.
10
+ This package applies the same workflow in React Native:
11
+
12
+ - Point, don’t describe: select the exact element on screen.
13
+ - Faster UI iteration: less back-and-forth explaining which component to edit.
14
+ - Better AI prompts: copied context includes component/source signal, not vague screenshots.
15
+ - Dev-only integration: middleware + inspector are intended for local development.
16
+
17
+ If you make frequent low-entropy UI changes (spacing, alignment, copy, visual polish), this tends to save the most time.
18
+
19
+ ## Installation
20
+
21
+ ```bash
22
+ npm install react-native-grab
23
+ ```
24
+
25
+ Peer dependencies:
26
+
27
+ - `react`
28
+ - `react-native`
29
+
30
+ ## Quick start
31
+
32
+ ### 1. Wire Metro middleware
33
+
34
+ Create/update `metro.config.js`:
35
+
36
+ ```js
37
+ const { getDefaultConfig } = require('@react-native/metro-config');
38
+ const { withReactNativeGrab } = require('react-native-grab/metro');
39
+
40
+ const config = getDefaultConfig(__dirname);
41
+
42
+ module.exports = withReactNativeGrab(config);
43
+ ```
44
+
45
+ ### 2. Mount the inspector in your app
46
+
47
+ ```tsx
48
+ import React from 'react';
49
+ import { View } from 'react-native';
50
+ import { ElementInspector } from 'react-native-grab';
51
+
52
+ export function App() {
53
+ return (
54
+ <View style={{ flex: 1 }}>
55
+ {/* your app content */}
56
+ <ElementInspector />
57
+ </View>
58
+ );
59
+ }
60
+ ```
61
+
62
+ ## Workflow
63
+
64
+ 1. Start your app in development.
65
+ 2. Open the React Native Dev Menu and enable `React Native Grab`.
66
+ 3. Tap the floating inspector button that appears.
67
+ 4. Drag over the UI until the target element is highlighted.
68
+ 5. Release to capture context.
69
+ 6. Context is sent to Metro and copied to your host clipboard.
70
+ 7. Paste into Codex/Cursor/Claude Code/Copilot with your requested change.
71
+
72
+ ## Development (this repo)
73
+
74
+ ```bash
75
+ npm install
76
+ npm run build
77
+ npm run format
78
+ ```
79
+
80
+ Available scripts:
81
+
82
+ - `npm run build` builds ESM and CJS outputs to `dist/`
83
+ - `npm run format` formats with `oxfmt`
84
+ - `npm run format:check` validates formatting
85
+
86
+ ## Repository
87
+
88
+ - GitHub: [callstackincubator/react-native-grab](https://github.com/callstackincubator/react-native-grab)
89
+
90
+ ## License
91
+
92
+ MIT
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.withReactNativeGrab = void 0;
4
+ var withReactNativeGrab_1 = require("./withReactNativeGrab");
5
+ Object.defineProperty(exports, "withReactNativeGrab", { enumerable: true, get: function () { return withReactNativeGrab_1.withReactNativeGrab; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/metro/index.ts"],"names":[],"mappings":";;;AAAA,6DAA4D;AAAnD,0HAAA,mBAAmB,OAAA"}
@@ -0,0 +1,180 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.withReactNativeGrab = void 0;
4
+ const node_child_process_1 = require("node:child_process");
5
+ const metro_config_transformers_1 = require("metro-config-transformers");
6
+ const MAX_BODY_BYTES = 1024 * 512;
7
+ const JSON_HEADERS = { 'Content-Type': 'application/json' };
8
+ const SETTINGS_ROUTE = '/__react-native-grab/settings';
9
+ const COPY_ROUTE = '/__react-native-grab/copy';
10
+ const DEFAULT_SETTINGS = Object.freeze({
11
+ selectionPillVisible: false,
12
+ });
13
+ let persistedSettings = { ...DEFAULT_SETTINGS };
14
+ const tryCopy = (command, args, text) => {
15
+ try {
16
+ (0, node_child_process_1.execFileSync)(command, args, { input: text });
17
+ return true;
18
+ }
19
+ catch {
20
+ return false;
21
+ }
22
+ };
23
+ const copyToHostClipboard = (text) => {
24
+ if (process.platform === 'darwin') {
25
+ return tryCopy('pbcopy', [], text);
26
+ }
27
+ if (process.platform === 'win32') {
28
+ return tryCopy('clip', [], text);
29
+ }
30
+ return (tryCopy('xclip', ['-selection', 'clipboard'], text) ||
31
+ tryCopy('xsel', ['--clipboard', '--input'], text));
32
+ };
33
+ const sendJson = (res, statusCode, payload) => {
34
+ res.writeHead(statusCode, JSON_HEADERS);
35
+ res.end(JSON.stringify(payload));
36
+ };
37
+ const getPathname = (req) => {
38
+ if (typeof req.url !== 'string')
39
+ return '';
40
+ try {
41
+ return new URL(req.url, 'http://localhost').pathname;
42
+ }
43
+ catch {
44
+ return req.url.split('?')[0];
45
+ }
46
+ };
47
+ const parseJsonObject = (value) => {
48
+ if (!value)
49
+ return {};
50
+ const parsed = JSON.parse(value);
51
+ if (parsed == null || typeof parsed !== 'object' || Array.isArray(parsed)) {
52
+ return null;
53
+ }
54
+ return parsed;
55
+ };
56
+ const readJsonBody = (req, res, onSuccess) => {
57
+ let body = '';
58
+ let byteLength = 0;
59
+ let resolved = false;
60
+ req.on('data', (chunk) => {
61
+ if (resolved)
62
+ return;
63
+ const asString = chunk.toString();
64
+ byteLength += Buffer.byteLength(asString);
65
+ if (byteLength > MAX_BODY_BYTES) {
66
+ resolved = true;
67
+ sendJson(res, 413, { ok: false, error: 'Payload too large' });
68
+ req.destroy();
69
+ return;
70
+ }
71
+ body += asString;
72
+ });
73
+ req.on('end', () => {
74
+ if (resolved)
75
+ return;
76
+ try {
77
+ const payload = parseJsonObject(body);
78
+ if (payload === null) {
79
+ sendJson(res, 400, { ok: false, error: 'Invalid JSON payload shape' });
80
+ return;
81
+ }
82
+ resolved = true;
83
+ onSuccess(payload);
84
+ }
85
+ catch {
86
+ resolved = true;
87
+ sendJson(res, 400, { ok: false, error: 'Invalid JSON' });
88
+ }
89
+ });
90
+ };
91
+ const hasOwn = (payload, key) => {
92
+ return Object.prototype.hasOwnProperty.call(payload, key);
93
+ };
94
+ const validateSettingsPatch = (payload) => {
95
+ const patch = {};
96
+ if (hasOwn(payload, 'selectionPillVisible')) {
97
+ const value = payload.selectionPillVisible;
98
+ if (typeof value !== 'boolean') {
99
+ return {
100
+ ok: false,
101
+ error: 'selectionPillVisible must be a boolean',
102
+ };
103
+ }
104
+ patch.selectionPillVisible = value;
105
+ }
106
+ return { ok: true, patch };
107
+ };
108
+ const handleCopyRequest = (req, res) => {
109
+ if (req.method !== 'POST') {
110
+ sendJson(res, 405, { ok: false, error: 'Method not allowed' });
111
+ return;
112
+ }
113
+ readJsonBody(req, res, (payload) => {
114
+ const text = typeof payload.text === 'string' ? payload.text : '';
115
+ if (!text.trim()) {
116
+ sendJson(res, 400, { ok: false, error: 'Missing text' });
117
+ return;
118
+ }
119
+ const copied = copyToHostClipboard(text);
120
+ if (!copied) {
121
+ sendJson(res, 500, { ok: false, error: 'Clipboard write failed on host' });
122
+ return;
123
+ }
124
+ sendJson(res, 200, { ok: true });
125
+ });
126
+ };
127
+ const handleSettingsRequest = (req, res) => {
128
+ if (req.method === 'GET') {
129
+ sendJson(res, 200, { ok: true, settings: persistedSettings });
130
+ return;
131
+ }
132
+ if (req.method !== 'POST') {
133
+ sendJson(res, 405, { ok: false, error: 'Method not allowed' });
134
+ return;
135
+ }
136
+ readJsonBody(req, res, (payload) => {
137
+ const validation = validateSettingsPatch(payload);
138
+ if (!validation.ok) {
139
+ sendJson(res, 400, { ok: false, error: validation.error });
140
+ return;
141
+ }
142
+ persistedSettings = {
143
+ ...persistedSettings,
144
+ ...validation.patch,
145
+ };
146
+ sendJson(res, 200, { ok: true, settings: persistedSettings });
147
+ });
148
+ };
149
+ const handleReactNativeGrabRequest = (req, res, next) => {
150
+ const pathname = getPathname(req);
151
+ if (pathname === COPY_ROUTE) {
152
+ handleCopyRequest(req, res);
153
+ return;
154
+ }
155
+ if (pathname === SETTINGS_ROUTE) {
156
+ handleSettingsRequest(req, res);
157
+ return;
158
+ }
159
+ next();
160
+ };
161
+ exports.withReactNativeGrab = (0, metro_config_transformers_1.createMetroConfigTransformer)((config) => {
162
+ const previousEnhanceMiddleware = config.server?.enhanceMiddleware;
163
+ return {
164
+ ...config,
165
+ server: {
166
+ ...config.server,
167
+ enhanceMiddleware: (middleware, metroServer) => {
168
+ const baseMiddleware = previousEnhanceMiddleware
169
+ ? previousEnhanceMiddleware(middleware, metroServer)
170
+ : middleware;
171
+ return (req, res, next) => {
172
+ handleReactNativeGrabRequest(req, res, () => {
173
+ baseMiddleware(req, res, next);
174
+ });
175
+ };
176
+ },
177
+ },
178
+ };
179
+ });
180
+ //# sourceMappingURL=withReactNativeGrab.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withReactNativeGrab.js","sourceRoot":"","sources":["../../../src/metro/withReactNativeGrab.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,340 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildInspectorCopyPayload = exports.buildInspectorContextPayload = exports.buildElementPreview = exports.normalizeInspectorPath = void 0;
4
+ const fiber_1 = require("./fiber");
5
+ const symbolicate_1 = require("./symbolicate");
6
+ const MAX_CLIPBOARD_LEN = 1200;
7
+ const MAX_OWNER_DEPTH = 30;
8
+ const MAX_SYMBOLICATION_TASKS = 24;
9
+ const MAX_FIELD_LEN = 60;
10
+ const REACT_NATIVE_PRIMITIVE_NAMES = new Set([
11
+ 'Text',
12
+ 'View',
13
+ 'Image',
14
+ 'TextInput',
15
+ 'ScrollView',
16
+ 'Switch',
17
+ 'Modal',
18
+ 'SafeAreaView',
19
+ 'Pressable',
20
+ 'TouchableOpacity',
21
+ 'TouchableHighlight',
22
+ 'TouchableWithoutFeedback',
23
+ ]);
24
+ const truncate = (value, max) => {
25
+ if (value.length <= max)
26
+ return value;
27
+ return `${value.slice(0, Math.max(0, max - 3))}...`;
28
+ };
29
+ const sanitizeLine = (value, max = MAX_FIELD_LEN) => {
30
+ if (value == null)
31
+ return '';
32
+ const raw = String(value).replace(/\s+/g, ' ').trim();
33
+ if (!raw)
34
+ return '';
35
+ return truncate(raw, max);
36
+ };
37
+ const escapeAttribute = (value) => {
38
+ return String(value)
39
+ .replace(/&/g, '&amp;')
40
+ .replace(/"/g, '&quot;')
41
+ .replace(/</g, '&lt;')
42
+ .replace(/>/g, '&gt;');
43
+ };
44
+ const isRecord = (value) => {
45
+ return typeof value === 'object' && value !== null;
46
+ };
47
+ const asErrorWithStack = (debugStack) => {
48
+ if (debugStack instanceof Error)
49
+ return debugStack;
50
+ const stackString = typeof debugStack === 'string'
51
+ ? debugStack
52
+ : isRecord(debugStack) && typeof debugStack.stack === 'string'
53
+ ? debugStack.stack
54
+ : null;
55
+ if (!stackString)
56
+ return null;
57
+ const error = new Error('Inspector debug stack');
58
+ error.stack = stackString;
59
+ return error;
60
+ };
61
+ const toFiberNode = (node) => {
62
+ if (!node || !node.__internalInstanceHandle)
63
+ return null;
64
+ return node.__internalInstanceHandle;
65
+ };
66
+ const toPathSlashes = (value) => {
67
+ return value.replace(/\\/g, '/');
68
+ };
69
+ const trimProjectRootSlashes = (value) => {
70
+ return toPathSlashes(value).replace(/\/+$/, '');
71
+ };
72
+ const maybeDecodeURIComponent = (value) => {
73
+ try {
74
+ return decodeURIComponent(value);
75
+ }
76
+ catch {
77
+ return value;
78
+ }
79
+ };
80
+ const normalizeInspectorPath = (filePath, pathRootHint) => {
81
+ const raw = sanitizeLine(filePath, 2000);
82
+ if (!raw)
83
+ return '-';
84
+ let normalized = raw.replace(/[?#].*$/, '');
85
+ if (normalized.startsWith('file://')) {
86
+ normalized = normalized.replace(/^file:\/\//, '');
87
+ }
88
+ else if (/^[a-zA-Z]+:\/\//.test(normalized)) {
89
+ try {
90
+ const url = new URL(normalized);
91
+ normalized = url.pathname;
92
+ }
93
+ catch {
94
+ // keep raw when URL parsing fails
95
+ }
96
+ }
97
+ normalized = maybeDecodeURIComponent(toPathSlashes(normalized));
98
+ if (!normalized)
99
+ return '-';
100
+ if (normalized.startsWith('/[project]/')) {
101
+ return normalized;
102
+ }
103
+ if (normalized.startsWith('/[metro-project]/')) {
104
+ return normalized.replace('/[metro-project]/', '/[project]/');
105
+ }
106
+ if (!normalized.startsWith('/')) {
107
+ return normalized;
108
+ }
109
+ const rootHint = pathRootHint ? trimProjectRootSlashes(pathRootHint) : '';
110
+ if (rootHint && normalized.startsWith(`${rootHint}/`)) {
111
+ return `/[project]/${normalized.slice(rootHint.length + 1)}`;
112
+ }
113
+ return normalized;
114
+ };
115
+ exports.normalizeInspectorPath = normalizeInspectorPath;
116
+ const toInspectorSourceFrame = (frame, pathRootHint) => {
117
+ if (frame.collapse === true)
118
+ return null;
119
+ const file = frame.file?.trim() ?? '';
120
+ if (!file)
121
+ return null;
122
+ const filePath = (0, exports.normalizeInspectorPath)(file, pathRootHint);
123
+ if (!filePath || filePath === '-')
124
+ return null;
125
+ const method = sanitizeLine(frame.methodName ?? '', 100);
126
+ const componentName = method || null;
127
+ const line = typeof frame.lineNumber === 'number' && Number.isFinite(frame.lineNumber)
128
+ ? frame.lineNumber
129
+ : null;
130
+ const column = typeof frame.column === 'number' && Number.isFinite(frame.column)
131
+ ? frame.column
132
+ : null;
133
+ return {
134
+ componentName,
135
+ filePath,
136
+ line,
137
+ column,
138
+ };
139
+ };
140
+ const dedupeConsecutiveFrames = (frames) => {
141
+ if (frames.length <= 1)
142
+ return frames;
143
+ const deduped = [];
144
+ let previousKey = '';
145
+ for (const frame of frames) {
146
+ const key = `${frame.componentName ?? ''}|${frame.filePath}|${frame.line ?? ''}|${frame.column ?? ''}`;
147
+ if (key === previousKey)
148
+ continue;
149
+ deduped.push(frame);
150
+ previousKey = key;
151
+ }
152
+ return deduped;
153
+ };
154
+ const extractSourceFramesFromFiberChain = async (fiber, maxStackLines, symbolicateStack, pathRootHint) => {
155
+ const debugStackErrors = [];
156
+ let cursor = fiber?.return ?? null;
157
+ let depth = 0;
158
+ while (cursor &&
159
+ depth < MAX_OWNER_DEPTH &&
160
+ debugStackErrors.length < MAX_SYMBOLICATION_TASKS) {
161
+ const error = asErrorWithStack(cursor._debugStack);
162
+ if (error) {
163
+ debugStackErrors.push(error);
164
+ }
165
+ cursor = cursor.return ?? null;
166
+ depth += 1;
167
+ }
168
+ const perOwnerFrames = await Promise.all(debugStackErrors.map(async (error) => {
169
+ try {
170
+ const symbolicated = await symbolicateStack(error);
171
+ for (const frame of symbolicated.stack) {
172
+ const formatted = toInspectorSourceFrame(frame, pathRootHint);
173
+ if (formatted) {
174
+ return formatted;
175
+ }
176
+ }
177
+ }
178
+ catch {
179
+ // keep walking owner chain on symbolication failures
180
+ }
181
+ return null;
182
+ }));
183
+ const frames = [];
184
+ for (const frame of perOwnerFrames) {
185
+ if (!frame)
186
+ continue;
187
+ frames.push(frame);
188
+ if (frames.length >= maxStackLines) {
189
+ break;
190
+ }
191
+ }
192
+ return dedupeConsecutiveFrames(frames).slice(0, maxStackLines);
193
+ };
194
+ const extractPrimitiveNameFromDisplayName = (displayName) => {
195
+ if (!displayName)
196
+ return null;
197
+ if (REACT_NATIVE_PRIMITIVE_NAMES.has(displayName)) {
198
+ return displayName;
199
+ }
200
+ const wrappedMatch = /^(ForwardRef|Memo)\((.+)\)$/.exec(displayName);
201
+ if (!wrappedMatch)
202
+ return null;
203
+ const inner = sanitizeLine(wrappedMatch[2], 80);
204
+ if (!inner)
205
+ return null;
206
+ return REACT_NATIVE_PRIMITIVE_NAMES.has(inner) ? inner : null;
207
+ };
208
+ const getReactNativePrimitiveFromFiberChain = (fiber) => {
209
+ let cursor = fiber;
210
+ let depth = 0;
211
+ while (cursor && depth < MAX_OWNER_DEPTH) {
212
+ const displayName = (0, fiber_1.getDisplayNameForFiber)(cursor);
213
+ const primitiveName = extractPrimitiveNameFromDisplayName(displayName);
214
+ if (primitiveName)
215
+ return primitiveName;
216
+ cursor = cursor.return ?? null;
217
+ depth += 1;
218
+ }
219
+ return null;
220
+ };
221
+ const resolveTagName = (node, overrideTagName) => {
222
+ if (overrideTagName) {
223
+ const normalizedOverride = sanitizeLine(overrideTagName, 50);
224
+ if (normalizedOverride)
225
+ return normalizedOverride;
226
+ }
227
+ const raw = sanitizeLine(node.tagName ?? '', 50);
228
+ if (!raw)
229
+ return 'View';
230
+ return raw;
231
+ };
232
+ const extractTextPreview = (props, maxPreviewText) => {
233
+ if (!props || !('children' in props))
234
+ return '';
235
+ const children = props.children;
236
+ if (typeof children === 'string' || typeof children === 'number') {
237
+ return truncate(String(children).replace(/\s+/g, ' ').trim(), maxPreviewText);
238
+ }
239
+ if (Array.isArray(children)) {
240
+ const joined = children
241
+ .filter((item) => typeof item === 'string' || typeof item === 'number')
242
+ .map((item) => String(item))
243
+ .join(' ')
244
+ .replace(/\s+/g, ' ')
245
+ .trim();
246
+ if (!joined)
247
+ return '';
248
+ return truncate(joined, maxPreviewText);
249
+ }
250
+ return '';
251
+ };
252
+ const buildAttributePreview = (props) => {
253
+ if (!props)
254
+ return '';
255
+ const attributes = [];
256
+ const pairs = [
257
+ ['testID', 'testID'],
258
+ ['accessibilityLabel', 'accessibilityLabel'],
259
+ ['id', 'id'],
260
+ ['className', 'className'],
261
+ ];
262
+ for (const [propKey, attrName] of pairs) {
263
+ const value = props[propKey];
264
+ if (typeof value === 'string' || typeof value === 'number') {
265
+ attributes.push(`${attrName}="${escapeAttribute(value)}"`);
266
+ }
267
+ }
268
+ return attributes.length > 0 ? ` ${attributes.join(' ')}` : '';
269
+ };
270
+ const buildElementPreview = (node, maxPreviewText, overrideTagName) => {
271
+ const tagName = resolveTagName(node, overrideTagName);
272
+ const props = (0, fiber_1.getMemoizedProps)(node);
273
+ const attrs = buildAttributePreview(props);
274
+ const text = extractTextPreview(props, maxPreviewText);
275
+ const hasChildren = (node.children?.length ?? 0) > 0;
276
+ if (text) {
277
+ return `<${tagName}${attrs}>\n ${escapeAttribute(text)}\n</${tagName}>`;
278
+ }
279
+ if (hasChildren) {
280
+ return `<${tagName}${attrs}>\n ...\n</${tagName}>`;
281
+ }
282
+ return `<${tagName}${attrs} />`;
283
+ };
284
+ exports.buildElementPreview = buildElementPreview;
285
+ const formatStackLine = (frame) => {
286
+ let fileRef = frame.filePath;
287
+ if (frame.line != null) {
288
+ fileRef += `:${frame.line}`;
289
+ if (frame.column != null) {
290
+ fileRef += `:${frame.column}`;
291
+ }
292
+ }
293
+ if (frame.componentName) {
294
+ return `in ${frame.componentName} (at ${fileRef})`;
295
+ }
296
+ return `in ${fileRef}`;
297
+ };
298
+ const composePayloadText = (payload) => {
299
+ const lines = [payload.mention, '', payload.preview, ...payload.stackLines];
300
+ return lines.join('\n').trim();
301
+ };
302
+ const getDefaultPathRootHint = () => {
303
+ const processValue = globalThis.process;
304
+ if (!processValue || typeof processValue.cwd !== 'function') {
305
+ return null;
306
+ }
307
+ try {
308
+ return processValue.cwd();
309
+ }
310
+ catch {
311
+ return null;
312
+ }
313
+ };
314
+ const buildInspectorContextPayload = async (hitTarget, options = {}) => {
315
+ const maxStackLines = Math.max(0, options.maxStackLines ?? 3);
316
+ const maxPreviewText = Math.max(16, options.maxPreviewText ?? 120);
317
+ const pathRootHint = options.pathRootHint ?? getDefaultPathRootHint();
318
+ const symbolicateStack = options.symbolicateStack ?? symbolicate_1.symbolicate;
319
+ const fiber = toFiberNode(hitTarget.node);
320
+ const sourceFrames = await extractSourceFramesFromFiberChain(fiber, maxStackLines, symbolicateStack, pathRootHint);
321
+ const primitiveName = getReactNativePrimitiveFromFiberChain(fiber);
322
+ const stackLines = sourceFrames.map(formatStackLine);
323
+ const resolvedName = sourceFrames[0]?.componentName || resolveTagName(hitTarget.node);
324
+ const mention = `@<${resolvedName}>`;
325
+ const preview = (0, exports.buildElementPreview)(hitTarget.node, maxPreviewText, primitiveName);
326
+ const plainText = truncate(composePayloadText({ mention, preview, stackLines, plainText: '' }), MAX_CLIPBOARD_LEN);
327
+ return {
328
+ mention,
329
+ preview,
330
+ stackLines,
331
+ plainText,
332
+ };
333
+ };
334
+ exports.buildInspectorContextPayload = buildInspectorContextPayload;
335
+ const buildInspectorCopyPayload = async (hitTarget, options = {}) => {
336
+ const payload = await (0, exports.buildInspectorContextPayload)(hitTarget, options);
337
+ return payload.plainText;
338
+ };
339
+ exports.buildInspectorCopyPayload = buildInspectorCopyPayload;
340
+ //# sourceMappingURL=copy-payload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy-payload.js","sourceRoot":"","sources":["../../../src/react-native/copy-payload.ts"],"names":[],"mappings":"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"}