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
|
```shell
|
||||||
pnpm dev:pocket:ios --target <DEVICE_ID_OR_SIMULATOR_NAME>
|
pnpm dev:pocket:ios --target <DEVICE_ID_OR_SIMULATOR_NAME>
|
||||||
# Or
|
# 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`.
|
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
|
```bash
|
||||||
pnpm dev:android -- target <CAPACITOR_DEVICE_ID>
|
pnpm dev:android -- target <CAPACITOR_DEVICE_ID>
|
||||||
# Or
|
# 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
|
```bash
|
||||||
pnpm exec cap-vite -- ios --target <DEVICE_ID_OR_SIMULATOR_NAME>
|
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
|
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>
|
pnpm -F @proj-airi/stage-pocket run dev:ios -- --target <DEVICE_ID_OR_SIMULATOR_NAME>
|
||||||
```
|
```
|
||||||
|
|
||||||
- Arguments before `--` are forwarded to `vite`.
|
- Arguments before `--` are forwarded to `vite`.
|
||||||
- Arguments after `--` are forwarded to `cap run`.
|
- 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.
|
- `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.
|
- 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
|
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 {
|
export function parseCapViteCliArgs(argv: string[]): ParsedCapViteCliArgs | null {
|
||||||
if (argv.length === 1 && (argv[0] === '--help' || argv[0] === '-h')) {
|
if (argv.length === 1 && (argv[0] === '--help' || argv[0] === '-h')) {
|
||||||
return null
|
return null
|
||||||
|
|||||||
@@ -46,22 +46,36 @@ describe('resolveCapRunArgs', () => {
|
|||||||
it('keeps an explicit --target argument untouched', () => {
|
it('keeps an explicit --target argument untouched', () => {
|
||||||
expect(resolveCapRunArgs(
|
expect(resolveCapRunArgs(
|
||||||
['ios', '--target', 'iPhone 16 Pro', '--scheme', 'AIRI'],
|
['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'])
|
)).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(
|
expect(resolveCapRunArgs(
|
||||||
['android', '--flavor', 'release'],
|
['android', '--flavor', 'release'],
|
||||||
{ CAPACITOR_DEVICE_ID: 'emulator-5554' },
|
{ CAPACITOR_DEVICE_ID_ANDROID: 'emulator-5554' },
|
||||||
)).toEqual(['android', '--target', 'emulator-5554', '--flavor', 'release'])
|
)).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', () => {
|
it('supports the --target=value form when checking existing args', () => {
|
||||||
expect(hasCapacitorTargetArg(['android', '--target=emulator-5554'])).toBe(true)
|
expect(hasCapacitorTargetArg(['android', '--target=emulator-5554'])).toBe(true)
|
||||||
expect(resolveCapRunArgs(
|
expect(resolveCapRunArgs(
|
||||||
['android', '--target=emulator-5554', '--flavor', 'release'],
|
['android', '--target=emulator-5554', '--flavor', 'release'],
|
||||||
{ CAPACITOR_DEVICE_ID: 'ignored-device' },
|
{ CAPACITOR_DEVICE_ID_ANDROID: 'ignored-device' },
|
||||||
)).toEqual(['android', '--target=emulator-5554', '--flavor', 'release'])
|
)).toEqual(['android', '--target=emulator-5554', '--flavor', 'release'])
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -89,14 +89,20 @@ export function resolveCapRunArgs(capArgs: string[], env: NodeJS.ProcessEnv = pr
|
|||||||
return capArgs
|
return capArgs
|
||||||
}
|
}
|
||||||
|
|
||||||
const target = env.CAPACITOR_DEVICE_ID
|
const [platformArg, ...rest] = capArgs
|
||||||
if (!target) {
|
const platform = parseCapacitorPlatform(platformArg)
|
||||||
return capArgs
|
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 {
|
export function pickServerUrl(server: Pick<ViteDevServer, 'resolvedUrls'>): URL {
|
||||||
|
|||||||
Reference in New Issue
Block a user