detox 21.0.0-rc.1 → 21.0.0-rc.10
Sign up to get free protection for your applications and to get access to all the features.
- package/.eslintignore +3 -0
- package/.eslintrc.js +1 -40
- package/Detox-android/com/wix/detox/{21.0.0-rc.1/detox-21.0.0-rc.1-javadoc.jar → 21.0.0-rc.10/detox-21.0.0-rc.10-javadoc.jar} +0 -0
- package/Detox-android/com/wix/detox/21.0.0-rc.10/detox-21.0.0-rc.10-javadoc.jar.md5 +1 -0
- package/Detox-android/com/wix/detox/21.0.0-rc.10/detox-21.0.0-rc.10-javadoc.jar.sha1 +1 -0
- package/Detox-android/com/wix/detox/21.0.0-rc.10/detox-21.0.0-rc.10-javadoc.jar.sha256 +1 -0
- package/Detox-android/com/wix/detox/21.0.0-rc.10/detox-21.0.0-rc.10-javadoc.jar.sha512 +1 -0
- package/Detox-android/com/wix/detox/{21.0.0-rc.1/detox-21.0.0-rc.1-sources.jar → 21.0.0-rc.10/detox-21.0.0-rc.10-sources.jar} +0 -0
- package/Detox-android/com/wix/detox/21.0.0-rc.10/detox-21.0.0-rc.10-sources.jar.md5 +1 -0
- package/Detox-android/com/wix/detox/21.0.0-rc.10/detox-21.0.0-rc.10-sources.jar.sha1 +1 -0
- package/Detox-android/com/wix/detox/21.0.0-rc.10/detox-21.0.0-rc.10-sources.jar.sha256 +1 -0
- package/Detox-android/com/wix/detox/21.0.0-rc.10/detox-21.0.0-rc.10-sources.jar.sha512 +1 -0
- package/Detox-android/com/wix/detox/21.0.0-rc.10/detox-21.0.0-rc.10.aar +0 -0
- package/Detox-android/com/wix/detox/21.0.0-rc.10/detox-21.0.0-rc.10.aar.md5 +1 -0
- package/Detox-android/com/wix/detox/21.0.0-rc.10/detox-21.0.0-rc.10.aar.sha1 +1 -0
- package/Detox-android/com/wix/detox/21.0.0-rc.10/detox-21.0.0-rc.10.aar.sha256 +1 -0
- package/Detox-android/com/wix/detox/21.0.0-rc.10/detox-21.0.0-rc.10.aar.sha512 +1 -0
- package/Detox-android/com/wix/detox/{21.0.0-rc.1/detox-21.0.0-rc.1.pom → 21.0.0-rc.10/detox-21.0.0-rc.10.pom} +1 -7
- package/Detox-android/com/wix/detox/21.0.0-rc.10/detox-21.0.0-rc.10.pom.md5 +1 -0
- package/Detox-android/com/wix/detox/21.0.0-rc.10/detox-21.0.0-rc.10.pom.sha1 +1 -0
- package/Detox-android/com/wix/detox/21.0.0-rc.10/detox-21.0.0-rc.10.pom.sha256 +1 -0
- package/Detox-android/com/wix/detox/21.0.0-rc.10/detox-21.0.0-rc.10.pom.sha512 +1 -0
- package/Detox-android/com/wix/detox/maven-metadata.xml +4 -4
- package/Detox-android/com/wix/detox/maven-metadata.xml.md5 +1 -1
- package/Detox-android/com/wix/detox/maven-metadata.xml.sha1 +1 -1
- package/Detox-android/com/wix/detox/maven-metadata.xml.sha256 +1 -1
- package/Detox-android/com/wix/detox/maven-metadata.xml.sha512 +1 -1
- package/Detox-ios-framework.tbz +0 -0
- package/Detox-ios-src.tbz +0 -0
- package/Detox-ios-xcuitest.tbz +0 -0
- package/android/build.gradle +20 -10
- package/android/detox/build.gradle +24 -12
- package/android/detox/src/full/java/com/wix/detox/espresso/DetoxAssertion.java +44 -25
- package/android/detox/src/full/java/com/wix/detox/espresso/DetoxMatcher.java +12 -12
- package/android/detox/src/full/java/com/wix/detox/espresso/EspressoDetox.java +6 -7
- package/android/detox/src/full/java/com/wix/detox/espresso/action/AdjustSliderToPositionAction.kt +2 -2
- package/android/detox/src/full/java/com/wix/detox/espresso/action/GetAttributesAction.kt +34 -35
- package/android/detox/src/full/java/com/wix/detox/espresso/common/MaterialSliderHelper.kt +21 -0
- package/android/detox/src/full/java/com/wix/detox/espresso/common/{SliderHelper.kt → ReactSliderHelper.kt} +7 -6
- package/android/detox/src/full/java/com/wix/detox/espresso/matcher/RegexMatcher.kt +56 -0
- package/android/detox/src/full/java/com/wix/detox/espresso/matcher/ViewMatchers.kt +18 -6
- package/android/detox/src/full/java/com/wix/detox/espresso/performer/MultipleViewsActionPerformer.kt +43 -0
- package/android/detox/src/full/java/com/wix/detox/espresso/performer/SingleViewActionPerformer.kt +19 -0
- package/android/detox/src/full/java/com/wix/detox/espresso/performer/ViewActionPerformer.kt +24 -0
- package/android/detox/src/full/java/com/wix/detox/espresso/web/WebElement.java +4 -4
- package/android/detox/src/full/java/com/wix/invoke/types/Invocation.java +7 -6
- package/android/detox/src/main/java/com/wix/detox/espresso/MultipleViewsAction.kt +4 -0
- package/android/detox/src/main/java/com/wix/detox/espresso/UiControllerSpy.kt +0 -1
- package/android/detox/src/main/java/com/wix/detox/espresso/ViewActionWithResult.kt +2 -1
- package/android/detox/src/main/java/com/wix/detox/espresso/action/common/MotionEvents.kt +60 -4
- package/android/detox/src/testFull/java/com/wix/detox/espresso/action/GetAttributesActionTest.kt +6 -5
- package/android/detox/src/testFull/java/com/wix/detox/espresso/common/MaterialSliderHelperTest.kt +33 -0
- package/android/detox/src/testFull/java/com/wix/detox/espresso/common/{SliderHelperTest.kt → ReactSliderHelperTest.kt} +3 -3
- package/android/detox/src/testFull/java/com/wix/detox/espresso/matcher/RegexMatcherTest.kt +52 -0
- package/android/detox/src/testFull/java/com/wix/detox/espresso/performer/ViewActionPerformerSpec.kt +37 -0
- package/android/detox/src/testFull/java/com/wix/invoke/JsonParserTest.java +23 -7
- package/android/detox/src/testFull/resources/targetInvocationEspressoWebDetoxScript.json +47 -0
- package/android/gradle/wrapper/gradle-wrapper.properties +1 -1
- package/android/rninfo.gradle +25 -0
- package/android/settings.gradle +2 -1
- package/detox.d.ts +1840 -0
- package/globals.d.ts +23 -0
- package/index.d.ts +2 -1789
- package/internals.d.ts +11 -1
- package/jest.config.js +108 -0
- package/local-cli/reset-lock-file.js +5 -9
- package/local-cli/startCommand/AppStartCommand.js +4 -1
- package/local-cli/testCommand/TestRunnerCommand.js +26 -3
- package/local-cli/utils/interruptListeners.js +15 -0
- package/package.json +15 -108
- package/runners/jest/reporter.js +21 -1
- package/runners/jest/reporters/DetoxIPCReporter.js +34 -0
- package/runners/jest/reporters/DetoxReporterDispatcher.js +144 -0
- package/runners/jest/reporters/DetoxSummaryReporter.js +16 -0
- package/runners/jest/reporters/DetoxVerboseReporter.js +16 -0
- package/runners/jest/reporters/index.js +6 -0
- package/runners/jest/testEnvironment/index.js +11 -0
- package/src/DetoxWorker.js +5 -11
- package/src/android/core/NativeElement.js +26 -29
- package/src/android/core/WebElement.js +24 -6
- package/src/android/espressoapi/DetoxAssertion.js +16 -14
- package/src/android/espressoapi/DetoxMatcher.js +24 -8
- package/src/android/espressoapi/EspressoDetox.js +9 -2
- package/src/android/espressoapi/web/WebElement.js +1 -4
- package/src/android/interactions/native.js +2 -3
- package/src/android/matchers/index.js +4 -0
- package/src/android/matchers/native.js +9 -4
- package/src/android/matchers/web.js +26 -1
- package/src/artifacts/providers/index.js +3 -3
- package/src/artifacts/screenshot/SimulatorScreenshotPlugin.js +0 -17
- package/src/configuration/composeLoggerConfig.js +1 -0
- package/src/configuration/composeRunnerConfig.js +3 -1
- package/src/devices/allocation/DeviceAllocator.js +66 -20
- package/src/devices/allocation/DeviceList.js +44 -0
- package/src/devices/allocation/DeviceRegistry.js +189 -0
- package/src/devices/allocation/drivers/AllocationDriverBase.d.ts +15 -0
- package/src/devices/{common/drivers/android/tools → allocation/drivers/android}/FreeDeviceFinder.js +11 -10
- package/src/devices/allocation/drivers/android/attached/AttachedAndroidAllocDriver.js +22 -17
- package/src/devices/allocation/drivers/android/emulator/EmulatorAllocDriver.js +97 -38
- package/src/devices/allocation/drivers/android/emulator/EmulatorLauncher.js +32 -45
- package/src/devices/allocation/drivers/android/emulator/FreeEmulatorFinder.js +1 -1
- package/src/devices/allocation/drivers/android/emulator/FreePortFinder.js +37 -0
- package/src/devices/allocation/drivers/android/emulator/launchEmulatorProcess.js +3 -3
- package/src/devices/allocation/drivers/android/genycloud/GenyAllocDriver.js +104 -32
- package/src/devices/allocation/drivers/android/genycloud/GenyInstanceLauncher.js +40 -31
- package/src/devices/allocation/drivers/android/genycloud/GenyRegistry.js +121 -0
- package/src/devices/allocation/drivers/android/genycloud/services/GenyInstanceLifecycleService.js +24 -0
- package/src/devices/{common → allocation}/drivers/android/genycloud/services/GenyRecipesService.js +1 -1
- package/src/devices/allocation/drivers/android/genycloud/services/dto/GenyInstance.js +83 -0
- package/src/devices/allocation/drivers/android/genycloud/services/dto/GenyRecipe.js +25 -0
- package/src/devices/allocation/drivers/ios/SimulatorAllocDriver.js +95 -54
- package/src/devices/allocation/drivers/ios/SimulatorQuery.js +24 -0
- package/src/devices/allocation/factories/android.js +29 -35
- package/src/devices/allocation/factories/ios.js +6 -7
- package/src/devices/common/drivers/DeviceCookie.d.ts +12 -0
- package/src/devices/common/drivers/android/cookies.d.ts +11 -0
- package/src/devices/common/drivers/android/emulator/exec/EmulatorExec.js +17 -5
- package/src/devices/common/drivers/android/exec/ADB.js +1 -0
- package/src/devices/common/drivers/android/tools/instrumentationArgs.js +7 -1
- package/src/devices/common/drivers/ios/cookies.d.ts +9 -0
- package/src/devices/common/drivers/ios/tools/AppleSimUtils.js +3 -1
- package/src/devices/cookies/index.js +0 -6
- package/src/devices/runtime/drivers/android/genycloud/GenyCloudDriver.js +7 -6
- package/src/devices/runtime/drivers/ios/SimulatorDriver.js +5 -4
- package/src/devices/runtime/drivers/ios/XCUITestUtils.js +21 -11
- package/src/devices/runtime/factories/android.js +3 -11
- package/src/devices/runtime/factories/ios.js +3 -4
- package/src/{servicelocator → devices/servicelocator}/android/emulatorServiceLocator.js +1 -1
- package/src/devices/servicelocator/android/genycloudServiceLocator.js +17 -0
- package/src/devices/servicelocator/android/index.js +23 -0
- package/src/{validation → devices/validation}/EnvironmentValidatorBase.js +1 -0
- package/src/{validation → devices/validation}/android/GenycloudEnvValidator.js +2 -2
- package/src/{validation → devices/validation}/factories/index.js +1 -1
- package/src/{validation → devices/validation}/ios/IosSimulatorEnvValidator.js +2 -2
- package/src/environmentFactory.js +1 -11
- package/src/invoke.js +0 -2
- package/src/ios/expectTwo.js +28 -11
- package/src/ios/web.js +302 -0
- package/src/ipc/IPCClient.js +22 -1
- package/src/ipc/IPCServer.js +42 -1
- package/src/ipc/SessionState.js +1 -0
- package/src/logger/DetoxLogger.js +2 -2
- package/src/realms/DetoxContext.js +8 -0
- package/src/realms/DetoxInternalsFacade.js +1 -0
- package/src/realms/DetoxPrimaryContext.js +49 -44
- package/src/realms/DetoxSecondaryContext.js +27 -0
- package/src/realms/symbols.js +6 -0
- package/src/utils/PIDService.js +27 -0
- package/src/utils/assertIsFunction.js +35 -0
- package/src/utils/environment.js +8 -15
- package/src/utils/errorUtils.js +3 -3
- package/src/utils/invocationTraceDescriptions.js +16 -0
- package/src/utils/isArrowFunction.js +24 -0
- package/src/utils/isRegExp.js +7 -0
- package/tsconfig.json +8 -3
- package/Detox-android/com/wix/detox/21.0.0-rc.1/detox-21.0.0-rc.1-javadoc.jar.md5 +0 -1
- package/Detox-android/com/wix/detox/21.0.0-rc.1/detox-21.0.0-rc.1-javadoc.jar.sha1 +0 -1
- package/Detox-android/com/wix/detox/21.0.0-rc.1/detox-21.0.0-rc.1-javadoc.jar.sha256 +0 -1
- package/Detox-android/com/wix/detox/21.0.0-rc.1/detox-21.0.0-rc.1-javadoc.jar.sha512 +0 -1
- package/Detox-android/com/wix/detox/21.0.0-rc.1/detox-21.0.0-rc.1-sources.jar.md5 +0 -1
- package/Detox-android/com/wix/detox/21.0.0-rc.1/detox-21.0.0-rc.1-sources.jar.sha1 +0 -1
- package/Detox-android/com/wix/detox/21.0.0-rc.1/detox-21.0.0-rc.1-sources.jar.sha256 +0 -1
- package/Detox-android/com/wix/detox/21.0.0-rc.1/detox-21.0.0-rc.1-sources.jar.sha512 +0 -1
- package/Detox-android/com/wix/detox/21.0.0-rc.1/detox-21.0.0-rc.1.aar +0 -0
- package/Detox-android/com/wix/detox/21.0.0-rc.1/detox-21.0.0-rc.1.aar.md5 +0 -1
- package/Detox-android/com/wix/detox/21.0.0-rc.1/detox-21.0.0-rc.1.aar.sha1 +0 -1
- package/Detox-android/com/wix/detox/21.0.0-rc.1/detox-21.0.0-rc.1.aar.sha256 +0 -1
- package/Detox-android/com/wix/detox/21.0.0-rc.1/detox-21.0.0-rc.1.aar.sha512 +0 -1
- package/Detox-android/com/wix/detox/21.0.0-rc.1/detox-21.0.0-rc.1.pom.md5 +0 -1
- package/Detox-android/com/wix/detox/21.0.0-rc.1/detox-21.0.0-rc.1.pom.sha1 +0 -1
- package/Detox-android/com/wix/detox/21.0.0-rc.1/detox-21.0.0-rc.1.pom.sha256 +0 -1
- package/Detox-android/com/wix/detox/21.0.0-rc.1/detox-21.0.0-rc.1.pom.sha512 +0 -1
- package/runners/jest/reporters/DetoxReporter.js +0 -36
- package/src/devices/DeviceRegistry.js +0 -176
- package/src/devices/allocation/drivers/AllocationDriverBase.js +0 -30
- package/src/devices/allocation/drivers/android/attached/AttachedAndroidLauncher.js +0 -13
- package/src/devices/allocation/drivers/android/emulator/EmulatorAllocationHelper.js +0 -72
- package/src/devices/allocation/drivers/android/genycloud/GenyDeviceRegistryFactory.js +0 -16
- package/src/devices/allocation/drivers/android/genycloud/GenyInstanceAllocationHelper.js +0 -65
- package/src/devices/allocation/drivers/ios/SimulatorLauncher.js +0 -21
- package/src/devices/common/drivers/DeviceAllocationHelper.js +0 -20
- package/src/devices/common/drivers/DeviceLauncher.js +0 -19
- package/src/devices/common/drivers/android/genycloud/services/GenyInstanceLifecycleService.js +0 -25
- package/src/devices/common/drivers/android/genycloud/services/GenyInstanceLookupService.js +0 -38
- package/src/devices/common/drivers/android/genycloud/services/GenyInstanceNaming.js +0 -14
- package/src/devices/common/drivers/android/genycloud/services/dto/GenyInstance.js +0 -66
- package/src/devices/common/drivers/android/genycloud/services/dto/GenyRecipe.js +0 -13
- package/src/devices/cookies/AndroidDeviceCookie.js +0 -13
- package/src/devices/cookies/AndroidEmulatorCookie.js +0 -6
- package/src/devices/cookies/AttachedAndroidDeviceCookie.js +0 -12
- package/src/devices/cookies/DeviceCookie.js +0 -4
- package/src/devices/cookies/GenycloudEmulatorCookie.js +0 -20
- package/src/devices/cookies/IosCookie.js +0 -6
- package/src/devices/cookies/IosSimulatorCookie.js +0 -10
- package/src/devices/lifecycle/GenyGlobalLifecycleHandler.js +0 -71
- package/src/devices/lifecycle/factories/GenyGlobalLifecycleHandlerFactory.js +0 -18
- package/src/invoke/EarlGrey.js +0 -8
- package/src/servicelocator/android/genycloudServiceLocator.js +0 -21
- package/src/servicelocator/android/index.js +0 -25
- package/src/servicelocator/ios.js +0 -7
- /package/src/devices/{common → allocation}/drivers/android/genycloud/exec/GenyCloudExec.js +0 -0
- /package/src/devices/{common → allocation}/drivers/android/genycloud/services/GenyAuthService.js +0 -0
package/internals.d.ts
CHANGED
@@ -113,7 +113,12 @@ declare global {
|
|
113
113
|
/** Test suite name */
|
114
114
|
name: string;
|
115
115
|
}): Promise<void>;
|
116
|
-
|
116
|
+
/**
|
117
|
+
* Workaround for Jest exiting abruptly in --bail mode.
|
118
|
+
* Makes sure that all workers and their test environments are properly torn down.
|
119
|
+
* @param [permanent] - forbids further retries
|
120
|
+
*/
|
121
|
+
unsafe_conductEarlyTeardown(permanent?: boolean): Promise<void>;
|
117
122
|
/**
|
118
123
|
* Reports to Detox CLI about passed and failed test files.
|
119
124
|
* The failed test files might be re-run again if
|
@@ -215,6 +220,11 @@ declare global {
|
|
215
220
|
* Randomly generated ID for the entire Detox test session, including retries.
|
216
221
|
*/
|
217
222
|
id: string;
|
223
|
+
/**
|
224
|
+
* Signalizes that the test session is being torn down.
|
225
|
+
* Experimental feature for Jest --bail mode.
|
226
|
+
*/
|
227
|
+
unsafe_earlyTeardown?: boolean;
|
218
228
|
/**
|
219
229
|
* Results of test file executions. Primarily used for Detox CLI retry mechanism.
|
220
230
|
*/
|
package/jest.config.js
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
const DEBUG = process.argv.includes('--reporters');
|
2
|
+
|
3
|
+
/** @type{import('jest-allure2-reporter').ReporterOptions} */
|
4
|
+
const jestAllure2ReporterOptions = {
|
5
|
+
testCase: {
|
6
|
+
labels: {
|
7
|
+
package: ({ filePath }) => filePath.slice(1).join('/'),
|
8
|
+
testMethod: ({ testCase }) => testCase.fullName,
|
9
|
+
tag: ['unit'],
|
10
|
+
},
|
11
|
+
},
|
12
|
+
};
|
13
|
+
|
14
|
+
/** @type {import('@jest/types').Config.InitialOptions} */
|
15
|
+
module.exports = {
|
16
|
+
setupFiles: [
|
17
|
+
'<rootDir>/__tests__/setupJest.js'
|
18
|
+
],
|
19
|
+
testEnvironment: DEBUG ? 'node' : 'jest-allure2-reporter/environment-node',
|
20
|
+
testRunner: 'jest-circus/runner',
|
21
|
+
roots: [
|
22
|
+
'node_modules',
|
23
|
+
'local-cli',
|
24
|
+
'src',
|
25
|
+
'runners'
|
26
|
+
],
|
27
|
+
testPathIgnorePatterns: [
|
28
|
+
'/node_modules/',
|
29
|
+
'local-cli/test.js'
|
30
|
+
],
|
31
|
+
coveragePathIgnorePatterns: [
|
32
|
+
'/node_modules/',
|
33
|
+
'__tests__',
|
34
|
+
'.test.js$',
|
35
|
+
'.mock.js$',
|
36
|
+
'index.js',
|
37
|
+
'internals.js',
|
38
|
+
'local-cli/utils',
|
39
|
+
'src/environmentFactory',
|
40
|
+
'src/android/espressoapi',
|
41
|
+
'src/artifacts/factories/index.js',
|
42
|
+
'src/artifacts/providers/index.js',
|
43
|
+
'src/artifacts/log',
|
44
|
+
'src/artifacts/screenshot',
|
45
|
+
'src/artifacts/video',
|
46
|
+
'src/devices/allocation/drivers/android/emulator/launchEmulatorProcess.js',
|
47
|
+
'src/devices/allocation/drivers/android/emulator/patchAvdSkinConfig.js',
|
48
|
+
'src/devices/allocation/.*AllocDriver.js',
|
49
|
+
'src/devices/allocation/drivers/ios',
|
50
|
+
'src/devices/allocation/factories',
|
51
|
+
'src/devices/allocation/factories/drivers',
|
52
|
+
'src/devices/cookies',
|
53
|
+
'src/devices/common/drivers/android/exec/ADB.js',
|
54
|
+
'src/devices/common/drivers/android/emulator/exec/EmulatorExec.js',
|
55
|
+
'src/devices/common/drivers/android/tools/EmulatorTelnet.js',
|
56
|
+
'src/devices/common/drivers/ios/tools',
|
57
|
+
'src/devices/runtime/drivers/android/AndroidDriver.js',
|
58
|
+
'src/devices/runtime/drivers/android/emulator/EmulatorDriver.js',
|
59
|
+
'src/devices/runtime/drivers/DeviceDriverBase.js',
|
60
|
+
'src/devices/runtime/drivers/ios',
|
61
|
+
'src/devices/runtime/factories',
|
62
|
+
'src/devices/runtime/factories/drivers',
|
63
|
+
'src/devices/validation/EnvironmentValidatorBase.js',
|
64
|
+
'src/devices/validation/factories',
|
65
|
+
'src/matchers/factories',
|
66
|
+
'src/utils/appdatapath.js',
|
67
|
+
'src/utils/debug.js',
|
68
|
+
'src/utils/environment.js',
|
69
|
+
'src/utils/logger.js',
|
70
|
+
'src/utils/pipeCommands.js',
|
71
|
+
'src/utils/pressAnyKey.js',
|
72
|
+
'src/utils/shellUtils.js',
|
73
|
+
'runners/jest/reporters',
|
74
|
+
'runners/jest/testEnvironment',
|
75
|
+
'src/DetoxWorker.js',
|
76
|
+
'src/logger/utils/streamUtils.js',
|
77
|
+
'src/realms'
|
78
|
+
],
|
79
|
+
resetMocks: true,
|
80
|
+
resetModules: true,
|
81
|
+
reporters: [
|
82
|
+
'default',
|
83
|
+
[
|
84
|
+
'jest-allure2-reporter',
|
85
|
+
jestAllure2ReporterOptions,
|
86
|
+
]
|
87
|
+
],
|
88
|
+
coverageReporters: [
|
89
|
+
'html',
|
90
|
+
'json',
|
91
|
+
'text',
|
92
|
+
'clover',
|
93
|
+
[
|
94
|
+
'lcov',
|
95
|
+
{
|
96
|
+
projectRoot: '..'
|
97
|
+
}
|
98
|
+
]
|
99
|
+
],
|
100
|
+
coverageThreshold: {
|
101
|
+
global: {
|
102
|
+
statements: 100,
|
103
|
+
branches: 100,
|
104
|
+
functions: 100,
|
105
|
+
lines: 100
|
106
|
+
}
|
107
|
+
}
|
108
|
+
};
|
@@ -1,16 +1,12 @@
|
|
1
1
|
const { log } = require('../internals');
|
2
|
-
const DeviceRegistry = require('../src/devices/DeviceRegistry');
|
3
|
-
const { getDetoxLibraryRootPath } = require('../src/utils/environment');
|
4
|
-
|
2
|
+
const DeviceRegistry = require('../src/devices/allocation/DeviceRegistry');
|
5
3
|
|
6
4
|
module.exports.command = 'reset-lock-file';
|
7
|
-
module.exports.desc = 'Resets
|
5
|
+
module.exports.desc = 'Resets Detox lock file completely - all devices are marked as available after that.';
|
8
6
|
|
9
7
|
module.exports.handler = async function resetLockFile() {
|
10
|
-
|
11
|
-
|
12
|
-
DeviceRegistry.forAndroid().reset(),
|
13
|
-
]);
|
8
|
+
const registry = new DeviceRegistry();
|
9
|
+
await registry.reset();
|
14
10
|
|
15
|
-
log.info(`Cleaned lock
|
11
|
+
log.info(`Cleaned lock file at: ${registry.lockFilePath}`);
|
16
12
|
};
|
@@ -36,7 +36,10 @@ class AppStartCommand {
|
|
36
36
|
}
|
37
37
|
};
|
38
38
|
|
39
|
-
this._cpHandle = execa.command(cmd, {
|
39
|
+
this._cpHandle = execa.command(cmd, {
|
40
|
+
stdio: ['ignore', 'inherit', 'inherit'],
|
41
|
+
shell: true
|
42
|
+
});
|
40
43
|
this._cpHandle.on('error', onError);
|
41
44
|
this._cpHandle.on('exit', (code, signal) => {
|
42
45
|
const reason = code == null ? `signal ${signal}` : `code ${code}`;
|
@@ -12,6 +12,7 @@ const { escapeSpaces, useForwardSlashes } = require('../../src/utils/shellUtils'
|
|
12
12
|
const sleep = require('../../src/utils/sleep');
|
13
13
|
const AppStartCommand = require('../startCommand/AppStartCommand');
|
14
14
|
const { markErrorAsLogged } = require('../utils/cliErrorHandling');
|
15
|
+
const interruptListeners = require('../utils/interruptListeners');
|
15
16
|
|
16
17
|
const TestRunnerError = require('./TestRunnerError');
|
17
18
|
|
@@ -28,10 +29,12 @@ class TestRunnerCommand {
|
|
28
29
|
const appsConfig = opts.config.apps;
|
29
30
|
|
30
31
|
this._argv = runnerConfig.args;
|
32
|
+
this._detached = runnerConfig.detached;
|
31
33
|
this._retries = runnerConfig.retries;
|
32
34
|
this._envHint = this._buildEnvHint(opts.env);
|
33
35
|
this._startCommands = this._prepareStartCommands(appsConfig, cliConfig);
|
34
36
|
this._envFwd = {};
|
37
|
+
this._terminating = false;
|
35
38
|
|
36
39
|
if (runnerConfig.forwardEnv) {
|
37
40
|
this._envFwd = this._buildEnvOverride(cliConfig, deviceConfig);
|
@@ -59,16 +62,20 @@ class TestRunnerCommand {
|
|
59
62
|
} catch (e) {
|
60
63
|
launchError = e;
|
61
64
|
|
65
|
+
if (this._terminating) {
|
66
|
+
runsLeft = 0;
|
67
|
+
}
|
68
|
+
|
62
69
|
const failedTestFiles = detox.session.testResults.filter(r => !r.success);
|
63
70
|
|
64
71
|
const { bail } = detox.config.testRunner;
|
65
72
|
if (bail && failedTestFiles.some(r => r.isPermanentFailure)) {
|
66
|
-
|
73
|
+
runsLeft = 0;
|
67
74
|
}
|
68
75
|
|
69
76
|
const testFilesToRetry = failedTestFiles.filter(r => !r.isPermanentFailure).map(r => r.testFilePath);
|
70
|
-
if (
|
71
|
-
|
77
|
+
if (testFilesToRetry.length === 0) {
|
78
|
+
runsLeft = 0;
|
72
79
|
}
|
73
80
|
|
74
81
|
if (--runsLeft > 0) {
|
@@ -143,6 +150,15 @@ class TestRunnerCommand {
|
|
143
150
|
}, _.isUndefined);
|
144
151
|
}
|
145
152
|
|
153
|
+
_onTerminate = () => {
|
154
|
+
if (this._terminating) {
|
155
|
+
return;
|
156
|
+
}
|
157
|
+
|
158
|
+
this._terminating = true;
|
159
|
+
return detox.unsafe_conductEarlyTeardown(true);
|
160
|
+
};
|
161
|
+
|
146
162
|
async _spawnTestRunner() {
|
147
163
|
const fullCommand = this._buildSpawnArguments().map(escapeSpaces);
|
148
164
|
const fullCommandWithHint = printEnvironmentVariables(this._envHint) + fullCommand.join(' ');
|
@@ -153,6 +169,7 @@ class TestRunnerCommand {
|
|
153
169
|
cp.spawn(fullCommand[0], fullCommand.slice(1), {
|
154
170
|
shell: true,
|
155
171
|
stdio: 'inherit',
|
172
|
+
detached: this._detached,
|
156
173
|
env: _({})
|
157
174
|
.assign(process.env)
|
158
175
|
.assign(this._envFwd)
|
@@ -162,6 +179,8 @@ class TestRunnerCommand {
|
|
162
179
|
})
|
163
180
|
.on('error', /* istanbul ignore next */ (err) => reject(err))
|
164
181
|
.on('exit', (code, signal) => {
|
182
|
+
interruptListeners.unsubscribe(this._onTerminate);
|
183
|
+
|
165
184
|
if (code === 0) {
|
166
185
|
log.trace.end({ success: true });
|
167
186
|
resolve();
|
@@ -175,6 +194,10 @@ class TestRunnerCommand {
|
|
175
194
|
reject(markErrorAsLogged(error));
|
176
195
|
}
|
177
196
|
});
|
197
|
+
|
198
|
+
if (this._detached) {
|
199
|
+
interruptListeners.subscribe(this._onTerminate);
|
200
|
+
}
|
178
201
|
});
|
179
202
|
}
|
180
203
|
|
@@ -0,0 +1,15 @@
|
|
1
|
+
function subscribe(listener) {
|
2
|
+
process.on('SIGINT', listener);
|
3
|
+
process.on('SIGTERM', listener);
|
4
|
+
}
|
5
|
+
|
6
|
+
function unsubscribe(listener) {
|
7
|
+
process.removeListener('SIGINT', listener);
|
8
|
+
process.removeListener('SIGTERM', listener);
|
9
|
+
}
|
10
|
+
|
11
|
+
module.exports = {
|
12
|
+
subscribe,
|
13
|
+
unsubscribe,
|
14
|
+
};
|
15
|
+
|
package/package.json
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
2
|
"name": "detox",
|
3
3
|
"description": "E2E tests and automation for mobile",
|
4
|
-
"version": "21.0.0-rc.
|
4
|
+
"version": "21.0.0-rc.10",
|
5
5
|
"bin": {
|
6
6
|
"detox": "local-cli/cli.js"
|
7
7
|
},
|
@@ -41,19 +41,20 @@
|
|
41
41
|
"@types/node": "^14.18.33",
|
42
42
|
"@types/node-ipc": "^9.2.0",
|
43
43
|
"@types/ws": "^7.4.0",
|
44
|
-
"@typescript-eslint/eslint-plugin": "^5.
|
45
|
-
"@typescript-eslint/parser": "^5.
|
44
|
+
"@typescript-eslint/eslint-plugin": "^5.59.8",
|
45
|
+
"@typescript-eslint/parser": "^5.59.8",
|
46
46
|
"cross-env": "^7.0.3",
|
47
|
-
"eslint": "^8.
|
48
|
-
"eslint-plugin-
|
49
|
-
"eslint-plugin-
|
47
|
+
"eslint": "^8.41.0",
|
48
|
+
"eslint-plugin-ecmascript-compat": "^3.0.0",
|
49
|
+
"eslint-plugin-import": "^2.27.5",
|
50
|
+
"eslint-plugin-no-only-tests": "^3.1.0",
|
50
51
|
"eslint-plugin-node": "^11.1.0",
|
51
|
-
"eslint-plugin-unicorn": "^
|
52
|
+
"eslint-plugin-unicorn": "^47.0.0",
|
52
53
|
"jest": "^28.1.3",
|
53
|
-
"jest-allure2-reporter": "
|
54
|
+
"jest-allure2-reporter": "2.0.0-alpha.11",
|
54
55
|
"mockdate": "^2.0.1",
|
55
|
-
"prettier": "
|
56
|
-
"react-native": "0.
|
56
|
+
"prettier": "^2.4.1",
|
57
|
+
"react-native": "0.71.10",
|
57
58
|
"react-native-codegen": "^0.0.8",
|
58
59
|
"typescript": "^4.5.2",
|
59
60
|
"wtfnode": "^0.9.1"
|
@@ -106,102 +107,8 @@
|
|
106
107
|
"engines": {
|
107
108
|
"node": ">=14.5.0"
|
108
109
|
},
|
109
|
-
"
|
110
|
-
"
|
111
|
-
|
112
|
-
|
113
|
-
"testEnvironment": "node",
|
114
|
-
"testRunner": "jest-circus/runner",
|
115
|
-
"roots": [
|
116
|
-
"node_modules",
|
117
|
-
"local-cli",
|
118
|
-
"src",
|
119
|
-
"runners"
|
120
|
-
],
|
121
|
-
"testPathIgnorePatterns": [
|
122
|
-
"/node_modules/",
|
123
|
-
"local-cli/test.js"
|
124
|
-
],
|
125
|
-
"coveragePathIgnorePatterns": [
|
126
|
-
"/node_modules/",
|
127
|
-
"__tests__",
|
128
|
-
".test.js$",
|
129
|
-
".mock.js$",
|
130
|
-
"index.js",
|
131
|
-
"internals.js",
|
132
|
-
"local-cli/utils",
|
133
|
-
"src/environmentFactory",
|
134
|
-
"src/android/espressoapi",
|
135
|
-
"src/artifacts/factories/index.js",
|
136
|
-
"src/artifacts/providers/index.js",
|
137
|
-
"src/artifacts/log",
|
138
|
-
"src/artifacts/screenshot",
|
139
|
-
"src/artifacts/video",
|
140
|
-
"src/devices/allocation/drivers/AllocationDriverBase.js",
|
141
|
-
"src/devices/allocation/drivers/android/emulator/launchEmulatorProcess.js",
|
142
|
-
"src/devices/allocation/drivers/android/emulator/patchAvdSkinConfig.js",
|
143
|
-
"src/devices/allocation/drivers/ios",
|
144
|
-
"src/devices/allocation/factories",
|
145
|
-
"src/devices/allocation/factories/drivers",
|
146
|
-
"src/devices/cookies",
|
147
|
-
"src/devices/common/drivers/android/exec/ADB.js",
|
148
|
-
"src/devices/common/drivers/android/emulator/exec/EmulatorExec.js",
|
149
|
-
"src/devices/common/drivers/android/tools/EmulatorTelnet.js",
|
150
|
-
"src/devices/common/drivers/ios/tools",
|
151
|
-
"src/devices/runtime/drivers/android/AndroidDriver.js",
|
152
|
-
"src/devices/runtime/drivers/android/emulator/EmulatorDriver.js",
|
153
|
-
"src/devices/runtime/drivers/DeviceDriverBase.js",
|
154
|
-
"src/devices/runtime/drivers/ios",
|
155
|
-
"src/devices/runtime/factories",
|
156
|
-
"src/devices/runtime/factories/drivers",
|
157
|
-
"src/matchers/factories",
|
158
|
-
"src/validation/EnvironmentValidatorBase.js",
|
159
|
-
"src/validation/factories",
|
160
|
-
"src/validation/ios/IosSimulatorEnvValidator",
|
161
|
-
"src/utils/appdatapath.js",
|
162
|
-
"src/utils/debug.js",
|
163
|
-
"src/utils/environment.js",
|
164
|
-
"src/utils/logger.js",
|
165
|
-
"src/utils/pipeCommands.js",
|
166
|
-
"src/utils/pressAnyKey.js",
|
167
|
-
"src/utils/shellUtils.js",
|
168
|
-
"runners/jest/reporters",
|
169
|
-
"runners/jest/testEnvironment",
|
170
|
-
"src/DetoxWorker.js",
|
171
|
-
"src/logger/utils/streamUtils.js",
|
172
|
-
"src/realms"
|
173
|
-
],
|
174
|
-
"resetMocks": true,
|
175
|
-
"resetModules": true,
|
176
|
-
"reporters": [
|
177
|
-
"default",
|
178
|
-
[
|
179
|
-
"jest-allure2-reporter",
|
180
|
-
{
|
181
|
-
"getEnvironmentInfo": false
|
182
|
-
}
|
183
|
-
]
|
184
|
-
],
|
185
|
-
"coverageReporters": [
|
186
|
-
"html",
|
187
|
-
"json",
|
188
|
-
"text",
|
189
|
-
"clover",
|
190
|
-
[
|
191
|
-
"lcov",
|
192
|
-
{
|
193
|
-
"projectRoot": ".."
|
194
|
-
}
|
195
|
-
]
|
196
|
-
],
|
197
|
-
"coverageThreshold": {
|
198
|
-
"global": {
|
199
|
-
"statements": 100,
|
200
|
-
"branches": 100,
|
201
|
-
"functions": 100,
|
202
|
-
"lines": 100
|
203
|
-
}
|
204
|
-
}
|
205
|
-
},
|
206
|
-
"gitHead": "fc6ebe7bf9c0fb3c8c0c8cf84d339fccbb13b195"
|
110
|
+
"browserslist": [
|
111
|
+
"node 14"
|
112
|
+
],
|
113
|
+
"gitHead": "ec1f63b3f6468a34e81415196db046e05aa6263b"
|
207
114
|
}
|
package/runners/jest/reporter.js
CHANGED
@@ -1 +1,21 @@
|
|
1
|
-
|
1
|
+
/** @typedef {import('@jest/reporters').Reporter} Reporter */
|
2
|
+
|
3
|
+
const {
|
4
|
+
DetoxIPCReporter,
|
5
|
+
DetoxReporterDispatcher,
|
6
|
+
DetoxSummaryReporter,
|
7
|
+
DetoxVerboseReporter,
|
8
|
+
} = require('./reporters');
|
9
|
+
|
10
|
+
/** @implements {Reporter} */
|
11
|
+
class DetoxReporter extends DetoxReporterDispatcher {
|
12
|
+
constructor(globalConfig) {
|
13
|
+
super(globalConfig, {
|
14
|
+
DetoxSummaryReporter,
|
15
|
+
DetoxVerboseReporter,
|
16
|
+
DetoxIPCReporter,
|
17
|
+
});
|
18
|
+
}
|
19
|
+
}
|
20
|
+
|
21
|
+
module.exports = DetoxReporter;
|
@@ -0,0 +1,34 @@
|
|
1
|
+
const { config, reportTestResults } = require('../../../internals');
|
2
|
+
|
3
|
+
/** @typedef {import('@jest/reporters').Reporter} Reporter */
|
4
|
+
|
5
|
+
/** @implements {Partial<Reporter>} */
|
6
|
+
class DetoxIPCReporter {
|
7
|
+
/**
|
8
|
+
* @param {Set<import('@jest/reporters').TestContext>} testContexts
|
9
|
+
* @param {import('@jest/reporters').AggregatedResult} aggregatedResult
|
10
|
+
*/
|
11
|
+
async onRunComplete(testContexts, aggregatedResult) {
|
12
|
+
const lostTests = aggregatedResult.numTotalTestSuites - aggregatedResult.testResults.length;
|
13
|
+
|
14
|
+
await reportTestResults(aggregatedResult.testResults.map(r => ({
|
15
|
+
success: !r.failureMessage,
|
16
|
+
testFilePath: r.testFilePath,
|
17
|
+
testExecError: r.testExecError,
|
18
|
+
isPermanentFailure: lostTests > 0 || this._isPermanentFailure(r),
|
19
|
+
})));
|
20
|
+
}
|
21
|
+
|
22
|
+
/**
|
23
|
+
* @param {import('@jest/test-result').TestResult} testResult
|
24
|
+
*/
|
25
|
+
_isPermanentFailure(testResult) {
|
26
|
+
if (config.testRunner.jest.retryAfterCircusRetries) {
|
27
|
+
return false;
|
28
|
+
}
|
29
|
+
|
30
|
+
return testResult.testResults.some(r => r.status === 'failed' && r.invocations > 1);
|
31
|
+
}
|
32
|
+
}
|
33
|
+
|
34
|
+
module.exports = DetoxIPCReporter;
|
@@ -0,0 +1,144 @@
|
|
1
|
+
/** @typedef {import('@jest/reporters').Reporter} Reporter */
|
2
|
+
|
3
|
+
const { config, unsafe_conductEarlyTeardown } = require('../../../internals');
|
4
|
+
const Deferred = require('../../../src/utils/Deferred');
|
5
|
+
|
6
|
+
/** @implements {Reporter} */
|
7
|
+
class DetoxReporterDispatcher {
|
8
|
+
/**
|
9
|
+
* @param {import('@jest/types').Config.GlobalConfig} globalConfig
|
10
|
+
* @param {Record<string, new (globalConfig: import('@jest/types').Config.GlobalConfig) => Partial<Reporter>>} reporters
|
11
|
+
*/
|
12
|
+
constructor(globalConfig, reporters) {
|
13
|
+
this._bail = globalConfig.bail;
|
14
|
+
/** @type {Deferred | null} */
|
15
|
+
this._lastRunComplete = null;
|
16
|
+
/** @type {Set<string>} */
|
17
|
+
this._pendingTestFiles = new Set();
|
18
|
+
/** @type {Promise<any> | null} */
|
19
|
+
this._onRunCompletePromise = null;
|
20
|
+
/** @type {Partial<Reporter>[]} */
|
21
|
+
this._reporters = Object.values(reporters).map((Reporter) => new Reporter(globalConfig));
|
22
|
+
}
|
23
|
+
|
24
|
+
getLastError() {
|
25
|
+
for (const reporter of this._reporters) {
|
26
|
+
let error = typeof reporter.getLastError === 'function'
|
27
|
+
? reporter.getLastError()
|
28
|
+
: undefined;
|
29
|
+
|
30
|
+
if (error) {
|
31
|
+
return error;
|
32
|
+
}
|
33
|
+
}
|
34
|
+
|
35
|
+
return;
|
36
|
+
}
|
37
|
+
|
38
|
+
onRunStart(aggregatedResult, options) {
|
39
|
+
return this._dispatch('onRunStart', aggregatedResult, options);
|
40
|
+
}
|
41
|
+
|
42
|
+
onTestFileStart(test) {
|
43
|
+
this._pendingTestFiles.add(test.path);
|
44
|
+
return this._dispatch(['onTestFileStart', 'onTestStart'], test);
|
45
|
+
}
|
46
|
+
|
47
|
+
onTestStart(test) {
|
48
|
+
// Legacy method
|
49
|
+
return this.onTestFileStart(test);
|
50
|
+
}
|
51
|
+
|
52
|
+
// NEW! Supported only since Jest 29.6.0
|
53
|
+
onTestCaseStart(test, testCaseStartInfo) {
|
54
|
+
return this._dispatch('onTestCaseStart', test, testCaseStartInfo);
|
55
|
+
}
|
56
|
+
|
57
|
+
onTestCaseResult(test, testCaseResult) {
|
58
|
+
return this._dispatch('onTestCaseResult', test, testCaseResult);
|
59
|
+
}
|
60
|
+
|
61
|
+
async onTestFileResult(test, testResult, aggregatedResult) {
|
62
|
+
this._pendingTestFiles.delete(test.path);
|
63
|
+
|
64
|
+
await this._dispatch(['onTestFileResult', 'onTestResult'], test, testResult, aggregatedResult);
|
65
|
+
|
66
|
+
if (this._lastRunComplete && this._pendingTestFiles.size === 0) {
|
67
|
+
this._lastRunComplete.resolve(aggregatedResult);
|
68
|
+
}
|
69
|
+
}
|
70
|
+
|
71
|
+
onTestResult(test, testResult, aggregatedResult) {
|
72
|
+
// Legacy method
|
73
|
+
return this.onTestFileResult(test, testResult, aggregatedResult);
|
74
|
+
}
|
75
|
+
|
76
|
+
onRunComplete(testContexts, aggregatedResult) {
|
77
|
+
if (!this._lastRunComplete) {
|
78
|
+
// Both `_lastRunComplete` and `_onRunCompletePromise` are used to prevent
|
79
|
+
// a bug in Jest, where `onRunComplete` is called multiple times when
|
80
|
+
// Jest runs with `--bail` and multiple workers, and `onRunComplete`
|
81
|
+
// is implemented as an asynchronous long-running operation.
|
82
|
+
this._lastRunComplete = this._pendingTestFiles.size === 0
|
83
|
+
? Deferred.resolved(aggregatedResult)
|
84
|
+
: new Deferred();
|
85
|
+
}
|
86
|
+
|
87
|
+
if (!this._onRunCompletePromise) {
|
88
|
+
this._onRunCompletePromise = this._doRunComplete(testContexts, aggregatedResult);
|
89
|
+
}
|
90
|
+
|
91
|
+
return this._onRunCompletePromise;
|
92
|
+
}
|
93
|
+
|
94
|
+
/**
|
95
|
+
* @private
|
96
|
+
* @param {Set<import('@jest/reporters').TestContext>} testContexts
|
97
|
+
* @param {import('@jest/test-result').AggregatedResult} aggregatedResult
|
98
|
+
* @returns {Promise<void>}
|
99
|
+
*/
|
100
|
+
async _doRunComplete(testContexts, aggregatedResult) {
|
101
|
+
const earlyTeardown = this._bail > 0 && aggregatedResult.numFailedTests >= this._bail;
|
102
|
+
if (earlyTeardown) {
|
103
|
+
const lostTests = aggregatedResult.numTotalTestSuites - aggregatedResult.testResults.length;
|
104
|
+
if (lostTests > 0 && config.testRunner.retries > 0) {
|
105
|
+
console.warn(
|
106
|
+
'Jest aborted the test execution before all scheduled test files have been reported.\n' +
|
107
|
+
'If you want to retry the whole test run, please disable Jest\'s --bail option.'
|
108
|
+
);
|
109
|
+
}
|
110
|
+
|
111
|
+
await unsafe_conductEarlyTeardown();
|
112
|
+
}
|
113
|
+
|
114
|
+
await this._lastRunComplete.promise;
|
115
|
+
await this._dispatch('onRunComplete', testContexts, aggregatedResult);
|
116
|
+
}
|
117
|
+
|
118
|
+
/**
|
119
|
+
* @private
|
120
|
+
* @param {string | string[]} rawMethodNames
|
121
|
+
* @param {...any} args
|
122
|
+
* @returns {Promise<void>}
|
123
|
+
*/
|
124
|
+
_dispatch(rawMethodNames, ...args) {
|
125
|
+
const methodNames = Array.isArray(rawMethodNames)
|
126
|
+
? rawMethodNames
|
127
|
+
: [rawMethodNames];
|
128
|
+
|
129
|
+
const maybePromises = [];
|
130
|
+
|
131
|
+
for (const reporter of this._reporters) {
|
132
|
+
for (const methodName of methodNames) {
|
133
|
+
if (typeof reporter[methodName] === 'function') {
|
134
|
+
maybePromises.push(reporter[methodName](...args));
|
135
|
+
break;
|
136
|
+
}
|
137
|
+
}
|
138
|
+
}
|
139
|
+
|
140
|
+
return Promise.all(maybePromises).then(() => void 0);
|
141
|
+
}
|
142
|
+
}
|
143
|
+
|
144
|
+
module.exports = DetoxReporterDispatcher;
|
@@ -0,0 +1,16 @@
|
|
1
|
+
/** @typedef {import('@jest/reporters').Reporter} Reporter */
|
2
|
+
|
3
|
+
const resolveFrom = require('resolve-from');
|
4
|
+
/** @type {new (globalConfig: any) => import('@jest/reporters').SummaryReporter} */
|
5
|
+
const SummaryReporter = require(resolveFrom(process.cwd(), '@jest/reporters')).SummaryReporter;
|
6
|
+
|
7
|
+
/** @implements {Partial<Reporter>} */
|
8
|
+
class DetoxSummaryReporter {
|
9
|
+
constructor(globalConfig) {
|
10
|
+
if (globalConfig.reporters.every(([name]) => name !== 'default' && name !== 'summary')) {
|
11
|
+
return new SummaryReporter(globalConfig);
|
12
|
+
}
|
13
|
+
}
|
14
|
+
}
|
15
|
+
|
16
|
+
module.exports = DetoxSummaryReporter;
|
@@ -0,0 +1,16 @@
|
|
1
|
+
/** @typedef {import('@jest/reporters').Reporter} Reporter */
|
2
|
+
|
3
|
+
const resolveFrom = require('resolve-from');
|
4
|
+
/** @type {new (globalConfig: any) => import('@jest/reporters').VerboseReporter} */
|
5
|
+
const VerboseReporter = require(resolveFrom(process.cwd(), '@jest/reporters')).VerboseReporter;
|
6
|
+
|
7
|
+
/** @implements {Partial<Reporter>} */
|
8
|
+
class DetoxVerboseReporter {
|
9
|
+
constructor(globalConfig) {
|
10
|
+
if (globalConfig.reporters.every(([name]) => name !== 'default')) {
|
11
|
+
return new VerboseReporter(globalConfig);
|
12
|
+
}
|
13
|
+
}
|
14
|
+
}
|
15
|
+
|
16
|
+
module.exports = DetoxVerboseReporter;
|