detox 20.0.13-prerelease.0 → 20.0.14-is-hittable-over-master.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. package/Detox-android/com/wix/detox/{20.0.13-prerelease.0/detox-20.0.13-prerelease.0-javadoc.jar → 20.0.14-is-hittable-over-master.0/detox-20.0.14-is-hittable-over-master.0-javadoc.jar} +0 -0
  2. package/Detox-android/com/wix/detox/20.0.14-is-hittable-over-master.0/detox-20.0.14-is-hittable-over-master.0-javadoc.jar.md5 +1 -0
  3. package/Detox-android/com/wix/detox/20.0.14-is-hittable-over-master.0/detox-20.0.14-is-hittable-over-master.0-javadoc.jar.sha1 +1 -0
  4. package/Detox-android/com/wix/detox/20.0.14-is-hittable-over-master.0/detox-20.0.14-is-hittable-over-master.0-javadoc.jar.sha256 +1 -0
  5. package/Detox-android/com/wix/detox/20.0.14-is-hittable-over-master.0/detox-20.0.14-is-hittable-over-master.0-javadoc.jar.sha512 +1 -0
  6. package/Detox-android/com/wix/detox/{20.0.13-prerelease.0/detox-20.0.13-prerelease.0-sources.jar → 20.0.14-is-hittable-over-master.0/detox-20.0.14-is-hittable-over-master.0-sources.jar} +0 -0
  7. package/Detox-android/com/wix/detox/20.0.14-is-hittable-over-master.0/detox-20.0.14-is-hittable-over-master.0-sources.jar.md5 +1 -0
  8. package/Detox-android/com/wix/detox/20.0.14-is-hittable-over-master.0/detox-20.0.14-is-hittable-over-master.0-sources.jar.sha1 +1 -0
  9. package/Detox-android/com/wix/detox/20.0.14-is-hittable-over-master.0/detox-20.0.14-is-hittable-over-master.0-sources.jar.sha256 +1 -0
  10. package/Detox-android/com/wix/detox/20.0.14-is-hittable-over-master.0/detox-20.0.14-is-hittable-over-master.0-sources.jar.sha512 +1 -0
  11. package/Detox-android/com/wix/detox/{20.0.13-prerelease.0/detox-20.0.13-prerelease.0.aar → 20.0.14-is-hittable-over-master.0/detox-20.0.14-is-hittable-over-master.0.aar} +0 -0
  12. package/Detox-android/com/wix/detox/20.0.14-is-hittable-over-master.0/detox-20.0.14-is-hittable-over-master.0.aar.md5 +1 -0
  13. package/Detox-android/com/wix/detox/20.0.14-is-hittable-over-master.0/detox-20.0.14-is-hittable-over-master.0.aar.sha1 +1 -0
  14. package/Detox-android/com/wix/detox/20.0.14-is-hittable-over-master.0/detox-20.0.14-is-hittable-over-master.0.aar.sha256 +1 -0
  15. package/Detox-android/com/wix/detox/20.0.14-is-hittable-over-master.0/detox-20.0.14-is-hittable-over-master.0.aar.sha512 +1 -0
  16. package/Detox-android/com/wix/detox/{20.0.13-prerelease.0/detox-20.0.13-prerelease.0.pom → 20.0.14-is-hittable-over-master.0/detox-20.0.14-is-hittable-over-master.0.pom} +1 -1
  17. package/Detox-android/com/wix/detox/20.0.14-is-hittable-over-master.0/detox-20.0.14-is-hittable-over-master.0.pom.md5 +1 -0
  18. package/Detox-android/com/wix/detox/20.0.14-is-hittable-over-master.0/detox-20.0.14-is-hittable-over-master.0.pom.sha1 +1 -0
  19. package/Detox-android/com/wix/detox/20.0.14-is-hittable-over-master.0/detox-20.0.14-is-hittable-over-master.0.pom.sha256 +1 -0
  20. package/Detox-android/com/wix/detox/20.0.14-is-hittable-over-master.0/detox-20.0.14-is-hittable-over-master.0.pom.sha512 +1 -0
  21. package/Detox-android/com/wix/detox/maven-metadata.xml +4 -4
  22. package/Detox-android/com/wix/detox/maven-metadata.xml.md5 +1 -1
  23. package/Detox-android/com/wix/detox/maven-metadata.xml.sha1 +1 -1
  24. package/Detox-android/com/wix/detox/maven-metadata.xml.sha256 +1 -1
  25. package/Detox-android/com/wix/detox/maven-metadata.xml.sha512 +1 -1
  26. package/Detox-ios-src.tbz +0 -0
  27. package/Detox-ios.tbz +0 -0
  28. package/android/detox/proguard-rules-app.pro +2 -4
  29. package/index.d.ts +4 -4
  30. package/internals.d.ts +12 -68
  31. package/local-cli/test.js +4 -4
  32. package/local-cli/test.test.js +24 -28
  33. package/local-cli/testCommand/TestRunnerCommand.js +27 -35
  34. package/local-cli/utils/jestInternals.js +1 -4
  35. package/package.json +3 -3
  36. package/runners/jest/reporters/DetoxReporter.js +1 -1
  37. package/src/DetoxWorker.js +6 -0
  38. package/src/artifacts/ArtifactsManager.js +18 -0
  39. package/src/configuration/composeLoggerConfig.js +2 -2
  40. package/src/configuration/composeRunnerConfig.js +3 -4
  41. package/src/ipc/SessionState.js +1 -1
  42. package/src/logger/DetoxLogger.js +6 -4
  43. package/src/realms/DetoxContext.js +6 -0
  44. package/src/symbols.js +12 -0
  45. package/Detox-android/com/wix/detox/20.0.13-prerelease.0/detox-20.0.13-prerelease.0-javadoc.jar.md5 +0 -1
  46. package/Detox-android/com/wix/detox/20.0.13-prerelease.0/detox-20.0.13-prerelease.0-javadoc.jar.sha1 +0 -1
  47. package/Detox-android/com/wix/detox/20.0.13-prerelease.0/detox-20.0.13-prerelease.0-javadoc.jar.sha256 +0 -1
  48. package/Detox-android/com/wix/detox/20.0.13-prerelease.0/detox-20.0.13-prerelease.0-javadoc.jar.sha512 +0 -1
  49. package/Detox-android/com/wix/detox/20.0.13-prerelease.0/detox-20.0.13-prerelease.0-sources.jar.md5 +0 -1
  50. package/Detox-android/com/wix/detox/20.0.13-prerelease.0/detox-20.0.13-prerelease.0-sources.jar.sha1 +0 -1
  51. package/Detox-android/com/wix/detox/20.0.13-prerelease.0/detox-20.0.13-prerelease.0-sources.jar.sha256 +0 -1
  52. package/Detox-android/com/wix/detox/20.0.13-prerelease.0/detox-20.0.13-prerelease.0-sources.jar.sha512 +0 -1
  53. package/Detox-android/com/wix/detox/20.0.13-prerelease.0/detox-20.0.13-prerelease.0.aar.md5 +0 -1
  54. package/Detox-android/com/wix/detox/20.0.13-prerelease.0/detox-20.0.13-prerelease.0.aar.sha1 +0 -1
  55. package/Detox-android/com/wix/detox/20.0.13-prerelease.0/detox-20.0.13-prerelease.0.aar.sha256 +0 -1
  56. package/Detox-android/com/wix/detox/20.0.13-prerelease.0/detox-20.0.13-prerelease.0.aar.sha512 +0 -1
  57. package/Detox-android/com/wix/detox/20.0.13-prerelease.0/detox-20.0.13-prerelease.0.pom.md5 +0 -1
  58. package/Detox-android/com/wix/detox/20.0.13-prerelease.0/detox-20.0.13-prerelease.0.pom.sha1 +0 -1
  59. package/Detox-android/com/wix/detox/20.0.13-prerelease.0/detox-20.0.13-prerelease.0.pom.sha256 +0 -1
  60. package/Detox-android/com/wix/detox/20.0.13-prerelease.0/detox-20.0.13-prerelease.0.pom.sha512 +0 -1
@@ -0,0 +1 @@
1
+ ab49827e3d43f2731c516d5160686c04262254fc44ef45d7889b6249e39fe2be
@@ -0,0 +1 @@
1
+ b6ad4c5187dc36a8e9ccfa339c45fa091a45e719050a604ba3f18a8b6a71b369d17d3ee13c6d6f5de9db09475047567221a6c7fdd7095edacb9316ea295d020b
@@ -0,0 +1 @@
1
+ 47b831ebfddd79ea8ba2ccc299aa3b9866d1120c70faf2a60b80c4581163237a
@@ -0,0 +1 @@
1
+ bd6d43891de0ceb75ba13baaa43e8bef9c26544df29defc7a6387766cd3edd8b456eab6ecc88d28d3ef30e4652e5726ba9c322e54097605cdd09bd192c235474
@@ -0,0 +1 @@
1
+ 4bd349ffd3768c46cd1bc7ce021607e38c08e8e7187a21d27b08aaf53dd52873
@@ -0,0 +1 @@
1
+ c5c0556c23c72736ecd14d2227fdb65ddd100c1f47f460a6d1c02ae0a23a1a2774deb598ac56e2b7e6624aa028a3db00c312666233ea730b6bc7ed4863b6ebbf
@@ -3,7 +3,7 @@
3
3
  <modelVersion>4.0.0</modelVersion>
4
4
  <groupId>com.wix</groupId>
5
5
  <artifactId>detox</artifactId>
6
- <version>20.0.13-prerelease.0</version>
6
+ <version>20.0.14-is-hittable-over-master.0</version>
7
7
  <packaging>aar</packaging>
8
8
  <name>Detox</name>
9
9
  <description>Gray box end-to-end testing and automation library for mobile apps</description>
@@ -0,0 +1 @@
1
+ 7d1bfef3d23865e56b3eb0e9dc238c85b8ceffa879ec1f04d2d8de4c11e3bef2
@@ -0,0 +1 @@
1
+ 0163b91d3755b0bb41bb9c3b72e105e91a8de0ab7fce975777d445ec9f56dc1bcd00c4dc63f7646dfe00ecbb1a109dc5e664770516a6f201b541773fd9a7bc24
@@ -3,11 +3,11 @@
3
3
  <groupId>com.wix</groupId>
4
4
  <artifactId>detox</artifactId>
5
5
  <versioning>
6
- <latest>20.0.13-prerelease.0</latest>
7
- <release>20.0.13-prerelease.0</release>
6
+ <latest>20.0.14-is-hittable-over-master.0</latest>
7
+ <release>20.0.14-is-hittable-over-master.0</release>
8
8
  <versions>
9
- <version>20.0.13-prerelease.0</version>
9
+ <version>20.0.14-is-hittable-over-master.0</version>
10
10
  </versions>
11
- <lastUpdated>20221027152922</lastUpdated>
11
+ <lastUpdated>20221106162428</lastUpdated>
12
12
  </versioning>
13
13
  </metadata>
@@ -1 +1 @@
1
- ee112aada0b842b84d9d0ce02c34412d
1
+ 36f4a2be3d5428adbd7ef7d9d658caf2
@@ -1 +1 @@
1
- 4a588bcf856923db72dcce6afbbd5d3e8deac76a
1
+ e3d9c2e702cf221804d9e08ef5474c31acaa2a97
@@ -1 +1 @@
1
- 2508b9fd44abf05b74a3a95332f0ad7f91277e421f07301e69774ca9ab2addb8
1
+ 77786aeb086510b2a6cd1ad411cbf3ae648ddd7f66f2265ae53fb2e917e7eb6c
@@ -1 +1 @@
1
- e99c975ec5eb3d44859e1b3730703240e4aafc46dd57adb66ea43667c2f16d4c57311ea041e605a68816353074b852dc9572513a66cbadf2963d2247fd3c5cd3
1
+ 551879251459e011fb04bc7be88d05705f47603ee1495f16524386ea26f7b1c4462dbfe6c4b916f6da5499a2d1f6ea98f97714a65e713e8fa9b563e4bc17e075
package/Detox-ios-src.tbz CHANGED
Binary file
package/Detox-ios.tbz CHANGED
Binary file
@@ -1,5 +1,4 @@
1
1
  -keepattributes InnerClasses, Exceptions
2
-
3
2
  -keep class com.facebook.react.modules.** { *; }
4
3
  -keep class com.facebook.react.uimanager.** { *; }
5
4
  -keep class com.facebook.react.animated.** { *; }
@@ -9,9 +8,8 @@
9
8
  -keep class com.facebook.react.ReactInstanceManager** { *; }
10
9
  -keep class com.facebook.react.ReactInstanceEventListener { *; }
11
10
 
12
- -keep class com.facebook.react.views.slider.** { *; }
13
- -keep class com.google.android.material.slider.** { *; }
14
- -keep class com.reactnativecommunity.slider.** { *; }
11
+ -keep class com.facebook.react.views.slider.ReactSlider { *; }
12
+ -keep class com.reactnativecommunity.slider.ReactSlider { *; }
15
13
  -keep class com.reactnativecommunity.asyncstorage.** { *; }
16
14
 
17
15
  -keep class kotlin.jvm.** { *; }
package/index.d.ts CHANGED
@@ -105,9 +105,9 @@ declare global {
105
105
  interface DetoxLoggerConfig {
106
106
  level?: DetoxLogLevel;
107
107
  /**
108
- * @default true
108
+ * @default 'sandbox'
109
109
  */
110
- overrideConsole?: boolean;
110
+ overrideConsole?: 'all' | 'sandbox' | 'none';
111
111
  options?: BunyanDebugStreamOptions | ((config: Partial<DetoxLoggerConfig>) => BunyanDebugStreamOptions);
112
112
  }
113
113
 
@@ -170,9 +170,9 @@ declare global {
170
170
  bail?: boolean;
171
171
  /**
172
172
  * Custom handler to process --inspect-brk CLI flag.
173
- * Use it when you rely on another test runner than Jest to mutate the config.
173
+ * Use it when you rely on another test runner than Jest.
174
174
  */
175
- inspectBrk?: (config: DetoxTestRunnerConfig) => void;
175
+ inspectBrk?: boolean | ((config: DetoxTestRunnerConfig) => void);
176
176
  /**
177
177
  * Forward environment variables to the spawned test runner
178
178
  * accordingly to the given CLI argument overrides.
package/internals.d.ts CHANGED
@@ -40,71 +40,18 @@ declare global {
40
40
  // endregion
41
41
 
42
42
  // region Lifecycle
43
- /**
44
- * Reports that the test runner started executing a test suite, e.g. a `beforeAll` hook or a first test.
45
- */
46
- onRunDescribeStart(event: {
47
- /** Test suite name */
48
- name: string;
49
- }): Promise<void>;
50
- /**
51
- * Reports that the test runner started executing a specific test.
52
- */
53
- onTestStart(event: {
54
- /** Test name */
55
- title: string;
56
- /** Test name including the ancestor suite titles */
57
- fullName: string;
58
- /**
59
- * N-th time this test is running, if there is a retry mechanism.
60
- *
61
- * @default 1
62
- */
63
- invocations?: number;
64
- status: 'running';
65
- }): Promise<void>;
66
- /**
67
- * Reports about an error in the midst of `beforeAll`, `beforeEach`, `afterEach`, `afterAll` or any other hook.
68
- */
69
- onHookFailure(event: {
70
- error: Error | string;
71
- /**
72
- * @example 'beforeAll'
73
- * @example 'afterEach'
74
- */
75
- hook: string;
76
- }): Promise<void>;
77
- /**
78
- * Reports about an error in the midst of a test function, `test` or `it`.
79
- */
80
- onTestFnFailure(event: {
81
- error: Error | string;
82
- }): Promise<void>;
83
- /**
84
- * Reports the final status of the test, `passed` or `failed`.
85
- */
86
- onTestDone(event: {
87
- /** Test name */
88
- title: string;
89
- /** Test name including the ancestor suite titles */
90
- fullName: string;
91
- /**
92
- * N-th time this test is running, if there is a retry mechanism.
93
- *
94
- * @default 1
95
- */
96
- invocations?: number;
97
- status: 'passed' | 'failed';
98
- /** Whether a timeout was the reason for why the test failed. */
99
- timedOut?: boolean;
100
- }): Promise<void>;
101
- /**
102
- * Reports that the test runner has finished executing a test suite, e.g. all the `afterAll` hooks have been executed or the last test has finished running.
103
- */
104
- onRunDescribeFinish(event: {
105
- /** Test suite name */
106
- name: string;
107
- }): Promise<void>;
43
+ onRunStart(event: unknown): Promise<void>;
44
+ onRunDescribeStart(event: unknown): Promise<void>;
45
+ onTestStart(event: unknown): Promise<void>;
46
+ onHookStart(event: unknown): Promise<void>;
47
+ onHookFailure(event: unknown): Promise<void>;
48
+ onHookSuccess(event: unknown): Promise<void>;
49
+ onTestFnStart(event: unknown): Promise<void>;
50
+ onTestFnFailure(event: unknown): Promise<void>;
51
+ onTestFnSuccess(event: unknown): Promise<void>;
52
+ onTestDone(event: unknown): Promise<void>;
53
+ onRunDescribeFinish(event: unknown): Promise<void>;
54
+ onRunFinish(event: unknown): Promise<void>;
108
55
 
109
56
  /**
110
57
  * Reports to Detox CLI about passed and failed test files.
@@ -140,9 +87,6 @@ declare global {
140
87
 
141
88
  type DetoxInitOptions = {
142
89
  cwd: string;
143
- /**
144
- * @internal
145
- */
146
90
  argv: Record<string, unknown>;
147
91
  testRunnerArgv: Record<string, unknown>;
148
92
  override: Partial<Detox.DetoxConfig>;
package/local-cli/test.js CHANGED
@@ -16,14 +16,14 @@ module.exports.handler = async function test({ detoxArgs, runnerArgs }) {
16
16
  };
17
17
 
18
18
  const config = await detox.resolveConfig(opts);
19
- if (!detoxArgs['inspect-brk']) {
19
+ if (!config.testRunner.inspectBrk) {
20
20
  await detox.init(opts);
21
21
  }
22
22
 
23
23
  const runnerCommand = new TestRunnerCommand()
24
- .setDeviceConfig(config.device)
25
- .replicateCLIConfig(config.cli)
26
- .setRunnerConfig(config.testRunner);
24
+ .setDeviceConfig(detox.config.device)
25
+ .replicateCLIConfig(detox.config.cli)
26
+ .setRunnerConfig(detox.config.testRunner);
27
27
 
28
28
  await runnerCommand.execute();
29
29
  } finally {
@@ -52,7 +52,6 @@ describe('CLI', () => {
52
52
  $0: os.platform() === 'win32' ? `node ${executable}` : executable,
53
53
  config: 'e2e/config.json'
54
54
  },
55
- forwardEnv: true,
56
55
  },
57
56
  configurations: {
58
57
  single: {
@@ -115,14 +114,11 @@ describe('CLI', () => {
115
114
  });
116
115
 
117
116
  test('should not override environment variables', () => {
118
- expect(cliCall().env).toEqual({
119
- DETOX_CONFIG_PATH: expect.any(String),
120
- DETOX_CONFIG_SNAPSHOT_PATH: expect.any(String)
121
- });
117
+ expect(cliCall().env).toEqual({ DETOX_CONFIG_SNAPSHOT_PATH: expect.any(String) });
122
118
  });
123
119
 
124
120
  test('should hint essential environment variables', () => {
125
- expect(cliCall().fullCommand).toMatch(/\bDETOX_CONFIG_PATH=.*\bexecutable\b/);
121
+ expect(cliCall().fullCommand).toMatch(/^DETOX_CONFIG_PATH=.*\bexecutable/);
126
122
  });
127
123
  });
128
124
 
@@ -139,7 +135,7 @@ describe('CLI', () => {
139
135
 
140
136
  test.each([['-l'], ['--loglevel']])('%s <value> should be passed as environment variable', async (__loglevel) => {
141
137
  await run(__loglevel, 'trace');
142
- expect(cliCall().env).toHaveProperty('DETOX_LOGLEVEL');
138
+ expect(cliCall().env).not.toHaveProperty('DETOX_LOGLEVEL');
143
139
  expect(cliCall().fullCommand).toMatch(/ DETOX_LOGLEVEL="trace" /);
144
140
  });
145
141
 
@@ -196,8 +192,8 @@ describe('CLI', () => {
196
192
  test.each([['-R'], ['--retries']])('%s <value> should not bail by default', async (__retries) => {
197
193
  await run(__retries, 2).catch(_.noop);
198
194
 
195
+ expect(cliCall(0).env).not.toHaveProperty('DETOX_RERUN_INDEX');
199
196
  expect(cliCall(0).argv).toEqual([expect.stringMatching(/executable$/), '--config', 'e2e/config.json']);
200
- expect(cliCall(1).env).not.toHaveProperty('DETOX_RERUN_INDEX');
201
197
  expect(cliCall(1).argv).toEqual([expect.stringMatching(/executable$/), '--config', 'e2e/config.json', 'e2e/failing1.test.js']);
202
198
  // note that it does not take the permanently failed test
203
199
  });
@@ -238,111 +234,111 @@ describe('CLI', () => {
238
234
 
239
235
  test.each([['-r'], ['--reuse']])('%s <value> should be passed as environment variable', async (__reuse) => {
240
236
  await run(__reuse);
241
- expect(cliCall().env).toHaveProperty('DETOX_REUSE');
237
+ expect(cliCall().env).not.toHaveProperty('DETOX_REUSE');
242
238
  expect(cliCall().fullCommand).toMatch(/\bDETOX_REUSE=true /);
243
239
  });
244
240
 
245
241
  test.each([['-u'], ['--cleanup']])('%s <value> should be passed as environment variable', async (__cleanup) => {
246
242
  await run(__cleanup);
247
- expect(cliCall().env).toHaveProperty('DETOX_CLEANUP');
243
+ expect(cliCall().env).not.toHaveProperty('DETOX_CLEANUP');
248
244
  expect(cliCall().fullCommand).toMatch(/\bDETOX_CLEANUP=true /);
249
245
  });
250
246
 
251
247
  test.each([['-d'], ['--debug-synchronization']])('%s <value> should be passed as environment variable', async (__debug_synchronization) => {
252
248
  await run(__debug_synchronization, 5000);
253
- expect(cliCall().env).toHaveProperty('DETOX_DEBUG_SYNCHRONIZATION');
249
+ expect(cliCall().env).not.toHaveProperty('DETOX_DEBUG_SYNCHRONIZATION');
254
250
  expect(cliCall().fullCommand).toMatch(/\bDETOX_DEBUG_SYNCHRONIZATION=5000 /);
255
251
  });
256
252
 
257
253
  test.each([['-d'], ['--debug-synchronization']])('%s <value> should be passed as 0 when given false', async (__debug_synchronization) => {
258
254
  await run(__debug_synchronization, false);
259
- expect(cliCall().env).toHaveProperty('DETOX_DEBUG_SYNCHRONIZATION');
255
+ expect(cliCall().env).not.toHaveProperty('DETOX_DEBUG_SYNCHRONIZATION');
260
256
  expect(cliCall().fullCommand).toMatch(/\bDETOX_DEBUG_SYNCHRONIZATION=0 /);
261
257
  });
262
258
 
263
259
  test.each([['-d'], ['--debug-synchronization']])('%s <value> should have default value = 3000', async (__debug_synchronization) => {
264
260
  await run(`${__debug_synchronization}`);
265
- expect(cliCall().env).toHaveProperty('DETOX_DEBUG_SYNCHRONIZATION');
261
+ expect(cliCall().env).not.toHaveProperty('DETOX_DEBUG_SYNCHRONIZATION');
266
262
  expect(cliCall().fullCommand).toMatch(/\bDETOX_DEBUG_SYNCHRONIZATION=3000 /);
267
263
  });
268
264
 
269
265
  test.each([['-a'], ['--artifacts-location']])('%s <value> should be passed as environment variable', async (__artifacts_location) => {
270
266
  await run(__artifacts_location, '/tmp');
271
- expect(cliCall().env).toHaveProperty('DETOX_ARTIFACTS_LOCATION');
267
+ expect(cliCall().env).not.toHaveProperty('DETOX_ARTIFACTS_LOCATION');
272
268
  expect(cliCall().fullCommand).toMatch(/\bDETOX_ARTIFACTS_LOCATION="\/tmp" /);
273
269
  });
274
270
 
275
271
  test('--record-logs <value> should be passed as environment variable', async () => {
276
272
  await run('--record-logs', 'all');
277
- expect(cliCall().env).toHaveProperty('DETOX_RECORD_LOGS');
273
+ expect(cliCall().env).not.toHaveProperty('DETOX_RECORD_LOGS');
278
274
  expect(cliCall().fullCommand).toMatch(/\bDETOX_RECORD_LOGS="all" /);
279
275
  });
280
276
 
281
277
  test('--take-screenshots <value> should be passed as environment variable', async () => {
282
278
  await run('--take-screenshots', 'failing');
283
- expect(cliCall().env).toHaveProperty('DETOX_TAKE_SCREENSHOTS');
279
+ expect(cliCall().env).not.toHaveProperty('DETOX_TAKE_SCREENSHOTS');
284
280
  expect(cliCall().fullCommand).toMatch(/\bDETOX_TAKE_SCREENSHOTS="failing" /);
285
281
  });
286
282
 
287
283
  test('--record-videos <value> should be passed as environment variable', async () => {
288
284
  await run('--record-videos', 'failing');
289
- expect(cliCall().env).toHaveProperty('DETOX_RECORD_VIDEOS');
285
+ expect(cliCall().env).not.toHaveProperty('DETOX_RECORD_VIDEOS');
290
286
  expect(cliCall().fullCommand).toMatch(/\bDETOX_RECORD_VIDEOS="failing" /);
291
287
  });
292
288
 
293
289
  test('--record-performance <value> should be passed as environment variable', async () => {
294
290
  await run('--record-performance', 'all');
295
- expect(cliCall().env).toHaveProperty('DETOX_RECORD_PERFORMANCE');
291
+ expect(cliCall().env).not.toHaveProperty('DETOX_RECORD_PERFORMANCE');
296
292
  expect(cliCall().fullCommand).toMatch(/\DETOX_RECORD_PERFORMANCE="all" /);
297
293
  });
298
294
 
299
295
  test('--capture-view-hierarchy <value> should be passed as environment variable', async () => {
300
296
  await run('--capture-view-hierarchy', 'enabled');
301
- expect(cliCall().env).toHaveProperty('DETOX_CAPTURE_VIEW_HIERARCHY');
297
+ expect(cliCall().env).not.toHaveProperty('DETOX_CAPTURE_VIEW_HIERARCHY');
302
298
  expect(cliCall().fullCommand).toMatch(/\DETOX_CAPTURE_VIEW_HIERARCHY="enabled" /);
303
299
  });
304
300
 
305
301
  test('--jest-report-specs, set explicitly, should be passed as an environment variable', async () => {
306
302
  await run('--jest-report-specs');
307
- expect(cliCall().env).toHaveProperty('DETOX_REPORT_SPECS');
303
+ expect(cliCall().env).not.toHaveProperty('DETOX_REPORT_SPECS');
308
304
  expect(cliCall().fullCommand).toMatch(/\bDETOX_REPORT_SPECS=true /);
309
305
  });
310
306
 
311
307
  test.each([['-H'], ['--headless']])('%s <value> should be passed as environment variable', async (__headless) => {
312
308
  await run(__headless);
313
- expect(cliCall().env).toHaveProperty('DETOX_HEADLESS');
309
+ expect(cliCall().env).not.toHaveProperty('DETOX_HEADLESS');
314
310
  expect(cliCall().fullCommand).toMatch(/\bDETOX_HEADLESS=true /);
315
311
  });
316
312
 
317
313
  test('--gpu <value> should be passed as environment variable', async () => {
318
314
  await run('--gpu', 'angle_indirect');
319
- expect(cliCall().env).toHaveProperty('DETOX_GPU');
315
+ expect(cliCall().env).not.toHaveProperty('DETOX_GPU');
320
316
  expect(cliCall().fullCommand).toMatch(/\bDETOX_GPU="angle_indirect" /);
321
317
  });
322
318
 
323
319
  test('--device-boot-args should be passed as an environment variable (without deprecation warnings)', async () => {
324
320
  await run('--device-boot-args="--verbose"');
325
- expect(cliCall().env).toHaveProperty('DETOX_DEVICE_BOOT_ARGS');
321
+ expect(cliCall().env).not.toHaveProperty('DETOX_DEVICE_BOOT_ARGS');
326
322
  expect(cliCall().fullCommand).toMatch(/\bDETOX_DEVICE_BOOT_ARGS="--verbose" /);
327
323
  expect(logger().warn).not.toHaveBeenCalledWith(DEVICE_LAUNCH_ARGS_DEPRECATION);
328
324
  });
329
325
 
330
326
  test('--device-launch-args should serve as a deprecated alias to --device-boot-args', async () => {
331
327
  await run(`--device-launch-args="--verbose"`);
332
- expect(cliCall().env).toHaveProperty('DETOX_DEVICE_BOOT_ARGS');
328
+ expect(cliCall().env).not.toHaveProperty('DETOX_DEVICE_BOOT_ARGS');
333
329
  expect(cliCall().fullCommand).toMatch(/\bDETOX_DEVICE_BOOT_ARGS="--verbose" /);
334
330
  expect(logger().warn).toHaveBeenCalledWith(DEVICE_LAUNCH_ARGS_DEPRECATION);
335
331
  });
336
332
 
337
333
  test('--app-launch-args should be passed as an environment variable', async () => {
338
334
  await run(`--app-launch-args="--debug yes"`);
339
- expect(cliCall().env).toHaveProperty('DETOX_APP_LAUNCH_ARGS');
335
+ expect(cliCall().env).not.toHaveProperty('DETOX_APP_LAUNCH_ARGS');
340
336
  expect(cliCall().fullCommand).toMatch(/\bDETOX_APP_LAUNCH_ARGS="--debug yes" /);
341
337
  });
342
338
 
343
339
  test('--use-custom-logger false should be prevent passing environment variable', async () => {
344
340
  await run(`--use-custom-logger=false`);
345
- expect(cliCall().env).toHaveProperty('DETOX_USE_CUSTOM_LOGGER');
341
+ expect(cliCall().env).not.toHaveProperty('DETOX_USE_CUSTOM_LOGGER');
346
342
  expect(cliCall().fullCommand).toMatch(/\bDETOX_USE_CUSTOM_LOGGER=false /);
347
343
  });
348
344
 
@@ -356,13 +352,13 @@ describe('CLI', () => {
356
352
  test('--force-adb-install should be passed as environment variable', async () => {
357
353
  singleConfig().device.type = 'android.emulator';
358
354
  await run(`--force-adb-install`);
359
- expect(cliCall().env).toHaveProperty('DETOX_FORCE_ADB_INSTALL');
355
+ expect(cliCall().env).not.toHaveProperty('DETOX_FORCE_ADB_INSTALL');
360
356
  expect(cliCall().fullCommand).toMatch(/\bDETOX_FORCE_ADB_INSTALL=true /);
361
357
  });
362
358
 
363
359
  test.each([['-n'], ['--device-name']])('%s <value> should be passed as environment variable', async (__device_name) => {
364
360
  await run(__device_name, 'TheDevice');
365
- expect(cliCall().env).toHaveProperty('DETOX_DEVICE_NAME');
361
+ expect(cliCall().env).not.toHaveProperty('DETOX_DEVICE_NAME');
366
362
  expect(cliCall().fullCommand).toMatch(/\bDETOX_DEVICE_NAME="TheDevice" /);
367
363
  });
368
364
 
@@ -13,20 +13,43 @@ const { escapeSpaces } = require('../../src/utils/shellUtils');
13
13
  class TestRunnerCommand {
14
14
  constructor() {
15
15
  this._argv = {};
16
- this._cli2env = {};
16
+ this._env = {};
17
17
  this._envHint = {};
18
- this._envFwd = {};
19
18
  this._retries = 0;
20
19
  /** @type {Detox.DetoxDeviceConfig} */
21
20
  this._deviceConfig = null;
22
21
  }
23
22
 
23
+ /**
24
+ * @param {Detox.DetoxDeviceConfig} config
25
+ * @returns {this}
26
+ */
27
+ setDeviceConfig(config) {
28
+ this._deviceConfig = config;
29
+
30
+ return this;
31
+ }
32
+
33
+ /**
34
+ * @param {Detox.DetoxTestRunnerConfig} config
35
+ * @returns {this}
36
+ */
37
+ setRunnerConfig(config) {
38
+ this._argv = config.args;
39
+ this._retries = config.inspectBrk ? 0 : config.retries;
40
+ if (config.inspectBrk || config.forwardEnv) {
41
+ this._env = this._envHint;
42
+ }
43
+
44
+ return this;
45
+ }
46
+
24
47
  /**
25
48
  * @param {Partial<Readonly<DetoxInternals.CLIConfig>>} cliConfig
26
49
  * @returns {this}
27
50
  */
28
51
  replicateCLIConfig(cliConfig) {
29
- this._cli2env = _.omitBy({
52
+ this._envHint = _.omitBy({
30
53
  DETOX_APP_LAUNCH_ARGS: cliConfig.appLaunchArgs,
31
54
  DETOX_ARTIFACTS_LOCATION: cliConfig.artifactsLocation,
32
55
  DETOX_CAPTURE_VIEW_HIERARCHY: cliConfig.captureViewHierarchy,
@@ -54,37 +77,6 @@ class TestRunnerCommand {
54
77
  DETOX_USE_CUSTOM_LOGGER: cliConfig.useCustomLogger,
55
78
  }, _.isUndefined);
56
79
 
57
- this._envHint = _(process.env)
58
- .mapKeys((_value, key) => key.toUpperCase())
59
- .pickBy((_value, key) => key.startsWith('DETOX_'))
60
- .omit(['DETOX_CONFIG_SNAPSHOT_PATH'])
61
- .value();
62
-
63
- return this;
64
- }
65
-
66
- /**
67
- * @param {Detox.DetoxDeviceConfig} config
68
- * @returns {this}
69
- */
70
- setDeviceConfig(config) {
71
- this._deviceConfig = config;
72
-
73
- return this;
74
- }
75
-
76
- /**
77
- * @param {Detox.DetoxTestRunnerConfig} config
78
- * @returns {this}
79
- */
80
- setRunnerConfig(config) {
81
- this._argv = config.args;
82
- this._retries = config.inspectBrk ? 0 : config.retries;
83
- if (config.forwardEnv) {
84
- this._envFwd = this._cli2env;
85
- Object.assign(this._envHint, this._cli2env);
86
- }
87
-
88
80
  return this;
89
81
  }
90
82
 
@@ -144,7 +136,7 @@ class TestRunnerCommand {
144
136
  stdio: 'inherit',
145
137
  env: _({})
146
138
  .assign(process.env)
147
- .assign(this._envFwd)
139
+ .assign(this._env)
148
140
  .omitBy(_.isUndefined)
149
141
  .tap(prependNodeModulesBinToPATH)
150
142
  .value()
@@ -4,7 +4,6 @@ const path = require('path');
4
4
 
5
5
  const _ = require('lodash');
6
6
  const resolveFrom = require('resolve-from');
7
- const semver = require('semver');
8
7
 
9
8
  const { DetoxRuntimeError } = require('../../src/errors');
10
9
 
@@ -51,9 +50,7 @@ function resolveJestCliArgs() {
51
50
 
52
51
  try {
53
52
  const jestCliManifest = resolveJestDependency(jestLocation, 'jest-cli/package.json');
54
- const jestCliVersion = require(jestCliManifest).version;
55
- const argsJsFilePath = semver.gt(jestCliVersion, '29.1.2') ? 'build/args.js' : 'build/cli/args.js';
56
- const argsJsFile = path.join(path.dirname(jestCliManifest), argsJsFilePath);
53
+ const argsJsFile = path.join(path.dirname(jestCliManifest), 'build/cli/args.js');
57
54
 
58
55
  return require(argsJsFile);
59
56
  } catch (e) {
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": "20.0.13-prerelease.0",
4
+ "version": "20.0.14-is-hittable-over-master.0",
5
5
  "bin": {
6
6
  "detox": "local-cli/cli.js"
7
7
  },
@@ -92,7 +92,7 @@
92
92
  "yargs-unparser": "^2.0.0"
93
93
  },
94
94
  "peerDependencies": {
95
- "jest": "29.x.x || 28.x.x || ^27.2.5"
95
+ "jest": "28.x.x || ^27.2.5"
96
96
  },
97
97
  "peerDependenciesMeta": {
98
98
  "jest": {
@@ -184,5 +184,5 @@
184
184
  }
185
185
  }
186
186
  },
187
- "gitHead": "7fef4609b820542ce27263e0c2cd1f03a2ae02fe"
187
+ "gitHead": "90070ba2a879f7215a3d1d864791ac1d85a177d3"
188
188
  }
@@ -17,7 +17,7 @@ class DetoxReporter extends JestVerboseReporter {
17
17
  testExecError: testResult.testExecError,
18
18
  isPermanentFailure: config.testRunner.jest.retryAfterCircusRetries
19
19
  ? false
20
- : testResult.testResults.some(r => r.status === 'failed' && r.invocations > 1)
20
+ : testResult.testResults.some(r => r.invocations > 1)
21
21
  }]);
22
22
  }
23
23
  }
@@ -190,6 +190,7 @@ class DetoxWorker {
190
190
  return this._context.log;
191
191
  }
192
192
 
193
+ onRunStart = async (...args) => this._artifactsManager.onRunStart(...args);
193
194
  onRunDescribeStart = async (...args) => this._artifactsManager.onRunDescribeStart(...args);
194
195
  onTestStart = async (testSummary) => {
195
196
  if (this._isCleaningUp) return;
@@ -204,8 +205,12 @@ class DetoxWorker {
204
205
  if (this._isCleaningUp) return;
205
206
  await this._artifactsManager.onTestStart(testSummary);
206
207
  };
208
+ onHookStart = async (...args) => this._artifactsManager.onHookStart(...args);
207
209
  onHookFailure = async (...args) => this._artifactsManager.onHookFailure(...args);
210
+ onHookSuccess = async (...args) => this._artifactsManager.onHookSuccess(...args);
211
+ onTestFnStart = async (...args) => this._artifactsManager.onTestFnStart(...args);
208
212
  onTestFnFailure = async (...args) => this._artifactsManager.onTestFnFailure(...args);
213
+ onTestFnSuccess = async (...args) => this._artifactsManager.onTestFnSuccess(...args);
209
214
  onTestDone = async (testSummary) => {
210
215
  if (this._isCleaningUp) return;
211
216
  this._validateTestSummary('afterEach', testSummary);
@@ -220,6 +225,7 @@ class DetoxWorker {
220
225
  });
221
226
  };
222
227
  onRunDescribeFinish = async (...args) => this._artifactsManager.onRunDescribeFinish(...args);
228
+ onRunFinish = async (...args) => this._artifactsManager.onRunFinish(...args);
223
229
 
224
230
  async _reinstallAppsOnDevice() {
225
231
  const appNames = _(this._appsConfig)
@@ -32,13 +32,19 @@ class ArtifactsManager extends EventEmitter {
32
32
  'onBootDevice',
33
33
  'onCreateExternalArtifact',
34
34
  'onHookFailure',
35
+ 'onHookStart',
36
+ 'onHookSuccess',
35
37
  'onLaunchApp',
36
38
  'onRunDescribeFinish',
37
39
  'onRunDescribeStart',
40
+ 'onRunFinish',
41
+ 'onRunStart',
38
42
  'onShutdownDevice',
39
43
  'onTerminateApp',
40
44
  'onTestDone',
41
45
  'onTestFnFailure',
46
+ 'onTestFnStart',
47
+ 'onTestFnSuccess',
42
48
  'onTestStart',
43
49
  ]);
44
50
  }
@@ -179,6 +185,8 @@ class ArtifactsManager extends EventEmitter {
179
185
  });
180
186
  }
181
187
 
188
+ async onRunStart() {}
189
+
182
190
  async onRunDescribeStart(suite) {
183
191
  await this._callPlugins('ascending', 'onRunDescribeStart', suite);
184
192
  }
@@ -187,14 +195,22 @@ class ArtifactsManager extends EventEmitter {
187
195
  await this._callPlugins('ascending', 'onTestStart', testSummary);
188
196
  }
189
197
 
198
+ async onHookStart() {}
199
+
190
200
  async onHookFailure(testSummary) {
191
201
  await this._callPlugins('plain', 'onHookFailure', testSummary);
192
202
  }
193
203
 
204
+ async onHookSuccess() {}
205
+
206
+ async onTestFnStart() {}
207
+
194
208
  async onTestFnFailure(testSummary) {
195
209
  await this._callPlugins('plain', 'onTestFnFailure', testSummary);
196
210
  }
197
211
 
212
+ async onTestFnSuccess() {}
213
+
198
214
  async onTestDone(testSummary) {
199
215
  await this._callPlugins('descending', 'onTestDone', testSummary);
200
216
  }
@@ -203,6 +219,8 @@ class ArtifactsManager extends EventEmitter {
203
219
  await this._callPlugins('descending', 'onRunDescribeFinish', suite);
204
220
  }
205
221
 
222
+ async onRunFinish() {}
223
+
206
224
  async onBeforeCleanup() {
207
225
  await this._callPlugins('descending', 'onBeforeCleanup');
208
226
  await this._idlePromise;
@@ -14,7 +14,7 @@ function composeLoggerConfig(opts) {
14
14
  const items = [
15
15
  {
16
16
  level: 'info',
17
- overrideConsole: true,
17
+ overrideConsole: 'sandbox',
18
18
  options: defaultOptions,
19
19
  },
20
20
  globalConfig.logger,
@@ -46,7 +46,7 @@ function adaptCLI(cliConfig) {
46
46
  }
47
47
 
48
48
  if (cliConfig.useCustomLogger !== undefined) {
49
- result.overrideConsole = cliConfig.useCustomLogger;
49
+ result.overrideConsole = cliConfig.useCustomLogger ? 'all' : 'none';
50
50
  }
51
51
 
52
52
  if (cliConfig.noColor) {
@@ -56,12 +56,11 @@ function composeRunnerConfig(opts) {
56
56
 
57
57
  if (typeof merged.inspectBrk === 'function') {
58
58
  if (cliConfig.inspectBrk) {
59
- merged.retries = 0;
60
- merged.forwardEnv = true;
61
59
  merged.inspectBrk(merged);
60
+ merged.inspectBrk = true;
61
+ } else {
62
+ merged.inspectBrk = false;
62
63
  }
63
-
64
- delete merged.inspectBrk;
65
64
  }
66
65
 
67
66
  return merged;
@@ -41,7 +41,7 @@ class SessionState {
41
41
  }
42
42
 
43
43
  static reviver(key, val) {
44
- if (typeof val === 'object' && val !== null && typeof val.$fn == 'string') {
44
+ if (typeof val === 'object' && typeof val.$fn == 'string') {
45
45
  return eval(val.$fn);
46
46
  } else {
47
47
  return val;
@@ -55,7 +55,7 @@ class DetoxLogger {
55
55
 
56
56
  this._sharedConfig.userConfig = this._sharedConfig.userConfig || {
57
57
  level: 'info',
58
- overrideConsole: false,
58
+ overrideConsole: 'none',
59
59
  options: {
60
60
  showDate: false,
61
61
  showLoggerName: false,
@@ -143,12 +143,14 @@ class DetoxLogger {
143
143
  * @internal
144
144
  */
145
145
  overrideConsole(sandbox) {
146
- const enabled = this.config.overrideConsole;
147
- if (!enabled) {
146
+ const option = this.config.overrideConsole;
147
+ if (option === 'none') {
148
148
  return;
149
149
  }
150
150
 
151
- customConsoleLogger.overrideConsoleMethods((sandbox || global).console, this);
151
+ if ((option === 'sandbox' && sandbox) || option === 'all') {
152
+ customConsoleLogger.overrideConsoleMethods((sandbox || global).console, this);
153
+ }
152
154
  }
153
155
 
154
156
  /**
@@ -80,12 +80,18 @@ class DetoxContext {
80
80
  //#endregion
81
81
 
82
82
  //#region Internal members
83
+ [symbols.onRunStart] = (...args) => this[symbols.worker].onRunStart(...args);
83
84
  [symbols.onRunDescribeStart] = (...args) => this[symbols.worker].onRunDescribeStart(...args);
84
85
  [symbols.onTestStart] = (...args) => this[symbols.worker].onTestStart(...args);
86
+ [symbols.onHookStart] = (...args) => this[symbols.worker].onHookStart(...args);
85
87
  [symbols.onHookFailure] = (...args) => this[symbols.worker].onHookFailure(...args);
88
+ [symbols.onHookSuccess] = (...args) => this[symbols.worker].onHookSuccess(...args);
89
+ [symbols.onTestFnStart] = (...args) => this[symbols.worker].onTestFnStart(...args);
86
90
  [symbols.onTestFnFailure] = (...args) => this[symbols.worker].onTestFnFailure(...args);
91
+ [symbols.onTestFnSuccess] = (...args) => this[symbols.worker].onTestFnSuccess(...args);
87
92
  [symbols.onTestDone] = (...args) => this[symbols.worker].onTestDone(...args);
88
93
  [symbols.onRunDescribeFinish] = (...args) => this[symbols.worker].onRunDescribeFinish(...args);
94
+ [symbols.onRunFinish] = (...args) => this[symbols.worker].onRunFinish(...args);
89
95
  [symbols.config] = funpermaproxy(() => this[symbols.session].detoxConfig);
90
96
  [symbols.session] = funpermaproxy(() => this[$sessionState]);
91
97
  [symbols.tracing] = Object.freeze({
package/src/symbols.js CHANGED
@@ -7,10 +7,16 @@
7
7
  * readonly installWorker: unique symbol;
8
8
  * readonly logger: unique symbol;
9
9
  * readonly onHookFailure: unique symbol;
10
+ * readonly onHookStart: unique symbol;
11
+ * readonly onHookSuccess: unique symbol;
10
12
  * readonly onRunDescribeFinish: unique symbol;
11
13
  * readonly onRunDescribeStart: unique symbol;
14
+ * readonly onRunFinish: unique symbol;
15
+ * readonly onRunStart: unique symbol;
12
16
  * readonly onTestDone: unique symbol;
13
17
  * readonly onTestFnFailure: unique symbol;
18
+ * readonly onTestFnStart: unique symbol;
19
+ * readonly onTestFnSuccess: unique symbol;
14
20
  * readonly onTestStart: unique symbol;
15
21
  * readonly reportTestResults: unique symbol;
16
22
  * readonly resolveConfig: unique symbol;
@@ -22,12 +28,18 @@
22
28
  */
23
29
  module.exports = {
24
30
  //#region Lifecycle
31
+ onRunStart: Symbol('run_start'),
25
32
  onRunDescribeStart: Symbol('run_describe_start'),
26
33
  onTestStart: Symbol('test_start'),
34
+ onHookStart: Symbol('hook_start'),
27
35
  onHookFailure: Symbol('hook_failure'),
36
+ onHookSuccess: Symbol('hook_success'),
37
+ onTestFnStart: Symbol('test_fn_start'),
28
38
  onTestFnFailure: Symbol('test_fn_failure'),
39
+ onTestFnSuccess: Symbol('test_fn_success'),
29
40
  onTestDone: Symbol('test_done'),
30
41
  onRunDescribeFinish: Symbol('run_describe_finish'),
42
+ onRunFinish: Symbol('run_finish'),
31
43
  //#endregion
32
44
 
33
45
  //#region IPC
@@ -1 +0,0 @@
1
- e87aec483ca0f1a8681dd604c172b1496be36552
@@ -1 +0,0 @@
1
- 4af74d1ca1aaeaa1d39e5d8911cbd10161b3114367691907d8e1618033d5b3e6
@@ -1 +0,0 @@
1
- 52171a50fce017136149bb98c6451148d77e4cf114b3026917dc51a603bd3e0f13aecdacf29a5f69731fa35767a0bd6947dfe4e7d48b16e277b73e5b5cc21619
@@ -1 +0,0 @@
1
- 58eb8e948d53b73075a1f5e97f7e1ef87335451d
@@ -1 +0,0 @@
1
- 4e2bc47c1bd786a7305e50cf174b2a44b76185b3510f43e6239783aa976f6ed7
@@ -1 +0,0 @@
1
- 88399f3c653950bc413629a0801211e0532b1fa8dcc012c37855deb27e5a048b2813c85079e21763f194c76ead892762d2e357b18869a1e3e0d465405f733aa2
@@ -1 +0,0 @@
1
- 3bdd1b42fa0f182255a47fcdda8f544c
@@ -1 +0,0 @@
1
- 457ae10d202b196ea92bade4a33ce2dbc2f8bb3f
@@ -1 +0,0 @@
1
- 52342d1b0d1fae681b2ea1e6f9ac6f6278299ed70d7867fd60b95d63eb7a9ec3
@@ -1 +0,0 @@
1
- 5dfa73d84d647fd870a2e915d9943c9502c967abfd89a834ef7dee50a2a77d5a8b0be7b13407a34a6b97cbc10e9ed6f5e608fe7366d5a3041e462e3322d5b10d
@@ -1 +0,0 @@
1
- af38d8520fe68b4005004b263bd44a99
@@ -1 +0,0 @@
1
- 4b05c8d532f93162c18be667feb8f603f8a07341
@@ -1 +0,0 @@
1
- 70d293de323b61f3f135b127ea949f8536f9a9693c13f4c496a68ceba31b2c2d
@@ -1 +0,0 @@
1
- fba1065b23a33a85282fbc1a47b80a2725dea603c2ccc4285956d04f7220d3428948b7dba61fe5ffad0928812c03f87549c4395b31df33e785e8b88fa5d46aeb