UNPKG

nx

Version:

The core Nx plugin contains the core functionality of Nx like the project graph, nx commands and task orchestration.

179 lines (178 loc) • 7.97 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.printRunHelp = printRunHelp; exports.validateProject = validateProject; exports.runExecutor = runExecutor; exports.printTargetRunHelp = printTargetRunHelp; exports.run = run; const npm_run_path_1 = require("npm-run-path"); const params_1 = require("../../utils/params"); const handle_errors_1 = require("../../utils/handle-errors"); const print_help_1 = require("../../utils/print-help"); const path_1 = require("path"); const serialize_overrides_into_command_line_1 = require("../../utils/serialize-overrides-into-command-line"); const project_graph_1 = require("../../project-graph/project-graph"); const configuration_1 = require("../../config/configuration"); const async_iterator_1 = require("../../utils/async-iterator"); const executor_utils_1 = require("./executor-utils"); const pseudo_terminal_1 = require("../../tasks-runner/pseudo-terminal"); const child_process_1 = require("child_process"); function printRunHelp(opts, schema, plugin) { (0, print_help_1.printHelp)(`run ${opts.project}:${opts.target}`, schema, { mode: 'run', ...plugin, }); } function validateProject(projects, projectName) { const project = projects.projects[projectName]; if (!project) { throw new Error(`Could not find project "${projectName}"`); } } function isPromise(v) { return typeof v?.then === 'function'; } async function* promiseToIterator(v) { yield await v; } async function iteratorToProcessStatusCode(i) { const { success } = await (0, async_iterator_1.getLastValueFromAsyncIterableIterator)(i); return success ? 0 : 1; } async function parseExecutorAndTarget({ project, target }, root, projectsConfigurations) { const proj = projectsConfigurations.projects[project]; const targetConfig = proj.targets?.[target]; if (!targetConfig) { throw new Error(`Cannot find target '${target}' for project '${project}'`); } const [nodeModule, executor] = targetConfig.executor.split(':'); const { schema, implementationFactory } = (0, executor_utils_1.getExecutorInformation)(nodeModule, executor, root, projectsConfigurations.projects); return { executor, implementationFactory, nodeModule, schema, targetConfig }; } async function printTargetRunHelpInternal({ project, target }, root, projectsConfigurations) { const { executor, nodeModule, schema, targetConfig } = await parseExecutorAndTarget({ project, target }, root, projectsConfigurations); printRunHelp({ project, target }, schema, { plugin: nodeModule, entity: executor, }); if (nodeModule === 'nx' && executor === 'run-commands' && targetConfig.options.command) { const command = targetConfig.options.command.split(' ')[0]; const helpCommand = `${command} --help`; const localEnv = (0, npm_run_path_1.env)(); const env = { ...process.env, ...localEnv, }; if (pseudo_terminal_1.PseudoTerminal.isSupported()) { const terminal = (0, pseudo_terminal_1.getPseudoTerminal)(); await new Promise(() => { const cp = terminal.runCommand(helpCommand, { jsEnv: env }); cp.onExit((code) => { process.exit(code); }); }); } else { const cp = (0, child_process_1.exec)(helpCommand, { env, windowsHide: false, }); cp.on('exit', (code) => { process.exit(code); }); } } else { process.exit(0); } } async function runExecutorInternal({ project, target, configuration }, overrides, root, cwd, projectsConfigurations, nxJsonConfiguration, projectGraph, taskGraph, isVerbose) { validateProject(projectsConfigurations, project); const { executor, implementationFactory, nodeModule, schema, targetConfig } = await parseExecutorAndTarget({ project, target, configuration }, root, projectsConfigurations); configuration ??= targetConfig.defaultConfiguration; const combinedOptions = (0, params_1.combineOptionsForExecutor)(overrides, configuration, targetConfig, schema, project, (0, path_1.relative)(root, cwd), isVerbose); if ((0, executor_utils_1.getExecutorInformation)(nodeModule, executor, root, projectsConfigurations.projects).isNxExecutor) { const implementation = implementationFactory(); const r = implementation(combinedOptions, { root, target: targetConfig, projectsConfigurations, nxJsonConfiguration, projectName: project, targetName: target, configurationName: configuration, projectGraph, taskGraph, cwd, isVerbose, }); if (isPromise(r)) { return promiseToIterator(r); } else if ((0, async_iterator_1.isAsyncIterator)(r)) { return r; } else { throw new TypeError(`NX Executor "${targetConfig.executor}" should return either a Promise or an AsyncIterator`); } } else { require('../../adapter/compat'); const observable = await (await Promise.resolve().then(() => require('../../adapter/ngcli-adapter'))).scheduleTarget(root, { project, target, configuration, runOptions: combinedOptions, projects: projectsConfigurations.projects, }, isVerbose); const { eachValueFrom } = await Promise.resolve().then(() => require('../../adapter/rxjs-for-await')); return eachValueFrom(observable); } } /** * Loads and invokes executor. * * This is analogous to invoking executor from the terminal, with the exception * that the params aren't parsed from the string, but instead provided parsed already. * * Apart from that, it works the same way: * * - it will load the workspace configuration * - it will resolve the target * - it will load the executor and the schema * - it will load the options for the appropriate configuration * - it will run the validations and will set the default * - and, of course, it will invoke the executor * * Example: * * ```typescript * for await (const s of await runExecutor({project: 'myproj', target: 'serve'}, {watch: true}, context)) { * // s.success * } * ``` * * Note that the return value is a promise of an iterator, so you need to await before iterating over it. */ async function runExecutor(targetDescription, overrides, context) { return await runExecutorInternal(targetDescription, { ...overrides, __overrides_unparsed__: (0, serialize_overrides_into_command_line_1.serializeOverridesIntoCommandLine)(overrides), }, context.root, context.cwd, context.projectsConfigurations, context.nxJsonConfiguration, context.projectGraph, context.taskGraph, context.isVerbose); } function printTargetRunHelp(targetDescription, root) { const projectGraph = (0, project_graph_1.readCachedProjectGraph)(); return (0, handle_errors_1.handleErrors)(false, async () => { const projectsConfigurations = (0, project_graph_1.readProjectsConfigurationFromProjectGraph)(projectGraph); await printTargetRunHelpInternal(targetDescription, root, projectsConfigurations); }); } function run(cwd, root, targetDescription, overrides, isVerbose, taskGraph) { const projectGraph = (0, project_graph_1.readCachedProjectGraph)(); return (0, handle_errors_1.handleErrors)(isVerbose, async () => { const projectsConfigurations = (0, project_graph_1.readProjectsConfigurationFromProjectGraph)(projectGraph); return iteratorToProcessStatusCode(await runExecutorInternal(targetDescription, overrides, root, cwd, projectsConfigurations, (0, configuration_1.readNxJson)(), projectGraph, taskGraph, isVerbose)); }); }