import { fromLenientJson } from "@t3tools/shared/schemaJson"; import * as Option from "effect/Option"; import * as Schema from "effect/Schema"; import { DEFAULT_LINUX_PASSWORD_STORE, normalizeLinuxPasswordStorePreference, resolveLinuxPasswordStoreSwitch, type LinuxPasswordStoreSwitch, type LinuxPasswordStorePreference, } from "../linuxSecretStorage.ts"; import { resolveDesktopBaseDir, resolveDesktopStateDir, type JoinPath, } from "./DesktopStatePaths.ts"; interface EarlyDesktopSettingsInput { readonly env: NodeJS.ProcessEnv; readonly homeDirectory: string; readonly joinPath: JoinPath; readonly readFileString: (path: string) => string; } type EarlyLinuxElectronOptionsInput = EarlyDesktopSettingsInput; export interface EarlyLinuxElectronOptions { readonly linuxWmClass: string; readonly passwordStore: LinuxPasswordStoreSwitch | null; } const trimNonEmpty = (value: string | undefined): string | null => { const trimmed = value?.trim(); return trimmed && trimmed.length > 0 ? trimmed : null; }; const EarlyDesktopSettingsJson = fromLenientJson( Schema.Struct({ linuxPasswordStore: Schema.optionalKey(Schema.Unknown), }), ); const decodeEarlyDesktopSettingsJson = Schema.decodeSync(EarlyDesktopSettingsJson); const isDevelopmentEnvironment = (env: NodeJS.ProcessEnv): boolean => trimNonEmpty(env.VITE_DEV_SERVER_URL) !== null; function resolveEarlyDesktopSettingsPath(input: { readonly env: NodeJS.ProcessEnv; readonly homeDirectory: string; readonly joinPath: JoinPath; }): string { const t3Home = Option.fromUndefinedOr(input.env.T3CODE_HOME); const baseDir = resolveDesktopBaseDir({ homeDirectory: input.homeDirectory, joinPath: input.joinPath, t3Home, }); const stateDir = resolveDesktopStateDir({ baseDir, isDevelopment: isDevelopmentEnvironment(input.env), joinPath: input.joinPath, t3Home, }); return input.joinPath(stateDir, "desktop-settings.json"); } export function resolveEarlyLinuxPasswordStorePreference( input: EarlyDesktopSettingsInput, ): LinuxPasswordStorePreference { const settingsPath = resolveEarlyDesktopSettingsPath(input); try { const parsed = decodeEarlyDesktopSettingsJson(input.readFileString(settingsPath)); return normalizeLinuxPasswordStorePreference(parsed.linuxPasswordStore); } catch { return DEFAULT_LINUX_PASSWORD_STORE; } } export function resolveEarlyLinuxElectronOptions( input: EarlyLinuxElectronOptionsInput, ): EarlyLinuxElectronOptions { const preference = resolveEarlyLinuxPasswordStorePreference(input); return { linuxWmClass: isDevelopmentEnvironment(input.env) ? "t3code-dev" : "t3code", passwordStore: resolveLinuxPasswordStoreSwitch({ preference, env: input.env, }), }; }