import { sveltekit } from '@sveltejs/kit/vite'; import { defineConfig } from 'vite'; import { execSync } from 'node:child_process'; import tokens from './src/lib/styles/tokens.json' with { type: 'json' }; const THEME_DARK = tokens.colors.dark.obsidian; const THEME_LIGHT = tokens.colors.light.obsidian; const tokensPlugin = { name: 'minstrel-tokens', buildStart() { execSync('node scripts/tokens-to-css.js', { stdio: 'inherit' }); } }; // Build-only plugin that injects Go html/template tokens into the // rendered index.html so the runtime Go server can substitute per- // instance branding. In dev (`vite dev`), the marker stays as a // comment and the SPA falls back to the literal app.html title. // `enforce: 'post'` ensures this runs after SvelteKit's own // transformIndexHtml so %sveltekit.head% is already expanded into // hydration markup before our anchors are rewritten. const injectGoTokensPlugin = { name: 'minstrel-inject-go-tokens', apply: 'build' as const, enforce: 'post' as const, transformIndexHtml(html: string) { const titleTag = `{{ .AppName }}`; const headBlock = ` `; // Fail loudly if either anchor drifts. A silent .replace() no-op // would ship a build with un-substituted Go template tokens missing, // and the runtime brand override would silently break — exactly the // class of regression a build-time plugin should catch. if (!html.includes('Minstrel')) { throw new Error('minstrel-inject-go-tokens: Minstrel anchor missing from rendered index.html'); } if (!html.includes('')) { throw new Error('minstrel-inject-go-tokens: anchor missing from app.html'); } return html .replace('Minstrel', titleTag) .replace('', headBlock); } }; export default defineConfig({ plugins: [tokensPlugin, sveltekit(), injectGoTokensPlugin], server: { port: 5173, proxy: { '/api': { target: 'http://localhost:4533', changeOrigin: true }, '/rest': { target: 'http://localhost:4533', changeOrigin: true } } } });