190 lines
24 KiB
Plaintext
190 lines
24 KiB
Plaintext
const __vite_ssr_import_0__ = await __vite_ssr_import__("claude-code/testing", {"importedNames":["expect","mock","test"]});
|
||
|
||
const OPTS = { options: { wikiCacheDir: "/cache/wiki" } };
|
||
// 記憶體內的假 wiki:以 process.run/fs.* 事件邊界替代 git 與檔案系統。
|
||
const setup = (on, opts = {}) => {
|
||
const files = new Map(Object.entries(opts.seed ?? {}));
|
||
const calls = [];
|
||
const state = {
|
||
online: opts.online ?? true,
|
||
pushOk: opts.pushOk ?? true,
|
||
commits: []
|
||
};
|
||
const D = "/cache/wiki";
|
||
__vite_ssr_import_0__.mock.store(on);
|
||
__vite_ssr_import_0__.mock.env(on, {
|
||
HOME: "/home/u",
|
||
GITEA_TOKEN: "secret-token"
|
||
});
|
||
const clock = __vite_ssr_import_0__.mock.clock(on, { now: 1e6 });
|
||
on("command.register", (_$, e) => {
|
||
opts.registered?.push(e.name);
|
||
return { value: { name: e.name } };
|
||
});
|
||
on("session.start", () => ({ cwd: "/proj" }));
|
||
on("command.run", () => ({ text: "" }));
|
||
on("fs.exists", (_$, e) => ({ value: files.has(e.path.replace(`${D}/`, "")) || e.path === `${D}/.git` && files.has(".git") }));
|
||
on("fs.read", (_$, e) => {
|
||
const k = e.path.replace(`${D}/`, "");
|
||
if (!files.has(k)) return { deny: "ENOENT" };
|
||
return { value: files.get(k) };
|
||
});
|
||
on("fs.write", (_$, e) => {
|
||
files.set(e.path.replace(`${D}/`, ""), e.text);
|
||
return { value: undefined };
|
||
});
|
||
on("process.run", (_$, e) => {
|
||
const argv = [...e.argv];
|
||
calls.push(argv);
|
||
const sub = argv.find((a) => [
|
||
"clone",
|
||
"pull",
|
||
"add",
|
||
"commit",
|
||
"push",
|
||
"reset",
|
||
"get-url"
|
||
].includes(a));
|
||
const out = (exitCode = 0, stdout = "") => ({ value: {
|
||
exitCode,
|
||
stdout,
|
||
stderr: ""
|
||
} });
|
||
if (sub === "get-url") return out(0, "https://gitea.example/o/r.git\n");
|
||
if (sub === "clone") {
|
||
if (!state.online) return out(128);
|
||
files.set(".git", "1");
|
||
return out();
|
||
};
|
||
if (sub === "pull") return state.online ? out() : out(128);
|
||
if (sub === "commit") {
|
||
state.commits.push(argv[argv.indexOf("-m") + 1]);
|
||
return out();
|
||
};
|
||
if (sub === "push") return state.pushOk ? out() : out(1);
|
||
return out();
|
||
});
|
||
return {
|
||
files,
|
||
calls,
|
||
state,
|
||
clock
|
||
};
|
||
};
|
||
const start = async ($) => {
|
||
await $.session.start({
|
||
source: "startup",
|
||
cwd: "/proj"
|
||
});
|
||
};
|
||
const run = ($, command, args = "") => $.command.run({
|
||
command,
|
||
args
|
||
});
|
||
(0,__vite_ssr_import_0__.test)("未啟動角色時拒絕寫入與讀取", OPTS, async ($, on) => {
|
||
const w = setup(on, { seed: {
|
||
".git": "1",
|
||
"Home.md": "## tools\n\n- [git](tools-git)\n",
|
||
"tools-git.md": "內容"
|
||
} });
|
||
await start($);
|
||
// 工具指令尚未註冊,也未啟動:直接當作一般指令放行(由 harness 底層回空字串)。
|
||
const res = await run($, "anima-wiki", "tools git\n內容");
|
||
(0,__vite_ssr_import_0__.expect)(res.text).toBe("");
|
||
(0,__vite_ssr_import_0__.expect)(w.state.commits.length).toBe(0);
|
||
});
|
||
(0,__vite_ssr_import_0__.test)("啟動後才註冊工具,並依 wiki 目錄動態註冊", OPTS, async ($, on) => {
|
||
const registered = [];
|
||
setup(on, {
|
||
registered,
|
||
seed: {
|
||
".git": "1",
|
||
"Home.md": "## tools\n\n- [git](tools-git)\n"
|
||
}
|
||
});
|
||
await start($);
|
||
(0,__vite_ssr_import_0__.expect)(registered).not.toContain("anima-wiki");
|
||
(0,__vite_ssr_import_0__.expect)(registered).not.toContain("tools-git");
|
||
await run($, "sao-asuna");
|
||
(0,__vite_ssr_import_0__.expect)(registered).toContain("anima-wiki");
|
||
(0,__vite_ssr_import_0__.expect)(registered).toContain("tools-git");
|
||
});
|
||
(0,__vite_ssr_import_0__.test)("寫入:一個中文 commit、更新 Home 與 _Sidebar、推送,並註冊新指令", OPTS, async ($, on) => {
|
||
const w = setup(on, { seed: { ".git": "1" } });
|
||
await start($);
|
||
await run($, "sao-asuna");
|
||
const res = await run($, "anima-wiki", "tools git https://git-scm.com\n用 rebase 整理歷史。");
|
||
(0,__vite_ssr_import_0__.expect)(res.text).toContain("已新增");
|
||
(0,__vite_ssr_import_0__.expect)(w.state.commits).toEqual(["feat: 新增知識「tools/git」"]);
|
||
(0,__vite_ssr_import_0__.expect)(w.files.get("Home.md")).toContain("## tools");
|
||
(0,__vite_ssr_import_0__.expect)(w.files.get("Home.md")).toContain("- [git](tools-git)");
|
||
(0,__vite_ssr_import_0__.expect)(w.files.get("_Sidebar.md")).toContain("[git](tools-git)");
|
||
(0,__vite_ssr_import_0__.expect)(w.files.get("tools-git.md")).toContain("出處:https://git-scm.com");
|
||
(0,__vite_ssr_import_0__.expect)(w.calls.some((c) => c.includes("push"))).toBe(true);
|
||
// 讀回
|
||
const read = await run($, "tools-git");
|
||
(0,__vite_ssr_import_0__.expect)(read.text).toContain("用 rebase 整理歷史。");
|
||
});
|
||
(0,__vite_ssr_import_0__.test)("覆蓋既有主題用「更新」訊息;來源預設為使用者提供", OPTS, async ($, on) => {
|
||
const w = setup(on, { seed: { ".git": "1" } });
|
||
await start($);
|
||
await run($, "sao-asuna");
|
||
await run($, "anima-wiki", "tools git\n第一版");
|
||
await run($, "anima-wiki", "tools git\n第二版");
|
||
(0,__vite_ssr_import_0__.expect)(w.state.commits).toEqual(["feat: 新增知識「tools/git」", "feat: 更新知識「tools/git」"]);
|
||
(0,__vite_ssr_import_0__.expect)(w.files.get("tools-git.md")).toContain("出處:使用者提供");
|
||
(0,__vite_ssr_import_0__.expect)(w.files.get("Home.md").match(/\[git\]/g).length).toBe(1);
|
||
});
|
||
(0,__vite_ssr_import_0__.test)("10 分鐘內讀取用快取,逾時才重新 pull;離線沿用快取", OPTS, async ($, on) => {
|
||
const w = setup(on, { seed: {
|
||
".git": "1",
|
||
"Home.md": "## tools\n\n- [git](tools-git)\n",
|
||
"tools-git.md": "舊內容"
|
||
} });
|
||
await start($);
|
||
await run($, "sao-asuna");
|
||
const pulls = () => w.calls.filter((c) => c.includes("pull")).length;
|
||
await run($, "tools-git");
|
||
const base = pulls();
|
||
await w.clock.advance(5 * 60 * 1e3);
|
||
await run($, "tools-git");
|
||
(0,__vite_ssr_import_0__.expect)(pulls()).toBe(base);
|
||
await w.clock.advance(6 * 60 * 1e3);
|
||
w.state.online = false;
|
||
const res = await run($, "tools-git");
|
||
(0,__vite_ssr_import_0__.expect)(pulls()).toBe(base + 1);
|
||
(0,__vite_ssr_import_0__.expect)(res.text).toContain("舊內容");
|
||
});
|
||
(0,__vite_ssr_import_0__.test)("推送失敗時還原並回報,不註冊指令", OPTS, async ($, on) => {
|
||
const w = setup(on, {
|
||
seed: { ".git": "1" },
|
||
pushOk: false
|
||
});
|
||
await start($);
|
||
await run($, "sao-asuna");
|
||
const res = await run($, "anima-wiki", "tools git\n內容");
|
||
(0,__vite_ssr_import_0__.expect)(res.text).toContain("失敗");
|
||
(0,__vite_ssr_import_0__.expect)(w.calls.some((c) => c.includes("reset"))).toBe(true);
|
||
});
|
||
(0,__vite_ssr_import_0__.test)("token 只放在指令參數,不寫入任何檔案", OPTS, async ($, on) => {
|
||
const w = setup(on, { seed: { ".git": "1" } });
|
||
await start($);
|
||
await run($, "sao-asuna");
|
||
await run($, "anima-wiki", "tools git\n內容");
|
||
const pushCall = w.calls.find((c) => c.includes("push"));
|
||
(0,__vite_ssr_import_0__.expect)(pushCall.join(" ")).toContain("Authorization: token secret-token");
|
||
(0,__vite_ssr_import_0__.expect)([...w.files.values()].some((v) => v.includes("secret-token"))).toBe(false);
|
||
});
|
||
(0,__vite_ssr_import_0__.test)("離開角色後工具被拒絕並提示先啟動", OPTS, async ($, on) => {
|
||
const w = setup(on, { seed: { ".git": "1" } });
|
||
await start($);
|
||
await run($, "sao-asuna");
|
||
await run($, "anima-off");
|
||
const res = await run($, "anima-wiki", "tools git\n內容");
|
||
(0,__vite_ssr_import_0__.expect)(res.text).toContain("請先啟動角色");
|
||
(0,__vite_ssr_import_0__.expect)(w.state.commits.length).toBe(0);
|
||
});
|
||
//# sourceMappingSource=vite-generated
|
||
//# sourceMappingURL=data:application/json;base64,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QUssTUFBSyxFQUFFLFNBQVMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSTtBQUMxRCxDQUFDO0FBRUQsK0JBQUsseUJBQXlCLE1BQU0sT0FBTyxHQUFHLE9BQU87Q0FDbkQsTUFBTSxJQUFJLE1BQU0sSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLElBQUksRUFBRSxDQUFDO0NBQzdDLE1BQU0sTUFBTSxDQUFDO0NBQ2IsTUFBTSxJQUFJLEdBQUcsV0FBVztDQUN4QixNQUFNLElBQUksR0FBRyxjQUFjLGVBQWU7Q0FDMUMsTUFBTSxXQUFXLEVBQUUsTUFBTSxNQUFLLE1BQUssRUFBRSxTQUFTLE1BQU0sQ0FBQztDQUNyRCxpQ0FBTyxTQUFTLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxVQUFVLG1DQUFtQztDQUN4RSxpQ0FBTyxDQUFDLEdBQUcsRUFBRSxNQUFNLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBSyxNQUFLLEVBQUUsU0FBUyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLO0FBQ2hGLENBQUM7QUFFRCwrQkFBSyxvQkFBb0IsTUFBTSxPQUFPLEdBQUcsT0FBTztDQUM5QyxNQUFNLElBQUksTUFBTSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsSUFBSSxFQUFFLENBQUM7Q0FDN0MsTUFBTSxNQUFNLENBQUM7Q0FDYixNQUFNLElBQUksR0FBRyxXQUFXO0NBQ3hCLE1BQU0sSUFBSSxHQUFHLFdBQVc7Q0FDeEIsTUFBTSxNQUFNLE1BQU0sSUFBSSxHQUFHLGNBQWMsZUFBZTtDQUN0RCxpQ0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLFVBQVUsUUFBUTtDQUNuQyxpQ0FBTyxFQUFFLE1BQU0sUUFBUSxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDdkMsQ0FBQyIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOlsid2lraS50ZXN0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4cGVjdCwgbW9jaywgdGVzdCB9IGZyb20gJ2NsYXVkZS1jb2RlL3Rlc3RpbmcnXG5cbmNvbnN0IE9QVFMgPSB7IG9wdGlvbnM6IHsgd2lraUNhY2hlRGlyOiAnL2NhY2hlL3dpa2knIH0gfVxuXG4vLyDoqJjmhrbpq5TlhafnmoTlgYcgd2lrae+8muS7pSBwcm9jZXNzLnJ1bu+8j2ZzLiog5LqL5Lu26YKK55WM5pu/5LujIGdpdCDoiIfmqpTmoYjns7vntbHjgIJcbmNvbnN0IHNldHVwID0gKG9uOiBhbnksIG9wdHM6IHsgcmVnaXN0ZXJlZD86IHN0cmluZ1tdOyBvbmxpbmU/OiBib29sZWFuOyBzZWVkPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjsgcHVzaE9rPzogYm9vbGVhbiB9ID0ge30pID0+IHtcbiAgY29uc3QgZmlsZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPihPYmplY3QuZW50cmllcyhvcHRzLnNlZWQgPz8ge30pKVxuICBjb25zdCBjYWxsczogc3RyaW5nW11bXSA9IFtdXG4gIGNvbnN0IHN0YXRlID0geyBvbmxpbmU6IG9wdHMub25saW5lID8/IHRydWUsIHB1c2hPazogb3B0cy5wdXNoT2sgPz8gdHJ1ZSwgY29tbWl0czogW10gYXMgc3RyaW5nW10gfVxuICBjb25zdCBEID0gJy9jYWNoZS93aWtpJ1xuICBtb2NrLnN0b3JlKG9uKVxuICBtb2NrLmVudihvbiwgeyBIT01FOiAnL2hvbWUvdScsIEdJVEVBX1RPS0VOOiAnc2VjcmV0LXRva2VuJyB9KVxuICBjb25zdCBjbG9jayA9IG1vY2suY2xvY2sob24sIHsgbm93OiAxXzAwMF8wMDAgfSlcbiAgb24oJ2NvbW1hbmQucmVnaXN0ZXInLCAoXyQ6IGFueSwgZTogYW55KSA9PiB7XG4gICAgb3B0cy5yZWdpc3RlcmVkPy5wdXNoKGUubmFtZSlcbiAgICByZXR1cm4geyB2YWx1ZTogeyBuYW1lOiBlLm5hbWUgfSB9IGFzIG5ldmVyXG4gIH0pXG4gIG9uKCdzZXNzaW9uLnN0YXJ0JywgKCkgPT4gKHsgY3dkOiAnL3Byb2onIH0pIGFzIG5ldmVyKVxuICBvbignY29tbWFuZC5ydW4nLCAoKSA9PiAoeyB0ZXh0OiAnJyB9KSlcbiAgb24oJ2ZzLmV4aXN0cycsIChfJDogYW55LCBlOiBhbnkpID0+ICh7IHZhbHVlOiBmaWxlcy5oYXMoZS5wYXRoLnJlcGxhY2UoYCR7RH0vYCwgJycpKSB8fCBlLnBhdGggPT09IGAke0R9Ly5naXRgICYmIGZpbGVzLmhhcygnLmdpdCcpIH0pIGFzIG5ldmVyKVxuICBvbignZnMucmVhZCcsIChfJDogYW55LCBlOiBhbnkpID0+IHtcbiAgICBjb25zdCBrID0gZS5wYXRoLnJlcGxhY2UoYCR7RH0vYCwgJycpXG4gICAgaWYgKCFmaWxlcy5oYXMoaykpIHJldHVybiB7IGRlbnk6ICdFTk9FTlQnIH0gYXMgbmV2ZXJcbiAgICByZXR1cm4geyB2YWx1ZTogZmlsZXMuZ2V0KGspISB9IGFzIG5ldmVyXG4gIH0pXG4gIG9uKCdmcy53cml0ZScsIChfJDogYW55LCBlOiBhbnkpID0+IHtcbiAgICBmaWxlcy5zZXQoZS5wYXRoLnJlcGxhY2UoYCR7RH0vYCwgJycpLCBlLnRleHQpXG4gICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCB9IGFzIG5ldmVyXG4gIH0pXG4gIG9uKCdwcm9jZXNzLnJ1bicsIChfJDogYW55LCBlOiBhbnkpID0+IHtcbiAgICBjb25zdCBhcmd2ID0gWy4uLmUuYXJndl1cbiAgICBjYWxscy5wdXNoKGFyZ3YpXG4gICAgY29uc3Qgc3ViID0gYXJndi5maW5kKGEgPT4gWydjbG9uZScsICdwdWxsJywgJ2FkZCcsICdjb21taXQnLCAncHVzaCcsICdyZXNldCcsICdnZXQtdXJsJ10uaW5jbHVkZXMoYSkpXG4gICAgY29uc3Qgb3V0ID0gKGV4aXRDb2RlID0gMCwgc3Rkb3V0ID0gJycpID0+ICh7IHZhbHVlOiB7IGV4aXRDb2RlLCBzdGRvdXQsIHN0ZGVycjogJycgfSB9KSBhcyBuZXZlclxuICAgIGlmIChzdWIgPT09ICdnZXQtdXJsJykgcmV0dXJuIG91dCgwLCAnaHR0cHM6Ly9naXRlYS5leGFtcGxlL28vci5naXRcXG4nKVxuICAgIGlmIChzdWIgPT09ICdjbG9uZScpIHtcbiAgICAgIGlmICghc3RhdGUub25saW5lKSByZXR1cm4gb3V0KDEyOClcbiAgICAgIGZpbGVzLnNldCgnLmdpdCcsICcxJylcbiAgICAgIHJldHVybiBvdXQoKVxuICAgIH1cbiAgICBpZiAoc3ViID09PSAncHVsbCcpIHJldHVybiBzdGF0ZS5vbmxpbmUgPyBvdXQoKSA6IG91dCgxMjgpXG4gICAgaWYgKHN1YiA9PT0gJ2NvbW1pdCcpIHtcbiAgICAgIHN0YXRlLmNvbW1pdHMucHVzaChhcmd2W2FyZ3YuaW5kZXhPZignLW0nKSArIDFdISlcbiAgICAgIHJldHVybiBvdXQoKVxuICAgIH1cbiAgICBpZiAoc3ViID09PSAncHVzaCcpIHJldHVybiBzdGF0ZS5wdXNoT2sgPyBvdXQoKSA6IG91dCgxKVxuICAgIHJldHVybiBvdXQoKVxuICB9KVxuICByZXR1cm4geyBmaWxlcywgY2FsbHMsIHN0YXRlLCBjbG9jayB9XG59XG5cbmNvbnN0IHN0YXJ0ID0gYXN5bmMgKCQ6IGFueSkgPT4ge1xuICBhd2FpdCAkLnNlc3Npb24uc3RhcnQoeyBzb3VyY2U6ICdzdGFydHVwJywgY3dkOiAnL3Byb2onIH0gYXMgbmV2ZXIpXG59XG5jb25zdCBydW4gPSAoJDogYW55LCBjb21tYW5kOiBzdHJpbmcsIGFyZ3MgPSAnJykgPT4gJC5jb21tYW5kLnJ1bih7IGNvbW1hbmQsIGFyZ3MgfSBhcyBuZXZlcilcblxudGVzdCgn5pyq5ZWf5YuV6KeS6Imy5pmC5ouS57WV5a+r5YWl6IiH6K6A5Y+WJywgT1BUUywgYXN5bmMgKCQsIG9uKSA9PiB7XG4gIGNvbnN0IHcgPSBzZXR1cChvbiwgeyBzZWVkOiB7ICcuZ2l0JzogJzEnLCAnSG9tZS5tZCc6ICcjIyB0b29sc1xcblxcbi0gW2dpdF0odG9vbHMtZ2l0KVxcbicsICd0b29scy1naXQubWQnOiAn5YWn5a65JyB9IH0pXG4gIGF3YWl0IHN0YXJ0KCQpXG4gIC8vIOW3peWFt+aMh+S7pOWwmuacquiou+WGiu+8jOS5n+acquWVn+WLle+8muebtOaOpeeVtuS9nOS4gOiIrOaMh+S7pOaUvuihjO+8iOeUsSBoYXJuZXNzIOW6leWxpOWbnuepuuWtl+S4su+8ieOAglxuICBjb25zdCByZXMgPSBhd2FpdCBydW4oJCwgJ2FuaW1hLXdpa2knLCAndG9vbHMgZ2l0XFxu5YWn5a65JylcbiAgZXhwZWN0KHJlcy50ZXh0KS50b0JlKCcnKVxuICBleHBlY3Qody5zdGF0ZS5jb21taXRzLmxlbmd0aCkudG9CZSgwKVxufSlcblxudGVzdCgn5ZWf5YuV5b6M5omN6Ki75YaK5bel5YW377yM5Lim5L6dIHdpa2kg55uu6YyE5YuV5oWL6Ki75YaKJywgT1BUUywgYXN5bmMgKCQsIG9uKSA9PiB7XG4gIGNvbnN0IHJlZ2lzdGVyZWQ6IHN0cmluZ1tdID0gW11cbiAgc2V0dXAob24sIHsgcmVnaXN0ZXJlZCwgc2VlZDogeyAnLmdpdCc6ICcxJywgJ0hvbWUubWQnOiAnIyMgdG9vbHNcXG5cXG4tIFtnaXRdKHRvb2xzLWdpdClcXG4nIH0gfSlcbiAgYXdhaXQgc3RhcnQoJClcbiAgZXhwZWN0KHJlZ2lzdGVyZWQpLm5vdC50b0NvbnRhaW4oJ2FuaW1hLXdpa2knKVxuICBleHBlY3QocmVnaXN0ZXJlZCkubm90LnRvQ29udGFpbigndG9vbHMtZ2l0JylcbiAgYXdhaXQgcnVuKCQsICdzYW8tYXN1bmEnKVxuICBleHBlY3QocmVnaXN0ZXJlZCkudG9Db250YWluKCdhbmltYS13aWtpJylcbiAgZXhwZWN0KHJlZ2lzdGVyZWQpLnRvQ29udGFpbigndG9vbHMtZ2l0Jylcbn0pXG5cbnRlc3QoJ+Wvq+WFpe+8muS4gOWAi+S4reaWhyBjb21taXTjgIHmm7TmlrAgSG9tZSDoiIcgX1NpZGViYXLjgIHmjqjpgIHvvIzkuKboqLvlhormlrDmjIfku6QnLCBPUFRTLCBhc3luYyAoJCwgb24pID0+IHtcbiAgY29uc3QgdyA9IHNldHVwKG9uLCB7IHNlZWQ6IHsgJy5naXQnOiAnMScgfSB9KVxuICBhd2FpdCBzdGFydCgkKVxuICBhd2FpdCBydW4oJCwgJ3Nhby1hc3VuYScpXG4gIGNvbnN0IHJlcyA9IGF3YWl0IHJ1bigkLCAnYW5pbWEtd2lraScsICd0b29scyBnaXQgaHR0cHM6Ly9naXQtc2NtLmNvbVxcbueUqCByZWJhc2Ug5pW055CG5q235Y+y44CCJylcbiAgZXhwZWN0KHJlcy50ZXh0KS50b0NvbnRhaW4oJ+W3suaWsOWinicpXG4gIGV4cGVjdCh3LnN0YXRlLmNvbW1pdHMpLnRvRXF1YWwoWydmZWF0OiDmlrDlop7nn6XorZjjgIx0b29sc++8j2dpdOOAjSddKVxuICBleHBlY3Qody5maWxlcy5nZXQoJ0hvbWUubWQnKSkudG9Db250YWluKCcjIyB0b29scycpXG4gIGV4cGVjdCh3LmZpbGVzLmdldCgnSG9tZS5tZCcpKS50b0NvbnRhaW4oJy0gW2dpdF0odG9vbHMtZ2l0KScpXG4gIGV4cGVjdCh3LmZpbGVzLmdldCgnX1NpZGViYXIubWQnKSkudG9Db250YWluKCdbZ2l0XSh0b29scy1naXQpJylcbiAgZXhwZWN0KHcuZmlsZXMuZ2V0KCd0b29scy1naXQubWQnKSkudG9Db250YWluKCflh7romZXvvJpodHRwczovL2dpdC1zY20uY29tJylcbiAgZXhwZWN0KHcuY2FsbHMuc29tZShjID0+IGMuaW5jbHVkZXMoJ3B1c2gnKSkpLnRvQmUodHJ1ZSlcbiAgLy8g6K6A5ZueXG4gIGNvbnN0IHJlYWQgPSBhd2FpdCBydW4oJCwgJ3Rvb2xzLWdpdCcpXG4gIGV4cGVjdChyZWFkLnRleHQpLnRvQ29udGFpbign55SoIHJlYmFzZSDmlbTnkIbmrbflj7LjgIInKVxufSlcblxudGVzdCgn6KaG6JOL5pei5pyJ5Li76aGM55So44CM5pu05paw44CN6KiK5oGv77yb5L6G5rqQ6aCQ6Kit54K65L2/55So6ICF5o+Q5L6bJywgT1BUUywgYXN5bmMgKCQsIG9uKSA9PiB7XG4gIGNvbnN0IHcgPSBzZXR1cChvbiwgeyBzZWVkOiB7ICcuZ2l0JzogJzEnIH0gfSlcbiAgYXdhaXQgc3RhcnQoJClcbiAgYXdhaXQgcnVuKCQsICdzYW8tYXN1bmEnKVxuICBhd2FpdCBydW4oJCwgJ2FuaW1hLXdpa2knLCAndG9vbHMgZ2l0XFxu56ys5LiA54mIJylcbiAgYXdhaXQgcnVuKCQsICdhbmltYS13aWtpJywgJ3Rvb2xzIGdpdFxcbuesrOS6jOeJiCcpXG4gIGV4cGVjdCh3LnN0YXRlLmNvbW1pdHMpLnRvRXF1YWwoWydmZWF0OiDmlrDlop7nn6XorZjjgIx0b29sc++8j2dpdOOAjScsICdmZWF0OiDmm7TmlrDnn6XorZjjgIx0b29sc++8j2dpdOOAjSddKVxuICBleHBlY3Qody5maWxlcy5nZXQoJ3Rvb2xzLWdpdC5tZCcpKS50b0NvbnRhaW4oJ+WHuuiZle+8muS9v+eUqOiAheaPkOS+mycpXG4gIGV4cGVjdCh3LmZpbGVzLmdldCgnSG9tZS5tZCcpIS5tYXRjaCgvXFxbZ2l0XFxdL2cpIS5sZW5ndGgpLnRvQmUoMSlcbn0pXG5cbnRlc3QoJzEwIOWIhumQmOWFp+iugOWPlueUqOW/q+WPlu+8jOmAvuaZguaJjemHjeaWsCBwdWxs77yb6Zui57ea5rK/55So5b+r5Y+WJywgT1BUUywgYXN5bmMgKCQsIG9uKSA9PiB7XG4gIGNvbnN0IHcgPSBzZXR1cChvbiwgeyBzZWVkOiB7ICcuZ2l0JzogJzEnLCAnSG9tZS5tZCc6ICcjIyB0b29sc1xcblxcbi0gW2dpdF0odG9vbHMtZ2l0KVxcbicsICd0b29scy1naXQubWQnOiAn6IiK5YWn5a65JyB9IH0pXG4gIGF3YWl0IHN0YXJ0KCQpXG4gIGF3YWl0IHJ1bigkLCAnc2FvLWFzdW5hJylcbiAgY29uc3QgcHVsbHMgPSAoKSA9PiB3LmNhbGxzLmZpbHRlcihjID0+IGMuaW5jbHVkZXMoJ3B1bGwnKSkubGVuZ3RoXG4gIGF3YWl0IHJ1bigkLCAndG9vbHMtZ2l0JylcbiAgY29uc3QgYmFzZSA9IHB1bGxzKClcbiAgYXdhaXQgdy5jbG9jay5hZHZhbmNlKDUgKiA2MCAqIDEwMDApXG4gIGF3YWl0IHJ1bigkLCAndG9vbHMtZ2l0JylcbiAgZXhwZWN0KHB1bGxzKCkpLnRvQmUoYmFzZSlcbiAgYXdhaXQgdy5jbG9jay5hZHZhbmNlKDYgKiA2MCAqIDEwMDApXG4gIHcuc3RhdGUub25saW5lID0gZmFsc2VcbiAgY29uc3QgcmVzID0gYXdhaXQgcnVuKCQsICd0b29scy1naXQnKVxuICBleHBlY3QocHVsbHMoKSkudG9CZShiYXNlICsgMSlcbiAgZXhwZWN0KHJlcy50ZXh0KS50b0NvbnRhaW4oJ+iIiuWFp+WuuScpXG59KVxuXG50ZXN0KCfmjqjpgIHlpLHmlZfmmYLpgoTljp/kuKblm57loLHvvIzkuI3oqLvlhormjIfku6QnLCBPUFRTLCBhc3luYyAoJCwgb24pID0+IHtcbiAgY29uc3QgdyA9IHNldHVwKG9uLCB7IHNlZWQ6IHsgJy5naXQnOiAnMScgfSwgcHVzaE9rOiBmYWxzZSB9KVxuICBhd2FpdCBzdGFydCgkKVxuICBhd2FpdCBydW4oJCwgJ3Nhby1hc3VuYScpXG4gIGNvbnN0IHJlcyA9IGF3YWl0IHJ1bigkLCAnYW5pbWEtd2lraScsICd0b29scyBnaXRcXG7lhaflrrknKVxuICBleHBlY3QocmVzLnRleHQpLnRvQ29udGFpbign5aSx5pWXJylcbiAgZXhwZWN0KHcuY2FsbHMuc29tZShjID0+IGMuaW5jbHVkZXMoJ3Jlc2V0JykpKS50b0JlKHRydWUpXG59KVxuXG50ZXN0KCd0b2tlbiDlj6rmlL7lnKjmjIfku6Tlj4PmlbjvvIzkuI3lr6vlhaXku7vkvZXmqpTmoYgnLCBPUFRTLCBhc3luYyAoJCwgb24pID0+IHtcbiAgY29uc3QgdyA9IHNldHVwKG9uLCB7IHNlZWQ6IHsgJy5naXQnOiAnMScgfSB9KVxuICBhd2FpdCBzdGFydCgkKVxuICBhd2FpdCBydW4oJCwgJ3Nhby1hc3VuYScpXG4gIGF3YWl0IHJ1bigkLCAnYW5pbWEtd2lraScsICd0b29scyBnaXRcXG7lhaflrrknKVxuICBjb25zdCBwdXNoQ2FsbCA9IHcuY2FsbHMuZmluZChjID0+IGMuaW5jbHVkZXMoJ3B1c2gnKSkhXG4gIGV4cGVjdChwdXNoQ2FsbC5qb2luKCcgJykpLnRvQ29udGFpbignQXV0aG9yaXphdGlvbjogdG9rZW4gc2VjcmV0LXRva2VuJylcbiAgZXhwZWN0KFsuLi53LmZpbGVzLnZhbHVlcygpXS5zb21lKHYgPT4gdi5pbmNsdWRlcygnc2VjcmV0LXRva2VuJykpKS50b0JlKGZhbHNlKVxufSlcblxudGVzdCgn6Zui6ZaL6KeS6Imy5b6M5bel5YW36KKr5ouS57WV5Lim5o+Q56S65YWI5ZWf5YuVJywgT1BUUywgYXN5bmMgKCQsIG9uKSA9PiB7XG4gIGNvbnN0IHcgPSBzZXR1cChvbiwgeyBzZWVkOiB7ICcuZ2l0JzogJzEnIH0gfSlcbiAgYXdhaXQgc3RhcnQoJClcbiAgYXdhaXQgcnVuKCQsICdzYW8tYXN1bmEnKVxuICBhd2FpdCBydW4oJCwgJ2FuaW1hLW9mZicpXG4gIGNvbnN0IHJlcyA9IGF3YWl0IHJ1bigkLCAnYW5pbWEtd2lraScsICd0b29scyBnaXRcXG7lhaflrrknKVxuICBleHBlY3QocmVzLnRleHQpLnRvQ29udGFpbign6KuL5YWI5ZWf5YuV6KeS6ImyJylcbiAgZXhwZWN0KHcuc3RhdGUuY29tbWl0cy5sZW5ndGgpLnRvQmUoMClcbn0pXG4iXSwiZmlsZSI6Ii9ob29rcy93aWtpLnRlc3QudHMifQ==
|
||
|
||
//# vitestCache=W3siZmlsZSI6IjEiLCJpZCI6IjEiLCJ1cmwiOiIyIiwiaW1wb3J0cyI6IjMiLCJtYXBwaW5ncyI6ZmFsc2UsImRlcHMiOiI0IiwiZHluYW1pY0RlcHMiOiI1Iiwic3RhdGljTW9ja3MiOm51bGx9LCIvcm9vdC9qc2MtYW5pbWEvaG9va3Mvd2lraS50ZXN0LnRzIiwiL2hvb2tzL3dpa2kudGVzdC50cyIseyJ1cmxzIjoiNiIsImlkcyI6IjcifSxbIjgiXSxbXSxbIjgiXSx7fSwiY2xhdWRlLWNvZGUvdGVzdGluZyJd |