import { contextBridge, ipcRenderer, type IpcRendererEvent } from 'electron' import { electronAPI } from '@electron-toolkit/preload' import type { DdevAddonRegistryEntry, DdevInstalledAddon, DdevProjectDetail, DdevProjectSummary, DdevSnapshot, LogDataEvent, LogExitEvent, TerminalDataEvent, TerminalExitEvent } from '../shared/types' // Custom APIs for renderer const api = { projects: { list: (): Promise => ipcRenderer.invoke('projects:list'), describe: (name: string): Promise => ipcRenderer.invoke('projects:describe', name), start: (operationId: string, name: string): Promise => ipcRenderer.invoke('projects:start', operationId, name), stop: (operationId: string, name: string): Promise => ipcRenderer.invoke('projects:stop', operationId, name), restart: (operationId: string, name: string): Promise => ipcRenderer.invoke('projects:restart', operationId, name) }, terminal: { cancel: (operationId: string): Promise => ipcRenderer.invoke('terminal:cancel', operationId), onData: (callback: (event: TerminalDataEvent) => void): (() => void) => { const listener = (_event: IpcRendererEvent, data: TerminalDataEvent): void => callback(data) ipcRenderer.on('terminal:data', listener) return () => ipcRenderer.removeListener('terminal:data', listener) }, onExit: (callback: (event: TerminalExitEvent) => void): (() => void) => { const listener = (_event: IpcRendererEvent, data: TerminalExitEvent): void => callback(data) ipcRenderer.on('terminal:exit', listener) return () => ipcRenderer.removeListener('terminal:exit', listener) } }, database: { listSnapshots: (name: string, approot: string): Promise => ipcRenderer.invoke('database:listSnapshots', name, approot), createSnapshot: (operationId: string, approot: string, snapshotName?: string): Promise => ipcRenderer.invoke('database:createSnapshot', operationId, approot, snapshotName), restoreSnapshot: (operationId: string, approot: string, snapshotName: string): Promise => ipcRenderer.invoke('database:restoreSnapshot', operationId, approot, snapshotName), deleteSnapshot: (operationId: string, approot: string, snapshotName: string): Promise => ipcRenderer.invoke('database:deleteSnapshot', operationId, approot, snapshotName), importFile: (operationId: string, approot: string, filePath: string): Promise => ipcRenderer.invoke('database:importFile', operationId, approot, filePath), exportFile: (operationId: string, approot: string, filePath: string): Promise => ipcRenderer.invoke('database:exportFile', operationId, approot, filePath), pickImportFile: (): Promise => ipcRenderer.invoke('database:pickImportFile'), pickExportPath: (defaultFileName: string): Promise => ipcRenderer.invoke('database:pickExportPath', defaultFileName) }, addons: { listRegistry: (): Promise => ipcRenderer.invoke('addons:listRegistry'), listInstalled: (name: string): Promise => ipcRenderer.invoke('addons:listInstalled', name), install: (operationId: string, name: string, addonRepo: string): Promise => ipcRenderer.invoke('addons:install', operationId, name, addonRepo), remove: (operationId: string, name: string, addonName: string): Promise => ipcRenderer.invoke('addons:remove', operationId, name, addonName) }, logs: { start: (operationId: string, name: string, service: string): Promise => ipcRenderer.invoke('logs:start', operationId, name, service), onData: (callback: (event: LogDataEvent) => void): (() => void) => { const listener = (_event: IpcRendererEvent, data: LogDataEvent): void => callback(data) ipcRenderer.on('logs:data', listener) return () => ipcRenderer.removeListener('logs:data', listener) }, onExit: (callback: (event: LogExitEvent) => void): (() => void) => { const listener = (_event: IpcRendererEvent, data: LogExitEvent): void => callback(data) ipcRenderer.on('logs:exit', listener) return () => ipcRenderer.removeListener('logs:exit', listener) } }, create: { pickDirectory: (): Promise => ipcRenderer.invoke('create:pickDirectory'), configure: ( operationId: string, directory: string, projectName: string, projectType: string, docroot: string ): Promise => ipcRenderer.invoke( 'create:configure', operationId, directory, projectName, projectType, docroot ) } } export type Api = typeof api // Use `contextBridge` APIs to expose Electron APIs to // renderer only if context isolation is enabled, otherwise // just add to the DOM global. if (process.contextIsolated) { try { contextBridge.exposeInMainWorld('electron', electronAPI) contextBridge.exposeInMainWorld('api', api) } catch (error) { console.error(error) } } else { // @ts-ignore (define in dts) window.electron = electronAPI // @ts-ignore (define in dts) window.api = api }