UNPKG

nativescript

Version:

Command-line interface for building NativeScript projects

124 lines 6.05 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.IOSSimulatorApplicationManager = void 0; const application_manager_base_1 = require("../../application-manager-base"); const helpers_1 = require("../../../helpers"); const decorators_1 = require("../../../decorators"); const constants_1 = require("../../../constants"); const path = require("path"); const log4js = require("log4js"); const _ = require("lodash"); class IOSSimulatorApplicationManager extends application_manager_base_1.ApplicationManagerBase { constructor($childProcess, iosSim, device, $options, $fs, $deviceLogProvider, $tempService, $logger, $hooksService) { super($logger, $hooksService, $deviceLogProvider); this.$childProcess = $childProcess; this.iosSim = iosSim; this.device = device; this.$options = $options; this.$fs = $fs; this.$deviceLogProvider = $deviceLogProvider; this.$tempService = $tempService; this._lldbProcesses = {}; } async getInstalledApplications() { return this.iosSim.getInstalledApplications(this.device.deviceInfo.identifier); } async installApplication(packageFilePath) { if (this.$fs.exists(packageFilePath) && path.extname(packageFilePath) === ".zip") { const dir = await this.$tempService.mkdirSync("simulatorPackage"); await this.$fs.unzip(packageFilePath, dir); const app = _.find(this.$fs.readDirectory(dir), (directory) => path.extname(directory) === ".app"); if (app) { packageFilePath = path.join(dir, app); } } await this.iosSim.installApplication(this.device.deviceInfo.identifier, packageFilePath); } async uninstallApplication(appIdentifier) { await this.detachNativeDebugger(appIdentifier); return this.iosSim.uninstallApplication(this.device.deviceInfo.identifier, appIdentifier); } async startApplication(appData) { const args = process.env.IOS_SIMULATOR_RUN_ARGS || ""; const options = appData.waitForDebugger ? { waitForDebugger: true, args: `--nativescript-debug-brk ${args}`.trim(), } : args ? { args } : {}; await this.setDeviceLogData(appData); const launchResult = await this.iosSim.startApplication(this.device.deviceInfo.identifier, appData.appId, options); const pid = (0, helpers_1.getPidFromiOSSimulatorLogs)(appData.appId, launchResult); this.$deviceLogProvider.setApplicationPidForDevice(this.device.deviceInfo.identifier, pid); if (appData.waitForDebugger) { this.attachNativeDebugger(appData.appId, pid); } } async stopApplication(appData) { const { appId } = appData; await this.device.destroyDebugSocket(appId); await this.detachNativeDebugger(appId); await this.iosSim.stopApplication(this.device.deviceInfo.identifier, appData.appId, appData.projectName); } async getDebuggableApps() { return []; } async getDebuggableAppViews(appIdentifiers) { // Implement when we can find debuggable applications for iOS. return Promise.resolve(null); } // iOS will kill the app if we freeze it in the NativeScript Runtime and wait for debug-brk. // In order to avoid that, we are attaching lldb and passing it "process continue". // In this way, iOS will not kill the app because it has a native debugger attached // and the users will be able to attach a debug session using the debug-brk flag. attachNativeDebugger(appId, pid) { this._lldbProcesses[appId] = this.$childProcess.spawn("lldb", ["-p", pid]); if (log4js.levels.TRACE.isGreaterThanOrEqualTo(this.$logger.getLevel())) { this._lldbProcesses[appId].stdout.pipe(process.stdout); } this._lldbProcesses[appId].stderr.pipe(process.stderr); this._lldbProcesses[appId].stdin.write("process continue\n"); } async detachNativeDebugger(appId) { if (this._lldbProcesses[appId]) { this._lldbProcesses[appId].stdin.write("process detach\n"); await this.killProcess(this._lldbProcesses[appId]); this._lldbProcesses[appId] = undefined; } } async killProcess(childProcess) { if (childProcess) { return new Promise((resolve, reject) => { childProcess.on("close", resolve); childProcess.kill(); }); } } async setDeviceLogData(appData) { this.$deviceLogProvider.setProjectNameForDevice(this.device.deviceInfo.identifier, appData.projectName); this.$deviceLogProvider.setProjectDirForDevice(this.device.deviceInfo.identifier, appData.projectDir); if (!this.$options.justlaunch) { await this.startDeviceLog(); } } startDeviceLog() { return this.device.openDeviceLogStream({ predicate: constants_1.IOS_LOG_PREDICATE }); } } exports.IOSSimulatorApplicationManager = IOSSimulatorApplicationManager; __decorate([ (0, helpers_1.hook)("install") ], IOSSimulatorApplicationManager.prototype, "installApplication", null); __decorate([ (0, decorators_1.cache)() ], IOSSimulatorApplicationManager.prototype, "startDeviceLog", null); //# sourceMappingURL=ios-simulator-application-manager.js.map