diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..52f2704 --- /dev/null +++ b/.npmrc @@ -0,0 +1,17 @@ +# Force use of prebuilt binaries +prefer_binary=true +build_from_source=false + +# Skip building from source +ignore_scripts=false + +# Electron configuration +runtime=electron +target=32.1.2 +disturl=https://electronjs.org/headers + +# Don't fail on optional dependencies +optional=true + +# Use production registry +registry=https://registry.npmjs.org/ \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 6f3fb02..c122ced 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,20 +1,18 @@ { "name": "va-tracker", - "version": "0.0.0", + "version": "1.1.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "va-tracker", - "version": "0.0.0", + "version": "1.1.1", "dependencies": { "@reduxjs/toolkit": "^2.10.1", "@tailwindcss/vite": "^4.1.16", - "active-win": "^7.2.0", "axios": "^1.13.2", "chalk": "^5.6.2", "electron-store": "^11.0.2", - "get-windows": "^9.2.3", "https": "^1.0.0", "lucide-react": "^0.552.0", "luxon": "^3.7.2", @@ -24,10 +22,8 @@ "react-redux": "^9.2.0", "react-router-dom": "^7.9.5", "recharts": "^2.12.7", - "sharp": "^0.34.4", "socket.io-client": "^4.8.1", - "tailwindcss": "^4.1.16", - "windowmanager": "^0.14.8" + "tailwindcss": "^4.1.16" }, "devDependencies": { "@playwright/test": "^1.47.2", @@ -43,9 +39,16 @@ "electron-builder": "^25.0.5", "electron-rebuild": "^3.2.9", "npm-run-all": "^4.1.5", + "rcedit": "^5.0.2", "typescript": "^5.6.2", "vite": "^5.4.7", "vitest": "^2.1.1" + }, + "optionalDependencies": { + "active-win": "^7.7.2", + "get-windows": "^9.2.3", + "sharp": "^0.34.5", + "windowmanager": "^0.14.8" } }, "node_modules/@babel/code-frame": { @@ -1144,6 +1147,7 @@ "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", "license": "MIT", + "optional": true, "engines": { "node": ">=18" } @@ -3086,6 +3090,7 @@ "resolved": "https://registry.npmjs.org/active-win/-/active-win-7.7.2.tgz", "integrity": "sha512-rXIHbkl1w/li3Lr9jjhaw90hitTANGuVXO6h1atFrxLWVl2Rw0mOdqrrauxNe2W6xeQJ428vsy+1cYOFlx6Lpg==", "license": "MIT", + "optional": true, "engines": { "node": ">=10" }, @@ -4574,6 +4579,54 @@ "node": ">= 8" } }, + "node_modules/cross-spawn-windows-exe": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/cross-spawn-windows-exe/-/cross-spawn-windows-exe-1.2.0.tgz", + "integrity": "sha512-mkLtJJcYbDCxEG7Js6eUnUNndWjyUZwJ3H7bErmmtOYU/Zb99DyUkpamuIZE0b3bhmJyZ7D90uS6f+CGxRRjOw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-cross-spawn-windows-exe?utm_medium=referral&utm_source=npm_fund" + } + ], + "license": "Apache-2.0", + "dependencies": { + "@malept/cross-spawn-promise": "^1.1.0", + "is-wsl": "^2.2.0", + "which": "^2.0.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cross-spawn-windows-exe/node_modules/@malept/cross-spawn-promise": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", + "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "license": "Apache-2.0", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", @@ -6399,6 +6452,7 @@ "integrity": "sha512-rTO5ms7Qb5upkNI0UM49W6O1PAcosGlEMitOE2JGeo8yDgBy38xWhxg5GrpV/A+i1p71JogyIM/CZg5RZO0Wjw==", "hasInstallScript": true, "license": "MIT", + "optional": true, "engines": { "node": ">=18.18" }, @@ -7372,6 +7426,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-finalizationregistry": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", @@ -7636,6 +7706,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", @@ -9744,6 +9827,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/rcedit": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-5.0.2.tgz", + "integrity": "sha512-dgysxaeXZ4snLpPjn8aVtHvZDCx+aRcvZbaWBgl1poU6OPustMvOkj9a9ZqASQ6i5Y5szJ13LSvglEOwrmgUxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn-windows-exe": "^1.1.0" + }, + "engines": { + "node": ">= 22.12.0" + } + }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", @@ -10507,6 +10603,7 @@ "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", "hasInstallScript": true, "license": "Apache-2.0", + "optional": true, "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", @@ -10550,6 +10647,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", + "optional": true, "bin": { "semver": "bin/semver.js" }, @@ -12068,7 +12166,8 @@ "version": "0.14.8", "resolved": "https://registry.npmjs.org/windowmanager/-/windowmanager-0.14.8.tgz", "integrity": "sha512-USYABhvy9hce52h9p6h+8LSGhA0ypm/wuydnUm0nAaukPnWyfGByZs+eJAzfE4udVLDykIdZX3YzMk/lTHkgKw==", - "license": "MIT" + "license": "MIT", + "optional": true }, "node_modules/wrap-ansi": { "version": "7.0.0", diff --git a/package.json b/package.json index 3e8cd39..03d74a5 100644 --- a/package.json +++ b/package.json @@ -1,18 +1,18 @@ { "name": "va-tracker", "private": true, - "version": "0.0.0", + "version": "1.1.1", "type": "module", "main": "dist-electron/main.js", "scripts": { - "dev": "npm-run-all --parallel dev:react dev:electron", + "dev": "npm-run-all --parallel transpile:electron dev:react dev:electron", "dev:react": "vite", "dev:electron": "npm run build && cross-env NODE_ENV=development electron --inspect=5858 .", "prod:electron": "npm run build && cross-env NODE_ENV=production electron .", "build": "tsc && vite build", "preview": "vite preview", "transpile:electron": "tsc --project src/electron/tsconfig.json", - "dist:mac": "npm run transpile:electron && npm run build && electron-builder --mac --arm64", + "dist:mac": "npm run transpile:electron && npm run build && electron-builder --mac --x64 --arm64", "dist:win": "npm run transpile:electron && npm run build && electron-builder --win --x64", "dist:linux": "npm run transpile:electron && npm run build && electron-builder --linux --x64", "test:e2e": "playwright test", @@ -21,11 +21,9 @@ "dependencies": { "@reduxjs/toolkit": "^2.10.1", "@tailwindcss/vite": "^4.1.16", - "active-win": "^7.2.0", "axios": "^1.13.2", "chalk": "^5.6.2", "electron-store": "^11.0.2", - "get-windows": "^9.2.3", "https": "^1.0.0", "lucide-react": "^0.552.0", "luxon": "^3.7.2", @@ -35,11 +33,74 @@ "react-redux": "^9.2.0", "react-router-dom": "^7.9.5", "recharts": "^2.12.7", - "sharp": "^0.34.4", "socket.io-client": "^4.8.1", - "tailwindcss": "^4.1.16", + "tailwindcss": "^4.1.16" + }, + "optionalDependencies": { + "active-win": "^7.7.2", + "get-windows": "^9.2.3", + "sharp": "^0.34.5", "windowmanager": "^0.14.8" }, + "build": { + "appId": "com.vatracker.app", + "productName": "VA Tracker", + "npmRebuild": false, + "buildDependenciesFromSource": false, + "nodeGypRebuild": false, + "directories": { + "output": "release", + "buildResources": "build" + }, + "icon": "build/icon.ico", + "files": [ + "dist-electron/**/*", + "dist-react/**/*", + "package.json" + ], + "extraResources": [ + { + "from": "dist-electron", + "to": "dist-electron" + }, + { + "from": "src/assets", + "to": "assets" + } + ], + "mac": { + "target": ["dmg"], + "icon": "build/icon.icns", + "extendInfo": { + "LSUIElement": false, + "LSBackgroundOnly": false + } + }, + "win": { + "target": [ + { + "target": "nsis", + "arch": [ + "x64" + ] + } + ], + "signAndEditExecutable": true, + "signingHashAlgorithms": [], + "verifyUpdateCodeSignature": false + }, + "nsis": { + "oneClick": true, + "perMachine": false, + "createDesktopShortcut": "always", + "createStartMenuShortcut": true, + "runAfterFinish": true, + "installerIcon": "build/icon.ico", + "uninstallerIcon": "build/icon.ico", + "installerHeaderIcon": "build/icon.ico", + "artifactName": "${productName}-Setup-${version}.${ext}" + } + }, "devDependencies": { "@playwright/test": "^1.47.2", "@types/luxon": "^3.7.1", @@ -54,8 +115,9 @@ "electron-builder": "^25.0.5", "electron-rebuild": "^3.2.9", "npm-run-all": "^4.1.5", + "rcedit": "^5.0.2", "typescript": "^5.6.2", "vite": "^5.4.7", "vitest": "^2.1.1" } -} +} \ No newline at end of file diff --git a/src/electron/main.ts b/src/electron/main.ts index 700c5c6..0cff26e 100644 --- a/src/electron/main.ts +++ b/src/electron/main.ts @@ -23,8 +23,9 @@ function resolveIcon() { console.log("Line 24", path.join(__dirname, "..", "assets", "icons", "appIcon.ico")) - // PRODUCTION mode → inside dist-electron - return path.join(__dirname, "..", "assets", "icons", "appIcon.ico"); + const prodPath = path.join(process.resourcesPath, "assets", "icons", "appIcon.ico"); + console.log("PROD Icon Path:", prodPath); + return prodPath; } // --------------------------- @@ -76,6 +77,11 @@ app.on("ready", async () => { path.join(__dirname, "../assets/splash.html") ); + + + + + // Create the main window const win = new BrowserWindow({ width: 500, @@ -88,8 +94,8 @@ app.on("ready", async () => { alwaysOnTop: true, skipTaskbar: true, autoHideMenuBar: true, - frame: process.platform === "darwin" ? false : true, - show: false, // speed improvement + frame: true, + show: false, icon: resolveIcon(), webPreferences: { devTools: true, @@ -99,11 +105,6 @@ app.on("ready", async () => { }, }); - win.setAlwaysOnTop(true, 'screen-saver'); - win.setVisibleOnAllWorkspaces(true, { visibleOnFullScreen: true }); - win.setFullScreenable(false); - - mainWindow = win; // ------------------------------------