@nomiclabs/buidler
Version:
Buidler is an extensible developer tool that helps smart contract developers increase productivity by reliably bringing together the tools they want.
165 lines • 7.56 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const chalk_1 = __importDefault(require("chalk"));
const debug_1 = __importDefault(require("debug"));
const semver_1 = __importDefault(require("semver"));
require("source-map-support/register");
const task_names_1 = require("../../builtin-tasks/task-names");
const constants_1 = require("../constants");
const context_1 = require("../context");
const config_loading_1 = require("../core/config/config-loading");
const errors_1 = require("../core/errors");
const errors_list_1 = require("../core/errors-list");
const buidler_params_1 = require("../core/params/buidler-params");
const env_variables_1 = require("../core/params/env-variables");
const project_structure_1 = require("../core/project-structure");
const runtime_environment_1 = require("../core/runtime-environment");
const typescript_support_1 = require("../core/typescript-support");
const reporter_1 = require("../sentry/reporter");
const packageInfo_1 = require("../util/packageInfo");
const analytics_1 = require("./analytics");
const ArgumentsParser_1 = require("./ArgumentsParser");
const emoji_1 = require("./emoji");
const project_creation_1 = require("./project-creation");
const log = debug_1.default("buidler:core:cli");
const ANALYTICS_SLOW_TASK_THRESHOLD = 300;
async function printVersionMessage(packageJson) {
console.log(packageJson.version);
}
function ensureValidNodeVersion(packageJson) {
const requirement = packageJson.engines.node;
if (!semver_1.default.satisfies(process.version, requirement)) {
throw new errors_1.BuidlerError(errors_list_1.ERRORS.GENERAL.INVALID_NODE_VERSION, {
requirement,
});
}
}
async function main() {
// We first accept this argument anywhere, so we know if the user wants
// stack traces before really parsing the arguments.
let showStackTraces = process.argv.includes("--show-stack-traces");
try {
const packageJson = await packageInfo_1.getPackageJson();
ensureValidNodeVersion(packageJson);
const envVariableArguments = env_variables_1.getEnvBuidlerArguments(buidler_params_1.BUIDLER_PARAM_DEFINITIONS, process.env);
const argumentsParser = new ArgumentsParser_1.ArgumentsParser();
const { buidlerArguments, taskName: parsedTaskName, unparsedCLAs, } = argumentsParser.parseBuidlerArguments(buidler_params_1.BUIDLER_PARAM_DEFINITIONS, envVariableArguments, process.argv.slice(2));
if (buidlerArguments.verbose) {
reporter_1.Reporter.setVerbose(true);
debug_1.default.enable("buidler*");
}
if (buidlerArguments.emoji) {
emoji_1.enableEmoji();
}
showStackTraces = buidlerArguments.showStackTraces;
if (buidlerArguments.config === undefined &&
!project_structure_1.isCwdInsideProject() &&
process.stdout.isTTY === true) {
await project_creation_1.createProject();
return;
}
// --version is a special case
if (buidlerArguments.version) {
await printVersionMessage(packageJson);
return;
}
typescript_support_1.loadTsNodeIfPresent();
const ctx = context_1.BuidlerContext.createBuidlerContext();
const config = config_loading_1.loadConfigAndTasks(buidlerArguments);
const analytics = await analytics_1.Analytics.getInstance(config.paths.root, config.analytics.enabled);
reporter_1.Reporter.setConfigPath(config.paths.configFile);
reporter_1.Reporter.setEnabled(config.analytics.enabled);
const envExtenders = ctx.extendersManager.getExtenders();
const taskDefinitions = ctx.tasksDSL.getTaskDefinitions();
let taskName = parsedTaskName !== undefined ? parsedTaskName : "help";
// tslint:disable-next-line: prefer-const
let [abortAnalytics, hitPromise] = await analytics.sendTaskHit(taskName);
let taskArguments;
// --help is a also special case
if (buidlerArguments.help && taskName !== task_names_1.TASK_HELP) {
taskArguments = { task: taskName };
taskName = task_names_1.TASK_HELP;
}
else {
const taskDefinition = taskDefinitions[taskName];
if (taskDefinition === undefined) {
throw new errors_1.BuidlerError(errors_list_1.ERRORS.ARGUMENTS.UNRECOGNIZED_TASK, {
task: taskName,
});
}
taskArguments = argumentsParser.parseTaskArguments(taskDefinition, unparsedCLAs);
}
// TODO: This is here for backwards compatibility
// There are very few projects using this.
if (buidlerArguments.network === undefined) {
buidlerArguments.network = config.defaultNetwork;
}
const env = new runtime_environment_1.Environment(config, buidlerArguments, taskDefinitions, envExtenders, ctx.experimentalBuidlerEVMMessageTraceHooks);
ctx.setBuidlerRuntimeEnvironment(env);
const timestampBeforeRun = new Date().getTime();
await env.run(taskName, taskArguments);
const timestampAfterRun = new Date().getTime();
if (timestampAfterRun - timestampBeforeRun >
ANALYTICS_SLOW_TASK_THRESHOLD) {
await hitPromise;
}
else {
abortAnalytics();
}
log(`Killing Buidler after successfully running task ${taskName}`);
}
catch (error) {
let isBuidlerError = false;
if (errors_1.BuidlerError.isBuidlerError(error)) {
isBuidlerError = true;
console.error(chalk_1.default.red(`Error ${error.message}`));
}
else if (errors_1.BuidlerPluginError.isBuidlerPluginError(error)) {
isBuidlerError = true;
console.error(chalk_1.default.red(`Error in plugin ${error.pluginName}: ${error.message}`));
}
else if (error instanceof Error) {
console.error(chalk_1.default.red("An unexpected error occurred:"));
showStackTraces = true;
}
else {
console.error(chalk_1.default.red("An unexpected error occurred."));
showStackTraces = true;
}
console.log("");
try {
reporter_1.Reporter.reportError(error);
}
catch (error) {
log("Couldn't report error to sentry: %O", error);
}
if (showStackTraces) {
console.error(error);
}
else {
if (!isBuidlerError) {
console.error(`If you think this is a bug in Buidler, please report it here: https://buidler.dev/reportbug`);
}
if (errors_1.BuidlerError.isBuidlerError(error)) {
const link = `https://buidler.dev/${errors_list_1.getErrorCode(error.errorDescriptor)}`;
console.error(`For more info go to ${link} or run ${constants_1.BUIDLER_NAME} with --show-stack-traces`);
}
else {
console.error(`For more info run ${constants_1.BUIDLER_NAME} with --show-stack-traces`);
}
}
await reporter_1.Reporter.close(1000);
process.exit(1);
}
}
main()
.then(() => process.exit(process.exitCode))
.catch((error) => {
console.error(error);
process.exit(1);
});
//# sourceMappingURL=cli.js.map
;