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.
- package/LICENSE +681 -0
- package/README.md +54 -0
- package/config_schema.json +811 -0
- package/dist/api/constants/accounts.d.ts +36 -0
- package/dist/api/constants/accounts.d.ts.map +1 -0
- package/dist/api/constants/accounts.js +67 -0
- package/dist/api/constants/chain.d.ts +134 -0
- package/dist/api/constants/chain.d.ts.map +1 -0
- package/dist/api/constants/chain.js +149 -0
- package/dist/api/constants/index.d.ts +4 -0
- package/dist/api/constants/index.d.ts.map +1 -0
- package/dist/api/constants/index.js +3 -0
- package/dist/api/constants/smartContract.d.ts +29 -0
- package/dist/api/constants/smartContract.d.ts.map +1 -0
- package/dist/api/constants/smartContract.js +118 -0
- package/dist/api/testing/blocks.d.ts +59 -0
- package/dist/api/testing/blocks.d.ts.map +1 -0
- package/dist/api/testing/blocks.js +147 -0
- package/dist/api/testing/contracts.d.ts +5 -0
- package/dist/api/testing/contracts.d.ts.map +1 -0
- package/dist/api/testing/contracts.js +32 -0
- package/dist/api/testing/ethers.d.ts +3 -0
- package/dist/api/testing/ethers.d.ts.map +1 -0
- package/dist/api/testing/ethers.js +38 -0
- package/dist/api/testing/events.d.ts +12 -0
- package/dist/api/testing/events.d.ts.map +1 -0
- package/dist/api/testing/events.js +23 -0
- package/dist/api/testing/extrinsics.d.ts +5 -0
- package/dist/api/testing/extrinsics.d.ts.map +1 -0
- package/dist/api/testing/extrinsics.js +10 -0
- package/dist/api/testing/index.d.ts +9 -0
- package/dist/api/testing/index.d.ts.map +1 -0
- package/dist/api/testing/index.js +8 -0
- package/dist/api/testing/jumping.d.ts +8 -0
- package/dist/api/testing/jumping.d.ts.map +1 -0
- package/dist/api/testing/jumping.js +78 -0
- package/dist/api/testing/providers.d.ts +18 -0
- package/dist/api/testing/providers.d.ts.map +1 -0
- package/dist/api/testing/providers.js +34 -0
- package/dist/api/testing/viem.d.ts +139 -0
- package/dist/api/testing/viem.d.ts.map +1 -0
- package/dist/api/testing/viem.js +247 -0
- package/dist/api/types/config.d.ts +609 -0
- package/dist/api/types/config.d.ts.map +1 -0
- package/dist/api/types/config.js +1 -0
- package/dist/api/types/context.d.ts +125 -0
- package/dist/api/types/context.d.ts.map +1 -0
- package/dist/api/types/context.js +1 -0
- package/dist/api/types/contracts.d.ts +66 -0
- package/dist/api/types/contracts.d.ts.map +1 -0
- package/dist/api/types/contracts.js +1 -0
- package/dist/api/types/eth.d.ts +3 -0
- package/dist/api/types/eth.d.ts.map +1 -0
- package/dist/api/types/eth.js +1 -0
- package/dist/api/types/foundations.d.ts +11 -0
- package/dist/api/types/foundations.d.ts.map +1 -0
- package/dist/api/types/foundations.js +1 -0
- package/dist/api/types/helpers.d.ts +7 -0
- package/dist/api/types/helpers.d.ts.map +1 -0
- package/dist/api/types/helpers.js +1 -0
- package/dist/api/types/index.d.ts +8 -0
- package/dist/api/types/index.d.ts.map +1 -0
- package/dist/api/types/index.js +7 -0
- package/dist/api/types/runner.d.ts +490 -0
- package/dist/api/types/runner.d.ts.map +1 -0
- package/dist/api/types/runner.js +1 -0
- package/dist/cli/cmds/components/LogViewer.d.ts +17 -0
- package/dist/cli/cmds/components/LogViewer.d.ts.map +1 -0
- package/dist/cli/cmds/components/LogViewer.js +171 -0
- package/dist/cli/cmds/entrypoint.d.ts +6 -0
- package/dist/cli/cmds/entrypoint.d.ts.map +1 -0
- package/dist/cli/cmds/entrypoint.js +192 -0
- package/dist/cli/cmds/interactiveCmds/chopsticksIntCmds.d.ts +2 -0
- package/dist/cli/cmds/interactiveCmds/chopsticksIntCmds.d.ts.map +1 -0
- package/dist/cli/cmds/interactiveCmds/chopsticksIntCmds.js +117 -0
- package/dist/cli/cmds/interactiveCmds/devIntCmds.d.ts +2 -0
- package/dist/cli/cmds/interactiveCmds/devIntCmds.d.ts.map +1 -0
- package/dist/cli/cmds/interactiveCmds/devIntCmds.js +103 -0
- package/dist/cli/cmds/interactiveCmds/index.d.ts +4 -0
- package/dist/cli/cmds/interactiveCmds/index.d.ts.map +1 -0
- package/dist/cli/cmds/interactiveCmds/index.js +3 -0
- package/dist/cli/cmds/interactiveCmds/zombieIntCmds.d.ts +2 -0
- package/dist/cli/cmds/interactiveCmds/zombieIntCmds.d.ts.map +1 -0
- package/dist/cli/cmds/interactiveCmds/zombieIntCmds.js +32 -0
- package/dist/cli/cmds/main.d.ts +2 -0
- package/dist/cli/cmds/main.d.ts.map +1 -0
- package/dist/cli/cmds/main.js +336 -0
- package/dist/cli/cmds/runNetwork.d.ts +3 -0
- package/dist/cli/cmds/runNetwork.d.ts.map +1 -0
- package/dist/cli/cmds/runNetwork.js +292 -0
- package/dist/cli/cmds/runTests.d.ts +12 -0
- package/dist/cli/cmds/runTests.d.ts.map +1 -0
- package/dist/cli/cmds/runTests.js +257 -0
- package/dist/cli/internal/cmdFunctions/downloader.d.ts +4 -0
- package/dist/cli/internal/cmdFunctions/downloader.d.ts.map +1 -0
- package/dist/cli/internal/cmdFunctions/downloader.js +49 -0
- package/dist/cli/internal/cmdFunctions/fetchArtifact.d.ts +10 -0
- package/dist/cli/internal/cmdFunctions/fetchArtifact.d.ts.map +1 -0
- package/dist/cli/internal/cmdFunctions/fetchArtifact.js +145 -0
- package/dist/cli/internal/cmdFunctions/index.d.ts +5 -0
- package/dist/cli/internal/cmdFunctions/index.d.ts.map +1 -0
- package/dist/cli/internal/cmdFunctions/index.js +4 -0
- package/dist/cli/internal/cmdFunctions/initialisation.d.ts +20 -0
- package/dist/cli/internal/cmdFunctions/initialisation.d.ts.map +1 -0
- package/dist/cli/internal/cmdFunctions/initialisation.js +150 -0
- package/dist/cli/internal/cmdFunctions/tempLogs.d.ts +3 -0
- package/dist/cli/internal/cmdFunctions/tempLogs.d.ts.map +1 -0
- package/dist/cli/internal/cmdFunctions/tempLogs.js +37 -0
- package/dist/cli/internal/commandParsers.d.ts +59 -0
- package/dist/cli/internal/commandParsers.d.ts.map +1 -0
- package/dist/cli/internal/commandParsers.js +305 -0
- package/dist/cli/internal/deriveTestIds.d.ts +8 -0
- package/dist/cli/internal/deriveTestIds.d.ts.map +1 -0
- package/dist/cli/internal/deriveTestIds.js +123 -0
- package/dist/cli/internal/effect/index.d.ts +6 -0
- package/dist/cli/internal/effect/index.d.ts.map +1 -0
- package/dist/cli/internal/effect/index.js +5 -0
- package/dist/cli/internal/fileCheckers.d.ts +11 -0
- package/dist/cli/internal/fileCheckers.d.ts.map +1 -0
- package/dist/cli/internal/fileCheckers.js +165 -0
- package/dist/cli/internal/foundations/index.d.ts +4 -0
- package/dist/cli/internal/foundations/index.d.ts.map +1 -0
- package/dist/cli/internal/foundations/index.js +4 -0
- package/dist/cli/internal/index.d.ts +12 -0
- package/dist/cli/internal/index.d.ts.map +1 -0
- package/dist/cli/internal/index.js +11 -0
- package/dist/cli/internal/launcherCommon.d.ts +4 -0
- package/dist/cli/internal/launcherCommon.d.ts.map +1 -0
- package/dist/cli/internal/launcherCommon.js +130 -0
- package/dist/cli/internal/localNode.d.ts +16 -0
- package/dist/cli/internal/localNode.d.ts.map +1 -0
- package/dist/cli/internal/localNode.js +362 -0
- package/dist/cli/internal/logging.d.ts +2 -0
- package/dist/cli/internal/logging.d.ts.map +1 -0
- package/dist/cli/internal/logging.js +26 -0
- package/dist/cli/internal/node.d.ts +33 -0
- package/dist/cli/internal/node.d.ts.map +1 -0
- package/dist/cli/internal/node.js +228 -0
- package/dist/cli/internal/processHelpers.d.ts +17 -0
- package/dist/cli/internal/processHelpers.d.ts.map +1 -0
- package/dist/cli/internal/processHelpers.js +56 -0
- package/dist/cli/internal/providerFactories.d.ts +48 -0
- package/dist/cli/internal/providerFactories.d.ts.map +1 -0
- package/dist/cli/internal/providerFactories.js +442 -0
- package/dist/cli/internal/testIdParser.d.ts +34 -0
- package/dist/cli/internal/testIdParser.d.ts.map +1 -0
- package/dist/cli/internal/testIdParser.js +167 -0
- package/dist/cli/lib/binariesHelpers.d.ts +15 -0
- package/dist/cli/lib/binariesHelpers.d.ts.map +1 -0
- package/dist/cli/lib/binariesHelpers.js +99 -0
- package/dist/cli/lib/configReader.d.ts +8 -0
- package/dist/cli/lib/configReader.d.ts.map +1 -0
- package/dist/cli/lib/configReader.js +115 -0
- package/dist/cli/lib/contractFunctions.d.ts +2 -0
- package/dist/cli/lib/contractFunctions.d.ts.map +1 -0
- package/dist/cli/lib/contractFunctions.js +2 -0
- package/dist/cli/lib/globalContext.d.ts +46 -0
- package/dist/cli/lib/globalContext.d.ts.map +1 -0
- package/dist/cli/lib/globalContext.js +710 -0
- package/dist/cli/lib/governanceProcedures.d.ts +27 -0
- package/dist/cli/lib/governanceProcedures.d.ts.map +1 -0
- package/dist/cli/lib/governanceProcedures.js +458 -0
- package/dist/cli/lib/handlers/index.d.ts +5 -0
- package/dist/cli/lib/handlers/index.d.ts.map +1 -0
- package/dist/cli/lib/handlers/index.js +5 -0
- package/dist/cli/lib/repoDefinitions/index.d.ts +6 -0
- package/dist/cli/lib/repoDefinitions/index.d.ts.map +1 -0
- package/dist/cli/lib/repoDefinitions/index.js +21 -0
- package/dist/cli/lib/repoDefinitions/moonbeam.d.ts +4 -0
- package/dist/cli/lib/repoDefinitions/moonbeam.d.ts.map +1 -0
- package/dist/cli/lib/repoDefinitions/moonbeam.js +30 -0
- package/dist/cli/lib/repoDefinitions/polkadot.d.ts +4 -0
- package/dist/cli/lib/repoDefinitions/polkadot.d.ts.map +1 -0
- package/dist/cli/lib/repoDefinitions/polkadot.js +11 -0
- package/dist/cli/lib/repoDefinitions/tanssi.d.ts +4 -0
- package/dist/cli/lib/repoDefinitions/tanssi.d.ts.map +1 -0
- package/dist/cli/lib/repoDefinitions/tanssi.js +14 -0
- package/dist/cli/lib/rpcFunctions.d.ts +2 -0
- package/dist/cli/lib/rpcFunctions.d.ts.map +1 -0
- package/dist/cli/lib/rpcFunctions.js +26 -0
- package/dist/cli/lib/runnerContext.d.ts +32 -0
- package/dist/cli/lib/runnerContext.d.ts.map +1 -0
- package/dist/cli/lib/runnerContext.js +156 -0
- package/dist/cli/lib/shardManager.d.ts +40 -0
- package/dist/cli/lib/shardManager.d.ts.map +1 -0
- package/dist/cli/lib/shardManager.js +80 -0
- package/dist/cli/lib/upgradeProcedures.d.ts +5 -0
- package/dist/cli/lib/upgradeProcedures.d.ts.map +1 -0
- package/dist/cli/lib/upgradeProcedures.js +221 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +3 -0
- package/dist/contracts/contractInteraction.d.ts +17 -0
- package/dist/contracts/contractInteraction.d.ts.map +1 -0
- package/dist/contracts/contractInteraction.js +170 -0
- package/dist/contracts/index.d.ts +2 -0
- package/dist/contracts/index.d.ts.map +1 -0
- package/dist/contracts/index.js +1 -0
- package/dist/foundations/chopsticks/handler.d.ts +3 -0
- package/dist/foundations/chopsticks/handler.d.ts.map +1 -0
- package/dist/foundations/chopsticks/handler.js +93 -0
- package/dist/foundations/chopsticks/helpers.d.ts +27 -0
- package/dist/foundations/chopsticks/helpers.d.ts.map +1 -0
- package/dist/foundations/chopsticks/helpers.js +133 -0
- package/dist/foundations/dev/handler.d.ts +3 -0
- package/dist/foundations/dev/handler.d.ts.map +1 -0
- package/dist/foundations/dev/handler.js +136 -0
- package/dist/foundations/dev/helpers.d.ts +27 -0
- package/dist/foundations/dev/helpers.d.ts.map +1 -0
- package/dist/foundations/dev/helpers.js +161 -0
- package/dist/foundations/read-only/handler.d.ts +3 -0
- package/dist/foundations/read-only/handler.d.ts.map +1 -0
- package/dist/foundations/read-only/handler.js +32 -0
- package/dist/foundations/zombie/handler.d.ts +3 -0
- package/dist/foundations/zombie/handler.d.ts.map +1 -0
- package/dist/foundations/zombie/handler.js +92 -0
- package/dist/foundations/zombie/helpers.d.ts +16 -0
- package/dist/foundations/zombie/helpers.d.ts.map +1 -0
- package/dist/foundations/zombie/helpers.js +97 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +47 -0
- package/dist/internal/common.d.ts +3 -0
- package/dist/internal/common.d.ts.map +1 -0
- package/dist/internal/common.js +41 -0
- package/dist/internal/index.d.ts +4 -0
- package/dist/internal/index.d.ts.map +1 -0
- package/dist/internal/index.js +3 -0
- package/dist/internal/logger.d.ts +24 -0
- package/dist/internal/logger.d.ts.map +1 -0
- package/dist/internal/logger.js +66 -0
- package/dist/internal/logging.d.ts +7 -0
- package/dist/internal/logging.d.ts.map +1 -0
- package/dist/internal/logging.js +36 -0
- package/dist/moondebug.d.ts +3 -0
- package/dist/moondebug.d.ts.map +1 -0
- package/dist/moondebug.js +2 -0
- package/dist/services/cache/FileLock.d.ts +11 -0
- package/dist/services/cache/FileLock.d.ts.map +1 -0
- package/dist/services/cache/FileLock.js +68 -0
- package/dist/services/cache/StartupCacheService.d.ts +23 -0
- package/dist/services/cache/StartupCacheService.d.ts.map +1 -0
- package/dist/services/cache/StartupCacheService.js +159 -0
- package/dist/services/cache/index.d.ts +3 -0
- package/dist/services/cache/index.d.ts.map +1 -0
- package/dist/services/cache/index.js +2 -0
- package/dist/services/chopsticks/ChopsticksMultiChain.d.ts +158 -0
- package/dist/services/chopsticks/ChopsticksMultiChain.d.ts.map +1 -0
- package/dist/services/chopsticks/ChopsticksMultiChain.js +282 -0
- package/dist/services/chopsticks/ChopsticksService.d.ts +313 -0
- package/dist/services/chopsticks/ChopsticksService.d.ts.map +1 -0
- package/dist/services/chopsticks/ChopsticksService.js +77 -0
- package/dist/services/chopsticks/chopsticksConfigParser.d.ts +40 -0
- package/dist/services/chopsticks/chopsticksConfigParser.d.ts.map +1 -0
- package/dist/services/chopsticks/chopsticksConfigParser.js +201 -0
- package/dist/services/chopsticks/index.d.ts +5 -0
- package/dist/services/chopsticks/index.d.ts.map +1 -0
- package/dist/services/chopsticks/index.js +4 -0
- package/dist/services/chopsticks/launchChopsticksEffect.d.ts +225 -0
- package/dist/services/chopsticks/launchChopsticksEffect.d.ts.map +1 -0
- package/dist/services/chopsticks/launchChopsticksEffect.js +623 -0
- package/dist/services/config/configAccessors.d.ts +41 -0
- package/dist/services/config/configAccessors.d.ts.map +1 -0
- package/dist/services/config/configAccessors.js +149 -0
- package/dist/services/config/index.d.ts +2 -0
- package/dist/services/config/index.d.ts.map +1 -0
- package/dist/services/config/index.js +1 -0
- package/dist/services/errors.d.ts +72 -0
- package/dist/services/errors.d.ts.map +1 -0
- package/dist/services/errors.js +31 -0
- package/dist/services/index.d.ts +7 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +6 -0
- package/dist/services/network/NodeReadinessService.d.ts +35 -0
- package/dist/services/network/NodeReadinessService.d.ts.map +1 -0
- package/dist/services/network/NodeReadinessService.js +120 -0
- package/dist/services/network/PortDiscoveryService.d.ts +22 -0
- package/dist/services/network/PortDiscoveryService.d.ts.map +1 -0
- package/dist/services/network/PortDiscoveryService.js +77 -0
- package/dist/services/network/RpcPortDiscoveryService.d.ts +25 -0
- package/dist/services/network/RpcPortDiscoveryService.d.ts.map +1 -0
- package/dist/services/network/RpcPortDiscoveryService.js +136 -0
- package/dist/services/network/index.d.ts +4 -0
- package/dist/services/network/index.d.ts.map +1 -0
- package/dist/services/network/index.js +3 -0
- package/dist/services/process/ProcessManagerService.d.ts +49 -0
- package/dist/services/process/ProcessManagerService.d.ts.map +1 -0
- package/dist/services/process/ProcessManagerService.js +162 -0
- package/dist/services/process/index.d.ts +3 -0
- package/dist/services/process/index.d.ts.map +1 -0
- package/dist/services/process/index.js +2 -0
- package/dist/services/process/launchNodeEffect.d.ts +40 -0
- package/dist/services/process/launchNodeEffect.d.ts.map +1 -0
- package/dist/services/process/launchNodeEffect.js +86 -0
- package/dist/util/functions/index.d.ts +3 -0
- package/dist/util/functions/index.d.ts.map +1 -0
- package/dist/util/functions/index.js +4 -0
- package/dist/util/index.d.ts +4 -0
- package/dist/util/index.d.ts.map +1 -0
- package/dist/util/index.js +2 -0
- 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 @@
|
|
|
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 @@
|
|
|
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,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 @@
|
|
|
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"}
|