moonwall 1.0.0-dev.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.
Files changed (301) hide show
  1. package/LICENSE +681 -0
  2. package/README.md +54 -0
  3. package/config_schema.json +811 -0
  4. package/dist/api/constants/accounts.d.ts +36 -0
  5. package/dist/api/constants/accounts.d.ts.map +1 -0
  6. package/dist/api/constants/accounts.js +67 -0
  7. package/dist/api/constants/chain.d.ts +134 -0
  8. package/dist/api/constants/chain.d.ts.map +1 -0
  9. package/dist/api/constants/chain.js +149 -0
  10. package/dist/api/constants/index.d.ts +4 -0
  11. package/dist/api/constants/index.d.ts.map +1 -0
  12. package/dist/api/constants/index.js +3 -0
  13. package/dist/api/constants/smartContract.d.ts +29 -0
  14. package/dist/api/constants/smartContract.d.ts.map +1 -0
  15. package/dist/api/constants/smartContract.js +118 -0
  16. package/dist/api/testing/blocks.d.ts +59 -0
  17. package/dist/api/testing/blocks.d.ts.map +1 -0
  18. package/dist/api/testing/blocks.js +147 -0
  19. package/dist/api/testing/contracts.d.ts +5 -0
  20. package/dist/api/testing/contracts.d.ts.map +1 -0
  21. package/dist/api/testing/contracts.js +32 -0
  22. package/dist/api/testing/ethers.d.ts +3 -0
  23. package/dist/api/testing/ethers.d.ts.map +1 -0
  24. package/dist/api/testing/ethers.js +38 -0
  25. package/dist/api/testing/events.d.ts +12 -0
  26. package/dist/api/testing/events.d.ts.map +1 -0
  27. package/dist/api/testing/events.js +23 -0
  28. package/dist/api/testing/extrinsics.d.ts +5 -0
  29. package/dist/api/testing/extrinsics.d.ts.map +1 -0
  30. package/dist/api/testing/extrinsics.js +10 -0
  31. package/dist/api/testing/index.d.ts +9 -0
  32. package/dist/api/testing/index.d.ts.map +1 -0
  33. package/dist/api/testing/index.js +8 -0
  34. package/dist/api/testing/jumping.d.ts +8 -0
  35. package/dist/api/testing/jumping.d.ts.map +1 -0
  36. package/dist/api/testing/jumping.js +78 -0
  37. package/dist/api/testing/providers.d.ts +18 -0
  38. package/dist/api/testing/providers.d.ts.map +1 -0
  39. package/dist/api/testing/providers.js +34 -0
  40. package/dist/api/testing/viem.d.ts +139 -0
  41. package/dist/api/testing/viem.d.ts.map +1 -0
  42. package/dist/api/testing/viem.js +247 -0
  43. package/dist/api/types/config.d.ts +609 -0
  44. package/dist/api/types/config.d.ts.map +1 -0
  45. package/dist/api/types/config.js +1 -0
  46. package/dist/api/types/context.d.ts +125 -0
  47. package/dist/api/types/context.d.ts.map +1 -0
  48. package/dist/api/types/context.js +1 -0
  49. package/dist/api/types/contracts.d.ts +66 -0
  50. package/dist/api/types/contracts.d.ts.map +1 -0
  51. package/dist/api/types/contracts.js +1 -0
  52. package/dist/api/types/eth.d.ts +3 -0
  53. package/dist/api/types/eth.d.ts.map +1 -0
  54. package/dist/api/types/eth.js +1 -0
  55. package/dist/api/types/foundations.d.ts +11 -0
  56. package/dist/api/types/foundations.d.ts.map +1 -0
  57. package/dist/api/types/foundations.js +1 -0
  58. package/dist/api/types/helpers.d.ts +7 -0
  59. package/dist/api/types/helpers.d.ts.map +1 -0
  60. package/dist/api/types/helpers.js +1 -0
  61. package/dist/api/types/index.d.ts +8 -0
  62. package/dist/api/types/index.d.ts.map +1 -0
  63. package/dist/api/types/index.js +7 -0
  64. package/dist/api/types/runner.d.ts +490 -0
  65. package/dist/api/types/runner.d.ts.map +1 -0
  66. package/dist/api/types/runner.js +1 -0
  67. package/dist/cli/cmds/components/LogViewer.d.ts +17 -0
  68. package/dist/cli/cmds/components/LogViewer.d.ts.map +1 -0
  69. package/dist/cli/cmds/components/LogViewer.js +171 -0
  70. package/dist/cli/cmds/entrypoint.d.ts +6 -0
  71. package/dist/cli/cmds/entrypoint.d.ts.map +1 -0
  72. package/dist/cli/cmds/entrypoint.js +192 -0
  73. package/dist/cli/cmds/interactiveCmds/chopsticksIntCmds.d.ts +2 -0
  74. package/dist/cli/cmds/interactiveCmds/chopsticksIntCmds.d.ts.map +1 -0
  75. package/dist/cli/cmds/interactiveCmds/chopsticksIntCmds.js +117 -0
  76. package/dist/cli/cmds/interactiveCmds/devIntCmds.d.ts +2 -0
  77. package/dist/cli/cmds/interactiveCmds/devIntCmds.d.ts.map +1 -0
  78. package/dist/cli/cmds/interactiveCmds/devIntCmds.js +103 -0
  79. package/dist/cli/cmds/interactiveCmds/index.d.ts +4 -0
  80. package/dist/cli/cmds/interactiveCmds/index.d.ts.map +1 -0
  81. package/dist/cli/cmds/interactiveCmds/index.js +3 -0
  82. package/dist/cli/cmds/interactiveCmds/zombieIntCmds.d.ts +2 -0
  83. package/dist/cli/cmds/interactiveCmds/zombieIntCmds.d.ts.map +1 -0
  84. package/dist/cli/cmds/interactiveCmds/zombieIntCmds.js +32 -0
  85. package/dist/cli/cmds/main.d.ts +2 -0
  86. package/dist/cli/cmds/main.d.ts.map +1 -0
  87. package/dist/cli/cmds/main.js +336 -0
  88. package/dist/cli/cmds/runNetwork.d.ts +3 -0
  89. package/dist/cli/cmds/runNetwork.d.ts.map +1 -0
  90. package/dist/cli/cmds/runNetwork.js +292 -0
  91. package/dist/cli/cmds/runTests.d.ts +12 -0
  92. package/dist/cli/cmds/runTests.d.ts.map +1 -0
  93. package/dist/cli/cmds/runTests.js +257 -0
  94. package/dist/cli/internal/cmdFunctions/downloader.d.ts +4 -0
  95. package/dist/cli/internal/cmdFunctions/downloader.d.ts.map +1 -0
  96. package/dist/cli/internal/cmdFunctions/downloader.js +49 -0
  97. package/dist/cli/internal/cmdFunctions/fetchArtifact.d.ts +10 -0
  98. package/dist/cli/internal/cmdFunctions/fetchArtifact.d.ts.map +1 -0
  99. package/dist/cli/internal/cmdFunctions/fetchArtifact.js +145 -0
  100. package/dist/cli/internal/cmdFunctions/index.d.ts +5 -0
  101. package/dist/cli/internal/cmdFunctions/index.d.ts.map +1 -0
  102. package/dist/cli/internal/cmdFunctions/index.js +4 -0
  103. package/dist/cli/internal/cmdFunctions/initialisation.d.ts +20 -0
  104. package/dist/cli/internal/cmdFunctions/initialisation.d.ts.map +1 -0
  105. package/dist/cli/internal/cmdFunctions/initialisation.js +150 -0
  106. package/dist/cli/internal/cmdFunctions/tempLogs.d.ts +3 -0
  107. package/dist/cli/internal/cmdFunctions/tempLogs.d.ts.map +1 -0
  108. package/dist/cli/internal/cmdFunctions/tempLogs.js +37 -0
  109. package/dist/cli/internal/commandParsers.d.ts +59 -0
  110. package/dist/cli/internal/commandParsers.d.ts.map +1 -0
  111. package/dist/cli/internal/commandParsers.js +305 -0
  112. package/dist/cli/internal/deriveTestIds.d.ts +8 -0
  113. package/dist/cli/internal/deriveTestIds.d.ts.map +1 -0
  114. package/dist/cli/internal/deriveTestIds.js +123 -0
  115. package/dist/cli/internal/effect/index.d.ts +6 -0
  116. package/dist/cli/internal/effect/index.d.ts.map +1 -0
  117. package/dist/cli/internal/effect/index.js +5 -0
  118. package/dist/cli/internal/fileCheckers.d.ts +11 -0
  119. package/dist/cli/internal/fileCheckers.d.ts.map +1 -0
  120. package/dist/cli/internal/fileCheckers.js +165 -0
  121. package/dist/cli/internal/foundations/index.d.ts +4 -0
  122. package/dist/cli/internal/foundations/index.d.ts.map +1 -0
  123. package/dist/cli/internal/foundations/index.js +4 -0
  124. package/dist/cli/internal/index.d.ts +12 -0
  125. package/dist/cli/internal/index.d.ts.map +1 -0
  126. package/dist/cli/internal/index.js +11 -0
  127. package/dist/cli/internal/launcherCommon.d.ts +4 -0
  128. package/dist/cli/internal/launcherCommon.d.ts.map +1 -0
  129. package/dist/cli/internal/launcherCommon.js +130 -0
  130. package/dist/cli/internal/localNode.d.ts +16 -0
  131. package/dist/cli/internal/localNode.d.ts.map +1 -0
  132. package/dist/cli/internal/localNode.js +362 -0
  133. package/dist/cli/internal/logging.d.ts +2 -0
  134. package/dist/cli/internal/logging.d.ts.map +1 -0
  135. package/dist/cli/internal/logging.js +26 -0
  136. package/dist/cli/internal/node.d.ts +33 -0
  137. package/dist/cli/internal/node.d.ts.map +1 -0
  138. package/dist/cli/internal/node.js +228 -0
  139. package/dist/cli/internal/processHelpers.d.ts +17 -0
  140. package/dist/cli/internal/processHelpers.d.ts.map +1 -0
  141. package/dist/cli/internal/processHelpers.js +56 -0
  142. package/dist/cli/internal/providerFactories.d.ts +48 -0
  143. package/dist/cli/internal/providerFactories.d.ts.map +1 -0
  144. package/dist/cli/internal/providerFactories.js +442 -0
  145. package/dist/cli/internal/testIdParser.d.ts +34 -0
  146. package/dist/cli/internal/testIdParser.d.ts.map +1 -0
  147. package/dist/cli/internal/testIdParser.js +167 -0
  148. package/dist/cli/lib/binariesHelpers.d.ts +15 -0
  149. package/dist/cli/lib/binariesHelpers.d.ts.map +1 -0
  150. package/dist/cli/lib/binariesHelpers.js +99 -0
  151. package/dist/cli/lib/configReader.d.ts +8 -0
  152. package/dist/cli/lib/configReader.d.ts.map +1 -0
  153. package/dist/cli/lib/configReader.js +115 -0
  154. package/dist/cli/lib/contractFunctions.d.ts +2 -0
  155. package/dist/cli/lib/contractFunctions.d.ts.map +1 -0
  156. package/dist/cli/lib/contractFunctions.js +2 -0
  157. package/dist/cli/lib/globalContext.d.ts +46 -0
  158. package/dist/cli/lib/globalContext.d.ts.map +1 -0
  159. package/dist/cli/lib/globalContext.js +710 -0
  160. package/dist/cli/lib/governanceProcedures.d.ts +27 -0
  161. package/dist/cli/lib/governanceProcedures.d.ts.map +1 -0
  162. package/dist/cli/lib/governanceProcedures.js +458 -0
  163. package/dist/cli/lib/handlers/index.d.ts +5 -0
  164. package/dist/cli/lib/handlers/index.d.ts.map +1 -0
  165. package/dist/cli/lib/handlers/index.js +5 -0
  166. package/dist/cli/lib/repoDefinitions/index.d.ts +6 -0
  167. package/dist/cli/lib/repoDefinitions/index.d.ts.map +1 -0
  168. package/dist/cli/lib/repoDefinitions/index.js +21 -0
  169. package/dist/cli/lib/repoDefinitions/moonbeam.d.ts +4 -0
  170. package/dist/cli/lib/repoDefinitions/moonbeam.d.ts.map +1 -0
  171. package/dist/cli/lib/repoDefinitions/moonbeam.js +30 -0
  172. package/dist/cli/lib/repoDefinitions/polkadot.d.ts +4 -0
  173. package/dist/cli/lib/repoDefinitions/polkadot.d.ts.map +1 -0
  174. package/dist/cli/lib/repoDefinitions/polkadot.js +11 -0
  175. package/dist/cli/lib/repoDefinitions/tanssi.d.ts +4 -0
  176. package/dist/cli/lib/repoDefinitions/tanssi.d.ts.map +1 -0
  177. package/dist/cli/lib/repoDefinitions/tanssi.js +14 -0
  178. package/dist/cli/lib/rpcFunctions.d.ts +2 -0
  179. package/dist/cli/lib/rpcFunctions.d.ts.map +1 -0
  180. package/dist/cli/lib/rpcFunctions.js +26 -0
  181. package/dist/cli/lib/runnerContext.d.ts +32 -0
  182. package/dist/cli/lib/runnerContext.d.ts.map +1 -0
  183. package/dist/cli/lib/runnerContext.js +156 -0
  184. package/dist/cli/lib/shardManager.d.ts +40 -0
  185. package/dist/cli/lib/shardManager.d.ts.map +1 -0
  186. package/dist/cli/lib/shardManager.js +80 -0
  187. package/dist/cli/lib/upgradeProcedures.d.ts +5 -0
  188. package/dist/cli/lib/upgradeProcedures.d.ts.map +1 -0
  189. package/dist/cli/lib/upgradeProcedures.js +221 -0
  190. package/dist/cli.d.ts +4 -0
  191. package/dist/cli.d.ts.map +1 -0
  192. package/dist/cli.js +3 -0
  193. package/dist/contracts/contractInteraction.d.ts +17 -0
  194. package/dist/contracts/contractInteraction.d.ts.map +1 -0
  195. package/dist/contracts/contractInteraction.js +170 -0
  196. package/dist/contracts/index.d.ts +2 -0
  197. package/dist/contracts/index.d.ts.map +1 -0
  198. package/dist/contracts/index.js +1 -0
  199. package/dist/foundations/chopsticks/handler.d.ts +3 -0
  200. package/dist/foundations/chopsticks/handler.d.ts.map +1 -0
  201. package/dist/foundations/chopsticks/handler.js +93 -0
  202. package/dist/foundations/chopsticks/helpers.d.ts +27 -0
  203. package/dist/foundations/chopsticks/helpers.d.ts.map +1 -0
  204. package/dist/foundations/chopsticks/helpers.js +133 -0
  205. package/dist/foundations/dev/handler.d.ts +3 -0
  206. package/dist/foundations/dev/handler.d.ts.map +1 -0
  207. package/dist/foundations/dev/handler.js +136 -0
  208. package/dist/foundations/dev/helpers.d.ts +27 -0
  209. package/dist/foundations/dev/helpers.d.ts.map +1 -0
  210. package/dist/foundations/dev/helpers.js +161 -0
  211. package/dist/foundations/read-only/handler.d.ts +3 -0
  212. package/dist/foundations/read-only/handler.d.ts.map +1 -0
  213. package/dist/foundations/read-only/handler.js +32 -0
  214. package/dist/foundations/zombie/handler.d.ts +3 -0
  215. package/dist/foundations/zombie/handler.d.ts.map +1 -0
  216. package/dist/foundations/zombie/handler.js +92 -0
  217. package/dist/foundations/zombie/helpers.d.ts +16 -0
  218. package/dist/foundations/zombie/helpers.d.ts.map +1 -0
  219. package/dist/foundations/zombie/helpers.js +97 -0
  220. package/dist/index.d.ts +17 -0
  221. package/dist/index.d.ts.map +1 -0
  222. package/dist/index.js +47 -0
  223. package/dist/internal/common.d.ts +3 -0
  224. package/dist/internal/common.d.ts.map +1 -0
  225. package/dist/internal/common.js +41 -0
  226. package/dist/internal/index.d.ts +4 -0
  227. package/dist/internal/index.d.ts.map +1 -0
  228. package/dist/internal/index.js +3 -0
  229. package/dist/internal/logger.d.ts +24 -0
  230. package/dist/internal/logger.d.ts.map +1 -0
  231. package/dist/internal/logger.js +66 -0
  232. package/dist/internal/logging.d.ts +7 -0
  233. package/dist/internal/logging.d.ts.map +1 -0
  234. package/dist/internal/logging.js +36 -0
  235. package/dist/moondebug.d.ts +3 -0
  236. package/dist/moondebug.d.ts.map +1 -0
  237. package/dist/moondebug.js +2 -0
  238. package/dist/services/cache/FileLock.d.ts +11 -0
  239. package/dist/services/cache/FileLock.d.ts.map +1 -0
  240. package/dist/services/cache/FileLock.js +68 -0
  241. package/dist/services/cache/StartupCacheService.d.ts +23 -0
  242. package/dist/services/cache/StartupCacheService.d.ts.map +1 -0
  243. package/dist/services/cache/StartupCacheService.js +159 -0
  244. package/dist/services/cache/index.d.ts +3 -0
  245. package/dist/services/cache/index.d.ts.map +1 -0
  246. package/dist/services/cache/index.js +2 -0
  247. package/dist/services/chopsticks/ChopsticksMultiChain.d.ts +158 -0
  248. package/dist/services/chopsticks/ChopsticksMultiChain.d.ts.map +1 -0
  249. package/dist/services/chopsticks/ChopsticksMultiChain.js +282 -0
  250. package/dist/services/chopsticks/ChopsticksService.d.ts +313 -0
  251. package/dist/services/chopsticks/ChopsticksService.d.ts.map +1 -0
  252. package/dist/services/chopsticks/ChopsticksService.js +77 -0
  253. package/dist/services/chopsticks/chopsticksConfigParser.d.ts +40 -0
  254. package/dist/services/chopsticks/chopsticksConfigParser.d.ts.map +1 -0
  255. package/dist/services/chopsticks/chopsticksConfigParser.js +201 -0
  256. package/dist/services/chopsticks/index.d.ts +5 -0
  257. package/dist/services/chopsticks/index.d.ts.map +1 -0
  258. package/dist/services/chopsticks/index.js +4 -0
  259. package/dist/services/chopsticks/launchChopsticksEffect.d.ts +225 -0
  260. package/dist/services/chopsticks/launchChopsticksEffect.d.ts.map +1 -0
  261. package/dist/services/chopsticks/launchChopsticksEffect.js +623 -0
  262. package/dist/services/config/configAccessors.d.ts +41 -0
  263. package/dist/services/config/configAccessors.d.ts.map +1 -0
  264. package/dist/services/config/configAccessors.js +149 -0
  265. package/dist/services/config/index.d.ts +2 -0
  266. package/dist/services/config/index.d.ts.map +1 -0
  267. package/dist/services/config/index.js +1 -0
  268. package/dist/services/errors.d.ts +72 -0
  269. package/dist/services/errors.d.ts.map +1 -0
  270. package/dist/services/errors.js +31 -0
  271. package/dist/services/index.d.ts +7 -0
  272. package/dist/services/index.d.ts.map +1 -0
  273. package/dist/services/index.js +6 -0
  274. package/dist/services/network/NodeReadinessService.d.ts +35 -0
  275. package/dist/services/network/NodeReadinessService.d.ts.map +1 -0
  276. package/dist/services/network/NodeReadinessService.js +120 -0
  277. package/dist/services/network/PortDiscoveryService.d.ts +22 -0
  278. package/dist/services/network/PortDiscoveryService.d.ts.map +1 -0
  279. package/dist/services/network/PortDiscoveryService.js +77 -0
  280. package/dist/services/network/RpcPortDiscoveryService.d.ts +25 -0
  281. package/dist/services/network/RpcPortDiscoveryService.d.ts.map +1 -0
  282. package/dist/services/network/RpcPortDiscoveryService.js +136 -0
  283. package/dist/services/network/index.d.ts +4 -0
  284. package/dist/services/network/index.d.ts.map +1 -0
  285. package/dist/services/network/index.js +3 -0
  286. package/dist/services/process/ProcessManagerService.d.ts +49 -0
  287. package/dist/services/process/ProcessManagerService.d.ts.map +1 -0
  288. package/dist/services/process/ProcessManagerService.js +162 -0
  289. package/dist/services/process/index.d.ts +3 -0
  290. package/dist/services/process/index.d.ts.map +1 -0
  291. package/dist/services/process/index.js +2 -0
  292. package/dist/services/process/launchNodeEffect.d.ts +40 -0
  293. package/dist/services/process/launchNodeEffect.d.ts.map +1 -0
  294. package/dist/services/process/launchNodeEffect.js +86 -0
  295. package/dist/util/functions/index.d.ts +3 -0
  296. package/dist/util/functions/index.d.ts.map +1 -0
  297. package/dist/util/functions/index.js +4 -0
  298. package/dist/util/index.d.ts +4 -0
  299. package/dist/util/index.d.ts.map +1 -0
  300. package/dist/util/index.js +2 -0
  301. package/package.json +157 -0
@@ -0,0 +1,257 @@
1
+ import chalk from "chalk";
2
+ import path from "node:path";
3
+ import { startVitest } from "vitest/node";
4
+ import { createLogger } from "../../util/index.js";
5
+ import { clearNodeLogs } from "../internal/cmdFunctions/tempLogs.js";
6
+ import { commonChecks } from "../internal/launcherCommon.js";
7
+ import { cacheConfig, importAsyncConfig, loadEnvVars } from "../lib/configReader.js";
8
+ import { MoonwallContext, contextCreator, runNetworkOnly } from "../lib/globalContext.js";
9
+ import { shardManager } from "../lib/shardManager.js";
10
+ import { findTestFilesMatchingPattern } from "../internal/testIdParser.js";
11
+ const logger = createLogger({ name: "runner" });
12
+ /**
13
+ * Pre-filters test files by scanning for suite/test IDs matching the pattern.
14
+ * Uses ast-grep's parallel file search for efficient parsing.
15
+ * Returns matching file paths, or undefined if no pattern (let vitest handle all).
16
+ */
17
+ async function filterTestFilesByPattern(testDirs, includePatterns, pattern) {
18
+ if (!pattern)
19
+ return undefined;
20
+ const patternRegex = new RegExp(pattern, "i");
21
+ const matches = await findTestFilesMatchingPattern(testDirs, includePatterns, patternRegex);
22
+ if (matches.length === 0) {
23
+ throw new Error(`No test files found matching pattern "${pattern}". ` +
24
+ `Check that the suite/test ID exists (e.g., D01, D01E01).`);
25
+ }
26
+ return matches;
27
+ }
28
+ export async function testCmd(envName, additionalArgs) {
29
+ await cacheConfig();
30
+ const globalConfig = await importAsyncConfig();
31
+ const env = globalConfig.environments.find(({ name }) => name === envName);
32
+ process.env.MOON_TEST_ENV = envName;
33
+ // Initialize sharding configuration
34
+ shardManager.initializeSharding(additionalArgs?.shard);
35
+ if (!env) {
36
+ const envList = globalConfig.environments
37
+ .map((env) => env.name)
38
+ .sort()
39
+ .join(", ");
40
+ throw new Error(`No environment found in config for: ${chalk.bgWhiteBright.blackBright(envName)}\n Environments defined in config are: ${envList}\n`);
41
+ }
42
+ loadEnvVars();
43
+ await commonChecks(env);
44
+ if ((env.foundation.type === "dev" && !env.foundation.launchSpec[0].retainAllLogs) ||
45
+ (env.foundation.type === "chopsticks" && !env.foundation.launchSpec[0].retainAllLogs)) {
46
+ clearNodeLogs();
47
+ }
48
+ if (env.foundation.type === "zombie") {
49
+ process.env.MOON_EXIT = "true";
50
+ }
51
+ const vitest = await executeTests(env, additionalArgs);
52
+ const failed = vitest.state
53
+ .getFiles()
54
+ .filter((file) => file.result && file.result.state === "fail");
55
+ if (failed.length === 0) {
56
+ logger.info("✅ All tests passed");
57
+ global.MOONWALL_TERMINATION_REASON = "tests finished";
58
+ return true;
59
+ }
60
+ logger.warn("❌ Some tests failed");
61
+ global.MOONWALL_TERMINATION_REASON = "tests failed";
62
+ return false;
63
+ }
64
+ export async function executeTests(env, testRunArgs) {
65
+ return new Promise(async (resolve, reject) => {
66
+ const globalConfig = await importAsyncConfig();
67
+ if (env.foundation.type === "read_only") {
68
+ try {
69
+ if (!process.env.MOON_TEST_ENV) {
70
+ throw new Error("MOON_TEST_ENV not set");
71
+ }
72
+ const ctx = await contextCreator();
73
+ const chainData = ctx.providers
74
+ .filter((provider) => provider.type === "polkadotJs" && provider.name.includes("para"))
75
+ .map((provider) => {
76
+ return {
77
+ [provider.name]: {
78
+ rtName: provider.greet().rtName,
79
+ rtVersion: provider.greet().rtVersion,
80
+ },
81
+ };
82
+ });
83
+ // TODO: Extend/develop this feature to respect para/relay chain specifications
84
+ if (chainData.length < 1) {
85
+ throw "Could not read runtime name or version \nTo fix: ensure moonwall config has a polkadotJs provider with a name containing 'para'";
86
+ }
87
+ const { rtVersion, rtName } = Object.values(chainData[0])[0];
88
+ process.env.MOON_RTVERSION = rtVersion;
89
+ process.env.MOON_RTNAME = rtName;
90
+ }
91
+ catch (e) {
92
+ logger.error(e);
93
+ }
94
+ finally {
95
+ await MoonwallContext.destroy();
96
+ }
97
+ }
98
+ const additionalArgs = { ...testRunArgs };
99
+ const vitestOptions = testRunArgs?.vitestPassthroughArgs?.reduce((acc, arg) => {
100
+ const [key, value] = arg.split("=");
101
+ return {
102
+ ...acc,
103
+ [key]: Number(value) || value,
104
+ };
105
+ }, {});
106
+ // transform in regexp pattern
107
+ if (env.skipTests && env.skipTests.length > 0) {
108
+ // the final pattern will look like this: "^((?!SO00T02|SM00T01|SM00T03).)*$"
109
+ additionalArgs.testNamePattern = `^((?!${env.skipTests?.map((test) => `${test.name}`).join("|")}).)*$`;
110
+ }
111
+ const options = new VitestOptionsBuilder()
112
+ .setReporters(env.reporters || ["default"])
113
+ .setOutputFile(env.reportFile)
114
+ .setName(env.name)
115
+ .setTimeout(env.timeout || globalConfig.defaultTestTimeout)
116
+ .setInclude(env.include || ["**/*{test,spec,test_,test-}*{ts,mts,cts}"])
117
+ .addThreadConfig(env.multiThreads)
118
+ .setCacheImports(env.cacheImports)
119
+ .addVitestPassthroughArgs(env.vitestArgs)
120
+ .build();
121
+ if (globalConfig.environments.find((env) => env.name === process.env.MOON_TEST_ENV)?.foundation
122
+ .type === "zombie") {
123
+ await runNetworkOnly();
124
+ process.env.MOON_RECYCLE = "true";
125
+ }
126
+ try {
127
+ const testFileDir = additionalArgs?.subDirectory !== undefined
128
+ ? env.testFileDir.map((folder) => path.join(folder, additionalArgs.subDirectory || "error"))
129
+ : env.testFileDir;
130
+ const folders = testFileDir.map((folder) => path.join(".", folder, "/"));
131
+ const includePatterns = env.include || ["**/*{test,spec,test_,test-}*{ts,mts,cts}"];
132
+ // Pre-filter test files by scanning for suite IDs matching the pattern
133
+ // This avoids loading all files in vitest just to discover which ones match
134
+ const filteredFiles = await filterTestFilesByPattern(folders, includePatterns, additionalArgs?.testNamePattern);
135
+ const optionsToUse = {
136
+ ...options,
137
+ ...additionalArgs,
138
+ ...vitestOptions,
139
+ ...(filteredFiles ? { include: filteredFiles.map((f) => path.resolve(f)) } : {}),
140
+ };
141
+ if (env.printVitestOptions) {
142
+ logger.info(`Options to use: ${JSON.stringify(optionsToUse, null, 2)}`);
143
+ }
144
+ const foldersToUse = filteredFiles ? ["."] : folders;
145
+ resolve((await startVitest("test", foldersToUse, optionsToUse)));
146
+ }
147
+ catch (e) {
148
+ logger.error(e);
149
+ reject(e);
150
+ }
151
+ });
152
+ }
153
+ const filterList = ["<empty line>", "", "stdout | unknown test"];
154
+ class VitestOptionsBuilder {
155
+ options = {
156
+ watch: false,
157
+ globals: true,
158
+ reporters: ["default"],
159
+ passWithNoTests: false,
160
+ deps: {
161
+ optimizer: { ssr: { enabled: false }, web: { enabled: false } },
162
+ },
163
+ env: {
164
+ NODE_OPTIONS: "--no-warnings --no-deprecation",
165
+ },
166
+ include: ["**/*{test,spec,test_,test-}*{ts,mts,cts}"],
167
+ onConsoleLog(log) {
168
+ if (filterList.includes(log.trim()))
169
+ return false;
170
+ if (log.includes("has multiple versions, ensure that there is only one installed.")) {
171
+ return false;
172
+ }
173
+ },
174
+ };
175
+ setName(name) {
176
+ this.options.name = name;
177
+ return this;
178
+ }
179
+ setReporters(reporters) {
180
+ const modified = reporters.includes("basic")
181
+ ? reporters.map((r) => r === "basic" ? ["default", { summary: false }] : r)
182
+ : reporters;
183
+ this.options.reporters = modified;
184
+ return this;
185
+ }
186
+ setOutputFile(file) {
187
+ if (!file) {
188
+ logger.info("No output file specified, skipping");
189
+ return this;
190
+ }
191
+ this.options.outputFile = file;
192
+ return this;
193
+ }
194
+ setTimeout(timeout) {
195
+ this.options.testTimeout = timeout;
196
+ this.options.hookTimeout = timeout;
197
+ return this;
198
+ }
199
+ setInclude(include) {
200
+ this.options.include = include;
201
+ return this;
202
+ }
203
+ addVitestPassthroughArgs(args) {
204
+ this.options = { ...this.options, ...args };
205
+ return this;
206
+ }
207
+ addThreadConfig(threads = false) {
208
+ this.options.fileParallelism = false;
209
+ this.options.pool = "forks";
210
+ // Vitest 4: pool options are now top-level (isolate, maxWorkers)
211
+ this.options.isolate = true;
212
+ this.options.maxWorkers = 3;
213
+ if (threads === true && process.env.MOON_RECYCLE !== "true") {
214
+ this.options.fileParallelism = true;
215
+ }
216
+ if (typeof threads === "number" && process.env.MOON_RECYCLE !== "true") {
217
+ this.options.fileParallelism = true;
218
+ this.options.maxWorkers = threads;
219
+ }
220
+ if (typeof threads === "object" && process.env.MOON_RECYCLE !== "true") {
221
+ // Vitest 4 format: { pool: "forks", maxWorkers: 1, isolate: false, ... }
222
+ const config = threads;
223
+ if (!["threads", "forks", "vmThreads", "typescript"].includes(config.pool)) {
224
+ throw new Error(`Invalid pool type: ${config.pool}`);
225
+ }
226
+ this.options.fileParallelism = true;
227
+ this.options.pool = config.pool;
228
+ if (config.maxWorkers !== undefined) {
229
+ this.options.maxWorkers = config.maxWorkers;
230
+ }
231
+ if (config.isolate !== undefined) {
232
+ this.options.isolate = config.isolate;
233
+ }
234
+ if (config.memoryLimit !== undefined) {
235
+ this.options.vmMemoryLimit = config.memoryLimit;
236
+ }
237
+ }
238
+ return this;
239
+ }
240
+ setCacheImports(enabled) {
241
+ if (enabled) {
242
+ this.options.deps = {
243
+ optimizer: {
244
+ ssr: {
245
+ enabled: true,
246
+ include: ["viem", "ethers"],
247
+ },
248
+ web: { enabled: false },
249
+ },
250
+ };
251
+ }
252
+ return this;
253
+ }
254
+ build() {
255
+ return this.options;
256
+ }
257
+ }
@@ -0,0 +1,4 @@
1
+ import { SingleBar } from "cli-progress";
2
+ export declare function downloader(url: string, outputPath: string): Promise<void>;
3
+ export declare function initializeProgressBar(): SingleBar;
4
+ //# sourceMappingURL=downloader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"downloader.d.ts","sourceRoot":"","sources":["../../../../src/cli/internal/cmdFunctions/downloader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAW,MAAM,cAAc,CAAC;AAUlD,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+C/E;AAED,wBAAgB,qBAAqB,IAAI,SAAS,CAQjD"}
@@ -0,0 +1,49 @@
1
+ import { SingleBar, Presets } from "cli-progress";
2
+ import fs from "node:fs";
3
+ import { Readable } from "node:stream";
4
+ export async function downloader(url, outputPath) {
5
+ const tempPath = `${outputPath}.tmp`;
6
+ const writeStream = fs.createWriteStream(tempPath);
7
+ let transferredBytes = 0;
8
+ if (url.startsWith("ws")) {
9
+ console.log("You've passed a WebSocket URL to fetch. Is this intended?");
10
+ }
11
+ const headers = {};
12
+ if (process.env.GITHUB_TOKEN) {
13
+ headers.Authorization = `Bearer ${process.env.GITHUB_TOKEN}`;
14
+ }
15
+ const response = await fetch(url, { headers });
16
+ if (!response.body) {
17
+ throw new Error("No response body");
18
+ }
19
+ const readStream = Readable.fromWeb(response.body);
20
+ const contentLength = Number.parseInt(response.headers.get("Content-Length") || "0", 10);
21
+ const progressBar = initializeProgressBar();
22
+ progressBar.start(contentLength, 0);
23
+ readStream.pipe(writeStream);
24
+ await new Promise((resolve, reject) => {
25
+ readStream.on("data", (chunk) => {
26
+ transferredBytes += chunk.length;
27
+ progressBar.update(transferredBytes);
28
+ });
29
+ readStream.on("end", () => {
30
+ writeStream.end();
31
+ progressBar.stop();
32
+ process.stdout.write(" 💾 Saving binary artifact...");
33
+ writeStream.close(() => resolve());
34
+ });
35
+ readStream.on("error", (error) => {
36
+ reject(error);
37
+ });
38
+ });
39
+ fs.writeFileSync(outputPath, fs.readFileSync(tempPath));
40
+ fs.rmSync(tempPath);
41
+ }
42
+ export function initializeProgressBar() {
43
+ const options = {
44
+ etaAsynchronousUpdate: true,
45
+ etaBuffer: 40,
46
+ format: "Downloading: [{bar}] {percentage}% | ETA: {eta_formatted} | {value}/{total}",
47
+ };
48
+ return new SingleBar(options, Presets.shades_classic);
49
+ }
@@ -0,0 +1,10 @@
1
+ export type fetchArtifactArgs = {
2
+ bin: string;
3
+ ver?: string;
4
+ path?: string;
5
+ overwrite?: boolean;
6
+ outputName?: string;
7
+ };
8
+ export declare function fetchArtifact(args: fetchArtifactArgs): Promise<void>;
9
+ export declare function getVersions(name: string, runtime?: boolean): Promise<string[]>;
10
+ //# sourceMappingURL=fetchArtifact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchArtifact.d.ts","sourceRoot":"","sources":["../../../../src/cli/internal/cmdFunctions/fetchArtifact.ts"],"names":[],"mappings":"AAuBA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,wBAAsB,aAAa,CAAC,IAAI,EAAE,iBAAiB,iBA0G1D;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,UAAQ,qBAuC9D"}
@@ -0,0 +1,145 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import semver from "semver";
4
+ import chalk from "chalk";
5
+ import { runTask } from "../processHelpers.js";
6
+ import { minimatch } from "minimatch";
7
+ import { downloader } from "./downloader.js";
8
+ import { allReposAsync, standardRepos } from "../../lib/repoDefinitions/index.js";
9
+ import { execSync } from "node:child_process";
10
+ import { configExists } from "../../lib/configReader.js";
11
+ import { Octokit } from "@octokit/rest";
12
+ import { confirm } from "@inquirer/prompts";
13
+ const octokit = new Octokit({
14
+ baseUrl: "https://api.github.com",
15
+ log: {
16
+ debug: () => { },
17
+ info: () => { },
18
+ warn: console.warn,
19
+ error: console.error,
20
+ },
21
+ });
22
+ export async function fetchArtifact(args) {
23
+ if (args.path && (await fs.access(args.path).catch(() => true))) {
24
+ console.log("Folder not exists, creating");
25
+ fs.mkdir(args.path);
26
+ }
27
+ const checkOverwrite = async (path) => {
28
+ try {
29
+ await fs.access(path, fs.constants.R_OK);
30
+ if (args.overwrite) {
31
+ console.log("File exists, overwriting ...");
32
+ }
33
+ else {
34
+ const cont = await confirm({
35
+ message: "File exists, do you want to overwrite?",
36
+ });
37
+ if (!cont) {
38
+ return false;
39
+ }
40
+ }
41
+ }
42
+ catch {
43
+ console.log("File does not exist, creating ...");
44
+ }
45
+ return true;
46
+ };
47
+ const binary = args.bin;
48
+ const repos = (await configExists()) ? await allReposAsync() : standardRepos();
49
+ const repo = repos.find((network) => network.binaries.find((bin) => bin.name === binary));
50
+ if (!repo) {
51
+ throw new Error(`Downloading ${binary} unsupported`);
52
+ }
53
+ const enteredPath = args.path ? args.path : "tmp/";
54
+ const releases = await octokit.rest.repos.listReleases({
55
+ owner: repo.ghAuthor,
56
+ repo: repo.ghRepo,
57
+ });
58
+ if (releases.status !== 200 || releases.data.length === 0) {
59
+ throw new Error(`No releases found for ${repo.ghAuthor}.${repo.ghRepo}, try again later.`);
60
+ }
61
+ const release = binary.includes("-runtime")
62
+ ? releases.data.find((release) => {
63
+ if (args.ver === "latest") {
64
+ return release.assets.find((asset) => asset.name.includes(binary));
65
+ }
66
+ return release.assets.find((asset) => asset.name === `${binary}-${args.ver}.wasm`);
67
+ })
68
+ : args.ver === "latest"
69
+ ? releases.data.find((release) => release.assets.find((asset) => asset.name === binary))
70
+ : releases.data
71
+ .filter((release) => release.tag_name.includes(args.ver || ""))
72
+ .find((release) => release.assets.find((asset) => minimatch(asset.name, binary)));
73
+ if (!release) {
74
+ throw new Error(`Release not found for ${args.ver}`);
75
+ }
76
+ const asset = binary.includes("-runtime")
77
+ ? release.assets.find((asset) => asset.name.includes(binary) && asset.name.includes("wasm"))
78
+ : release.assets.find((asset) => minimatch(asset.name, binary));
79
+ if (!asset) {
80
+ throw new Error(`Asset not found for ${binary}`);
81
+ }
82
+ if (!binary.includes("-runtime")) {
83
+ const url = asset.browser_download_url;
84
+ const filename = path.basename(url);
85
+ const binPath = args.outputName ? args.outputName : path.join("./", enteredPath, filename);
86
+ if ((await checkOverwrite(binPath)) === false) {
87
+ console.log("User chose not to overwrite existing file, exiting.");
88
+ return;
89
+ }
90
+ await downloader(url, binPath);
91
+ await fs.chmod(binPath, "755");
92
+ if (filename.endsWith(".tar.gz")) {
93
+ const outputBuffer = execSync(`tar -xzvf ${binPath}`);
94
+ const cleaned = outputBuffer.toString().split("\n")[0].split("/")[0];
95
+ const version = (await runTask(`./${cleaned} --version`)).trim();
96
+ process.stdout.write(` ${chalk.green(version.trim())} ✓\n`);
97
+ return;
98
+ }
99
+ const version = (await runTask(`./${binPath} --version`)).trim();
100
+ process.stdout.write(`${path.basename(binPath)} ${chalk.green(version.trim())} ✓\n`);
101
+ return;
102
+ }
103
+ const binaryPath = args.outputName
104
+ ? args.outputName
105
+ : path.join("./", args.path || "", `${args.bin}-${args.ver}.wasm`);
106
+ if ((await checkOverwrite(binaryPath)) === false) {
107
+ console.log("User chose not to overwrite existing file, exiting.");
108
+ return;
109
+ }
110
+ await downloader(asset.browser_download_url, binaryPath);
111
+ await fs.chmod(binaryPath, "755");
112
+ process.stdout.write(` ${chalk.green("done")} ✓\n`);
113
+ return;
114
+ }
115
+ export async function getVersions(name, runtime = false) {
116
+ const repos = (await configExists()) ? await allReposAsync() : standardRepos();
117
+ const repo = repos.find((network) => network.binaries.find((bin) => bin.name === name));
118
+ if (!repo) {
119
+ throw new Error(`Network not found for ${name}`);
120
+ }
121
+ const releases = await octokit.rest.repos.listReleases({
122
+ owner: repo.ghAuthor,
123
+ repo: repo.ghRepo,
124
+ });
125
+ if (releases.status !== 200 || releases.data.length === 0) {
126
+ throw new Error(`No releases found for ${repo.ghAuthor}.${repo.ghRepo}, try again later.`);
127
+ }
128
+ const versions = releases.data
129
+ .map((release) => {
130
+ let tag = release.tag_name;
131
+ if (release.tag_name.includes("v")) {
132
+ tag = tag.split("v")[1];
133
+ }
134
+ if (tag.includes("-rc")) {
135
+ tag = tag.split("-rc")[0];
136
+ }
137
+ return tag;
138
+ })
139
+ .filter((version) => (runtime && version.includes("runtime")) || (!runtime && !version.includes("runtime")))
140
+ .map((version) => version.replace("runtime-", ""));
141
+ const set = new Set(versions);
142
+ return runtime
143
+ ? [...set]
144
+ : [...set].sort((a, b) => (semver.valid(a) && semver.valid(b) ? semver.rcompare(a, b) : a));
145
+ }
@@ -0,0 +1,5 @@
1
+ export * from "./downloader.js";
2
+ export * from "./fetchArtifact.js";
3
+ export * from "./initialisation.js";
4
+ export * from "./tempLogs.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/internal/cmdFunctions/index.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,mCAAmC;AACnC,oCAAoC;AACpC,8BAA8B"}
@@ -0,0 +1,4 @@
1
+ export * from "./downloader.js";
2
+ export * from "./fetchArtifact.js";
3
+ export * from "./initialisation.js";
4
+ export * from "./tempLogs.js";
@@ -0,0 +1,20 @@
1
+ import type { FoundationType, MoonwallConfig } from "../../../api/types/index.js";
2
+ export declare function createFolders(): Promise<void>;
3
+ export declare function generateConfig(argv: {
4
+ acceptAllDefaults?: boolean;
5
+ }): Promise<void>;
6
+ export declare function createConfig(options: {
7
+ label: string;
8
+ timeout: number;
9
+ environmentName: string;
10
+ foundation: FoundationType;
11
+ testDir: string;
12
+ }): MoonwallConfig;
13
+ export declare function createSampleConfig(options: {
14
+ label: string;
15
+ timeout: number;
16
+ environmentName: string;
17
+ foundation: FoundationType;
18
+ testDir: string;
19
+ }): MoonwallConfig;
20
+ //# sourceMappingURL=initialisation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initialisation.d.ts","sourceRoot":"","sources":["../../../../src/cli/internal/cmdFunctions/initialisation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,oCAAoC;AAIlF,wBAAsB,aAAa,kBAIlC;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE;IAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAAE,iBA+EzE;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,cAAc,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,cAAc,CAcjB;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,cAAc,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,cAAc,CAwBjB"}
@@ -0,0 +1,150 @@
1
+ import fs from "node:fs/promises";
2
+ import { confirm, input, number } from "@inquirer/prompts";
3
+ export async function createFolders() {
4
+ await fs.mkdir("scripts").catch(() => "scripts folder already exists, skipping");
5
+ await fs.mkdir("tests").catch(() => "tests folder already exists, skipping");
6
+ await fs.mkdir("tmp").catch(() => "tmp folder already exists, skipping");
7
+ }
8
+ export async function generateConfig(argv) {
9
+ let answers;
10
+ try {
11
+ await fs.access("moonwall.config.json");
12
+ console.log("ℹ️ Config file already exists at this location. Quitting.");
13
+ return;
14
+ }
15
+ catch (_) {
16
+ // File does not exist — proceed with configuration
17
+ }
18
+ if (argv.acceptAllDefaults) {
19
+ answers = {
20
+ label: "moonwall_config",
21
+ timeout: 30000,
22
+ environmentName: "default_env",
23
+ foundation: "dev",
24
+ testDir: "tests/default/",
25
+ };
26
+ }
27
+ else {
28
+ while (true) {
29
+ answers = {
30
+ label: await input({
31
+ message: "Provide a label for the config file",
32
+ default: "moonwall_config",
33
+ }),
34
+ timeout: (await number({
35
+ message: "Provide a global timeout value",
36
+ default: 30000,
37
+ })) ?? 30000,
38
+ environmentName: await input({
39
+ message: "Provide a name for this environment",
40
+ default: "default_env",
41
+ }),
42
+ foundation: "dev",
43
+ testDir: await input({
44
+ message: "Provide the path for where tests for this environment are kept",
45
+ default: "tests/default/",
46
+ }),
47
+ };
48
+ const proceed = await confirm({
49
+ message: "Would you like to generate this config? (no to restart from beginning)",
50
+ });
51
+ if (proceed) {
52
+ break;
53
+ }
54
+ console.log("Restarting the configuration process...");
55
+ }
56
+ }
57
+ const config = createSampleConfig({
58
+ label: answers.label,
59
+ timeout: answers.timeout,
60
+ environmentName: answers.environmentName,
61
+ foundation: answers.foundation,
62
+ testDir: answers.testDir,
63
+ });
64
+ const JSONBlob = JSON.stringify(config, null, 3);
65
+ await fs.writeFile("moonwall.config.json", JSONBlob, "utf-8");
66
+ process.env.MOON_CONFIG_PATH = "./moonwall.config.json";
67
+ await createSampleTest(answers.testDir);
68
+ console.log("Test directory created at: ", answers.testDir);
69
+ console.log(`You can now add tests to this directory and run them with 'pnpm moonwall test ${answers.environmentName}'`);
70
+ console.log("Goodbye! 👋");
71
+ }
72
+ export function createConfig(options) {
73
+ return {
74
+ label: options.label,
75
+ defaultTestTimeout: options.timeout,
76
+ environments: [
77
+ {
78
+ name: options.environmentName,
79
+ testFileDir: [options.testDir],
80
+ foundation: {
81
+ type: options.foundation,
82
+ },
83
+ },
84
+ ],
85
+ };
86
+ }
87
+ export function createSampleConfig(options) {
88
+ return {
89
+ $schema: "https://raw.githubusercontent.com/Moonsong-Labs/moonwall/main/config_schema.json",
90
+ label: options.label,
91
+ defaultTestTimeout: options.timeout,
92
+ environments: [
93
+ {
94
+ name: options.environmentName,
95
+ testFileDir: [options.testDir],
96
+ multiThreads: false,
97
+ foundation: {
98
+ type: "dev",
99
+ launchSpec: [
100
+ {
101
+ name: "moonbeam",
102
+ useDocker: true,
103
+ newRpcBehaviour: true,
104
+ binPath: "moonbeamfoundation/moonbeam",
105
+ },
106
+ ],
107
+ },
108
+ },
109
+ ],
110
+ };
111
+ }
112
+ async function createSampleTest(directory) {
113
+ await fs.mkdir(directory, { recursive: true });
114
+ await fs.writeFile(`${directory}/sample.test.ts`, sampleTest, "utf-8");
115
+ }
116
+ const sampleTest = `import { describeSuite, expect } from "moonwall";
117
+
118
+ describeSuite({
119
+ id: "B01",
120
+ title: "Sample test suite for moonbeam network",
121
+ foundationMethods: "dev",
122
+ testCases: ({ context, it }) => {
123
+
124
+ const ALITH_ADDRESS = "0xf24FF3a9CF04c71Dbc94D0b566f7A27B94566cac"
125
+
126
+ it({
127
+ id: "T01",
128
+ title: "Test that API is connected correctly",
129
+ test: async () => {
130
+ const chainName = context.pjsApi.consts.system.version.specName.toString();
131
+ const specVersion = context.pjsApi.consts.system.version.specVersion.toNumber();
132
+ expect(chainName.length).toBeGreaterThan(0)
133
+ expect(chainName).toBe("moonbase")
134
+ expect(specVersion).toBeGreaterThan(0)
135
+ },
136
+ });
137
+
138
+ it({
139
+ id: "T02",
140
+ title: "Test that chain queries can be made",
141
+ test: async () => {
142
+ const balance = (await context.pjsApi.query.system.account(ALITH_ADDRESS)).data.free
143
+ expect(balance.toBigInt()).toBeGreaterThan(0n)
144
+ },
145
+ });
146
+
147
+ },
148
+ });
149
+
150
+ `;
@@ -0,0 +1,3 @@
1
+ export declare function clearNodeLogs(silent?: boolean): void;
2
+ export declare function reportLogLocation(silent?: boolean): string;
3
+ //# sourceMappingURL=tempLogs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tempLogs.d.ts","sourceRoot":"","sources":["../../../../src/cli/internal/cmdFunctions/tempLogs.ts"],"names":[],"mappings":"AAGA,wBAAgB,aAAa,CAAC,MAAM,UAAO,QAa1C;AAED,wBAAgB,iBAAiB,CAAC,MAAM,UAAQ,UA2B/C"}