Two independent causes of a blank app window. Never SHIP a blank (the prod hole). v0.3.22 shipped a black screen: a minifier temporal-dead-zone reorder threw before React mounted, leaving an empty #root (#1178). It reached users because every existing check — vitest, node:test, and the whole Playwright e2e suite — runs the UN-MINIFIED dev server, so a bug living only in the minified bundle passes them all. playwright.prod.config.ts + e2e-prod/ close that hole: build the real bundle, serve dist/ via vite preview, and assert the app actually mounts (#root has children, renders visible text, no pageerror). The core assertion is deliberately structural — "did anything mount?" — because that is what a pre-render crash always breaks, whatever its cause. retries: 0, so a blank screen can never be flaky-passed away. Never DISPLAY a blank in dev (the collision). Running `bun desktop` while one is already up does not fail politely, it cascades into a blank window. Reproduced deterministically and measured over CDP: the healthy main window has #root childElementCount 1; after a second launch it is 0. The new launch's port grab makes the running instance's dev:api exit, and `concurrently --kill-others-on-fail` then tears down that instance's whole stack including its Vite server — leaving its window open, pointed at a dev URL that no longer answers. desktop-dev.mjs now clears a leftover dev app first, loudly. The safety boundary for that cleanup is `isDevAppProcess` in desktop-common.mjs: it matches the cargo dev binary (`omnivoice-studio`) ONLY, never the installed release app (`OmniVoice Studio`) — killing a user's real app would be far worse than the bug being fixed. Unit-tested both ways. Also makes the gate runnable off Linux: the dev e2e config hardcodes /usr/bin/chromium, which doesn't exist on Windows/macOS. The new config falls back to Playwright's own browser so a contributor can run the gate before a release. The ci.yml step that runs this gate is NOT in this commit — pushing workflow changes needs a token scope this session lacks. It is provided separately for the maintainer to apply. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
94 lines
3.1 KiB
JSON
94 lines
3.1 KiB
JSON
{
|
|
"name": "omnivoice-studio",
|
|
"version": "0.3.22",
|
|
"private": true,
|
|
"license": "AGPL-3.0-only",
|
|
"type": "module",
|
|
"scripts": {
|
|
"dev": "vite",
|
|
"desktop": "bun ../scripts/desktop-dev.mjs",
|
|
"build": "vite build",
|
|
"lint": "oxlint",
|
|
"lint:fix": "oxlint --fix",
|
|
"lint:hooks": "eslint .",
|
|
"format": "oxfmt --write",
|
|
"format:check": "oxfmt --check",
|
|
"knip": "knip",
|
|
"typecheck": "tsc --noEmit",
|
|
"typecheck:ci": "tsc --noEmit --checkJs false",
|
|
"test": "vitest run",
|
|
"test:watch": "vitest",
|
|
"test:legacy": "node --experimental-strip-types --no-warnings --test ../tests/frontend/*.test.mjs",
|
|
"preview": "vite preview",
|
|
"tauri": "tauri",
|
|
"e2e": "playwright test",
|
|
"test:prod-bundle": "playwright test --config=playwright.prod.config.ts",
|
|
"test:visual": "playwright test --config=playwright.visual.config.ts",
|
|
"test:visual:update": "playwright test --config=playwright.visual.config.ts --update-snapshots"
|
|
},
|
|
"dependencies": {
|
|
"@fontsource-variable/inter": "^5.2.8",
|
|
"@fontsource-variable/source-serif-4": "^5.2.9",
|
|
"@fontsource/ibm-plex-mono": "^5.2.7",
|
|
"@radix-ui/react-dialog": "^1.1.17",
|
|
"@radix-ui/react-dropdown-menu": "^2.1.18",
|
|
"@radix-ui/react-progress": "^1.1.10",
|
|
"@radix-ui/react-select": "^2.3.1",
|
|
"@radix-ui/react-slider": "^1.4.1",
|
|
"@radix-ui/react-slot": "^1.3.0",
|
|
"@radix-ui/react-tabs": "^1.1.15",
|
|
"@radix-ui/react-toggle": "^1.1.12",
|
|
"@radix-ui/react-toggle-group": "^1.1.13",
|
|
"@radix-ui/react-tooltip": "^1.2.10",
|
|
"@scalar/api-reference-react": "^0.9.52",
|
|
"@tailwindcss/vite": "^4.3.1",
|
|
"@tanstack/react-query": "^5.101.0",
|
|
"@tanstack/react-table": "^8.21.3",
|
|
"@tanstack/react-virtual": "^3.14.3",
|
|
"@tauri-apps/plugin-dialog": "^2.7.1",
|
|
"@tauri-apps/plugin-opener": "^2.5.4",
|
|
"@tauri-apps/plugin-process": "^2.3.1",
|
|
"@tauri-apps/plugin-updater": "^2.10.1",
|
|
"@tauri-apps/plugin-window-state": "^2.4.1",
|
|
"class-variance-authority": "^0.7.1",
|
|
"clsx": "^2.1.1",
|
|
"country-flag-icons": "^1.6.17",
|
|
"i18next": "^26.3.1",
|
|
"i18next-browser-languagedetector": "^8.2.1",
|
|
"lucide-react": "^1.18.0",
|
|
"posthog-js": "^1.399.2",
|
|
"qrcode": "^1.5.4",
|
|
"react": "^19.2.7",
|
|
"react-dom": "^19.2.7",
|
|
"react-hot-toast": "^2.6.0",
|
|
"react-i18next": "^17.0.8",
|
|
"react-window": "^2.2.7",
|
|
"tailwind-merge": "^3.6.0",
|
|
"tailwindcss": "^4.3.1",
|
|
"tw-animate-css": "^1.4.0",
|
|
"wavesurfer.js": "^7.12.8",
|
|
"zustand": "^5.0.14"
|
|
},
|
|
"devDependencies": {
|
|
"@playwright/test": "^1.61.0",
|
|
"@tauri-apps/api": "^2.11.0",
|
|
"@tauri-apps/cli": "^2.11.2",
|
|
"@testing-library/jest-dom": "^6.9.1",
|
|
"@testing-library/react": "^16.3.2",
|
|
"@types/react": "^19.2.17",
|
|
"@types/react-dom": "^19.2.3",
|
|
"@vitejs/plugin-react": "^6.0.2",
|
|
"eslint": "^10.5.0",
|
|
"eslint-plugin-react-hooks": "^7.1.1",
|
|
"globals": "^17.6.0",
|
|
"jsdom": "^29.1.1",
|
|
"knip": "^6.23.0",
|
|
"oxfmt": "^0.57.0",
|
|
"oxlint": "^1.71.0",
|
|
"playwright-core": "1.61.0",
|
|
"typescript": "^6.0.3",
|
|
"vite": "^8.0.16",
|
|
"vitest": "^4.1.9"
|
|
}
|
|
}
|