@diamondslab/diamonds-hardhat-foundry 2.2.3 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +76 -1
- package/dist/framework/ForgeCoverageFramework.d.ts +70 -0
- package/dist/framework/ForgeCoverageFramework.d.ts.map +1 -0
- package/dist/framework/ForgeCoverageFramework.js +306 -0
- package/dist/framework/ForgeCoverageFramework.js.map +1 -0
- package/dist/framework/ForgeCoverageFramework.old.d.ts +61 -0
- package/dist/framework/ForgeCoverageFramework.old.d.ts.map +1 -0
- package/dist/framework/ForgeCoverageFramework.old.js +238 -0
- package/dist/framework/ForgeCoverageFramework.old.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/tasks/coverage.d.ts +2 -0
- package/dist/tasks/coverage.d.ts.map +1 -0
- package/dist/tasks/coverage.js +154 -0
- package/dist/tasks/coverage.js.map +1 -0
- package/dist/tasks/coverage.old.d.ts +2 -0
- package/dist/tasks/coverage.old.d.ts.map +1 -0
- package/dist/tasks/coverage.old.js +173 -0
- package/dist/tasks/coverage.old.js.map +1 -0
- package/dist/types/config.d.ts +91 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js.map +1 -1
- package/package.json +3 -3
- package/src/framework/ForgeCoverageFramework.ts +390 -0
- package/src/index.ts +7 -6
- package/src/tasks/coverage.ts +258 -0
- package/src/types/config.ts +107 -0
- package/CHANGELOG.md +0 -321
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ForgeCoverageFramework = void 0;
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
|
+
const logger_1 = require("../utils/logger");
|
|
6
|
+
/**
|
|
7
|
+
* ForgeCoverageFramework - Orchestrates forge coverage execution for Diamond contracts
|
|
8
|
+
*
|
|
9
|
+
* Responsibilities:
|
|
10
|
+
* 1. Build forge coverage command with all options
|
|
11
|
+
* 2. Execute forge coverage with proper fork URL
|
|
12
|
+
* 3. Stream output to terminal
|
|
13
|
+
* 4. Handle errors appropriately
|
|
14
|
+
*/
|
|
15
|
+
class ForgeCoverageFramework {
|
|
16
|
+
hre;
|
|
17
|
+
constructor(hre) {
|
|
18
|
+
this.hre = hre;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Run forge coverage with provided options
|
|
22
|
+
*
|
|
23
|
+
* @param options - Coverage execution options
|
|
24
|
+
* @returns Promise<boolean> - true if coverage succeeds, false otherwise
|
|
25
|
+
*/
|
|
26
|
+
async runCoverage(options = {}) {
|
|
27
|
+
logger_1.Logger.section("Forge Coverage - Execution");
|
|
28
|
+
try {
|
|
29
|
+
// Build command arguments
|
|
30
|
+
const args = this.buildCoverageCommand(options);
|
|
31
|
+
logger_1.Logger.info(`Executing: forge coverage ${args.join(" ")}`);
|
|
32
|
+
logger_1.Logger.info("⏳ Running coverage analysis (this may take a while)...\n");
|
|
33
|
+
// Execute forge coverage
|
|
34
|
+
const success = await this.executeForge(args);
|
|
35
|
+
if (success) {
|
|
36
|
+
logger_1.Logger.success("✅ Coverage analysis completed successfully");
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
logger_1.Logger.error("❌ Coverage analysis failed");
|
|
40
|
+
}
|
|
41
|
+
return success;
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
logger_1.Logger.error(`Coverage execution error: ${error.message}`);
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Build complete forge coverage command arguments
|
|
50
|
+
*
|
|
51
|
+
* @param options - Coverage options
|
|
52
|
+
* @returns Array of command arguments
|
|
53
|
+
*/
|
|
54
|
+
buildCoverageCommand(options) {
|
|
55
|
+
const args = [];
|
|
56
|
+
// Add fork URL if provided
|
|
57
|
+
if (options.forkUrl) {
|
|
58
|
+
args.push("--fork-url", options.forkUrl);
|
|
59
|
+
}
|
|
60
|
+
// Add all option groups
|
|
61
|
+
args.push(...this.buildReportOptions(options));
|
|
62
|
+
args.push(...this.buildFilterOptions(options));
|
|
63
|
+
args.push(...this.buildDisplayOptions(options));
|
|
64
|
+
args.push(...this.buildTestOptions(options));
|
|
65
|
+
args.push(...this.buildEvmOptions(options));
|
|
66
|
+
args.push(...this.buildBuildOptions(options));
|
|
67
|
+
return args.filter((arg) => arg !== "");
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Build report-related options
|
|
71
|
+
*/
|
|
72
|
+
buildReportOptions(options) {
|
|
73
|
+
const args = [];
|
|
74
|
+
// Multiple --report flags
|
|
75
|
+
if (options.report && options.report.length > 0) {
|
|
76
|
+
options.report.forEach((reportType) => {
|
|
77
|
+
args.push("--report", reportType);
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
if (options.reportFile) {
|
|
81
|
+
args.push("--report-file", options.reportFile);
|
|
82
|
+
}
|
|
83
|
+
if (options.lcovVersion) {
|
|
84
|
+
args.push("--lcov-version", options.lcovVersion);
|
|
85
|
+
}
|
|
86
|
+
if (options.includeLibs) {
|
|
87
|
+
args.push("--include-libs");
|
|
88
|
+
}
|
|
89
|
+
if (options.excludeTests) {
|
|
90
|
+
args.push("--exclude-tests");
|
|
91
|
+
}
|
|
92
|
+
if (options.irMinimum) {
|
|
93
|
+
args.push("--ir-minimum");
|
|
94
|
+
}
|
|
95
|
+
return args;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Build test filtering options
|
|
99
|
+
*/
|
|
100
|
+
buildFilterOptions(options) {
|
|
101
|
+
const args = [];
|
|
102
|
+
if (options.matchTest) {
|
|
103
|
+
args.push("--match-test", options.matchTest);
|
|
104
|
+
}
|
|
105
|
+
if (options.noMatchTest) {
|
|
106
|
+
args.push("--no-match-test", options.noMatchTest);
|
|
107
|
+
}
|
|
108
|
+
if (options.matchContract) {
|
|
109
|
+
args.push("--match-contract", options.matchContract);
|
|
110
|
+
}
|
|
111
|
+
if (options.noMatchContract) {
|
|
112
|
+
args.push("--no-match-contract", options.noMatchContract);
|
|
113
|
+
}
|
|
114
|
+
if (options.matchPath) {
|
|
115
|
+
args.push("--match-path", options.matchPath);
|
|
116
|
+
}
|
|
117
|
+
if (options.noMatchPath) {
|
|
118
|
+
args.push("--no-match-path", options.noMatchPath);
|
|
119
|
+
}
|
|
120
|
+
if (options.noMatchCoverage) {
|
|
121
|
+
args.push("--no-match-coverage", options.noMatchCoverage);
|
|
122
|
+
}
|
|
123
|
+
return args;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Build display options
|
|
127
|
+
*/
|
|
128
|
+
buildDisplayOptions(options) {
|
|
129
|
+
const args = [];
|
|
130
|
+
// Verbosity (-v, -vv, -vvv, etc.)
|
|
131
|
+
if (options.verbosity && options.verbosity > 0) {
|
|
132
|
+
args.push("-" + "v".repeat(options.verbosity));
|
|
133
|
+
}
|
|
134
|
+
if (options.quiet) {
|
|
135
|
+
args.push("--quiet");
|
|
136
|
+
}
|
|
137
|
+
if (options.json) {
|
|
138
|
+
args.push("--json");
|
|
139
|
+
}
|
|
140
|
+
if (options.md) {
|
|
141
|
+
args.push("--md");
|
|
142
|
+
}
|
|
143
|
+
if (options.color) {
|
|
144
|
+
args.push("--color", options.color);
|
|
145
|
+
}
|
|
146
|
+
return args;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Build test execution options
|
|
150
|
+
*/
|
|
151
|
+
buildTestOptions(options) {
|
|
152
|
+
const args = [];
|
|
153
|
+
if (options.threads !== undefined) {
|
|
154
|
+
args.push("--threads", options.threads.toString());
|
|
155
|
+
}
|
|
156
|
+
if (options.fuzzRuns !== undefined) {
|
|
157
|
+
args.push("--fuzz-runs", options.fuzzRuns.toString());
|
|
158
|
+
}
|
|
159
|
+
if (options.fuzzSeed) {
|
|
160
|
+
args.push("--fuzz-seed", options.fuzzSeed);
|
|
161
|
+
}
|
|
162
|
+
if (options.failFast) {
|
|
163
|
+
args.push("--fail-fast");
|
|
164
|
+
}
|
|
165
|
+
if (options.allowFailure) {
|
|
166
|
+
args.push("--allow-failure");
|
|
167
|
+
}
|
|
168
|
+
return args;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Build EVM options
|
|
172
|
+
*/
|
|
173
|
+
buildEvmOptions(options) {
|
|
174
|
+
const args = [];
|
|
175
|
+
if (options.forkBlockNumber !== undefined) {
|
|
176
|
+
args.push("--fork-block-number", options.forkBlockNumber.toString());
|
|
177
|
+
}
|
|
178
|
+
if (options.initialBalance) {
|
|
179
|
+
args.push("--initial-balance", options.initialBalance);
|
|
180
|
+
}
|
|
181
|
+
if (options.sender) {
|
|
182
|
+
args.push("--sender", options.sender);
|
|
183
|
+
}
|
|
184
|
+
if (options.ffi) {
|
|
185
|
+
args.push("--ffi");
|
|
186
|
+
}
|
|
187
|
+
return args;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Build build options
|
|
191
|
+
*/
|
|
192
|
+
buildBuildOptions(options) {
|
|
193
|
+
const args = [];
|
|
194
|
+
if (options.force) {
|
|
195
|
+
args.push("--force");
|
|
196
|
+
}
|
|
197
|
+
if (options.noCache) {
|
|
198
|
+
args.push("--no-cache");
|
|
199
|
+
}
|
|
200
|
+
if (options.optimize) {
|
|
201
|
+
args.push("--optimize");
|
|
202
|
+
}
|
|
203
|
+
if (options.optimizerRuns !== undefined) {
|
|
204
|
+
args.push("--optimizer-runs", options.optimizerRuns.toString());
|
|
205
|
+
}
|
|
206
|
+
if (options.viaIr) {
|
|
207
|
+
args.push("--via-ir");
|
|
208
|
+
}
|
|
209
|
+
return args;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Execute forge coverage command and stream output
|
|
213
|
+
*
|
|
214
|
+
* @param args - Command arguments
|
|
215
|
+
* @returns Promise<boolean> - true if command succeeds
|
|
216
|
+
*/
|
|
217
|
+
executeForge(args) {
|
|
218
|
+
return new Promise((resolve, reject) => {
|
|
219
|
+
const forgeProcess = (0, child_process_1.spawn)("forge", ["coverage", ...args], {
|
|
220
|
+
cwd: this.hre.config.paths.root,
|
|
221
|
+
stdio: "inherit", // Stream output directly to terminal
|
|
222
|
+
});
|
|
223
|
+
forgeProcess.on("close", (code) => {
|
|
224
|
+
if (code === 0) {
|
|
225
|
+
resolve(true);
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
resolve(false);
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
forgeProcess.on("error", (error) => {
|
|
232
|
+
reject(new Error(`Failed to execute forge coverage: ${error.message}`));
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
exports.ForgeCoverageFramework = ForgeCoverageFramework;
|
|
238
|
+
//# sourceMappingURL=ForgeCoverageFramework.old.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ForgeCoverageFramework.old.js","sourceRoot":"","sources":["../../src/framework/ForgeCoverageFramework.old.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn } from \"child_process\";\nimport { HardhatRuntimeEnvironment } from \"hardhat/types\";\nimport { CoverageOptions } from \"../types/config\";\nimport { Logger } from \"../utils/logger\";\n\n/**\n * ForgeCoverageFramework - Orchestrates forge coverage execution for Diamond contracts\n *\n * Responsibilities:\n * 1. Build forge coverage command with all options\n * 2. Execute forge coverage with proper fork URL\n * 3. Stream output to terminal\n * 4. Handle errors appropriately\n */\nexport class ForgeCoverageFramework {\n constructor(private hre: HardhatRuntimeEnvironment) {}\n\n /**\n * Run forge coverage with provided options\n *\n * @param options - Coverage execution options\n * @returns Promise<boolean> - true if coverage succeeds, false otherwise\n */\n async runCoverage(options: CoverageOptions = {}): Promise<boolean> {\n Logger.section(\"Forge Coverage - Execution\");\n\n try {\n // Build command arguments\n const args = this.buildCoverageCommand(options);\n\n Logger.info(`Executing: forge coverage ${args.join(\" \")}`);\n Logger.info(\"⏳ Running coverage analysis (this may take a while)...\\n\");\n\n // Execute forge coverage\n const success = await this.executeForge(args);\n\n if (success) {\n Logger.success(\"✅ Coverage analysis completed successfully\");\n } else {\n Logger.error(\"❌ Coverage analysis failed\");\n }\n\n return success;\n } catch (error: any) {\n Logger.error(`Coverage execution error: ${error.message}`);\n return false;\n }\n }\n\n /**\n * Build complete forge coverage command arguments\n *\n * @param options - Coverage options\n * @returns Array of command arguments\n */\n private buildCoverageCommand(options: CoverageOptions): string[] {\n const args: string[] = [];\n\n // Add fork URL if provided\n if (options.forkUrl) {\n args.push(\"--fork-url\", options.forkUrl);\n }\n\n // Add all option groups\n args.push(...this.buildReportOptions(options));\n args.push(...this.buildFilterOptions(options));\n args.push(...this.buildDisplayOptions(options));\n args.push(...this.buildTestOptions(options));\n args.push(...this.buildEvmOptions(options));\n args.push(...this.buildBuildOptions(options));\n\n return args.filter((arg) => arg !== \"\");\n }\n\n /**\n * Build report-related options\n */\n private buildReportOptions(options: CoverageOptions): string[] {\n const args: string[] = [];\n\n // Multiple --report flags\n if (options.report && options.report.length > 0) {\n options.report.forEach((reportType) => {\n args.push(\"--report\", reportType);\n });\n }\n\n if (options.reportFile) {\n args.push(\"--report-file\", options.reportFile);\n }\n\n if (options.lcovVersion) {\n args.push(\"--lcov-version\", options.lcovVersion);\n }\n\n if (options.includeLibs) {\n args.push(\"--include-libs\");\n }\n\n if (options.excludeTests) {\n args.push(\"--exclude-tests\");\n }\n\n if (options.irMinimum) {\n args.push(\"--ir-minimum\");\n }\n\n return args;\n }\n\n /**\n * Build test filtering options\n */\n private buildFilterOptions(options: CoverageOptions): string[] {\n const args: string[] = [];\n\n if (options.matchTest) {\n args.push(\"--match-test\", options.matchTest);\n }\n\n if (options.noMatchTest) {\n args.push(\"--no-match-test\", options.noMatchTest);\n }\n\n if (options.matchContract) {\n args.push(\"--match-contract\", options.matchContract);\n }\n\n if (options.noMatchContract) {\n args.push(\"--no-match-contract\", options.noMatchContract);\n }\n\n if (options.matchPath) {\n args.push(\"--match-path\", options.matchPath);\n }\n\n if (options.noMatchPath) {\n args.push(\"--no-match-path\", options.noMatchPath);\n }\n\n if (options.noMatchCoverage) {\n args.push(\"--no-match-coverage\", options.noMatchCoverage);\n }\n\n return args;\n }\n\n /**\n * Build display options\n */\n private buildDisplayOptions(options: CoverageOptions): string[] {\n const args: string[] = [];\n\n // Verbosity (-v, -vv, -vvv, etc.)\n if (options.verbosity && options.verbosity > 0) {\n args.push(\"-\" + \"v\".repeat(options.verbosity));\n }\n\n if (options.quiet) {\n args.push(\"--quiet\");\n }\n\n if (options.json) {\n args.push(\"--json\");\n }\n\n if (options.md) {\n args.push(\"--md\");\n }\n\n if (options.color) {\n args.push(\"--color\", options.color);\n }\n\n return args;\n }\n\n /**\n * Build test execution options\n */\n private buildTestOptions(options: CoverageOptions): string[] {\n const args: string[] = [];\n\n if (options.threads !== undefined) {\n args.push(\"--threads\", options.threads.toString());\n }\n\n if (options.fuzzRuns !== undefined) {\n args.push(\"--fuzz-runs\", options.fuzzRuns.toString());\n }\n\n if (options.fuzzSeed) {\n args.push(\"--fuzz-seed\", options.fuzzSeed);\n }\n\n if (options.failFast) {\n args.push(\"--fail-fast\");\n }\n\n if (options.allowFailure) {\n args.push(\"--allow-failure\");\n }\n\n return args;\n }\n\n /**\n * Build EVM options\n */\n private buildEvmOptions(options: CoverageOptions): string[] {\n const args: string[] = [];\n\n if (options.forkBlockNumber !== undefined) {\n args.push(\"--fork-block-number\", options.forkBlockNumber.toString());\n }\n\n if (options.initialBalance) {\n args.push(\"--initial-balance\", options.initialBalance);\n }\n\n if (options.sender) {\n args.push(\"--sender\", options.sender);\n }\n\n if (options.ffi) {\n args.push(\"--ffi\");\n }\n\n return args;\n }\n\n /**\n * Build build options\n */\n private buildBuildOptions(options: CoverageOptions): string[] {\n const args: string[] = [];\n\n if (options.force) {\n args.push(\"--force\");\n }\n\n if (options.noCache) {\n args.push(\"--no-cache\");\n }\n\n if (options.optimize) {\n args.push(\"--optimize\");\n }\n\n if (options.optimizerRuns !== undefined) {\n args.push(\"--optimizer-runs\", options.optimizerRuns.toString());\n }\n\n if (options.viaIr) {\n args.push(\"--via-ir\");\n }\n\n return args;\n }\n\n /**\n * Execute forge coverage command and stream output\n *\n * @param args - Command arguments\n * @returns Promise<boolean> - true if command succeeds\n */\n private executeForge(args: string[]): Promise<boolean> {\n return new Promise((resolve, reject) => {\n const forgeProcess = spawn(\"forge\", [\"coverage\", ...args], {\n cwd: this.hre.config.paths.root,\n stdio: \"inherit\", // Stream output directly to terminal\n });\n\n forgeProcess.on(\"close\", (code) => {\n if (code === 0) {\n resolve(true);\n } else {\n resolve(false);\n }\n });\n\n forgeProcess.on(\"error\", (error) => {\n reject(new Error(`Failed to execute forge coverage: ${error.message}`));\n });\n });\n }\n}\n"]}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,gBAAgB,CAAC;AACxB,OAAO,0BAA0B,CAAC;AAClC,OAAO,cAAc,CAAC;AACtB,OAAO,cAAc,CAAC;AACtB,OAAO,iBAAiB,CAAC;AAmBzB,cAAc,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,gBAAgB,CAAC;AACxB,OAAO,0BAA0B,CAAC;AAClC,OAAO,cAAc,CAAC;AACtB,OAAO,cAAc,CAAC;AACtB,OAAO,iBAAiB,CAAC;AAmBzB,cAAc,gBAAgB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -18,6 +18,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
18
18
|
};
|
|
19
19
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
20
|
const config_1 = require("hardhat/config");
|
|
21
|
+
require("./tasks/coverage");
|
|
21
22
|
require("./tasks/deploy");
|
|
22
23
|
require("./tasks/generate-helpers");
|
|
23
24
|
require("./tasks/init");
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { extendConfig, extendEnvironment, internalTask, task } from \"hardhat/config\";\nimport \"./tasks/deploy\";\nimport \"./tasks/generate-helpers\";\nimport \"./tasks/init\";\nimport \"./tasks/test\";\nimport \"./types/hardhat\";\n\nimport { existsSync, writeFileSync } from \"fs\";\nimport {\n
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { extendConfig, extendEnvironment, internalTask, task } from \"hardhat/config\";\nimport \"./tasks/coverage\";\nimport \"./tasks/deploy\";\nimport \"./tasks/generate-helpers\";\nimport \"./tasks/init\";\nimport \"./tasks/test\";\nimport \"./types/hardhat\";\n\nimport { existsSync, writeFileSync } from \"fs\";\nimport {\n TASK_COMPILE_GET_REMAPPINGS,\n TASK_COMPILE_TRANSFORM_IMPORT_NAME,\n} from \"hardhat/builtin-tasks/task-names\";\nimport { HardhatRuntimeEnvironment } from \"hardhat/types\";\nimport path from \"path\";\nimport picocolors from \"picocolors\";\nimport {\n getForgeConfig,\n getRemappings,\n HardhatFoundryError,\n installDependency,\n} from \"./foundry\";\nimport { validateConfig } from \"./utils/validation\";\n\n// Export types\nexport * from \"./types/config\";\n\nconst TASK_INIT_FOUNDRY = \"init-foundry\";\n\nlet pluginActivated = false;\n\n// Extend config with diamondsFoundry settings\nextendConfig((config, userConfig) => {\n // Validate and set diamondsFoundry config\n config.diamondsFoundry = validateConfig(userConfig.diamondsFoundry);\n\n // Check foundry.toml presence. Don't warn when running foundry initialization task\n if (!existsSync(path.join(config.paths.root, \"foundry.toml\"))) {\n if (!process.argv.includes(TASK_INIT_FOUNDRY)) {\n console.log(\n picocolors.yellow(\n `Warning: You are using the diamonds-hardhat-foundry plugin but there isn't a foundry.toml file in your project. Run 'npx hardhat ${TASK_INIT_FOUNDRY}' to create one.`\n )\n );\n }\n return;\n }\n\n // Load foundry config\n const foundryConfig = getForgeConfig();\n\n // Ensure required keys exist\n if (\n foundryConfig?.src === undefined ||\n foundryConfig?.cache_path === undefined\n ) {\n throw new HardhatFoundryError(\n \"Couldn't find `src` or `cache_path` config keys after running `forge config --json`\"\n );\n }\n\n // Ensure foundry src path doesn't mismatch user-configured path\n const userSourcesPath = userConfig.paths?.sources;\n const foundrySourcesPath = foundryConfig.src;\n\n if (\n userSourcesPath !== undefined &&\n path.resolve(userSourcesPath) !== path.resolve(foundrySourcesPath)\n ) {\n throw new HardhatFoundryError(\n `User-configured sources path (${userSourcesPath}) doesn't match path configured in foundry (${foundrySourcesPath})`\n );\n }\n\n // Set sources path\n config.paths.sources = path.resolve(config.paths.root, foundrySourcesPath);\n\n // Change hardhat's cache path if it clashes with foundry's\n const foundryCachePath = path.resolve(\n config.paths.root,\n foundryConfig.cache_path\n );\n if (config.paths.cache === foundryCachePath) {\n config.paths.cache = \"cache_hardhat\";\n }\n\n pluginActivated = true;\n});\n\n// Extend environment to add diamondsFoundry config to HRE\nextendEnvironment((hre: HardhatRuntimeEnvironment) => {\n hre.diamondsFoundry = hre.config.diamondsFoundry;\n});\n\n// This task is in place to detect old hardhat-core versions\ninternalTask(TASK_COMPILE_TRANSFORM_IMPORT_NAME).setAction(\n async (\n {\n importName,\n deprecationCheck,\n }: { importName: string; deprecationCheck: boolean },\n _hre\n ): Promise<string> => {\n // When the deprecationCheck param is passed, it means a new enough hardhat-core is being used\n if (deprecationCheck) {\n return importName;\n }\n throw new HardhatFoundryError(\n \"This version of diamonds-hardhat-foundry depends on hardhat version >= 2.17.2\"\n );\n }\n);\n\ninternalTask(TASK_COMPILE_GET_REMAPPINGS).setAction(\n async (): Promise<Record<string, string>> => {\n if (!pluginActivated) {\n return {};\n }\n\n return getRemappings();\n }\n);\n\ntask(\n TASK_INIT_FOUNDRY,\n \"Initialize foundry setup in current hardhat project\",\n async (_, hre: HardhatRuntimeEnvironment) => {\n const foundryConfigPath = path.resolve(\n hre.config.paths.root,\n \"foundry.toml\"\n );\n\n if (existsSync(foundryConfigPath)) {\n console.warn(\n picocolors.yellow(`File foundry.toml already exists. Aborting.`)\n );\n process.exit(1);\n }\n\n console.log(`Creating foundry.toml file...`);\n\n writeFileSync(\n foundryConfigPath,\n [\n `[profile.default]`,\n `src = '${path.relative(\n hre.config.paths.root,\n hre.config.paths.sources\n )}'`,\n `out = 'out'`,\n `libs = ['node_modules', 'lib']`,\n `test = '${path.relative(\n hre.config.paths.root,\n hre.config.paths.tests\n )}'`,\n `cache_path = 'cache_forge'`,\n ].join(\"\\n\")\n );\n\n await installDependency(\"foundry-rs/forge-std\");\n }\n);\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage.d.ts","sourceRoot":"","sources":["../../src/tasks/coverage.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const config_1 = require("hardhat/config");
|
|
4
|
+
const logger_1 = require("../utils/logger");
|
|
5
|
+
/**
|
|
6
|
+
* Task: diamonds-forge:coverage
|
|
7
|
+
*
|
|
8
|
+
* Runs Forge coverage with Diamond deployment.
|
|
9
|
+
* - Ensures Diamond deployment exists
|
|
10
|
+
* - Generates Solidity helpers
|
|
11
|
+
* - Runs forge coverage with specified options
|
|
12
|
+
*
|
|
13
|
+
* Use Hardhat's built-in --network flag to specify the network
|
|
14
|
+
*
|
|
15
|
+
* Design: Mirrors diamonds-forge:test task structure for consistency
|
|
16
|
+
*/
|
|
17
|
+
(0, config_1.task)("diamonds-forge:coverage", "Run forge coverage for Diamond contracts")
|
|
18
|
+
.addOptionalParam("diamondName", "Name of the Diamond to analyze", "ExampleDiamond", config_1.types.string)
|
|
19
|
+
// Report options
|
|
20
|
+
.addOptionalParam("report", "Report type (summary, lcov, debug, bytecode) - comma-separated for multiple", undefined, config_1.types.string)
|
|
21
|
+
.addOptionalParam("reportFile", "Output path for report file", undefined, config_1.types.string)
|
|
22
|
+
.addOptionalParam("lcovVersion", "LCOV format version (v1 or v2)", undefined, config_1.types.string)
|
|
23
|
+
.addFlag("includeLibs", "Include libraries in coverage report")
|
|
24
|
+
.addFlag("excludeTests", "Exclude tests from coverage report")
|
|
25
|
+
.addFlag("irMinimum", "Enable viaIR with minimum optimization")
|
|
26
|
+
// Test filtering
|
|
27
|
+
.addOptionalParam("matchTest", "Run tests matching pattern", undefined, config_1.types.string)
|
|
28
|
+
.addOptionalParam("noMatchTest", "Exclude tests matching pattern", undefined, config_1.types.string)
|
|
29
|
+
.addOptionalParam("matchContract", "Run contracts matching pattern", undefined, config_1.types.string)
|
|
30
|
+
.addOptionalParam("noMatchContract", "Exclude contracts matching pattern", undefined, config_1.types.string)
|
|
31
|
+
.addOptionalParam("matchPath", "Run files matching glob", undefined, config_1.types.string)
|
|
32
|
+
.addOptionalParam("noMatchPath", "Exclude files matching glob", undefined, config_1.types.string)
|
|
33
|
+
.addOptionalParam("noMatchCoverage", "Exclude files from coverage report", undefined, config_1.types.string)
|
|
34
|
+
// Display options
|
|
35
|
+
.addOptionalParam("verbosity", "Verbosity level (1-5)", undefined, config_1.types.int)
|
|
36
|
+
.addFlag("quiet", "Suppress log output")
|
|
37
|
+
.addFlag("json", "Format output as JSON")
|
|
38
|
+
.addFlag("md", "Format output as Markdown")
|
|
39
|
+
.addOptionalParam("color", "Color mode (auto, always, never)", undefined, config_1.types.string)
|
|
40
|
+
// Test execution options
|
|
41
|
+
.addOptionalParam("threads", "Number of threads to use", undefined, config_1.types.int)
|
|
42
|
+
.addOptionalParam("fuzzRuns", "Number of fuzz runs", undefined, config_1.types.int)
|
|
43
|
+
.addOptionalParam("fuzzSeed", "Seed for fuzz randomness", undefined, config_1.types.string)
|
|
44
|
+
.addFlag("failFast", "Stop on first failure")
|
|
45
|
+
.addFlag("allowFailure", "Exit 0 even if tests fail")
|
|
46
|
+
// EVM options
|
|
47
|
+
.addOptionalParam("forkBlockNumber", "Fork from specific block number", undefined, config_1.types.int)
|
|
48
|
+
.addOptionalParam("initialBalance", "Initial balance for test contracts", undefined, config_1.types.string)
|
|
49
|
+
.addOptionalParam("sender", "Test sender address", undefined, config_1.types.string)
|
|
50
|
+
.addFlag("ffi", "Enable FFI cheatcode")
|
|
51
|
+
// Build/deployment options
|
|
52
|
+
.addFlag("force", "Force recompile and redeploy")
|
|
53
|
+
.addFlag("noCache", "Disable cache")
|
|
54
|
+
.addFlag("optimize", "Enable Solidity optimizer")
|
|
55
|
+
.addOptionalParam("optimizerRuns", "Optimizer runs", undefined, config_1.types.int)
|
|
56
|
+
.addFlag("viaIr", "Use Yul IR compilation")
|
|
57
|
+
.addFlag("skipDeployment", "Skip Diamond deployment step")
|
|
58
|
+
.addFlag("skipHelpers", "Skip helper generation step")
|
|
59
|
+
.addFlag("saveDeployment", "Write deployment data to file for reuse")
|
|
60
|
+
.setAction(async (taskArgs, hre) => {
|
|
61
|
+
logger_1.Logger.section("Running Forge Coverage with Diamond");
|
|
62
|
+
const diamondName = taskArgs.diamondName;
|
|
63
|
+
const networkName = hre.network.name;
|
|
64
|
+
logger_1.Logger.info(`Diamond: ${diamondName}`);
|
|
65
|
+
logger_1.Logger.info(`Network: ${networkName}`);
|
|
66
|
+
// Log key options
|
|
67
|
+
if (taskArgs.report)
|
|
68
|
+
logger_1.Logger.info(`Report: ${taskArgs.report}`);
|
|
69
|
+
if (taskArgs.reportFile)
|
|
70
|
+
logger_1.Logger.info(`Report File: ${taskArgs.reportFile}`);
|
|
71
|
+
if (taskArgs.matchTest)
|
|
72
|
+
logger_1.Logger.info(`Match Test: ${taskArgs.matchTest}`);
|
|
73
|
+
if (taskArgs.matchContract)
|
|
74
|
+
logger_1.Logger.info(`Match Contract: ${taskArgs.matchContract}`);
|
|
75
|
+
if (taskArgs.skipDeployment)
|
|
76
|
+
logger_1.Logger.info("Skip Deployment: true");
|
|
77
|
+
if (taskArgs.skipHelpers)
|
|
78
|
+
logger_1.Logger.info("Skip Helpers: true");
|
|
79
|
+
if (taskArgs.saveDeployment)
|
|
80
|
+
logger_1.Logger.info("Save Deployment: true");
|
|
81
|
+
// Lazy-load framework to avoid circular dependency during config loading
|
|
82
|
+
const { ForgeCoverageFramework } = await import("../framework/ForgeCoverageFramework.js");
|
|
83
|
+
// Parse comma-separated report types
|
|
84
|
+
const reportTypes = taskArgs.report
|
|
85
|
+
? taskArgs.report.split(",").map((r) => r.trim())
|
|
86
|
+
: undefined;
|
|
87
|
+
// Create coverage options (matches test.ts pattern)
|
|
88
|
+
const options = {
|
|
89
|
+
diamondName,
|
|
90
|
+
networkName,
|
|
91
|
+
force: taskArgs.force,
|
|
92
|
+
skipDeployment: taskArgs.skipDeployment,
|
|
93
|
+
skipHelpers: taskArgs.skipHelpers,
|
|
94
|
+
writeDeployedDiamondData: taskArgs.saveDeployment,
|
|
95
|
+
// Report options
|
|
96
|
+
report: reportTypes,
|
|
97
|
+
reportFile: taskArgs.reportFile,
|
|
98
|
+
lcovVersion: taskArgs.lcovVersion,
|
|
99
|
+
includeLibs: taskArgs.includeLibs,
|
|
100
|
+
excludeTests: taskArgs.excludeTests,
|
|
101
|
+
irMinimum: taskArgs.irMinimum,
|
|
102
|
+
// Test filtering
|
|
103
|
+
matchTest: taskArgs.matchTest,
|
|
104
|
+
noMatchTest: taskArgs.noMatchTest,
|
|
105
|
+
matchContract: taskArgs.matchContract,
|
|
106
|
+
noMatchContract: taskArgs.noMatchContract,
|
|
107
|
+
matchPath: taskArgs.matchPath,
|
|
108
|
+
noMatchPath: taskArgs.noMatchPath,
|
|
109
|
+
noMatchCoverage: taskArgs.noMatchCoverage,
|
|
110
|
+
// Display options
|
|
111
|
+
verbosity: taskArgs.verbosity,
|
|
112
|
+
quiet: taskArgs.quiet,
|
|
113
|
+
json: taskArgs.json,
|
|
114
|
+
md: taskArgs.md,
|
|
115
|
+
color: taskArgs.color,
|
|
116
|
+
// Test execution
|
|
117
|
+
threads: taskArgs.threads,
|
|
118
|
+
fuzzRuns: taskArgs.fuzzRuns,
|
|
119
|
+
fuzzSeed: taskArgs.fuzzSeed,
|
|
120
|
+
failFast: taskArgs.failFast,
|
|
121
|
+
allowFailure: taskArgs.allowFailure,
|
|
122
|
+
// EVM options
|
|
123
|
+
forkBlockNumber: taskArgs.forkBlockNumber,
|
|
124
|
+
initialBalance: taskArgs.initialBalance,
|
|
125
|
+
sender: taskArgs.sender,
|
|
126
|
+
ffi: taskArgs.ffi,
|
|
127
|
+
// Build options
|
|
128
|
+
noCache: taskArgs.noCache,
|
|
129
|
+
optimize: taskArgs.optimize,
|
|
130
|
+
optimizerRuns: taskArgs.optimizerRuns,
|
|
131
|
+
viaIr: taskArgs.viaIr,
|
|
132
|
+
};
|
|
133
|
+
// Run coverage using the framework (same pattern as test.ts)
|
|
134
|
+
const framework = new ForgeCoverageFramework(hre);
|
|
135
|
+
try {
|
|
136
|
+
const success = await framework.runCoverage(options);
|
|
137
|
+
if (success) {
|
|
138
|
+
logger_1.Logger.section("Coverage Analysis Complete");
|
|
139
|
+
logger_1.Logger.success("✅ Coverage completed successfully!");
|
|
140
|
+
process.exitCode = 0;
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
logger_1.Logger.section("Coverage Analysis Complete");
|
|
144
|
+
logger_1.Logger.error("❌ Coverage analysis failed");
|
|
145
|
+
process.exitCode = 1;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
logger_1.Logger.error(`Coverage execution failed: ${error.message}`);
|
|
150
|
+
process.exitCode = 1;
|
|
151
|
+
throw error;
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
//# sourceMappingURL=coverage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage.js","sourceRoot":"","sources":["../../src/tasks/coverage.ts"],"names":[],"mappings":"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","sourcesContent":["import { task, types } from \"hardhat/config\";\nimport { HardhatRuntimeEnvironment } from \"hardhat/types\";\nimport { Logger } from \"../utils/logger\";\n\n/**\n * Task: diamonds-forge:coverage\n *\n * Runs Forge coverage with Diamond deployment.\n * - Ensures Diamond deployment exists\n * - Generates Solidity helpers\n * - Runs forge coverage with specified options\n *\n * Use Hardhat's built-in --network flag to specify the network\n * \n * Design: Mirrors diamonds-forge:test task structure for consistency\n */\ntask(\"diamonds-forge:coverage\", \"Run forge coverage for Diamond contracts\")\n .addOptionalParam(\n \"diamondName\",\n \"Name of the Diamond to analyze\",\n \"ExampleDiamond\",\n types.string\n )\n // Report options\n .addOptionalParam(\n \"report\",\n \"Report type (summary, lcov, debug, bytecode) - comma-separated for multiple\",\n undefined,\n types.string\n )\n .addOptionalParam(\n \"reportFile\",\n \"Output path for report file\",\n undefined,\n types.string\n )\n .addOptionalParam(\n \"lcovVersion\",\n \"LCOV format version (v1 or v2)\",\n undefined,\n types.string\n )\n .addFlag(\"includeLibs\", \"Include libraries in coverage report\")\n .addFlag(\"excludeTests\", \"Exclude tests from coverage report\")\n .addFlag(\"irMinimum\", \"Enable viaIR with minimum optimization\")\n // Test filtering\n .addOptionalParam(\n \"matchTest\",\n \"Run tests matching pattern\",\n undefined,\n types.string\n )\n .addOptionalParam(\n \"noMatchTest\",\n \"Exclude tests matching pattern\",\n undefined,\n types.string\n )\n .addOptionalParam(\n \"matchContract\",\n \"Run contracts matching pattern\",\n undefined,\n types.string\n )\n .addOptionalParam(\n \"noMatchContract\",\n \"Exclude contracts matching pattern\",\n undefined,\n types.string\n )\n .addOptionalParam(\n \"matchPath\",\n \"Run files matching glob\",\n undefined,\n types.string\n )\n .addOptionalParam(\n \"noMatchPath\",\n \"Exclude files matching glob\",\n undefined,\n types.string\n )\n .addOptionalParam(\n \"noMatchCoverage\",\n \"Exclude files from coverage report\",\n undefined,\n types.string\n )\n // Display options\n .addOptionalParam(\n \"verbosity\",\n \"Verbosity level (1-5)\",\n undefined,\n types.int\n )\n .addFlag(\"quiet\", \"Suppress log output\")\n .addFlag(\"json\", \"Format output as JSON\")\n .addFlag(\"md\", \"Format output as Markdown\")\n .addOptionalParam(\n \"color\",\n \"Color mode (auto, always, never)\",\n undefined,\n types.string\n )\n // Test execution options\n .addOptionalParam(\n \"threads\",\n \"Number of threads to use\",\n undefined,\n types.int\n )\n .addOptionalParam(\n \"fuzzRuns\",\n \"Number of fuzz runs\",\n undefined,\n types.int\n )\n .addOptionalParam(\n \"fuzzSeed\",\n \"Seed for fuzz randomness\",\n undefined,\n types.string\n )\n .addFlag(\"failFast\", \"Stop on first failure\")\n .addFlag(\"allowFailure\", \"Exit 0 even if tests fail\")\n // EVM options\n .addOptionalParam(\n \"forkBlockNumber\",\n \"Fork from specific block number\",\n undefined,\n types.int\n )\n .addOptionalParam(\n \"initialBalance\",\n \"Initial balance for test contracts\",\n undefined,\n types.string\n )\n .addOptionalParam(\n \"sender\",\n \"Test sender address\",\n undefined,\n types.string\n )\n .addFlag(\"ffi\", \"Enable FFI cheatcode\")\n // Build/deployment options\n .addFlag(\"force\", \"Force recompile and redeploy\")\n .addFlag(\"noCache\", \"Disable cache\")\n .addFlag(\"optimize\", \"Enable Solidity optimizer\")\n .addOptionalParam(\n \"optimizerRuns\",\n \"Optimizer runs\",\n undefined,\n types.int\n )\n .addFlag(\"viaIr\", \"Use Yul IR compilation\")\n .addFlag(\"skipDeployment\", \"Skip Diamond deployment step\")\n .addFlag(\"skipHelpers\", \"Skip helper generation step\")\n .addFlag(\"saveDeployment\", \"Write deployment data to file for reuse\")\n .setAction(async (taskArgs, hre: HardhatRuntimeEnvironment) => {\n Logger.section(\"Running Forge Coverage with Diamond\");\n\n const diamondName = taskArgs.diamondName;\n const networkName = hre.network.name;\n\n Logger.info(`Diamond: ${diamondName}`);\n Logger.info(`Network: ${networkName}`);\n\n // Log key options\n if (taskArgs.report) Logger.info(`Report: ${taskArgs.report}`);\n if (taskArgs.reportFile) Logger.info(`Report File: ${taskArgs.reportFile}`);\n if (taskArgs.matchTest) Logger.info(`Match Test: ${taskArgs.matchTest}`);\n if (taskArgs.matchContract) Logger.info(`Match Contract: ${taskArgs.matchContract}`);\n if (taskArgs.skipDeployment) Logger.info(\"Skip Deployment: true\");\n if (taskArgs.skipHelpers) Logger.info(\"Skip Helpers: true\");\n if (taskArgs.saveDeployment) Logger.info(\"Save Deployment: true\");\n\n // Lazy-load framework to avoid circular dependency during config loading\n const { ForgeCoverageFramework } = await import(\n \"../framework/ForgeCoverageFramework.js\"\n );\n type CoverageOptions = Parameters<\n InstanceType<typeof ForgeCoverageFramework>[\"runCoverage\"]\n >[0];\n\n // Parse comma-separated report types\n const reportTypes = taskArgs.report\n ? taskArgs.report.split(\",\").map((r: string) => r.trim())\n : undefined;\n\n // Create coverage options (matches test.ts pattern)\n const options: CoverageOptions = {\n diamondName,\n networkName,\n force: taskArgs.force,\n skipDeployment: taskArgs.skipDeployment,\n skipHelpers: taskArgs.skipHelpers,\n writeDeployedDiamondData: taskArgs.saveDeployment,\n // Report options\n report: reportTypes,\n reportFile: taskArgs.reportFile,\n lcovVersion: taskArgs.lcovVersion,\n includeLibs: taskArgs.includeLibs,\n excludeTests: taskArgs.excludeTests,\n irMinimum: taskArgs.irMinimum,\n // Test filtering\n matchTest: taskArgs.matchTest,\n noMatchTest: taskArgs.noMatchTest,\n matchContract: taskArgs.matchContract,\n noMatchContract: taskArgs.noMatchContract,\n matchPath: taskArgs.matchPath,\n noMatchPath: taskArgs.noMatchPath,\n noMatchCoverage: taskArgs.noMatchCoverage,\n // Display options\n verbosity: taskArgs.verbosity,\n quiet: taskArgs.quiet,\n json: taskArgs.json,\n md: taskArgs.md,\n color: taskArgs.color,\n // Test execution\n threads: taskArgs.threads,\n fuzzRuns: taskArgs.fuzzRuns,\n fuzzSeed: taskArgs.fuzzSeed,\n failFast: taskArgs.failFast,\n allowFailure: taskArgs.allowFailure,\n // EVM options\n forkBlockNumber: taskArgs.forkBlockNumber,\n initialBalance: taskArgs.initialBalance,\n sender: taskArgs.sender,\n ffi: taskArgs.ffi,\n // Build options\n noCache: taskArgs.noCache,\n optimize: taskArgs.optimize,\n optimizerRuns: taskArgs.optimizerRuns,\n viaIr: taskArgs.viaIr,\n };\n\n // Run coverage using the framework (same pattern as test.ts)\n const framework = new ForgeCoverageFramework(hre);\n\n try {\n const success = await framework.runCoverage(options);\n\n if (success) {\n Logger.section(\"Coverage Analysis Complete\");\n Logger.success(\"✅ Coverage completed successfully!\");\n process.exitCode = 0;\n } else {\n Logger.section(\"Coverage Analysis Complete\");\n Logger.error(\"❌ Coverage analysis failed\");\n process.exitCode = 1;\n }\n } catch (error: any) {\n Logger.error(`Coverage execution failed: ${error.message}`);\n process.exitCode = 1;\n throw error;\n }\n });\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage.old.d.ts","sourceRoot":"","sources":["../../src/tasks/coverage.old.ts"],"names":[],"mappings":""}
|