import type { ConnectionConfig } from "./types.js"; export interface Configuration { connection: ConnectionConfig; environmentId?: string; idleMs: number; } export function configuration(flag: (name: string) => unknown, env: NodeJS.ProcessEnv = process.env): Configuration { const endpoint = String(flag("substrate-endpoint") ?? env.SUBSTRATE_ENDPOINT ?? "").trim(); if (!endpoint) throw new Error("Set --substrate-endpoint or SUBSTRATE_ENDPOINT to a private ate-env-api endpoint. No local fallback is available."); const atespace = String(flag("substrate-atespace") ?? env.SUBSTRATE_ATESPACE ?? "ate-env"); const environmentId = String(flag("substrate-env") ?? env.SUBSTRATE_ENV ?? "").trim() || undefined; const idle = Number(flag("substrate-idle-seconds") ?? env.SUBSTRATE_IDLE_SECONDS ?? 0); if (!Number.isFinite(idle) || idle < 0 || idle > 86_400) throw new Error("substrate-idle-seconds must be between 0 (disabled) and 86400."); validName(atespace, "atespace"); if (environmentId) validName(environmentId, "environment ID"); return { connection: { endpoint, atespace, token: env.SUBSTRATE_TOKEN, timeoutMs: 120_000, maxBytes: 1_048_576 }, environmentId, idleMs: idle * 1000, }; } export function validName(value: string, label = "environment ID"): string { if (!/^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/.test(value)) throw new Error(`${label} must be a DNS label: 1-63 lowercase letters, digits or internal hyphens.`); return value; }