import { HardhatUserConfig } from "hardhat/config"; import { HardhatConfig, SuperAuditConfig } from "hardhat/types/config"; import { HardhatUserConfigValidationError } from "hardhat/types/hooks"; /** * This function validates the parts of the HardhatUserConfig that are relevant * to the plugin. * * This function is called from the `validateUserConfig` Hook Handler. * * @param userConfig The HardhatUserConfig, as exported in the config file. * @returns An array of validation errors, or an empty array if valid. */ export async function validatePluginConfig( userConfig: HardhatUserConfig, ): Promise { const errors: HardhatUserConfigValidationError[] = []; if (userConfig.superaudit) { const config = userConfig.superaudit; // Validate mode if (config.mode && !["basic", "advanced", "full"].includes(config.mode)) { errors.push({ path: ["superaudit", "mode"], message: `Invalid mode: ${config.mode}. Must be one of: basic, advanced, full`, }); } // Validate format if ( config.format && !["console", "json", "sarif"].includes(config.format) ) { errors.push({ path: ["superaudit", "format"], message: `Invalid format: ${config.format}. Must be one of: console, json, sarif`, }); } // Validate AI provider if ( config.ai?.provider && !["openai", "anthropic", "local"].includes(config.ai.provider) ) { errors.push({ path: ["superaudit", "ai", "provider"], message: `Invalid AI provider: ${config.ai.provider}. Must be one of: openai, anthropic, local`, }); } } return errors; } /** * Resolves the plugin config, based on an already validated HardhatUserConfig * and a partially resolved HardhatConfig. * * This function is called from the `resolveUserConfig` Hook Handler. * * @param userConfig The HardhatUserConfig. * @param partiallyResolvedConfig The partially resolved HardhatConfig, which is * generated by calling `next` in the `resolveUserConfig` Hook Handler. * @returns The resolved HardhatConfig. */ export async function resolvePluginConfig( userConfig: HardhatUserConfig, partiallyResolvedConfig: HardhatConfig, ): Promise { const userSuperauditConfig = userConfig.superaudit || {}; // Resolve SuperAudit configuration with defaults const resolvedSuperauditConfig: SuperAuditConfig = { mode: userSuperauditConfig.mode || "full", playbook: userSuperauditConfig.playbook, rules: userSuperauditConfig.rules, format: userSuperauditConfig.format || "console", output: userSuperauditConfig.output, ai: userSuperauditConfig.ai ? { enabled: userSuperauditConfig.ai.enabled !== false, // default true if ai config exists provider: userSuperauditConfig.ai.provider || "openai", model: userSuperauditConfig.ai.model, temperature: userSuperauditConfig.ai.temperature, maxTokens: userSuperauditConfig.ai.maxTokens, } : undefined, }; return { ...partiallyResolvedConfig, superaudit: resolvedSuperauditConfig, }; }