@unrulysystems/rn-playwright-driver-runner 0.1.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/constants.ts","../src/plan/env.ts","../src/plan/shared.ts","../src/plan/android.ts","../src/plan/ios.ts","../src/plan/resolved.ts","../src/build-plan.ts","../src/load-config.ts","../src/print-plan.ts","../src/runner/execute.ts","../src/runner/process-runner.ts","../src/runner/resolve.ts","../src/validate.ts","../src/cli.ts"],"names":["nodeSpawn","path","fsWriteFile","chmod","run","mkdtemp","tmpdir","resolved","readFile"],"mappings":"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","file":"cli.mjs","sourcesContent":["/**\n * The driver environment-variable contract the runner produces.\n *\n * These names mirror what the Playwright fixture reads\n * (`packages/driver/src/test-env.ts` and the driver README \"Configuration\").\n * The runner sets these and then invokes Playwright; it does not introduce a\n * parallel driver-configuration surface. Token material is always passed by\n * file path (`*_TOKEN_FILE`), never inline (`*_TOKEN`) — see secret-handling.\n *\n * DELIBERATE: this is a local copy of the driver's `RN_*` contract, NOT an import\n * from the driver. The runner intentionally carries no npm dependency on the\n * driver (one-way, contract-level coupling — see README/SPEC), so the small set\n * of names is duplicated rather than shared. The tradeoff is silent drift if the\n * driver renames a variable; that is bounded by the contract being a published,\n * stable interface (`packages/driver/src/test-env.ts`) and is exercised by the\n * live e2e oracle, which fails if a name stops matching.\n */\nexport const ENV = {\n metroUrl: 'RN_METRO_URL',\n deviceId: 'RN_DEVICE_ID',\n deviceName: 'RN_DEVICE_NAME',\n timeout: 'RN_TIMEOUT',\n touchBackend: 'RN_TOUCH_BACKEND',\n xctestPort: 'RN_TOUCH_XCTEST_PORT',\n xctestTokenFile: 'RN_TOUCH_XCTEST_TOKEN_FILE',\n instrumentationPort: 'RN_TOUCH_INSTRUMENTATION_PORT',\n instrumentationTokenFile: 'RN_TOUCH_INSTRUMENTATION_TOKEN_FILE',\n androidSerial: 'ANDROID_SERIAL',\n} as const\n\n/** Touch backend forced per platform (companion-first, fail-closed). */\nexport const TOUCH_BACKEND = {\n ios: 'xctest',\n android: 'instrumentation',\n} as const\n\nexport const DEFAULTS = {\n metroHost: '127.0.0.1',\n metroPort: 8081,\n metroReadyTimeoutMs: 90_000,\n companionPort: 9999,\n /** Covers a cold `xcodebuild test` build, not just process startup (FU-2). */\n iosCompanionReadyTimeoutMs: 300_000,\n androidCompanionReadyTimeoutMs: 45_000,\n hermesTargetTimeoutMs: 60_000,\n appLaunchAttempts: 3,\n driverTimeoutMs: 30_000,\n androidGradleTasks: [':app:assembleDebug', ':app:assembleDebugAndroidTest'],\n androidAppApkPath: 'android/app/build/outputs/apk/debug/app-debug.apk',\n androidTestApkPath: 'android/app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk',\n instrumentationClass: 'com.rndriver.touchcompanion.RNDriverTouchCompanion',\n /** UI-test method the iOS companion exposes as a long-running server. */\n xctestServerTest: 'RNDriverTouchCompanionTests/testRunServer',\n /** Device-private filename the Android companion reads its token from. */\n androidTokenFileName: 'rn-driver-touch-token',\n} as const\n\n/** Placeholder shown in `--dry-run` output wherever a secret file path appears. */\nexport const SECRET_PLACEHOLDER = '<token-file>'\n","import { DEFAULTS, ENV, TOUCH_BACKEND } from '../constants'\nimport type { ResolvedAndroidTarget, ResolvedIosTarget, ResolvedMetro } from './resolved'\n\n/**\n * The driver environment-variable contract for iOS. Token material is referenced\n * by file path only (`RN_TOUCH_XCTEST_TOKEN_FILE`), never by value — matching\n * the fixture's `xctestAuthTokenFromEnv` token-file path.\n */\nexport function buildIosDriverEnv(\n resolved: ResolvedIosTarget,\n metro: ResolvedMetro,\n timeoutMs: number | undefined,\n): Record<string, string> {\n return {\n [ENV.touchBackend]: TOUCH_BACKEND.ios,\n [ENV.metroUrl]: metro.url,\n [ENV.deviceName]: resolved.simName,\n [ENV.timeout]: String(timeoutMs ?? DEFAULTS.driverTimeoutMs),\n [ENV.xctestPort]: String(resolved.touchPort),\n [ENV.xctestTokenFile]: resolved.tokenFile,\n }\n}\n\n/**\n * The driver environment-variable contract for Android. `RN_DEVICE_NAME` is the\n * Hermes target's device name (resolved at run time); `ANDROID_SERIAL` pins adb.\n */\nexport function buildAndroidDriverEnv(\n resolved: ResolvedAndroidTarget,\n metro: ResolvedMetro,\n deviceName: string,\n timeoutMs: number | undefined,\n): Record<string, string> {\n return {\n [ENV.touchBackend]: TOUCH_BACKEND.android,\n [ENV.metroUrl]: metro.url,\n [ENV.deviceName]: deviceName,\n [ENV.androidSerial]: resolved.serial,\n [ENV.timeout]: String(timeoutMs ?? DEFAULTS.driverTimeoutMs),\n [ENV.instrumentationPort]: String(resolved.touchPort),\n [ENV.instrumentationTokenFile]: resolved.tokenFile,\n }\n}\n","import type { PlaywrightConfig } from '../config'\nimport type { ResolvedMetro } from './resolved'\nimport type { CommandSpec, Step } from './types'\n\n/** Command constructors. Secret values NEVER flow through these — only paths. */\n\nexport function cmd(command: string, args: string[]): CommandSpec {\n return { command, args }\n}\n\nexport function npx(args: string[]): CommandSpec {\n return { command: 'npx', args }\n}\n\nfunction shell(command: string): CommandSpec {\n return { command: 'sh', args: ['-c', command] }\n}\n\n/** The Metro start step, shared by both platforms. */\nexport function metroStartStep(metro: ResolvedMetro): Step {\n return {\n id: 'metro.start',\n stage: 'metro',\n description: metro.reuseExisting\n ? `Start Metro (reuse if running) ${metro.url}`\n : `Start Metro ${metro.url}`,\n action: {\n type: 'command',\n background: true,\n processKey: 'metro',\n command: shell(metro.command ?? `npx expo start --localhost --port ${metro.port}`),\n },\n }\n}\n\n/**\n * The Playwright invocation, shared by both platforms (REQ-CLI-005). Spec\n * positionals and `--` passthrough are kept distinct: positional specs OVERRIDE\n * the config's spec list, while passthrough flags are ALWAYS appended. This means\n * a passthrough-only call (e.g. `… -- --grep @smoke`) still runs the configured\n * specs — it no longer silently drops them.\n */\nexport function playwrightCommand(\n playwright: PlaywrightConfig | undefined,\n specs: readonly string[],\n passthrough: readonly string[],\n): CommandSpec {\n const args = ['playwright', 'test']\n if (playwright?.config) args.push('--config', playwright.config)\n const effectiveSpecs = specs.length > 0 ? specs : (playwright?.specs ?? [])\n args.push(...effectiveSpecs, ...passthrough)\n args.push('--reporter=line')\n return npx(args)\n}\n","import type { AndroidConfig, PlaywrightConfig } from '../config'\nimport { DEFAULTS } from '../constants'\nimport { buildAndroidDriverEnv } from './env'\nimport type { ResolvedAndroidTarget, ResolvedMetro } from './resolved'\nimport { metroStartStep, npx, playwrightCommand } from './shared'\nimport type { CleanupAction, CommandSpec, Plan, Step } from './types'\n\nexport interface PlanAndroidInput {\n readonly android: AndroidConfig\n readonly metro: ResolvedMetro\n readonly resolved: ResolvedAndroidTarget\n readonly playwright: PlaywrightConfig | undefined\n readonly timeoutMs: number | undefined\n /** Positional spec paths; override the config spec list when non-empty. */\n readonly specs: readonly string[]\n /** Args after `--`; always appended to the Playwright invocation. */\n readonly passthrough: readonly string[]\n /**\n * The Hermes target device name to pin (`RN_DEVICE_NAME`). Resolved at run\n * time on a real run; a placeholder for `--dry-run`.\n */\n readonly hermesDeviceName: string\n}\n\n/**\n * Pure planner for the Android instrumentation lifecycle. The companion auth\n * token is installed into the app's private `files/` directory and referenced by\n * the `rnDriverAuthTokenFile` instrument argument — never the inline token\n * argument (REQ-AND-006). The host token file is piped to the device via stdin,\n * so the value never enters argv.\n */\nexport function planAndroid(input: PlanAndroidInput): Plan {\n const { android, metro, resolved, playwright, timeoutMs, specs, passthrough, hermesDeviceName } =\n input\n const serial = resolved.serial\n const gradleTasks = android.gradleTasks ?? [...DEFAULTS.androidGradleTasks]\n const appApk = android.appApkPath ?? DEFAULTS.androidAppApkPath\n const testApk = android.testApkPath ?? DEFAULTS.androidTestApkPath\n\n const steps: Step[] = []\n const push = (step: Step) => steps.push(step)\n\n // build — regenerate project, build APKs, install both.\n push({\n id: 'android.prebuild',\n stage: 'build',\n description: 'Generate Android project (expo prebuild)',\n action: {\n type: 'command',\n command: npx(['expo', 'prebuild', '--platform', 'android', '--no-install']),\n },\n skippable: true,\n })\n push({\n id: 'android.gradle',\n stage: 'build',\n description: `Build app + androidTest APKs (${gradleTasks.join(' ')})`,\n action: {\n type: 'command',\n command: { command: './gradlew', args: gradleTasks, cwd: 'android' },\n },\n skippable: true,\n })\n push({\n id: 'android.install-app',\n stage: 'build',\n description: `Install app APK`,\n action: { type: 'command', command: adb(serial, ['install', '-r', appApk]) },\n skippable: true,\n })\n push({\n id: 'android.install-test',\n stage: 'build',\n description: `Install androidTest APK`,\n action: { type: 'command', command: adb(serial, ['install', '-r', '-t', testApk]) },\n skippable: true,\n })\n\n // companion — install the token into the app's private files via stdin (the\n // value never touches argv). The redirect MUST run inside the run-as'd app-uid\n // shell, so the whole `run-as … sh -c '…'` script is a single adb-shell arg\n // (see adbShellScript). `mkdir -p files` is defensive: the app's files/ dir is\n // created lazily on first run, and --skip-build may reach here before any\n // launch has created it.\n push({\n id: 'android.install-token',\n stage: 'companion',\n description: 'Install companion token into app private files',\n action: {\n type: 'command',\n command: {\n ...adbShellScript(\n serial,\n `run-as ${android.packageName} sh -c 'mkdir -p files && cat > files/${resolved.deviceTokenFileName} && chmod 600 files/${resolved.deviceTokenFileName}'`,\n ),\n stdinFromFile: resolved.tokenFile,\n },\n },\n })\n\n // metro — start (or reuse) and wait.\n push(metroStartStep(metro))\n push({\n id: 'metro.ready',\n stage: 'metro',\n description: `Wait for Metro at ${metro.url}`,\n action: {\n type: 'probe',\n probe: { kind: 'metro-status', metroUrl: metro.url, timeoutMs: metro.readyTimeoutMs },\n },\n })\n\n // device — reverse Metro and write the debug host the RN dev support reads.\n push({\n id: 'android.reverse-metro',\n stage: 'device',\n description: `adb reverse tcp:${metro.port}`,\n action: {\n type: 'command',\n command: adb(serial, ['reverse', `tcp:${metro.port}`, `tcp:${metro.port}`]),\n },\n })\n if (metro.port !== DEFAULTS.metroPort) {\n push({\n id: 'android.reverse-default',\n stage: 'device',\n description: `adb reverse tcp:${DEFAULTS.metroPort} -> tcp:${metro.port}`,\n action: {\n type: 'command',\n command: adb(serial, ['reverse', `tcp:${DEFAULTS.metroPort}`, `tcp:${metro.port}`]),\n },\n })\n }\n push({\n id: 'android.debug-host',\n stage: 'device',\n description: 'Write app debug_http_host',\n action: {\n type: 'command',\n command: {\n // Single adb-shell arg so the redirect runs inside the run-as'd app-uid\n // shell (the shared_prefs path is app-private; the outer `shell` uid\n // cannot write it).\n ...adbShellScript(\n serial,\n `run-as ${android.packageName} sh -c 'mkdir -p /data/data/${android.packageName}/shared_prefs && cat > /data/data/${android.packageName}/shared_prefs/${android.packageName}_preferences.xml'`,\n ),\n stdinContents: debugHostXml(`localhost:${metro.port}`),\n },\n },\n })\n\n // app-launch — first launch + wait for a Hermes target. The wait re-issues\n // `am start` on a transient registration miss (REQ-AND-005).\n const launchCommand = launchCommandFor(android, serial)\n push(launchStep('android.launch-1', android, serial))\n push(hermesStep('android.hermes-1', android, metro, resolved, hermesDeviceName, launchCommand))\n\n // companion — forward the port (clearing any stale mapping first) and start\n // the instrumentation server, then wait for an authenticated hello.\n push({\n id: 'android.forward-clean',\n stage: 'companion',\n description: `Clear stale adb forward tcp:${resolved.touchPort}`,\n action: {\n type: 'command',\n command: adb(serial, ['forward', '--remove', `tcp:${resolved.touchPort}`]),\n allowFailure: true,\n },\n })\n push({\n id: 'android.forward',\n stage: 'companion',\n description: `adb forward tcp:${resolved.touchPort}`,\n action: {\n type: 'command',\n command: adb(serial, ['forward', `tcp:${resolved.touchPort}`, `tcp:${resolved.touchPort}`]),\n },\n })\n push({\n id: 'android.instrument-start',\n stage: 'companion',\n description: `Start instrumentation companion on port ${resolved.touchPort}`,\n action: {\n type: 'command',\n background: true,\n processKey: 'companion',\n command: adb(serial, [\n 'shell',\n 'am',\n 'instrument',\n '-e',\n 'rnDriverAuthTokenFile',\n resolved.deviceTokenFileName,\n '-e',\n 'rnDriverPort',\n String(resolved.touchPort),\n '-w',\n resolved.instrumentationTarget,\n ]),\n },\n })\n push({\n id: 'android.instrument-ready',\n stage: 'companion',\n description: 'Wait for companion to accept a hello',\n action: {\n type: 'probe',\n probe: {\n kind: 'instrumentation-hello',\n port: resolved.touchPort,\n tokenFile: resolved.tokenFile,\n timeoutMs: resolved.companionReadyTimeoutMs,\n },\n },\n })\n\n // app-launch — relaunch so the app picks up the live companion, wait again.\n push(launchStep('android.launch-2', android, serial))\n push(hermesStep('android.hermes-2', android, metro, resolved, hermesDeviceName, launchCommand))\n\n const cleanup: CleanupAction[] = [\n {\n type: 'kill-process',\n processKey: 'companion',\n description: 'Stop instrumentation companion',\n },\n {\n type: 'command',\n command: adb(serial, ['reverse', '--remove', `tcp:${metro.port}`]),\n description: 'Remove metro reverse',\n },\n // Mirror android.reverse-default: when Metro is off 8081 the plan also adds a\n // `tcp:8081 -> tcp:<port>` fallback reverse, so cleanup must remove BOTH or a\n // stale 8081 mapping wedges the next run (REQ-CLEAN-003).\n ...(metro.port === DEFAULTS.metroPort\n ? []\n : [\n {\n type: 'command' as const,\n command: adb(serial, ['reverse', '--remove', `tcp:${DEFAULTS.metroPort}`]),\n description: 'Remove fallback 8081 metro reverse',\n },\n ]),\n {\n type: 'command',\n command: adb(serial, ['forward', '--remove', `tcp:${resolved.touchPort}`]),\n description: 'Remove companion forward',\n },\n {\n type: 'command',\n command: adb(serial, [\n 'shell',\n 'run-as',\n android.packageName,\n 'rm',\n '-f',\n `files/${resolved.deviceTokenFileName}`,\n ]),\n description: 'Remove device token file',\n },\n {\n type: 'command',\n command: adb(serial, ['shell', 'am', 'force-stop', android.packageName]),\n description: 'Force-stop app',\n },\n { type: 'kill-process', processKey: 'metro', description: 'Stop runner-owned Metro' },\n { type: 'remove-file', path: resolved.tokenFile, description: 'Remove per-run token file' },\n ]\n\n return {\n platform: 'android',\n steps,\n cleanup,\n driverEnv: buildAndroidDriverEnv(resolved, metro, hermesDeviceName, timeoutMs),\n playwright: playwrightCommand(playwright, specs, passthrough),\n }\n}\n\nfunction launchCommandFor(android: AndroidConfig, serial: string): CommandSpec {\n return adb(serial, [\n 'shell',\n 'am',\n 'start',\n '-W',\n '-n',\n `${android.packageName}/${android.activity}`,\n ])\n}\n\nfunction launchStep(id: string, android: AndroidConfig, serial: string): Step {\n return {\n id,\n stage: 'app-launch',\n description: `Launch ${android.packageName}/${android.activity}`,\n action: { type: 'command', command: launchCommandFor(android, serial) },\n }\n}\n\nfunction hermesStep(\n id: string,\n android: AndroidConfig,\n metro: ResolvedMetro,\n resolved: ResolvedAndroidTarget,\n deviceNameMatch: string,\n launchCommand: CommandSpec,\n): Step {\n return {\n id,\n stage: 'hermes-target',\n description: 'Wait for Hermes target',\n action: {\n type: 'probe',\n probe: {\n kind: 'hermes-target',\n platform: 'android',\n metroUrl: metro.url,\n appId: android.packageName,\n deviceNameMatch,\n timeoutMs: resolved.hermesTimeoutMs,\n },\n // REQ-AND-005: on a transient miss, re-issue `am start` and re-probe.\n // `appLaunchAttempts` total attempts ⇒ that many minus the first = retries.\n retry: { command: launchCommand, max: DEFAULTS.appLaunchAttempts - 1 },\n },\n }\n}\n\nfunction debugHostXml(host: string): string {\n return `<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\\n<map>\\n <string name=\"debug_http_host\">${host}</string>\\n</map>\\n`\n}\n\nfunction adb(serial: string, args: string[]): CommandSpec {\n return { command: 'adb', args: ['-s', serial, ...args] }\n}\n\n/**\n * `adb -s <serial> shell <remote>` with the ENTIRE remote command as ONE argv\n * element. Required whenever the remote command uses shell redirection (`>`)\n * inside `run-as`: the process runner spawns adb without a local shell, and\n * `adb shell a b c` re-joins its trailing args and hands them to the device's\n * default shell. If `sh -c <script>` is split across args, that OUTER device\n * shell (uid `shell`, cwd `/`) performs the `>` redirect — not the run-as'd\n * app-uid shell — so the write fails (\"can't create files/…: No such file or\n * directory\") or hits a permission error on app-private paths. Passing the whole\n * `run-as … sh -c '…'` as one arg (literal inner single-quotes) makes the device\n * shell hand the script to the inner `sh -c`. Mirrors the proven bash recipe's\n * `adb shell \"run-as … sh -c '…'\"` quoting.\n */\nfunction adbShellScript(serial: string, remote: string): CommandSpec {\n return { command: 'adb', args: ['-s', serial, 'shell', remote] }\n}\n","import type { IosConfig, PlaywrightConfig } from '../config'\nimport { DEFAULTS } from '../constants'\nimport { buildIosDriverEnv } from './env'\nimport type { ResolvedIosTarget, ResolvedMetro } from './resolved'\nimport { cmd, metroStartStep, npx, playwrightCommand } from './shared'\nimport type { CleanupAction, CommandSpec, Plan, Step } from './types'\n\nexport interface PlanIosInput {\n readonly ios: IosConfig\n readonly metro: ResolvedMetro\n readonly resolved: ResolvedIosTarget\n readonly playwright: PlaywrightConfig | undefined\n readonly timeoutMs: number | undefined\n /** Positional spec paths; override the config spec list when non-empty. */\n readonly specs: readonly string[]\n /** Args after `--`; always appended to the Playwright invocation. */\n readonly passthrough: readonly string[]\n}\n\n/**\n * Pure planner for the iOS XCTest lifecycle. Given config + already-resolved\n * runtime values, returns the ordered, side-effect-free {@link Plan}. Identical\n * inputs always yield an identical plan.\n *\n * The companion reads its port + token-file path from the runtime-config JSON\n * written into the UI-test target resource (the documented reliable path when\n * Xcode does not propagate test env vars). The token *value* lives only in the\n * separate `0600` file referenced by `authTokenFile`; it never enters the plan.\n */\nexport function planIos(input: PlanIosInput): Plan {\n const { ios, metro, resolved, playwright, timeoutMs, specs, passthrough } = input\n const isDevClient = ios.launch.kind === 'expo-dev-client'\n\n const steps: Step[] = []\n const push = (step: Step) => steps.push(step)\n\n // device — boot (and wait for) the target simulator. `pickSimulator` can pick a\n // shutdown sim (newest available when none booted), so issue `simctl boot`\n // first (REQ-IOS-001); it exits non-zero when already booted (\"current state:\n // Booted\"), which is the benign precondition we want, so allowFailure. Then\n // `bootstatus -b` blocks until the sim is fully booted.\n push({\n id: 'ios.boot',\n stage: 'device',\n description: `Boot simulator ${resolved.simName}`,\n action: {\n type: 'command',\n command: xcrun(['simctl', 'boot', resolved.simUdid]),\n allowFailure: true,\n },\n })\n push({\n id: 'ios.boot-wait',\n stage: 'device',\n description: `Wait for ${resolved.simName} to finish booting`,\n action: { type: 'command', command: xcrun(['simctl', 'bootstatus', resolved.simUdid, '-b']) },\n })\n\n // build — regenerate the project, scaffold the companion target, write the\n // per-run runtime config, install pods. The token/config refresh is NOT\n // skippable; the project-mutating steps are (REQ-CLI-004).\n push({\n id: 'ios.prebuild',\n stage: 'build',\n description: 'Generate iOS project (expo prebuild)',\n action: {\n type: 'command',\n command: npx(['expo', 'prebuild', '--platform', 'ios', '--no-install']),\n },\n skippable: true,\n })\n push({\n id: 'ios.scaffold',\n stage: 'build',\n description: 'Scaffold XCTest companion target',\n action: {\n type: 'command',\n // Pass the resolved UI-test scheme so a custom `ios.uitestScheme` scaffolds\n // the SAME target that companion startup later builds (default is\n // `${appScheme}UITests`).\n command: npx([\n 'rn-driver-xctest-scaffold',\n '--ios-dir',\n 'ios',\n '--project-name',\n ios.appScheme,\n '--uitest-scheme',\n resolved.uitestScheme,\n ]),\n },\n skippable: true,\n })\n push({\n id: 'ios.runtime-config',\n stage: 'build',\n description: 'Write companion runtime config (port + token-file ref)',\n action: {\n type: 'write-file',\n path: resolved.runtimeConfigFile,\n contents: runtimeConfigJson(resolved, ios),\n mode: 0o600,\n },\n })\n push({\n id: 'ios.pods',\n stage: 'build',\n description: 'Install CocoaPods',\n action: { type: 'command', command: cmd('pod', ['install', '--project-directory=ios']) },\n skippable: true,\n })\n\n // metro — start (or reuse) the packager and wait for it.\n push(metroStartStep(metro))\n push({\n id: 'metro.ready',\n stage: 'metro',\n description: `Wait for Metro at ${metro.url}`,\n action: {\n type: 'probe',\n probe: { kind: 'metro-status', metroUrl: metro.url, timeoutMs: metro.readyTimeoutMs },\n },\n })\n\n // device — point the app at this Metro via NSUserDefaults (best-effort).\n push({\n id: 'ios.packager-host-location',\n stage: 'device',\n description: 'Point app at Metro (RCT_jsLocation)',\n action: {\n type: 'command',\n command: xcrun([\n 'simctl',\n 'spawn',\n resolved.simUdid,\n 'defaults',\n 'write',\n ios.bundleId,\n 'RCT_jsLocation',\n `${metro.host}:${metro.port}`,\n ]),\n allowFailure: true,\n },\n })\n push({\n id: 'ios.packager-host-scheme',\n stage: 'device',\n description: 'Point app at Metro (RCT_packager_scheme)',\n action: {\n type: 'command',\n command: xcrun([\n 'simctl',\n 'spawn',\n resolved.simUdid,\n 'defaults',\n 'write',\n ios.bundleId,\n 'RCT_packager_scheme',\n 'http',\n ]),\n allowFailure: true,\n },\n })\n\n // build — compile the app scheme. `env -u LD` avoids the generic-Unix LD=ld\n // link failure (REQ-IOS-004).\n push({\n id: 'ios.build-app',\n stage: 'build',\n description: `Build app scheme ${ios.appScheme}`,\n action: {\n type: 'command',\n command: xcodebuild([\n 'build',\n '-workspace',\n ios.workspace,\n '-scheme',\n ios.appScheme,\n '-destination',\n resolved.destination,\n `RCT_METRO_PORT=${metro.port}`,\n ]),\n },\n skippable: true,\n })\n\n // device — app-specific pre-launch seeds (e.g. onboarding flags).\n for (const [key, value] of Object.entries(ios.defaults ?? {})) {\n push({\n id: `ios.seed.${key}`,\n stage: 'device',\n description: `Seed default ${key}`,\n action: {\n type: 'command',\n command: xcrun([\n 'simctl',\n 'spawn',\n resolved.simUdid,\n 'defaults',\n 'write',\n ios.bundleId,\n ...defaultsArgs(key, value),\n ]),\n allowFailure: true,\n },\n })\n }\n\n // companion — free a stale listener (FU-3), start the UI-test server, wait for\n // it within a bound that covers a cold xcodebuild test build (FU-2).\n push({\n id: 'ios.free-port',\n stage: 'companion',\n description: `Free stale listener on port ${resolved.touchPort}`,\n action: { type: 'free-port', port: resolved.touchPort },\n })\n push({\n id: 'ios.companion-start',\n stage: 'companion',\n description: `Start XCTest companion on port ${resolved.touchPort}`,\n action: {\n type: 'command',\n background: true,\n processKey: 'companion',\n command: xcodebuild(\n [\n 'test',\n '-workspace',\n ios.workspace,\n '-scheme',\n resolved.uitestScheme,\n '-destination',\n resolved.destination,\n `-only-testing:${resolved.uitestScheme}/${DEFAULTS.xctestServerTest}`,\n `RCT_METRO_PORT=${metro.port}`,\n ],\n {\n RN_TOUCH_XCTEST_PORT: String(resolved.touchPort),\n RN_TOUCH_XCTEST_CONFIG_FILE: resolved.runtimeConfigFile,\n },\n ),\n },\n })\n push({\n id: 'ios.companion-ready',\n stage: 'companion',\n description: 'Wait for companion to accept a hello',\n action: {\n type: 'probe',\n probe: {\n kind: 'xctest-hello',\n port: resolved.touchPort,\n tokenFile: resolved.tokenFile,\n timeoutMs: resolved.companionReadyTimeoutMs,\n },\n },\n })\n\n // app-launch — dev-client: terminate-first then cold-launch via --initialUrl\n // (FU-1). plain: the companion's launch mode already launched the app.\n if (isDevClient) {\n push({\n id: 'ios.terminate-before-launch',\n stage: 'app-launch',\n description: 'Terminate any running instance (cold launch requires it)',\n action: {\n type: 'command',\n command: xcrun(['simctl', 'terminate', resolved.simUdid, ios.bundleId]),\n allowFailure: true,\n },\n })\n push({\n id: 'ios.launch',\n stage: 'app-launch',\n description: `Cold-launch dev client via --initialUrl ${resolved.initialUrl}`,\n action: {\n type: 'command',\n command: xcrun([\n 'simctl',\n 'launch',\n resolved.simUdid,\n ios.bundleId,\n '--initialUrl',\n resolved.initialUrl,\n ]),\n },\n })\n }\n\n // hermes-target — wait for a Hermes target on THIS simulator before testing.\n push({\n id: 'ios.hermes',\n stage: 'hermes-target',\n description: 'Wait for Hermes target',\n action: {\n type: 'probe',\n probe: {\n kind: 'hermes-target',\n platform: 'ios',\n metroUrl: metro.url,\n appId: ios.bundleId,\n deviceNameMatch: resolved.simName,\n timeoutMs: resolved.hermesTimeoutMs,\n },\n },\n })\n\n const cleanup: CleanupAction[] = [\n { type: 'kill-process', processKey: 'companion', description: 'Stop XCTest companion' },\n {\n type: 'free-port',\n port: resolved.touchPort,\n description: 'Free companion port (reap sim-hosted child)',\n },\n { type: 'kill-process', processKey: 'metro', description: 'Stop runner-owned Metro' },\n { type: 'remove-file', path: resolved.tokenFile, description: 'Remove per-run token file' },\n // REQ-SEC-004: the per-run runtime config (port + token-file ref) is written\n // into the UI-test target every run; remove it so no generated artifact is\n // left in the app project.\n {\n type: 'remove-file',\n path: resolved.runtimeConfigFile,\n description: 'Remove per-run companion runtime config',\n },\n ]\n\n return {\n platform: 'ios',\n steps,\n cleanup,\n driverEnv: buildIosDriverEnv(resolved, metro, timeoutMs),\n playwright: playwrightCommand(playwright, specs, passthrough),\n }\n}\n\nfunction runtimeConfigJson(resolved: ResolvedIosTarget, ios: IosConfig): string {\n return JSON.stringify({\n port: resolved.touchPort,\n authTokenFile: resolved.tokenFile,\n launch: ios.launch.mode,\n })\n}\n\nfunction defaultsArgs(key: string, value: string | number | boolean): string[] {\n if (typeof value === 'boolean') return [key, '-bool', value ? 'YES' : 'NO']\n if (typeof value === 'number') return [key, '-int', String(value)]\n return [key, value]\n}\n\n// --- iOS-specific command constructors (no secret values ever flow through these) ---\n\nfunction xcrun(args: string[]): CommandSpec {\n return { command: 'xcrun', args }\n}\n\n/** `env -u LD xcodebuild …` with optional extra env. */\nfunction xcodebuild(args: string[], env?: Record<string, string>): CommandSpec {\n return env\n ? { command: 'env', args: ['-u', 'LD', 'xcodebuild', ...args], env }\n : { command: 'env', args: ['-u', 'LD', 'xcodebuild', ...args] }\n}\n","import type { AndroidConfig, IosConfig, MetroConfig } from '../config'\nimport { DEFAULTS, SECRET_PLACEHOLDER } from '../constants'\n\n/**\n * Runtime-resolved values the pure planners consume. On a real run the\n * effectful resolver fills these in (simulator/emulator selection, minted\n * `0600` token files, probed Metro port). For `--dry-run` the resolver is\n * replaced by {@link placeholderMetro}/{@link placeholderIos}/{@link placeholderAndroid},\n * which fill the same fields with inert placeholders so planning stays pure and\n * side-effect-free.\n */\nexport interface ResolvedMetro {\n readonly url: string\n readonly host: string\n readonly port: number\n readonly command: string | undefined\n readonly reuseExisting: boolean\n readonly readyTimeoutMs: number\n}\n\nexport interface ResolvedIosTarget {\n readonly simUdid: string\n readonly simName: string\n readonly destination: string\n readonly uitestScheme: string\n readonly touchPort: number\n readonly companionReadyTimeoutMs: number\n readonly hermesTimeoutMs: number\n /** Path to the per-run `0600` token file (value never appears in the plan). */\n readonly tokenFile: string\n /** Path to the per-run companion runtime-config JSON. */\n readonly runtimeConfigFile: string\n /** Metro URL handed to the dev launcher (`simctl launch --initialUrl`). */\n readonly initialUrl: string\n}\n\nexport interface ResolvedAndroidTarget {\n readonly serial: string\n readonly touchPort: number\n readonly companionReadyTimeoutMs: number\n readonly hermesTimeoutMs: number\n /** Host path to the per-run `0600` token file. */\n readonly tokenFile: string\n /** Filename the token is installed under in the app's private `files/` dir. */\n readonly deviceTokenFileName: string\n readonly instrumentationTarget: string\n}\n\nexport function resolveMetro(\n metro: MetroConfig | undefined,\n overrides: { url?: string; host?: string; port?: number } = {},\n): ResolvedMetro {\n const host = overrides.host ?? metro?.host ?? DEFAULTS.metroHost\n const fromUrl = parseMetroUrl(overrides.url ?? metro?.url)\n const port = fromUrl?.port ?? overrides.port ?? metro?.port ?? DEFAULTS.metroPort\n const resolvedHost = fromUrl?.host ?? host\n const url = fromUrl?.url ?? `http://${resolvedHost}:${port}`\n return {\n url,\n host: resolvedHost,\n port,\n command: metro?.command,\n reuseExisting: metro?.reuseExisting ?? false,\n readyTimeoutMs: metro?.readyTimeoutMs ?? DEFAULTS.metroReadyTimeoutMs,\n }\n}\n\nfunction parseMetroUrl(\n raw: string | undefined,\n): { url: string; host: string; port: number } | undefined {\n if (!raw) return undefined\n const parsed = new URL(raw)\n const port = parsed.port\n ? Number.parseInt(parsed.port, 10)\n : parsed.protocol === 'https:'\n ? 443\n : 80\n return { url: raw.replace(/\\/$/, ''), host: parsed.hostname, port }\n}\n\nexport function uitestScheme(ios: IosConfig): string {\n return ios.uitestScheme ?? `${ios.appScheme}UITests`\n}\n\nexport function instrumentationTarget(android: AndroidConfig): string {\n return (\n android.instrumentationTarget ?? `${android.packageName}.test/${DEFAULTS.instrumentationClass}`\n )\n}\n\n/** Dry-run resolver: same fields, inert placeholders, no I/O. */\nexport function placeholderIos(ios: IosConfig, metro: ResolvedMetro): ResolvedIosTarget {\n return {\n simUdid: '<sim-udid>',\n simName: '<sim-name>',\n destination: ios.destination ?? 'platform=iOS Simulator,id=<sim-udid>',\n uitestScheme: uitestScheme(ios),\n touchPort: ios.companion?.port ?? DEFAULTS.companionPort,\n companionReadyTimeoutMs: ios.companion?.readyTimeoutMs ?? DEFAULTS.iosCompanionReadyTimeoutMs,\n hermesTimeoutMs: DEFAULTS.hermesTargetTimeoutMs,\n tokenFile: SECRET_PLACEHOLDER,\n runtimeConfigFile: '<runtime-config>',\n initialUrl: ios.launch.initialUrl ?? metro.url,\n }\n}\n\nexport function placeholderAndroid(\n android: AndroidConfig,\n _metro: ResolvedMetro,\n): ResolvedAndroidTarget {\n return {\n serial: '<android-serial>',\n touchPort: android.companion?.port ?? DEFAULTS.companionPort,\n companionReadyTimeoutMs:\n android.companion?.readyTimeoutMs ?? DEFAULTS.androidCompanionReadyTimeoutMs,\n hermesTimeoutMs: DEFAULTS.hermesTargetTimeoutMs,\n tokenFile: SECRET_PLACEHOLDER,\n deviceTokenFileName: DEFAULTS.androidTokenFileName,\n instrumentationTarget: instrumentationTarget(android),\n }\n}\n","import type { Platform, RnDriverConfig } from './config'\nimport { planAndroid } from './plan/android'\nimport { planIos } from './plan/ios'\nimport { placeholderAndroid, placeholderIos, resolveMetro } from './plan/resolved'\nimport type { Plan } from './plan/types'\n\nexport interface MetroOverrides {\n readonly url?: string\n readonly host?: string\n readonly port?: number\n}\n\nexport interface BuildPlanOptions {\n readonly metroOverrides?: MetroOverrides\n /** Positional spec paths; override the config spec list when non-empty. */\n readonly specs?: readonly string[]\n /** Args after `--`; always appended to the Playwright invocation. */\n readonly passthrough?: readonly string[]\n}\n\n/**\n * Build the plan for a platform using placeholder (no-I/O) resolution. This is\n * the `--dry-run` path and the unit-test entry point: identical config yields an\n * identical plan with zero side effects.\n */\nexport function buildDryRunPlan(\n config: RnDriverConfig,\n platform: Platform,\n opts: BuildPlanOptions = {},\n): Plan {\n const metro = resolveMetro(config.metro, opts.metroOverrides ?? {})\n const specs = opts.specs ?? []\n const passthrough = opts.passthrough ?? []\n\n if (platform === 'ios') {\n const ios = config.ios\n if (!ios) throw new Error('config.ios is required to plan the ios platform')\n return planIos({\n ios,\n metro,\n resolved: placeholderIos(ios, metro),\n playwright: config.playwright,\n timeoutMs: config.timeoutMs,\n specs,\n passthrough,\n })\n }\n\n const android = config.android\n if (!android) throw new Error('config.android is required to plan the android platform')\n return planAndroid({\n android,\n metro,\n resolved: placeholderAndroid(android, metro),\n playwright: config.playwright,\n timeoutMs: config.timeoutMs,\n specs,\n passthrough,\n hermesDeviceName: '<android-device>',\n })\n}\n","import { existsSync } from 'node:fs'\nimport path from 'node:path'\nimport { pathToFileURL } from 'node:url'\n\n/**\n * Loads an ES module by absolute path and returns its namespace. Injected in\n * tests; the default uses native dynamic `import`, which resolves `.js`/`.mjs`\n * everywhere and `.ts` under bun (how the example runs). The dedicated\n * TS-loader dependency for plain Node is deferred (SPEC open item).\n */\nexport type ConfigImporter = (absolutePath: string) => Promise<unknown>\n\nconst DEFAULT_CONFIG_NAMES = [\n 'rn-driver.config.ts',\n 'rn-driver.config.mts',\n 'rn-driver.config.mjs',\n 'rn-driver.config.js',\n]\n\nexport interface LoadedConfig {\n readonly path: string\n readonly config: unknown\n}\n\nexport class ConfigNotFoundError extends Error {\n constructor(searchedFrom: string, configPath: string | undefined) {\n super(\n configPath\n ? `Config file not found: ${configPath}`\n : `No rn-driver.config.{ts,mts,mjs,js} found searching up from ${searchedFrom}`,\n )\n this.name = 'ConfigNotFoundError'\n }\n}\n\nconst defaultImporter: ConfigImporter = (absolutePath) => import(pathToFileURL(absolutePath).href)\n\nexport async function loadConfig(opts: {\n cwd: string\n configPath?: string\n importer?: ConfigImporter\n fileExists?: (p: string) => boolean\n}): Promise<LoadedConfig> {\n const importer = opts.importer ?? defaultImporter\n const fileExists = opts.fileExists ?? existsSync\n\n const resolvedPath = opts.configPath\n ? path.resolve(opts.cwd, opts.configPath)\n : findConfigUp(opts.cwd, fileExists)\n\n if (!resolvedPath || !fileExists(resolvedPath)) {\n throw new ConfigNotFoundError(opts.cwd, opts.configPath)\n }\n\n const namespace = await importer(resolvedPath)\n const config = extractDefault(namespace)\n return { path: resolvedPath, config }\n}\n\nfunction extractDefault(namespace: unknown): unknown {\n if (namespace && typeof namespace === 'object' && 'default' in namespace) {\n return (namespace as { default: unknown }).default\n }\n return namespace\n}\n\nfunction findConfigUp(startDir: string, fileExists: (p: string) => boolean): string | undefined {\n let dir = path.resolve(startDir)\n // Walk to the filesystem root; `path.dirname('/') === '/'` terminates the loop.\n for (;;) {\n for (const name of DEFAULT_CONFIG_NAMES) {\n const candidate = path.join(dir, name)\n if (fileExists(candidate)) return candidate\n }\n const parent = path.dirname(dir)\n if (parent === dir) return undefined\n dir = parent\n }\n}\n","import type { CleanupAction, CommandSpec, Plan, ReadinessProbe, StepAction } from './plan/types'\n\n/**\n * Render a {@link Plan} as auditable text for `--dry-run`. Token material appears\n * only as the placeholder file path (dry-run resolution fills `tokenFile` with\n * `<token-file>`), so this output never leaks a secret value.\n */\nexport function renderPlan(plan: Plan): string {\n const lines: string[] = []\n lines.push(`Plan (${plan.platform}) — ${plan.steps.length} steps`)\n for (const step of plan.steps) {\n const tag = `[${step.stage}]`.padEnd(15)\n const skip = step.skippable ? ' (skip-build: skipped)' : ''\n lines.push(` ${tag}${step.id} — ${step.description}${skip}`)\n lines.push(` ${renderAction(step.action)}`)\n }\n\n lines.push('')\n lines.push('Driver env (handed to Playwright):')\n for (const [key, value] of Object.entries(plan.driverEnv)) {\n lines.push(` ${key}=${value}`)\n }\n\n lines.push('')\n lines.push('Playwright:')\n lines.push(` ${renderCommand(plan.playwright)}`)\n\n lines.push('')\n lines.push('Cleanup (defensive, idempotent):')\n for (const action of plan.cleanup) {\n lines.push(` - ${action.description}: ${renderCleanup(action)}`)\n }\n\n return lines.join('\\n')\n}\n\nfunction renderAction(action: StepAction): string {\n switch (action.type) {\n case 'command':\n return `${action.background ? 'spawn ' : '$ '}${renderCommand(action.command)}${action.allowFailure ? ' (best-effort)' : ''}`\n case 'write-file':\n return `write ${action.path}${action.mode ? ` (mode ${action.mode.toString(8)})` : ''}`\n case 'free-port':\n return `free-port ${action.port}`\n case 'probe':\n return `probe ${renderProbe(action.probe)}`\n default: {\n const _exhaustive: never = action\n throw new Error(`unhandled action: ${JSON.stringify(_exhaustive)}`)\n }\n }\n}\n\nfunction renderCleanup(action: CleanupAction): string {\n switch (action.type) {\n case 'kill-process':\n return `kill ${action.processKey}`\n case 'free-port':\n return `free-port ${action.port}`\n case 'remove-file':\n return `rm ${action.path}`\n case 'command':\n return `$ ${renderCommand(action.command)}`\n default: {\n const _exhaustive: never = action\n throw new Error(`unhandled cleanup: ${JSON.stringify(_exhaustive)}`)\n }\n }\n}\n\nfunction renderCommand(command: CommandSpec): string {\n const env = command.env\n ? `${Object.entries(command.env)\n .map(([k, v]) => `${k}=${v}`)\n .join(' ')} `\n : ''\n const stdin = command.stdinFromFile\n ? ` < ${command.stdinFromFile}`\n : command.stdinContents\n ? ' < <stdin>'\n : ''\n const cwd = command.cwd ? ` (cwd: ${command.cwd})` : ''\n return `${env}${command.command} ${command.args.join(' ')}${stdin}${cwd}`.trim()\n}\n\nfunction renderProbe(probe: ReadinessProbe): string {\n switch (probe.kind) {\n case 'metro-status':\n return `metro-status ${probe.metroUrl} (≤${probe.timeoutMs}ms)`\n case 'hermes-target':\n return `hermes-target ${probe.appId}${probe.deviceNameMatch ? ` @ ${probe.deviceNameMatch}` : ''} (≤${probe.timeoutMs}ms)`\n case 'xctest-hello':\n return `xctest-hello :${probe.port} (≤${probe.timeoutMs}ms)`\n case 'instrumentation-hello':\n return `instrumentation-hello :${probe.port} (≤${probe.timeoutMs}ms)`\n default: {\n const _exhaustive: never = probe\n throw new Error(`unhandled probe: ${JSON.stringify(_exhaustive)}`)\n }\n }\n}\n","import type { Stage } from '../plan/types'\nimport type {\n CleanupAction,\n Plan,\n ProcessRunner,\n ReadinessProbe,\n SpawnHandle,\n Step,\n} from '../plan/types'\n\nexport class StageError extends Error {\n readonly stage: Stage\n readonly stepId: string\n constructor(stage: Stage, stepId: string, message: string) {\n super(`[${stage}] ${stepId}: ${message}`)\n this.name = 'StageError'\n this.stage = stage\n this.stepId = stepId\n }\n}\n\nexport interface ExecuteOptions {\n /** Reuse an already-built native project: skip steps marked `skippable`. */\n readonly skipBuild?: boolean\n /** Per-run log directory for background-process output. */\n readonly logDir: string\n /** Stream per-step progress (`--verbose`). Stage failures are always logged. */\n readonly verbose?: boolean\n /** Skip a step entirely (e.g. don't start Metro when reusing a running one). */\n readonly skipStep?: (step: Step) => boolean | Promise<boolean>\n /** Skip a cleanup action (e.g. don't kill a Metro the runner did not start). */\n readonly skipCleanup?: (action: CleanupAction) => boolean\n}\n\nexport interface ExecuteResult {\n readonly playwrightCode: number\n}\n\n/**\n * Effectful interpreter of a {@link Plan}. Runs steps in order, gating on\n * readiness probes, then invokes Playwright. Cleanup runs on every exit path and\n * is defensive/idempotent (REQ-CLEAN-001). A lifecycle failure is raised as a\n * {@link StageError} naming the stage that broke (REQ-DIAG-001).\n */\nexport async function executePlan(\n plan: Plan,\n runner: ProcessRunner,\n opts: ExecuteOptions,\n): Promise<ExecuteResult> {\n const processes = new Map<string, SpawnHandle>()\n const isAlive = (key: string): boolean => {\n const handle = processes.get(key)\n // No handle means the backing process was intentionally skipped (e.g. a\n // reused external Metro whose `metro.start` step was skipped) — treat it as\n // alive so the probe polls the URL to its timeout instead of failing\n // instantly. Fail-fast applies only to a process the runner started that has\n // since died (handle present and dead).\n return handle ? runner.isAlive(handle) : true\n }\n\n try {\n for (const step of plan.steps) {\n if (opts.skipBuild && step.skippable) {\n if (opts.verbose) runner.log(`skip (skip-build): ${step.id}`)\n continue\n }\n if (opts.skipStep && (await opts.skipStep(step))) {\n if (opts.verbose) runner.log(`skip: ${step.id}`)\n continue\n }\n await runStep(step, runner, opts, processes, isAlive)\n }\n\n runner.log(`Running Playwright: ${plan.playwright.command} ${plan.playwright.args.join(' ')}`)\n const result = await runner.exec({\n ...plan.playwright,\n env: { ...plan.playwright.env, ...plan.driverEnv },\n })\n return { playwrightCode: result.code }\n } finally {\n await runCleanup(plan.cleanup, runner, opts, processes)\n }\n}\n\nasync function runStep(\n step: Step,\n runner: ProcessRunner,\n opts: ExecuteOptions,\n processes: Map<string, SpawnHandle>,\n isAlive: (key: string) => boolean,\n): Promise<void> {\n if (opts.verbose) runner.log(`→ ${step.id}: ${step.description}`)\n const action = step.action\n\n switch (action.type) {\n case 'command': {\n if (action.background) {\n const key = action.processKey ?? step.id\n const handle = runner.spawn(action.command, { key, logPath: logPathFor(opts.logDir, key) })\n processes.set(key, handle)\n return\n }\n const result = await runner.exec(action.command)\n if (result.code !== 0 && !action.allowFailure) {\n throw new StageError(step.stage, step.id, `command exited ${result.code}`)\n }\n return\n }\n case 'write-file': {\n await runner.writeFile(action.path, action.contents, action.mode)\n return\n }\n case 'free-port': {\n await runner.freePort(action.port)\n return\n }\n case 'probe': {\n const key = processKeyForProbe(action.probe)\n const aliveFn = key === null ? () => true : () => isAlive(key)\n let ready = await runner.probe(action.probe, aliveFn)\n // Bounded retry (REQ-AND-005): re-run the retry command (e.g. re-issue\n // `am start`) and probe again, up to `max` extra attempts.\n let remaining = action.retry?.max ?? 0\n while (!ready && remaining > 0) {\n remaining -= 1\n if (action.retry) {\n runner.log(`retry ${step.id}: re-running launch (${remaining} attempt(s) left)`)\n await runner.exec(action.retry.command)\n }\n ready = await runner.probe(action.probe, aliveFn)\n }\n if (!ready) {\n throw new StageError(\n step.stage,\n step.id,\n `readiness timed out after ${action.probe.timeoutMs}ms`,\n )\n }\n return\n }\n default: {\n const _exhaustive: never = action\n throw new Error(`unhandled action: ${JSON.stringify(_exhaustive)}`)\n }\n }\n}\n\nasync function runCleanup(\n actions: readonly CleanupAction[],\n runner: ProcessRunner,\n opts: ExecuteOptions,\n processes: Map<string, SpawnHandle>,\n): Promise<void> {\n for (const action of actions) {\n if (opts.skipCleanup && opts.skipCleanup(action)) continue\n try {\n switch (action.type) {\n case 'kill-process': {\n const handle = processes.get(action.processKey)\n if (handle) await runner.kill(handle)\n break\n }\n case 'free-port':\n await runner.freePort(action.port)\n break\n case 'remove-file':\n await runner.removeFile(action.path)\n break\n case 'command':\n await runner.exec(action.command)\n break\n default: {\n const _exhaustive: never = action\n throw new Error(`unhandled cleanup: ${JSON.stringify(_exhaustive)}`)\n }\n }\n } catch (error) {\n // Cleanup is best-effort; a teardown failure must not mask the run result.\n runner.log(`cleanup ${action.description} failed: ${String(error)}`)\n }\n }\n}\n\n/**\n * Which background process a readiness probe depends on, for fail-fast when that\n * process dies before becoming ready. `null` means no process dependency (the\n * Hermes target is the app, not a runner-tracked process).\n */\nfunction processKeyForProbe(probe: ReadinessProbe): 'metro' | 'companion' | null {\n switch (probe.kind) {\n case 'metro-status':\n return 'metro'\n case 'xctest-hello':\n case 'instrumentation-hello':\n return 'companion'\n case 'hermes-target':\n return null\n default: {\n const _exhaustive: never = probe\n throw new Error(`unhandled probe: ${JSON.stringify(_exhaustive)}`)\n }\n }\n}\n\nfunction logPathFor(logDir: string, key: string): string {\n return `${logDir}/${key}.log`\n}\n","import { type ChildProcess, spawn as nodeSpawn } from 'node:child_process'\nimport { createReadStream, openSync } from 'node:fs'\nimport { chmod, readFile, rm, writeFile as fsWriteFile } from 'node:fs/promises'\nimport type {\n CommandSpec,\n ExecResult,\n ProcessRunner,\n ReadinessProbe,\n SpawnHandle,\n} from '../plan/types'\n\nconst PROBE_INTERVAL_MS = 1_000\n\n/**\n * The real OS boundary. Foreground commands inherit stdio so build output is\n * visible; background processes (Metro, companion) are detached with output\n * captured to a per-run log file and killed by process group on teardown.\n *\n * Intended to run under bun or Node >= 22 (uses the global `WebSocket`/`fetch`\n * for readiness probes, matching the example recipes). This is the effectful\n * layer — its behavior is verified by the live e2e oracle, not unit tests.\n */\nexport class NodeProcessRunner implements ProcessRunner {\n private readonly children = new Map<string, ChildProcess>()\n\n exec(spec: CommandSpec, _opts?: { logPath?: string }): Promise<ExecResult> {\n return new Promise((resolve, reject) => {\n const usesStdin = Boolean(spec.stdinFromFile) || spec.stdinContents !== undefined\n const child = nodeSpawn(spec.command, [...spec.args], {\n cwd: spec.cwd,\n env: { ...process.env, ...spec.env },\n stdio: [usesStdin ? 'pipe' : 'inherit', 'inherit', 'inherit'],\n })\n child.on('error', reject)\n if (usesStdin && child.stdin) {\n if (spec.stdinFromFile) {\n createReadStream(spec.stdinFromFile).pipe(child.stdin)\n } else {\n child.stdin.end(spec.stdinContents ?? '')\n }\n }\n child.on('close', (code) => resolve({ code: code ?? 1, stdout: '', stderr: '' }))\n })\n }\n\n spawn(spec: CommandSpec, opts: { key: string; logPath: string }): SpawnHandle {\n const fd = openSync(opts.logPath, 'a')\n const child = nodeSpawn(spec.command, [...spec.args], {\n cwd: spec.cwd,\n env: { ...process.env, ...spec.env },\n detached: true,\n stdio: ['ignore', fd, fd],\n })\n child.unref()\n this.children.set(opts.key, child)\n return { key: opts.key, pid: child.pid }\n }\n\n isAlive(handle: SpawnHandle): boolean {\n const child = this.children.get(handle.key)\n if (!child || child.exitCode !== null || child.signalCode !== null) return false\n if (handle.pid === undefined) return false\n try {\n process.kill(handle.pid, 0)\n return true\n } catch {\n return false\n }\n }\n\n async kill(handle: SpawnHandle): Promise<void> {\n const child = this.children.get(handle.key)\n if (!child || handle.pid === undefined) return\n // Kill the whole process group: a detached child (xcodebuild/am instrument)\n // spawns its own children that outlive a bare parent kill.\n killGroup(handle.pid, 'SIGTERM')\n await delay(500)\n if (this.isAlive(handle)) killGroup(handle.pid, 'SIGKILL')\n this.children.delete(handle.key)\n }\n\n /**\n * Best-effort synchronous teardown for signal handlers: SIGKILL every tracked\n * child's process group so a Ctrl-C / SIGTERM does not orphan the detached\n * Metro/companion processes (REQ-CLEAN-001, signal clause). Synchronous because\n * a signal handler cannot await before `process.exit`.\n */\n killAll(): void {\n for (const child of this.children.values()) {\n if (child.pid !== undefined) killGroup(child.pid, 'SIGKILL')\n }\n this.children.clear()\n }\n\n async writeFile(path: string, contents: string, mode?: number): Promise<void> {\n await fsWriteFile(path, contents)\n if (mode !== undefined) await chmod(path, mode)\n }\n\n async removeFile(path: string): Promise<void> {\n await rm(path, { force: true })\n }\n\n async freePort(port: number): Promise<void> {\n // The sim/device-hosted companion binds the host loopback, so it is visible\n // and killable via lsof on the host even though it runs \"inside\" the device.\n // This SIGTERMs whatever LISTENs on the port — the companion port is assumed\n // DEDICATED to the runner's companion (config `*.companion.port`, default\n // 9999). Do not point it at a port shared with an unrelated service.\n const pids = await this.lsofPids(port)\n for (const pid of pids) {\n try {\n process.kill(pid, 'SIGTERM')\n } catch {\n // already gone\n }\n }\n if (pids.length > 0) await delay(1_000)\n }\n\n probe(probe: ReadinessProbe, isAlive: () => boolean): Promise<boolean> {\n const deadline = Date.now() + probe.timeoutMs\n const attempt = async (): Promise<boolean> => {\n for (;;) {\n if (!isAlive()) return false\n if (await probeOnce(probe)) return true\n if (Date.now() >= deadline) return false\n await delay(PROBE_INTERVAL_MS)\n }\n }\n return attempt()\n }\n\n log(line: string): void {\n process.stderr.write(`${line}\\n`)\n }\n\n private lsofPids(port: number): Promise<number[]> {\n return new Promise((resolve) => {\n const child = nodeSpawn('lsof', ['-nP', `-iTCP:${port}`, '-sTCP:LISTEN', '-t'], {\n stdio: ['ignore', 'pipe', 'ignore'],\n })\n let out = ''\n child.stdout?.on('data', (chunk: Buffer) => {\n out += chunk.toString()\n })\n child.on('error', () => resolve([]))\n child.on('close', () => {\n const pids = out\n .split('\\n')\n .map((line) => Number.parseInt(line.trim(), 10))\n .filter((pid) => Number.isInteger(pid) && pid > 0)\n resolve(pids)\n })\n })\n }\n}\n\nfunction killGroup(pid: number, signal: NodeJS.Signals): void {\n try {\n process.kill(-pid, signal) // negative pid → process group\n } catch {\n try {\n process.kill(pid, signal)\n } catch {\n // already gone\n }\n }\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms)\n })\n}\n\nasync function probeOnce(probe: ReadinessProbe): Promise<boolean> {\n switch (probe.kind) {\n case 'metro-status':\n return metroStatusOk(probe.metroUrl)\n case 'hermes-target':\n return hermesTargetPresent(probe)\n case 'xctest-hello':\n return xctestHelloOk(probe.port, probe.tokenFile)\n case 'instrumentation-hello':\n return instrumentationHelloOk(probe.port, probe.tokenFile)\n default: {\n const _exhaustive: never = probe\n throw new Error(`unhandled probe: ${JSON.stringify(_exhaustive)}`)\n }\n }\n}\n\nasync function metroStatusOk(metroUrl: string): Promise<boolean> {\n try {\n // AbortSignal bounds a single attempt: without it a server that accepts the\n // socket but stalls before headers/body would hang the poll loop past its\n // deadline, since probe() only re-checks the deadline between attempts.\n const response = await fetch(`${metroUrl}/status`, {\n signal: AbortSignal.timeout(PROBE_INTERVAL_MS),\n })\n const body = await response.text()\n return body.includes('packager-status:running')\n } catch {\n return false\n }\n}\n\ninterface MetroTarget {\n readonly title?: string\n readonly description?: string\n readonly vm?: string\n readonly appId?: string\n readonly deviceName?: string\n}\n\nasync function hermesTargetPresent(\n probe: Extract<ReadinessProbe, { kind: 'hermes-target' }>,\n): Promise<boolean> {\n try {\n const response = await fetch(`${probe.metroUrl}/json`, {\n signal: AbortSignal.timeout(PROBE_INTERVAL_MS),\n })\n if (!response.ok) return false\n const targets = (await response.json()) as MetroTarget[]\n return targets.some((target) => {\n const isReactNative =\n String(target.title ?? '').includes('Hermes') ||\n target.vm === 'Hermes' ||\n String(target.description ?? '').includes('React Native')\n if (!isReactNative || target.appId !== probe.appId) return false\n if (!probe.deviceNameMatch) return true\n return String(target.deviceName ?? '').includes(probe.deviceNameMatch)\n })\n } catch {\n return false\n }\n}\n\nasync function xctestHelloOk(port: number, tokenFile: string): Promise<boolean> {\n const WebSocketCtor = (globalThis as { WebSocket?: typeof WebSocket }).WebSocket\n if (!WebSocketCtor)\n throw new Error(\n 'global WebSocket is required for the xctest probe (run under bun or Node >= 22)',\n )\n const authToken = await readTokenFile(tokenFile)\n return new Promise((resolve) => {\n const socket = new WebSocketCtor(`ws://127.0.0.1:${port}`)\n const timer = setTimeout(() => {\n close(socket)\n resolve(false)\n }, PROBE_INTERVAL_MS)\n socket.addEventListener('open', () => {\n socket.send(\n JSON.stringify({\n id: 1,\n type: 'hello',\n protocolVersion: 1,\n client: 'rn-driver-runner',\n ...(authToken ? { authToken } : {}),\n }),\n )\n })\n socket.addEventListener('message', (event: MessageEvent) => {\n clearTimeout(timer)\n close(socket)\n try {\n const payload = JSON.parse(String(event.data)) as { id?: number; ok?: boolean }\n resolve(payload.id === 1 && payload.ok === true)\n } catch {\n resolve(false)\n }\n })\n socket.addEventListener('error', () => {\n clearTimeout(timer)\n resolve(false)\n })\n })\n}\n\nasync function instrumentationHelloOk(port: number, tokenFile: string): Promise<boolean> {\n try {\n const token = await readTokenFile(tokenFile)\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), PROBE_INTERVAL_MS)\n const response = await fetch(`http://127.0.0.1:${port}/command`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n ...(token ? { 'x-rn-driver-auth': token } : {}),\n },\n body: JSON.stringify({ type: 'hello' }),\n signal: controller.signal,\n })\n clearTimeout(timer)\n const payload = (await response.json().catch(() => undefined)) as { ok?: boolean } | undefined\n return response.ok && payload?.ok === true\n } catch {\n return false\n }\n}\n\nasync function readTokenFile(path: string): Promise<string | undefined> {\n try {\n const token = (await readFile(path, 'utf8')).trim()\n return token === '' ? undefined : token\n } catch {\n return undefined\n }\n}\n\nfunction close(socket: WebSocket): void {\n try {\n socket.close()\n } catch {\n // ignore\n }\n}\n","import { randomBytes } from 'node:crypto'\nimport { execFile } from 'node:child_process'\nimport { chmod, mkdtemp, writeFile } from 'node:fs/promises'\nimport { tmpdir } from 'node:os'\nimport path from 'node:path'\nimport { promisify } from 'node:util'\nimport type { AndroidConfig, IosConfig } from '../config'\nimport { DEFAULTS } from '../constants'\nimport {\n instrumentationTarget,\n uitestScheme,\n type ResolvedAndroidTarget,\n type ResolvedIosTarget,\n type ResolvedMetro,\n} from '../plan/resolved'\n\nconst run = promisify(execFile)\n\nexport interface ResolveOptions {\n /** Explicit device id/serial/destination override from the CLI. */\n readonly device?: string\n}\n\n/**\n * Effectful iOS resolution: pick the simulator, terminate stale instances on\n * other booted sims (REQ-IOS-002), and mint a per-run `0600` token file. This is\n * the device-bound layer; it is exercised by the live e2e oracle.\n */\nexport async function resolveIosTarget(\n ios: IosConfig,\n metro: ResolvedMetro,\n opts: ResolveOptions,\n): Promise<ResolvedIosTarget> {\n const { udid, name } = await selectSimulator(ios, opts.device)\n await terminateStaleOnOtherSims(udid, ios.bundleId)\n\n const tokenFile = await mintTokenFile()\n const scheme = uitestScheme(ios)\n\n return {\n simUdid: udid,\n simName: name,\n destination: ios.destination ?? `platform=iOS Simulator,id=${udid}`,\n uitestScheme: scheme,\n touchPort: ios.companion?.port ?? DEFAULTS.companionPort,\n companionReadyTimeoutMs: ios.companion?.readyTimeoutMs ?? DEFAULTS.iosCompanionReadyTimeoutMs,\n hermesTimeoutMs: DEFAULTS.hermesTargetTimeoutMs,\n tokenFile,\n runtimeConfigFile: path.join('ios', scheme, 'RNDriverTouchCompanionRuntimeConfig.json'),\n initialUrl: ios.launch.initialUrl ?? metro.url,\n }\n}\n\n/**\n * Effectful Android resolution: pick the emulator serial, verify it is booted,\n * read the device model (the Hermes target's device name), and mint a per-run\n * `0600` token file. Returns the device name to pin via `RN_DEVICE_NAME`.\n */\nexport async function resolveAndroidTarget(\n android: AndroidConfig,\n _metro: ResolvedMetro,\n opts: ResolveOptions,\n): Promise<{ resolved: ResolvedAndroidTarget; deviceName: string }> {\n const serial = await selectSerial(opts.device)\n await requireBooted(serial)\n const deviceName = (\n await capture('adb', ['-s', serial, 'shell', 'getprop', 'ro.product.model'])\n ).trim()\n const tokenFile = await mintTokenFile()\n\n return {\n resolved: {\n serial,\n touchPort: android.companion?.port ?? DEFAULTS.companionPort,\n companionReadyTimeoutMs:\n android.companion?.readyTimeoutMs ?? DEFAULTS.androidCompanionReadyTimeoutMs,\n hermesTimeoutMs: DEFAULTS.hermesTargetTimeoutMs,\n tokenFile,\n deviceTokenFileName: DEFAULTS.androidTokenFileName,\n instrumentationTarget: instrumentationTarget(android),\n },\n deviceName,\n }\n}\n\nexport interface SimDevice {\n readonly udid: string\n readonly name: string\n readonly state?: string\n readonly isAvailable?: boolean\n readonly runtime: string\n}\n\nasync function selectSimulator(\n ios: IosConfig,\n deviceOverride?: string,\n): Promise<{ udid: string; name: string }> {\n const data = JSON.parse(\n await capture('xcrun', ['simctl', 'list', 'devices', 'available', '--json']),\n ) as {\n devices?: Record<string, Array<Omit<SimDevice, 'runtime'>>>\n }\n const all: SimDevice[] = Object.entries(data.devices ?? {})\n .flatMap(([runtime, list]) => list.map((device) => ({ ...device, runtime })))\n .filter((device) => device.isAvailable !== false)\n return pickSimulator(all, deviceOverride, ios.destination)\n}\n\n/**\n * Pure simulator selection (REQ-IOS-001 / REQ-CLI-007). Precedence:\n * 1. an explicit UDID (from `--device` or `ios.destination`) — ANY device type,\n * so an explicitly-named iPad/non-iPhone sim is honored, not filtered out;\n * 2. `--device <name>` matched by exact then substring name (also any type);\n * 3. auto-select: the newest booted iPhone, else the newest available iPhone.\n * The iPhone-only filter applies ONLY to step 3's auto-selection.\n */\nexport function pickSimulator(\n devices: readonly SimDevice[],\n deviceOverride: string | undefined,\n destination: string | undefined,\n): { udid: string; name: string } {\n const explicitUdid = parseUdid(deviceOverride) ?? parseUdid(destination)\n if (explicitUdid) {\n const match = devices.find((device) => device.udid === explicitUdid)\n if (!match) throw new Error(`requested iOS simulator not found: ${explicitUdid}`)\n return { udid: match.udid, name: match.name }\n }\n\n if (deviceOverride) {\n const byName =\n devices.find((device) => device.name === deviceOverride) ??\n devices.find((device) => device.name.includes(deviceOverride))\n if (!byName) throw new Error(`requested iOS simulator not found by name: ${deviceOverride}`)\n return { udid: byName.udid, name: byName.name }\n }\n\n const byNewest = (a: SimDevice, b: SimDevice): number =>\n compareRuntime(runtimeVersion(b.runtime), runtimeVersion(a.runtime))\n const iphones = devices.filter((device) => device.name.startsWith('iPhone'))\n const booted = iphones.filter((device) => device.state === 'Booted').sort(byNewest)\n const pick = booted[0] ?? [...iphones].sort(byNewest)[0]\n if (!pick) throw new Error('no available iPhone simulator found')\n return { udid: pick.udid, name: pick.name }\n}\n\nasync function terminateStaleOnOtherSims(keepUdid: string, bundleId: string): Promise<void> {\n const booted = await capture('xcrun', ['simctl', 'list', 'devices', 'booted'])\n const udids = booted.match(/[0-9A-Fa-f-]{36}/g) ?? []\n for (const udid of udids) {\n if (udid === keepUdid) continue\n await capture('xcrun', ['simctl', 'terminate', udid, bundleId]).catch(() => '')\n }\n}\n\nasync function selectSerial(deviceOverride?: string): Promise<string> {\n await capture('adb', ['start-server']).catch(() => '')\n if (deviceOverride) {\n await run('adb', ['-s', deviceOverride, 'get-state'])\n return deviceOverride\n }\n const devices = await capture('adb', ['devices'])\n const serial = devices\n .split('\\n')\n .slice(1)\n .map((line) => line.trim().split(/\\s+/))\n .find((cols) => cols[1] === 'device' && cols[0]?.startsWith('emulator-'))?.[0]\n if (!serial) throw new Error('no booted emulator found in `adb devices`')\n return serial\n}\n\nasync function requireBooted(serial: string): Promise<void> {\n const state = (await capture('adb', ['-s', serial, 'get-state'])).trim()\n if (state !== 'device') throw new Error(`adb device ${serial} is not ready (state: ${state})`)\n const booted = (\n await capture('adb', ['-s', serial, 'shell', 'getprop', 'sys.boot_completed'])\n ).trim()\n if (booted !== '1') throw new Error(`adb device ${serial} has not completed boot`)\n}\n\nasync function mintTokenFile(): Promise<string> {\n const dir = await mkdtemp(path.join(tmpdir(), 'rn-driver-token-'))\n const file = path.join(dir, 'token')\n await writeFile(file, randomBytes(16).toString('hex'))\n await chmod(file, 0o600)\n return file\n}\n\nasync function capture(command: string, args: string[]): Promise<string> {\n const { stdout } = await run(command, args, { maxBuffer: 16 * 1024 * 1024 })\n return stdout.toString()\n}\n\nfunction parseUdid(value: string | undefined): string | undefined {\n if (!value) return undefined\n const match = value.match(/id=([0-9A-Fa-f-]{36})/) ?? value.match(/^([0-9A-Fa-f-]{36})$/)\n return match?.[1]\n}\n\nfunction runtimeVersion(runtime: string): number[] {\n const match = runtime.match(/iOS-([0-9-]+)$/)\n return match?.[1] ? match[1].split('-').map((part) => Number.parseInt(part, 10)) : [0]\n}\n\nfunction compareRuntime(a: number[], b: number[]): number {\n const length = Math.max(a.length, b.length)\n for (let index = 0; index < length; index += 1) {\n const delta = (a[index] ?? 0) - (b[index] ?? 0)\n if (delta !== 0) return delta\n }\n return 0\n}\n","import type { Platform, RnDriverConfig } from './config'\n\nexport interface ValidationResult {\n readonly ok: boolean\n readonly errors: readonly string[]\n}\n\nconst LAUNCH_MODES = ['launch', 'activate', 'attach'] as const\nconst LAUNCH_KINDS = ['plain', 'expo-dev-client'] as const\n\nconst TOP_LEVEL_KEYS = new Set(['metro', 'ios', 'android', 'playwright', 'timeoutMs'])\nconst METRO_KEYS = new Set(['url', 'command', 'host', 'port', 'reuseExisting', 'readyTimeoutMs'])\nconst LAUNCH_KEYS = new Set(['mode', 'kind', 'initialUrl'])\nconst COMPANION_KEYS = new Set(['port', 'readyTimeoutMs'])\nconst IOS_KEYS = new Set([\n 'bundleId',\n 'workspace',\n 'appScheme',\n 'uitestScheme',\n 'destination',\n 'launch',\n 'companion',\n 'defaults',\n])\nconst ANDROID_KEYS = new Set([\n 'packageName',\n 'activity',\n 'gradleTasks',\n 'appApkPath',\n 'testApkPath',\n 'instrumentationTarget',\n 'launch',\n 'companion',\n])\nconst PLAYWRIGHT_KEYS = new Set(['config', 'specs'])\n\n/**\n * Validate a loaded config for the selected platforms. Runs before any side\n * effect; failures name the offending field and the expected shape (REQ-CFG-003).\n * Unknown keys are reported as typo protection (REQ-CFG-004).\n */\nexport function validateConfig(config: unknown, platforms: readonly Platform[]): ValidationResult {\n const errors: string[] = []\n\n if (!isRecord(config)) {\n return {\n ok: false,\n errors: ['config: expected an object exported as default from rn-driver.config'],\n }\n }\n\n reportUnknownKeys('config', config, TOP_LEVEL_KEYS, errors)\n if (config.timeoutMs !== undefined && !isPositiveNumber(config.timeoutMs)) {\n errors.push('config.timeoutMs: expected a positive number')\n }\n validateMetro(config.metro, errors)\n validatePlaywright(config.playwright, errors)\n\n if (platforms.includes('ios')) validateIos(config.ios, errors)\n if (platforms.includes('android')) validateAndroid(config.android, errors)\n\n return { ok: errors.length === 0, errors }\n}\n\nfunction validateMetro(metro: unknown, errors: string[]): void {\n if (metro === undefined) return\n if (!isRecord(metro)) {\n errors.push('config.metro: expected an object')\n return\n }\n reportUnknownKeys('config.metro', metro, METRO_KEYS, errors)\n optionalString('config.metro.url', metro.url, errors)\n optionalString('config.metro.command', metro.command, errors)\n optionalString('config.metro.host', metro.host, errors)\n if (metro.port !== undefined && !isPort(metro.port))\n errors.push('config.metro.port: expected a port (1-65535)')\n if (metro.reuseExisting !== undefined && typeof metro.reuseExisting !== 'boolean') {\n errors.push('config.metro.reuseExisting: expected a boolean')\n }\n if (metro.readyTimeoutMs !== undefined && !isPositiveNumber(metro.readyTimeoutMs)) {\n errors.push('config.metro.readyTimeoutMs: expected a positive number')\n }\n}\n\nfunction validatePlaywright(playwright: unknown, errors: string[]): void {\n if (playwright === undefined) return\n if (!isRecord(playwright)) {\n errors.push('config.playwright: expected an object')\n return\n }\n reportUnknownKeys('config.playwright', playwright, PLAYWRIGHT_KEYS, errors)\n optionalString('config.playwright.config', playwright.config, errors)\n if (playwright.specs !== undefined && !isStringArray(playwright.specs)) {\n errors.push('config.playwright.specs: expected an array of strings')\n }\n}\n\nfunction validateIos(ios: unknown, errors: string[]): void {\n if (!isRecord(ios)) {\n errors.push('config.ios: required when platform \"ios\" is selected (expected an object)')\n return\n }\n reportUnknownKeys('config.ios', ios, IOS_KEYS, errors)\n requireString('config.ios.bundleId', ios.bundleId, errors)\n requireString('config.ios.workspace', ios.workspace, errors)\n requireString('config.ios.appScheme', ios.appScheme, errors)\n optionalString('config.ios.uitestScheme', ios.uitestScheme, errors)\n optionalString('config.ios.destination', ios.destination, errors)\n validateCompanion('config.ios.companion', ios.companion, errors)\n if (ios.defaults !== undefined) {\n if (!isRecord(ios.defaults)) {\n errors.push('config.ios.defaults: expected an object of key -> string|number|boolean')\n } else {\n // planIos feeds each value into `simctl defaults write`; a non-primitive\n // would stringify to `[object Object]` and write a bogus default.\n for (const [key, value] of Object.entries(ios.defaults)) {\n const kind = typeof value\n if (kind !== 'string' && kind !== 'number' && kind !== 'boolean') {\n errors.push(`config.ios.defaults.${key}: expected string|number|boolean`)\n }\n }\n }\n }\n const launch = validateLaunch('config.ios.launch', ios.launch, errors)\n if (launch && launch.kind === 'expo-dev-client' && launch.mode !== 'attach') {\n // The hard-won #21 constraint: a dev-client app launched by the companion\n // lands on the dev-launcher and never registers a Hermes target. The host\n // must own the launch, so the companion must run in attach mode.\n errors.push(\n 'config.ios.launch: kind \"expo-dev-client\" requires mode \"attach\" (the host owns the launch)',\n )\n }\n if (launch && launch.mode === 'attach' && launch.kind !== 'expo-dev-client') {\n // The converse: in attach mode the companion does NOT launch the app, and the\n // runner only host-launches dev clients (`simctl launch --initialUrl`). A\n // plain app in attach mode would never start — the run would reach the Hermes\n // wait with no app. A plain app must use launch/activate (companion launches).\n errors.push(\n 'config.ios.launch: mode \"attach\" requires kind \"expo-dev-client\"; a plain app uses mode \"launch\" or \"activate\" (the companion launches it)',\n )\n }\n}\n\nfunction validateAndroid(android: unknown, errors: string[]): void {\n if (!isRecord(android)) {\n errors.push('config.android: required when platform \"android\" is selected (expected an object)')\n return\n }\n reportUnknownKeys('config.android', android, ANDROID_KEYS, errors)\n // packageName/activity are interpolated into `adb shell run-as <pkg> sh -c '…'`\n // and `am start -n <pkg>/<activity>`; a value with shell metacharacters (e.g.\n // a quote) could break out of the single-quoted remote script and inject\n // device-shell commands. Constrain to the Android identifier grammar so no\n // metacharacter survives validation (security, defense-in-depth).\n requireAndroidPackage('config.android.packageName', android.packageName, errors)\n requireAndroidActivity('config.android.activity', android.activity, errors)\n optionalString('config.android.appApkPath', android.appApkPath, errors)\n optionalString('config.android.testApkPath', android.testApkPath, errors)\n // instrumentationTarget crosses `adb shell am instrument … -w <target>`; like\n // packageName/activity, constrain it so no shell metacharacter survives.\n if (android.instrumentationTarget !== undefined)\n requireInstrumentationTarget(\n 'config.android.instrumentationTarget',\n android.instrumentationTarget,\n errors,\n )\n if (android.gradleTasks !== undefined && !isStringArray(android.gradleTasks)) {\n errors.push('config.android.gradleTasks: expected an array of strings')\n }\n validateCompanion('config.android.companion', android.companion, errors)\n validateLaunch('config.android.launch', android.launch, errors)\n}\n\nfunction validateCompanion(path: string, companion: unknown, errors: string[]): void {\n if (companion === undefined) return\n if (!isRecord(companion)) {\n errors.push(`${path}: expected an object`)\n return\n }\n reportUnknownKeys(path, companion, COMPANION_KEYS, errors)\n if (companion.port !== undefined && !isPort(companion.port))\n errors.push(`${path}.port: expected a port (1-65535)`)\n if (companion.readyTimeoutMs !== undefined && !isPositiveNumber(companion.readyTimeoutMs)) {\n errors.push(`${path}.readyTimeoutMs: expected a positive number`)\n }\n}\n\nfunction validateLaunch(\n path: string,\n launch: unknown,\n errors: string[],\n): { mode: string; kind: string } | undefined {\n if (!isRecord(launch)) {\n errors.push(`${path}: required (expected an object with mode and kind)`)\n return undefined\n }\n reportUnknownKeys(path, launch, LAUNCH_KEYS, errors)\n optionalString(`${path}.initialUrl`, launch.initialUrl, errors)\n const modeOk =\n typeof launch.mode === 'string' && (LAUNCH_MODES as readonly string[]).includes(launch.mode)\n const kindOk =\n typeof launch.kind === 'string' && (LAUNCH_KINDS as readonly string[]).includes(launch.kind)\n if (!modeOk) errors.push(`${path}.mode: expected one of ${LAUNCH_MODES.join(', ')}`)\n if (!kindOk) errors.push(`${path}.kind: expected one of ${LAUNCH_KINDS.join(', ')}`)\n return modeOk && kindOk ? { mode: launch.mode as string, kind: launch.kind as string } : undefined\n}\n\n// --- primitives ---\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction isPositiveNumber(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value) && value > 0\n}\n\nfunction isPort(value: unknown): value is number {\n return typeof value === 'number' && Number.isInteger(value) && value > 0 && value <= 65_535\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((entry) => typeof entry === 'string')\n}\n\nfunction requireString(path: string, value: unknown, errors: string[]): void {\n if (typeof value !== 'string' || value.trim() === '')\n errors.push(`${path}: required non-empty string`)\n}\n\n// Dotted Android application id, e.g. `com.company.app`. Each segment starts with\n// a letter; only letters, digits, and underscores — no shell metacharacters.\nconst ANDROID_PACKAGE_RE = /^[A-Za-z][A-Za-z0-9_]*(\\.[A-Za-z][A-Za-z0-9_]*)+$/\n// Activity, e.g. `.MainActivity` or `com.company.app.MainActivity`. Optional\n// leading dot (relative form), then dot-joined identifier segments.\nconst ANDROID_ACTIVITY_RE = /^\\.?[A-Za-z][A-Za-z0-9_]*(\\.[A-Za-z][A-Za-z0-9_]*)*$/\n\nfunction requireAndroidPackage(path: string, value: unknown, errors: string[]): void {\n if (typeof value !== 'string' || value.trim() === '') {\n errors.push(`${path}: required non-empty string`)\n return\n }\n if (!ANDROID_PACKAGE_RE.test(value))\n errors.push(`${path}: expected a valid Android application id (e.g. com.company.app)`)\n}\n\nfunction requireAndroidActivity(path: string, value: unknown, errors: string[]): void {\n if (typeof value !== 'string' || value.trim() === '') {\n errors.push(`${path}: required non-empty string`)\n return\n }\n if (!ANDROID_ACTIVITY_RE.test(value))\n errors.push(`${path}: expected an activity name (e.g. .MainActivity)`)\n}\n\n// `am instrument` target: `<pkg>.test/<runner-class>`. Identifier segments only,\n// split by a single `/` — no shell metacharacters.\nconst ANDROID_INSTRUMENTATION_RE =\n /^[A-Za-z][A-Za-z0-9_]*(\\.[A-Za-z][A-Za-z0-9_]*)*\\/[A-Za-z][A-Za-z0-9_]*(\\.[A-Za-z][A-Za-z0-9_]*)*$/\n\nfunction requireInstrumentationTarget(path: string, value: unknown, errors: string[]): void {\n if (typeof value !== 'string' || value.trim() === '') {\n errors.push(`${path}: expected a non-empty string`)\n return\n }\n if (!ANDROID_INSTRUMENTATION_RE.test(value))\n errors.push(`${path}: expected an am instrument target (e.g. com.app.test/com.app.Runner)`)\n}\n\nfunction optionalString(path: string, value: unknown, errors: string[]): void {\n if (value !== undefined && typeof value !== 'string') errors.push(`${path}: expected a string`)\n}\n\nfunction reportUnknownKeys(\n path: string,\n value: Record<string, unknown>,\n allowed: ReadonlySet<string>,\n errors: string[],\n): void {\n for (const key of Object.keys(value)) {\n if (!allowed.has(key)) errors.push(`${path}.${key}: unknown key`)\n }\n}\n\n/** Narrowing helper for callers that have already validated. */\nexport function assertValid(\n config: unknown,\n platforms: readonly Platform[],\n): asserts config is RnDriverConfig {\n const result = validateConfig(config, platforms)\n if (!result.ok) {\n throw new ConfigValidationError(result.errors)\n }\n}\n\nexport class ConfigValidationError extends Error {\n readonly errors: readonly string[]\n constructor(errors: readonly string[]) {\n super(`Invalid rn-driver config:\\n - ${errors.join('\\n - ')}`)\n this.name = 'ConfigValidationError'\n this.errors = errors\n }\n}\n","import { mkdtemp, readFile } from 'node:fs/promises'\nimport net from 'node:net'\nimport { tmpdir } from 'node:os'\nimport path from 'node:path'\nimport { parseArgs } from 'node:util'\nimport { buildDryRunPlan } from './build-plan'\nimport type { Platform, RnDriverConfig } from './config'\nimport { ConfigNotFoundError, loadConfig } from './load-config'\nimport { planAndroid } from './plan/android'\nimport { planIos } from './plan/ios'\nimport { resolveMetro } from './plan/resolved'\nimport type { Plan, Stage } from './plan/types'\nimport { renderPlan } from './print-plan'\nimport { executePlan, StageError } from './runner/execute'\nimport { NodeProcessRunner } from './runner/process-runner'\nimport { resolveAndroidTarget, resolveIosTarget } from './runner/resolve'\nimport { ConfigValidationError, assertValid } from './validate'\n\ninterface CliFlags {\n readonly platform: string | undefined\n readonly config: string | undefined\n readonly device: string | undefined\n readonly dryRun: boolean\n readonly skipBuild: boolean\n readonly verbose: boolean\n readonly help: boolean\n}\n\n/** Distinct non-zero exit codes per lifecycle stage so a failure is attributable. */\nconst STAGE_EXIT_CODES: Record<Stage, number> = {\n config: 10,\n metro: 11,\n device: 12,\n build: 13,\n companion: 14,\n 'app-launch': 15,\n 'hermes-target': 16,\n playwright: 1,\n cleanup: 17,\n}\n\nexport async function run(argv: string[]): Promise<number> {\n const { command, specs, passthrough, flags } = parseCliArgs(argv)\n\n if (flags.help) {\n printHelp()\n return 0\n }\n if (command !== 'test') {\n process.stderr.write(`Unknown command: ${command ?? '(none)'}\\n`)\n printHelp()\n return 2\n }\n\n let platforms: Platform[]\n try {\n platforms = resolvePlatforms(flags.platform)\n } catch (error) {\n process.stderr.write(`${(error as Error).message}\\n`)\n return 2\n }\n\n let config: RnDriverConfig\n try {\n const loaded = await loadConfig({\n cwd: process.cwd(),\n ...(flags.config ? { configPath: flags.config } : {}),\n })\n assertValid(loaded.config, platforms)\n config = loaded.config\n } catch (error) {\n if (error instanceof ConfigValidationError || error instanceof ConfigNotFoundError) {\n process.stderr.write(`${error.message}\\n`)\n return 2\n }\n throw error\n }\n\n if (flags.dryRun) {\n for (const platform of platforms) {\n process.stdout.write(\n `${renderPlan(buildDryRunPlan(config, platform, { specs, passthrough }))}\\n\\n`,\n )\n }\n return 0\n }\n\n const runner = new NodeProcessRunner()\n const logDir = await mkdtemp(path.join(tmpdir(), 'rn-driver-logs-'))\n\n // Signal cleanup (REQ-CLEAN-001): SIGINT/SIGTERM otherwise terminate the process\n // before executePlan's async finally runs, orphaning the detached Metro/companion.\n const onSignal = (signal: NodeJS.Signals): void => {\n process.stderr.write(`\\nReceived ${signal} — terminating runner-owned processes…\\n`)\n runner.killAll()\n process.exit(130)\n }\n const onSigint = (): void => onSignal('SIGINT')\n const onSigterm = (): void => onSignal('SIGTERM')\n process.on('SIGINT', onSigint)\n process.on('SIGTERM', onSigterm)\n\n try {\n let exitCode = 0\n for (const platform of platforms) {\n runner.log(`\\n=== platform: ${platform} ===`)\n const code = await runPlatform(platform, config, {\n runner,\n logDir,\n flags,\n specs,\n passthrough,\n })\n if (code !== 0) exitCode = code\n }\n return exitCode\n } finally {\n process.removeListener('SIGINT', onSigint)\n process.removeListener('SIGTERM', onSigterm)\n }\n}\n\ninterface RunContext {\n readonly runner: NodeProcessRunner\n readonly logDir: string\n readonly flags: CliFlags\n readonly specs: readonly string[]\n readonly passthrough: readonly string[]\n}\n\nasync function runPlatform(\n platform: Platform,\n config: RnDriverConfig,\n ctx: RunContext,\n): Promise<number> {\n const metro = resolveMetro(config.metro)\n const reuseMetro = metro.reuseExisting && (await metroRunning(metro.url))\n if (reuseMetro) ctx.runner.log(`Reusing Metro already running at ${metro.url}`)\n\n // Metro preflight (REQ-METRO-003): if the runner is going to START Metro (it is\n // not reusing a running one), the port must be free. This runs BEFORE device\n // resolution so an occupied port fails fast without minting a token file or\n // touching simctl/adb. Gating on the computed `reuseMetro` (not the bare\n // `reuseExisting` flag) closes the case where reuseExisting is set but no\n // packager actually answers — the runner would otherwise start Metro on an\n // occupied port. metro.command pins the port, so the runner never auto-probes.\n if (!reuseMetro && (await portInUse(metro.host, metro.port))) {\n process.stderr.write(\n `\\nFAILED [${platform}] at stage [metro] metro.preflight: ${metro.host}:${metro.port} is already in use. Free it, set metro.reuseExisting, or choose another metro.port.\\n`,\n )\n return STAGE_EXIT_CODES.metro\n }\n\n // Device resolution mints the per-run 0600 token file and touches simctl/adb;\n // map its failures to the `device` stage so a missing simulator/emulator yields\n // a staged exit code (REQ-DIAG-001), not a raw throw. The token is minted last\n // in resolution, so a failure here does not leak a file; once the plan is built,\n // executePlan's finally-cleanup owns token removal.\n let plan: Plan\n try {\n plan = await buildPlatformPlan(platform, config, metro, ctx)\n } catch (error) {\n process.stderr.write(`\\nFAILED [${platform}] at stage [device]: ${(error as Error).message}\\n`)\n return STAGE_EXIT_CODES.device\n }\n\n try {\n const result = await executePlan(plan, ctx.runner, {\n logDir: ctx.logDir,\n skipBuild: ctx.flags.skipBuild,\n verbose: ctx.flags.verbose,\n skipStep: (step) => reuseMetro && step.id === 'metro.start',\n skipCleanup: (action) =>\n reuseMetro && action.type === 'kill-process' && action.processKey === 'metro',\n })\n if (result.playwrightCode === 0) {\n ctx.runner.log(`PASS: ${platform} e2e`)\n } else {\n ctx.runner.log(`FAIL: ${platform} Playwright exited ${result.playwrightCode}`)\n }\n return result.playwrightCode\n } catch (error) {\n if (error instanceof StageError) {\n process.stderr.write(\n `\\nFAILED [${platform}] at stage [${error.stage}] ${error.stepId}: ${error.message}\\n`,\n )\n process.stderr.write(`Logs: ${ctx.logDir}\\n`)\n // REQ-CLI-003/REQ-DIAG-002: surface the tail of the relevant background log\n // so a Metro/companion-side failure is visible without opening the log dir.\n await printLogTail(ctx.logDir, 'metro')\n await printLogTail(ctx.logDir, 'companion')\n return STAGE_EXIT_CODES[error.stage]\n }\n throw error\n }\n}\n\n/** Resolve the device target (effectful) and build the platform plan. */\nasync function buildPlatformPlan(\n platform: Platform,\n config: RnDriverConfig,\n metro: ReturnType<typeof resolveMetro>,\n ctx: RunContext,\n): Promise<Plan> {\n if (platform === 'ios') {\n if (!config.ios) throw new Error('config.ios is required for the ios platform')\n const resolved = await resolveIosTarget(config.ios, metro, deviceOpt(ctx.flags.device))\n return planIos({\n ios: config.ios,\n metro,\n resolved,\n playwright: config.playwright,\n timeoutMs: config.timeoutMs,\n specs: ctx.specs,\n passthrough: ctx.passthrough,\n })\n }\n if (!config.android) throw new Error('config.android is required for the android platform')\n const { resolved, deviceName } = await resolveAndroidTarget(\n config.android,\n metro,\n deviceOpt(ctx.flags.device),\n )\n return planAndroid({\n android: config.android,\n metro,\n resolved,\n playwright: config.playwright,\n timeoutMs: config.timeoutMs,\n specs: ctx.specs,\n passthrough: ctx.passthrough,\n hermesDeviceName: deviceName,\n })\n}\n\nfunction deviceOpt(device: string | undefined): { device?: string } {\n return device ? { device } : {}\n}\n\nasync function metroRunning(metroUrl: string): Promise<boolean> {\n try {\n // Bounded: a server that accepts the socket but never responds must not wedge\n // the reuse-existing preflight before any plan step runs.\n const response = await fetch(`${metroUrl}/status`, { signal: AbortSignal.timeout(2_000) })\n return (await response.text()).includes('packager-status:running')\n } catch {\n return false\n }\n}\n\n/** Print the last `lines` of a background log (Metro/companion) if it exists. */\nasync function printLogTail(logDir: string, key: string, lines = 20): Promise<void> {\n try {\n const content = await readFile(path.join(logDir, `${key}.log`), 'utf8')\n const tail = content\n .split('\\n')\n .filter((line) => line.length > 0)\n .slice(-lines)\n if (tail.length > 0)\n process.stderr.write(`\\n--- ${key} log (last ${tail.length} lines) ---\\n${tail.join('\\n')}\\n`)\n } catch {\n // No log captured for this key (e.g. it never started); nothing to show.\n }\n}\n\n/** True if something already accepts a TCP connection on host:port. */\nfunction portInUse(host: string, port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const socket = net.connect({ host, port })\n const finish = (inUse: boolean): void => {\n socket.destroy()\n resolve(inUse)\n }\n socket.setTimeout(1_000)\n socket.once('connect', () => finish(true))\n socket.once('timeout', () => finish(false))\n socket.once('error', () => finish(false))\n })\n}\n\nfunction resolvePlatforms(platform: string | undefined): Platform[] {\n if (!platform) throw new Error('--platform <ios|android|all> is required')\n if (platform === 'all') return ['ios', 'android']\n if (platform === 'ios' || platform === 'android') return [platform]\n throw new Error(`--platform must be one of ios, android, all (got: ${platform})`)\n}\n\nfunction parseCliArgs(argv: string[]): {\n command: string | undefined\n specs: string[]\n passthrough: string[]\n flags: CliFlags\n} {\n const dashDash = argv.indexOf('--')\n const before = dashDash === -1 ? argv : argv.slice(0, dashDash)\n const passthrough = dashDash === -1 ? [] : argv.slice(dashDash + 1)\n\n const { values, positionals } = parseArgs({\n args: before,\n options: {\n platform: { type: 'string', short: 'p' },\n config: { type: 'string', short: 'c' },\n device: { type: 'string', short: 'd' },\n 'dry-run': { type: 'boolean' },\n 'skip-build': { type: 'boolean' },\n verbose: { type: 'boolean' },\n help: { type: 'boolean', short: 'h' },\n },\n allowPositionals: true,\n })\n\n const [command = 'test', ...specs] = positionals\n return {\n command,\n specs,\n passthrough,\n flags: {\n platform: values.platform,\n config: values.config,\n device: values.device,\n dryRun: values['dry-run'] ?? false,\n skipBuild: values['skip-build'] ?? false,\n verbose: values.verbose ?? false,\n help: values.help ?? false,\n },\n }\n}\n\nfunction printHelp(): void {\n process.stdout.write(`\nrn-driver — config-backed cross-platform RN Playwright e2e runner\n\nUsage:\n rn-driver test --platform <ios|android|all> [options] [specs...] [-- <playwright args>]\n\nOptions:\n -p, --platform ios | android | all (required)\n -c, --config Path to rn-driver.config.{ts,mjs,js} (default: searched upward)\n -d, --device Simulator udid / emulator serial override\n --dry-run Print the resolved plan and exit (no side effects)\n --skip-build Reuse an already-built native project\n --verbose Stream per-step progress\n -h, --help Show help\n\nExamples:\n rn-driver test --platform ios\n rn-driver test --platform android --skip-build\n rn-driver test --platform all --dry-run\n rn-driver test --platform ios e2e/integration/counter.spec.ts\n`)\n}\n"]}