// 调试服冒烟:验证路由、注入、以及"所有分发内引用都能取到 200"。 // 用法:node tools/checks/smoke-dev.mts [port] // // 这里有一条**回归断言**:模拟器本体必须能从调试服取到 200。 // 它曾经是 404 —— 驱动脚本从 `/release//scripts/wallpaper-engine.js` 取模拟器, // 而该文件只有 `pnpm build --with-sim` 才会放进分发,默认构建下必然缺失。 // 症状是浏览器里"WE 模拟面板没出来",而 404 只留在控制台里。 // 所以断言必须打在**模拟器本体的可获取性**上,不能只断言"HTML 里提到了这个字符串"。 const port = Number(process.argv[2] ?? 5173); const base = `http://127.0.0.1:${port}`; const SIMULATOR_URL = "/simulator/wallpaper-engine.js"; let failures = 0; function ok(condition: boolean, label: string, detail = ""): void { if (condition) { console.log(` ✓ ${label}`); } else { failures += 1; console.log(` ✗ ${label}${detail ? ` —— ${detail}` : ""}`); } } const indexRes = await fetch(`${base}/`); const indexHtml = await indexRes.text(); console.log(`索引页 ${indexRes.status}`); ok(indexRes.status === 200, "GET / 返回 200"); ok(indexHtml.includes("single-hsr-xilian") && indexHtml.includes("collection-all"), "索引页列出全部分发"); const map = await (await fetch(`${base}/dist-map.json`).catch(() => ({ status: 0, text: async () => "" }))).text?.(); void map; for (const dir of ["single-hsr-xilian", "single-hsr-kv37", "collection-hsr", "collection-all"]) { console.log(`\n${dir}`); const res = await fetch(`${base}/release/${dir}/`); const html = await res.text(); ok(res.status === 200, "GET /release// 返回 200"); ok(html.includes("wallpaper-engine.js"), "已注入模拟器脚本"); ok(html.includes("__weProperties"), "已注入 project.json 属性表"); ok(html.includes("mountWallpaperEngineSimulator"), "已注入模拟器驱动"); ok(html.indexOf("wallpaper-engine.js") < html.indexOf("scripts/index.js"), "模拟器在壁纸模块之前"); // 模拟器脚本本体可访问(**回归断言**:曾经 404,导致面板静默消失) const simRes = await fetch(`${base}${SIMULATOR_URL}`); ok(simRes.status === 200, `模拟器本体 ${SIMULATOR_URL} 返回 200`, `status=${simRes.status}`); const simText = simRes.status === 200 ? await simRes.text() : ""; ok( simText.includes("mountWallpaperEngineSimulator"), "模拟器本体确实导出了 mountWallpaperEngineSimulator", `${(simText.length / 1024).toFixed(0)} KB`, ); // ?nojs=1 剥脚本 const nojs = await (await fetch(`${base}/release/${dir}/?nojs=1`)).text(); ok(!nojs.includes("scripts/index.js") && nojs.includes("TESTSTATE"), "?nojs=1 剥掉脚本并留状态标记", nojs.slice(0, 80)); // ?sim=0 不注入模拟器 const nosim = await (await fetch(`${base}/release/${dir}/?sim=0`)).text(); ok(!nosim.includes('type="module" src="/release/'), "?sim=0 不注入模拟器 script 标签"); // 越界引用必须 404(目录自包含性) const escape = await fetch(`${base}/release/${dir}/../${dir}/index.html`); ok(escape.status === 200 || escape.status === 404, "越界路径被规范化(不崩溃)"); } console.log("\n越权路由"); const other = await fetch(`${base}/release/not-a-release/`); ok(other.status === 404, "未知分发返回 404"); const stray = await fetch(`${base}/whatever.txt`); ok(stray.status === 404, "非 /release 路由返回 404"); console.log(failures === 0 ? "\n调试服冒烟通过" : `\n调试服冒烟失败:${failures} 处`); process.exit(failures === 0 ? 0 : 1);