import { accessSync, constants } from "node:fs"; import { isAbsolute } from "node:path"; /** 仅核对具名隔离环境;不启动服务、安装浏览器或读取口令内容。 */ export function 核对旅程环境(env: NodeJS.ProcessEnv) { if (env.MUSE_ISOLATED_TEST_ENVIRONMENT !== "1") throw new Error( "真实旅程需要 MUSE_ISOLATED_TEST_ENVIRONMENT=1 明确确认隔离测试环境。", ); if (!env.MUSE_WORKBENCH_URL) throw new Error("真实旅程需要明确 MUSE_WORKBENCH_URL,不使用默认后端。"); const url = new URL(env.MUSE_WORKBENCH_URL); if ( !["http:", "https:"].includes(url.protocol) || url.username || url.password ) throw new Error("工作台URL必须为无内嵌凭据的HTTP(S)地址。"); for (const name of [ "MUSE_BROWSER_EXECUTABLE", "MUSE_AUTHOR_PASSWORD_FILE", ] as const) { const file = env[name]; if (!file || !isAbsolute(file)) throw new Error(`真实旅程需要具名绝对路径 ${name}。`); accessSync( file, name === "MUSE_BROWSER_EXECUTABLE" ? constants.X_OK : constants.R_OK, ); } }