feat(desktop): add OPENCODE_TEST_ONBOARDING env (#25968)
This commit is contained in:
@@ -1,9 +1,9 @@
|
|||||||
import { randomUUID } from "node:crypto"
|
import { randomUUID } from "node:crypto"
|
||||||
import { EventEmitter } from "node:events"
|
import { EventEmitter } from "node:events"
|
||||||
import { existsSync } from "node:fs"
|
import { existsSync, mkdirSync, rmSync } from "node:fs"
|
||||||
import * as http from "node:http"
|
import * as http from "node:http"
|
||||||
import { createServer } from "node:net"
|
import { createServer } from "node:net"
|
||||||
import { homedir } from "node:os"
|
import { homedir, tmpdir } from "node:os"
|
||||||
import { join } from "node:path"
|
import { join } from "node:path"
|
||||||
import { getCACertificates, setDefaultCACertificates } from "node:tls"
|
import { getCACertificates, setDefaultCACertificates } from "node:tls"
|
||||||
import type { Event } from "electron"
|
import type { Event } from "electron"
|
||||||
@@ -30,10 +30,17 @@ const APP_IDS: Record<string, string> = {
|
|||||||
beta: "ai.opencode.desktop.beta",
|
beta: "ai.opencode.desktop.beta",
|
||||||
prod: "ai.opencode.desktop",
|
prod: "ai.opencode.desktop",
|
||||||
}
|
}
|
||||||
|
const TEST_ONBOARDING = process.env.OPENCODE_TEST_ONBOARDING === "1"
|
||||||
const appId = app.isPackaged ? APP_IDS[CHANNEL] : "ai.opencode.desktop.dev"
|
const appId = app.isPackaged ? APP_IDS[CHANNEL] : "ai.opencode.desktop.dev"
|
||||||
|
const onboardingTestRoot = setupOnboardingTestEnv()
|
||||||
app.setName(app.isPackaged ? APP_NAMES[CHANNEL] : "OpenCode Dev")
|
app.setName(app.isPackaged ? APP_NAMES[CHANNEL] : "OpenCode Dev")
|
||||||
app.setAppUserModelId(appId)
|
app.setAppUserModelId(appId)
|
||||||
app.setPath("userData", join(app.getPath("appData"), appId))
|
app.setPath(
|
||||||
|
"userData",
|
||||||
|
onboardingTestRoot ? join(onboardingTestRoot, "desktop") : join(app.getPath("appData"), appId),
|
||||||
|
)
|
||||||
|
if (onboardingTestRoot) app.setPath("sessionData", join(onboardingTestRoot, "session"))
|
||||||
|
const logger = initLogging()
|
||||||
const { autoUpdater } = pkg
|
const { autoUpdater } = pkg
|
||||||
|
|
||||||
import type { InitStep, ServerReadyData, SqliteMigrationProgress, WslConfig } from "../preload/types"
|
import type { InitStep, ServerReadyData, SqliteMigrationProgress, WslConfig } from "../preload/types"
|
||||||
@@ -65,13 +72,29 @@ const loadingComplete = defer<void>()
|
|||||||
const pendingDeepLinks: string[] = []
|
const pendingDeepLinks: string[] = []
|
||||||
|
|
||||||
const serverReady = defer<ServerReadyData>()
|
const serverReady = defer<ServerReadyData>()
|
||||||
const logger = initLogging()
|
|
||||||
|
|
||||||
useSystemCertificates()
|
useSystemCertificates()
|
||||||
|
|
||||||
|
function setupOnboardingTestEnv() {
|
||||||
|
if (!TEST_ONBOARDING) return
|
||||||
|
|
||||||
|
const root = join(tmpdir(), `opencode-onboarding-${randomUUID()}`)
|
||||||
|
rmSync(root, { recursive: true, force: true })
|
||||||
|
;["data", "config", "cache", "state", "desktop", "session"].forEach((dir) =>
|
||||||
|
mkdirSync(join(root, dir), { recursive: true }),
|
||||||
|
)
|
||||||
|
process.env.OPENCODE_DB = ":memory:"
|
||||||
|
process.env.XDG_DATA_HOME = join(root, "data")
|
||||||
|
process.env.XDG_CONFIG_HOME = join(root, "config")
|
||||||
|
process.env.XDG_CACHE_HOME = join(root, "cache")
|
||||||
|
process.env.XDG_STATE_HOME = join(root, "state")
|
||||||
|
return root
|
||||||
|
}
|
||||||
|
|
||||||
logger.log("app starting", {
|
logger.log("app starting", {
|
||||||
version: app.getVersion(),
|
version: app.getVersion(),
|
||||||
packaged: app.isPackaged,
|
packaged: app.isPackaged,
|
||||||
|
onboardingTest: Boolean(onboardingTestRoot),
|
||||||
})
|
})
|
||||||
|
|
||||||
setupApp()
|
setupApp()
|
||||||
@@ -118,7 +141,7 @@ function setupApp() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void app.whenReady().then(async () => {
|
void app.whenReady().then(async () => {
|
||||||
migrate()
|
if (!TEST_ONBOARDING) migrate()
|
||||||
app.setAsDefaultProtocolClient("opencode")
|
app.setAsDefaultProtocolClient("opencode")
|
||||||
registerRendererProtocol()
|
registerRendererProtocol()
|
||||||
setDockIcon()
|
setDockIcon()
|
||||||
@@ -344,6 +367,8 @@ async function getSidecarPort() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function sqliteFileExists() {
|
function sqliteFileExists() {
|
||||||
|
if (process.env.OPENCODE_DB === ":memory:") return true
|
||||||
|
|
||||||
const xdg = process.env.XDG_DATA_HOME
|
const xdg = process.env.XDG_DATA_HOME
|
||||||
const base = xdg && xdg.length > 0 ? xdg : join(homedir(), ".local", "share")
|
const base = xdg && xdg.length > 0 ? xdg : join(homedir(), ".local", "share")
|
||||||
return existsSync(join(base, "opencode", "opencode.db"))
|
return existsSync(join(base, "opencode", "opencode.db"))
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ function prepareServerEnv(password: string) {
|
|||||||
OPENCODE_CLIENT: "desktop",
|
OPENCODE_CLIENT: "desktop",
|
||||||
OPENCODE_SERVER_USERNAME: "opencode",
|
OPENCODE_SERVER_USERNAME: "opencode",
|
||||||
OPENCODE_SERVER_PASSWORD: password,
|
OPENCODE_SERVER_PASSWORD: password,
|
||||||
XDG_STATE_HOME: app.getPath("userData"),
|
XDG_STATE_HOME: process.env.XDG_STATE_HOME ?? app.getPath("userData"),
|
||||||
}
|
}
|
||||||
Object.assign(process.env, env)
|
Object.assign(process.env, env)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import Store from "electron-store"
|
import Store from "electron-store"
|
||||||
|
import { app } from "electron"
|
||||||
|
|
||||||
import { SETTINGS_STORE } from "./constants"
|
import { SETTINGS_STORE } from "./constants"
|
||||||
|
|
||||||
@@ -11,7 +12,12 @@ const cache = new Map<string, Store>()
|
|||||||
export function getStore(name = SETTINGS_STORE) {
|
export function getStore(name = SETTINGS_STORE) {
|
||||||
const cached = cache.get(name)
|
const cached = cache.get(name)
|
||||||
if (cached) return cached
|
if (cached) return cached
|
||||||
const next = new Store({ name, fileExtension: "", accessPropertiesByDotNotation: false })
|
const next = new Store({
|
||||||
|
name,
|
||||||
|
cwd: app.getPath("userData"),
|
||||||
|
fileExtension: "",
|
||||||
|
accessPropertiesByDotNotation: false,
|
||||||
|
})
|
||||||
cache.set(name, next)
|
cache.set(name, next)
|
||||||
return next
|
return next
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user