UNPKG

@moonwall/cli

Version:

Testing framework for the Moon family of projects

124 lines (121 loc) 3.82 kB
// src/internal/providerFactories.ts import { ALITH_PRIVATE_KEY, createLogger, deriveViemChain, normalizeUrlToHttps } from "@moonwall/util"; import { ApiPromise, WsProvider } from "@polkadot/api"; import { Wallet, ethers } from "ethers"; import { createClient } from "polkadot-api"; import { getWsProvider } from "polkadot-api/ws-provider"; import { createWalletClient, http, publicActions } from "viem"; import { privateKeyToAccount } from "viem/accounts"; import { Web3 } from "web3"; import { WebSocketProvider } from "web3-providers-ws"; import { withPolkadotSdkCompat } from "polkadot-api/polkadot-sdk-compat"; import * as fs from "fs"; import * as path from "path"; var logger = createLogger({ name: "providers" }); var debug = logger.debug.bind(logger); var vitestAutoUrl = () => { const url = `ws://127.0.0.1:${process.env.MOONWALL_RPC_PORT}`; debug( `vitestAutoUrl - MOONWALL_RPC_PORT=${process.env.MOONWALL_RPC_PORT}, Generated URL: ${url}` ); return url; }; // src/lib/configReader.ts import { readFile, access } from "fs/promises"; import { readFileSync as readFileSync2, existsSync, constants as constants2 } from "fs"; import JSONC from "jsonc-parser"; import path2, { extname } from "path"; var cachedConfig; function parseConfigSync(filePath) { let result; const file = readFileSync2(filePath, "utf8"); switch (extname(filePath)) { case ".json": result = JSON.parse(file); break; case ".config": result = JSONC.parse(file); break; default: result = void 0; break; } return result; } function getEnvironmentFromConfig() { const globalConfig = importJsonConfig(); const config = globalConfig.environments.find(({ name }) => name === process.env.MOON_TEST_ENV); if (!config) { throw new Error(`Environment ${process.env.MOON_TEST_ENV} not found in config`); } return config; } function importJsonConfig() { if (cachedConfig) { return cachedConfig; } const configPath = process.env.MOON_CONFIG_PATH; if (!configPath) { throw new Error("No moonwall config path set. This is a defect, please raise it."); } const filePath = path2.isAbsolute(configPath) ? configPath : path2.join(process.cwd(), configPath); try { const config = parseConfigSync(filePath); const replacedConfig = replaceEnvVars(config); cachedConfig = replacedConfig; return cachedConfig; } catch (e) { console.error(e); throw new Error(`Error import config at ${filePath}`); } } function replaceEnvVars(value) { if (typeof value === "string") { return value.replace(/\$\{([^}]+)\}/g, (match, group) => { const envVarValue = process.env[group]; return envVarValue || match; }); } if (Array.isArray(value)) { return value.map(replaceEnvVars); } if (typeof value === "object" && value !== null) { return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, replaceEnvVars(v)])); } return value; } // src/lib/rpcFunctions.ts import { normalizeUrlToHttps as normalizeUrlToHttps2 } from "@moonwall/util"; async function customDevRpcRequest(method, params = []) { const env = getEnvironmentFromConfig(); const endpoint = normalizeUrlToHttps2( env.connections ? env.connections[0].endpoints[0] : vitestAutoUrl() ); const data = { jsonrpc: "2.0", id: 1, method, params }; if (endpoint.startsWith("ws")) { console.log("you've passed a websocket to fetch, is this intended?"); } const response = await fetch(endpoint, { method: "POST", body: JSON.stringify(data), headers: { "Content-Type": "application/json" } }); const responseData = await response.json(); if (responseData.error) { throw new Error(responseData.error.message); } return responseData.result; } export { customDevRpcRequest };