/** * Electron preload script (TypeScript) * * Only exposes native features (dialogs, shell) and server URL. * All other operations go through HTTP API. */ import { contextBridge, ipcRenderer, OpenDialogOptions, SaveDialogOptions } from 'electron'; // Expose minimal API for native features contextBridge.exposeInMainWorld('electronAPI', { // Platform info platform: process.platform, isElectron: true, // Connection check ping: (): Promise => ipcRenderer.invoke('ping'), // Get server URL for HTTP client getServerUrl: (): Promise => ipcRenderer.invoke('server:getUrl'), // Get API key for authentication getApiKey: (): Promise => ipcRenderer.invoke('auth:getApiKey'), // Native dialogs - better UX than prompt() openDirectory: (): Promise => ipcRenderer.invoke('dialog:openDirectory'), openFile: (options?: OpenDialogOptions): Promise => ipcRenderer.invoke('dialog:openFile', options), saveFile: (options?: SaveDialogOptions): Promise => ipcRenderer.invoke('dialog:saveFile', options), // Shell operations openExternalLink: (url: string): Promise<{ success: boolean; error?: string }> => ipcRenderer.invoke('shell:openExternal', url), openPath: (filePath: string): Promise<{ success: boolean; error?: string }> => ipcRenderer.invoke('shell:openPath', filePath), openInEditor: ( filePath: string, line?: number, column?: number ): Promise<{ success: boolean; error?: string }> => ipcRenderer.invoke('shell:openInEditor', filePath, line, column), // App info getPath: (name: string): Promise => ipcRenderer.invoke('app:getPath', name), getVersion: (): Promise => ipcRenderer.invoke('app:getVersion'), isPackaged: (): Promise => ipcRenderer.invoke('app:isPackaged'), // Window management updateMinWidth: (sidebarExpanded: boolean): Promise => ipcRenderer.invoke('window:updateMinWidth', sidebarExpanded), // App control quit: (): Promise => ipcRenderer.invoke('app:quit'), }); console.log('[Preload] Electron API exposed (TypeScript)');