Harden audit findings: correctness, type-safety, Windows conventions & polish
Audit-pass over CODE-AUDIT.md (~48 items closed this pass; all verified — typecheck + 234 tests + eslint + prettier green). Correctness / bugs: - B3: match the release checksum to the asset's filename line (no wrong-hash verify) - B4: newline-safe metadata probe (one --print with a unit-separator delimiter) - B5 / L88: guard the meta event against canceled items; progress no longer promotes a queued item outside pump() - B7: cookie-login promise always resolves (handles destroy-without-close) - L146: trim parser rejects >2 colon-group times; M36: Library selection counts only actionable rows - L11 / L50 / L156 / L57 / L159 / L15 / L3: live queue count, empty-cookie message, schedule picker min, dead-code/comment cleanup Type safety: - Enable noUncheckedIndexedAccess + noFallthroughCasesInSwitch (15 real edge cases fixed) Resilience / Windows / metadata: - R5: settings write failure handled (no unhandled IPC rejection; reconciles to truth) - W1 / W5 / W6: min window size, seeded folder picker, parented sign-in window; L147 dead macOS branches removed - CL1: shared stdout markers; package/builder metadata (license, homepage, repository, copyright, tsbuildinfo glob) Copy / docs / tests: - M37 / SR9 dev-jargon cleanup in hints; M8 / M25 / M26 / L66 / L80 / L81 reconciled - New unit tests for L35 (isValidMediaItem) and L36 (compareVersions) This commit also checkpoints the previously-uncommitted feat/tray-background-clipboard work it builds on: background running + auto-download, library clipboard detection, tray, binary management & library scale, credential encryption at rest, the shared jsonStore and ui/ primitives, and the eslint/prettier tooling. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+19
-2
@@ -1,4 +1,4 @@
|
||||
import { app } from 'electron'
|
||||
import { app, nativeImage, type NativeImage } from 'electron'
|
||||
import { join } from 'path'
|
||||
import { is } from '@electron-toolkit/utils'
|
||||
|
||||
@@ -24,6 +24,23 @@ export function getAppIconPath(): string {
|
||||
: join(process.resourcesPath, 'icon.ico')
|
||||
}
|
||||
|
||||
let appIconImage: NativeImage | null = null
|
||||
/**
|
||||
* The app icon as a cached NativeImage, for OS notifications (W13/L127). Loaded
|
||||
* once from getAppIconPath(); a missing icon yields an empty image, which
|
||||
* Notification treats as "no icon" (the OS default) rather than erroring. This
|
||||
* gives completion/background toasts the real brand glyph — notably on the
|
||||
* portable build, which has no installed AUMID shortcut icon for Windows to use.
|
||||
*/
|
||||
export function getAppIconImage(): NativeImage {
|
||||
// Cache only a valid image so a transient read miss isn't latched forever; a
|
||||
// genuinely-missing icon just re-reads (cheap — notifications are infrequent).
|
||||
if (!appIconImage || appIconImage.isEmpty()) {
|
||||
appIconImage = nativeImage.createFromPath(getAppIconPath())
|
||||
}
|
||||
return appIconImage
|
||||
}
|
||||
|
||||
/**
|
||||
* AeroFetch keeps its OWN writable copy of yt-dlp.exe under userData, separate
|
||||
* from the read-only bundled seed in resources/bin. The managed copy is what
|
||||
@@ -35,7 +52,7 @@ export function getAppIconPath(): string {
|
||||
* ffmpeg/ffprobe/aria2c stay in getBinDir(): they're not self-updating and
|
||||
* yt-dlp finds them via `--ffmpeg-location <binDir>`.
|
||||
*/
|
||||
export function getManagedBinDir(): string {
|
||||
function getManagedBinDir(): string {
|
||||
return join(app.getPath('userData'), 'bin')
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user