`make sandbox`, `make dev`, `make build-dev` and `make build-prod` all died with "/bin/sh: wails3: command not found". `wails3 dev` and `wails3 task` are supervisors: they run the scaffold's Taskfile tree, which invokes `wails3` by bare name in 54 places across four files. The CLI is a vendored Go tool by design (plan 009, D3 — a global install would be this build's first undeclared dependency), so that name did not exist. scripts/toolbin/wails3 execs `go tool wails3`, and the Makefile prepends that directory only for the targets that start a supervisor. Rewriting 54 scaffold call sites would be churn to redo on every scaffold refresh; nothing global is installed either way. The shim does not cd. The first version did, to be sure `go tool` found the module — it does not need to — and that silently discarded the `dir:` a task had set, so generate:icons failed with "open appicon.png: no such file or directory" against a file that was there. Three things the build path needed once it got that far: - `frontend/package.json` gains `build:dev`, which build:frontend runs under DEV=true and which did not exist. - Vite binds 127.0.0.1. It defaulted to `localhost`, which resolves to `[::1]` only here, while wails3 dev's asset proxy dials IPv4 — so the first request for the dev server was refused and the first paint raced a retry. Zero proxy errors after. - The icons and the .desktop file are generated on every build. icons.icns/icon.ico are deterministic from our appicon.png (verified by regenerating), so the regenerated pair is committed and the churn ends; .task/ and the .desktop file are ignored. Also corrects a claim: build-prod strips and trims but does **not** UPX-compress — that was v2's `-upx` flag. Phase 1 recorded UPX as still working, but neither build target had been run. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UDCbcCZQepnpSQYJ6SxxZm
48 lines
1.9 KiB
TypeScript
48 lines
1.9 KiB
TypeScript
import path from "path";
|
|
import { defineConfig } from "vite";
|
|
|
|
export default defineConfig({
|
|
resolve: {
|
|
alias: {
|
|
// v3 generates bindings nested by Go import path. The
|
|
// alias absorbs the constant prefix, so a site imports
|
|
// "@go/library/library" rather than the full
|
|
// "bindings/yellowjacket/backend/library/library".
|
|
"@go": path.resolve(__dirname, "bindings/yellowjacket/backend"),
|
|
"@components": path.resolve(__dirname, "src/components"),
|
|
"@assets": path.resolve(__dirname, "src/assets"),
|
|
"@pages": path.resolve(__dirname, "src/pages"),
|
|
"@runtime": path.resolve(__dirname, "src/wails"),
|
|
"@utils": path.resolve(__dirname, "src/utils"),
|
|
"@store": path.resolve(__dirname, "src/store"),
|
|
},
|
|
},
|
|
build: {
|
|
// The bundled icons must be emitted as files, not inlined.
|
|
// Vite inlines any asset under 4 kB, and 63 of the 64 icons are
|
|
// under 4 kB, so the default put ~96 kB of base64 into the main
|
|
// chunk — parsed at startup, for icons most views never render.
|
|
// As files they are served same-origin (so still offline) and
|
|
// fetched on first use.
|
|
assetsInlineLimit: (filePath: string) =>
|
|
filePath.includes('/assets/icons/fa/') ? false : undefined,
|
|
rollupOptions: {
|
|
input: {
|
|
main: "index.html",
|
|
},
|
|
},
|
|
},
|
|
server: {
|
|
// IPv4, explicitly. Vite's default binds `localhost`, which on
|
|
// this machine resolves to `[::1]` *only* — and wails3 dev's
|
|
// asset proxy dials 127.0.0.1, so the app's first request for
|
|
// the dev server was answered with "connection refused" and the
|
|
// first paint raced a retry.
|
|
host: '127.0.0.1',
|
|
hmr: {
|
|
host: 'localhost',
|
|
protocol: 'ws',
|
|
},
|
|
},
|
|
});
|