UNPKG

nx

Version:

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

181 lines (180 loc) • 7.39 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.runPackageManagerInstallPlugins = runPackageManagerInstallPlugins; exports.installPlugin = installPlugin; exports.installPlugins = installPlugins; exports.configurePlugins = configurePlugins; exports.getFailedToInstallPluginErrorMessages = getFailedToInstallPluginErrorMessages; const createSpinner = require("ora"); const chalk_1 = require("chalk"); const child_process_1 = require("child_process"); const package_manager_1 = require("../../utils/package-manager"); const output_1 = require("../../utils/output"); const workspace_root_1 = require("../../utils/workspace-root"); const utils_1 = require("./implementation/utils"); const plugins_1 = require("../../utils/plugins"); const angular_json_1 = require("../../adapter/angular-json"); const error_types_1 = require("../../project-graph/error-types"); function runPackageManagerInstallPlugins(repoRoot, pmc = (0, package_manager_1.getPackageManagerCommand)(), plugins) { if (plugins.length === 0) { return; } (0, utils_1.addDepsToPackageJson)(repoRoot, plugins); (0, utils_1.runInstall)(repoRoot, pmc); } /** * Installs a plugin by running its init generator. It will change the file system tree passed in. * @param plugin The name of the plugin to install * @param repoRoot repo root * @param pmc package manager commands * @param updatePackageScripts whether to update package scripts * @param verbose whether to run in verbose mode * @returns void */ async function installPlugin(plugin, repoRoot = workspace_root_1.workspaceRoot, updatePackageScripts = false, verbose = false, pmc = (0, package_manager_1.getPackageManagerCommand)()) { const capabilities = await (0, plugins_1.getPluginCapabilities)(repoRoot, plugin, {}); const generators = capabilities?.generators; if (!generators) { throw new Error(`No generators found in ${plugin}.`); } const initGenerator = findInitGenerator(generators); if (!initGenerator) { output_1.output.log({ title: `No "init" generator found in ${plugin}. Skipping initialization.`, }); return; } (0, child_process_1.execSync)(`${pmc.exec} nx g ${plugin}:init --keepExistingVersions ${updatePackageScripts ? '--updatePackageScripts' : ''} ${verbose ? '--verbose' : ''}`, { stdio: [0, 1, 2], cwd: repoRoot, windowsHide: false, }); } /** * Install plugins * Get the implementation of the plugin's init generator and run it * @returns a list of succeeded plugins and a map of failed plugins to errors */ async function installPlugins(plugins, updatePackageScripts, pmc, repoRoot = workspace_root_1.workspaceRoot, verbose = false) { if (plugins.length === 0) { return { succeededPlugins: [], failedPlugins: {}, }; } const spinner = createSpinner(); let succeededPlugins = []; const failedPlugins = {}; for (const plugin of plugins) { try { spinner.start('Installing plugin ' + plugin); await installPlugin(plugin, repoRoot, updatePackageScripts, verbose, pmc); succeededPlugins.push(plugin); spinner.succeed('Installed plugin ' + plugin); } catch (e) { failedPlugins[plugin] = e; spinner.fail('Failed to install plugin ' + plugin); } } return { succeededPlugins, failedPlugins, }; } /** * Configures plugins, installs them, and outputs the results * @returns a list of succeeded plugins and a map of failed plugins to errors */ async function configurePlugins(plugins, updatePackageScripts, pmc, repoRoot = workspace_root_1.workspaceRoot, verbose = false) { if (plugins.length === 0) { return { succeededPlugins: [], failedPlugins: {}, }; } output_1.output.log({ title: '🔨 Configuring plugins' }); let { succeededPlugins, failedPlugins } = await installPlugins(plugins, updatePackageScripts, pmc, repoRoot, verbose); if (succeededPlugins.length > 0) { output_1.output.success({ title: 'Installed Plugins', bodyLines: succeededPlugins.map((p) => `- ${(0, chalk_1.bold)(p)}`), }); } if (Object.keys(failedPlugins).length > 0) { output_1.output.error({ title: `Failed to install plugins`, bodyLines: [ 'The following plugins were not installed:', ...Object.keys(failedPlugins).map((p) => `- ${(0, chalk_1.bold)(p)}`), ], }); Object.entries(failedPlugins).forEach(([plugin, error]) => { output_1.output.error({ title: `Failed to install ${plugin}`, bodyLines: getFailedToInstallPluginErrorMessages(error), }); }); output_1.output.error({ title: `To install the plugins manually`, bodyLines: [ 'You may need to run commands to install the plugins:', ...Object.keys(failedPlugins).map((p) => `- ${(0, chalk_1.bold)(pmc.exec + ' nx add ' + p)}`), ], }); } return { succeededPlugins, failedPlugins }; } function findInitGenerator(generators) { if (generators['init']) { return 'init'; } const angularPluginInstalled = (0, angular_json_1.isAngularPluginInstalled)(); if (angularPluginInstalled && generators['ng-add']) { return 'ng-add'; } return Object.keys(generators).find((name) => generators[name].aliases?.includes('init') || (angularPluginInstalled && generators[name].aliases?.includes('ng-add'))); } function getFailedToInstallPluginErrorMessages(e) { const errorBodyLines = []; if ((0, error_types_1.isProjectConfigurationsError)(e) && e.errors.length > 0) { for (const error of e.errors) { if ((0, error_types_1.isAggregateCreateNodesError)(error)) { const innerErrors = error.errors; for (const [file, e] of innerErrors) { if (file) { errorBodyLines.push(` - ${(0, chalk_1.bold)(file)}: ${e.message}`); } else { errorBodyLines.push(` - ${e.message}`); } if (e.stack) { const innerStackTrace = ' ' + e.stack.split('\n')?.join('\n '); errorBodyLines.push(innerStackTrace); } } } else if (!(0, error_types_1.isProjectsWithNoNameError)(error)) { // swallow ProjectsWithNameError if (error.message) { errorBodyLines.push(` - ${error.message}`); } if (error.stack) { const innerStackTrace = ' ' + error.stack.split('\n')?.join('\n '); errorBodyLines.push(innerStackTrace); } } } } else { if (e.message) { errorBodyLines.push(` - ${e.message}`); } if (e.stack) { const innerStackTrace = ' ' + e.stack.split('\n')?.join('\n '); errorBodyLines.push(innerStackTrace); } } return errorBodyLines; }