The signed release showed only its background colour and never started the sidecar. Tauri's freezePrototype freezes Object.prototype before the bundle runs; d3-color and d3-format (under the visx charts) assign `constructor` / `toString` on plain objects while loading, which throws on a frozen prototype, so the bundle stopped before React drew anything. The saved state was not the cause. - build/freeze-safe.ts: Vite plugin that rewrites those assignments in dependencies into a helper that defines the property when the frozen prototype would refuse it - error boundaries for the window, each screen and each app tab (Copy details, Reload, Reset saved state with a backup); public/boot.js shows the same panel when the bundle fails or the window stays empty - logs/host.log (start, saved state, sidecar start/stop, panics) and logs/webview.log (log_webview), rotated, home as ~, keys, tokens and e-mail addresses replaced - state.json `version` 2 with an explicit 1 -> 2 migration (original kept as state.json.v1.bak), per-entry tolerant parsing, partial settings keep their fields, unreadable files kept aside - folders that are gone: "Folder not found" with Locate... (project_locate) / Remove; portfolio reads skip them - tools/desktop-boot-check.ts: the built window with the release CSP and the frozen prototype, a mocked host from the state fixtures (empty, D1 with folders gone, D3) and the real sidecar, through every screen; in bun run ci, the Forgejo CI workflow and the macOS release
20 lines
785 B
TypeScript
20 lines
785 B
TypeScript
import react from '@vitejs/plugin-react';
|
|
import { defineConfig } from 'vite';
|
|
import { freezeSafe } from './build/freeze-safe';
|
|
|
|
// Tauri loads the dev server from build.devUrl (http://127.0.0.1:1420) and the built files from ../dist.
|
|
export default defineConfig({
|
|
// freezeSafe: the bundle must load under Tauri's frozen Object.prototype (build/freeze-safe.ts)
|
|
plugins: [freezeSafe(), react()],
|
|
clearScreen: false,
|
|
server: { host: '127.0.0.1', port: 1420, strictPort: true, watch: { ignored: ['**/src-tauri/**'] } },
|
|
build: {
|
|
target: ['safari15', 'chrome110'],
|
|
outDir: 'dist',
|
|
emptyOutDir: true,
|
|
sourcemap: false,
|
|
// no inline scripts or styles: the CSP is script-src 'self', style-src 'self'
|
|
assetsInlineLimit: 0,
|
|
cssCodeSplit: false,
|
|
},
|
|
});
|