fix(preload): keep zod out of sandbox bundle

This commit is contained in:
ZacharyZhang-NY committed 2026-04-22 18:31:24 -04:00
1 parent fa006524c2
commit 710448a75f
4 files changed
+19 -7

No files matched your search

+1
View File
@@ -58,6 +58,7 @@ oldreference/
!/docs/architecture/*.md
!/CLAUDE.md
!/AGENTS.md
!/问题.md
!/.planning/**/*.md
!/src/main/prompt-builder/**/*.md
!/scripts/README.md
+1 -4
View File
@@ -22,10 +22,7 @@ export default defineConfig({
},
},
preload: {
// zod is bundled into preload because preload runs as sandboxed CJS
// and cannot resolve externalized ESM deps at runtime. Inlining keeps
// IPC Zod validation working inside the preload layer.
plugins: [externalizeDepsPlugin({ exclude: ["zod"] })],
plugins: [externalizeDepsPlugin()],
resolve: {
alias: {
"@shared": resolve("src/shared"),
+3 -3
View File
@@ -1,11 +1,11 @@
import { contextBridge, ipcRenderer } from "electron";
import { IPC_CHANNELS } from "@shared/contracts/channels";
import type { DesktopApi } from "@shared/contracts/desktop-api";
import {
IPC_CHANNELS,
PRELOAD_FORWARDERS,
mapPreloadInvokeArgs,
type DesktopApi,
type PreloadForwardedApi,
} from "@shared/contracts";
} from "@shared/contracts/preload-forwarders";
import type { DesktopEvent } from "@shared/types";
function createForwardedApi(): PreloadForwardedApi {
@@ -0,0 +1,14 @@
import { readFileSync } from "node:fs";
import { join } from "node:path";
import { describe, expect, it } from "vitest";
describe("preload bundling contract", () => {
it("keeps Zod validation on the main-process IPC boundary", () => {
const configSource = readFileSync(join(process.cwd(), "electron.vite.config.ts"), "utf8");
const preloadSource = readFileSync(join(process.cwd(), "src/preload/index.ts"), "utf8");
expect(configSource).not.toContain('exclude: ["zod"]');
expect(preloadSource).not.toContain('from "@shared/contracts"');
expect(preloadSource).not.toMatch(/from ["']zod["']|require\(["']zod["']\)/);
});
});