



























@@ -21,6 +21,10 @@ type ListMarketplacePluginsFn =
2121(typeof import("../plugins/marketplace.js"))["listMarketplacePlugins"];
2222type ResolveMarketplaceInstallShortcutFn =
2323(typeof import("../plugins/marketplace.js"))["resolveMarketplaceInstallShortcut"];
24+type UpdateNpmInstalledPluginsFn =
25+(typeof import("../plugins/update.js"))["updateNpmInstalledPlugins"];
26+type UpdateNpmInstalledHookPacksFn =
27+(typeof import("../hooks/update.js"))["updateNpmInstalledHookPacks"];
2428type PluginInstallRecordMap = Record<string, PluginInstallRecord>;
25292630let mockInstalledPluginIndexInstallRecords: PluginInstallRecordMap = {};
@@ -37,6 +41,7 @@ function invokeMock<TArgs extends unknown[], TResult>(mock: unknown, ...args: TA
37413842export const loadConfig: Mock<LoadConfigFn> = vi.fn<LoadConfigFn>(() => ({}) as OpenClawConfig);
3943export const readConfigFileSnapshot: AsyncUnknownMock = vi.fn();
44+export const readConfigFileSnapshotForWrite: AsyncUnknownMock = vi.fn();
4045export const writeConfigFile: AsyncUnknownMock = vi.fn(async () => undefined);
4146export const replaceConfigFile: AsyncUnknownMock = vi.fn(
4247async (params: { nextConfig: OpenClawConfig }) => await writeConfigFile(params.nextConfig),
@@ -73,8 +78,8 @@ export const applyExclusiveSlotSelection: UnknownMock = vi.fn();
7378export const planPluginUninstall: UnknownMock = vi.fn();
7479export const applyPluginUninstallDirectoryRemoval: AsyncUnknownMock = vi.fn();
7580const uninstallPlugin: AsyncUnknownMock = vi.fn();
76-export const updateNpmInstalledPlugins: AsyncUnknownMock = vi.fn();
77-export const updateNpmInstalledHookPacks: AsyncUnknownMock = vi.fn();
81+export const updateNpmInstalledPlugins: Mock<UpdateNpmInstalledPluginsFn> = vi.fn();
82+export const updateNpmInstalledHookPacks: Mock<UpdateNpmInstalledHookPacksFn> = vi.fn();
7883export const promptYesNo: AsyncUnknownMock = vi.fn();
7984export class PromptInputClosedError extends Error {
8085constructor() {
@@ -191,6 +196,16 @@ vi.mock("../config/config.js", () => ({
191196readConfigFileSnapshot,
192197 ...args,
193198)) as (typeof import("../config/config.js"))["readConfigFileSnapshot"],
199+readConfigFileSnapshotForWrite: ((
200+ ...args: Parameters<(typeof import("../config/config.js"))["readConfigFileSnapshotForWrite"]>
201+) =>
202+invokeMock<
203+Parameters<(typeof import("../config/config.js"))["readConfigFileSnapshotForWrite"]>,
204+ReturnType<(typeof import("../config/config.js"))["readConfigFileSnapshotForWrite"]>
205+>(
206+readConfigFileSnapshotForWrite,
207+ ...args,
208+)) as (typeof import("../config/config.js"))["readConfigFileSnapshotForWrite"],
194209writeConfigFile: ((config: OpenClawConfig) =>
195210invokeMock<
196211[OpenClawConfig],
@@ -481,18 +496,22 @@ vi.mock("../plugins/uninstall.js", async (importOriginal) => {
481496};
482497});
483498484-vi.mock("../plugins/update.js", () => ({
485-updateNpmInstalledPlugins: ((
486- ...args: Parameters<(typeof import("../plugins/update.js"))["updateNpmInstalledPlugins"]>
487-) =>
488-invokeMock<
489-Parameters<(typeof import("../plugins/update.js"))["updateNpmInstalledPlugins"]>,
490-ReturnType<(typeof import("../plugins/update.js"))["updateNpmInstalledPlugins"]>
491->(
492-updateNpmInstalledPlugins,
493- ...args,
494-)) as (typeof import("../plugins/update.js"))["updateNpmInstalledPlugins"],
495-}));
499+vi.mock("../plugins/update.js", async (importOriginal) => {
500+const actual = await importOriginal<typeof import("../plugins/update.js")>();
501+return {
502+ ...actual,
503+updateNpmInstalledPlugins: ((
504+ ...args: Parameters<(typeof import("../plugins/update.js"))["updateNpmInstalledPlugins"]>
505+) =>
506+invokeMock<
507+Parameters<(typeof import("../plugins/update.js"))["updateNpmInstalledPlugins"]>,
508+ReturnType<(typeof import("../plugins/update.js"))["updateNpmInstalledPlugins"]>
509+>(
510+updateNpmInstalledPlugins,
511+ ...args,
512+)) as (typeof import("../plugins/update.js"))["updateNpmInstalledPlugins"],
513+};
514+});
496515497516vi.mock("../hooks/update.js", () => ({
498517updateNpmInstalledHookPacks: ((
@@ -679,6 +698,7 @@ export function resetPluginsCliTestState() {
679698restoreRuntimeCaptureMocks();
680699loadConfig.mockReset();
681700readConfigFileSnapshot.mockReset();
701+readConfigFileSnapshotForWrite.mockReset();
682702writeConfigFile.mockReset();
683703replaceConfigFile.mockReset();
684704resolveStateDir.mockReset();
@@ -737,6 +757,17 @@ export function resetPluginsCliTestState() {
737757legacyIssues: [],
738758};
739759});
760+readConfigFileSnapshotForWrite.mockImplementation(async () => {
761+const snapshot = (await readConfigFileSnapshot()) as { path: string };
762+return {
763+ snapshot,
764+writeOptions: {
765+assertConfigPathForWrite: () => {},
766+expectedConfigPath: snapshot.path,
767+ownedConfigPathForWrite: snapshot.path,
768+},
769+};
770+});
740771writeConfigFile.mockResolvedValue(undefined);
741772replaceConfigFile.mockImplementation(
742773(async (params: { nextConfig: OpenClawConfig }) =>
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。