UNPKG

eslint-plugin-depend

Version:

An ESLint plugin to suggest optimized dependencies, native alternatives and more

56 lines (55 loc) 1.86 kB
import { findPackageSync } from 'fd-package-json'; import semverSatisfies from 'semver/functions/satisfies.js'; import semverLessThan from 'semver/ranges/ltr.js'; /** * Gets the node engine constraint from `package.json` if possible * @param {Record} packageJson Package to process * @return {string | null} */ export function getNodeConstraint(packageJson) { const engines = packageJson.engines; if (typeof engines !== 'object' || engines === null || !('node' in engines)) { return null; } const nodeVersion = engines.node; if (typeof nodeVersion !== 'string') { return null; } return nodeVersion; } const packageCache = new WeakMap(); /** * Gets the closest `package.json` for a context * @param {Rule.RuleContext} context ESLint context * @return {Record | null} */ export function getClosestPackage(context) { const cachedPackageJson = packageCache.get(context); if (cachedPackageJson !== undefined) { return cachedPackageJson; } const packageJson = findPackageSync(context.cwd); packageCache.set(context, packageJson); return packageJson; } /** * Tests whether the closest `package.json` satisfies the specified * node version. * This will be true if the package's `engines` field has a version range * which this version satisfies, or no field at all. * @param {Rule.RuleContext} context ESLint context * @param {string} version Version to test * @return {boolean} */ export function closestPackageSatisfiesNodeVersion(context, version) { const packageJson = getClosestPackage(context); if (!packageJson) { return true; } const nodeConstraint = getNodeConstraint(packageJson); if (!nodeConstraint) { return true; } return (semverLessThan(version, nodeConstraint) || semverSatisfies(version, nodeConstraint)); }