Fleet overview N+1: - InstanceResourceService gains a 30s TTL cache with single-flight coalescing; the overview no longer fires six live upstream requests per device on every render (plus the re-login storm), while the per-device detail route probes live via force:true Event journal becomes live: - job terminal transitions (manual executions and the interrupted sweep) now append to the journal, so /api/v1/events SSE feeds the frontend's invalidation controller that was built but never received events - journal pruning moves off the append hot path (was an unindexable full-table json_extract scan per insert) onto the retention timer Console auth hardening: - scrypt upgraded from N=16384 to N=2^16 (OWASP interactive guidance); a new password_kdf column records the derivation per row and legacy hashes rehash transparently on the next successful login without invalidating sessions (migration 18) Legacy stack: - instance URL validation blocks IPv4-compatible IPv6 after WHATWG canonicalization (::a9fe:a9fe metadata, ::7f00:1 loopback slipped past) - status polls cool down auto-login for 60s after a failed attempt so a stale saved password cannot hammer the device into an account lockout Build hygiene: - web bundle splits app (410kB) from vendor (212kB) so framework code stays cacheable across releases; stale root package-lock.json removed (pnpm is the only lockfile)
33 lines
866 B
TypeScript
33 lines
866 B
TypeScript
import { fileURLToPath } from 'node:url';
|
|
import react from '@vitejs/plugin-react';
|
|
import { defineConfig } from 'vite';
|
|
|
|
export default defineConfig(({ mode }) => ({
|
|
plugins: [react()],
|
|
build: {
|
|
rollupOptions: {
|
|
output: {
|
|
// Framework code changes far less often than app code; splitting keeps
|
|
// the vendor chunk cacheable across releases instead of one big bundle.
|
|
manualChunks(id) {
|
|
if (id.includes('node_modules')) return 'vendor';
|
|
return undefined;
|
|
},
|
|
},
|
|
},
|
|
},
|
|
resolve: {
|
|
alias:
|
|
mode === 'test'
|
|
? [
|
|
{
|
|
find: /^animal-island-ui$/u,
|
|
replacement: fileURLToPath(
|
|
new URL('./node_modules/animal-island-ui/dist/cjs/index.cjs', import.meta.url),
|
|
),
|
|
},
|
|
]
|
|
: [],
|
|
},
|
|
}));
|