UNPKG

@nx/devkit

Version:

The Nx Devkit is used to customize Nx for different technologies and use cases. It contains many utility functions for reading and writing files, updating configuration, working with Abstract Syntax Trees(ASTs), and more. Learn more about [extending Nx by

72 lines (71 loc) 3.43 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.throwForUnsupportedVersion = throwForUnsupportedVersion; exports.assertSupportedPackageVersion = assertSupportedPackageVersion; exports.assertSupportedInstalledPackageVersion = assertSupportedInstalledPackageVersion; const semver_1 = require("semver"); const installed_version_1 = require("./installed-version"); const package_json_1 = require("./package-json"); /** * Throws a standardized error when a package is installed at a version below * a plugin's supported floor. * * Use this at every site where a plugin determines the installed version of * a supported package is below its declared floor, so the message is * consistent across plugins. * * @param packageName Name of the package (e.g. `@angular/core`). * @param installedVersion Version detected in the workspace (e.g. `18.2.0`). * @param floor Lowest version the plugin supports (e.g. `19.0.0`). */ function throwForUnsupportedVersion(packageName, installedVersion, floor) { throw new Error(`Unsupported version of \`${packageName}\` detected.\n\n` + ` Installed: ${installedVersion}\n` + ` Supported: >= ${floor}\n\n` + `Update \`${packageName}\` to ${floor} or higher.`); } /** * Asserts that a package detected in the workspace is at or above the * plugin's supported floor. No-op when the package is not detected * (fresh-install path) or when declared as `latest`/`next`. Throws via * `throwForUnsupportedVersion` (with the original declared range for * clarity) when below floor. * * Use from generator entry points to fail fast on unsupported workspaces * before writing any incompatible config. */ function assertSupportedPackageVersion(tree, packageName, minSupportedVersion) { const declared = (0, package_json_1.getDependencyVersionFromPackageJson)(tree, packageName); if (!declared || (0, installed_version_1.isNonSemverDistTag)(declared)) { return; } const cleaned = (0, installed_version_1.normalizeSemver)(declared); if (cleaned && (0, semver_1.lt)(cleaned, minSupportedVersion)) { throwForUnsupportedVersion(packageName, declared, minSupportedVersion); } } /** * Asserts that a package installed in the workspace is at or above the * plugin's supported floor. No-op when the package is not resolvable from * `node_modules` (peer not yet satisfied, fresh-install path). Throws via * `throwForUnsupportedVersion` when below floor. * * Use from executor / runtime / preset / library entry points where * node_modules is present and no `Tree` is available. Generator code should * use `assertSupportedPackageVersion` instead, which reads the declared * range from a tree. */ function assertSupportedInstalledPackageVersion(packageName, minSupportedVersion) { const installed = (0, installed_version_1.getInstalledPackageVersion)(packageName); if (!installed) { return; } // Coerce strips any prerelease tag (e.g. `19.0.0-rc.1` → `19.0.0`) so a // prerelease of the supported major isn't wrongly flagged as below floor // by semver's spec-mandated `lt(prerelease, release) === true` ordering. const normalized = (0, semver_1.coerce)(installed)?.version; if (!normalized || !(0, semver_1.lt)(normalized, minSupportedVersion)) { return; } throwForUnsupportedVersion(packageName, installed, minSupportedVersion); }