hardhat-gas-reporter
Version:
Gas Analytics plugin for Hardhat
131 lines (111 loc) • 4.22 kB
text/typescript
import type { GasData } from "../gasData";
import { writeFileSync } from "fs";
import path from "path";
import { HardhatRuntimeEnvironment as HRE } from "hardhat/types";
import {
TABLE_NAME_LEGACY,
TABLE_NAME_MARKDOWN,
TABLE_NAME_TERMINAL,
CACHE_FILE_NAME
} from "../../constants";
import { getSolcInfo } from "../../utils/sources";
import { warnReportFormat } from "../../utils/ui";
import { GasReporterOptions } from "../../types";
import { generateTerminalTextTable } from "./terminal";
import { generateLegacyTextTable } from "./legacy";
import { generateMarkdownTable} from "./markdown";
import { generateJSONData, loadJSONCache } from "./json";
/**
* Table format selector
* @param {HardhatRuntimeEnvironment} hre
* @param {GasData} data
* @param {GasReporterOptions} options
* @param {string} toolchain
* @returns {string} table
*/
export function getTableForFormat(
hre: HRE,
data: GasData,
options: GasReporterOptions,
toolchain="hardhat"
): string {
switch (options.reportFormat) {
case TABLE_NAME_LEGACY: return generateLegacyTextTable(hre, data, options);
case TABLE_NAME_TERMINAL: return generateTerminalTextTable(hre, data, options, toolchain);
case TABLE_NAME_MARKDOWN: return generateMarkdownTable(hre, data, options, toolchain);
default: warnReportFormat(options.reportFormat); return "";
}
}
/**
* Manages table rendering and file saving
* @param {HardhatRuntimeEnvironment} hre
* @param {GasReporterOptions} options
* @param {string[]} warnings
* @param {string} toolchain
*/
export function render(
hre: HRE,
options: GasReporterOptions,
warnings: string[],
toolchain="hardhat"
) {
const data = hre.__hhgrec.collector!.data;
options.blockGasLimit = hre.__hhgrec.blockGasLimit;
options.solcInfo = getSolcInfo(hre.config.solidity.compilers[0]);
if (options.trackGasDeltas) {
options.cachePath = options.cachePath || path.resolve(
hre.config.paths.cache,
CACHE_FILE_NAME
);
try {
const previousData = loadJSONCache(options);
data.addDeltas(previousData.data!);
} catch {};
}
// Get table
let table = getTableForFormat(hre, data, options, toolchain);
// ---------------------------------------------------------------------------------------------
// RST / ReadTheDocs / Sphinx output
// ---------------------------------------------------------------------------------------------
let rstOutput = "";
if (options.rst) {
rstOutput += `${options.rstTitle!}\n`;
rstOutput += `${"=".repeat(options.rstTitle!.length)}\n\n`;
rstOutput += `.. code-block:: shell\n\n`;
}
table = rstOutput + table;
// ---------------------------------------------------------------------------------------------
// Print
// ---------------------------------------------------------------------------------------------
if (options.outputFile) {
writeFileSync(options.outputFile, table);
// Regenerate the table with full color if also logging to console
if (options.forceTerminalOutput){
const originalOutputFile = options.outputFile;
const originalNoColors = options.noColors;
const originalReportFormat = options.reportFormat;
options.outputFile = undefined;
options.noColors = false;
options.reportFormat = (options.forceTerminalOutputFormat)
? options.forceTerminalOutputFormat
: options.reportFormat;
table = getTableForFormat(hre, data, options);
console.log(table);
// Reset the options, since they might be read in JSON below here
options.outputFile = originalOutputFile;
options.noColors = originalNoColors;
options.reportFormat = originalReportFormat;
}
} else if (!options.suppressTerminalOutput) {
console.log(table);
}
if (options.outputJSON || process.env.CI) {
generateJSONData(data, options, toolchain);
}
if (options.trackGasDeltas) {
options.outputJSONFile = options.cachePath!;
generateJSONData(data, options, toolchain);
}
// Write warnings
for (const warning of warnings) console.log(warning);
}