@diamondslab/diamonds-hardhat-foundry 2.3.0 → 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.
@@ -11,26 +11,28 @@ const logger_1 = require("../utils/logger");
11
11
  * - Runs forge coverage with specified options
12
12
  *
13
13
  * Use Hardhat's built-in --network flag to specify the network
14
+ *
15
+ * Design: Mirrors diamonds-forge:test task structure for consistency
14
16
  */
15
17
  (0, config_1.task)("diamonds-forge:coverage", "Run forge coverage for Diamond contracts")
16
- .addParam("diamondName", "Name of the Diamond to analyze", undefined, config_1.types.string)
18
+ .addOptionalParam("diamondName", "Name of the Diamond to analyze", "ExampleDiamond", config_1.types.string)
17
19
  // Report options
18
- .addOptionalParam("report", "Report type (summary, lcov, debug, bytecode) - can be used multiple times by passing comma-separated values", undefined, config_1.types.string)
20
+ .addOptionalParam("report", "Report type (summary, lcov, debug, bytecode) - comma-separated for multiple", undefined, config_1.types.string)
19
21
  .addOptionalParam("reportFile", "Output path for report file", undefined, config_1.types.string)
20
- .addOptionalParam("lcovVersion", "LCOV format version", undefined, config_1.types.string)
22
+ .addOptionalParam("lcovVersion", "LCOV format version (v1 or v2)", undefined, config_1.types.string)
21
23
  .addFlag("includeLibs", "Include libraries in coverage report")
22
24
  .addFlag("excludeTests", "Exclude tests from coverage report")
23
25
  .addFlag("irMinimum", "Enable viaIR with minimum optimization")
24
26
  // Test filtering
25
- .addOptionalParam("matchTest", "Run tests matching pattern (--match-test)", undefined, config_1.types.string)
26
- .addOptionalParam("noMatchTest", "Exclude tests matching pattern (--no-match-test)", undefined, config_1.types.string)
27
- .addOptionalParam("matchContract", "Run contracts matching pattern (--match-contract)", undefined, config_1.types.string)
28
- .addOptionalParam("noMatchContract", "Exclude contracts matching pattern (--no-match-contract)", undefined, config_1.types.string)
29
- .addOptionalParam("matchPath", "Run files matching glob (--match-path)", undefined, config_1.types.string)
30
- .addOptionalParam("noMatchPath", "Exclude files matching glob (--no-match-path)", undefined, config_1.types.string)
31
- .addOptionalParam("noMatchCoverage", "Exclude files from coverage report (--no-match-coverage)", undefined, config_1.types.string)
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)
32
34
  // Display options
33
- .addOptionalParam("verbosity", "Verbosity level (1-5, more v's = more verbose)", undefined, config_1.types.int)
35
+ .addOptionalParam("verbosity", "Verbosity level (1-5)", undefined, config_1.types.int)
34
36
  .addFlag("quiet", "Suppress log output")
35
37
  .addFlag("json", "Format output as JSON")
36
38
  .addFlag("md", "Format output as Markdown")
@@ -46,121 +48,100 @@ const logger_1 = require("../utils/logger");
46
48
  .addOptionalParam("initialBalance", "Initial balance for test contracts", undefined, config_1.types.string)
47
49
  .addOptionalParam("sender", "Test sender address", undefined, config_1.types.string)
48
50
  .addFlag("ffi", "Enable FFI cheatcode")
49
- // Build options
51
+ // Build/deployment options
50
52
  .addFlag("force", "Force recompile and redeploy")
51
53
  .addFlag("noCache", "Disable cache")
52
54
  .addFlag("optimize", "Enable Solidity optimizer")
53
55
  .addOptionalParam("optimizerRuns", "Optimizer runs", undefined, config_1.types.int)
54
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")
55
60
  .setAction(async (taskArgs, hre) => {
56
61
  logger_1.Logger.section("Running Forge Coverage with Diamond");
57
62
  const diamondName = taskArgs.diamondName;
58
63
  const networkName = hre.network.name;
59
- // Validate required parameters
60
- if (!diamondName) {
61
- logger_1.Logger.error("--diamond-name is required");
62
- process.exitCode = 1;
63
- return;
64
- }
65
64
  logger_1.Logger.info(`Diamond: ${diamondName}`);
66
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);
67
135
  try {
68
- // Lazy-load framework classes to avoid circular dependency
69
- const { DeploymentManager } = await import("../framework/DeploymentManager.js");
70
- const { HelperGenerator } = await import("../framework/HelperGenerator.js");
71
- // Step 1: Ensure Diamond deployment
72
- logger_1.Logger.section("Step 1/3: Ensuring Diamond Deployment");
73
- const deploymentManager = new DeploymentManager(hre);
74
- await deploymentManager.ensureDeployment(diamondName, networkName, taskArgs.force || false, false // Don't write deployment data for coverage (ephemeral by default)
75
- );
76
- // Step 2: Generate helpers
77
- logger_1.Logger.section("Step 2/3: Generating Solidity Helpers");
78
- const deployment = await deploymentManager.getDeployment(diamondName, networkName);
79
- if (!deployment) {
80
- logger_1.Logger.error("No deployment found. Cannot generate helpers.");
81
- process.exitCode = 1;
82
- return;
83
- }
84
- const provider = hre.ethers.provider;
85
- const network = await provider.getNetwork();
86
- const chainId = Number(network.chainId);
87
- const deploymentData = deployment.getDeployedDiamondData();
88
- const helperGenerator = new HelperGenerator(hre);
89
- await helperGenerator.generateDeploymentHelpers(diamondName, networkName, chainId, deploymentData, deployment);
90
- // Step 3: Run coverage
91
- logger_1.Logger.section("Step 3/3: Running Forge Coverage");
92
- // Construct fork URL for network
93
- // Coverage requires forking from a running network to access deployed contracts
94
- let forkUrl;
95
- if (networkName !== "hardhat") {
96
- // Use the configured network's URL
97
- forkUrl = provider._hardhatProvider?._wrapped?.url || "http://127.0.0.1:8545";
98
- logger_1.Logger.info(`Forking from ${networkName}: ${forkUrl}`);
99
- }
100
- else {
101
- // Default to localhost for hardhat network
102
- // This assumes user has `npx hardhat node` running
103
- forkUrl = "http://127.0.0.1:8545";
104
- logger_1.Logger.warn(`⚠️ Network is "${networkName}" - defaulting to localhost fork: ${forkUrl}`);
105
- logger_1.Logger.warn(`💡 Make sure Hardhat node is running: npx hardhat node`);
106
- logger_1.Logger.warn(`💡 Or specify network explicitly: --network localhost`);
107
- }
108
- // Lazy-load framework to avoid circular dependency
109
- const { ForgeCoverageFramework } = await import("../framework/ForgeCoverageFramework.js");
110
- // Build coverage options from task args
111
- const options = {
112
- // Fork URL
113
- forkUrl,
114
- // Report options
115
- report: taskArgs.report ? taskArgs.report.split(",") : undefined,
116
- reportFile: taskArgs.reportFile,
117
- lcovVersion: taskArgs.lcovVersion,
118
- includeLibs: taskArgs.includeLibs,
119
- excludeTests: taskArgs.excludeTests,
120
- irMinimum: taskArgs.irMinimum,
121
- // Test filtering
122
- matchTest: taskArgs.matchTest,
123
- noMatchTest: taskArgs.noMatchTest,
124
- matchContract: taskArgs.matchContract,
125
- noMatchContract: taskArgs.noMatchContract,
126
- matchPath: taskArgs.matchPath,
127
- noMatchPath: taskArgs.noMatchPath,
128
- noMatchCoverage: taskArgs.noMatchCoverage,
129
- // Display options
130
- verbosity: taskArgs.verbosity,
131
- quiet: taskArgs.quiet,
132
- json: taskArgs.json,
133
- md: taskArgs.md,
134
- color: taskArgs.color,
135
- // Test execution options
136
- threads: taskArgs.threads,
137
- fuzzRuns: taskArgs.fuzzRuns,
138
- fuzzSeed: taskArgs.fuzzSeed,
139
- failFast: taskArgs.failFast,
140
- allowFailure: taskArgs.allowFailure,
141
- // EVM options
142
- forkBlockNumber: taskArgs.forkBlockNumber,
143
- initialBalance: taskArgs.initialBalance,
144
- sender: taskArgs.sender,
145
- ffi: taskArgs.ffi,
146
- // Build options
147
- force: taskArgs.force,
148
- noCache: taskArgs.noCache,
149
- optimize: taskArgs.optimize,
150
- optimizerRuns: taskArgs.optimizerRuns,
151
- viaIr: taskArgs.viaIr,
152
- };
153
- // Run coverage
154
- const framework = new ForgeCoverageFramework(hre);
155
136
  const success = await framework.runCoverage(options);
156
137
  if (success) {
157
138
  logger_1.Logger.section("Coverage Analysis Complete");
158
- logger_1.Logger.success("Coverage analysis completed successfully!");
139
+ logger_1.Logger.success("Coverage completed successfully!");
159
140
  process.exitCode = 0;
160
141
  }
161
142
  else {
162
143
  logger_1.Logger.section("Coverage Analysis Complete");
163
- logger_1.Logger.error("Coverage analysis failed");
144
+ logger_1.Logger.error("Coverage analysis failed");
164
145
  process.exitCode = 1;
165
146
  }
166
147
  }
@@ -1 +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 */\ntask(\"diamonds-forge:coverage\", \"Run forge coverage for Diamond contracts\")\n .addParam(\n \"diamondName\",\n \"Name of the Diamond to analyze\",\n undefined,\n types.string\n )\n // Report options\n .addOptionalParam(\n \"report\",\n \"Report type (summary, lcov, debug, bytecode) - can be used multiple times by passing comma-separated values\",\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\",\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 (--match-test)\",\n undefined,\n types.string\n )\n .addOptionalParam(\n \"noMatchTest\",\n \"Exclude tests matching pattern (--no-match-test)\",\n undefined,\n types.string\n )\n .addOptionalParam(\n \"matchContract\",\n \"Run contracts matching pattern (--match-contract)\",\n undefined,\n types.string\n )\n .addOptionalParam(\n \"noMatchContract\",\n \"Exclude contracts matching pattern (--no-match-contract)\",\n undefined,\n types.string\n )\n .addOptionalParam(\n \"matchPath\",\n \"Run files matching glob (--match-path)\",\n undefined,\n types.string\n )\n .addOptionalParam(\n \"noMatchPath\",\n \"Exclude files matching glob (--no-match-path)\",\n undefined,\n types.string\n )\n .addOptionalParam(\n \"noMatchCoverage\",\n \"Exclude files from coverage report (--no-match-coverage)\",\n undefined,\n types.string\n )\n // Display options\n .addOptionalParam(\n \"verbosity\",\n \"Verbosity level (1-5, more v's = more verbose)\",\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 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 .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 // Validate required parameters\n if (!diamondName) {\n Logger.error(\"--diamond-name is required\");\n process.exitCode = 1;\n return;\n }\n\n Logger.info(`Diamond: ${diamondName}`);\n Logger.info(`Network: ${networkName}`);\n\n try {\n // Lazy-load framework classes to avoid circular dependency\n const { DeploymentManager } = await import(\"../framework/DeploymentManager.js\");\n const { HelperGenerator } = await import(\"../framework/HelperGenerator.js\");\n\n // Step 1: Ensure Diamond deployment\n Logger.section(\"Step 1/3: Ensuring Diamond Deployment\");\n \n const deploymentManager = new DeploymentManager(hre);\n \n await deploymentManager.ensureDeployment(\n diamondName,\n networkName,\n taskArgs.force || false,\n false // Don't write deployment data for coverage (ephemeral by default)\n );\n\n // Step 2: Generate helpers\n Logger.section(\"Step 2/3: Generating Solidity Helpers\");\n \n const deployment = await deploymentManager.getDeployment(\n diamondName,\n networkName\n );\n\n if (!deployment) {\n Logger.error(\"No deployment found. Cannot generate helpers.\");\n process.exitCode = 1;\n return;\n }\n\n const provider = hre.ethers.provider;\n const network = await provider.getNetwork();\n const chainId = Number(network.chainId);\n const deploymentData = deployment.getDeployedDiamondData();\n\n const helperGenerator = new HelperGenerator(hre);\n await helperGenerator.generateDeploymentHelpers(\n diamondName,\n networkName,\n chainId,\n deploymentData,\n deployment\n );\n\n // Step 3: Run coverage\n Logger.section(\"Step 3/3: Running Forge Coverage\");\n\n // Construct fork URL for network\n // Coverage requires forking from a running network to access deployed contracts\n let forkUrl: string;\n if (networkName !== \"hardhat\") {\n // Use the configured network's URL\n forkUrl = (provider as any)._hardhatProvider?._wrapped?.url || \"http://127.0.0.1:8545\";\n Logger.info(`Forking from ${networkName}: ${forkUrl}`);\n } else {\n // Default to localhost for hardhat network\n // This assumes user has `npx hardhat node` running\n forkUrl = \"http://127.0.0.1:8545\";\n Logger.warn(`⚠️ Network is \"${networkName}\" - defaulting to localhost fork: ${forkUrl}`);\n Logger.warn(`💡 Make sure Hardhat node is running: npx hardhat node`);\n Logger.warn(`💡 Or specify network explicitly: --network localhost`);\n }\n\n // Lazy-load framework to avoid circular dependency\n const { ForgeCoverageFramework } = await import(\"../framework/ForgeCoverageFramework.js\");\n type CoverageOptions = Parameters<InstanceType<typeof ForgeCoverageFramework>[\"runCoverage\"]>[0];\n\n // Build coverage options from task args\n const options: CoverageOptions = {\n // Fork URL\n forkUrl,\n\n // Report options\n report: taskArgs.report ? taskArgs.report.split(\",\") : undefined,\n reportFile: taskArgs.reportFile,\n lcovVersion: taskArgs.lcovVersion,\n includeLibs: taskArgs.includeLibs,\n excludeTests: taskArgs.excludeTests,\n irMinimum: taskArgs.irMinimum,\n\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\n // Display options\n verbosity: taskArgs.verbosity,\n quiet: taskArgs.quiet,\n json: taskArgs.json,\n md: taskArgs.md,\n color: taskArgs.color as \"auto\" | \"always\" | \"never\" | undefined,\n\n // Test execution options\n threads: taskArgs.threads,\n fuzzRuns: taskArgs.fuzzRuns,\n fuzzSeed: taskArgs.fuzzSeed,\n failFast: taskArgs.failFast,\n allowFailure: taskArgs.allowFailure,\n\n // EVM options\n forkBlockNumber: taskArgs.forkBlockNumber,\n initialBalance: taskArgs.initialBalance,\n sender: taskArgs.sender,\n ffi: taskArgs.ffi,\n\n // Build options\n force: taskArgs.force,\n noCache: taskArgs.noCache,\n optimize: taskArgs.optimize,\n optimizerRuns: taskArgs.optimizerRuns,\n viaIr: taskArgs.viaIr,\n };\n\n // Run coverage\n const framework = new ForgeCoverageFramework(hre);\n const success = await framework.runCoverage(options);\n\n if (success) {\n Logger.section(\"Coverage Analysis Complete\");\n Logger.success(\"Coverage analysis 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"]}
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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=coverage.old.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage.old.d.ts","sourceRoot":"","sources":["../../src/tasks/coverage.old.ts"],"names":[],"mappings":""}
@@ -0,0 +1,173 @@
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
+ (0, config_1.task)("diamonds-forge:coverage", "Run forge coverage for Diamond contracts")
16
+ .addParam("diamondName", "Name of the Diamond to analyze", undefined, config_1.types.string)
17
+ // Report options
18
+ .addOptionalParam("report", "Report type (summary, lcov, debug, bytecode) - can be used multiple times by passing comma-separated values", undefined, config_1.types.string)
19
+ .addOptionalParam("reportFile", "Output path for report file", undefined, config_1.types.string)
20
+ .addOptionalParam("lcovVersion", "LCOV format version", undefined, config_1.types.string)
21
+ .addFlag("includeLibs", "Include libraries in coverage report")
22
+ .addFlag("excludeTests", "Exclude tests from coverage report")
23
+ .addFlag("irMinimum", "Enable viaIR with minimum optimization")
24
+ // Test filtering
25
+ .addOptionalParam("matchTest", "Run tests matching pattern (--match-test)", undefined, config_1.types.string)
26
+ .addOptionalParam("noMatchTest", "Exclude tests matching pattern (--no-match-test)", undefined, config_1.types.string)
27
+ .addOptionalParam("matchContract", "Run contracts matching pattern (--match-contract)", undefined, config_1.types.string)
28
+ .addOptionalParam("noMatchContract", "Exclude contracts matching pattern (--no-match-contract)", undefined, config_1.types.string)
29
+ .addOptionalParam("matchPath", "Run files matching glob (--match-path)", undefined, config_1.types.string)
30
+ .addOptionalParam("noMatchPath", "Exclude files matching glob (--no-match-path)", undefined, config_1.types.string)
31
+ .addOptionalParam("noMatchCoverage", "Exclude files from coverage report (--no-match-coverage)", undefined, config_1.types.string)
32
+ // Display options
33
+ .addOptionalParam("verbosity", "Verbosity level (1-5, more v's = more verbose)", undefined, config_1.types.int)
34
+ .addFlag("quiet", "Suppress log output")
35
+ .addFlag("json", "Format output as JSON")
36
+ .addFlag("md", "Format output as Markdown")
37
+ .addOptionalParam("color", "Color mode (auto, always, never)", undefined, config_1.types.string)
38
+ // Test execution options
39
+ .addOptionalParam("threads", "Number of threads to use", undefined, config_1.types.int)
40
+ .addOptionalParam("fuzzRuns", "Number of fuzz runs", undefined, config_1.types.int)
41
+ .addOptionalParam("fuzzSeed", "Seed for fuzz randomness", undefined, config_1.types.string)
42
+ .addFlag("failFast", "Stop on first failure")
43
+ .addFlag("allowFailure", "Exit 0 even if tests fail")
44
+ // EVM options
45
+ .addOptionalParam("forkBlockNumber", "Fork from specific block number", undefined, config_1.types.int)
46
+ .addOptionalParam("initialBalance", "Initial balance for test contracts", undefined, config_1.types.string)
47
+ .addOptionalParam("sender", "Test sender address", undefined, config_1.types.string)
48
+ .addFlag("ffi", "Enable FFI cheatcode")
49
+ // Build options
50
+ .addFlag("force", "Force recompile and redeploy")
51
+ .addFlag("noCache", "Disable cache")
52
+ .addFlag("optimize", "Enable Solidity optimizer")
53
+ .addOptionalParam("optimizerRuns", "Optimizer runs", undefined, config_1.types.int)
54
+ .addFlag("viaIr", "Use Yul IR compilation")
55
+ .setAction(async (taskArgs, hre) => {
56
+ logger_1.Logger.section("Running Forge Coverage with Diamond");
57
+ const diamondName = taskArgs.diamondName;
58
+ const networkName = hre.network.name;
59
+ // Validate required parameters
60
+ if (!diamondName) {
61
+ logger_1.Logger.error("--diamond-name is required");
62
+ process.exitCode = 1;
63
+ return;
64
+ }
65
+ logger_1.Logger.info(`Diamond: ${diamondName}`);
66
+ logger_1.Logger.info(`Network: ${networkName}`);
67
+ try {
68
+ // Lazy-load framework classes to avoid circular dependency
69
+ const { DeploymentManager } = await import("../framework/DeploymentManager.js");
70
+ const { HelperGenerator } = await import("../framework/HelperGenerator.js");
71
+ // Step 1: Ensure Diamond deployment
72
+ logger_1.Logger.section("Step 1/3: Ensuring Diamond Deployment");
73
+ const deploymentManager = new DeploymentManager(hre);
74
+ await deploymentManager.ensureDeployment(diamondName, networkName, taskArgs.force || false, false // Don't write deployment data for coverage (ephemeral by default)
75
+ );
76
+ // Step 2: Generate helpers
77
+ logger_1.Logger.section("Step 2/3: Generating Solidity Helpers");
78
+ const deployment = await deploymentManager.getDeployment(diamondName, networkName);
79
+ if (!deployment) {
80
+ logger_1.Logger.error("No deployment found. Cannot generate helpers.");
81
+ process.exitCode = 1;
82
+ return;
83
+ }
84
+ const provider = hre.ethers.provider;
85
+ const network = await provider.getNetwork();
86
+ const chainId = Number(network.chainId);
87
+ const deploymentData = deployment.getDeployedDiamondData();
88
+ const helperGenerator = new HelperGenerator(hre);
89
+ await helperGenerator.generateDeploymentHelpers(diamondName, networkName, chainId, deploymentData, deployment);
90
+ // Step 3: Run coverage
91
+ logger_1.Logger.section("Step 3/3: Running Forge Coverage");
92
+ // Construct fork URL for network
93
+ // Coverage requires forking from a running network to access deployed contracts
94
+ let forkUrl;
95
+ if (networkName !== "hardhat") {
96
+ // Use the configured network's URL
97
+ forkUrl = provider._hardhatProvider?._wrapped?.url || "http://127.0.0.1:8545";
98
+ logger_1.Logger.info(`Forking from ${networkName}: ${forkUrl}`);
99
+ }
100
+ else {
101
+ // Default to localhost for hardhat network
102
+ // This assumes user has `npx hardhat node` running
103
+ forkUrl = "http://127.0.0.1:8545";
104
+ logger_1.Logger.warn(`⚠️ Network is "${networkName}" - defaulting to localhost fork: ${forkUrl}`);
105
+ logger_1.Logger.warn(`💡 Make sure Hardhat node is running: npx hardhat node`);
106
+ logger_1.Logger.warn(`💡 Or specify network explicitly: --network localhost`);
107
+ }
108
+ // Lazy-load framework to avoid circular dependency
109
+ const { ForgeCoverageFramework } = await import("../framework/ForgeCoverageFramework.js");
110
+ // Build coverage options from task args
111
+ const options = {
112
+ // Fork URL
113
+ forkUrl,
114
+ // Report options
115
+ report: taskArgs.report ? taskArgs.report.split(",") : undefined,
116
+ reportFile: taskArgs.reportFile,
117
+ lcovVersion: taskArgs.lcovVersion,
118
+ includeLibs: taskArgs.includeLibs,
119
+ excludeTests: taskArgs.excludeTests,
120
+ irMinimum: taskArgs.irMinimum,
121
+ // Test filtering
122
+ matchTest: taskArgs.matchTest,
123
+ noMatchTest: taskArgs.noMatchTest,
124
+ matchContract: taskArgs.matchContract,
125
+ noMatchContract: taskArgs.noMatchContract,
126
+ matchPath: taskArgs.matchPath,
127
+ noMatchPath: taskArgs.noMatchPath,
128
+ noMatchCoverage: taskArgs.noMatchCoverage,
129
+ // Display options
130
+ verbosity: taskArgs.verbosity,
131
+ quiet: taskArgs.quiet,
132
+ json: taskArgs.json,
133
+ md: taskArgs.md,
134
+ color: taskArgs.color,
135
+ // Test execution options
136
+ threads: taskArgs.threads,
137
+ fuzzRuns: taskArgs.fuzzRuns,
138
+ fuzzSeed: taskArgs.fuzzSeed,
139
+ failFast: taskArgs.failFast,
140
+ allowFailure: taskArgs.allowFailure,
141
+ // EVM options
142
+ forkBlockNumber: taskArgs.forkBlockNumber,
143
+ initialBalance: taskArgs.initialBalance,
144
+ sender: taskArgs.sender,
145
+ ffi: taskArgs.ffi,
146
+ // Build options
147
+ force: taskArgs.force,
148
+ noCache: taskArgs.noCache,
149
+ optimize: taskArgs.optimize,
150
+ optimizerRuns: taskArgs.optimizerRuns,
151
+ viaIr: taskArgs.viaIr,
152
+ };
153
+ // Run coverage
154
+ const framework = new ForgeCoverageFramework(hre);
155
+ const success = await framework.runCoverage(options);
156
+ if (success) {
157
+ logger_1.Logger.section("Coverage Analysis Complete");
158
+ logger_1.Logger.success("Coverage analysis completed successfully!");
159
+ process.exitCode = 0;
160
+ }
161
+ else {
162
+ logger_1.Logger.section("Coverage Analysis Complete");
163
+ logger_1.Logger.error("Coverage analysis failed");
164
+ process.exitCode = 1;
165
+ }
166
+ }
167
+ catch (error) {
168
+ logger_1.Logger.error(`Coverage execution failed: ${error.message}`);
169
+ process.exitCode = 1;
170
+ throw error;
171
+ }
172
+ });
173
+ //# sourceMappingURL=coverage.old.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage.old.js","sourceRoot":"","sources":["../../src/tasks/coverage.old.ts"],"names":[],"mappings":";;AAAA,2CAA6C;AAE7C,4CAAyC;AAEzC;;;;;;;;;GASG;AACH,IAAA,aAAI,EAAC,yBAAyB,EAAE,0CAA0C,CAAC;KACxE,QAAQ,CACP,aAAa,EACb,gCAAgC,EAChC,SAAS,EACT,cAAK,CAAC,MAAM,CACb;IACD,iBAAiB;KAChB,gBAAgB,CACf,QAAQ,EACR,6GAA6G,EAC7G,SAAS,EACT,cAAK,CAAC,MAAM,CACb;KACA,gBAAgB,CACf,YAAY,EACZ,6BAA6B,EAC7B,SAAS,EACT,cAAK,CAAC,MAAM,CACb;KACA,gBAAgB,CACf,aAAa,EACb,qBAAqB,EACrB,SAAS,EACT,cAAK,CAAC,MAAM,CACb;KACA,OAAO,CAAC,aAAa,EAAE,sCAAsC,CAAC;KAC9D,OAAO,CAAC,cAAc,EAAE,oCAAoC,CAAC;KAC7D,OAAO,CAAC,WAAW,EAAE,wCAAwC,CAAC;IAC/D,iBAAiB;KAChB,gBAAgB,CACf,WAAW,EACX,2CAA2C,EAC3C,SAAS,EACT,cAAK,CAAC,MAAM,CACb;KACA,gBAAgB,CACf,aAAa,EACb,kDAAkD,EAClD,SAAS,EACT,cAAK,CAAC,MAAM,CACb;KACA,gBAAgB,CACf,eAAe,EACf,mDAAmD,EACnD,SAAS,EACT,cAAK,CAAC,MAAM,CACb;KACA,gBAAgB,CACf,iBAAiB,EACjB,0DAA0D,EAC1D,SAAS,EACT,cAAK,CAAC,MAAM,CACb;KACA,gBAAgB,CACf,WAAW,EACX,wCAAwC,EACxC,SAAS,EACT,cAAK,CAAC,MAAM,CACb;KACA,gBAAgB,CACf,aAAa,EACb,+CAA+C,EAC/C,SAAS,EACT,cAAK,CAAC,MAAM,CACb;KACA,gBAAgB,CACf,iBAAiB,EACjB,0DAA0D,EAC1D,SAAS,EACT,cAAK,CAAC,MAAM,CACb;IACD,kBAAkB;KACjB,gBAAgB,CACf,WAAW,EACX,gDAAgD,EAChD,SAAS,EACT,cAAK,CAAC,GAAG,CACV;KACA,OAAO,CAAC,OAAO,EAAE,qBAAqB,CAAC;KACvC,OAAO,CAAC,MAAM,EAAE,uBAAuB,CAAC;KACxC,OAAO,CAAC,IAAI,EAAE,2BAA2B,CAAC;KAC1C,gBAAgB,CACf,OAAO,EACP,kCAAkC,EAClC,SAAS,EACT,cAAK,CAAC,MAAM,CACb;IACD,yBAAyB;KACxB,gBAAgB,CACf,SAAS,EACT,0BAA0B,EAC1B,SAAS,EACT,cAAK,CAAC,GAAG,CACV;KACA,gBAAgB,CACf,UAAU,EACV,qBAAqB,EACrB,SAAS,EACT,cAAK,CAAC,GAAG,CACV;KACA,gBAAgB,CACf,UAAU,EACV,0BAA0B,EAC1B,SAAS,EACT,cAAK,CAAC,MAAM,CACb;KACA,OAAO,CAAC,UAAU,EAAE,uBAAuB,CAAC;KAC5C,OAAO,CAAC,cAAc,EAAE,2BAA2B,CAAC;IACrD,cAAc;KACb,gBAAgB,CACf,iBAAiB,EACjB,iCAAiC,EACjC,SAAS,EACT,cAAK,CAAC,GAAG,CACV;KACA,gBAAgB,CACf,gBAAgB,EAChB,oCAAoC,EACpC,SAAS,EACT,cAAK,CAAC,MAAM,CACb;KACA,gBAAgB,CACf,QAAQ,EACR,qBAAqB,EACrB,SAAS,EACT,cAAK,CAAC,MAAM,CACb;KACA,OAAO,CAAC,KAAK,EAAE,sBAAsB,CAAC;IACvC,gBAAgB;KACf,OAAO,CAAC,OAAO,EAAE,8BAA8B,CAAC;KAChD,OAAO,CAAC,SAAS,EAAE,eAAe,CAAC;KACnC,OAAO,CAAC,UAAU,EAAE,2BAA2B,CAAC;KAChD,gBAAgB,CACf,eAAe,EACf,gBAAgB,EAChB,SAAS,EACT,cAAK,CAAC,GAAG,CACV;KACA,OAAO,CAAC,OAAO,EAAE,wBAAwB,CAAC;KAC1C,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,GAA8B,EAAE,EAAE;IAC5D,eAAM,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC;IAEtD,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC;IACzC,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;IAErC,+BAA+B;IAC/B,IAAI,CAAC,WAAW,EAAE;QAChB,eAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC3C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;KACR;IAED,eAAM,CAAC,IAAI,CAAC,YAAY,WAAW,EAAE,CAAC,CAAC;IACvC,eAAM,CAAC,IAAI,CAAC,YAAY,WAAW,EAAE,CAAC,CAAC;IAEvC,IAAI;QACF,2DAA2D;QAC3D,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,mCAAmC,CAAC,CAAC;QAChF,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,iCAAiC,CAAC,CAAC;QAE5E,oCAAoC;QACpC,eAAM,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC;QAExD,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAErD,MAAM,iBAAiB,CAAC,gBAAgB,CACtC,WAAW,EACX,WAAW,EACX,QAAQ,CAAC,KAAK,IAAI,KAAK,EACvB,KAAK,CAAC,kEAAkE;SACzE,CAAC;QAEF,2BAA2B;QAC3B,eAAM,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC;QAExD,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,aAAa,CACtD,WAAW,EACX,WAAW,CACZ,CAAC;QAEF,IAAI,CAAC,UAAU,EAAE;YACf,eAAM,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;YAC9D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;SACR;QAED,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC;QACrC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,cAAc,GAAG,UAAU,CAAC,sBAAsB,EAAE,CAAC;QAE3D,MAAM,eAAe,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,CAAC;QACjD,MAAM,eAAe,CAAC,yBAAyB,CAC7C,WAAW,EACX,WAAW,EACX,OAAO,EACP,cAAc,EACd,UAAU,CACX,CAAC;QAEF,uBAAuB;QACvB,eAAM,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC;QAEnD,iCAAiC;QACjC,gFAAgF;QAChF,IAAI,OAAe,CAAC;QACpB,IAAI,WAAW,KAAK,SAAS,EAAE;YAC7B,mCAAmC;YACnC,OAAO,GAAI,QAAgB,CAAC,gBAAgB,EAAE,QAAQ,EAAE,GAAG,IAAI,uBAAuB,CAAC;YACvF,eAAM,CAAC,IAAI,CAAC,gBAAgB,WAAW,KAAK,OAAO,EAAE,CAAC,CAAC;SACxD;aAAM;YACL,2CAA2C;YAC3C,mDAAmD;YACnD,OAAO,GAAG,uBAAuB,CAAC;YAClC,eAAM,CAAC,IAAI,CAAC,mBAAmB,WAAW,qCAAqC,OAAO,EAAE,CAAC,CAAC;YAC1F,eAAM,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;YACtE,eAAM,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;SACtE;QAED,mDAAmD;QACnD,MAAM,EAAE,sBAAsB,EAAE,GAAG,MAAM,MAAM,CAAC,wCAAwC,CAAC,CAAC;QAG1F,wCAAwC;QACxC,MAAM,OAAO,GAAoB;YAC/B,WAAW;YACX,OAAO;YAEP,iBAAiB;YACjB,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;YAChE,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,YAAY,EAAE,QAAQ,CAAC,YAAY;YACnC,SAAS,EAAE,QAAQ,CAAC,SAAS;YAE7B,iBAAiB;YACjB,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,aAAa,EAAE,QAAQ,CAAC,aAAa;YACrC,eAAe,EAAE,QAAQ,CAAC,eAAe;YACzC,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,eAAe,EAAE,QAAQ,CAAC,eAAe;YAEzC,kBAAkB;YAClB,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,KAAK,EAAE,QAAQ,CAAC,KAAgD;YAEhE,yBAAyB;YACzB,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,YAAY,EAAE,QAAQ,CAAC,YAAY;YAEnC,cAAc;YACd,eAAe,EAAE,QAAQ,CAAC,eAAe;YACzC,cAAc,EAAE,QAAQ,CAAC,cAAc;YACvC,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,GAAG,EAAE,QAAQ,CAAC,GAAG;YAEjB,gBAAgB;YAChB,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,aAAa,EAAE,QAAQ,CAAC,aAAa;YACrC,KAAK,EAAE,QAAQ,CAAC,KAAK;SACtB,CAAC;QAEF,eAAe;QACf,MAAM,SAAS,GAAG,IAAI,sBAAsB,CAAC,GAAG,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAErD,IAAI,OAAO,EAAE;YACX,eAAM,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;YAC7C,eAAM,CAAC,OAAO,CAAC,2CAA2C,CAAC,CAAC;YAC5D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;SACtB;aAAM;YACL,eAAM,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;YAC7C,eAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YACzC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;SACtB;KACF;IAAC,OAAO,KAAU,EAAE;QACnB,eAAM,CAAC,KAAK,CAAC,8BAA8B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,MAAM,KAAK,CAAC;KACb;AACH,CAAC,CAAC,CAAC","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 */\ntask(\"diamonds-forge:coverage\", \"Run forge coverage for Diamond contracts\")\n .addParam(\n \"diamondName\",\n \"Name of the Diamond to analyze\",\n undefined,\n types.string\n )\n // Report options\n .addOptionalParam(\n \"report\",\n \"Report type (summary, lcov, debug, bytecode) - can be used multiple times by passing comma-separated values\",\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\",\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 (--match-test)\",\n undefined,\n types.string\n )\n .addOptionalParam(\n \"noMatchTest\",\n \"Exclude tests matching pattern (--no-match-test)\",\n undefined,\n types.string\n )\n .addOptionalParam(\n \"matchContract\",\n \"Run contracts matching pattern (--match-contract)\",\n undefined,\n types.string\n )\n .addOptionalParam(\n \"noMatchContract\",\n \"Exclude contracts matching pattern (--no-match-contract)\",\n undefined,\n types.string\n )\n .addOptionalParam(\n \"matchPath\",\n \"Run files matching glob (--match-path)\",\n undefined,\n types.string\n )\n .addOptionalParam(\n \"noMatchPath\",\n \"Exclude files matching glob (--no-match-path)\",\n undefined,\n types.string\n )\n .addOptionalParam(\n \"noMatchCoverage\",\n \"Exclude files from coverage report (--no-match-coverage)\",\n undefined,\n types.string\n )\n // Display options\n .addOptionalParam(\n \"verbosity\",\n \"Verbosity level (1-5, more v's = more verbose)\",\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 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 .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 // Validate required parameters\n if (!diamondName) {\n Logger.error(\"--diamond-name is required\");\n process.exitCode = 1;\n return;\n }\n\n Logger.info(`Diamond: ${diamondName}`);\n Logger.info(`Network: ${networkName}`);\n\n try {\n // Lazy-load framework classes to avoid circular dependency\n const { DeploymentManager } = await import(\"../framework/DeploymentManager.js\");\n const { HelperGenerator } = await import(\"../framework/HelperGenerator.js\");\n\n // Step 1: Ensure Diamond deployment\n Logger.section(\"Step 1/3: Ensuring Diamond Deployment\");\n \n const deploymentManager = new DeploymentManager(hre);\n \n await deploymentManager.ensureDeployment(\n diamondName,\n networkName,\n taskArgs.force || false,\n false // Don't write deployment data for coverage (ephemeral by default)\n );\n\n // Step 2: Generate helpers\n Logger.section(\"Step 2/3: Generating Solidity Helpers\");\n \n const deployment = await deploymentManager.getDeployment(\n diamondName,\n networkName\n );\n\n if (!deployment) {\n Logger.error(\"No deployment found. Cannot generate helpers.\");\n process.exitCode = 1;\n return;\n }\n\n const provider = hre.ethers.provider;\n const network = await provider.getNetwork();\n const chainId = Number(network.chainId);\n const deploymentData = deployment.getDeployedDiamondData();\n\n const helperGenerator = new HelperGenerator(hre);\n await helperGenerator.generateDeploymentHelpers(\n diamondName,\n networkName,\n chainId,\n deploymentData,\n deployment\n );\n\n // Step 3: Run coverage\n Logger.section(\"Step 3/3: Running Forge Coverage\");\n\n // Construct fork URL for network\n // Coverage requires forking from a running network to access deployed contracts\n let forkUrl: string;\n if (networkName !== \"hardhat\") {\n // Use the configured network's URL\n forkUrl = (provider as any)._hardhatProvider?._wrapped?.url || \"http://127.0.0.1:8545\";\n Logger.info(`Forking from ${networkName}: ${forkUrl}`);\n } else {\n // Default to localhost for hardhat network\n // This assumes user has `npx hardhat node` running\n forkUrl = \"http://127.0.0.1:8545\";\n Logger.warn(`⚠️ Network is \"${networkName}\" - defaulting to localhost fork: ${forkUrl}`);\n Logger.warn(`💡 Make sure Hardhat node is running: npx hardhat node`);\n Logger.warn(`💡 Or specify network explicitly: --network localhost`);\n }\n\n // Lazy-load framework to avoid circular dependency\n const { ForgeCoverageFramework } = await import(\"../framework/ForgeCoverageFramework.js\");\n type CoverageOptions = Parameters<InstanceType<typeof ForgeCoverageFramework>[\"runCoverage\"]>[0];\n\n // Build coverage options from task args\n const options: CoverageOptions = {\n // Fork URL\n forkUrl,\n\n // Report options\n report: taskArgs.report ? taskArgs.report.split(\",\") : undefined,\n reportFile: taskArgs.reportFile,\n lcovVersion: taskArgs.lcovVersion,\n includeLibs: taskArgs.includeLibs,\n excludeTests: taskArgs.excludeTests,\n irMinimum: taskArgs.irMinimum,\n\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\n // Display options\n verbosity: taskArgs.verbosity,\n quiet: taskArgs.quiet,\n json: taskArgs.json,\n md: taskArgs.md,\n color: taskArgs.color as \"auto\" | \"always\" | \"never\" | undefined,\n\n // Test execution options\n threads: taskArgs.threads,\n fuzzRuns: taskArgs.fuzzRuns,\n fuzzSeed: taskArgs.fuzzSeed,\n failFast: taskArgs.failFast,\n allowFailure: taskArgs.allowFailure,\n\n // EVM options\n forkBlockNumber: taskArgs.forkBlockNumber,\n initialBalance: taskArgs.initialBalance,\n sender: taskArgs.sender,\n ffi: taskArgs.ffi,\n\n // Build options\n force: taskArgs.force,\n noCache: taskArgs.noCache,\n optimize: taskArgs.optimize,\n optimizerRuns: taskArgs.optimizerRuns,\n viaIr: taskArgs.viaIr,\n };\n\n // Run coverage\n const framework = new ForgeCoverageFramework(hre);\n const success = await framework.runCoverage(options);\n\n if (success) {\n Logger.section(\"Coverage Analysis Complete\");\n Logger.success(\"Coverage analysis 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"]}
@@ -49,8 +49,19 @@ export type ColorMode = "auto" | "always" | "never";
49
49
  /**
50
50
  * Coverage options for forge coverage command
51
51
  * Maps to all available forge coverage command-line options
52
+ * Plus orchestration options for Diamond deployment and helpers
52
53
  */
53
54
  export interface CoverageOptions {
55
+ /** Name of the Diamond to analyze */
56
+ diamondName?: string;
57
+ /** Network name for deployment (hardhat, localhost, etc.) */
58
+ networkName?: string;
59
+ /** Skip Diamond deployment step */
60
+ skipDeployment?: boolean;
61
+ /** Skip helper generation step */
62
+ skipHelpers?: boolean;
63
+ /** Write deployment data to file for reuse */
64
+ writeDeployedDiamondData?: boolean;
54
65
  /** Report type(s) - can specify multiple */
55
66
  report?: CoverageReportType[];
56
67
  /** Output path for report file */
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAwCH;;GAEG;AACU,QAAA,cAAc,GAAoC;IAC7D,UAAU,EAAE,sBAAsB;IAClC,gBAAgB,EAAE,IAAI;IACtB,YAAY,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,CAAC;IAC7C,cAAc,EAAE,SAAS;IACzB,eAAe,EAAE,IAAI;IACrB,aAAa,EAAE,EAAE;CAClB,CAAC","sourcesContent":["/**\n * Configuration types for diamonds-hardhat-foundry plugin\n * Will be fully implemented in Task 2.1\n */\n\nexport interface DiamondsFoundryConfig {\n /**\n * Output directory for generated helpers (relative to project root)\n * @default \"test/foundry/helpers\"\n */\n helpersDir?: string;\n\n /**\n * Whether to generate example tests on init\n * @default true\n */\n generateExamples?: boolean;\n\n /**\n * Example test templates to generate\n * @default [\"unit\", \"integration\", \"fuzz\"]\n */\n exampleTests?: Array<\"unit\" | \"integration\" | \"fuzz\">;\n\n /**\n * Default network for deployments\n * @default \"hardhat\"\n */\n defaultNetwork?: string;\n\n /**\n * Whether to reuse existing deployment or deploy fresh\n * @default true\n */\n reuseDeployment?: boolean;\n\n /**\n * Additional forge test arguments\n * @default []\n */\n forgeTestArgs?: string[];\n}\n\n/**\n * Default configuration values\n */\nexport const DEFAULT_CONFIG: Required<DiamondsFoundryConfig> = {\n helpersDir: \"test/foundry/helpers\",\n generateExamples: true,\n exampleTests: [\"unit\", \"integration\", \"fuzz\"],\n defaultNetwork: \"hardhat\",\n reuseDeployment: true,\n forgeTestArgs: [],\n};\n\n/**\n * Type for forge coverage report formats\n */\nexport type CoverageReportType = \"summary\" | \"lcov\" | \"debug\" | \"bytecode\";\n\n/**\n * Type for color output modes\n */\nexport type ColorMode = \"auto\" | \"always\" | \"never\";\n\n/**\n * Coverage options for forge coverage command\n * Maps to all available forge coverage command-line options\n */\nexport interface CoverageOptions {\n // Report options\n /** Report type(s) - can specify multiple */\n report?: CoverageReportType[];\n /** Output path for report file */\n reportFile?: string;\n /** LCOV format version (default: 1) */\n lcovVersion?: string;\n /** Include libraries in coverage report */\n includeLibs?: boolean;\n /** Exclude tests from coverage report */\n excludeTests?: boolean;\n /** Enable viaIR with minimum optimization */\n irMinimum?: boolean;\n\n // Test filtering\n /** Run tests matching regex pattern */\n matchTest?: string;\n /** Exclude tests matching regex pattern */\n noMatchTest?: string;\n /** Run contracts matching regex pattern */\n matchContract?: string;\n /** Exclude contracts matching regex pattern */\n noMatchContract?: string;\n /** Run files matching glob pattern */\n matchPath?: string;\n /** Exclude files matching glob pattern */\n noMatchPath?: string;\n /** Exclude files from coverage report matching regex */\n noMatchCoverage?: string;\n\n // Display options\n /** Verbosity level (1-5) - more v's = more verbose */\n verbosity?: number;\n /** Suppress log output */\n quiet?: boolean;\n /** Format output as JSON */\n json?: boolean;\n /** Format output as Markdown */\n md?: boolean;\n /** Color output mode */\n color?: ColorMode;\n\n // Test execution options\n /** Number of threads to use for parallel execution */\n threads?: number;\n /** Number of fuzz test runs */\n fuzzRuns?: number;\n /** Seed for fuzz test randomness (for reproducibility) */\n fuzzSeed?: string;\n /** Stop running tests after first failure */\n failFast?: boolean;\n /** Exit with code 0 even if tests fail */\n allowFailure?: boolean;\n\n // EVM options\n /** Fork URL for network state */\n forkUrl?: string;\n /** Fork from specific block number */\n forkBlockNumber?: number;\n /** Initial balance for deployed test contracts */\n initialBalance?: string;\n /** Address to use as test sender */\n sender?: string;\n /** Enable FFI (Foreign Function Interface) cheatcode */\n ffi?: boolean;\n\n // Build options\n /** Force recompilation and cache clearing */\n force?: boolean;\n /** Disable compiler cache */\n noCache?: boolean;\n /** Enable Solidity optimizer */\n optimize?: boolean;\n /** Number of optimizer runs */\n optimizerRuns?: number;\n /** Use Yul intermediate representation compilation */\n viaIr?: boolean;\n}\n"]}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAwCH;;GAEG;AACU,QAAA,cAAc,GAAoC;IAC7D,UAAU,EAAE,sBAAsB;IAClC,gBAAgB,EAAE,IAAI;IACtB,YAAY,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,CAAC;IAC7C,cAAc,EAAE,SAAS;IACzB,eAAe,EAAE,IAAI;IACrB,aAAa,EAAE,EAAE;CAClB,CAAC","sourcesContent":["/**\n * Configuration types for diamonds-hardhat-foundry plugin\n * Will be fully implemented in Task 2.1\n */\n\nexport interface DiamondsFoundryConfig {\n /**\n * Output directory for generated helpers (relative to project root)\n * @default \"test/foundry/helpers\"\n */\n helpersDir?: string;\n\n /**\n * Whether to generate example tests on init\n * @default true\n */\n generateExamples?: boolean;\n\n /**\n * Example test templates to generate\n * @default [\"unit\", \"integration\", \"fuzz\"]\n */\n exampleTests?: Array<\"unit\" | \"integration\" | \"fuzz\">;\n\n /**\n * Default network for deployments\n * @default \"hardhat\"\n */\n defaultNetwork?: string;\n\n /**\n * Whether to reuse existing deployment or deploy fresh\n * @default true\n */\n reuseDeployment?: boolean;\n\n /**\n * Additional forge test arguments\n * @default []\n */\n forgeTestArgs?: string[];\n}\n\n/**\n * Default configuration values\n */\nexport const DEFAULT_CONFIG: Required<DiamondsFoundryConfig> = {\n helpersDir: \"test/foundry/helpers\",\n generateExamples: true,\n exampleTests: [\"unit\", \"integration\", \"fuzz\"],\n defaultNetwork: \"hardhat\",\n reuseDeployment: true,\n forgeTestArgs: [],\n};\n\n/**\n * Type for forge coverage report formats\n */\nexport type CoverageReportType = \"summary\" | \"lcov\" | \"debug\" | \"bytecode\";\n\n/**\n * Type for color output modes\n */\nexport type ColorMode = \"auto\" | \"always\" | \"never\";\n\n/**\n * Coverage options for forge coverage command\n * Maps to all available forge coverage command-line options\n * Plus orchestration options for Diamond deployment and helpers\n */\nexport interface CoverageOptions {\n // Orchestration options (matching ForgeFuzzingFramework pattern)\n /** Name of the Diamond to analyze */\n diamondName?: string;\n /** Network name for deployment (hardhat, localhost, etc.) */\n networkName?: string;\n /** Skip Diamond deployment step */\n skipDeployment?: boolean;\n /** Skip helper generation step */\n skipHelpers?: boolean;\n /** Write deployment data to file for reuse */\n writeDeployedDiamondData?: boolean;\n\n // Report options\n /** Report type(s) - can specify multiple */\n report?: CoverageReportType[];\n /** Output path for report file */\n reportFile?: string;\n /** LCOV format version (default: 1) */\n lcovVersion?: string;\n /** Include libraries in coverage report */\n includeLibs?: boolean;\n /** Exclude tests from coverage report */\n excludeTests?: boolean;\n /** Enable viaIR with minimum optimization */\n irMinimum?: boolean;\n\n // Test filtering\n /** Run tests matching regex pattern */\n matchTest?: string;\n /** Exclude tests matching regex pattern */\n noMatchTest?: string;\n /** Run contracts matching regex pattern */\n matchContract?: string;\n /** Exclude contracts matching regex pattern */\n noMatchContract?: string;\n /** Run files matching glob pattern */\n matchPath?: string;\n /** Exclude files matching glob pattern */\n noMatchPath?: string;\n /** Exclude files from coverage report matching regex */\n noMatchCoverage?: string;\n\n // Display options\n /** Verbosity level (1-5) - more v's = more verbose */\n verbosity?: number;\n /** Suppress log output */\n quiet?: boolean;\n /** Format output as JSON */\n json?: boolean;\n /** Format output as Markdown */\n md?: boolean;\n /** Color output mode */\n color?: ColorMode;\n\n // Test execution options\n /** Number of threads to use for parallel execution */\n threads?: number;\n /** Number of fuzz test runs */\n fuzzRuns?: number;\n /** Seed for fuzz test randomness (for reproducibility) */\n fuzzSeed?: string;\n /** Stop running tests after first failure */\n failFast?: boolean;\n /** Exit with code 0 even if tests fail */\n allowFailure?: boolean;\n\n // EVM options\n /** Fork URL for network state */\n forkUrl?: string;\n /** Fork from specific block number */\n forkBlockNumber?: number;\n /** Initial balance for deployed test contracts */\n initialBalance?: string;\n /** Address to use as test sender */\n sender?: string;\n /** Enable FFI (Foreign Function Interface) cheatcode */\n ffi?: boolean;\n\n // Build options\n /** Force recompilation and cache clearing */\n force?: boolean;\n /** Disable compiler cache */\n noCache?: boolean;\n /** Enable Solidity optimizer */\n optimize?: boolean;\n /** Number of optimizer runs */\n optimizerRuns?: number;\n /** Use Yul intermediate representation compilation */\n viaIr?: boolean;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@diamondslab/diamonds-hardhat-foundry",
3
- "version": "2.3.0",
3
+ "version": "2.4.0",
4
4
  "description": "Hardhat plugin that integrates Foundry testing with Diamond proxy contracts, providing deployment helpers and fuzzing support",
5
5
  "repository": {
6
6
  "type": "git",