UNPKG

hardhat

Version:

Hardhat is an extensible developer tool that helps smart contract developers increase productivity by reliably bringing together the tools they want.

58 lines 2.99 kB
import path from "node:path"; import { HardhatError } from "@nomicfoundation/hardhat-errors"; import { readJsonFile } from "@nomicfoundation/hardhat-utils/fs"; import { findDependencyPackageJson, } from "@nomicfoundation/hardhat-utils/package"; /** * Validate that a plugin is installed and that its peer dependencies are * installed and satisfy the version constraints. * * @param basePathForNpmResolution the dir path for node module resolution * @param plugin the plugin to be validated * @param originalError the original error why we are running this function * @throws {HardhatError} with descriptor: * - {@link HardhatError.ERRORS.CORE.PLUGINS.PLUGIN_NOT_INSTALLED} if the plugin is * not installed as an npm package * - {@link HardhatError.ERRORS.CORE.PLUGINS.PLUGIN_MISSING_DEPENDENCY} if the * plugin's package peer dependency is not installed * - {@link HardhatError.ERRORS.CORE.PLUGINS.DEPENDENCY_VERSION_MISMATCH} if the * plugin's package peer dependency is installed but has the wrong version */ export async function detectPluginNpmDependencyProblems(basePathForNpmResolution, plugin, originalError) { if (plugin.npmPackage === null) { return; } const pluginPackageJsonPath = await findDependencyPackageJson(basePathForNpmResolution, // When npmPackage is undefined, we use the id as the package name instead plugin.npmPackage ?? plugin.id); if (pluginPackageJsonPath === undefined) { throw new HardhatError(HardhatError.ERRORS.CORE.PLUGINS.PLUGIN_NOT_INSTALLED, { pluginId: plugin.id, }, originalError); } const pluginPackageJson = await readJsonFile(pluginPackageJsonPath); if (pluginPackageJson.peerDependencies === undefined) { return; } const pluginPackagePath = path.dirname(pluginPackageJsonPath); for (const [dependencyName, versionSpec] of Object.entries(pluginPackageJson.peerDependencies)) { const dependencyPackageJsonPath = await findDependencyPackageJson(pluginPackagePath, dependencyName); if (dependencyPackageJsonPath === undefined) { throw new HardhatError(HardhatError.ERRORS.CORE.PLUGINS.PLUGIN_MISSING_DEPENDENCY, { pluginId: plugin.id, peerDependencyName: dependencyName, }, originalError); } const dependencyPackageJson = await readJsonFile(dependencyPackageJsonPath); const installedVersion = dependencyPackageJson.version; const { satisfies } = await import("semver"); if (!satisfies(installedVersion, versionSpec.replace("workspace:", ""))) { throw new HardhatError(HardhatError.ERRORS.CORE.PLUGINS.DEPENDENCY_VERSION_MISMATCH, { pluginId: plugin.id, peerDependencyName: dependencyName, installedVersion, expectedVersion: versionSpec, }, originalError); } } } //# sourceMappingURL=detect-plugin-npm-dependency-problems.js.map