react-native/local-cli/logIOS/logIOS.js

78 lines
1.6 KiB
JavaScript

'use strict';
const chalk = require('chalk');
const child_process = require('child_process');
const os = require('os');
const path = require('path');
const Promise = require('promise');
/**
* Starts iOS device syslog tail
*/
function logIOS() {
return new Promise((resolve, reject) => {
_logIOS(resolve, reject);
});
}
function _logIOS(resolve, reject) {
let rawDevices;
try {
rawDevices = child_process.execFileSync(
'xcrun', ['simctl', 'list', 'devices', '--json'], {encoding: 'utf8'}
);
} catch (e) {
console.log(chalk.red(
'xcrun invocation failed. Please check that Xcode is installed.'
));
reject(e);
return;
}
const { devices } = JSON.parse(rawDevices);
const device = _findAvailableDevice(devices);
if (device === undefined) {
console.log(chalk.red(
'No active iOS device found'
));
reject();
}
tailDeviceLogs(device.udid, reject);
}
function _findAvailableDevice(devices) {
for (const key of Object.keys(devices)) {
for (const device of devices[key]) {
if (device.availability === '(available)' && device.state === 'Booted') {
return device;
}
}
}
}
function tailDeviceLogs(udid, reject) {
const logDir = path.join(
os.homedir(),
'Library',
'Logs',
'CoreSimulator',
udid,
'asl',
);
const log =
child_process.spawnSync('syslog', ['-w', '-F', 'std', '-d', logDir], {stdio: 'inherit'});
if (log.error !== null) {
console.log(chalk.red(
'syslog invocation failed.'
));
reject(log.error);
}
}
module.exports = logIOS;