UNPKG

nx

Version:

Smart, Fast and Extensible Build System

228 lines • 10.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getRunner = exports.runCommand = void 0; const tslib_1 = require("tslib"); const path_1 = require("path"); const workspace_root_1 = require("../utils/workspace-root"); const fileutils_1 = require("../utils/fileutils"); const output_1 = require("../utils/output"); const utils_1 = require("./utils"); const life_cycle_1 = require("./life-cycle"); const static_run_many_terminal_output_life_cycle_1 = require("./life-cycles/static-run-many-terminal-output-life-cycle"); const static_run_one_terminal_output_life_cycle_1 = require("./life-cycles/static-run-one-terminal-output-life-cycle"); const task_timings_life_cycle_1 = require("./life-cycles/task-timings-life-cycle"); const dynamic_run_many_terminal_output_life_cycle_1 = require("./life-cycles/dynamic-run-many-terminal-output-life-cycle"); const task_profiling_life_cycle_1 = require("./life-cycles/task-profiling-life-cycle"); const is_ci_1 = require("../utils/is-ci"); const dynamic_run_one_terminal_output_life_cycle_1 = require("./life-cycles/dynamic-run-one-terminal-output-life-cycle"); const create_task_graph_1 = require("./create-task-graph"); const task_graph_utils_1 = require("./task-graph-utils"); const params_1 = require("../utils/params"); const workspaces_1 = require("nx/src/config/workspaces"); const hasher_1 = require("nx/src/hasher/hasher"); const hash_task_1 = require("nx/src/hasher/hash-task"); function getTerminalOutputLifeCycle(initiatingProject, projectNames, tasks, nxArgs, overrides, runnerOptions) { return tslib_1.__awaiter(this, void 0, void 0, function* () { const isRunOne = initiatingProject != null; const useDynamicOutput = shouldUseDynamicLifeCycle(tasks, runnerOptions, nxArgs.outputStyle) && process.env.NX_VERBOSE_LOGGING !== 'true' && process.env.NX_TASKS_RUNNER_DYNAMIC_OUTPUT !== 'false'; const overridesWithoutHidden = Object.assign({}, overrides); delete overridesWithoutHidden['__overrides_unparsed__']; if (isRunOne) { if (useDynamicOutput) { return yield (0, dynamic_run_one_terminal_output_life_cycle_1.createRunOneDynamicOutputRenderer)({ initiatingProject, tasks, args: nxArgs, overrides: overridesWithoutHidden, }); } return { lifeCycle: new static_run_one_terminal_output_life_cycle_1.StaticRunOneTerminalOutputLifeCycle(initiatingProject, projectNames, tasks, nxArgs), renderIsDone: Promise.resolve(), }; } else { if (useDynamicOutput) { return yield (0, dynamic_run_many_terminal_output_life_cycle_1.createRunManyDynamicOutputRenderer)({ projectNames, tasks, args: nxArgs, overrides: overridesWithoutHidden, }); } else { return { lifeCycle: new static_run_many_terminal_output_life_cycle_1.StaticRunManyTerminalOutputLifeCycle(projectNames, tasks, nxArgs, overridesWithoutHidden), renderIsDone: Promise.resolve(), }; } } }); } function hashTasksThatDontDependOnOtherTasks(workspaces, hasher, projectGraph, taskGraph) { return tslib_1.__awaiter(this, void 0, void 0, function* () { const res = []; for (let t of Object.values(taskGraph.tasks)) { if (!(0, hash_task_1.hashDependsOnOtherTasks)(workspaces, hasher, projectGraph, taskGraph, t)) { res.push((0, hash_task_1.hashTask)(workspaces, hasher, projectGraph, taskGraph, t)); } } return Promise.all(res); }); } function runCommand(projectsToRun, projectGraph, { nxJson }, nxArgs, overrides, initiatingProject, extraTargetDependencies) { return tslib_1.__awaiter(this, void 0, void 0, function* () { const status = yield (0, params_1.handleErrors)(overrides['verbose'] === true, () => tslib_1.__awaiter(this, void 0, void 0, function* () { const { tasksRunner, runnerOptions } = getRunner(nxArgs, nxJson); const defaultDependencyConfigs = mergeTargetDependencies(nxJson.targetDefaults, extraTargetDependencies); const projectNames = projectsToRun.map((t) => t.name); const taskGraph = (0, create_task_graph_1.createTaskGraph)(projectGraph, defaultDependencyConfigs, projectNames, [nxArgs.target], nxArgs.configuration, overrides); const hasher = new hasher_1.Hasher(projectGraph, nxJson, runnerOptions); yield hashTasksThatDontDependOnOtherTasks(new workspaces_1.Workspaces(workspace_root_1.workspaceRoot), hasher, projectGraph, taskGraph); const cycle = (0, task_graph_utils_1.findCycle)(taskGraph); if (cycle) { if (nxArgs.nxIgnoreCycles) { output_1.output.warn({ title: `The task graph has a circular dependency`, bodyLines: [`${cycle.join(' --> ')}`], }); (0, task_graph_utils_1.makeAcyclic)(taskGraph); } else { output_1.output.error({ title: `Could not execute command because the task graph has a circular dependency`, bodyLines: [`${cycle.join(' --> ')}`], }); process.exit(1); } } const tasks = Object.values(taskGraph.tasks); if (nxArgs.outputStyle == 'stream') { process.env.NX_STREAM_OUTPUT = 'true'; process.env.NX_PREFIX_OUTPUT = 'true'; } if (nxArgs.outputStyle == 'stream-without-prefixes') { process.env.NX_STREAM_OUTPUT = 'true'; } const { lifeCycle, renderIsDone } = yield getTerminalOutputLifeCycle(initiatingProject, projectNames, tasks, nxArgs, overrides, runnerOptions); const lifeCycles = [lifeCycle]; if (process.env.NX_PERF_LOGGING) { lifeCycles.push(new task_timings_life_cycle_1.TaskTimingsLifeCycle()); } if (process.env.NX_PROFILE) { lifeCycles.push(new task_profiling_life_cycle_1.TaskProfilingLifeCycle(process.env.NX_PROFILE)); } const promiseOrObservable = tasksRunner(tasks, Object.assign(Object.assign({}, runnerOptions), { lifeCycle: new life_cycle_1.CompositeLifeCycle(lifeCycles) }), { initiatingProject: nxArgs.outputStyle === 'compact' ? null : initiatingProject, target: nxArgs.target, projectGraph, nxJson, nxArgs, taskGraph, hasher, }); let anyFailures; if (promiseOrObservable.subscribe) { anyFailures = yield anyFailuresInObservable(promiseOrObservable); } else { // simply await the promise anyFailures = yield anyFailuresInPromise(promiseOrObservable); } yield renderIsDone; return anyFailures ? 1 : 0; })); // fix for https://github.com/nrwl/nx/issues/1666 if (process.stdin['unref']) process.stdin.unref(); process.exit(status); }); } exports.runCommand = runCommand; function mergeTargetDependencies(defaults, deps) { const res = {}; Object.keys(defaults).forEach((k) => { res[k] = defaults[k].dependsOn; }); if (deps) { Object.keys(deps).forEach((k) => { if (res[k]) { res[k] = [...res[k], deps[k]]; } else { res[k] = deps[k]; } }); return res; } } function anyFailuresInPromise(promise) { return tslib_1.__awaiter(this, void 0, void 0, function* () { return Object.values(yield promise).some((v) => v === 'failure' || v === 'skipped'); }); } function anyFailuresInObservable(obs) { return tslib_1.__awaiter(this, void 0, void 0, function* () { return yield new Promise((res) => { let anyFailures = false; obs.subscribe((t) => { if (!t.success) { anyFailures = true; } }, (error) => { output_1.output.error({ title: 'Unhandled error in task executor', }); console.error(error); res(true); }, () => { res(anyFailures); }); }); }); } function shouldUseDynamicLifeCycle(tasks, options, outputStyle) { if (!process.stdout.isTTY) return false; if ((0, is_ci_1.isCI)()) return false; if (outputStyle === 'static' || outputStyle === 'stream') return false; const noForwarding = !tasks.find((t) => (0, utils_1.shouldStreamOutput)(t, null, options)); return noForwarding; } function getRunner(nxArgs, nxJson) { let runner = nxArgs.runner; runner = runner || 'default'; if (!nxJson.tasksRunnerOptions) { throw new Error(`Could not find any runner configurations in nx.json`); } if (nxJson.tasksRunnerOptions[runner]) { let modulePath = nxJson.tasksRunnerOptions[runner].runner; let tasksRunner; if (modulePath) { if ((0, fileutils_1.isRelativePath)(modulePath)) { modulePath = (0, path_1.join)(workspace_root_1.workspaceRoot, modulePath); } tasksRunner = require(modulePath); // to support both babel and ts formats if (tasksRunner.default) { tasksRunner = tasksRunner.default; } } else { tasksRunner = require('./default-tasks-runner').defaultTasksRunner; } return { tasksRunner, runnerOptions: Object.assign(Object.assign({}, nxJson.tasksRunnerOptions[runner].options), nxArgs), }; } else { throw new Error(`Could not find runner configuration for ${runner}`); } } exports.getRunner = getRunner; //# sourceMappingURL=run-command.js.map