@tamagui/native-ci 2.1.0 → 2.2.0-1781071309197

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/dist/cli.mjs CHANGED
@@ -7,6 +7,9 @@ import { withMetro } from "./metro.mjs";
7
7
  import { runDetoxTests } from "./detox.mjs";
8
8
  import { ensureIOSFolder, ensureIOSApp, ensureBootedSimulator, ensureAppInstalled, getBootedSimulatorUDID, getMaestroBundleId } from "./ios";
9
9
  import { setupAndroidDevice, ensureAndroidFolder } from "./android";
10
+ import { chmodSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
11
+ import { tmpdir } from "node:os";
12
+ import { join } from "node:path";
10
13
  const HELP = `
11
14
  native-ci - Native CI/CD helpers for Expo apps
12
15
 
@@ -59,6 +62,20 @@ EXAMPLES:
59
62
  native-ci fingerprint ios
60
63
  native-ci fingerprint-test
61
64
  `;
65
+ function createMaestroXcrunShim() {
66
+ const binDir = mkdtempSync(join(tmpdir(), "native-ci-maestro-"));
67
+ const xcrunPath = join(binDir, "xcrun");
68
+ writeFileSync(xcrunPath, `#!/bin/sh
69
+ if [ "$1" = "devicectl" ] && [ "$2" = "--json-output" ] && [ "$4" = "list" ] && [ "$5" = "devices" ]; then
70
+ printf '{"result":{"devices":[]}}\\n' > "$3"
71
+ exit 0
72
+ fi
73
+
74
+ exec /usr/bin/xcrun "$@"
75
+ `);
76
+ chmodSync(xcrunPath, 493);
77
+ return binDir;
78
+ }
62
79
  function parseArgs(argv) {
63
80
  const args2 = [];
64
81
  const options2 = {
@@ -163,7 +180,8 @@ try {
163
180
  config,
164
181
  projectRoot: options.projectRoot,
165
182
  recordLogs: options.recordLogs,
166
- retries: options.retries
183
+ retries: options.retries,
184
+ testFiles: args.length > 0 ? args : void 0
167
185
  });
168
186
  });
169
187
  process.exit(exitCode);
@@ -183,7 +201,8 @@ try {
183
201
  projectRoot: options.projectRoot,
184
202
  recordLogs: options.recordLogs,
185
203
  retries: options.retries,
186
- headless: options.headless
204
+ headless: options.headless,
205
+ testFiles: args.length > 0 ? args : void 0
187
206
  });
188
207
  });
189
208
  process.exit(exitCode);
@@ -209,8 +228,23 @@ try {
209
228
  const flowArg = flow ? `./flows/${flow}` : "./flows";
210
229
  const udidArgs = ["--udid", udid];
211
230
  const debugDir = `${options.projectRoot}/.maestro-debug`;
212
- const result = await $`maestro test ${flowArg} --exclude-tags=util --no-ansi --debug-output=${debugDir} ${udidArgs}`.nothrow();
213
- return result.exitCode;
231
+ const xcrunShimDir = createMaestroXcrunShim();
232
+ const previousPath = process.env.PATH;
233
+ try {
234
+ process.env.PATH = `${xcrunShimDir}:${previousPath ?? ""}`;
235
+ const result = await $`maestro test ${flowArg} --exclude-tags=util --no-ansi --debug-output=${debugDir} ${udidArgs}`.nothrow();
236
+ return result.exitCode;
237
+ } finally {
238
+ if (previousPath === void 0) {
239
+ delete process.env.PATH;
240
+ } else {
241
+ process.env.PATH = previousPath;
242
+ }
243
+ rmSync(xcrunShimDir, {
244
+ recursive: true,
245
+ force: true
246
+ });
247
+ }
214
248
  });
215
249
  process.exit(exitCode);
216
250
  } else if (platform === "all") {
package/dist/cli.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":["generateFingerprint","generatePreFingerprintHash","createCacheKey","saveFingerprintToKV","getFingerprintFromKV","saveCache","loadCache","setGitHubOutput","isGitHubActions","isCI","ensureIosDeps","ensureAndroidDeps","ensureMaestro","printDepsStatus","withMetro","runDetoxTests","ensureIOSFolder","ensureIOSApp","ensureBootedSimulator","ensureAppInstalled","getBootedSimulatorUDID","getMaestroBundleId","setupAndroidDevice","ensureAndroidFolder","HELP","parseArgs","argv","args2","options2","projectRoot","process","cwd","config","recordLogs","retries","headless","prefix","githubOutput","json","help","i","length","arg","val","Number","parseInt","isNaN","startsWith","push","command","subcommand","args","slice","options","validatePlatform","value","console","error","exit","getKVCredentials","url","env","KV_STORE_REDIS_REST_URL","token","KV_STORE_REDIS_REST_TOKEN","info","NATIVE_CI_FORCE_RUN","platform","chdir","exitCode","flow","udid","bundleId","$","flowArg","udidArgs","debugDir","result","nothrow","iosExit","err","androidExit","success","hash","fingerprint","JSON","stringify","CACHE_FILE","iosResult","androidResult","iosFingerprint","androidFingerprint","cache","ios","android","iosChanged","androidChanged","timestamp","Date","toISOString","files","filter","Boolean","cacheKey","key","kv","message"],"sources":["../src/cli.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["generateFingerprint","generatePreFingerprintHash","createCacheKey","saveFingerprintToKV","getFingerprintFromKV","saveCache","loadCache","setGitHubOutput","isGitHubActions","isCI","ensureIosDeps","ensureAndroidDeps","ensureMaestro","printDepsStatus","withMetro","runDetoxTests","ensureIOSFolder","ensureIOSApp","ensureBootedSimulator","ensureAppInstalled","getBootedSimulatorUDID","getMaestroBundleId","setupAndroidDevice","ensureAndroidFolder","chmodSync","mkdtempSync","rmSync","writeFileSync","tmpdir","join","HELP","createMaestroXcrunShim","binDir","xcrunPath","parseArgs","argv","args2","options2","projectRoot","process","cwd","config","recordLogs","retries","headless","prefix","githubOutput","json","help","i","length","arg","val","Number","parseInt","isNaN","startsWith","push","command","subcommand","args","slice","options","validatePlatform","value","console","error","exit","getKVCredentials","url","env","KV_STORE_REDIS_REST_URL","token","KV_STORE_REDIS_REST_TOKEN","info","NATIVE_CI_FORCE_RUN","platform","chdir","exitCode","testFiles","flow","udid","bundleId","$","flowArg","udidArgs","debugDir","xcrunShimDir","previousPath","PATH","result","nothrow","recursive","force","iosExit","err","androidExit","success","hash","fingerprint","JSON","stringify","CACHE_FILE","iosResult","androidResult","iosFingerprint","androidFingerprint","cache","ios","android","iosChanged","androidChanged","timestamp","Date","toISOString","files","filter","Boolean","cacheKey","key","kv","message"],"sources":["../src/cli.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
package/dist/detox.mjs CHANGED
@@ -70,6 +70,43 @@ function buildDetoxArgs(options) {
70
70
  return args;
71
71
  }
72
72
  const DETOX_TIMEOUT_MS = 60 * 60 * 1e3;
73
+ const MAX_CONNECT_FLAKE_RETRIES = 1;
74
+ const CONNECT_FLAKE_SIGNATURES = [/Exceeded timeout of \d+ ms for a hook/, /\btimed out after \d+ms/, /could not connect to Detox/, /launch recovery deadline exceeded/, /skipping launchApp:/, /skipping reload:/];
75
+ const ANSI_PATTERN = /\[[0-9;]*m/g;
76
+ function classifyDetoxFailures(rawOutput) {
77
+ const output = rawOutput.replace(ANSI_PATTERN, "");
78
+ const delimiter = /(PASS|FAIL) (e2e\/[^\s):]+\.test\.ts)/g;
79
+ const marks = [];
80
+ for (const m of output.matchAll(delimiter)) {
81
+ marks.push({
82
+ kind: m[1],
83
+ file: m[2],
84
+ index: m.index ?? 0
85
+ });
86
+ }
87
+ const failedFiles = [];
88
+ const flakeFiles = [];
89
+ const realFiles = [];
90
+ for (let i = 0; i < marks.length; i++) {
91
+ const mark = marks[i];
92
+ if (mark.kind !== "FAIL") continue;
93
+ const blockEnd = i + 1 < marks.length ? marks[i + 1].index : output.length;
94
+ const block = output.slice(mark.index, blockEnd);
95
+ if (failedFiles.includes(mark.file)) continue;
96
+ failedFiles.push(mark.file);
97
+ const isFlake = CONNECT_FLAKE_SIGNATURES.some(sig => sig.test(block));
98
+ if (isFlake) {
99
+ flakeFiles.push(mark.file);
100
+ } else {
101
+ realFiles.push(mark.file);
102
+ }
103
+ }
104
+ return {
105
+ failedFiles,
106
+ flakeFiles,
107
+ realFiles
108
+ };
109
+ }
73
110
  async function resetDetoxLockFile() {
74
111
  console.info("Resetting Detox lock file...");
75
112
  const proc = Bun.spawn(["npx", "detox", "reset-lock-file"], {
@@ -78,9 +115,7 @@ async function resetDetoxLockFile() {
78
115
  });
79
116
  await proc.exited;
80
117
  }
81
- async function runDetoxTests(options) {
82
- await resetDetoxLockFile();
83
- const detoxArgs = buildDetoxArgs(options);
118
+ async function spawnDetoxOnce(detoxArgs) {
84
119
  console.info("\n--- Running Detox tests ---");
85
120
  console.info(`Using fixed Detox server port: ${DETOX_SERVER_PORT}`);
86
121
  console.info(`Command: npx ${detoxArgs.join(" ")}`);
@@ -89,9 +124,26 @@ async function runDetoxTests(options) {
89
124
  ...process.env,
90
125
  DETOX_SERVER_PORT: String(DETOX_SERVER_PORT)
91
126
  },
92
- stdout: "inherit",
93
- stderr: "inherit"
127
+ stdout: "pipe",
128
+ stderr: "pipe"
94
129
  });
130
+ const decoder = new TextDecoder();
131
+ let output = "";
132
+ const tee = async (stream, sink) => {
133
+ const reader = stream.getReader();
134
+ while (true) {
135
+ const {
136
+ done,
137
+ value
138
+ } = await reader.read();
139
+ if (done) break;
140
+ sink.write(value);
141
+ output += decoder.decode(value, {
142
+ stream: true
143
+ });
144
+ }
145
+ };
146
+ const pumps = Promise.all([tee(proc.stdout, process.stdout), tee(proc.stderr, process.stderr)]);
95
147
  const timeoutPromise = new Promise(resolve => {
96
148
  setTimeout(() => resolve("timeout"), DETOX_TIMEOUT_MS);
97
149
  });
@@ -99,16 +151,66 @@ async function runDetoxTests(options) {
99
151
  if (result === "timeout") {
100
152
  console.info("\nDetox timed out, killing process...");
101
153
  proc.kill("SIGKILL");
102
- return 1;
154
+ return {
155
+ exitCode: 1,
156
+ output
157
+ };
103
158
  }
104
- const exitCode = result;
159
+ await pumps;
160
+ return {
161
+ exitCode: result,
162
+ output
163
+ };
164
+ }
165
+ async function runDetoxTests(options) {
166
+ await resetDetoxLockFile();
167
+ const detoxArgs = buildDetoxArgs(options);
168
+ const {
169
+ exitCode,
170
+ output
171
+ } = await spawnDetoxOnce(detoxArgs);
105
172
  if (exitCode === 0) {
106
173
  console.info("\nAll tests passed!");
107
- } else {
108
- console.info(`
174
+ return 0;
175
+ }
176
+ console.info(`
109
177
  Tests failed with exit code: ${exitCode}`);
178
+ const {
179
+ flakeFiles,
180
+ realFiles
181
+ } = classifyDetoxFailures(output);
182
+ if (flakeFiles.length === 0) {
183
+ return exitCode;
184
+ }
185
+ if (realFiles.length > 0) {
186
+ console.info(`
187
+ Real test failure(s) present (${realFiles.join(", ")}); not retrying the connect-flaked file(s).`);
188
+ return exitCode;
189
+ }
190
+ for (let attempt = 1; attempt <= MAX_CONNECT_FLAKE_RETRIES; attempt++) {
191
+ console.info(`
192
+ ::warning::Detox launch-connect flake detected (beforeAll could not connect to Detox). Retry ${attempt}/${MAX_CONNECT_FLAKE_RETRIES} of: ${flakeFiles.join(", ")}`);
193
+ await resetDetoxLockFile();
194
+ const retryArgs = buildDetoxArgs({
195
+ ...options,
196
+ testFiles: flakeFiles
197
+ });
198
+ const retry = await spawnDetoxOnce(retryArgs);
199
+ if (retry.exitCode === 0) {
200
+ console.info(`
201
+ \u2713 Recovered ${flakeFiles.length} connect-flaked file(s) on retry ${attempt}.`);
202
+ return 0;
203
+ }
204
+ const retryClass = classifyDetoxFailures(retry.output);
205
+ if (retryClass.realFiles.length > 0 || retryClass.flakeFiles.length === 0) {
206
+ console.info("\nRetry surfaced a non-flake failure; surfacing it.");
207
+ return retry.exitCode;
208
+ }
209
+ flakeFiles.length = 0;
210
+ flakeFiles.push(...retryClass.flakeFiles);
110
211
  }
111
- return exitCode;
212
+ console.info("\nConnect-flake retries exhausted; tests still failing.");
213
+ return 1;
112
214
  }
113
- export { buildDetoxArgs, parseDetoxArgs, resetDetoxLockFile, runDetoxTests };
215
+ export { buildDetoxArgs, classifyDetoxFailures, parseDetoxArgs, resetDetoxLockFile, runDetoxTests };
114
216
  //# sourceMappingURL=detox.mjs.map
@@ -1 +1 @@
1
- {"version":3,"names":["parseArgs","DETOX_SERVER_PORT","parseDetoxArgs","platform","defaultConfig","values","positionals","options","config","type","default","process","cwd","headless","retries","workers","allowPositionals","retriesNum","Number","parseInt","isNaN","console","error","exit","workersNum","projectRoot","recordLogs","testFiles","length","buildDetoxArgs","args","String","push","DETOX_TIMEOUT_MS","resetDetoxLockFile","info","proc","Bun","spawn","stdout","stderr","exited","runDetoxTests","detoxArgs","join","env","timeoutPromise","Promise","resolve","setTimeout","result","race","kill","exitCode"],"sources":["../src/detox.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["parseArgs","DETOX_SERVER_PORT","parseDetoxArgs","platform","defaultConfig","values","positionals","options","config","type","default","process","cwd","headless","retries","workers","allowPositionals","retriesNum","Number","parseInt","isNaN","console","error","exit","workersNum","projectRoot","recordLogs","testFiles","length","buildDetoxArgs","args","String","push","DETOX_TIMEOUT_MS","MAX_CONNECT_FLAKE_RETRIES","CONNECT_FLAKE_SIGNATURES","ANSI_PATTERN","classifyDetoxFailures","rawOutput","output","replace","delimiter","marks","m","matchAll","kind","file","index","failedFiles","flakeFiles","realFiles","i","mark","blockEnd","block","slice","includes","isFlake","some","sig","test","resetDetoxLockFile","info","proc","Bun","spawn","stdout","stderr","exited","spawnDetoxOnce","detoxArgs","join","env","decoder","TextDecoder","tee","stream","sink","reader","getReader","done","value","read","write","decode","pumps","Promise","all","timeoutPromise","resolve","setTimeout","result","race","kill","exitCode","runDetoxTests","attempt","retryArgs","retry","retryClass"],"sources":["../src/detox.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tamagui/native-ci",
3
- "version": "2.1.0",
3
+ "version": "2.2.0-1781071309197",
4
4
  "description": "Native CI/CD helpers for React Native apps with Expo - fingerprinting, caching, and build optimization",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -42,7 +42,7 @@
42
42
  "@expo/fingerprint": "~0.16.6"
43
43
  },
44
44
  "devDependencies": {
45
- "@tamagui/build": "2.1.0",
45
+ "@tamagui/build": "2.2.0-1781071309197",
46
46
  "@types/bun": "^1.1.0",
47
47
  "@types/node": "^22.1.0"
48
48
  },
package/src/cli.ts CHANGED
@@ -36,6 +36,9 @@ import {
36
36
  } from './ios'
37
37
  import { setupAndroidDevice, ensureAndroidFolder } from './android'
38
38
  import type { Platform } from './constants'
39
+ import { chmodSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs'
40
+ import { tmpdir } from 'node:os'
41
+ import { join } from 'node:path'
39
42
 
40
43
  const HELP = `
41
44
  native-ci - Native CI/CD helpers for Expo apps
@@ -90,6 +93,26 @@ EXAMPLES:
90
93
  native-ci fingerprint-test
91
94
  `
92
95
 
96
+ function createMaestroXcrunShim() {
97
+ const binDir = mkdtempSync(join(tmpdir(), 'native-ci-maestro-'))
98
+ const xcrunPath = join(binDir, 'xcrun')
99
+
100
+ writeFileSync(
101
+ xcrunPath,
102
+ `#!/bin/sh
103
+ if [ "$1" = "devicectl" ] && [ "$2" = "--json-output" ] && [ "$4" = "list" ] && [ "$5" = "devices" ]; then
104
+ printf '{"result":{"devices":[]}}\\n' > "$3"
105
+ exit 0
106
+ fi
107
+
108
+ exec /usr/bin/xcrun "$@"
109
+ `
110
+ )
111
+ chmodSync(xcrunPath, 0o755)
112
+
113
+ return binDir
114
+ }
115
+
93
116
  interface ParsedArgs {
94
117
  command: string
95
118
  subcommand: string
@@ -223,6 +246,7 @@ try {
223
246
  projectRoot: options.projectRoot,
224
247
  recordLogs: options.recordLogs,
225
248
  retries: options.retries,
249
+ testFiles: args.length > 0 ? args : undefined,
226
250
  })
227
251
  })
228
252
  process.exit(exitCode)
@@ -249,6 +273,7 @@ try {
249
273
  recordLogs: options.recordLogs,
250
274
  retries: options.retries,
251
275
  headless: options.headless,
276
+ testFiles: args.length > 0 ? args : undefined,
252
277
  })
253
278
  })
254
279
  process.exit(exitCode)
@@ -279,9 +304,22 @@ try {
279
304
  const flowArg = flow ? `./flows/${flow}` : './flows'
280
305
  const udidArgs = ['--udid', udid]
281
306
  const debugDir = `${options.projectRoot}/.maestro-debug`
282
- const result =
283
- await $`maestro test ${flowArg} --exclude-tags=util --no-ansi --debug-output=${debugDir} ${udidArgs}`.nothrow()
284
- return result.exitCode
307
+ const xcrunShimDir = createMaestroXcrunShim()
308
+ const previousPath = process.env.PATH
309
+
310
+ try {
311
+ process.env.PATH = `${xcrunShimDir}:${previousPath ?? ''}`
312
+ const result =
313
+ await $`maestro test ${flowArg} --exclude-tags=util --no-ansi --debug-output=${debugDir} ${udidArgs}`.nothrow()
314
+ return result.exitCode
315
+ } finally {
316
+ if (previousPath === undefined) {
317
+ delete process.env.PATH
318
+ } else {
319
+ process.env.PATH = previousPath
320
+ }
321
+ rmSync(xcrunShimDir, { recursive: true, force: true })
322
+ }
285
323
  })
286
324
  process.exit(exitCode)
287
325
  } else if (platform === 'all') {
package/src/detox.ts CHANGED
@@ -107,6 +107,84 @@ export function buildDetoxArgs(options: DetoxRunnerOptions): string[] {
107
107
  // workflow job timeout is 90min, leaving room for setup + this run.
108
108
  const DETOX_TIMEOUT_MS = 60 * 60 * 1000
109
109
 
110
+ // Connect-flake retry: a single beforeAll launchApp that can't connect to Detox on a
111
+ // degraded runner fails the whole spec file (all its tests fail off the one hook), and
112
+ // nothing retries beforeAll (jest.retryTimes only re-runs individual tests; detox
113
+ // --retries is held at 0 to avoid blanket whole-file retry wall-time). So we retry the
114
+ // failed files ONCE, but ONLY when every failed file's failure carries the launch/connect
115
+ // flake signature - never on a real assertion failure. This is safe by construction: a
116
+ // real failure fails again on retry, so a misclassification can only cost one extra file
117
+ // run, never mask a genuine bug. See memory project_detox_app_connect_runaway.
118
+ const MAX_CONNECT_FLAKE_RETRIES = 1
119
+
120
+ // Signatures that mark a spec file's failure as the launch/connect flake rather than a
121
+ // real test failure. Matched against the ANSI-stripped per-file FAIL block.
122
+ // - "for a hook" - jest hook (beforeAll/beforeEach) timeout; real test timeouts say
123
+ // "for a test", so this never matches an assertion failure.
124
+ // - "timed out after <n>ms" - lowercase message thrown by our withTimeout() wrapper,
125
+ // used ONLY by safeLaunchApp/safeReloadApp/safeTerminate; detox's own waitFor emits
126
+ // capital "Timed out after <n>ms waiting for", so the lowercase form is launch-only.
127
+ // - the safeLaunchApp/safeReloadApp breaker messages.
128
+ const CONNECT_FLAKE_SIGNATURES: RegExp[] = [
129
+ /Exceeded timeout of \d+ ms for a hook/,
130
+ /\btimed out after \d+ms/,
131
+ /could not connect to Detox/,
132
+ /launch recovery deadline exceeded/,
133
+ /skipping launchApp:/,
134
+ /skipping reload:/,
135
+ ]
136
+
137
+ const ANSI_PATTERN = /\[[0-9;]*m/g
138
+
139
+ interface DetoxFailureClassification {
140
+ /** every spec file with a FAIL line */
141
+ failedFiles: string[]
142
+ /** failed files whose failure matches a connect-flake signature (retry candidates) */
143
+ flakeFiles: string[]
144
+ /** failed files whose failure looks real (assertion/logic) - never retried */
145
+ realFiles: string[]
146
+ }
147
+
148
+ /**
149
+ * Classify a detox/jest run's combined output into connect-flake vs real failures,
150
+ * per spec file. jest prints each file's `FAIL e2e/X.test.ts` line followed by that
151
+ * file's failure detail (the ● blocks) before the next PASS/FAIL line, so the text
152
+ * between one FAIL line and the next delimiter is that file's failure block.
153
+ *
154
+ * Exported for unit testing against real CI logs.
155
+ */
156
+ export function classifyDetoxFailures(rawOutput: string): DetoxFailureClassification {
157
+ const output = rawOutput.replace(ANSI_PATTERN, '')
158
+ // delimiter = any "PASS e2e/..." or "FAIL e2e/..." occurrence (not anchored: real CI
159
+ // logs may carry a leading timestamp/prefix on the line).
160
+ const delimiter = /(PASS|FAIL) (e2e\/[^\s):]+\.test\.ts)/g
161
+ const marks: { kind: string; file: string; index: number }[] = []
162
+ for (const m of output.matchAll(delimiter)) {
163
+ marks.push({ kind: m[1], file: m[2], index: m.index ?? 0 })
164
+ }
165
+
166
+ const failedFiles: string[] = []
167
+ const flakeFiles: string[] = []
168
+ const realFiles: string[] = []
169
+
170
+ for (let i = 0; i < marks.length; i++) {
171
+ const mark = marks[i]
172
+ if (mark.kind !== 'FAIL') continue
173
+ const blockEnd = i + 1 < marks.length ? marks[i + 1].index : output.length
174
+ const block = output.slice(mark.index, blockEnd)
175
+ if (failedFiles.includes(mark.file)) continue
176
+ failedFiles.push(mark.file)
177
+ const isFlake = CONNECT_FLAKE_SIGNATURES.some((sig) => sig.test(block))
178
+ if (isFlake) {
179
+ flakeFiles.push(mark.file)
180
+ } else {
181
+ realFiles.push(mark.file)
182
+ }
183
+ }
184
+
185
+ return { failedFiles, flakeFiles, realFiles }
186
+ }
187
+
110
188
  /**
111
189
  * Reset Detox lock file to prevent ECOMPROMISED errors in CI
112
190
  * See: https://github.com/wix/Detox/issues/4210
@@ -121,29 +199,46 @@ export async function resetDetoxLockFile(): Promise<void> {
121
199
  }
122
200
 
123
201
  /**
124
- * Run Detox tests with the given options
202
+ * Spawn one `npx detox test ...` invocation, streaming its output live to the CI log
203
+ * while also capturing it (ANSI included) so we can classify failures afterwards.
125
204
  *
126
- * @returns Exit code from Detox
205
+ * @returns the process exit code and the full combined stdout+stderr text.
127
206
  */
128
- export async function runDetoxTests(options: DetoxRunnerOptions): Promise<number> {
129
- // Reset lock file to prevent ECOMPROMISED errors in CI
130
- // This clears stale locks from previous runs that can cause "Unable to update lock within the stale threshold" errors
131
- await resetDetoxLockFile()
132
-
133
- const detoxArgs = buildDetoxArgs(options)
134
-
207
+ async function spawnDetoxOnce(
208
+ detoxArgs: string[]
209
+ ): Promise<{ exitCode: number; output: string }> {
135
210
  console.info('\n--- Running Detox tests ---')
136
211
  console.info(`Using fixed Detox server port: ${DETOX_SERVER_PORT}`)
137
212
  console.info(`Command: npx ${detoxArgs.join(' ')}`)
138
213
 
139
- // Use Bun.spawn with timeout to prevent hanging on zombie processes
214
+ // pipe (not inherit) so we can capture output for flake classification; tee each
215
+ // chunk straight back to our stdout/stderr so the live CI log is unchanged.
140
216
  const proc = Bun.spawn(['npx', ...detoxArgs], {
141
217
  env: { ...process.env, DETOX_SERVER_PORT: String(DETOX_SERVER_PORT) },
142
- stdout: 'inherit',
143
- stderr: 'inherit',
218
+ stdout: 'pipe',
219
+ stderr: 'pipe',
144
220
  })
145
221
 
146
- // Race between process completion and timeout
222
+ const decoder = new TextDecoder()
223
+ let output = ''
224
+ const tee = async (
225
+ stream: ReadableStream<Uint8Array>,
226
+ sink: NodeJS.WriteStream
227
+ ): Promise<void> => {
228
+ const reader = stream.getReader()
229
+ while (true) {
230
+ const { done, value } = await reader.read()
231
+ if (done) break
232
+ sink.write(value)
233
+ output += decoder.decode(value, { stream: true })
234
+ }
235
+ }
236
+
237
+ const pumps = Promise.all([
238
+ tee(proc.stdout, process.stdout),
239
+ tee(proc.stderr, process.stderr),
240
+ ])
241
+
147
242
  const timeoutPromise = new Promise<'timeout'>((resolve) => {
148
243
  setTimeout(() => resolve('timeout'), DETOX_TIMEOUT_MS)
149
244
  })
@@ -153,16 +248,83 @@ export async function runDetoxTests(options: DetoxRunnerOptions): Promise<number
153
248
  if (result === 'timeout') {
154
249
  console.info('\nDetox timed out, killing process...')
155
250
  proc.kill('SIGKILL')
156
- return 1
251
+ return { exitCode: 1, output }
157
252
  }
158
253
 
159
- const exitCode = result
254
+ // drain any buffered output the process emitted right before exit
255
+ await pumps
256
+ return { exitCode: result, output }
257
+ }
258
+
259
+ /**
260
+ * Run Detox tests with the given options.
261
+ *
262
+ * On failure, retries the failed spec files ONCE when (and only when) every failed
263
+ * file's failure carries the launch/connect flake signature - this recovers the
264
+ * beforeAll-launch flake that jest.retryTimes can't, without reintroducing blanket
265
+ * whole-file retries. Real failures are never retried (and would fail again anyway).
266
+ *
267
+ * @returns Exit code from Detox
268
+ */
269
+ export async function runDetoxTests(options: DetoxRunnerOptions): Promise<number> {
270
+ // Reset lock file to prevent ECOMPROMISED errors in CI
271
+ // This clears stale locks from previous runs that can cause "Unable to update lock within the stale threshold" errors
272
+ await resetDetoxLockFile()
273
+
274
+ const detoxArgs = buildDetoxArgs(options)
275
+ const { exitCode, output } = await spawnDetoxOnce(detoxArgs)
160
276
 
161
277
  if (exitCode === 0) {
162
278
  console.info('\nAll tests passed!')
163
- } else {
164
- console.info(`\nTests failed with exit code: ${exitCode}`)
279
+ return 0
280
+ }
281
+ console.info(`\nTests failed with exit code: ${exitCode}`)
282
+
283
+ const { flakeFiles, realFiles } = classifyDetoxFailures(output)
284
+
285
+ // nothing to retry: either we couldn't attribute the failure to specific files, or a
286
+ // real (non-flake) failure is present - in both cases surface the original result.
287
+ if (flakeFiles.length === 0) {
288
+ return exitCode
289
+ }
290
+ if (realFiles.length > 0) {
291
+ console.info(
292
+ `\nReal test failure(s) present (${realFiles.join(', ')}); not retrying the ` +
293
+ `connect-flaked file(s).`
294
+ )
295
+ return exitCode
296
+ }
297
+
298
+ for (let attempt = 1; attempt <= MAX_CONNECT_FLAKE_RETRIES; attempt++) {
299
+ console.info(
300
+ `\n::warning::Detox launch-connect flake detected (beforeAll could not connect to ` +
301
+ `Detox). Retry ${attempt}/${MAX_CONNECT_FLAKE_RETRIES} of: ${flakeFiles.join(', ')}`
302
+ )
303
+ // fresh lock file before the retry so a stale lock from the wedged run can't
304
+ // immediately re-trip the same connect failure.
305
+ await resetDetoxLockFile()
306
+
307
+ const retryArgs = buildDetoxArgs({ ...options, testFiles: flakeFiles })
308
+ const retry = await spawnDetoxOnce(retryArgs)
309
+ if (retry.exitCode === 0) {
310
+ console.info(
311
+ `\n✓ Recovered ${flakeFiles.length} connect-flaked file(s) on retry ${attempt}.`
312
+ )
313
+ return 0
314
+ }
315
+
316
+ // if the retry surfaced a real failure (the flake cleared but a genuine bug is
317
+ // underneath), stop retrying and surface it.
318
+ const retryClass = classifyDetoxFailures(retry.output)
319
+ if (retryClass.realFiles.length > 0 || retryClass.flakeFiles.length === 0) {
320
+ console.info('\nRetry surfaced a non-flake failure; surfacing it.')
321
+ return retry.exitCode
322
+ }
323
+ // still a pure connect-flake - loop will retry again if budget remains.
324
+ flakeFiles.length = 0
325
+ flakeFiles.push(...retryClass.flakeFiles)
165
326
  }
166
327
 
167
- return exitCode
328
+ console.info('\nConnect-flake retries exhausted; tests still failing.')
329
+ return 1
168
330
  }
package/src/ios.ts CHANGED
@@ -2,9 +2,9 @@
2
2
  * iOS-specific utilities for Detox test runners
3
3
  */
4
4
 
5
- import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs'
6
- import { dirname, join } from 'node:path'
7
- import { execSync } from 'node:child_process'
5
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync } from 'node:fs'
6
+ import { dirname, isAbsolute, join } from 'node:path'
7
+ import { execFileSync, execSync } from 'node:child_process'
8
8
  import { $ } from 'bun'
9
9
  import { isCI } from './runner'
10
10
  import { generateFingerprint } from './fingerprint'
@@ -75,6 +75,67 @@ function isAppInstalled(bundleId: string, udid: string): boolean {
75
75
  }
76
76
  }
77
77
 
78
+ function getIOSProjectName(projectRoot: string): string {
79
+ const iosDir = join(projectRoot, 'ios')
80
+ const iosEntries = readdirSync(iosDir)
81
+ const workspace = iosEntries.find((entry) => entry.endsWith('.xcworkspace'))
82
+ if (workspace) return workspace.replace(/\.xcworkspace$/, '')
83
+
84
+ const project = iosEntries.find((entry) => entry.endsWith('.xcodeproj'))
85
+ if (project) return project.replace(/\.xcodeproj$/, '')
86
+
87
+ throw new Error(`No iOS workspace or project found in ${iosDir}`)
88
+ }
89
+
90
+ function getIOSBuildConfiguration(config: string): 'Debug' | 'Release' {
91
+ return config.toLowerCase().includes('release') ? 'Release' : 'Debug'
92
+ }
93
+
94
+ function getIOSAppPath(projectRoot: string, config: string): string {
95
+ if (process.env.DETOX_IOS_APP_PATH) return process.env.DETOX_IOS_APP_PATH
96
+
97
+ const appName = getIOSProjectName(projectRoot)
98
+ const buildConfiguration = getIOSBuildConfiguration(config)
99
+ return `ios/build/Build/Products/${buildConfiguration}-iphonesimulator/${appName}.app`
100
+ }
101
+
102
+ function getIOSFullAppPath(projectRoot: string, config: string): string {
103
+ const appPath = getIOSAppPath(projectRoot, config)
104
+ return isAbsolute(appPath) ? appPath : join(projectRoot, appPath)
105
+ }
106
+
107
+ function getIOSPodTargetName(projectRoot: string): string {
108
+ const podfile = readFileSync(join(projectRoot, 'ios', 'Podfile'), 'utf-8')
109
+ const match = podfile.match(/^\s*target ['"]([^'"]+)['"] do/m)
110
+ if (!match) {
111
+ throw new Error(`No CocoaPods target found in ${join(projectRoot, 'ios', 'Podfile')}`)
112
+ }
113
+ return match[1]
114
+ }
115
+
116
+ function getIOSAppBundleId(fullAppPath: string): string | null {
117
+ const infoPlist = join(fullAppPath, 'Info.plist')
118
+ if (!existsSync(infoPlist)) return null
119
+
120
+ try {
121
+ const bundleId = execFileSync(
122
+ '/usr/bin/plutil',
123
+ ['-extract', 'CFBundleIdentifier', 'raw', '-o', '-', infoPlist],
124
+ {
125
+ encoding: 'utf-8',
126
+ stdio: ['ignore', 'pipe', 'pipe'],
127
+ }
128
+ ).trim()
129
+ return bundleId || null
130
+ } catch {
131
+ return null
132
+ }
133
+ }
134
+
135
+ function isIOSAppBundleReady(fullAppPath: string): boolean {
136
+ return existsSync(fullAppPath) && !!getIOSAppBundleId(fullAppPath)
137
+ }
138
+
78
139
  /**
79
140
  * Ensure the app is installed on a specific simulator.
80
141
  * For dev client apps, builds if needed then installs.
@@ -103,12 +164,10 @@ export async function ensureAppInstalled(opts: {
103
164
  console.info(`App ${bundleId} not installed, building...`)
104
165
  await ensureIOSFolder()
105
166
 
106
- const appPath =
107
- process.env.DETOX_IOS_APP_PATH ||
108
- 'ios/build/Build/Products/Debug-iphonesimulator/tamaguikitchensink.app'
109
- const fullAppPath = join(projectRoot, appPath)
167
+ const appPath = getIOSAppPath(projectRoot, 'ios.sim.debug')
168
+ const fullAppPath = getIOSFullAppPath(projectRoot, 'ios.sim.debug')
110
169
 
111
- if (!existsSync(fullAppPath)) {
170
+ if (!isIOSAppBundleReady(fullAppPath)) {
112
171
  await ensureIOSApp('ios.sim.debug')
113
172
  }
114
173
 
@@ -299,12 +358,10 @@ export async function ensureIOSApp(config: string = 'ios.sim.debug'): Promise<vo
299
358
 
300
359
  const projectRoot = process.cwd()
301
360
 
302
- // Check if app binary exists (use the path from detoxrc)
303
- const appPath =
304
- process.env.DETOX_IOS_APP_PATH ||
305
- 'ios/build/Build/Products/Debug-iphonesimulator/tamaguikitchensink.app'
306
- const fullAppPath = join(projectRoot, appPath)
307
- const appExists = existsSync(fullAppPath)
361
+ // check if a complete app bundle exists
362
+ const appPath = getIOSAppPath(projectRoot, config)
363
+ const fullAppPath = getIOSFullAppPath(projectRoot, config)
364
+ const appExists = isIOSAppBundleReady(fullAppPath)
308
365
 
309
366
  // If app doesn't exist, we must build regardless of fingerprint
310
367
  if (!appExists) {
@@ -366,7 +423,7 @@ export async function ensureIOSApp(config: string = 'ios.sim.debug'): Promise<vo
366
423
  }
367
424
 
368
425
  /**
369
- * Build the iOS app using detox build
426
+ * Build the iOS app using the generated Xcode workspace.
370
427
  */
371
428
  async function buildIOSApp(
372
429
  config: string,
@@ -381,18 +438,23 @@ async function buildIOSApp(
381
438
  'ios',
382
439
  'Pods',
383
440
  'Target Support Files',
384
- 'Pods-tamaguikitchensink',
385
- 'Pods-tamaguikitchensink.debug.xcconfig'
441
+ `Pods-${getIOSPodTargetName(projectRoot)}`,
442
+ `Pods-${getIOSPodTargetName(projectRoot)}.debug.xcconfig`
386
443
  )
387
444
  if (!existsSync(podConfigPath)) {
388
445
  console.info('Installing CocoaPods dependencies...')
389
446
  await $`pod install --project-directory=ios`
390
447
  }
391
448
 
392
- // Build the app using detox build
449
+ const scheme = getIOSProjectName(projectRoot)
450
+ const buildConfiguration = getIOSBuildConfiguration(config)
451
+ const workspace = join('ios', `${scheme}.xcworkspace`)
452
+ const symroot = join(projectRoot, 'ios', 'build', 'Build', 'Products')
453
+ const objroot = join(projectRoot, 'ios', 'build', 'Build', 'Intermediates.noindex')
454
+
393
455
  console.info(`Building iOS app (config: ${config})...`)
394
456
  console.info('This may take a few minutes on first run.')
395
- await $`npx detox build -c ${config}`
457
+ await $`xcodebuild -workspace ${workspace} -scheme ${scheme} -configuration ${buildConfiguration} -sdk iphonesimulator SYMROOT=${symroot} OBJROOT=${objroot}`
396
458
 
397
459
  // Save the fingerprint cache
398
460
  if (fingerprint) {
package/types/detox.d.ts CHANGED
@@ -36,15 +36,38 @@ export declare function parseDetoxArgs(platform: Platform): {
36
36
  * Build Detox CLI command arguments
37
37
  */
38
38
  export declare function buildDetoxArgs(options: DetoxRunnerOptions): string[];
39
+ interface DetoxFailureClassification {
40
+ /** every spec file with a FAIL line */
41
+ failedFiles: string[];
42
+ /** failed files whose failure matches a connect-flake signature (retry candidates) */
43
+ flakeFiles: string[];
44
+ /** failed files whose failure looks real (assertion/logic) - never retried */
45
+ realFiles: string[];
46
+ }
47
+ /**
48
+ * Classify a detox/jest run's combined output into connect-flake vs real failures,
49
+ * per spec file. jest prints each file's `FAIL e2e/X.test.ts` line followed by that
50
+ * file's failure detail (the ● blocks) before the next PASS/FAIL line, so the text
51
+ * between one FAIL line and the next delimiter is that file's failure block.
52
+ *
53
+ * Exported for unit testing against real CI logs.
54
+ */
55
+ export declare function classifyDetoxFailures(rawOutput: string): DetoxFailureClassification;
39
56
  /**
40
57
  * Reset Detox lock file to prevent ECOMPROMISED errors in CI
41
58
  * See: https://github.com/wix/Detox/issues/4210
42
59
  */
43
60
  export declare function resetDetoxLockFile(): Promise<void>;
44
61
  /**
45
- * Run Detox tests with the given options
62
+ * Run Detox tests with the given options.
63
+ *
64
+ * On failure, retries the failed spec files ONCE when (and only when) every failed
65
+ * file's failure carries the launch/connect flake signature - this recovers the
66
+ * beforeAll-launch flake that jest.retryTimes can't, without reintroducing blanket
67
+ * whole-file retries. Real failures are never retried (and would fail again anyway).
46
68
  *
47
69
  * @returns Exit code from Detox
48
70
  */
49
71
  export declare function runDetoxTests(options: DetoxRunnerOptions): Promise<number>;
72
+ export {};
50
73
  //# sourceMappingURL=detox.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"detox.d.ts","sourceRoot":"","sources":["../src/detox.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAG3C,MAAM,WAAW,kBAAkB;IACjC,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAA;IACnB,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAA;IAClB,wCAAwC;IACxC,OAAO,EAAE,MAAM,CAAA;IACf,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;CACrB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ;;;;;;;;EAsChD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,EAAE,CA6BpE;AAOD;;;GAGG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAOxD;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAwChF"}
1
+ {"version":3,"file":"detox.d.ts","sourceRoot":"","sources":["../src/detox.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAG3C,MAAM,WAAW,kBAAkB;IACjC,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAA;IACnB,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAA;IAClB,wCAAwC;IACxC,OAAO,EAAE,MAAM,CAAA;IACf,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;CACrB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ;;;;;;;;EAsChD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,EAAE,CA6BpE;AAoCD,UAAU,0BAA0B;IAClC,uCAAuC;IACvC,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,sFAAsF;IACtF,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,8EAA8E;IAC9E,SAAS,EAAE,MAAM,EAAE,CAAA;CACpB;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,0BAA0B,CA8BnF;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAOxD;AA4DD;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CA6DhF"}
@@ -1 +1 @@
1
- {"version":3,"file":"ios.d.ts","sourceRoot":"","sources":["../src/ios.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,GAAG,IAAI,CAWtD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAuB5C;AAgBD;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC7C,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BhB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAsB9D;AA+CD;;;;GAIG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAoBvD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAgBrD;AAkCD;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAAC,MAAM,GAAE,MAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyElF"}
1
+ {"version":3,"file":"ios.d.ts","sourceRoot":"","sources":["../src/ios.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,GAAG,IAAI,CAWtD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAuB5C;AA6ED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC7C,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BhB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAsB9D;AA+CD;;;;GAIG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAoBvD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAgBrD;AAkCD;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAAC,MAAM,GAAE,MAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuElF"}