import { simctlJson } from '../executor/simctl.js';
import type { SimctlListOutput, SimDevice } from '../types/simctl.js';
const UDID_PATTERN = /^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i;
export function isUdid(value: string): boolean {
return UDID_PATTERN.test(value);
}
export function resolveDevice(deviceIdentifier: string): string {
// Special value for currently booted simulator
if (deviceIdentifier.toLowerCase() === 'booted') {
return 'booted';
}
// Already a UDID, return as-is
if (isUdid(deviceIdentifier)) {
return deviceIdentifier;
}
// Look up by name
const listOutput = simctlJson<SimctlListOutput>('list', ['devices']);
for (const runtime of Object.keys(listOutput.devices)) {
const devices = listOutput.devices[runtime];
for (const device of devices) {
if (device.name.toLowerCase() === deviceIdentifier.toLowerCase()) {
return device.udid;
}
}
}
throw new Error(`Device not found: ${deviceIdentifier}`);
}
export function getBootedDevice(): SimDevice | null {
const listOutput = simctlJson<SimctlListOutput>('list', ['devices']);
for (const runtime of Object.keys(listOutput.devices)) {
const devices = listOutput.devices[runtime];
for (const device of devices) {
if (device.state === 'Booted') {
return device;
}
}
}
return null;
}
export function getAllDevices(): SimDevice[] {
const listOutput = simctlJson<SimctlListOutput>('list', ['devices']);
const allDevices: SimDevice[] = [];
for (const runtime of Object.keys(listOutput.devices)) {
allDevices.push(...listOutput.devices[runtime]);
}
return allDevices;
}
/**
* Build an iOS Simulator destination string for xcodebuild.
* If the input already contains '=' (like 'platform=iOS Simulator,...'),
* it's returned as-is. Otherwise, resolve the device name/UDID to a full destination.
*/
export function buildSimulatorDestination(deviceNameOrUdid: string): string {
// If it already looks like a destination string, return as-is
if (deviceNameOrUdid.includes('=')) {
return deviceNameOrUdid;
}
// Resolve to UDID and build destination string
const udid = resolveDevice(deviceNameOrUdid);
return `platform=iOS Simulator,id=${udid}`;
}