UNPKG

@hkvstore/taco-cli

Version:

taco-cli is a command-line interface for rapid Apache Cordova development (forked from Microsoft taco-cli)

230 lines (228 loc) 11.1 kB
// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for details. /// <reference path="../../typings/node.d.ts" /> /// <reference path="../../typings/nopt.d.ts" /> /// <reference path="../../typings/tacoDependencyInstaller.d.ts" /> /// <reference path="../../typings/tacoUtils.d.ts" /> "use strict"; var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; var fs = require("fs"); var path = require("path"); var Q = require("q"); var buildTelemetryHelper = require("./utils/buildTelemetryHelper"); var dependencies = require("taco-dependency-installer"); var TacoErrorCodes = require("./tacoErrorCodes"); var errorHelper = require("./tacoErrorHelper"); var resources = require("../resources/resourceManager"); var tacoUtils = require("taco-utils"); var commands = tacoUtils.Commands; var CordovaWrapper = tacoUtils.CordovaWrapper; var DependencyInstaller = dependencies.DependencyInstaller; var logger = tacoUtils.Logger; var loggerHelper = tacoUtils.LoggerHelper; /** * InstallDependencies * * Handles "taco install-dependencies" */ var InstallReqs = (function (_super) { __extends(InstallReqs, _super); function InstallReqs() { _super.apply(this, arguments); } InstallReqs.getInstalledPlatforms = function () { // Assume we are at the project root if (!fs.existsSync(InstallReqs.PLATFORMS_FOLDER_NAME)) { throw errorHelper.get(TacoErrorCodes.CommandInstallNoPlatformsFolder); } var platforms = []; fs.readdirSync(InstallReqs.PLATFORMS_FOLDER_NAME).forEach(function (file) { if (fs.statSync(path.join(InstallReqs.PLATFORMS_FOLDER_NAME, file)).isDirectory()) { // Assume that every folder under root/platforms is an installed platform platforms.push(file); } }); return platforms; }; InstallReqs.removeDuplicates = function (platforms) { var seen = {}; var uniques = []; platforms.forEach(function (platform) { if (!seen[platform]) { seen[platform] = true; uniques.push(platform); } }); return uniques; }; InstallReqs.removePlatformFromList = function (platform, requestedPlatforms) { return requestedPlatforms.filter(function (p) { return p !== platform; }); }; InstallReqs.printPlatformList = function (platforms, printVersions) { var table = platforms.map(function (platform) { var name = resources.getString("CommandInstallPlatformBullet", platform); var desc = ""; if (printVersions && !!InstallReqs.MIN_PLATFORM_VERSIONS[platform]) { desc = resources.getString("CommandInstallPlatformVersion", platform, InstallReqs.MIN_PLATFORM_VERSIONS[platform]); } return { name: name, description: desc }; }); loggerHelper.logNameDescriptionTable(table); }; InstallReqs.supportsCheckReqs = function (platform) { // For now, Cordova checks for a "check_all" method defined in <platform>/cordova/lib/check_reqs.js. Make sure to update this if Cordova changes that. var checkReqsPath = path.resolve(InstallReqs.PLATFORMS_FOLDER_NAME, platform, InstallReqs.CHECK_REQS_PATH); var reqsModule; try { reqsModule = require(checkReqsPath); } catch (err) { return false; } if (reqsModule && typeof reqsModule.check_all === "function") { return true; } return false; }; InstallReqs.skipSystemPlatforms = function (requestedPlatforms) { var skippedPlatforms = []; var result = requestedPlatforms.slice(); if (process.platform !== "darwin" && requestedPlatforms.indexOf("ios") > -1) { result = InstallReqs.removePlatformFromList("ios", result); skippedPlatforms.push("ios"); } if (process.platform !== "win32") { if (requestedPlatforms.indexOf("windows") > -1) { result = InstallReqs.removePlatformFromList("windows", result); skippedPlatforms.push("windows"); } if (requestedPlatforms.indexOf("wp8") > -1) { result = InstallReqs.removePlatformFromList("wp8", result); skippedPlatforms.push("wp8"); } } if (skippedPlatforms.length > 0) { logger.logWarning(resources.getString("CommandInstallSkipSystem")); InstallReqs.printPlatformList(skippedPlatforms); logger.logLine(); logger.logLine(); } return result; }; InstallReqs.skipNotInstalled = function (requestedPlatforms, installedPlatforms, telemetry) { var skippedPlatforms = []; var result = []; requestedPlatforms.forEach(function (platform) { if (installedPlatforms.indexOf(platform) === -1) { skippedPlatforms.push(platform); } else { result.push(platform); } }); if (skippedPlatforms.length > 0) { telemetry.addWithPiiEvaluator("platformsSkippedDueToNotAdded", skippedPlatforms, buildTelemetryHelper.getIsPlatformPii()); logger.logWarning(resources.getString("CommandInstallSkipNotAdded")); InstallReqs.printPlatformList(skippedPlatforms); logger.logLine(); logger.logLine(); } return result; }; InstallReqs.skipNoReqsSupport = function (requestedPlatforms, telemetry) { var skippedPlatforms = []; var result = []; requestedPlatforms.forEach(function (platform) { if (!InstallReqs.supportsCheckReqs(platform)) { skippedPlatforms.push(platform); } else { result.push(platform); } }); if (skippedPlatforms.length > 0) { telemetry.addWithPiiEvaluator("platformsSkippedDueToNoReqsSupport", skippedPlatforms, buildTelemetryHelper.getIsPlatformPii()); logger.logWarning(resources.getString("CommandInstallSkipNoReqsSupport")); InstallReqs.printPlatformList(skippedPlatforms, true); logger.logLine(); logger.log(resources.getString("CommandInstallNoReqsSupportHint")); logger.logLine(); logger.logLine(); } return result; }; InstallReqs.prototype.parseArgs = function (args) { return tacoUtils.ArgsHelper.parseArguments(InstallReqs.KNOWN_OPTIONS, {}, args, 0); }; InstallReqs.prototype.runCommand = function () { var _this = this; var commandData = this.data; return tacoUtils.TelemetryHelper.generate("InstallReqs", function (telemetry) { var self = _this; return Q({}) .then(function () { logger.logLine(); // Get a list of the installed platforms var installedPlatforms = InstallReqs.getInstalledPlatforms(); if (installedPlatforms.length === 0) { return Q.reject(errorHelper.get(TacoErrorCodes.CommandInstallNoPlatformsAdded)); } telemetry .addWithPiiEvaluator("requestedPlatformsViaCommandLine", commandData.remain, buildTelemetryHelper.getIsPlatformPii()) .addWithPiiEvaluator("installedPlatforms", installedPlatforms, buildTelemetryHelper.getIsPlatformPii()); // Get a list of the requested platforms (either what is specified by the user, or all the installed platforms if nothing is specified) var requestedPlatforms = commandData.remain.length > 0 ? commandData.remain : installedPlatforms.slice(); // Using slice() to clone the array requestedPlatforms = InstallReqs.removeDuplicates(requestedPlatforms); // From the requested platforms, skip the ones where the current system isn't supported (for example, iOS on Windows machines) requestedPlatforms = InstallReqs.skipSystemPlatforms(requestedPlatforms); // From the remaining platforms, skip the ones that are not added to the project requestedPlatforms = InstallReqs.skipNotInstalled(requestedPlatforms, installedPlatforms, telemetry); // From the remaining platforms, skip the ones that don't support 'cordova check_reqs' requestedPlatforms = InstallReqs.skipNoReqsSupport(requestedPlatforms, telemetry); // If we don't have any remaining platforms, print message and return loggerHelper.logSeparatorLine(); logger.logLine(); telemetry.addWithPiiEvaluator("platformsToActuallyUse", requestedPlatforms, buildTelemetryHelper.getIsPlatformPii()); if (requestedPlatforms.length === 0) { logger.log(resources.getString("CommandInstallNothingToInstall")); return Q({}); } // Run the dependency installer on the remaining platforms logger.log(resources.getString("CommandInstallFinalPlatforms", requestedPlatforms.join(", "))); logger.logLine(); return CordovaWrapper.requirements(requestedPlatforms) .then(function (result) { var sessionId = tacoUtils.Telemetry.isOptedIn ? tacoUtils.Telemetry.getSessionId() : "null"; // Null session ID to not publish telemetry var installer = new DependencyInstaller(sessionId); return installer.run(result); }).catch(function (error) { // if requirements has failed with too old Cordova // throw a new TACO error with more information. var tacoError = error; if (error.isTacoError && tacoError.errorCode === tacoUtils.TacoErrorCode.CommandInstallCordovaTooOld) { throw errorHelper.get(TacoErrorCodes.InstallReqsNotSupported, tacoError.message); } throw error; }); }); }).thenResolve({}); }; InstallReqs.KNOWN_OPTIONS = {}; InstallReqs.PLATFORMS_FOLDER_NAME = "platforms"; InstallReqs.CHECK_REQS_PATH = path.join("cordova", "lib", "check_reqs.js"); InstallReqs.MIN_PLATFORM_VERSIONS = { ios: "3.9.0", android: "4.1.0", windows: "4.1.0" }; return InstallReqs; }(commands.TacoCommandBase)); module.exports = InstallReqs; //# sourceMappingURL=installReqs.js.map