feat(cap-vite): use platform-specific device id (#1458)
--------- Co-authored-by-agent: Cursor Agent <cursoragent@cursor.com> Co-authored-by-agent: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
This commit is contained in:
@@ -298,7 +298,7 @@ Start the development server for the capacitor:
|
||||
```shell
|
||||
pnpm dev:pocket:ios --target <DEVICE_ID_OR_SIMULATOR_NAME>
|
||||
# Or
|
||||
CAPACITOR_DEVICE_ID=<DEVICE_ID_OR_SIMULATOR_NAME> pnpm dev:pocket:ios
|
||||
CAPACITOR_DEVICE_ID_IOS=<DEVICE_ID_OR_SIMULATOR_NAME> pnpm dev:pocket:ios
|
||||
```
|
||||
|
||||
You can see the list of available devices and simulators by running `pnpm exec cap run ios --list`.
|
||||
|
||||
@@ -38,7 +38,7 @@ Open the project in Android Studio:
|
||||
```bash
|
||||
pnpm dev:android -- target <CAPACITOR_DEVICE_ID>
|
||||
# Or
|
||||
CAPACITOR_DEVICE_ID=<CAPACITOR_DEVICE_ID> pnpm dev:android
|
||||
CAPACITOR_DEVICE_ID_ANDROID=<CAPACITOR_DEVICE_ID> pnpm dev:android
|
||||
```
|
||||
|
||||
|
||||
|
||||
@@ -13,13 +13,13 @@ Examples:
|
||||
```bash
|
||||
pnpm exec cap-vite -- ios --target <DEVICE_ID_OR_SIMULATOR_NAME>
|
||||
pnpm exec cap-vite -- --host 0.0.0.0 --port 5173 -- android --target <DEVICE_ID_OR_SIMULATOR_NAME> --flavor release
|
||||
CAPACITOR_DEVICE_ID=<DEVICE_ID_OR_SIMULATOR_NAME> pnpm exec cap-vite -- ios
|
||||
CAPACITOR_DEVICE_ID_IOS=<DEVICE_ID_OR_SIMULATOR_NAME> pnpm exec cap-vite -- ios
|
||||
pnpm -F @proj-airi/stage-pocket run dev:ios -- --target <DEVICE_ID_OR_SIMULATOR_NAME>
|
||||
```
|
||||
|
||||
- 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 <CAPACITOR_DEVICE_ID>` 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.
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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'])
|
||||
})
|
||||
})
|
||||
|
||||
@@ -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<ViteDevServer, 'resolvedUrls'>): URL {
|
||||
|
||||
Reference in New Issue
Block a user