UNPKG

@angular/cli

Version:
158 lines (155 loc) 6.05 kB
"use strict"; /** * @license * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.dev/license */ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const node_module_1 = __importDefault(require("node:module")); const node_path_1 = require("node:path"); const command_module_1 = require("../../command-builder/command-module"); const color_1 = require("../../utilities/color"); const command_config_1 = require("../command-config"); /** * Major versions of Node.js that are officially supported by Angular. */ const SUPPORTED_NODE_MAJORS = [18, 20, 22]; const PACKAGE_PATTERNS = [ /^@angular\/.*/, /^@angular-devkit\/.*/, /^@ngtools\/.*/, /^@schematics\/.*/, /^rxjs$/, /^typescript$/, /^ng-packagr$/, /^webpack$/, /^zone\.js$/, ]; class VersionCommandModule extends command_module_1.CommandModule { command = 'version'; aliases = command_config_1.RootCommands['version'].aliases; describe = 'Outputs Angular CLI version.'; longDescriptionPath; builder(localYargs) { return localYargs; } async run() { const { packageManager, logger, root } = this.context; const localRequire = node_module_1.default.createRequire((0, node_path_1.resolve)(__filename, '../../../')); // Trailing slash is used to allow the path to be treated as a directory const workspaceRequire = node_module_1.default.createRequire(root + '/'); const cliPackage = localRequire('./package.json'); let workspacePackage; try { workspacePackage = workspaceRequire('./package.json'); } catch { } const [nodeMajor] = process.versions.node.split('.').map((part) => Number(part)); const unsupportedNodeVersion = !SUPPORTED_NODE_MAJORS.includes(nodeMajor); const packageNames = new Set(Object.keys({ ...cliPackage.dependencies, ...cliPackage.devDependencies, ...workspacePackage?.dependencies, ...workspacePackage?.devDependencies, })); const versions = {}; for (const name of packageNames) { if (PACKAGE_PATTERNS.some((p) => p.test(name))) { versions[name] = this.getVersion(name, workspaceRequire, localRequire); } } const ngCliVersion = cliPackage.version; let angularCoreVersion = ''; const angularSameAsCore = []; if (workspacePackage) { // Filter all angular versions that are the same as core. angularCoreVersion = versions['@angular/core']; if (angularCoreVersion) { for (const [name, version] of Object.entries(versions)) { if (version === angularCoreVersion && name.startsWith('@angular/')) { angularSameAsCore.push(name.replace(/^@angular\//, '')); delete versions[name]; } } // Make sure we list them in alphabetical order. angularSameAsCore.sort(); } } const namePad = ' '.repeat(Object.keys(versions).sort((a, b) => b.length - a.length)[0].length + 3); const asciiArt = ` _ _ ____ _ ___ / \\ _ __ __ _ _ _| | __ _ _ __ / ___| | |_ _| / △ \\ | '_ \\ / _\` | | | | |/ _\` | '__| | | | | | | / ___ \\| | | | (_| | |_| | | (_| | | | |___| |___ | | /_/ \\_\\_| |_|\\__, |\\__,_|_|\\__,_|_| \\____|_____|___| |___/ ` .split('\n') .map((x) => color_1.colors.red(x)) .join('\n'); logger.info(asciiArt); logger.info(` Angular CLI: ${ngCliVersion} Node: ${process.versions.node}${unsupportedNodeVersion ? ' (Unsupported)' : ''} Package Manager: ${packageManager.name} ${packageManager.version ?? '<error>'} OS: ${process.platform} ${process.arch} Angular: ${angularCoreVersion} ... ${angularSameAsCore .reduce((acc, name) => { // Perform a simple word wrap around 60. if (acc.length == 0) { return [name]; } const line = acc[acc.length - 1] + ', ' + name; if (line.length > 60) { acc.push(name); } else { acc[acc.length - 1] = line; } return acc; }, []) .join('\n... ')} Package${namePad.slice(7)}Version -------${namePad.replace(/ /g, '-')}------------------ ${Object.keys(versions) .map((module) => `${module}${namePad.slice(module.length)}${versions[module]}`) .sort() .join('\n')} `.replace(/^ {6}/gm, '')); if (unsupportedNodeVersion) { logger.warn(`Warning: The current version of Node (${process.versions.node}) is not supported by Angular.`); } } getVersion(moduleName, workspaceRequire, localRequire) { let packageInfo; let cliOnly = false; // Try to find the package in the workspace try { packageInfo = workspaceRequire(`${moduleName}/package.json`); } catch { } // If not found, try to find within the CLI if (!packageInfo) { try { packageInfo = localRequire(`${moduleName}/package.json`); cliOnly = true; } catch { } } // If found, attempt to get the version if (packageInfo) { try { return packageInfo.version + (cliOnly ? ' (cli-only)' : ''); } catch { } } return '<error>'; } } exports.default = VersionCommandModule;