nativescript
Version:
Command-line interface for building NativeScript projects
414 lines • 15.6 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.QuestionMark = exports.N = exports.C = exports.W = exports.CtrlC = exports.ShiftR = exports.R = exports.OpenVisionOSCommand = exports.ShiftV = exports.V = exports.OpenIOSCommand = exports.ShiftI = exports.I = exports.OpenAndroidCommand = exports.ShiftA = exports.A = void 0;
const fs = require("fs");
const os_1 = require("os");
const path = require("path");
const color_1 = require("../color");
const yok_1 = require("../common/yok");
class A {
constructor($startService) {
this.$startService = $startService;
this.key = "a";
this.platform = "Android";
this.description = "Run Android app";
this.group = "Android";
}
async execute() {
this.$startService.runAndroid();
}
canExecute(processType) {
return processType === "start";
}
}
exports.A = A;
class ShiftA {
constructor($logger, $liveSyncCommandHelper, $childProcess, $projectData) {
this.$logger = $logger;
this.$liveSyncCommandHelper = $liveSyncCommandHelper;
this.$childProcess = $childProcess;
this.$projectData = $projectData;
this.key = "A";
this.platform = "Android";
this.description = "Open project in Android Studio";
this.group = "Android";
this.willBlockKeyCommandExecution = true;
this.isInteractive = true;
}
getAndroidStudioPath() {
const os = (0, os_1.platform)();
if (os === "darwin") {
const possibleStudioPaths = [
"/Applications/Android Studio.app",
`${process.env.HOME}/Applications/Android Studio.app`,
];
return possibleStudioPaths.find((p) => fs.existsSync(p)) || null;
}
else if (os === "win32") {
const studioPath = path.join("C:", "Program Files", "Android", "Android Studio", "bin", "studio64.exe");
return fs.existsSync(studioPath) ? studioPath : null;
}
else if (os === "linux") {
const studioPath = "/usr/local/android-studio/bin/studio.sh";
return fs.existsSync(studioPath) ? studioPath : null;
}
return null;
}
async execute() {
this.$liveSyncCommandHelper.validatePlatform(this.platform);
this.$projectData.initializeProjectData();
const androidDir = `${this.$projectData.platformsDir}/android`;
if (!fs.existsSync(androidDir)) {
const prepareCommand = yok_1.injector.resolveCommand("prepare");
await prepareCommand.execute([this.platform]);
if (this.isInteractive) {
process.stdin.resume();
}
}
let studioPath = null;
studioPath = process.env.NATIVESCRIPT_ANDROID_STUDIO_PATH;
if (!studioPath) {
studioPath = this.getAndroidStudioPath();
if (!studioPath) {
this.$logger.error("Android Studio is not installed, or is not in a standard location. Use NATIVESCRIPT_ANDROID_STUDIO_PATH.");
return;
}
}
const os = (0, os_1.platform)();
if (os === "darwin") {
this.$childProcess.exec(`open -a "${studioPath}" ${androidDir}`);
}
else if (os === "win32") {
const child = this.$childProcess.spawn(studioPath, [androidDir], {
detached: true,
stdio: "ignore",
});
child.unref();
}
else if (os === "linux") {
this.$childProcess.exec(`${studioPath} ${androidDir}`);
}
}
}
exports.ShiftA = ShiftA;
class OpenAndroidCommand extends ShiftA {
constructor($logger, $liveSyncCommandHelper, $childProcess, $projectData, $options) {
super($logger, $liveSyncCommandHelper, $childProcess, $projectData);
this.$options = $options;
this.isInteractive = false;
}
async execute() {
this.$options.watch = false;
super.execute();
}
}
exports.OpenAndroidCommand = OpenAndroidCommand;
class I {
constructor($startService) {
this.$startService = $startService;
this.key = "i";
this.platform = "iOS";
this.description = "Run iOS app";
this.group = "iOS";
}
async execute() {
this.$startService.runIOS();
}
canExecute(processType) {
return processType === "start";
}
}
exports.I = I;
class ShiftI {
constructor($iOSProjectService, $logger, $childProcess, $projectData, $xcodeSelectService, $xcodebuildArgsService) {
this.$iOSProjectService = $iOSProjectService;
this.$logger = $logger;
this.$childProcess = $childProcess;
this.$projectData = $projectData;
this.$xcodeSelectService = $xcodeSelectService;
this.$xcodebuildArgsService = $xcodebuildArgsService;
this.key = "I";
this.platform = "iOS";
this.description = "Open project in Xcode";
this.group = "iOS";
this.willBlockKeyCommandExecution = true;
this.isInteractive = true;
}
async execute() {
const os = (0, os_1.platform)();
if (os === "darwin") {
this.$projectData.initializeProjectData();
const iosDir = path.resolve(this.$projectData.platformsDir, "ios");
if (!fs.existsSync(iosDir)) {
const prepareCommand = yok_1.injector.resolveCommand("prepare");
await prepareCommand.execute(["ios"]);
if (this.isInteractive) {
process.stdin.resume();
}
}
const platformData = this.$iOSProjectService.getPlatformData(this.$projectData);
const xcprojectFile = this.$xcodebuildArgsService.getXcodeProjectArgs(platformData, this.$projectData)[1];
if (fs.existsSync(xcprojectFile)) {
this.$xcodeSelectService
.getDeveloperDirectoryPath()
.then(() => this.$childProcess.exec(`open ${xcprojectFile}`, {}))
.catch((e) => {
this.$logger.error(e.message);
});
}
else {
this.$logger.error(`Unable to open project file: ${xcprojectFile}`);
}
}
else {
this.$logger.error("Opening a project in XCode requires macOS.");
}
}
}
exports.ShiftI = ShiftI;
class OpenIOSCommand extends ShiftI {
constructor($iOSProjectService, $logger, $childProcess, $projectData, $xcodeSelectService, $xcodebuildArgsService, $options) {
super($iOSProjectService, $logger, $childProcess, $projectData, $xcodeSelectService, $xcodebuildArgsService);
this.$options = $options;
this.isInteractive = false;
}
async execute() {
this.$options.watch = false;
super.execute();
}
}
exports.OpenIOSCommand = OpenIOSCommand;
class V {
constructor($startService) {
this.$startService = $startService;
this.key = "v";
this.platform = "visionOS";
this.description = "Run visionOS app";
this.group = "visionOS";
}
async execute() {
this.$startService.runVisionOS();
}
canExecute(processType) {
return processType === "start";
}
}
exports.V = V;
class ShiftV {
constructor($iOSProjectService, $logger, $childProcess, $projectData, $xcodeSelectService, $xcodebuildArgsService, $options) {
this.$iOSProjectService = $iOSProjectService;
this.$logger = $logger;
this.$childProcess = $childProcess;
this.$projectData = $projectData;
this.$xcodeSelectService = $xcodeSelectService;
this.$xcodebuildArgsService = $xcodebuildArgsService;
this.$options = $options;
this.key = "V";
this.platform = "visionOS";
this.description = "Open project in Xcode";
this.group = "visionOS";
this.willBlockKeyCommandExecution = true;
this.isInteractive = true;
}
async execute() {
this.$options.platformOverride = "visionOS";
const os = (0, os_1.platform)();
if (os === "darwin") {
this.$projectData.initializeProjectData();
const visionOSDir = path.resolve(this.$projectData.platformsDir, "visionos");
if (!fs.existsSync(visionOSDir)) {
const prepareCommand = yok_1.injector.resolveCommand("prepare");
await prepareCommand.execute(["visionos"]);
if (this.isInteractive) {
process.stdin.resume();
}
}
const platformData = this.$iOSProjectService.getPlatformData(this.$projectData);
const xcprojectFile = this.$xcodebuildArgsService.getXcodeProjectArgs(platformData, this.$projectData)[1];
if (fs.existsSync(xcprojectFile)) {
this.$xcodeSelectService
.getDeveloperDirectoryPath()
.then(() => this.$childProcess.exec(`open ${xcprojectFile}`, {}))
.catch((e) => {
this.$logger.error(e.message);
});
}
else {
this.$logger.error(`Unable to open project file: ${xcprojectFile}`);
}
}
else {
this.$logger.error("Opening a project in XCode requires macOS.");
}
this.$options.platformOverride = null;
}
}
exports.ShiftV = ShiftV;
class OpenVisionOSCommand extends ShiftV {
constructor($iOSProjectService, $logger, $childProcess, $projectData, $xcodeSelectService, $xcodebuildArgsService, $options) {
super($iOSProjectService, $logger, $childProcess, $projectData, $xcodeSelectService, $xcodebuildArgsService, $options);
this.$options = $options;
this.isInteractive = false;
}
async execute() {
this.$options.watch = false;
super.execute();
}
}
exports.OpenVisionOSCommand = OpenVisionOSCommand;
class R {
constructor($liveSyncCommandHelper) {
this.$liveSyncCommandHelper = $liveSyncCommandHelper;
this.key = "r";
this.platform = "all";
this.description = "Rebuild native app if needed and restart";
this.group = "Development Workflow";
this.willBlockKeyCommandExecution = true;
}
async execute(platform) {
const devices = await this.$liveSyncCommandHelper.getDeviceInstances(platform);
await this.$liveSyncCommandHelper.executeLiveSyncOperation(devices, platform, {
restartLiveSync: true,
});
}
}
exports.R = R;
class ShiftR {
constructor($liveSyncCommandHelper) {
this.$liveSyncCommandHelper = $liveSyncCommandHelper;
this.key = "R";
this.platform = "all";
this.description = "Force rebuild native app and restart";
this.group = "Development Workflow";
this.willBlockKeyCommandExecution = true;
}
async execute(platform) {
const devices = await this.$liveSyncCommandHelper.getDeviceInstances(platform);
await this.$liveSyncCommandHelper.executeLiveSyncOperation(devices, platform, {
skipNativePrepare: false,
forceRebuildNativeApp: true,
restartLiveSync: true,
});
}
}
exports.ShiftR = ShiftR;
class CtrlC {
constructor() {
this.key = "\u0003" /* SpecialKeys.CtrlC */;
this.platform = "all";
this.group = "Development Workflow";
this.willBlockKeyCommandExecution = false;
}
async execute() {
process.exit();
}
}
exports.CtrlC = CtrlC;
class W {
constructor($prepareController) {
this.$prepareController = $prepareController;
this.key = "w";
this.platform = "all";
this.description = "Toggle file watcher";
this.group = "Development Workflow";
this.willBlockKeyCommandExecution = true;
}
async execute() {
try {
const paused = await this.$prepareController.toggleFileWatcher();
process.stdout.write(paused
? color_1.color.gray("Paused watching file changes... Press 'w' to resume.")
: color_1.color.bgGreen("Resumed watching file changes"));
}
catch (e) { }
}
}
exports.W = W;
class C {
constructor($childProcess, $liveSyncCommandHelper) {
this.$childProcess = $childProcess;
this.$liveSyncCommandHelper = $liveSyncCommandHelper;
this.key = "c";
this.platform = "all";
this.description = "Clean project";
this.group = "Development Workflow";
this.willBlockKeyCommandExecution = true;
}
async execute() {
await this.$liveSyncCommandHelper.stop();
const clean = this.$childProcess.spawn("ns", ["clean"]);
clean.stdout.on("data", (data) => {
process.stdout.write(data);
if (data.toString().includes("Project successfully cleaned.") ||
data.toString().includes("Project unsuccessfully cleaned.")) {
clean.kill("SIGINT");
}
});
}
}
exports.C = C;
class N {
constructor() {
this.key = "n";
this.platform = "all";
this.description = "Install dependencies";
this.group = "Development Workflow";
this.willBlockKeyCommandExecution = true;
}
async execute(platform) {
const install = yok_1.injector.resolveCommand("install");
await install.execute([]);
process.stdin.resume();
}
}
exports.N = N;
class QuestionMark {
constructor($keyCommandHelper) {
this.$keyCommandHelper = $keyCommandHelper;
this.key = "?" /* SpecialKeys.QuestionMark */;
this.platform = "all";
this.description = "Show this help";
this.group = "Development Workflow";
this.willBlockKeyCommandExecution = true;
}
async execute(platform_) {
let platform;
switch (platform_.toLowerCase()) {
case "android":
platform = "Android";
break;
case "ios":
platform = "iOS";
break;
case "visionOS":
case "vision":
platform = "visionOS";
break;
default:
platform = "all";
break;
}
this.$keyCommandHelper.printCommands(platform);
process.stdin.resume();
}
}
exports.QuestionMark = QuestionMark;
yok_1.injector.registerKeyCommand("a", A);
yok_1.injector.registerKeyCommand("A", ShiftA);
yok_1.injector.registerKeyCommand("i", I);
yok_1.injector.registerKeyCommand("I", ShiftI);
yok_1.injector.registerKeyCommand("v", V);
yok_1.injector.registerKeyCommand("V", ShiftV);
yok_1.injector.registerKeyCommand("r", R);
yok_1.injector.registerKeyCommand("R", ShiftR);
yok_1.injector.registerKeyCommand("w", W);
yok_1.injector.registerKeyCommand("c", C);
yok_1.injector.registerKeyCommand("A", ShiftA);
yok_1.injector.registerKeyCommand("n", N);
yok_1.injector.registerKeyCommand("?" /* SpecialKeys.QuestionMark */, QuestionMark);
yok_1.injector.registerKeyCommand("\u0003" /* SpecialKeys.CtrlC */, CtrlC);
yok_1.injector.registerCommand("open|ios", OpenIOSCommand);
yok_1.injector.registerCommand("open|visionos", OpenVisionOSCommand);
yok_1.injector.registerCommand("open|vision", OpenVisionOSCommand);
yok_1.injector.registerCommand("open|android", OpenAndroidCommand);
//# sourceMappingURL=index.js.map