UNPKG

hardhat

Version:

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

102 lines (86 loc) 3.45 kB
import type { UnsafeHardhatRuntimeEnvironmentOptions } from "./core/types.js"; import type { HardhatUserConfig } from "../types/config.js"; import type { GlobalOptions } from "../types/global-options.js"; import type { HardhatRuntimeEnvironment } from "../types/hre.js"; import { BUILTIN_GLOBAL_OPTIONS_DEFINITIONS } from "./builtin-global-options.js"; import { builtinPlugins } from "./builtin-plugins/index.js"; import { importUserConfig, resolveHardhatConfigPath, } from "./config-loading.js"; import { buildGlobalOptionDefinitions } from "./core/global-options.js"; import { resolveProjectRoot, HardhatRuntimeEnvironmentImplementation, } from "./core/hre.js"; import { resolvePluginList } from "./core/plugins/resolve-plugin-list.js"; import { getGlobalHardhatRuntimeEnvironment, setGlobalHardhatRuntimeEnvironment, } from "./global-hre-instance.js"; /** * Creates an instance of the Hardhat Runtime Environment. * * @param config - The user's Hardhat configuration. Note that the config * doesn't have to come from a file, but if it does, you should provide its * path as the `config` property in the `userProvidedGlobalOptions` object. * @param userProvidedGlobalOptions - The global options provided by the * user. * @param projectRoot - The root of the Hardhat project. Hardhat expects this * to be the root of the npm project containing your config file. If none is * provided, it will use the root of the npm project that contains the CWD. * @returns The Hardhat Runtime Environment. */ export async function createHardhatRuntimeEnvironment( config: HardhatUserConfig, userProvidedGlobalOptions: Partial<GlobalOptions> = {}, projectRoot?: string, unsafeOptions: UnsafeHardhatRuntimeEnvironmentOptions = {}, ): Promise<HardhatRuntimeEnvironment> { const resolvedProjectRoot = await resolveProjectRoot(projectRoot); if (unsafeOptions.resolvedPlugins === undefined) { const plugins = [...builtinPlugins, ...(config.plugins ?? [])]; const resolvedPlugins = await resolvePluginList( resolvedProjectRoot, plugins, ); unsafeOptions.resolvedPlugins = resolvedPlugins; } if (unsafeOptions.globalOptionDefinitions === undefined) { const pluginGlobalOptionDefinitions = buildGlobalOptionDefinitions( unsafeOptions.resolvedPlugins, ); const globalOptionDefinitions = new Map([ ...BUILTIN_GLOBAL_OPTIONS_DEFINITIONS, ...pluginGlobalOptionDefinitions, ]); unsafeOptions.globalOptionDefinitions = globalOptionDefinitions; } return HardhatRuntimeEnvironmentImplementation.create( config, userProvidedGlobalOptions, resolvedProjectRoot, unsafeOptions, ); } /** * Gets the global Hardhat Runtime Environment, or creates it if it doesn't exist. * * This function is meant to be used when `hardhat` is imported as a library. */ export async function getOrCreateGlobalHardhatRuntimeEnvironment(): Promise<HardhatRuntimeEnvironment> { let globalHre = getGlobalHardhatRuntimeEnvironment(); if (globalHre !== undefined) { return globalHre; } const configPath = await resolveHardhatConfigPath(); const projectRoot = await resolveProjectRoot(configPath); const userConfig = await importUserConfig(configPath); globalHre = await createHardhatRuntimeEnvironment( userConfig, { config: configPath }, projectRoot, ); setGlobalHardhatRuntimeEnvironment(globalHre); return globalHre; }