mirror of
https://github.com/DayuanJiang/next-ai-draw-io.git
synced 2026-01-02 22:32:27 +08:00
* feat(electron): add desktop application support with electron - implement complete Electron main process architecture with window management, app menu, IPC handlers, and settings window - integrate Next.js server for production builds with embedded standalone server - add configuration management with persistent storage and env file support - create preload scripts with secure context bridge for renderer communication - set up electron-builder configuration for multi-platform packaging (macOS, Windows, Linux) - add GitHub Actions workflow for automated release builds - include development scripts for hot-reload during Electron development * feat(electron): enhance security and stability - encrypt API keys using Electron safeStorage API before persisting to disk - add error handling and rollback for preset switching failures - extract inline styles to external CSS file and remove unsafe-inline from CSP - implement dynamic port allocation with automatic fallback for production builds * fix(electron): add maintainer field for Linux .deb package - add maintainer email to linux configuration in electron-builder.yml - required for building .deb packages * fix(electron): use shx for cross-platform file copying - replace Unix-only cp -r with npx shx cp -r - add shx as devDependency for Windows compatibility * fix(electron): fix runtime icon path for all platforms - use icon.png directly instead of platform-specific formats - electron-builder handles icon conversion during packaging - macOS uses embedded icon from app bundle, no explicit path needed - add icon.png to extraResources for Windows/Linux runtime access * fix(electron): add security warning for plaintext API key storage - warn user when safeStorage is unavailable (Linux without keyring) - fail secure: throw error if encryption fails instead of storing plaintext - prevent duplicate warnings with hasWarnedAboutPlaintext flag * fix(electron): add remaining review fixes - Add Windows ARM64 architecture support - Add IPC input validation with config key whitelist - Add server.js existence check before starting Next.js server - Make afterPack throw error on missing directories - Add workflow permissions for release job --------- Co-authored-by: dayuan.jiang <jdy.toh@gmail.com>
68 lines
2.0 KiB
TypeScript
68 lines
2.0 KiB
TypeScript
import fs from "node:fs"
|
|
import path from "node:path"
|
|
import { app } from "electron"
|
|
|
|
/**
|
|
* Load environment variables from .env file
|
|
* Searches multiple locations in priority order
|
|
*/
|
|
export function loadEnvFile(): void {
|
|
const possiblePaths = [
|
|
// Next to the executable (for portable installations)
|
|
path.join(path.dirname(app.getPath("exe")), ".env"),
|
|
// User data directory (persists across updates)
|
|
path.join(app.getPath("userData"), ".env"),
|
|
// Development: project root
|
|
path.join(app.getAppPath(), ".env.local"),
|
|
path.join(app.getAppPath(), ".env"),
|
|
]
|
|
|
|
for (const envPath of possiblePaths) {
|
|
if (fs.existsSync(envPath)) {
|
|
console.log(`Loading environment from: ${envPath}`)
|
|
loadEnvFromFile(envPath)
|
|
return
|
|
}
|
|
}
|
|
|
|
console.log("No .env file found, using system environment variables")
|
|
}
|
|
|
|
/**
|
|
* Parse and load environment variables from a file
|
|
*/
|
|
function loadEnvFromFile(filePath: string): void {
|
|
try {
|
|
const content = fs.readFileSync(filePath, "utf-8")
|
|
const lines = content.split("\n")
|
|
|
|
for (const line of lines) {
|
|
const trimmed = line.trim()
|
|
|
|
// Skip comments and empty lines
|
|
if (!trimmed || trimmed.startsWith("#")) continue
|
|
|
|
const equalIndex = trimmed.indexOf("=")
|
|
if (equalIndex === -1) continue
|
|
|
|
const key = trimmed.slice(0, equalIndex).trim()
|
|
let value = trimmed.slice(equalIndex + 1).trim()
|
|
|
|
// Remove surrounding quotes
|
|
if (
|
|
(value.startsWith('"') && value.endsWith('"')) ||
|
|
(value.startsWith("'") && value.endsWith("'"))
|
|
) {
|
|
value = value.slice(1, -1)
|
|
}
|
|
|
|
// Don't override existing environment variables
|
|
if (!(key in process.env)) {
|
|
process.env[key] = value
|
|
}
|
|
}
|
|
} catch (error) {
|
|
console.error(`Failed to load env file ${filePath}:`, error)
|
|
}
|
|
}
|