@ceraph/react-native-mcp 1.0.1 → 1.0.3
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/README.md +10 -22
- package/dist/babel-plugin/index.cjs +1 -1
- package/dist/babel-plugin/index.js +1 -1
- package/dist/cli.js +1 -1
- package/dist/index.js +3 -3
- package/dist/tool-catalog.json +1 -1
- package/package.json +1 -1
- package/server.json +2 -2
package/README.md
CHANGED
|
@@ -14,11 +14,8 @@ Works with any MCP client: Claude Code, Cursor, Codex, VS Code, Antigravity, and
|
|
|
14
14
|
|
|
15
15
|
Ceraph supports React Native and Expo apps. iOS testing runs on macOS through
|
|
16
16
|
Xcode and WebDriverAgent. Android testing runs on macOS, Windows, or Linux
|
|
17
|
-
through ADB and UiAutomator2.
|
|
18
|
-
|
|
19
|
-
For both Expo and bare React Native projects, `ceraph start` creates, installs,
|
|
20
|
-
and launches the native development build as needed. Expo projects run
|
|
21
|
-
through that build rather than Expo Go.
|
|
17
|
+
through ADB and UiAutomator2. Expo projects use a development build rather than
|
|
18
|
+
Expo Go.
|
|
22
19
|
|
|
23
20
|
| Target / host | Status | Notes |
|
|
24
21
|
| -------------------- | ------------- | ---------------------------------------------------------------------------------------------------------------- |
|
|
@@ -29,7 +26,7 @@ through that build rather than Expo Go.
|
|
|
29
26
|
|
|
30
27
|
### Choosing a platform and target
|
|
31
28
|
|
|
32
|
-
On macOS,
|
|
29
|
+
On macOS, `ceraph start` defaults to iOS. On Windows and
|
|
33
30
|
Linux it defaults to Android. An active automation session stays selected.
|
|
34
31
|
With `--device`, Ceraph selects the platform automatically when exactly one USB
|
|
35
32
|
device is connected. When multiple devices are connected, pass the exact Apple
|
|
@@ -66,7 +63,9 @@ The `rn_target_status` tool reports the active platform, exact runtime, target p
|
|
|
66
63
|
|
|
67
64
|
## iOS setup
|
|
68
65
|
|
|
69
|
-
|
|
66
|
+
Install Xcode 14 or later and complete its first-launch setup. Physical devices
|
|
67
|
+
require iOS 16 or later; simulator testing requires an installed iOS Simulator
|
|
68
|
+
runtime.
|
|
70
69
|
|
|
71
70
|
### Physical device
|
|
72
71
|
|
|
@@ -299,7 +298,7 @@ Settings → Tools → MCP Servers → Add, then enter:
|
|
|
299
298
|
| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
300
299
|
| `ceraph_snapshot` | Structured accessibility-tree snapshot of the current screen. Pass `includeStyles: true` after visual changes to include bounded render-time styles for uniquely matched visible elements, plus honest style-coverage metadata. |
|
|
301
300
|
| `ceraph_run_hook` | Run a project-owned command inside the live app when authentication, gated state, a development-only blocker, or cleanup would otherwise prevent meaningful testing. |
|
|
302
|
-
| `ceraph_record_run` | Replay an already-verified path without model pauses and produce a clean MP4 with structured UI snapshots and screenshots tracing the verified flow.
|
|
301
|
+
| `ceraph_record_run` | Replay an already-verified path without model pauses and produce a clean MP4 with structured UI snapshots and screenshots tracing the verified flow. The recording is screen-only evidence; it does not capture or verify audio. |
|
|
303
302
|
| `screen_tap` | Tap by snapshot ref, bounds, or coordinates. Prefer a stable ref; screenshot-derived coordinates are best-effort. |
|
|
304
303
|
| `screen_tap_and_verify` | Find an element by ref/text/label/type, tap its center, and assert a required follow-up selector is on screen. Use `screen_tap` when no postcondition is needed. |
|
|
305
304
|
| `screen_tap_chain` | Tap a sequence of controls on the same stable screen; sends nothing if any target cannot be resolved. |
|
|
@@ -349,7 +348,7 @@ internal use. [Read the full agreement](https://ceraph.dev/license.txt).
|
|
|
349
348
|
|
|
350
349
|
## Media picker testing
|
|
351
350
|
|
|
352
|
-
Call `ceraph_add_media` before opening a native image or video picker when the selected runtime needs something to choose. Ceraph adds the supplied media to the runtime's system photo library; the agent then opens and drives the app's real picker UI as part of the
|
|
351
|
+
Call `ceraph_add_media` before opening a native image or video picker when the selected runtime needs something to choose. Ceraph adds the supplied media to the runtime's system photo library; the agent then opens and drives the app's real picker UI as part of the flow.
|
|
353
352
|
|
|
354
353
|
The tool accepts JPEG, PNG, WebP, and HEIC images up to 5 MB, plus MP4, MOV,
|
|
355
354
|
and M4V videos up to 25 MB. It supports iOS Simulators and Android emulators or
|
|
@@ -383,8 +382,7 @@ export function ScanProfileScreen() {
|
|
|
383
382
|
`mediaKey` can select both an image and a video for a screen that supports both
|
|
384
383
|
capture modes.
|
|
385
384
|
|
|
386
|
-
Ask
|
|
387
|
-
`ceraph_add_camera_video`. Images support JPEG, PNG, WebP, and HEIC up to 5 MB;
|
|
385
|
+
Ask your agent to add test images or videos. Images support JPEG, PNG, WebP, and HEIC up to 5 MB;
|
|
388
386
|
videos support MP4, MOV, and M4V up to 25 MB. Set `overwrite: true` when replacing
|
|
389
387
|
an existing key.
|
|
390
388
|
|
|
@@ -422,12 +420,6 @@ A **hook** is a project-owned command that Ceraph can run inside the live
|
|
|
422
420
|
development app. It can use the app's own state, navigation, auth, feature-flag,
|
|
423
421
|
and API modules. The agent invokes a hook explicitly with `ceraph_run_hook`.
|
|
424
422
|
|
|
425
|
-
> **Safety:** Hooks use your app's services, so a development build
|
|
426
|
-
> can still affect a production backend. Use disposable, non-production data,
|
|
427
|
-
> keep credentials in your existing secret configuration, and prefer idempotent
|
|
428
|
-
> (safe-to-repeat), `runId`-scoped effects. Never modify production or real-user
|
|
429
|
-
> data without explicit human authorization. Clean up afterward.
|
|
430
|
-
|
|
431
423
|
**Create a hook** in `.ceraph/hooks/`, one file per route, named `*.hook.ts` or `*.hook.js`. It exports the route it fires on and a `run` function, and may import your app's own modules:
|
|
432
424
|
|
|
433
425
|
```ts
|
|
@@ -519,16 +511,12 @@ preference or when Ceraph's remediation asks for an explicit override.
|
|
|
519
511
|
## Updates
|
|
520
512
|
|
|
521
513
|
Ceraph automatically informs your agent when it detects a newer release.
|
|
522
|
-
You normally don't need to check for updates yourself. To
|
|
523
|
-
manually, run this from an initialized project:
|
|
514
|
+
You normally don't need to check for updates yourself. To update manually:
|
|
524
515
|
|
|
525
516
|
```bash
|
|
526
517
|
ceraph update
|
|
527
518
|
```
|
|
528
519
|
|
|
529
|
-
If the global command is unavailable, run
|
|
530
|
-
`npx @ceraph/react-native-mcp@latest update` instead.
|
|
531
|
-
|
|
532
520
|
By default, Ceraph asks for permission before installing an update. You can ask
|
|
533
521
|
your agent to enable automatic updates instead at any time.
|
|
534
522
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
'use strict';const
|
|
1
|
+
'use strict';const _0xec1b36=_0x1041;(function(_0x425405,_0x3ec134){const _0x464a8b=_0x1041,_0x5458f8=_0x425405();while(!![]){try{const _0x562d0b=-parseInt(_0x464a8b(0x8e))/0x1+-parseInt(_0x464a8b(0x9b))/0x2*(parseInt(_0x464a8b(0x95))/0x3)+-parseInt(_0x464a8b(0x6e))/0x4*(-parseInt(_0x464a8b(0x73))/0x5)+parseInt(_0x464a8b(0x76))/0x6*(parseInt(_0x464a8b(0x8d))/0x7)+parseInt(_0x464a8b(0x9a))/0x8+-parseInt(_0x464a8b(0x70))/0x9+parseInt(_0x464a8b(0x6d))/0xa;if(_0x562d0b===_0x3ec134)break;else _0x5458f8['push'](_0x5458f8['shift']());}catch(_0x1e58f7){_0x5458f8['push'](_0x5458f8['shift']());}}}(_0x59eb,0x91231));var __defProp=Object[_0xec1b36(0x93)],__getOwnPropDesc=Object[_0xec1b36(0xa8)],__getOwnPropNames=Object[_0xec1b36(0x94)],__hasOwnProp=Object[_0xec1b36(0x9d)]['hasOwnProperty'],__export=(_0x1f98a8,_0x17ca8)=>{for(var _0x36860b in _0x17ca8)__defProp(_0x1f98a8,_0x36860b,{'get':_0x17ca8[_0x36860b],'enumerable':!![]});},__copyProps=(_0x4025bb,_0x31008a,_0x125e36,_0x46107a)=>{const _0x19dedf=_0xec1b36;if(_0x31008a&&typeof _0x31008a===_0x19dedf(0xa5)||typeof _0x31008a===_0x19dedf(0x85)){for(let _0x4b80a6 of __getOwnPropNames(_0x31008a))if(!__hasOwnProp['call'](_0x4025bb,_0x4b80a6)&&_0x4b80a6!==_0x125e36)__defProp(_0x4025bb,_0x4b80a6,{'get':()=>_0x31008a[_0x4b80a6],'enumerable':!(_0x46107a=__getOwnPropDesc(_0x31008a,_0x4b80a6))||_0x46107a[_0x19dedf(0x72)]});}return _0x4025bb;},__toCommonJS=_0x4752b9=>__copyProps(__defProp({},_0xec1b36(0x8c),{'value':!![]}),_0x4752b9),babel_plugin_exports={};__export(babel_plugin_exports,{'default':()=>ceraphTestIdPlugin}),module[_0xec1b36(0x69)]=__toCommonJS(babel_plugin_exports);var CERAPH_TESTID_PREFIX='cer_';function normalizeRelPath(_0x2ffda8){const _0x585562=_0xec1b36;return _0x2ffda8[_0x585562(0x9e)](/\\/g,'/')[_0x585562(0x9e)](/^\.\//,'')[_0x585562(0x9e)](/^\/+/,'');}function slug(_0x517740){const _0x18d136=_0xec1b36,_0x3ec1cf=_0x517740['replace'](/\.[jt]sx?$/i,''),_0x457262=_0x3ec1cf[_0x18d136(0x7f)]()['replace'](/[^a-z0-9]+/g,'-')[_0x18d136(0x9e)](/-+/g,'-')['replace'](/^-+|-+$/g,'');return _0x457262[_0x18d136(0x97)]>0x28?_0x457262[_0x18d136(0x7d)](_0x457262['length']-0x28)['replace'](/^-+/,''):_0x457262;}function fnv1a64Hex(_0x565826){const _0x41d865=_0xec1b36;let _0x508499=0xcbf29ce484222325n;const _0x678f5d=0x100000001b3n,_0x452f6f=0xffffffffffffffffn;for(let _0xf1ed5=0x0;_0xf1ed5<_0x565826['length'];_0xf1ed5++){_0x508499^=BigInt(_0x565826[_0x41d865(0x7e)](_0xf1ed5)),_0x508499=_0x508499*_0x678f5d&_0x452f6f;}return _0x508499[_0x41d865(0x7c)](0x10)['padStart'](0x10,'0');}function deriveTestId(_0x588eeb){const _0x50295c=_0xec1b36,_0xd6e2d7=normalizeRelPath(_0x588eeb[_0x50295c(0x7b)]),_0x9ae2a5=_0xd6e2d7+'|'+_0x588eeb['line']+'|'+_0x588eeb[_0x50295c(0x77)]+'|'+(_0x588eeb['tag']??''),_0x27318d=fnv1a64Hex(_0x9ae2a5)[_0x50295c(0x7d)](0x0,0xa);return''+CERAPH_TESTID_PREFIX+slug(_0xd6e2d7)+'_'+_0x588eeb[_0x50295c(0x6a)]+'_'+_0x588eeb['col']+'_'+_0x27318d;}var INTERACTIVE_TAGS=new Set(['Pressable',_0xec1b36(0x71),_0xec1b36(0xa1),'TouchableWithoutFeedback','TouchableNativeFeedback','Button',_0xec1b36(0x8a),_0xec1b36(0x91),_0xec1b36(0x75),'ListItem','Chip']),INPUT_TAGS=new Set(['TextInput',_0xec1b36(0x9c),'Switch','Picker',_0xec1b36(0xa4),'Checkbox','SegmentedControl','SearchBar']),PRESS_PROPS=new Set([_0xec1b36(0x99),'onPressIn','onLongPress','onClick']),INPUT_PROPS=new Set([_0xec1b36(0x86),'onValueChange',_0xec1b36(0xa3)]);function baseTag(_0x5e5198){const _0xbade78=_0xec1b36;return _0x5e5198[_0xbade78(0x6f)]('.')[0x0];}function isTargetableJsx(_0x9e3d6b,_0x2e4190){const _0x2ac226=_0xec1b36,_0x78813c=baseTag(_0x9e3d6b);if(INTERACTIVE_TAGS['has'](_0x9e3d6b)||INTERACTIVE_TAGS['has'](_0x78813c)||INPUT_TAGS['has'](_0x9e3d6b)||INPUT_TAGS['has'](_0x78813c))return!![];for(const _0x8940a2 of _0x2e4190){if(PRESS_PROPS[_0x2ac226(0x82)](_0x8940a2)||INPUT_PROPS[_0x2ac226(0x82)](_0x8940a2))return!![];}return![];}function _0x1041(_0x47cbaf,_0x211131){_0x47cbaf=_0x47cbaf-0x69;const _0x59eb99=_0x59eb();let _0x1041da=_0x59eb99[_0x47cbaf];return _0x1041da;}var import_node_path=require(_0xec1b36(0x9f));function _0x59eb(){const _0x3fd9b9=['loc','onPress','6775472QeQESl','336628FTHzqJ','TextField','prototype','replace','path','types','TouchableHighlight','join','onChange','Slider','object','isJSXIdentifier','stringLiteral','getOwnPropertyDescriptor','node','exports','line','env','start','3539240MdrtRJ','16xnKKvB','split','2388969hBAydX','TouchableOpacity','enumerable','44285rtqkCZ','isJSXAttribute','MenuItem','66YroYWD','col','posix','name','opts','relPath','toString','slice','charCodeAt','toLowerCase','unshift','root','has','file','isJSXNamespacedName','function','onChangeText','sep','includes','push','Link','jsxAttribute','__esModule','89327VaDiQp','11793bcmAuH','process','property','IconButton','jsxIdentifier','defineProperty','getOwnPropertyNames','9TKeopW','testID','length'];_0x59eb=function(){return _0x3fd9b9;};return _0x59eb();}function jsxTagName(_0x4e5473,_0x40c6af){const _0x2c85c0=_0xec1b36;if(_0x40c6af[_0x2c85c0(0xa6)](_0x4e5473))return _0x4e5473[_0x2c85c0(0x79)];if(_0x40c6af['isJSXMemberExpression'](_0x4e5473)){const _0x3779eb=[];let _0x40fb57=_0x4e5473;while(_0x40c6af['isJSXMemberExpression'](_0x40fb57)){_0x3779eb['unshift'](_0x40fb57[_0x2c85c0(0x90)]['name']),_0x40fb57=_0x40fb57[_0x2c85c0(0xa5)];}if(_0x40c6af[_0x2c85c0(0xa6)](_0x40fb57))_0x3779eb[_0x2c85c0(0x80)](_0x40fb57[_0x2c85c0(0x79)]);return _0x3779eb[_0x2c85c0(0xa2)]('.');}if(_0x40c6af[_0x2c85c0(0x84)](_0x4e5473))return _0x4e5473['namespace']['name']+':'+_0x4e5473[_0x2c85c0(0x79)]['name'];return'';}function attrName(_0x2fa218,_0x294b69){const _0x45f20b=_0xec1b36;return _0x294b69[_0x45f20b(0xa6)](_0x2fa218[_0x45f20b(0x79)])?_0x2fa218['name'][_0x45f20b(0x79)]:void 0x0;}function attrNames(_0x436f58,_0x568ee4){const _0x4e65d1=_0xec1b36,_0x403c40=[];for(const _0x7fcc67 of _0x436f58['attributes']){if(_0x568ee4[_0x4e65d1(0x74)](_0x7fcc67)){const _0x28f8cf=attrName(_0x7fcc67,_0x568ee4);if(_0x28f8cf)_0x403c40[_0x4e65d1(0x89)](_0x28f8cf);}}return _0x403c40;}function hasTestId(_0x2e15cb){const _0x3d31d9=_0xec1b36;return _0x2e15cb[_0x3d31d9(0x88)](_0x3d31d9(0x96));}function toRelPath(_0x8375c8,_0x17f6c5){const _0x433177=_0xec1b36,_0x1bfada=_0x8375c8??'',_0x87482e=_0x1bfada?(0x0,import_node_path['relative'])(_0x1bfada,_0x17f6c5):_0x17f6c5;return import_node_path[_0x433177(0x87)]==='/'?_0x87482e:_0x87482e[_0x433177(0x6f)](import_node_path[_0x433177(0x87)])['join'](import_node_path[_0x433177(0x78)]['sep']);}function defaultEnabled(){const _0x3d1e5c=_0xec1b36,_0x224d97=globalThis[_0x3d1e5c(0x8f)]?.[_0x3d1e5c(0x6b)];return _0x224d97?.['NODE_ENV']!=='production';}function ceraphTestIdPlugin(_0x7a0353,_0x16abb9={}){const _0x254feb=_0xec1b36,_0x738510=_0x7a0353[_0x254feb(0xa0)],_0x3cb722=_0x16abb9['enabled']??defaultEnabled();return{'name':'ceraph-testid-injector','visitor':{'JSXOpeningElement'(_0x4dc432,_0x113347){const _0x3cc583=_0x254feb;if(!_0x3cb722)return;const _0x142823=_0x4dc432[_0x3cc583(0xa9)],_0x30b62=_0x142823[_0x3cc583(0x98)];if(!_0x30b62)return;const _0x2e2ed7=_0x113347[_0x3cc583(0x83)][_0x3cc583(0x7a)]['filename'];if(!_0x2e2ed7)return;const _0xbfdd46=jsxTagName(_0x142823[_0x3cc583(0x79)],_0x738510),_0x19987a=attrNames(_0x142823,_0x738510);if(hasTestId(_0x19987a))return;if(!isTargetableJsx(_0xbfdd46,_0x19987a))return;const _0xa75f92=toRelPath(_0x113347[_0x3cc583(0x83)]['opts'][_0x3cc583(0x81)]??null,_0x2e2ed7),_0x49d491=deriveTestId({'relPath':_0xa75f92,'line':_0x30b62['start']['line'],'col':_0x30b62[_0x3cc583(0x6c)]['column']+0x1,'tag':_0xbfdd46});_0x142823['attributes'][_0x3cc583(0x80)](_0x738510[_0x3cc583(0x8b)](_0x738510[_0x3cc583(0x92)](_0x3cc583(0x96)),_0x738510[_0x3cc583(0xa7)](_0x49d491)));}}};}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
1
|
+
const _0x2d249e=_0x583a;(function(_0x3e7a4c,_0x45c8fc){const _0x581946=_0x583a,_0x186157=_0x3e7a4c();while(!![]){try{const _0xd34c95=-parseInt(_0x581946(0x1ac))/0x1*(-parseInt(_0x581946(0x1a2))/0x2)+parseInt(_0x581946(0x1a0))/0x3+parseInt(_0x581946(0x193))/0x4*(parseInt(_0x581946(0x1a4))/0x5)+parseInt(_0x581946(0x1a8))/0x6+-parseInt(_0x581946(0x191))/0x7+parseInt(_0x581946(0x18e))/0x8+-parseInt(_0x581946(0x1b9))/0x9;if(_0xd34c95===_0x45c8fc)break;else _0x186157['push'](_0x186157['shift']());}catch(_0x98223e){_0x186157['push'](_0x186157['shift']());}}}(_0x24e1,0x8ff92));var CERAPH_TESTID_PREFIX=_0x2d249e(0x196);function normalizeRelPath(_0x4ed0c5){const _0x215b35=_0x2d249e;return _0x4ed0c5[_0x215b35(0x1af)](/\\/g,'/')['replace'](/^\.\//,'')[_0x215b35(0x1af)](/^\/+/,'');}function slug(_0x4e3612){const _0x2c7a6d=_0x2d249e,_0x20af26=_0x4e3612[_0x2c7a6d(0x1af)](/\.[jt]sx?$/i,''),_0xc44934=_0x20af26[_0x2c7a6d(0x197)]()['replace'](/[^a-z0-9]+/g,'-')[_0x2c7a6d(0x1af)](/-+/g,'-')[_0x2c7a6d(0x1af)](/^-+|-+$/g,'');return _0xc44934[_0x2c7a6d(0x1ab)]>0x28?_0xc44934[_0x2c7a6d(0x1ad)](_0xc44934[_0x2c7a6d(0x1ab)]-0x28)[_0x2c7a6d(0x1af)](/^-+/,''):_0xc44934;}function _0x583a(_0x1dc3f3,_0x166736){_0x1dc3f3=_0x1dc3f3-0x18b;const _0x24e111=_0x24e1();let _0x583a23=_0x24e111[_0x1dc3f3];return _0x583a23;}function fnv1a64Hex(_0x4f6a8a){const _0x59d0e9=_0x2d249e;let _0x3348b6=0xcbf29ce484222325n;const _0x36235d=0x100000001b3n,_0x13603d=0xffffffffffffffffn;for(let _0x272007=0x0;_0x272007<_0x4f6a8a['length'];_0x272007++){_0x3348b6^=BigInt(_0x4f6a8a[_0x59d0e9(0x1b8)](_0x272007)),_0x3348b6=_0x3348b6*_0x36235d&_0x13603d;}return _0x3348b6[_0x59d0e9(0x1b2)](0x10)['padStart'](0x10,'0');}function deriveTestId(_0x279379){const _0x70a5ff=_0x2d249e,_0x3f1a13=normalizeRelPath(_0x279379['relPath']),_0x403999=_0x3f1a13+'|'+_0x279379['line']+'|'+_0x279379[_0x70a5ff(0x1b4)]+'|'+(_0x279379['tag']??''),_0x4a438a=fnv1a64Hex(_0x403999)[_0x70a5ff(0x1ad)](0x0,0xa);return''+CERAPH_TESTID_PREFIX+slug(_0x3f1a13)+'_'+_0x279379['line']+'_'+_0x279379[_0x70a5ff(0x1b4)]+'_'+_0x4a438a;}var INTERACTIVE_TAGS=new Set([_0x2d249e(0x1a6),_0x2d249e(0x1a1),_0x2d249e(0x1ae),_0x2d249e(0x1a7),_0x2d249e(0x1aa),_0x2d249e(0x19e),_0x2d249e(0x18b),'IconButton','MenuItem',_0x2d249e(0x1a9),_0x2d249e(0x19a)]),INPUT_TAGS=new Set(['TextInput','TextField','Switch',_0x2d249e(0x192),_0x2d249e(0x19f),'Checkbox','SegmentedControl','SearchBar']),PRESS_PROPS=new Set(['onPress',_0x2d249e(0x18d),'onLongPress','onClick']),INPUT_PROPS=new Set([_0x2d249e(0x190),'onValueChange','onChange']);function baseTag(_0x1339ff){return _0x1339ff['split']('.')[0x0];}function isTargetableJsx(_0x30483a,_0xf0139b){const _0x5f493a=_0x2d249e,_0x56667f=baseTag(_0x30483a);if(INTERACTIVE_TAGS[_0x5f493a(0x18c)](_0x30483a)||INTERACTIVE_TAGS[_0x5f493a(0x18c)](_0x56667f)||INPUT_TAGS[_0x5f493a(0x18c)](_0x30483a)||INPUT_TAGS['has'](_0x56667f))return!![];for(const _0x6fa91e of _0xf0139b){if(PRESS_PROPS['has'](_0x6fa91e)||INPUT_PROPS['has'](_0x6fa91e))return!![];}return![];}import{posix,relative,sep}from'path';function jsxTagName(_0x4c3b03,_0x5ee374){const _0x40aedc=_0x2d249e;if(_0x5ee374['isJSXIdentifier'](_0x4c3b03))return _0x4c3b03[_0x40aedc(0x1b6)];if(_0x5ee374[_0x40aedc(0x1b0)](_0x4c3b03)){const _0x59b5b8=[];let _0x81adca=_0x4c3b03;while(_0x5ee374['isJSXMemberExpression'](_0x81adca)){_0x59b5b8[_0x40aedc(0x19d)](_0x81adca[_0x40aedc(0x1b5)]['name']),_0x81adca=_0x81adca['object'];}if(_0x5ee374['isJSXIdentifier'](_0x81adca))_0x59b5b8[_0x40aedc(0x19d)](_0x81adca['name']);return _0x59b5b8['join']('.');}if(_0x5ee374[_0x40aedc(0x1b3)](_0x4c3b03))return _0x4c3b03['namespace'][_0x40aedc(0x1b6)]+':'+_0x4c3b03[_0x40aedc(0x1b6)]['name'];return'';}function attrName(_0x135840,_0x32bde1){const _0x34fc0c=_0x2d249e;return _0x32bde1['isJSXIdentifier'](_0x135840[_0x34fc0c(0x1b6)])?_0x135840[_0x34fc0c(0x1b6)]['name']:void 0x0;}function attrNames(_0x369aa1,_0x1e5652){const _0xb0a882=_0x2d249e,_0x3df50d=[];for(const _0x8815e9 of _0x369aa1[_0xb0a882(0x1a3)]){if(_0x1e5652['isJSXAttribute'](_0x8815e9)){const _0x22199c=attrName(_0x8815e9,_0x1e5652);if(_0x22199c)_0x3df50d[_0xb0a882(0x199)](_0x22199c);}}return _0x3df50d;}function hasTestId(_0x59469f){const _0x278bd1=_0x2d249e;return _0x59469f[_0x278bd1(0x19b)]('testID');}function toRelPath(_0x4a7452,_0x454dd4){const _0x3d7583=_0x2d249e,_0x1e6028=_0x4a7452??'',_0x3618f2=_0x1e6028?relative(_0x1e6028,_0x454dd4):_0x454dd4;return sep==='/'?_0x3618f2:_0x3618f2['split'](sep)['join'](posix[_0x3d7583(0x198)]);}function defaultEnabled(){const _0x13bbd3=_0x2d249e,_0x2f3095=globalThis[_0x13bbd3(0x1b7)]?.['env'];return _0x2f3095?.['NODE_ENV']!==_0x13bbd3(0x194);}function _0x24e1(){const _0x35d5a9=['attributes','323755MUtARF','filename','Pressable','TouchableWithoutFeedback','890082AGpXBt','ListItem','TouchableNativeFeedback','length','76kWcxiZ','slice','TouchableHighlight','replace','isJSXMemberExpression','jsxAttribute','toString','isJSXNamespacedName','col','property','name','process','charCodeAt','18770733ZLSByt','Link','has','onPressIn','7456936MKemIm','testID','onChangeText','5298202VwLBGX','Picker','44YMnjiz','production','ceraph-testid-injector','cer_','toLowerCase','sep','push','Chip','includes','file','unshift','Button','Slider','3105708AHxrza','TouchableOpacity','15902dgUlIg'];_0x24e1=function(){return _0x35d5a9;};return _0x24e1();}function ceraphTestIdPlugin(_0x1a2bc0,_0x51caca={}){const _0x2d3e78=_0x2d249e,_0x1cf5d7=_0x1a2bc0['types'],_0x3ac3e6=_0x51caca['enabled']??defaultEnabled();return{'name':_0x2d3e78(0x195),'visitor':{'JSXOpeningElement'(_0x220ab0,_0x3ca4b7){const _0x1cf66d=_0x2d3e78;if(!_0x3ac3e6)return;const _0x59cc16=_0x220ab0['node'],_0x330358=_0x59cc16['loc'];if(!_0x330358)return;const _0x25fe33=_0x3ca4b7['file']['opts'][_0x1cf66d(0x1a5)];if(!_0x25fe33)return;const _0x5d76da=jsxTagName(_0x59cc16[_0x1cf66d(0x1b6)],_0x1cf5d7),_0x1ee730=attrNames(_0x59cc16,_0x1cf5d7);if(hasTestId(_0x1ee730))return;if(!isTargetableJsx(_0x5d76da,_0x1ee730))return;const _0x574146=toRelPath(_0x3ca4b7[_0x1cf66d(0x19c)]['opts']['root']??null,_0x25fe33),_0x5c4acf=deriveTestId({'relPath':_0x574146,'line':_0x330358['start']['line'],'col':_0x330358['start']['column']+0x1,'tag':_0x5d76da});_0x59cc16['attributes']['unshift'](_0x1cf5d7[_0x1cf66d(0x1b1)](_0x1cf5d7['jsxIdentifier'](_0x1cf66d(0x18f)),_0x1cf5d7['stringLiteral'](_0x5c4acf)));}}};}export{ceraphTestIdPlugin as default};
|