diff --git a/apps/companion/electron.vite.config.ts b/apps/companion/electron.vite.config.ts new file mode 100644 index 000000000..430ef19e9 --- /dev/null +++ b/apps/companion/electron.vite.config.ts @@ -0,0 +1,67 @@ +import { defineConfig } from 'electron-vite'; +import react from '@vitejs/plugin-react'; +import { resolve } from 'path'; + +export default defineConfig({ + main: { + build: { + outDir: 'dist/main', + lib: { + entry: resolve(__dirname, 'main/index.ts'), + formats: ['cjs'], + }, + rollupOptions: { + external: [ + '@nut-tree-fork/nut-js', + '@nut-tree-fork/libnut', + '@nut-tree-fork/libnut-darwin', + '@nut-tree-fork/libnut-linux', + '@nut-tree-fork/libnut-win32', + '@nut-tree-fork/node-mac-permissions', + '@nut-tree-fork/default-clipboard-provider', + '@nut-tree-fork/provider-interfaces', + '@nut-tree-fork/shared', + 'bufferutil', + 'utf-8-validate', + ], + output: { + entryFileNames: 'main.cjs', + }, + }, + }, + resolve: { + alias: { + '@': resolve(__dirname, '../../'), + }, + }, + }, + preload: { + build: { + outDir: 'dist/preload', + lib: { + entry: resolve(__dirname, 'main/preload.ts'), + formats: ['cjs'], + }, + rollupOptions: { + output: { + entryFileNames: 'preload.js', + }, + }, + }, + }, + renderer: { + root: resolve(__dirname, 'renderer'), + build: { + outDir: resolve(__dirname, 'dist/renderer'), + rollupOptions: { + input: resolve(__dirname, 'renderer/index.html'), + }, + }, + resolve: { + alias: { + '@': resolve(__dirname, '../../'), + }, + }, + plugins: [react()], + }, +}); \ No newline at end of file diff --git a/src/apps/companion/main/di-container.ts b/apps/companion/main/di-container.ts similarity index 78% rename from src/apps/companion/main/di-container.ts rename to apps/companion/main/di-container.ts index c8cec6e1c..0b32e307f 100644 --- a/src/apps/companion/main/di-container.ts +++ b/apps/companion/main/di-container.ts @@ -1,13 +1,13 @@ -import { InMemorySessionRepository } from '../../../infrastructure/repositories/InMemorySessionRepository'; -import { MockBrowserAutomationAdapter } from '../../../infrastructure/adapters/automation/MockBrowserAutomationAdapter'; -import { BrowserDevToolsAdapter } from '../../../infrastructure/adapters/automation/BrowserDevToolsAdapter'; -import { NutJsAutomationAdapter } from '../../../infrastructure/adapters/automation/NutJsAutomationAdapter'; -import { MockAutomationEngineAdapter } from '../../../infrastructure/adapters/automation/MockAutomationEngineAdapter'; -import { StartAutomationSessionUseCase } from '../../../packages/application/use-cases/StartAutomationSessionUseCase'; -import { loadAutomationConfig, AutomationMode } from '../../../infrastructure/config'; -import type { ISessionRepository } from '../../../packages/application/ports/ISessionRepository'; -import type { IBrowserAutomation } from '../../../packages/application/ports/IBrowserAutomation'; -import type { IAutomationEngine } from '../../../packages/application/ports/IAutomationEngine'; +import { InMemorySessionRepository } from '@/packages/infrastructure/repositories/InMemorySessionRepository'; +import { MockBrowserAutomationAdapter } from '@/packages/infrastructure/adapters/automation/MockBrowserAutomationAdapter'; +import { BrowserDevToolsAdapter } from '@/packages/infrastructure/adapters/automation/BrowserDevToolsAdapter'; +import { NutJsAutomationAdapter } from '@/packages/infrastructure/adapters/automation/NutJsAutomationAdapter'; +import { MockAutomationEngineAdapter } from '@/packages/infrastructure/adapters/automation/MockAutomationEngineAdapter'; +import { StartAutomationSessionUseCase } from '@/packages/application/use-cases/StartAutomationSessionUseCase'; +import { loadAutomationConfig, AutomationMode } from '@/packages/infrastructure/config'; +import type { ISessionRepository } from '@/packages/application/ports/ISessionRepository'; +import type { IBrowserAutomation } from '@/packages/application/ports/IBrowserAutomation'; +import type { IAutomationEngine } from '@/packages/application/ports/IAutomationEngine'; export interface BrowserConnectionResult { success: boolean; diff --git a/src/apps/companion/main/index.ts b/apps/companion/main/index.ts similarity index 79% rename from src/apps/companion/main/index.ts rename to apps/companion/main/index.ts index f2e9c5d02..71c73a20c 100644 --- a/src/apps/companion/main/index.ts +++ b/apps/companion/main/index.ts @@ -17,8 +17,8 @@ function createWindow() { mainWindow.loadURL('http://localhost:5173'); mainWindow.webContents.openDevTools(); } else { - // Path from dist/main/apps/companion/main to dist/renderer/src/apps/companion/renderer/index.html - mainWindow.loadFile(path.join(__dirname, '../../../../renderer/src/apps/companion/renderer/index.html')); + // Path from dist/main to dist/renderer + mainWindow.loadFile(path.join(__dirname, '../renderer/index.html')); } setupIpcHandlers(mainWindow); diff --git a/src/apps/companion/main/ipc-handlers.ts b/apps/companion/main/ipc-handlers.ts similarity index 93% rename from src/apps/companion/main/ipc-handlers.ts rename to apps/companion/main/ipc-handlers.ts index 185fd05cf..33b09a12c 100644 --- a/src/apps/companion/main/ipc-handlers.ts +++ b/apps/companion/main/ipc-handlers.ts @@ -1,9 +1,9 @@ import { ipcMain } from 'electron'; import type { BrowserWindow, IpcMainInvokeEvent } from 'electron'; import { DIContainer } from './di-container'; -import type { HostedSessionConfig } from '../../../packages/domain/entities/HostedSessionConfig'; -import { StepId } from '../../../packages/domain/value-objects/StepId'; -import { MockAutomationEngineAdapter } from '../../../infrastructure/adapters/automation/MockAutomationEngineAdapter'; +import type { HostedSessionConfig } from '@/packages/domain/entities/HostedSessionConfig'; +import { StepId } from '@/packages/domain/value-objects/StepId'; +import { MockAutomationEngineAdapter } from '@/packages/infrastructure/adapters/automation/MockAutomationEngineAdapter'; export function setupIpcHandlers(mainWindow: BrowserWindow): void { const container = DIContainer.getInstance(); diff --git a/src/apps/companion/main/preload.ts b/apps/companion/main/preload.ts similarity index 100% rename from src/apps/companion/main/preload.ts rename to apps/companion/main/preload.ts diff --git a/apps/companion/package.json b/apps/companion/package.json new file mode 100644 index 000000000..7eaad1df1 --- /dev/null +++ b/apps/companion/package.json @@ -0,0 +1,29 @@ +{ + "name": "@gridpilot/companion", + "version": "0.1.0", + "description": "GridPilot Companion - Electron app for iRacing automation", + "main": "dist/main/main.cjs", + "type": "module", + "scripts": { + "dev": "unset ELECTRON_RUN_AS_NODE && electron-vite dev", + "build": "electron-vite build", + "preview": "unset ELECTRON_RUN_AS_NODE && electron-vite preview", + "start": "unset ELECTRON_RUN_AS_NODE && electron ." + }, + "devDependencies": { + "@types/node": "^22.10.2", + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0", + "@vitejs/plugin-react": "^4.2.0", + "electron": "^28.3.3", + "electron-vite": "^2.3.0", + "typescript": "^5.7.2", + "vite": "^5.4.21" + }, + "dependencies": { + "@nut-tree-fork/nut-js": "^4.2.6", + "puppeteer-core": "^24.31.0", + "react": "^18.2.0", + "react-dom": "^18.2.0" + } +} diff --git a/src/apps/companion/renderer/App.tsx b/apps/companion/renderer/App.tsx similarity index 100% rename from src/apps/companion/renderer/App.tsx rename to apps/companion/renderer/App.tsx diff --git a/src/apps/companion/renderer/components/SessionCreationForm.tsx b/apps/companion/renderer/components/SessionCreationForm.tsx similarity index 100% rename from src/apps/companion/renderer/components/SessionCreationForm.tsx rename to apps/companion/renderer/components/SessionCreationForm.tsx diff --git a/src/apps/companion/renderer/components/SessionProgressMonitor.tsx b/apps/companion/renderer/components/SessionProgressMonitor.tsx similarity index 100% rename from src/apps/companion/renderer/components/SessionProgressMonitor.tsx rename to apps/companion/renderer/components/SessionProgressMonitor.tsx diff --git a/src/apps/companion/renderer/index.css b/apps/companion/renderer/index.css similarity index 100% rename from src/apps/companion/renderer/index.css rename to apps/companion/renderer/index.css diff --git a/src/apps/companion/renderer/index.html b/apps/companion/renderer/index.html similarity index 76% rename from src/apps/companion/renderer/index.html rename to apps/companion/renderer/index.html index a5acf467a..20daaa074 100644 --- a/src/apps/companion/renderer/index.html +++ b/apps/companion/renderer/index.html @@ -7,6 +7,6 @@
- +