From bc46a183725e4adfee01a61ef3c16efe60eeafa3 Mon Sep 17 00:00:00 2001 From: SuperComboGamer Date: Sat, 13 Dec 2025 16:40:09 -0500 Subject: [PATCH 1/8] feat: enhance Electron build process and server preparation - Added new build scripts for Electron targeting Windows, macOS, and Linux. - Updated the main build script to include server preparation steps. - Introduced a new script to prepare the server for bundling with Electron, including cleaning previous builds and installing production dependencies. - Modified the Electron main process to verify server file existence and improved error handling. - Updated .gitignore to exclude the new server-bundle directory. --- apps/app/.gitignore | 1 + apps/app/electron/main.js | 18 ++++++++ apps/app/package.json | 23 ++++++---- apps/app/scripts/prepare-server.js | 67 ++++++++++++++++++++++++++++++ package.json | 3 ++ 5 files changed, 105 insertions(+), 7 deletions(-) create mode 100644 apps/app/scripts/prepare-server.js diff --git a/apps/app/.gitignore b/apps/app/.gitignore index cefc9348..cb9812cb 100644 --- a/apps/app/.gitignore +++ b/apps/app/.gitignore @@ -48,3 +48,4 @@ next-env.d.ts # Electron /dist/ +/server-bundle/ diff --git a/apps/app/electron/main.js b/apps/app/electron/main.js index 0fd95d97..4e746ce3 100644 --- a/apps/app/electron/main.js +++ b/apps/app/electron/main.js @@ -63,18 +63,31 @@ async function startServer() { command = "node"; serverPath = path.join(process.resourcesPath, "server", "index.js"); args = [serverPath]; + + // Verify server files exist + if (!fs.existsSync(serverPath)) { + throw new Error(`Server not found at: ${serverPath}`); + } } // Set environment variables for server + const serverNodeModules = app.isPackaged + ? path.join(process.resourcesPath, "server", "node_modules") + : path.join(__dirname, "../../server/node_modules"); + const env = { ...process.env, PORT: SERVER_PORT.toString(), DATA_DIR: app.getPath("userData"), + NODE_PATH: serverNodeModules, }; console.log("[Electron] Starting backend server..."); + console.log("[Electron] Server path:", serverPath); + console.log("[Electron] NODE_PATH:", serverNodeModules); serverProcess = spawn(command, args, { + cwd: path.dirname(serverPath), env, stdio: ["ignore", "pipe", "pipe"], }); @@ -92,6 +105,11 @@ async function startServer() { serverProcess = null; }); + serverProcess.on("error", (err) => { + console.error(`[Server] Failed to start server process:`, err); + serverProcess = null; + }); + // Wait for server to be ready await waitForServer(); } diff --git a/apps/app/package.json b/apps/app/package.json index 98a8b0b4..eb9e6c4b 100644 --- a/apps/app/package.json +++ b/apps/app/package.json @@ -20,7 +20,10 @@ "dev:electron": "concurrently \"next dev -p 3007\" \"wait-on http://localhost:3007 && electron .\"", "dev:electron:debug": "concurrently \"next dev -p 3007\" \"wait-on http://localhost:3007 && OPEN_DEVTOOLS=true electron .\"", "build": "next build", - "build:electron": "next build && electron-builder", + "build:electron": "node scripts/prepare-server.js && next build && electron-builder", + "build:electron:win": "node scripts/prepare-server.js && next build && electron-builder --win", + "build:electron:mac": "node scripts/prepare-server.js && next build && electron-builder --mac", + "build:electron:linux": "node scripts/prepare-server.js && next build && electron-builder --linux", "start": "next start", "lint": "eslint", "test": "playwright test", @@ -79,13 +82,13 @@ "@types/react": "^19", "@types/react-dom": "^19", "concurrently": "^9.2.1", - "electron": "^39.2.6", + "electron": "39.2.7", "electron-builder": "^26.0.12", "eslint": "^9", "eslint-config-next": "16.0.7", "tailwindcss": "^4", "tw-animate-css": "^1.4.0", - "typescript": "^5", + "typescript": "5.9.3", "wait-on": "^9.0.3" }, "build": { @@ -103,11 +106,17 @@ ], "extraResources": [ { - "from": ".env", + "from": "server-bundle/dist", + "to": "server" + }, + { + "from": "server-bundle/node_modules", + "to": "server/node_modules" + }, + { + "from": "../../.env", "to": ".env", - "filter": [ - "**/*" - ] + "filter": ["**/*"] } ], "mac": { diff --git a/apps/app/scripts/prepare-server.js b/apps/app/scripts/prepare-server.js new file mode 100644 index 00000000..3487db71 --- /dev/null +++ b/apps/app/scripts/prepare-server.js @@ -0,0 +1,67 @@ +#!/usr/bin/env node + +/** + * This script prepares the server for bundling with Electron. + * It copies the server dist and installs production dependencies + * in a way that works with npm workspaces. + */ + +import { execSync } from 'child_process'; +import { cpSync, existsSync, mkdirSync, rmSync, writeFileSync, readFileSync } from 'fs'; +import { join, dirname } from 'path'; +import { fileURLToPath } from 'url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +const APP_DIR = join(__dirname, '..'); +const SERVER_DIR = join(APP_DIR, '..', 'server'); +const BUNDLE_DIR = join(APP_DIR, 'server-bundle'); + +console.log('šŸ”§ Preparing server for Electron bundling...\n'); + +// Step 1: Clean up previous bundle +if (existsSync(BUNDLE_DIR)) { + console.log('šŸ—‘ļø Cleaning previous server-bundle...'); + rmSync(BUNDLE_DIR, { recursive: true }); +} +mkdirSync(BUNDLE_DIR, { recursive: true }); + +// Step 2: Build the server TypeScript +console.log('šŸ“¦ Building server TypeScript...'); +execSync('npm run build', { cwd: SERVER_DIR, stdio: 'inherit' }); + +// Step 3: Copy server dist +console.log('šŸ“‹ Copying server dist...'); +cpSync(join(SERVER_DIR, 'dist'), join(BUNDLE_DIR, 'dist'), { recursive: true }); + +// Step 4: Create a minimal package.json for the server +console.log('šŸ“ Creating server package.json...'); +const serverPkg = JSON.parse(readFileSync(join(SERVER_DIR, 'package.json'), 'utf-8')); + +const bundlePkg = { + name: '@automaker/server-bundle', + version: serverPkg.version, + type: 'module', + main: 'dist/index.js', + dependencies: serverPkg.dependencies +}; + +writeFileSync( + join(BUNDLE_DIR, 'package.json'), + JSON.stringify(bundlePkg, null, 2) +); + +// Step 5: Install production dependencies +console.log('šŸ“„ Installing server production dependencies...'); +execSync('npm install --omit=dev', { + cwd: BUNDLE_DIR, + stdio: 'inherit', + env: { + ...process.env, + // Prevent npm from using workspace resolution + npm_config_workspace: '' + } +}); + +console.log('\nāœ… Server prepared for bundling at:', BUNDLE_DIR); diff --git a/package.json b/package.json index 5ef7a387..724d9e23 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,9 @@ "build": "npm run build --workspace=apps/app", "build:server": "npm run build --workspace=apps/server", "build:electron": "npm run build:electron --workspace=apps/app", + "build:electron:win": "npm run build:electron:win --workspace=apps/app", + "build:electron:mac": "npm run build:electron:mac --workspace=apps/app", + "build:electron:linux": "npm run build:electron:linux --workspace=apps/app", "start": "npm run start --workspace=apps/app", "start:server": "npm run start --workspace=apps/server", "lint": "npm run lint --workspace=apps/app", From bea115d1e42bca70299d3422b15dd41b7fa2a1ee Mon Sep 17 00:00:00 2001 From: Kacper Date: Sat, 13 Dec 2025 23:12:10 +0100 Subject: [PATCH 2/8] feat: update Electron configuration and static server implementation - Upgraded Electron version to 39.2.7 and TypeScript to 5.9.3 in package-lock.json. - Modified next.config.ts to set output to "export" for static site generation. - Changed package.json to include the output directory for deployment. - Enhanced main.js to implement a static file server for production builds, serving files from the "out" directory. - Adjusted the loading mechanism to use the static server in production and the Next.js dev server in development. --- apps/app/electron/main.js | 101 ++- apps/app/next.config.ts | 1 + apps/app/package.json | 2 +- package-lock.json | 1478 +++++++++++++++++++++---------------- 4 files changed, 935 insertions(+), 647 deletions(-) diff --git a/apps/app/electron/main.js b/apps/app/electron/main.js index 4e746ce3..ff3a5118 100644 --- a/apps/app/electron/main.js +++ b/apps/app/electron/main.js @@ -8,15 +8,23 @@ const path = require("path"); const { spawn } = require("child_process"); const fs = require("fs"); - -// Load environment variables from .env file -require("dotenv").config({ path: path.join(__dirname, "../.env") }); - +const http = require("http"); const { app, BrowserWindow, ipcMain, dialog, shell } = require("electron"); +// Load environment variables from .env file (development only) +if (!app.isPackaged) { + try { + require("dotenv").config({ path: path.join(__dirname, "../.env") }); + } catch (error) { + console.warn("[Electron] dotenv not available:", error.message); + } +} + let mainWindow = null; let serverProcess = null; +let staticServer = null; const SERVER_PORT = 3008; +const STATIC_PORT = 3007; // Get icon path - works in both dev and production function getIconPath() { @@ -25,6 +33,67 @@ function getIconPath() { : path.join(__dirname, "../public/logo.png"); } +/** + * Start static file server for production builds + */ +function startStaticServer() { + const staticPath = path.join(__dirname, "../out"); + + staticServer = http.createServer((request, response) => { + // Parse the URL and remove query string + let filePath = path.join(staticPath, request.url.split("?")[0]); + + // Default to index.html for directory requests + if (filePath.endsWith("/")) { + filePath = path.join(filePath, "index.html"); + } else if (!path.extname(filePath)) { + filePath += ".html"; + } + + // Check if file exists + fs.stat(filePath, (err, stats) => { + if (err || !stats.isFile()) { + // Try index.html for SPA fallback + filePath = path.join(staticPath, "index.html"); + } + + // Read and serve the file + fs.readFile(filePath, (error, content) => { + if (error) { + response.writeHead(500); + response.end("Server Error"); + return; + } + + // Set content type based on file extension + const ext = path.extname(filePath); + const contentTypes = { + ".html": "text/html", + ".js": "application/javascript", + ".css": "text/css", + ".json": "application/json", + ".png": "image/png", + ".jpg": "image/jpeg", + ".gif": "image/gif", + ".svg": "image/svg+xml", + ".ico": "image/x-icon", + ".woff": "font/woff", + ".woff2": "font/woff2", + ".ttf": "font/ttf", + ".eot": "application/vnd.ms-fontobject", + }; + + response.writeHead(200, { "Content-Type": contentTypes[ext] || "application/octet-stream" }); + response.end(content); + }); + }); + }); + + staticServer.listen(STATIC_PORT, () => { + console.log(`[Electron] Static server running at http://localhost:${STATIC_PORT}`); + }); +} + /** * Start the backend server */ @@ -165,15 +234,11 @@ function createWindow() { backgroundColor: "#0a0a0a", }); - // Load Next.js dev server in development or production build + // Load Next.js dev server in development or static server in production const isDev = !app.isPackaged; - if (isDev) { - mainWindow.loadURL("http://localhost:3007"); - if (process.env.OPEN_DEVTOOLS === "true") { - mainWindow.webContents.openDevTools(); - } - } else { - mainWindow.loadFile(path.join(__dirname, "../.next/server/app/index.html")); + mainWindow.loadURL(`http://localhost:${STATIC_PORT}`); + if (isDev && process.env.OPEN_DEVTOOLS === "true") { + mainWindow.webContents.openDevTools(); } mainWindow.on("closed", () => { @@ -195,6 +260,11 @@ app.whenReady().then(async () => { } try { + // Start static file server in production + if (app.isPackaged) { + startStaticServer(); + } + // Start backend server await startServer(); @@ -225,6 +295,13 @@ app.on("before-quit", () => { serverProcess.kill(); serverProcess = null; } + + // Close static server + if (staticServer) { + console.log("[Electron] Stopping static server..."); + staticServer.close(); + staticServer = null; + } }); // ============================================ diff --git a/apps/app/next.config.ts b/apps/app/next.config.ts index 6211e3b9..7f34a8f1 100644 --- a/apps/app/next.config.ts +++ b/apps/app/next.config.ts @@ -1,6 +1,7 @@ import type { NextConfig } from "next"; const nextConfig: NextConfig = { + output: "export", env: { CLAUDE_CODE_OAUTH_TOKEN: process.env.CLAUDE_CODE_OAUTH_TOKEN || "", }, diff --git a/apps/app/package.json b/apps/app/package.json index eb9e6c4b..9dd24edc 100644 --- a/apps/app/package.json +++ b/apps/app/package.json @@ -100,7 +100,7 @@ }, "files": [ "electron/**/*", - ".next/**/*", + "out/**/*", "public/**/*", "!node_modules/**/*" ], diff --git a/package-lock.json b/package-lock.json index 3268efa5..b2bf3f97 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,13 +56,13 @@ "@types/react": "^19", "@types/react-dom": "^19", "concurrently": "^9.2.1", - "electron": "^39.2.6", + "electron": "39.2.7", "electron-builder": "^26.0.12", "eslint": "^9", "eslint-config-next": "16.0.7", "tailwindcss": "^4", "tw-animate-css": "^1.4.0", - "typescript": "^5", + "typescript": "5.9.3", "wait-on": "^9.0.3" }, "optionalDependencies": { @@ -419,26 +419,6 @@ "node": ">= 10.0.0" } }, - "apps/app/node_modules/@electron/get": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "env-paths": "^2.2.0", - "fs-extra": "^8.1.0", - "got": "^11.8.5", - "progress": "^2.0.3", - "semver": "^6.2.0", - "sumchecker": "^3.0.1" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "global-agent": "^3.0.0" - } - }, "apps/app/node_modules/@electron/node-gyp": { "version": "10.2.0-electron.1", "dev": true, @@ -2467,33 +2447,11 @@ "dev": true, "license": "MIT" }, - "apps/app/node_modules/@sindresorhus/is": { - "version": "4.6.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, "apps/app/node_modules/@standard-schema/spec": { "version": "1.0.0", "dev": true, "license": "MIT" }, - "apps/app/node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, "apps/app/node_modules/@tailwindcss/node": { "version": "4.1.17", "dev": true, @@ -2604,17 +2562,6 @@ "node": ">= 10" } }, - "apps/app/node_modules/@types/cacheable-request": { - "version": "6.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, "apps/app/node_modules/@types/debug": { "version": "4.1.12", "license": "MIT", @@ -2648,11 +2595,6 @@ "@types/unist": "*" } }, - "apps/app/node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "dev": true, - "license": "MIT" - }, "apps/app/node_modules/@types/json-schema": { "version": "7.0.15", "dev": true, @@ -2663,14 +2605,6 @@ "dev": true, "license": "MIT" }, - "apps/app/node_modules/@types/keyv": { - "version": "3.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "apps/app/node_modules/@types/mdast": { "version": "4.0.4", "license": "MIT", @@ -2707,14 +2641,6 @@ "@types/react": "^19.2.0" } }, - "apps/app/node_modules/@types/responselike": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "apps/app/node_modules/@types/unist": { "version": "3.0.3", "license": "MIT" @@ -2725,15 +2651,6 @@ "license": "MIT", "optional": true }, - "apps/app/node_modules/@types/yauzl": { - "version": "2.10.3", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, "apps/app/node_modules/@typescript-eslint/eslint-plugin": { "version": "8.48.1", "dev": true, @@ -3575,12 +3492,6 @@ "readable-stream": "^3.4.0" } }, - "apps/app/node_modules/boolean": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "optional": true - }, "apps/app/node_modules/braces": { "version": "3.0.3", "dev": true, @@ -3647,14 +3558,6 @@ "ieee754": "^1.1.13" } }, - "apps/app/node_modules/buffer-crc32": { - "version": "0.2.13", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, "apps/app/node_modules/buffer-from": { "version": "1.1.2", "dev": true, @@ -3857,31 +3760,6 @@ "node": ">=18" } }, - "apps/app/node_modules/cacheable-lookup": { - "version": "5.0.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.6.0" - } - }, - "apps/app/node_modules/cacheable-request": { - "version": "7.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "apps/app/node_modules/call-bind": { "version": "1.0.8", "dev": true, @@ -4066,17 +3944,6 @@ "node": ">=0.8" } }, - "apps/app/node_modules/clone-response": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "apps/app/node_modules/clsx": { "version": "2.1.1", "license": "MIT", @@ -4338,31 +4205,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "apps/app/node_modules/decompress-response": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "apps/app/node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "apps/app/node_modules/deep-is": { "version": "0.1.4", "dev": true, @@ -4379,46 +4221,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "apps/app/node_modules/defer-to-connect": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "apps/app/node_modules/define-data-property": { - "version": "1.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "apps/app/node_modules/define-properties": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "apps/app/node_modules/delayed-stream": { "version": "1.0.0", "dev": true, @@ -4434,12 +4236,6 @@ "node": ">=6" } }, - "apps/app/node_modules/detect-node": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "optional": true - }, "apps/app/node_modules/detect-node-es": { "version": "1.1.0", "license": "MIT" @@ -4587,23 +4383,6 @@ "node": ">=0.10.0" } }, - "apps/app/node_modules/electron": { - "version": "39.2.6", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@electron/get": "^2.0.0", - "@types/node": "^22.7.7", - "extract-zip": "^2.0.1" - }, - "bin": { - "electron": "cli.js" - }, - "engines": { - "node": ">= 12.20.55" - } - }, "apps/app/node_modules/electron-builder": { "version": "26.0.12", "dev": true, @@ -4757,14 +4536,6 @@ "node": ">=6 <7 || >=8" } }, - "apps/app/node_modules/electron/node_modules/@types/node": { - "version": "22.19.1", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, "apps/app/node_modules/encoding": { "version": "0.1.13", "dev": true, @@ -4774,14 +4545,6 @@ "iconv-lite": "^0.6.2" } }, - "apps/app/node_modules/end-of-stream": { - "version": "1.4.5", - "dev": true, - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, "apps/app/node_modules/enhanced-resolve": { "version": "5.18.3", "dev": true, @@ -4794,14 +4557,6 @@ "node": ">=10.13.0" } }, - "apps/app/node_modules/env-paths": { - "version": "2.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "apps/app/node_modules/err-code": { "version": "2.0.3", "dev": true, @@ -4941,12 +4696,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "apps/app/node_modules/es6-error": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "optional": true - }, "apps/app/node_modules/escalade": { "version": "3.2.0", "dev": true, @@ -4955,17 +4704,6 @@ "node": ">=6" } }, - "apps/app/node_modules/escape-string-regexp": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "apps/app/node_modules/eslint": { "version": "9.39.1", "dev": true, @@ -5365,25 +5103,6 @@ "version": "3.0.2", "license": "MIT" }, - "apps/app/node_modules/extract-zip": { - "version": "2.0.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, "apps/app/node_modules/extsprintf": { "version": "1.4.1", "dev": true, @@ -5437,14 +5156,6 @@ "reusify": "^1.0.4" } }, - "apps/app/node_modules/fd-slicer": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pend": "~1.2.0" - } - }, "apps/app/node_modules/file-entry-cache": { "version": "8.0.0", "dev": true, @@ -5600,19 +5311,6 @@ "node": ">= 6" } }, - "apps/app/node_modules/fs-extra": { - "version": "8.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, "apps/app/node_modules/fs-minipass": { "version": "2.1.0", "dev": true, @@ -5699,20 +5397,6 @@ "node": ">=6" } }, - "apps/app/node_modules/get-stream": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "apps/app/node_modules/get-symbol-description": { "version": "1.1.0", "dev": true, @@ -5759,35 +5443,6 @@ "node": ">=10.13.0" } }, - "apps/app/node_modules/global-agent": { - "version": "3.0.0", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "dependencies": { - "boolean": "^3.0.1", - "es6-error": "^4.1.1", - "matcher": "^3.0.0", - "roarr": "^2.15.3", - "semver": "^7.3.2", - "serialize-error": "^7.0.1" - }, - "engines": { - "node": ">=10.0" - } - }, - "apps/app/node_modules/global-agent/node_modules/semver": { - "version": "7.7.3", - "dev": true, - "license": "ISC", - "optional": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "apps/app/node_modules/globals": { "version": "14.0.0", "dev": true, @@ -5799,50 +5454,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "apps/app/node_modules/globalthis": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "apps/app/node_modules/got": { - "version": "11.8.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "apps/app/node_modules/graceful-fs": { - "version": "4.2.11", - "dev": true, - "license": "ISC" - }, "apps/app/node_modules/graphemer": { "version": "1.4.0", "dev": true, @@ -5859,17 +5470,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "apps/app/node_modules/has-property-descriptors": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "apps/app/node_modules/has-proto": { "version": "1.2.0", "dev": true, @@ -5982,11 +5582,6 @@ "url": "https://opencollective.com/unified" } }, - "apps/app/node_modules/http-cache-semantics": { - "version": "4.2.0", - "dev": true, - "license": "BSD-2-Clause" - }, "apps/app/node_modules/http-proxy-agent": { "version": "7.0.2", "dev": true, @@ -5999,18 +5594,6 @@ "node": ">= 14" } }, - "apps/app/node_modules/http2-wrapper": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, "apps/app/node_modules/https-proxy-agent": { "version": "7.0.6", "dev": true, @@ -6711,11 +6294,6 @@ "node": ">=6" } }, - "apps/app/node_modules/json-buffer": { - "version": "3.0.1", - "dev": true, - "license": "MIT" - }, "apps/app/node_modules/json-schema-traverse": { "version": "0.4.1", "dev": true, @@ -6726,12 +6304,6 @@ "dev": true, "license": "MIT" }, - "apps/app/node_modules/json-stringify-safe": { - "version": "5.0.1", - "dev": true, - "license": "ISC", - "optional": true - }, "apps/app/node_modules/json5": { "version": "2.2.3", "dev": true, @@ -6743,14 +6315,6 @@ "node": ">=6" } }, - "apps/app/node_modules/jsonfile": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "apps/app/node_modules/jsx-ast-utils": { "version": "3.3.5", "dev": true, @@ -6765,14 +6329,6 @@ "node": ">=4.0" } }, - "apps/app/node_modules/keyv": { - "version": "4.5.4", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, "apps/app/node_modules/language-subtag-registry": { "version": "0.3.23", "dev": true, @@ -6910,14 +6466,6 @@ "loose-envify": "cli.js" } }, - "apps/app/node_modules/lowercase-keys": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "apps/app/node_modules/lru-cache": { "version": "5.1.1", "dev": true, @@ -6970,18 +6518,6 @@ "node": ">=16 || 14 >=14.17" } }, - "apps/app/node_modules/matcher": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "escape-string-regexp": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "apps/app/node_modules/mdast-util-from-markdown": { "version": "2.0.2", "license": "MIT", @@ -7569,14 +7105,6 @@ "node": ">= 0.6" } }, - "apps/app/node_modules/mimic-response": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "apps/app/node_modules/minipass": { "version": "3.3.6", "dev": true, @@ -7911,25 +7439,6 @@ "node": "^18.17.0 || >=20.5.0" } }, - "apps/app/node_modules/normalize-url": { - "version": "6.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "apps/app/node_modules/object-keys": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "apps/app/node_modules/object.assign": { "version": "4.1.7", "dev": true, @@ -8064,14 +7573,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "apps/app/node_modules/p-cancelable": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "apps/app/node_modules/p-limit": { "version": "3.1.0", "dev": true, @@ -8210,11 +7711,6 @@ "url": "https://github.com/sponsors/jet2jet" } }, - "apps/app/node_modules/pend": { - "version": "1.2.0", - "dev": true, - "license": "MIT" - }, "apps/app/node_modules/picomatch": { "version": "2.3.1", "dev": true, @@ -8344,14 +7840,6 @@ "node": "^18.17.0 || >=20.5.0" } }, - "apps/app/node_modules/progress": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, "apps/app/node_modules/promise-inflight": { "version": "1.0.1", "dev": true, @@ -8392,15 +7880,6 @@ "dev": true, "license": "MIT" }, - "apps/app/node_modules/pump": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "apps/app/node_modules/queue-microtask": { "version": "1.2.3", "dev": true, @@ -8420,17 +7899,6 @@ ], "license": "MIT" }, - "apps/app/node_modules/quick-lru": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "apps/app/node_modules/react-is": { "version": "16.13.1", "dev": true, @@ -8660,11 +8128,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "apps/app/node_modules/resolve-alpn": { - "version": "1.2.1", - "dev": true, - "license": "MIT" - }, "apps/app/node_modules/resolve-from": { "version": "4.0.0", "dev": true, @@ -8673,17 +8136,6 @@ "node": ">=4" } }, - "apps/app/node_modules/responselike": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "apps/app/node_modules/restore-cursor": { "version": "3.1.0", "dev": true, @@ -8727,23 +8179,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "apps/app/node_modules/roarr": { - "version": "2.15.4", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "dependencies": { - "boolean": "^3.0.1", - "detect-node": "^2.0.4", - "globalthis": "^1.0.1", - "json-stringify-safe": "^5.0.1", - "semver-compare": "^1.0.0", - "sprintf-js": "^1.1.2" - }, - "engines": { - "node": ">=8.0" - } - }, "apps/app/node_modules/run-parallel": { "version": "1.2.0", "dev": true, @@ -8844,27 +8279,6 @@ "semver": "bin/semver.js" } }, - "apps/app/node_modules/semver-compare": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "optional": true - }, - "apps/app/node_modules/serialize-error": { - "version": "7.0.1", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "type-fest": "^0.13.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "apps/app/node_modules/set-function-length": { "version": "1.2.2", "dev": true, @@ -9023,12 +8437,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "apps/app/node_modules/sprintf-js": { - "version": "1.1.3", - "dev": true, - "license": "BSD-3-Clause", - "optional": true - }, "apps/app/node_modules/ssri": { "version": "12.0.0", "dev": true, @@ -9287,17 +8695,6 @@ "inline-style-parser": "0.2.7" } }, - "apps/app/node_modules/sumchecker": { - "version": "3.0.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "debug": "^4.1.0" - }, - "engines": { - "node": ">= 8.0" - } - }, "apps/app/node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "dev": true, @@ -9610,18 +9007,6 @@ "node": ">= 0.8.0" } }, - "apps/app/node_modules/type-fest": { - "version": "0.13.1", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "apps/app/node_modules/typed-array-buffer": { "version": "1.0.3", "dev": true, @@ -9828,14 +9213,6 @@ "url": "https://opencollective.com/unified" } }, - "apps/app/node_modules/universalify": { - "version": "0.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, "apps/app/node_modules/unrs-resolver": { "version": "1.11.1", "dev": true, @@ -10179,15 +9556,6 @@ "node": ">=12" } }, - "apps/app/node_modules/yauzl": { - "version": "2.10.0", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, "apps/app/node_modules/yocto-queue": { "version": "0.1.0", "dev": true, @@ -10591,6 +9959,63 @@ "resolved": "apps/server", "link": true }, + "node_modules/@electron/get": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", + "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" + } + }, + "node_modules/@electron/get/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@electron/get/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@electron/get/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@emnapi/runtime": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", @@ -11643,6 +11068,19 @@ "node": ">= 10" } }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, "node_modules/@swc/helpers": { "version": "0.5.15", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", @@ -11652,6 +11090,19 @@ "tslib": "^2.8.0" } }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@tailwindcss/oxide-android-arm64": { "version": "4.1.17", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.17.tgz", @@ -11846,6 +11297,19 @@ "@types/node": "*" } }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, "node_modules/@types/connect": { "version": "3.4.38", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", @@ -11891,6 +11355,13 @@ "@types/send": "*" } }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/http-errors": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", @@ -11898,6 +11369,16 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/node": { "version": "20.19.26", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.26.tgz", @@ -11922,6 +11403,16 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/send": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", @@ -11953,6 +11444,17 @@ "@types/node": "*" } }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@xterm/addon-fit": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/@xterm/addon-fit/-/addon-fit-0.10.0.tgz", @@ -12202,6 +11704,15 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/boxen": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz", @@ -12236,6 +11747,16 @@ "concat-map": "0.0.1" } }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -12245,6 +11766,51 @@ "node": ">= 0.8" } }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -12406,6 +11972,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -12540,6 +12119,35 @@ "ms": "2.0.0" } }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -12550,6 +12158,52 @@ "node": ">=4.0.0" } }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -12569,6 +12223,14 @@ "node": ">=8" } }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/dotenv": { "version": "17.2.3", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz", @@ -12608,6 +12270,35 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "license": "MIT" }, + "node_modules/electron": { + "version": "39.2.7", + "resolved": "https://registry.npmjs.org/electron/-/electron-39.2.7.tgz", + "integrity": "sha512-KU0uFS6LSTh4aOIC3miolcbizOFP7N1M46VTYVfqIgFiuA2ilfNaOHLDS9tCMvwwHRowAsvqBrh9NgMXcTOHCQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@electron/get": "^2.0.0", + "@types/node": "^22.7.7", + "extract-zip": "^2.0.1" + }, + "bin": { + "electron": "cli.js" + }, + "engines": { + "node": ">= 12.20.55" + } + }, + "node_modules/electron/node_modules/@types/node": { + "version": "22.19.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.2.tgz", + "integrity": "sha512-LPM2G3Syo1GLzXLGJAKdqoU35XvrWzGJ21/7sgZTUpbkBaOasTj8tjwn6w+hCkqaa1TfJ/w67rJSwYItlJ2mYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -12624,6 +12315,26 @@ "node": ">= 0.8" } }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -12654,6 +12365,14 @@ "node": ">= 0.4" } }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/esbuild": { "version": "0.27.1", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.1.tgz", @@ -12702,6 +12421,19 @@ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "license": "MIT" }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -12839,6 +12571,68 @@ "node": ">= 0.6" } }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extract-zip/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/extract-zip/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -12846,6 +12640,16 @@ "dev": true, "license": "MIT" }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, "node_modules/finalhandler": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", @@ -12908,6 +12712,21 @@ "node": ">= 0.8" } }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -13004,6 +12823,42 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, + "node_modules/global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -13016,6 +12871,39 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -13026,6 +12914,19 @@ "node": ">=8" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", @@ -13050,6 +12951,13 @@ "node": ">= 0.4" } }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "dev": true, + "license": "BSD-2-Clause" + }, "node_modules/http-errors": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", @@ -13070,6 +12978,20 @@ "url": "https://opencollective.com/express" } }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -13196,6 +13118,13 @@ "dev": true, "license": "ISC" }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -13203,6 +13132,34 @@ "dev": true, "license": "MIT" }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "license": "ISC", + "optional": true + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/lightningcss-darwin-x64": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", @@ -13356,6 +13313,30 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -13435,6 +13416,16 @@ "node": ">=6" } }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -13562,6 +13553,19 @@ "node-addon-api": "^7.1.0" } }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -13596,6 +13600,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -13643,6 +13657,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -13676,6 +13700,13 @@ "dev": true, "license": "MIT" }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "license": "MIT" + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -13710,6 +13741,16 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -13723,6 +13764,17 @@ "node": ">= 0.10" } }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -13748,6 +13800,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/range-parser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", @@ -13854,6 +13919,13 @@ "node": ">=0.10.0" } }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true, + "license": "MIT" + }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", @@ -13864,6 +13936,38 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/router": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", @@ -13959,6 +14063,14 @@ "node": ">=10" } }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/send": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", @@ -14029,6 +14141,37 @@ "node": ">= 0.6" } }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/serialize-error/node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/serve": { "version": "14.2.5", "resolved": "https://registry.npmjs.org/serve/-/serve-14.2.5.tgz", @@ -14258,6 +14401,14 @@ "node": ">=0.10.0" } }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true + }, "node_modules/statuses": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", @@ -14344,6 +14495,44 @@ } } }, + "node_modules/sumchecker": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", + "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.1.0" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/sumchecker/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/sumchecker/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -14456,6 +14645,16 @@ "dev": true, "license": "MIT" }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -14572,6 +14771,17 @@ } } }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, "node_modules/zod": { "version": "3.25.76", "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", From 1bda0259db964cdbf9cc73fe41cbf4caa70a730a Mon Sep 17 00:00:00 2001 From: Kacper Date: Sat, 13 Dec 2025 23:52:14 +0100 Subject: [PATCH 3/8] feat: enhance workspace management and path handling - Added functionality to set a default workspace directory in Electron, creating it if it doesn't exist. - Improved project path construction in the New Project Modal to use platform-specific path separators. - Enhanced error handling in the Templates route for parent directory access, including logging for better debugging. --- apps/app/electron/main.js | 14 ++++++++++ apps/app/src/components/new-project-modal.tsx | 5 +++- apps/server/src/routes/templates.ts | 28 +++++++++++++++++-- 3 files changed, 43 insertions(+), 4 deletions(-) diff --git a/apps/app/electron/main.js b/apps/app/electron/main.js index ff3a5118..7ad6df20 100644 --- a/apps/app/electron/main.js +++ b/apps/app/electron/main.js @@ -144,11 +144,25 @@ async function startServer() { ? path.join(process.resourcesPath, "server", "node_modules") : path.join(__dirname, "../../server/node_modules"); + // Set default workspace directory to user's Documents/Automaker + const defaultWorkspaceDir = path.join(app.getPath("documents"), "Automaker"); + + // Ensure workspace directory exists + if (!fs.existsSync(defaultWorkspaceDir)) { + try { + fs.mkdirSync(defaultWorkspaceDir, { recursive: true }); + console.log("[Electron] Created workspace directory:", defaultWorkspaceDir); + } catch (error) { + console.error("[Electron] Failed to create workspace directory:", error); + } + } + const env = { ...process.env, PORT: SERVER_PORT.toString(), DATA_DIR: app.getPath("userData"), NODE_PATH: serverNodeModules, + WORKSPACE_DIR: process.env.WORKSPACE_DIR || defaultWorkspaceDir, }; console.log("[Electron] Starting backend server..."); diff --git a/apps/app/src/components/new-project-modal.tsx b/apps/app/src/components/new-project-modal.tsx index fd1429de..2e54c8f4 100644 --- a/apps/app/src/components/new-project-modal.tsx +++ b/apps/app/src/components/new-project-modal.tsx @@ -198,7 +198,10 @@ export function NewProjectModal({ } }; - const projectPath = workspaceDir && projectName ? `${workspaceDir}/${projectName}` : ""; + // Use platform-specific path separator + const pathSep = typeof window !== 'undefined' && (window as any).electronAPI ? + (navigator.platform.indexOf('Win') !== -1 ? '\\' : '/') : '/'; + const projectPath = workspaceDir && projectName ? `${workspaceDir}${pathSep}${projectName}` : ""; return ( diff --git a/apps/server/src/routes/templates.ts b/apps/server/src/routes/templates.ts index a4f5504c..b3b62622 100644 --- a/apps/server/src/routes/templates.ts +++ b/apps/server/src/routes/templates.ts @@ -34,6 +34,8 @@ export function createTemplatesRoutes(): Router { return; } + console.log(`[Templates] Clone request - Repo: ${repoUrl}, Project: ${projectName}, Parent: ${parentDir}`); + // Validate repo URL is a valid GitHub URL const githubUrlPattern = /^https:\/\/github\.com\/[\w-]+\/[\w.-]+$/; if (!githubUrlPattern.test(repoUrl)) { @@ -79,12 +81,32 @@ export function createTemplatesRoutes(): Router { // Ensure parent directory exists try { - await fs.mkdir(parentDir, { recursive: true }); + // Check if parentDir is a root path (Windows: C:\, D:\, etc. or Unix: /) + const isWindowsRoot = /^[A-Za-z]:\\?$/.test(parentDir); + const isUnixRoot = parentDir === '/' || parentDir === ''; + const isRoot = isWindowsRoot || isUnixRoot; + + if (isRoot) { + // Root paths always exist, just verify access + console.log(`[Templates] Using root path: ${parentDir}`); + await fs.access(parentDir); + } else { + // Check if parent directory exists + const parentExists = await fs.access(parentDir).then(() => true).catch(() => false); + + if (!parentExists) { + console.log(`[Templates] Creating parent directory: ${parentDir}`); + await fs.mkdir(parentDir, { recursive: true }); + } else { + console.log(`[Templates] Parent directory exists: ${parentDir}`); + } + } } catch (error) { - console.error("[Templates] Failed to create parent directory:", error); + const errorMessage = error instanceof Error ? error.message : String(error); + console.error("[Templates] Failed to access parent directory:", parentDir, error); res.status(500).json({ success: false, - error: "Failed to create parent directory", + error: `Failed to access parent directory: ${errorMessage}`, }); return; } From 6ac888c5ce026b7125adc6e47e9bb53d1e205531 Mon Sep 17 00:00:00 2001 From: Kacper Date: Sun, 14 Dec 2025 00:03:48 +0100 Subject: [PATCH 4/8] feat: implement auto-collapse functionality for sidebar on small screens - Added useEffect hook to automatically collapse the sidebar when the screen width is below 1024px. - Included event listener for media query changes to handle sidebar state dynamically. --- apps/app/src/components/layout/sidebar.tsx | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/apps/app/src/components/layout/sidebar.tsx b/apps/app/src/components/layout/sidebar.tsx index dce4a435..1f110fb7 100644 --- a/apps/app/src/components/layout/sidebar.tsx +++ b/apps/app/src/components/layout/sidebar.tsx @@ -239,6 +239,25 @@ export function Sidebar() { // Ref for project search input const projectSearchInputRef = useRef(null); + // Auto-collapse sidebar on small screens + useEffect(() => { + const mediaQuery = window.matchMedia('(max-width: 1024px)'); // lg breakpoint + + const handleResize = () => { + if (mediaQuery.matches && sidebarOpen) { + // Auto-collapse on small screens + toggleSidebar(); + } + }; + + // Check on mount + handleResize(); + + // Listen for changes + mediaQuery.addEventListener('change', handleResize); + return () => mediaQuery.removeEventListener('change', handleResize); + }, [sidebarOpen, toggleSidebar]); + // Filtered projects based on search query const filteredProjects = useMemo(() => { if (!projectSearchQuery.trim()) { From 10e647570b32ae7b88e1fd39776f430798804903 Mon Sep 17 00:00:00 2001 From: Kacper Date: Sun, 14 Dec 2025 00:15:04 +0100 Subject: [PATCH 5/8] feat: improve FileBrowserDialog layout and styling - Enhanced the layout of the FileBrowserDialog component by adding overflow handling and padding to improve visual consistency. - Updated the DialogHeader and DialogFooter with additional styling for better separation and usability. --- apps/app/src/components/dialogs/file-browser-dialog.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/app/src/components/dialogs/file-browser-dialog.tsx b/apps/app/src/components/dialogs/file-browser-dialog.tsx index 29c183f1..e16c2a43 100644 --- a/apps/app/src/components/dialogs/file-browser-dialog.tsx +++ b/apps/app/src/components/dialogs/file-browser-dialog.tsx @@ -113,8 +113,8 @@ export function FileBrowserDialog({ return ( - - + + {title} @@ -124,7 +124,7 @@ export function FileBrowserDialog({ -
+
{/* Drives selector (Windows only) */} {drives.length > 0 && (
@@ -216,7 +216,7 @@ export function FileBrowserDialog({
- + From 986f6c034f224f330ed012346171637b29da4907 Mon Sep 17 00:00:00 2001 From: Kacper Date: Sun, 14 Dec 2025 00:20:58 +0100 Subject: [PATCH 6/8] feat: improve project path handling in InterviewView component - Updated the project path construction to use platform-specific path separators, enhancing compatibility across different operating systems. - Implemented a check for the Electron API to determine the appropriate path separator based on the user's platform. --- apps/app/src/components/views/interview-view.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/app/src/components/views/interview-view.tsx b/apps/app/src/components/views/interview-view.tsx index 78110faa..75007a8c 100644 --- a/apps/app/src/components/views/interview-view.tsx +++ b/apps/app/src/components/views/interview-view.tsx @@ -305,7 +305,10 @@ export function InterviewView() { try { const api = getElectronAPI(); - const fullProjectPath = `${projectPath}/${projectName}`; + // Use platform-specific path separator + const pathSep = typeof window !== 'undefined' && (window as any).electronAPI ? + (navigator.platform.indexOf('Win') !== -1 ? '\\' : '/') : '/'; + const fullProjectPath = `${projectPath}${pathSep}${projectName}`; // Create project directory await api.mkdir(fullProjectPath); From 223fff9ef9bcb396a92f3ce7ea0ce3df872db19e Mon Sep 17 00:00:00 2001 From: Kacper Date: Sun, 14 Dec 2025 00:27:24 +0100 Subject: [PATCH 7/8] feat: update application icon in package.json - Changed the application icon from "public/logo_larger.png" to "public/icon.ico" for improved branding. - Added new icon file "icon.ico" to the public directory. --- apps/app/package.json | 2 +- apps/app/public/icon.ico | Bin 0 -> 285478 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 apps/app/public/icon.ico diff --git a/apps/app/package.json b/apps/app/package.json index 9dd24edc..ae50a1c7 100644 --- a/apps/app/package.json +++ b/apps/app/package.json @@ -148,7 +148,7 @@ ] } ], - "icon": "public/logo_larger.png" + "icon": "public/icon.ico" }, "linux": { "target": [ diff --git a/apps/app/public/icon.ico b/apps/app/public/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..388438d71ecfe0f798526e23f04fee9dca2dcdd1 GIT binary patch literal 285478 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 B5>WsE literal 0 HcmV?d00001 From 8dc3bdde67d58b12740d580f6c9800b21552369d Mon Sep 17 00:00:00 2001 From: Kacper Date: Sun, 14 Dec 2025 01:08:35 +0100 Subject: [PATCH 8/8] feat: enhance Electron app packaging and server preparation - Added afterPack script in package.json to rebuild native modules for the server bundle. - Improved icon handling in main.js to support cross-platform formats and verify icon existence. - Updated startStaticServer function to return a promise for better error handling. - Introduced a new script, rebuild-server-natives.js, to rebuild native modules based on the target architecture. - Enhanced prepare-server.js to include native module rebuilding step for improved terminal functionality. --- apps/app/electron/main.js | 62 ++++++++++++++++---- apps/app/package.json | 5 ++ apps/app/scripts/prepare-server.js | 14 +++++ apps/app/scripts/rebuild-server-natives.js | 66 ++++++++++++++++++++++ 4 files changed, 135 insertions(+), 12 deletions(-) create mode 100644 apps/app/scripts/rebuild-server-natives.js diff --git a/apps/app/electron/main.js b/apps/app/electron/main.js index 7ad6df20..a39cc7d4 100644 --- a/apps/app/electron/main.js +++ b/apps/app/electron/main.js @@ -26,17 +26,34 @@ let staticServer = null; const SERVER_PORT = 3008; const STATIC_PORT = 3007; -// Get icon path - works in both dev and production +// Get icon path - works in both dev and production, cross-platform function getIconPath() { - return app.isPackaged - ? path.join(process.resourcesPath, "app", "public", "logo.png") - : path.join(__dirname, "../public/logo.png"); + // Different icon formats for different platforms + let iconFile; + if (process.platform === "win32") { + iconFile = "icon.ico"; + } else if (process.platform === "darwin") { + iconFile = "logo_larger.png"; + } else { + // Linux + iconFile = "logo_larger.png"; + } + + const iconPath = path.join(__dirname, "../public", iconFile); + + // Verify the icon exists + if (!fs.existsSync(iconPath)) { + console.warn(`[Electron] Icon not found at: ${iconPath}`); + return null; + } + + return iconPath; } /** * Start static file server for production builds */ -function startStaticServer() { +async function startStaticServer() { const staticPath = path.join(__dirname, "../out"); staticServer = http.createServer((request, response) => { @@ -89,8 +106,15 @@ function startStaticServer() { }); }); - staticServer.listen(STATIC_PORT, () => { - console.log(`[Electron] Static server running at http://localhost:${STATIC_PORT}`); + return new Promise((resolve, reject) => { + staticServer.listen(STATIC_PORT, (err) => { + if (err) { + reject(err); + } else { + console.log(`[Electron] Static server running at http://localhost:${STATIC_PORT}`); + resolve(); + } + }); }); } @@ -233,12 +257,12 @@ async function waitForServer(maxAttempts = 30) { * Create the main window */ function createWindow() { - mainWindow = new BrowserWindow({ + const iconPath = getIconPath(); + const windowOptions = { width: 1400, height: 900, minWidth: 1024, minHeight: 700, - icon: getIconPath(), webPreferences: { preload: path.join(__dirname, "preload.js"), contextIsolation: true, @@ -246,7 +270,14 @@ function createWindow() { }, titleBarStyle: "hiddenInset", backgroundColor: "#0a0a0a", - }); + }; + + // Only set icon if it exists + if (iconPath) { + windowOptions.icon = iconPath; + } + + mainWindow = new BrowserWindow(windowOptions); // Load Next.js dev server in development or static server in production const isDev = !app.isPackaged; @@ -270,13 +301,20 @@ function createWindow() { app.whenReady().then(async () => { // Set app icon (dock icon on macOS) if (process.platform === "darwin" && app.dock) { - app.dock.setIcon(getIconPath()); + const iconPath = getIconPath(); + if (iconPath) { + try { + app.dock.setIcon(iconPath); + } catch (error) { + console.warn("[Electron] Failed to set dock icon:", error.message); + } + } } try { // Start static file server in production if (app.isPackaged) { - startStaticServer(); + await startStaticServer(); } // Start backend server diff --git a/apps/app/package.json b/apps/app/package.json index ae50a1c7..40510b79 100644 --- a/apps/app/package.json +++ b/apps/app/package.json @@ -95,6 +95,7 @@ "appId": "com.automaker.app", "productName": "Automaker", "artifactName": "${productName}-${version}-${arch}.${ext}", + "afterPack": "./scripts/rebuild-server-natives.js", "directories": { "output": "dist" }, @@ -113,6 +114,10 @@ "from": "server-bundle/node_modules", "to": "server/node_modules" }, + { + "from": "server-bundle/package.json", + "to": "server/package.json" + }, { "from": "../../.env", "to": ".env", diff --git a/apps/app/scripts/prepare-server.js b/apps/app/scripts/prepare-server.js index 3487db71..83c0f055 100644 --- a/apps/app/scripts/prepare-server.js +++ b/apps/app/scripts/prepare-server.js @@ -64,4 +64,18 @@ execSync('npm install --omit=dev', { } }); +// Step 6: Rebuild native modules for current architecture +// This is critical for modules like node-pty that have native bindings +console.log('šŸ”Ø Rebuilding native modules for current architecture...'); +try { + execSync('npm rebuild', { + cwd: BUNDLE_DIR, + stdio: 'inherit' + }); + console.log('āœ… Native modules rebuilt successfully'); +} catch (error) { + console.warn('āš ļø Warning: Failed to rebuild native modules. Terminal functionality may not work.'); + console.warn(' Error:', error.message); +} + console.log('\nāœ… Server prepared for bundling at:', BUNDLE_DIR); diff --git a/apps/app/scripts/rebuild-server-natives.js b/apps/app/scripts/rebuild-server-natives.js new file mode 100644 index 00000000..c2eef844 --- /dev/null +++ b/apps/app/scripts/rebuild-server-natives.js @@ -0,0 +1,66 @@ +#!/usr/bin/env node + +/** + * Electron-builder afterPack hook + * Rebuilds native modules in the server bundle for the target architecture + */ + +const { exec } = require('child_process'); +const { promisify } = require('util'); +const path = require('path'); + +const execAsync = promisify(exec); + +exports.default = async function(context) { + const { appOutDir, electronPlatformName, arch, packager } = context; + const electronVersion = packager.config.electronVersion; + + // Convert arch to string if it's a number (electron-builder sometimes passes indices) + const archNames = ['ia32', 'x64', 'armv7l', 'arm64', 'universal']; + const archStr = typeof arch === 'number' ? archNames[arch] : arch; + + console.log(`\nšŸ”Ø Rebuilding server native modules for ${electronPlatformName}-${archStr}...`); + + // Path to server node_modules in the packaged app + let serverNodeModulesPath; + if (electronPlatformName === 'darwin') { + serverNodeModulesPath = path.join( + appOutDir, + `${packager.appInfo.productName}.app`, + 'Contents', + 'Resources', + 'server', + 'node_modules' + ); + } else if (electronPlatformName === 'win32') { + serverNodeModulesPath = path.join( + appOutDir, + 'resources', + 'server', + 'node_modules' + ); + } else { + serverNodeModulesPath = path.join( + appOutDir, + 'resources', + 'server', + 'node_modules' + ); + } + + try { + // Rebuild native modules for the target architecture + const rebuildCmd = `npx --yes @electron/rebuild --version=${electronVersion} --arch=${archStr} --force --module-dir="${serverNodeModulesPath}/.."`; + + console.log(` Command: ${rebuildCmd}`); + + const { stdout, stderr } = await execAsync(rebuildCmd); + if (stdout) console.log(stdout); + if (stderr) console.error(stderr); + + console.log(`āœ… Server native modules rebuilt successfully for ${archStr}\n`); + } catch (error) { + console.error(`āŒ Failed to rebuild server native modules:`, error.message); + // Don't fail the build, just warn + } +};