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

65 lines
2.7 KiB
TypeScript

import { expect, test } from "bun:test"
import type { Configuration } from "electron-builder"
const legacyDesktopEntry = "resources/linux/opencode-desktop.desktop"
const channels = [
{ channel: "dev", appId: "ai.opencode.desktop.dev" },
{ channel: "beta", appId: "ai.opencode.desktop.beta" },
{ channel: "prod", appId: "ai.opencode.desktop" },
] as const
for (const channel of channels) {
test(`uses one Linux desktop identity for ${channel.channel}`, async () => {
const previous = process.env.OPENCODE_CHANNEL
process.env.OPENCODE_CHANNEL = channel.channel
const module = await import(`./electron-builder.config.ts?channel=${channel.channel}`)
const config = module.default as Configuration
if (previous === undefined) delete process.env.OPENCODE_CHANNEL
else process.env.OPENCODE_CHANNEL = previous
expect(config.appId).toBe(channel.appId)
expect(config.extraMetadata?.desktopName).toBe(`${channel.appId}.desktop`)
expect(config.linux?.executableName).toBe(channel.appId)
expect(config.linux?.desktop?.entry?.StartupWMClass).toBe(channel.appId)
})
}
test("keeps a hidden prod launcher for old Linux pins", async () => {
const previous = process.env.OPENCODE_CHANNEL
process.env.OPENCODE_CHANNEL = "prod"
const module = await import("./electron-builder.config.ts?compat=prod")
const config = module.default as Configuration
if (previous === undefined) delete process.env.OPENCODE_CHANNEL
else process.env.OPENCODE_CHANNEL = previous
expect(config.deb?.fpm?.[0]).toEndWith(`${legacyDesktopEntry}=/usr/share/applications/opencode-desktop.desktop`)
expect(config.rpm?.fpm?.[0]).toEndWith(`${legacyDesktopEntry}=/usr/share/applications/opencode-desktop.desktop`)
const desktop = await Bun.file(legacyDesktopEntry).text()
expect(desktop).toContain("Exec=/opt/OpenCode/ai.opencode.desktop %U")
expect(desktop).toContain("Icon=ai.opencode.desktop")
expect(desktop).toContain("StartupWMClass=ai.opencode.desktop")
expect(desktop).toContain("NoDisplay=true")
})
test("packages server native assets outside ASAR", async () => {
const module = await import("./electron-builder.config")
const config = module.default
const resources = Array.isArray(config.extraResources) ? config.extraResources : []
expect(config.files).toContain("!resources/server-assets/**/*")
expect(resources).toContainEqual({ from: "resources/server-assets/", to: "server-assets/" })
})
test("keeps target native variants out of packaged production dependencies", async () => {
const pkg = await Bun.file("package.json").json()
expect(pkg.optionalDependencies).toBeUndefined()
expect(pkg.devDependencies["@lydell/node-pty-win32-arm64"]).toBe("1.2.0-beta.12")
expect(pkg.devDependencies["@parcel/watcher-win32-arm64"]).toBe("2.5.1")
})