Skip to content

Commit efd8024

Browse files
authored
feat(desktop): add OPENCODE_TEST_ONBOARDING env (anomalyco#25968)
1 parent 2f05676 commit efd8024

3 files changed

Lines changed: 38 additions & 7 deletions

File tree

packages/desktop/src/main/index.ts

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { randomUUID } from "node:crypto"
22
import { EventEmitter } from "node:events"
3-
import { existsSync } from "node:fs"
3+
import { existsSync, mkdirSync, rmSync } from "node:fs"
44
import * as http from "node:http"
55
import { createServer } from "node:net"
6-
import { homedir } from "node:os"
6+
import { homedir, tmpdir } from "node:os"
77
import { join } from "node:path"
88
import { getCACertificates, setDefaultCACertificates } from "node:tls"
99
import type { Event } from "electron"
@@ -30,10 +30,17 @@ const APP_IDS: Record<string, string> = {
3030
beta: "ai.opencode.desktop.beta",
3131
prod: "ai.opencode.desktop",
3232
}
33+
const TEST_ONBOARDING = process.env.OPENCODE_TEST_ONBOARDING === "1"
3334
const appId = app.isPackaged ? APP_IDS[CHANNEL] : "ai.opencode.desktop.dev"
35+
const onboardingTestRoot = setupOnboardingTestEnv()
3436
app.setName(app.isPackaged ? APP_NAMES[CHANNEL] : "OpenCode Dev")
3537
app.setAppUserModelId(appId)
36-
app.setPath("userData", join(app.getPath("appData"), appId))
38+
app.setPath(
39+
"userData",
40+
onboardingTestRoot ? join(onboardingTestRoot, "desktop") : join(app.getPath("appData"), appId),
41+
)
42+
if (onboardingTestRoot) app.setPath("sessionData", join(onboardingTestRoot, "session"))
43+
const logger = initLogging()
3744
const { autoUpdater } = pkg
3845

3946
import type { InitStep, ServerReadyData, SqliteMigrationProgress, WslConfig } from "../preload/types"
@@ -65,13 +72,29 @@ const loadingComplete = defer<void>()
6572
const pendingDeepLinks: string[] = []
6673

6774
const serverReady = defer<ServerReadyData>()
68-
const logger = initLogging()
6975

7076
useSystemCertificates()
7177

78+
function setupOnboardingTestEnv() {
79+
if (!TEST_ONBOARDING) return
80+
81+
const root = join(tmpdir(), `opencode-onboarding-${randomUUID()}`)
82+
rmSync(root, { recursive: true, force: true })
83+
;["data", "config", "cache", "state", "desktop", "session"].forEach((dir) =>
84+
mkdirSync(join(root, dir), { recursive: true }),
85+
)
86+
process.env.OPENCODE_DB = ":memory:"
87+
process.env.XDG_DATA_HOME = join(root, "data")
88+
process.env.XDG_CONFIG_HOME = join(root, "config")
89+
process.env.XDG_CACHE_HOME = join(root, "cache")
90+
process.env.XDG_STATE_HOME = join(root, "state")
91+
return root
92+
}
93+
7294
logger.log("app starting", {
7395
version: app.getVersion(),
7496
packaged: app.isPackaged,
97+
onboardingTest: Boolean(onboardingTestRoot),
7598
})
7699

77100
setupApp()
@@ -118,7 +141,7 @@ function setupApp() {
118141
}
119142

120143
void app.whenReady().then(async () => {
121-
migrate()
144+
if (!TEST_ONBOARDING) migrate()
122145
app.setAsDefaultProtocolClient("opencode")
123146
registerRendererProtocol()
124147
setDockIcon()
@@ -344,6 +367,8 @@ async function getSidecarPort() {
344367
}
345368

346369
function sqliteFileExists() {
370+
if (process.env.OPENCODE_DB === ":memory:") return true
371+
347372
const xdg = process.env.XDG_DATA_HOME
348373
const base = xdg && xdg.length > 0 ? xdg : join(homedir(), ".local", "share")
349374
return existsSync(join(base, "opencode", "opencode.db"))

packages/desktop/src/main/server.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ function prepareServerEnv(password: string) {
7070
OPENCODE_CLIENT: "desktop",
7171
OPENCODE_SERVER_USERNAME: "opencode",
7272
OPENCODE_SERVER_PASSWORD: password,
73-
XDG_STATE_HOME: app.getPath("userData"),
73+
XDG_STATE_HOME: process.env.XDG_STATE_HOME ?? app.getPath("userData"),
7474
}
7575
Object.assign(process.env, env)
7676
}

packages/desktop/src/main/store.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import Store from "electron-store"
2+
import { app } from "electron"
23

34
import { SETTINGS_STORE } from "./constants"
45

@@ -11,7 +12,12 @@ const cache = new Map<string, Store>()
1112
export function getStore(name = SETTINGS_STORE) {
1213
const cached = cache.get(name)
1314
if (cached) return cached
14-
const next = new Store({ name, fileExtension: "", accessPropertiesByDotNotation: false })
15+
const next = new Store({
16+
name,
17+
cwd: app.getPath("userData"),
18+
fileExtension: "",
19+
accessPropertiesByDotNotation: false,
20+
})
1521
cache.set(name, next)
1622
return next
1723
}

0 commit comments

Comments
 (0)