execbro 0.0.1-reserve → 1.10.13
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/LICENSE +32 -0
- package/README.md +496 -0
- package/build/__tests__/helpers/fake-cdp-server.d.ts +56 -0
- package/build/__tests__/helpers/fake-cdp-server.d.ts.map +1 -0
- package/build/__tests__/helpers/fake-cdp-server.js +120 -0
- package/build/__tests__/helpers/fake-cdp-server.js.map +1 -0
- package/build/__tests__/helpers/tap-test-helpers.d.ts +36 -0
- package/build/__tests__/helpers/tap-test-helpers.d.ts.map +1 -0
- package/build/__tests__/helpers/tap-test-helpers.js +130 -0
- package/build/__tests__/helpers/tap-test-helpers.js.map +1 -0
- package/build/__tests__/integration/auto-reconnect.test.d.ts +2 -0
- package/build/__tests__/integration/auto-reconnect.test.d.ts.map +1 -0
- package/build/__tests__/integration/auto-reconnect.test.js +118 -0
- package/build/__tests__/integration/auto-reconnect.test.js.map +1 -0
- package/build/__tests__/integration/connection-health.test.d.ts +2 -0
- package/build/__tests__/integration/connection-health.test.d.ts.map +1 -0
- package/build/__tests__/integration/connection-health.test.js +157 -0
- package/build/__tests__/integration/connection-health.test.js.map +1 -0
- package/build/__tests__/integration/execute-in-app.test.d.ts +2 -0
- package/build/__tests__/integration/execute-in-app.test.d.ts.map +1 -0
- package/build/__tests__/integration/execute-in-app.test.js +124 -0
- package/build/__tests__/integration/execute-in-app.test.js.map +1 -0
- package/build/__tests__/integration/per-call-timeout.test.d.ts +2 -0
- package/build/__tests__/integration/per-call-timeout.test.d.ts.map +1 -0
- package/build/__tests__/integration/per-call-timeout.test.js +103 -0
- package/build/__tests__/integration/per-call-timeout.test.js.map +1 -0
- package/build/__tests__/integration/tap-strategies.test.d.ts +2 -0
- package/build/__tests__/integration/tap-strategies.test.d.ts.map +1 -0
- package/build/__tests__/integration/tap-strategies.test.js +330 -0
- package/build/__tests__/integration/tap-strategies.test.js.map +1 -0
- package/build/__tests__/integration/tools.test.d.ts +2 -0
- package/build/__tests__/integration/tools.test.d.ts.map +1 -0
- package/build/__tests__/integration/tools.test.js +227 -0
- package/build/__tests__/integration/tools.test.js.map +1 -0
- package/build/__tests__/setup.d.ts +2 -0
- package/build/__tests__/setup.d.ts.map +1 -0
- package/build/__tests__/setup.js +15 -0
- package/build/__tests__/setup.js.map +1 -0
- package/build/__tests__/unit/androidEmulatorAvds.test.d.ts +2 -0
- package/build/__tests__/unit/androidEmulatorAvds.test.d.ts.map +1 -0
- package/build/__tests__/unit/androidEmulatorAvds.test.js +98 -0
- package/build/__tests__/unit/androidEmulatorAvds.test.js.map +1 -0
- package/build/__tests__/unit/buildToken.test.d.ts +2 -0
- package/build/__tests__/unit/buildToken.test.d.ts.map +1 -0
- package/build/__tests__/unit/buildToken.test.js +22 -0
- package/build/__tests__/unit/buildToken.test.js.map +1 -0
- package/build/__tests__/unit/bundle.test.d.ts +2 -0
- package/build/__tests__/unit/bundle.test.d.ts.map +1 -0
- package/build/__tests__/unit/bundle.test.js +53 -0
- package/build/__tests__/unit/bundle.test.js.map +1 -0
- package/build/__tests__/unit/burst.test.d.ts +2 -0
- package/build/__tests__/unit/burst.test.d.ts.map +1 -0
- package/build/__tests__/unit/burst.test.js +54 -0
- package/build/__tests__/unit/burst.test.js.map +1 -0
- package/build/__tests__/unit/connection-health.test.d.ts +2 -0
- package/build/__tests__/unit/connection-health.test.d.ts.map +1 -0
- package/build/__tests__/unit/connection-health.test.js +38 -0
- package/build/__tests__/unit/connection-health.test.js.map +1 -0
- package/build/__tests__/unit/debugGlobals.test.d.ts +2 -0
- package/build/__tests__/unit/debugGlobals.test.d.ts.map +1 -0
- package/build/__tests__/unit/debugGlobals.test.js +14 -0
- package/build/__tests__/unit/debugGlobals.test.js.map +1 -0
- package/build/__tests__/unit/deviceDiscovery.test.d.ts +2 -0
- package/build/__tests__/unit/deviceDiscovery.test.d.ts.map +1 -0
- package/build/__tests__/unit/deviceDiscovery.test.js +119 -0
- package/build/__tests__/unit/deviceDiscovery.test.js.map +1 -0
- package/build/__tests__/unit/deviceResolver.test.d.ts +2 -0
- package/build/__tests__/unit/deviceResolver.test.d.ts.map +1 -0
- package/build/__tests__/unit/deviceResolver.test.js +261 -0
- package/build/__tests__/unit/deviceResolver.test.js.map +1 -0
- package/build/__tests__/unit/escapeNonAscii.test.d.ts +2 -0
- package/build/__tests__/unit/escapeNonAscii.test.d.ts.map +1 -0
- package/build/__tests__/unit/escapeNonAscii.test.js +76 -0
- package/build/__tests__/unit/escapeNonAscii.test.js.map +1 -0
- package/build/__tests__/unit/exec.test.d.ts +2 -0
- package/build/__tests__/unit/exec.test.d.ts.map +1 -0
- package/build/__tests__/unit/exec.test.js +54 -0
- package/build/__tests__/unit/exec.test.js.map +1 -0
- package/build/__tests__/unit/executor.test.d.ts +2 -0
- package/build/__tests__/unit/executor.test.d.ts.map +1 -0
- package/build/__tests__/unit/executor.test.js +220 -0
- package/build/__tests__/unit/executor.test.js.map +1 -0
- package/build/__tests__/unit/failureArtifact.test.d.ts +2 -0
- package/build/__tests__/unit/failureArtifact.test.d.ts.map +1 -0
- package/build/__tests__/unit/failureArtifact.test.js +207 -0
- package/build/__tests__/unit/failureArtifact.test.js.map +1 -0
- package/build/__tests__/unit/fastRefreshRecorder.test.d.ts +2 -0
- package/build/__tests__/unit/fastRefreshRecorder.test.d.ts.map +1 -0
- package/build/__tests__/unit/fastRefreshRecorder.test.js +68 -0
- package/build/__tests__/unit/fastRefreshRecorder.test.js.map +1 -0
- package/build/__tests__/unit/fastRefreshTools.test.d.ts +2 -0
- package/build/__tests__/unit/fastRefreshTools.test.d.ts.map +1 -0
- package/build/__tests__/unit/fastRefreshTools.test.js +112 -0
- package/build/__tests__/unit/fastRefreshTools.test.js.map +1 -0
- package/build/__tests__/unit/fiberMatch.test.d.ts +2 -0
- package/build/__tests__/unit/fiberMatch.test.d.ts.map +1 -0
- package/build/__tests__/unit/fiberMatch.test.js +114 -0
- package/build/__tests__/unit/fiberMatch.test.js.map +1 -0
- package/build/__tests__/unit/fingerprint.test.d.ts +2 -0
- package/build/__tests__/unit/fingerprint.test.d.ts.map +1 -0
- package/build/__tests__/unit/fingerprint.test.js +99 -0
- package/build/__tests__/unit/fingerprint.test.js.map +1 -0
- package/build/__tests__/unit/focusedInput.test.d.ts +2 -0
- package/build/__tests__/unit/focusedInput.test.d.ts.map +1 -0
- package/build/__tests__/unit/focusedInput.test.js +58 -0
- package/build/__tests__/unit/focusedInput.test.js.map +1 -0
- package/build/__tests__/unit/focusedInputTools.test.d.ts +2 -0
- package/build/__tests__/unit/focusedInputTools.test.d.ts.map +1 -0
- package/build/__tests__/unit/focusedInputTools.test.js +79 -0
- package/build/__tests__/unit/focusedInputTools.test.js.map +1 -0
- package/build/__tests__/unit/iconSemantics.test.d.ts +2 -0
- package/build/__tests__/unit/iconSemantics.test.d.ts.map +1 -0
- package/build/__tests__/unit/iconSemantics.test.js +80 -0
- package/build/__tests__/unit/iconSemantics.test.js.map +1 -0
- package/build/__tests__/unit/imageBuffer.test.d.ts +2 -0
- package/build/__tests__/unit/imageBuffer.test.d.ts.map +1 -0
- package/build/__tests__/unit/imageBuffer.test.js +128 -0
- package/build/__tests__/unit/imageBuffer.test.js.map +1 -0
- package/build/__tests__/unit/logs.test.d.ts +2 -0
- package/build/__tests__/unit/logs.test.d.ts.map +1 -0
- package/build/__tests__/unit/logs.test.js +90 -0
- package/build/__tests__/unit/logs.test.js.map +1 -0
- package/build/__tests__/unit/measureComponent.test.d.ts +2 -0
- package/build/__tests__/unit/measureComponent.test.d.ts.map +1 -0
- package/build/__tests__/unit/measureComponent.test.js +66 -0
- package/build/__tests__/unit/measureComponent.test.js.map +1 -0
- package/build/__tests__/unit/measureComponentTools.test.d.ts +2 -0
- package/build/__tests__/unit/measureComponentTools.test.d.ts.map +1 -0
- package/build/__tests__/unit/measureComponentTools.test.js +94 -0
- package/build/__tests__/unit/measureComponentTools.test.js.map +1 -0
- package/build/__tests__/unit/metro.test.d.ts +2 -0
- package/build/__tests__/unit/metro.test.d.ts.map +1 -0
- package/build/__tests__/unit/metro.test.js +61 -0
- package/build/__tests__/unit/metro.test.js.map +1 -0
- package/build/__tests__/unit/network.test.d.ts +2 -0
- package/build/__tests__/unit/network.test.d.ts.map +1 -0
- package/build/__tests__/unit/network.test.js +102 -0
- package/build/__tests__/unit/network.test.js.map +1 -0
- package/build/__tests__/unit/networkInterceptor.test.d.ts +2 -0
- package/build/__tests__/unit/networkInterceptor.test.d.ts.map +1 -0
- package/build/__tests__/unit/networkInterceptor.test.js +104 -0
- package/build/__tests__/unit/networkInterceptor.test.js.map +1 -0
- package/build/__tests__/unit/probe.test.d.ts +2 -0
- package/build/__tests__/unit/probe.test.d.ts.map +1 -0
- package/build/__tests__/unit/probe.test.js +62 -0
- package/build/__tests__/unit/probe.test.js.map +1 -0
- package/build/__tests__/unit/rnGlobalsBootstrap.test.d.ts +2 -0
- package/build/__tests__/unit/rnGlobalsBootstrap.test.d.ts.map +1 -0
- package/build/__tests__/unit/rnGlobalsBootstrap.test.js +29 -0
- package/build/__tests__/unit/rnGlobalsBootstrap.test.js.map +1 -0
- package/build/__tests__/unit/screenState.test.d.ts +2 -0
- package/build/__tests__/unit/screenState.test.d.ts.map +1 -0
- package/build/__tests__/unit/screenState.test.js +384 -0
- package/build/__tests__/unit/screenState.test.js.map +1 -0
- package/build/__tests__/unit/screenshot-diff.test.d.ts +2 -0
- package/build/__tests__/unit/screenshot-diff.test.d.ts.map +1 -0
- package/build/__tests__/unit/screenshot-diff.test.js +97 -0
- package/build/__tests__/unit/screenshot-diff.test.js.map +1 -0
- package/build/__tests__/unit/tap-evidence.test.d.ts +2 -0
- package/build/__tests__/unit/tap-evidence.test.d.ts.map +1 -0
- package/build/__tests__/unit/tap-evidence.test.js +89 -0
- package/build/__tests__/unit/tap-evidence.test.js.map +1 -0
- package/build/__tests__/unit/tap.test.d.ts +2 -0
- package/build/__tests__/unit/tap.test.d.ts.map +1 -0
- package/build/__tests__/unit/tap.test.js +767 -0
- package/build/__tests__/unit/tap.test.js.map +1 -0
- package/build/__tests__/unit/timeoutClamp.test.d.ts +2 -0
- package/build/__tests__/unit/timeoutClamp.test.d.ts.map +1 -0
- package/build/__tests__/unit/timeoutClamp.test.js +17 -0
- package/build/__tests__/unit/timeoutClamp.test.js.map +1 -0
- package/build/__tests__/unit/toolDescriptions.test.d.ts +2 -0
- package/build/__tests__/unit/toolDescriptions.test.d.ts.map +1 -0
- package/build/__tests__/unit/toolDescriptions.test.js +145 -0
- package/build/__tests__/unit/toolDescriptions.test.js.map +1 -0
- package/build/__tests__/unit/transportClassify.test.d.ts +2 -0
- package/build/__tests__/unit/transportClassify.test.d.ts.map +1 -0
- package/build/__tests__/unit/transportClassify.test.js +60 -0
- package/build/__tests__/unit/transportClassify.test.js.map +1 -0
- package/build/__tests__/unit/verifyAction.test.d.ts +2 -0
- package/build/__tests__/unit/verifyAction.test.d.ts.map +1 -0
- package/build/__tests__/unit/verifyAction.test.js +26 -0
- package/build/__tests__/unit/verifyAction.test.js.map +1 -0
- package/build/core/android.d.ts +299 -0
- package/build/core/android.d.ts.map +1 -0
- package/build/core/android.js +1582 -0
- package/build/core/android.js.map +1 -0
- package/build/core/appDetection.d.ts +20 -0
- package/build/core/appDetection.d.ts.map +1 -0
- package/build/core/appDetection.js +167 -0
- package/build/core/appDetection.js.map +1 -0
- package/build/core/bundle.d.ts +49 -0
- package/build/core/bundle.d.ts.map +1 -0
- package/build/core/bundle.js +356 -0
- package/build/core/bundle.js.map +1 -0
- package/build/core/componentSearch.d.ts +41 -0
- package/build/core/componentSearch.d.ts.map +1 -0
- package/build/core/componentSearch.js +588 -0
- package/build/core/componentSearch.js.map +1 -0
- package/build/core/componentTree.d.ts +13 -0
- package/build/core/componentTree.d.ts.map +1 -0
- package/build/core/componentTree.js +275 -0
- package/build/core/componentTree.js.map +1 -0
- package/build/core/config.d.ts +9 -0
- package/build/core/config.d.ts.map +1 -0
- package/build/core/config.js +28 -0
- package/build/core/config.js.map +1 -0
- package/build/core/connection.d.ts +102 -0
- package/build/core/connection.d.ts.map +1 -0
- package/build/core/connection.js +1710 -0
- package/build/core/connection.js.map +1 -0
- package/build/core/connectionState.d.ts +122 -0
- package/build/core/connectionState.d.ts.map +1 -0
- package/build/core/connectionState.js +313 -0
- package/build/core/connectionState.js.map +1 -0
- package/build/core/debugGlobals.d.ts +6 -0
- package/build/core/debugGlobals.d.ts.map +1 -0
- package/build/core/debugGlobals.js +370 -0
- package/build/core/debugGlobals.js.map +1 -0
- package/build/core/deviceDiscovery.d.ts +52 -0
- package/build/core/deviceDiscovery.d.ts.map +1 -0
- package/build/core/deviceDiscovery.js +74 -0
- package/build/core/deviceDiscovery.js.map +1 -0
- package/build/core/deviceResolver.d.ts +44 -0
- package/build/core/deviceResolver.d.ts.map +1 -0
- package/build/core/deviceResolver.js +225 -0
- package/build/core/deviceResolver.js.map +1 -0
- package/build/core/errorScreenParser.d.ts +30 -0
- package/build/core/errorScreenParser.d.ts.map +1 -0
- package/build/core/errorScreenParser.js +198 -0
- package/build/core/errorScreenParser.js.map +1 -0
- package/build/core/errors.d.ts +14 -0
- package/build/core/errors.d.ts.map +1 -0
- package/build/core/errors.js +17 -0
- package/build/core/errors.js.map +1 -0
- package/build/core/escapeNonAscii.d.ts +18 -0
- package/build/core/escapeNonAscii.d.ts.map +1 -0
- package/build/core/escapeNonAscii.js +352 -0
- package/build/core/escapeNonAscii.js.map +1 -0
- package/build/core/exec.d.ts +22 -0
- package/build/core/exec.d.ts.map +1 -0
- package/build/core/exec.js +54 -0
- package/build/core/exec.js.map +1 -0
- package/build/core/executor.d.ts +9 -0
- package/build/core/executor.d.ts.map +1 -0
- package/build/core/executor.js +12 -0
- package/build/core/executor.js.map +1 -0
- package/build/core/failureArtifact.d.ts +120 -0
- package/build/core/failureArtifact.d.ts.map +1 -0
- package/build/core/failureArtifact.js +113 -0
- package/build/core/failureArtifact.js.map +1 -0
- package/build/core/fastRefreshRecorder.d.ts +23 -0
- package/build/core/fastRefreshRecorder.d.ts.map +1 -0
- package/build/core/fastRefreshRecorder.js +83 -0
- package/build/core/fastRefreshRecorder.js.map +1 -0
- package/build/core/fastRefreshTools.d.ts +19 -0
- package/build/core/fastRefreshTools.d.ts.map +1 -0
- package/build/core/fastRefreshTools.js +71 -0
- package/build/core/fastRefreshTools.js.map +1 -0
- package/build/core/feedback.d.ts +18 -0
- package/build/core/feedback.d.ts.map +1 -0
- package/build/core/feedback.js +73 -0
- package/build/core/feedback.js.map +1 -0
- package/build/core/fiberMatch.d.ts +25 -0
- package/build/core/fiberMatch.d.ts.map +1 -0
- package/build/core/fiberMatch.js +35 -0
- package/build/core/fiberMatch.js.map +1 -0
- package/build/core/fingerprint.d.ts +4 -0
- package/build/core/fingerprint.d.ts.map +1 -0
- package/build/core/fingerprint.js +47 -0
- package/build/core/fingerprint.js.map +1 -0
- package/build/core/focusedInput.d.ts +27 -0
- package/build/core/focusedInput.d.ts.map +1 -0
- package/build/core/focusedInput.js +110 -0
- package/build/core/focusedInput.js.map +1 -0
- package/build/core/focusedInputTools.d.ts +21 -0
- package/build/core/focusedInputTools.d.ts.map +1 -0
- package/build/core/focusedInputTools.js +51 -0
- package/build/core/focusedInputTools.js.map +1 -0
- package/build/core/format.d.ts +8 -0
- package/build/core/format.d.ts.map +1 -0
- package/build/core/format.js +34 -0
- package/build/core/format.js.map +1 -0
- package/build/core/guides.d.ts +21 -0
- package/build/core/guides.d.ts.map +1 -0
- package/build/core/guides.js +397 -0
- package/build/core/guides.js.map +1 -0
- package/build/core/iconSemantics.d.ts +18 -0
- package/build/core/iconSemantics.d.ts.map +1 -0
- package/build/core/iconSemantics.js +114 -0
- package/build/core/iconSemantics.js.map +1 -0
- package/build/core/imageBuffer.d.ts +37 -0
- package/build/core/imageBuffer.d.ts.map +1 -0
- package/build/core/imageBuffer.js +58 -0
- package/build/core/imageBuffer.js.map +1 -0
- package/build/core/index.d.ts +37 -0
- package/build/core/index.d.ts.map +1 -0
- package/build/core/index.js +66 -0
- package/build/core/index.js.map +1 -0
- package/build/core/inspector.d.ts +55 -0
- package/build/core/inspector.d.ts.map +1 -0
- package/build/core/inspector.js +603 -0
- package/build/core/inspector.js.map +1 -0
- package/build/core/ios.d.ts +263 -0
- package/build/core/ios.d.ts.map +1 -0
- package/build/core/ios.js +1705 -0
- package/build/core/ios.js.map +1 -0
- package/build/core/jsExecute.d.ts +62 -0
- package/build/core/jsExecute.d.ts.map +1 -0
- package/build/core/jsExecute.js +696 -0
- package/build/core/jsExecute.js.map +1 -0
- package/build/core/license.d.ts +48 -0
- package/build/core/license.d.ts.map +1 -0
- package/build/core/license.js +267 -0
- package/build/core/license.js.map +1 -0
- package/build/core/logbox.d.ts +58 -0
- package/build/core/logbox.d.ts.map +1 -0
- package/build/core/logbox.js +330 -0
- package/build/core/logbox.js.map +1 -0
- package/build/core/logs.d.ts +44 -0
- package/build/core/logs.d.ts.map +1 -0
- package/build/core/logs.js +149 -0
- package/build/core/logs.js.map +1 -0
- package/build/core/measureComponent.d.ts +19 -0
- package/build/core/measureComponent.d.ts.map +1 -0
- package/build/core/measureComponent.js +94 -0
- package/build/core/measureComponent.js.map +1 -0
- package/build/core/measureComponentTools.d.ts +6 -0
- package/build/core/measureComponentTools.d.ts.map +1 -0
- package/build/core/measureComponentTools.js +43 -0
- package/build/core/measureComponentTools.js.map +1 -0
- package/build/core/metro.d.ts +31 -0
- package/build/core/metro.d.ts.map +1 -0
- package/build/core/metro.js +124 -0
- package/build/core/metro.js.map +1 -0
- package/build/core/nativeOnlyHints.d.ts +14 -0
- package/build/core/nativeOnlyHints.d.ts.map +1 -0
- package/build/core/nativeOnlyHints.js +58 -0
- package/build/core/nativeOnlyHints.js.map +1 -0
- package/build/core/network.d.ts +43 -0
- package/build/core/network.d.ts.map +1 -0
- package/build/core/network.js +217 -0
- package/build/core/network.js.map +1 -0
- package/build/core/networkInterceptor.d.ts +30 -0
- package/build/core/networkInterceptor.d.ts.map +1 -0
- package/build/core/networkInterceptor.js +211 -0
- package/build/core/networkInterceptor.js.map +1 -0
- package/build/core/ocr.d.ts +87 -0
- package/build/core/ocr.d.ts.map +1 -0
- package/build/core/ocr.js +335 -0
- package/build/core/ocr.js.map +1 -0
- package/build/core/paths.d.ts +2 -0
- package/build/core/paths.d.ts.map +1 -0
- package/build/core/paths.js +28 -0
- package/build/core/paths.js.map +1 -0
- package/build/core/posthog.d.ts +5 -0
- package/build/core/posthog.d.ts.map +1 -0
- package/build/core/posthog.js +52 -0
- package/build/core/posthog.js.map +1 -0
- package/build/core/pressables.d.ts +46 -0
- package/build/core/pressables.d.ts.map +1 -0
- package/build/core/pressables.js +1719 -0
- package/build/core/pressables.js.map +1 -0
- package/build/core/probe.d.ts +12 -0
- package/build/core/probe.d.ts.map +1 -0
- package/build/core/probe.js +56 -0
- package/build/core/probe.js.map +1 -0
- package/build/core/redux.d.ts +22 -0
- package/build/core/redux.d.ts.map +1 -0
- package/build/core/redux.js +116 -0
- package/build/core/redux.js.map +1 -0
- package/build/core/register.d.ts +8 -0
- package/build/core/register.d.ts.map +1 -0
- package/build/core/register.js +202 -0
- package/build/core/register.js.map +1 -0
- package/build/core/rnGlobalsBootstrap.d.ts +16 -0
- package/build/core/rnGlobalsBootstrap.d.ts.map +1 -0
- package/build/core/rnGlobalsBootstrap.js +116 -0
- package/build/core/rnGlobalsBootstrap.js.map +1 -0
- package/build/core/screenLayout.d.ts +53 -0
- package/build/core/screenLayout.d.ts.map +1 -0
- package/build/core/screenLayout.js +878 -0
- package/build/core/screenLayout.js.map +1 -0
- package/build/core/screenState.d.ts +166 -0
- package/build/core/screenState.d.ts.map +1 -0
- package/build/core/screenState.js +1352 -0
- package/build/core/screenState.js.map +1 -0
- package/build/core/sdkBridge.d.ts +67 -0
- package/build/core/sdkBridge.d.ts.map +1 -0
- package/build/core/sdkBridge.js +148 -0
- package/build/core/sdkBridge.js.map +1 -0
- package/build/core/state.d.ts +37 -0
- package/build/core/state.d.ts.map +1 -0
- package/build/core/state.js +124 -0
- package/build/core/state.js.map +1 -0
- package/build/core/telemetry.d.ts +50 -0
- package/build/core/telemetry.d.ts.map +1 -0
- package/build/core/telemetry.js +653 -0
- package/build/core/telemetry.js.map +1 -0
- package/build/core/toolHelpers.d.ts +24 -0
- package/build/core/toolHelpers.d.ts.map +1 -0
- package/build/core/toolHelpers.js +118 -0
- package/build/core/toolHelpers.js.map +1 -0
- package/build/core/types.d.ts +162 -0
- package/build/core/types.d.ts.map +1 -0
- package/build/core/types.js +2 -0
- package/build/core/types.js.map +1 -0
- package/build/index.d.ts +4 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +132 -0
- package/build/index.js.map +1 -0
- package/build/pro/screenshot-diff.d.ts +10 -0
- package/build/pro/screenshot-diff.d.ts.map +1 -0
- package/build/pro/screenshot-diff.js +38 -0
- package/build/pro/screenshot-diff.js.map +1 -0
- package/build/pro/tap.d.ts +291 -0
- package/build/pro/tap.d.ts.map +1 -0
- package/build/pro/tap.js +1839 -0
- package/build/pro/tap.js.map +1 -0
- package/build/pro/verifyAction.d.ts +50 -0
- package/build/pro/verifyAction.d.ts.map +1 -0
- package/build/pro/verifyAction.js +285 -0
- package/build/pro/verifyAction.js.map +1 -0
- package/build/tools/_deviceArg.d.ts +45 -0
- package/build/tools/_deviceArg.d.ts.map +1 -0
- package/build/tools/_deviceArg.js +58 -0
- package/build/tools/_deviceArg.js.map +1 -0
- package/build/tools/accountTools.d.ts +46 -0
- package/build/tools/accountTools.d.ts.map +1 -0
- package/build/tools/accountTools.js +223 -0
- package/build/tools/accountTools.js.map +1 -0
- package/build/tools/bundleTools.d.ts +3 -0
- package/build/tools/bundleTools.d.ts.map +1 -0
- package/build/tools/bundleTools.js +375 -0
- package/build/tools/bundleTools.js.map +1 -0
- package/build/tools/componentTools.d.ts +3 -0
- package/build/tools/componentTools.d.ts.map +1 -0
- package/build/tools/componentTools.js +746 -0
- package/build/tools/componentTools.js.map +1 -0
- package/build/tools/connectionTools.d.ts +3 -0
- package/build/tools/connectionTools.d.ts.map +1 -0
- package/build/tools/connectionTools.js +625 -0
- package/build/tools/connectionTools.js.map +1 -0
- package/build/tools/deviceTools.d.ts +3 -0
- package/build/tools/deviceTools.d.ts.map +1 -0
- package/build/tools/deviceTools.js +423 -0
- package/build/tools/deviceTools.js.map +1 -0
- package/build/tools/executionTools.d.ts +3 -0
- package/build/tools/executionTools.d.ts.map +1 -0
- package/build/tools/executionTools.js +243 -0
- package/build/tools/executionTools.js.map +1 -0
- package/build/tools/interactionTools.d.ts +3 -0
- package/build/tools/interactionTools.d.ts.map +1 -0
- package/build/tools/interactionTools.js +539 -0
- package/build/tools/interactionTools.js.map +1 -0
- package/build/tools/logTools.d.ts +3 -0
- package/build/tools/logTools.d.ts.map +1 -0
- package/build/tools/logTools.js +371 -0
- package/build/tools/logTools.js.map +1 -0
- package/build/tools/metaTools.d.ts +7 -0
- package/build/tools/metaTools.d.ts.map +1 -0
- package/build/tools/metaTools.js +186 -0
- package/build/tools/metaTools.js.map +1 -0
- package/build/tools/networkTools.d.ts +3 -0
- package/build/tools/networkTools.d.ts.map +1 -0
- package/build/tools/networkTools.js +478 -0
- package/build/tools/networkTools.js.map +1 -0
- package/build/tools/reduxTools.d.ts +3 -0
- package/build/tools/reduxTools.d.ts.map +1 -0
- package/build/tools/reduxTools.js +83 -0
- package/build/tools/reduxTools.js.map +1 -0
- package/build/tools/screenshotTools.d.ts +3 -0
- package/build/tools/screenshotTools.d.ts.map +1 -0
- package/build/tools/screenshotTools.js +703 -0
- package/build/tools/screenshotTools.js.map +1 -0
- package/package.json +63 -2
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { describe, expect, it, jest } from "@jest/globals";
|
|
2
|
+
import { getRefreshStatus } from "../../core/fastRefreshTools.js";
|
|
3
|
+
function makeExecute(result) {
|
|
4
|
+
return jest.fn(async () => result);
|
|
5
|
+
}
|
|
6
|
+
describe("getRefreshStatus", () => {
|
|
7
|
+
it("returns mapped fields on success", async () => {
|
|
8
|
+
const execute = makeExecute({
|
|
9
|
+
success: true,
|
|
10
|
+
result: {
|
|
11
|
+
lastUpdateAt: 1700000000000,
|
|
12
|
+
updateCount: 2,
|
|
13
|
+
recentUpdates: [
|
|
14
|
+
{ at: 1700000000000, modulePath: "language-list-item.tsx" },
|
|
15
|
+
{ at: 1699999999000, modulePath: "language-list-item.tsx" },
|
|
16
|
+
],
|
|
17
|
+
_meta: { recorderInstalled: true, via: "performReactRefresh", justInstalled: false },
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
const r = await getRefreshStatus({}, execute);
|
|
21
|
+
expect(r.success).toBe(true);
|
|
22
|
+
expect(r.lastUpdateAt).toBe(1700000000000);
|
|
23
|
+
expect(r.updateCount).toBe(2);
|
|
24
|
+
expect(r.recentUpdates).toHaveLength(2);
|
|
25
|
+
expect(r.justInstalled).toBe(false);
|
|
26
|
+
});
|
|
27
|
+
it("surfaces justInstalled:true on the bootstrap call", async () => {
|
|
28
|
+
const execute = makeExecute({
|
|
29
|
+
success: true,
|
|
30
|
+
result: {
|
|
31
|
+
lastUpdateAt: null,
|
|
32
|
+
updateCount: 0,
|
|
33
|
+
recentUpdates: [],
|
|
34
|
+
_meta: { recorderInstalled: true, via: "performReactRefresh", justInstalled: true },
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
const r = await getRefreshStatus({}, execute);
|
|
38
|
+
expect(r.success).toBe(true);
|
|
39
|
+
expect(r.justInstalled).toBe(true);
|
|
40
|
+
expect(r.updateCount).toBe(0);
|
|
41
|
+
});
|
|
42
|
+
it("returns failure when recorder install failed (no hook points)", async () => {
|
|
43
|
+
const execute = makeExecute({
|
|
44
|
+
success: true,
|
|
45
|
+
result: {
|
|
46
|
+
lastUpdateAt: null,
|
|
47
|
+
updateCount: 0,
|
|
48
|
+
recentUpdates: [],
|
|
49
|
+
_meta: { recorderInstalled: false, via: null, reason: "no __ReactRefresh and no $RefreshReg$" },
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
const r = await getRefreshStatus({}, execute);
|
|
53
|
+
expect(r.success).toBe(false);
|
|
54
|
+
expect(r.error).toContain("no __ReactRefresh");
|
|
55
|
+
});
|
|
56
|
+
it("forwards executor errors verbatim", async () => {
|
|
57
|
+
const execute = makeExecute({
|
|
58
|
+
success: false,
|
|
59
|
+
error: "No apps connected. Run 'scan_metro' first.",
|
|
60
|
+
});
|
|
61
|
+
const r = await getRefreshStatus({}, execute);
|
|
62
|
+
expect(r.success).toBe(false);
|
|
63
|
+
expect(r.error).toContain("No apps connected");
|
|
64
|
+
});
|
|
65
|
+
it("passes sincePath into the expression builder", async () => {
|
|
66
|
+
const execute = makeExecute({
|
|
67
|
+
success: true,
|
|
68
|
+
result: {
|
|
69
|
+
lastUpdateAt: null,
|
|
70
|
+
updateCount: 0,
|
|
71
|
+
recentUpdates: [],
|
|
72
|
+
_meta: { recorderInstalled: true, via: "performReactRefresh" },
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
await getRefreshStatus({ sincePath: "language-list-item" }, execute);
|
|
76
|
+
expect(execute.mock.calls[0][0]).toContain("language-list-item");
|
|
77
|
+
});
|
|
78
|
+
it("passes since epoch into the expression builder", async () => {
|
|
79
|
+
const execute = makeExecute({
|
|
80
|
+
success: true,
|
|
81
|
+
result: {
|
|
82
|
+
lastUpdateAt: null,
|
|
83
|
+
updateCount: 0,
|
|
84
|
+
recentUpdates: [],
|
|
85
|
+
_meta: { recorderInstalled: true, via: "performReactRefresh" },
|
|
86
|
+
},
|
|
87
|
+
});
|
|
88
|
+
await getRefreshStatus({ since: 1700000000000 }, execute);
|
|
89
|
+
expect(execute.mock.calls[0][0]).toContain("1700000000000");
|
|
90
|
+
});
|
|
91
|
+
it("propagates the device argument", async () => {
|
|
92
|
+
const execute = makeExecute({
|
|
93
|
+
success: true,
|
|
94
|
+
result: {
|
|
95
|
+
lastUpdateAt: null,
|
|
96
|
+
updateCount: 0,
|
|
97
|
+
recentUpdates: [],
|
|
98
|
+
_meta: { recorderInstalled: true, via: "performReactRefresh" },
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
await getRefreshStatus({ device: "iPhone Air" }, execute);
|
|
102
|
+
expect(execute.mock.calls[0][3]).toBe("iPhone Air");
|
|
103
|
+
});
|
|
104
|
+
it("rejects sincePath with double quotes via the builder", async () => {
|
|
105
|
+
const execute = makeExecute({ success: true, result: "{}" });
|
|
106
|
+
const r = await getRefreshStatus({ sincePath: '"; drop"' }, execute);
|
|
107
|
+
expect(r.success).toBe(false);
|
|
108
|
+
expect(r.error).toContain("double quotes");
|
|
109
|
+
expect(execute).not.toHaveBeenCalled();
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
//# sourceMappingURL=fastRefreshTools.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fastRefreshTools.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/fastRefreshTools.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fiberMatch.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/fiberMatch.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { describe, it, expect } from "@jest/globals";
|
|
2
|
+
import { matchFiberCandidates } from "../../core/fiberMatch.js";
|
|
3
|
+
function candidate(overrides = {}) {
|
|
4
|
+
return {
|
|
5
|
+
name: "Pressable",
|
|
6
|
+
meaningfulComponentName: null,
|
|
7
|
+
text: "",
|
|
8
|
+
testID: null,
|
|
9
|
+
ancestorTestIDs: [],
|
|
10
|
+
isInput: false,
|
|
11
|
+
isPressable: true,
|
|
12
|
+
source: "direct",
|
|
13
|
+
...overrides,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
describe("matchFiberCandidates", () => {
|
|
17
|
+
it("matches pressable by its own testID (regression)", () => {
|
|
18
|
+
const list = [
|
|
19
|
+
candidate({ testID: "other" }),
|
|
20
|
+
candidate({ testID: "submit-btn" }),
|
|
21
|
+
candidate({ testID: null }),
|
|
22
|
+
];
|
|
23
|
+
const r = matchFiberCandidates(list, { testID: "submit-btn" });
|
|
24
|
+
expect(r).not.toBeNull();
|
|
25
|
+
expect(r.matchIndex).toBe(1);
|
|
26
|
+
expect(r.totalMatches).toBe(1);
|
|
27
|
+
});
|
|
28
|
+
it("matches pressable by ancestor testID when its own testID does not match", () => {
|
|
29
|
+
const list = [
|
|
30
|
+
candidate({ testID: null, ancestorTestIDs: ["walk-detail-delete-button"] }),
|
|
31
|
+
candidate({ testID: "other", ancestorTestIDs: ["unrelated"] }),
|
|
32
|
+
];
|
|
33
|
+
const r = matchFiberCandidates(list, { testID: "walk-detail-delete-button" });
|
|
34
|
+
expect(r).not.toBeNull();
|
|
35
|
+
expect(r.matchIndex).toBe(0);
|
|
36
|
+
});
|
|
37
|
+
it("matches pressable by its own fiber name (regression)", () => {
|
|
38
|
+
const list = [
|
|
39
|
+
candidate({ name: "Pressable" }),
|
|
40
|
+
candidate({ name: "TouchableOpacity" }),
|
|
41
|
+
];
|
|
42
|
+
const r = matchFiberCandidates(list, { component: "Touchable" });
|
|
43
|
+
expect(r).not.toBeNull();
|
|
44
|
+
expect(r.matchIndex).toBe(1);
|
|
45
|
+
});
|
|
46
|
+
it("matches pressable by meaningfulComponentName when own name is generic", () => {
|
|
47
|
+
const list = [
|
|
48
|
+
candidate({ name: "Pressable", meaningfulComponentName: "AddDetailsButton" }),
|
|
49
|
+
candidate({ name: "Pressable", meaningfulComponentName: "OtherButton" }),
|
|
50
|
+
];
|
|
51
|
+
const r = matchFiberCandidates(list, { component: "AddDetailsButton" });
|
|
52
|
+
expect(r).not.toBeNull();
|
|
53
|
+
expect(r.matchIndex).toBe(0);
|
|
54
|
+
});
|
|
55
|
+
it("component matching is case-insensitive substring", () => {
|
|
56
|
+
const list = [candidate({ name: "Pressable", meaningfulComponentName: "PickerTrigger" })];
|
|
57
|
+
const r = matchFiberCandidates(list, { component: "picker" });
|
|
58
|
+
expect(r).not.toBeNull();
|
|
59
|
+
expect(r.matchIndex).toBe(0);
|
|
60
|
+
});
|
|
61
|
+
it("respects index when multiple candidates match", () => {
|
|
62
|
+
const list = [
|
|
63
|
+
candidate({ name: "Pressable", meaningfulComponentName: "RowButton", text: "A" }),
|
|
64
|
+
candidate({ name: "Pressable", meaningfulComponentName: "RowButton", text: "B" }),
|
|
65
|
+
candidate({ name: "Pressable", meaningfulComponentName: "RowButton", text: "C" }),
|
|
66
|
+
];
|
|
67
|
+
const r = matchFiberCandidates(list, { component: "RowButton", index: 2 });
|
|
68
|
+
expect(r).not.toBeNull();
|
|
69
|
+
expect(r.matchIndex).toBe(2);
|
|
70
|
+
expect(r.totalMatches).toBe(3);
|
|
71
|
+
expect(r.allMatches).toEqual([0, 1, 2]);
|
|
72
|
+
});
|
|
73
|
+
it("returns null when nothing matches", () => {
|
|
74
|
+
const list = [candidate({ testID: "a", name: "Pressable" })];
|
|
75
|
+
const r = matchFiberCandidates(list, { testID: "does-not-exist" });
|
|
76
|
+
expect(r).toBeNull();
|
|
77
|
+
});
|
|
78
|
+
it("returns null when index is out of range", () => {
|
|
79
|
+
const list = [candidate({ testID: "a" })];
|
|
80
|
+
const r = matchFiberCandidates(list, { testID: "a", index: 3 });
|
|
81
|
+
expect(r).toBeNull();
|
|
82
|
+
});
|
|
83
|
+
it("combines text, testID, and component with AND semantics", () => {
|
|
84
|
+
const list = [
|
|
85
|
+
candidate({
|
|
86
|
+
name: "Pressable",
|
|
87
|
+
meaningfulComponentName: "SubmitButton",
|
|
88
|
+
testID: "submit",
|
|
89
|
+
text: "Send it",
|
|
90
|
+
}),
|
|
91
|
+
candidate({
|
|
92
|
+
name: "Pressable",
|
|
93
|
+
meaningfulComponentName: "SubmitButton",
|
|
94
|
+
testID: "submit",
|
|
95
|
+
text: "Cancel",
|
|
96
|
+
}),
|
|
97
|
+
];
|
|
98
|
+
const r = matchFiberCandidates(list, {
|
|
99
|
+
text: "send",
|
|
100
|
+
testID: "submit",
|
|
101
|
+
component: "SubmitButton",
|
|
102
|
+
});
|
|
103
|
+
expect(r).not.toBeNull();
|
|
104
|
+
expect(r.matchIndex).toBe(0);
|
|
105
|
+
expect(r.totalMatches).toBe(1);
|
|
106
|
+
});
|
|
107
|
+
it("text matching is case-insensitive substring", () => {
|
|
108
|
+
const list = [candidate({ text: "Hello World" })];
|
|
109
|
+
const r = matchFiberCandidates(list, { text: "hello" });
|
|
110
|
+
expect(r).not.toBeNull();
|
|
111
|
+
expect(r.matchIndex).toBe(0);
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
//# sourceMappingURL=fiberMatch.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fiberMatch.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/fiberMatch.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fingerprint.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/fingerprint.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { jest } from "@jest/globals";
|
|
2
|
+
// Pass-through mocks: spread the real module so any export the deferred setup
|
|
3
|
+
// or transitive deps consume (e.g. child_process.exec) keeps working. Using
|
|
4
|
+
// the `node:` protocol bypasses Jest's mock registry for the inner lookup,
|
|
5
|
+
// since unstable_mockModule below is keyed on the bare specifier.
|
|
6
|
+
const realChildProcess = await import("node:child_process");
|
|
7
|
+
const realFs = await import("node:fs");
|
|
8
|
+
const realOs = await import("node:os");
|
|
9
|
+
const mockExecSync = jest.fn();
|
|
10
|
+
jest.unstable_mockModule("child_process", () => ({
|
|
11
|
+
...realChildProcess,
|
|
12
|
+
execSync: mockExecSync,
|
|
13
|
+
}));
|
|
14
|
+
const mockReadFileSync = jest.fn();
|
|
15
|
+
const mockExistsSync = jest.fn();
|
|
16
|
+
jest.unstable_mockModule("fs", () => ({
|
|
17
|
+
...realFs,
|
|
18
|
+
readFileSync: mockReadFileSync,
|
|
19
|
+
existsSync: mockExistsSync,
|
|
20
|
+
}));
|
|
21
|
+
const mockUserInfo = jest.fn();
|
|
22
|
+
const mockCpus = jest.fn();
|
|
23
|
+
const mockPlatform = jest.fn();
|
|
24
|
+
jest.unstable_mockModule("os", () => ({
|
|
25
|
+
...realOs,
|
|
26
|
+
userInfo: mockUserInfo,
|
|
27
|
+
cpus: mockCpus,
|
|
28
|
+
platform: mockPlatform,
|
|
29
|
+
}));
|
|
30
|
+
const { getDeviceFingerprint, getMachineId } = await import("../../core/fingerprint.js");
|
|
31
|
+
describe("fingerprint", () => {
|
|
32
|
+
beforeEach(() => {
|
|
33
|
+
jest.clearAllMocks();
|
|
34
|
+
mockUserInfo.mockReturnValue({ username: "testuser" });
|
|
35
|
+
mockCpus.mockReturnValue([{ model: "Apple M2 Pro" }]);
|
|
36
|
+
});
|
|
37
|
+
describe("getMachineId", () => {
|
|
38
|
+
it("reads hardware UUID on macOS", () => {
|
|
39
|
+
mockPlatform.mockReturnValue("darwin");
|
|
40
|
+
mockExecSync.mockReturnValue("Hardware UUID: ABC123-DEF456-GHI789\n");
|
|
41
|
+
const id = getMachineId();
|
|
42
|
+
expect(id).toBe("ABC123-DEF456-GHI789");
|
|
43
|
+
expect(mockExecSync).toHaveBeenCalledWith("system_profiler SPHardwareDataType", expect.any(Object));
|
|
44
|
+
});
|
|
45
|
+
it("reads /etc/machine-id on Linux", () => {
|
|
46
|
+
mockPlatform.mockReturnValue("linux");
|
|
47
|
+
mockExistsSync.mockReturnValue(true);
|
|
48
|
+
mockReadFileSync.mockReturnValue("abc123def456\n");
|
|
49
|
+
const id = getMachineId();
|
|
50
|
+
expect(id).toBe("abc123def456");
|
|
51
|
+
});
|
|
52
|
+
it("reads MachineGuid from registry on Windows", () => {
|
|
53
|
+
mockPlatform.mockReturnValue("win32");
|
|
54
|
+
mockExecSync.mockReturnValue(" MachineGuid REG_SZ {12345-ABCDE}\n");
|
|
55
|
+
const id = getMachineId();
|
|
56
|
+
expect(id).toBe("{12345-ABCDE}");
|
|
57
|
+
});
|
|
58
|
+
it("returns empty string on unsupported platform", () => {
|
|
59
|
+
mockPlatform.mockReturnValue("freebsd");
|
|
60
|
+
const id = getMachineId();
|
|
61
|
+
expect(id).toBe("");
|
|
62
|
+
});
|
|
63
|
+
it("returns empty string when command fails", () => {
|
|
64
|
+
mockPlatform.mockReturnValue("darwin");
|
|
65
|
+
mockExecSync.mockImplementation(() => {
|
|
66
|
+
throw new Error("command not found");
|
|
67
|
+
});
|
|
68
|
+
const id = getMachineId();
|
|
69
|
+
expect(id).toBe("");
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
describe("getDeviceFingerprint", () => {
|
|
73
|
+
it("returns consistent SHA256 hash", () => {
|
|
74
|
+
mockPlatform.mockReturnValue("darwin");
|
|
75
|
+
mockExecSync.mockReturnValue("Hardware UUID: ABC123\n");
|
|
76
|
+
const fp1 = getDeviceFingerprint();
|
|
77
|
+
const fp2 = getDeviceFingerprint();
|
|
78
|
+
expect(fp1).toBe(fp2);
|
|
79
|
+
expect(fp1).toMatch(/^[a-f0-9]{64}$/);
|
|
80
|
+
});
|
|
81
|
+
it("produces different hashes for different inputs", () => {
|
|
82
|
+
mockPlatform.mockReturnValue("darwin");
|
|
83
|
+
mockExecSync.mockReturnValue("Hardware UUID: ABC123\n");
|
|
84
|
+
const fp1 = getDeviceFingerprint();
|
|
85
|
+
mockUserInfo.mockReturnValue({ username: "otheruser" });
|
|
86
|
+
const fp2 = getDeviceFingerprint();
|
|
87
|
+
expect(fp1).not.toBe(fp2);
|
|
88
|
+
});
|
|
89
|
+
it("still produces a hash when machineId is unavailable (degraded mode)", () => {
|
|
90
|
+
mockPlatform.mockReturnValue("darwin");
|
|
91
|
+
mockExecSync.mockImplementation(() => {
|
|
92
|
+
throw new Error("permission denied");
|
|
93
|
+
});
|
|
94
|
+
const fp = getDeviceFingerprint();
|
|
95
|
+
expect(fp).toMatch(/^[a-f0-9]{64}$/);
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
//# sourceMappingURL=fingerprint.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fingerprint.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/fingerprint.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"focusedInput.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/focusedInput.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { describe, expect, it } from "@jest/globals";
|
|
2
|
+
import { buildFindFocusedInputExpression, buildClearFocusedInputExpression, buildDismissKeyboardExpression } from "../../core/focusedInput.js";
|
|
3
|
+
describe("buildFindFocusedInputExpression", () => {
|
|
4
|
+
it("includes the React DevTools hook and fiber-root walk", () => {
|
|
5
|
+
const expr = buildFindFocusedInputExpression();
|
|
6
|
+
expect(expr).toContain("__REACT_DEVTOOLS_GLOBAL_HOOK__");
|
|
7
|
+
expect(expr).toContain("getFiberRoots");
|
|
8
|
+
expect(expr).toContain("RCTSinglelineTextInputView");
|
|
9
|
+
expect(expr).toContain("RCTMultilineTextInputView");
|
|
10
|
+
expect(expr).toContain("AndroidTextInput");
|
|
11
|
+
});
|
|
12
|
+
it("handles string-type host fibers (Fabric)", () => {
|
|
13
|
+
const expr = buildFindFocusedInputExpression();
|
|
14
|
+
// The Fabric path requires recognizing host fibers whose `type` is a string,
|
|
15
|
+
// not a class with displayName. The getName helper applies a typeof === "string" check.
|
|
16
|
+
expect(expr).toMatch(/typeof\s+\w+\s*===\s*['"]string['"]/);
|
|
17
|
+
});
|
|
18
|
+
it("climbs .return to find a fiber with onChangeText", () => {
|
|
19
|
+
const expr = buildFindFocusedInputExpression();
|
|
20
|
+
expect(expr).toContain("onChangeText");
|
|
21
|
+
expect(expr).toContain(".return");
|
|
22
|
+
});
|
|
23
|
+
it("returns a parseable expression (IIFE)", () => {
|
|
24
|
+
const expr = buildFindFocusedInputExpression();
|
|
25
|
+
expect(expr.trim()).toMatch(/^\(\(\)\s*=>\s*\{/);
|
|
26
|
+
expect(expr.trim()).toMatch(/\}\)\(\)$/);
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
describe("buildClearFocusedInputExpression", () => {
|
|
30
|
+
it("calls onChangeText('') on the controlled fiber", () => {
|
|
31
|
+
const expr = buildClearFocusedInputExpression();
|
|
32
|
+
expect(expr).toContain(`onChangeText("")`);
|
|
33
|
+
});
|
|
34
|
+
it("falls back to publicInstance.clear when no onChangeText ancestor", () => {
|
|
35
|
+
const expr = buildClearFocusedInputExpression();
|
|
36
|
+
expect(expr).toContain("pub.clear()");
|
|
37
|
+
expect(expr).toContain(`via: "publicInstance"`);
|
|
38
|
+
});
|
|
39
|
+
it("returns cleared:true with the via field on success", () => {
|
|
40
|
+
const expr = buildClearFocusedInputExpression();
|
|
41
|
+
expect(expr).toMatch(/cleared:\s*true,\s*via:\s*"onChangeText"/);
|
|
42
|
+
});
|
|
43
|
+
it("returns cleared:false with reason when nothing focused", () => {
|
|
44
|
+
const expr = buildClearFocusedInputExpression();
|
|
45
|
+
expect(expr).toContain(`cleared: false, reason: "no focused TextInput`);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
describe("buildDismissKeyboardExpression", () => {
|
|
49
|
+
it("calls publicInstance.blur()", () => {
|
|
50
|
+
const expr = buildDismissKeyboardExpression();
|
|
51
|
+
expect(expr).toContain("pub.blur()");
|
|
52
|
+
});
|
|
53
|
+
it("returns dismissed:false with reason when nothing focused", () => {
|
|
54
|
+
const expr = buildDismissKeyboardExpression();
|
|
55
|
+
expect(expr).toContain(`dismissed: false, reason: "no focused TextInput`);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
//# sourceMappingURL=focusedInput.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"focusedInput.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/focusedInput.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"focusedInputTools.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/focusedInputTools.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { describe, expect, it, jest } from "@jest/globals";
|
|
2
|
+
import { clearFocusedInput, dismissKeyboard, inputTextWithReplace } from "../../core/focusedInputTools.js";
|
|
3
|
+
const okExecute = (result) => jest.fn(async () => ({ success: true, result: JSON.stringify(result) }));
|
|
4
|
+
const errExecute = (error) => jest.fn(async () => ({ success: false, error }));
|
|
5
|
+
describe("clearFocusedInput", () => {
|
|
6
|
+
it("returns success when executor reports cleared via onChangeText", async () => {
|
|
7
|
+
const result = await clearFocusedInput(undefined, okExecute({ cleared: true, via: "onChangeText" }));
|
|
8
|
+
expect(result.success).toBe(true);
|
|
9
|
+
expect(result.via).toBe("onChangeText");
|
|
10
|
+
});
|
|
11
|
+
it("returns success with fallback flag when via=publicInstance", async () => {
|
|
12
|
+
const result = await clearFocusedInput(undefined, okExecute({ cleared: true, via: "publicInstance" }));
|
|
13
|
+
expect(result.success).toBe(true);
|
|
14
|
+
expect(result.via).toBe("publicInstance");
|
|
15
|
+
});
|
|
16
|
+
it("returns failure when no input focused", async () => {
|
|
17
|
+
const result = await clearFocusedInput(undefined, okExecute({ cleared: false, reason: "no focused TextInput" }));
|
|
18
|
+
expect(result.success).toBe(false);
|
|
19
|
+
expect(result.error).toContain("no focused TextInput");
|
|
20
|
+
});
|
|
21
|
+
it("returns failure when executor itself fails", async () => {
|
|
22
|
+
const result = await clearFocusedInput(undefined, errExecute("No apps connected. Run 'scan_metro' first."));
|
|
23
|
+
expect(result.success).toBe(false);
|
|
24
|
+
expect(result.error).toContain("No apps connected");
|
|
25
|
+
});
|
|
26
|
+
it("passes the device argument through to the executor", async () => {
|
|
27
|
+
const exec = jest.fn(async () => ({
|
|
28
|
+
success: true,
|
|
29
|
+
result: JSON.stringify({ cleared: true, via: "onChangeText" })
|
|
30
|
+
}));
|
|
31
|
+
await clearFocusedInput("iPhone 15", exec);
|
|
32
|
+
expect(exec).toHaveBeenCalledWith(expect.any(String), "iPhone 15");
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
describe("dismissKeyboard", () => {
|
|
36
|
+
it("returns success with nativeTag on dismiss", async () => {
|
|
37
|
+
const result = await dismissKeyboard(undefined, okExecute({ dismissed: true, nativeTag: 42 }));
|
|
38
|
+
expect(result.success).toBe(true);
|
|
39
|
+
expect(result.nativeTag).toBe(42);
|
|
40
|
+
});
|
|
41
|
+
it("returns failure when nothing focused", async () => {
|
|
42
|
+
const result = await dismissKeyboard(undefined, okExecute({ dismissed: false, reason: "no focused TextInput" }));
|
|
43
|
+
expect(result.success).toBe(false);
|
|
44
|
+
expect(result.error).toContain("no focused TextInput");
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
describe("inputTextWithReplace", () => {
|
|
48
|
+
it("calls the clear fn before the type fn when replace=true", async () => {
|
|
49
|
+
const order = [];
|
|
50
|
+
const clearFn = jest.fn(async () => {
|
|
51
|
+
order.push("clear");
|
|
52
|
+
return { success: true, via: "onChangeText" };
|
|
53
|
+
});
|
|
54
|
+
const typeFn = jest.fn(async (_t) => {
|
|
55
|
+
order.push("type");
|
|
56
|
+
return { success: true, result: "ok" };
|
|
57
|
+
});
|
|
58
|
+
const res = await inputTextWithReplace("hello", true, typeFn, clearFn);
|
|
59
|
+
expect(res.success).toBe(true);
|
|
60
|
+
expect(order).toEqual(["clear", "type"]);
|
|
61
|
+
expect(typeFn).toHaveBeenCalledWith("hello");
|
|
62
|
+
});
|
|
63
|
+
it("skips clear when replace=false", async () => {
|
|
64
|
+
const clearFn = jest.fn(async () => ({ success: true }));
|
|
65
|
+
const typeFn = jest.fn(async () => ({ success: true, result: "ok" }));
|
|
66
|
+
await inputTextWithReplace("hello", false, typeFn, clearFn);
|
|
67
|
+
expect(clearFn).not.toHaveBeenCalled();
|
|
68
|
+
expect(typeFn).toHaveBeenCalled();
|
|
69
|
+
});
|
|
70
|
+
it("returns the clear error and does NOT type when clear fails", async () => {
|
|
71
|
+
const clearFn = jest.fn(async () => ({ success: false, error: "no focused TextInput" }));
|
|
72
|
+
const typeFn = jest.fn(async () => ({ success: true, result: "ok" }));
|
|
73
|
+
const res = await inputTextWithReplace("hello", true, typeFn, clearFn);
|
|
74
|
+
expect(res.success).toBe(false);
|
|
75
|
+
expect(res.error).toContain("no focused TextInput");
|
|
76
|
+
expect(typeFn).not.toHaveBeenCalled();
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
//# sourceMappingURL=focusedInputTools.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"focusedInputTools.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/focusedInputTools.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iconSemantics.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/iconSemantics.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { describe, it, expect } from "@jest/globals";
|
|
2
|
+
import { iconSemanticHint, iconLabel } from "../../core/iconSemantics.js";
|
|
3
|
+
import { applyIconHintToLabel } from "../../core/screenState.js";
|
|
4
|
+
describe("iconSemanticHint", () => {
|
|
5
|
+
it("maps chevron/arrow + direction composites", () => {
|
|
6
|
+
expect(iconSemanticHint("SvgChevronBackward")).toBe("possibly back button");
|
|
7
|
+
expect(iconSemanticHint("ChevronLeft")).toBe("possibly back button");
|
|
8
|
+
expect(iconSemanticHint("ArrowRightIcon")).toBe("possibly forward/next button");
|
|
9
|
+
expect(iconSemanticHint("CaretDown")).toBe("possibly expand/open button");
|
|
10
|
+
expect(iconSemanticHint("chevron-up")).toBe("possibly collapse button");
|
|
11
|
+
});
|
|
12
|
+
it("maps standalone icon keywords", () => {
|
|
13
|
+
expect(iconSemanticHint("SvgClose")).toBe("possibly close button");
|
|
14
|
+
expect(iconSemanticHint("CheckboxOutline")).toBe("possibly checkbox");
|
|
15
|
+
expect(iconSemanticHint("RadioOn")).toBe("possibly radio button");
|
|
16
|
+
expect(iconSemanticHint("BackIcon")).toBe("possibly back button");
|
|
17
|
+
expect(iconSemanticHint("IconTrashCan")).toBe("possibly delete button");
|
|
18
|
+
expect(iconSemanticHint("HamburgerMenu")).toBe("possibly menu button");
|
|
19
|
+
expect(iconSemanticHint("SearchOutline")).toBe("possibly search button");
|
|
20
|
+
expect(iconSemanticHint("PlusCircle")).toBe("possibly add button");
|
|
21
|
+
expect(iconSemanticHint("DotsVertical")).toBe("possibly more-options button");
|
|
22
|
+
});
|
|
23
|
+
it("prefers checkbox over check", () => {
|
|
24
|
+
expect(iconSemanticHint("SvgCheckbox")).toBe("possibly checkbox");
|
|
25
|
+
expect(iconSemanticHint("SvgCheckmark")).toBe("possibly confirm/check button");
|
|
26
|
+
});
|
|
27
|
+
it("matches whole words only — no substring false positives", () => {
|
|
28
|
+
expect(iconSemanticHint("FeedbackForm")).toBeNull();
|
|
29
|
+
expect(iconSemanticHint("BackgroundView")).toBeNull();
|
|
30
|
+
expect(iconSemanticHint("Checkout")).toBeNull();
|
|
31
|
+
expect(iconSemanticHint("StarterKit")).toBeNull();
|
|
32
|
+
});
|
|
33
|
+
it("returns null for non-icon names and empty input", () => {
|
|
34
|
+
expect(iconSemanticHint("FloatingHeader")).toBeNull();
|
|
35
|
+
expect(iconSemanticHint("SneakerCard")).toBeNull();
|
|
36
|
+
expect(iconSemanticHint(null)).toBeNull();
|
|
37
|
+
expect(iconSemanticHint(undefined)).toBeNull();
|
|
38
|
+
expect(iconSemanticHint("")).toBeNull();
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
describe("iconLabel", () => {
|
|
42
|
+
it("combines the icon component name with the hint", () => {
|
|
43
|
+
expect(iconLabel("FloatingHeader", "SvgChevronBackward")).toBe("SvgChevronBackward — possibly back button");
|
|
44
|
+
});
|
|
45
|
+
it("falls back to the component name when no icon child is known", () => {
|
|
46
|
+
expect(iconLabel("CloseIcon", null)).toBe("CloseIcon — possibly close button");
|
|
47
|
+
});
|
|
48
|
+
it("returns null when neither name carries icon semantics", () => {
|
|
49
|
+
expect(iconLabel("FloatingHeader", null)).toBeNull();
|
|
50
|
+
expect(iconLabel("FloatingHeader", "FancyDecoration")).toBeNull();
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
describe("applyIconHintToLabel", () => {
|
|
54
|
+
function pressable(overrides = {}) {
|
|
55
|
+
return {
|
|
56
|
+
label: "[FloatingHeader]",
|
|
57
|
+
center: { x: 40, y: 100 },
|
|
58
|
+
bounds: { x: 16, y: 76, width: 48, height: 48 },
|
|
59
|
+
testID: null,
|
|
60
|
+
...overrides,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
it("rewrites a fallback label using the icon hint", () => {
|
|
64
|
+
const p = applyIconHintToLabel(pressable({ icon: "SvgChevronBackward" }));
|
|
65
|
+
expect(p.label).toBe("[SvgChevronBackward — possibly back button]");
|
|
66
|
+
});
|
|
67
|
+
it("keeps the existing label when the icon name has no semantics", () => {
|
|
68
|
+
const p = applyIconHintToLabel(pressable({ icon: "FancyDecoration" }));
|
|
69
|
+
expect(p.label).toBe("[FloatingHeader]");
|
|
70
|
+
});
|
|
71
|
+
it("uses the icon name when there is no label at all", () => {
|
|
72
|
+
const p = applyIconHintToLabel(pressable({ label: null, icon: "FancyDecoration" }));
|
|
73
|
+
expect(p.label).toBe("[FancyDecoration]");
|
|
74
|
+
});
|
|
75
|
+
it("never touches text/a11y labels (icon is null for those)", () => {
|
|
76
|
+
const p = applyIconHintToLabel(pressable({ label: "Submit", icon: null }));
|
|
77
|
+
expect(p.label).toBe("Submit");
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
//# sourceMappingURL=iconSemantics.test.js.map
|