diff --git a/README.md b/README.md index 30b1678e5..07868c7d6 100644 --- a/README.md +++ b/README.md @@ -298,7 +298,7 @@ Start the development server for the capacitor: ```shell pnpm dev:pocket:ios --target # Or -CAPACITOR_DEVICE_ID= pnpm dev:pocket:ios +CAPACITOR_DEVICE_ID_IOS= pnpm dev:pocket:ios ``` You can see the list of available devices and simulators by running `pnpm exec cap run ios --list`. diff --git a/apps/stage-pocket/android/README.md b/apps/stage-pocket/android/README.md index 8690a8e26..362f4b2d4 100644 --- a/apps/stage-pocket/android/README.md +++ b/apps/stage-pocket/android/README.md @@ -38,7 +38,7 @@ Open the project in Android Studio: ```bash pnpm dev:android -- target # Or -CAPACITOR_DEVICE_ID= pnpm dev:android +CAPACITOR_DEVICE_ID_ANDROID= pnpm dev:android ``` diff --git a/packages/cap-vite/README.md b/packages/cap-vite/README.md index 99d31b808..3c6ea01ba 100644 --- a/packages/cap-vite/README.md +++ b/packages/cap-vite/README.md @@ -13,13 +13,13 @@ Examples: ```bash pnpm exec cap-vite -- ios --target pnpm exec cap-vite -- --host 0.0.0.0 --port 5173 -- android --target --flavor release -CAPACITOR_DEVICE_ID= pnpm exec cap-vite -- ios +CAPACITOR_DEVICE_ID_IOS= pnpm exec cap-vite -- ios pnpm -F @proj-airi/stage-pocket run dev:ios -- --target ``` - Arguments before `--` are forwarded to `vite`. - Arguments after `--` are forwarded to `cap run`. -- If `CAPACITOR_DEVICE_ID` is set and `cap run` args do not contain `--target`, `cap-vite` injects `--target ` automatically. +- If the platform-specific env is set (`CAPACITOR_DEVICE_ID_IOS` or `CAPACITOR_DEVICE_ID_ANDROID`) and `cap run` args do not contain `--target`, `cap-vite` injects `--target` with that value automatically. - `cap-vite` always launches the Vite dev server. Do not pass `vite dev` or `vite serve` as extra args. - After the dev server starts, press `R` in the terminal to re-run `cap run` without restarting Vite. diff --git a/packages/cap-vite/src/cli.ts b/packages/cap-vite/src/cli.ts index ea92d4c56..85d717866 100644 --- a/packages/cap-vite/src/cli.ts +++ b/packages/cap-vite/src/cli.ts @@ -29,6 +29,11 @@ export function getCapViteCliUsage(): string { return usage } +// TODO: CLI and `cap run` argument handling are hand-rolled (see also `resolveCapRunArgs` / +// `hasCapacitorTargetArg` in native.ts). If parsing rules keep growing, adopt a dedicated argv +// library (cac is already a dependency—consider subcommands or a small wrapper) so flags like +// `--target` / `--target=`, env-based defaults, and validation stay in one maintainable layer. + export function parseCapViteCliArgs(argv: string[]): ParsedCapViteCliArgs | null { if (argv.length === 1 && (argv[0] === '--help' || argv[0] === '-h')) { return null diff --git a/packages/cap-vite/src/native.test.ts b/packages/cap-vite/src/native.test.ts index ef8c09c7a..934ff0211 100644 --- a/packages/cap-vite/src/native.test.ts +++ b/packages/cap-vite/src/native.test.ts @@ -46,22 +46,36 @@ describe('resolveCapRunArgs', () => { it('keeps an explicit --target argument untouched', () => { expect(resolveCapRunArgs( ['ios', '--target', 'iPhone 16 Pro', '--scheme', 'AIRI'], - { CAPACITOR_DEVICE_ID: 'ignored-device' }, + { CAPACITOR_DEVICE_ID_IOS: 'ignored-device' }, )).toEqual(['ios', '--target', 'iPhone 16 Pro', '--scheme', 'AIRI']) }) - it('injects --target from CAPACITOR_DEVICE_ID when it is missing', () => { + it('injects --target from CAPACITOR_DEVICE_ID_ANDROID when it is missing', () => { expect(resolveCapRunArgs( ['android', '--flavor', 'release'], - { CAPACITOR_DEVICE_ID: 'emulator-5554' }, + { CAPACITOR_DEVICE_ID_ANDROID: 'emulator-5554' }, )).toEqual(['android', '--target', 'emulator-5554', '--flavor', 'release']) }) + it('injects --target from CAPACITOR_DEVICE_ID_IOS when it is missing', () => { + expect(resolveCapRunArgs( + ['ios', '--scheme', 'AIRI'], + { CAPACITOR_DEVICE_ID_IOS: 'iPhone 16 Pro' }, + )).toEqual(['ios', '--target', 'iPhone 16 Pro', '--scheme', 'AIRI']) + }) + + it('does not use the other platform device id', () => { + expect(resolveCapRunArgs( + ['ios'], + { CAPACITOR_DEVICE_ID_ANDROID: 'emulator-5554' }, + )).toEqual(['ios']) + }) + it('supports the --target=value form when checking existing args', () => { expect(hasCapacitorTargetArg(['android', '--target=emulator-5554'])).toBe(true) expect(resolveCapRunArgs( ['android', '--target=emulator-5554', '--flavor', 'release'], - { CAPACITOR_DEVICE_ID: 'ignored-device' }, + { CAPACITOR_DEVICE_ID_ANDROID: 'ignored-device' }, )).toEqual(['android', '--target=emulator-5554', '--flavor', 'release']) }) }) diff --git a/packages/cap-vite/src/native.ts b/packages/cap-vite/src/native.ts index 01a11cffc..a8da4e361 100644 --- a/packages/cap-vite/src/native.ts +++ b/packages/cap-vite/src/native.ts @@ -89,14 +89,20 @@ export function resolveCapRunArgs(capArgs: string[], env: NodeJS.ProcessEnv = pr return capArgs } - const target = env.CAPACITOR_DEVICE_ID - if (!target) { - return capArgs + const [platformArg, ...rest] = capArgs + const platform = parseCapacitorPlatform(platformArg) + let target: string | undefined; + if (platform === 'ios') { + target = env.CAPACITOR_DEVICE_ID_IOS; + } else if (platform === 'android') { + target = env.CAPACITOR_DEVICE_ID_ANDROID; } - const [platform, ...rest] = capArgs + if (!target) { + return capArgs; + } - return [platform, '--target', target, ...rest] + return [platformArg, '--target', target, ...rest] } export function pickServerUrl(server: Pick): URL {