@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.
- package/CHANGELOG.md +9 -0
- package/LICENSE +21 -0
- package/README.md +143 -0
- package/bin/rn-driver.ts +17 -0
- package/dist/cli.d.mts +3 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.js +1898 -0
- package/dist/cli.js.map +1 -0
- package/dist/cli.mjs +1891 -0
- package/dist/cli.mjs.map +1 -0
- package/dist/index.d.mts +281 -0
- package/dist/index.d.ts +281 -0
- package/dist/index.js +1063 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1057 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/config.ts","../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/print-plan.ts","../src/validate.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Public configuration surface for the runner.\n *\n * A project provides these facts once in `rn-driver.config.ts`; the runner\n * translates them into a deterministic native-lifecycle plan per platform. The\n * shape intentionally separates the developer's *app-specific* facts (bundle\n * id, schemes, Gradle tasks, launch kind) from the *generic* lifecycle the\n * runner owns (simulator selection, Metro ownership, companion startup, token\n * passing, Hermes target wait, cleanup).\n */\n\nexport type Platform = 'ios' | 'android'\n\n/**\n * How the app process is brought up relative to the touch companion.\n * - `launch`/`activate`: the iOS companion launches/foregrounds the app.\n * - `attach`: the companion only injects; the host owns the launch. Required for\n * `expo-dev-client`, where the host must point the dev launcher straight at\n * Metro (see {@link LaunchKind}).\n */\nexport type LaunchMode = 'launch' | 'activate' | 'attach'\n\n/**\n * The flavor of RN app being launched.\n * - `plain`: a standard Expo/RN app that connects to Metro on cold launch.\n * - `expo-dev-client`: a development build whose launcher must be handed the\n * Metro URL at native launch (iOS: `simctl launch --initialUrl`), otherwise it\n * lands on the dev-launcher screen and never registers a Hermes target.\n */\nexport type LaunchKind = 'plain' | 'expo-dev-client'\n\nexport interface MetroConfig {\n /** Full Metro URL. When set, host/port are derived from it. */\n url?: string\n /** Command used to start Metro when it is not already running. */\n command?: string\n /** Host to bind/probe. Defaults to `127.0.0.1`. */\n host?: string\n /**\n * Metro port (default 8081). When the runner owns Metro it verifies this port\n * is free and fails fast if occupied — it does NOT auto-probe a different port,\n * because `command` pins the port the packager binds (REQ-METRO-003).\n */\n port?: number\n /** Reuse an already-running packager at the resolved URL instead of starting one. */\n reuseExisting?: boolean\n /** Bound for Metro `packager-status:running`. Defaults to 90_000ms. */\n readyTimeoutMs?: number\n}\n\nexport interface LaunchConfig {\n mode: LaunchMode\n kind: LaunchKind\n /**\n * Metro URL handed to the dev launcher for `expo-dev-client`. Defaults to the\n * resolved Metro URL. Ignored for `plain`.\n */\n initialUrl?: string\n}\n\nexport interface CompanionConfig {\n /** Local port the touch companion listens on. Defaults to 9999. */\n port?: number\n /**\n * Bound for the companion to accept its first authenticated request. Defaults\n * to 300_000ms on iOS to cover a cold `xcodebuild test` build (FU-2).\n */\n readyTimeoutMs?: number\n}\n\nexport interface IosConfig {\n /** App bundle identifier, e.g. `com.company.app`. */\n bundleId: string\n /** Path to the `.xcworkspace`, e.g. `ios/App.xcworkspace`. */\n workspace: string\n /** Scheme that builds the app, e.g. `App`. */\n appScheme: string\n /** UI-test scheme. Defaults to `${appScheme}UITests`. */\n uitestScheme?: string\n /**\n * Explicit `xcodebuild` destination\n * (`platform=iOS Simulator,id=<udid>`). When omitted the runner selects a\n * booted iPhone, else the newest available iPhone runtime.\n */\n destination?: string\n launch: LaunchConfig\n companion?: CompanionConfig\n /**\n * App-specific pre-launch seeds written via `simctl spawn defaults write`\n * (e.g. dev-menu onboarding flags). Keeps app-specific facts out of the\n * generic lifecycle.\n */\n defaults?: Record<string, string | number | boolean>\n}\n\nexport interface AndroidConfig {\n /** Android application id, e.g. `com.company.app`. */\n packageName: string\n /** Launch activity, e.g. `.MainActivity`. */\n activity: string\n /** Gradle tasks that build the app + androidTest APKs. */\n gradleTasks?: string[]\n /** Built app APK path. Defaults to the standard debug output path. */\n appApkPath?: string\n /** Built androidTest APK path. Defaults to the standard debug output path. */\n testApkPath?: string\n /**\n * `am instrument` target, e.g.\n * `com.company.app.test/com.rndriver.touchcompanion.RNDriverTouchCompanion`.\n * Defaults to `${packageName}.test/com.rndriver.touchcompanion.RNDriverTouchCompanion`.\n */\n instrumentationTarget?: string\n launch: LaunchConfig\n companion?: CompanionConfig\n}\n\nexport interface PlaywrightConfig {\n /** Playwright config path passed as `--config`. */\n config?: string\n /** Default spec paths/globs when none are passed on the CLI. */\n specs?: string[]\n}\n\nexport interface RnDriverConfig {\n metro?: MetroConfig\n ios?: IosConfig\n android?: AndroidConfig\n playwright?: PlaywrightConfig\n /** Driver request timeout (`RN_TIMEOUT`). */\n timeoutMs?: number\n}\n\n/**\n * Identity helper that provides editor/type checking for `rn-driver.config.ts`.\n * Performs no I/O.\n */\nexport function defineRnDriverConfig(config: RnDriverConfig): RnDriverConfig {\n return config\n}\n","/**\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 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 { 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"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@unrulysystems/rn-playwright-driver-runner",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Config-backed cross-platform e2e lifecycle runner CLI for rn-playwright-driver",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"android",
|
|
7
|
+
"cli",
|
|
8
|
+
"e2e",
|
|
9
|
+
"ios",
|
|
10
|
+
"playwright",
|
|
11
|
+
"react-native",
|
|
12
|
+
"testing"
|
|
13
|
+
],
|
|
14
|
+
"homepage": "https://github.com/unrulysystems/rn-playwright-driver#readme",
|
|
15
|
+
"license": "MIT",
|
|
16
|
+
"author": "0xbigboss",
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "git+https://github.com/unrulysystems/rn-playwright-driver.git",
|
|
20
|
+
"directory": "packages/runner"
|
|
21
|
+
},
|
|
22
|
+
"bin": {
|
|
23
|
+
"rn-driver": "bin/rn-driver.ts"
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"bin",
|
|
27
|
+
"CHANGELOG.md",
|
|
28
|
+
"dist",
|
|
29
|
+
"LICENSE",
|
|
30
|
+
"README.md"
|
|
31
|
+
],
|
|
32
|
+
"main": "dist/index.js",
|
|
33
|
+
"types": "dist/index.d.ts",
|
|
34
|
+
"exports": {
|
|
35
|
+
".": {
|
|
36
|
+
"types": "./dist/index.d.ts",
|
|
37
|
+
"import": "./dist/index.mjs",
|
|
38
|
+
"require": "./dist/index.js"
|
|
39
|
+
},
|
|
40
|
+
"./package.json": "./package.json"
|
|
41
|
+
},
|
|
42
|
+
"publishConfig": {
|
|
43
|
+
"access": "public"
|
|
44
|
+
},
|
|
45
|
+
"scripts": {
|
|
46
|
+
"build": "tsup",
|
|
47
|
+
"dev": "tsup --watch",
|
|
48
|
+
"test": "vitest run",
|
|
49
|
+
"test:watch": "vitest",
|
|
50
|
+
"typecheck": "tsgo --noEmit",
|
|
51
|
+
"knip": "knip",
|
|
52
|
+
"cpd": "jscpd ."
|
|
53
|
+
},
|
|
54
|
+
"devDependencies": {
|
|
55
|
+
"@types/node": "^25.0.3",
|
|
56
|
+
"@typescript/native-preview": "^7.0.0-dev.20251227.1",
|
|
57
|
+
"jscpd": "^4.0.5",
|
|
58
|
+
"knip": "^5.78.0",
|
|
59
|
+
"tsup": "^8.5.1",
|
|
60
|
+
"typescript": "^5.9.3",
|
|
61
|
+
"vitest": "^4.0.16"
|
|
62
|
+
},
|
|
63
|
+
"engines": {
|
|
64
|
+
"bun": ">=1.0.0",
|
|
65
|
+
"node": ">=22.0.0"
|
|
66
|
+
}
|
|
67
|
+
}
|