// pnpm dev —— 本地调试服:把 dist/releases/ 下的分发目录按发布结构服务出来,并注入 WE 模拟器。
//
// 为什么不直接服务某个分发目录当根:把**服务根设在 releases 的父目录**,任何一个分发里若存在
// 越出自身目录的引用(../ 或根绝对路径),浏览器会立刻 404 —— 这是对"目录可整体搬走"最严的检验。
// 每档分发各占一个端口反而可能掩盖问题(越界路径会意外命中别的分发)。
//
// 路由:
// / 分发索引(读 dist-map.json)
// /release/
/ 某档分发的根(自动补 index.html)
// /release//<相对路径> 其内部资源,按扩展名给正确 MIME
// /simulator/wallpaper-engine.js WE 模拟器本体(调试期专有,见下)
//
// 为什么模拟器单独一条路由:按 ADR 0006 §1,模拟器**默认不进发布产物**,只有
// `pnpm build --with-sim` 才会往分发目录里放一份。而调试服总是需要它。早先驱动脚本直接
// 从 `/release//scripts/wallpaper-engine.js` 取,于是默认构建(不带 --with-sim)下
// 动态 import 必然 404、面板静默消失——现象是"调试时没有 WE 模拟面板"。
// 现在由调试服从编译产物 build/scripts/wallpaper-engine.js 提供,
// 分发目录则始终保持"就是发布产物"的样子。
//
// 查询参数(与既有对拍工具的参数保持兼容,见 tools/serve.mjs):
// ?sim=0 不注入 WE 模拟器
// ?__props={"preset":"kv37"} 覆盖初始用户属性
// ?__propsAt=dom|load 属性下发时序;dom 复现"load 之前就到达"的竞态
// ?fps=30 初始 fps(经 applyGeneralProperties 下发);0 = 不限流
// ?__paused=1 初始 setPaused(true)
// ?nojs=1 剥掉所有 `;
// 驱动脚本注入在壁纸模块**之前**:它用动态 import 装载模拟器,从而在 index.js 注册
// wallpaperPropertyListener 之前就把 API 备好(模拟器源码本身仍是 ES module,见 drivers.ts)。
const inject = SIMULATOR_DRIVER({
search: search.toString(),
dir,
title: info.title,
version: info.version,
defaultPresetId: info.defaultPresetId,
preview: info.preview,
});
if (search.get("sim") !== "0") {
body = body.replace(
/