diff --git a/apps/web/src/lib/notebook-delete.test.mjs b/apps/web/src/lib/notebook-delete.test.mjs index b0f0fffc..b7a606a5 100644 --- a/apps/web/src/lib/notebook-delete.test.mjs +++ b/apps/web/src/lib/notebook-delete.test.mjs @@ -1,5 +1,11 @@ import { describe, expect, test } from "bun:test"; -import { notebookDeleteIdsFromPayload, notebooksBlockedByPendingDeletes } from "./notebook-delete.ts"; +import { isNotebookNotEmptyError, notebookDeleteIdsFromPayload, notebooksBlockedByPendingDeletes } from "./notebook-delete.ts"; + +test("recognizes a notebook with notes through Electron's IPC error wrapper", () => { + expect(isNotebookNotEmptyError(new Error("notebook_not_empty"))).toBe(true); + expect(isNotebookNotEmptyError(new Error("Error invoking remote method 'desktop:sidecar-request': Error: notebook_not_empty"))).toBe(true); + expect(isNotebookNotEmptyError(new Error("Error invoking remote method 'desktop:sidecar-request': Error: database is busy"))).toBe(false); +}); describe("notebook delete ids", () => { test("uses the ordered descendant list and falls back to the single id", () => { diff --git a/apps/web/src/lib/notebook-delete.ts b/apps/web/src/lib/notebook-delete.ts index 61f6aaa4..7b42073e 100644 --- a/apps/web/src/lib/notebook-delete.ts +++ b/apps/web/src/lib/notebook-delete.ts @@ -12,7 +12,9 @@ export const isNotebookNotEmptyError = (error: unknown) => { if (typeof error === "object" && error !== null && "code" in error && (error as { code?: unknown }).code === "notebook_not_empty") { return true; } - return error instanceof Error && error.message === "notebook_not_empty"; + // Electron prefixes errors thrown by the sidecar IPC handler, for example: + // Error invoking remote method 'desktop:sidecar-request': Error: notebook_not_empty + return error instanceof Error && /(?:^|:\s*)notebook_not_empty$/.test(error.message.trim()); }; export const notebookDeleteIdsFromPayload = (