opencode/packages/desktop/electron.vite.config.ts
2026-07-28 16:55:54 +10:00

87 lines
2.6 KiB
TypeScript

import { sentryVitePlugin } from "@sentry/vite-plugin"
import { defineConfig } from "electron-vite"
import appPlugin from "@opencode-ai/app/vite"
import { serverVite } from "@opencode-ai/sdk-next/vite"
import { getServerTarget } from "./scripts/target"
const channel = (() => {
const raw = process.env.OPENCODE_CHANNEL
if (raw === "dev" || raw === "beta" || raw === "prod") return raw
if (process.env.OPENCODE_CHANNEL === "latest") return "prod"
return "dev"
})()
const server = serverVite()
const target = getServerTarget()
const sentry =
process.env.SENTRY_AUTH_TOKEN && process.env.SENTRY_ORG && process.env.SENTRY_PROJECT
? sentryVitePlugin({
authToken: process.env.SENTRY_AUTH_TOKEN,
org: process.env.SENTRY_ORG,
project: process.env.SENTRY_PROJECT,
telemetry: false,
release: {
name: process.env.SENTRY_RELEASE ?? process.env.VITE_SENTRY_RELEASE,
},
sourcemaps: {
assets: "./out/renderer/**",
filesToDeleteAfterUpload: "./out/renderer/**/*.map",
},
})
: false
export default defineConfig({
main: {
resolve: server.resolve,
define: {
"import.meta.env.OPENCODE_CHANNEL": JSON.stringify(channel),
OPENCODE_LIBC: target.platform === "linux" ? JSON.stringify("glibc") : "undefined",
FFF_LIBC: target.platform === "linux" ? JSON.stringify("gnu") : "undefined",
},
build: {
target: "node24",
externalizeDeps: { exclude: ["@opencode-ai/client"] },
rollupOptions: {
input: { index: "src/main/index.ts", sidecar: "src/main/sidecar.ts" },
external: [/^@opencode-ai\/simulation(?:\/|$)/],
// Keep this identical to electron-vite's Node 20.11+ shim. Its regex insertion can
// corrupt bundled TypeScript, while a Rollup banner places the shim safely.
output: {
banner: `
// -- CommonJS Shims --
import __cjs_mod__ from 'node:module';
const __filename = import.meta.filename;
const __dirname = import.meta.dirname;
const require = __cjs_mod__.createRequire(import.meta.url);
`,
},
},
},
plugins: server.plugins,
},
preload: {
build: {
rollupOptions: {
input: { index: "src/preload/index.ts" },
output: {
format: "cjs",
entryFileNames: "[name].js",
},
},
},
},
renderer: {
plugins: [appPlugin, sentry],
publicDir: "../../../app/public",
root: "src/renderer",
build: {
sourcemap: true,
rollupOptions: {
input: {
main: "src/renderer/index.html",
},
},
},
},
})