import { z } from "zod"; const durationPattern = /^\d+(s|m|h)$/; const sharedConfigSchema = z.object({ warmups: z.number(), duration: z.string().refine((value) => durationPattern.test(value), { message: "Duration must be a number followed by 's', 'm', or 'h'", }), max_concurrent_sessions: z.number().optional(), parse_curl: z.boolean().optional(), }); export type SharedConfig = z.infer; const scenarioConfigSchema = z .object({ script: z.string(), }) .merge(sharedConfigSchema.partial()); export type ScenarioConfig = z.infer; export const configFileSchema = z .object({ scenarios: z.record(scenarioConfigSchema), }) .merge(sharedConfigSchema); export type ConfigFile = z.infer; export type RunScriptResult = { successful: boolean; duration: number; }; // eslint-disable-next-line @typescript-eslint/no-explicit-any export type Task = { prepare: () => Promise; run: (...args: Args) => Promise; }; export type RunningTaskBatchUpdate = { runs: RunScriptResult[] }; export type RunningTask = { name: string; updates: RunningTaskBatchUpdate[]; concurrentSessions: number; };