@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
JavaScript
// 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" />
;
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